@pennyfarthing/core 10.0.3 → 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 (282) hide show
  1. package/README.md +9 -7
  2. package/package.json +7 -1
  3. package/packages/core/dist/cli/commands/cyclist.d.ts +5 -1
  4. package/packages/core/dist/cli/commands/cyclist.d.ts.map +1 -1
  5. package/packages/core/dist/cli/commands/cyclist.js +4 -4
  6. package/packages/core/dist/cli/commands/cyclist.js.map +1 -1
  7. package/packages/core/dist/cli/commands/cyclist.test.js +2 -2
  8. package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -1
  9. package/packages/core/dist/cli/commands/doctor-legacy.test.js +17 -16
  10. package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -1
  11. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  12. package/packages/core/dist/cli/commands/doctor.js +251 -4
  13. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  14. package/packages/core/dist/cli/commands/init.d.ts +7 -0
  15. package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
  16. package/packages/core/dist/cli/commands/init.js +43 -7
  17. package/packages/core/dist/cli/commands/init.js.map +1 -1
  18. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  19. package/packages/core/dist/cli/commands/update.js +26 -0
  20. package/packages/core/dist/cli/commands/update.js.map +1 -1
  21. package/packages/core/dist/cli/index.js +1 -1
  22. package/packages/core/dist/cli/index.js.map +1 -1
  23. package/packages/core/dist/cli/ocean-profiles.test.js +1 -1
  24. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -1
  25. package/packages/core/dist/cli/utils/files.d.ts +10 -0
  26. package/packages/core/dist/cli/utils/files.d.ts.map +1 -1
  27. package/packages/core/dist/cli/utils/files.js +35 -0
  28. package/packages/core/dist/cli/utils/files.js.map +1 -1
  29. package/packages/core/dist/cli/utils/python.d.ts +22 -0
  30. package/packages/core/dist/cli/utils/python.d.ts.map +1 -0
  31. package/packages/core/dist/cli/utils/python.js +102 -0
  32. package/packages/core/dist/cli/utils/python.js.map +1 -0
  33. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  34. package/packages/core/dist/cli/utils/settings.js +10 -0
  35. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  36. package/packages/core/dist/scripts/generate-report.d.ts.map +1 -1
  37. package/packages/core/dist/scripts/generate-report.js +11 -7
  38. package/packages/core/dist/scripts/generate-report.js.map +1 -1
  39. package/packages/core/dist/scripts/generate-spider-report.d.ts.map +1 -1
  40. package/packages/core/dist/scripts/generate-spider-report.js +12 -8
  41. package/packages/core/dist/scripts/generate-spider-report.js.map +1 -1
  42. package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -1
  43. package/packages/core/dist/scripts/generate-spider.js +6 -4
  44. package/packages/core/dist/scripts/generate-spider.js.map +1 -1
  45. package/packages/core/dist/scripts/generate-spider.test.js +2 -2
  46. package/packages/core/dist/scripts/generate-spider.test.js.map +1 -1
  47. package/pennyfarthing-dist/agents/README.md +1 -3
  48. package/pennyfarthing-dist/agents/architect.md +0 -6
  49. package/pennyfarthing-dist/agents/devops.md +0 -6
  50. package/pennyfarthing-dist/agents/orchestrator.md +0 -6
  51. package/pennyfarthing-dist/agents/pm.md +1 -7
  52. package/pennyfarthing-dist/agents/sm-finish.md +1 -1
  53. package/pennyfarthing-dist/agents/sm-setup.md +2 -2
  54. package/pennyfarthing-dist/agents/sm.md +4 -11
  55. package/pennyfarthing-dist/commands/architect.md +11 -3
  56. package/pennyfarthing-dist/commands/close-epic.md +24 -131
  57. package/pennyfarthing-dist/commands/create-theme.md +14 -24
  58. package/pennyfarthing-dist/commands/dev.md +11 -3
  59. package/pennyfarthing-dist/commands/devops.md +11 -3
  60. package/pennyfarthing-dist/commands/health-check.md +1 -3
  61. package/pennyfarthing-dist/commands/help.md +8 -12
  62. package/pennyfarthing-dist/commands/list-themes.md +14 -16
  63. package/pennyfarthing-dist/commands/orchestrator.md +11 -3
  64. package/pennyfarthing-dist/commands/parallel-work.md +1 -3
  65. package/pennyfarthing-dist/commands/pm.md +11 -3
  66. package/pennyfarthing-dist/commands/prime.md +6 -6
  67. package/pennyfarthing-dist/commands/repo-status.md +2 -2
  68. package/pennyfarthing-dist/commands/reviewer.md +11 -3
  69. package/pennyfarthing-dist/commands/run-ci.md +1 -1
  70. package/pennyfarthing-dist/commands/set-theme.md +14 -51
  71. package/pennyfarthing-dist/commands/setup.md +1 -1
  72. package/pennyfarthing-dist/commands/show-theme.md +14 -16
  73. package/pennyfarthing-dist/commands/sm.md +11 -3
  74. package/pennyfarthing-dist/commands/sprint.md +8 -8
  75. package/pennyfarthing-dist/commands/tea.md +11 -3
  76. package/pennyfarthing-dist/commands/tech-writer.md +11 -3
  77. package/pennyfarthing-dist/commands/theme-maker.md +14 -671
  78. package/pennyfarthing-dist/commands/theme.md +95 -0
  79. package/pennyfarthing-dist/commands/ux-designer.md +11 -3
  80. package/pennyfarthing-dist/commands/work.md +3 -5
  81. package/pennyfarthing-dist/guides/agent-coordination.md +11 -13
  82. package/pennyfarthing-dist/guides/agent-template-tactical.md +2 -3
  83. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +212 -0
  84. package/pennyfarthing-dist/guides/hooks.md +5 -5
  85. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +3 -3
  86. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +9 -59
  87. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -5
  88. package/pennyfarthing-dist/guides/prime.md +2 -2
  89. package/pennyfarthing-dist/guides/skill-schema.md +25 -26
  90. package/pennyfarthing-dist/guides/xml-tags.md +2 -2
  91. package/pennyfarthing-dist/scripts/README.md +2 -2
  92. package/pennyfarthing-dist/scripts/core/agent-session.sh +6 -2
  93. package/pennyfarthing-dist/scripts/core/prime.sh +8 -10
  94. package/pennyfarthing-dist/scripts/git/git-status-all.sh +1 -1
  95. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +8 -6
  96. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +3 -3
  97. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +14 -12
  98. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +4 -3
  99. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +11 -5
  100. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +1 -1
  101. package/pennyfarthing-dist/scripts/misc/README.md +1 -1
  102. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +3 -3
  103. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +1 -2
  104. package/pennyfarthing-dist/scripts/sprint/README.md +32 -17
  105. package/pennyfarthing-dist/scripts/story/README.md +1 -1
  106. package/pennyfarthing-dist/scripts/test/test-setup.sh +1 -1
  107. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +5 -5
  108. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +3 -79
  109. package/pennyfarthing-dist/scripts/theme/README.md +1 -1
  110. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -1
  111. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +62 -17
  112. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +2 -2
  113. package/pennyfarthing-dist/skills/skill-registry.yaml +41 -28
  114. package/pennyfarthing-dist/skills/sprint/skill.md +386 -68
  115. package/pennyfarthing-dist/skills/story/skill.md +14 -206
  116. package/pennyfarthing-dist/skills/theme/skill.md +290 -75
  117. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +23 -166
  118. package/pennyfarthing-dist/skills/workflow/skill.md +4 -4
  119. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -11
  120. package/pennyfarthing-dist/templates/auto-load-sm.sh.template +14 -0
  121. package/pennyfarthing-dist/templates/settings.local.json.template +9 -0
  122. package/pennyfarthing-dist/workflows/2party-tdd.yaml +399 -0
  123. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +42 -25
  124. package/pennyfarthing-dist/workflows/git-cleanup.yaml +1 -1
  125. package/pennyfarthing-dist/workflows/project-setup/steps/step-10-complete.md +1 -1
  126. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  127. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  128. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  129. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  130. package/pennyfarthing_scripts/cli.py +15 -0
  131. package/pennyfarthing_scripts/codemarkers/__init__.py +19 -0
  132. package/pennyfarthing_scripts/codemarkers/__main__.py +6 -0
  133. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  134. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  135. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  136. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  137. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  138. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  139. package/pennyfarthing_scripts/codemarkers/analyze.py +326 -0
  140. package/pennyfarthing_scripts/codemarkers/cli.py +129 -0
  141. package/pennyfarthing_scripts/codemarkers/formatters.py +89 -0
  142. package/pennyfarthing_scripts/codemarkers/models.py +45 -0
  143. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  144. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  145. package/pennyfarthing_scripts/common/config.py +2 -1
  146. package/pennyfarthing_scripts/complexity/__init__.py +15 -0
  147. package/pennyfarthing_scripts/complexity/__main__.py +6 -0
  148. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  149. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  150. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  151. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  152. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  153. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  154. package/pennyfarthing_scripts/complexity/analyze.py +207 -0
  155. package/pennyfarthing_scripts/complexity/cli.py +78 -0
  156. package/pennyfarthing_scripts/complexity/formatters.py +64 -0
  157. package/pennyfarthing_scripts/complexity/models.py +32 -0
  158. package/pennyfarthing_scripts/deadcode/__init__.py +6 -0
  159. package/pennyfarthing_scripts/deadcode/__main__.py +6 -0
  160. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  161. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  162. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  163. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  164. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  165. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  166. package/pennyfarthing_scripts/deadcode/analyze.py +323 -0
  167. package/pennyfarthing_scripts/deadcode/cli.py +163 -0
  168. package/pennyfarthing_scripts/deadcode/formatters.py +106 -0
  169. package/pennyfarthing_scripts/deadcode/models.py +54 -0
  170. package/pennyfarthing_scripts/dependencies/__init__.py +20 -0
  171. package/pennyfarthing_scripts/dependencies/__main__.py +5 -0
  172. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  173. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  174. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  175. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  176. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  177. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  178. package/pennyfarthing_scripts/dependencies/analyze.py +155 -0
  179. package/pennyfarthing_scripts/dependencies/cli.py +72 -0
  180. package/pennyfarthing_scripts/dependencies/formatters.py +63 -0
  181. package/pennyfarthing_scripts/dependencies/models.py +39 -0
  182. package/pennyfarthing_scripts/healthscore/__init__.py +21 -0
  183. package/pennyfarthing_scripts/healthscore/__main__.py +6 -0
  184. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  185. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  186. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  187. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  188. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  189. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  190. package/pennyfarthing_scripts/healthscore/analyze.py +161 -0
  191. package/pennyfarthing_scripts/healthscore/cli.py +76 -0
  192. package/pennyfarthing_scripts/healthscore/formatters.py +46 -0
  193. package/pennyfarthing_scripts/healthscore/models.py +44 -0
  194. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  195. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  196. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  197. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  198. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  200. package/pennyfarthing_scripts/hotspots/analyze.py +28 -1
  201. package/pennyfarthing_scripts/hotspots/cli.py +11 -9
  202. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  203. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  204. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  205. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  206. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  207. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  208. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  209. package/pennyfarthing_scripts/jira/bidirectional.py +42 -15
  210. package/pennyfarthing_scripts/jira/cli.py +78 -1
  211. package/pennyfarthing_scripts/jira/client.py +28 -0
  212. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  213. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  214. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  215. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  216. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  217. package/pennyfarthing_scripts/prime/workflow.py +5 -3
  218. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  219. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  220. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  221. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  222. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  223. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  224. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  225. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  226. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  228. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  229. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/sprint/archive.py +63 -6
  231. package/pennyfarthing_scripts/sprint/archive_epic.py +198 -85
  232. package/pennyfarthing_scripts/sprint/cli.py +1565 -65
  233. package/pennyfarthing_scripts/sprint/epic_add.py +173 -0
  234. package/pennyfarthing_scripts/sprint/loader.py +46 -2
  235. package/pennyfarthing_scripts/sprint/story_add.py +202 -27
  236. package/pennyfarthing_scripts/sprint/story_finish.py +211 -0
  237. package/pennyfarthing_scripts/sprint/validate_cmd.py +44 -5
  238. package/pennyfarthing_scripts/sprint/validator.py +13 -3
  239. package/pennyfarthing_scripts/sprint/work.py +43 -3
  240. package/pennyfarthing_scripts/sprint/yaml_io.py +124 -15
  241. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  242. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  243. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  244. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  245. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  246. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  247. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  248. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  249. package/pennyfarthing_scripts/tests/test_codemarkers.py +682 -0
  250. package/pennyfarthing_scripts/tests/test_healthscore.py +524 -0
  251. package/pennyfarthing_scripts/tests/test_sprint_package.py +166 -0
  252. package/pennyfarthing_scripts/tests/test_yaml_io.py +117 -0
  253. package/pennyfarthing_scripts/theme/__init__.py +5 -0
  254. package/pennyfarthing_scripts/theme/__main__.py +6 -0
  255. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  256. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  257. package/pennyfarthing_scripts/theme/cli.py +286 -0
  258. package/scripts/README.md +53 -0
  259. package/scripts/postinstall.cjs +34 -0
  260. package/pennyfarthing-dist/agents/workflow-status-check.md +0 -96
  261. package/pennyfarthing-dist/scripts/sprint/archive-story.sh +0 -133
  262. package/pennyfarthing-dist/scripts/sprint/available-stories.sh +0 -91
  263. package/pennyfarthing-dist/scripts/sprint/check-story.sh +0 -158
  264. package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +0 -52
  265. package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +0 -63
  266. package/pennyfarthing-dist/scripts/sprint/list-future.sh +0 -145
  267. package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +0 -110
  268. package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +0 -148
  269. package/pennyfarthing-dist/scripts/sprint/sprint-common.sh +0 -415
  270. package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +0 -33
  271. package/pennyfarthing-dist/scripts/sprint/sprint-metrics.sh +0 -230
  272. package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +0 -134
  273. package/pennyfarthing-dist/scripts/sprint/validate-sprint-yaml.sh +0 -139
  274. package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +0 -101
  275. package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +0 -97
  276. package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +0 -164
  277. package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +0 -23
  278. package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +0 -116
  279. package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +0 -164
  280. package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +0 -39
  281. package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +0 -147
  282. package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +0 -23
