@pennyfarthing/core 10.0.5 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/README.md +9 -7
  2. package/package.json +15 -11
  3. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  4. package/packages/core/dist/cli/commands/doctor.js +251 -4
  5. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  6. package/packages/core/dist/cli/commands/init.d.ts +7 -0
  7. package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
  8. package/packages/core/dist/cli/commands/init.js +41 -8
  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 +26 -0
  12. package/packages/core/dist/cli/commands/update.js.map +1 -1
  13. package/packages/core/dist/cli/index.js +1 -1
  14. package/packages/core/dist/cli/index.js.map +1 -1
  15. package/packages/core/dist/cli/utils/python.d.ts +22 -0
  16. package/packages/core/dist/cli/utils/python.d.ts.map +1 -0
  17. package/packages/core/dist/cli/utils/python.js +102 -0
  18. package/packages/core/dist/cli/utils/python.js.map +1 -0
  19. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  20. package/packages/core/dist/cli/utils/settings.js +10 -0
  21. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  22. package/pennyfarthing-dist/agents/README.md +1 -3
  23. package/pennyfarthing-dist/agents/architect.md +0 -6
  24. package/pennyfarthing-dist/agents/devops.md +0 -6
  25. package/pennyfarthing-dist/agents/orchestrator.md +0 -6
  26. package/pennyfarthing-dist/agents/pm.md +0 -6
  27. package/pennyfarthing-dist/agents/sm.md +0 -6
  28. package/pennyfarthing-dist/commands/architect.md +11 -3
  29. package/pennyfarthing-dist/commands/close-epic.md +24 -131
  30. package/pennyfarthing-dist/commands/create-theme.md +14 -24
  31. package/pennyfarthing-dist/commands/dev.md +11 -3
  32. package/pennyfarthing-dist/commands/devops.md +11 -3
  33. package/pennyfarthing-dist/commands/health-check.md +1 -3
  34. package/pennyfarthing-dist/commands/help.md +8 -12
  35. package/pennyfarthing-dist/commands/list-themes.md +14 -16
  36. package/pennyfarthing-dist/commands/orchestrator.md +11 -3
  37. package/pennyfarthing-dist/commands/parallel-work.md +1 -3
  38. package/pennyfarthing-dist/commands/pm.md +11 -3
  39. package/pennyfarthing-dist/commands/prime.md +6 -6
  40. package/pennyfarthing-dist/commands/reviewer.md +11 -3
  41. package/pennyfarthing-dist/commands/run-ci.md +1 -1
  42. package/pennyfarthing-dist/commands/set-theme.md +14 -51
  43. package/pennyfarthing-dist/commands/setup.md +1 -1
  44. package/pennyfarthing-dist/commands/show-theme.md +14 -16
  45. package/pennyfarthing-dist/commands/sm.md +11 -3
  46. package/pennyfarthing-dist/commands/tea.md +11 -3
  47. package/pennyfarthing-dist/commands/tech-writer.md +11 -3
  48. package/pennyfarthing-dist/commands/theme-maker.md +14 -671
  49. package/pennyfarthing-dist/commands/theme.md +95 -0
  50. package/pennyfarthing-dist/commands/ux-designer.md +11 -3
  51. package/pennyfarthing-dist/commands/work.md +3 -5
  52. package/pennyfarthing-dist/guides/agent-coordination.md +11 -13
  53. package/pennyfarthing-dist/guides/agent-template-tactical.md +2 -3
  54. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +212 -0
  55. package/pennyfarthing-dist/guides/hooks.md +5 -5
  56. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +3 -3
  57. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +9 -59
  58. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -5
  59. package/pennyfarthing-dist/guides/prime.md +2 -2
  60. package/pennyfarthing-dist/guides/skill-schema.md +4 -4
  61. package/pennyfarthing-dist/scripts/core/agent-session.sh +6 -2
  62. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
  63. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -0
  64. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
  65. package/pennyfarthing-dist/scripts/core/prime.sh +8 -10
  66. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
  67. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
  68. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
  69. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +8 -6
  70. package/pennyfarthing-dist/scripts/git/release.sh +0 -0
  71. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
  72. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
  73. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -0
  74. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  75. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  76. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  77. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
  78. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +12 -5
  79. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +4 -3
  80. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  81. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +11 -5
  82. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
  83. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
  84. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
  85. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
  86. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  87. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
  88. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
  89. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
  90. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
  91. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
  92. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
  93. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
  94. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
  95. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
  96. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
  97. package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
  98. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
  99. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
  100. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
  101. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
  102. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
  103. package/pennyfarthing-dist/scripts/misc/README.md +1 -1
  104. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
  105. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
  106. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
  107. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
  108. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
  109. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
  110. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
  111. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
  112. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
  113. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
  114. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
  115. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
  116. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
  117. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
  118. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
  119. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
  120. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
  121. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +1 -2
  122. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -0
  123. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
  124. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
  125. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
  126. package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +0 -0
  127. package/pennyfarthing-dist/scripts/test/swebench-judge.py +0 -0
  128. package/pennyfarthing-dist/scripts/test/test-cache.sh +0 -0
  129. package/pennyfarthing-dist/scripts/test/test-setup.sh +0 -0
  130. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  131. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
  132. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
  133. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +5 -5
  134. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
  135. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
  136. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
  137. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
  138. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  139. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +3 -79
  140. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  141. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  142. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  143. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
  144. package/pennyfarthing-dist/scripts/theme/README.md +1 -1
  145. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +0 -0
  146. package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +0 -0
  147. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
  148. package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +0 -0
  149. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -1
  150. package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
  151. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
  152. package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
  153. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +62 -17
  154. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
  155. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
  156. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
  157. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
  158. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
  159. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
  160. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
  161. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
  162. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
  163. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +2 -2
  164. package/pennyfarthing-dist/skills/skill-registry.yaml +20 -16
  165. package/pennyfarthing-dist/skills/story/scripts/create-story.sh +0 -0
  166. package/pennyfarthing-dist/skills/story/scripts/size-story.sh +0 -0
  167. package/pennyfarthing-dist/skills/story/scripts/story-template.sh +0 -0
  168. package/pennyfarthing-dist/skills/theme/skill.md +290 -75
  169. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +23 -166
  170. package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +0 -0
  171. package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +0 -0
  172. package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +0 -0
  173. package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +0 -0
  174. package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +0 -0
  175. package/pennyfarthing-dist/skills/workflow/skill.md +4 -4
  176. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -11
  177. package/pennyfarthing-dist/templates/auto-load-sm.sh.template +14 -0
  178. package/pennyfarthing-dist/templates/settings.local.json.template +9 -0
  179. package/pennyfarthing-dist/workflows/2party-tdd.yaml +399 -0
  180. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +41 -24
  181. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  182. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  183. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  184. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  185. package/pennyfarthing_scripts/cli.py +15 -0
  186. package/pennyfarthing_scripts/codemarkers/__init__.py +19 -0
  187. package/pennyfarthing_scripts/codemarkers/__main__.py +6 -0
  188. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  189. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  190. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  191. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  192. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  193. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  194. package/pennyfarthing_scripts/codemarkers/analyze.py +326 -0
  195. package/pennyfarthing_scripts/codemarkers/cli.py +129 -0
  196. package/pennyfarthing_scripts/codemarkers/formatters.py +89 -0
  197. package/pennyfarthing_scripts/codemarkers/models.py +45 -0
  198. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  200. package/pennyfarthing_scripts/complexity/__init__.py +15 -0
  201. package/pennyfarthing_scripts/complexity/__main__.py +6 -0
  202. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  203. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  204. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  205. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  206. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  207. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  208. package/pennyfarthing_scripts/complexity/analyze.py +207 -0
  209. package/pennyfarthing_scripts/complexity/cli.py +78 -0
  210. package/pennyfarthing_scripts/complexity/formatters.py +64 -0
  211. package/pennyfarthing_scripts/complexity/models.py +32 -0
  212. package/pennyfarthing_scripts/deadcode/__init__.py +6 -0
  213. package/pennyfarthing_scripts/deadcode/__main__.py +6 -0
  214. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  215. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  216. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  217. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  218. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  219. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  220. package/pennyfarthing_scripts/deadcode/analyze.py +323 -0
  221. package/pennyfarthing_scripts/deadcode/cli.py +163 -0
  222. package/pennyfarthing_scripts/deadcode/formatters.py +106 -0
  223. package/pennyfarthing_scripts/deadcode/models.py +54 -0
  224. package/pennyfarthing_scripts/dependencies/__init__.py +20 -0
  225. package/pennyfarthing_scripts/dependencies/__main__.py +5 -0
  226. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  228. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  229. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  231. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/dependencies/analyze.py +155 -0
  233. package/pennyfarthing_scripts/dependencies/cli.py +72 -0
  234. package/pennyfarthing_scripts/dependencies/formatters.py +63 -0
  235. package/pennyfarthing_scripts/dependencies/models.py +39 -0
  236. package/pennyfarthing_scripts/healthscore/__init__.py +21 -0
  237. package/pennyfarthing_scripts/healthscore/__main__.py +6 -0
  238. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  239. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  240. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  241. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  242. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  243. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  244. package/pennyfarthing_scripts/healthscore/analyze.py +161 -0
  245. package/pennyfarthing_scripts/healthscore/cli.py +76 -0
  246. package/pennyfarthing_scripts/healthscore/formatters.py +46 -0
  247. package/pennyfarthing_scripts/healthscore/models.py +44 -0
  248. package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  249. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/hotspots/analyze.py +27 -0
  256. package/pennyfarthing_scripts/hotspots/cli.py +10 -8
  257. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  259. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  260. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  261. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  262. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  263. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  264. package/pennyfarthing_scripts/jira/bidirectional.py +42 -15
  265. package/pennyfarthing_scripts/jira/cli.py +4 -1
  266. package/pennyfarthing_scripts/jira/client.py +28 -0
  267. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  268. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  269. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  270. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  271. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  272. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  273. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  274. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  277. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  278. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  282. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  283. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  284. package/pennyfarthing_scripts/sprint/archive_epic.py +198 -94
  285. package/pennyfarthing_scripts/sprint/cli.py +29 -19
  286. package/pennyfarthing_scripts/sprint/story_add.py +202 -27
  287. package/pennyfarthing_scripts/sprint/story_finish.py +211 -0
  288. package/pennyfarthing_scripts/sprint/work.py +27 -3
  289. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  290. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  291. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  292. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  293. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  294. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  295. package/pennyfarthing_scripts/tests/test_codemarkers.py +682 -0
  296. package/pennyfarthing_scripts/tests/test_healthscore.py +524 -0
  297. package/pennyfarthing_scripts/theme/__init__.py +5 -0
  298. package/pennyfarthing_scripts/theme/__main__.py +6 -0
  299. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/theme/cli.py +286 -0
  302. package/scripts/README.md +53 -0
  303. package/pennyfarthing-dist/agents/workflow-status-check.md +0 -96
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ # Auto-load /sm agent on new session start
3
+ # Injects additionalContext telling Claude to invoke the SM agent
4
+
5
+ set -euo pipefail
6
+
7
+ cat <<'EOF'
8
+ {
9
+ "hookSpecificOutput": {
10
+ "hookEventName": "SessionStart",
11
+ "additionalContext": "IMPORTANT: Auto-invoke the /sm agent immediately. Run the Skill tool with skill: \"sm\" as your first action. Do not greet the user or do anything else first."
12
+ }
13
+ }
14
+ EOF
@@ -51,6 +51,15 @@
51
51
  "command": "\"$CLAUDE_PROJECT_DIR\"/.pennyfarthing/project/hooks/setup-env.sh"
