@pennyfarthing/core 9.2.0 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +36 -32
- package/LICENSE +0 -14
- package/README.md +0 -218
- package/pennyfarthing-dist/agents/README.md +0 -348
- package/pennyfarthing-dist/agents/architect.md +0 -180
- package/pennyfarthing-dist/agents/dev.md +0 -169
- package/pennyfarthing-dist/agents/devops.md +0 -203
- package/pennyfarthing-dist/agents/handoff.md +0 -235
- package/pennyfarthing-dist/agents/orchestrator.md +0 -182
- package/pennyfarthing-dist/agents/pm.md +0 -152
- package/pennyfarthing-dist/agents/reviewer-preflight.md +0 -129
- package/pennyfarthing-dist/agents/reviewer.md +0 -197
- package/pennyfarthing-dist/agents/sm-file-summary.md +0 -79
- package/pennyfarthing-dist/agents/sm-finish.md +0 -82
- package/pennyfarthing-dist/agents/sm-handoff.md +0 -129
- package/pennyfarthing-dist/agents/sm-setup.md +0 -251
- package/pennyfarthing-dist/agents/sm.md +0 -294
- package/pennyfarthing-dist/agents/tea.md +0 -161
- package/pennyfarthing-dist/agents/tech-writer.md +0 -226
- package/pennyfarthing-dist/agents/testing-runner.md +0 -184
- package/pennyfarthing-dist/agents/ux-designer.md +0 -236
- package/pennyfarthing-dist/agents/workflow-status-check.md +0 -96
- package/pennyfarthing-dist/commands/architect.md +0 -9
- package/pennyfarthing-dist/commands/benchmark-control.md +0 -69
- package/pennyfarthing-dist/commands/benchmark.md +0 -485
- package/pennyfarthing-dist/commands/brainstorming.md +0 -91
- package/pennyfarthing-dist/commands/check.md +0 -156
- package/pennyfarthing-dist/commands/chore.md +0 -218
- package/pennyfarthing-dist/commands/close-epic.md +0 -139
- package/pennyfarthing-dist/commands/continue-session.md +0 -218
- package/pennyfarthing-dist/commands/create-branches-from-story.md +0 -358
- package/pennyfarthing-dist/commands/create-theme.md +0 -29
- package/pennyfarthing-dist/commands/dev.md +0 -9
- package/pennyfarthing-dist/commands/devops.md +0 -9
- package/pennyfarthing-dist/commands/fix-blocker.md +0 -22
- package/pennyfarthing-dist/commands/git-cleanup.md +0 -57
- package/pennyfarthing-dist/commands/health-check.md +0 -143
- package/pennyfarthing-dist/commands/help.md +0 -264
- package/pennyfarthing-dist/commands/job-fair.md +0 -102
- package/pennyfarthing-dist/commands/list-themes.md +0 -21
- package/pennyfarthing-dist/commands/new-work.md +0 -23
- package/pennyfarthing-dist/commands/orchestrator.md +0 -9
- package/pennyfarthing-dist/commands/parallel-work.md +0 -73
- package/pennyfarthing-dist/commands/party-mode.md +0 -77
- package/pennyfarthing-dist/commands/patch.md +0 -210
- package/pennyfarthing-dist/commands/permissions.md +0 -193
- package/pennyfarthing-dist/commands/pm.md +0 -9
- package/pennyfarthing-dist/commands/prime.md +0 -136
- package/pennyfarthing-dist/commands/release.md +0 -58
- package/pennyfarthing-dist/commands/repo-status.md +0 -49
- package/pennyfarthing-dist/commands/retro.md +0 -200
- package/pennyfarthing-dist/commands/reviewer.md +0 -9
- package/pennyfarthing-dist/commands/run-ci.md +0 -116
- package/pennyfarthing-dist/commands/set-theme.md +0 -56
- package/pennyfarthing-dist/commands/setup.md +0 -65
- package/pennyfarthing-dist/commands/show-theme.md +0 -21
- package/pennyfarthing-dist/commands/sm.md +0 -9
- package/pennyfarthing-dist/commands/solo.md +0 -447
- package/pennyfarthing-dist/commands/sprint-planning.md +0 -109
- package/pennyfarthing-dist/commands/sprint.md +0 -142
- package/pennyfarthing-dist/commands/standalone.md +0 -194
- package/pennyfarthing-dist/commands/start-epic.md +0 -168
- package/pennyfarthing-dist/commands/sync-epic-to-jira.md +0 -184
- package/pennyfarthing-dist/commands/sync-work-with-sprint.md +0 -373
- package/pennyfarthing-dist/commands/tea.md +0 -9
- package/pennyfarthing-dist/commands/tech-writer.md +0 -9
- package/pennyfarthing-dist/commands/theme-maker.md +0 -676
- package/pennyfarthing-dist/commands/update-domain-docs.md +0 -83
- package/pennyfarthing-dist/commands/ux-designer.md +0 -9
- package/pennyfarthing-dist/commands/work.md +0 -25
- package/pennyfarthing-dist/commands/workflow.md +0 -21
- package/pennyfarthing-dist/guides/agent-behavior.md +0 -90
- package/pennyfarthing-dist/guides/agent-coordination.md +0 -480
- package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +0 -432
- package/pennyfarthing-dist/guides/agent-template-strategic.md +0 -148
- package/pennyfarthing-dist/guides/agent-template-tactical.md +0 -162
- package/pennyfarthing-dist/guides/hooks.md +0 -230
- package/pennyfarthing-dist/guides/measurement-framework.md +0 -210
- package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +0 -766
- package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +0 -574
- package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +0 -488
- package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +0 -402
- package/pennyfarthing-dist/guides/permission-protocol.md +0 -188
- package/pennyfarthing-dist/guides/persona-loading.md +0 -46
- package/pennyfarthing-dist/guides/prompt-patterns.md +0 -338
- package/pennyfarthing-dist/guides/scale-levels.md +0 -114
- package/pennyfarthing-dist/guides/session-artifacts.md +0 -193
- package/pennyfarthing-dist/guides/session-schema.md +0 -346
- package/pennyfarthing-dist/guides/skill-schema.md +0 -412
- package/pennyfarthing-dist/guides/workflow-schema.md +0 -257
- package/pennyfarthing-dist/guides/workflow-step-schema.md +0 -512
- package/pennyfarthing-dist/guides/worktree-mode.md +0 -113
- package/pennyfarthing-dist/guides/xml-tags.md +0 -627
- package/pennyfarthing-dist/output-styles/teaching.md +0 -33
- package/pennyfarthing-dist/output-styles/terse.md +0 -20
- package/pennyfarthing-dist/output-styles/verbose.md +0 -28
- package/pennyfarthing-dist/personas/themes/a-team.yaml +0 -331
- package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +0 -324
- package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +0 -282
- package/pennyfarthing-dist/personas/themes/blade-runner.yaml +0 -289
- package/pennyfarthing-dist/personas/themes/catch-22.yaml +0 -304
- package/pennyfarthing-dist/personas/themes/control.yaml +0 -201
- package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +0 -315
- package/pennyfarthing-dist/personas/themes/discworld.yaml +0 -334
- package/pennyfarthing-dist/personas/themes/doctor-who.yaml +0 -284
- package/pennyfarthing-dist/personas/themes/dune.yaml +0 -301
- package/pennyfarthing-dist/personas/themes/firefly.yaml +0 -320
- package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +0 -284
- package/pennyfarthing-dist/personas/themes/harry-potter.yaml +0 -316
- package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +0 -323
- package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +0 -326
- package/pennyfarthing-dist/personas/themes/mad-max.yaml +0 -349
- package/pennyfarthing-dist/personas/themes/mash.yaml +0 -329
- package/pennyfarthing-dist/personas/themes/princess-bride.yaml +0 -344
- package/pennyfarthing-dist/personas/themes/sandman.yaml +0 -282
- package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +0 -358
- package/pennyfarthing-dist/personas/themes/star-wars.yaml +0 -297
- package/pennyfarthing-dist/personas/themes/the-expanse.yaml +0 -337
- package/pennyfarthing-dist/personas/themes/the-matrix.yaml +0 -342
- package/pennyfarthing-dist/personas/themes/watchmen.yaml +0 -285
- package/pennyfarthing-dist/personas/themes/west-wing.yaml +0 -285
- package/pennyfarthing-dist/personas/themes/x-files.yaml +0 -296
- package/pennyfarthing-dist/scripts/README.md +0 -87
- package/pennyfarthing-dist/scripts/core/README.md +0 -25
- package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -390
- package/pennyfarthing-dist/scripts/core/check-context.sh +0 -194
- package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -112
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -90
- package/pennyfarthing-dist/scripts/core/prime.sh +0 -30
- package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -21
- package/pennyfarthing-dist/scripts/git/README.md +0 -25
- package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -267
- package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -152
- package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +0 -79
- package/pennyfarthing-dist/scripts/git/release.sh +0 -246
- package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -497
- package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -156
- package/pennyfarthing-dist/scripts/hooks/README.md +0 -32
- package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -106
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -95
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -65
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -35
- package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -150
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -102
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -71
- package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -42
- package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -20
- package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -499
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -30
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -97
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -65
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -78
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -94
- package/pennyfarthing-dist/scripts/jira/README.md +0 -36
- package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -95
- package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -91
- package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -22
- package/pennyfarthing-dist/scripts/jira/jira-lib.sh +0 -464
- package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -260
- package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -18
- package/pennyfarthing-dist/scripts/jira/jira-sync.sh +0 -16
- package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -16
- package/pennyfarthing-dist/scripts/jira/sync-epic-to-jira.sh +0 -16
- package/pennyfarthing-dist/scripts/lib/README.md +0 -29
- package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -177
- package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -136
- package/pennyfarthing-dist/scripts/lib/common.sh +0 -212
- package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -269
- package/pennyfarthing-dist/scripts/lib/find-root.sh +0 -58
- package/pennyfarthing-dist/scripts/lib/logging.sh +0 -186
- package/pennyfarthing-dist/scripts/lib/retry.sh +0 -76
- package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -102
- package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -91
- package/pennyfarthing-dist/scripts/misc/README.md +0 -44
- package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -13
- package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -226
- package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -77
- package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -247
- package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -231
- package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -107
- package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -74
- package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -10
- package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -319
- package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -141
- package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -778
- package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -212
- package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -7
- package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -319
- package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -193
- package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -259
- package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -275
- package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -160
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +0 -417
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -54
- package/pennyfarthing-dist/scripts/sprint/README.md +0 -29
- package/pennyfarthing-dist/scripts/sprint/archive-story.sh +0 -133
- package/pennyfarthing-dist/scripts/sprint/available-stories.sh +0 -91
- package/pennyfarthing-dist/scripts/sprint/check-story.sh +0 -158
- package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +0 -52
- package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +0 -63
- package/pennyfarthing-dist/scripts/sprint/list-future.sh +0 -145
- package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +0 -110
- package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +0 -148
- package/pennyfarthing-dist/scripts/sprint/sprint-common.sh +0 -415
- package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +0 -33
- package/pennyfarthing-dist/scripts/sprint/sprint-metrics.sh +0 -230
- package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +0 -134
- package/pennyfarthing-dist/scripts/sprint/validate-sprint-yaml.sh +0 -139
- package/pennyfarthing-dist/scripts/story/README.md +0 -23
- package/pennyfarthing-dist/scripts/story/create-story.sh +0 -19
- package/pennyfarthing-dist/scripts/story/size-story.sh +0 -18
- package/pennyfarthing-dist/scripts/story/story-template.sh +0 -18
- package/pennyfarthing-dist/scripts/test/README.md +0 -23
- package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +0 -59
- package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +0 -220
- package/pennyfarthing-dist/scripts/test/swebench-judge.py +0 -374
- package/pennyfarthing-dist/scripts/test/test-cache.sh +0 -165
- package/pennyfarthing-dist/scripts/test/test-setup.sh +0 -337
- package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -582
- package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -515
- package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -599
- package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -332
- package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -573
- package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -859
- package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -662
- package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -589
- package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -106
- package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -597
- package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -514
- package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -517
- package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -331
- package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -647
- package/pennyfarthing-dist/scripts/theme/README.md +0 -22
- package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +0 -13
- package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +0 -402
- package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -30
- package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +0 -97
- package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -576
- package/pennyfarthing-dist/scripts/workflow/README.md +0 -28
- package/pennyfarthing-dist/scripts/workflow/check.py +0 -502
- package/pennyfarthing-dist/scripts/workflow/check.sh +0 -24
- package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -154
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -222
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -61
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -13
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -124
- package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -34
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -157
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -132
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -250
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -161
- package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +0 -246
- package/pennyfarthing-dist/skills/changelog/SKILL.md +0 -385
- package/pennyfarthing-dist/skills/code-review/SKILL.md +0 -172
- package/pennyfarthing-dist/skills/context-engineering/SKILL.md +0 -277
- package/pennyfarthing-dist/skills/cyclist/SKILL.md +0 -88
- package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +0 -461
- package/pennyfarthing-dist/skills/finalize-run/SKILL.md +0 -261
- package/pennyfarthing-dist/skills/jira/SKILL.md +0 -508
- package/pennyfarthing-dist/skills/judge/SKILL.md +0 -644
- package/pennyfarthing-dist/skills/just/SKILL.md +0 -414
- package/pennyfarthing-dist/skills/mermaid/SKILL.md +0 -256
- package/pennyfarthing-dist/skills/otel/skill.md +0 -227
- package/pennyfarthing-dist/skills/permissions/skill.md +0 -175
- package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +0 -187
- package/pennyfarthing-dist/skills/skill-registry.schema.json +0 -107
- package/pennyfarthing-dist/skills/skill-registry.yaml +0 -393
- package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +0 -101
- package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +0 -97
- package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +0 -164
- package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +0 -101
- package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +0 -116
- package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +0 -164
- package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +0 -39
- package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +0 -147
- package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +0 -93
- package/pennyfarthing-dist/skills/sprint/skill.md +0 -465
- package/pennyfarthing-dist/skills/story/scripts/create-story.sh +0 -159
- package/pennyfarthing-dist/skills/story/scripts/size-story.sh +0 -198
- package/pennyfarthing-dist/skills/story/scripts/story-template.sh +0 -162
- package/pennyfarthing-dist/skills/story/skill.md +0 -219
- package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +0 -446
- package/pennyfarthing-dist/skills/testing/SKILL.md +0 -121
- package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +0 -124
- package/pennyfarthing-dist/skills/theme/skill.md +0 -141
- package/pennyfarthing-dist/skills/theme-creation/SKILL.md +0 -178
- package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +0 -91
- package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +0 -163
- package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +0 -138
- package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +0 -273
- package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +0 -167
- package/pennyfarthing-dist/skills/workflow/skill.md +0 -345
- package/pennyfarthing-dist/skills/yq/SKILL.md +0 -272
- package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +0 -187
- package/pennyfarthing-dist/templates/LEADERBOARD.template.md +0 -59
- package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -276
- package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +0 -61
- package/pennyfarthing-dist/templates/persona-config.yaml.template +0 -22
- package/pennyfarthing-dist/templates/preferences.yaml.template +0 -15
- package/pennyfarthing-dist/templates/settings.local.json.template +0 -110
- package/pennyfarthing-dist/templates/setup-env.sh.template +0 -18
- package/pennyfarthing-dist/templates/shared-context.md.template +0 -70
- package/pennyfarthing-dist/templates/sidecar/decisions.md.template +0 -40
- package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +0 -37
- package/pennyfarthing-dist/templates/sidecar/patterns.md.template +0 -34
- package/pennyfarthing-dist/workflows/agent-docs.yaml +0 -70
- package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +0 -113
- package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +0 -105
- package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +0 -127
- package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +0 -145
- package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +0 -150
- package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +0 -145
- package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +0 -154
- package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +0 -172
- package/pennyfarthing-dist/workflows/architecture/templates/architecture-decision.md +0 -102
- package/pennyfarthing-dist/workflows/architecture.yaml +0 -65
- package/pennyfarthing-dist/workflows/bdd.yaml +0 -60
- package/pennyfarthing-dist/workflows/brainstorming/brain-methods.csv +0 -62
- package/pennyfarthing-dist/workflows/brainstorming/checklist.md +0 -44
- package/pennyfarthing-dist/workflows/brainstorming/instructions.md +0 -736
- package/pennyfarthing-dist/workflows/brainstorming/workflow.yaml +0 -49
- package/pennyfarthing-dist/workflows/code-review/checklist.md +0 -23
- package/pennyfarthing-dist/workflows/code-review/instructions.md +0 -234
- package/pennyfarthing-dist/workflows/code-review/workflow.yaml +0 -51
- package/pennyfarthing-dist/workflows/dev-story/checklist.md +0 -80
- package/pennyfarthing-dist/workflows/dev-story/instructions.xml +0 -410
- package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +0 -50
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +0 -281
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +0 -256
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +0 -298
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +0 -177
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +0 -145
- package/pennyfarthing-dist/workflows/epics-and-stories/templates/epics-template.md +0 -57
- package/pennyfarthing-dist/workflows/epics-and-stories/workflow.yaml +0 -28
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +0 -103
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-02-categorize.md +0 -147
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-03-execute.md +0 -215
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +0 -97
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +0 -78
- package/pennyfarthing-dist/workflows/git-cleanup.yaml +0 -59
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +0 -211
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +0 -199
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +0 -202
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +0 -162
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +0 -280
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +0 -158
- package/pennyfarthing-dist/workflows/implementation-readiness/templates/readiness-report-template.md +0 -4
- package/pennyfarthing-dist/workflows/implementation-readiness/workflow.yaml +0 -40
- package/pennyfarthing-dist/workflows/interactive-debug/steps/step-01-connect.md +0 -257
- package/pennyfarthing-dist/workflows/interactive-debug/steps/step-02-explore.md +0 -107
- package/pennyfarthing-dist/workflows/interactive-debug/steps/step-03-fix.md +0 -127
- package/pennyfarthing-dist/workflows/interactive-debug/steps/step-04-commit.md +0 -122
- package/pennyfarthing-dist/workflows/interactive-debug/workflow.yaml +0 -51
- package/pennyfarthing-dist/workflows/patch.yaml +0 -67
- package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +0 -13
- package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +0 -197
- package/pennyfarthing-dist/workflows/prd/data/project-types.csv +0 -11
- package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +0 -197
- package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +0 -159
- package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +0 -230
- package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +0 -232
- package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +0 -219
- package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +0 -213
- package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +0 -232
- package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +0 -243
- package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +0 -234
- package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +0 -237
- package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +0 -248
- package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +0 -223
- package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +0 -186
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +0 -253
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +0 -214
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +0 -255
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +0 -259
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +0 -174
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +0 -224
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +0 -197
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +0 -215
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +0 -180
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +0 -220
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +0 -234
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +0 -223
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +0 -211
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +0 -249
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +0 -269
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +0 -215
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +0 -270
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +0 -248
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +0 -238
- package/pennyfarthing-dist/workflows/prd/templates/prd-template.md +0 -10
- package/pennyfarthing-dist/workflows/prd/workflow.yaml +0 -42
- package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +0 -195
- package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +0 -180
- package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +0 -221
- package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +0 -224
- package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +0 -228
- package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +0 -243
- package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +0 -216
- package/pennyfarthing-dist/workflows/product-brief/templates/product-brief.template.md +0 -10
- package/pennyfarthing-dist/workflows/product-brief/workflow.yaml +0 -31
- package/pennyfarthing-dist/workflows/project-context/project-context-template.md +0 -21
- package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +0 -206
- package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +0 -349
- package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +0 -306
- package/pennyfarthing-dist/workflows/project-context/workflow.yaml +0 -27
- package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +0 -157
- package/pennyfarthing-dist/workflows/project-setup/steps/step-02-clone-repos.md +0 -217
- package/pennyfarthing-dist/workflows/project-setup/steps/step-03-repos-yaml.md +0 -159
- package/pennyfarthing-dist/workflows/project-setup/steps/step-04-claude-md.md +0 -186
- package/pennyfarthing-dist/workflows/project-setup/steps/step-05-shared-context.md +0 -185
- package/pennyfarthing-dist/workflows/project-setup/steps/step-06-task-runner.md +0 -279
- package/pennyfarthing-dist/workflows/project-setup/steps/step-07-theme.md +0 -200
- package/pennyfarthing-dist/workflows/project-setup/steps/step-08-theme-packs.md +0 -142
- package/pennyfarthing-dist/workflows/project-setup/steps/step-09-cyclist.md +0 -245
- package/pennyfarthing-dist/workflows/project-setup/steps/step-10-complete.md +0 -204
- package/pennyfarthing-dist/workflows/project-setup/workflow.yaml +0 -41
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +0 -177
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +0 -143
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +0 -138
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +0 -135
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +0 -129
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +0 -163
- package/pennyfarthing-dist/workflows/quick-dev/workflow.yaml +0 -27
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +0 -201
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +0 -156
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +0 -140
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +0 -203
- package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +0 -74
- package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +0 -27
- package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +0 -159
- package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +0 -253
- package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +0 -263
- package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +0 -232
- package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +0 -260
- package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +0 -477
- package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +0 -205
- package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +0 -262
- package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +0 -227
- package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +0 -275
- package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +0 -286
- package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +0 -203
- package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +0 -510
- package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +0 -159
- package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +0 -264
- package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +0 -274
- package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +0 -228
- package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +0 -267
- package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +0 -522
- package/pennyfarthing-dist/workflows/research/templates/research.template.md +0 -29
- package/pennyfarthing-dist/workflows/research/workflow.yaml +0 -45
- package/pennyfarthing-dist/workflows/retrospective/checklist.md +0 -31
- package/pennyfarthing-dist/workflows/retrospective/instructions.md +0 -1443
- package/pennyfarthing-dist/workflows/retrospective/workflow.yaml +0 -50
- package/pennyfarthing-dist/workflows/sprint-planning/checklist.md +0 -33
- package/pennyfarthing-dist/workflows/sprint-planning/sprint-status-template.yaml +0 -55
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +0 -69
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +0 -61
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +0 -80
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +0 -90
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +0 -78
- package/pennyfarthing-dist/workflows/sprint-planning/workflow.yaml +0 -34
- package/pennyfarthing-dist/workflows/tdd.yaml +0 -50
- package/pennyfarthing-dist/workflows/trivial.yaml +0 -40
- package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +0 -141
- package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +0 -133
- package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +0 -196
- package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +0 -222
- package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +0 -225
- package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +0 -240
- package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +0 -258
- package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +0 -260
- package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +0 -230
- package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +0 -230
- package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +0 -247
- package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +0 -254
- package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +0 -243
- package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +0 -270
- package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +0 -234
- package/pennyfarthing-dist/workflows/ux-design/ux-design-template.md +0 -13
- package/pennyfarthing-dist/workflows/ux-design/workflow.yaml +0 -41
- package/pennyfarthing_scripts/README.md +0 -66
- package/pennyfarthing_scripts/__init__.py +0 -17
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bellmode_hook.py +0 -154
- package/pennyfarthing_scripts/brownfield/__init__.py +0 -35
- package/pennyfarthing_scripts/brownfield/__main__.py +0 -7
- package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/cli.py +0 -131
- package/pennyfarthing_scripts/brownfield/discover.py +0 -753
- package/pennyfarthing_scripts/cli.py +0 -174
- package/pennyfarthing_scripts/common/__init__.py +0 -49
- package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/config.py +0 -91
- package/pennyfarthing_scripts/common/output.py +0 -180
- package/pennyfarthing_scripts/common/themes.py +0 -253
- package/pennyfarthing_scripts/config.py +0 -21
- package/pennyfarthing_scripts/context.py +0 -414
- package/pennyfarthing_scripts/git/__init__.py +0 -29
- package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/create_branches.py +0 -439
- package/pennyfarthing_scripts/git/status_all.py +0 -310
- package/pennyfarthing_scripts/hooks.py +0 -455
- package/pennyfarthing_scripts/jira/__init__.py +0 -93
- package/pennyfarthing_scripts/jira/__main__.py +0 -10
- package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/bidirectional.py +0 -561
- package/pennyfarthing_scripts/jira/claim.py +0 -211
- package/pennyfarthing_scripts/jira/cli.py +0 -150
- package/pennyfarthing_scripts/jira/client.py +0 -613
- package/pennyfarthing_scripts/jira/epic.py +0 -176
- package/pennyfarthing_scripts/jira/story.py +0 -219
- package/pennyfarthing_scripts/jira/sync.py +0 -350
- package/pennyfarthing_scripts/jira_bidirectional_sync.py +0 -37
- package/pennyfarthing_scripts/jira_epic_creation.py +0 -30
- package/pennyfarthing_scripts/jira_sync.py +0 -36
- package/pennyfarthing_scripts/jira_sync_story.py +0 -30
- package/pennyfarthing_scripts/migration/__init__.py +0 -39
- package/pennyfarthing_scripts/migration/__main__.py +0 -10
- package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/cli.py +0 -304
- package/pennyfarthing_scripts/migration/session.py +0 -384
- package/pennyfarthing_scripts/migration/skill.py +0 -188
- package/pennyfarthing_scripts/migration/step.py +0 -229
- package/pennyfarthing_scripts/migration/validate.py +0 -282
- package/pennyfarthing_scripts/output.py +0 -37
- package/pennyfarthing_scripts/patch_mode.py +0 -449
- package/pennyfarthing_scripts/preflight/__init__.py +0 -17
- package/pennyfarthing_scripts/preflight/__main__.py +0 -10
- package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/cli.py +0 -141
- package/pennyfarthing_scripts/preflight/finish.py +0 -382
- package/pennyfarthing_scripts/pretooluse_hook.py +0 -142
- package/pennyfarthing_scripts/prime/__init__.py +0 -125
- package/pennyfarthing_scripts/prime/__main__.py +0 -8
- package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/cli.py +0 -645
- package/pennyfarthing_scripts/prime/loader.py +0 -239
- package/pennyfarthing_scripts/prime/models.py +0 -206
- package/pennyfarthing_scripts/prime/persona.py +0 -308
- package/pennyfarthing_scripts/prime/session.py +0 -183
- package/pennyfarthing_scripts/prime/tiers.py +0 -201
- package/pennyfarthing_scripts/prime/workflow.py +0 -275
- package/pennyfarthing_scripts/schema_validation_hook.py +0 -306
- package/pennyfarthing_scripts/sprint/__init__.py +0 -66
- package/pennyfarthing_scripts/sprint/__main__.py +0 -10
- package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/archive.py +0 -108
- package/pennyfarthing_scripts/sprint/archive_epic.py +0 -399
- package/pennyfarthing_scripts/sprint/cli.py +0 -284
- package/pennyfarthing_scripts/sprint/import_epic.py +0 -431
- package/pennyfarthing_scripts/sprint/loader.py +0 -193
- package/pennyfarthing_scripts/sprint/status.py +0 -122
- package/pennyfarthing_scripts/sprint/validator.py +0 -405
- package/pennyfarthing_scripts/sprint/work.py +0 -192
- package/pennyfarthing_scripts/story/__init__.py +0 -67
- package/pennyfarthing_scripts/story/__main__.py +0 -10
- package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/cli.py +0 -105
- package/pennyfarthing_scripts/story/create.py +0 -167
- package/pennyfarthing_scripts/story/size.py +0 -113
- package/pennyfarthing_scripts/story/template.py +0 -151
- package/pennyfarthing_scripts/swebench.py +0 -216
- package/pennyfarthing_scripts/tests/__init__.py +0 -1
- package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/conftest.py +0 -106
- package/pennyfarthing_scripts/tests/test_brownfield.py +0 -842
- package/pennyfarthing_scripts/tests/test_cli_modules.py +0 -245
- package/pennyfarthing_scripts/tests/test_common.py +0 -180
- package/pennyfarthing_scripts/tests/test_git_utils.py +0 -866
- package/pennyfarthing_scripts/tests/test_jira_package.py +0 -334
- package/pennyfarthing_scripts/tests/test_package_structure.py +0 -372
- package/pennyfarthing_scripts/tests/test_patch_mode.py +0 -830
- package/pennyfarthing_scripts/tests/test_prime.py +0 -1050
- package/pennyfarthing_scripts/tests/test_sprint_package.py +0 -236
- package/pennyfarthing_scripts/tests/test_sprint_validator.py +0 -675
- package/pennyfarthing_scripts/tests/test_story_package.py +0 -156
- package/pennyfarthing_scripts/tests/test_tiers.py +0 -1090
- package/pennyfarthing_scripts/tests/test_token_counting.py +0 -559
- package/pennyfarthing_scripts/tests/test_workflow_check.py +0 -341
- package/pennyfarthing_scripts/welcome_hook.py +0 -157
- package/pennyfarthing_scripts/workflow.py +0 -287
- /package/{packages/core/bin → bin}/pennyfarthing.js +0 -0
- /package/{packages/core/dist → dist}/bmad/context-reader.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/context-reader.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/context-reader.js +0 -0
- /package/{packages/core/dist → dist}/bmad/context-reader.js.map +0 -0
- /package/{packages/core/dist → dist}/bmad/context-reader.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/context-reader.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/context-reader.test.js +0 -0
- /package/{packages/core/dist → dist}/bmad/context-reader.test.js.map +0 -0
- /package/{packages/core/dist → dist}/bmad/epics-parser.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/epics-parser.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/epics-parser.js +0 -0
- /package/{packages/core/dist → dist}/bmad/epics-parser.js.map +0 -0
- /package/{packages/core/dist → dist}/bmad/epics-parser.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/epics-parser.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/epics-parser.test.js +0 -0
- /package/{packages/core/dist → dist}/bmad/epics-parser.test.js.map +0 -0
- /package/{packages/core/dist → dist}/bmad/index.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/index.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/index.js +0 -0
- /package/{packages/core/dist → dist}/bmad/index.js.map +0 -0
- /package/{packages/core/dist → dist}/bmad/status-sync.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/status-sync.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/status-sync.js +0 -0
- /package/{packages/core/dist → dist}/bmad/status-sync.js.map +0 -0
- /package/{packages/core/dist → dist}/bmad/status-sync.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/status-sync.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/status-sync.test.js +0 -0
- /package/{packages/core/dist → dist}/bmad/status-sync.test.js.map +0 -0
- /package/{packages/core/dist → dist}/bmad/story-exporter.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/story-exporter.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/story-exporter.js +0 -0
- /package/{packages/core/dist → dist}/bmad/story-exporter.js.map +0 -0
- /package/{packages/core/dist → dist}/bmad/story-exporter.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/story-exporter.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/story-exporter.test.js +0 -0
- /package/{packages/core/dist → dist}/bmad/story-exporter.test.js.map +0 -0
- /package/{packages/core/dist → dist}/bmad/story-parser.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/story-parser.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/story-parser.js +0 -0
- /package/{packages/core/dist → dist}/bmad/story-parser.js.map +0 -0
- /package/{packages/core/dist → dist}/bmad/story-parser.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/bmad/story-parser.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/bmad/story-parser.test.js +0 -0
- /package/{packages/core/dist → dist}/bmad/story-parser.test.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/command.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/command.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/command.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/command.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/cyclist.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/cyclist.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/cyclist.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/cyclist.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/cyclist.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/cyclist.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/cyclist.test.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/cyclist.test.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/doctor.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/doctor.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/doctor.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/doctor.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/init.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/init.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/init.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/init.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/skill.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/skill.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/skill.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/skill.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/theme.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/theme.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/theme.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/theme.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/uninstall.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/uninstall.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/uninstall.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/uninstall.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/update.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/update.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/update.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/update.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/version.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/commands/version.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/commands/version.js +0 -0
- /package/{packages/core/dist → dist}/cli/commands/version.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/customization.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/customization.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/customization.test.js +0 -0
- /package/{packages/core/dist → dist}/cli/customization.test.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/cyclist-migration.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/cyclist-migration.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/cyclist-migration.test.js +0 -0
- /package/{packages/core/dist → dist}/cli/cyclist-migration.test.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/index.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/index.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/index.js +0 -0
- /package/{packages/core/dist → dist}/cli/index.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/ocean-profiles.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/ocean-profiles.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/ocean-profiles.test.js +0 -0
- /package/{packages/core/dist → dist}/cli/ocean-profiles.test.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/theme-maker.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/theme-maker.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/theme-maker.test.js +0 -0
- /package/{packages/core/dist → dist}/cli/theme-maker.test.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/constants.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/constants.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/constants.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/constants.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/files.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/files.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/files.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/files.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/logger.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/logger.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/logger.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/logger.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/manifest.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/manifest.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/manifest.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/manifest.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/node-modules.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/node-modules.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/node-modules.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/node-modules.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/prompts.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/prompts.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/prompts.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/prompts.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/settings.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/settings.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/settings.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/settings.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/symlinks.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/symlinks.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/symlinks.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/symlinks.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/themes.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/themes.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/themes.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/themes.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/themes.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/themes.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/themes.test.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/themes.test.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/version.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/utils/version.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/utils/version.js +0 -0
- /package/{packages/core/dist → dist}/cli/utils/version.js.map +0 -0
- /package/{packages/core/dist → dist}/cli/workspace.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/cli/workspace.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/cli/workspace.test.js +0 -0
- /package/{packages/core/dist → dist}/cli/workspace.test.js.map +0 -0
- /package/{packages/core/dist → dist}/index.d.ts +0 -0
- /package/{packages/core/dist → dist}/index.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/index.js +0 -0
- /package/{packages/core/dist → dist}/index.js.map +0 -0
- /package/{packages/core/dist → dist}/jira/jira-epic-creation.d.ts +0 -0
- /package/{packages/core/dist → dist}/jira/jira-epic-creation.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/jira/jira-epic-creation.js +0 -0
- /package/{packages/core/dist → dist}/jira/jira-epic-creation.js.map +0 -0
- /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.js +0 -0
- /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.js.map +0 -0
- /package/{packages/core/dist → dist}/jira/jira-sprint-sync.d.ts +0 -0
- /package/{packages/core/dist → dist}/jira/jira-sprint-sync.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/jira/jira-sprint-sync.js +0 -0
- /package/{packages/core/dist → dist}/jira/jira-sprint-sync.js.map +0 -0
- /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.js +0 -0
- /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.js.map +0 -0
- /package/{packages/core/dist → dist}/permissions/index.d.ts +0 -0
- /package/{packages/core/dist → dist}/permissions/index.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/permissions/index.js +0 -0
- /package/{packages/core/dist → dist}/permissions/index.js.map +0 -0
- /package/{packages/core/dist → dist}/permissions/permission-schema.d.ts +0 -0
- /package/{packages/core/dist → dist}/permissions/permission-schema.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/permissions/permission-schema.js +0 -0
- /package/{packages/core/dist → dist}/permissions/permission-schema.js.map +0 -0
- /package/{packages/core/dist → dist}/permissions/permission-schema.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/permissions/permission-schema.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/permissions/permission-schema.test.js +0 -0
- /package/{packages/core/dist → dist}/permissions/permission-schema.test.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.js +0 -0
- /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/benchmark-integration.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/benchmark-integration.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/benchmark-integration.js +0 -0
- /package/{packages/core/dist → dist}/scripts/benchmark-integration.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.js +0 -0
- /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.js +0 -0
- /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-all-spiders.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-all-spiders.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-all-spiders.js +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-all-spiders.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-report.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-report.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-report.js +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-report.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-report.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-report.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-report.test.js +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-report.test.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider-report.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider-report.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider-report.js +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider-report.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.js +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider.js +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider.test.js +0 -0
- /package/{packages/core/dist → dist}/scripts/generate-spider.test.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.js +0 -0
- /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.js +0 -0
- /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/run-ci.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/run-ci.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/run-ci.test.js +0 -0
- /package/{packages/core/dist → dist}/scripts/run-ci.test.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/theme-detail.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/theme-detail.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/theme-detail.test.js +0 -0
- /package/{packages/core/dist → dist}/scripts/theme-detail.test.js.map +0 -0
- /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.d.ts +0 -0
- /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.js +0 -0
- /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/gate-handler.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/gate-handler.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/gate-handler.js +0 -0
- /package/{packages/core/dist → dist}/workflow/gate-handler.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/gate-handler.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/gate-handler.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/gate-handler.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/gate-handler.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/generic-sm-finish.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/generic-sm-finish.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/generic-sm-finish.js +0 -0
- /package/{packages/core/dist → dist}/workflow/generic-sm-finish.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/generic-sm-setup.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/generic-sm-setup.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/generic-sm-setup.js +0 -0
- /package/{packages/core/dist → dist}/workflow/generic-sm-setup.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/handoff.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/handoff.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/handoff.js +0 -0
- /package/{packages/core/dist → dist}/workflow/handoff.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/handoff.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/handoff.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/handoff.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/handoff.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/index.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/index.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/index.js +0 -0
- /package/{packages/core/dist → dist}/workflow/index.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/session-state.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/session-state.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/session-state.js +0 -0
- /package/{packages/core/dist → dist}/workflow/session-state.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/session-state.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/session-state.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/session-state.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/session-state.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/sm-subagents.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/sm-subagents.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/sm-subagents.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/sm-subagents.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/step-parser.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/step-parser.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/step-parser.js +0 -0
- /package/{packages/core/dist → dist}/workflow/step-parser.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/step-parser.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/step-parser.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/step-parser.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/step-parser.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/test-cache.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/test-cache.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/test-cache.js +0 -0
- /package/{packages/core/dist → dist}/workflow/test-cache.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/test-cache.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/test-cache.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/test-cache.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/test-cache.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/trimodal.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/trimodal.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/trimodal.js +0 -0
- /package/{packages/core/dist → dist}/workflow/trimodal.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/trimodal.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/trimodal.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/trimodal.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/trimodal.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/variable-resolver.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/variable-resolver.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/variable-resolver.js +0 -0
- /package/{packages/core/dist → dist}/workflow/variable-resolver.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/variable-resolver.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/variable-resolver.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/variable-resolver.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/variable-resolver.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-executor.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-executor.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-executor.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-executor.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-executor.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-executor.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-executor.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-executor.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-loader.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-loader.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-loader.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-loader.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-loader.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-loader.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-loader.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-loader.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-migration.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-migration.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-migration.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-migration.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-permissions.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-permissions.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-permissions.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-permissions.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-router.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-router.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-router.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-router.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-router.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-router.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-router.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-router.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-schema.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-schema.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-schema.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-schema.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-schema.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-schema.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-schema.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-schema.test.js.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.d.ts +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.d.ts.map +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.js +0 -0
- /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.js.map +0 -0
|
@@ -1,1090 +0,0 @@
|
|
|
1
|
-
"""Tests for tiered context injection system.
|
|
2
|
-
|
|
3
|
-
Tests the --tier argument and tier-specific component loading for the prime command.
|
|
4
|
-
|
|
5
|
-
Story: MSSCI-12797 - Python Prime Tier Support
|
|
6
|
-
Acceptance Criteria:
|
|
7
|
-
- AC1: --tier argument with choices FULL, REFRESH, HANDOFF, MINIMAL
|
|
8
|
-
- AC2: Tier-specific component loading per specification
|
|
9
|
-
- AC3: Compressed persona format (~100 tokens vs ~300 full)
|
|
10
|
-
- AC4: Default behavior unchanged (FULL when --tier not specified)
|
|
11
|
-
- AC5: Unit tests for all tier loading paths with >90% coverage
|
|
12
|
-
- AC6: Token reduction verified: REFRESH ~600, HANDOFF ~700, MINIMAL ~200
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
import pytest
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
from unittest.mock import patch, MagicMock
|
|
18
|
-
import yaml
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# =============================================================================
|
|
22
|
-
# AC1: --tier CLI Argument Tests
|
|
23
|
-
# =============================================================================
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class TestTierCLIArgument:
|
|
27
|
-
"""Tests for --tier CLI argument (AC1)."""
|
|
28
|
-
|
|
29
|
-
def test_tier_argument_accepts_full(self, tmp_path: Path) -> None:
|
|
30
|
-
"""Test --tier FULL is accepted."""
|
|
31
|
-
from pennyfarthing_scripts.prime.cli import main
|
|
32
|
-
|
|
33
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
34
|
-
pf_dir.mkdir()
|
|
35
|
-
agents_dir = pf_dir / "agents"
|
|
36
|
-
agents_dir.mkdir()
|
|
37
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
38
|
-
|
|
39
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
40
|
-
result = main(["--agent", "dev", "--tier", "FULL", "--no-workflow", "--no-register"])
|
|
41
|
-
|
|
42
|
-
assert result == 0
|
|
43
|
-
|
|
44
|
-
def test_tier_argument_accepts_refresh(self, tmp_path: Path) -> None:
|
|
45
|
-
"""Test --tier REFRESH is accepted."""
|
|
46
|
-
from pennyfarthing_scripts.prime.cli import main
|
|
47
|
-
|
|
48
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
49
|
-
pf_dir.mkdir()
|
|
50
|
-
agents_dir = pf_dir / "agents"
|
|
51
|
-
agents_dir.mkdir()
|
|
52
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
53
|
-
|
|
54
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
55
|
-
result = main(["--agent", "dev", "--tier", "REFRESH", "--no-workflow", "--no-register"])
|
|
56
|
-
|
|
57
|
-
assert result == 0
|
|
58
|
-
|
|
59
|
-
def test_tier_argument_accepts_handoff(self, tmp_path: Path) -> None:
|
|
60
|
-
"""Test --tier HANDOFF is accepted."""
|
|
61
|
-
from pennyfarthing_scripts.prime.cli import main
|
|
62
|
-
|
|
63
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
64
|
-
pf_dir.mkdir()
|
|
65
|
-
agents_dir = pf_dir / "agents"
|
|
66
|
-
agents_dir.mkdir()
|
|
67
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
68
|
-
|
|
69
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
70
|
-
result = main(["--agent", "dev", "--tier", "HANDOFF", "--no-workflow", "--no-register"])
|
|
71
|
-
|
|
72
|
-
assert result == 0
|
|
73
|
-
|
|
74
|
-
def test_tier_argument_accepts_minimal(self, tmp_path: Path) -> None:
|
|
75
|
-
"""Test --tier MINIMAL is accepted."""
|
|
76
|
-
from pennyfarthing_scripts.prime.cli import main
|
|
77
|
-
|
|
78
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
79
|
-
pf_dir.mkdir()
|
|
80
|
-
agents_dir = pf_dir / "agents"
|
|
81
|
-
agents_dir.mkdir()
|
|
82
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
83
|
-
|
|
84
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
85
|
-
result = main(["--agent", "dev", "--tier", "MINIMAL", "--no-workflow", "--no-register"])
|
|
86
|
-
|
|
87
|
-
assert result == 0
|
|
88
|
-
|
|
89
|
-
def test_tier_argument_rejects_invalid_value(self, tmp_path: Path) -> None:
|
|
90
|
-
"""Test --tier rejects invalid values."""
|
|
91
|
-
from pennyfarthing_scripts.prime.cli import main
|
|
92
|
-
|
|
93
|
-
with pytest.raises(SystemExit) as exc_info:
|
|
94
|
-
main(["--tier", "INVALID"])
|
|
95
|
-
|
|
96
|
-
# argparse exits with 2 for invalid arguments
|
|
97
|
-
assert exc_info.value.code == 2
|
|
98
|
-
|
|
99
|
-
def test_tier_argument_case_insensitive(self, tmp_path: Path) -> None:
|
|
100
|
-
"""Test --tier accepts lowercase values."""
|
|
101
|
-
from pennyfarthing_scripts.prime.cli import main
|
|
102
|
-
|
|
103
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
104
|
-
pf_dir.mkdir()
|
|
105
|
-
agents_dir = pf_dir / "agents"
|
|
106
|
-
agents_dir.mkdir()
|
|
107
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
108
|
-
|
|
109
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
110
|
-
# Should accept lowercase
|
|
111
|
-
result = main(["--agent", "dev", "--tier", "full", "--no-workflow", "--no-register"])
|
|
112
|
-
|
|
113
|
-
assert result == 0
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
# =============================================================================
|
|
117
|
-
# AC2: Tier-Specific Component Loading Tests
|
|
118
|
-
# =============================================================================
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
class TestTierComponentLoading:
|
|
122
|
-
"""Tests for tier-specific component loading (AC2)."""
|
|
123
|
-
|
|
124
|
-
def test_full_tier_loads_all_components(self, tmp_path: Path, capsys) -> None:
|
|
125
|
-
"""Test FULL tier loads all 10 components."""
|
|
126
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
127
|
-
|
|
128
|
-
# Setup complete project structure
|
|
129
|
-
self._setup_full_project(tmp_path)
|
|
130
|
-
|
|
131
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
132
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
133
|
-
result = prime(
|
|
134
|
-
agent_name="dev",
|
|
135
|
-
tier="FULL",
|
|
136
|
-
no_workflow=True,
|
|
137
|
-
no_register=True,
|
|
138
|
-
project_root=tmp_path,
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
assert result == 0
|
|
142
|
-
captured = capsys.readouterr()
|
|
143
|
-
|
|
144
|
-
# FULL should include all components
|
|
145
|
-
assert "# Dev Agent" in captured.out # agent-definition
|
|
146
|
-
assert "# Agent Behavior Guide" in captured.out # behavior-guide
|
|
147
|
-
assert "patterns.md" in captured.out # sidecars
|
|
148
|
-
|
|
149
|
-
def test_refresh_tier_loads_dynamic_only(self, tmp_path: Path, capsys) -> None:
|
|
150
|
-
"""Test REFRESH tier loads only dynamic state (~600 tokens)."""
|
|
151
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
152
|
-
|
|
153
|
-
# Setup
|
|
154
|
-
self._setup_full_project(tmp_path)
|
|
155
|
-
|
|
156
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
157
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
158
|
-
result = prime(
|
|
159
|
-
agent_name="dev",
|
|
160
|
-
tier="REFRESH",
|
|
161
|
-
no_register=True,
|
|
162
|
-
project_root=tmp_path,
|
|
163
|
-
)
|
|
164
|
-
|
|
165
|
-
assert result == 0
|
|
166
|
-
captured = capsys.readouterr()
|
|
167
|
-
|
|
168
|
-
# REFRESH should include:
|
|
169
|
-
# - workflow-state
|
|
170
|
-
# - sprint-context
|
|
171
|
-
# - session-header
|
|
172
|
-
# - Note about full context in history
|
|
173
|
-
assert "Sprint" in captured.out # sprint-context
|
|
174
|
-
assert "Full context already in conversation history" in captured.out
|
|
175
|
-
|
|
176
|
-
# REFRESH should NOT include:
|
|
177
|
-
# - agent-definition
|
|
178
|
-
# - behavior-guide
|
|
179
|
-
# - sidecars
|
|
180
|
-
assert "# Dev Agent" not in captured.out
|
|
181
|
-
assert "# Agent Behavior Guide" not in captured.out
|
|
182
|
-
|
|
183
|
-
def test_handoff_tier_loads_agent_essentials(self, tmp_path: Path, capsys) -> None:
|
|
184
|
-
"""Test HANDOFF tier loads agent definition + compressed persona (~700 tokens)."""
|
|
185
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
186
|
-
|
|
187
|
-
# Setup
|
|
188
|
-
self._setup_full_project(tmp_path)
|
|
189
|
-
|
|
190
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
191
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
192
|
-
result = prime(
|
|
193
|
-
agent_name="dev",
|
|
194
|
-
tier="HANDOFF",
|
|
195
|
-
no_register=True,
|
|
196
|
-
project_root=tmp_path,
|
|
197
|
-
)
|
|
198
|
-
|
|
199
|
-
assert result == 0
|
|
200
|
-
captured = capsys.readouterr()
|
|
201
|
-
|
|
202
|
-
# HANDOFF should include:
|
|
203
|
-
# - workflow-state
|
|
204
|
-
# - agent-definition
|
|
205
|
-
# - persona-compressed
|
|
206
|
-
# - Note about behavior guides in history
|
|
207
|
-
assert "# Dev Agent" in captured.out
|
|
208
|
-
assert "Behavior guides in conversation history" in captured.out
|
|
209
|
-
|
|
210
|
-
# HANDOFF should use compressed persona, not full
|
|
211
|
-
# Compressed format: <persona agent="dev" character="...">
|
|
212
|
-
assert "<persona" in captured.out or "persona-compressed" in captured.out
|
|
213
|
-
|
|
214
|
-
# HANDOFF should NOT include:
|
|
215
|
-
# - behavior-guide
|
|
216
|
-
# - sidecars
|
|
217
|
-
# - domain-docs
|
|
218
|
-
assert "# Agent Behavior Guide" not in captured.out
|
|
219
|
-
|
|
220
|
-
def test_minimal_tier_loads_workflow_only(self, tmp_path: Path, capsys) -> None:
|
|
221
|
-
"""Test MINIMAL tier loads only workflow state (~200 tokens)."""
|
|
222
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
223
|
-
|
|
224
|
-
# Setup
|
|
225
|
-
self._setup_full_project(tmp_path)
|
|
226
|
-
|
|
227
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
228
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
229
|
-
result = prime(
|
|
230
|
-
agent_name="dev",
|
|
231
|
-
tier="MINIMAL",
|
|
232
|
-
no_register=True,
|
|
233
|
-
project_root=tmp_path,
|
|
234
|
-
)
|
|
235
|
-
|
|
236
|
-
assert result == 0
|
|
237
|
-
captured = capsys.readouterr()
|
|
238
|
-
|
|
239
|
-
# MINIMAL should include:
|
|
240
|
-
# - workflow-state
|
|
241
|
-
# - Minimal context note
|
|
242
|
-
assert "Minimal context" in captured.out or "conversation history" in captured.out
|
|
243
|
-
|
|
244
|
-
# MINIMAL should NOT include:
|
|
245
|
-
# - agent-definition
|
|
246
|
-
# - persona
|
|
247
|
-
# - behavior-guide
|
|
248
|
-
# - sprint-context
|
|
249
|
-
# - sidecars
|
|
250
|
-
assert "# Dev Agent" not in captured.out
|
|
251
|
-
assert "# Agent Behavior Guide" not in captured.out
|
|
252
|
-
assert "patterns.md" not in captured.out
|
|
253
|
-
|
|
254
|
-
def _setup_full_project(self, tmp_path: Path) -> None:
|
|
255
|
-
"""Set up a complete project structure for testing."""
|
|
256
|
-
# .pennyfarthing directory
|
|
257
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
258
|
-
pf_dir.mkdir()
|
|
259
|
-
|
|
260
|
-
# Agent definition
|
|
261
|
-
agents_dir = pf_dir / "agents"
|
|
262
|
-
agents_dir.mkdir()
|
|
263
|
-
(agents_dir / "dev.md").write_text("# Dev Agent\n\nDeveloper agent definition.")
|
|
264
|
-
|
|
265
|
-
# Behavior guide
|
|
266
|
-
guides_dir = pf_dir / "guides"
|
|
267
|
-
guides_dir.mkdir()
|
|
268
|
-
(guides_dir / "agent-behavior.md").write_text("# Agent Behavior Guide\n\nShared protocols.")
|
|
269
|
-
|
|
270
|
-
# Sidecars
|
|
271
|
-
sidecar_dir = pf_dir / "sidecars" / "dev"
|
|
272
|
-
sidecar_dir.mkdir(parents=True)
|
|
273
|
-
(sidecar_dir / "patterns.md").write_text("# Patterns\n\nDev patterns.")
|
|
274
|
-
|
|
275
|
-
# Theme config
|
|
276
|
-
(pf_dir / "config.local.yaml").write_text(yaml.dump({"theme": "test-theme"}))
|
|
277
|
-
|
|
278
|
-
# Theme file
|
|
279
|
-
themes_dir = pf_dir / "personas" / "themes"
|
|
280
|
-
themes_dir.mkdir(parents=True)
|
|
281
|
-
(themes_dir / "test-theme.yaml").write_text(yaml.dump({
|
|
282
|
-
"theme": {"name": "Test Theme", "user_title": "Developer"},
|
|
283
|
-
"agents": {
|
|
284
|
-
"dev": {
|
|
285
|
-
"character": "Test Developer",
|
|
286
|
-
"style": "Practical and efficient",
|
|
287
|
-
"role": "Implementation specialist",
|
|
288
|
-
"quote": "Ship it!",
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}))
|
|
292
|
-
|
|
293
|
-
# Sprint
|
|
294
|
-
sprint_dir = tmp_path / "sprint"
|
|
295
|
-
sprint_dir.mkdir()
|
|
296
|
-
(sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
|
|
297
|
-
"sprint": {"number": 12, "goal": "Test sprint"},
|
|
298
|
-
"epics": []
|
|
299
|
-
}))
|
|
300
|
-
|
|
301
|
-
# Session
|
|
302
|
-
session_dir = tmp_path / ".session"
|
|
303
|
-
session_dir.mkdir()
|
|
304
|
-
(session_dir / "test-session.md").write_text("# Test Session\n\n- **Phase:** green")
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
# =============================================================================
|
|
308
|
-
# AC3: Compressed Persona Format Tests
|
|
309
|
-
# =============================================================================
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
class TestCompressedPersonaFormat:
|
|
313
|
-
"""Tests for compressed persona format (AC3)."""
|
|
314
|
-
|
|
315
|
-
def test_compressed_persona_has_xml_structure(self, tmp_path: Path) -> None:
|
|
316
|
-
"""Test compressed persona uses XML format."""
|
|
317
|
-
from pennyfarthing_scripts.prime.persona import format_persona_compressed
|
|
318
|
-
|
|
319
|
-
# Import will fail until function is implemented
|
|
320
|
-
from pennyfarthing_scripts.prime.models import Persona
|
|
321
|
-
|
|
322
|
-
persona = Persona(
|
|
323
|
-
character="Rosie the Riveter",
|
|
324
|
-
style="Can-do wartime spirit, practical, determined",
|
|
325
|
-
role="Implementation specialist",
|
|
326
|
-
quote="We Can Do It!",
|
|
327
|
-
)
|
|
328
|
-
|
|
329
|
-
result = format_persona_compressed(persona, "test-theme", "dev")
|
|
330
|
-
|
|
331
|
-
assert '<persona agent="dev"' in result
|
|
332
|
-
assert 'character="Rosie the Riveter"' in result
|
|
333
|
-
assert "</persona>" in result
|
|
334
|
-
|
|
335
|
-
def test_compressed_persona_includes_voice(self, tmp_path: Path) -> None:
|
|
336
|
-
"""Test compressed persona includes voice element."""
|
|
337
|
-
from pennyfarthing_scripts.prime.persona import format_persona_compressed
|
|
338
|
-
from pennyfarthing_scripts.prime.models import Persona
|
|
339
|
-
|
|
340
|
-
persona = Persona(
|
|
341
|
-
character="Rosie the Riveter",
|
|
342
|
-
style="Can-do wartime spirit, practical, determined",
|
|
343
|
-
role="Implementation specialist",
|
|
344
|
-
)
|
|
345
|
-
|
|
346
|
-
result = format_persona_compressed(persona, "test-theme", "dev")
|
|
347
|
-
|
|
348
|
-
assert "<voice>" in result
|
|
349
|
-
assert "Can-do" in result
|
|
350
|
-
|
|
351
|
-
def test_compressed_persona_includes_style(self, tmp_path: Path) -> None:
|
|
352
|
-
"""Test compressed persona includes style element."""
|
|
353
|
-
from pennyfarthing_scripts.prime.persona import format_persona_compressed
|
|
354
|
-
from pennyfarthing_scripts.prime.models import Persona
|
|
355
|
-
|
|
356
|
-
persona = Persona(
|
|
357
|
-
character="Rosie the Riveter",
|
|
358
|
-
style="Direct, encouraging, efficiency-focused",
|
|
359
|
-
role="Implementation specialist",
|
|
360
|
-
)
|
|
361
|
-
|
|
362
|
-
result = format_persona_compressed(persona, "test-theme", "dev")
|
|
363
|
-
|
|
364
|
-
assert "<style>" in result
|
|
365
|
-
|
|
366
|
-
def test_compressed_persona_includes_catchphrase_if_present(self, tmp_path: Path) -> None:
|
|
367
|
-
"""Test compressed persona includes catchphrase from quote."""
|
|
368
|
-
from pennyfarthing_scripts.prime.persona import format_persona_compressed
|
|
369
|
-
from pennyfarthing_scripts.prime.models import Persona
|
|
370
|
-
|
|
371
|
-
persona = Persona(
|
|
372
|
-
character="Rosie the Riveter",
|
|
373
|
-
style="Practical",
|
|
374
|
-
role="Dev",
|
|
375
|
-
quote="We Can Do It!",
|
|
376
|
-
)
|
|
377
|
-
|
|
378
|
-
result = format_persona_compressed(persona, "test-theme", "dev")
|
|
379
|
-
|
|
380
|
-
assert "<catchphrase>" in result
|
|
381
|
-
assert "We Can Do It!" in result
|
|
382
|
-
|
|
383
|
-
def test_compressed_persona_token_count(self, tmp_path: Path) -> None:
|
|
384
|
-
"""Test compressed persona is approximately 100 tokens (~400 chars)."""
|
|
385
|
-
from pennyfarthing_scripts.prime.persona import format_persona_compressed
|
|
386
|
-
from pennyfarthing_scripts.prime.models import Persona
|
|
387
|
-
|
|
388
|
-
persona = Persona(
|
|
389
|
-
character="Rosie the Riveter",
|
|
390
|
-
style="Can-do wartime spirit, practical, determined",
|
|
391
|
-
role="Implementation specialist",
|
|
392
|
-
quote="We Can Do It!",
|
|
393
|
-
)
|
|
394
|
-
|
|
395
|
-
result = format_persona_compressed(persona, "test-theme", "dev")
|
|
396
|
-
|
|
397
|
-
# Rough token estimate: ~4 chars per token
|
|
398
|
-
# 100 tokens ≈ 400 chars
|
|
399
|
-
# Allow some variance (50-600 chars for ~100 tokens)
|
|
400
|
-
assert len(result) < 600, f"Compressed persona too long: {len(result)} chars"
|
|
401
|
-
assert len(result) > 50, f"Compressed persona too short: {len(result)} chars"
|
|
402
|
-
|
|
403
|
-
def test_full_persona_token_count(self, tmp_path: Path) -> None:
|
|
404
|
-
"""Test full persona is approximately 300 tokens (~1200 chars)."""
|
|
405
|
-
from pennyfarthing_scripts.prime.persona import format_persona_output
|
|
406
|
-
from pennyfarthing_scripts.prime.models import Persona, CrewMember
|
|
407
|
-
|
|
408
|
-
persona = Persona(
|
|
409
|
-
character="Rosie the Riveter",
|
|
410
|
-
style="Can-do wartime spirit, practical, determined",
|
|
411
|
-
role="Implementation specialist",
|
|
412
|
-
quote="We Can Do It!",
|
|
413
|
-
trait="Never gives up",
|
|
414
|
-
motto="Victory through effort",
|
|
415
|
-
)
|
|
416
|
-
crew = [
|
|
417
|
-
CrewMember(role="sm", character="Commander"),
|
|
418
|
-
CrewMember(role="dev", character="Rosie"),
|
|
419
|
-
]
|
|
420
|
-
|
|
421
|
-
result = format_persona_output(persona, "test-theme", "dev", crew, "Worker")
|
|
422
|
-
|
|
423
|
-
# Full persona should be larger than compressed
|
|
424
|
-
# ~300 tokens ≈ 1200 chars
|
|
425
|
-
assert len(result) > 400, f"Full persona too short: {len(result)} chars"
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
# =============================================================================
|
|
429
|
-
# AC4: Default Behavior (Backward Compatibility) Tests
|
|
430
|
-
# =============================================================================
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
class TestDefaultBehavior:
|
|
434
|
-
"""Tests for default behavior / backward compatibility (AC4)."""
|
|
435
|
-
|
|
436
|
-
def test_no_tier_argument_defaults_to_full(self, tmp_path: Path, capsys) -> None:
|
|
437
|
-
"""Test that omitting --tier defaults to FULL behavior."""
|
|
438
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
439
|
-
|
|
440
|
-
# Setup
|
|
441
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
442
|
-
pf_dir.mkdir()
|
|
443
|
-
agents_dir = pf_dir / "agents"
|
|
444
|
-
agents_dir.mkdir()
|
|
445
|
-
(agents_dir / "dev.md").write_text("# Dev Agent\n\nFull content here.")
|
|
446
|
-
|
|
447
|
-
guides_dir = pf_dir / "guides"
|
|
448
|
-
guides_dir.mkdir()
|
|
449
|
-
(guides_dir / "agent-behavior.md").write_text("# Behavior Guide")
|
|
450
|
-
|
|
451
|
-
sidecar_dir = pf_dir / "sidecars" / "dev"
|
|
452
|
-
sidecar_dir.mkdir(parents=True)
|
|
453
|
-
(sidecar_dir / "patterns.md").write_text("# Patterns")
|
|
454
|
-
|
|
455
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
456
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
457
|
-
# No --tier argument
|
|
458
|
-
result = prime(
|
|
459
|
-
agent_name="dev",
|
|
460
|
-
no_workflow=True,
|
|
461
|
-
no_register=True,
|
|
462
|
-
project_root=tmp_path,
|
|
463
|
-
)
|
|
464
|
-
|
|
465
|
-
assert result == 0
|
|
466
|
-
captured = capsys.readouterr()
|
|
467
|
-
|
|
468
|
-
# Should behave like FULL tier - include all components
|
|
469
|
-
assert "# Dev Agent" in captured.out
|
|
470
|
-
assert "# Behavior Guide" in captured.out
|
|
471
|
-
assert "patterns.md" in captured.out
|
|
472
|
-
|
|
473
|
-
def test_explicit_full_tier_matches_default(self, tmp_path: Path, capsys) -> None:
|
|
474
|
-
"""Test that --tier FULL produces same output as default."""
|
|
475
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
476
|
-
|
|
477
|
-
# Setup
|
|
478
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
479
|
-
pf_dir.mkdir()
|
|
480
|
-
agents_dir = pf_dir / "agents"
|
|
481
|
-
agents_dir.mkdir()
|
|
482
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
483
|
-
|
|
484
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
485
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
486
|
-
# Run without tier
|
|
487
|
-
result1 = prime(
|
|
488
|
-
agent_name="dev",
|
|
489
|
-
no_workflow=True,
|
|
490
|
-
no_register=True,
|
|
491
|
-
no_persona=True,
|
|
492
|
-
project_root=tmp_path,
|
|
493
|
-
)
|
|
494
|
-
output1 = capsys.readouterr().out
|
|
495
|
-
|
|
496
|
-
# Run with explicit FULL
|
|
497
|
-
result2 = prime(
|
|
498
|
-
agent_name="dev",
|
|
499
|
-
tier="FULL",
|
|
500
|
-
no_workflow=True,
|
|
501
|
-
no_register=True,
|
|
502
|
-
no_persona=True,
|
|
503
|
-
project_root=tmp_path,
|
|
504
|
-
)
|
|
505
|
-
output2 = capsys.readouterr().out
|
|
506
|
-
|
|
507
|
-
assert result1 == result2 == 0
|
|
508
|
-
assert output1 == output2
|
|
509
|
-
|
|
510
|
-
def test_existing_flags_still_work_with_tier(self, tmp_path: Path, capsys) -> None:
|
|
511
|
-
"""Test existing flags (--quiet, --json, etc.) work with --tier."""
|
|
512
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
513
|
-
import json
|
|
514
|
-
|
|
515
|
-
# Setup
|
|
516
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
517
|
-
pf_dir.mkdir()
|
|
518
|
-
agents_dir = pf_dir / "agents"
|
|
519
|
-
agents_dir.mkdir()
|
|
520
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
521
|
-
|
|
522
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
523
|
-
result = prime(
|
|
524
|
-
agent_name="dev",
|
|
525
|
-
tier="REFRESH",
|
|
526
|
-
json_output=True,
|
|
527
|
-
no_workflow=True,
|
|
528
|
-
no_register=True,
|
|
529
|
-
no_persona=True,
|
|
530
|
-
project_root=tmp_path,
|
|
531
|
-
)
|
|
532
|
-
|
|
533
|
-
assert result == 0
|
|
534
|
-
captured = capsys.readouterr()
|
|
535
|
-
|
|
536
|
-
# Should be valid JSON
|
|
537
|
-
data = json.loads(captured.out)
|
|
538
|
-
assert "tier" in data or "agent_name" in data
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
# =============================================================================
|
|
542
|
-
# AC5: Coverage Tests (All Tier Loading Paths)
|
|
543
|
-
# =============================================================================
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
class TestTierLoadingPaths:
|
|
547
|
-
"""Tests for all tier loading paths (AC5)."""
|
|
548
|
-
|
|
549
|
-
def test_full_tier_with_all_options(self, tmp_path: Path) -> None:
|
|
550
|
-
"""Test FULL tier with all context sources available."""
|
|
551
|
-
from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
|
|
552
|
-
|
|
553
|
-
# Setup complete project
|
|
554
|
-
self._setup_complete_project(tmp_path)
|
|
555
|
-
|
|
556
|
-
components = load_tier_components(
|
|
557
|
-
tier=ContextTier.FULL,
|
|
558
|
-
agent_name="dev",
|
|
559
|
-
project_root=tmp_path,
|
|
560
|
-
)
|
|
561
|
-
|
|
562
|
-
# Should return all component types
|
|
563
|
-
assert "workflow_state" in components
|
|
564
|
-
assert "agent_definition" in components
|
|
565
|
-
assert "persona" in components
|
|
566
|
-
assert "behavior_guide" in components
|
|
567
|
-
assert "sprint_context" in components
|
|
568
|
-
assert "sidecars" in components
|
|
569
|
-
|
|
570
|
-
def test_full_tier_with_missing_optional(self, tmp_path: Path) -> None:
|
|
571
|
-
"""Test FULL tier gracefully handles missing optional components."""
|
|
572
|
-
from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
|
|
573
|
-
|
|
574
|
-
# Minimal setup - only agent definition
|
|
575
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
576
|
-
pf_dir.mkdir()
|
|
577
|
-
agents_dir = pf_dir / "agents"
|
|
578
|
-
agents_dir.mkdir()
|
|
579
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
580
|
-
|
|
581
|
-
components = load_tier_components(
|
|
582
|
-
tier=ContextTier.FULL,
|
|
583
|
-
agent_name="dev",
|
|
584
|
-
project_root=tmp_path,
|
|
585
|
-
)
|
|
586
|
-
|
|
587
|
-
# Should have agent definition, gracefully handle missing others
|
|
588
|
-
assert components.get("agent_definition") is not None
|
|
589
|
-
# Missing components should be None or empty, not raise exceptions
|
|
590
|
-
|
|
591
|
-
def test_refresh_tier_components(self, tmp_path: Path) -> None:
|
|
592
|
-
"""Test REFRESH tier returns correct component set."""
|
|
593
|
-
from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
|
|
594
|
-
|
|
595
|
-
self._setup_complete_project(tmp_path)
|
|
596
|
-
|
|
597
|
-
components = load_tier_components(
|
|
598
|
-
tier=ContextTier.REFRESH,
|
|
599
|
-
agent_name="dev",
|
|
600
|
-
project_root=tmp_path,
|
|
601
|
-
)
|
|
602
|
-
|
|
603
|
-
# REFRESH should include
|
|
604
|
-
assert "workflow_state" in components
|
|
605
|
-
assert "sprint_context" in components
|
|
606
|
-
assert "session_header" in components
|
|
607
|
-
|
|
608
|
-
# REFRESH should NOT include
|
|
609
|
-
assert "agent_definition" not in components or components.get("agent_definition") is None
|
|
610
|
-
assert "behavior_guide" not in components or components.get("behavior_guide") is None
|
|
611
|
-
assert "sidecars" not in components or components.get("sidecars") is None
|
|
612
|
-
|
|
613
|
-
def test_handoff_tier_components(self, tmp_path: Path) -> None:
|
|
614
|
-
"""Test HANDOFF tier returns correct component set."""
|
|
615
|
-
from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
|
|
616
|
-
|
|
617
|
-
self._setup_complete_project(tmp_path)
|
|
618
|
-
|
|
619
|
-
components = load_tier_components(
|
|
620
|
-
tier=ContextTier.HANDOFF,
|
|
621
|
-
agent_name="dev",
|
|
622
|
-
project_root=tmp_path,
|
|
623
|
-
)
|
|
624
|
-
|
|
625
|
-
# HANDOFF should include
|
|
626
|
-
assert "workflow_state" in components
|
|
627
|
-
assert "agent_definition" in components
|
|
628
|
-
assert "persona_compressed" in components
|
|
629
|
-
|
|
630
|
-
# HANDOFF should NOT include
|
|
631
|
-
assert "behavior_guide" not in components or components.get("behavior_guide") is None
|
|
632
|
-
assert "sidecars" not in components or components.get("sidecars") is None
|
|
633
|
-
|
|
634
|
-
def test_minimal_tier_components(self, tmp_path: Path) -> None:
|
|
635
|
-
"""Test MINIMAL tier returns minimal component set."""
|
|
636
|
-
from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
|
|
637
|
-
|
|
638
|
-
self._setup_complete_project(tmp_path)
|
|
639
|
-
|
|
640
|
-
components = load_tier_components(
|
|
641
|
-
tier=ContextTier.MINIMAL,
|
|
642
|
-
agent_name="dev",
|
|
643
|
-
project_root=tmp_path,
|
|
644
|
-
)
|
|
645
|
-
|
|
646
|
-
# MINIMAL should include only workflow state
|
|
647
|
-
assert "workflow_state" in components
|
|
648
|
-
|
|
649
|
-
# MINIMAL should NOT include anything else
|
|
650
|
-
assert "agent_definition" not in components or components.get("agent_definition") is None
|
|
651
|
-
assert "persona" not in components or components.get("persona") is None
|
|
652
|
-
assert "behavior_guide" not in components or components.get("behavior_guide") is None
|
|
653
|
-
assert "sidecars" not in components or components.get("sidecars") is None
|
|
654
|
-
|
|
655
|
-
def test_tier_enum_values(self) -> None:
|
|
656
|
-
"""Test ContextTier enum has all required values."""
|
|
657
|
-
from pennyfarthing_scripts.prime.tiers import ContextTier
|
|
658
|
-
|
|
659
|
-
assert hasattr(ContextTier, "FULL")
|
|
660
|
-
assert hasattr(ContextTier, "REFRESH")
|
|
661
|
-
assert hasattr(ContextTier, "HANDOFF")
|
|
662
|
-
assert hasattr(ContextTier, "MINIMAL")
|
|
663
|
-
|
|
664
|
-
def test_tier_from_string(self) -> None:
|
|
665
|
-
"""Test converting string to ContextTier."""
|
|
666
|
-
from pennyfarthing_scripts.prime.tiers import ContextTier, tier_from_string
|
|
667
|
-
|
|
668
|
-
assert tier_from_string("FULL") == ContextTier.FULL
|
|
669
|
-
assert tier_from_string("REFRESH") == ContextTier.REFRESH
|
|
670
|
-
assert tier_from_string("HANDOFF") == ContextTier.HANDOFF
|
|
671
|
-
assert tier_from_string("MINIMAL") == ContextTier.MINIMAL
|
|
672
|
-
|
|
673
|
-
# Case insensitive
|
|
674
|
-
assert tier_from_string("full") == ContextTier.FULL
|
|
675
|
-
assert tier_from_string("Refresh") == ContextTier.REFRESH
|
|
676
|
-
|
|
677
|
-
def _setup_complete_project(self, tmp_path: Path) -> None:
|
|
678
|
-
"""Set up a complete project for component testing."""
|
|
679
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
680
|
-
pf_dir.mkdir()
|
|
681
|
-
|
|
682
|
-
# Agent
|
|
683
|
-
agents_dir = pf_dir / "agents"
|
|
684
|
-
agents_dir.mkdir()
|
|
685
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
686
|
-
|
|
687
|
-
# Guides
|
|
688
|
-
guides_dir = pf_dir / "guides"
|
|
689
|
-
guides_dir.mkdir()
|
|
690
|
-
(guides_dir / "agent-behavior.md").write_text("# Behavior")
|
|
691
|
-
|
|
692
|
-
# Sidecars
|
|
693
|
-
sidecar_dir = pf_dir / "sidecars" / "dev"
|
|
694
|
-
sidecar_dir.mkdir(parents=True)
|
|
695
|
-
(sidecar_dir / "patterns.md").write_text("# Patterns")
|
|
696
|
-
|
|
697
|
-
# Theme
|
|
698
|
-
(pf_dir / "config.local.yaml").write_text(yaml.dump({"theme": "test"}))
|
|
699
|
-
themes_dir = pf_dir / "personas" / "themes"
|
|
700
|
-
themes_dir.mkdir(parents=True)
|
|
701
|
-
(themes_dir / "test.yaml").write_text(yaml.dump({
|
|
702
|
-
"agents": {"dev": {"character": "Dev", "style": "s", "role": "r"}}
|
|
703
|
-
}))
|
|
704
|
-
|
|
705
|
-
# Sprint
|
|
706
|
-
sprint_dir = tmp_path / "sprint"
|
|
707
|
-
sprint_dir.mkdir()
|
|
708
|
-
(sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
|
|
709
|
-
"sprint": {"number": 12, "goal": "Test"},
|
|
710
|
-
"epics": []
|
|
711
|
-
}))
|
|
712
|
-
|
|
713
|
-
# Session
|
|
714
|
-
session_dir = tmp_path / ".session"
|
|
715
|
-
session_dir.mkdir()
|
|
716
|
-
(session_dir / "test-session.md").write_text("# Session\n\n- **Phase:** green")
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
# =============================================================================
|
|
720
|
-
# AC6: Token Reduction Verification Tests
|
|
721
|
-
# =============================================================================
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
class TestTokenReduction:
|
|
725
|
-
"""Tests for token reduction verification (AC6)."""
|
|
726
|
-
|
|
727
|
-
def test_refresh_tier_under_800_tokens(self, tmp_path: Path, capsys) -> None:
|
|
728
|
-
"""Test REFRESH tier output is under 800 tokens (~3200 chars)."""
|
|
729
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
730
|
-
|
|
731
|
-
# Setup with realistic content
|
|
732
|
-
self._setup_realistic_project(tmp_path)
|
|
733
|
-
|
|
734
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
735
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
736
|
-
result = prime(
|
|
737
|
-
agent_name="dev",
|
|
738
|
-
tier="REFRESH",
|
|
739
|
-
no_register=True,
|
|
740
|
-
project_root=tmp_path,
|
|
741
|
-
)
|
|
742
|
-
|
|
743
|
-
assert result == 0
|
|
744
|
-
captured = capsys.readouterr()
|
|
745
|
-
|
|
746
|
-
# ~600 tokens ≈ 2400 chars, allow up to 800 tokens ≈ 3200 chars
|
|
747
|
-
assert len(captured.out) < 3200, f"REFRESH tier too large: {len(captured.out)} chars (~{len(captured.out)//4} tokens)"
|
|
748
|
-
|
|
749
|
-
def test_handoff_tier_under_900_tokens(self, tmp_path: Path, capsys) -> None:
|
|
750
|
-
"""Test HANDOFF tier output is under 900 tokens (~3600 chars)."""
|
|
751
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
752
|
-
|
|
753
|
-
# Setup with realistic content
|
|
754
|
-
self._setup_realistic_project(tmp_path)
|
|
755
|
-
|
|
756
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
757
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
758
|
-
result = prime(
|
|
759
|
-
agent_name="dev",
|
|
760
|
-
tier="HANDOFF",
|
|
761
|
-
no_register=True,
|
|
762
|
-
project_root=tmp_path,
|
|
763
|
-
)
|
|
764
|
-
|
|
765
|
-
assert result == 0
|
|
766
|
-
captured = capsys.readouterr()
|
|
767
|
-
|
|
768
|
-
# ~700 tokens ≈ 2800 chars, allow up to 900 tokens ≈ 3600 chars
|
|
769
|
-
assert len(captured.out) < 3600, f"HANDOFF tier too large: {len(captured.out)} chars (~{len(captured.out)//4} tokens)"
|
|
770
|
-
|
|
771
|
-
def test_minimal_tier_under_300_tokens(self, tmp_path: Path, capsys) -> None:
|
|
772
|
-
"""Test MINIMAL tier output is under 300 tokens (~1200 chars)."""
|
|
773
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
774
|
-
|
|
775
|
-
# Setup with realistic content
|
|
776
|
-
self._setup_realistic_project(tmp_path)
|
|
777
|
-
|
|
778
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
779
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
780
|
-
result = prime(
|
|
781
|
-
agent_name="dev",
|
|
782
|
-
tier="MINIMAL",
|
|
783
|
-
no_register=True,
|
|
784
|
-
project_root=tmp_path,
|
|
785
|
-
)
|
|
786
|
-
|
|
787
|
-
assert result == 0
|
|
788
|
-
captured = capsys.readouterr()
|
|
789
|
-
|
|
790
|
-
# ~200 tokens ≈ 800 chars, allow up to 300 tokens ≈ 1200 chars
|
|
791
|
-
assert len(captured.out) < 1200, f"MINIMAL tier too large: {len(captured.out)} chars (~{len(captured.out)//4} tokens)"
|
|
792
|
-
|
|
793
|
-
def test_full_tier_approximately_4000_tokens(self, tmp_path: Path, capsys) -> None:
|
|
794
|
-
"""Test FULL tier output is approximately 4000 tokens (~16000 chars)."""
|
|
795
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
796
|
-
|
|
797
|
-
# Setup with realistic content
|
|
798
|
-
self._setup_realistic_project(tmp_path)
|
|
799
|
-
|
|
800
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
801
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
802
|
-
result = prime(
|
|
803
|
-
agent_name="dev",
|
|
804
|
-
tier="FULL",
|
|
805
|
-
no_register=True,
|
|
806
|
-
project_root=tmp_path,
|
|
807
|
-
)
|
|
808
|
-
|
|
809
|
-
assert result == 0
|
|
810
|
-
captured = capsys.readouterr()
|
|
811
|
-
|
|
812
|
-
# FULL should be significantly larger than other tiers
|
|
813
|
-
# At minimum, should be larger than HANDOFF limit
|
|
814
|
-
assert len(captured.out) > 3600, f"FULL tier too small: {len(captured.out)} chars"
|
|
815
|
-
|
|
816
|
-
def test_tier_reduction_ratio(self, tmp_path: Path, capsys) -> None:
|
|
817
|
-
"""Test that reduced tiers are significantly smaller than FULL."""
|
|
818
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
819
|
-
|
|
820
|
-
self._setup_realistic_project(tmp_path)
|
|
821
|
-
|
|
822
|
-
sizes = {}
|
|
823
|
-
for tier in ["FULL", "REFRESH", "HANDOFF", "MINIMAL"]:
|
|
824
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
825
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
826
|
-
prime(
|
|
827
|
-
agent_name="dev",
|
|
828
|
-
tier=tier,
|
|
829
|
-
no_register=True,
|
|
830
|
-
project_root=tmp_path,
|
|
831
|
-
)
|
|
832
|
-
sizes[tier] = len(capsys.readouterr().out)
|
|
833
|
-
|
|
834
|
-
# REFRESH should be <20% of FULL
|
|
835
|
-
assert sizes["REFRESH"] < sizes["FULL"] * 0.20, \
|
|
836
|
-
f"REFRESH not reduced enough: {sizes['REFRESH']}/{sizes['FULL']} = {sizes['REFRESH']/sizes['FULL']:.1%}"
|
|
837
|
-
|
|
838
|
-
# HANDOFF should be <25% of FULL
|
|
839
|
-
assert sizes["HANDOFF"] < sizes["FULL"] * 0.25, \
|
|
840
|
-
f"HANDOFF not reduced enough: {sizes['HANDOFF']}/{sizes['FULL']} = {sizes['HANDOFF']/sizes['FULL']:.1%}"
|
|
841
|
-
|
|
842
|
-
# MINIMAL should be <10% of FULL
|
|
843
|
-
assert sizes["MINIMAL"] < sizes["FULL"] * 0.10, \
|
|
844
|
-
f"MINIMAL not reduced enough: {sizes['MINIMAL']}/{sizes['FULL']} = {sizes['MINIMAL']/sizes['FULL']:.1%}"
|
|
845
|
-
|
|
846
|
-
def _setup_realistic_project(self, tmp_path: Path) -> None:
|
|
847
|
-
"""Set up a realistic project with typical content sizes."""
|
|
848
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
849
|
-
pf_dir.mkdir()
|
|
850
|
-
|
|
851
|
-
# Agent definition (~400 tokens = ~1600 chars)
|
|
852
|
-
agents_dir = pf_dir / "agents"
|
|
853
|
-
agents_dir.mkdir()
|
|
854
|
-
(agents_dir / "dev.md").write_text("""# Developer Agent
|
|
855
|
-
|
|
856
|
-
<role>
|
|
857
|
-
Feature implementation, bug fixes, code quality
|
|
858
|
-
</role>
|
|
859
|
-
|
|
860
|
-
<critical>
|
|
861
|
-
- Write tests before implementation
|
|
862
|
-
- Follow existing patterns
|
|
863
|
-
- Keep changes focused
|
|
864
|
-
</critical>
|
|
865
|
-
|
|
866
|
-
<workflow>
|
|
867
|
-
1. Read story context from session
|
|
868
|
-
2. Implement to make tests pass
|
|
869
|
-
3. Refactor if needed
|
|
870
|
-
4. Hand off to reviewer
|
|
871
|
-
</workflow>
|
|
872
|
-
|
|
873
|
-
<skills>
|
|
874
|
-
- `/testing` - Run tests
|
|
875
|
-
- `/dev-patterns` - Common patterns
|
|
876
|
-
</skills>
|
|
877
|
-
""" + ("Additional context. " * 50))
|
|
878
|
-
|
|
879
|
-
# Behavior guide (~800 tokens = ~3200 chars)
|
|
880
|
-
guides_dir = pf_dir / "guides"
|
|
881
|
-
guides_dir.mkdir()
|
|
882
|
-
(guides_dir / "agent-behavior.md").write_text("""# Agent Behavior Guide
|
|
883
|
-
|
|
884
|
-
<critical>
|
|
885
|
-
Session file is source of truth.
|
|
886
|
-
Never run tests directly.
|
|
887
|
-
Always emit handoff marker.
|
|
888
|
-
</critical>
|
|
889
|
-
|
|
890
|
-
## Workflow Reference
|
|
891
|
-
|
|
892
|
-
Standard: SM → TEA → Dev → Reviewer → SM
|
|
893
|
-
|
|
894
|
-
## Skills
|
|
895
|
-
|
|
896
|
-
- `/sprint` - Sprint management
|
|
897
|
-
- `/testing` - Test commands
|
|
898
|
-
- `/jira` - Jira operations
|
|
899
|
-
|
|
900
|
-
## Efficiency
|
|
901
|
-
|
|
902
|
-
- Parallelize independent operations
|
|
903
|
-
- Use subagents for specialized tasks
|
|
904
|
-
- Batch bash commands with &&
|
|
905
|
-
""" + ("Detailed behavior guidance. " * 80))
|
|
906
|
-
|
|
907
|
-
# Sidecars (~1200 tokens = ~4800 chars)
|
|
908
|
-
sidecar_dir = pf_dir / "sidecars" / "dev"
|
|
909
|
-
sidecar_dir.mkdir(parents=True)
|
|
910
|
-
(sidecar_dir / "patterns.md").write_text("""# Dev Patterns
|
|
911
|
-
|
|
912
|
-
## Common Patterns
|
|
913
|
-
|
|
914
|
-
### Error Handling
|
|
915
|
-
```typescript
|
|
916
|
-
try {
|
|
917
|
-
await operation();
|
|
918
|
-
} catch (error) {
|
|
919
|
-
logger.error('Operation failed', { error });
|
|
920
|
-
throw new OperationError(error);
|
|
921
|
-
}
|
|
922
|
-
```
|
|
923
|
-
|
|
924
|
-
### Testing
|
|
925
|
-
```typescript
|
|
926
|
-
describe('Component', () => {
|
|
927
|
-
it('should handle edge case', () => {
|
|
928
|
-
expect(fn(null)).toBeUndefined();
|
|
929
|
-
});
|
|
930
|
-
});
|
|
931
|
-
```
|
|
932
|
-
""" + ("Pattern documentation. " * 100))
|
|
933
|
-
|
|
934
|
-
(sidecar_dir / "gotchas.md").write_text("""# Dev Gotchas
|
|
935
|
-
|
|
936
|
-
1. Always read before write
|
|
937
|
-
2. Check symlinks before git add
|
|
938
|
-
3. Run tests before handoff
|
|
939
|
-
""" + ("Gotcha details. " * 50))
|
|
940
|
-
|
|
941
|
-
# Theme (~300 tokens = ~1200 chars for full persona)
|
|
942
|
-
(pf_dir / "config.local.yaml").write_text(yaml.dump({"theme": "test-theme"}))
|
|
943
|
-
themes_dir = pf_dir / "personas" / "themes"
|
|
944
|
-
themes_dir.mkdir(parents=True)
|
|
945
|
-
(themes_dir / "test-theme.yaml").write_text(yaml.dump({
|
|
946
|
-
"theme": {"name": "Test Theme", "user_title": "Developer"},
|
|
947
|
-
"agents": {
|
|
948
|
-
"dev": {
|
|
949
|
-
"character": "Rosie the Riveter",
|
|
950
|
-
"style": "Can-do wartime spirit, practical, determined, efficient, never gives up",
|
|
951
|
-
"role": "The implementation specialist who gets things done",
|
|
952
|
-
"quote": "We Can Do It!",
|
|
953
|
-
"trait": "Unwavering determination",
|
|
954
|
-
"motto": "Victory through effort and teamwork",
|
|
955
|
-
},
|
|
956
|
-
"sm": {"character": "Commander", "style": "s", "role": "r"},
|
|
957
|
-
}
|
|
958
|
-
}))
|
|
959
|
-
|
|
960
|
-
# Sprint (~150 tokens)
|
|
961
|
-
sprint_dir = tmp_path / "sprint"
|
|
962
|
-
sprint_dir.mkdir()
|
|
963
|
-
(sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
|
|
964
|
-
"sprint": {"number": 12, "goal": "Complete tier implementation"},
|
|
965
|
-
"epics": [{"id": "epic-1", "stories": [{"id": "1-1", "status": "in_progress"}]}]
|
|
966
|
-
}))
|
|
967
|
-
|
|
968
|
-
# Session (~200 tokens)
|
|
969
|
-
session_dir = tmp_path / ".session"
|
|
970
|
-
session_dir.mkdir()
|
|
971
|
-
(session_dir / "test-session.md").write_text("""# MSSCI-12797: Python Prime Tier Support
|
|
972
|
-
|
|
973
|
-
## Story Context
|
|
974
|
-
- **ID:** MSSCI-12797
|
|
975
|
-
- **Workflow:** tdd
|
|
976
|
-
|
|
977
|
-
## Workflow Phase
|
|
978
|
-
- **Phase:** green
|
|
979
|
-
- **Phase Owner:** dev
|
|
980
|
-
""")
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
# =============================================================================
|
|
984
|
-
# Integration Tests
|
|
985
|
-
# =============================================================================
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
class TestTierIntegration:
|
|
989
|
-
"""Integration tests for tier system."""
|
|
990
|
-
|
|
991
|
-
def test_json_output_includes_tier(self, tmp_path: Path, capsys) -> None:
|
|
992
|
-
"""Test JSON output includes current tier."""
|
|
993
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
994
|
-
import json
|
|
995
|
-
|
|
996
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
997
|
-
pf_dir.mkdir()
|
|
998
|
-
agents_dir = pf_dir / "agents"
|
|
999
|
-
agents_dir.mkdir()
|
|
1000
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
1001
|
-
|
|
1002
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
1003
|
-
result = prime(
|
|
1004
|
-
agent_name="dev",
|
|
1005
|
-
tier="REFRESH",
|
|
1006
|
-
json_output=True,
|
|
1007
|
-
no_workflow=True,
|
|
1008
|
-
no_register=True,
|
|
1009
|
-
no_persona=True,
|
|
1010
|
-
project_root=tmp_path,
|
|
1011
|
-
)
|
|
1012
|
-
|
|
1013
|
-
assert result == 0
|
|
1014
|
-
captured = capsys.readouterr()
|
|
1015
|
-
data = json.loads(captured.out)
|
|
1016
|
-
|
|
1017
|
-
assert data.get("tier") == "REFRESH"
|
|
1018
|
-
|
|
1019
|
-
def test_tier_with_workflow_detection(self, tmp_path: Path, capsys) -> None:
|
|
1020
|
-
"""Test tier works correctly with workflow detection enabled."""
|
|
1021
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
1022
|
-
|
|
1023
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
1024
|
-
pf_dir.mkdir()
|
|
1025
|
-
agents_dir = pf_dir / "agents"
|
|
1026
|
-
agents_dir.mkdir()
|
|
1027
|
-
(agents_dir / "dev.md").write_text("# Dev Agent")
|
|
1028
|
-
|
|
1029
|
-
sprint_dir = tmp_path / "sprint"
|
|
1030
|
-
sprint_dir.mkdir()
|
|
1031
|
-
(sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
|
|
1032
|
-
"sprint": {"number": 12},
|
|
1033
|
-
"epics": []
|
|
1034
|
-
}))
|
|
1035
|
-
|
|
1036
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
1037
|
-
with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
|
|
1038
|
-
result = prime(
|
|
1039
|
-
agent_name="dev",
|
|
1040
|
-
tier="MINIMAL",
|
|
1041
|
-
no_register=True,
|
|
1042
|
-
project_root=tmp_path,
|
|
1043
|
-
)
|
|
1044
|
-
|
|
1045
|
-
assert result == 0
|
|
1046
|
-
captured = capsys.readouterr()
|
|
1047
|
-
|
|
1048
|
-
# Should include workflow state even in MINIMAL
|
|
1049
|
-
assert "Workflow State" in captured.out or "state:" in captured.out
|
|
1050
|
-
|
|
1051
|
-
def test_tier_with_redirect_detection(self, tmp_path: Path, capsys) -> None:
|
|
1052
|
-
"""Test tier works correctly with redirect detection."""
|
|
1053
|
-
from pennyfarthing_scripts.prime.cli import prime
|
|
1054
|
-
|
|
1055
|
-
pf_dir = tmp_path / ".pennyfarthing"
|
|
1056
|
-
pf_dir.mkdir()
|
|
1057
|
-
agents_dir = pf_dir / "agents"
|
|
1058
|
-
agents_dir.mkdir()
|
|
1059
|
-
(agents_dir / "tea.md").write_text("# TEA Agent")
|
|
1060
|
-
|
|
1061
|
-
# Workflow pointing to dev phase
|
|
1062
|
-
workflows_dir = tmp_path / "pennyfarthing-dist" / "workflows"
|
|
1063
|
-
workflows_dir.mkdir(parents=True)
|
|
1064
|
-
(workflows_dir / "tdd.yaml").write_text(yaml.dump({
|
|
1065
|
-
"workflow": {
|
|
1066
|
-
"phases": [{"name": "green", "agent": "dev"}]
|
|
1067
|
-
}
|
|
1068
|
-
}))
|
|
1069
|
-
|
|
1070
|
-
session_dir = tmp_path / ".session"
|
|
1071
|
-
session_dir.mkdir()
|
|
1072
|
-
(session_dir / "test-session.md").write_text("""# Test
|
|
1073
|
-
- **Workflow:** tdd
|
|
1074
|
-
- **Current Phase:** green
|
|
1075
|
-
""")
|
|
1076
|
-
|
|
1077
|
-
with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
|
|
1078
|
-
result = prime(
|
|
1079
|
-
agent_name="tea",
|
|
1080
|
-
tier="HANDOFF",
|
|
1081
|
-
no_register=True,
|
|
1082
|
-
no_persona=True,
|
|
1083
|
-
project_root=tmp_path,
|
|
1084
|
-
)
|
|
1085
|
-
|
|
1086
|
-
assert result == 0
|
|
1087
|
-
captured = capsys.readouterr()
|
|
1088
|
-
|
|
1089
|
-
# Should still detect redirect even in reduced tier
|
|
1090
|
-
assert "REDIRECT" in captured.out or "dev" in captured.out
|