@pennyfarthing/core 11.0.0-alpha.0 → 11.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 +84 -26
- package/package.json +14 -16
- package/packages/core/dist/cli/cyclist-migration.test.js +2 -1
- package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -1
- package/packages/core/dist/cli/ocean-profiles.test.js +5 -4
- package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -1
- package/packages/core/dist/cli/theme-maker.test.js +5 -4
- package/packages/core/dist/cli/theme-maker.test.js.map +1 -1
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts +20 -0
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js +278 -0
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js.map +1 -0
- package/packages/core/dist/cli/utils/constants.d.ts +7 -1
- package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/constants.js +2 -0
- package/packages/core/dist/cli/utils/constants.js.map +1 -1
- package/packages/core/dist/cli/utils/constants.test.d.ts +10 -0
- package/packages/core/dist/cli/utils/constants.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/constants.test.js +38 -0
- package/packages/core/dist/cli/utils/constants.test.js.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.d.ts +139 -0
- package/packages/core/dist/consultation/consultation-protocol.d.ts.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.js +178 -0
- package/packages/core/dist/consultation/consultation-protocol.js.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.test.d.ts +20 -0
- package/packages/core/dist/consultation/consultation-protocol.test.d.ts.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.test.js +474 -0
- package/packages/core/dist/consultation/consultation-protocol.test.js.map +1 -0
- package/packages/core/dist/public/js/react/react.js +30 -30
- package/packages/core/dist/scripts/generate-report.test.js +2 -2
- package/packages/core/dist/scripts/generate-spider-report.test.js +2 -2
- package/packages/core/dist/scripts/generate-spider.test.js +2 -1
- package/packages/core/dist/scripts/generate-spider.test.js.map +1 -1
- package/packages/core/dist/server/api/file-browser.d.ts.map +1 -1
- package/packages/core/dist/server/api/file-browser.js +19 -1
- package/packages/core/dist/server/api/file-browser.js.map +1 -1
- package/packages/core/dist/server/api/git-fetch-cooldown.test.d.ts +10 -0
- package/packages/core/dist/server/api/git-fetch-cooldown.test.d.ts.map +1 -0
- package/packages/core/dist/server/api/git-fetch-cooldown.test.js +30 -0
- package/packages/core/dist/server/api/git-fetch-cooldown.test.js.map +1 -0
- package/packages/core/dist/server/api/git.d.ts +8 -0
- package/packages/core/dist/server/api/git.d.ts.map +1 -1
- package/packages/core/dist/server/api/git.js +37 -10
- package/packages/core/dist/server/api/git.js.map +1 -1
- package/packages/core/dist/server/api/health-score.d.ts.map +1 -1
- package/packages/core/dist/server/api/health-score.js +25 -1
- package/packages/core/dist/server/api/health-score.js.map +1 -1
- package/packages/core/dist/server/api/index.d.ts +1 -1
- package/packages/core/dist/server/api/index.d.ts.map +1 -1
- package/packages/core/dist/server/api/index.js +1 -1
- package/packages/core/dist/server/api/index.js.map +1 -1
- package/packages/core/dist/server/api/settings.d.ts.map +1 -1
- package/packages/core/dist/server/api/settings.js +73 -2
- package/packages/core/dist/server/api/settings.js.map +1 -1
- package/packages/core/dist/server/api/theme-agents.d.ts.map +1 -1
- package/packages/core/dist/server/api/theme-agents.js +61 -0
- package/packages/core/dist/server/api/theme-agents.js.map +1 -1
- package/packages/core/dist/server/otlp-receiver.d.ts +35 -13
- package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
- package/packages/core/dist/server/otlp-receiver.js +76 -16
- package/packages/core/dist/server/otlp-receiver.js.map +1 -1
- package/packages/core/dist/server/paths.d.ts.map +1 -1
- package/packages/core/dist/server/paths.js +11 -1
- package/packages/core/dist/server/paths.js.map +1 -1
- package/packages/core/dist/server/server.d.ts +3 -1
- package/packages/core/dist/server/server.d.ts.map +1 -1
- package/packages/core/dist/server/server.js +23 -16
- package/packages/core/dist/server/server.js.map +1 -1
- package/packages/core/dist/server/server.test.js.map +1 -1
- package/packages/core/dist/workflow/gate-file-validation.d.ts +49 -0
- package/packages/core/dist/workflow/gate-file-validation.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-file-validation.js +157 -0
- package/packages/core/dist/workflow/gate-file-validation.js.map +1 -0
- package/packages/core/dist/workflow/gate-file-validation.test.d.ts +19 -0
- package/packages/core/dist/workflow/gate-file-validation.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-file-validation.test.js +536 -0
- package/packages/core/dist/workflow/gate-file-validation.test.js.map +1 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.d.ts +14 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.js +339 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.js.map +1 -0
- package/packages/core/dist/workflow/handoff.js +2 -2
- package/packages/core/dist/workflow/handoff.js.map +1 -1
- package/packages/core/dist/workflow/handoff.test.js +16 -0
- package/packages/core/dist/workflow/handoff.test.js.map +1 -1
- package/packages/core/dist/workflow/variable-resolver.test.js +1 -1
- package/packages/core/dist/workflow/variable-resolver.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-migration.test.js +4 -3
- package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.d.ts +4 -2
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.js +43 -8
- package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
- package/pennyfarthing-dist/agents/README.md +6 -14
- package/pennyfarthing-dist/agents/architect.md +43 -30
- package/pennyfarthing-dist/agents/ba.md +30 -29
- package/pennyfarthing-dist/agents/dev.md +76 -41
- package/pennyfarthing-dist/agents/devops.md +57 -21
- package/pennyfarthing-dist/agents/orchestrator.md +3 -11
- package/pennyfarthing-dist/agents/pm.md +45 -31
- package/pennyfarthing-dist/agents/reviewer.md +20 -66
- package/pennyfarthing-dist/agents/sm-setup.md +2 -2
- package/pennyfarthing-dist/agents/sm.md +8 -30
- package/pennyfarthing-dist/agents/tea.md +25 -41
- package/pennyfarthing-dist/agents/tech-writer.md +33 -90
- package/pennyfarthing-dist/agents/ux-designer.md +39 -40
- package/pennyfarthing-dist/commands/benchmark-control.md +8 -64
- package/pennyfarthing-dist/commands/benchmark.md +8 -480
- package/pennyfarthing-dist/commands/job-fair.md +8 -97
- package/pennyfarthing-dist/commands/pf-benchmark-control.md +70 -0
- package/pennyfarthing-dist/commands/pf-benchmark.md +486 -0
- package/pennyfarthing-dist/commands/pf-chore.md +4 -4
- package/pennyfarthing-dist/commands/pf-ci.md +40 -0
- package/pennyfarthing-dist/commands/pf-close-epic.md +9 -27
- package/pennyfarthing-dist/commands/pf-continue-session.md +9 -213
- package/pennyfarthing-dist/commands/pf-create-branches-from-story.md +11 -353
- package/pennyfarthing-dist/commands/pf-docs.md +28 -0
- package/pennyfarthing-dist/commands/pf-epic.md +67 -0
- package/pennyfarthing-dist/commands/pf-git-cleanup.md +11 -52
- package/pennyfarthing-dist/commands/pf-git.md +75 -0
- package/pennyfarthing-dist/commands/pf-help.md +110 -128
- package/pennyfarthing-dist/commands/pf-job-fair.md +102 -0
- package/pennyfarthing-dist/commands/pf-new-work.md +9 -18
- package/pennyfarthing-dist/commands/pf-parallel-work.md +6 -66
- package/pennyfarthing-dist/commands/pf-release.md +11 -76
- package/pennyfarthing-dist/commands/pf-repo-status.md +11 -44
- package/pennyfarthing-dist/commands/pf-run-ci.md +8 -111
- package/pennyfarthing-dist/commands/pf-session.md +51 -0
- package/pennyfarthing-dist/commands/pf-solo.md +447 -0
- package/pennyfarthing-dist/commands/pf-sprint-planning.md +8 -104
- package/pennyfarthing-dist/commands/pf-standalone.md +1 -1
- package/pennyfarthing-dist/commands/pf-start-epic.md +9 -163
- package/pennyfarthing-dist/commands/pf-sync-epic-to-jira.md +8 -179
- package/pennyfarthing-dist/commands/pf-sync-work-with-sprint.md +8 -368
- package/pennyfarthing-dist/commands/pf-update-domain-docs.md +8 -78
- package/pennyfarthing-dist/commands/solo.md +8 -442
- package/pennyfarthing-dist/guides/agent-behavior.md +14 -14
- package/pennyfarthing-dist/guides/agent-coordination.md +7 -7
- package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
- package/pennyfarthing-dist/guides/bikerack.md +128 -0
- package/pennyfarthing-dist/guides/brownfield-tools.md +133 -0
- package/pennyfarthing-dist/guides/command-tag-taxonomy.md +2 -2
- package/pennyfarthing-dist/guides/gate-schema.md +227 -0
- package/pennyfarthing-dist/guides/gates.md +120 -0
- package/pennyfarthing-dist/guides/handoff-cli.md +116 -0
- package/pennyfarthing-dist/guides/hooks.md +86 -4
- package/pennyfarthing-dist/guides/output-styles.md +65 -0
- package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +5 -5
- package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -4
- package/pennyfarthing-dist/guides/prompt-patterns.md +5 -5
- package/pennyfarthing-dist/guides/reflector.md +4 -4
- package/pennyfarthing-dist/guides/session-artifacts.md +1 -1
- package/pennyfarthing-dist/guides/skill-schema.md +1 -1
- package/pennyfarthing-dist/guides/tandem-protocol.md +13 -1
- package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
- package/pennyfarthing-dist/guides/xml-tags.md +5 -4
- package/pennyfarthing-dist/personas/themes/hogans-heroes.yaml +11 -22
- package/pennyfarthing-dist/personas/themes/stephen-king.yaml +13 -24
- package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -0
- package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +1 -1
- package/pennyfarthing-dist/scripts/core/prime.sh +0 -0
- 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 +0 -0
- 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/dispatcher-template.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +19 -14
- package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
- 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/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 +0 -0
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +191 -57
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +26 -10
- 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/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 +0 -0
- 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 +0 -0
- 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/list-themes.sh +0 -0
- package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -0
- 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 +0 -0
- 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/pf-changelog/SKILL.md +4 -4
- package/pennyfarthing-dist/skills/pf-sprint/skill.md +1 -1
- package/pennyfarthing-dist/skills/pf-story/scripts/create-story.sh +0 -0
- package/pennyfarthing-dist/skills/pf-story/scripts/size-story.sh +0 -0
- package/pennyfarthing-dist/skills/pf-story/scripts/story-template.sh +0 -0
- package/pennyfarthing-dist/skills/pf-systematic-debugging/SKILL.md +0 -1
- package/pennyfarthing-dist/skills/pf-workflow/scripts/list-workflows.sh +0 -0
- package/pennyfarthing-dist/skills/pf-workflow/scripts/resume-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/pf-workflow/scripts/show-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/pf-workflow/scripts/start-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/pf-workflow/scripts/workflow-status.sh +0 -0
- package/pennyfarthing-dist/skills/skill-registry.schema.json +4 -0
- package/pennyfarthing-dist/skills/skill-registry.yaml +8 -21
- package/pennyfarthing-dist/workflows/2party-tdd.yaml +11 -0
- package/pennyfarthing-dist/workflows/agent-docs.yaml +2 -0
- package/pennyfarthing-dist/workflows/bdd-tandem.yaml +4 -0
- package/pennyfarthing-dist/workflows/bdd.yaml +4 -0
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
- package/pennyfarthing-dist/workflows/tdd-tandem.yaml +3 -0
- package/pennyfarthing-dist/workflows/tdd.yaml +3 -0
- package/pennyfarthing-dist/workflows/trivial.yaml +2 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/changed_panel.py +105 -0
- package/pennyfarthing_scripts/bikerack/debug_panel.py +218 -0
- package/pennyfarthing_scripts/bikerack/diffs_panel.py +203 -27
- package/pennyfarthing_scripts/cli.py +114 -0
- package/pennyfarthing_scripts/epic/__init__.py +0 -0
- package/pennyfarthing_scripts/epic/cli.py +64 -0
- package/pennyfarthing_scripts/gate/__init__.py +1 -0
- package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/cli.py +56 -0
- package/pennyfarthing_scripts/gate/validate.py +266 -0
- package/pennyfarthing_scripts/git_group/__init__.py +0 -0
- package/pennyfarthing_scripts/git_group/cli.py +100 -0
- package/pennyfarthing_scripts/handoff/__init__.py +1 -0
- package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/cli.py +120 -0
- package/pennyfarthing_scripts/handoff/complete_phase.py +155 -0
- package/pennyfarthing_scripts/handoff/gate_file.py +105 -0
- package/pennyfarthing_scripts/handoff/gate_runner.py +152 -0
- package/pennyfarthing_scripts/handoff/marker.py +109 -0
- package/pennyfarthing_scripts/handoff/resolve_gate.py +152 -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/hooks/cyclist-pretooluse-hook.sh +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/workflow.py +39 -0
- package/pennyfarthing_scripts/session/__init__.py +0 -0
- package/pennyfarthing_scripts/session/cli.py +87 -0
- package/pennyfarthing_scripts/session_start_hook.py +4 -4
- 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__/epic_update.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__/yaml_io.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/archive_epic.py +8 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.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_108_1_gate_migration.py +540 -0
- package/pennyfarthing_scripts/tests/test_108_2_remove_handoff_fallback.py +339 -0
- package/pennyfarthing_scripts/tests/test_archive_epic.py +1 -2
- package/pennyfarthing_scripts/tests/test_confidence_sm_evaluation.py +253 -0
- package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +315 -0
- package/pennyfarthing_scripts/tests/test_gate_file_resolution.py +341 -0
- package/pennyfarthing_scripts/tests/test_gate_runner.py +620 -0
- package/pennyfarthing_scripts/tests/test_handoff_cli.py +929 -0
- package/pennyfarthing_scripts/tests/test_handoff_e2e.py +454 -0
- package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +464 -0
- package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/skill_command.py +200 -0
- package/pennyfarthing_scripts/validate/adapters/workflow.py +64 -0
- package/pennyfarthing_scripts/validate/cli.py +15 -4
- package/packages/core/dist/benchmark/package-exports.test.d.ts.map +0 -1
- package/packages/core/dist/benchmark/package-exports.test.js.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.d.ts +0 -182
- package/packages/core/dist/scripts/benchmark-integration.d.ts.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.js +0 -691
- package/packages/core/dist/scripts/benchmark-integration.js.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.test.d.ts +0 -13
- package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.test.js +0 -680
- package/packages/core/dist/scripts/benchmark-integration.test.js.map +0 -1
- package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +0 -18
- package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/debugging-scenarios.test.js +0 -317
- package/packages/core/dist/scripts/debugging-scenarios.test.js.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts +0 -150
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.js +0 -547
- package/packages/core/dist/scripts/job-fair-aggregator.js.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts +0 -14
- package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.test.js +0 -616
- package/packages/core/dist/scripts/job-fair-aggregator.test.js.map +0 -1
- package/pennyfarthing-dist/agents/handoff.md +0 -250
- package/pennyfarthing-dist/agents/sm-handoff.md +0 -152
- package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -112
- package/pennyfarthing-dist/skills/pf-dev-patterns/SKILL.md +0 -461
- package/scripts/README.md +0 -41
|
@@ -1,461 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: dev-patterns
|
|
3
|
-
description: Common development patterns, fixes, and gotchas. Use when implementing features, debugging issues, or avoiding known pitfalls.
|
|
4
|
-
allowed_tools: [Read, Glob, Grep, Task]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
<run>
|
|
8
|
-
Reference this skill when implementing features, debugging issues, or avoiding known pitfalls in development. Use these patterns to guide:
|
|
9
|
-
- Working directory management in bash commands
|
|
10
|
-
- TypeScript type system decisions
|
|
11
|
-
- Error handling in Go
|
|
12
|
-
- Test structure and isolation
|
|
13
|
-
- HTTP status code selection
|
|
14
|
-
- Turn-efficient coding practices
|
|
15
|
-
- Background task execution
|
|
16
|
-
|
|
17
|
-
The patterns capture common gotchas and solutions across multiple languages and frameworks.
|
|
18
|
-
</run>
|
|
19
|
-
|
|
20
|
-
<output>
|
|
21
|
-
Following these patterns produces:
|
|
22
|
-
- Reliable bash commands that work regardless of current directory
|
|
23
|
-
- TypeScript builds that pass verbatimModuleSyntax validation
|
|
24
|
-
- Go code with proper error handling and validation
|
|
25
|
-
- Well-isolated, maintainable test suites
|
|
26
|
-
- Consistent HTTP API behavior
|
|
27
|
-
- Faster task completion through turn-efficient techniques
|
|
28
|
-
- Properly tracked background operations
|
|
29
|
-
</output>
|
|
30
|
-
|
|
31
|
-
# Dev Patterns Skill
|
|
32
|
-
|
|
33
|
-
## Overview
|
|
34
|
-
|
|
35
|
-
This skill captures common development patterns, fixes, and gotchas that apply across projects using the pennyfarthing agent framework.
|
|
36
|
-
|
|
37
|
-
## Critical Patterns
|
|
38
|
-
|
|
39
|
-
### Bash Tool Working Directory
|
|
40
|
-
|
|
41
|
-
**Problem:** The Bash tool maintains a persistent working directory. Relative `cd` commands fail when already in a different directory.
|
|
42
|
-
|
|
43
|
-
**Symptoms:**
|
|
44
|
-
- `cd API && just test` fails with "no such file or directory"
|
|
45
|
-
- Commands fail because assuming wrong directory
|
|
46
|
-
|
|
47
|
-
**Solution:** Always use absolute paths with `$CLAUDE_PROJECT_DIR`:
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
# WRONG - relative cd fails if you're already somewhere else
|
|
51
|
-
cd API && just test
|
|
52
|
-
|
|
53
|
-
# CORRECT - absolute path always works
|
|
54
|
-
cd $CLAUDE_PROJECT_DIR/API && just test
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
**Best Practice:** Explicit `cd` with absolute path in every Bash call:
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
# Single-repo: from anywhere - always works
|
|
61
|
-
cd $CLAUDE_PROJECT_DIR && git push -u origin feat/branch
|
|
62
|
-
cd $CLAUDE_PROJECT_DIR && just test
|
|
63
|
-
|
|
64
|
-
# Multi-repo: use repo-utils.sh for dynamic lookup
|
|
65
|
-
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
66
|
-
cd $CLAUDE_PROJECT_DIR/$(get_repo_path "myrepo") && just test
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### TypeScript Type Imports
|
|
70
|
-
|
|
71
|
-
**Problem:** Build fails with `verbatimModuleSyntax` errors.
|
|
72
|
-
|
|
73
|
-
**Solution:** Use `import type` for type-only imports:
|
|
74
|
-
|
|
75
|
-
```typescript
|
|
76
|
-
// WRONG - causes build errors
|
|
77
|
-
import { User, Ticket } from '@/types';
|
|
78
|
-
|
|
79
|
-
// CORRECT
|
|
80
|
-
import type { User, Ticket } from '@/types';
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Go Error Handling
|
|
84
|
-
|
|
85
|
-
**Problem:** Silent failures when errors aren't checked.
|
|
86
|
-
|
|
87
|
-
**Solution:** Always handle errors explicitly:
|
|
88
|
-
|
|
89
|
-
```go
|
|
90
|
-
// WRONG - ignores error
|
|
91
|
-
result, _ := doSomething()
|
|
92
|
-
|
|
93
|
-
// CORRECT
|
|
94
|
-
result, err := doSomething()
|
|
95
|
-
if err != nil {
|
|
96
|
-
return fmt.Errorf("doSomething failed: %w", err)
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### UUID Parsing
|
|
101
|
-
|
|
102
|
-
**Problem:** Invalid UUIDs cause panics or unexpected behavior.
|
|
103
|
-
|
|
104
|
-
**Solution:** Always validate UUID parsing:
|
|
105
|
-
|
|
106
|
-
```go
|
|
107
|
-
// WRONG - panics on invalid UUID
|
|
108
|
-
id := uuid.MustParse(rawID)
|
|
109
|
-
|
|
110
|
-
// CORRECT
|
|
111
|
-
id, err := uuid.Parse(rawID)
|
|
112
|
-
if err != nil {
|
|
113
|
-
return fmt.Errorf("invalid UUID: %w", err)
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## HTTP Status Codes
|
|
118
|
-
|
|
119
|
-
Use appropriate status codes consistently:
|
|
120
|
-
|
|
121
|
-
| Code | When to Use |
|
|
122
|
-
|------|-------------|
|
|
123
|
-
| `200 OK` | Successful GET, PUT, PATCH |
|
|
124
|
-
| `201 Created` | Successful POST creating new resource |
|
|
125
|
-
| `204 No Content` | Successful DELETE |
|
|
126
|
-
| `400 Bad Request` | Invalid input (validation errors) |
|
|
127
|
-
| `401 Unauthorized` | Missing or invalid authentication |
|
|
128
|
-
| `403 Forbidden` | Authenticated but not authorized |
|
|
129
|
-
| `404 Not Found` | Resource doesn't exist |
|
|
130
|
-
| `409 Conflict` | Resource state conflict (duplicate) |
|
|
131
|
-
| `500 Internal Server Error` | Server-side error (always log it!) |
|
|
132
|
-
|
|
133
|
-
<details>
|
|
134
|
-
<summary><strong>Test Patterns</strong></summary>
|
|
135
|
-
|
|
136
|
-
### Test Isolation
|
|
137
|
-
|
|
138
|
-
Each test should:
|
|
139
|
-
1. Set up its own state
|
|
140
|
-
2. Clean up after itself
|
|
141
|
-
3. Not depend on other tests' state
|
|
142
|
-
|
|
143
|
-
```go
|
|
144
|
-
func TestCreate(t *testing.T) {
|
|
145
|
-
// Setup
|
|
146
|
-
db := testutil.NewTestDB(t)
|
|
147
|
-
defer db.Cleanup()
|
|
148
|
-
|
|
149
|
-
// Test
|
|
150
|
-
result, err := Create(db, input)
|
|
151
|
-
|
|
152
|
-
// Assert
|
|
153
|
-
require.NoError(t, err)
|
|
154
|
-
assert.Equal(t, expected, result)
|
|
155
|
-
}
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### Table-Driven Tests
|
|
159
|
-
|
|
160
|
-
```go
|
|
161
|
-
func TestValidate(t *testing.T) {
|
|
162
|
-
tests := []struct {
|
|
163
|
-
name string
|
|
164
|
-
input string
|
|
165
|
-
wantErr bool
|
|
166
|
-
}{
|
|
167
|
-
{"valid input", "good", false},
|
|
168
|
-
{"empty input", "", true},
|
|
169
|
-
{"too long", strings.Repeat("x", 1000), true},
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
for _, tt := range tests {
|
|
173
|
-
t.Run(tt.name, func(t *testing.T) {
|
|
174
|
-
err := Validate(tt.input)
|
|
175
|
-
if tt.wantErr {
|
|
176
|
-
assert.Error(t, err)
|
|
177
|
-
} else {
|
|
178
|
-
assert.NoError(t, err)
|
|
179
|
-
}
|
|
180
|
-
})
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
</details>
|
|
186
|
-
|
|
187
|
-
## Common Gotchas
|
|
188
|
-
|
|
189
|
-
1. **Working directory** - Always use `$CLAUDE_PROJECT_DIR` for absolute paths
|
|
190
|
-
2. **Type imports** - Use `import type` for TypeScript types
|
|
191
|
-
3. **Error handling** - Never ignore errors in Go
|
|
192
|
-
4. **UUID parsing** - Always validate, never panic
|
|
193
|
-
5. **Test isolation** - Each test manages its own state
|
|
194
|
-
|
|
195
|
-
## Turn-Efficient Patterns
|
|
196
|
-
|
|
197
|
-
Minimize API round-trips by batching operations and parallelizing where possible. Each tool call is a "turn" - fewer turns means faster completion.
|
|
198
|
-
|
|
199
|
-
### Batch Bash Commands
|
|
200
|
-
|
|
201
|
-
Chain related commands with `&&` instead of separate calls:
|
|
202
|
-
|
|
203
|
-
```bash
|
|
204
|
-
# INEFFICIENT - 3 turns
|
|
205
|
-
git status
|
|
206
|
-
git branch --show-current
|
|
207
|
-
git log -1 --oneline
|
|
208
|
-
|
|
209
|
-
# EFFICIENT - 1 turn
|
|
210
|
-
git status && git branch --show-current && git log -1 --oneline
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
For git workflows, batch the entire operation:
|
|
214
|
-
|
|
215
|
-
```bash
|
|
216
|
-
# INEFFICIENT - 3 turns
|
|
217
|
-
git add .
|
|
218
|
-
git commit -m "feat: add feature"
|
|
219
|
-
git push -u origin $(git branch --show-current)
|
|
220
|
-
|
|
221
|
-
# EFFICIENT - 1 turn
|
|
222
|
-
git add . && git commit -m "feat: add feature" && git push -u origin $(git branch --show-current)
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
### Parallel Tool Calls
|
|
226
|
-
|
|
227
|
-
When operations are independent, invoke multiple tools in the same turn:
|
|
228
|
-
|
|
229
|
-
```
|
|
230
|
-
# INEFFICIENT - 3 sequential turns
|
|
231
|
-
Turn 1: Read file A
|
|
232
|
-
Turn 2: Read file B
|
|
233
|
-
Turn 3: Read file C
|
|
234
|
-
|
|
235
|
-
# EFFICIENT - 1 parallel turn
|
|
236
|
-
Turn 1: Read file A, Read file B, Read file C (parallel)
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
**When to parallelize:**
|
|
240
|
-
- Reading multiple independent files
|
|
241
|
-
- Spawning subagents that don't depend on each other's results
|
|
242
|
-
- Running Glob and Grep searches simultaneously
|
|
243
|
-
- Fetching multiple web resources
|
|
244
|
-
|
|
245
|
-
**When NOT to parallelize:**
|
|
246
|
-
- Operations where later calls depend on earlier results
|
|
247
|
-
- Writes that might conflict
|
|
248
|
-
- Sequential logic (must read before edit)
|
|
249
|
-
|
|
250
|
-
### Smart File Operations
|
|
251
|
-
|
|
252
|
-
Use Grep's internal file reading instead of Read + manual search:
|
|
253
|
-
|
|
254
|
-
```bash
|
|
255
|
-
# INEFFICIENT - 2 turns
|
|
256
|
-
Turn 1: Read entire file
|
|
257
|
-
Turn 2: (mentally search for pattern)
|
|
258
|
-
|
|
259
|
-
# EFFICIENT - 1 turn with context
|
|
260
|
-
Grep pattern with -C 5 for context
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
Use Glob with brace expansion for multiple patterns:
|
|
264
|
-
|
|
265
|
-
```bash
|
|
266
|
-
# INEFFICIENT - 2 turns
|
|
267
|
-
Glob: **/*.ts
|
|
268
|
-
Glob: **/*.tsx
|
|
269
|
-
|
|
270
|
-
# EFFICIENT - 1 turn
|
|
271
|
-
Glob: **/*.{ts,tsx}
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
<details>
|
|
275
|
-
<summary><strong>Compound Subagents</strong></summary>
|
|
276
|
-
|
|
277
|
-
Design subagents to do multiple related steps in one spawn:
|
|
278
|
-
|
|
279
|
-
```yaml
|
|
280
|
-
# INEFFICIENT - 2 subagent spawns
|
|
281
|
-
Spawn 1: sm-setup MODE=research
|
|
282
|
-
Spawn 2: sm-file-summary
|
|
283
|
-
|
|
284
|
-
# EFFICIENT - 1 compound subagent
|
|
285
|
-
Spawn 1: (combined research + file-summary subagent)
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
**Good candidates for combining:**
|
|
289
|
-
- Preflight checks + handoff updates
|
|
290
|
-
- Status gathering + session file updates
|
|
291
|
-
- Test running + result parsing
|
|
292
|
-
|
|
293
|
-
**Creating Compound Subagents:**
|
|
294
|
-
|
|
295
|
-
When you notice a pattern of sequential subagent calls, consider creating a compound subagent:
|
|
296
|
-
|
|
297
|
-
1. **Identify the pattern:** Look for repeated sequences like "always call A then B"
|
|
298
|
-
2. **Check dependencies:** Can B start before A completes? If yes, parallelize instead.
|
|
299
|
-
3. **Create combined prompt:** Merge both subagents' responsibilities into one
|
|
300
|
-
|
|
301
|
-
**Example: Compound Preflight + Handoff**
|
|
302
|
-
|
|
303
|
-
Instead of:
|
|
304
|
-
```yaml
|
|
305
|
-
# Turn 1: Preflight
|
|
306
|
-
Task tool:
|
|
307
|
-
subagent_type: "reviewer-preflight"
|
|
308
|
-
prompt: |
|
|
309
|
-
STORY_ID: X-Y
|
|
310
|
-
...
|
|
311
|
-
|
|
312
|
-
# Turn 2: Wait for result, then handoff
|
|
313
|
-
Task tool:
|
|
314
|
-
subagent_type: "reviewer-handoff-approve"
|
|
315
|
-
prompt: |
|
|
316
|
-
STORY_ID: X-Y
|
|
317
|
-
...
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
Create a compound definition that does both:
|
|
321
|
-
```yaml
|
|
322
|
-
Task tool:
|
|
323
|
-
subagent_type: "general-purpose"
|
|
324
|
-
model: "haiku"
|
|
325
|
-
prompt: |
|
|
326
|
-
You are a combined preflight + handoff assistant.
|
|
327
|
-
|
|
328
|
-
## Phase 1: Pre-flight checks
|
|
329
|
-
[Include preflight steps]
|
|
330
|
-
|
|
331
|
-
## Phase 2: If all checks pass, complete handoff
|
|
332
|
-
[Include handoff steps]
|
|
333
|
-
|
|
334
|
-
## Output
|
|
335
|
-
Report: preflight results + handoff status
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
**When NOT to combine:**
|
|
339
|
-
- When steps need human review between them (e.g., reviewer assessment before handoff)
|
|
340
|
-
- When the first step might fail often (better to fail fast)
|
|
341
|
-
- When prompts are already long (context limits)
|
|
342
|
-
|
|
343
|
-
</details>
|
|
344
|
-
|
|
345
|
-
### Turn Budget Guidelines
|
|
346
|
-
|
|
347
|
-
| Story Size | Target Turns |
|
|
348
|
-
|------------|--------------|
|
|
349
|
-
| 1 point (trivial) | 10-15 |
|
|
350
|
-
| 2 points (small) | 15-25 |
|
|
351
|
-
| 3 points (medium) | 25-35 |
|
|
352
|
-
| 5 points (large) | 35-50 |
|
|
353
|
-
|
|
354
|
-
**Techniques to reduce turns:**
|
|
355
|
-
1. Batch bash commands with `&&`
|
|
356
|
-
2. Read multiple files in parallel
|
|
357
|
-
3. Use Grep with context instead of Read + search
|
|
358
|
-
4. Combine related subagent work
|
|
359
|
-
5. Use brace expansion in Glob patterns
|
|
360
|
-
6. Spawn independent subagents in parallel
|
|
361
|
-
7. Run tests in background while continuing work
|
|
362
|
-
|
|
363
|
-
<details>
|
|
364
|
-
<summary><strong>Background Subagent Execution</strong></summary>
|
|
365
|
-
|
|
366
|
-
Run slow operations in background to continue working:
|
|
367
|
-
|
|
368
|
-
```yaml
|
|
369
|
-
# Spawn tests in background
|
|
370
|
-
Task tool:
|
|
371
|
-
subagent_type: "testing-runner"
|
|
372
|
-
run_in_background: true
|
|
373
|
-
prompt: |
|
|
374
|
-
REPOS: all
|
|
375
|
-
CONTEXT: Background test run
|
|
376
|
-
RUN_ID: bg-001
|
|
377
|
-
SKIP_CACHE_WRITE: true
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
**Check status without blocking:**
|
|
381
|
-
```yaml
|
|
382
|
-
TaskOutput tool:
|
|
383
|
-
task_id: {task_id}
|
|
384
|
-
block: false
|
|
385
|
-
timeout: 1000
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
**When to use background execution:**
|
|
389
|
-
- Test runs while writing more code
|
|
390
|
-
- Multiple independent file searches
|
|
391
|
-
- Parallel exploration of code paths
|
|
392
|
-
- Long-running git operations
|
|
393
|
-
|
|
394
|
-
**When NOT to use:**
|
|
395
|
-
- Operations where next steps depend on the result
|
|
396
|
-
- Operations that modify shared state
|
|
397
|
-
- Before commit (need to verify GREEN)
|
|
398
|
-
- During handoff (need synchronous verification)
|
|
399
|
-
|
|
400
|
-
</details>
|
|
401
|
-
|
|
402
|
-
<details>
|
|
403
|
-
<summary><strong>Background Task Tracking</strong></summary>
|
|
404
|
-
|
|
405
|
-
Use the background task tracking utilities to manage session file entries:
|
|
406
|
-
|
|
407
|
-
```bash
|
|
408
|
-
source $CLAUDE_PROJECT_DIR/.pennyfarthing/scripts/lib/background-tasks.sh
|
|
409
|
-
SESSION_FILE="$CLAUDE_PROJECT_DIR/.session/${STORY_ID}-session.md"
|
|
410
|
-
|
|
411
|
-
# After spawning background task, record it:
|
|
412
|
-
bg_task_add "$SESSION_FILE" "$TASK_ID" "testing-runner" "Background test run"
|
|
413
|
-
|
|
414
|
-
# After checking TaskOutput, update status:
|
|
415
|
-
bg_task_update "$SESSION_FILE" "$TASK_ID" "completed" # or "error"
|
|
416
|
-
|
|
417
|
-
# Clean up finished tasks:
|
|
418
|
-
bg_task_cleanup "$SESSION_FILE"
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
**Available functions:**
|
|
422
|
-
| Function | Purpose |
|
|
423
|
-
|----------|---------|
|
|
424
|
-
| `bg_task_add` | Record new background task |
|
|
425
|
-
| `bg_task_update` | Update task status (running/completed/error) |
|
|
426
|
-
| `bg_task_cleanup` | Remove completed and errored tasks |
|
|
427
|
-
| `bg_task_list` | Show all running tasks |
|
|
428
|
-
| `bg_task_check` | Return 0 if any tasks running (for conditionals) |
|
|
429
|
-
| `bg_task_summary` | Print counts by status |
|
|
430
|
-
|
|
431
|
-
**Lifecycle:**
|
|
432
|
-
1. Spawn with `run_in_background: true`
|
|
433
|
-
2. Record: `bg_task_add "$SESSION_FILE" "$TASK_ID" "type" "description"`
|
|
434
|
-
3. Continue other work
|
|
435
|
-
4. Periodically check `TaskOutput` with `block: false`
|
|
436
|
-
5. Update: `bg_task_update "$SESSION_FILE" "$TASK_ID" "completed"`
|
|
437
|
-
6. Cleanup: `bg_task_cleanup "$SESSION_FILE"`
|
|
438
|
-
|
|
439
|
-
</details>
|
|
440
|
-
|
|
441
|
-
<details>
|
|
442
|
-
<summary><strong>Example: Background Tests While Implementing</strong></summary>
|
|
443
|
-
|
|
444
|
-
```
|
|
445
|
-
Turn 1: Spawn testing-runner in background, continue editing
|
|
446
|
-
Turn 2: Make code changes
|
|
447
|
-
Turn 3: Check TaskOutput (still running), continue editing
|
|
448
|
-
Turn 4: Make more changes
|
|
449
|
-
Turn 5: Check TaskOutput (complete, GREEN), proceed to commit
|
|
450
|
-
```
|
|
451
|
-
|
|
452
|
-
This pattern saves turns by overlapping test execution with implementation work.
|
|
453
|
-
|
|
454
|
-
</details>
|
|
455
|
-
|
|
456
|
-
## Project Customization
|
|
457
|
-
|
|
458
|
-
Projects should create their own dev-patterns skill in `.claude/project/skills/dev-patterns/` with:
|
|
459
|
-
- Project-specific patterns and conventions
|
|
460
|
-
- Known pitfalls for the tech stack
|
|
461
|
-
- File location conventions
|
package/scripts/README.md
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Meta Scripts
|
|
2
|
-
|
|
3
|
-
**These scripts are NOT distributed to users.** They are for Pennyfarthing framework development only.
|
|
4
|
-
|
|
5
|
-
## Contents
|
|
6
|
-
|
|
7
|
-
| Script | Purpose |
|
|
8
|
-
|--------|---------|
|
|
9
|
-
| `deploy.sh` | Release Pennyfarthing (version bump, tag, push, GitHub release) |
|
|
10
|
-
| `cyclist-debug.mjs` | Debug Cyclist connection |
|
|
11
|
-
| `handoff-cli.{sh,js}` | Test handoff flow |
|
|
12
|
-
| `verify-visual-mapping.js` | Verify theme visual mappings |
|
|
13
|
-
| `migrate-assets-to-slug.sh` | One-time migration script |
|
|
14
|
-
| `resize-portraits.sh` | Resize portrait images |
|
|
15
|
-
| `resolve-portrait.mjs` | Portrait resolution logic |
|
|
16
|
-
| `validate-refs.js` | Validate internal references |
|
|
17
|
-
|
|
18
|
-
> Benchmark scripts have been moved to `packages/benchmark/`.
|
|
19
|
-
|
|
20
|
-
## Usage
|
|
21
|
-
|
|
22
|
-
Run from pennyfarthing repo root:
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
# Release a new version
|
|
26
|
-
./scripts/deploy.sh --dry-run patch
|
|
27
|
-
./scripts/deploy.sh patch
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Where Should My Script Go?
|
|
31
|
-
|
|
32
|
-
**Put it here if:**
|
|
33
|
-
- It's for framework development/CI only
|
|
34
|
-
- Users should NOT have access to it
|
|
35
|
-
- It uses GPU/heavy dependencies (keep in meta, not distributed)
|
|
36
|
-
|
|
37
|
-
**Put it in `pennyfarthing-dist/scripts/` if:**
|
|
38
|
-
- Users need it for their workflows
|
|
39
|
-
- It's part of the sprint/story/jira tooling
|
|
40
|
-
|
|
41
|
-
See `CLAUDE.md` for the full decision tree.
|