@pennyfarthing/core 11.2.1 → 11.3.1
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 +102 -42
- package/package.json +1 -1
- package/packages/core/dist/cli/commands/doctor-legacy.test.js +2 -2
- package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -1
- package/packages/core/dist/cli/commands/doctor.d.ts +55 -0
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +324 -50
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/commands/init.d.ts +12 -0
- package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/init.js +45 -0
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/pyproject-install.test.d.ts +19 -0
- package/packages/core/dist/cli/commands/pyproject-install.test.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/pyproject-install.test.js +261 -0
- package/packages/core/dist/cli/commands/pyproject-install.test.js.map +1 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts +17 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts.map +1 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js +470 -0
- package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js.map +1 -0
- package/packages/core/dist/cli/commands/update-consolidation.test.js +14 -6
- package/packages/core/dist/cli/commands/update-consolidation.test.js.map +1 -1
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +31 -2
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/index.js +2 -0
- package/packages/core/dist/cli/index.js.map +1 -1
- package/packages/core/dist/cli/utils/python.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/python.js +11 -0
- package/packages/core/dist/cli/utils/python.js.map +1 -1
- package/packages/core/dist/cli/utils/settings-hook-migration.test.d.ts +17 -0
- package/packages/core/dist/cli/utils/settings-hook-migration.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/settings-hook-migration.test.js +382 -0
- package/packages/core/dist/cli/utils/settings-hook-migration.test.js.map +1 -0
- 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 +45 -27
- package/packages/core/dist/cli/utils/settings.js.map +1 -1
- package/packages/core/dist/cli/utils/stale-artifacts.d.ts +59 -0
- package/packages/core/dist/cli/utils/stale-artifacts.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/stale-artifacts.js +163 -0
- package/packages/core/dist/cli/utils/stale-artifacts.js.map +1 -0
- 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 +18 -0
- package/packages/core/dist/server/settings.js.map +1 -1
- package/packages/core/dist/workflow/tandem-workflow-templates.test.js +7 -5
- package/packages/core/dist/workflow/tandem-workflow-templates.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-migration.test.js +6 -5
- package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
- 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 +19 -4
- package/pennyfarthing-dist/agents/devops.md +2 -10
- package/pennyfarthing-dist/agents/reviewer-preflight.md +4 -5
- 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 +16 -29
- 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 +31 -12
- 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/gates/{confidence-sm.md → confidence.md} +16 -17
- package/pennyfarthing-dist/gates/dev-exit.md +75 -0
- package/pennyfarthing-dist/gates/merge-ready.md +49 -0
- package/pennyfarthing-dist/gates/release-ready.md +95 -0
- package/pennyfarthing-dist/gates/reviewer-preflight-check.md +90 -0
- package/pennyfarthing-dist/gates/sm-setup-exit.md +82 -0
- package/pennyfarthing-dist/guides/agent-behavior.md +129 -20
- 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 +10 -5
- 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/find-root.sh +5 -0
- package/pennyfarthing-dist/scripts/lib/run-pf.sh +43 -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-settings/skill.md +42 -0
- 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 +34 -19
- package/pennyfarthing-dist/templates/pyproject.toml +27 -0
- package/pennyfarthing-dist/templates/settings.local.json.template +11 -11
- package/pennyfarthing-dist/workflows/bdd-tandem.yaml +7 -3
- package/pennyfarthing-dist/workflows/bdd-team.yaml +89 -0
- package/pennyfarthing-dist/workflows/bdd.yaml +7 -3
- 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/installation-check/steps/step-01-foundation.md +77 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-02-commands.md +82 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-03-hooks.md +121 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-04-scripts.md +83 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-05-layout.md +81 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-06-legacy.md +94 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-07-tools.md +80 -0
- package/pennyfarthing-dist/workflows/installation-check/steps/step-08-summary.md +99 -0
- package/pennyfarthing-dist/workflows/installation-check/workflow.yaml +47 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +47 -0
- package/pennyfarthing-dist/workflows/tdd-tandem.yaml +7 -3
- package/pennyfarthing-dist/workflows/tdd-team.yaml +80 -0
- package/pennyfarthing-dist/workflows/tdd.yaml +7 -3
- package/pennyfarthing-dist/workflows/trivial.yaml +7 -3
- package/pennyfarthing_scripts/__init__.py +1 -1
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/context.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-311.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 +23 -2
- package/pennyfarthing_scripts/bc/focus.py +1 -0
- package/pennyfarthing_scripts/bc/split.py +52 -0
- package/pennyfarthing_scripts/bellmode_hook.py +2 -5
- package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-311.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-311.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-311.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/launcher.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/context_meter_footer.py +53 -3
- 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 +214 -10
- package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
- package/pennyfarthing_scripts/cli.py +5 -0
- package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/output.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/pr_config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/config.py +29 -2
- package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-311.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-311.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-311.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-311.pyc +0 -0
- package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-311.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__/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-311.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__init__.py +8 -3
- package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-311.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-311.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-311.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-311.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/client.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/create.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/story.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-311.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-311.pyc +0 -0
- package/pennyfarthing_scripts/session/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/settings/__init__.py +0 -0
- package/pennyfarthing_scripts/settings/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/settings/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/settings/__pycache__/settings.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/settings/cli.py +55 -0
- package/pennyfarthing_scripts/settings/settings.py +98 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-311.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/tests/__pycache__/test_bikerack.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/test_bikerack.py +26 -26
- package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +17 -16
- package/pennyfarthing_scripts/tests/test_dialogue_manager.py +0 -1
- package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +45 -47
- package/pennyfarthing_scripts/tests/test_workflow_list_team.py +143 -0
- package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/team_mode.py +323 -0
- package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-311.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-311.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/workflow/__pycache__/state.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
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Step 6: Legacy Artifact Cleanup
|
|
2
|
+
|
|
3
|
+
<step-meta>
|
|
4
|
+
step: 6
|
|
5
|
+
name: legacy
|
|
6
|
+
workflow: installation-check
|
|
7
|
+
agent: devops
|
|
8
|
+
gate: true
|
|
9
|
+
next: step-07-tools
|
|
10
|
+
</step-meta>
|
|
11
|
+
|
|
12
|
+
<purpose>
|
|
13
|
+
Detect and clean up legacy artifacts from previous Pennyfarthing versions. These include old statusline scripts, persona configs at deprecated paths, legacy sidecar directories, and hook commands still using `.sh` scripts instead of `pf hooks` commands. This step has a gate because some fixes delete files.
|
|
14
|
+
</purpose>
|
|
15
|
+
|
|
16
|
+
<prerequisites>
|
|
17
|
+
- Layout check completed (step 5)
|
|
18
|
+
- User understands current vs legacy file locations
|
|
19
|
+
</prerequisites>
|
|
20
|
+
|
|
21
|
+
<instructions>
|
|
22
|
+
1. Run the doctor command for the legacy category
|
|
23
|
+
2. For each result, explain what the legacy artifact is and why it should be cleaned up:
|
|
24
|
+
- **legacy/.claude/scripts/statusline.sh**: Old statusline location that may shadow the proper `.pennyfarthing/scripts/misc/statusline.sh`.
|
|
25
|
+
- **legacy/.claude/persona-config.yaml**: Pre-v7 theme config. Should be migrated to `.pennyfarthing/config.local.yaml`.
|
|
26
|
+
- **legacy/.claude/project/agents/sidecars**: Pre-v8 sidecar location. Should be at `.pennyfarthing/sidecars/`.
|
|
27
|
+
- **legacy/sprint/sidecars**: Another pre-v8 sidecar location.
|
|
28
|
+
- **legacy/.claude/project/hooks/setup-env.sh**: Pre-v9 hook location. Should be at `.pennyfarthing/project/hooks/`.
|
|
29
|
+
- **settings/statusline-path**: settings.local.json references a legacy statusline script path.
|
|
30
|
+
- **legacy/hook-commands**: Hook entries in settings.local.json still use `.sh` script paths instead of `pf hooks` commands. The `.sh` scripts work (they're shims) but `pf hooks` is faster — no shell indirection.
|
|
31
|
+
3. For each fix, explain what will be deleted or moved and whether it's reversible
|
|
32
|
+
4. Present gate criteria — user must approve before files are deleted
|
|
33
|
+
|
|
34
|
+
**IMPORTANT:** Legacy cleanup deletes files. The user may have customized legacy locations. Always explain what will be removed before applying fixes.
|
|
35
|
+
</instructions>
|
|
36
|
+
|
|
37
|
+
<actions>
|
|
38
|
+
- Run: `pennyfarthing doctor --json --category legacy`
|
|
39
|
+
- Check: No legacy artifacts at `.claude/scripts/`, `.claude/persona-config.yaml`
|
|
40
|
+
- Check: No legacy sidecar directories
|
|
41
|
+
- Check: Hook commands use `pf hooks` not `.sh` scripts
|
|
42
|
+
</actions>
|
|
43
|
+
|
|
44
|
+
<output>
|
|
45
|
+
Present results:
|
|
46
|
+
|
|
47
|
+
```markdown
|
|
48
|
+
## Legacy Artifact Check Results
|
|
49
|
+
|
|
50
|
+
| Artifact | Status | Detail |
|
|
51
|
+
|----------|--------|--------|
|
|
52
|
+
| statusline.sh | ... | ... |
|
|
53
|
+
| persona-config.yaml | ... | ... |
|
|
54
|
+
| agent sidecars | ... | ... |
|
|
55
|
+
| sprint sidecars | ... | ... |
|
|
56
|
+
| project hooks | ... | ... |
|
|
57
|
+
| statusline path | ... | ... |
|
|
58
|
+
| hook commands | ... | ... |
|
|
59
|
+
|
|
60
|
+
### Cleanup Actions
|
|
61
|
+
[For each warning, explain what the fix will do: delete, move, or update]
|
|
62
|
+
```
|
|
63
|
+
</output>
|
|
64
|
+
|
|
65
|
+
<gate>
|
|
66
|
+
## Completion Criteria
|
|
67
|
+
- [ ] All legacy artifacts reviewed with user
|
|
68
|
+
- [ ] User understands what each cleanup action will do
|
|
69
|
+
- [ ] User approved or declined each destructive cleanup
|
|
70
|
+
- [ ] No unapproved file deletions performed
|
|
71
|
+
</gate>
|
|
72
|
+
|
|
73
|
+
<collaboration-menu>
|
|
74
|
+
- **[F] Fix** - Run `pennyfarthing doctor --fix --category legacy` to clean up (requires gate approval)
|
|
75
|
+
- **[E] Explain** - Deep dive on a specific legacy artifact's history
|
|
76
|
+
- **[C] Continue** - Approve cleanup and proceed to Tools check
|
|
77
|
+
- **[R] Recheck** - Re-run after manual cleanup
|
|
78
|
+
</collaboration-menu>
|
|
79
|
+
|
|
80
|
+
<next-step>
|
|
81
|
+
After user approves legacy cleanup, proceed to step-07-tools.md for Optional Tools verification.
|
|
82
|
+
</next-step>
|
|
83
|
+
|
|
84
|
+
## Failure Modes
|
|
85
|
+
|
|
86
|
+
- Deleting customized legacy files without checking for user modifications
|
|
87
|
+
- Not explaining that `.sh` shims still work (migration is optional optimization)
|
|
88
|
+
- Removing sidecar directories before confirming new location has the content
|
|
89
|
+
|
|
90
|
+
## Success Metrics
|
|
91
|
+
|
|
92
|
+
- All legacy artifacts addressed (cleaned up or acknowledged)
|
|
93
|
+
- User made informed decisions about each cleanup action
|
|
94
|
+
- Gate approval recorded
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Step 7: Optional Tools
|
|
2
|
+
|
|
3
|
+
<step-meta>
|
|
4
|
+
step: 7
|
|
5
|
+
name: tools
|
|
6
|
+
workflow: installation-check
|
|
7
|
+
agent: devops
|
|
8
|
+
gate: false
|
|
9
|
+
next: step-08-summary
|
|
10
|
+
</step-meta>
|
|
11
|
+
|
|
12
|
+
<purpose>
|
|
13
|
+
Check optional components that enhance but are not required for core Pennyfarthing functionality. These include the Cyclist visual terminal and the pf Python CLI.
|
|
14
|
+
</purpose>
|
|
15
|
+
|
|
16
|
+
<prerequisites>
|
|
17
|
+
- Core installation verified (steps 1-6)
|
|
18
|
+
</prerequisites>
|
|
19
|
+
|
|
20
|
+
<instructions>
|
|
21
|
+
1. Run the doctor command for the tools category
|
|
22
|
+
2. For each result, explain what the tool provides and when it's needed:
|
|
23
|
+
- **cyclist/installed**: Cyclist is the Electron visual terminal for Pennyfarthing. It provides a graphical UI with panels for sprint tracking, diffs, workflow visualization, and more. Not required for CLI-only usage.
|
|
24
|
+
- **cyclist/node-pty**: node-pty powers the terminal panel in Cyclist. Without it, the embedded terminal won't work but other panels still function.
|
|
25
|
+
- **cyclist/spawn-helper**: The native binary that node-pty uses to spawn processes. Must have execute permission on macOS/Linux. Missing permission causes `posix_spawnp` failures.
|
|
26
|
+
- **tools/pf-cli**: The Python `pf` command provides agent activation (`pf agent start`), hook dispatch (`pf hooks`), and sprint management. Required for agent workflows. Installable via `uv tool install pennyfarthing-scripts` or `pipx install pennyfarthing-scripts`.
|
|
27
|
+
3. For missing tools, explain whether they're required or optional based on the user's workflow
|
|
28
|
+
4. Present the collaboration menu
|
|
29
|
+
</instructions>
|
|
30
|
+
|
|
31
|
+
<actions>
|
|
32
|
+
- Run: `pennyfarthing doctor --json --category tools`
|
|
33
|
+
- Check: Cyclist package location and node-pty health
|
|
34
|
+
- Check: `pf` CLI is available and reports a version
|
|
35
|
+
</actions>
|
|
36
|
+
|
|
37
|
+
<output>
|
|
38
|
+
Present results:
|
|
39
|
+
|
|
40
|
+
```markdown
|
|
41
|
+
## Optional Tools Check Results
|
|
42
|
+
|
|
43
|
+
### Cyclist Visual Terminal
|
|
44
|
+
| Check | Status | Detail |
|
|
45
|
+
|-------|--------|--------|
|
|
46
|
+
| installed | ... | ... |
|
|
47
|
+
| node-pty | ... | ... |
|
|
48
|
+
| spawn-helper | ... | ... |
|
|
49
|
+
|
|
50
|
+
### Python CLI
|
|
51
|
+
| Check | Status | Detail |
|
|
52
|
+
|-------|--------|--------|
|
|
53
|
+
| pf CLI | ... | ... |
|
|
54
|
+
|
|
55
|
+
### Recommendation
|
|
56
|
+
[Based on results, recommend which tools to install for the user's use case]
|
|
57
|
+
```
|
|
58
|
+
</output>
|
|
59
|
+
|
|
60
|
+
<collaboration-menu>
|
|
61
|
+
- **[F] Fix** - Run `pennyfarthing doctor --fix --category tools` to fix permissions or install pf CLI
|
|
62
|
+
- **[E] Explain** - Deep dive on a specific tool's purpose
|
|
63
|
+
- **[C] Continue** - Proceed to Summary
|
|
64
|
+
- **[R] Recheck** - Re-run after installing tools
|
|
65
|
+
</collaboration-menu>
|
|
66
|
+
|
|
67
|
+
<next-step>
|
|
68
|
+
After reviewing tools, proceed to step-08-summary.md for the final health report.
|
|
69
|
+
</next-step>
|
|
70
|
+
|
|
71
|
+
## Failure Modes
|
|
72
|
+
|
|
73
|
+
- Installing Cyclist when only CLI usage is needed (unnecessary complexity)
|
|
74
|
+
- spawn-helper permission issues after pnpm install (common on macOS)
|
|
75
|
+
|
|
76
|
+
## Success Metrics
|
|
77
|
+
|
|
78
|
+
- User understands which tools they need
|
|
79
|
+
- Required tools (pf CLI) are installed
|
|
80
|
+
- Optional tools have clear install path if wanted
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Step 8: Health Summary
|
|
2
|
+
|
|
3
|
+
<step-meta>
|
|
4
|
+
step: 8
|
|
5
|
+
name: summary
|
|
6
|
+
workflow: installation-check
|
|
7
|
+
agent: devops
|
|
8
|
+
gate: false
|
|
9
|
+
next: complete
|
|
10
|
+
</step-meta>
|
|
11
|
+
|
|
12
|
+
<purpose>
|
|
13
|
+
Aggregate results from all previous steps into a final health report with an overall score and prioritized recommendations.
|
|
14
|
+
</purpose>
|
|
15
|
+
|
|
16
|
+
<prerequisites>
|
|
17
|
+
- All previous steps (1-7) completed
|
|
18
|
+
</prerequisites>
|
|
19
|
+
|
|
20
|
+
<instructions>
|
|
21
|
+
1. Run the full doctor command to get a complete picture
|
|
22
|
+
2. Aggregate results into a health score:
|
|
23
|
+
- **HEALTHY**: All checks pass (0 failures, 0 warnings)
|
|
24
|
+
- **GOOD**: No failures, some warnings (non-critical issues)
|
|
25
|
+
- **NEEDS_ATTENTION**: 1-3 failures (some features broken)
|
|
26
|
+
- **NEEDS_FIX**: 4+ failures (significant functionality impaired)
|
|
27
|
+
3. Group remaining issues by priority:
|
|
28
|
+
- **Critical**: Failures that break core functionality (missing settings.local.json, broken symlinks, missing manifest)
|
|
29
|
+
- **Important**: Warnings that degrade features (missing hooks, stale commands, non-executable scripts)
|
|
30
|
+
- **Optional**: Informational items (legacy artifacts, missing optional tools)
|
|
31
|
+
4. For each remaining issue, provide the specific fix command
|
|
32
|
+
5. Write the summary to the output file if configured
|
|
33
|
+
6. Suggest next steps based on the health score
|
|
34
|
+
</instructions>
|
|
35
|
+
|
|
36
|
+
<actions>
|
|
37
|
+
- Run: `pennyfarthing doctor --json`
|
|
38
|
+
- Write: `{output_file}` with full health report
|
|
39
|
+
</actions>
|
|
40
|
+
|
|
41
|
+
<output>
|
|
42
|
+
Present the final report:
|
|
43
|
+
|
|
44
|
+
```markdown
|
|
45
|
+
# Pennyfarthing Health Report
|
|
46
|
+
|
|
47
|
+
**Project:** {project_root}
|
|
48
|
+
**Version:** {installed_version} / {package_version}
|
|
49
|
+
**Mode:** {installation_type}
|
|
50
|
+
**Health:** {HEALTHY | GOOD | NEEDS_ATTENTION | NEEDS_FIX}
|
|
51
|
+
**Score:** {pass_count}/{total_count} checks passing
|
|
52
|
+
|
|
53
|
+
## Results by Category
|
|
54
|
+
|
|
55
|
+
| Category | Pass | Warn | Fail |
|
|
56
|
+
|----------|------|------|------|
|
|
57
|
+
| Installation | ... | ... | ... |
|
|
58
|
+
| Commands & Skills | ... | ... | ... |
|
|
59
|
+
| Hook Configuration | ... | ... | ... |
|
|
60
|
+
| Hook Scripts | ... | ... | ... |
|
|
61
|
+
| Directory Layout | ... | ... | ... |
|
|
62
|
+
| Legacy Artifacts | ... | ... | ... |
|
|
63
|
+
| Optional Tools | ... | ... | ... |
|
|
64
|
+
|
|
65
|
+
## Remaining Issues (by priority)
|
|
66
|
+
|
|
67
|
+
### Critical
|
|
68
|
+
[List failures with fix commands]
|
|
69
|
+
|
|
70
|
+
### Important
|
|
71
|
+
[List warnings with fix commands]
|
|
72
|
+
|
|
73
|
+
### Optional
|
|
74
|
+
[List informational items]
|
|
75
|
+
|
|
76
|
+
## Recommended Next Steps
|
|
77
|
+
1. [Based on health score]
|
|
78
|
+
2. [Specific to findings]
|
|
79
|
+
```
|
|
80
|
+
</output>
|
|
81
|
+
|
|
82
|
+
<collaboration-menu>
|
|
83
|
+
- **[F] Fix** - Run `pennyfarthing doctor --fix` to auto-repair all fixable issues
|
|
84
|
+
- **[E] Explain** - Deep dive on any remaining issue
|
|
85
|
+
- **[C] Continue** - Complete the health check workflow
|
|
86
|
+
- **[R] Recheck** - Run full check again to verify fixes
|
|
87
|
+
</collaboration-menu>
|
|
88
|
+
|
|
89
|
+
## Failure Modes
|
|
90
|
+
|
|
91
|
+
- Reporting HEALTHY when critical issues were skipped in earlier steps
|
|
92
|
+
- Not prioritizing issues (user doesn't know what to fix first)
|
|
93
|
+
|
|
94
|
+
## Success Metrics
|
|
95
|
+
|
|
96
|
+
- Complete health report generated
|
|
97
|
+
- All issues categorized by priority
|
|
98
|
+
- Clear next steps provided
|
|
99
|
+
- User has actionable path to resolve any remaining issues
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Installation Check Workflow
|
|
2
|
+
# Interactive health check with AI-guided explanation and remediation
|
|
3
|
+
#
|
|
4
|
+
# Flow: Foundation → Commands → Hooks (gate) → Scripts → Layout → Legacy (gate) → Tools → Summary
|
|
5
|
+
# Wraps `pennyfarthing doctor --category` for step-by-step guided verification
|
|
6
|
+
#
|
|
7
|
+
# Use for: onboarding, post-update verification, troubleshooting broken installs
|
|
8
|
+
|
|
9
|
+
workflow:
|
|
10
|
+
name: installation-check
|
|
11
|
+
description: Interactive installation health check with AI-guided remediation. Walks through each check category with explanation and targeted fixes.
|
|
12
|
+
version: "1.0.0"
|
|
13
|
+
type: stepped
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
path: ./steps/
|
|
17
|
+
pattern: step-{nn}-*.md
|
|
18
|
+
|
|
19
|
+
variables:
|
|
20
|
+
project_root: .
|
|
21
|
+
doctor_command: pennyfarthing doctor --json
|
|
22
|
+
output_file: .session/doctor-results.md
|
|
23
|
+
|
|
24
|
+
gates:
|
|
25
|
+
after_steps: [3, 6]
|
|
26
|
+
gate_marker: "<!-- GATE -->"
|
|
27
|
+
|
|
28
|
+
collaboration:
|
|
29
|
+
menus:
|
|
30
|
+
- key: F
|
|
31
|
+
name: Fix
|
|
32
|
+
description: Apply recommended fixes for this category
|
|
33
|
+
- key: E
|
|
34
|
+
name: Explain
|
|
35
|
+
description: Get detailed explanation of a specific check
|
|
36
|
+
- key: C
|
|
37
|
+
name: Continue
|
|
38
|
+
description: Proceed to next check category
|
|
39
|
+
- key: R
|
|
40
|
+
name: Recheck
|
|
41
|
+
description: Re-run checks after manual changes
|
|
42
|
+
|
|
43
|
+
agent: devops
|
|
44
|
+
|
|
45
|
+
triggers:
|
|
46
|
+
types: [installation-check, doctor, health-check]
|
|
47
|
+
tags: [installation, health, diagnostics]
|
|
@@ -20,6 +20,53 @@ Discover the project structure, detect repositories, identify tech stack, and ga
|
|
|
20
20
|
- User-confirmed discovery ready for repos.yaml generation
|
|
21
21
|
</output>
|
|
22
22
|
|
|
23
|
+
## PRE-FLIGHT: Environment Check
|
|
24
|
+
|
|
25
|
+
Before discovery, verify the environment is clean.
|
|
26
|
+
|
|
27
|
+
### Check for Global `pf` Installation
|
|
28
|
+
|
|
29
|
+
A globally installed `pf` CLI causes version drift between projects. All `pf`
|
|
30
|
+
invocations should go through `uv run` via the shell shims in `.pennyfarthing/scripts/`.
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Check for global pf binary
|
|
34
|
+
which pf 2>/dev/null
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**If `which pf` returns a path**, the user has a stale global install. Guide them through removal:
|
|
38
|
+
|
|
39
|
+
1. **Check the source** of the global install:
|
|
40
|
+
```bash
|
|
41
|
+
which pf
|
|
42
|
+
head -3 "$(which pf)" 2>/dev/null
|
|
43
|
+
pip3 show pennyfarthing-scripts 2>/dev/null | grep -E "^(Version|Location|Editable)"
|
|
44
|
+
uv tool list 2>/dev/null | grep pennyfarthing
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
2. **Remove based on source:**
|
|
48
|
+
|
|
49
|
+
| Source | Command |
|
|
50
|
+
|--------|---------|
|
|
51
|
+
| `uv tool` | `uv tool uninstall pennyfarthing-scripts` |
|
|
52
|
+
| `pip` (Homebrew Python) | `pip3 uninstall pennyfarthing-scripts --break-system-packages -y` |
|
|
53
|
+
| `pip` (venv/system) | `pip3 uninstall pennyfarthing-scripts -y` |
|
|
54
|
+
| `pipx` | `pipx uninstall pennyfarthing-scripts` |
|
|
55
|
+
|
|
56
|
+
3. **Verify removal:**
|
|
57
|
+
```bash
|
|
58
|
+
hash -r # Clear shell cache
|
|
59
|
+
which pf 2>/dev/null && echo "STILL INSTALLED — check for multiple installs" || echo "Clean"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
4. **Explain to user:** Pennyfarthing hooks use `uv run` to resolve `pf` from the
|
|
63
|
+
local project's `pyproject.toml`. This ensures each project runs its own version
|
|
64
|
+
of the CLI without cross-project contamination. No global install is needed.
|
|
65
|
+
|
|
66
|
+
**If `which pf` returns nothing**, the environment is clean — continue to discovery.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
23
70
|
## DISCOVERY TASKS
|
|
24
71
|
|
|
25
72
|
### 1. Detect Repository Structure
|
|
@@ -23,6 +23,10 @@ workflow:
|
|
|
23
23
|
- name: setup
|
|
24
24
|
agent: sm
|
|
25
25
|
output: [session_file, branches, story_context]
|
|
26
|
+
gate:
|
|
27
|
+
file: gates/sm-setup-exit
|
|
28
|
+
type: sm_setup_exit
|
|
29
|
+
condition: Session file created with workflow, phase, context, and branch
|
|
26
30
|
|
|
27
31
|
- name: red
|
|
28
32
|
agent: tea
|
|
@@ -41,9 +45,9 @@ workflow:
|
|
|
41
45
|
input: [failing_tests, story_context]
|
|
42
46
|
output: [implementation, passing_tests]
|
|
43
47
|
gate:
|
|
44
|
-
file: gates/
|
|
45
|
-
type:
|
|
46
|
-
condition:
|
|
48
|
+
file: gates/dev-exit
|
|
49
|
+
type: dev_exit
|
|
50
|
+
condition: Tests green, tree clean, no debug code, correct branch
|
|
47
51
|
tandem:
|
|
48
52
|
partner: architect
|
|
49
53
|
scope: file-watch
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# TDD Team Workflow - TDD with Native Team Collaboration
|
|
2
|
+
#
|
|
3
|
+
# When to use: Best for 5+ point feature stories where sustained parallel
|
|
4
|
+
# collaboration provides more value than periodic tandem consultation.
|
|
5
|
+
# Use this instead of tdd-tandem when teammates need to work alongside the
|
|
6
|
+
# lead for the full phase — e.g., Architect reviewing patterns as Dev
|
|
7
|
+
# implements, not just answering a single question.
|
|
8
|
+
#
|
|
9
|
+
# Compared to tdd-tandem: Tandem spawns a Haiku subagent for a single
|
|
10
|
+
# request/response exchange. Team mode spawns full teammate sessions that
|
|
11
|
+
# work in parallel with the lead for the entire phase duration.
|
|
12
|
+
#
|
|
13
|
+
# Team pairings:
|
|
14
|
+
# - GREEN phase: Dev (lead) + Architect — Architect reviews implementation
|
|
15
|
+
# approach and patterns in real-time via SendMessage
|
|
16
|
+
# - REVIEW phase: Reviewer (lead) + Architect — Architect validates
|
|
17
|
+
# architectural patterns during code review
|
|
18
|
+
#
|
|
19
|
+
# Fallback: When native teams are unavailable (non-interactive mode, feature
|
|
20
|
+
# flag off, or CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS not set), phases with
|
|
21
|
+
# team blocks fall back to solo execution. The lead agent works alone —
|
|
22
|
+
# consider using tdd-tandem as an alternative that works in all modes.
|
|
23
|
+
#
|
|
24
|
+
# Flow: SM → TEA → Dev (+Architect) → Reviewer (+Architect) → SM
|
|
25
|
+
|
|
26
|
+
workflow:
|
|
27
|
+
name: tdd-team
|
|
28
|
+
description: TDD with native team collaboration — architect pairing on green and review phases
|
|
29
|
+
version: "1.0.0"
|
|
30
|
+
|
|
31
|
+
phases:
|
|
32
|
+
- name: setup
|
|
33
|
+
agent: sm
|
|
34
|
+
output: [session_file, branches, story_context]
|
|
35
|
+
|
|
36
|
+
- name: red
|
|
37
|
+
agent: tea
|
|
38
|
+
input: [session_file, story_context]
|
|
39
|
+
output: [failing_tests]
|
|
40
|
+
gate:
|
|
41
|
+
file: gates/tests-fail
|
|
42
|
+
type: tests_fail
|
|
43
|
+
condition: All acceptance criteria have test coverage
|
|
44
|
+
|
|
45
|
+
- name: green
|
|
46
|
+
agent: dev
|
|
47
|
+
input: [failing_tests, story_context]
|
|
48
|
+
output: [implementation, passing_tests]
|
|
49
|
+
gate:
|
|
50
|
+
file: gates/tests-pass
|
|
51
|
+
type: tests_pass
|
|
52
|
+
condition: All tests passing, no skipped tests
|
|
53
|
+
team:
|
|
54
|
+
teammates:
|
|
55
|
+
- agent: architect
|
|
56
|
+
task: "Review implementation approach and patterns. Send observations via SendMessage as Dev works."
|
|
57
|
+
|
|
58
|
+
- name: review
|
|
59
|
+
agent: reviewer
|
|
60
|
+
input: [implementation, passing_tests]
|
|
61
|
+
output: [approval]
|
|
62
|
+
gate:
|
|
63
|
+
file: gates/approval
|
|
64
|
+
type: approval
|
|
65
|
+
condition: Code review approved, no blocking issues
|
|
66
|
+
team:
|
|
67
|
+
teammates:
|
|
68
|
+
- agent: architect
|
|
69
|
+
task: "Validate architectural patterns and coupling. Flag concerns via SendMessage."
|
|
70
|
+
|
|
71
|
+
- name: finish
|
|
72
|
+
agent: sm
|
|
73
|
+
input: [approval]
|
|
74
|
+
output: [archived_session, story_summary]
|
|
75
|
+
|
|
76
|
+
triggers:
|
|
77
|
+
tags: [team, tdd-team]
|
|
78
|
+
points:
|
|
79
|
+
min: 5
|
|
80
|
+
default: false
|
|
@@ -13,6 +13,10 @@ workflow:
|
|
|
13
13
|
- name: setup
|
|
14
14
|
agent: sm
|
|
15
15
|
output: [session_file, branches, story_context]
|
|
16
|
+
gate:
|
|
17
|
+
file: gates/sm-setup-exit
|
|
18
|
+
type: sm_setup_exit
|
|
19
|
+
condition: Session file created with workflow, phase, context, and branch
|
|
16
20
|
|
|
17
21
|
- name: red
|
|
18
22
|
agent: tea
|
|
@@ -28,9 +32,9 @@ workflow:
|
|
|
28
32
|
input: [failing_tests, story_context]
|
|
29
33
|
output: [implementation, passing_tests]
|
|
30
34
|
gate:
|
|
31
|
-
file: gates/
|
|
32
|
-
type:
|
|
33
|
-
condition:
|
|
35
|
+
file: gates/dev-exit
|
|
36
|
+
type: dev_exit
|
|
37
|
+
condition: Tests green, tree clean, no debug code, correct branch
|
|
34
38
|
|
|
35
39
|
- name: verify
|
|
36
40
|
agent: tea
|
|
@@ -13,15 +13,19 @@ workflow:
|
|
|
13
13
|
- name: setup
|
|
14
14
|
agent: sm
|
|
15
15
|
output: [session_file, branches]
|
|
16
|
+
gate:
|
|
17
|
+
file: gates/sm-setup-exit
|
|
18
|
+
type: sm_setup_exit
|
|
19
|
+
condition: Session file created with workflow, phase, and branch
|
|
16
20
|
|
|
17
21
|
- name: implement
|
|
18
22
|
agent: dev
|
|
19
23
|
input: [session_file]
|
|
20
24
|
output: [implementation]
|
|
21
25
|
gate:
|
|
22
|
-
file: gates/
|
|
23
|
-
type:
|
|
24
|
-
condition:
|
|
26
|
+
file: gates/dev-exit
|
|
27
|
+
type: dev_exit
|
|
28
|
+
condition: Tests green, tree clean, no debug code, correct branch
|
|
25
29
|
|
|
26
30
|
- name: review
|
|
27
31
|
agent: reviewer
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -29,12 +29,13 @@ from pennyfarthing_scripts.bc.focus import (
|
|
|
29
29
|
save_named_layout,
|
|
30
30
|
set_panel_focus,
|
|
31
31
|
)
|
|
32
|
+
from pennyfarthing_scripts.bc.split import set_split_layout
|
|
32
33
|
|
|
33
34
|
|
|
34
35
|
def _get_current_layout() -> dict | None:
|
|
35
36
|
"""Fetch the current layout from a running Cyclist or BikeRack server.
|
|
36
37
|
|
|
37
|
-
Reads .
|
|
38
|
+
Reads .bikerack-port (shared by both Cyclist and BikeRack) and fetches
|
|
38
39
|
the layout endpoint.
|
|
39
40
|
|
|
40
41
|
Returns:
|
|
@@ -45,7 +46,7 @@ def _get_current_layout() -> dict | None:
|
|
|
45
46
|
root = _get_root()
|
|
46
47
|
|
|
47
48
|
candidates = [
|
|
48
|
-
(root / ".
|
|
49
|
+
(root / ".bikerack-port", "/api/settings/bikerack-layout"),
|
|
49
50
|
]
|
|
50
51
|
|
|
51
52
|
for port_file, endpoint in candidates:
|
|
@@ -206,6 +207,26 @@ def clear_layout(name: str, dry_run: bool):
|
|
|
206
207
|
sys.exit(1)
|
|
207
208
|
|
|
208
209
|
|
|
210
|
+
@bc.command("split")
|
|
211
|
+
@click.argument("left")
|
|
212
|
+
@click.argument("right")
|
|
213
|
+
@click.option("--dry-run", is_flag=True, help="Show what would be done without making changes")
|
|
214
|
+
def split_layout(left: str, right: str, dry_run: bool):
|
|
215
|
+
"""Set split-pane layout with LEFT and RIGHT panels.
|
|
216
|
+
|
|
217
|
+
Example: pf bc split sprint diffs
|
|
218
|
+
"""
|
|
219
|
+
if dry_run:
|
|
220
|
+
click.echo(json.dumps({"dry_run": True, "action": "split", "left": left, "right": right}))
|
|
221
|
+
return
|
|
222
|
+
result = set_split_layout(left, right)
|
|
223
|
+
if result["success"]:
|
|
224
|
+
click.echo(json.dumps({"success": True, "split": result["data"]}))
|
|
225
|
+
else:
|
|
226
|
+
click.echo(json.dumps({"success": False, "error": result["error"]}), err=True)
|
|
227
|
+
sys.exit(1)
|
|
228
|
+
|
|
229
|
+
|
|
209
230
|
@bc.command("clear-all")
|
|
210
231
|
@click.option("--dry-run", is_flag=True, help="Show what would be done without making changes")
|
|
211
232
|
def clear_all_layouts(dry_run: bool):
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Split layout management — read/write split config in config.local.yaml.
|
|
2
|
+
|
|
3
|
+
Story 110-4: /bc split <left> <right> command support.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from pennyfarthing_scripts.bc.focus import (
|
|
11
|
+
VALID_PANELS,
|
|
12
|
+
_read_config,
|
|
13
|
+
_write_config,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def set_split_layout(
|
|
18
|
+
left: str, right: str, project_dir: Path | None = None
|
|
19
|
+
) -> dict:
|
|
20
|
+
"""Set split layout in config.local.yaml.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
left: Panel for left pane (must be in VALID_PANELS).
|
|
24
|
+
right: Panel for right pane (must be in VALID_PANELS).
|
|
25
|
+
project_dir: Override project root (for testing).
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
{success: bool, data?: dict, error?: str}
|
|
29
|
+
"""
|
|
30
|
+
if left not in VALID_PANELS:
|
|
31
|
+
return {
|
|
32
|
+
"success": False,
|
|
33
|
+
"error": f"Invalid panel '{left}'. Valid panels: {', '.join(VALID_PANELS)}",
|
|
34
|
+
}
|
|
35
|
+
if right not in VALID_PANELS:
|
|
36
|
+
return {
|
|
37
|
+
"success": False,
|
|
38
|
+
"error": f"Invalid panel '{right}'. Valid panels: {', '.join(VALID_PANELS)}",
|
|
39
|
+
}
|
|
40
|
+
if left == right:
|
|
41
|
+
return {
|
|
42
|
+
"success": False,
|
|
43
|
+
"error": f"Left and right panels must be different (both are '{left}'). Use same panel in single mode instead.",
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
config_path, config = _read_config(project_dir)
|
|
48
|
+
config["split"] = {"left": left, "right": right}
|
|
49
|
+
_write_config(config_path, config)
|
|
50
|
+
return {"success": True, "data": {"left": left, "right": right}}
|
|
51
|
+
except Exception as exc:
|
|
52
|
+
return {"success": False, "error": str(exc)}
|