@@ -1,6 +1,6 @@
1
1
  #!/bin/bash
2
2
  # test-drift-detection.sh - Tests for story 8-2: Startup Drift Detection
3
- # Verifies that workflow-status-check detects and reports drift between
3
+ # Verifies that prime/sprint scripts detect and report drift between
4
4
  # merged branches and sprint YAML status
5
5
  #
6
6
  # RED STATE: These tests will FAIL until Dev implements the feature
@@ -38,7 +38,7 @@ echo "=== Story 8-2: Startup Drift Detection ==="
38
38
  echo ""
39
39
 
40
40
  # ==============================================================================
41
- # AC1: workflow-status-check detects merged-but-not-closed stories
41
+ # AC1: prime detects merged-but-not-closed stories
42
42
  # ==============================================================================
43
43
 
44
44
  echo "--- AC1: Detects merged-but-not-closed stories ---"
@@ -293,28 +293,9 @@ test_drift_output_format() {
293
293
  fi
294
294
  }
295
295
 
296
- # Test: workflow-status-check.md references drift detection
297
- test_workflow_status_check_integration() {
298
- local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
299
-
300
- if [[ ! -f "$workflow_file" ]]; then
301
- fail "workflow-status-check includes drift detection" "file exists" "workflow-status-check.md not found"
302
- return
303
- fi
304
-
305
- if grep -qi "drift\|detect_drift" "$workflow_file" 2>/dev/null; then
306
- pass "workflow-status-check.md references drift detection"
307
- else
308
- fail "workflow-status-check includes drift detection" \
309
- "drift or detect_drift reference in workflow-status-check.md" \
310
- "no drift reference found"
311
- fi
312
- }
313
-
314
296
  # Test: Drift report is user-friendly (mentions "merged" and "status")
