@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
|
@@ -15,12 +15,11 @@ Acceptance Criteria:
|
|
|
15
15
|
This file tests the Python side (AC1, AC2, AC4).
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
|
-
import
|
|
18
|
+
import json
|
|
19
19
|
from pathlib import Path
|
|
20
20
|
from unittest.mock import patch
|
|
21
|
-
import yaml
|
|
22
|
-
import json
|
|
23
21
|
|
|
22
|
+
import yaml
|
|
24
23
|
|
|
25
24
|
# =============================================================================
|
|
26
25
|
# AC1: Each component has an approximate token count
|
|
@@ -32,7 +31,7 @@ class TestComponentTokenCounting:
|
|
|
32
31
|
|
|
33
32
|
def test_load_tier_components_returns_token_counts(self, tmp_path: Path) -> None:
|
|
34
33
|
"""Test load_tier_components returns token counts for each component."""
|
|
35
|
-
from pennyfarthing_scripts.prime.tiers import
|
|
34
|
+
from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
|
|
36
35
|
|
|
37
36
|
self._setup_complete_project(tmp_path)
|
|
38
37
|
|
|
@@ -48,7 +47,7 @@ class TestComponentTokenCounting:
|
|
|
48
47
|
|
|
49
48
|
def test_token_counts_include_all_full_tier_components(self, tmp_path: Path) -> None:
|
|
50
49
|
"""Test FULL tier returns token counts for all components."""
|
|
51
|
-
from pennyfarthing_scripts.prime.tiers import
|
|
50
|
+
from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
|
|
52
51
|
|
|
53
52
|
self._setup_complete_project(tmp_path)
|
|
54
53
|
|
|
@@ -78,7 +77,7 @@ class TestComponentTokenCounting:
|
|
|
78
77
|
|
|
79
78
|
def test_token_counts_are_positive_for_loaded_components(self, tmp_path: Path) -> None:
|
|
80
79
|
"""Test that loaded components have positive token counts."""
|
|
81
|
-
from pennyfarthing_scripts.prime.tiers import
|
|
80
|
+
from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
|
|
82
81
|
|
|
83
82
|
self._setup_complete_project(tmp_path)
|
|
84
83
|
|
|
@@ -97,7 +96,7 @@ class TestComponentTokenCounting:
|
|
|
97
96
|
|
|
98
97
|
def test_token_counts_zero_for_missing_components(self, tmp_path: Path) -> None:
|
|
99
98
|
"""Test that missing optional components have zero token counts."""
|
|
100
|
-
from pennyfarthing_scripts.prime.tiers import
|
|
99
|
+
from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
|
|
101
100
|
|
|
102
101
|
# Minimal setup - only agent definition
|
|
103
102
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -120,7 +119,7 @@ class TestComponentTokenCounting:
|
|
|
120
119
|
|
|
121
120
|
def test_refresh_tier_only_counts_included_components(self, tmp_path: Path) -> None:
|
|
122
121
|
"""Test REFRESH tier only includes counts for its components."""
|
|
123
|
-
from pennyfarthing_scripts.prime.tiers import
|
|
122
|
+
from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
|
|
124
123
|
|
|
125
124
|
self._setup_complete_project(tmp_path)
|
|
126
125
|
|
|
@@ -145,7 +144,7 @@ class TestComponentTokenCounting:
|
|
|
145
144
|
|
|
146
145
|
def test_handoff_tier_only_counts_included_components(self, tmp_path: Path) -> None:
|
|
147
146
|
"""Test HANDOFF tier only includes counts for its components."""
|
|
148
|
-
from pennyfarthing_scripts.prime.tiers import
|
|
147
|
+
from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
|
|
149
148
|
|
|
150
149
|
self._setup_complete_project(tmp_path)
|
|
151
150
|
|
|
@@ -164,7 +163,7 @@ class TestComponentTokenCounting:
|
|
|
164
163
|
|
|
165
164
|
def test_minimal_tier_only_counts_workflow_state(self, tmp_path: Path) -> None:
|
|
166
165
|
"""Test MINIMAL tier only counts workflow state."""
|
|
167
|
-
from pennyfarthing_scripts.prime.tiers import
|
|
166
|
+
from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
|
|
168
167
|
|
|
169
168
|
self._setup_complete_project(tmp_path)
|
|
170
169
|
|
|
@@ -187,7 +186,7 @@ class TestComponentTokenCounting:
|
|
|
187
186
|
|
|
188
187
|
def test_total_tokens_is_sum_of_components(self, tmp_path: Path) -> None:
|
|
189
188
|
"""Test that total_tokens equals sum of component counts."""
|
|
190
|
-
from pennyfarthing_scripts.prime.tiers import
|
|
189
|
+
from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
|
|
191
190
|
|
|
192
191
|
self._setup_complete_project(tmp_path)
|
|
193
192
|
|
|
@@ -464,7 +463,11 @@ def hello():
|
|
|
464
463
|
|
|
465
464
|
def test_component_token_count_within_10_percent_of_actual(self, tmp_path: Path) -> None:
|
|
466
465
|
"""Test component token counts are within 10% of actual tiktoken count."""
|
|
467
|
-
from pennyfarthing_scripts.prime.tiers import
|
|
466
|
+
from pennyfarthing_scripts.prime.tiers import (
|
|
467
|
+
ContextTier,
|
|
468
|
+
estimate_tokens,
|
|
469
|
+
load_tier_components,
|
|
470
|
+
)
|
|
468
471
|
|
|
469
472
|
# Create a known-content project
|
|
470
473
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
@@ -495,7 +498,10 @@ def hello():
|
|
|
495
498
|
|
|
496
499
|
def test_total_tokens_within_10_percent_of_sum(self, tmp_path: Path) -> None:
|
|
497
500
|
"""Test total_tokens is within 10% of manually summed content."""
|
|
498
|
-
from pennyfarthing_scripts.prime.tiers import
|
|
501
|
+
from pennyfarthing_scripts.prime.tiers import (
|
|
502
|
+
ContextTier,
|
|
503
|
+
load_tier_components,
|
|
504
|
+
)
|
|
499
505
|
|
|
500
506
|
pf_dir = tmp_path / ".pennyfarthing"
|
|
501
507
|
pf_dir.mkdir()
|
|
@@ -13,21 +13,16 @@ Acceptance Criteria:
|
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
15
|
from pathlib import Path
|
|
16
|
-
from typing import Any
|
|
17
|
-
from unittest.mock import patch
|
|
18
16
|
|
|
19
17
|
import pytest
|
|
20
18
|
from click.testing import CliRunner
|
|
21
19
|
|
|
22
20
|
from pennyfarthing_scripts.sprint.validate_cmd import (
|
|
23
|
-
FormatIssue,
|
|
24
|
-
ValidateResult,
|
|
25
21
|
check_format_drift,
|
|
26
22
|
validate_command,
|
|
27
23
|
validate_sprint_yaml,
|
|
28
24
|
)
|
|
29
25
|
|
|
30
|
-
|
|
31
26
|
# =============================================================================
|
|
32
27
|
# Test Fixtures
|
|
33
28
|
# =============================================================================
|
|
@@ -382,7 +377,7 @@ class TestFixFlag:
|
|
|
382
377
|
assert len(issues_before) > 0
|
|
383
378
|
|
|
384
379
|
# Run validate with --fix
|
|
385
|
-
|
|
380
|
+
validate_sprint_yaml(scrambled_keys_file, fix=True)
|
|
386
381
|
|
|
387
382
|
# After fix, re-check should show no drift
|
|
388
383
|
issues_after = check_format_drift(scrambled_keys_file)
|
|
@@ -390,7 +385,7 @@ class TestFixFlag:
|
|
|
390
385
|
|
|
391
386
|
def test_fix_converts_to_block_scalars(self, wrong_string_style_file: Path) -> None:
|
|
392
387
|
"""--fix should convert multiline strings to block scalar style."""
|
|
393
|
-
|
|
388
|
+
validate_sprint_yaml(wrong_string_style_file, fix=True)
|
|
394
389
|
|
|
395
390
|
# Read back and check for block scalar
|
|
396
391
|
content = wrong_string_style_file.read_text()
|
|
@@ -11,10 +11,8 @@ Acceptance Criteria:
|
|
|
11
11
|
4. Key ordering matches sprint-template.yaml
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
|
-
import os
|
|
15
14
|
from pathlib import Path
|
|
16
15
|
from typing import Any
|
|
17
|
-
from unittest.mock import patch
|
|
18
16
|
|
|
19
17
|
import pytest
|
|
20
18
|
|
|
@@ -27,7 +25,6 @@ from pennyfarthing_scripts.sprint.yaml_io import (
|
|
|
27
25
|
write_sprint,
|
|
28
26
|
)
|
|
29
27
|
|
|
30
|
-
|
|
31
28
|
# =============================================================================
|
|
32
29
|
# Test Fixtures
|
|
33
30
|
# =============================================================================
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CLI commands for theme management.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
pf theme list
|
|
6
|
+
pf theme show [NAME] [--full]
|
|
7
|
+
pf theme set <NAME>
|
|
8
|
+
pf theme create <NAME> [--base <THEME>] [--user]
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import re
|
|
14
|
+
|
|
15
|
+
import click
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@click.group()
|
|
19
|
+
def theme():
|
|
20
|
+
"""Persona theme management.
|
|
21
|
+
|
|
22
|
+
\b
|
|
23
|
+
Commands:
|
|
24
|
+
list - Show all available themes
|
|
25
|
+
show - Show theme details
|
|
26
|
+
set - Set the active theme
|
|
27
|
+
create - Create a new custom theme
|
|
28
|
+
"""
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@theme.command("list")
|
|
33
|
+
def list_cmd():
|
|
34
|
+
"""Show all available themes with current theme highlighted."""
|
|
35
|
+
from pennyfarthing_scripts.common.themes import format_theme_list
|
|
36
|
+
|
|
37
|
+
click.echo(format_theme_list())
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@theme.command("show")
|
|
41
|
+
@click.argument("name", required=False)
|
|
42
|
+
@click.option("--full", is_flag=True, help="Show full agent details (OCEAN, quirks, catchphrases, etc.)")
|
|
43
|
+
def show(name: str | None, full: bool):
|
|
44
|
+
"""Show theme details including agent character mappings.
|
|
45
|
+
|
|
46
|
+
\b
|
|
47
|
+
Arguments:
|
|
48
|
+
NAME - Theme to show (defaults to current theme)
|
|
49
|
+
"""
|
|
50
|
+
import yaml
|
|
51
|
+
|
|
52
|
+
from pennyfarthing_scripts.common.themes import (
|
|
53
|
+
get_current_theme,
|
|
54
|
+
list_themes,
|
|
55
|
+
resolve_theme_path,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
theme_name = name
|
|
59
|
+
if not theme_name:
|
|
60
|
+
theme_name = get_current_theme()
|
|
61
|
+
if not theme_name:
|
|
62
|
+
click.echo("No theme currently set.")
|
|
63
|
+
click.echo("Use 'pf theme set <name>' to select a theme.")
|
|
64
|
+
return
|
|
65
|
+
|
|
66
|
+
theme_path = resolve_theme_path(theme_name)
|
|
67
|
+
if not theme_path:
|
|
68
|
+
available = ", ".join(list_themes()[:10])
|
|
69
|
+
raise click.ClickException(f"Theme '{theme_name}' not found.\nAvailable: {available}...")
|
|
70
|
+
|
|
71
|
+
data = yaml.safe_load(theme_path.read_text())
|
|
72
|
+
if not data:
|
|
73
|
+
raise click.ClickException(f"Invalid theme file: {theme_path}")
|
|
74
|
+
|
|
75
|
+
theme_meta = data.get("theme", {})
|
|
76
|
+
agents = data.get("agents", {})
|
|
77
|
+
|
|
78
|
+
# Header
|
|
79
|
+
click.echo(f"Theme: {theme_name}")
|
|
80
|
+
if theme_meta.get("description"):
|
|
81
|
+
click.echo(f"Description: {theme_meta['description']}")
|
|
82
|
+
if theme_meta.get("tier"):
|
|
83
|
+
click.echo(f"Tier: {theme_meta['tier']}")
|
|
84
|
+
click.echo()
|
|
85
|
+
|
|
86
|
+
# Agents
|
|
87
|
+
click.echo("Agents:")
|
|
88
|
+
agent_order = [
|
|
89
|
+
"sm", "tea", "dev", "reviewer", "orchestrator",
|
|
90
|
+
"pm", "architect", "devops", "tech-writer", "ux-designer",
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
displayed: set[str] = set()
|
|
94
|
+
for agent_name in agent_order:
|
|
95
|
+
agent = agents.get(agent_name)
|
|
96
|
+
if agent and agent.get("character"):
|
|
97
|
+
_display_agent(agent_name, agent, full)
|
|
98
|
+
displayed.add(agent_name)
|
|
99
|
+
|
|
100
|
+
for agent_name, agent in agents.items():
|
|
101
|
+
if agent_name not in displayed and isinstance(agent, dict) and agent.get("character"):
|
|
102
|
+
_display_agent(agent_name, agent, full)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _display_agent(name: str, agent: dict, full: bool) -> None:
|
|
106
|
+
"""Display a single agent's info."""
|
|
107
|
+
click.echo(f" {name}:")
|
|
108
|
+
click.echo(f" Character: {agent['character']}")
|
|
109
|
+
if agent.get("style"):
|
|
110
|
+
click.echo(f" Style: {agent['style']}")
|
|
111
|
+
|
|
112
|
+
if not full:
|
|
113
|
+
return
|
|
114
|
+
|
|
115
|
+
if agent.get("ocean"):
|
|
116
|
+
ocean = agent["ocean"]
|
|
117
|
+
click.echo(
|
|
118
|
+
f" OCEAN: O={ocean.get('O', '?')} C={ocean.get('C', '?')} "
|
|
119
|
+
f"E={ocean.get('E', '?')} A={ocean.get('A', '?')} N={ocean.get('N', '?')}"
|
|
120
|
+
)
|
|
121
|
+
if agent.get("trait"):
|
|
122
|
+
click.echo(f" Trait: {agent['trait']}")
|
|
123
|
+
if agent.get("expertise"):
|
|
124
|
+
click.echo(f" Expertise: {agent['expertise']}")
|
|
125
|
+
if agent.get("role"):
|
|
126
|
+
click.echo(f" Role: {agent['role']}")
|
|
127
|
+
if agent.get("quirks"):
|
|
128
|
+
click.echo(" Quirks:")
|
|
129
|
+
for q in agent["quirks"]:
|
|
130
|
+
click.echo(f" - {q}")
|
|
131
|
+
if agent.get("catchphrases"):
|
|
132
|
+
click.echo(" Catchphrases:")
|
|
133
|
+
for c in agent["catchphrases"]:
|
|
134
|
+
click.echo(f" - {c}")
|
|
135
|
+
if agent.get("emoji"):
|
|
136
|
+
click.echo(f" Emoji: {agent['emoji']}")
|
|
137
|
+
if agent.get("helper"):
|
|
138
|
+
helper = agent["helper"]
|
|
139
|
+
hname = helper.get("name", "?")
|
|
140
|
+
hstyle = helper.get("style", "?")
|
|
141
|
+
click.echo(f" Helper: {hname} ({hstyle})")
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
@theme.command("set")
|
|
145
|
+
@click.argument("name")
|
|
146
|
+
def set_theme(name: str):
|
|
147
|
+
"""Set the active persona theme.
|
|
148
|
+
|
|
149
|
+
\b
|
|
150
|
+
Arguments:
|
|
151
|
+
NAME - Theme name to activate
|
|
152
|
+
"""
|
|
153
|
+
import yaml
|
|
154
|
+
|
|
155
|
+
from pennyfarthing_scripts.common.config import get_project_root
|
|
156
|
+
from pennyfarthing_scripts.common.themes import (
|
|
157
|
+
list_themes,
|
|
158
|
+
resolve_theme_path,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
theme_path = resolve_theme_path(name)
|
|
162
|
+
if not theme_path:
|
|
163
|
+
available = ", ".join(list_themes()[:10])
|
|
164
|
+
raise click.ClickException(f"Theme '{name}' not found.\nAvailable: {available}...")
|
|
165
|
+
|
|
166
|
+
theme_data = yaml.safe_load(theme_path.read_text())
|
|
167
|
+
theme_meta = theme_data.get("theme", {})
|
|
168
|
+
agents = theme_data.get("agents", {})
|
|
169
|
+
|
|
170
|
+
# Build theme_characters map (matches Node.js setTheme behavior)
|
|
171
|
+
theme_characters: dict[str, str] = {}
|
|
172
|
+
for agent_id, agent_info in agents.items():
|
|
173
|
+
if isinstance(agent_info, dict) and agent_info.get("character"):
|
|
174
|
+
theme_characters[agent_id] = agent_info["character"]
|
|
175
|
+
|
|
176
|
+
# Read existing config, preserve other fields
|
|
177
|
+
root = get_project_root()
|
|
178
|
+
config_path = root / ".pennyfarthing" / "config.local.yaml"
|
|
179
|
+
|
|
180
|
+
config: dict = {}
|
|
181
|
+
if config_path.exists():
|
|
182
|
+
try:
|
|
183
|
+
existing = yaml.safe_load(config_path.read_text())
|
|
184
|
+
if existing and isinstance(existing, dict):
|
|
185
|
+
config = existing
|
|
186
|
+
except Exception:
|
|
187
|
+
pass
|
|
188
|
+
|
|
189
|
+
config["theme"] = name
|
|
190
|
+
config["theme_characters"] = theme_characters
|
|
191
|
+
|
|
192
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
193
|
+
header = (
|
|
194
|
+
"# Pennyfarthing Local Configuration\n"
|
|
195
|
+
"# This file is gitignored - your personal preferences\n\n"
|
|
196
|
+
)
|
|
197
|
+
config_path.write_text(
|
|
198
|
+
header + yaml.dump(config, default_flow_style=False, sort_keys=False)
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
click.echo(f"Theme changed to '{name}'.")
|
|
202
|
+
click.echo()
|
|
203
|
+
click.echo(f" {theme_meta.get('name', name)}")
|
|
204
|
+
|
|
205
|
+
samples = []
|
|
206
|
+
for key in ["sm", "tea", "dev"]:
|
|
207
|
+
agent = agents.get(key)
|
|
208
|
+
if agent and agent.get("character"):
|
|
209
|
+
samples.append(f"{key.upper()}: {agent['character']}")
|
|
210
|
+
if samples:
|
|
211
|
+
click.echo(f" {' | '.join(samples)}")
|
|
212
|
+
|
|
213
|
+
click.echo()
|
|
214
|
+
click.echo("Start a new agent session to use the new theme.")
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
@theme.command("create")
|
|
218
|
+
@click.argument("name")
|
|
219
|
+
@click.option("--base", default=None, help="Base theme to copy from (defaults to current theme)")
|
|
220
|
+
@click.option("--user", is_flag=True, help="Create as user-level theme (~/.claude/pennyfarthing/themes/)")
|
|
221
|
+
def create(name: str, base: str | None, user: bool):
|
|
222
|
+
"""Create a new custom theme from a base theme.
|
|
223
|
+
|
|
224
|
+
\b
|
|
225
|
+
Arguments:
|
|
226
|
+
NAME - Name for the new theme (lowercase, hyphens allowed)
|
|
227
|
+
"""
|
|
228
|
+
from pathlib import Path
|
|
229
|
+
|
|
230
|
+
import yaml
|
|
231
|
+
|
|
232
|
+
from pennyfarthing_scripts.common.config import get_project_root
|
|
233
|
+
from pennyfarthing_scripts.common.themes import (
|
|
234
|
+
get_current_theme,
|
|
235
|
+
list_themes,
|
|
236
|
+
resolve_theme_path,
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
if not base:
|
|
240
|
+
base = get_current_theme() or "blade-runner"
|
|
241
|
+
|
|
242
|
+
if name != name.lower():
|
|
243
|
+
raise click.ClickException("Theme name must be lowercase")
|
|
244
|
+
if " " in name:
|
|
245
|
+
raise click.ClickException("Theme name cannot contain spaces (use hyphens)")
|
|
246
|
+
if not re.match(r"^[a-z][a-z0-9-]*$", name):
|
|
247
|
+
raise click.ClickException(
|
|
248
|
+
"Theme name must start with a letter and contain only lowercase letters, numbers, and hyphens"
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
if name in list_themes():
|
|
252
|
+
raise click.ClickException(f"Theme '{name}' already exists")
|
|
253
|
+
|
|
254
|
+
base_path = resolve_theme_path(base)
|
|
255
|
+
if not base_path:
|
|
256
|
+
available = ", ".join(list_themes()[:10])
|
|
257
|
+
raise click.ClickException(f"Base theme '{base}' not found.\nAvailable: {available}...")
|
|
258
|
+
|
|
259
|
+
if user:
|
|
260
|
+
target_dir = Path.home() / ".claude" / "pennyfarthing" / "themes"
|
|
261
|
+
else:
|
|
262
|
+
root = get_project_root()
|
|
263
|
+
target_dir = root / ".claude" / "pennyfarthing" / "themes"
|
|
264
|
+
|
|
265
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
266
|
+
target_path = target_dir / f"{name}.yaml"
|
|
267
|
+
|
|
268
|
+
base_data = yaml.safe_load(base_path.read_text())
|
|
269
|
+
base_data["theme"]["name"] = name.replace("-", " ").title()
|
|
270
|
+
base_data["theme"]["description"] = f"Custom theme based on {base}"
|
|
271
|
+
|
|
272
|
+
file_header = (
|
|
273
|
+
f"# Custom Theme: {name}\n"
|
|
274
|
+
f"# Based on: {base}\n"
|
|
275
|
+
"# Edit this file to customize your agent personas\n\n"
|
|
276
|
+
)
|
|
277
|
+
target_path.write_text(
|
|
278
|
+
file_header + yaml.dump(base_data, default_flow_style=False, sort_keys=False)
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
click.echo(f"Created theme '{name}'.")
|
|
282
|
+
click.echo()
|
|
283
|
+
click.echo(f" File: {target_path}")
|
|
284
|
+
click.echo()
|
|
285
|
+
click.echo("Next steps:")
|
|
286
|
+
click.echo(" 1. Edit the theme file to customize your agents")
|
|
287
|
+
click.echo(f" 2. Run 'pf theme set {name}' to activate")
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""Top-level validate command — auto-discovers and runs project validators."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class ValidateReport:
|
|
10
|
+
"""Unified report from a single validator domain."""
|
|
11
|
+
|
|
12
|
+
validator: str
|
|
13
|
+
passed: int = 0
|
|
14
|
+
warnings: int = 0
|
|
15
|
+
errors: int = 0
|
|
16
|
+
details: list[str] = field(default_factory=list)
|
|
17
|
+
fixed: bool = False
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def success(self) -> bool:
|
|
21
|
+
return self.errors == 0
|
|
Binary file
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|