@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.
Files changed (292) hide show
  1. package/README.md +16 -7
  2. package/package.json +1 -1
  3. package/packages/core/dist/cli/commands/doctor.d.ts +5 -2
  4. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  5. package/packages/core/dist/cli/commands/doctor.js +327 -17
  6. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  7. package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
  8. package/packages/core/dist/cli/commands/init.js +3 -246
  9. package/packages/core/dist/cli/commands/init.js.map +1 -1
  10. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  11. package/packages/core/dist/cli/commands/update.js +4 -140
  12. package/packages/core/dist/cli/commands/update.js.map +1 -1
  13. package/packages/core/dist/cli/utils/constants.d.ts +7 -1
  14. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
  15. package/packages/core/dist/cli/utils/constants.js +2 -0
  16. package/packages/core/dist/cli/utils/constants.js.map +1 -1
  17. package/packages/core/dist/cli/utils/settings.d.ts +22 -0
  18. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -0
  19. package/packages/core/dist/cli/utils/settings.js +300 -0
  20. package/packages/core/dist/cli/utils/settings.js.map +1 -0
  21. package/pennyfarthing-dist/commands/chore.md +18 -17
  22. package/pennyfarthing-dist/commands/continue-session.md +41 -7
  23. package/pennyfarthing-dist/commands/fix-blocker.md +22 -0
  24. package/pennyfarthing-dist/commands/git-cleanup.md +25 -19
  25. package/pennyfarthing-dist/commands/patch.md +210 -0
  26. package/pennyfarthing-dist/commands/setup.md +65 -0
  27. package/pennyfarthing-dist/guides/session-schema.md +346 -0
  28. package/pennyfarthing-dist/guides/skill-schema.md +412 -0
  29. package/pennyfarthing-dist/guides/workflow-step-schema.md +512 -0
  30. package/pennyfarthing-dist/guides/xml-tags.md +292 -0
  31. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  32. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +43 -8
  33. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +30 -0
  34. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +78 -0
  35. package/pennyfarthing-dist/scripts/lib/find-root.sh +32 -7
  36. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +13 -2
  37. package/pennyfarthing-dist/scripts/sprint/validate-sprint-yaml.sh +139 -0
  38. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +4 -0
  39. package/pennyfarthing-dist/skills/changelog/SKILL.md +18 -0
  40. package/pennyfarthing-dist/skills/code-review/SKILL.md +5 -1
  41. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +3 -0
  42. package/pennyfarthing-dist/skills/cyclist/SKILL.md +2 -2
  43. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +24 -0
  44. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +3 -0
  45. package/pennyfarthing-dist/skills/judge/SKILL.md +8 -0
  46. package/pennyfarthing-dist/skills/just/SKILL.md +11 -0
  47. package/pennyfarthing-dist/skills/mermaid/SKILL.md +16 -0
  48. package/pennyfarthing-dist/skills/otel/skill.md +4 -0
  49. package/pennyfarthing-dist/skills/permissions/skill.md +3 -0
  50. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +9 -0
  51. package/pennyfarthing-dist/skills/story/skill.md +16 -16
  52. package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +56 -0
  53. package/pennyfarthing-dist/skills/testing/SKILL.md +22 -0
  54. package/pennyfarthing-dist/skills/theme/skill.md +12 -0
  55. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +4 -0
  56. package/pennyfarthing-dist/skills/workflow/skill.md +22 -14
  57. package/pennyfarthing-dist/skills/yq/SKILL.md +8 -0
  58. package/pennyfarthing-dist/templates/settings.local.json.template +9 -0
  59. package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +12 -0
  60. package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +12 -0
  61. package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +12 -0
  62. package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +12 -0
  63. package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +12 -0
  64. package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +12 -0
  65. package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +12 -0
  66. package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +12 -0
  67. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +25 -0
  68. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +23 -0
  69. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +26 -0
  70. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +24 -0
  71. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +23 -0
  72. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +43 -41
  73. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-02-categorize.md +50 -19
  74. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-03-execute.md +102 -111
  75. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +48 -39
  76. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +30 -31
  77. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +21 -0
  78. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +21 -0
  79. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +23 -0
  80. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +23 -0
  81. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +28 -0
  82. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +25 -0
  83. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-01-connect.md +257 -0
  84. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-02-explore.md +107 -0
  85. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-03-fix.md +127 -0
  86. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-04-commit.md +122 -0
  87. package/pennyfarthing-dist/workflows/interactive-debug/workflow.yaml +51 -0
  88. package/pennyfarthing-dist/workflows/patch.yaml +2 -3
  89. package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +6 -0
  90. package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +6 -0
  91. package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +6 -0
  92. package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +6 -0
  93. package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +6 -0
  94. package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +6 -0
  95. package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +6 -0
  96. package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +6 -0
  97. package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +6 -0
  98. package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +6 -0
  99. package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +6 -0
  100. package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +6 -0
  101. package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +6 -0
  102. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +6 -0
  103. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +6 -0
  104. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +6 -0
  105. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +6 -0
  106. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +6 -0
  107. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +6 -0
  108. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +6 -0
  109. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +6 -0
  110. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +6 -0
  111. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +6 -0
  112. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +6 -0
  113. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +6 -0
  114. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +6 -0
  115. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +6 -0
  116. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +6 -0
  117. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +6 -0
  118. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +6 -0
  119. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +6 -0
  120. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +6 -0
  121. package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +18 -0
  122. package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +19 -0
  123. package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +22 -0
  124. package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +22 -0
  125. package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +23 -0
  126. package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +24 -0
  127. package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +22 -0
  128. package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +22 -0
  129. package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +31 -0
  130. package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +28 -0
  131. package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +157 -0
  132. package/pennyfarthing-dist/workflows/project-setup/steps/step-02-clone-repos.md +217 -0
  133. package/pennyfarthing-dist/workflows/project-setup/steps/step-03-repos-yaml.md +159 -0
  134. package/pennyfarthing-dist/workflows/project-setup/steps/step-04-claude-md.md +186 -0
  135. package/pennyfarthing-dist/workflows/project-setup/steps/step-05-shared-context.md +185 -0
  136. package/pennyfarthing-dist/workflows/project-setup/steps/step-06-task-runner.md +279 -0
  137. package/pennyfarthing-dist/workflows/project-setup/steps/step-07-theme.md +200 -0
  138. package/pennyfarthing-dist/workflows/project-setup/steps/step-08-cyclist.md +245 -0
  139. package/pennyfarthing-dist/workflows/project-setup/steps/step-09-complete.md +203 -0
  140. package/pennyfarthing-dist/workflows/project-setup/workflow.yaml +41 -0
  141. package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +21 -0
  142. package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +23 -0
  143. package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +25 -0
  144. package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +22 -0
  145. package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +23 -0
  146. package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +23 -0
  147. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +12 -0
  148. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +12 -0
  149. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +12 -0
  150. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +12 -0
  151. package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +22 -0
  152. package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +24 -0
  153. package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +25 -0
  154. package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +26 -0
  155. package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +26 -0
  156. package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +34 -0
  157. package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +23 -0
  158. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +25 -0
  159. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +27 -0
  160. package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +26 -0
  161. package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +27 -0
  162. package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +26 -0
  163. package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +35 -0
  164. package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +22 -0
  165. package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +25 -0
  166. package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +26 -0
  167. package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +26 -0
  168. package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +29 -1
  169. package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +37 -1
  170. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +15 -0
  171. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +17 -0
  172. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +16 -0
  173. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +17 -0
  174. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +22 -0
  175. package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +6 -0
  176. package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +6 -0
  177. package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +6 -0
  178. package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +6 -0
  179. package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +6 -0
  180. package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +6 -0
  181. package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +6 -0
  182. package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +6 -0
  183. package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +6 -0
  184. package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +6 -0
  185. package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +6 -0
  186. package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +6 -0
  187. package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +6 -0
  188. package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +6 -0
  189. package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +6 -0
  190. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  191. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  192. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  193. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  194. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  195. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  196. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  197. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  198. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  200. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  201. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  202. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  203. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  204. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  205. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  206. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  207. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  208. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  209. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  210. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  211. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  212. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  213. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  214. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  215. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  216. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  217. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  218. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  219. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  220. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  221. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  222. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  223. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  224. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  225. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  226. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  228. package/pennyfarthing_scripts/migration/__init__.py +39 -0
  229. package/pennyfarthing_scripts/migration/__main__.py +10 -0
  230. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  231. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  233. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  234. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  235. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  237. package/pennyfarthing_scripts/migration/cli.py +304 -0
  238. package/pennyfarthing_scripts/migration/session.py +384 -0
  239. package/pennyfarthing_scripts/migration/skill.py +188 -0
  240. package/pennyfarthing_scripts/migration/step.py +229 -0
  241. package/pennyfarthing_scripts/migration/validate.py +282 -0
  242. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  243. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  244. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  245. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  247. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/schema_validation_hook.py +306 -0
  256. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  257. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  259. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  260. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  261. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  262. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  263. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  264. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  265. package/pennyfarthing_scripts/sprint/archive_epic.py +399 -0
  266. package/pennyfarthing_scripts/sprint/cli.py +100 -0
  267. package/pennyfarthing_scripts/sprint/import_epic.py +431 -0
  268. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  269. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  270. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  271. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  272. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  273. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  274. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  276. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  277. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  278. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  279. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  280. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  281. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  282. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  283. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  284. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  285. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  286. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  287. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  288. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  289. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  290. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  291. package/pennyfarthing-dist/scripts/sprint/import-epic-to-future.sh +0 -10
  292. 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
