@pennyfarthing/core 10.0.5 → 10.1.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/README.md +9 -7
- package/package.json +15 -11
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +251 -4
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/commands/init.d.ts +7 -0
- package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/init.js +41 -8
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +26 -0
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/index.js +1 -1
- package/packages/core/dist/cli/index.js.map +1 -1
- package/packages/core/dist/cli/utils/python.d.ts +22 -0
- package/packages/core/dist/cli/utils/python.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/python.js +102 -0
- package/packages/core/dist/cli/utils/python.js.map +1 -0
- package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/settings.js +10 -0
- package/packages/core/dist/cli/utils/settings.js.map +1 -1
- package/pennyfarthing-dist/agents/README.md +1 -3
- package/pennyfarthing-dist/agents/architect.md +0 -6
- package/pennyfarthing-dist/agents/devops.md +0 -6
- package/pennyfarthing-dist/agents/orchestrator.md +0 -6
- package/pennyfarthing-dist/agents/pm.md +0 -6
- package/pennyfarthing-dist/agents/sm.md +0 -6
- package/pennyfarthing-dist/commands/architect.md +11 -3
- package/pennyfarthing-dist/commands/close-epic.md +24 -131
- package/pennyfarthing-dist/commands/create-theme.md +14 -24
- package/pennyfarthing-dist/commands/dev.md +11 -3
- package/pennyfarthing-dist/commands/devops.md +11 -3
- package/pennyfarthing-dist/commands/health-check.md +1 -3
- package/pennyfarthing-dist/commands/help.md +8 -12
- package/pennyfarthing-dist/commands/list-themes.md +14 -16
- package/pennyfarthing-dist/commands/orchestrator.md +11 -3
- package/pennyfarthing-dist/commands/parallel-work.md +1 -3
- package/pennyfarthing-dist/commands/pm.md +11 -3
- package/pennyfarthing-dist/commands/prime.md +6 -6
- package/pennyfarthing-dist/commands/reviewer.md +11 -3
- package/pennyfarthing-dist/commands/run-ci.md +1 -1
- package/pennyfarthing-dist/commands/set-theme.md +14 -51
- package/pennyfarthing-dist/commands/setup.md +1 -1
- package/pennyfarthing-dist/commands/show-theme.md +14 -16
- package/pennyfarthing-dist/commands/sm.md +11 -3
- package/pennyfarthing-dist/commands/tea.md +11 -3
- package/pennyfarthing-dist/commands/tech-writer.md +11 -3
- package/pennyfarthing-dist/commands/theme-maker.md +14 -671
- package/pennyfarthing-dist/commands/theme.md +95 -0
- package/pennyfarthing-dist/commands/ux-designer.md +11 -3
- package/pennyfarthing-dist/commands/work.md +3 -5
- package/pennyfarthing-dist/guides/agent-coordination.md +11 -13
- package/pennyfarthing-dist/guides/agent-template-tactical.md +2 -3
- package/pennyfarthing-dist/guides/command-tag-taxonomy.md +212 -0
- package/pennyfarthing-dist/guides/hooks.md +5 -5
- package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +3 -3
- package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +9 -59
- package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -5
- package/pennyfarthing-dist/guides/prime.md +2 -2
- package/pennyfarthing-dist/guides/skill-schema.md +4 -4
- package/pennyfarthing-dist/scripts/core/agent-session.sh +6 -2
- package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
- package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
- package/pennyfarthing-dist/scripts/core/prime.sh +8 -10
- package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
- package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
- package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
- package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +8 -6
- package/pennyfarthing-dist/scripts/git/release.sh +0 -0
- package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
- package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/post-merge.sh +12 -5
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +4 -3
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-push.sh +11 -5
- package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
- package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
- package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/README.md +1 -1
- package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
- package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
- package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +1 -2
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -0
- package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
- package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
- package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
- package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +0 -0
- package/pennyfarthing-dist/scripts/test/swebench-judge.py +0 -0
- package/pennyfarthing-dist/scripts/test/test-cache.sh +0 -0
- package/pennyfarthing-dist/scripts/test/test-setup.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +5 -5
- package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +3 -79
- package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/theme/README.md +1 -1
- package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +0 -0
- package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +0 -0
- package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
- package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +0 -0
- package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -1
- package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/finish-story.sh +62 -17
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
- package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +2 -2
- package/pennyfarthing-dist/skills/skill-registry.yaml +20 -16
- package/pennyfarthing-dist/skills/story/scripts/create-story.sh +0 -0
- package/pennyfarthing-dist/skills/story/scripts/size-story.sh +0 -0
- package/pennyfarthing-dist/skills/story/scripts/story-template.sh +0 -0
- package/pennyfarthing-dist/skills/theme/skill.md +290 -75
- package/pennyfarthing-dist/skills/theme-creation/SKILL.md +23 -166
- package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/skill.md +4 -4
- package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -11
- package/pennyfarthing-dist/templates/auto-load-sm.sh.template +14 -0
- package/pennyfarthing-dist/templates/settings.local.json.template +9 -0
- package/pennyfarthing-dist/workflows/2party-tdd.yaml +399 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +41 -24
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/cli.py +15 -0
- package/pennyfarthing_scripts/codemarkers/__init__.py +19 -0
- package/pennyfarthing_scripts/codemarkers/__main__.py +6 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/analyze.py +326 -0
- package/pennyfarthing_scripts/codemarkers/cli.py +129 -0
- package/pennyfarthing_scripts/codemarkers/formatters.py +89 -0
- package/pennyfarthing_scripts/codemarkers/models.py +45 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__init__.py +15 -0
- package/pennyfarthing_scripts/complexity/__main__.py +6 -0
- package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/analyze.py +207 -0
- package/pennyfarthing_scripts/complexity/cli.py +78 -0
- package/pennyfarthing_scripts/complexity/formatters.py +64 -0
- package/pennyfarthing_scripts/complexity/models.py +32 -0
- package/pennyfarthing_scripts/deadcode/__init__.py +6 -0
- package/pennyfarthing_scripts/deadcode/__main__.py +6 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/analyze.py +323 -0
- package/pennyfarthing_scripts/deadcode/cli.py +163 -0
- package/pennyfarthing_scripts/deadcode/formatters.py +106 -0
- package/pennyfarthing_scripts/deadcode/models.py +54 -0
- package/pennyfarthing_scripts/dependencies/__init__.py +20 -0
- package/pennyfarthing_scripts/dependencies/__main__.py +5 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/analyze.py +155 -0
- package/pennyfarthing_scripts/dependencies/cli.py +72 -0
- package/pennyfarthing_scripts/dependencies/formatters.py +63 -0
- package/pennyfarthing_scripts/dependencies/models.py +39 -0
- package/pennyfarthing_scripts/healthscore/__init__.py +21 -0
- package/pennyfarthing_scripts/healthscore/__main__.py +6 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/analyze.py +161 -0
- package/pennyfarthing_scripts/healthscore/cli.py +76 -0
- package/pennyfarthing_scripts/healthscore/formatters.py +46 -0
- package/pennyfarthing_scripts/healthscore/models.py +44 -0
- package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/analyze.py +27 -0
- package/pennyfarthing_scripts/hotspots/cli.py +10 -8
- package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/bidirectional.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__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/bidirectional.py +42 -15
- package/pennyfarthing_scripts/jira/cli.py +4 -1
- package/pennyfarthing_scripts/jira/client.py +28 -0
- package/pennyfarthing_scripts/prime/__pycache__/cli.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__/tiers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/workflow.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__/epic_add.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.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/__pycache__/yaml_io.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/archive_epic.py +198 -94
- package/pennyfarthing_scripts/sprint/cli.py +29 -19
- package/pennyfarthing_scripts/sprint/story_add.py +202 -27
- package/pennyfarthing_scripts/sprint/story_finish.py +211 -0
- package/pennyfarthing_scripts/sprint/work.py +27 -3
- package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.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_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/test_codemarkers.py +682 -0
- package/pennyfarthing_scripts/tests/test_healthscore.py +524 -0
- package/pennyfarthing_scripts/theme/__init__.py +5 -0
- package/pennyfarthing_scripts/theme/__main__.py +6 -0
- package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/theme/cli.py +286 -0
- package/scripts/README.md +53 -0
- package/pennyfarthing-dist/agents/workflow-status-check.md +0 -96
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Auto-load /sm agent on new session start
|
|
3
|
+
# Injects additionalContext telling Claude to invoke the SM agent
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
cat <<'EOF'
|
|
8
|
+
{
|
|
9
|
+
"hookSpecificOutput": {
|
|
10
|
+
"hookEventName": "SessionStart",
|
|
11
|
+
"additionalContext": "IMPORTANT: Auto-invoke the /sm agent immediately. Run the Skill tool with skill: \"sm\" as your first action. Do not greet the user or do anything else first."
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
EOF
|
|
@@ -51,6 +51,15 @@
|
|
|
51
51
|
"command": "\"$CLAUDE_PROJECT_DIR\"/.pennyfarthing/project/hooks/setup-env.sh"
|
|
52
52
|
}
|
|
53
53
|
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"matcher": "startup",
|
|
57
|
+
"hooks": [
|
|
58
|
+
{
|
|
59
|
+
"type": "command",
|
|
60
|
+
"command": "\"$CLAUDE_PROJECT_DIR\"/.pennyfarthing/project/hooks/auto-load-sm.sh"
|
|
61
|
+
}
|
|
62
|
+
]
|
|
54
63
|
}
|
|
55
64
|
],
|
|
56
65
|
"Stop": [
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
# 2-Party TDD Workflow - Story Refinement + Test-Driven Development
|
|
2
|
+
#
|
|
3
|
+
# Adds a story refinement gate before standard TDD. SM runs two focused
|
|
4
|
+
# brainstorm parties to surface gaps before TEA and Dev receive the story.
|
|
5
|
+
#
|
|
6
|
+
# Flow: SM → SM(party:dev) → SM(party:tea) → SM(quality) → TEA → Dev → QA → Reviewer → SM
|
|
7
|
+
#
|
|
8
|
+
# Review rejection loop:
|
|
9
|
+
# If Reviewer finds issues and tests passed → tests are incomplete.
|
|
10
|
+
# Reviewer writes findings to story → TEA writes failing tests → Dev fixes → QA verifies → Reviewer again.
|
|
11
|
+
# If Reviewer finds only lint/format issues → Dev fixes → QA verifies → Reviewer again.
|
|
12
|
+
# QA verification ensures Reviewer only sees verified-clean code.
|
|
13
|
+
#
|
|
14
|
+
# PR policy:
|
|
15
|
+
# Dev pushes the branch but does NOT create a PR.
|
|
16
|
+
# SM prepares PR content, user approves before submission.
|
|
17
|
+
# Default pr_mode: draft. User can set to "ready" in pennyfarthing config.
|
|
18
|
+
#
|
|
19
|
+
# Post-PR lifecycle:
|
|
20
|
+
# External reviews (AI bots, humans) are triaged via party-mode evaluation.
|
|
21
|
+
# Default stance: we do NOT adopt suggestions unless the team agrees.
|
|
22
|
+
# All reply comments are drafted locally and approved by user before posting.
|
|
23
|
+
# Communication with maintainers is irreversible — protect relationships.
|
|
24
|
+
# PR is monitored through merge/close, story status updated throughout.
|
|
25
|
+
#
|
|
26
|
+
# The "2 party" name refers to the two stakeholder perspectives consulted:
|
|
27
|
+
# Party 1: What does Dev need to succeed?
|
|
28
|
+
# Party 2: What does TEA need to succeed?
|
|
29
|
+
|
|
30
|
+
workflow:
|
|
31
|
+
name: 2party-tdd
|
|
32
|
+
description: Story refinement via two stakeholder parties, then TDD
|
|
33
|
+
version: "2.0.0"
|
|
34
|
+
|
|
35
|
+
phases:
|
|
36
|
+
- name: setup
|
|
37
|
+
agent: sm
|
|
38
|
+
output: [session_file, branches, story_context]
|
|
39
|
+
|
|
40
|
+
- name: refine-dev
|
|
41
|
+
agent: sm
|
|
42
|
+
input: [session_file, story_context]
|
|
43
|
+
output: [dev_gaps, refined_story]
|
|
44
|
+
instructions: |
|
|
45
|
+
Run a party-mode brainstorm with the prompt:
|
|
46
|
+
|
|
47
|
+
"What is missing from this story for Dev to be successful?"
|
|
48
|
+
|
|
49
|
+
Perspectives to include: Dev, Architect, Reviewer.
|
|
50
|
+
Focus areas: implementation clarity, acceptance criteria gaps,
|
|
51
|
+
ambiguous requirements, missing technical context, dependency risks.
|
|
52
|
+
|
|
53
|
+
Present findings to user. User decides what to add/change.
|
|
54
|
+
Update the story description with agreed refinements.
|
|
55
|
+
gate:
|
|
56
|
+
type: approval
|
|
57
|
+
condition: User reviewed dev-perspective gaps and decided on each item
|
|
58
|
+
|
|
59
|
+
- name: refine-tea
|
|
60
|
+
agent: sm
|
|
61
|
+
input: [session_file, refined_story]
|
|
62
|
+
output: [tea_gaps, refined_story]
|
|
63
|
+
instructions: |
|
|
64
|
+
Run a party-mode brainstorm with the prompt:
|
|
65
|
+
|
|
66
|
+
"What is missing from this story for TEA to be successful?"
|
|
67
|
+
|
|
68
|
+
Perspectives to include: TEA, Dev, Reviewer.
|
|
69
|
+
Focus areas: testability, acceptance criteria specificity,
|
|
70
|
+
edge cases, test data needs, integration test boundaries,
|
|
71
|
+
what "done" looks like in test terms.
|
|
72
|
+
|
|
73
|
+
Present findings to user. User decides what to add/change.
|
|
74
|
+
Update the story description with agreed refinements.
|
|
75
|
+
gate:
|
|
76
|
+
type: approval
|
|
77
|
+
condition: User reviewed tea-perspective gaps and decided on each item
|
|
78
|
+
|
|
79
|
+
- name: quality-pass
|
|
80
|
+
agent: sm
|
|
81
|
+
input: [refined_story, dev_gaps, tea_gaps]
|
|
82
|
+
output: [final_story]
|
|
83
|
+
instructions: |
|
|
84
|
+
Final quality check on the refined story before handoff to TEA.
|
|
85
|
+
|
|
86
|
+
Verify:
|
|
87
|
+
- Acceptance criteria are specific and testable
|
|
88
|
+
- No ambiguous language remains ("should", "maybe", "as needed")
|
|
89
|
+
- Implementation approach is clear enough for Dev
|
|
90
|
+
- Test strategy is clear enough for TEA
|
|
91
|
+
- Dependencies and blockers are documented
|
|
92
|
+
- Story scope hasn't crept beyond original intent
|
|
93
|
+
|
|
94
|
+
Fix any remaining issues, then hand off to TEA.
|
|
95
|
+
gate:
|
|
96
|
+
type: approval
|
|
97
|
+
condition: Story passes quality check and is ready for TEA
|
|
98
|
+
|
|
99
|
+
- name: red
|
|
100
|
+
agent: tea
|
|
101
|
+
input: [final_story, session_file]
|
|
102
|
+
output: [failing_tests]
|
|
103
|
+
instructions: |
|
|
104
|
+
Write failing tests for all acceptance criteria.
|
|
105
|
+
|
|
106
|
+
In addition to functional tests, include a quality gate check
|
|
107
|
+
that verifies new files pass the project's lint and format rules.
|
|
108
|
+
This catches code generation issues (wrong API usage, style
|
|
109
|
+
violations) at the test level rather than leaving them for review.
|
|
110
|
+
|
|
111
|
+
Examples by ecosystem:
|
|
112
|
+
- Node: spawn eslint and prettier --check on new files
|
|
113
|
+
- Go: spawn go vet and golangci-lint on new packages
|
|
114
|
+
- Python: spawn ruff check and ruff format --check
|
|
115
|
+
- Rust: spawn cargo clippy and cargo fmt --check
|
|
116
|
+
- Generic: check if the project has a top-level quality command
|
|
117
|
+
and spawn it (npm test, make lint, just check, etc.)
|
|
118
|
+
|
|
119
|
+
Include this as the last test function, e.g. testCodeQuality().
|
|
120
|
+
This ensures Dev can't commit GREEN without passing all gates.
|
|
121
|
+
|
|
122
|
+
In the TEA Assessment handoff, list what quality gates Dev
|
|
123
|
+
should expect to pass beyond the functional tests.
|
|
124
|
+
gate:
|
|
125
|
+
type: tests_fail
|
|
126
|
+
condition: All acceptance criteria have test coverage, including quality gate check
|
|
127
|
+
|
|
128
|
+
- name: green
|
|
129
|
+
agent: dev
|
|
130
|
+
input: [failing_tests, final_story]
|
|
131
|
+
output: [implementation, passing_tests]
|
|
132
|
+
instructions: |
|
|
133
|
+
Make tests GREEN. Implement minimal code to pass all failing tests.
|
|
134
|
+
Commit implementation. Push branch.
|
|
135
|
+
Hand off to QA/TEA for verification before review.
|
|
136
|
+
|
|
137
|
+
DO NOT create a PR — that happens in finish phase.
|
|
138
|
+
|
|
139
|
+
# QA verifies GREEN before Reviewer sees it
|
|
140
|
+
- name: verify
|
|
141
|
+
agent: tea
|
|
142
|
+
input: [implementation, passing_tests]
|
|
143
|
+
output: [verification_report]
|
|
144
|
+
instructions: |
|
|
145
|
+
QA verification of Dev's GREEN implementation.
|
|
146
|
+
|
|
147
|
+
Run the project's full quality gate — not just the new tests,
|
|
148
|
+
but everything CI would check: lint, format, type checks,
|
|
149
|
+
schema validation, and any other project-defined checks.
|
|
150
|
+
Use `/check` or `/run-ci` to discover and run all gates.
|
|
151
|
+
|
|
152
|
+
If verification fails, hand back to Dev with specifics.
|
|
153
|
+
If verification passes, hand off to Reviewer.
|
|
154
|
+
|
|
155
|
+
Reviewer should only receive code that is verified clean.
|
|
156
|
+
gate:
|
|
157
|
+
type: quality_pass
|
|
158
|
+
condition: >
|
|
159
|
+
All project quality gates pass locally — tests, lint, format,
|
|
160
|
+
type checks, and any CI-equivalent checks. Dev's implementation
|
|
161
|
+
is verified clean before Reviewer spends time on it.
|
|
162
|
+
|
|
163
|
+
- name: review
|
|
164
|
+
agent: reviewer
|
|
165
|
+
input: [verification_report, implementation, passing_tests]
|
|
166
|
+
output: [review_findings]
|
|
167
|
+
instructions: |
|
|
168
|
+
Adversarial code review. Write ALL findings to the story in
|
|
169
|
+
sprint/current-sprint.yaml under review_findings field.
|
|
170
|
+
|
|
171
|
+
On REJECT:
|
|
172
|
+
- Write findings with severity to story (review_findings field)
|
|
173
|
+
- Set review_verdict: rejected in story
|
|
174
|
+
- If findings are testable (logic bugs, missing edge cases):
|
|
175
|
+
Set workflow_phase to review-fix-tea → TEA writes failing tests first
|
|
176
|
+
- If findings are lint/format/dead-code only:
|
|
177
|
+
Set workflow_phase to review-fix-dev → Dev fixes directly
|
|
178
|
+
- DO NOT merge or create PRs
|
|
179
|
+
|
|
180
|
+
On APPROVE:
|
|
181
|
+
- Set review_verdict: approved in story
|
|
182
|
+
- DO NOT merge the PR — hand off to SM for finish phase
|
|
183
|
+
gate:
|
|
184
|
+
type: approval
|
|
185
|
+
condition: Code review passed, no blocking issues
|
|
186
|
+
|
|
187
|
+
# Review rejection loops — TEA writes tests for what Reviewer caught
|
|
188
|
+
- name: review-fix-tea
|
|
189
|
+
agent: tea
|
|
190
|
+
input: [review_findings, failing_tests]
|
|
191
|
+
output: [additional_failing_tests]
|
|
192
|
+
instructions: |
|
|
193
|
+
Reviewer found issues that tests missed. Read review_findings
|
|
194
|
+
from the story. Write failing tests for each testable finding.
|
|
195
|
+
Commit RED tests. Hand off to Dev.
|
|
196
|
+
gate:
|
|
197
|
+
type: tests_fail
|
|
198
|
+
condition: New tests cover reviewer findings
|
|
199
|
+
|
|
200
|
+
# Review rejection loop — Dev fixes all issues
|
|
201
|
+
- name: review-fix-dev
|
|
202
|
+
agent: dev
|
|
203
|
+
input: [review_findings, implementation]
|
|
204
|
+
output: [fixed_implementation]
|
|
205
|
+
instructions: |
|
|
206
|
+
Read review_findings from the story. Fix ALL findings:
|
|
207
|
+
- HIGH: Must fix (lint, format, dead code, logic)
|
|
208
|
+
- MEDIUM: Should fix
|
|
209
|
+
- LOW: Fix if trivial
|
|
210
|
+
|
|
211
|
+
Commit fixes. Push branch. Hand off to QA/TEA for verification.
|
|
212
|
+
Do NOT self-certify — someone else verifies your fix.
|
|
213
|
+
|
|
214
|
+
# QA verifies Dev's fixes before sending back to Reviewer
|
|
215
|
+
- name: review-fix-verify
|
|
216
|
+
agent: tea
|
|
217
|
+
input: [fixed_implementation, review_findings]
|
|
218
|
+
output: [verification_report]
|
|
219
|
+
instructions: |
|
|
220
|
+
QA verification step. Dev claims the fixes are done — verify it.
|
|
221
|
+
|
|
222
|
+
Run the project's full quality gate:
|
|
223
|
+
- Use `/check` or `/run-ci` to discover and run all gates
|
|
224
|
+
- Tests, lint, format, type checks, schema validation
|
|
225
|
+
- Confirm each review finding is actually addressed
|
|
226
|
+
|
|
227
|
+
If verification fails, hand back to Dev with specifics.
|
|
228
|
+
If verification passes, hand off to Reviewer for re-review.
|
|
229
|
+
gate:
|
|
230
|
+
type: quality_pass
|
|
231
|
+
condition: >
|
|
232
|
+
All project quality gates pass. Each review finding verified
|
|
233
|
+
as addressed. Code is clean enough for Reviewer's time.
|
|
234
|
+
next: review
|
|
235
|
+
|
|
236
|
+
# --- Post-implementation: PR lifecycle ---
|
|
237
|
+
|
|
238
|
+
- name: pr-prepare
|
|
239
|
+
agent: sm
|
|
240
|
+
input: [approval]
|
|
241
|
+
output: [pr_draft]
|
|
242
|
+
instructions: |
|
|
243
|
+
Prepare the PR for submission. This is our "one shot" with
|
|
244
|
+
the upstream maintainer — get it right before anyone sees it.
|
|
245
|
+
|
|
246
|
+
Steps:
|
|
247
|
+
1. Draft PR title and description locally (do not post yet)
|
|
248
|
+
2. Review the diff for:
|
|
249
|
+
- Unsigned commits
|
|
250
|
+
- Extra files that shouldn't be included
|
|
251
|
+
- Sensitive data leaks (.env, credentials, local paths)
|
|
252
|
+
- Missing sections in the PR description
|
|
253
|
+
3. Run CI-equivalent checks locally one final time
|
|
254
|
+
4. Present PR description and diff summary to user for approval
|
|
255
|
+
5. Only after user approves: create PR (draft by default,
|
|
256
|
+
or per user pr_mode preference in pennyfarthing config)
|
|
257
|
+
gate:
|
|
258
|
+
type: approval
|
|
259
|
+
condition: User has reviewed and approved PR content before submission
|
|
260
|
+
|
|
261
|
+
# External review triage — AI reviewers and humans will comment
|
|
262
|
+
- name: pr-review-triage
|
|
263
|
+
agent: sm
|
|
264
|
+
input: [pr_draft]
|
|
265
|
+
output: [external_review_analysis]
|
|
266
|
+
instructions: |
|
|
267
|
+
Monitor the PR for external reviews (AI bots like CodeRabbit,
|
|
268
|
+
human reviewers, maintainer feedback). When reviews arrive:
|
|
269
|
+
|
|
270
|
+
CRITICAL PRINCIPLES:
|
|
271
|
+
- External reviewers lack our context: ADRs, story intent,
|
|
272
|
+
architectural decisions, and why we chose this approach.
|
|
273
|
+
- Default stance: we do NOT adopt a suggestion unless the
|
|
274
|
+
team agrees it fits. Silence is not consent — we must
|
|
275
|
+
actively agree to adopt each suggestion.
|
|
276
|
+
- Communication between humans cannot be undone. Damage to
|
|
277
|
+
relationships with maintainers is permanent. Every reply
|
|
278
|
+
is drafted locally and approved by the user before posting.
|
|
279
|
+
|
|
280
|
+
For each review comment or suggestion:
|
|
281
|
+
1. Categorize: bug fix, style preference, architectural
|
|
282
|
+
concern, nitpick, misunderstanding, valid improvement
|
|
283
|
+
2. Gather context the reviewer is missing (ADRs, story
|
|
284
|
+
decisions, prior art in the codebase)
|
|
285
|
+
3. Present to user with initial assessment
|
|
286
|
+
|
|
287
|
+
When comments are gathered, hand off to pr-review-party
|
|
288
|
+
for structured evaluation.
|
|
289
|
+
|
|
290
|
+
- name: pr-review-party
|
|
291
|
+
agent: sm
|
|
292
|
+
input: [external_review_analysis]
|
|
293
|
+
output: [review_decisions]
|
|
294
|
+
instructions: |
|
|
295
|
+
Run a party-mode evaluation of external review comments.
|
|
296
|
+
|
|
297
|
+
Prompt (tune as needed):
|
|
298
|
+
"Evaluate each external review suggestion against:
|
|
299
|
+
1. The intent and scope of this PR
|
|
300
|
+
2. Fit with project architecture and ADRs
|
|
301
|
+
3. Viability — does the proposed fix actually work?
|
|
302
|
+
4. Negative impact — could this fix break something else?
|
|
303
|
+
5. Precedent — does this conflict with established patterns?
|
|
304
|
+
6. Effort vs value — is this worth doing now?"
|
|
305
|
+
|
|
306
|
+
Perspectives: Dev, Architect, Reviewer, PM.
|
|
307
|
+
|
|
308
|
+
For each suggestion, produce one of:
|
|
309
|
+
- ADOPT: Team agrees. Will fix, test, and reply with thanks.
|
|
310
|
+
- DECLINE: Doesn't fit. Draft a respectful reply explaining
|
|
311
|
+
why, with context the reviewer was missing.
|
|
312
|
+
- DEFER: Valid but out of scope. Draft reply acknowledging
|
|
313
|
+
the point and noting it for a future PR/issue.
|
|
314
|
+
- CLARIFY: Need more info from the reviewer. Draft a question.
|
|
315
|
+
|
|
316
|
+
Present decisions to user. User has final say on every item.
|
|
317
|
+
gate:
|
|
318
|
+
type: approval
|
|
319
|
+
condition: User has decided on every external review comment
|
|
320
|
+
|
|
321
|
+
- name: pr-review-respond
|
|
322
|
+
agent: dev
|
|
323
|
+
input: [review_decisions]
|
|
324
|
+
output: [fixes, draft_replies]
|
|
325
|
+
instructions: |
|
|
326
|
+
For each ADOPT decision:
|
|
327
|
+
1. Implement the fix
|
|
328
|
+
2. Write or update tests if needed
|
|
329
|
+
3. Run full quality gate
|
|
330
|
+
4. Draft a reply comment (e.g., "Good catch, fixed in abc123")
|
|
331
|
+
|
|
332
|
+
For each DECLINE/DEFER/CLARIFY decision:
|
|
333
|
+
1. Draft a reply comment explaining the team's position
|
|
334
|
+
2. Include context the reviewer was missing
|
|
335
|
+
3. Be respectful — this is a relationship, not a debate
|
|
336
|
+
|
|
337
|
+
CRITICAL: Do NOT post any comments. All replies are drafted
|
|
338
|
+
locally and presented to the user for approval. The user may
|
|
339
|
+
edit wording, tone, or content before any reply is posted.
|
|
340
|
+
|
|
341
|
+
Commit fixes. Push branch. Present all draft replies to user.
|
|
342
|
+
gate:
|
|
343
|
+
type: approval
|
|
344
|
+
condition: >
|
|
345
|
+
User has approved every draft reply. Fixes pass quality
|
|
346
|
+
gates. No reply is posted without explicit user approval.
|
|
347
|
+
|
|
348
|
+
- name: pr-replies-post
|
|
349
|
+
agent: sm
|
|
350
|
+
input: [draft_replies]
|
|
351
|
+
output: [posted_replies]
|
|
352
|
+
instructions: |
|
|
353
|
+
Post user-approved replies to the PR. For each reply:
|
|
354
|
+
1. Confirm user approval one final time
|
|
355
|
+
2. Post the comment via gh CLI
|
|
356
|
+
3. Log the posted reply for audit
|
|
357
|
+
|
|
358
|
+
After all replies posted, return to pr-review-triage to
|
|
359
|
+
monitor for follow-up comments. This loop continues until
|
|
360
|
+
the PR is merged, closed, or the user decides to stop.
|
|
361
|
+
next: pr-monitor
|
|
362
|
+
|
|
363
|
+
- name: pr-monitor
|
|
364
|
+
agent: sm
|
|
365
|
+
input: [posted_replies]
|
|
366
|
+
output: [pr_status]
|
|
367
|
+
instructions: |
|
|
368
|
+
Monitor the PR status. Check for:
|
|
369
|
+
- New review comments → back to pr-review-triage
|
|
370
|
+
- CI failures → hand to Dev for fixes
|
|
371
|
+
- Approval from maintainer → update story status
|
|
372
|
+
- Merge → move to pr-complete
|
|
373
|
+
- Close (rejected) → move to pr-complete with rejected status
|
|
374
|
+
|
|
375
|
+
Update the story workflow_phase as status changes.
|
|
376
|
+
If new comments arrive, loop back to pr-review-triage.
|
|
377
|
+
next_on:
|
|
378
|
+
new_comments: pr-review-triage
|
|
379
|
+
ci_failure: review-fix-dev
|
|
380
|
+
merged: pr-complete
|
|
381
|
+
closed: pr-complete
|
|
382
|
+
|
|
383
|
+
- name: pr-complete
|
|
384
|
+
agent: sm
|
|
385
|
+
input: [pr_status]
|
|
386
|
+
output: [archived_session, story_summary]
|
|
387
|
+
instructions: |
|
|
388
|
+
PR is merged or closed. Finalize the story:
|
|
389
|
+
1. Update story status (done if merged, blocked/cancelled if closed)
|
|
390
|
+
2. Update Jira ticket
|
|
391
|
+
3. Archive session file
|
|
392
|
+
4. Clean up branches if merged
|
|
393
|
+
5. Write story summary for sprint record
|
|
394
|
+
|
|
395
|
+
triggers:
|
|
396
|
+
types: [feature, enhancement]
|
|
397
|
+
tags: [2party, refinement, complex]
|
|
398
|
+
points:
|
|
399
|
+
min: 3
|
|
@@ -10,9 +10,6 @@ thisStepFile: './step-05-import-to-future.md'
|
|
|
10
10
|
workflowFile: '{workflow_path}/workflow.yaml'
|
|
11
11
|
outputFile: '{planning_artifacts}/epics.md'
|
|
12
12
|
futureYaml: '{project_root}/sprint/future.yaml'
|
|
13
|
-
|
|
14
|
-
# Script References
|
|
15
|
-
importScript: '{project_root}/.pennyfarthing/scripts/sprint/import-epic-to-future.sh'
|
|
16
13
|
---
|
|
17
14
|
|
|
18
15
|
<purpose>
|
|
@@ -21,12 +18,13 @@ To import the validated and complete epics and stories from the epics.md documen
|
|
|
21
18
|
|
|
22
19
|
<instructions>
|
|
23
20
|
1. Determine the initiative name from the epics document (prompt user if not obvious)
|
|
24
|
-
2.
|
|
25
|
-
3.
|
|
26
|
-
4.
|
|
27
|
-
5.
|
|
28
|
-
6.
|
|
29
|
-
7.
|
|
21
|
+
2. Read current future.yaml to find the next epic number (highest epic-N + 1)
|
|
22
|
+
3. Read the validated epics.md output and construct the YAML structure
|
|
23
|
+
4. Display a preview to the user showing epic numbers, initiative structure, and story IDs
|
|
24
|
+
5. Get user confirmation that the preview looks correct
|
|
25
|
+
6. If confirmed, append the new initiative and epics to future.yaml using yq
|
|
26
|
+
7. Verify the import by checking that epic appears in future.yaml with correct numbering
|
|
27
|
+
8. Display completion message with epic number, initiative name, and story count
|
|
30
28
|
</instructions>
|
|
31
29
|
|
|
32
30
|
<output>
|
|
@@ -72,34 +70,53 @@ Look at the epics document title and ask user:
|
|
|
72
70
|
|
|
73
71
|
Wait for user confirmation or alternative name.
|
|
74
72
|
|
|
75
|
-
### 2.
|
|
73
|
+
### 2. Determine Next Epic Number
|
|
76
74
|
|
|
77
|
-
|
|
75
|
+
Read `sprint/future.yaml` and find the highest `epic-N` ID currently in use:
|
|
78
76
|
|
|
79
77
|
```bash
|
|
80
|
-
.
|
|
78
|
+
yq '.future.initiatives[].epics[].id' sprint/future.yaml | grep -oE 'epic-[0-9]+' | sed 's/epic-//' | sort -n | tail -1
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The next epic gets `epic-{N+1}`. Stories use `{N+1}-{story_number}` format.
|
|
82
|
+
|
|
83
|
+
### 3. Construct and Preview
|
|
84
|
+
|
|
85
|
+
Read the validated epics.md output file. For each epic, construct the YAML structure:
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
- id: epic-{N}
|
|
89
|
+
title: "Epic: {epic_title}"
|
|
90
|
+
points: {total_points}
|
|
91
|
+
priority: {priority}
|
|
92
|
+
repos: {repo}
|
|
93
|
+
stories:
|
|
94
|
+
- id: "{N}-1"
|
|
95
|
+
title: "{story_title}"
|
|
96
|
+
points: {points}
|
|
97
|
+
type: {type}
|
|
98
|
+
status: backlog
|
|
99
|
+
workflow: {workflow}
|
|
100
|
+
priority: {priority}
|
|
101
|
+
repos: {repo}
|
|
81
102
|
```
|
|
82
103
|
|
|
83
|
-
Display the preview
|
|
104
|
+
Display the full preview to the user showing:
|
|
84
105
|
- Next epic number that will be assigned
|
|
85
106
|
- Initiative structure
|
|
86
107
|
- All stories with IDs
|
|
87
108
|
|
|
88
|
-
###
|
|
109
|
+
### 4. Confirm and Apply
|
|
89
110
|
|
|
90
111
|
Ask user: "Does this look correct? [Y] Yes, import to future.yaml / [N] No, make changes"
|
|
91
112
|
|
|
92
113
|
**If Y:**
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
```bash
|
|
96
|
-
.pennyfarthing/scripts/sprint/import-epic-to-future.sh {outputFile} "{initiative_name}"
|
|
97
|
-
```
|
|
114
|
+
Append the new initiative and epics to `sprint/future.yaml` using yq or direct YAML editing.
|
|
98
115
|
|
|
99
116
|
**If N:**
|
|
100
|
-
Ask what changes are needed and help user adjust before re-
|
|
117
|
+
Ask what changes are needed and help user adjust before re-applying.
|
|
101
118
|
|
|
102
|
-
###
|
|
119
|
+
### 5. Verify Import
|
|
103
120
|
|
|
104
121
|
After successful import, verify by showing:
|
|
105
122
|
|
|
@@ -112,7 +129,7 @@ Confirm:
|
|
|
112
129
|
- Epic number is correct
|
|
113
130
|
- Stories have proper IDs
|
|
114
131
|
|
|
115
|
-
###
|
|
132
|
+
### 6. Complete Workflow
|
|
116
133
|
|
|
117
134
|
Display completion message:
|
|
118
135
|
|
|
@@ -138,8 +155,8 @@ Next steps:
|
|
|
138
155
|
|
|
139
156
|
## FAILURE MODES:
|
|
140
157
|
|
|
141
|
-
- ❌ Import script not found - check .pennyfarthing symlinks
|
|
142
158
|
- ❌ future.yaml not found - ensure sprint/ directory exists
|
|
143
|
-
- ❌ Duplicate epic number -
|
|
159
|
+
- ❌ Duplicate epic number - check existing IDs before assigning
|
|
160
|
+
- ❌ yq not installed - required for YAML manipulation (`brew install yq`)
|
|
144
161
|
|
|
145
162
|
**Master Rule:** The workflow is not complete until epics are in future.yaml and accessible via sprint commands.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -45,6 +45,21 @@ from pennyfarthing_scripts.jira.cli import jira
|
|
|
45
45
|
|
|
46
46
|
cli.add_command(jira)
|
|
47
47
|
|
|
48
|
+
# Import and register deadcode group
|
|
49
|
+
from pennyfarthing_scripts.deadcode.cli import deadcode
|
|
50
|
+
|
|
51
|
+
cli.add_command(deadcode)
|
|
52
|
+
|
|
53
|
+
# Import and register theme group
|
|
54
|
+
from pennyfarthing_scripts.theme.cli import theme
|
|
55
|
+
|
|
56
|
+
cli.add_command(theme)
|
|
57
|
+
|
|
58
|
+
# Import and register healthscore group
|
|
59
|
+
from pennyfarthing_scripts.healthscore.cli import healthscore
|
|
60
|
+
|
|
61
|
+
cli.add_command(healthscore)
|
|
62
|
+
|
|
48
63
|
|
|
49
64
|
@cli.group()
|
|
50
65
|
def agent():
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Code marker analysis — TODO, FIXME, HACK, XXX detection with git blame.
|
|
3
|
+
|
|
4
|
+
Story 80-1: Python codemarkers module.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pennyfarthing_scripts.codemarkers.models import (
|
|
8
|
+
CodeMarker,
|
|
9
|
+
CodeMarkersResult,
|
|
10
|
+
MarkerSummary,
|
|
11
|
+
)
|
|
12
|
+
from pennyfarthing_scripts.codemarkers.analyze import analyze_repo
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"CodeMarker",
|
|
16
|
+
"CodeMarkersResult",
|
|
17
|
+
"MarkerSummary",
|
|
18
|
+
"analyze_repo",
|
|
19
|
+
]
|