@pennyfarthing/core 11.0.0 → 11.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -23
- package/package.json +1 -1
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts +20 -0
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js +278 -0
- package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js.map +1 -0
- package/packages/core/dist/cli/utils/constants.d.ts +8 -2
- package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/constants.js +4 -1
- package/packages/core/dist/cli/utils/constants.js.map +1 -1
- package/packages/core/dist/cli/utils/constants.test.d.ts +10 -0
- package/packages/core/dist/cli/utils/constants.test.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/constants.test.js +38 -0
- package/packages/core/dist/cli/utils/constants.test.js.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.d.ts +139 -0
- package/packages/core/dist/consultation/consultation-protocol.d.ts.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.js +178 -0
- package/packages/core/dist/consultation/consultation-protocol.js.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.test.d.ts +20 -0
- package/packages/core/dist/consultation/consultation-protocol.test.d.ts.map +1 -0
- package/packages/core/dist/consultation/consultation-protocol.test.js +474 -0
- package/packages/core/dist/consultation/consultation-protocol.test.js.map +1 -0
- package/packages/core/dist/consultation/dialogue-manager.d.ts +75 -0
- package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -0
- package/packages/core/dist/consultation/dialogue-manager.js +334 -0
- package/packages/core/dist/consultation/dialogue-manager.js.map +1 -0
- package/packages/core/dist/consultation/dialogue-manager.test.d.ts +19 -0
- package/packages/core/dist/consultation/dialogue-manager.test.d.ts.map +1 -0
- package/packages/core/dist/consultation/dialogue-manager.test.js +444 -0
- package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -0
- package/packages/core/dist/public/js/react/react.js +3 -3
- package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
- package/packages/core/dist/scripts/theme-detail.test.js +199 -0
- package/packages/core/dist/server/api/git.d.ts +13 -1
- package/packages/core/dist/server/api/git.d.ts.map +1 -1
- package/packages/core/dist/server/api/git.js +53 -34
- package/packages/core/dist/server/api/git.js.map +1 -1
- package/packages/core/dist/server/api/health-score.d.ts.map +1 -1
- package/packages/core/dist/server/api/health-score.js +25 -1
- package/packages/core/dist/server/api/health-score.js.map +1 -1
- package/packages/core/dist/server/api/settings.d.ts.map +1 -1
- package/packages/core/dist/server/api/settings.js +63 -1
- package/packages/core/dist/server/api/settings.js.map +1 -1
- package/packages/core/dist/server/api/theme-agents.d.ts.map +1 -1
- package/packages/core/dist/server/api/theme-agents.js +61 -0
- package/packages/core/dist/server/api/theme-agents.js.map +1 -1
- package/packages/core/dist/server/server.d.ts.map +1 -1
- package/packages/core/dist/server/server.js +17 -12
- package/packages/core/dist/server/server.js.map +1 -1
- package/packages/core/dist/shared/skill-search.test.js +2 -2
- package/packages/core/dist/workflow/gate-file-validation.d.ts +49 -0
- package/packages/core/dist/workflow/gate-file-validation.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-file-validation.js +157 -0
- package/packages/core/dist/workflow/gate-file-validation.js.map +1 -0
- package/packages/core/dist/workflow/gate-file-validation.test.d.ts +19 -0
- package/packages/core/dist/workflow/gate-file-validation.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-file-validation.test.js +536 -0
- package/packages/core/dist/workflow/gate-file-validation.test.js.map +1 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.d.ts +14 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.js +339 -0
- package/packages/core/dist/workflow/gate-schema-validation.test.js.map +1 -0
- package/packages/core/dist/workflow/handoff.js +2 -2
- package/packages/core/dist/workflow/handoff.js.map +1 -1
- package/packages/core/dist/workflow/handoff.test.js +16 -0
- package/packages/core/dist/workflow/handoff.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.d.ts +4 -2
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.js +43 -8
- package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
- package/pennyfarthing-dist/agents/README.md +6 -14
- package/pennyfarthing-dist/agents/architect.md +43 -29
- package/pennyfarthing-dist/agents/ba.md +30 -29
- package/pennyfarthing-dist/agents/dev.md +32 -43
- package/pennyfarthing-dist/agents/devops.md +57 -21
- package/pennyfarthing-dist/agents/orchestrator.md +3 -10
- package/pennyfarthing-dist/agents/pm.md +45 -31
- package/pennyfarthing-dist/agents/reviewer.md +20 -66
- package/pennyfarthing-dist/agents/sm-setup.md +2 -2
- package/pennyfarthing-dist/agents/sm.md +8 -30
- package/pennyfarthing-dist/agents/tea.md +25 -41
- package/pennyfarthing-dist/agents/tech-writer.md +33 -90
- package/pennyfarthing-dist/agents/ux-designer.md +39 -39
- package/pennyfarthing-dist/commands/benchmark-control.md +8 -64
- package/pennyfarthing-dist/commands/benchmark.md +8 -480
- package/pennyfarthing-dist/commands/job-fair.md +8 -97
- package/pennyfarthing-dist/commands/pf-benchmark-control.md +70 -0
- package/pennyfarthing-dist/commands/pf-benchmark.md +486 -0
- package/pennyfarthing-dist/commands/pf-chore.md +4 -4
- package/pennyfarthing-dist/commands/pf-ci.md +40 -0
- package/pennyfarthing-dist/commands/pf-close-epic.md +9 -27
- package/pennyfarthing-dist/commands/pf-continue-session.md +9 -213
- package/pennyfarthing-dist/commands/pf-create-branches-from-story.md +11 -353
- package/pennyfarthing-dist/commands/pf-docs.md +28 -0
- package/pennyfarthing-dist/commands/pf-epic.md +67 -0
- package/pennyfarthing-dist/commands/pf-git-cleanup.md +11 -52
- package/pennyfarthing-dist/commands/pf-git.md +75 -0
- package/pennyfarthing-dist/commands/pf-help.md +110 -128
- package/pennyfarthing-dist/commands/pf-job-fair.md +102 -0
- package/pennyfarthing-dist/commands/pf-new-work.md +9 -18
- package/pennyfarthing-dist/commands/pf-parallel-work.md +6 -66
- package/pennyfarthing-dist/commands/pf-release.md +11 -76
- package/pennyfarthing-dist/commands/pf-repo-status.md +11 -44
- package/pennyfarthing-dist/commands/pf-run-ci.md +8 -111
- package/pennyfarthing-dist/commands/pf-session.md +51 -0
- package/pennyfarthing-dist/commands/pf-solo.md +447 -0
- package/pennyfarthing-dist/commands/pf-sprint-planning.md +8 -104
- package/pennyfarthing-dist/commands/pf-standalone.md +1 -1
- package/pennyfarthing-dist/commands/pf-start-epic.md +9 -163
- package/pennyfarthing-dist/commands/pf-sync-epic-to-jira.md +8 -179
- package/pennyfarthing-dist/commands/pf-sync-work-with-sprint.md +8 -368
- package/pennyfarthing-dist/commands/pf-update-domain-docs.md +8 -78
- package/pennyfarthing-dist/commands/solo.md +8 -442
- package/pennyfarthing-dist/guides/agent-behavior.md +13 -13
- package/pennyfarthing-dist/guides/agent-coordination.md +7 -7
- package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -5
- package/pennyfarthing-dist/guides/bikerack.md +128 -0
- package/pennyfarthing-dist/guides/brownfield-tools.md +133 -0
- package/pennyfarthing-dist/guides/command-tag-taxonomy.md +2 -2
- package/pennyfarthing-dist/guides/gate-schema.md +227 -0
- package/pennyfarthing-dist/guides/gates.md +120 -0
- package/pennyfarthing-dist/guides/handoff-cli.md +116 -0
- package/pennyfarthing-dist/guides/hooks.md +86 -4
- package/pennyfarthing-dist/guides/output-styles.md +65 -0
- package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +5 -5
- package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -4
- package/pennyfarthing-dist/guides/prompt-patterns.md +5 -5
- package/pennyfarthing-dist/guides/reflector.md +4 -4
- package/pennyfarthing-dist/guides/session-artifacts.md +1 -1
- package/pennyfarthing-dist/guides/skill-schema.md +1 -1
- package/pennyfarthing-dist/guides/tandem-protocol.md +13 -1
- package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
- package/pennyfarthing-dist/guides/xml-tags.md +5 -4
- package/pennyfarthing-dist/personas/themes/hogans-heroes.yaml +11 -22
- package/pennyfarthing-dist/personas/themes/stephen-king.yaml +13 -24
- package/pennyfarthing-dist/scripts/core/dialogue-manager.sh +322 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +1 -1
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +19 -14
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +191 -57
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +26 -10
- package/pennyfarthing-dist/skills/pf-changelog/SKILL.md +4 -4
- package/pennyfarthing-dist/skills/pf-sprint/skill.md +1 -1
- package/pennyfarthing-dist/skills/skill-registry.schema.json +4 -0
- package/pennyfarthing-dist/skills/skill-registry.yaml +5 -0
- package/pennyfarthing-dist/workflows/2party-tdd.yaml +11 -0
- package/pennyfarthing-dist/workflows/agent-docs.yaml +2 -0
- package/pennyfarthing-dist/workflows/bdd-tandem.yaml +4 -0
- package/pennyfarthing-dist/workflows/bdd.yaml +4 -0
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
- package/pennyfarthing-dist/workflows/tdd-tandem.yaml +3 -0
- package/pennyfarthing-dist/workflows/tdd.yaml +3 -0
- package/pennyfarthing-dist/workflows/trivial.yaml +2 -0
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bikerack/cli.py +10 -11
- package/pennyfarthing_scripts/bikerack/debug_panel.py +218 -0
- package/pennyfarthing_scripts/bikerack/diffs_panel.py +203 -27
- package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/cli.py +114 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/epic/__init__.py +0 -0
- package/pennyfarthing_scripts/epic/cli.py +64 -0
- package/pennyfarthing_scripts/gate/__init__.py +1 -0
- package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/gate/cli.py +56 -0
- package/pennyfarthing_scripts/gate/validate.py +266 -0
- package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/git_group/__init__.py +0 -0
- package/pennyfarthing_scripts/git_group/cli.py +100 -0
- package/pennyfarthing_scripts/handoff/__init__.py +1 -0
- package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/handoff/cli.py +120 -0
- package/pennyfarthing_scripts/handoff/complete_phase.py +155 -0
- package/pennyfarthing_scripts/handoff/gate_file.py +105 -0
- package/pennyfarthing_scripts/handoff/gate_runner.py +152 -0
- package/pennyfarthing_scripts/handoff/marker.py +109 -0
- package/pennyfarthing_scripts/handoff/resolve_gate.py +152 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/workflow.py +39 -0
- package/pennyfarthing_scripts/session/__init__.py +0 -0
- package/pennyfarthing_scripts/session/cli.py +87 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/story_finish.py +14 -0
- package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/test_108_1_gate_migration.py +540 -0
- package/pennyfarthing_scripts/tests/test_108_2_remove_handoff_fallback.py +339 -0
- package/pennyfarthing_scripts/tests/test_confidence_sm_evaluation.py +253 -0
- package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +315 -0
- package/pennyfarthing_scripts/tests/test_gate_file_resolution.py +341 -0
- package/pennyfarthing_scripts/tests/test_gate_runner.py +620 -0
- package/pennyfarthing_scripts/tests/test_handoff_cli.py +929 -0
- package/pennyfarthing_scripts/tests/test_handoff_e2e.py +454 -0
- package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +464 -0
- package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/validate/adapters/skill_command.py +200 -0
- package/pennyfarthing_scripts/validate/adapters/workflow.py +64 -0
- package/pennyfarthing_scripts/validate/cli.py +15 -4
- package/packages/core/dist/scripts/benchmark-integration.d.ts +0 -182
- package/packages/core/dist/scripts/benchmark-integration.d.ts.map +0 -1
- package/packages/core/dist/scripts/benchmark-integration.js +0 -691
- package/packages/core/dist/scripts/benchmark-integration.js.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts +0 -150
- package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
- package/packages/core/dist/scripts/job-fair-aggregator.js +0 -547
- package/packages/core/dist/scripts/job-fair-aggregator.js.map +0 -1
- package/pennyfarthing-dist/agents/handoff.md +0 -250
- package/pennyfarthing-dist/agents/sm-handoff.md +0 -152
- package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -112
- package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
|
@@ -211,6 +211,152 @@ def _get_body(content: str) -> str:
|
|
|
211
211
|
return content[end + 4:].strip()
|
|
212
212
|
|
|
213
213
|
|
|
214
|
+
def _discover_registry(root: Path) -> dict | None:
|
|
215
|
+
"""Load command-registry.yaml if it exists."""
|
|
216
|
+
path = root / "pennyfarthing-dist" / "command-registry.yaml"
|
|
217
|
+
if not path.is_file():
|
|
218
|
+
return None
|
|
219
|
+
try:
|
|
220
|
+
return yaml.safe_load(path.read_text())
|
|
221
|
+
except yaml.YAMLError:
|
|
222
|
+
return None
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _collect_registry_command_names(registry: dict) -> set[str]:
|
|
226
|
+
"""Collect all command names expected from the registry."""
|
|
227
|
+
names: set[str] = set()
|
|
228
|
+
|
|
229
|
+
# Groups: each group has a slash field like "/pf-sprint"
|
|
230
|
+
for _group_name, group in registry.get("groups", {}).items():
|
|
231
|
+
slash = group.get("slash", "")
|
|
232
|
+
if slash:
|
|
233
|
+
# "/pf-sprint" -> "pf-sprint"
|
|
234
|
+
names.add(slash.lstrip("/"))
|
|
235
|
+
|
|
236
|
+
# Standalone
|
|
237
|
+
for _cmd_name, cmd in registry.get("standalone", {}).items():
|
|
238
|
+
slash = cmd.get("slash", "")
|
|
239
|
+
if slash:
|
|
240
|
+
names.add(slash.lstrip("/"))
|
|
241
|
+
|
|
242
|
+
# Agents
|
|
243
|
+
agents = registry.get("agents", {})
|
|
244
|
+
for _agent_name, agent in agents.get("commands", {}).items():
|
|
245
|
+
slash = agent.get("slash", "")
|
|
246
|
+
if slash:
|
|
247
|
+
names.add(slash.lstrip("/"))
|
|
248
|
+
|
|
249
|
+
# Benchmarking
|
|
250
|
+
benchmarking = registry.get("benchmarking", {})
|
|
251
|
+
for _cmd_name, cmd in benchmarking.get("commands", {}).items():
|
|
252
|
+
slash = cmd.get("slash", "")
|
|
253
|
+
if slash:
|
|
254
|
+
names.add(slash.lstrip("/"))
|
|
255
|
+
|
|
256
|
+
# Also add the new grouped commands (pf-git, pf-session, pf-epic, pf-ci, pf-docs)
|
|
257
|
+
for group_name in registry.get("groups", {}):
|
|
258
|
+
names.add(f"pf-{group_name}")
|
|
259
|
+
for cmd_name in registry.get("standalone", {}):
|
|
260
|
+
if cmd_name not in (
|
|
261
|
+
"help", "setup", "health-check", "prime", "check", "work",
|
|
262
|
+
"chore", "patch", "standalone", "party-mode", "brainstorming",
|
|
263
|
+
"retro", "permissions",
|
|
264
|
+
):
|
|
265
|
+
names.add(f"pf-{cmd_name}")
|
|
266
|
+
|
|
267
|
+
return names
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
def validate_prefix(commands_dir: Path) -> tuple[list[str], list[str]]:
|
|
271
|
+
"""Check all command files have pf- prefix."""
|
|
272
|
+
errors: list[str] = []
|
|
273
|
+
warnings: list[str] = []
|
|
274
|
+
|
|
275
|
+
for path in discover_command_files(commands_dir):
|
|
276
|
+
name = path.stem # filename without .md
|
|
277
|
+
if not name.startswith("pf-"):
|
|
278
|
+
# Check if it's a deprecated redirect stub
|
|
279
|
+
content = path.read_text()
|
|
280
|
+
fm = _parse_frontmatter(content)
|
|
281
|
+
if fm and fm.get("deprecated"):
|
|
282
|
+
continue # Redirect stubs are fine without prefix
|
|
283
|
+
warnings.append(f"{path.name}: missing 'pf-' prefix")
|
|
284
|
+
|
|
285
|
+
return errors, warnings
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def validate_deprecated(commands_dir: Path) -> tuple[list[str], list[str]]:
|
|
289
|
+
"""Check deprecated files have redirect field."""
|
|
290
|
+
errors: list[str] = []
|
|
291
|
+
warnings: list[str] = []
|
|
292
|
+
|
|
293
|
+
for path in discover_command_files(commands_dir):
|
|
294
|
+
content = path.read_text()
|
|
295
|
+
fm = _parse_frontmatter(content)
|
|
296
|
+
if fm and fm.get("deprecated") and not fm.get("redirect"):
|
|
297
|
+
errors.append(f"{path.name}: deprecated command missing 'redirect' field")
|
|
298
|
+
|
|
299
|
+
return errors, warnings
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
def validate_registry_crossref(
|
|
303
|
+
root: Path, commands_dir: Path
|
|
304
|
+
) -> tuple[list[str], list[str]]:
|
|
305
|
+
"""Cross-reference command files with command-registry.yaml."""
|
|
306
|
+
errors: list[str] = []
|
|
307
|
+
warnings: list[str] = []
|
|
308
|
+
|
|
309
|
+
registry = _discover_registry(root)
|
|
310
|
+
if registry is None:
|
|
311
|
+
warnings.append("command-registry.yaml not found — skipping cross-reference")
|
|
312
|
+
return errors, warnings
|
|
313
|
+
|
|
314
|
+
registry_names = _collect_registry_command_names(registry)
|
|
315
|
+
|
|
316
|
+
# Check command files against registry
|
|
317
|
+
for path in discover_command_files(commands_dir):
|
|
318
|
+
name = path.stem
|
|
319
|
+
content = path.read_text()
|
|
320
|
+
fm = _parse_frontmatter(content)
|
|
321
|
+
if fm and fm.get("deprecated"):
|
|
322
|
+
continue # Skip deprecated stubs
|
|
323
|
+
if name not in registry_names:
|
|
324
|
+
warnings.append(f"{path.name}: not found in command-registry.yaml")
|
|
325
|
+
|
|
326
|
+
return errors, warnings
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
def validate_skill_alignment(root: Path) -> tuple[list[str], list[str]]:
|
|
330
|
+
"""Check skill command_group values match registry groups."""
|
|
331
|
+
errors: list[str] = []
|
|
332
|
+
warnings: list[str] = []
|
|
333
|
+
|
|
334
|
+
registry = _discover_registry(root)
|
|
335
|
+
if registry is None:
|
|
336
|
+
return errors, warnings
|
|
337
|
+
|
|
338
|
+
registry_path = discover_skill_registry(root)
|
|
339
|
+
if registry_path is None:
|
|
340
|
+
return errors, warnings
|
|
341
|
+
|
|
342
|
+
try:
|
|
343
|
+
skills_data = yaml.safe_load(registry_path.read_text())
|
|
344
|
+
except yaml.YAMLError:
|
|
345
|
+
return errors, warnings
|
|
346
|
+
|
|
347
|
+
registry_groups = set(registry.get("groups", {}).keys())
|
|
348
|
+
|
|
349
|
+
for skill_name, skill in skills_data.get("skills", {}).items():
|
|
350
|
+
command_group = skill.get("command_group")
|
|
351
|
+
if command_group and command_group not in registry_groups:
|
|
352
|
+
warnings.append(
|
|
353
|
+
f"skill '{skill_name}': command_group '{command_group}' "
|
|
354
|
+
f"not found in command-registry.yaml groups"
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
return errors, warnings
|
|
358
|
+
|
|
359
|
+
|
|
214
360
|
def validate_command_file(path: Path) -> tuple[list[str], list[str]]:
|
|
215
361
|
"""Validate a command markdown file.
|
|
216
362
|
|
|
@@ -288,4 +434,58 @@ def run(root: Path, *, fix: bool = False, strict: bool = False) -> ValidateRepor
|
|
|
288
434
|
if not file_errors:
|
|
289
435
|
report.passed += 1
|
|
290
436
|
|
|
437
|
+
# --- New validation checks ---
|
|
438
|
+
|
|
439
|
+
# Prefix check
|
|
440
|
+
prefix_errors, prefix_warnings = validate_prefix(commands_dir)
|
|
441
|
+
for e in prefix_errors:
|
|
442
|
+
report.errors += 1
|
|
443
|
+
report.details.append(f"[ERROR] prefix: {e}")
|
|
444
|
+
for w in prefix_warnings:
|
|
445
|
+
if strict:
|
|
446
|
+
report.errors += 1
|
|
447
|
+
report.details.append(f"[ERROR] prefix: {w}")
|
|
448
|
+
else:
|
|
449
|
+
report.warnings += 1
|
|
450
|
+
report.details.append(f"[WARN] prefix: {w}")
|
|
451
|
+
|
|
452
|
+
# Deprecated check
|
|
453
|
+
depr_errors, depr_warnings = validate_deprecated(commands_dir)
|
|
454
|
+
for e in depr_errors:
|
|
455
|
+
report.errors += 1
|
|
456
|
+
report.details.append(f"[ERROR] deprecated: {e}")
|
|
457
|
+
for w in depr_warnings:
|
|
458
|
+
if strict:
|
|
459
|
+
report.errors += 1
|
|
460
|
+
report.details.append(f"[ERROR] deprecated: {w}")
|
|
461
|
+
else:
|
|
462
|
+
report.warnings += 1
|
|
463
|
+
report.details.append(f"[WARN] deprecated: {w}")
|
|
464
|
+
|
|
465
|
+
# Registry cross-reference
|
|
466
|
+
xref_errors, xref_warnings = validate_registry_crossref(root, commands_dir)
|
|
467
|
+
for e in xref_errors:
|
|
468
|
+
report.errors += 1
|
|
469
|
+
report.details.append(f"[ERROR] registry: {e}")
|
|
470
|
+
for w in xref_warnings:
|
|
471
|
+
if strict:
|
|
472
|
+
report.errors += 1
|
|
473
|
+
report.details.append(f"[ERROR] registry: {w}")
|
|
474
|
+
else:
|
|
475
|
+
report.warnings += 1
|
|
476
|
+
report.details.append(f"[WARN] registry: {w}")
|
|
477
|
+
|
|
478
|
+
# Skill alignment
|
|
479
|
+
align_errors, align_warnings = validate_skill_alignment(root)
|
|
480
|
+
for e in align_errors:
|
|
481
|
+
report.errors += 1
|
|
482
|
+
report.details.append(f"[ERROR] skill-align: {e}")
|
|
483
|
+
for w in align_warnings:
|
|
484
|
+
if strict:
|
|
485
|
+
report.errors += 1
|
|
486
|
+
report.details.append(f"[ERROR] skill-align: {w}")
|
|
487
|
+
else:
|
|
488
|
+
report.warnings += 1
|
|
489
|
+
report.details.append(f"[WARN] skill-align: {w}")
|
|
490
|
+
|
|
291
491
|
return report
|
|
@@ -18,6 +18,12 @@ from pennyfarthing_scripts.validate import ValidateReport
|
|
|
18
18
|
# Known workflow types
|
|
19
19
|
VALID_TYPES = {"phased", "stepped", "procedural"}
|
|
20
20
|
|
|
21
|
+
# Known tandem modes for phase tandem blocks
|
|
22
|
+
VALID_TANDEM_MODES = {"consultation"}
|
|
23
|
+
|
|
24
|
+
# Valid model values for tandem partner spawning
|
|
25
|
+
VALID_TANDEM_MODELS = {"sonnet", "haiku"}
|
|
26
|
+
|
|
21
27
|
# Known gate types for phased workflows
|
|
22
28
|
VALID_GATE_TYPES = {
|
|
23
29
|
"tests_pass",
|
|
@@ -164,6 +170,64 @@ def validate_phased(
|
|
|
164
170
|
f"'{gate_type}'"
|
|
165
171
|
)
|
|
166
172
|
|
|
173
|
+
# Tandem validation
|
|
174
|
+
tandem = phase.get("tandem")
|
|
175
|
+
if tandem is not None:
|
|
176
|
+
label = phase_name or i
|
|
177
|
+
if not isinstance(tandem, dict):
|
|
178
|
+
errors.append(
|
|
179
|
+
f"Phase '{label}' tandem must be a mapping"
|
|
180
|
+
)
|
|
181
|
+
else:
|
|
182
|
+
# partner is required
|
|
183
|
+
partner = tandem.get("partner")
|
|
184
|
+
if not partner:
|
|
185
|
+
errors.append(
|
|
186
|
+
f"Phase '{label}' tandem missing required field: partner"
|
|
187
|
+
)
|
|
188
|
+
else:
|
|
189
|
+
# Cross-reference partner against known agents
|
|
190
|
+
warnings.extend(
|
|
191
|
+
_check_agent_ref(
|
|
192
|
+
partner, agent_stems, f"phase '{label}' tandem partner"
|
|
193
|
+
)
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
# mode validation (optional for backward compat)
|
|
197
|
+
mode = tandem.get("mode")
|
|
198
|
+
if mode is not None and mode not in VALID_TANDEM_MODES:
|
|
199
|
+
errors.append(
|
|
200
|
+
f"Phase '{label}' tandem has invalid mode: '{mode}' "
|
|
201
|
+
f"(must be one of: {', '.join(sorted(VALID_TANDEM_MODES))})"
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
# model validation (optional)
|
|
205
|
+
model = tandem.get("model")
|
|
206
|
+
if model is not None and model not in VALID_TANDEM_MODELS:
|
|
207
|
+
warnings.append(
|
|
208
|
+
f"Phase '{label}' tandem has unknown model: '{model}' "
|
|
209
|
+
f"(expected one of: {', '.join(sorted(VALID_TANDEM_MODELS))})"
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
# token_budget validation (must be positive integer)
|
|
213
|
+
token_budget = tandem.get("token_budget")
|
|
214
|
+
if token_budget is not None:
|
|
215
|
+
if not isinstance(token_budget, int) or isinstance(token_budget, bool):
|
|
216
|
+
errors.append(
|
|
217
|
+
f"Phase '{label}' tandem token_budget must be a positive integer"
|
|
218
|
+
)
|
|
219
|
+
elif token_budget <= 0:
|
|
220
|
+
errors.append(
|
|
221
|
+
f"Phase '{label}' tandem token_budget must be a positive integer"
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
# triggers validation (must be list)
|
|
225
|
+
triggers = tandem.get("triggers")
|
|
226
|
+
if triggers is not None and not isinstance(triggers, list):
|
|
227
|
+
errors.append(
|
|
228
|
+
f"Phase '{label}' tandem triggers must be a list"
|
|
229
|
+
)
|
|
230
|
+
|
|
167
231
|
return errors, warnings
|
|
168
232
|
|
|
169
233
|
|
|
@@ -83,10 +83,11 @@ def validate(ctx, fix: bool, strict: bool):
|
|
|
83
83
|
|
|
84
84
|
\b
|
|
85
85
|
Validators:
|
|
86
|
-
sprint
|
|
87
|
-
schema
|
|
88
|
-
agent
|
|
89
|
-
workflow
|
|
86
|
+
sprint - Sprint YAML (epics, initiatives, future, current-sprint)
|
|
87
|
+
schema - XML schema (sessions, skills, workflow steps)
|
|
88
|
+
agent - Agent definitions (required sections, model values, subagent refs)
|
|
89
|
+
workflow - Workflow definitions (phased/stepped/procedural structure)
|
|
90
|
+
skill-command - Skill registry and command files (prefix, deprecated, cross-ref)
|
|
90
91
|
"""
|
|
91
92
|
ctx.ensure_object(dict)
|
|
92
93
|
ctx.obj["fix"] = fix
|
|
@@ -139,3 +140,13 @@ def validate_workflow(ctx):
|
|
|
139
140
|
_print_reports([report])
|
|
140
141
|
if not report.success:
|
|
141
142
|
raise SystemExit(1)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@validate.command("skill-command")
|
|
146
|
+
@click.pass_context
|
|
147
|
+
def validate_skill_command(ctx):
|
|
148
|
+
"""Validate skill registry and command files (prefix, deprecated, cross-ref)."""
|
|
149
|
+
report = _run_validator("skill-command", fix=ctx.obj["fix"], strict=ctx.obj["strict"])
|
|
150
|
+
_print_reports([report])
|
|
151
|
+
if not report.success:
|
|
152
|
+
raise SystemExit(1)
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Benchmark Integration Module
|
|
3
|
-
*
|
|
4
|
-
* Story 11-8: Integrate with Benchmark Output
|
|
5
|
-
* Story 12-6: Update for local results (Epic 12 migration)
|
|
6
|
-
*
|
|
7
|
-
* Correlates Chernoff faces and OCEAN profiles with benchmark performance data.
|
|
8
|
-
* Reads benchmark results from internal/results/ directory (or BENCHMARK_PATH env var).
|
|
9
|
-
*/
|
|
10
|
-
export interface OceanScores {
|
|
11
|
-
O: number;
|
|
12
|
-
C: number;
|
|
13
|
-
E: number;
|
|
14
|
-
A: number;
|
|
15
|
-
N: number;
|
|
16
|
-
}
|
|
17
|
-
export interface BenchmarkResult {
|
|
18
|
-
theme: string;
|
|
19
|
-
role: string;
|
|
20
|
-
character: string;
|
|
21
|
-
scenario: string;
|
|
22
|
-
mean: number;
|
|
23
|
-
stdDev: number;
|
|
24
|
-
delta: number;
|
|
25
|
-
cohensD?: number;
|
|
26
|
-
n: number;
|
|
27
|
-
scores: number[];
|
|
28
|
-
ocean: OceanScores;
|
|
29
|
-
face: string;
|
|
30
|
-
benchmarkMissing?: boolean;
|
|
31
|
-
}
|
|
32
|
-
export interface CorrelationResult {
|
|
33
|
-
O: {
|
|
34
|
-
effect: number;
|
|
35
|
-
direction: 'positive' | 'negative' | 'none';
|
|
36
|
-
};
|
|
37
|
-
C: {
|
|
38
|
-
effect: number;
|
|
39
|
-
direction: 'positive' | 'negative' | 'none';
|
|
40
|
-
};
|
|
41
|
-
E: {
|
|
42
|
-
effect: number;
|
|
43
|
-
direction: 'positive' | 'negative' | 'none';
|
|
44
|
-
};
|
|
45
|
-
A: {
|
|
46
|
-
effect: number;
|
|
47
|
-
direction: 'positive' | 'negative' | 'none';
|
|
48
|
-
};
|
|
49
|
-
N: {
|
|
50
|
-
effect: number;
|
|
51
|
-
direction: 'positive' | 'negative' | 'none';
|
|
52
|
-
};
|
|
53
|
-
strongest: {
|
|
54
|
-
dimension: keyof OceanScores;
|
|
55
|
-
effect: number;
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
export interface OptimalProfile {
|
|
59
|
-
ocean: OceanScores;
|
|
60
|
-
reasoning: string;
|
|
61
|
-
}
|
|
62
|
-
export interface RoleRecommendations {
|
|
63
|
-
role: string;
|
|
64
|
-
topThemes: Array<{
|
|
65
|
-
theme: string;
|
|
66
|
-
character: string;
|
|
67
|
-
score: number;
|
|
68
|
-
ocean: OceanScores;
|
|
69
|
-
}>;
|
|
70
|
-
avoidThemes: Array<{
|
|
71
|
-
theme: string;
|
|
72
|
-
character: string;
|
|
73
|
-
score: number;
|
|
74
|
-
}>;
|
|
75
|
-
insight: string;
|
|
76
|
-
}
|
|
77
|
-
export interface PerformerResult {
|
|
78
|
-
theme: string;
|
|
79
|
-
character: string;
|
|
80
|
-
score: number;
|
|
81
|
-
delta: number;
|
|
82
|
-
ocean: OceanScores;
|
|
83
|
-
face: string;
|
|
84
|
-
}
|
|
85
|
-
export interface QueryOptions {
|
|
86
|
-
scenario?: string;
|
|
87
|
-
role?: string;
|
|
88
|
-
filter?: string;
|
|
89
|
-
ocean?: string;
|
|
90
|
-
limit?: number;
|
|
91
|
-
minScore?: number;
|
|
92
|
-
sortBy?: 'score' | 'delta' | 'name';
|
|
93
|
-
}
|
|
94
|
-
export interface BenchmarkReportResult {
|
|
95
|
-
markdown: string;
|
|
96
|
-
data: {
|
|
97
|
-
performers: PerformerResult[];
|
|
98
|
-
correlation: CorrelationResult;
|
|
99
|
-
recommendations: RoleRecommendations;
|
|
100
|
-
errorCorrelation?: OceanErrorCorrelation;
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
export interface ErrorTypeCell {
|
|
104
|
-
correlation: number;
|
|
105
|
-
arrow: string;
|
|
106
|
-
}
|
|
107
|
-
export interface OceanErrorCorrelation {
|
|
108
|
-
matrix: {
|
|
109
|
-
[dimension: string]: {
|
|
110
|
-
reasoning: ErrorTypeCell;
|
|
111
|
-
planning: ErrorTypeCell;
|
|
112
|
-
execution: ErrorTypeCell;
|
|
113
|
-
};
|
|
114
|
-
};
|
|
115
|
-
strongest: {
|
|
116
|
-
dimension: string;
|
|
117
|
-
errorType: string;
|
|
118
|
-
correlation: number;
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
export interface JudgeScore {
|
|
122
|
-
detection_by_type?: {
|
|
123
|
-
reasoning: number;
|
|
124
|
-
planning: number;
|
|
125
|
-
execution: number;
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
export interface BenchmarkResultWithOcean {
|
|
129
|
-
ocean: OceanScores;
|
|
130
|
-
mean: number;
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Load benchmark data from thunderdome results
|
|
134
|
-
*/
|
|
135
|
-
export declare function loadBenchmarkData(scenario: string, role: string): BenchmarkResult[];
|
|
136
|
-
/**
|
|
137
|
-
* Get benchmark result with face visualization attached
|
|
138
|
-
*/
|
|
139
|
-
export declare function getBenchmarkWithFace(theme: string, role: string, scenario: string): BenchmarkResult | null;
|
|
140
|
-
/**
|
|
141
|
-
* Calculate OCEAN correlation with benchmark performance
|
|
142
|
-
*/
|
|
143
|
-
export declare function calculateOceanCorrelation(scenario: string, role: string): CorrelationResult;
|
|
144
|
-
/**
|
|
145
|
-
* Generate markdown correlation report
|
|
146
|
-
*/
|
|
147
|
-
export declare function generateCorrelationReport(scenario: string, role: string): string;
|
|
148
|
-
/**
|
|
149
|
-
* Get optimal OCEAN profile for a role based on benchmark data
|
|
150
|
-
*/
|
|
151
|
-
export declare function getOptimalProfile(role: string): OptimalProfile;
|
|
152
|
-
/**
|
|
153
|
-
* Get role recommendations (top themes, themes to avoid)
|
|
154
|
-
*/
|
|
155
|
-
export declare function getRoleRecommendations(role: string): RoleRecommendations;
|
|
156
|
-
/**
|
|
157
|
-
* Find top performers for a scenario/role with optional filters
|
|
158
|
-
*/
|
|
159
|
-
export declare function findTopPerformers(options: QueryOptions): PerformerResult[];
|
|
160
|
-
/**
|
|
161
|
-
* General query interface for benchmark data
|
|
162
|
-
*/
|
|
163
|
-
export declare function queryBenchmarks(options: QueryOptions): PerformerResult[];
|
|
164
|
-
/**
|
|
165
|
-
* Calculate OCEAN × error-type correlation matrix
|
|
166
|
-
* Story 14-5: Correlates OCEAN dimensions with error detection rates
|
|
167
|
-
*/
|
|
168
|
-
export declare function calculateErrorTypeCorrelation(results: BenchmarkResultWithOcean[], judgeScores: JudgeScore[]): OceanErrorCorrelation;
|
|
169
|
-
/**
|
|
170
|
-
* Generate markdown heat map for OCEAN × error-type correlations
|
|
171
|
-
* Story 14-5: Produces 5×3 matrix with directional arrows and effect sizes
|
|
172
|
-
*/
|
|
173
|
-
export declare function generateOceanErrorHeatMap(correlation: OceanErrorCorrelation): string;
|
|
174
|
-
/**
|
|
175
|
-
* Generate complete benchmark report with faces and correlations
|
|
176
|
-
*/
|
|
177
|
-
export declare function generateBenchmarkReport(options: {
|
|
178
|
-
scenario: string;
|
|
179
|
-
role: string;
|
|
180
|
-
includeErrorTypeCorrelation?: boolean;
|
|
181
|
-
}): BenchmarkReportResult;
|
|
182
|
-
//# sourceMappingURL=benchmark-integration.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"benchmark-integration.d.ts","sourceRoot":"","sources":["../../src/scripts/benchmark-integration.ts"],"names":[],"mappings":"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"}
|