@pennyfarthing/core 9.0.0 → 9.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -7
- package/package.json +1 -1
- package/packages/core/dist/cli/commands/doctor.d.ts +5 -2
- package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/doctor.js +327 -17
- package/packages/core/dist/cli/commands/doctor.js.map +1 -1
- package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/init.js +3 -246
- package/packages/core/dist/cli/commands/init.js.map +1 -1
- package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
- package/packages/core/dist/cli/commands/update.js +4 -140
- package/packages/core/dist/cli/commands/update.js.map +1 -1
- package/packages/core/dist/cli/utils/constants.d.ts +7 -1
- package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
- package/packages/core/dist/cli/utils/constants.js +2 -0
- package/packages/core/dist/cli/utils/constants.js.map +1 -1
- package/packages/core/dist/cli/utils/settings.d.ts +22 -0
- package/packages/core/dist/cli/utils/settings.d.ts.map +1 -0
- package/packages/core/dist/cli/utils/settings.js +300 -0
- package/packages/core/dist/cli/utils/settings.js.map +1 -0
- package/pennyfarthing-dist/commands/chore.md +18 -17
- package/pennyfarthing-dist/commands/continue-session.md +41 -7
- package/pennyfarthing-dist/commands/fix-blocker.md +22 -0
- package/pennyfarthing-dist/commands/git-cleanup.md +25 -19
- package/pennyfarthing-dist/commands/patch.md +210 -0
- package/pennyfarthing-dist/commands/setup.md +65 -0
- package/pennyfarthing-dist/guides/session-schema.md +346 -0
- package/pennyfarthing-dist/guides/skill-schema.md +412 -0
- package/pennyfarthing-dist/guides/workflow-step-schema.md +512 -0
- package/pennyfarthing-dist/guides/xml-tags.md +292 -0
- package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +43 -8
- package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +30 -0
- package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +78 -0
- package/pennyfarthing-dist/scripts/lib/find-root.sh +32 -7
- package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +13 -2
- package/pennyfarthing-dist/scripts/sprint/validate-sprint-yaml.sh +139 -0
- package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +4 -0
- package/pennyfarthing-dist/skills/changelog/SKILL.md +18 -0
- package/pennyfarthing-dist/skills/code-review/SKILL.md +5 -1
- package/pennyfarthing-dist/skills/context-engineering/SKILL.md +3 -0
- package/pennyfarthing-dist/skills/cyclist/SKILL.md +2 -2
- package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +24 -0
- package/pennyfarthing-dist/skills/finalize-run/SKILL.md +3 -0
- package/pennyfarthing-dist/skills/judge/SKILL.md +8 -0
- package/pennyfarthing-dist/skills/just/SKILL.md +11 -0
- package/pennyfarthing-dist/skills/mermaid/SKILL.md +16 -0
- package/pennyfarthing-dist/skills/otel/skill.md +4 -0
- package/pennyfarthing-dist/skills/permissions/skill.md +3 -0
- package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +9 -0
- package/pennyfarthing-dist/skills/story/skill.md +16 -16
- package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +56 -0
- package/pennyfarthing-dist/skills/testing/SKILL.md +22 -0
- package/pennyfarthing-dist/skills/theme/skill.md +12 -0
- package/pennyfarthing-dist/skills/theme-creation/SKILL.md +4 -0
- package/pennyfarthing-dist/skills/workflow/skill.md +22 -14
- package/pennyfarthing-dist/skills/yq/SKILL.md +8 -0
- package/pennyfarthing-dist/templates/settings.local.json.template +9 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +12 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +12 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +12 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +12 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +12 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +12 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +12 -0
- package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +12 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +25 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +23 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +26 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +24 -0
- package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +23 -0
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +43 -41
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-02-categorize.md +50 -19
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-03-execute.md +102 -111
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +48 -39
- package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +30 -31
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +21 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +21 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +23 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +23 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +28 -0
- package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +25 -0
- package/pennyfarthing-dist/workflows/interactive-debug/steps/step-01-connect.md +257 -0
- package/pennyfarthing-dist/workflows/interactive-debug/steps/step-02-explore.md +107 -0
- package/pennyfarthing-dist/workflows/interactive-debug/steps/step-03-fix.md +127 -0
- package/pennyfarthing-dist/workflows/interactive-debug/steps/step-04-commit.md +122 -0
- package/pennyfarthing-dist/workflows/interactive-debug/workflow.yaml +51 -0
- package/pennyfarthing-dist/workflows/patch.yaml +2 -3
- package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +6 -0
- package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +6 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +18 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +19 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +22 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +22 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +23 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +24 -0
- package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +22 -0
- package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +22 -0
- package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +31 -0
- package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +28 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +157 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-02-clone-repos.md +217 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-03-repos-yaml.md +159 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-04-claude-md.md +186 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-05-shared-context.md +185 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-06-task-runner.md +279 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-07-theme.md +200 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-08-cyclist.md +245 -0
- package/pennyfarthing-dist/workflows/project-setup/steps/step-09-complete.md +203 -0
- package/pennyfarthing-dist/workflows/project-setup/workflow.yaml +41 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +21 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +23 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +25 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +22 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +23 -0
- package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +23 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +12 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +12 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +12 -0
- package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +12 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +22 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +24 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +25 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +26 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +26 -0
- package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +34 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +23 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +25 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +27 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +26 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +27 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +26 -0
- package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +35 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +22 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +25 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +26 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +26 -0
- package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +29 -1
- package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +37 -1
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +15 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +17 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +16 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +17 -0
- package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +22 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +6 -0
- package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +6 -0
- package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/__init__.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.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__/sprint.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
- package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -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/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/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/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__/compat.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/epic.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/jira/__pycache__/story.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/migration/__init__.py +39 -0
- package/pennyfarthing_scripts/migration/__main__.py +10 -0
- package/pennyfarthing_scripts/migration/__pycache__/__init__.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/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/cli.py +304 -0
- package/pennyfarthing_scripts/migration/session.py +384 -0
- package/pennyfarthing_scripts/migration/skill.py +188 -0
- package/pennyfarthing_scripts/migration/step.py +229 -0
- package/pennyfarthing_scripts/migration/validate.py +282 -0
- package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/prime/__pycache__/__main__.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/schema_validation_hook.py +306 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/sprint/__pycache__/status.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/archive_epic.py +399 -0
- package/pennyfarthing_scripts/sprint/cli.py +100 -0
- package/pennyfarthing_scripts/sprint/import_epic.py +431 -0
- package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_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_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_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_package.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_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
- package/pennyfarthing-dist/scripts/sprint/import-epic-to-future.sh +0 -10
- package/pennyfarthing-dist/scripts/sprint/import_epic_to_future.py +0 -270
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Pennyfarthing
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**v9.1.2** | *The outer loop goes once, the inner loop goes many times.*
|
|
4
4
|
|
|
5
5
|
<img src="pennyfarthing.png" alt="Pennyfarthing Logo" width="75" style="float:left; margin:10px">
|
|
6
6
|
|
|
@@ -15,9 +15,9 @@ A Claude Code agent orchestration framework built around three pillars: a flexib
|
|
|
15
15
|
A multi-agent system with customizable BikeLane workflows for structured software development:
|
|
16
16
|
|
|
17
17
|
- **19 Coordinated Agents** - SM, TEA, Dev, Reviewer, Architect, PM, and more
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
20
|
-
- **
|
|
18
|
+
- **24 BikeLane Workflows** - Phased (TDD, BDD, Trivial), Stepped (PRD, Architecture), Procedural (Brainstorming, Retrospective)
|
|
19
|
+
- **48 Slash Commands** - Entry points for agent activation and workflows
|
|
20
|
+
- **24 Skills** - Reusable knowledge domains (testing, code-review, jira, mermaid, etc.)
|
|
21
21
|
- **Automatic Handoffs** - Context-aware agent transitions via subagent delegation
|
|
22
22
|
|
|
23
23
|
### 2. Personality Research
|
|
@@ -37,7 +37,7 @@ Smoothing out development processes:
|
|
|
37
37
|
|
|
38
38
|
- **Jira Integration** - Bidirectional sync, epic auto-creation, sprint velocity
|
|
39
39
|
- **Sprint Management** - Story tracking with `current-sprint.yaml`
|
|
40
|
-
- **Cyclist Visual Terminal** -
|
|
40
|
+
- **Cyclist Visual Terminal** - React UI with Dockview panels, agent portraits, tool visualization
|
|
41
41
|
|
|
42
42
|
---
|
|
43
43
|
|
|
@@ -100,7 +100,7 @@ BikeLane is the umbrella workflow system supporting three types:
|
|
|
100
100
|
| **Dev** | Developer | Make tests pass (GREEN) |
|
|
101
101
|
| **Reviewer** | Code Reviewer | Quality validation, approve/reject |
|
|
102
102
|
|
|
103
|
-
Use `/workflow list` to see all
|
|
103
|
+
Use `/workflow list` to see all 24 workflows. Use `/workflow start <name>` to begin any workflow.
|
|
104
104
|
|
|
105
105
|
## Benchmarking & Personality Research
|
|
106
106
|
|
|
@@ -192,7 +192,16 @@ your-project/
|
|
|
192
192
|
└── {story-id}-session.md # Active work session
|
|
193
193
|
```
|
|
194
194
|
|
|
195
|
-
## What's New in
|
|
195
|
+
## What's New in v9.0
|
|
196
|
+
|
|
197
|
+
- **Dockview Panel System** - Draggable, floatable, splittable panels replacing hand-rolled system (ADR-0019)
|
|
198
|
+
- **React UI** - Full React component architecture for Cyclist
|
|
199
|
+
- **Tool Use Visualization** - Human-readable tool summaries, collapsible results, tool stacking
|
|
200
|
+
- **useMarkdownParser Hook** - React hook for markdown rendering (vanilla JS migration)
|
|
201
|
+
- **Bell Mode** - Queue messages while Claude works (ADR-0016)
|
|
202
|
+
- **Relay Mode** - Automatic agent handoffs (ADR-0017)
|
|
203
|
+
|
|
204
|
+
### Previous Highlights (v7.6-v8.x)
|
|
196
205
|
|
|
197
206
|
- **BikeLane Workflow System** - Unified umbrella for Phased, Stepped, and Procedural workflows
|
|
198
207
|
- **BMAD 6.0 Compatibility** - Full import support for BMAD workflows with tri-modal execution
|
package/package.json
CHANGED
|
@@ -17,8 +17,11 @@ export declare function doctorCommand(options: DoctorOptions): Promise<void>;
|
|
|
17
17
|
*/
|
|
18
18
|
export declare function checkLegacyFiles(projectRoot: string): CheckResult[];
|
|
19
19
|
/**
|
|
20
|
-
* Check if settings.local.json has
|
|
21
|
-
*
|
|
20
|
+
* Check if settings.local.json has statusline configured.
|
|
21
|
+
* The statusLine config is a TOP-LEVEL key (not inside hooks), with structure:
|
|
22
|
+
* { "statusLine": { "type": "command", "command": "path/to/script" } }
|
|
23
|
+
*
|
|
24
|
+
* Returns result with fix function to update to canonical path if needed.
|
|
22
25
|
*/
|
|
23
26
|
export declare function checkLegacyStatuslinePath(projectRoot: string): CheckResult;
|
|
24
27
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAoBA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgHzE;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAoBA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgHzE;AA+qCD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA0CnE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAkF1E"}
|
|
@@ -318,6 +318,15 @@ function checkUserFiles(projectRoot) {
|
|
|
318
318
|
// Check benchmark permissions (needed for /benchmark, /solo subagents)
|
|
319
319
|
const benchmarkCheck = checkBenchmarkPermissions(projectRoot);
|
|
320
320
|
results.push(benchmarkCheck);
|
|
321
|
+
// Check PreToolUse hooks for context-circuit-breaker
|
|
322
|
+
const circuitBreakerCheck = checkContextCircuitBreaker(projectRoot, installationType);
|
|
323
|
+
results.push(circuitBreakerCheck);
|
|
324
|
+
// Check PreToolUse hooks for schema-validation
|
|
325
|
+
const schemaValidationCheck = checkSchemaValidationHook(projectRoot, installationType);
|
|
326
|
+
results.push(schemaValidationCheck);
|
|
327
|
+
// Check PostToolUse hooks for sprint-yaml-validation
|
|
328
|
+
const sprintYamlValidationCheck = checkSprintYamlValidationHook(projectRoot, installationType);
|
|
329
|
+
results.push(sprintYamlValidationCheck);
|
|
321
330
|
}
|
|
322
331
|
return results;
|
|
323
332
|
}
|
|
@@ -499,6 +508,182 @@ function checkStopHook(projectRoot, installationType) {
|
|
|
499
508
|
};
|
|
500
509
|
}
|
|
501
510
|
}
|
|
511
|
+
/**
|
|
512
|
+
* Check that context-circuit-breaker hook is configured in PreToolUse
|
|
513
|
+
* This is needed to prevent context exhaustion (auto-saves session)
|
|
514
|
+
*/
|
|
515
|
+
function checkContextCircuitBreaker(projectRoot, installationType) {
|
|
516
|
+
const settingsPath = join(projectRoot, '.claude/settings.local.json');
|
|
517
|
+
try {
|
|
518
|
+
const settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
519
|
+
// Check if hooks.PreToolUse exists and contains context-circuit-breaker
|
|
520
|
+
if (!settings.hooks?.PreToolUse) {
|
|
521
|
+
return {
|
|
522
|
+
name: 'settings/context-circuit-breaker',
|
|
523
|
+
status: 'warn',
|
|
524
|
+
detail: 'Missing PreToolUse hooks - context circuit breaker not configured',
|
|
525
|
+
fix: () => {
|
|
526
|
+
addContextCircuitBreaker(projectRoot, installationType);
|
|
527
|
+
}
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
// Check if context-circuit-breaker is configured
|
|
531
|
+
const hasCircuitBreaker = settings.hooks.PreToolUse.some((entry) => {
|
|
532
|
+
if (typeof entry === 'object' && entry !== null) {
|
|
533
|
+
const hookEntry = entry;
|
|
534
|
+
return hookEntry.hooks?.some(h => h.command?.includes('context-circuit-breaker'));
|
|
535
|
+
}
|
|
536
|
+
return false;
|
|
537
|
+
});
|
|
538
|
+
if (!hasCircuitBreaker) {
|
|
539
|
+
return {
|
|
540
|
+
name: 'settings/context-circuit-breaker',
|
|
541
|
+
status: 'warn',
|
|
542
|
+
detail: 'context-circuit-breaker not configured - context exhaustion protection disabled',
|
|
543
|
+
fix: () => {
|
|
544
|
+
addContextCircuitBreaker(projectRoot, installationType);
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
return {
|
|
549
|
+
name: 'settings/context-circuit-breaker',
|
|
550
|
+
status: 'pass',
|
|
551
|
+
detail: undefined
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
catch {
|
|
555
|
+
return {
|
|
556
|
+
name: 'settings/context-circuit-breaker',
|
|
557
|
+
status: 'warn',
|
|
558
|
+
detail: 'Could not parse settings.local.json'
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Fix function: Add context-circuit-breaker hook to PreToolUse in settings.local.json
|
|
564
|
+
*/
|
|
565
|
+
function addContextCircuitBreaker(projectRoot, installationType) {
|
|
566
|
+
const settingsPath = join(projectRoot, '.claude/settings.local.json');
|
|
567
|
+
const scriptBase = getScriptBasePath(installationType);
|
|
568
|
+
const requiredHook = {
|
|
569
|
+
matcher: 'Edit|Write|Bash|Task',
|
|
570
|
+
hooks: [
|
|
571
|
+
{
|
|
572
|
+
type: 'command',
|
|
573
|
+
command: `"$CLAUDE_PROJECT_DIR"/${scriptBase}/hooks/context-circuit-breaker.sh`
|
|
574
|
+
}
|
|
575
|
+
]
|
|
576
|
+
};
|
|
577
|
+
let settings = {};
|
|
578
|
+
if (pathExists(settingsPath)) {
|
|
579
|
+
try {
|
|
580
|
+
settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
581
|
+
}
|
|
582
|
+
catch {
|
|
583
|
+
// Start fresh if parse fails
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
if (!settings.hooks) {
|
|
587
|
+
settings.hooks = {};
|
|
588
|
+
}
|
|
589
|
+
const hooks = settings.hooks;
|
|
590
|
+
if (!hooks.PreToolUse) {
|
|
591
|
+
hooks.PreToolUse = [requiredHook];
|
|
592
|
+
}
|
|
593
|
+
else if (Array.isArray(hooks.PreToolUse)) {
|
|
594
|
+
// Append the required hook (circuit breaker should run last)
|
|
595
|
+
hooks.PreToolUse = [...hooks.PreToolUse, requiredHook];
|
|
596
|
+
}
|
|
597
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Check that schema-validation hook is configured in PreToolUse
|
|
601
|
+
* This validates XML schema for session/skill/step files on Write
|
|
602
|
+
*/
|
|
603
|
+
function checkSchemaValidationHook(projectRoot, installationType) {
|
|
604
|
+
const settingsPath = join(projectRoot, '.claude/settings.local.json');
|
|
605
|
+
try {
|
|
606
|
+
const settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
607
|
+
// Check if hooks.PreToolUse exists
|
|
608
|
+
if (!settings.hooks?.PreToolUse) {
|
|
609
|
+
return {
|
|
610
|
+
name: 'settings/schema-validation',
|
|
611
|
+
status: 'warn',
|
|
612
|
+
detail: 'Missing PreToolUse hooks - schema validation not configured',
|
|
613
|
+
fix: () => {
|
|
614
|
+
addSchemaValidationHook(projectRoot, installationType);
|
|
615
|
+
}
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
// Check if schema-validation is configured
|
|
619
|
+
const hasSchemaValidation = settings.hooks.PreToolUse.some((entry) => {
|
|
620
|
+
if (typeof entry === 'object' && entry !== null) {
|
|
621
|
+
const hookEntry = entry;
|
|
622
|
+
return hookEntry.hooks?.some(h => h.command?.includes('schema-validation'));
|
|
623
|
+
}
|
|
624
|
+
return false;
|
|
625
|
+
});
|
|
626
|
+
if (!hasSchemaValidation) {
|
|
627
|
+
return {
|
|
628
|
+
name: 'settings/schema-validation',
|
|
629
|
+
status: 'warn',
|
|
630
|
+
detail: 'schema-validation not configured - XML schema enforcement disabled',
|
|
631
|
+
fix: () => {
|
|
632
|
+
addSchemaValidationHook(projectRoot, installationType);
|
|
633
|
+
}
|
|
634
|
+
};
|
|
635
|
+
}
|
|
636
|
+
return {
|
|
637
|
+
name: 'settings/schema-validation',
|
|
638
|
+
status: 'pass',
|
|
639
|
+
detail: undefined
|
|
640
|
+
};
|
|
641
|
+
}
|
|
642
|
+
catch {
|
|
643
|
+
return {
|
|
644
|
+
name: 'settings/schema-validation',
|
|
645
|
+
status: 'warn',
|
|
646
|
+
detail: 'Could not parse settings.local.json'
|
|
647
|
+
};
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
/**
|
|
651
|
+
* Fix function: Add schema-validation hook to PreToolUse in settings.local.json
|
|
652
|
+
*/
|
|
653
|
+
function addSchemaValidationHook(projectRoot, installationType) {
|
|
654
|
+
const settingsPath = join(projectRoot, '.claude/settings.local.json');
|
|
655
|
+
const scriptBase = getScriptBasePath(installationType);
|
|
656
|
+
const requiredHook = {
|
|
657
|
+
matcher: 'Write',
|
|
658
|
+
hooks: [
|
|
659
|
+
{
|
|
660
|
+
type: 'command',
|
|
661
|
+
command: `"$CLAUDE_PROJECT_DIR"/${scriptBase}/hooks/schema-validation.sh`
|
|
662
|
+
}
|
|
663
|
+
]
|
|
664
|
+
};
|
|
665
|
+
let settings = {};
|
|
666
|
+
if (pathExists(settingsPath)) {
|
|
667
|
+
try {
|
|
668
|
+
settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
669
|
+
}
|
|
670
|
+
catch {
|
|
671
|
+
// Start fresh if parse fails
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
if (!settings.hooks) {
|
|
675
|
+
settings.hooks = {};
|
|
676
|
+
}
|
|
677
|
+
const hooks = settings.hooks;
|
|
678
|
+
if (!hooks.PreToolUse) {
|
|
679
|
+
hooks.PreToolUse = [requiredHook];
|
|
680
|
+
}
|
|
681
|
+
else if (Array.isArray(hooks.PreToolUse)) {
|
|
682
|
+
// Insert schema validation early (after pre-edit-check but before circuit breaker)
|
|
683
|
+
hooks.PreToolUse = [requiredHook, ...hooks.PreToolUse];
|
|
684
|
+
}
|
|
685
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
|
|
686
|
+
}
|
|
502
687
|
/**
|
|
503
688
|
* Check that PostToolUse hook is properly configured in settings.local.json
|
|
504
689
|
* This is needed for bell mode to inject queued messages (MSSCI-12275)
|
|
@@ -588,6 +773,95 @@ function addPostToolUseHook(projectRoot, installationType) {
|
|
|
588
773
|
}
|
|
589
774
|
writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
|
|
590
775
|
}
|
|
776
|
+
/**
|
|
777
|
+
* Check that sprint-yaml-validation hook is configured in PostToolUse
|
|
778
|
+
* This validates sprint YAML files after Edit/Write to ensure Cyclist compatibility
|
|
779
|
+
*/
|
|
780
|
+
function checkSprintYamlValidationHook(projectRoot, installationType) {
|
|
781
|
+
const settingsPath = join(projectRoot, '.claude/settings.local.json');
|
|
782
|
+
try {
|
|
783
|
+
const settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
784
|
+
// Check if hooks.PostToolUse exists
|
|
785
|
+
if (!settings.hooks?.PostToolUse) {
|
|
786
|
+
return {
|
|
787
|
+
name: 'settings/sprint-yaml-validation',
|
|
788
|
+
status: 'warn',
|
|
789
|
+
detail: 'Missing PostToolUse hooks - sprint YAML validation not configured',
|
|
790
|
+
fix: () => {
|
|
791
|
+
addSprintYamlValidationHook(projectRoot, installationType);
|
|
792
|
+
}
|
|
793
|
+
};
|
|
794
|
+
}
|
|
795
|
+
// Check if sprint-yaml-validation is configured
|
|
796
|
+
const hasSprintYamlValidation = settings.hooks.PostToolUse.some((entry) => {
|
|
797
|
+
if (typeof entry === 'object' && entry !== null) {
|
|
798
|
+
const hookEntry = entry;
|
|
799
|
+
return hookEntry.hooks?.some(h => h.command?.includes('sprint-yaml-validation'));
|
|
800
|
+
}
|
|
801
|
+
return false;
|
|
802
|
+
});
|
|
803
|
+
if (!hasSprintYamlValidation) {
|
|
804
|
+
return {
|
|
805
|
+
name: 'settings/sprint-yaml-validation',
|
|
806
|
+
status: 'warn',
|
|
807
|
+
detail: 'sprint-yaml-validation not configured - sprint YAML errors may break SprintPanel',
|
|
808
|
+
fix: () => {
|
|
809
|
+
addSprintYamlValidationHook(projectRoot, installationType);
|
|
810
|
+
}
|
|
811
|
+
};
|
|
812
|
+
}
|
|
813
|
+
return {
|
|
814
|
+
name: 'settings/sprint-yaml-validation',
|
|
815
|
+
status: 'pass',
|
|
816
|
+
detail: undefined
|
|
817
|
+
};
|
|
818
|
+
}
|
|
819
|
+
catch {
|
|
820
|
+
return {
|
|
821
|
+
name: 'settings/sprint-yaml-validation',
|
|
822
|
+
status: 'warn',
|
|
823
|
+
detail: 'Could not parse settings.local.json'
|
|
824
|
+
};
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Fix function: Add sprint-yaml-validation hook to PostToolUse in settings.local.json
|
|
829
|
+
* Validates sprint YAML files after Edit/Write for Cyclist SprintPanel compatibility
|
|
830
|
+
*/
|
|
831
|
+
function addSprintYamlValidationHook(projectRoot, installationType) {
|
|
832
|
+
const settingsPath = join(projectRoot, '.claude/settings.local.json');
|
|
833
|
+
const scriptBase = getScriptBasePath(installationType);
|
|
834
|
+
const requiredHook = {
|
|
835
|
+
matcher: 'Edit|Write',
|
|
836
|
+
hooks: [
|
|
837
|
+
{
|
|
838
|
+
type: 'command',
|
|
839
|
+
command: `"$CLAUDE_PROJECT_DIR"/${scriptBase}/hooks/sprint-yaml-validation.sh`
|
|
840
|
+
}
|
|
841
|
+
]
|
|
842
|
+
};
|
|
843
|
+
let settings = {};
|
|
844
|
+
if (pathExists(settingsPath)) {
|
|
845
|
+
try {
|
|
846
|
+
settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
|
|
847
|
+
}
|
|
848
|
+
catch {
|
|
849
|
+
// Start fresh if parse fails
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
if (!settings.hooks) {
|
|
853
|
+
settings.hooks = {};
|
|
854
|
+
}
|
|
855
|
+
const hooks = settings.hooks;
|
|
856
|
+
if (!hooks.PostToolUse) {
|
|
857
|
+
hooks.PostToolUse = [requiredHook];
|
|
858
|
+
}
|
|
859
|
+
else if (Array.isArray(hooks.PostToolUse)) {
|
|
860
|
+
// Append the sprint YAML validation hook
|
|
861
|
+
hooks.PostToolUse = [...hooks.PostToolUse, requiredHook];
|
|
862
|
+
}
|
|
863
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
|
|
864
|
+
}
|
|
591
865
|
/**
|
|
592
866
|
* Fix function: Add Stop hook to settings.local.json
|
|
593
867
|
*/
|
|
@@ -753,6 +1027,15 @@ function createSettingsLocalJson(projectRoot, installationType) {
|
|
|
753
1027
|
command: `"$CLAUDE_PROJECT_DIR"/${scriptBase}/hooks/bell-mode-hook.sh`
|
|
754
1028
|
}
|
|
755
1029
|
]
|
|
1030
|
+
},
|
|
1031
|
+
{
|
|
1032
|
+
matcher: 'Edit|Write',
|
|
1033
|
+
hooks: [
|
|
1034
|
+
{
|
|
1035
|
+
type: 'command',
|
|
1036
|
+
command: `"$CLAUDE_PROJECT_DIR"/${scriptBase}/hooks/sprint-yaml-validation.sh`
|
|
1037
|
+
}
|
|
1038
|
+
]
|
|
756
1039
|
}
|
|
757
1040
|
],
|
|
758
1041
|
Stop: [
|
|
@@ -784,12 +1067,21 @@ function createSettingsLocalJson(projectRoot, installationType) {
|
|
|
784
1067
|
command: `"$CLAUDE_PROJECT_DIR"/${scriptBase}/hooks/context-warning.sh`
|
|
785
1068
|
}
|
|
786
1069
|
]
|
|
1070
|
+
},
|
|
1071
|
+
{
|
|
1072
|
+
matcher: 'Edit|Write|Bash|Task',
|
|
1073
|
+
hooks: [
|
|
1074
|
+
{
|
|
1075
|
+
type: 'command',
|
|
1076
|
+
command: `"$CLAUDE_PROJECT_DIR"/${scriptBase}/hooks/context-circuit-breaker.sh`
|
|
1077
|
+
}
|
|
1078
|
+
]
|
|
787
1079
|
}
|
|
788
1080
|
]
|
|
789
1081
|
},
|
|
790
1082
|
statusLine: {
|
|
791
1083
|
type: 'command',
|
|
792
|
-
command: `"$CLAUDE_PROJECT_DIR"/${scriptBase}/statusline.sh`
|
|
1084
|
+
command: `"$CLAUDE_PROJECT_DIR"/${scriptBase}/misc/statusline.sh`
|
|
793
1085
|
}
|
|
794
1086
|
};
|
|
795
1087
|
ensureDirSync(join(projectRoot, '.claude'));
|
|
@@ -821,7 +1113,11 @@ function checkHooks(projectRoot) {
|
|
|
821
1113
|
const hooks = [
|
|
822
1114
|
{ path: `${scriptBase}/hooks/session-start.sh`, name: 'hook/session-start' },
|
|
823
1115
|
{ path: `${scriptBase}/hooks/pre-edit-check.sh`, name: 'hook/pre-edit-check' },
|
|
824
|
-
{ path: `${scriptBase}/hooks/context-warning.sh`, name: 'hook/context-warning' }
|
|
1116
|
+
{ path: `${scriptBase}/hooks/context-warning.sh`, name: 'hook/context-warning' },
|
|
1117
|
+
{ path: `${scriptBase}/hooks/context-circuit-breaker.sh`, name: 'hook/context-circuit-breaker' },
|
|
1118
|
+
{ path: `${scriptBase}/hooks/bell-mode-hook.sh`, name: 'hook/bell-mode' },
|
|
1119
|
+
{ path: `${scriptBase}/hooks/question-reflector-check.sh`, name: 'hook/question-reflector' },
|
|
1120
|
+
{ path: `${scriptBase}/hooks/sprint-yaml-validation.sh`, name: 'hook/sprint-yaml-validation' }
|
|
825
1121
|
];
|
|
826
1122
|
for (const { path, name } of hooks) {
|
|
827
1123
|
const fullPath = join(projectRoot, path);
|
|
@@ -916,8 +1212,11 @@ export function checkLegacyFiles(projectRoot) {
|
|
|
916
1212
|
return results;
|
|
917
1213
|
}
|
|
918
1214
|
/**
|
|
919
|
-
* Check if settings.local.json has
|
|
920
|
-
*
|
|
1215
|
+
* Check if settings.local.json has statusline configured.
|
|
1216
|
+
* The statusLine config is a TOP-LEVEL key (not inside hooks), with structure:
|
|
1217
|
+
* { "statusLine": { "type": "command", "command": "path/to/script" } }
|
|
1218
|
+
*
|
|
1219
|
+
* Returns result with fix function to update to canonical path if needed.
|
|
921
1220
|
*/
|
|
922
1221
|
export function checkLegacyStatuslinePath(projectRoot) {
|
|
923
1222
|
const settingsPath = join(projectRoot, '.claude/settings.local.json');
|
|
@@ -940,46 +1239,57 @@ export function checkLegacyStatuslinePath(projectRoot) {
|
|
|
940
1239
|
detail: 'Cannot parse settings.local.json'
|
|
941
1240
|
};
|
|
942
1241
|
}
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
1242
|
+
// statusLine is a TOP-LEVEL key, not inside hooks
|
|
1243
|
+
// Format: { type: "command", command: "..." }
|
|
1244
|
+
const statusLine = settings.statusLine;
|
|
1245
|
+
if (!statusLine || !statusLine.command) {
|
|
1246
|
+
// No statusline configured
|
|
946
1247
|
return {
|
|
947
1248
|
name: 'settings/statusline-path',
|
|
948
1249
|
status: 'pass',
|
|
949
|
-
detail: 'No statusline
|
|
1250
|
+
detail: 'No statusline configured'
|
|
950
1251
|
};
|
|
951
1252
|
}
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
1253
|
+
// Extract the path from the command (may have $CLAUDE_PROJECT_DIR prefix)
|
|
1254
|
+
const command = statusLine.command;
|
|
1255
|
+
// Match patterns like "$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/misc/statusline.sh
|
|
1256
|
+
// or plain paths like .pennyfarthing/scripts/misc/statusline.sh
|
|
1257
|
+
const pathMatch = command.match(/(?:\"\$CLAUDE_PROJECT_DIR\"\/)?([^\s"]+)/);
|
|
1258
|
+
const currentPath = pathMatch ? pathMatch[1] : command;
|
|
1259
|
+
// Check if it contains the canonical path
|
|
1260
|
+
if (currentPath.includes('misc/statusline.sh') || command.includes('misc/statusline.sh')) {
|
|
955
1261
|
return {
|
|
956
1262
|
name: 'settings/statusline-path',
|
|
957
1263
|
status: 'pass',
|
|
958
|
-
detail:
|
|
1264
|
+
detail: 'Configured'
|
|
959
1265
|
};
|
|
960
1266
|
}
|
|
961
1267
|
// Check if it's a known legacy path
|
|
962
|
-
|
|
1268
|
+
const isLegacy = LEGACY_STATUSLINE_PATHS.some(legacyPath => currentPath.includes(legacyPath) || command.includes(legacyPath));
|
|
1269
|
+
if (isLegacy) {
|
|
963
1270
|
// Check if proper statusline exists before offering fix
|
|
964
1271
|
const properStatusline = join(projectRoot, CANONICAL_STATUSLINE_PATH);
|
|
965
1272
|
if (pathExists(properStatusline)) {
|
|
966
1273
|
return {
|
|
967
1274
|
name: 'settings/statusline-path',
|
|
968
1275
|
status: 'warn',
|
|
969
|
-
detail: `Legacy path
|
|
1276
|
+
detail: `Legacy path in command`,
|
|
970
1277
|
fix: () => {
|
|
971
1278
|
const updatedSettings = { ...settings };
|
|
972
|
-
updatedSettings.
|
|
1279
|
+
updatedSettings.statusLine = {
|
|
1280
|
+
type: 'command',
|
|
1281
|
+
command: `"$CLAUDE_PROJECT_DIR"/${CANONICAL_STATUSLINE_PATH}`
|
|
1282
|
+
};
|
|
973
1283
|
writeFileSync(settingsPath, JSON.stringify(updatedSettings, null, 2));
|
|
974
1284
|
}
|
|
975
1285
|
};
|
|
976
1286
|
}
|
|
977
1287
|
}
|
|
978
|
-
//
|
|
1288
|
+
// Has statusline configured (custom or valid)
|
|
979
1289
|
return {
|
|
980
1290
|
name: 'settings/statusline-path',
|
|
981
1291
|
status: 'pass',
|
|
982
|
-
detail:
|
|
1292
|
+
detail: 'Configured'
|
|
983
1293
|
};
|
|
984
1294
|
}
|
|
985
1295
|
//# sourceMappingURL=doctor.js.map
|