315
297
  test_drift_report_clarity() {
316
298
  local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/sprint/sprint-common.sh"
317
- local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
318
299
 
319
300
  local found=false
320
301
 
@@ -323,11 +304,6 @@ test_drift_report_clarity() {
323
304
  found=true
324
305
  fi
325
306
 
326
- # Or check workflow-status-check.md for report format
327
- if [[ -f "$workflow_file" ]] && grep -qi "merged.*status\|drift.*report\|drifted stories" "$workflow_file" 2>/dev/null; then
328
- found=true
329
- fi
330
-
331
307
  if [[ "$found" == "true" ]]; then
332
308
  pass "drift report uses clear terminology (merged, drift, status)"
333
309
  else
@@ -338,7 +314,6 @@ test_drift_report_clarity() {
338
314
  }
339
315
 
340
316
  test_drift_output_format
341
- test_workflow_status_check_integration
342
317
  test_drift_report_clarity
343
318
 
344
319
  echo ""
@@ -353,7 +328,6 @@ echo ""
353
328
  # Test: reconcile_drift function or auto-reconcile logic exists
354
329
  test_reconcile_function_exists() {
355
330
  local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/sprint/sprint-common.sh"
356
- local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
357
331
 
358
332
  local found=false
359
333
 
@@ -362,11 +336,6 @@ test_reconcile_function_exists() {
362
336
  found=true
363
337
  fi
364
338
 
365
- # Or check workflow-status-check.md for reconcile instructions
366
- if [[ -f "$workflow_file" ]] && grep -qi "reconcile\|auto.reconcile\|update.*done" "$workflow_file" 2>/dev/null; then
367
- found=true
368
- fi
369
-
370
339
  if [[ "$found" == "true" ]]; then
371
340
  pass "auto-reconcile functionality exists"
372
341
  else
@@ -402,7 +371,6 @@ test_reconcile_uses_update() {
402
371
  # Test: Auto-reconcile logs to reconciliation.log
403
372
  test_reconcile_logs_event() {
404
373
  local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/sprint/sprint-common.sh"
405
- local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
406
374
 
407
375
  local found=false
408
376
 
@@ -411,11 +379,6 @@ test_reconcile_logs_event() {
411
379
  found=true
412
380
  fi
413
381
 
414
- # Or check workflow-status-check.md for logging instructions
415
- if [[ -f "$workflow_file" ]] && grep -qi "log.*reconcil\|reconciliation.log" "$workflow_file" 2>/dev/null; then
416
- found=true
417
- fi
418
-
419
382
  if [[ "$found" == "true" ]]; then
420
383
  pass "auto-reconcile logs to reconciliation.log"
421
384
  else
@@ -425,25 +388,6 @@ test_reconcile_logs_event() {
425
388
  fi
426
389
  }
427
390
 
428
- # Test: workflow-status-check offers reconcile option to user
429
- test_offers_reconcile_option() {
430
- local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
431
-
432
- if [[ ! -f "$workflow_file" ]]; then
433
- fail "offers reconcile option" "file exists" "workflow-status-check.md not found"
434
- return
435
- fi
436
-
437
- # Check for user prompt or option offering
438
- if grep -qiE "auto.reconcile|offer.*reconcile|reconcile.*option|y/n|yes/no" "$workflow_file" 2>/dev/null; then
439
- pass "workflow-status-check offers reconcile option to user"
440
- else
441
- fail "offers reconcile option" \
442
- "user prompt for auto-reconcile in workflow-status-check.md" \
443
- "reconcile prompt not found"
444
- fi
445
- }
446
-
447
391
  # Test: reconcile_drift transitions Jira to Done
448
392
  test_reconcile_transitions_jira() {
449
393
  local sprint_common="$PROJECT_ROOT/pennyfarthing-dist/scripts/sprint/sprint-common.sh"
@@ -463,30 +407,10 @@ test_reconcile_transitions_jira() {
463
407
  fi
464
408
  }
465
409
 
466
- # Test: workflow-status-check mentions Jira in drift reconciliation
467
- test_workflow_mentions_jira_reconcile() {
468
- local workflow_file="$PROJECT_ROOT/pennyfarthing-dist/agents/workflow-status-check.md"
469
-
470
- if [[ ! -f "$workflow_file" ]]; then
471
- fail "workflow mentions Jira reconcile" "file exists" "workflow-status-check.md not found"
472
- return
473
- fi
474
-
475
- if grep -qiE 'jira.*done|transition.*jira|jira.*status' "$workflow_file" 2>/dev/null; then
476
- pass "workflow-status-check mentions Jira in reconciliation"
477
- else
478
- fail "workflow mentions Jira reconcile" \
479
- "Jira transition reference in workflow-status-check.md" \
480
- "Jira reconcile not found"
481
- fi
482
- }
483
-
484
410
  test_reconcile_function_exists
485
411
  test_reconcile_uses_update
486
412
  test_reconcile_transitions_jira
487
413
  test_reconcile_logs_event
488
- test_offers_reconcile_option
489
- test_workflow_mentions_jira_reconcile
490
414
 
491
415
  echo ""
492
416
 
@@ -580,7 +504,7 @@ if [[ $TESTS_FAILED -gt 0 ]]; then
580
504
  echo " 2. Output format: story_id:yaml_status:jira_status (AC2)"
581
505
  echo " - Clear, user-friendly terminology"
582
506
  echo " - Include both YAML and Jira status"
583
- echo " 3. Add Step 2.5 to workflow-status-check.md (AC1, AC2)"
507
+ echo " 3. Add drift detection to prime/workflow.py (AC1, AC2)"
584
508
  echo " - Call detect_drift after git scan"
585
509
  echo " - Report drifted stories before state determination"
586
510
  echo " 4. Add auto-reconcile option (AC3)"
@@ -18,5 +18,5 @@ Scripts for managing agent persona themes.
18
18
 
19
19
  ## Ownership
20
20
 
21
- - **Primary users:** `/theme` skill, `/set-theme` command
21
+ - **Primary users:** `/theme` skill
22
22
  - **Maintained by:** Core Pennyfarthing team
@@ -52,7 +52,6 @@ SUBAGENTS=(
52
52
  "sm-finish.md"
53
53
  "sm-file-summary.md"
54
54
  "sm-handoff.md"
55
- "workflow-status-check.md"
56
55
  "testing-runner.md"
57
56
  "reviewer-preflight.md"
58
57
  )
@@ -15,7 +15,8 @@
15
15
  # 2. Squash merge PR and delete remote branch
16
16
  # 3. Transition Jira to Done
17
17
  # 4. Update sprint YAML (status: done, completed date)
18
- # 5. Clean up local branch and session file
18
+ # 5. Archive completed epics (if last story in epic was just finished)
19
+ # 6. Clean up local branch and session file
19
20
 
20
21
  set -euo pipefail
21
22
 
@@ -43,31 +44,64 @@ fi
43
44
  # Find project root
44
45
  source "$(dirname "${BASH_SOURCE[0]}")/../lib/find-root.sh"
45
46
 
46
- SESSION_FILE="$PROJECT_ROOT/.session/${STORY_ID}-session.md"
47
47
  SPRINT_FILE="$PROJECT_ROOT/sprint/current-sprint.yaml"
48
48
  ARCHIVE_DIR="$PROJECT_ROOT/sprint/archive"
49
49
 
50
50
  # Ensure archive directory exists
51
51
  mkdir -p "$ARCHIVE_DIR"
52
52
 
53
+ # Resolve session file: prefer Jira key, fall back to numeric story ID
54
+ SESSION_FILE="$PROJECT_ROOT/.session/${STORY_ID}-session.md"
55
+ if [[ ! -f "$SESSION_FILE" ]]; then
56
+ # Look up Jira key from sprint YAML and try that
57
+ _JIRA_LOOKUP=$(pf sprint story field "$STORY_ID" jira 2>/dev/null || echo "")
58
+ if [[ -n "$_JIRA_LOOKUP" && "$_JIRA_LOOKUP" != "null" ]]; then
59
+ ALT_SESSION="$PROJECT_ROOT/.session/${_JIRA_LOOKUP}-session.md"
60
+ if [[ -f "$ALT_SESSION" ]]; then
61
+ SESSION_FILE="$ALT_SESSION"
62
+ fi
63
+ fi
64
+ fi
65
+
66
+ # Also try the reverse: if called with Jira key, try numeric ID
67
+ if [[ ! -f "$SESSION_FILE" ]]; then
68
+ # List session files and look for one containing the story ID
69
+ for f in "$PROJECT_ROOT/.session/"*-session.md; do
70
+ [[ -f "$f" ]] || continue
71
+ if grep -q "$STORY_ID" "$f" 2>/dev/null; then
72
+ SESSION_FILE="$f"
73
+ break
74
+ fi
75
+ done
76
+ fi
77
+
53
78
  # Validate session file exists
54
79
  if [[ ! -f "$SESSION_FILE" ]]; then
55
- echo "Error: Session file not found: $SESSION_FILE"
80
+ echo "Error: Session file not found for story $STORY_ID"
81
+ echo "Looked for: $PROJECT_ROOT/.session/${STORY_ID}-session.md"
82
+ [[ -n "${_JIRA_LOOKUP:-}" ]] && echo "Also tried: $PROJECT_ROOT/.session/${_JIRA_LOOKUP}-session.md"
56
83
  exit 1
57
84
  fi
58
85
 
59
- # Extract metadata from session file (handle both "**Jira:**" and "- **Jira:**" formats)
60
- # Also handle markdown link format: [MSSCI-12721](https://...)
86
+ # Extract metadata from session file
87
+ # Try **Jira:** field first (handle both "**Jira:**" and "- **Jira:**", markdown link format)
61
88
  JIRA_KEY=$(grep -E '\*\*Jira:\*\*' "$SESSION_FILE" | sed 's/.*\*\*Jira:\*\* //' | sed 's/\[//' | sed 's/\].*//' | tr -d ' ' || echo "")
62
- # Extract branch - strip any trailing annotations like "(pushed)"
63
- BRANCH=$(grep -E '\*\*Branch:\*\*' "$SESSION_FILE" | sed 's/.*\*\*Branch:\*\* //' | sed 's/ *(.*//' | tr -d ' ' || echo "")
64
89
 
65
- # Try to get PR number from session file first (format: **PR:** #422 - title)
66
- PR_NUMBER=$(grep -E '\*\*PR:\*\*' "$SESSION_FILE" | sed 's/.*#\([0-9]*\).*/\1/' || echo "")
90
+ # Fallback: extract MSSCI key from **ID:** field (format: "MSSCI-14459 (81-2)" or just "MSSCI-14459")
91
+ if [[ -z "$JIRA_KEY" || "$JIRA_KEY" == "null" ]]; then
92
+ JIRA_KEY=$(grep -E '\*\*ID:\*\*' "$SESSION_FILE" | grep -oE 'MSSCI-[0-9]+' | head -1 || echo "")
93
+ fi
67
94
 
68
- # Fallback: try to get Jira key from sprint YAML if not in session
95
+ # Fallback: if STORY_ID itself is a Jira key, use it directly
69
96
  if [[ -z "$JIRA_KEY" || "$JIRA_KEY" == "null" ]]; then
70
- JIRA_KEY=$(yq ".epics[].stories[] | select(.id == \"$STORY_ID\") | .jira // \"\"" "$SPRINT_FILE" 2>/dev/null | head -1 || echo "")
97
+ if [[ "$STORY_ID" =~ ^MSSCI-[0-9]+$ ]]; then
98
+ JIRA_KEY="$STORY_ID"
99
+ fi
100
+ fi
101
+
102
+ # Fallback: look up Jira key from sprint YAML via pf CLI
103
+ if [[ -z "$JIRA_KEY" || "$JIRA_KEY" == "null" ]]; then
104
+ JIRA_KEY=$(pf sprint story field "$STORY_ID" jira 2>/dev/null || echo "")
71
105
  fi
72
106
 
73
107
  if [[ -z "$JIRA_KEY" || "$JIRA_KEY" == "null" ]]; then
@@ -76,6 +110,12 @@ if [[ -z "$JIRA_KEY" || "$JIRA_KEY" == "null" ]]; then
76
110
  exit 1
77
111
  fi
78
112
 
113
+ # Extract branch - strip any trailing annotations like "(pushed)"
114
+ BRANCH=$(grep -E '\*\*Branch:\*\*' "$SESSION_FILE" | sed 's/.*\*\*Branch:\*\* //' | sed 's/ *(.*//' | tr -d ' ' || echo "")
115
+
116
+ # Try to get PR number from session file first (format: **PR:** #422 - title)
117
+ PR_NUMBER=$(grep -E '\*\*PR:\*\*' "$SESSION_FILE" | sed 's/.*#\([0-9]*\).*/\1/' || echo "")
118
+
79
119
  # Fallback: get PR number from GitHub if not in session file
80
120
  if [[ -z "$PR_NUMBER" ]] && [[ -n "$BRANCH" ]]; then
81
121
  PR_NUMBER=$(gh pr list --head "$BRANCH" --json number --jq '.[0].number' 2>/dev/null || echo "")
@@ -99,8 +139,9 @@ if $DRY_RUN; then
99
139
  fi
100
140
  echo " 3. Transition $JIRA_KEY to Done"
101
141
  echo " 4. Update sprint YAML (status: done, completed: $TODAY)"
102
- echo " 5. Delete local branch: $BRANCH"
103
- echo " 6. Remove session file"
142
+ echo " 5. Archive any completed epics"
143
+ echo " 6. Delete local branch: $BRANCH"
144
+ echo " 7. Remove session file"
104
145
  exit 0
105
146
  fi
106
147
 
@@ -135,8 +176,12 @@ yq eval -i "(.epics[].stories[] | select(.id == \"$STORY_ID\")).completed = \"$T
135
176
  yq eval -i "del((.epics[].stories[] | select(.id == \"$STORY_ID\")).assigned_to)" "$SPRINT_FILE"
136
177
  echo " → status: done, completed: $TODAY"
137
178
 
138
- # Step 5: Clean up git
139
- echo "5. Cleaning up git..."
179
+ # Step 5: Archive completed epics
180
+ echo "5. Archiving completed epics..."
181
+ pf sprint epic archive 2>/dev/null && echo " → Checked for completed epics" || echo " → No epics to archive"
182
+
183
+ # Step 6: Clean up git
184
+ echo "6. Cleaning up git..."
140
185
  git checkout develop 2>/dev/null || git checkout main 2>/dev/null || true
141
186
  git pull origin "$(git branch --show-current)" 2>/dev/null || true
142
187
 
@@ -144,8 +189,8 @@ if [[ -n "$BRANCH" ]]; then
144
189
  git branch -d "$BRANCH" 2>/dev/null || echo " Local branch already deleted"
145
190
  fi
146
191
 
147
- # Step 6: Remove session file
148
- echo "6. Removing session file..."
192
+ # Step 7: Remove session file
193
+ echo "7. Removing session file..."
149
194
  rm "$SESSION_FILE"
150
195
 
151
196
  echo ""
@@ -278,11 +278,11 @@ Design subagents to do multiple related steps in one spawn:
278
278
 
279
279
  ```yaml
280
280
  # INEFFICIENT - 2 subagent spawns
281
- Spawn 1: workflow-status-check
281
+ Spawn 1: sm-setup MODE=research
282
282
  Spawn 2: sm-file-summary
283
283
 
284
284
  # EFFICIENT - 1 compound subagent
285
- Spawn 1: (combined status-check + file-summary subagent)
285
+ Spawn 1: (combined research + file-summary subagent)
286
286
  ```
287
287
 
288
288
  **Good candidates for combining:**
@@ -141,7 +141,7 @@ skills:
141
141
  invocation: /jira assign ISSUE-123
142
142
  anti_patterns:
143
143
  - Don't bypass Jira for sprint tracking
144
- related_skills: [sprint, story]
144
+ related_skills: [sprint]
145
145
  keywords: [atlassian, issues, tickets, backlog]
146
146
 
147
147
  judge:
@@ -251,20 +251,26 @@ skills:
251
251
 
252
252
  sprint:
253
253
  name: sprint
254
- description: Sprint status, backlog, and story management for Pennyfarthing
254
+ description: Sprint status, backlog, story, and epic management for Pennyfarthing
255
255
  category: project-management
256
- tags: [sprint, status, backlog]
257
- version: "1.0.0"
256
+ tags: [sprint, status, backlog, stories, epics]
257
+ version: "2.0.0"
258
258
  prerequisites: []
259
259
  examples:
260
260
  - context: Checking sprint status
261
261
  invocation: /sprint
262
262
  - context: Finding available stories
263
263
  invocation: /sprint backlog
264
+ - context: Adding a story
265
+ invocation: /sprint story add epic-76 "My story" 3
266
+ - context: Sizing guidelines
267
+ invocation: /sprint story size
268
+ - context: Adding an epic
269
+ invocation: /sprint epic add epic-85 "New epic"
264
270
  anti_patterns:
265
271
  - Don't manually edit sprint YAML - use scripts
266
- related_skills: [story, jira]
267
- keywords: [sprint, backlog, velocity, kanban]
272
+ related_skills: [jira]
273
+ keywords: [sprint, backlog, velocity, kanban, stories, epics, sizing, templates]
268
274
  allowed_tools: [Read, Glob, Grep, Bash, Task]
269
275
 
270
276
  systematic-debugging:
@@ -287,18 +293,21 @@ skills:
287
293
 
288
294
  story:
289
295
  name: story
290
- description: Story creation, sizing, and templates for Pennyfarthing workflow
296
+ description: "DEPRECATED: Use /sprint story instead. Story commands consolidated under /sprint."
291
297
  category: project-management
292
- tags: [stories, sizing, workflow]
293
- version: "1.0.0"
298
+ tags: [stories, sizing, workflow, deprecated]
299
+ version: "2.0.0"
300
+ deprecated: true
301
+ redirect: sprint
294
302
  prerequisites: []
295
303
  examples:
296
304
  - context: Creating new stories
297
- invocation: /story create
305
+ invocation: /sprint story add
298
306
  - context: Sizing stories
299
- invocation: /story size
307
+ invocation: /sprint story size
300
308
  anti_patterns:
301
309
  - Don't create stories without acceptance criteria
310
+ - Don't use /story directly - use /sprint story instead
302
311
  related_skills: [sprint, jira]
303
312
  keywords: [user-stories, estimation, points, acceptance-criteria]
304
313
 
@@ -322,37 +331,41 @@ skills:
322
331
 
323
332
  theme:
324
333
  name: theme
325
- description: Manage persona themes - list, show, and set active theme
334
+ description: Manage persona themes - list, show, set, create, and interactive maker wizard
326
335
  category: theming
327
- tags: [personas, themes, customization]
328
- version: "1.0.0"
336
+ tags: [personas, themes, customization, creation]
337
+ version: "2.0.0"
329
338
  prerequisites: []
330
339
  examples:
331
340
  - context: Listing available themes
332
- invocation: /list-themes
341
+ invocation: /theme list
333
342
  - context: Showing current theme
334
- invocation: /show-theme
343
+ invocation: /theme show
335
344
  - context: Setting active theme
336
- invocation: /set-theme discworld
345
+ invocation: /theme set discworld
346
+ - context: Creating a new theme
347
+ invocation: /theme create my-theme --base discworld
348
+ - context: Interactive AI-driven theme wizard
349
+ invocation: /theme maker
337
350
  anti_patterns:
338
351
  - Don't edit config.local.yaml directly - use skill
339
- related_skills: [theme-creation]
340
- keywords: [personas, characters, discworld, literary-classics]
352
+ - Don't use deprecated /set-theme, /show-theme, /list-themes, /create-theme, /theme-maker
353
+ related_skills: []
354
+ keywords: [personas, characters, discworld, literary-classics, custom, generation, wizard]
341
355
 
342
356
  theme-creation:
343
357
  name: theme-creation
344
- description: Create custom persona themes with AI-driven generation
358
+ description: "DEPRECATED: Use /theme maker instead"
345
359
  category: theming
346
360
  tags: [personas, themes, creation]
347
- version: "1.0.0"
348
- prerequisites: [theme]
361
+ version: "2.0.0"
362
+ deprecated: true
363
+ redirect: theme
364
+ prerequisites: []
349
365
  examples:
350
- - context: Creating new theme
351
- invocation: /theme-maker
352
366
  - context: Interactive theme wizard
353
- invocation: /create-theme
354
- anti_patterns:
355
- - Don't create incomplete themes missing required agents
367
+ invocation: /theme maker
368
+ anti_patterns: []
356
369
  related_skills: [theme]
357
370
  keywords: [personas, custom, generation, wizard]
358
371
 
@@ -372,7 +385,7 @@ skills:
372
385
  invocation: /workflow start architecture
373
386
  anti_patterns:
374
387
  - Don't switch workflows mid-story unless requirements fundamentally changed
375
- related_skills: [sprint, story]
388
+ related_skills: [sprint]
376
389
  keywords: [tdd, trivial, agent-docs, bdd, architecture, bikelane, stepped, phased]
377
390
 
378
391
  yq: