@pennyfarthing/core 10.0.5 → 10.2.0
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 +19 -22
- package/package.json +17 -11
- package/packages/core/dist/cli/commands/doctor-file-layout.test.js.map +1 -1
- package/packages/core/dist/cli/commands/doctor-legacy.test.js +24 -0
- package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -1
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +346 -13
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/commands/e2e-fresh-install.test.js +1 -1
- package/packages/core/dist/cli/commands/e2e-fresh-install.test.js.map +1 -1
- package/packages/core/dist/cli/commands/e2e-upgrade.test.js +1 -1
- package/packages/core/dist/cli/commands/e2e-upgrade.test.js.map +1 -1
- package/packages/core/dist/cli/commands/hooks-consolidation.test.js +2 -2
- package/packages/core/dist/cli/commands/hooks-consolidation.test.js.map +1 -1
- package/packages/core/dist/cli/commands/init-consolidation.test.js.map +1 -1
- package/packages/core/dist/cli/commands/init.d.ts +7 -0
- package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/init.js +41 -8
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/uninstall.js +24 -13
- package/packages/core/dist/cli/commands/uninstall.js.map +1 -1
- package/packages/core/dist/cli/commands/update-consolidation.test.js +0 -10
- package/packages/core/dist/cli/commands/update-consolidation.test.js.map +1 -1
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +26 -0
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/index.js +1 -1
- package/packages/core/dist/cli/index.js.map +1 -1
- package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -1
- package/packages/core/dist/cli/theme-maker.test.js +64 -115
- package/packages/core/dist/cli/theme-maker.test.js.map +1 -1
- package/packages/core/dist/cli/utils/python.d.ts +22 -0
- package/packages/core/dist/cli/utils/python.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/python.js +102 -0
- package/packages/core/dist/cli/utils/python.js.map +1 -0
- package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/settings.js +10 -0
- package/packages/core/dist/cli/utils/settings.js.map +1 -1
- package/packages/core/dist/index.d.ts +1 -1
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/index.js +2 -2
- package/packages/core/dist/index.js.map +1 -1
- package/packages/core/dist/plugins/plugin-discovery.d.ts +116 -0
- package/packages/core/dist/plugins/plugin-discovery.d.ts.map +1 -0
- package/packages/core/dist/plugins/plugin-discovery.js +165 -0
- package/packages/core/dist/plugins/plugin-discovery.js.map +1 -0
- package/packages/core/dist/plugins/plugin-discovery.test.d.ts +22 -0
- package/packages/core/dist/plugins/plugin-discovery.test.d.ts.map +1 -0
- package/packages/core/dist/plugins/plugin-discovery.test.js +498 -0
- package/packages/core/dist/plugins/plugin-discovery.test.js.map +1 -0
- package/packages/core/dist/scripts/generate-spider-report.js.map +1 -1
- package/packages/core/dist/workflow/context-watch.d.ts +80 -0
- package/packages/core/dist/workflow/context-watch.d.ts.map +1 -0
- package/packages/core/dist/workflow/context-watch.js +235 -0
- package/packages/core/dist/workflow/context-watch.js.map +1 -0
- package/packages/core/dist/workflow/context-watch.test.d.ts +1 -0
- package/packages/core/dist/workflow/context-watch.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/context-watch.test.js +746 -0
- package/packages/core/dist/workflow/context-watch.test.js.map +1 -0
- package/packages/core/dist/workflow/file-watch.d.ts +82 -0
- package/packages/core/dist/workflow/file-watch.d.ts.map +1 -0
- package/packages/core/dist/workflow/file-watch.js +198 -0
- package/packages/core/dist/workflow/file-watch.js.map +1 -0
- package/packages/core/dist/workflow/file-watch.test.d.ts +21 -0
- package/packages/core/dist/workflow/file-watch.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/file-watch.test.js +469 -0
- package/packages/core/dist/workflow/file-watch.test.js.map +1 -0
- package/packages/core/dist/workflow/observation-writer.d.ts +79 -0
- package/packages/core/dist/workflow/observation-writer.d.ts.map +1 -0
- package/packages/core/dist/workflow/observation-writer.js +97 -0
- package/packages/core/dist/workflow/observation-writer.js.map +1 -0
- package/packages/core/dist/workflow/observation-writer.test.d.ts +18 -0
- package/packages/core/dist/workflow/observation-writer.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/observation-writer.test.js +424 -0
- package/packages/core/dist/workflow/observation-writer.test.js.map +1 -0
- package/packages/core/dist/workflow/story-workflow-routing.test.js +4 -2
- package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -1
- package/packages/core/dist/workflow/tandem-lifecycle.d.ts +117 -0
- package/packages/core/dist/workflow/tandem-lifecycle.d.ts.map +1 -0
- package/packages/core/dist/workflow/tandem-lifecycle.js +186 -0
- package/packages/core/dist/workflow/tandem-lifecycle.js.map +1 -0
- package/packages/core/dist/workflow/tandem-lifecycle.test.d.ts +16 -0
- package/packages/core/dist/workflow/tandem-lifecycle.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/tandem-lifecycle.test.js +531 -0
- package/packages/core/dist/workflow/tandem-lifecycle.test.js.map +1 -0
- package/packages/core/dist/workflow/tool-watch.d.ts +68 -0
- package/packages/core/dist/workflow/tool-watch.d.ts.map +1 -0
- package/packages/core/dist/workflow/tool-watch.js +166 -0
- package/packages/core/dist/workflow/tool-watch.js.map +1 -0
- package/packages/core/dist/workflow/tool-watch.test.d.ts +18 -0
- package/packages/core/dist/workflow/tool-watch.test.d.ts.map +1 -0
- package/packages/core/dist/workflow/tool-watch.test.js +718 -0
- package/packages/core/dist/workflow/tool-watch.test.js.map +1 -0
- package/packages/core/dist/workflow/workflow-migration.test.js +8 -4
- package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.d.ts +7 -0
- package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
- package/packages/core/dist/workflow/workflow-schema.js +44 -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 +192 -0
- package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -1
- package/pennyfarthing-dist/agents/README.md +1 -3
- package/pennyfarthing-dist/agents/architect.md +0 -6
- package/pennyfarthing-dist/agents/devops.md +0 -6
- package/pennyfarthing-dist/agents/handoff.md +18 -3
- package/pennyfarthing-dist/agents/orchestrator.md +0 -6
- package/pennyfarthing-dist/agents/pm.md +0 -6
- package/pennyfarthing-dist/agents/sm-finish.md +1 -1
- package/pennyfarthing-dist/agents/sm-handoff.md +27 -4
- package/pennyfarthing-dist/agents/sm.md +11 -11
- package/pennyfarthing-dist/agents/tandem-backseat.md +119 -0
- package/pennyfarthing-dist/commands/architect.md +11 -3
- package/pennyfarthing-dist/commands/close-epic.md +24 -131
- package/pennyfarthing-dist/commands/create-theme.md +14 -24
- package/pennyfarthing-dist/commands/dev.md +11 -3
- package/pennyfarthing-dist/commands/devops.md +11 -3
- package/pennyfarthing-dist/commands/health-check.md +1 -3
- package/pennyfarthing-dist/commands/help.md +8 -12
- package/pennyfarthing-dist/commands/list-themes.md +14 -16
- package/pennyfarthing-dist/commands/orchestrator.md +11 -3
- package/pennyfarthing-dist/commands/parallel-work.md +1 -3
- package/pennyfarthing-dist/commands/pm.md +11 -3
- package/pennyfarthing-dist/commands/prime.md +6 -6
- package/pennyfarthing-dist/commands/reviewer.md +11 -3
- package/pennyfarthing-dist/commands/run-ci.md +1 -1
- package/pennyfarthing-dist/commands/set-theme.md +14 -51
- package/pennyfarthing-dist/commands/setup.md +5 -1
- package/pennyfarthing-dist/commands/show-theme.md +14 -16
- package/pennyfarthing-dist/commands/sm.md +11 -3
- package/pennyfarthing-dist/commands/tea.md +11 -3
- package/pennyfarthing-dist/commands/tech-writer.md +11 -3
- package/pennyfarthing-dist/commands/theme-maker.md +14 -671
- package/pennyfarthing-dist/commands/theme.md +95 -0
- package/pennyfarthing-dist/commands/ux-designer.md +11 -3
- package/pennyfarthing-dist/commands/work.md +3 -5
- package/pennyfarthing-dist/guides/agent-behavior.md +62 -6
- package/pennyfarthing-dist/guides/agent-coordination.md +11 -13
- package/pennyfarthing-dist/guides/agent-template-tactical.md +2 -3
- package/pennyfarthing-dist/guides/bikelane.md +3 -2
- package/pennyfarthing-dist/guides/command-tag-taxonomy.md +212 -0
- package/pennyfarthing-dist/guides/hooks.md +5 -5
- package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +3 -3
- package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +9 -59
- package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -5
- package/pennyfarthing-dist/guides/prime.md +2 -2
- package/pennyfarthing-dist/guides/scale-levels.md +4 -6
- package/pennyfarthing-dist/guides/skill-schema.md +4 -4
- package/pennyfarthing-dist/guides/tandem-protocol.md +158 -0
- package/pennyfarthing-dist/personas/themes/discworld.yaml +1 -1
- package/pennyfarthing-dist/personas/themes/fifth-element.yaml +295 -0
- package/pennyfarthing-dist/scripts/README.md +1 -1
- package/pennyfarthing-dist/scripts/core/agent-session.sh +6 -2
- package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
- package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -0
- package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
- package/pennyfarthing-dist/scripts/core/prime.sh +8 -10
- package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
- package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
- package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
- package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +8 -6
- package/pennyfarthing-dist/scripts/git/release.sh +0 -0
- package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
- package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +131 -54
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/post-merge.sh +32 -15
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +4 -3
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-push.sh +11 -5
- package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
- package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
- package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
- package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
- package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/README.md +1 -1
- package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
- package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
- package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/statusline.sh +50 -8
- package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
- package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +1 -2
- package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -0
- package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
- package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
- package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +5 -5
- package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +3 -79
- package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
- package/pennyfarthing-dist/scripts/theme/README.md +1 -1
- package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
- package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -1
- package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
- package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/finish-story.sh +10 -144
- package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
- package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
- package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
- package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +2 -2
- package/pennyfarthing-dist/skills/skill-registry.schema.json +8 -0
- package/pennyfarthing-dist/skills/skill-registry.yaml +21 -17
- package/pennyfarthing-dist/skills/sprint/skill.md +25 -2
- package/pennyfarthing-dist/skills/story/scripts/create-story.sh +0 -0
- package/pennyfarthing-dist/skills/story/scripts/size-story.sh +0 -0
- package/pennyfarthing-dist/skills/story/scripts/story-template.sh +0 -0
- package/pennyfarthing-dist/skills/theme/skill.md +290 -75
- package/pennyfarthing-dist/skills/theme-creation/SKILL.md +23 -166
- package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +0 -0
- package/pennyfarthing-dist/skills/workflow/skill.md +27 -4
- package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -11
- package/pennyfarthing-dist/templates/auto-load-sm.sh.template +14 -0
- package/pennyfarthing-dist/templates/settings.local.json.template +9 -0
- package/pennyfarthing-dist/workflows/2party-tdd.yaml +399 -0
- package/pennyfarthing-dist/workflows/architecture/workflow.yaml +65 -0
- package/pennyfarthing-dist/workflows/bdd-tandem.yaml +70 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +41 -24
- package/pennyfarthing-dist/workflows/tdd-tandem.yaml +61 -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__/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__/schema_validation_hook.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/bellmode_hook.py +202 -47
- package/pennyfarthing_scripts/brownfield/__init__.py +6 -6
- package/pennyfarthing_scripts/brownfield/__main__.py +1 -0
- 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/brownfield/cli.py +0 -1
- package/pennyfarthing_scripts/brownfield/discover.py +1 -2
- package/pennyfarthing_scripts/cli.py +23 -3
- package/pennyfarthing_scripts/codemarkers/__init__.py +23 -0
- package/pennyfarthing_scripts/codemarkers/__main__.py +6 -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/codemarkers/analyze.py +501 -0
- package/pennyfarthing_scripts/codemarkers/cli.py +179 -0
- package/pennyfarthing_scripts/codemarkers/formatters.py +88 -0
- package/pennyfarthing_scripts/codemarkers/models.py +60 -0
- package/pennyfarthing_scripts/common/__init__.py +8 -9
- package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/common/config.py +1 -1
- package/pennyfarthing_scripts/complexity/__init__.py +15 -0
- package/pennyfarthing_scripts/complexity/__main__.py +6 -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/complexity/analyze.py +207 -0
- package/pennyfarthing_scripts/complexity/cli.py +82 -0
- package/pennyfarthing_scripts/complexity/formatters.py +64 -0
- package/pennyfarthing_scripts/complexity/models.py +32 -0
- package/pennyfarthing_scripts/context.py +14 -15
- package/pennyfarthing_scripts/deadcode/__init__.py +6 -0
- package/pennyfarthing_scripts/deadcode/__main__.py +6 -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/deadcode/analyze.py +322 -0
- package/pennyfarthing_scripts/deadcode/cli.py +163 -0
- package/pennyfarthing_scripts/deadcode/formatters.py +106 -0
- package/pennyfarthing_scripts/deadcode/models.py +54 -0
- package/pennyfarthing_scripts/dependencies/__init__.py +20 -0
- package/pennyfarthing_scripts/dependencies/__main__.py +5 -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/dependencies/analyze.py +155 -0
- package/pennyfarthing_scripts/dependencies/cli.py +76 -0
- package/pennyfarthing_scripts/dependencies/formatters.py +63 -0
- package/pennyfarthing_scripts/dependencies/models.py +39 -0
- package/pennyfarthing_scripts/git/__init__.py +5 -5
- 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/create_branches.py +3 -2
- package/pennyfarthing_scripts/git/status_all.py +1 -1
- package/pennyfarthing_scripts/healthscore/__init__.py +21 -0
- package/pennyfarthing_scripts/healthscore/__main__.py +14 -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/healthscore/analyze.py +591 -0
- package/pennyfarthing_scripts/healthscore/cli.py +80 -0
- package/pennyfarthing_scripts/healthscore/formatters.py +46 -0
- package/pennyfarthing_scripts/healthscore/models.py +43 -0
- package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
- package/pennyfarthing_scripts/hooks.py +8 -11
- package/pennyfarthing_scripts/hotspots/__init__.py +6 -6
- 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/hotspots/analyze.py +155 -14
- package/pennyfarthing_scripts/hotspots/cli.py +12 -10
- package/pennyfarthing_scripts/hotspots/models.py +0 -1
- package/pennyfarthing_scripts/jira/__init__.py +15 -17
- 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/jira/bidirectional.py +44 -18
- package/pennyfarthing_scripts/jira/claim.py +21 -0
- package/pennyfarthing_scripts/jira/cli.py +6 -3
- package/pennyfarthing_scripts/jira/client.py +32 -4
- package/pennyfarthing_scripts/jira/create.py +45 -1
- package/pennyfarthing_scripts/jira/epic.py +3 -2
- package/pennyfarthing_scripts/jira/reconcile.py +0 -1
- package/pennyfarthing_scripts/jira/story.py +2 -0
- package/pennyfarthing_scripts/jira/sync.py +1 -1
- 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/migration/skill.py +0 -1
- package/pennyfarthing_scripts/migration/step.py +0 -1
- package/pennyfarthing_scripts/migration/validate.py +8 -5
- package/pennyfarthing_scripts/patch_mode.py +2 -2
- package/pennyfarthing_scripts/preflight/__init__.py +1 -1
- 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/preflight/finish.py +0 -1
- package/pennyfarthing_scripts/pretooluse_hook.py +6 -7
- 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__/workflow.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/cli.py +5 -1
- package/pennyfarthing_scripts/prime/loader.py +2 -3
- package/pennyfarthing_scripts/prime/persona.py +2 -1
- package/pennyfarthing_scripts/prime/tiers.py +4 -4
- package/pennyfarthing_scripts/schema_validation_hook.py +2 -3
- package/pennyfarthing_scripts/sprint/__init__.py +10 -12
- package/pennyfarthing_scripts/sprint/__main__.py +2 -2
- 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__/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/archive.py +0 -1
- package/pennyfarthing_scripts/sprint/archive_epic.py +198 -97
- package/pennyfarthing_scripts/sprint/cli.py +62 -46
- package/pennyfarthing_scripts/sprint/epic_add.py +8 -1
- package/pennyfarthing_scripts/sprint/import_epic.py +42 -18
- package/pennyfarthing_scripts/sprint/loader.py +6 -0
- package/pennyfarthing_scripts/sprint/status.py +1 -2
- package/pennyfarthing_scripts/sprint/story_add.py +202 -27
- package/pennyfarthing_scripts/sprint/story_finish.py +209 -0
- package/pennyfarthing_scripts/sprint/story_update.py +11 -3
- package/pennyfarthing_scripts/sprint/validate_cmd.py +0 -1
- package/pennyfarthing_scripts/sprint/validator.py +120 -6
- package/pennyfarthing_scripts/sprint/work.py +28 -7
- package/pennyfarthing_scripts/sprint/yaml_io.py +10 -2
- package/pennyfarthing_scripts/story/__init__.py +14 -16
- 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/story/size.py +0 -1
- package/pennyfarthing_scripts/story/template.py +0 -1
- package/pennyfarthing_scripts/swebench.py +1 -2
- 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_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_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_git_utils.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_sprint_package.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_validate_cmd.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/conftest.py +1 -2
- package/pennyfarthing_scripts/tests/test_brownfield.py +10 -13
- package/pennyfarthing_scripts/tests/test_cli_modules.py +0 -4
- package/pennyfarthing_scripts/tests/test_codemarkers.py +687 -0
- package/pennyfarthing_scripts/tests/test_common.py +9 -4
- package/pennyfarthing_scripts/tests/test_epic_shard_validation.py +699 -0
- package/pennyfarthing_scripts/tests/test_git_utils.py +10 -13
- package/pennyfarthing_scripts/tests/test_healthscore.py +516 -0
- package/pennyfarthing_scripts/tests/test_jira_package.py +0 -3
- package/pennyfarthing_scripts/tests/test_package_structure.py +3 -16
- package/pennyfarthing_scripts/tests/test_patch_mode.py +7 -11
- package/pennyfarthing_scripts/tests/test_prime.py +39 -21
- package/pennyfarthing_scripts/tests/test_sprint_package.py +3 -8
- package/pennyfarthing_scripts/tests/test_sprint_validator.py +53 -5
- package/pennyfarthing_scripts/tests/test_story_add.py +3 -7
- package/pennyfarthing_scripts/tests/test_story_package.py +0 -3
- package/pennyfarthing_scripts/tests/test_story_update.py +5 -10
- package/pennyfarthing_scripts/tests/test_tiers.py +18 -17
- package/pennyfarthing_scripts/tests/test_token_counting.py +19 -13
- package/pennyfarthing_scripts/tests/test_validate_cmd.py +2 -7
- package/pennyfarthing_scripts/tests/test_workflow_check.py +0 -2
- package/pennyfarthing_scripts/tests/test_yaml_io.py +0 -3
- package/pennyfarthing_scripts/theme/__init__.py +5 -0
- package/pennyfarthing_scripts/theme/__main__.py +6 -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/theme/cli.py +287 -0
- package/pennyfarthing_scripts/validate/__init__.py +21 -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/__init__.py +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/agent.py +239 -0
- package/pennyfarthing_scripts/validate/adapters/schema.py +30 -0
- package/pennyfarthing_scripts/validate/adapters/skill_command.py +292 -0
- package/pennyfarthing_scripts/validate/adapters/sprint.py +69 -0
- package/pennyfarthing_scripts/validate/adapters/workflow.py +320 -0
- package/pennyfarthing_scripts/validate/cli.py +141 -0
- package/pennyfarthing_scripts/welcome_hook.py +2 -3
- package/pennyfarthing_scripts/workflow.py +3 -3
- package/scripts/README.md +41 -0
- package/pennyfarthing-dist/agents/workflow-status-check.md +0 -96
- package/pennyfarthing-dist/commands/benchmark-control.md +0 -69
- package/pennyfarthing-dist/commands/benchmark.md +0 -485
- package/pennyfarthing-dist/commands/job-fair.md +0 -102
- package/pennyfarthing-dist/commands/solo.md +0 -447
- package/pennyfarthing-dist/guides/benchmarks.md +0 -62
- package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +0 -59
- package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +0 -220
- package/pennyfarthing-dist/scripts/test/swebench-judge.py +0 -374
- package/pennyfarthing-dist/scripts/test/test-cache.sh +0 -165
- package/pennyfarthing-dist/scripts/test/test-setup.sh +0 -337
- package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +0 -13
- package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +0 -402
- package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +0 -97
- package/pennyfarthing-dist/skills/finalize-run/SKILL.md +0 -261
- package/pennyfarthing-dist/skills/judge/SKILL.md +0 -644
- package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +0 -187
- package/pennyfarthing-dist/workflows/dev-story/checklist.md +0 -80
- package/pennyfarthing-dist/workflows/dev-story/instructions.xml +0 -410
- package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +0 -50
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +0 -201
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +0 -156
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +0 -140
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +0 -203
- package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +0 -74
- package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +0 -27
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/pretooluse_hook.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
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
"""Workflow YAML schema validator adapter.
|
|
2
|
+
|
|
3
|
+
Validates workflow definition files in pennyfarthing-dist/workflows/.
|
|
4
|
+
Checks common fields, variant-specific structure (phased/stepped/procedural),
|
|
5
|
+
and cross-references agent names against agent definitions.
|
|
6
|
+
|
|
7
|
+
Story: MSSCI-14709 (91-11)
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
import yaml
|
|
15
|
+
|
|
16
|
+
from pennyfarthing_scripts.validate import ValidateReport
|
|
17
|
+
|
|
18
|
+
# Known workflow types
|
|
19
|
+
VALID_TYPES = {"phased", "stepped", "procedural"}
|
|
20
|
+
|
|
21
|
+
# Known gate types for phased workflows
|
|
22
|
+
VALID_GATE_TYPES = {
|
|
23
|
+
"tests_pass",
|
|
24
|
+
"tests_fail",
|
|
25
|
+
"approval",
|
|
26
|
+
"manual",
|
|
27
|
+
"validation",
|
|
28
|
+
"design_review",
|
|
29
|
+
"quality_pass",
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def discover_workflow_files(workflows_dir: Path) -> list[Path]:
|
|
34
|
+
"""Discover all workflow YAML files.
|
|
35
|
+
|
|
36
|
+
Finds root-level *.yaml files and subdirectory workflow.yaml files.
|
|
37
|
+
Excludes non-workflow YAML (e.g., templates).
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
Sorted list of Path objects for workflow YAML files.
|
|
41
|
+
"""
|
|
42
|
+
files: list[Path] = []
|
|
43
|
+
|
|
44
|
+
if not workflows_dir.is_dir():
|
|
45
|
+
return files
|
|
46
|
+
|
|
47
|
+
# Root-level *.yaml files
|
|
48
|
+
for f in sorted(workflows_dir.glob("*.yaml")):
|
|
49
|
+
files.append(f)
|
|
50
|
+
|
|
51
|
+
# Subdirectory workflow.yaml files
|
|
52
|
+
for f in sorted(workflows_dir.glob("*/workflow.yaml")):
|
|
53
|
+
files.append(f)
|
|
54
|
+
|
|
55
|
+
return files
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _get_agent_stems(agents_dir: Path) -> set[str]:
|
|
59
|
+
"""Get set of agent file stems from agents directory."""
|
|
60
|
+
if not agents_dir.is_dir():
|
|
61
|
+
return set()
|
|
62
|
+
return {f.stem for f in agents_dir.glob("*.md") if f.name != "README.md"}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _check_agent_ref(
|
|
66
|
+
agent_name: str, agent_stems: set[str], context: str
|
|
67
|
+
) -> list[str]:
|
|
68
|
+
"""Check if an agent reference exists. Returns warnings for unknown agents."""
|
|
69
|
+
warnings: list[str] = []
|
|
70
|
+
if agent_name and agent_name not in agent_stems:
|
|
71
|
+
warnings.append(
|
|
72
|
+
f"Agent '{agent_name}' referenced in {context} not found in agents/"
|
|
73
|
+
)
|
|
74
|
+
return warnings
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def validate_common(data: dict, path: Path) -> tuple[list[str], list[str]]:
|
|
78
|
+
"""Validate common fields present in all workflow types.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
(errors, warnings) — two lists of message strings.
|
|
82
|
+
"""
|
|
83
|
+
errors: list[str] = []
|
|
84
|
+
warnings: list[str] = []
|
|
85
|
+
|
|
86
|
+
if "name" not in data:
|
|
87
|
+
errors.append("Missing required field: name")
|
|
88
|
+
|
|
89
|
+
wtype = data.get("type")
|
|
90
|
+
if wtype is not None and wtype not in VALID_TYPES:
|
|
91
|
+
errors.append(
|
|
92
|
+
f"Invalid type '{wtype}' (must be one of: {', '.join(sorted(VALID_TYPES))})"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if "description" not in data:
|
|
96
|
+
warnings.append("Missing recommended field: description")
|
|
97
|
+
|
|
98
|
+
return errors, warnings
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def validate_phased(
|
|
102
|
+
data: dict, path: Path, agents_dir: Path
|
|
103
|
+
) -> tuple[list[str], list[str]]:
|
|
104
|
+
"""Validate phased workflow structure.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
(errors, warnings) — two lists of message strings.
|
|
108
|
+
"""
|
|
109
|
+
errors: list[str] = []
|
|
110
|
+
warnings: list[str] = []
|
|
111
|
+
agent_stems = _get_agent_stems(agents_dir)
|
|
112
|
+
|
|
113
|
+
phases = data.get("phases")
|
|
114
|
+
|
|
115
|
+
if phases is None:
|
|
116
|
+
errors.append("Missing required field: phases")
|
|
117
|
+
return errors, warnings
|
|
118
|
+
|
|
119
|
+
if not isinstance(phases, list):
|
|
120
|
+
errors.append("Field 'phases' must be a list")
|
|
121
|
+
return errors, warnings
|
|
122
|
+
|
|
123
|
+
if len(phases) == 0:
|
|
124
|
+
errors.append("Field 'phases' must not be empty")
|
|
125
|
+
return errors, warnings
|
|
126
|
+
|
|
127
|
+
seen_names: set[str] = set()
|
|
128
|
+
|
|
129
|
+
for i, phase in enumerate(phases):
|
|
130
|
+
if not isinstance(phase, dict):
|
|
131
|
+
errors.append(f"Phase {i} must be a mapping")
|
|
132
|
+
continue
|
|
133
|
+
|
|
134
|
+
phase_name = phase.get("name")
|
|
135
|
+
if not phase_name:
|
|
136
|
+
errors.append(f"Phase {i} missing required field: name")
|
|
137
|
+
else:
|
|
138
|
+
if phase_name in seen_names:
|
|
139
|
+
warnings.append(f"Duplicate phase name: '{phase_name}'")
|
|
140
|
+
seen_names.add(phase_name)
|
|
141
|
+
|
|
142
|
+
agent = phase.get("agent")
|
|
143
|
+
if not agent:
|
|
144
|
+
errors.append(
|
|
145
|
+
f"Phase {i}{' (' + phase_name + ')' if phase_name else ''} "
|
|
146
|
+
f"missing required field: agent"
|
|
147
|
+
)
|
|
148
|
+
else:
|
|
149
|
+
warnings.extend(
|
|
150
|
+
_check_agent_ref(agent, agent_stems, f"phase '{phase_name or i}'")
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Gate validation
|
|
154
|
+
gate = phase.get("gate")
|
|
155
|
+
if gate and isinstance(gate, dict):
|
|
156
|
+
gate_type = gate.get("type")
|
|
157
|
+
if gate_type is None:
|
|
158
|
+
errors.append(
|
|
159
|
+
f"Phase '{phase_name or i}' gate missing required field: type"
|
|
160
|
+
)
|
|
161
|
+
elif gate_type not in VALID_GATE_TYPES:
|
|
162
|
+
warnings.append(
|
|
163
|
+
f"Phase '{phase_name or i}' has unknown gate type: "
|
|
164
|
+
f"'{gate_type}'"
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
return errors, warnings
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def validate_stepped(
|
|
171
|
+
data: dict, path: Path, agents_dir: Path
|
|
172
|
+
) -> tuple[list[str], list[str]]:
|
|
173
|
+
"""Validate stepped workflow structure.
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
(errors, warnings) — two lists of message strings.
|
|
177
|
+
"""
|
|
178
|
+
errors: list[str] = []
|
|
179
|
+
warnings: list[str] = []
|
|
180
|
+
agent_stems = _get_agent_stems(agents_dir)
|
|
181
|
+
|
|
182
|
+
agent = data.get("agent")
|
|
183
|
+
if not agent:
|
|
184
|
+
errors.append("Missing required field: agent")
|
|
185
|
+
else:
|
|
186
|
+
warnings.extend(_check_agent_ref(agent, agent_stems, "workflow"))
|
|
187
|
+
|
|
188
|
+
steps = data.get("steps")
|
|
189
|
+
if steps is None:
|
|
190
|
+
errors.append("Missing required field: steps")
|
|
191
|
+
return errors, warnings
|
|
192
|
+
|
|
193
|
+
if not isinstance(steps, dict):
|
|
194
|
+
errors.append("Field 'steps' must be a mapping")
|
|
195
|
+
return errors, warnings
|
|
196
|
+
|
|
197
|
+
if "path" not in steps:
|
|
198
|
+
errors.append("Missing required field: steps.path")
|
|
199
|
+
|
|
200
|
+
if "pattern" not in steps:
|
|
201
|
+
errors.append("Missing required field: steps.pattern")
|
|
202
|
+
|
|
203
|
+
return errors, warnings
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def validate_procedural(
|
|
207
|
+
data: dict, path: Path, agents_dir: Path
|
|
208
|
+
) -> tuple[list[str], list[str]]:
|
|
209
|
+
"""Validate procedural workflow structure.
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
(errors, warnings) — two lists of message strings.
|
|
213
|
+
"""
|
|
214
|
+
errors: list[str] = []
|
|
215
|
+
warnings: list[str] = []
|
|
216
|
+
agent_stems = _get_agent_stems(agents_dir)
|
|
217
|
+
|
|
218
|
+
agent = data.get("agent")
|
|
219
|
+
if not agent:
|
|
220
|
+
errors.append("Missing required field: agent")
|
|
221
|
+
else:
|
|
222
|
+
warnings.extend(_check_agent_ref(agent, agent_stems, "workflow"))
|
|
223
|
+
|
|
224
|
+
if "instructions" not in data and "checklist" not in data:
|
|
225
|
+
warnings.append(
|
|
226
|
+
"Missing recommended field: instructions or checklist"
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
return errors, warnings
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def run(root: Path, *, fix: bool = False, strict: bool = False) -> ValidateReport:
|
|
233
|
+
"""Validate all workflow definition files."""
|
|
234
|
+
report = ValidateReport(validator="workflow")
|
|
235
|
+
workflows_dir = root / "pennyfarthing-dist" / "workflows"
|
|
236
|
+
|
|
237
|
+
if not workflows_dir.is_dir():
|
|
238
|
+
report.details.append("[ERROR] workflows directory not found")
|
|
239
|
+
report.errors += 1
|
|
240
|
+
return report
|
|
241
|
+
|
|
242
|
+
agents_dir = root / "pennyfarthing-dist" / "agents"
|
|
243
|
+
files = discover_workflow_files(workflows_dir)
|
|
244
|
+
|
|
245
|
+
for path in files:
|
|
246
|
+
try:
|
|
247
|
+
content = path.read_text()
|
|
248
|
+
raw = yaml.safe_load(content)
|
|
249
|
+
except yaml.YAMLError:
|
|
250
|
+
report.errors += 1
|
|
251
|
+
report.details.append(f"[ERROR] {path.name}: YAML parse error")
|
|
252
|
+
continue
|
|
253
|
+
|
|
254
|
+
if not isinstance(raw, dict) or "workflow" not in raw:
|
|
255
|
+
report.errors += 1
|
|
256
|
+
report.details.append(
|
|
257
|
+
f"[ERROR] {path.name}: Missing 'workflow' top-level key"
|
|
258
|
+
)
|
|
259
|
+
continue
|
|
260
|
+
|
|
261
|
+
data = raw["workflow"]
|
|
262
|
+
|
|
263
|
+
if not isinstance(data, dict):
|
|
264
|
+
report.errors += 1
|
|
265
|
+
report.details.append(
|
|
266
|
+
f"[ERROR] {path.name}: 'workflow' must be a mapping"
|
|
267
|
+
)
|
|
268
|
+
continue
|
|
269
|
+
|
|
270
|
+
file_errors: list[str] = []
|
|
271
|
+
file_warnings: list[str] = []
|
|
272
|
+
|
|
273
|
+
# Common validation
|
|
274
|
+
common_errors, common_warnings = validate_common(data, path)
|
|
275
|
+
file_errors.extend(common_errors)
|
|
276
|
+
file_warnings.extend(common_warnings)
|
|
277
|
+
|
|
278
|
+
# Variant-specific validation
|
|
279
|
+
wtype = data.get("type", "phased")
|
|
280
|
+
|
|
281
|
+
if wtype == "phased":
|
|
282
|
+
variant_errors, variant_warnings = validate_phased(
|
|
283
|
+
data, path, agents_dir
|
|
284
|
+
)
|
|
285
|
+
elif wtype == "stepped":
|
|
286
|
+
variant_errors, variant_warnings = validate_stepped(
|
|
287
|
+
data, path, agents_dir
|
|
288
|
+
)
|
|
289
|
+
elif wtype == "procedural":
|
|
290
|
+
variant_errors, variant_warnings = validate_procedural(
|
|
291
|
+
data, path, agents_dir
|
|
292
|
+
)
|
|
293
|
+
else:
|
|
294
|
+
variant_errors, variant_warnings = [], []
|
|
295
|
+
|
|
296
|
+
file_errors.extend(variant_errors)
|
|
297
|
+
file_warnings.extend(variant_warnings)
|
|
298
|
+
|
|
299
|
+
# Determine display name (use parent/name for subdirectory workflows)
|
|
300
|
+
if path.name == "workflow.yaml":
|
|
301
|
+
display = f"{path.parent.name}/{path.name}"
|
|
302
|
+
else:
|
|
303
|
+
display = path.name
|
|
304
|
+
|
|
305
|
+
for e in file_errors:
|
|
306
|
+
report.errors += 1
|
|
307
|
+
report.details.append(f"[ERROR] {display}: {e}")
|
|
308
|
+
|
|
309
|
+
for w in file_warnings:
|
|
310
|
+
if strict:
|
|
311
|
+
report.errors += 1
|
|
312
|
+
report.details.append(f"[ERROR] {display}: {w}")
|
|
313
|
+
else:
|
|
314
|
+
report.warnings += 1
|
|
315
|
+
report.details.append(f"[WARN] {display}: {w}")
|
|
316
|
+
|
|
317
|
+
if not file_errors:
|
|
318
|
+
report.passed += 1
|
|
319
|
+
|
|
320
|
+
return report
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""Validate CLI — top-level validation command.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
pf validate # Run all validators
|
|
5
|
+
pf validate sprint # Sprint YAML only
|
|
6
|
+
pf validate schema # XML schema only
|
|
7
|
+
pf validate --fix # Auto-fix where supported
|
|
8
|
+
pf validate --strict # Treat warnings as errors
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import click
|
|
14
|
+
|
|
15
|
+
from pennyfarthing_scripts.common.config import get_project_root
|
|
16
|
+
from pennyfarthing_scripts.common.output import error, header, info, success, warn
|
|
17
|
+
from pennyfarthing_scripts.validate import ValidateReport
|
|
18
|
+
|
|
19
|
+
VALIDATORS = {
|
|
20
|
+
"sprint": "pennyfarthing_scripts.validate.adapters.sprint",
|
|
21
|
+
"schema": "pennyfarthing_scripts.validate.adapters.schema",
|
|
22
|
+
"agent": "pennyfarthing_scripts.validate.adapters.agent",
|
|
23
|
+
"workflow": "pennyfarthing_scripts.validate.adapters.workflow",
|
|
24
|
+
"skill-command": "pennyfarthing_scripts.validate.adapters.skill_command",
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _run_validator(name: str, *, fix: bool, strict: bool) -> ValidateReport:
|
|
29
|
+
"""Run a single validator by name."""
|
|
30
|
+
import importlib
|
|
31
|
+
|
|
32
|
+
mod = importlib.import_module(VALIDATORS[name])
|
|
33
|
+
root = get_project_root()
|
|
34
|
+
return mod.run(root, fix=fix, strict=strict)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _print_reports(reports: list[ValidateReport]) -> None:
|
|
38
|
+
"""Print validation reports with color output."""
|
|
39
|
+
for report in reports:
|
|
40
|
+
header(f"Validator: {report.validator}", char="-", width=50)
|
|
41
|
+
|
|
42
|
+
if report.details:
|
|
43
|
+
for line in report.details:
|
|
44
|
+
if "[ERROR]" in line or "[SYNTAX]" in line or "[SCHEMA]" in line:
|
|
45
|
+
error(line)
|
|
46
|
+
elif "[WARN]" in line or "[FORMAT]" in line:
|
|
47
|
+
warn(line)
|
|
48
|
+
else:
|
|
49
|
+
click.echo(f" {line}", err=True)
|
|
50
|
+
|
|
51
|
+
parts = [f"{report.passed} passed"]
|
|
52
|
+
if report.warnings:
|
|
53
|
+
parts.append(f"{report.warnings} warnings")
|
|
54
|
+
if report.errors:
|
|
55
|
+
parts.append(f"{report.errors} errors")
|
|
56
|
+
if report.fixed:
|
|
57
|
+
parts.append("(fixed)")
|
|
58
|
+
|
|
59
|
+
summary_line = ", ".join(parts)
|
|
60
|
+
if report.success:
|
|
61
|
+
success(f"{report.validator}: {summary_line}")
|
|
62
|
+
else:
|
|
63
|
+
error(f"{report.validator}: {summary_line}")
|
|
64
|
+
|
|
65
|
+
click.echo("", err=True)
|
|
66
|
+
total_errors = sum(r.errors for r in reports)
|
|
67
|
+
total_warnings = sum(r.warnings for r in reports)
|
|
68
|
+
total_passed = sum(r.passed for r in reports)
|
|
69
|
+
|
|
70
|
+
info(f"Total: {total_passed} passed, {total_warnings} warnings, {total_errors} errors")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@click.group(invoke_without_command=True)
|
|
74
|
+
@click.option("--fix", is_flag=True, help="Auto-fix format issues where supported")
|
|
75
|
+
@click.option("--strict", is_flag=True, help="Treat warnings as errors")
|
|
76
|
+
@click.pass_context
|
|
77
|
+
def validate(ctx, fix: bool, strict: bool):
|
|
78
|
+
"""Run project validators.
|
|
79
|
+
|
|
80
|
+
\b
|
|
81
|
+
With no subcommand, runs ALL validators.
|
|
82
|
+
Specify a validator name to run only that one.
|
|
83
|
+
|
|
84
|
+
\b
|
|
85
|
+
Validators:
|
|
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
|
+
"""
|
|
91
|
+
ctx.ensure_object(dict)
|
|
92
|
+
ctx.obj["fix"] = fix
|
|
93
|
+
ctx.obj["strict"] = strict
|
|
94
|
+
|
|
95
|
+
if ctx.invoked_subcommand is None:
|
|
96
|
+
reports = []
|
|
97
|
+
for name in VALIDATORS:
|
|
98
|
+
reports.append(_run_validator(name, fix=fix, strict=strict))
|
|
99
|
+
_print_reports(reports)
|
|
100
|
+
if any(not r.success for r in reports):
|
|
101
|
+
raise SystemExit(1)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@validate.command("sprint")
|
|
105
|
+
@click.pass_context
|
|
106
|
+
def validate_sprint(ctx):
|
|
107
|
+
"""Validate sprint YAML files (auto-discovers all files in sprint/)."""
|
|
108
|
+
report = _run_validator("sprint", fix=ctx.obj["fix"], strict=ctx.obj["strict"])
|
|
109
|
+
_print_reports([report])
|
|
110
|
+
if not report.success:
|
|
111
|
+
raise SystemExit(1)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@validate.command("schema")
|
|
115
|
+
@click.pass_context
|
|
116
|
+
def validate_schema(ctx):
|
|
117
|
+
"""Validate XML schema files (sessions, skills, workflow steps)."""
|
|
118
|
+
report = _run_validator("schema", fix=ctx.obj["fix"], strict=ctx.obj["strict"])
|
|
119
|
+
_print_reports([report])
|
|
120
|
+
if not report.success:
|
|
121
|
+
raise SystemExit(1)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@validate.command("agent")
|
|
125
|
+
@click.pass_context
|
|
126
|
+
def validate_agent(ctx):
|
|
127
|
+
"""Validate agent definition files (required sections, model values, refs)."""
|
|
128
|
+
report = _run_validator("agent", fix=ctx.obj["fix"], strict=ctx.obj["strict"])
|
|
129
|
+
_print_reports([report])
|
|
130
|
+
if not report.success:
|
|
131
|
+
raise SystemExit(1)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
@validate.command("workflow")
|
|
135
|
+
@click.pass_context
|
|
136
|
+
def validate_workflow(ctx):
|
|
137
|
+
"""Validate workflow definitions (phased/stepped/procedural structure)."""
|
|
138
|
+
report = _run_validator("workflow", fix=ctx.obj["fix"], strict=ctx.obj["strict"])
|
|
139
|
+
_print_reports([report])
|
|
140
|
+
if not report.success:
|
|
141
|
+
raise SystemExit(1)
|
|
@@ -22,12 +22,11 @@ sys.path.insert(0, str(Path(__file__).parent))
|
|
|
22
22
|
|
|
23
23
|
from hooks import (
|
|
24
24
|
find_project_root,
|
|
25
|
-
send_to_cyclist,
|
|
26
|
-
load_settings,
|
|
27
25
|
is_cyclist_running,
|
|
26
|
+
load_settings,
|
|
27
|
+
send_to_cyclist,
|
|
28
28
|
)
|
|
29
29
|
|
|
30
|
-
|
|
31
30
|
# Once-per-session guard
|
|
32
31
|
_welcome_shown_file: Path | None = None
|
|
33
32
|
|
|
@@ -12,8 +12,8 @@ Story: MSSCI-12416 - Define Scale Levels
|
|
|
12
12
|
Epic: MSSCI-12415 - Scale Adaptation and Brownfield Support
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
|
-
from typing import Any
|
|
16
15
|
import re
|
|
16
|
+
from typing import Any
|
|
17
17
|
|
|
18
18
|
# Scale level definitions with keywords, thresholds, and metadata
|
|
19
19
|
SCALE_LEVELS: dict[int, dict[str, Any]] = {
|
|
@@ -32,7 +32,7 @@ SCALE_LEVELS: dict[int, dict[str, Any]] = {
|
|
|
32
32
|
"keywords": ["simple", "basic", "small", "add", "minor"],
|
|
33
33
|
"stories_min": 1,
|
|
34
34
|
"stories_max": 10,
|
|
35
|
-
"workflow": "
|
|
35
|
+
"workflow": "prd",
|
|
36
36
|
"artifacts": ["tech-spec"],
|
|
37
37
|
},
|
|
38
38
|
2: {
|
|
@@ -124,7 +124,7 @@ def get_workflow_for_scale_level(level: int) -> str:
|
|
|
124
124
|
level: Scale level 0-4
|
|
125
125
|
|
|
126
126
|
Returns:
|
|
127
|
-
Workflow name (trivial
|
|
127
|
+
Workflow name (trivial or prd)
|
|
128
128
|
"""
|
|
129
129
|
if level not in SCALE_LEVELS:
|
|
130
130
|
return "prd" # Safe default for unknown levels
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Meta Scripts
|
|
2
|
+
|
|
3
|
+
**These scripts are NOT distributed to users.** They are for Pennyfarthing framework development only.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
| Script | Purpose |
|
|
8
|
+
|--------|---------|
|
|
9
|
+
| `deploy.sh` | Release Pennyfarthing (version bump, tag, push, GitHub release) |
|
|
10
|
+
| `cyclist-debug.mjs` | Debug Cyclist connection |
|
|
11
|
+
| `handoff-cli.{sh,js}` | Test handoff flow |
|
|
12
|
+
| `verify-visual-mapping.js` | Verify theme visual mappings |
|
|
13
|
+
| `migrate-assets-to-slug.sh` | One-time migration script |
|
|
14
|
+
| `resize-portraits.sh` | Resize portrait images |
|
|
15
|
+
| `resolve-portrait.mjs` | Portrait resolution logic |
|
|
16
|
+
| `validate-refs.js` | Validate internal references |
|
|
17
|
+
|
|
18
|
+
> Benchmark scripts have been moved to `packages/benchmark/`.
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
Run from pennyfarthing repo root:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Release a new version
|
|
26
|
+
./scripts/deploy.sh --dry-run patch
|
|
27
|
+
./scripts/deploy.sh patch
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Where Should My Script Go?
|
|
31
|
+
|
|
32
|
+
**Put it here if:**
|
|
33
|
+
- It's for framework development/CI only
|
|
34
|
+
- Users should NOT have access to it
|
|
35
|
+
- It uses GPU/heavy dependencies (keep in meta, not distributed)
|
|
36
|
+
|
|
37
|
+
**Put it in `pennyfarthing-dist/scripts/` if:**
|
|
38
|
+
- Users need it for their workflows
|
|
39
|
+
- It's part of the sprint/story/jira tooling
|
|
40
|
+
|
|
41
|
+
See `CLAUDE.md` for the full decision tree.
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: workflow-status-check
|
|
3
|
-
description: Determine workflow state using sprint scripts
|
|
4
|
-
tools: Bash, Read
|
|
5
|
-
model: haiku
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
<info>
|
|
9
|
-
Universal entry point telling agents: what work exists, what phase, and whether to activate.
|
|
10
|
-
Uses `/sprint` skill scripts for deterministic output.
|
|
11
|
-
</info>
|
|
12
|
-
|
|
13
|
-
<arguments>
|
|
14
|
-
| Argument | Required | Description |
|
|
15
|
-
|----------|----------|-------------|
|
|
16
|
-
| `CALLING_AGENT` | Yes | Agent requesting status check (e.g., "SM", "Architect", "PM") |
|
|
17
|
-
</arguments>
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Execution
|
|
22
|
-
|
|
23
|
-
Run the sprint status script and parse output:
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
pf sprint status
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
Then check for active sessions:
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
if ls .session/*-session.md 1>/dev/null 2>&1; then
|
|
33
|
-
for f in .session/*-session.md; do head -30 "$f"; done
|
|
34
|
-
else
|
|
35
|
-
echo "No active sessions"
|
|
36
|
-
fi
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## State Determination
|
|
42
|
-
|
|
43
|
-
| State | Condition |
|
|
44
|
-
|-------|-----------|
|
|
45
|
-
| `FINISH_STATE` | Session exists with Phase=approved OR Status=approved |
|
|
46
|
-
| `IN_PROGRESS_STATE` | Phased workflow session with active phase (setup/red/green/implement/review) |
|
|
47
|
-
| `STEPPED_WORKFLOW_STATE` | Stepped workflow session (workflow type = stepped) |
|
|
48
|
-
| `NEW_WORK_STATE` | No sessions AND sprint has backlog/ready stories |
|
|
49
|
-
| `EMPTY_BACKLOG_STATE` | No sessions AND sprint has NO backlog/ready stories |
|
|
50
|
-
|
|
51
|
-
**Detecting workflow type from session:**
|
|
52
|
-
```bash
|
|
53
|
-
# Read workflow name from session
|
|
54
|
-
WORKFLOW=$(grep '^\*\*Workflow:\*\*' .session/*-session.md | head -1 | sed 's/.*: //')
|
|
55
|
-
# Check if stepped
|
|
56
|
-
.pennyfarthing/scripts/workflow/get-workflow-type.sh "$WORKFLOW"
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
**Important:** Sprints are fixed two-week periods (kanban-style). Never suggest closing a sprint early or starting sprint planning when backlog is empty. The correct response to `EMPTY_BACKLOG_STATE` is to suggest promoting stories from `future.yaml`.
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
<output>
|
|
64
|
-
## Output Format
|
|
65
|
-
|
|
66
|
-
Return a `STATUS_CHECK_RESULT` block:
|
|
67
|
-
|
|
68
|
-
### Success
|
|
69
|
-
```
|
|
70
|
-
STATUS_CHECK_RESULT:
|
|
71
|
-
status: success
|
|
72
|
-
state: {FINISH_STATE|IN_PROGRESS_STATE|NEW_WORK_STATE|EMPTY_BACKLOG_STATE}
|
|
73
|
-
story_id: {ID or null}
|
|
74
|
-
phase: {current phase or null}
|
|
75
|
-
phase_owner: {agent name or null}
|
|
76
|
-
sprint_number: {N}
|
|
77
|
-
backlog_count: {N}
|
|
78
|
-
|
|
79
|
-
next_steps:
|
|
80
|
-
- FINISH_STATE: "Proceed to Finish Flow - spawn sm-finish with PHASE=preflight"
|
|
81
|
-
- IN_PROGRESS_STATE: "Report phase owner '{phase_owner}' should continue. Run handoff-marker.sh {phase_owner}"
|
|
82
|
-
- STEPPED_WORKFLOW_STATE: "Stepped workflow in progress. Tell user to run /workflow resume or /workflow status"
|
|
83
|
-
- NEW_WORK_STATE: "Present available stories to user. Await selection, then spawn sm-setup MODE=setup"
|
|
84
|
-
- EMPTY_BACKLOG_STATE: "Report backlog empty. Suggest promoting from future.yaml"
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Active Session Details (if IN_PROGRESS_STATE)
|
|
88
|
-
```
|
|
89
|
-
session:
|
|
90
|
-
story_id: {ID}
|
|
91
|
-
title: "{title}"
|
|
92
|
-
workflow: {workflow}
|
|
93
|
-
phase: {phase}
|
|
94
|
-
branch: {branch}
|
|
95
|
-
```
|
|
96
|
-
</output>
|