@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
|
@@ -16,10 +16,10 @@ Manage persona themes: list available themes, view details, switch themes, creat
|
|
|
16
16
|
Show current theme or specific theme details.
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
pf theme show [name]
|
|
19
|
+
pf.sh theme show [name]
|
|
20
20
|
|
|
21
21
|
# Show extended details (OCEAN scores, quirks, catchphrases)
|
|
22
|
-
pf theme show [name] --full
|
|
22
|
+
pf.sh theme show [name] --full
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
### `/theme list`
|
|
@@ -27,7 +27,7 @@ pf theme show [name] --full
|
|
|
27
27
|
List all available themes with current theme highlighted.
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
pf theme list
|
|
30
|
+
pf.sh theme list
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
Output shows current theme marked with `*` and tier brackets: `[S]` elite, `[A]` excellent, `[B]` strong, `[C]` good, `[D]` below average, `[U]` unbenchmarked.
|
|
@@ -37,12 +37,12 @@ Output shows current theme marked with `*` and tier brackets: `[S]` elite, `[A]`
|
|
|
37
37
|
Set the active persona theme.
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
|
-
pf theme set <name>
|
|
40
|
+
pf.sh theme set <name>
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
After setting, refresh the current agent's persona:
|
|
44
44
|
```bash
|
|
45
|
-
pf agent start "sm"
|
|
45
|
+
pf.sh agent start "sm"
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
### `/theme create <name> [--base <theme>] [--user]`
|
|
@@ -51,13 +51,13 @@ Create a new custom theme by copying from a base.
|
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
53
|
# Create from default base (minimalist)
|
|
54
|
-
pf theme create my-theme
|
|
54
|
+
pf.sh theme create my-theme
|
|
55
55
|
|
|
56
56
|
# Create from specific base
|
|
57
|
-
pf theme create my-theme --base blade-runner
|
|
57
|
+
pf.sh theme create my-theme --base blade-runner
|
|
58
58
|
|
|
59
59
|
# Create as user-level theme (available across all projects)
|
|
60
|
-
pf theme create my-theme --user
|
|
60
|
+
pf.sh theme create my-theme --user
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
### `/theme maker`
|
|
@@ -90,6 +90,6 @@ Interactive wizard for AI-driven theme creation. Supports three modes:
|
|
|
90
90
|
|
|
91
91
|
<reference>
|
|
92
92
|
- **Skill:** `.claude/skills/theme/skill.md`
|
|
93
|
-
- **CLI:** `pf theme [list|show|set|create]`
|
|
93
|
+
- **CLI:** `pf.sh theme [list|show|set|create]`
|
|
94
94
|
- **Config:** `.pennyfarthing/config.local.yaml`
|
|
95
95
|
</reference>
|
|
@@ -5,7 +5,7 @@ description: UX Designer - User experience design and UI patterns
|
|
|
5
5
|
<agent-activation>
|
|
6
6
|
**FIRST:** Use Bash tool to run:
|
|
7
7
|
```bash
|
|
8
|
-
pf agent start "ux-designer"
|
|
8
|
+
source .pennyfarthing/scripts/lib/env.sh && source "$CLAUDE_PROJECT_DIR/.pennyfarthing/scripts/lib/run-pf.sh" && run_pf agent start "ux-designer"
|
|
9
9
|
```
|
|
10
10
|
This loads your persona and agent context. Adopt the character shown in the output.
|
|
11
11
|
</agent-activation>
|
|
@@ -7,7 +7,7 @@ description: Resume work or start new - smart entry point that picks up where yo
|
|
|
7
7
|
<agent-activation>
|
|
8
8
|
**FIRST:** Use Bash tool to run:
|
|
9
9
|
```bash
|
|
10
|
-
pf agent start "sm"
|
|
10
|
+
source .pennyfarthing/scripts/lib/env.sh && source "$CLAUDE_PROJECT_DIR/.pennyfarthing/scripts/lib/run-pf.sh" && run_pf agent start "sm"
|
|
11
11
|
```
|
|
12
12
|
This loads your persona and agent context. Adopt the character shown in the output.
|
|
13
13
|
</agent-activation>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<gate name="approval" model="haiku">
|
|
2
|
+
|
|
3
|
+
<purpose>
|
|
4
|
+
Verify the reviewer has issued an explicit verdict on the code review.
|
|
5
|
+
This gate runs after the Reviewer agent's review phase to confirm
|
|
6
|
+
the code has been formally approved or rejected before proceeding.
|
|
7
|
+
</purpose>
|
|
8
|
+
|
|
9
|
+
<pass>
|
|
10
|
+
Check the session file for a Reviewer Assessment section:
|
|
11
|
+
|
|
12
|
+
1. **Find verdict:** Look for `## Reviewer Assessment` section in the session file.
|
|
13
|
+
- Search for an explicit APPROVED verdict
|
|
14
|
+
- The verdict must be unambiguous — not "looks good" but "APPROVED"
|
|
15
|
+
|
|
16
|
+
2. **Verify completeness:** The assessment should include:
|
|
17
|
+
- A clear verdict (APPROVED)
|
|
18
|
+
- Summary of what was reviewed
|
|
19
|
+
|
|
20
|
+
If the review is APPROVED, return:
|
|
21
|
+
|
|
22
|
+
```yaml
|
|
23
|
+
GATE_RESULT:
|
|
24
|
+
status: pass
|
|
25
|
+
gate: approval
|
|
26
|
+
message: "Code review APPROVED by reviewer"
|
|
27
|
+
checks:
|
|
28
|
+
- name: reviewer-verdict
|
|
29
|
+
status: pass
|
|
30
|
+
detail: "Explicit APPROVED verdict found in Reviewer Assessment"
|
|
31
|
+
```
|
|
32
|
+
</pass>
|
|
33
|
+
|
|
34
|
+
<fail>
|
|
35
|
+
If the review is not approved, diagnose and report:
|
|
36
|
+
|
|
37
|
+
1. **REJECTED verdict:** The reviewer found issues that need addressing.
|
|
38
|
+
- Extract the specific findings from the Reviewer Assessment
|
|
39
|
+
- List each finding with its severity
|
|
40
|
+
- These must be addressed before the gate can pass
|
|
41
|
+
|
|
42
|
+
2. **No verdict found:** The reviewer hasn't completed the review yet.
|
|
43
|
+
- The Reviewer Assessment section is missing or incomplete
|
|
44
|
+
- The reviewer needs to complete their review
|
|
45
|
+
|
|
46
|
+
Return with actionable recovery guidance:
|
|
47
|
+
|
|
48
|
+
```yaml
|
|
49
|
+
GATE_RESULT:
|
|
50
|
+
status: fail
|
|
51
|
+
gate: approval
|
|
52
|
+
message: "Gate failed: {REJECTED with findings | No verdict found}"
|
|
53
|
+
checks:
|
|
54
|
+
- name: reviewer-verdict
|
|
55
|
+
status: fail
|
|
56
|
+
detail: "{REJECTED: list findings | Missing: no assessment found}"
|
|
57
|
+
recovery:
|
|
58
|
+
- "Address reviewer findings: {finding1}, {finding2}"
|
|
59
|
+
- "Request re-review after fixes are applied"
|
|
60
|
+
```
|
|
61
|
+
</fail>
|
|
62
|
+
|
|
63
|
+
</gate>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<gate name="confidence-sm" model="haiku">
|
|
2
|
+
|
|
3
|
+
<purpose>
|
|
4
|
+
Check whether the user's instruction to the SM agent is ambiguous or unclear.
|
|
5
|
+
The SM agent handles story management, sprint coordination, and workflow routing.
|
|
6
|
+
Vague commands like "continue", "next", "start", or "do it" without a clear target
|
|
7
|
+
(story ID, agent name, or specific action) risk the SM taking the wrong action.
|
|
8
|
+
This gate evaluates confidence that the instruction has a single unambiguous interpretation.
|
|
9
|
+
</purpose>
|
|
10
|
+
|
|
11
|
+
<pass>
|
|
12
|
+
The instruction is clear and unambiguous. The SM agent can proceed confidently.
|
|
13
|
+
|
|
14
|
+
Evaluate the instruction against these criteria:
|
|
15
|
+
1. **Target identified:** A story ID, agent name, or specific action is stated or obvious from context
|
|
16
|
+
2. **Intent clear:** The desired outcome (start work, finish story, check status, hand off) is unambiguous
|
|
17
|
+
3. **No competing interpretations:** Only one reasonable reading of the instruction exists
|
|
18
|
+
|
|
19
|
+
If the instruction is confident and clear, return:
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
GATE_RESULT:
|
|
23
|
+
status: pass
|
|
24
|
+
gate: confidence-sm
|
|
25
|
+
message: "Instruction is clear: {summary of what SM will do}"
|
|
26
|
+
checks:
|
|
27
|
+
- name: target
|
|
28
|
+
status: pass
|
|
29
|
+
detail: "{what the instruction targets}"
|
|
30
|
+
- name: intent
|
|
31
|
+
status: pass
|
|
32
|
+
detail: "{what action the SM will take}"
|
|
33
|
+
```
|
|
34
|
+
</pass>
|
|
35
|
+
|
|
36
|
+
<fail>
|
|
37
|
+
The instruction is ambiguous. The SM agent should not guess — ask for clarification instead.
|
|
38
|
+
|
|
39
|
+
Identify which aspect is unclear and offer specific options the user likely meant:
|
|
40
|
+
|
|
41
|
+
1. **Missing target:** "continue" / "next" / "start" without specifying a story or action
|
|
42
|
+
- Did you mean: start a specific story? Continue the current workflow? Check sprint status?
|
|
43
|
+
|
|
44
|
+
2. **Ambiguous scope:** "do the thing" / "handle it" without enough context
|
|
45
|
+
- Did you mean: finish the current story? Start new work? Run the backlog?
|
|
46
|
+
|
|
47
|
+
3. **Multiple interpretations:** The instruction could reasonably mean two or more different actions
|
|
48
|
+
- List each interpretation and ask which one the user intended
|
|
49
|
+
|
|
50
|
+
Return with clarifying options so the user can specify their intent:
|
|
51
|
+
|
|
52
|
+
```yaml
|
|
53
|
+
GATE_RESULT:
|
|
54
|
+
status: fail
|
|
55
|
+
gate: confidence-sm
|
|
56
|
+
message: "Instruction is ambiguous: {what is unclear}"
|
|
57
|
+
checks:
|
|
58
|
+
- name: target
|
|
59
|
+
status: fail
|
|
60
|
+
detail: "{what target is missing or unclear}"
|
|
61
|
+
- name: intent
|
|
62
|
+
status: fail
|
|
63
|
+
detail: "{competing interpretations}"
|
|
64
|
+
recovery:
|
|
65
|
+
- "Did you mean: {option A}?"
|
|
66
|
+
- "Did you mean: {option B}?"
|
|
67
|
+
- "Specify a story ID or action to proceed"
|
|
68
|
+
```
|
|
69
|
+
</fail>
|
|
70
|
+
|
|
71
|
+
</gate>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
<gate name="context-ok" model="haiku">
|
|
2
|
+
|
|
3
|
+
<purpose>
|
|
4
|
+
Verify that Claude Code context usage is below threshold before allowing
|
|
5
|
+
a phase transition. Prevents handoffs when context is too high, which would
|
|
6
|
+
result in degraded agent performance in the next phase.
|
|
7
|
+
</purpose>
|
|
8
|
+
|
|
9
|
+
<pass>
|
|
10
|
+
Run the context check command and verify usage is acceptable:
|
|
11
|
+
|
|
12
|
+
1. **Context usage:** Run `pf context --human` to check current context percentage.
|
|
13
|
+
- Extract the usable percent from output
|
|
14
|
+
- Threshold: below 60% usable context
|
|
15
|
+
|
|
16
|
+
2. **Relay mode:** Check if relay mode is active via `pf context` env var output.
|
|
17
|
+
- If relay mode is on and context is high, TirePump should handle clearing
|
|
18
|
+
|
|
19
|
+
If context is below threshold, return:
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
GATE_RESULT:
|
|
23
|
+
status: pass
|
|
24
|
+
gate: context-ok
|
|
25
|
+
message: "Context at {N}% — safe to continue"
|
|
26
|
+
checks:
|
|
27
|
+
- name: context-usage
|
|
28
|
+
status: pass
|
|
29
|
+
detail: "{usable_pct}% of available context used ({usable_tokens} tokens)"
|
|
30
|
+
```
|
|
31
|
+
</pass>
|
|
32
|
+
|
|
33
|
+
<fail>
|
|
34
|
+
If context usage exceeds the threshold:
|
|
35
|
+
|
|
36
|
+
1. **High context:** Report the current usage level
|
|
37
|
+
2. **Recommendation:** Suggest `/clear` before continuing
|
|
38
|
+
|
|
39
|
+
Return with guidance:
|
|
40
|
+
|
|
41
|
+
```yaml
|
|
42
|
+
GATE_RESULT:
|
|
43
|
+
status: fail
|
|
44
|
+
gate: context-ok
|
|
45
|
+
message: "Context at {N}% — too high for reliable handoff"
|
|
46
|
+
checks:
|
|
47
|
+
- name: context-usage
|
|
48
|
+
status: fail
|
|
49
|
+
detail: "{usable_pct}% of available context used — threshold is 60%"
|
|
50
|
+
recovery:
|
|
51
|
+
- "Run /clear to reset context, then retry the handoff"
|
|
52
|
+
- "If relay mode is on, TirePump will handle this automatically"
|
|
53
|
+
```
|
|
54
|
+
</fail>
|
|
55
|
+
|
|
56
|
+
</gate>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Confidence SM Gate — Evaluation Results
|
|
2
|
+
|
|
3
|
+
**Gate:** `confidence-sm`
|
|
4
|
+
**Evaluation Period:** Sprint 2606 (first sprint deployed)
|
|
5
|
+
**Gate Shipped:** Story 90-2
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Trigger Frequency
|
|
10
|
+
|
|
11
|
+
The confidence-sm gate activated on SM agent startup when processing user instructions. During the evaluation period, the gate triggered on every SM invocation where a user instruction was present — this is by design, as it evaluates instruction clarity before the SM acts.
|
|
12
|
+
|
|
13
|
+
**Observations:**
|
|
14
|
+
- The gate fired on all SM activations with user input
|
|
15
|
+
- Baseline: prior to the gate, the SM would silently interpret ambiguous commands without confirmation
|
|
16
|
+
- The activation rate is proportional to SM usage — no runaway or unexpected triggering occurred
|
|
17
|
+
- No occurrences of the gate triggering on internal handoff instructions (correctly scoped to user input)
|
|
18
|
+
|
|
19
|
+
## Wrong-Approach Reduction
|
|
20
|
+
|
|
21
|
+
Before the confidence-sm gate, the SM occasionally took wrong actions on ambiguous instructions like "continue", "next", or "do it" — starting incorrect stories, routing to the wrong agent, or misinterpreting scope. The gate was designed to catch these ambiguous instructions and request clarification instead of guessing.
|
|
22
|
+
|
|
23
|
+
**Comparison with baseline:**
|
|
24
|
+
- Prior to the gate, wrong-approach incidents from ambiguous SM instructions were an observed pain point that motivated Epic 90
|
|
25
|
+
- After deployment, instructions that would previously have been misinterpreted now produce clarifying questions with specific options
|
|
26
|
+
- The gate's three-check model (target identified, intent clear, no competing interpretations) effectively catches the most common ambiguity patterns
|
|
27
|
+
- Improvement: the SM no longer silently guesses on vague commands — it surfaces options for the user to choose from
|
|
28
|
+
|
|
29
|
+
## User Experience
|
|
30
|
+
|
|
31
|
+
The gate's impact on usability was assessed for friction and override behavior.
|
|
32
|
+
|
|
33
|
+
**Friction assessment:**
|
|
34
|
+
- The gate adds one evaluation step before SM action, using a Haiku model call — latency impact is minimal
|
|
35
|
+
- When instructions are clear (target + intent present), the gate passes silently with no user-visible friction
|
|
36
|
+
- When instructions are ambiguous, the gate provides structured "Did you mean?" options rather than a generic error
|
|
37
|
+
|
|
38
|
+
**Override and dismissal behavior:**
|
|
39
|
+
- The gate does not currently support user override or bypass — if it fails, the SM requests clarification
|
|
40
|
+
- No users reported the gate as annoying or attempted to dismiss it
|
|
41
|
+
- The skip/bypass mechanism was deliberately omitted to enforce clarification on genuinely ambiguous input
|
|
42
|
+
- If future feedback indicates excessive friction on borderline cases, a confidence threshold could be added
|
|
43
|
+
|
|
44
|
+
## Rollout Recommendation
|
|
45
|
+
|
|
46
|
+
**Decision: Recommend expanding the confidence gate pattern to other agents.**
|
|
47
|
+
|
|
48
|
+
The confidence-sm gate demonstrated that pre-action ambiguity checking reduces wrong-approach incidents without meaningful friction on clear instructions. The pattern is agent-agnostic — any agent that interprets user instructions could benefit from a similar gate.
|
|
49
|
+
|
|
50
|
+
**Recommended next steps:**
|
|
51
|
+
- Extend to the TEA and Dev agents, which also receive direct user instructions that can be ambiguous
|
|
52
|
+
- Create a parameterized `confidence-{agent}` template so per-agent gates share the same evaluation structure but customize pass/fail criteria for each agent's domain
|
|
53
|
+
- Hold on extending to Reviewer and other agents that primarily receive structured handoff context (lower ambiguity risk)
|
|
54
|
+
- Defer rollout to all agents until per-agent evaluation data confirms the pattern works across different instruction types
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<gate name="quality-pass" model="haiku">
|
|
2
|
+
|
|
3
|
+
<purpose>
|
|
4
|
+
Verify that all project quality gates pass locally — lint, type checks, and
|
|
5
|
+
tests — before handing off to the next phase. This gate wraps the check.py
|
|
6
|
+
quality runner to ensure the codebase is clean enough for Reviewer's time.
|
|
7
|
+
</purpose>
|
|
8
|
+
|
|
9
|
+
<pass>
|
|
10
|
+
Run the quality gate script for the repos listed in the session file:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
source .venv/bin/activate && python3 .pennyfarthing/scripts/workflow/check.py
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The script runs lint, type checks, and tests concurrently. Exit code 0 means
|
|
17
|
+
all checks passed.
|
|
18
|
+
|
|
19
|
+
If ALL checks pass, return:
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
GATE_RESULT:
|
|
23
|
+
status: pass
|
|
24
|
+
gate: quality-pass
|
|
25
|
+
message: "All quality gates passing — lint, typecheck, tests clean."
|
|
26
|
+
checks:
|
|
27
|
+
- name: lint
|
|
28
|
+
status: pass
|
|
29
|
+
detail: "Lint clean"
|
|
30
|
+
- name: typecheck
|
|
31
|
+
status: pass
|
|
32
|
+
detail: "Type checks passing"
|
|
33
|
+
- name: tests
|
|
34
|
+
status: pass
|
|
35
|
+
detail: "All tests passing"
|
|
36
|
+
```
|
|
37
|
+
</pass>
|
|
38
|
+
|
|
39
|
+
<fail>
|
|
40
|
+
If the script exits non-zero, parse its output to identify which checks failed.
|
|
41
|
+
The script prints `[PASS]` or `[FAIL]` for each check (Lint, Type Check, Tests).
|
|
42
|
+
|
|
43
|
+
Return with actionable recovery guidance:
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
GATE_RESULT:
|
|
47
|
+
status: fail
|
|
48
|
+
gate: quality-pass
|
|
49
|
+
message: "Quality gate failed: {summary of failures}"
|
|
50
|
+
checks:
|
|
51
|
+
- name: lint
|
|
52
|
+
status: pass | fail
|
|
53
|
+
detail: "{lint results or specific failures}"
|
|
54
|
+
- name: typecheck
|
|
55
|
+
status: pass | fail
|
|
56
|
+
detail: "{typecheck results or specific errors}"
|
|
57
|
+
- name: tests
|
|
58
|
+
status: pass | fail
|
|
59
|
+
detail: "{test results or failing test details}"
|
|
60
|
+
recovery:
|
|
61
|
+
- "Fix lint errors: run `npm run lint` to see details"
|
|
62
|
+
- "Fix type errors: run `tsc --noEmit` to see details"
|
|
63
|
+
- "Fix failing tests: run `pnpm test` to see details"
|
|
64
|
+
```
|
|
65
|
+
</fail>
|
|
66
|
+
|
|
67
|
+
</gate>
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<gate name="tests-fail" model="haiku">
|
|
2
|
+
|
|
3
|
+
<purpose>
|
|
4
|
+
Verify tests are RED — failing tests exist that cover the acceptance
|
|
5
|
+
criteria. TEA has written tests but implementation hasn't started.
|
|
6
|
+
This gate runs after the TEA agent's red phase to confirm the codebase
|
|
7
|
+
has proper test coverage before Dev begins implementation.
|
|
8
|
+
</purpose>
|
|
9
|
+
|
|
10
|
+
<pass>
|
|
11
|
+
Run these checks and report results:
|
|
12
|
+
|
|
13
|
+
1. **Failing tests exist:** Run the project test suite for the repos listed in the session file.
|
|
14
|
+
- For `pennyfarthing` repo: `cd pennyfarthing && python3 -m pytest` or `pnpm test`
|
|
15
|
+
- Record: total tests, passed, failed, skipped
|
|
16
|
+
- At least one test MUST be failing (RED state)
|
|
17
|
+
|
|
18
|
+
2. **Tests cover acceptance criteria:** Read the session file's Acceptance Criteria section.
|
|
19
|
+
- Cross-reference test names/descriptions against each AC
|
|
20
|
+
- Each AC should have at least one corresponding test
|
|
21
|
+
|
|
22
|
+
3. **Tests are committed:** Run `git status --porcelain` to check for uncommitted test files.
|
|
23
|
+
- All test files should be committed to the branch
|
|
24
|
+
- No uncommitted test files should exist
|
|
25
|
+
|
|
26
|
+
If ALL checks pass, return:
|
|
27
|
+
|
|
28
|
+
```yaml
|
|
29
|
+
GATE_RESULT:
|
|
30
|
+
status: pass
|
|
31
|
+
gate: tests-fail
|
|
32
|
+
message: "{N} failing tests covering {M} acceptance criteria. Tests committed."
|
|
33
|
+
checks:
|
|
34
|
+
- name: failing-tests
|
|
35
|
+
status: pass
|
|
36
|
+
detail: "{failed}/{total} tests failing (RED state confirmed)"
|
|
37
|
+
- name: ac-coverage
|
|
38
|
+
status: pass
|
|
39
|
+
detail: "All {M} acceptance criteria have test coverage"
|
|
40
|
+
- name: tests-committed
|
|
41
|
+
status: pass
|
|
42
|
+
detail: "All test files committed to branch"
|
|
43
|
+
```
|
|
44
|
+
</pass>
|
|
45
|
+
|
|
46
|
+
<fail>
|
|
47
|
+
If ANY check fails, diagnose and report:
|
|
48
|
+
|
|
49
|
+
1. **No failing tests found:** TEA didn't write tests or tests are already passing.
|
|
50
|
+
- This means implementation may have leaked into the red phase
|
|
51
|
+
- Or tests are not properly asserting against unimplemented code
|
|
52
|
+
|
|
53
|
+
2. **Tests don't cover ACs:** Some acceptance criteria lack test coverage.
|
|
54
|
+
- List which ACs are missing tests
|
|
55
|
+
- TEA needs to add additional test cases
|
|
56
|
+
|
|
57
|
+
3. **Tests aren't committed:** Uncommitted test files exist.
|
|
58
|
+
- List uncommitted test files
|
|
59
|
+
- TEA needs to commit before handoff
|
|
60
|
+
|
|
61
|
+
Return with actionable recovery guidance:
|
|
62
|
+
|
|
63
|
+
```yaml
|
|
64
|
+
GATE_RESULT:
|
|
65
|
+
status: fail
|
|
66
|
+
gate: tests-fail
|
|
67
|
+
message: "Gate failed: {summary of what's missing}"
|
|
68
|
+
checks:
|
|
69
|
+
- name: failing-tests
|
|
70
|
+
status: pass | fail
|
|
71
|
+
detail: "{description of test state}"
|
|
72
|
+
- name: ac-coverage
|
|
73
|
+
status: pass | fail
|
|
74
|
+
detail: "{list of uncovered ACs}"
|
|
75
|
+
- name: tests-committed
|
|
76
|
+
status: pass | fail
|
|
77
|
+
detail: "{list of uncommitted files}"
|
|
78
|
+
recovery:
|
|
79
|
+
- "Write failing tests for: {uncovered ACs}"
|
|
80
|
+
- "Commit test files: git add {files} && git commit"
|
|
81
|
+
```
|
|
82
|
+
</fail>
|
|
83
|
+
|
|
84
|
+
</gate>
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<gate name="tests-pass" model="haiku">
|
|
2
|
+
|
|
3
|
+
<purpose>
|
|
4
|
+
Verify that all tests pass and the working tree is clean before handing off
|
|
5
|
+
to the reviewer. This gate runs after the Dev agent's implementation phase
|
|
6
|
+
to confirm the codebase is in a GREEN state.
|
|
7
|
+
</purpose>
|
|
8
|
+
|
|
9
|
+
<pass>
|
|
10
|
+
Run these checks and report results:
|
|
11
|
+
|
|
12
|
+
1. **Test suite:** Run the project test suite for the repos listed in the session file.
|
|
13
|
+
- For `pennyfarthing` repo: `cd pennyfarthing && pnpm test`
|
|
14
|
+
- For `orchestrator` repo: tests in the orchestrator root if applicable
|
|
15
|
+
- Record: total tests, passed, failed, skipped
|
|
16
|
+
|
|
17
|
+
2. **Working tree:** Run `git status --porcelain` in each repo listed in session `**Repos:**`.
|
|
18
|
+
- Verify no uncommitted or untracked files (empty output = clean)
|
|
19
|
+
|
|
20
|
+
3. **Branch status:** Run `git branch --show-current` and `git log --oneline -1`.
|
|
21
|
+
- Confirm on the expected feature branch from session `**Branch:**`
|
|
22
|
+
|
|
23
|
+
If ALL checks pass, return:
|
|
24
|
+
|
|
25
|
+
```yaml
|
|
26
|
+
GATE_RESULT:
|
|
27
|
+
status: pass
|
|
28
|
+
gate: tests-pass
|
|
29
|
+
message: "All {N} tests passing. Working tree clean. Branch: {branch}"
|
|
30
|
+
checks:
|
|
31
|
+
- name: test-suite
|
|
32
|
+
status: pass
|
|
33
|
+
detail: "{passed}/{total} tests passing ({skipped} skipped)"
|
|
34
|
+
- name: working-tree
|
|
35
|
+
status: pass
|
|
36
|
+
detail: "No uncommitted changes"
|
|
37
|
+
- name: branch-status
|
|
38
|
+
status: pass
|
|
39
|
+
detail: "On branch {branch}, HEAD at {short-sha}"
|
|
40
|
+
```
|
|
41
|
+
</pass>
|
|
42
|
+
|
|
43
|
+
<fail>
|
|
44
|
+
If ANY check fails, diagnose and report:
|
|
45
|
+
|
|
46
|
+
1. **Failing tests:** List each failing test file and line number.
|
|
47
|
+
- Run tests with verbose output to capture failure details.
|
|
48
|
+
- Group failures by file.
|
|
49
|
+
|
|
50
|
+
2. **Dirty working tree:** List uncommitted and untracked files.
|
|
51
|
+
- Run `git status --porcelain` and report each file with its status code.
|
|
52
|
+
|
|
53
|
+
3. **Wrong branch:** Report actual vs expected branch name.
|
|
54
|
+
|
|
55
|
+
Return with actionable recovery guidance:
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
GATE_RESULT:
|
|
59
|
+
status: fail
|
|
60
|
+
gate: tests-pass
|
|
61
|
+
message: "Gate failed: {summary of failures}"
|
|
62
|
+
checks:
|
|
63
|
+
- name: test-suite
|
|
64
|
+
status: pass | fail
|
|
65
|
+
detail: "{description of test results or failures}"
|
|
66
|
+
- name: working-tree
|
|
67
|
+
status: pass | fail
|
|
68
|
+
detail: "{list of uncommitted files, or 'clean'}"
|
|
69
|
+
- name: branch-status
|
|
70
|
+
status: pass | fail
|
|
71
|
+
detail: "{branch info or mismatch details}"
|
|
72
|
+
recovery:
|
|
73
|
+
- "Fix failing tests in: {file1}, {file2}"
|
|
74
|
+
- "Commit or stash uncommitted changes before handoff"
|
|
75
|
+
- "Switch to correct branch: git checkout {expected-branch}"
|
|
76
|
+
```
|
|
77
|
+
</fail>
|
|
78
|
+
|
|
79
|
+
</gate>
|