@pennyfarthing/core 11.2.1 → 11.2.2
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 +100 -40
- package/package.json +1 -1
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +121 -28
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/utils/settings.d.ts +0 -4
- package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/settings.js +31 -26
- package/packages/core/dist/cli/utils/settings.js.map +1 -1
- package/packages/core/dist/consultation/dialogue-manager.d.ts +1 -1
- package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -1
- package/packages/core/dist/consultation/dialogue-manager.js +1 -1
- package/packages/core/dist/consultation/dialogue-manager.js.map +1 -1
- package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -1
- package/packages/core/dist/consultation/tandem-metrics.test.js.map +1 -1
- package/packages/core/dist/public/css/react.css +1 -1
- package/packages/core/dist/public/js/react/react.js +9 -9
- package/packages/core/dist/server/api/git.d.ts.map +1 -1
- package/packages/core/dist/server/api/git.js +0 -1
- package/packages/core/dist/server/api/git.js.map +1 -1
- package/packages/core/dist/server/api/index.d.ts +2 -0
- package/packages/core/dist/server/api/index.d.ts.map +1 -1
- package/packages/core/dist/server/api/index.js +2 -0
- package/packages/core/dist/server/api/index.js.map +1 -1
- package/packages/core/dist/server/api/project-info.d.ts +11 -0
- package/packages/core/dist/server/api/project-info.d.ts.map +1 -0
- package/packages/core/dist/server/api/project-info.js +18 -0
- package/packages/core/dist/server/api/project-info.js.map +1 -0
- package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
- package/packages/core/dist/server/otlp-receiver.js +18 -1
- package/packages/core/dist/server/otlp-receiver.js.map +1 -1
- package/packages/core/dist/server/otlp-receiver.test.js +1 -1
- package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
- package/packages/core/dist/server/server.d.ts.map +1 -1
- package/packages/core/dist/server/server.js +3 -2
- package/packages/core/dist/server/server.js.map +1 -1
- package/packages/core/dist/server/server.test.d.ts +1 -1
- package/packages/core/dist/server/server.test.js +8 -8
- package/packages/core/dist/server/settings.d.ts +1 -0
- package/packages/core/dist/server/settings.d.ts.map +1 -1
- package/packages/core/dist/server/settings.js +13 -0
- package/packages/core/dist/server/settings.js.map +1 -1
- package/packages/core/dist/workflow/team-lifecycle.d.ts +169 -0
- package/packages/core/dist/workflow/team-lifecycle.d.ts.map +1 -0
- package/packages/core/dist/workflow/team-lifecycle.js +217 -0
- package/packages/core/dist/workflow/team-lifecycle.js.map +1 -0
- package/packages/core/dist/workflow/team-lifecycle.test.d.ts +20 -0
- package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/team-lifecycle.test.js +966 -0
- package/packages/core/dist/workflow/team-lifecycle.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.d.ts +17 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.js +275 -0
- package/packages/core/dist/workflow/workflow-team-templates.test.js.map +1 -0
- package/pennyfarthing-dist/agents/dev.md +15 -2
- package/pennyfarthing-dist/agents/reviewer.md +17 -4
- package/pennyfarthing-dist/agents/sm-finish.md +1 -1
- package/pennyfarthing-dist/agents/sm-setup.md +7 -7
- package/pennyfarthing-dist/agents/sm.md +12 -12
- package/pennyfarthing-dist/agents/tea.md +2 -2
- package/pennyfarthing-dist/agents/testing-runner.md +1 -1
- package/pennyfarthing-dist/commands/pf-architect.md +1 -1
- package/pennyfarthing-dist/commands/pf-ba.md +1 -1
- package/pennyfarthing-dist/commands/pf-chore.md +2 -2
- package/pennyfarthing-dist/commands/pf-dev.md +1 -1
- package/pennyfarthing-dist/commands/pf-devops.md +1 -1
- package/pennyfarthing-dist/commands/pf-epic.md +6 -6
- package/pennyfarthing-dist/commands/pf-git.md +10 -10
- package/pennyfarthing-dist/commands/pf-health-check.md +1 -1
- package/pennyfarthing-dist/commands/pf-help.md +12 -12
- package/pennyfarthing-dist/commands/pf-orchestrator.md +1 -1
- package/pennyfarthing-dist/commands/pf-pm.md +1 -1
- package/pennyfarthing-dist/commands/pf-prime.md +8 -8
- package/pennyfarthing-dist/commands/pf-reviewer.md +1 -1
- package/pennyfarthing-dist/commands/pf-session.md +7 -7
- package/pennyfarthing-dist/commands/pf-sm.md +1 -1
- package/pennyfarthing-dist/commands/pf-sprint.md +7 -7
- package/pennyfarthing-dist/commands/pf-tea.md +1 -1
- package/pennyfarthing-dist/commands/pf-tech-writer.md +1 -1
- package/pennyfarthing-dist/commands/pf-theme.md +9 -9
- package/pennyfarthing-dist/commands/pf-ux-designer.md +1 -1
- package/pennyfarthing-dist/commands/pf-work.md +1 -1
- package/pennyfarthing-dist/guides/agent-behavior.md +70 -19
- package/pennyfarthing-dist/guides/agent-coordination.md +10 -10
- package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
- package/pennyfarthing-dist/guides/agent-template-tactical.md +1 -1
- package/pennyfarthing-dist/guides/bell-mode.md +1 -1
- package/pennyfarthing-dist/guides/bikerack.md +10 -10
- package/pennyfarthing-dist/guides/brownfield-tools.md +24 -24
- package/pennyfarthing-dist/guides/command-tag-taxonomy.md +1 -1
- package/pennyfarthing-dist/guides/gate-schema.md +2 -2
- package/pennyfarthing-dist/guides/gates.md +3 -3
- package/pennyfarthing-dist/guides/handoff-cli.md +8 -8
- package/pennyfarthing-dist/guides/hooks.md +27 -27
- package/pennyfarthing-dist/guides/prime.md +2 -2
- package/pennyfarthing-dist/guides/reflector.md +1 -1
- package/pennyfarthing-dist/guides/skill-schema.md +6 -6
- package/pennyfarthing-dist/guides/tandem-protocol.md +3 -3
- package/pennyfarthing-dist/guides/workflow-schema.md +1 -1
- package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
- package/pennyfarthing-dist/guides/xml-tags.md +8 -8
- package/pennyfarthing-dist/scripts/README.md +4 -4
- package/pennyfarthing-dist/scripts/core/agent-session.sh +2 -5
- package/pennyfarthing-dist/scripts/core/check-context.sh +1 -1
- package/pennyfarthing-dist/scripts/core/pf.sh +5 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +2 -5
- package/pennyfarthing-dist/scripts/core/prime.sh +2 -25
- package/pennyfarthing-dist/scripts/git/README.md +14 -14
- package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +2 -3
- package/pennyfarthing-dist/scripts/git/git-status-all.sh +2 -3
- package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +2 -3
- package/pennyfarthing-dist/scripts/git/worktree-manager.sh +2 -4
- package/pennyfarthing-dist/scripts/hooks/README.md +6 -6
- package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +5 -4
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +2 -1
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +3 -3
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +3 -4
- package/pennyfarthing-dist/scripts/lib/env.sh +34 -0
- package/pennyfarthing-dist/scripts/lib/run-pf.sh +39 -0
- package/pennyfarthing-dist/scripts/misc/README.md +1 -1
- package/pennyfarthing-dist/scripts/misc/statusline.sh +3 -3
- package/pennyfarthing-dist/scripts/sprint/README.md +21 -21
- package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
- package/pennyfarthing-dist/scripts/workflow/finish-story.sh +2 -16
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +3 -3
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +3 -3
- package/pennyfarthing-dist/skills/pf-bc/examples.md +23 -23
- package/pennyfarthing-dist/skills/pf-bc/skill.md +17 -17
- package/pennyfarthing-dist/skills/pf-bc/usage.md +8 -8
- package/pennyfarthing-dist/skills/pf-jira/SKILL.md +15 -15
- package/pennyfarthing-dist/skills/pf-jira/examples.md +48 -48
- package/pennyfarthing-dist/skills/pf-jira/usage.md +15 -15
- package/pennyfarthing-dist/skills/pf-sprint/examples.md +80 -80
- package/pennyfarthing-dist/skills/pf-sprint/skill.md +35 -35
- package/pennyfarthing-dist/skills/pf-sprint/usage.md +30 -30
- package/pennyfarthing-dist/skills/pf-theme/examples.md +15 -15
- package/pennyfarthing-dist/skills/pf-theme/skill.md +6 -6
- package/pennyfarthing-dist/skills/pf-theme/usage.md +5 -5
- package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -27
- package/pennyfarthing-dist/skills/pf-workflow/skill.md +11 -11
- package/pennyfarthing-dist/skills/pf-workflow/usage.md +11 -11
- package/pennyfarthing-dist/skills/skill-registry.yaml +19 -19
- package/pennyfarthing-dist/templates/settings.local.json.template +11 -11
- package/pennyfarthing-dist/workflows/bdd-team.yaml +89 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
- package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +47 -0
- package/pennyfarthing-dist/workflows/tdd-team.yaml +80 -0
- package/pennyfarthing_scripts/__init__.py +1 -1
- 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__/pretooluse_hook.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/bc/__pycache__/split.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/cli.py +2 -2
- package/pennyfarthing_scripts/bellmode_hook.py +2 -5
- 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__/audit_log_panel.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__/context_meter_footer.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__/events.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__/portrait.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.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/audit_log_panel.py +48 -6
- package/pennyfarthing_scripts/bikerack/launcher.py +6 -6
- package/pennyfarthing_scripts/bikerack/progress_panel.py +0 -1
- package/pennyfarthing_scripts/bikerack/sprint_panel.py +1 -1
- package/pennyfarthing_scripts/bikerack/story_detail_data.py +4 -1
- package/pennyfarthing_scripts/bikerack/story_detail_screen.py +2 -1
- package/pennyfarthing_scripts/bikerack/tui.py +12 -2
- package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
- 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/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/common/config.py +29 -2
- 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/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/cli.py +3 -3
- package/pennyfarthing_scripts/context.py +3 -3
- 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/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-314.pyc +0 -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/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__/hooks_installer.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/worktree.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/hooks_installer.py +2 -3
- package/pennyfarthing_scripts/git/status_all.py +1 -1
- package/pennyfarthing_scripts/git/worktree.py +2 -2
- package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -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__/phase_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -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/__init__.py +8 -3
- package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/bell_mode.py +0 -1
- package/pennyfarthing_scripts/hooks/pre_edit_check.py +0 -1
- package/pennyfarthing_scripts/hooks/reflector_check.py +1 -2
- package/pennyfarthing_scripts/hooks/schema_validation.py +0 -1
- package/pennyfarthing_scripts/hooks/session_start.py +6 -8
- package/pennyfarthing_scripts/hooks/statusline.py +10 -1
- 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__/heatmap.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/heatmap.py +3 -15
- package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/session/__pycache__/cli.cpython-314.pyc +0 -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/sprint/cli.py +121 -0
- package/pennyfarthing_scripts/sprint/loader.py +154 -3
- package/pennyfarthing_scripts/sprint/story_update.py +7 -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_workflow_list_team.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_bikerack.py +26 -26
- package/pennyfarthing_scripts/tests/test_dialogue_manager.py +0 -1
- package/pennyfarthing_scripts/tests/test_workflow_list_team.py +147 -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__/tandem_awareness.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/team_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/team_mode.py +323 -0
- package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/team_lifecycle.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/cli.py +15 -14
- package/pennyfarthing_scripts/workflow/state.py +0 -1
- package/pennyfarthing_scripts/workflow/team_lifecycle.py +3 -4
- package/packages/core/dist/cli/cyclist-migration.test.d.ts +0 -16
- package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +0 -1
- package/packages/core/dist/cli/cyclist-migration.test.js +0 -229
- package/packages/core/dist/cli/cyclist-migration.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/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/theme-detail.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/theme-detail.test.js.map +0 -1
- 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__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/dialogue_manager.cpython-314.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_108_1_gate_migration.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_dialogue_manager.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Pennyfarthing
|
|
2
2
|
|
|
3
|
-
**v11.2.
|
|
3
|
+
**v11.2.2** | *The outer loop goes once, the inner loop goes many times.*
|
|
4
4
|
|
|
5
5
|
<img src="pennyfarthing.png" alt="Pennyfarthing Logo" width="75" style="float:left; margin:10px">
|
|
6
6
|
|
|
@@ -45,35 +45,61 @@ The 98 persona themes (Discworld, Star Trek, Breaking Bad, etc.) are instruments
|
|
|
45
45
|
|
|
46
46
|
## Quick Start
|
|
47
47
|
|
|
48
|
+
### Install
|
|
49
|
+
|
|
48
50
|
```bash
|
|
49
51
|
cd your-project
|
|
50
52
|
|
|
51
|
-
# Install
|
|
53
|
+
# Install core package
|
|
52
54
|
npm install --save-dev @pennyfarthing/core
|
|
53
55
|
|
|
54
|
-
# Initialize (creates symlinks)
|
|
56
|
+
# Initialize project (creates .pennyfarthing/, .claude/ symlinks)
|
|
55
57
|
npx pennyfarthing init
|
|
56
58
|
|
|
57
59
|
# Verify installation
|
|
58
60
|
npx pennyfarthing doctor
|
|
59
61
|
|
|
60
|
-
# Start working (
|
|
61
|
-
/
|
|
62
|
+
# Start working (inside Claude Code)
|
|
63
|
+
/pf-work
|
|
62
64
|
```
|
|
63
65
|
|
|
64
|
-
###
|
|
66
|
+
### Choose How to Work
|
|
67
|
+
|
|
68
|
+
Pennyfarthing works in any terminal, but optional dashboards give you real-time visibility into what agents are doing. Pick the mode that fits your workflow:
|
|
69
|
+
|
|
70
|
+
| I want to... | Mode | Command |
|
|
71
|
+
|--------------|------|---------|
|
|
72
|
+
| Just use agents in my terminal | **CLI only** | `claude` (no dashboard needed) |
|
|
73
|
+
| See dashboards in my browser | **BikeRack GUI** | `just gui` + `just claude` |
|
|
74
|
+
| Stay fully in the terminal | **BikeRack TUI** | `just tui` + `just claude` |
|
|
75
|
+
| One command, everything | **BikeRack all-in-one** | `pf bikerack start` |
|
|
76
|
+
| Full desktop app with embedded terminal | **Cyclist** | `npx pennyfarthing cyclist` |
|
|
77
|
+
|
|
78
|
+
```mermaid
|
|
79
|
+
graph LR
|
|
80
|
+
subgraph "CLI Only"
|
|
81
|
+
A["claude"] --> B["Agents work in your terminal<br/>No dashboard"]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
subgraph "BikeRack (dashboard + your terminal)"
|
|
85
|
+
C["just gui / just tui"] --> D["WheelHub Server"]
|
|
86
|
+
E["just claude"] --> D
|
|
87
|
+
D --> F["Dashboard panels<br/>(browser or TUI)"]
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
subgraph "Cyclist (all-in-one desktop app)"
|
|
91
|
+
G["pennyfarthing cyclist"] --> H["Electron app<br/>Embedded terminal + panels"]
|
|
92
|
+
end
|
|
93
|
+
```
|
|
65
94
|
|
|
66
|
-
|
|
67
|
-
# Install Cyclist (includes portraits)
|
|
68
|
-
npm install --save-dev @pennyfarthing/cyclist
|
|
95
|
+
> **See the full [BikeRack Guide](pennyfarthing-dist/guides/bikerack.md)** for detailed quickstart paths, OTEL telemetry setup, and command reference.
|
|
69
96
|
|
|
70
|
-
|
|
71
|
-
npx pennyfarthing cyclist
|
|
72
|
-
```
|
|
97
|
+
## Visual Dashboards
|
|
73
98
|
|
|
74
|
-
|
|
99
|
+
Whether you use Cyclist or BikeRack, you get the same 17 dashboard panels showing real-time agent activity:
|
|
75
100
|
|
|
76
|
-
|
|
101
|
+
<!-- TODO: Screenshot of Cyclist with multiple panels visible -->
|
|
102
|
+
<!--  -->
|
|
77
103
|
|
|
78
104
|
### Panels
|
|
79
105
|
|
|
@@ -81,49 +107,83 @@ All panels are draggable, floatable, and splittable:
|
|
|
81
107
|
|
|
82
108
|
| Panel | Purpose |
|
|
83
109
|
|-------|---------|
|
|
84
|
-
| **Message** | Conversation stream (
|
|
110
|
+
| **Message** | Conversation stream (Cyclist only) |
|
|
85
111
|
| **Sprint** | Current sprint stories and progress |
|
|
86
112
|
| **Progress** | At-a-glance story dashboard |
|
|
87
|
-
| **BikeLane** |
|
|
113
|
+
| **BikeLane** | Workflow phase state and navigation |
|
|
88
114
|
| **AC** | Acceptance criteria checklist with progress |
|
|
89
|
-
| **
|
|
90
|
-
| **
|
|
91
|
-
| **
|
|
92
|
-
| **Git** | Branch management and git operations |
|
|
115
|
+
| **Changed** | Files modified during the session |
|
|
116
|
+
| **Diffs** | Git diff viewer for current changes |
|
|
117
|
+
| **Git** | Branch management and status |
|
|
93
118
|
| **Todo** | Task list tracking |
|
|
94
|
-
| **Audit Log** | Timestamped
|
|
95
|
-
| **
|
|
119
|
+
| **Audit Log** | Timestamped tool use history |
|
|
120
|
+
| **Workflow** | Workflow navigation and status |
|
|
121
|
+
| **Hotspots** | Codebase health — dead code, complexity |
|
|
122
|
+
| **Settings** | Permission mode, relay mode, bell mode |
|
|
96
123
|
| **Debug** | Prime context inspection with token counts |
|
|
97
124
|
| **Background** | Background job monitoring |
|
|
98
|
-
| **Workflow** | Workflow navigation and status |
|
|
99
|
-
| **Hotspots** | Codebase health — dead code, complexity, dependencies |
|
|
100
125
|
|
|
101
|
-
|
|
126
|
+
<!-- TODO: Screenshot of BikeRack TUI -->
|
|
127
|
+
<!--  -->
|
|
102
128
|
|
|
103
|
-
Cyclist
|
|
129
|
+
### Cyclist vs BikeRack
|
|
104
130
|
|
|
105
|
-
|
|
131
|
+
| | Cyclist | BikeRack |
|
|
132
|
+
|---|---------|----------|
|
|
133
|
+
| **Runtime** | Electron desktop app | Node.js server + browser/TUI |
|
|
134
|
+
| **Terminal** | Embedded (node-pty) | Your own terminal |
|
|
135
|
+
| **Conversation UI** | Built-in MessagePanel | Not included (by design) |
|
|
136
|
+
| **Dashboard panels** | 17 Dockview panels | Same 17 panels |
|
|
137
|
+
| **OTEL telemetry** | Automatic | Via `just claude` or `pf bikerack start` |
|
|
138
|
+
| **Install** | `npm i @pennyfarthing/cyclist` | Included in `@pennyfarthing/core` |
|
|
106
139
|
|
|
107
|
-
|
|
108
|
-
|------|-------------|
|
|
109
|
-
| **Permission Mode** | `plan` / `manual` / `accept` — controls how much Claude can do without approval |
|
|
110
|
-
| **Relay Mode** | Automatic agent handoffs — detects `CYCLIST:HANDOFF` markers and runs the next agent |
|
|
111
|
-
| **Bell Mode** | Queue messages while Claude works — injected at next tool execution via hooks |
|
|
140
|
+
### Architecture
|
|
112
141
|
|
|
113
|
-
|
|
142
|
+
Both Cyclist and BikeRack are wrappers around **WheelHub**, the shared Express/WebSocket server that serves API endpoints, WebSocket channels, and the OTLP telemetry receiver:
|
|
114
143
|
|
|
115
|
-
|
|
144
|
+
```mermaid
|
|
145
|
+
graph TB
|
|
146
|
+
subgraph "Cyclist (Electron)"
|
|
147
|
+
C["Electron + React UI"]
|
|
148
|
+
end
|
|
149
|
+
subgraph "BikeRack (CLI)"
|
|
150
|
+
BR["Node.js server"]
|
|
151
|
+
end
|
|
116
152
|
|
|
117
|
-
|
|
153
|
+
C --> WH["WheelHub<br/>(shared server)"]
|
|
154
|
+
BR --> WH
|
|
118
155
|
|
|
119
|
-
|
|
156
|
+
C -- "writes" --> CP[".cyclist-port"]
|
|
157
|
+
BR -- "writes" --> BP[".bikerack-port"]
|
|
120
158
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
159
|
+
WH --> API["/api/* endpoints"]
|
|
160
|
+
WH --> WS["/ws/* channels"]
|
|
161
|
+
WH --> OTLP["/v1/* OTLP receiver"]
|
|
124
162
|
```
|
|
125
163
|
|
|
126
|
-
|
|
164
|
+
> **See [Cyclist Architecture](docs/CYCLIST-ARCHITECTURE.md)** for the full component breakdown and codename glossary.
|
|
165
|
+
|
|
166
|
+
### Tool Visualization
|
|
167
|
+
|
|
168
|
+
<!-- TODO: Screenshot of tool call rendering -->
|
|
169
|
+
<!--  -->
|
|
170
|
+
|
|
171
|
+
Cyclist and BikeRack render tool use as human-readable summaries instead of raw JSON. Consecutive identical tool calls are stacked, and results are collapsible.
|
|
172
|
+
|
|
173
|
+
### Agent Portraits
|
|
174
|
+
|
|
175
|
+
<!-- TODO: Screenshot of agent portrait in conversation -->
|
|
176
|
+
<!--  -->
|
|
177
|
+
|
|
178
|
+
Each of the 319 persona characters across 29 themes has a unique portrait displayed in the conversation stream, making multi-agent workflows visually distinct.
|
|
179
|
+
|
|
180
|
+
### Workflow Modes
|
|
181
|
+
|
|
182
|
+
| Mode | Description |
|
|
183
|
+
|------|-------------|
|
|
184
|
+
| **Permission Mode** | `plan` / `manual` / `accept` — controls how much Claude can do without approval |
|
|
185
|
+
| **Relay Mode** | Automatic agent handoffs — detects `CYCLIST:HANDOFF` markers and runs the next agent |
|
|
186
|
+
| **Bell Mode** | Queue messages while Claude works — injected at next tool execution via hooks |
|
|
127
187
|
|
|
128
188
|
## Prime Context System
|
|
129
189
|
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAwBA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA8HzE;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAwBA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA8HzE;AAm+DD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA+JnE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAkF1E;AAqFD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAsIlE"}
|
|
@@ -196,7 +196,7 @@ function checkCoreFiles(projectRoot, manifest) {
|
|
|
196
196
|
* Check commands and skills are properly copied (not symlinked) and up to date.
|
|
197
197
|
* Commands and skills are file copies since v11.3.0 to avoid node_modules drift.
|
|
198
198
|
*/
|
|
199
|
-
function checkCommandsAndSkills(projectRoot,
|
|
199
|
+
function checkCommandsAndSkills(projectRoot, _nodeModulesPath) {
|
|
200
200
|
const results = [];
|
|
201
201
|
// Use assetsPath for source resolution (correct pf-* prefix in dogfood)
|
|
202
202
|
let assetsPath = null;
|
|
@@ -530,6 +530,9 @@ function checkUserFiles(projectRoot) {
|
|
|
530
530
|
// Check SessionStart hooks are configured (critical for PROJECT_ROOT)
|
|
531
531
|
const hookCheck = checkSessionStartHooks(projectRoot, installationType);
|
|
532
532
|
results.push(hookCheck);
|
|
533
|
+
// Check OTEL auto-configuration (WheelHub auto-start + telemetry env vars)
|
|
534
|
+
const otelCheck = checkOtelAutoStart(projectRoot, installationType);
|
|
535
|
+
results.push(otelCheck);
|
|
533
536
|
// Check auto-load-sm hook is configured (auto-invokes /sm on new sessions)
|
|
534
537
|
const autoLoadSmCheck = checkAutoLoadSmHook(projectRoot);
|
|
535
538
|
results.push(autoLoadSmCheck);
|
|
@@ -654,7 +657,7 @@ function checkSessionStartHooks(projectRoot, installationType) {
|
|
|
654
657
|
const hasSessionStartHook = settings.hooks.SessionStart.some((entry) => {
|
|
655
658
|
if (typeof entry === 'object' && entry !== null) {
|
|
656
659
|
const hookEntry = entry;
|
|
657
|
-
return hookEntry.hooks?.some(h => h.command?.includes('pf hooks session-start') || h.command?.includes('session-start.sh'));
|
|
660
|
+
return hookEntry.hooks?.some(h => h.command?.includes('pf.sh hooks session-start') || h.command?.includes('pf hooks session-start') || h.command?.includes('session-start.sh'));
|
|
658
661
|
}
|
|
659
662
|
return false;
|
|
660
663
|
});
|
|
@@ -682,6 +685,96 @@ function checkSessionStartHooks(projectRoot, installationType) {
|
|
|
682
685
|
};
|
|
683
686
|
}
|
|
684
687
|
}
|
|
688
|
+
/**
|
|
689
|
+
* Check that session-start hook uses `pf hooks session-start` (Python version)
|
|
690
|
+
* which handles WheelHub auto-start + OTEL env var configuration.
|
|
691
|
+
* Legacy .sh hooks only set 2 of 5 required OTEL vars, breaking telemetry.
|
|
692
|
+
*/
|
|
693
|
+
function checkOtelAutoStart(projectRoot, installationType) {
|
|
694
|
+
const settingsPath = join(projectRoot, '.claude/settings.local.json');
|
|
695
|
+
try {
|
|
696
|
+
const settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
697
|
+
if (!settings.hooks?.SessionStart) {
|
|
698
|
+
return {
|
|
699
|
+
name: 'settings/otel-auto-start',
|
|
700
|
+
status: 'warn',
|
|
701
|
+
detail: 'No SessionStart hooks — WheelHub auto-start and OTEL not configured',
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
// Check if `pf hooks session-start` is used (Python version with full OTEL support)
|
|
705
|
+
const hasPfHooksSessionStart = settings.hooks.SessionStart.some((entry) => {
|
|
706
|
+
if (typeof entry === 'object' && entry !== null) {
|
|
707
|
+
const hookEntry = entry;
|
|
708
|
+
return hookEntry.hooks?.some(h => h.command?.includes('pf.sh hooks session-start') || h.command?.includes('pf hooks session-start'));
|
|
709
|
+
}
|
|
710
|
+
return false;
|
|
711
|
+
});
|
|
712
|
+
if (hasPfHooksSessionStart) {
|
|
713
|
+
return {
|
|
714
|
+
name: 'settings/otel-auto-start',
|
|
715
|
+
status: 'pass',
|
|
716
|
+
detail: undefined,
|
|
717
|
+
};
|
|
718
|
+
}
|
|
719
|
+
// Check if using legacy .sh (only sets 2 of 5 OTEL vars)
|
|
720
|
+
const hasLegacySh = settings.hooks.SessionStart.some((entry) => {
|
|
721
|
+
if (typeof entry === 'object' && entry !== null) {
|
|
722
|
+
const hookEntry = entry;
|
|
723
|
+
return hookEntry.hooks?.some(h => h.command?.includes('session-start.sh'));
|
|
724
|
+
}
|
|
725
|
+
return false;
|
|
726
|
+
});
|
|
727
|
+
if (hasLegacySh) {
|
|
728
|
+
return {
|
|
729
|
+
name: 'settings/otel-auto-start',
|
|
730
|
+
status: 'warn',
|
|
731
|
+
detail: 'Using legacy session-start.sh — missing WheelHub auto-start and 3 OTEL env vars. Migrate to `pf hooks session-start`',
|
|
732
|
+
fix: () => {
|
|
733
|
+
migrateSessionStartToPfHooks(projectRoot);
|
|
734
|
+
},
|
|
735
|
+
};
|
|
736
|
+
}
|
|
737
|
+
return {
|
|
738
|
+
name: 'settings/otel-auto-start',
|
|
739
|
+
status: 'warn',
|
|
740
|
+
detail: 'session-start hook not found — WheelHub auto-start and OTEL not configured',
|
|
741
|
+
fix: () => {
|
|
742
|
+
addSessionStartHooks(projectRoot, installationType);
|
|
743
|
+
},
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
catch {
|
|
747
|
+
return {
|
|
748
|
+
name: 'settings/otel-auto-start',
|
|
749
|
+
status: 'warn',
|
|
750
|
+
detail: 'Could not parse settings.local.json',
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
/**
|
|
755
|
+
* Migrate legacy session-start.sh hooks to `pf hooks session-start`
|
|
756
|
+
*/
|
|
757
|
+
function migrateSessionStartToPfHooks(projectRoot) {
|
|
758
|
+
const settingsPath = join(projectRoot, '.claude/settings.local.json');
|
|
759
|
+
try {
|
|
760
|
+
const settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
761
|
+
if (Array.isArray(settings.hooks?.SessionStart)) {
|
|
762
|
+
for (const entry of settings.hooks.SessionStart) {
|
|
763
|
+
if (typeof entry === 'object' && entry !== null && Array.isArray(entry.hooks)) {
|
|
764
|
+
for (const h of entry.hooks) {
|
|
765
|
+
if (h.command?.includes('session-start.sh')) {
|
|
766
|
+
h.command = '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks session-start';
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
|
|
773
|
+
}
|
|
774
|
+
catch {
|
|
775
|
+
// Silent fail — doctor will re-report on next run
|
|
776
|
+
}
|
|
777
|
+
}
|
|
685
778
|
/**
|
|
686
779
|
* Check that auto-load-sm hook is configured in SessionStart
|
|
687
780
|
* This auto-invokes /sm agent on new session start
|
|
@@ -832,7 +925,7 @@ function checkStopHook(projectRoot, installationType) {
|
|
|
832
925
|
const hasReflectorHook = settings.hooks.Stop.some((entry) => {
|
|
833
926
|
if (typeof entry === 'object' && entry !== null) {
|
|
834
927
|
const hookEntry = entry;
|
|
835
|
-
return hookEntry.hooks?.some(h => h.command?.includes('pf hooks reflector-check') || h.command?.includes('question-reflector-check'));
|
|
928
|
+
return hookEntry.hooks?.some(h => h.command?.includes('pf.sh hooks reflector-check') || h.command?.includes('pf hooks reflector-check') || h.command?.includes('question-reflector-check'));
|
|
836
929
|
}
|
|
837
930
|
return false;
|
|
838
931
|
});
|
|
@@ -883,7 +976,7 @@ function checkContextCircuitBreaker(projectRoot, installationType) {
|
|
|
883
976
|
const hasCircuitBreaker = settings.hooks.PreToolUse.some((entry) => {
|
|
884
977
|
if (typeof entry === 'object' && entry !== null) {
|
|
885
978
|
const hookEntry = entry;
|
|
886
|
-
return hookEntry.hooks?.some(h => h.command?.includes('pf hooks context-breaker') || h.command?.includes('context-circuit-breaker'));
|
|
979
|
+
return hookEntry.hooks?.some(h => h.command?.includes('pf.sh hooks context-breaker') || h.command?.includes('pf hooks context-breaker') || h.command?.includes('context-circuit-breaker'));
|
|
887
980
|
}
|
|
888
981
|
return false;
|
|
889
982
|
});
|
|
@@ -921,7 +1014,7 @@ function addContextCircuitBreaker(projectRoot, _installationType) {
|
|
|
921
1014
|
hooks: [
|
|
922
1015
|
{
|
|
923
1016
|
type: 'command',
|
|
924
|
-
command: 'pf hooks context-breaker'
|
|
1017
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks context-breaker'
|
|
925
1018
|
}
|
|
926
1019
|
]
|
|
927
1020
|
};
|
|
@@ -1009,7 +1102,7 @@ function addSchemaValidationHook(projectRoot, _installationType) {
|
|
|
1009
1102
|
hooks: [
|
|
1010
1103
|
{
|
|
1011
1104
|
type: 'command',
|
|
1012
|
-
command: 'pf hooks schema-validation'
|
|
1105
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks schema-validation'
|
|
1013
1106
|
}
|
|
1014
1107
|
]
|
|
1015
1108
|
};
|
|
@@ -1059,7 +1152,7 @@ function checkPostToolUseHook(projectRoot, installationType) {
|
|
|
1059
1152
|
const hasBellModeHook = settings.hooks.PostToolUse.some((entry) => {
|
|
1060
1153
|
if (typeof entry === 'object' && entry !== null) {
|
|
1061
1154
|
const hookEntry = entry;
|
|
1062
|
-
return hookEntry.hooks?.some(h => h.command?.includes('pf hooks bell-mode') || h.command?.includes('bell-mode-hook'));
|
|
1155
|
+
return hookEntry.hooks?.some(h => h.command?.includes('pf.sh hooks bell-mode') || h.command?.includes('pf hooks bell-mode') || h.command?.includes('bell-mode-hook'));
|
|
1063
1156
|
}
|
|
1064
1157
|
return false;
|
|
1065
1158
|
});
|
|
@@ -1098,7 +1191,7 @@ function addPostToolUseHook(projectRoot, _installationType) {
|
|
|
1098
1191
|
hooks: [
|
|
1099
1192
|
{
|
|
1100
1193
|
type: 'command',
|
|
1101
|
-
command: 'pf hooks bell-mode'
|
|
1194
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks bell-mode'
|
|
1102
1195
|
}
|
|
1103
1196
|
]
|
|
1104
1197
|
};
|
|
@@ -1148,7 +1241,7 @@ function checkSprintYamlValidationHook(projectRoot, installationType) {
|
|
|
1148
1241
|
const hasSprintYamlValidation = settings.hooks.PostToolUse.some((entry) => {
|
|
1149
1242
|
if (typeof entry === 'object' && entry !== null) {
|
|
1150
1243
|
const hookEntry = entry;
|
|
1151
|
-
return hookEntry.hooks?.some(h => h.command?.includes('pf hooks sprint-yaml') || h.command?.includes('sprint-yaml-validation'));
|
|
1244
|
+
return hookEntry.hooks?.some(h => h.command?.includes('pf.sh hooks sprint-yaml') || h.command?.includes('pf hooks sprint-yaml') || h.command?.includes('sprint-yaml-validation'));
|
|
1152
1245
|
}
|
|
1153
1246
|
return false;
|
|
1154
1247
|
});
|
|
@@ -1187,7 +1280,7 @@ function addSprintYamlValidationHook(projectRoot, _installationType) {
|
|
|
1187
1280
|
hooks: [
|
|
1188
1281
|
{
|
|
1189
1282
|
type: 'command',
|
|
1190
|
-
command: 'pf hooks sprint-yaml'
|
|
1283
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks sprint-yaml'
|
|
1191
1284
|
}
|
|
1192
1285
|
]
|
|
1193
1286
|
};
|
|
@@ -1225,7 +1318,7 @@ function addStopHook(projectRoot, _installationType) {
|
|
|
1225
1318
|
hooks: [
|
|
1226
1319
|
{
|
|
1227
1320
|
type: 'command',
|
|
1228
|
-
command: 'pf hooks reflector-check'
|
|
1321
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks reflector-check'
|
|
1229
1322
|
}
|
|
1230
1323
|
]
|
|
1231
1324
|
},
|
|
@@ -1234,7 +1327,7 @@ function addStopHook(projectRoot, _installationType) {
|
|
|
1234
1327
|
hooks: [
|
|
1235
1328
|
{
|
|
1236
1329
|
type: 'command',
|
|
1237
|
-
command: 'pf hooks session-stop'
|
|
1330
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks session-stop'
|
|
1238
1331
|
}
|
|
1239
1332
|
]
|
|
1240
1333
|
}
|
|
@@ -1282,7 +1375,7 @@ function addSessionStartHooks(projectRoot, _installationType) {
|
|
|
1282
1375
|
hooks: [
|
|
1283
1376
|
{
|
|
1284
1377
|
type: 'command',
|
|
1285
|
-
command: 'pf hooks session-start'
|
|
1378
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks session-start'
|
|
1286
1379
|
}
|
|
1287
1380
|
]
|
|
1288
1381
|
},
|
|
@@ -1376,7 +1469,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1376
1469
|
hooks: [
|
|
1377
1470
|
{
|
|
1378
1471
|
type: 'command',
|
|
1379
|
-
command: 'pf hooks session-start'
|
|
1472
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks session-start'
|
|
1380
1473
|
}
|
|
1381
1474
|
]
|
|
1382
1475
|
},
|
|
@@ -1404,7 +1497,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1404
1497
|
hooks: [
|
|
1405
1498
|
{
|
|
1406
1499
|
type: 'command',
|
|
1407
|
-
command: 'pf hooks reflector-check'
|
|
1500
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks reflector-check'
|
|
1408
1501
|
}
|
|
1409
1502
|
]
|
|
1410
1503
|
},
|
|
@@ -1413,7 +1506,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1413
1506
|
hooks: [
|
|
1414
1507
|
{
|
|
1415
1508
|
type: 'command',
|
|
1416
|
-
command: 'pf hooks session-stop'
|
|
1509
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks session-stop'
|
|
1417
1510
|
}
|
|
1418
1511
|
]
|
|
1419
1512
|
}
|
|
@@ -1424,7 +1517,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1424
1517
|
hooks: [
|
|
1425
1518
|
{
|
|
1426
1519
|
type: 'command',
|
|
1427
|
-
command: 'pf hooks bell-mode'
|
|
1520
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks bell-mode'
|
|
1428
1521
|
}
|
|
1429
1522
|
]
|
|
1430
1523
|
},
|
|
@@ -1433,7 +1526,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1433
1526
|
hooks: [
|
|
1434
1527
|
{
|
|
1435
1528
|
type: 'command',
|
|
1436
|
-
command: 'pf hooks sprint-yaml'
|
|
1529
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks sprint-yaml'
|
|
1437
1530
|
}
|
|
1438
1531
|
]
|
|
1439
1532
|
}
|
|
@@ -1444,7 +1537,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1444
1537
|
hooks: [
|
|
1445
1538
|
{
|
|
1446
1539
|
type: 'command',
|
|
1447
|
-
command: 'pf hooks pre-edit-check'
|
|
1540
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks pre-edit-check'
|
|
1448
1541
|
}
|
|
1449
1542
|
]
|
|
1450
1543
|
},
|
|
@@ -1453,7 +1546,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1453
1546
|
hooks: [
|
|
1454
1547
|
{
|
|
1455
1548
|
type: 'command',
|
|
1456
|
-
command: 'pf hooks schema-validation'
|
|
1549
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks schema-validation'
|
|
1457
1550
|
}
|
|
1458
1551
|
]
|
|
1459
1552
|
},
|
|
@@ -1462,7 +1555,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1462
1555
|
hooks: [
|
|
1463
1556
|
{
|
|
1464
1557
|
type: 'command',
|
|
1465
|
-
command: 'pf hooks context-warning'
|
|
1558
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks context-warning'
|
|
1466
1559
|
}
|
|
1467
1560
|
]
|
|
1468
1561
|
},
|
|
@@ -1471,7 +1564,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1471
1564
|
hooks: [
|
|
1472
1565
|
{
|
|
1473
1566
|
type: 'command',
|
|
1474
|
-
command: 'pf hooks context-breaker'
|
|
1567
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks context-breaker'
|
|
1475
1568
|
}
|
|
1476
1569
|
]
|
|
1477
1570
|
},
|
|
@@ -1479,7 +1572,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1479
1572
|
hooks: [
|
|
1480
1573
|
{
|
|
1481
1574
|
type: 'command',
|
|
1482
|
-
command: 'pf hooks cyclist-pretooluse'
|
|
1575
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks cyclist-pretooluse'
|
|
1483
1576
|
}
|
|
1484
1577
|
]
|
|
1485
1578
|
}
|
|
@@ -1487,7 +1580,7 @@ function createSettingsLocalJson(projectRoot, _installationType) {
|
|
|
1487
1580
|
},
|
|
1488
1581
|
statusLine: {
|
|
1489
1582
|
type: 'command',
|
|
1490
|
-
command: 'pf hooks statusline'
|
|
1583
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks statusline'
|
|
1491
1584
|
}
|
|
1492
1585
|
};
|
|
1493
1586
|
ensureDirSync(join(projectRoot, '.claude'));
|
|
@@ -2049,7 +2142,7 @@ export function checkLegacyStatuslinePath(projectRoot) {
|
|
|
2049
2142
|
const pathMatch = command.match(/(?:\"\$CLAUDE_PROJECT_DIR\"\/)?([^\s"]+)/);
|
|
2050
2143
|
const currentPath = pathMatch ? pathMatch[1] : command;
|
|
2051
2144
|
// Check if it's the canonical pf hooks command or the legacy .sh path
|
|
2052
|
-
if (command === 'pf hooks statusline' || currentPath.includes('misc/statusline.sh') || command.includes('misc/statusline.sh')) {
|
|
2145
|
+
if (command.includes('pf.sh hooks statusline') || command === 'pf hooks statusline' || currentPath.includes('misc/statusline.sh') || command.includes('misc/statusline.sh')) {
|
|
2053
2146
|
return {
|
|
2054
2147
|
name: 'settings/statusline-path',
|
|
2055
2148
|
status: 'pass',
|
|
@@ -2070,7 +2163,7 @@ export function checkLegacyStatuslinePath(projectRoot) {
|
|
|
2070
2163
|
const updatedSettings = { ...settings };
|
|
2071
2164
|
updatedSettings.statusLine = {
|
|
2072
2165
|
type: 'command',
|
|
2073
|
-
command: 'pf hooks statusline'
|
|
2166
|
+
command: '"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh hooks statusline'
|
|
2074
2167
|
};
|
|
2075
2168
|
writeFileSync(settingsPath, JSON.stringify(updatedSettings, null, 2));
|
|
2076
2169
|
}
|
|
@@ -2126,7 +2219,7 @@ function checkLegacyHookCommands(projectRoot) {
|
|
|
2126
2219
|
}
|
|
2127
2220
|
// Also check statusLine
|
|
2128
2221
|
const statusLine = settings.statusLine;
|
|
2129
|
-
if (statusLine?.command && statusLine.command !== 'pf hooks statusline') {
|
|
2222
|
+
if (statusLine?.command && !statusLine.command.includes('pf.sh hooks statusline') && statusLine.command !== 'pf hooks statusline') {
|
|
2130
2223
|
for (const shName of Object.keys(LEGACY_HOOK_MIGRATIONS)) {
|
|
2131
2224
|
if (statusLine.command.includes(shName)) {
|
|
2132
2225
|
legacyCount++;
|
|
@@ -2148,7 +2241,7 @@ function checkLegacyHookCommands(projectRoot) {
|
|
|
2148
2241
|
}
|
|
2149
2242
|
}
|
|
2150
2243
|
// Migrate statusLine
|
|
2151
|
-
if (statusLine?.command && statusLine.command !== 'pf hooks statusline') {
|
|
2244
|
+
if (statusLine?.command && !statusLine.command.includes('pf.sh hooks statusline') && statusLine.command !== 'pf hooks statusline') {
|
|
2152
2245
|
for (const [shName, pfCommand] of Object.entries(LEGACY_HOOK_MIGRATIONS)) {
|
|
2153
2246
|
if (statusLine.command.includes(shName)) {
|
|
2154
2247
|
statusLine.command = pfCommand;
|