52
52
  }
53
53
  ]
54
+ },
55
+ {
56
+ "matcher": "startup",
57
+ "hooks": [
58
+ {
59
+ "type": "command",
60
+ "command": "\"$CLAUDE_PROJECT_DIR\"/.pennyfarthing/project/hooks/auto-load-sm.sh"
61
+ }
62
+ ]
54
63
  }
55
64
  ],
56
65
  "Stop": [
@@ -0,0 +1,399 @@
1
+ # 2-Party TDD Workflow - Story Refinement + Test-Driven Development
2
+ #
3
+ # Adds a story refinement gate before standard TDD. SM runs two focused
4
+ # brainstorm parties to surface gaps before TEA and Dev receive the story.
5
+ #
6
+ # Flow: SM → SM(party:dev) → SM(party:tea) → SM(quality) → TEA → Dev → QA → Reviewer → SM
7
+ #
8
+ # Review rejection loop:
9
+ # If Reviewer finds issues and tests passed → tests are incomplete.
10
+ # Reviewer writes findings to story → TEA writes failing tests → Dev fixes → QA verifies → Reviewer again.
11
+ # If Reviewer finds only lint/format issues → Dev fixes → QA verifies → Reviewer again.
12
+ # QA verification ensures Reviewer only sees verified-clean code.
13
+ #
14
+ # PR policy:
15
+ # Dev pushes the branch but does NOT create a PR.
16
+ # SM prepares PR content, user approves before submission.
17
+ # Default pr_mode: draft. User can set to "ready" in pennyfarthing config.
18
+ #
19
+ # Post-PR lifecycle:
20
+ # External reviews (AI bots, humans) are triaged via party-mode evaluation.
21
+ # Default stance: we do NOT adopt suggestions unless the team agrees.
22
+ # All reply comments are drafted locally and approved by user before posting.
23
+ # Communication with maintainers is irreversible — protect relationships.
24
+ # PR is monitored through merge/close, story status updated throughout.
25
+ #
26
+ # The "2 party" name refers to the two stakeholder perspectives consulted:
27
+ # Party 1: What does Dev need to succeed?
28
+ # Party 2: What does TEA need to succeed?
29
+
30
+ workflow:
31
+ name: 2party-tdd
32
+ description: Story refinement via two stakeholder parties, then TDD
33
+ version: "2.0.0"
34
+
35
+ phases:
36
+ - name: setup
37
+ agent: sm
38
+ output: [session_file, branches, story_context]
39
+
40
+ - name: refine-dev
41
+ agent: sm
42
+ input: [session_file, story_context]
43
+ output: [dev_gaps, refined_story]
44
+ instructions: |
45
+ Run a party-mode brainstorm with the prompt:
46
+
47
+ "What is missing from this story for Dev to be successful?"
48
+
49
+ Perspectives to include: Dev, Architect, Reviewer.
50
+ Focus areas: implementation clarity, acceptance criteria gaps,
51
+ ambiguous requirements, missing technical context, dependency risks.
52
+
53
+ Present findings to user. User decides what to add/change.
54
+ Update the story description with agreed refinements.
55
+ gate:
56
+ type: approval
57
+ condition: User reviewed dev-perspective gaps and decided on each item
58
+
59
+ - name: refine-tea
60
+ agent: sm
61
+ input: [session_file, refined_story]
62
+ output: [tea_gaps, refined_story]
63
+ instructions: |
64
+ Run a party-mode brainstorm with the prompt:
65
+
66
+ "What is missing from this story for TEA to be successful?"
67
+
68
+ Perspectives to include: TEA, Dev, Reviewer.
69
+ Focus areas: testability, acceptance criteria specificity,
70
+ edge cases, test data needs, integration test boundaries,
71
+ what "done" looks like in test terms.
72
+
73
+ Present findings to user. User decides what to add/change.
74
+ Update the story description with agreed refinements.
75
+ gate:
76
+ type: approval
77
+ condition: User reviewed tea-perspective gaps and decided on each item
78
+
79
+ - name: quality-pass
80
+ agent: sm
81
+ input: [refined_story, dev_gaps, tea_gaps]
82
+ output: [final_story]
83
+ instructions: |
84
+ Final quality check on the refined story before handoff to TEA.
85
+
86
+ Verify:
87
+ - Acceptance criteria are specific and testable
88
+ - No ambiguous language remains ("should", "maybe", "as needed")
89
+ - Implementation approach is clear enough for Dev
90
+ - Test strategy is clear enough for TEA
91
+ - Dependencies and blockers are documented
92
+ - Story scope hasn't crept beyond original intent
93
+
94
+ Fix any remaining issues, then hand off to TEA.
95
+ gate:
96
+ type: approval
97
+ condition: Story passes quality check and is ready for TEA
98
+
99
+ - name: red
100
+ agent: tea
101
+ input: [final_story, session_file]
102
+ output: [failing_tests]
103
+ instructions: |
104
+ Write failing tests for all acceptance criteria.
105
+
106
+ In addition to functional tests, include a quality gate check
107
+ that verifies new files pass the project's lint and format rules.
108
+ This catches code generation issues (wrong API usage, style
109
+ violations) at the test level rather than leaving them for review.
110
+
111
+ Examples by ecosystem:
112
+ - Node: spawn eslint and prettier --check on new files
113
+ - Go: spawn go vet and golangci-lint on new packages
114
+ - Python: spawn ruff check and ruff format --check
115
+ - Rust: spawn cargo clippy and cargo fmt --check
116
+ - Generic: check if the project has a top-level quality command
117
+ and spawn it (npm test, make lint, just check, etc.)
118
+
119
+ Include this as the last test function, e.g. testCodeQuality().
120
+ This ensures Dev can't commit GREEN without passing all gates.
121
+
122
+ In the TEA Assessment handoff, list what quality gates Dev
123
+ should expect to pass beyond the functional tests.
124
+ gate:
125
+ type: tests_fail
126
+ condition: All acceptance criteria have test coverage, including quality gate check
127
+
128
+ - name: green
129
+ agent: dev
130
+ input: [failing_tests, final_story]
131
+ output: [implementation, passing_tests]
132
+ instructions: |
133
+ Make tests GREEN. Implement minimal code to pass all failing tests.
134
+ Commit implementation. Push branch.
135
+ Hand off to QA/TEA for verification before review.
136
+
137
+ DO NOT create a PR — that happens in finish phase.
138
+
139
+ # QA verifies GREEN before Reviewer sees it
140
+ - name: verify
141
+ agent: tea
142
+ input: [implementation, passing_tests]
143
+ output: [verification_report]
144
+ instructions: |
145
+ QA verification of Dev's GREEN implementation.
146
+
147
+ Run the project's full quality gate — not just the new tests,
148
+ but everything CI would check: lint, format, type checks,
149
+ schema validation, and any other project-defined checks.
150
+ Use `/check` or `/run-ci` to discover and run all gates.
151
+
152
+ If verification fails, hand back to Dev with specifics.
153
+ If verification passes, hand off to Reviewer.
154
+
155
+ Reviewer should only receive code that is verified clean.
156
+ gate:
157
+ type: quality_pass
158
+ condition: >
159
+ All project quality gates pass locally — tests, lint, format,
160
+ type checks, and any CI-equivalent checks. Dev's implementation
161
+ is verified clean before Reviewer spends time on it.
162
+
163
+ - name: review
164
+ agent: reviewer
165
+ input: [verification_report, implementation, passing_tests]
166
+ output: [review_findings]
167
+ instructions: |
168
+ Adversarial code review. Write ALL findings to the story in
169
+ sprint/current-sprint.yaml under review_findings field.
170
+
171
+ On REJECT:
172
+ - Write findings with severity to story (review_findings field)
173
+ - Set review_verdict: rejected in story
174
+ - If findings are testable (logic bugs, missing edge cases):
175
+ Set workflow_phase to review-fix-tea → TEA writes failing tests first
176
+ - If findings are lint/format/dead-code only:
177
+ Set workflow_phase to review-fix-dev → Dev fixes directly
178
+ - DO NOT merge or create PRs
179
+
180
+ On APPROVE:
181
+ - Set review_verdict: approved in story
182
+ - DO NOT merge the PR — hand off to SM for finish phase
183
+ gate:
184
+ type: approval
185
+ condition: Code review passed, no blocking issues
186
+
187
+ # Review rejection loops — TEA writes tests for what Reviewer caught
188
+ - name: review-fix-tea
189
+ agent: tea
190
+ input: [review_findings, failing_tests]
191
+ output: [additional_failing_tests]
192
+ instructions: |
193
+ Reviewer found issues that tests missed. Read review_findings
194
+ from the story. Write failing tests for each testable finding.
195
+ Commit RED tests. Hand off to Dev.
196
+ gate:
197
+ type: tests_fail
198
+ condition: New tests cover reviewer findings
199
+
200
+ # Review rejection loop — Dev fixes all issues
201
+ - name: review-fix-dev
202
+ agent: dev
203
+ input: [review_findings, implementation]
204
+ output: [fixed_implementation]
205
+ instructions: |
206
+ Read review_findings from the story. Fix ALL findings:
207
+ - HIGH: Must fix (lint, format, dead code, logic)
208
+ - MEDIUM: Should fix
209
+ - LOW: Fix if trivial
210
+
211
+ Commit fixes. Push branch. Hand off to QA/TEA for verification.
212
+ Do NOT self-certify — someone else verifies your fix.
213
+
214
+ # QA verifies Dev's fixes before sending back to Reviewer
215
+ - name: review-fix-verify
216
+ agent: tea
217
+ input: [fixed_implementation, review_findings]
218
+ output: [verification_report]
219
+ instructions: |
220
+ QA verification step. Dev claims the fixes are done — verify it.
221
+
222
+ Run the project's full quality gate:
223
+ - Use `/check` or `/run-ci` to discover and run all gates
224
+ - Tests, lint, format, type checks, schema validation
225
+ - Confirm each review finding is actually addressed
226
+
227
+ If verification fails, hand back to Dev with specifics.
228
+ If verification passes, hand off to Reviewer for re-review.
229
+ gate:
230
+ type: quality_pass
231
+ condition: >
232
+ All project quality gates pass. Each review finding verified
233
+ as addressed. Code is clean enough for Reviewer's time.
234
+ next: review
235
+
236
+ # --- Post-implementation: PR lifecycle ---
237
+
238
+ - name: pr-prepare
239
+ agent: sm
240
+ input: [approval]
241
+ output: [pr_draft]
242
+ instructions: |
243
+ Prepare the PR for submission. This is our "one shot" with
244
+ the upstream maintainer — get it right before anyone sees it.
245
+
246
+ Steps:
247
+ 1. Draft PR title and description locally (do not post yet)
248
+ 2. Review the diff for:
249
+ - Unsigned commits
250
+ - Extra files that shouldn't be included
251
+ - Sensitive data leaks (.env, credentials, local paths)
252
+ - Missing sections in the PR description
253
+ 3. Run CI-equivalent checks locally one final time
254
+ 4. Present PR description and diff summary to user for approval
255
+ 5. Only after user approves: create PR (draft by default,
256
+ or per user pr_mode preference in pennyfarthing config)
257
+ gate:
258
+ type: approval
259
+ condition: User has reviewed and approved PR content before submission
260
+
261
+ # External review triage — AI reviewers and humans will comment
262
+ - name: pr-review-triage
263
+ agent: sm
264
+ input: [pr_draft]
265
+ output: [external_review_analysis]
266
+ instructions: |
267
+ Monitor the PR for external reviews (AI bots like CodeRabbit,
268
+ human reviewers, maintainer feedback). When reviews arrive:
269
+
270
+ CRITICAL PRINCIPLES:
271
+ - External reviewers lack our context: ADRs, story intent,
272
+ architectural decisions, and why we chose this approach.
273
+ - Default stance: we do NOT adopt a suggestion unless the
274
+ team agrees it fits. Silence is not consent — we must
275
+ actively agree to adopt each suggestion.
276
+ - Communication between humans cannot be undone. Damage to
277
+ relationships with maintainers is permanent. Every reply
278
+ is drafted locally and approved by the user before posting.
279
+
280
+ For each review comment or suggestion:
281
+ 1. Categorize: bug fix, style preference, architectural
282
+ concern, nitpick, misunderstanding, valid improvement
283
+ 2. Gather context the reviewer is missing (ADRs, story
284
+ decisions, prior art in the codebase)
285
+ 3. Present to user with initial assessment
286
+
287
+ When comments are gathered, hand off to pr-review-party
288
+ for structured evaluation.
289
+
290
+ - name: pr-review-party
291
+ agent: sm
292
+ input: [external_review_analysis]
293
+ output: [review_decisions]
294
+ instructions: |
295
+ Run a party-mode evaluation of external review comments.
296
+
297
+ Prompt (tune as needed):
298
+ "Evaluate each external review suggestion against:
299
+ 1. The intent and scope of this PR
300
+ 2. Fit with project architecture and ADRs
301
+ 3. Viability — does the proposed fix actually work?
302
+ 4. Negative impact — could this fix break something else?
303
+ 5. Precedent — does this conflict with established patterns?
304
+ 6. Effort vs value — is this worth doing now?"
305
+
306
+ Perspectives: Dev, Architect, Reviewer, PM.
307
+
308
+ For each suggestion, produce one of:
309
+ - ADOPT: Team agrees. Will fix, test, and reply with thanks.
310
+ - DECLINE: Doesn't fit. Draft a respectful reply explaining
311
+ why, with context the reviewer was missing.
312
+ - DEFER: Valid but out of scope. Draft reply acknowledging
313
+ the point and noting it for a future PR/issue.
314
+ - CLARIFY: Need more info from the reviewer. Draft a question.
315
+
316
+ Present decisions to user. User has final say on every item.
317
+ gate:
318
+ type: approval
319
+ condition: User has decided on every external review comment
320
+
321
+ - name: pr-review-respond
322
+ agent: dev
323
+ input: [review_decisions]
324
+ output: [fixes, draft_replies]
325
+ instructions: |
326
+ For each ADOPT decision:
327
+ 1. Implement the fix
328
+ 2. Write or update tests if needed
329
+ 3. Run full quality gate
330
+ 4. Draft a reply comment (e.g., "Good catch, fixed in abc123")
331
+
332
+ For each DECLINE/DEFER/CLARIFY decision:
333
+ 1. Draft a reply comment explaining the team's position
334
+ 2. Include context the reviewer was missing
335
+ 3. Be respectful — this is a relationship, not a debate
336
+
337
+ CRITICAL: Do NOT post any comments. All replies are drafted
338
+ locally and presented to the user for approval. The user may
339
+ edit wording, tone, or content before any reply is posted.
340
+
341
+ Commit fixes. Push branch. Present all draft replies to user.
342
+ gate:
343
+ type: approval
344
+ condition: >
345
+ User has approved every draft reply. Fixes pass quality
346
+ gates. No reply is posted without explicit user approval.
347
+
348
+ - name: pr-replies-post
349
+ agent: sm
350
+ input: [draft_replies]
351
+ output: [posted_replies]
352
+ instructions: |
353
+ Post user-approved replies to the PR. For each reply:
354
+ 1. Confirm user approval one final time
355
+ 2. Post the comment via gh CLI
356
+ 3. Log the posted reply for audit
357
+
358
+ After all replies posted, return to pr-review-triage to
359
+ monitor for follow-up comments. This loop continues until
360
+ the PR is merged, closed, or the user decides to stop.
361
+ next: pr-monitor
362
+
363
+ - name: pr-monitor
364
+ agent: sm
365
+ input: [posted_replies]
366
+ output: [pr_status]
367
+ instructions: |
368
+ Monitor the PR status. Check for:
369
+ - New review comments → back to pr-review-triage
370
+ - CI failures → hand to Dev for fixes
371
+ - Approval from maintainer → update story status
372
+ - Merge → move to pr-complete
373
+ - Close (rejected) → move to pr-complete with rejected status
374
+
375
+ Update the story workflow_phase as status changes.
376
+ If new comments arrive, loop back to pr-review-triage.
377
+ next_on:
378
+ new_comments: pr-review-triage
379
+ ci_failure: review-fix-dev
380
+ merged: pr-complete
381
+ closed: pr-complete
382
+
383
+ - name: pr-complete
384
+ agent: sm
385
+ input: [pr_status]
386
+ output: [archived_session, story_summary]
387
+ instructions: |
388
+ PR is merged or closed. Finalize the story:
389
+ 1. Update story status (done if merged, blocked/cancelled if closed)
390
+ 2. Update Jira ticket
391
+ 3. Archive session file
392
+ 4. Clean up branches if merged
393
+ 5. Write story summary for sprint record
394
+
395
+ triggers:
396
+ types: [feature, enhancement]
397
+ tags: [2party, refinement, complex]
398
+ points:
399
+ min: 3
@@ -10,9 +10,6 @@ thisStepFile: './step-05-import-to-future.md'
10
10
  workflowFile: '{workflow_path}/workflow.yaml'
11
11
  outputFile: '{planning_artifacts}/epics.md'
12
12
  futureYaml: '{project_root}/sprint/future.yaml'
13
-
14
- # Script References
15
- importScript: '{project_root}/.pennyfarthing/scripts/sprint/import-epic-to-future.sh'
16
13
  ---
17
14
 
18
15
  <purpose>
@@ -21,12 +18,13 @@ To import the validated and complete epics and stories from the epics.md documen
21
18
 
22
19
  <instructions>
23
20
  1. Determine the initiative name from the epics document (prompt user if not obvious)
24
- 2. Run the import script in dry-run mode to show what will be added
25
- 3. Display the preview to the user showing epic numbers, initiative structure, and story IDs
26
- 4. Get user confirmation that the preview looks correct
27
- 5. If confirmed, run the import script without dry-run to apply changes to future.yaml
28
- 6. Verify the import by checking that epic appears in future.yaml with correct numbering
29
- 7. Display completion message with epic number, initiative name, and story count
21
+ 2. Read current future.yaml to find the next epic number (highest epic-N + 1)
22
+ 3. Read the validated epics.md output and construct the YAML structure
23
+ 4. Display a preview to the user showing epic numbers, initiative structure, and story IDs
24
+ 5. Get user confirmation that the preview looks correct
25
+ 6. If confirmed, append the new initiative and epics to future.yaml using yq
26
+ 7. Verify the import by checking that epic appears in future.yaml with correct numbering
27
+ 8. Display completion message with epic number, initiative name, and story count
30
28
  </instructions>
31
29
 
32
30
  <output>
@@ -72,34 +70,53 @@ Look at the epics document title and ask user:
72
70
 
73
71
  Wait for user confirmation or alternative name.
74
72
 
75
- ### 2. Preview Import (Dry Run)
73
+ ### 2. Determine Next Epic Number
76
74
 
77
- Run the import script with `--dry-run` to show what will be added:
75
+ Read `sprint/future.yaml` and find the highest `epic-N` ID currently in use:
78
76
 
79
77
  ```bash
80
- .pennyfarthing/scripts/sprint/import-epic-to-future.sh {outputFile} "{initiative_name}" --dry-run
78
+ yq '.future.initiatives[].epics[].id' sprint/future.yaml | grep -oE 'epic-[0-9]+' | sed 's/epic-//' | sort -n | tail -1
79
+ ```
80
+
81
+ The next epic gets `epic-{N+1}`. Stories use `{N+1}-{story_number}` format.
82
+
83
+ ### 3. Construct and Preview
84
+
85
+ Read the validated epics.md output file. For each epic, construct the YAML structure:
86
+
87
+ ```yaml
88
+ - id: epic-{N}
89
+ title: "Epic: {epic_title}"
90
+ points: {total_points}
91
+ priority: {priority}
92
+ repos: {repo}
93
+ stories:
94
+ - id: "{N}-1"
95
+ title: "{story_title}"
96
+ points: {points}
97
+ type: {type}
98
+ status: backlog
99
+ workflow: {workflow}
100
+ priority: {priority}
101
+ repos: {repo}
81
102
  ```
82
103
 
83
- Display the preview output to the user showing:
104
+ Display the full preview to the user showing:
84
105
  - Next epic number that will be assigned
85
106
  - Initiative structure
86
107
  - All stories with IDs
87
108
 
88
- ### 3. Confirm and Apply
109
+ ### 4. Confirm and Apply
89
110
 
90
111
  Ask user: "Does this look correct? [Y] Yes, import to future.yaml / [N] No, make changes"
91
112
 
92
113
  **If Y:**
93
- Run the import without `--dry-run`:
94
-
95
- ```bash
96
- .pennyfarthing/scripts/sprint/import-epic-to-future.sh {outputFile} "{initiative_name}"
97
- ```
114
+ Append the new initiative and epics to `sprint/future.yaml` using yq or direct YAML editing.
98
115
 
99
116
  **If N:**
100
- Ask what changes are needed and help user adjust before re-running.
117
+ Ask what changes are needed and help user adjust before re-applying.
101
118
 
102
- ### 4. Verify Import
119
+ ### 5. Verify Import
103
120
 
104
121
  After successful import, verify by showing:
105
122
 
@@ -112,7 +129,7 @@ Confirm:
112
129
  - Epic number is correct
113
130
  - Stories have proper IDs
114
131
 
115
- ### 5. Complete Workflow
132
+ ### 6. Complete Workflow
116
133
 
117
134
  Display completion message:
118
135
 
@@ -138,8 +155,8 @@ Next steps:
138
155
 
139
156
  ## FAILURE MODES:
140
157
 
141
- - ❌ Import script not found - check .pennyfarthing symlinks
142
158
  - ❌ future.yaml not found - ensure sprint/ directory exists
143
- - ❌ Duplicate epic number - script should handle this automatically
159
+ - ❌ Duplicate epic number - check existing IDs before assigning
160
+ - ❌ yq not installed - required for YAML manipulation (`brew install yq`)
144
161
 
145
162
  **Master Rule:** The workflow is not complete until epics are in future.yaml and accessible via sprint commands.
@@ -45,6 +45,21 @@ from pennyfarthing_scripts.jira.cli import jira
45
45
 
46
46
  cli.add_command(jira)
47
47
 
48
+ # Import and register deadcode group
49
+ from pennyfarthing_scripts.deadcode.cli import deadcode
50
+
51
+ cli.add_command(deadcode)
52
+
53
+ # Import and register theme group
54
+ from pennyfarthing_scripts.theme.cli import theme
55
+
56
+ cli.add_command(theme)
57
+
58
+ # Import and register healthscore group
59
+ from pennyfarthing_scripts.healthscore.cli import healthscore
60
+
61
+ cli.add_command(healthscore)
62
+
48
63
 
49
64
  @cli.group()
50
65
  def agent():
@@ -0,0 +1,19 @@
1
+ """
2
+ Code marker analysis — TODO, FIXME, HACK, XXX detection with git blame.
3
+
4
+ Story 80-1: Python codemarkers module.
5
+ """
6
+
7
+ from pennyfarthing_scripts.codemarkers.models import (
8
+ CodeMarker,
9
+ CodeMarkersResult,
10
+ MarkerSummary,
11
+ )
12
+ from pennyfarthing_scripts.codemarkers.analyze import analyze_repo
13
+
14
+ __all__ = [
15
+ "CodeMarker",
16
+ "CodeMarkersResult",
17
+ "MarkerSummary",
18
+ "analyze_repo",
19
+ ]
@@ -0,0 +1,6 @@
1
+ """Allow running as: python -m pennyfarthing_scripts.codemarkers"""
2
+
3
+ from pennyfarthing_scripts.codemarkers.cli import codemarkers
4
+
5
+ if __name__ == "__main__":
6
+ codemarkers()