@pennyfarthing/core 11.0.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 +80 -22
- package/package.json +14 -16
- 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 +3 -3
- package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
- package/packages/core/dist/scripts/theme-detail.test.js +199 -0
- 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/settings.d.ts.map +1 -1
- package/packages/core/dist/server/api/settings.js +63 -1
- 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/server.d.ts.map +1 -1
- package/packages/core/dist/server/server.js +17 -12
- package/packages/core/dist/server/server.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/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 -29
- package/pennyfarthing-dist/agents/ba.md +30 -29
- package/pennyfarthing-dist/agents/dev.md +32 -43
- package/pennyfarthing-dist/agents/devops.md +57 -21
- package/pennyfarthing-dist/agents/orchestrator.md +3 -10
- 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 -39
- 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 +13 -13
- package/pennyfarthing-dist/guides/agent-coordination.md +7 -7
- package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -5
- 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-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 +5 -0
- 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__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.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__/__main__.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/debug_panel.py +218 -0
- package/pennyfarthing_scripts/bikerack/diffs_panel.py +203 -27
- package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/cli.py +114 -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/common/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/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/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/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/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/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git_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__/__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/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/jira/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/epic.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/__pycache__/story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/sync.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/migration/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/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/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/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/story/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_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_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.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_git_utils.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_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.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_panel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_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_validate_cmd.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_workflow_check.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_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__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.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/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/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/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/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/scripts/README.md +0 -41
package/README.md
CHANGED
|
@@ -35,9 +35,11 @@ The 98 persona themes (Discworld, Star Trek, Breaking Bad, etc.) are instruments
|
|
|
35
35
|
|
|
36
36
|
### 3. Integration & Tooling
|
|
37
37
|
|
|
38
|
-
- **Cyclist Visual Terminal** - Electron-based IDE with
|
|
38
|
+
- **Cyclist Visual Terminal** - Electron-based IDE with 17 draggable Dockview panels, agent portraits, tool visualization, and workflow controls
|
|
39
|
+
- **BikeRack** - Standalone panel viewer for CLI-first developers — dashboard panels in your browser, Claude in your terminal
|
|
39
40
|
- **Jira Integration** - Bidirectional sync, epic auto-creation, sprint velocity
|
|
40
41
|
- **Sprint Management** - Story tracking with `current-sprint.yaml`
|
|
42
|
+
- **Codebase Analysis** - Hotspots, complexity, dead code, dependencies, code markers, and health score via `pf debug`
|
|
41
43
|
|
|
42
44
|
---
|
|
43
45
|
|
|
@@ -81,6 +83,7 @@ All panels are draggable, floatable, and splittable:
|
|
|
81
83
|
|-------|---------|
|
|
82
84
|
| **Message** | Conversation stream (always visible) |
|
|
83
85
|
| **Sprint** | Current sprint stories and progress |
|
|
86
|
+
| **Progress** | At-a-glance story dashboard |
|
|
84
87
|
| **BikeLane** | Stepped workflow state and navigation |
|
|
85
88
|
| **AC** | Acceptance criteria checklist with progress |
|
|
86
89
|
| **Acceptance Criteria** | Story ACs with pass/fail tracking |
|
|
@@ -92,7 +95,6 @@ All panels are draggable, floatable, and splittable:
|
|
|
92
95
|
| **Settings** | Permission mode, relay mode, bell mode toggles |
|
|
93
96
|
| **Debug** | Prime context inspection with token counts |
|
|
94
97
|
| **Background** | Background job monitoring |
|
|
95
|
-
| **TTY** | Integrated terminal |
|
|
96
98
|
| **Workflow** | Workflow navigation and status |
|
|
97
99
|
| **Hotspots** | Codebase health — dead code, complexity, dependencies |
|
|
98
100
|
|
|
@@ -112,6 +114,17 @@ Cyclist renders tool use as human-readable summaries instead of raw JSON. Consec
|
|
|
112
114
|
|
|
113
115
|
Each of the 319 persona characters across 29 themes has a unique portrait displayed in the conversation stream, making multi-agent workflows visually distinct.
|
|
114
116
|
|
|
117
|
+
### BikeRack (CLI-First Dashboard)
|
|
118
|
+
|
|
119
|
+
For developers who prefer Claude Code in their own terminal, BikeRack runs WheelHub separately and serves panels in a browser:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
pf bikerack start # Launch BikeRack + Claude CLI
|
|
123
|
+
just bikerack # Same, via just recipe
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
BikeRack provides the same panels as Cyclist without the conversation UI. Panels receive data via OTEL telemetry and file watchers.
|
|
127
|
+
|
|
115
128
|
## Prime Context System
|
|
116
129
|
|
|
117
130
|
Prime assembles the full agent context at activation: agent definition, persona character, behavior guide, sprint state, active session, and sidecar memory. This is injected via `--append-system-prompt` so agents behave identically whether launched from Cyclist or the CLI.
|
|
@@ -155,6 +168,28 @@ BikeLane is the umbrella workflow system supporting two types:
|
|
|
155
168
|
|
|
156
169
|
Use `/workflow list` to see all workflows. Use `/workflow start <name>` to begin any stepped workflow.
|
|
157
170
|
|
|
171
|
+
### Workflow Gates
|
|
172
|
+
|
|
173
|
+
Gates are conditional checks on phase transitions. When an agent finishes a phase, the gate evaluates whether the transition should proceed:
|
|
174
|
+
|
|
175
|
+
| Gate | Purpose |
|
|
176
|
+
|------|---------|
|
|
177
|
+
| `tests-pass` | Verify all tests pass before review |
|
|
178
|
+
| `tests-fail` | Verify tests are RED before implementation |
|
|
179
|
+
| `approval` | Verify reviewer has approved |
|
|
180
|
+
| `confidence-sm` | Check if user instruction is unambiguous |
|
|
181
|
+
|
|
182
|
+
Gates are defined in `pennyfarthing-dist/gates/` and referenced via `gate.file` in workflow YAML.
|
|
183
|
+
|
|
184
|
+
### Tandem Mode
|
|
185
|
+
|
|
186
|
+
Tandem workflows pair a background observer with the primary agent. The backseat watches the primary agent's work and injects observations:
|
|
187
|
+
|
|
188
|
+
- **TDD-Tandem** — Architect watches TEA, TEA watches Dev, PM watches Reviewer
|
|
189
|
+
- **BDD-Tandem** — Adds UX Designer watching Dev, Architect watching UX
|
|
190
|
+
|
|
191
|
+
For active questions (not passive observation), agents use the **Consultation Protocol** — synchronous Sonnet-powered request/response between agents.
|
|
192
|
+
|
|
158
193
|
## Benchmarking & Personality Research
|
|
159
194
|
|
|
160
195
|
Pennyfarthing includes a scientific benchmarking system for evaluating how personality affects agent performance:
|
|
@@ -189,20 +224,35 @@ See [Benchmarking Documentation](docs/BENCHMARKING.md) for methodology.
|
|
|
189
224
|
| `pennyfarthing uninstall` | Remove for clean reinstall |
|
|
190
225
|
| `pennyfarthing theme list` | Show available themes |
|
|
191
226
|
| `pennyfarthing theme set <name>` | Change active theme |
|
|
227
|
+
| `pennyfarthing cyclist` | Launch Cyclist visual terminal |
|
|
228
|
+
| `pf bikerack start` | Launch BikeRack dashboard |
|
|
229
|
+
| `pf debug hotspots analyze` | Git change frequency analysis |
|
|
230
|
+
| `pf debug complexity analyze` | Code complexity metrics |
|
|
231
|
+
| `pf debug deadcode stale` | Find files with no recent commits |
|
|
232
|
+
| `pf debug healthscore analyze` | Composite codebase health score |
|
|
233
|
+
| `pf handoff marker <agent>` | Generate handoff marker |
|
|
234
|
+
| `pf validate` | Run all validators |
|
|
192
235
|
|
|
193
236
|
## Documentation
|
|
194
237
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
|
198
|
-
|
|
199
|
-
| [BikeLane
|
|
200
|
-
| [
|
|
201
|
-
| [
|
|
202
|
-
| [
|
|
203
|
-
| [
|
|
204
|
-
| [
|
|
205
|
-
| [
|
|
238
|
+
### Guides (in `pennyfarthing-dist/guides/`)
|
|
239
|
+
|
|
240
|
+
| Guide | Description |
|
|
241
|
+
|-------|-------------|
|
|
242
|
+
| [BikeLane](pennyfarthing-dist/guides/bikelane.md) | Workflow engine — phased, stepped, procedural |
|
|
243
|
+
| [BikeRack](pennyfarthing-dist/guides/bikerack.md) | Standalone panel viewer for CLI-first development |
|
|
244
|
+
| [Gates](pennyfarthing-dist/guides/gates.md) | Workflow phase transition gates |
|
|
245
|
+
| [Handoff CLI](pennyfarthing-dist/guides/handoff-cli.md) | Phase transitions and marker generation |
|
|
246
|
+
| [Hooks](pennyfarthing-dist/guides/hooks.md) | Hook system configuration and reference |
|
|
247
|
+
| [Prime](pennyfarthing-dist/guides/prime.md) | Agent activation and context loading |
|
|
248
|
+
| [Bell Mode](pennyfarthing-dist/guides/bell-mode.md) | Message queue injection |
|
|
249
|
+
| [Relay Mode](pennyfarthing-dist/guides/relay-mode.md) | Automatic agent handoffs |
|
|
250
|
+
| [Reflector](pennyfarthing-dist/guides/reflector.md) | Agent-to-UI marker protocol |
|
|
251
|
+
| [TirePump](pennyfarthing-dist/guides/tirepump.md) | Context clearing system |
|
|
252
|
+
| [Tandem Protocol](pennyfarthing-dist/guides/tandem-protocol.md) | Background observer pairing |
|
|
253
|
+
| [Output Styles](pennyfarthing-dist/guides/output-styles.md) | Configurable response modes |
|
|
254
|
+
| [Brownfield Tools](pennyfarthing-dist/guides/brownfield-tools.md) | Codebase analysis CLI tools |
|
|
255
|
+
| [Benchmarks](packages/benchmark/docs/benchmarks-guide.md) | Persona evaluation system |
|
|
206
256
|
|
|
207
257
|
## Available Themes (98)
|
|
208
258
|
|
|
@@ -245,12 +295,15 @@ your-project/
|
|
|
245
295
|
├── .pennyfarthing/
|
|
246
296
|
│ ├── agents/ # → symlink to @pennyfarthing/core
|
|
247
297
|
│ ├── guides/ # → symlink to @pennyfarthing/core
|
|
298
|
+
│ ├── gates/ # → symlink to @pennyfarthing/core
|
|
299
|
+
│ ├── output-styles/ # → symlink to @pennyfarthing/core
|
|
248
300
|
│ ├── personas/ # → symlink to @pennyfarthing/core
|
|
249
301
|
│ ├── scripts/ # → symlink to @pennyfarthing/core
|
|
302
|
+
│ ├── templates/ # → symlink to @pennyfarthing/core
|
|
250
303
|
│ ├── workflows/ # → symlink to @pennyfarthing/core
|
|
251
304
|
│ ├── sidecars/ # Agent learning files (local, writable)
|
|
252
|
-
│ ├──
|
|
253
|
-
│ └──
|
|
305
|
+
│ ├── config.local.yaml # Theme, output style, modes
|
|
306
|
+
│ └── repos.yaml # Multi-repo topology
|
|
254
307
|
├── .claude/
|
|
255
308
|
│ ├── commands/ # → symlinks for Claude Code discovery
|
|
256
309
|
│ └── skills/ # → symlinks for Claude Code discovery
|
|
@@ -261,17 +314,22 @@ your-project/
|
|
|
261
314
|
└── {story-id}-session.md # Active work session
|
|
262
315
|
```
|
|
263
316
|
|
|
264
|
-
## What's New in
|
|
317
|
+
## What's New in v11.0.0
|
|
265
318
|
|
|
266
|
-
- **
|
|
267
|
-
- **
|
|
268
|
-
- **
|
|
269
|
-
- **
|
|
270
|
-
- **
|
|
319
|
+
- **Single Package Consolidation** — `@pennyfarthing/shared` absorbed into `@pennyfarthing/core`. WheelHub server, React UI build, and all shared utilities now live in core. Cyclist is a thin wrapper adding WebSocket + OTLP.
|
|
320
|
+
- **Workflow Gate System** — Conditional checks (tests-pass, tests-fail, approval, confidence) that block phase transitions until quality thresholds are met
|
|
321
|
+
- **Handoff CLI** — Python CLI (`pf handoff`) for gate resolution, session transitions, and environment-aware marker generation
|
|
322
|
+
- **Tandem Consultation Protocol** — Synchronous agent-to-agent questions via Sonnet (complements passive backseat observation)
|
|
323
|
+
- **Output Styles** — Configurable response modes (terse, verbose, teaching) that adjust agent communication without changing behavior
|
|
324
|
+
- **Codebase Analysis Tools** — `pf debug` suite: hotspots, complexity, dead code, dependencies, code markers, health score — with WheelHub API routes for panel integration
|
|
325
|
+
- **Context Circuit Breaker** — Hard stop at 80% context usage, auto-saves agent state for `/continue-session` recovery
|
|
326
|
+
- **Git Hook Chaining** — Dispatcher `.d/` pattern allows multiple tools to install hooks without overwriting each other
|
|
327
|
+
- **v11 Migration Automation** — Detects and removes old packages during upgrade
|
|
271
328
|
|
|
272
329
|
### Previous Highlights
|
|
273
330
|
|
|
274
|
-
- **v10.
|
|
331
|
+
- **v10.3** - BikeRack Dockview migration, BikeRack launcher CLI, repos topology system, BA agent
|
|
332
|
+
- **v10.2** - Tandem backseat protocol, tandem workflows (TDD/BDD-tandem), CI quality gates, schema validation
|
|
275
333
|
- **v10.1** - Codebase health dashboard, tool dialog system, 2party-TDD workflow, cross-file reference validator
|
|
276
334
|
- **v10.0** - Clean install consolidation, tool use approval system, plan mode exit UI
|
|
277
335
|
- **v9.3** - Theme packages (97 themes across 7 packs), release workflow, shadcn/ui migration
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pennyfarthing/core",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.1.0",
|
|
4
4
|
"description": "Claude Code agent framework with TDD workflow and persona system",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -30,19 +30,6 @@
|
|
|
30
30
|
"bugs": {
|
|
31
31
|
"url": "https://github.com/1898andCo/pennyfarthing/issues"
|
|
32
32
|
},
|
|
33
|
-
"scripts": {
|
|
34
|
-
"prepublishOnly": "find pennyfarthing-dist/scripts -name '*.sh' ! -name 'find-root.sh' -exec chmod +x {} +",
|
|
35
|
-
"postinstall": "node scripts/postinstall.cjs",
|
|
36
|
-
"build": "pnpm --filter @pennyfarthing/shared build && pnpm --filter @pennyfarthing/core build && pnpm --filter @pennyfarthing/cyclist build && ./scripts/generate-skill-docs.sh",
|
|
37
|
-
"docs": "./scripts/generate-skill-docs.sh",
|
|
38
|
-
"dev": "pnpm -r --parallel dev",
|
|
39
|
-
"test": "pnpm -r test",
|
|
40
|
-
"lint": "eslint 'packages/*/src/**/*.ts' --max-warnings 0",
|
|
41
|
-
"lint:md": "markdownlint-cli2 'pennyfarthing-dist/**/*.md'",
|
|
42
|
-
"validate:refs": "node scripts/validate-refs.js",
|
|
43
|
-
"test:validate-refs": "node --test scripts/validate-refs.test.js",
|
|
44
|
-
"clean": "pnpm -r clean"
|
|
45
|
-
},
|
|
46
33
|
"dependencies": {
|
|
47
34
|
"@pennyfarthing/shared": "^10.0.3",
|
|
48
35
|
"chalk": "^5.3.0",
|
|
@@ -63,5 +50,16 @@
|
|
|
63
50
|
"engines": {
|
|
64
51
|
"node": ">=18.0.0"
|
|
65
52
|
},
|
|
66
|
-
"
|
|
67
|
-
|
|
53
|
+
"scripts": {
|
|
54
|
+
"postinstall": "node scripts/postinstall.cjs",
|
|
55
|
+
"build": "pnpm --filter @pennyfarthing/shared build && pnpm --filter @pennyfarthing/core build && pnpm --filter @pennyfarthing/cyclist build && ./scripts/generate-skill-docs.sh",
|
|
56
|
+
"docs": "./scripts/generate-skill-docs.sh",
|
|
57
|
+
"dev": "pnpm -r --parallel dev",
|
|
58
|
+
"test": "pnpm -r test",
|
|
59
|
+
"lint": "eslint 'packages/*/src/**/*.ts' --max-warnings 0",
|
|
60
|
+
"lint:md": "markdownlint-cli2 'pennyfarthing-dist/**/*.md'",
|
|
61
|
+
"validate:refs": "node scripts/validate-refs.js",
|
|
62
|
+
"test:validate-refs": "node --test scripts/validate-refs.test.js",
|
|
63
|
+
"clean": "pnpm -r clean"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for MSSCI-15080: v11 migration automation — detect and remove old multi-package installs
|
|
3
|
+
*
|
|
4
|
+
* Story 98-22: Create migration 010 to detect and remove old multi-package
|
|
5
|
+
* installs (@pennyfarthing/shared, @pennyfarthing/cyclist, @pennyfarthing/benchmark)
|
|
6
|
+
* that were absorbed into @pennyfarthing/core in v11.
|
|
7
|
+
*
|
|
8
|
+
* Acceptance Criteria:
|
|
9
|
+
* - AC1: Migration file exists with correct exports (id, description, up, check)
|
|
10
|
+
* - AC2: check() detects old packages in node_modules/ — false if found, true if clean
|
|
11
|
+
* - AC3: up() removes old package directories from node_modules/@pennyfarthing/
|
|
12
|
+
* - AC4: up() respects ctx.dryRun — logs without deleting
|
|
13
|
+
* - AC5: up() logs removal actions via ctx.logger
|
|
14
|
+
* - AC6: check()/up() handle missing node_modules/ gracefully
|
|
15
|
+
* - AC7: Migration integrates with existing runner (auto-discovered by listMigrationFiles)
|
|
16
|
+
*
|
|
17
|
+
* Run with: cd packages/core && pnpm build && node --test dist/cli/utils/010-detect-remove-old-packages.test.js
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=010-detect-remove-old-packages.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"010-detect-remove-old-packages.test.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/010-detect-remove-old-packages.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for MSSCI-15080: v11 migration automation — detect and remove old multi-package installs
|
|
3
|
+
*
|
|
4
|
+
* Story 98-22: Create migration 010 to detect and remove old multi-package
|
|
5
|
+
* installs (@pennyfarthing/shared, @pennyfarthing/cyclist, @pennyfarthing/benchmark)
|
|
6
|
+
* that were absorbed into @pennyfarthing/core in v11.
|
|
7
|
+
*
|
|
8
|
+
* Acceptance Criteria:
|
|
9
|
+
* - AC1: Migration file exists with correct exports (id, description, up, check)
|
|
10
|
+
* - AC2: check() detects old packages in node_modules/ — false if found, true if clean
|
|
11
|
+
* - AC3: up() removes old package directories from node_modules/@pennyfarthing/
|
|
12
|
+
* - AC4: up() respects ctx.dryRun — logs without deleting
|
|
13
|
+
* - AC5: up() logs removal actions via ctx.logger
|
|
14
|
+
* - AC6: check()/up() handle missing node_modules/ gracefully
|
|
15
|
+
* - AC7: Migration integrates with existing runner (auto-discovered by listMigrationFiles)
|
|
16
|
+
*
|
|
17
|
+
* Run with: cd packages/core && pnpm build && node --test dist/cli/utils/010-detect-remove-old-packages.test.js
|
|
18
|
+
*/
|
|
19
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
20
|
+
import assert from 'node:assert';
|
|
21
|
+
import { existsSync, mkdirSync, rmSync, writeFileSync, } from 'fs';
|
|
22
|
+
import { join, dirname } from 'path';
|
|
23
|
+
import { tmpdir } from 'os';
|
|
24
|
+
import { fileURLToPath } from 'url';
|
|
25
|
+
import { listMigrationFiles } from './migrations.js';
|
|
26
|
+
// Import the migration under test
|
|
27
|
+
// Migration is a plain JS file — we import its named exports
|
|
28
|
+
import { id, description, up, check, } from '../../../../../pennyfarthing-dist/migrations/010-detect-remove-old-packages.js';
|
|
29
|
+
// ─── Helpers ───────────────────────────────────────────────────────
|
|
30
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
31
|
+
const __dirname = dirname(__filename);
|
|
32
|
+
function createTestDir() {
|
|
33
|
+
const dir = join(tmpdir(), `pf-010-migration-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
34
|
+
mkdirSync(dir, { recursive: true });
|
|
35
|
+
return dir;
|
|
36
|
+
}
|
|
37
|
+
/** Create a mock logger that captures messages */
|
|
38
|
+
function createMockLogger() {
|
|
39
|
+
const messages = [];
|
|
40
|
+
return {
|
|
41
|
+
logger: {
|
|
42
|
+
info(message) { messages.push({ level: 'info', message }); },
|
|
43
|
+
warning(message) { messages.push({ level: 'warning', message }); },
|
|
44
|
+
success(message) { messages.push({ level: 'success', message }); },
|
|
45
|
+
},
|
|
46
|
+
messages,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** The three old packages that should be detected and removed */
|
|
50
|
+
const OLD_PACKAGES = [
|
|
51
|
+
'@pennyfarthing/shared',
|
|
52
|
+
'@pennyfarthing/cyclist',
|
|
53
|
+
'@pennyfarthing/benchmark',
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* Create fake old package directories in node_modules
|
|
57
|
+
*/
|
|
58
|
+
function createOldPackageDirs(projectRoot, packages) {
|
|
59
|
+
for (const pkg of packages) {
|
|
60
|
+
const pkgDir = join(projectRoot, 'node_modules', pkg);
|
|
61
|
+
mkdirSync(pkgDir, { recursive: true });
|
|
62
|
+
writeFileSync(join(pkgDir, 'package.json'), JSON.stringify({
|
|
63
|
+
name: pkg,
|
|
64
|
+
version: '10.0.0',
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// ─── Tests ─────────────────────────────────────────────────────────
|
|
69
|
+
describe('MSSCI-15080: v11 migration — detect and remove old multi-package installs', () => {
|
|
70
|
+
let testDir;
|
|
71
|
+
beforeEach(() => {
|
|
72
|
+
testDir = createTestDir();
|
|
73
|
+
});
|
|
74
|
+
afterEach(() => {
|
|
75
|
+
if (existsSync(testDir)) {
|
|
76
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// ─── AC1: Migration file exists with correct exports ──────────
|
|
80
|
+
describe('Migration file contract (AC1)', () => {
|
|
81
|
+
it('should export id as a string matching 010-* pattern', () => {
|
|
82
|
+
assert.strictEqual(typeof id, 'string');
|
|
83
|
+
assert.ok(id.startsWith('010-'), `Migration id should start with "010-", got "${id}"`);
|
|
84
|
+
});
|
|
85
|
+
it('should export description as a non-empty string', () => {
|
|
86
|
+
assert.strictEqual(typeof description, 'string');
|
|
87
|
+
assert.ok(description.length > 0, 'Description should not be empty');
|
|
88
|
+
});
|
|
89
|
+
it('should export up as a function', () => {
|
|
90
|
+
assert.strictEqual(typeof up, 'function');
|
|
91
|
+
});
|
|
92
|
+
it('should export check as a function', () => {
|
|
93
|
+
assert.strictEqual(typeof check, 'function');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
// ─── AC2: check() detects old packages ─────────────────────────
|
|
97
|
+
describe('check() detection (AC2)', () => {
|
|
98
|
+
it('should return false when @pennyfarthing/shared exists in node_modules', async () => {
|
|
99
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/shared']);
|
|
100
|
+
const { logger } = createMockLogger();
|
|
101
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
102
|
+
const result = await check(ctx);
|
|
103
|
+
assert.strictEqual(result, false, 'check() should return false when old packages exist');
|
|
104
|
+
});
|
|
105
|
+
it('should return false when @pennyfarthing/cyclist exists in node_modules', async () => {
|
|
106
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/cyclist']);
|
|
107
|
+
const { logger } = createMockLogger();
|
|
108
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
109
|
+
const result = await check(ctx);
|
|
110
|
+
assert.strictEqual(result, false, 'check() should return false when old packages exist');
|
|
111
|
+
});
|
|
112
|
+
it('should return false when @pennyfarthing/benchmark exists in node_modules', async () => {
|
|
113
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/benchmark']);
|
|
114
|
+
const { logger } = createMockLogger();
|
|
115
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
116
|
+
const result = await check(ctx);
|
|
117
|
+
assert.strictEqual(result, false, 'check() should return false when old packages exist');
|
|
118
|
+
});
|
|
119
|
+
it('should return false when multiple old packages exist', async () => {
|
|
120
|
+
createOldPackageDirs(testDir, OLD_PACKAGES);
|
|
121
|
+
const { logger } = createMockLogger();
|
|
122
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
123
|
+
const result = await check(ctx);
|
|
124
|
+
assert.strictEqual(result, false, 'check() should return false when any old packages exist');
|
|
125
|
+
});
|
|
126
|
+
it('should return true when no old packages exist in node_modules', async () => {
|
|
127
|
+
// Create node_modules with only @pennyfarthing/core (the valid package)
|
|
128
|
+
const coreDir = join(testDir, 'node_modules', '@pennyfarthing', 'core');
|
|
129
|
+
mkdirSync(coreDir, { recursive: true });
|
|
130
|
+
writeFileSync(join(coreDir, 'package.json'), '{"name":"@pennyfarthing/core"}');
|
|
131
|
+
const { logger } = createMockLogger();
|
|
132
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
133
|
+
const result = await check(ctx);
|
|
134
|
+
assert.strictEqual(result, true, 'check() should return true when no old packages exist');
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
// ─── AC3: up() removes old package directories ─────────────────
|
|
138
|
+
describe('up() removal (AC3)', () => {
|
|
139
|
+
it('should remove @pennyfarthing/shared from node_modules', async () => {
|
|
140
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/shared']);
|
|
141
|
+
const { logger } = createMockLogger();
|
|
142
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
143
|
+
const result = await up(ctx);
|
|
144
|
+
assert.ok(result.success, 'up() should return success');
|
|
145
|
+
assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'shared')), false, '@pennyfarthing/shared should be removed');
|
|
146
|
+
});
|
|
147
|
+
it('should remove @pennyfarthing/cyclist from node_modules', async () => {
|
|
148
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/cyclist']);
|
|
149
|
+
const { logger } = createMockLogger();
|
|
150
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
151
|
+
const result = await up(ctx);
|
|
152
|
+
assert.ok(result.success, 'up() should return success');
|
|
153
|
+
assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'cyclist')), false, '@pennyfarthing/cyclist should be removed');
|
|
154
|
+
});
|
|
155
|
+
it('should remove @pennyfarthing/benchmark from node_modules', async () => {
|
|
156
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/benchmark']);
|
|
157
|
+
const { logger } = createMockLogger();
|
|
158
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
159
|
+
const result = await up(ctx);
|
|
160
|
+
assert.ok(result.success, 'up() should return success');
|
|
161
|
+
assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'benchmark')), false, '@pennyfarthing/benchmark should be removed');
|
|
162
|
+
});
|
|
163
|
+
it('should remove all three old packages when all present', async () => {
|
|
164
|
+
createOldPackageDirs(testDir, OLD_PACKAGES);
|
|
165
|
+
const { logger } = createMockLogger();
|
|
166
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
167
|
+
const result = await up(ctx);
|
|
168
|
+
assert.ok(result.success, 'up() should return success');
|
|
169
|
+
for (const pkg of OLD_PACKAGES) {
|
|
170
|
+
const pkgName = pkg.split('/')[1];
|
|
171
|
+
assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', pkgName)), false, `${pkg} should be removed`);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
it('should NOT remove @pennyfarthing/core', async () => {
|
|
175
|
+
// Create core alongside old packages
|
|
176
|
+
createOldPackageDirs(testDir, [...OLD_PACKAGES, '@pennyfarthing/core']);
|
|
177
|
+
const { logger } = createMockLogger();
|
|
178
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
179
|
+
await up(ctx);
|
|
180
|
+
assert.ok(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'core')), '@pennyfarthing/core should NOT be removed');
|
|
181
|
+
});
|
|
182
|
+
it('should return {success: true} result object', async () => {
|
|
183
|
+
createOldPackageDirs(testDir, OLD_PACKAGES);
|
|
184
|
+
const { logger } = createMockLogger();
|
|
185
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
186
|
+
const result = await up(ctx);
|
|
187
|
+
assert.strictEqual(typeof result, 'object');
|
|
188
|
+
assert.strictEqual(result.success, true);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
// ─── AC4: Dry-run mode ─────────────────────────────────────────
|
|
192
|
+
describe('Dry-run mode (AC4)', () => {
|
|
193
|
+
it('should NOT delete packages in dry-run mode', async () => {
|
|
194
|
+
createOldPackageDirs(testDir, OLD_PACKAGES);
|
|
195
|
+
const { logger } = createMockLogger();
|
|
196
|
+
const ctx = { projectRoot: testDir, logger, dryRun: true };
|
|
197
|
+
const result = await up(ctx);
|
|
198
|
+
assert.ok(result.success, 'up() should still return success in dry-run');
|
|
199
|
+
for (const pkg of OLD_PACKAGES) {
|
|
200
|
+
const pkgName = pkg.split('/')[1];
|
|
201
|
+
assert.ok(existsSync(join(testDir, 'node_modules', '@pennyfarthing', pkgName)), `${pkg} should still exist in dry-run mode`);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
it('should log what would be removed in dry-run mode', async () => {
|
|
205
|
+
createOldPackageDirs(testDir, ['@pennyfarthing/shared']);
|
|
206
|
+
const { logger, messages } = createMockLogger();
|
|
207
|
+
const ctx = { projectRoot: testDir, logger, dryRun: true };
|
|
208
|
+
await up(ctx);
|
|
209
|
+
const allMessages = messages.map(m => m.message).join(' ');
|
|
210
|
+
assert.ok(allMessages.includes('shared'), 'Should log about @pennyfarthing/shared in dry-run');
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
// ─── AC5: Logging ──────────────────────────────────────────────
|
|
214
|
+
describe('Logging (AC5)', () => {
|
|
215
|
+
it('should log each package being removed', async () => {
|
|
216
|
+
createOldPackageDirs(testDir, OLD_PACKAGES);
|
|
217
|
+
const { logger, messages } = createMockLogger();
|
|
218
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
219
|
+
await up(ctx);
|
|
220
|
+
const allMessages = messages.map(m => m.message).join(' ');
|
|
221
|
+
assert.ok(allMessages.includes('shared'), 'Should log about shared');
|
|
222
|
+
assert.ok(allMessages.includes('cyclist'), 'Should log about cyclist');
|
|
223
|
+
assert.ok(allMessages.includes('benchmark'), 'Should log about benchmark');
|
|
224
|
+
});
|
|
225
|
+
it('should log when no old packages are found', async () => {
|
|
226
|
+
// Empty node_modules — nothing to remove
|
|
227
|
+
mkdirSync(join(testDir, 'node_modules', '@pennyfarthing'), { recursive: true });
|
|
228
|
+
const { logger, messages } = createMockLogger();
|
|
229
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
230
|
+
await up(ctx);
|
|
231
|
+
assert.ok(messages.length > 0, 'Should log something even when nothing to remove');
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
// ─── AC6: Missing node_modules graceful handling ───────────────
|
|
235
|
+
describe('Missing node_modules (AC6)', () => {
|
|
236
|
+
it('check() should return true when node_modules does not exist', async () => {
|
|
237
|
+
// testDir has no node_modules at all
|
|
238
|
+
const { logger } = createMockLogger();
|
|
239
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
240
|
+
const result = await check(ctx);
|
|
241
|
+
assert.strictEqual(result, true, 'check() should return true when no node_modules exists');
|
|
242
|
+
});
|
|
243
|
+
it('check() should return true when @pennyfarthing scope dir does not exist', async () => {
|
|
244
|
+
// node_modules exists but no @pennyfarthing scope
|
|
245
|
+
mkdirSync(join(testDir, 'node_modules'), { recursive: true });
|
|
246
|
+
const { logger } = createMockLogger();
|
|
247
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
248
|
+
const result = await check(ctx);
|
|
249
|
+
assert.strictEqual(result, true, 'check() should return true when no @pennyfarthing scope');
|
|
250
|
+
});
|
|
251
|
+
it('up() should return success when node_modules does not exist', async () => {
|
|
252
|
+
const { logger } = createMockLogger();
|
|
253
|
+
const ctx = { projectRoot: testDir, logger, dryRun: false };
|
|
254
|
+
const result = await up(ctx);
|
|
255
|
+
assert.ok(result.success, 'up() should succeed gracefully with no node_modules');
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
// ─── AC7: Runner integration ───────────────────────────────────
|
|
259
|
+
describe('Runner integration (AC7)', () => {
|
|
260
|
+
it('should be discovered by listMigrationFiles()', () => {
|
|
261
|
+
// Point at the real migrations directory
|
|
262
|
+
const migrationsDir = join(__dirname, '..', '..', '..', '..', '..', 'pennyfarthing-dist', 'migrations');
|
|
263
|
+
const files = listMigrationFiles(migrationsDir);
|
|
264
|
+
const migration010 = files.find(f => f.includes('010-'));
|
|
265
|
+
assert.ok(migration010, 'Migration 010 should be discoverable in pennyfarthing-dist/migrations/');
|
|
266
|
+
});
|
|
267
|
+
it('should sort after 009 in migration order', () => {
|
|
268
|
+
const migrationsDir = join(__dirname, '..', '..', '..', '..', '..', 'pennyfarthing-dist', 'migrations');
|
|
269
|
+
const files = listMigrationFiles(migrationsDir);
|
|
270
|
+
const idx009 = files.findIndex(f => f.includes('009-'));
|
|
271
|
+
const idx010 = files.findIndex(f => f.includes('010-'));
|
|
272
|
+
assert.ok(idx009 >= 0, 'Migration 009 should exist');
|
|
273
|
+
assert.ok(idx010 >= 0, 'Migration 010 should exist');
|
|
274
|
+
assert.ok(idx010 > idx009, 'Migration 010 should sort after 009');
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
//# sourceMappingURL=010-detect-remove-old-packages.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"010-detect-remove-old-packages.test.js","sourceRoot":"","sources":["../../../src/cli/utils/010-detect-remove-old-packages.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,9 @@ export type CoreAgent = typeof CORE_AGENTS[number];
|
|
|
15
15
|
export declare const DIRECTORY_SYMLINKS: readonly [{
|
|
16
16
|
readonly name: "agents";
|
|
17
17
|
readonly link: ".pennyfarthing/agents";
|
|
18
|
+
}, {
|
|
19
|
+
readonly name: "gates";
|
|
20
|
+
readonly link: ".pennyfarthing/gates";
|
|
18
21
|
}, {
|
|
19
22
|
readonly name: "guides";
|
|
20
23
|
readonly link: ".pennyfarthing/guides";
|
|
@@ -38,6 +41,9 @@ export declare const DIRECTORY_SYMLINKS: readonly [{
|
|
|
38
41
|
export declare const ALL_SYMLINKS: readonly [{
|
|
39
42
|
readonly name: "agents";
|
|
40
43
|
readonly link: ".pennyfarthing/agents";
|
|
44
|
+
}, {
|
|
45
|
+
readonly name: "gates";
|
|
46
|
+
readonly link: ".pennyfarthing/gates";
|
|
41
47
|
}, {
|
|
42
48
|
readonly name: "guides";
|
|
43
49
|
readonly link: ".pennyfarthing/guides";
|
|
@@ -64,7 +70,7 @@ export declare const ALL_SYMLINKS: readonly [{
|
|
|
64
70
|
* Paths managed by Pennyfarthing (used in manifest)
|
|
65
71
|
* Commands and skills in .claude/ (for discovery), rest in .pennyfarthing/
|
|
66
72
|
*/
|
|
67
|
-
export declare const MANAGED_PATHS: readonly [".claude/commands", ".claude/skills", ".pennyfarthing/agents", ".pennyfarthing/guides", ".pennyfarthing/output-styles", ".pennyfarthing/personas", ".pennyfarthing/scripts", ".pennyfarthing/workflows"];
|
|
73
|
+
export declare const MANAGED_PATHS: readonly [".claude/commands", ".claude/skills", ".pennyfarthing/agents", ".pennyfarthing/gates", ".pennyfarthing/guides", ".pennyfarthing/output-styles", ".pennyfarthing/personas", ".pennyfarthing/scripts", ".pennyfarthing/workflows"];
|
|
68
74
|
export type SymlinkDefinition = {
|
|
69
75
|
readonly name: string;
|
|
70
76
|
readonly link: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,sHAWd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,sHAWd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAQrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIf,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,aAAa,4OAUhB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC"}
|
|
@@ -24,6 +24,7 @@ export const CORE_AGENTS = [
|
|
|
24
24
|
*/
|
|
25
25
|
export const DIRECTORY_SYMLINKS = [
|
|
26
26
|
{ name: 'agents', link: '.pennyfarthing/agents' },
|
|
27
|
+
{ name: 'gates', link: '.pennyfarthing/gates' },
|
|
27
28
|
{ name: 'guides', link: '.pennyfarthing/guides' },
|
|
28
29
|
{ name: 'output-styles', link: '.pennyfarthing/output-styles' },
|
|
29
30
|
{ name: 'personas', link: '.pennyfarthing/personas' },
|
|
@@ -47,6 +48,7 @@ export const MANAGED_PATHS = [
|
|
|
47
48
|
'.claude/commands',
|
|
48
49
|
'.claude/skills',
|
|
49
50
|
'.pennyfarthing/agents',
|
|
51
|
+
'.pennyfarthing/gates',
|
|
50
52
|
'.pennyfarthing/guides',
|
|
51
53
|
'.pennyfarthing/output-styles',
|
|
52
54
|
'.pennyfarthing/personas',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK;IACL,KAAK;IACL,IAAI;IACJ,UAAU;IACV,WAAW;IACX,IAAI;IACJ,aAAa;IACb,aAAa;IACb,QAAQ;IACR,cAAc;CACN,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,0BAA0B,EAAE;CAC/C,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,kBAAkB;IACrB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;CAClC,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,gBAAgB;IAChB,uBAAuB;IACvB,uBAAuB;IACvB,8BAA8B;IAC9B,yBAAyB;IACzB,wBAAwB;IACxB,0BAA0B;CAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK;IACL,KAAK;IACL,IAAI;IACJ,UAAU;IACV,WAAW;IACX,IAAI;IACJ,aAAa;IACb,aAAa;IACb,QAAQ;IACR,cAAc;CACN,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAC/C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,0BAA0B,EAAE;CAC/C,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,kBAAkB;IACrB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;CAClC,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,gBAAgB;IAChB,uBAAuB;IACvB,sBAAsB;IACtB,uBAAuB;IACvB,8BAA8B;IAC9B,yBAAyB;IACzB,wBAAwB;IACxB,0BAA0B;CAClB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 106-4: Gate file discovery — constants include gates/ symlink
|
|
3
|
+
*
|
|
4
|
+
* Verifies that DIRECTORY_SYMLINKS and MANAGED_PATHS include the gates/
|
|
5
|
+
* directory entry, ensuring init/update will create the symlink.
|
|
6
|
+
*
|
|
7
|
+
* RED phase — these tests should fail until Dev adds gates to the constants.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=constants.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.test.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|