@pennyfarthing/core 11.2.0 → 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 +2 -1
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +474 -66
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/commands/init.js +4 -4
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +4 -5
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/utils/constants.d.ts +3 -8
- package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/constants.js +3 -4
- package/packages/core/dist/cli/utils/constants.js.map +1 -1
- package/packages/core/dist/cli/utils/settings.d.ts +7 -0
- package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/settings.js +70 -29
- package/packages/core/dist/cli/utils/settings.js.map +1 -1
- package/packages/core/dist/cli/utils/symlinks.js +16 -16
- package/packages/core/dist/cli/utils/symlinks.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.d.ts +91 -0
- package/packages/core/dist/consultation/tandem-metrics.d.ts.map +1 -0
- package/packages/core/dist/consultation/tandem-metrics.js +131 -0
- package/packages/core/dist/consultation/tandem-metrics.js.map +1 -0
- package/packages/core/dist/consultation/tandem-metrics.test.d.ts +18 -0
- package/packages/core/dist/consultation/tandem-metrics.test.d.ts.map +1 -0
- package/packages/core/dist/consultation/tandem-metrics.test.js +457 -0
- package/packages/core/dist/consultation/tandem-metrics.test.js.map +1 -0
- package/packages/core/dist/public/css/react.css +1 -1
- package/packages/core/dist/public/js/react/react.js +14 -14
- package/packages/core/dist/server/api/agent-load.js +1 -1
- package/packages/core/dist/server/api/agent-load.js.map +1 -1
- 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 +0 -3
- package/packages/core/dist/server/server.d.ts.map +1 -1
- package/packages/core/dist/server/server.js +5 -38
- 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 +12 -23
- package/packages/core/dist/server/server.test.js.map +1 -1
- 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/shared/capabilities.d.ts +88 -0
- package/packages/core/dist/shared/capabilities.d.ts.map +1 -0
- package/packages/core/dist/shared/capabilities.js +133 -0
- package/packages/core/dist/shared/capabilities.js.map +1 -0
- package/packages/core/dist/shared/capabilities.test.d.ts +2 -0
- package/packages/core/dist/shared/capabilities.test.d.ts.map +1 -0
- package/packages/core/dist/shared/capabilities.test.js +217 -0
- package/packages/core/dist/shared/capabilities.test.js.map +1 -0
- package/packages/core/dist/shared/spawn-prompt.d.ts +47 -0
- package/packages/core/dist/shared/spawn-prompt.d.ts.map +1 -0
- package/packages/core/dist/shared/spawn-prompt.js +82 -0
- package/packages/core/dist/shared/spawn-prompt.js.map +1 -0
- package/packages/core/dist/shared/spawn-prompt.test.d.ts +2 -0
- package/packages/core/dist/shared/spawn-prompt.test.d.ts.map +1 -0
- package/packages/core/dist/shared/spawn-prompt.test.js +251 -0
- package/packages/core/dist/shared/spawn-prompt.test.js.map +1 -0
- package/packages/core/dist/workflow/tandem-workflow-templates.test.d.ts +18 -0
- package/packages/core/dist/workflow/tandem-workflow-templates.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/tandem-workflow-templates.test.js +434 -0
- package/packages/core/dist/workflow/tandem-workflow-templates.test.js.map +1 -0
- 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-schema.d.ts +32 -0
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.js +120 -0
- package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.test.js +570 -1
- package/packages/core/dist/workflow/workflow-schema.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 +21 -12
- package/pennyfarthing-dist/agents/reviewer.md +23 -4
- package/pennyfarthing-dist/agents/sm-finish.md +19 -2
- 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 +12 -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/gates/approval.md +63 -0
- package/pennyfarthing-dist/gates/confidence-sm.md +71 -0
- package/pennyfarthing-dist/gates/context-ok.md +56 -0
- package/pennyfarthing-dist/gates/evaluations/confidence-sm.md +54 -0
- package/pennyfarthing-dist/gates/quality-pass.md +67 -0
- package/pennyfarthing-dist/gates/tests-fail.md +84 -0
- package/pennyfarthing-dist/gates/tests-pass.md +79 -0
- package/pennyfarthing-dist/guides/agent-behavior.md +84 -29
- 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 +29 -29
- 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 +3 -1
- package/pennyfarthing-dist/scripts/core/pf.sh +5 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +4 -89
- 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 +4 -183
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +4 -95
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +4 -65
- package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -31
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +5 -4
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +29 -34
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +4 -71
- package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -19
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +4 -30
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -32
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +4 -65
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +4 -78
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +3 -93
- 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 +4 -301
- 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 +19 -10
- 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-dist/workflows/tdd.yaml +11 -2
- package/pennyfarthing_scripts/CLAUDE.md +19 -10
- 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__/context.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/hooks.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/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 +9 -296
- 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__/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_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 +161 -0
- package/pennyfarthing_scripts/bikerack/base_panel.py +27 -4
- package/pennyfarthing_scripts/bikerack/changed_panel.py +96 -4
- package/pennyfarthing_scripts/bikerack/context_meter_footer.py +88 -0
- package/pennyfarthing_scripts/bikerack/debug_panel.py +1 -1
- package/pennyfarthing_scripts/bikerack/diffs_panel.py +30 -0
- package/pennyfarthing_scripts/bikerack/events.py +28 -0
- package/pennyfarthing_scripts/bikerack/launcher.py +6 -6
- package/pennyfarthing_scripts/bikerack/portrait_resolver.py +139 -0
- package/pennyfarthing_scripts/bikerack/progress_panel.py +0 -1
- package/pennyfarthing_scripts/bikerack/sprint_panel.py +373 -142
- package/pennyfarthing_scripts/bikerack/story_detail_data.py +247 -0
- package/pennyfarthing_scripts/bikerack/story_detail_screen.py +177 -0
- package/pennyfarthing_scripts/bikerack/tui.py +304 -62
- package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
- package/pennyfarthing_scripts/cli.py +5 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/config.py +29 -2
- package/pennyfarthing_scripts/common/pr_config.py +38 -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/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__/repos.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/status_all.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__/cli.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__/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/handoff/cli.py +33 -1
- package/pennyfarthing_scripts/handoff/complete_phase.py +28 -0
- package/pennyfarthing_scripts/handoff/marker.py +15 -15
- package/pennyfarthing_scripts/handoff/phase_check.py +96 -0
- package/pennyfarthing_scripts/handoff/resolve_gate.py +13 -1
- package/pennyfarthing_scripts/hooks/__init__.py +442 -0
- 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 +214 -0
- package/pennyfarthing_scripts/hooks/cli.py +96 -0
- package/pennyfarthing_scripts/hooks/context_breaker.py +104 -0
- package/pennyfarthing_scripts/hooks/context_warning.py +66 -0
- package/pennyfarthing_scripts/hooks/cyclist_pretooluse.py +129 -0
- package/pennyfarthing_scripts/hooks/pre_edit_check.py +77 -0
- package/pennyfarthing_scripts/hooks/reflector_check.py +270 -0
- package/pennyfarthing_scripts/hooks/schema_validation.py +202 -0
- package/pennyfarthing_scripts/hooks/session_start.py +294 -0
- package/pennyfarthing_scripts/hooks/session_stop.py +111 -0
- package/pennyfarthing_scripts/hooks/sprint_yaml_validation.py +97 -0
- package/pennyfarthing_scripts/hooks/statusline.py +429 -0
- package/pennyfarthing_scripts/hooks.py +27 -432
- package/pennyfarthing_scripts/pretooluse_hook.py +3 -185
- package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/heatmap.py +3 -15
- package/pennyfarthing_scripts/prime/workflow.py +2 -1
- package/pennyfarthing_scripts/schema_validation_hook.py +3 -298
- package/pennyfarthing_scripts/session_start_hook.py +4 -186
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.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/cli.py +121 -0
- package/pennyfarthing_scripts/sprint/loader.py +154 -3
- package/pennyfarthing_scripts/sprint/story_update.py +26 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.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_workflow_list_team.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_sprint_panel.py +344 -265
- package/pennyfarthing_scripts/tests/test_workflow_list_team.py +147 -0
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.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/validate/adapters/workflow.py +19 -0
- package/pennyfarthing_scripts/welcome_hook.py +3 -149
- 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 +22 -20
- package/pennyfarthing_scripts/workflow/state.py +0 -1
- package/pennyfarthing_scripts/workflow/team_lifecycle.py +256 -0
- 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/theme-detail.test.d.ts +0 -10
- package/packages/core/dist/scripts/theme-detail.test.d.ts.map +0 -1
- package/packages/core/dist/scripts/theme-detail.test.js +0 -199
- package/packages/core/dist/scripts/theme-detail.test.js.map +0 -1
|
@@ -1,301 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
2
|
-
#
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
input=$(cat)
|
|
6
|
-
|
|
7
|
-
# Validate JSON
|
|
8
|
-
if ! echo "$input" | jq -e . >/dev/null 2>&1; then
|
|
9
|
-
echo "⚠ invalid input"
|
|
10
|
-
exit 0
|
|
11
|
-
fi
|
|
12
|
-
|
|
13
|
-
# Extract fields - use cwd for display only, PROJECT_ROOT for file lookups
|
|
14
|
-
cwd=$(echo "$input" | jq -r '.workspace.current_dir // empty' 2>/dev/null)
|
|
15
|
-
dir_name=$(basename "$cwd" 2>/dev/null || echo "?")
|
|
16
|
-
PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$cwd}"
|
|
17
|
-
session_id=$(echo "$input" | jq -r '.session_id // empty' 2>/dev/null)
|
|
18
|
-
|
|
19
|
-
# Model name - clean up
|
|
20
|
-
model=$(echo "$input" | jq -r '
|
|
21
|
-
if .model | type == "object" then .model.id // .model.name // "claude"
|
|
22
|
-
elif .model | type == "string" then .model
|
|
23
|
-
else "claude"
|
|
24
|
-
end
|
|
25
|
-
' 2>/dev/null)
|
|
26
|
-
[ -z "$model" ] || [ "$model" = "null" ] && model="claude"
|
|
27
|
-
model=$(echo "$model" | sed 's/claude-//' | sed 's/-[0-9]*$//' | cut -c1-10)
|
|
28
|
-
|
|
29
|
-
# Git branch
|
|
30
|
-
branch=""
|
|
31
|
-
branch_dirty=""
|
|
32
|
-
if git -C "$cwd" rev-parse --git-dir > /dev/null 2>&1; then
|
|
33
|
-
branch=$(git -C "$cwd" branch --show-current 2>/dev/null)
|
|
34
|
-
[ -z "$branch" ] && branch=$(git -C "$cwd" rev-parse --short HEAD 2>/dev/null)
|
|
35
|
-
|
|
36
|
-
# Check if dirty using diff-index (doesn't lock the index like status does)
|
|
37
|
-
# This avoids "index.lock: File exists" errors when multiple Claude sessions
|
|
38
|
-
# run concurrent statusline updates during git operations
|
|
39
|
-
if ! git -C "$cwd" diff-index --quiet HEAD -- 2>/dev/null || \
|
|
40
|
-
[ -n "$(git -C "$cwd" ls-files --others --exclude-standard 2>/dev/null | head -1)" ]; then
|
|
41
|
-
branch_dirty="*"
|
|
42
|
-
fi
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
# Context percentage
|
|
46
|
-
pct="--"
|
|
47
|
-
usage=$(echo "$input" | jq '.context_window.current_usage // empty' 2>/dev/null)
|
|
48
|
-
if [ -n "$usage" ] && [ "$usage" != "null" ]; then
|
|
49
|
-
current=$(echo "$usage" | jq '.input_tokens + .cache_creation_input_tokens + .cache_read_input_tokens' 2>/dev/null)
|
|
50
|
-
size=$(echo "$input" | jq '.context_window.context_window_size // 0' 2>/dev/null)
|
|
51
|
-
if [ -n "$current" ] && [ "$current" != "null" ] && [ -n "$size" ] && [ "$size" != "null" ] && [ "$size" -gt 0 ] 2>/dev/null; then
|
|
52
|
-
pct=$((current * 100 / size))
|
|
53
|
-
fi
|
|
54
|
-
fi
|
|
55
|
-
|
|
56
|
-
# Agent abbreviation map
|
|
57
|
-
get_agent_abbrev() {
|
|
58
|
-
case "$1" in
|
|
59
|
-
pm) echo "PM" ;;
|
|
60
|
-
sm) echo "SM" ;;
|
|
61
|
-
dev) echo "DEV" ;;
|
|
62
|
-
tea) echo "TEA" ;;
|
|
63
|
-
reviewer) echo "REV" ;;
|
|
64
|
-
architect) echo "ARC" ;;
|
|
65
|
-
devops) echo "OPS" ;;
|
|
66
|
-
ux-designer) echo "UX" ;;
|
|
67
|
-
tech-writer) echo "DOC" ;;
|
|
68
|
-
orchestrator) echo "ORC" ;;
|
|
69
|
-
ba) echo "BA" ;;
|
|
70
|
-
*) echo "???" ;;
|
|
71
|
-
esac
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
# Agent and theme from session
|
|
75
|
-
agent_name=""
|
|
76
|
-
agent_abbrev=""
|
|
77
|
-
theme_display=""
|
|
78
|
-
|
|
79
|
-
# Try session_id match first, then fall back to most recent agent file
|
|
80
|
-
if [ -n "$session_id" ] && [ -f "$PROJECT_ROOT/.session/agents/${session_id}" ]; then
|
|
81
|
-
# Exact session match (ideal case)
|
|
82
|
-
agent_name=$(cat "$PROJECT_ROOT/.session/agents/${session_id}")
|
|
83
|
-
agent_abbrev=$(get_agent_abbrev "$agent_name")
|
|
84
|
-
elif [ -d "$PROJECT_ROOT/.session/agents" ]; then
|
|
85
|
-
# Fallback: use most recently modified agent file
|
|
86
|
-
# This handles the session_id mismatch between hooks
|
|
87
|
-
latest_file=$(ls -t "$PROJECT_ROOT/.session/agents/" 2>/dev/null | head -1)
|
|
88
|
-
if [ -n "$latest_file" ] && [ -f "$PROJECT_ROOT/.session/agents/$latest_file" ]; then
|
|
89
|
-
agent_name=$(cat "$PROJECT_ROOT/.session/agents/$latest_file")
|
|
90
|
-
agent_abbrev=$(get_agent_abbrev "$agent_name")
|
|
91
|
-
fi
|
|
92
|
-
fi
|
|
93
|
-
|
|
94
|
-
# Get character name from theme file (single source of truth)
|
|
95
|
-
# Priority: .pennyfarthing/config.local.yaml > .pennyfarthing/persona-config.yaml
|
|
96
|
-
config_file=""
|
|
97
|
-
if [ -f "$PROJECT_ROOT/.pennyfarthing/config.local.yaml" ]; then
|
|
98
|
-
config_file="$PROJECT_ROOT/.pennyfarthing/config.local.yaml"
|
|
99
|
-
elif [ -f "$PROJECT_ROOT/.pennyfarthing/persona-config.yaml" ]; then
|
|
100
|
-
config_file="$PROJECT_ROOT/.pennyfarthing/persona-config.yaml"
|
|
101
|
-
fi
|
|
102
|
-
|
|
103
|
-
character_display=""
|
|
104
|
-
if [ -n "$config_file" ] && [ -n "$agent_name" ]; then
|
|
105
|
-
# Get theme name from config
|
|
106
|
-
theme=$(yq '.theme' "$config_file" 2>/dev/null)
|
|
107
|
-
|
|
108
|
-
if [ -n "$theme" ] && [ "$theme" != "null" ]; then
|
|
109
|
-
# Read character directly from theme file (matches agent-session.sh behavior)
|
|
110
|
-
theme_file="$PROJECT_ROOT/.pennyfarthing/personas/themes/${theme}.yaml"
|
|
111
|
-
if [ -f "$theme_file" ]; then
|
|
112
|
-
full_name=$(yq ".agents.${agent_name}.character" "$theme_file" 2>/dev/null)
|
|
113
|
-
|
|
114
|
-
if [ -n "$full_name" ] && [ "$full_name" != "null" ]; then
|
|
115
|
-
# Smart character name extraction:
|
|
116
|
-
# 1. Remove parenthetical content: "Breq (Justice of Toren)" → "Breq"
|
|
117
|
-
# 2. Strip common titles: "Captain Kirk" → "Kirk"
|
|
118
|
-
# 3. If single word remains, use it; otherwise take last word
|
|
119
|
-
clean_name=$(echo "$full_name" | sed 's/ *([^)]*)//g' | xargs)
|
|
120
|
-
clean_name=$(echo "$clean_name" | sed -E 's/^(Captain|Lieutenant|Dr\.|Doc|Mr\.|Mrs\.|Ms\.|Admiral|Commander|Chief|Ensign|Translator|Agent|Colonel|Major|Sergeant|Professor|Lord|Lady|Sir|The) +//i')
|
|
121
|
-
word_count=$(echo "$clean_name" | wc -w | tr -d ' ')
|
|
122
|
-
if [ "$word_count" -eq 1 ]; then
|
|
123
|
-
character_display="$clean_name"
|
|
124
|
-
else
|
|
125
|
-
character_display=$(echo "$clean_name" | awk '{print $NF}')
|
|
126
|
-
fi
|
|
127
|
-
fi
|
|
128
|
-
fi
|
|
129
|
-
|
|
130
|
-
# Fallback to theme name if no character found
|
|
131
|
-
if [ -z "$character_display" ]; then
|
|
132
|
-
character_display="$(echo "${theme:0:1}" | tr '[:lower:]' '[:upper:]')${theme:1}"
|
|
133
|
-
fi
|
|
134
|
-
fi
|
|
135
|
-
fi
|
|
136
|
-
theme_display="$character_display"
|
|
137
|
-
|
|
138
|
-
# Tandem indicator: detect active backseat agent from observation files
|
|
139
|
-
# Files: .session/{storyId}-tandem-{partner}.md (created by backseat spawn, cleaned on finish)
|
|
140
|
-
tandem_partner=""
|
|
141
|
-
tandem_partner_display=""
|
|
142
|
-
if [ -d "$PROJECT_ROOT/.session" ]; then
|
|
143
|
-
tandem_file=$(find "$PROJECT_ROOT/.session" -maxdepth 1 -name "*-tandem-*.md" -print 2>/dev/null | head -1)
|
|
144
|
-
if [ -n "$tandem_file" ]; then
|
|
145
|
-
# Extract partner name from filename: {storyId}-tandem-{partner}.md
|
|
146
|
-
tandem_partner=$(basename "$tandem_file" | sed -n 's/.*-tandem-\([a-zA-Z_-]*\)\.md$/\1/p')
|
|
147
|
-
if [ -n "$tandem_partner" ] && [ -n "$theme_file" ] && [ -f "$theme_file" ]; then
|
|
148
|
-
# Look up partner's character name from theme
|
|
149
|
-
partner_full=$(yq ".agents.${tandem_partner}.character" "$theme_file" 2>/dev/null)
|
|
150
|
-
if [ -n "$partner_full" ] && [ "$partner_full" != "null" ]; then
|
|
151
|
-
partner_clean=$(echo "$partner_full" | sed 's/ *([^)]*)//g' | xargs)
|
|
152
|
-
partner_clean=$(echo "$partner_clean" | sed -E 's/^(Captain|Lieutenant|Dr\.|Doc|Mr\.|Mrs\.|Ms\.|Admiral|Commander|Chief|Ensign|Translator|Agent|Colonel|Major|Sergeant|Professor|Lord|Lady|Sir|The) +//i')
|
|
153
|
-
partner_wc=$(echo "$partner_clean" | wc -w | tr -d ' ')
|
|
154
|
-
if [ "$partner_wc" -eq 1 ]; then
|
|
155
|
-
tandem_partner_display="$partner_clean"
|
|
156
|
-
else
|
|
157
|
-
tandem_partner_display=$(echo "$partner_clean" | awk '{print $NF}')
|
|
158
|
-
fi
|
|
159
|
-
fi
|
|
160
|
-
# Fallback to agent abbreviation if no theme character
|
|
161
|
-
if [ -z "$tandem_partner_display" ]; then
|
|
162
|
-
tandem_partner_display=$(get_agent_abbrev "$tandem_partner")
|
|
163
|
-
fi
|
|
164
|
-
elif [ -n "$tandem_partner" ]; then
|
|
165
|
-
# No theme file — use abbreviation
|
|
166
|
-
tandem_partner_display=$(get_agent_abbrev "$tandem_partner")
|
|
167
|
-
fi
|
|
168
|
-
fi
|
|
169
|
-
fi
|
|
170
|
-
|
|
171
|
-
# ANSI colors
|
|
172
|
-
RESET=$'\033[0m'
|
|
173
|
-
DIM=$'\033[2m'
|
|
174
|
-
BOLD=$'\033[1m'
|
|
175
|
-
REVERSE=$'\033[7m'
|
|
176
|
-
FG_CYAN=$'\033[36m'
|
|
177
|
-
FG_GREEN=$'\033[32m'
|
|
178
|
-
FG_YELLOW=$'\033[33m'
|
|
179
|
-
FG_RED=$'\033[31m'
|
|
180
|
-
FG_MAGENTA=$'\033[35m'
|
|
181
|
-
FG_BLUE=$'\033[34m'
|
|
182
|
-
FG_WHITE=$'\033[97m'
|
|
183
|
-
FG_GRAY=$'\033[38;5;245m'
|
|
184
|
-
FG_ORANGE=$'\033[38;5;208m'
|
|
185
|
-
FG_PINK=$'\033[38;5;213m'
|
|
186
|
-
FG_TEAL=$'\033[38;5;43m'
|
|
187
|
-
FG_PURPLE=$'\033[38;5;141m'
|
|
188
|
-
FG_LIME=$'\033[38;5;154m'
|
|
189
|
-
|
|
190
|
-
# Agent color map
|
|
191
|
-
get_agent_color() {
|
|
192
|
-
case "$1" in
|
|
193
|
-
pm) echo "${FG_PURPLE}${BOLD}" ;; # Purple - strategic
|
|
194
|
-
sm) echo "${FG_BLUE}${BOLD}" ;; # Blue - coordination
|
|
195
|
-
dev) echo "${FG_GREEN}${BOLD}" ;; # Green - building
|
|
196
|
-
tea) echo "${FG_TEAL}${BOLD}" ;; # Teal - testing
|
|
197
|
-
reviewer) echo "${FG_RED}${BOLD}" ;; # Red - critical eye
|
|
198
|
-
architect) echo "${FG_ORANGE}${BOLD}" ;; # Orange - design
|
|
199
|
-
devops) echo "${FG_CYAN}${BOLD}" ;; # Cyan - infrastructure
|
|
200
|
-
ux-designer) echo "${FG_PINK}${BOLD}" ;; # Pink - design
|
|
201
|
-
tech-writer) echo "${FG_WHITE}${BOLD}" ;; # White - documentation
|
|
202
|
-
orchestrator) echo "${FG_MAGENTA}${BOLD}" ;;# Magenta - coordination
|
|
203
|
-
ba) echo "${FG_LIME}${BOLD}" ;; # Lime - discovery
|
|
204
|
-
*) echo "${FG_MAGENTA}${BOLD}" ;; # Default
|
|
205
|
-
esac
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
# Build progress bar (10 segments)
|
|
209
|
-
bar_width=10
|
|
210
|
-
if [ "$pct" != "--" ]; then
|
|
211
|
-
filled=$((pct * bar_width / 100))
|
|
212
|
-
[ "$filled" -gt "$bar_width" ] && filled=$bar_width
|
|
213
|
-
[ "$filled" -lt 0 ] && filled=0
|
|
214
|
-
|
|
215
|
-
# Color based on level
|
|
216
|
-
if [ "$pct" -gt 95 ]; then
|
|
217
|
-
bar_color="${FG_RED}${BOLD}"
|
|
218
|
-
elif [ "$pct" -gt 85 ]; then
|
|
219
|
-
bar_color="${FG_RED}"
|
|
220
|
-
elif [ "$pct" -gt 70 ]; then
|
|
221
|
-
bar_color="${FG_YELLOW}"
|
|
222
|
-
else
|
|
223
|
-
bar_color="${FG_GREEN}"
|
|
224
|
-
fi
|
|
225
|
-
|
|
226
|
-
# Build bar: filled portion with ▓, empty with ░
|
|
227
|
-
bar_filled=""
|
|
228
|
-
bar_empty=""
|
|
229
|
-
for ((i=0; i<filled; i++)); do bar_filled+="▓"; done
|
|
230
|
-
for ((i=filled; i<bar_width; i++)); do bar_empty+="░"; done
|
|
231
|
-
|
|
232
|
-
progress_bar="${bar_color}${bar_filled}${RESET}${DIM}${bar_empty}${RESET}"
|
|
233
|
-
pct_display="${bar_color}${pct}%${RESET}"
|
|
234
|
-
else
|
|
235
|
-
progress_bar="${DIM}░░░░░░░░░░${RESET}"
|
|
236
|
-
pct_display="${FG_GRAY}--%${RESET}"
|
|
237
|
-
fi
|
|
238
|
-
|
|
239
|
-
# Branch color (yellow if dirty, green if clean)
|
|
240
|
-
if [ -n "$branch_dirty" ]; then
|
|
241
|
-
branch_color="${FG_YELLOW}"
|
|
242
|
-
else
|
|
243
|
-
branch_color="${FG_GREEN}"
|
|
244
|
-
fi
|
|
245
|
-
|
|
246
|
-
# Fixed-width formatting using printf
|
|
247
|
-
# Agent+Theme: ~20 chars, Repo: 14 chars, Branch: 12 chars, Model: 10 chars
|
|
248
|
-
repo_fmt=$(printf "%-14s" "$dir_name")
|
|
249
|
-
branch_fmt=$(printf "%-12s" "${branch}${branch_dirty}")
|
|
250
|
-
model_fmt=$(printf "%-10s" "$model")
|
|
251
|
-
|
|
252
|
-
# Build tandem suffix: "+ Partner" when backseat agent is active
|
|
253
|
-
tandem_suffix=""
|
|
254
|
-
tandem_suffix_len=0
|
|
255
|
-
if [ -n "$tandem_partner_display" ]; then
|
|
256
|
-
partner_color=$(get_agent_color "$tandem_partner")
|
|
257
|
-
tandem_suffix=" ${DIM}+${RESET} ${partner_color}${tandem_partner_display}${RESET}"
|
|
258
|
-
tandem_suffix_len=$((3 + ${#tandem_partner_display})) # " + " + name
|
|
259
|
-
fi
|
|
260
|
-
|
|
261
|
-
# Build agent display: [ROLE] Theme (+ Partner) (role in reverse text with color)
|
|
262
|
-
if [ -n "$agent_abbrev" ]; then
|
|
263
|
-
agent_color=$(get_agent_color "$agent_name")
|
|
264
|
-
# Role in reverse text with color, then theme
|
|
265
|
-
if [ -n "$theme_display" ]; then
|
|
266
|
-
agent_section="${agent_color}${REVERSE} ${agent_abbrev} ${RESET} ${DIM}${theme_display}${RESET}${tandem_suffix}"
|
|
267
|
-
# Pad to ~20 chars visual width (abbrev ~3 + spaces ~2 + theme ~10 + tandem = ~15+, pad to 20)
|
|
268
|
-
pad_len=$((18 - ${#agent_abbrev} - ${#theme_display} - tandem_suffix_len))
|
|
269
|
-
[ "$pad_len" -lt 0 ] && pad_len=0
|
|
270
|
-
padding=$(printf "%${pad_len}s" "")
|
|
271
|
-
agent_section="${agent_section}${padding}"
|
|
272
|
-
else
|
|
273
|
-
agent_section="${agent_color}${REVERSE} ${agent_abbrev} ${RESET}${tandem_suffix}"
|
|
274
|
-
pad_len=$((17 - ${#agent_abbrev} - tandem_suffix_len))
|
|
275
|
-
[ "$pad_len" -lt 0 ] && pad_len=0
|
|
276
|
-
padding=$(printf "%${pad_len}s" "")
|
|
277
|
-
agent_section="${agent_section}${padding}"
|
|
278
|
-
fi
|
|
279
|
-
else
|
|
280
|
-
# No agent - just show theme if available
|
|
281
|
-
if [ -n "$theme_display" ]; then
|
|
282
|
-
agent_section="${DIM}${theme_display}${RESET}${tandem_suffix}"
|
|
283
|
-
pad_len=$((20 - ${#theme_display} - tandem_suffix_len))
|
|
284
|
-
[ "$pad_len" -lt 0 ] && pad_len=0
|
|
285
|
-
padding=$(printf "%${pad_len}s" "")
|
|
286
|
-
agent_section="${agent_section}${padding}"
|
|
287
|
-
else
|
|
288
|
-
agent_section=$(printf "%-20s" "")
|
|
289
|
-
fi
|
|
290
|
-
fi
|
|
291
|
-
|
|
292
|
-
# Build output: [ROLE] Theme | repo | branch | model [progress] pct%
|
|
293
|
-
echo -n "${agent_section}"
|
|
294
|
-
echo -n "${DIM}│${RESET} "
|
|
295
|
-
echo -n "${FG_CYAN}${repo_fmt}${RESET}"
|
|
296
|
-
echo -n "${DIM}│${RESET} "
|
|
297
|
-
echo -n "${branch_color}${branch_fmt}${RESET}"
|
|
298
|
-
echo -n "${DIM}│${RESET} "
|
|
299
|
-
echo -n "${FG_GRAY}${model_fmt}${RESET}"
|
|
300
|
-
echo -n "${progress_bar} "
|
|
301
|
-
echo -n "${pct_display}"
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Shim: delegates to Python CLI via uv run — no global pf install needed.
|
|
3
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
|
|
4
|
+
exec_pf hooks statusline
|
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
# Sprint Scripts
|
|
2
2
|
|
|
3
|
-
Sprint management is handled by the Python CLI: `pf sprint [COMMAND]`.
|
|
3
|
+
Sprint management is handled by the Python CLI: `pf.sh sprint [COMMAND]`.
|
|
4
4
|
|
|
5
5
|
## Commands
|
|
6
6
|
|
|
7
7
|
| Command | Purpose |
|
|
8
8
|
|---------|---------|
|
|
9
|
-
| `pf sprint status` | Show current sprint status and metrics |
|
|
10
|
-
| `pf sprint backlog` | List available stories grouped by epic |
|
|
11
|
-
| `pf sprint info` | Sprint info as JSON (for Cyclist sidebar) |
|
|
12
|
-
| `pf sprint metrics` | Sprint velocity and progress metrics |
|
|
13
|
-
| `pf sprint check <id>` | Check story/epic availability (JSON) |
|
|
14
|
-
| `pf sprint future` | Show future initiatives and epics |
|
|
15
|
-
| `pf sprint new` | Initialize a new sprint |
|
|
16
|
-
| `pf sprint validate <file>` | Validate sprint YAML structure |
|
|
17
|
-
| `pf sprint archive <id>` | Archive a completed story |
|
|
18
|
-
| `pf sprint work <id>` | Start work on a story |
|
|
19
|
-
| `pf sprint story field <id> <field>` | Get a story field value |
|
|
20
|
-
| `pf sprint epic field <id> <field>` | Get an epic field value |
|
|
21
|
-
| `pf sprint epic promote <id>` | Move epic from future to current sprint |
|
|
22
|
-
| `pf sprint epic show <id>` | Show epic details |
|
|
23
|
-
| `pf sprint epic cancel <id>` | Cancel an epic |
|
|
24
|
-
| `pf sprint epic archive` | Archive completed epics |
|
|
9
|
+
| `pf.sh sprint status` | Show current sprint status and metrics |
|
|
10
|
+
| `pf.sh sprint backlog` | List available stories grouped by epic |
|
|
11
|
+
| `pf.sh sprint info` | Sprint info as JSON (for Cyclist sidebar) |
|
|
12
|
+
| `pf.sh sprint metrics` | Sprint velocity and progress metrics |
|
|
13
|
+
| `pf.sh sprint check <id>` | Check story/epic availability (JSON) |
|
|
14
|
+
| `pf.sh sprint future` | Show future initiatives and epics |
|
|
15
|
+
| `pf.sh sprint new` | Initialize a new sprint |
|
|
16
|
+
| `pf.sh sprint validate <file>` | Validate sprint YAML structure |
|
|
17
|
+
| `pf.sh sprint archive <id>` | Archive a completed story |
|
|
18
|
+
| `pf.sh sprint work <id>` | Start work on a story |
|
|
19
|
+
| `pf.sh sprint story field <id> <field>` | Get a story field value |
|
|
20
|
+
| `pf.sh sprint epic field <id> <field>` | Get an epic field value |
|
|
21
|
+
| `pf.sh sprint epic promote <id>` | Move epic from future to current sprint |
|
|
22
|
+
| `pf.sh sprint epic show <id>` | Show epic details |
|
|
23
|
+
| `pf.sh sprint epic cancel <id>` | Cancel an epic |
|
|
24
|
+
| `pf.sh sprint epic archive` | Archive completed epics |
|
|
25
25
|
|
|
26
26
|
## Usage
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
pf sprint status
|
|
30
|
-
pf sprint backlog
|
|
31
|
-
pf sprint future epic-55
|
|
32
|
-
pf sprint epic promote epic-41
|
|
29
|
+
pf.sh sprint status
|
|
30
|
+
pf.sh sprint backlog
|
|
31
|
+
pf.sh sprint future epic-55
|
|
32
|
+
pf.sh sprint epic promote epic-41
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
## Ownership
|
|
@@ -6,7 +6,7 @@ Scripts for workflow mechanics, phase transitions, and quality gates.
|
|
|
6
6
|
|
|
7
7
|
| Script | Purpose |
|
|
8
8
|
|--------|---------|
|
|
9
|
-
| `finish-story.sh` | **DEPRECATED** — forwards to `pf sprint story finish` |
|
|
9
|
+
| `finish-story.sh` | **DEPRECATED** — forwards to `pf.sh sprint story finish` |
|
|
10
10
|
| `fix-session-phase.sh` | Repair session file phase state |
|
|
11
11
|
| `check.sh` | Quality gates runner (lint, type check, tests) |
|
|
12
12
|
| `list-workflows.sh` | List available workflows |
|
|
@@ -18,7 +18,7 @@ Scripts for workflow mechanics, phase transitions, and quality gates.
|
|
|
18
18
|
## Usage
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
pf sprint story finish MSSCI-12345
|
|
21
|
+
pf.sh sprint story finish MSSCI-12345
|
|
22
22
|
.pennyfarthing/scripts/workflow/start-workflow.sh prd --mode create
|
|
23
23
|
```
|
|
24
24
|
|
|
@@ -1,20 +1,6 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# DEPRECATED: Use `pf sprint story finish` instead.
|
|
3
|
-
#
|
|
4
|
-
# This shell script had a bug where yq paths targeted .epics[].stories[]
|
|
5
|
-
# but the sprint YAML uses sharded epic files with .stories[] at root.
|
|
6
|
-
# The Python implementation (pennyfarthing_scripts.sprint.story_finish)
|
|
7
|
-
# correctly handles sharded YAML via read_sprint/write_sprint.
|
|
8
|
-
#
|
|
9
|
-
# Usage: finish-story.sh <story-id> [--dry-run]
|
|
10
|
-
|
|
11
3
|
set -euo pipefail
|
|
12
|
-
|
|
13
4
|
echo "DEPRECATED: finish-story.sh is deprecated. Forwarding to 'pf sprint story finish'." >&2
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
for arg in "$@"; do
|
|
17
|
-
ARGS+=("$arg")
|
|
18
|
-
done
|
|
19
|
-
|
|
20
|
-
exec pf sprint story finish "${ARGS[@]}"
|
|
5
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
|
|
6
|
+
exec_pf sprint story finish "$@"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
# DEPRECATED: Use `pf workflow fix-phase` instead.
|
|
3
|
-
# This shim forwards to the Python CLI for backward compatibility.
|
|
4
3
|
echo "Warning: fix-session-phase.sh is deprecated. Use: pf workflow fix-phase $*" >&2
|
|
5
|
-
|
|
4
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
|
|
5
|
+
exec_pf workflow fix-phase "$@"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
# DEPRECATED: Use `pf workflow type` instead.
|
|
3
|
-
# This shim forwards to the Python CLI for backward compatibility.
|
|
4
3
|
echo "Warning: get-workflow-type.sh is deprecated. Use: pf workflow type $*" >&2
|
|
5
|
-
|
|
4
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
|
|
5
|
+
exec_pf workflow type "$@"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
# DEPRECATED: Use `pf workflow list` instead.
|
|
3
|
-
# This shim forwards to the Python CLI for backward compatibility.
|
|
4
3
|
echo "Warning: list-workflows.sh is deprecated. Use: pf workflow list" >&2
|
|
5
|
-
|
|
4
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
|
|
5
|
+
exec_pf workflow list "$@"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
# DEPRECATED: Use `pf workflow phase-check` instead.
|
|
3
|
-
# This shim forwards to the Python CLI for backward compatibility.
|
|
4
3
|
echo "Warning: phase-owner.sh is deprecated. Use: pf workflow phase-check $*" >&2
|
|
5
|
-
|
|
4
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
|
|
5
|
+
exec_pf workflow phase-check "$@"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
# DEPRECATED: Use `pf workflow resume` instead.
|
|
3
|
-
# This shim forwards to the Python CLI for backward compatibility.
|
|
4
3
|
echo "Warning: resume-workflow.sh is deprecated. Use: pf workflow resume $*" >&2
|
|
5
|
-
|
|
4
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
|
|
5
|
+
exec_pf workflow resume "$@"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
# DEPRECATED: Use `pf workflow show` instead.
|
|
3
|
-
# This shim forwards to the Python CLI for backward compatibility.
|
|
4
3
|
echo "Warning: show-workflow.sh is deprecated. Use: pf workflow show $*" >&2
|
|
5
|
-
|
|
4
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
|
|
5
|
+
exec_pf workflow show "$@"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
# DEPRECATED: Use `pf workflow start` instead.
|
|
3
|
-
# This shim forwards to the Python CLI for backward compatibility.
|
|
4
3
|
echo "Warning: start-workflow.sh is deprecated. Use: pf workflow start $*" >&2
|
|
5
|
-
|
|
4
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
|
|
5
|
+
exec_pf workflow start "$@"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
# DEPRECATED: Use `pf workflow status` instead.
|
|
3
|
-
# This shim forwards to the Python CLI for backward compatibility.
|
|
4
3
|
echo "Warning: workflow-status.sh is deprecated. Use: pf workflow status $*" >&2
|
|
5
|
-
|
|
4
|
+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
|
|
5
|
+
exec_pf workflow status "$@"
|
|
@@ -4,80 +4,80 @@
|
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
# Focus on Sprint panel
|
|
7
|
-
pf bc sprint
|
|
7
|
+
pf.sh bc sprint
|
|
8
8
|
|
|
9
9
|
# Focus on Diffs panel
|
|
10
|
-
pf bc diffs
|
|
10
|
+
pf.sh bc diffs
|
|
11
11
|
|
|
12
12
|
# Focus on Acceptance Criteria
|
|
13
|
-
pf bc ac
|
|
13
|
+
pf.sh bc ac
|
|
14
14
|
|
|
15
15
|
# Focus on Git panel
|
|
16
|
-
pf bc git
|
|
16
|
+
pf.sh bc git
|
|
17
17
|
|
|
18
18
|
# Preview without changing
|
|
19
|
-
pf bc sprint --dry-run
|
|
19
|
+
pf.sh bc sprint --dry-run
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
## Clearing Focus
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
25
|
# Remove focus setting
|
|
26
|
-
pf bc reset
|
|
26
|
+
pf.sh bc reset
|
|
27
27
|
|
|
28
28
|
# Preview
|
|
29
|
-
pf bc reset --dry-run
|
|
29
|
+
pf.sh bc reset --dry-run
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
## Named Layouts
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
35
|
# Save current layout as "normal"
|
|
36
|
-
pf bc save normal
|
|
36
|
+
pf.sh bc save normal
|
|
37
37
|
|
|
38
38
|
# Save current layout as "review"
|
|
39
|
-
pf bc save review
|
|
39
|
+
pf.sh bc save review
|
|
40
40
|
|
|
41
41
|
# Save current layout as "debug"
|
|
42
|
-
pf bc save debug
|
|
42
|
+
pf.sh bc save debug
|
|
43
43
|
|
|
44
44
|
# List all saved layouts
|
|
45
|
-
pf bc list
|
|
45
|
+
pf.sh bc list
|
|
46
46
|
|
|
47
47
|
# Switch to review layout
|
|
48
|
-
pf bc load review
|
|
48
|
+
pf.sh bc load review
|
|
49
49
|
|
|
50
50
|
# Switch back to normal
|
|
51
|
-
pf bc load normal
|
|
51
|
+
pf.sh bc load normal
|
|
52
52
|
|
|
53
53
|
# Delete a specific layout
|
|
54
|
-
pf bc clear review
|
|
54
|
+
pf.sh bc clear review
|
|
55
55
|
|
|
56
56
|
# Delete all layouts
|
|
57
|
-
pf bc clear-all
|
|
57
|
+
pf.sh bc clear-all
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
## Common Workflows
|
|
61
61
|
|
|
62
62
|
### During code review
|
|
63
63
|
```bash
|
|
64
|
-
pf bc save normal # Save current layout first
|
|
65
|
-
pf bc diffs # Focus on diffs
|
|
64
|
+
pf.sh bc save normal # Save current layout first
|
|
65
|
+
pf.sh bc diffs # Focus on diffs
|
|
66
66
|
# ... do review ...
|
|
67
|
-
pf bc load normal # Restore normal layout
|
|
67
|
+
pf.sh bc load normal # Restore normal layout
|
|
68
68
|
```
|
|
69
69
|
|
|
70
70
|
### Debugging session
|
|
71
71
|
```bash
|
|
72
|
-
pf bc save normal
|
|
73
|
-
pf bc debug # Focus debug panel
|
|
72
|
+
pf.sh bc save normal
|
|
73
|
+
pf.sh bc debug # Focus debug panel
|
|
74
74
|
# ... debug ...
|
|
75
|
-
pf bc reset # Clear focus
|
|
75
|
+
pf.sh bc reset # Clear focus
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
### Sprint planning
|
|
79
79
|
```bash
|
|
80
|
-
pf bc sprint # Focus sprint panel
|
|
80
|
+
pf.sh bc sprint # Focus sprint panel
|
|
81
81
|
# ... review backlog ...
|
|
82
|
-
pf bc reset
|
|
82
|
+
pf.sh bc reset
|
|
83
83
|
```
|
|
@@ -16,28 +16,28 @@ Set or clear the focused panel in Cyclist/BikeRack. Save and restore named layou
|
|
|
16
16
|
|
|
17
17
|
| Command | CLI | Purpose |
|
|
18
18
|
|---------|-----|---------|
|
|
19
|
-
| `/bc sprint` | `pf bc sprint [--dry-run]` | Focus Sprint panel |
|
|
20
|
-
| `/bc git` | `pf bc git [--dry-run]` | Focus Git panel |
|
|
21
|
-
| `/bc diffs` | `pf bc diffs [--dry-run]` | Focus Diffs panel |
|
|
22
|
-
| `/bc todo` | `pf bc todo [--dry-run]` | Focus Todo panel |
|
|
23
|
-
| `/bc workflow` | `pf bc workflow [--dry-run]` | Focus Workflow panel |
|
|
24
|
-
| `/bc background` | `pf bc background [--dry-run]` | Focus Background panel |
|
|
25
|
-
| `/bc audit-log` | `pf bc audit-log [--dry-run]` | Focus Audit Log panel |
|
|
26
|
-
| `/bc changed` | `pf bc changed [--dry-run]` | Focus Changed panel |
|
|
27
|
-
| `/bc ac` | `pf bc ac [--dry-run]` | Focus Acceptance Criteria panel |
|
|
28
|
-
| `/bc debug` | `pf bc debug [--dry-run]` | Focus Debug panel |
|
|
29
|
-
| `/bc settings` | `pf bc settings [--dry-run]` | Focus Settings panel |
|
|
30
|
-
| `/bc reset` | `pf bc reset [--dry-run]` | Clear focus setting |
|
|
19
|
+
| `/bc sprint` | `pf.sh bc sprint [--dry-run]` | Focus Sprint panel |
|
|
20
|
+
| `/bc git` | `pf.sh bc git [--dry-run]` | Focus Git panel |
|
|
21
|
+
| `/bc diffs` | `pf.sh bc diffs [--dry-run]` | Focus Diffs panel |
|
|
22
|
+
| `/bc todo` | `pf.sh bc todo [--dry-run]` | Focus Todo panel |
|
|
23
|
+
| `/bc workflow` | `pf.sh bc workflow [--dry-run]` | Focus Workflow panel |
|
|
24
|
+
| `/bc background` | `pf.sh bc background [--dry-run]` | Focus Background panel |
|
|
25
|
+
| `/bc audit-log` | `pf.sh bc audit-log [--dry-run]` | Focus Audit Log panel |
|
|
26
|
+
| `/bc changed` | `pf.sh bc changed [--dry-run]` | Focus Changed panel |
|
|
27
|
+
| `/bc ac` | `pf.sh bc ac [--dry-run]` | Focus Acceptance Criteria panel |
|
|
28
|
+
| `/bc debug` | `pf.sh bc debug [--dry-run]` | Focus Debug panel |
|
|
29
|
+
| `/bc settings` | `pf.sh bc settings [--dry-run]` | Focus Settings panel |
|
|
30
|
+
| `/bc reset` | `pf.sh bc reset [--dry-run]` | Clear focus setting |
|
|
31
31
|
|
|
32
32
|
### Named Layouts
|
|
33
33
|
|
|
34
34
|
| Command | CLI | Purpose |
|
|
35
35
|
|---------|-----|---------|
|
|
36
|
-
| `/bc save <name>` | `pf bc save <name> [--dry-run]` | Save current layout from running server |
|
|
37
|
-
| `/bc load <name>` | `pf bc load <name> [--dry-run]` | Load a saved layout |
|
|
38
|
-
| `/bc list` | `pf bc list` | List all saved layouts |
|
|
39
|
-
| `/bc clear <name>` | `pf bc clear <name> [--dry-run]` | Delete a saved layout |
|
|
40
|
-
| `/bc clear-all` | `pf bc clear-all [--dry-run]` | Delete all saved layouts |
|
|
36
|
+
| `/bc save <name>` | `pf.sh bc save <name> [--dry-run]` | Save current layout from running server |
|
|
37
|
+
| `/bc load <name>` | `pf.sh bc load <name> [--dry-run]` | Load a saved layout |
|
|
38
|
+
| `/bc list` | `pf.sh bc list` | List all saved layouts |
|
|
39
|
+
| `/bc clear <name>` | `pf.sh bc clear <name> [--dry-run]` | Delete a saved layout |
|
|
40
|
+
| `/bc clear-all` | `pf.sh bc clear-all [--dry-run]` | Delete all saved layouts |
|
|
41
41
|
|
|
42
42
|
### Notes
|
|
43
43
|
|