- **v8.1.0** | *The outer loop goes once, the inner loop goes many times.*
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 BikeLane Workflows** - Phased (TDD, BDD, Trivial), Stepped (PRD, Architecture), Procedural (Brainstorming, Retrospective)
19
- - **45 Slash Commands** - Entry points for agent activation and workflows
20
- - **22 Skills** - Reusable knowledge domains (testing, code-review, jira, mermaid, etc.)
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** - Rich UI with agent portraits, session stats, workflow visualization
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 19 workflows. Use `/workflow start <name>` to begin any workflow.
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 v7.6
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pennyfarthing/core",
3
- "version": "9.0.0",
3
+ "version": "9.1.2",
4
4
  "description": "Claude Code agent framework with TDD workflow and persona system",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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 a legacy statusline path.
21
- * Returns result with fix function to update to canonical path.
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;AA61BD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA0CnE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAoE1E"}
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 a legacy statusline path.
920
- * Returns result with fix function to update to canonical path.
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
- const hooks = settings.hooks;
944
- if (!hooks || !hooks.StatusLine) {
945
- // No statusline hook configured
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 hook configured'
1250
+ detail: 'No statusline configured'
950
1251
  };
951
1252
  }
952
- const currentPath = hooks.StatusLine;
953
- // Check if it's the canonical path
954
- if (currentPath === CANONICAL_STATUSLINE_PATH) {
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: undefined
1264
+ detail: 'Configured'
959
1265
  };
960
1266
  }
961
1267
  // Check if it's a known legacy path
962
- if (LEGACY_STATUSLINE_PATHS.includes(currentPath)) {
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: ${currentPath}`,
1276
+ detail: `Legacy path in command`,
970
1277
  fix: () => {
971
1278
  const updatedSettings = { ...settings };
972
- updatedSettings.hooks.StatusLine = CANONICAL_STATUSLINE_PATH;
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
- // Unknown path - pass (user may have custom setup)
1288
+ // Has statusline configured (custom or valid)
979
1289
  return {
980
1290
  name: 'settings/statusline-path',
981
1291
  status: 'pass',
982
- detail: `Custom path: ${currentPath}`
1292
+ detail: 'Configured'
983
1293
  };
984
1294
  }
985
1295
  //# sourceMappingURL=doctor.js.map