@pennyfarthing/core 11.0.0 → 11.1.1

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 (401) hide show
  1. package/README.md +81 -23
  2. package/package.json +1 -1
  3. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts +20 -0
  4. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts.map +1 -0
  5. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js +278 -0
  6. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js.map +1 -0
  7. package/packages/core/dist/cli/utils/constants.d.ts +8 -2
  8. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
  9. package/packages/core/dist/cli/utils/constants.js +4 -1
  10. package/packages/core/dist/cli/utils/constants.js.map +1 -1
  11. package/packages/core/dist/cli/utils/constants.test.d.ts +10 -0
  12. package/packages/core/dist/cli/utils/constants.test.d.ts.map +1 -0
  13. package/packages/core/dist/cli/utils/constants.test.js +38 -0
  14. package/packages/core/dist/cli/utils/constants.test.js.map +1 -0
  15. package/packages/core/dist/consultation/consultation-protocol.d.ts +139 -0
  16. package/packages/core/dist/consultation/consultation-protocol.d.ts.map +1 -0
  17. package/packages/core/dist/consultation/consultation-protocol.js +178 -0
  18. package/packages/core/dist/consultation/consultation-protocol.js.map +1 -0
  19. package/packages/core/dist/consultation/consultation-protocol.test.d.ts +20 -0
  20. package/packages/core/dist/consultation/consultation-protocol.test.d.ts.map +1 -0
  21. package/packages/core/dist/consultation/consultation-protocol.test.js +474 -0
  22. package/packages/core/dist/consultation/consultation-protocol.test.js.map +1 -0
  23. package/packages/core/dist/consultation/dialogue-manager.d.ts +75 -0
  24. package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -0
  25. package/packages/core/dist/consultation/dialogue-manager.js +334 -0
  26. package/packages/core/dist/consultation/dialogue-manager.js.map +1 -0
  27. package/packages/core/dist/consultation/dialogue-manager.test.d.ts +19 -0
  28. package/packages/core/dist/consultation/dialogue-manager.test.d.ts.map +1 -0
  29. package/packages/core/dist/consultation/dialogue-manager.test.js +444 -0
  30. package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -0
  31. package/packages/core/dist/public/js/react/react.js +3 -3
  32. package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
  33. package/packages/core/dist/scripts/theme-detail.test.js +199 -0
  34. package/packages/core/dist/server/api/git.d.ts +13 -1
  35. package/packages/core/dist/server/api/git.d.ts.map +1 -1
  36. package/packages/core/dist/server/api/git.js +53 -34
  37. package/packages/core/dist/server/api/git.js.map +1 -1
  38. package/packages/core/dist/server/api/health-score.d.ts.map +1 -1
  39. package/packages/core/dist/server/api/health-score.js +25 -1
  40. package/packages/core/dist/server/api/health-score.js.map +1 -1
  41. package/packages/core/dist/server/api/settings.d.ts.map +1 -1
  42. package/packages/core/dist/server/api/settings.js +63 -1
  43. package/packages/core/dist/server/api/settings.js.map +1 -1
  44. package/packages/core/dist/server/api/theme-agents.d.ts.map +1 -1
  45. package/packages/core/dist/server/api/theme-agents.js +61 -0
  46. package/packages/core/dist/server/api/theme-agents.js.map +1 -1
  47. package/packages/core/dist/server/server.d.ts.map +1 -1
  48. package/packages/core/dist/server/server.js +17 -12
  49. package/packages/core/dist/server/server.js.map +1 -1
  50. package/packages/core/dist/shared/skill-search.test.js +2 -2
  51. package/packages/core/dist/workflow/gate-file-validation.d.ts +49 -0
  52. package/packages/core/dist/workflow/gate-file-validation.d.ts.map +1 -0
  53. package/packages/core/dist/workflow/gate-file-validation.js +157 -0
  54. package/packages/core/dist/workflow/gate-file-validation.js.map +1 -0
  55. package/packages/core/dist/workflow/gate-file-validation.test.d.ts +19 -0
  56. package/packages/core/dist/workflow/gate-file-validation.test.d.ts.map +1 -0
  57. package/packages/core/dist/workflow/gate-file-validation.test.js +536 -0
  58. package/packages/core/dist/workflow/gate-file-validation.test.js.map +1 -0
  59. package/packages/core/dist/workflow/gate-schema-validation.test.d.ts +14 -0
  60. package/packages/core/dist/workflow/gate-schema-validation.test.d.ts.map +1 -0
  61. package/packages/core/dist/workflow/gate-schema-validation.test.js +339 -0
  62. package/packages/core/dist/workflow/gate-schema-validation.test.js.map +1 -0
  63. package/packages/core/dist/workflow/handoff.js +2 -2
  64. package/packages/core/dist/workflow/handoff.js.map +1 -1
  65. package/packages/core/dist/workflow/handoff.test.js +16 -0
  66. package/packages/core/dist/workflow/handoff.test.js.map +1 -1
  67. package/packages/core/dist/workflow/workflow-schema.d.ts +4 -2
  68. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
  69. package/packages/core/dist/workflow/workflow-schema.js +43 -8
  70. package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
  71. package/pennyfarthing-dist/agents/README.md +6 -14
  72. package/pennyfarthing-dist/agents/architect.md +43 -29
  73. package/pennyfarthing-dist/agents/ba.md +30 -29
  74. package/pennyfarthing-dist/agents/dev.md +32 -43
  75. package/pennyfarthing-dist/agents/devops.md +57 -21
  76. package/pennyfarthing-dist/agents/orchestrator.md +3 -10
  77. package/pennyfarthing-dist/agents/pm.md +45 -31
  78. package/pennyfarthing-dist/agents/reviewer.md +20 -66
  79. package/pennyfarthing-dist/agents/sm-setup.md +2 -2
  80. package/pennyfarthing-dist/agents/sm.md +8 -30
  81. package/pennyfarthing-dist/agents/tea.md +25 -41
  82. package/pennyfarthing-dist/agents/tech-writer.md +33 -90
  83. package/pennyfarthing-dist/agents/ux-designer.md +39 -39
  84. package/pennyfarthing-dist/commands/benchmark-control.md +8 -64
  85. package/pennyfarthing-dist/commands/benchmark.md +8 -480
  86. package/pennyfarthing-dist/commands/job-fair.md +8 -97
  87. package/pennyfarthing-dist/commands/pf-benchmark-control.md +70 -0
  88. package/pennyfarthing-dist/commands/pf-benchmark.md +486 -0
  89. package/pennyfarthing-dist/commands/pf-chore.md +4 -4
  90. package/pennyfarthing-dist/commands/pf-ci.md +40 -0
  91. package/pennyfarthing-dist/commands/pf-close-epic.md +9 -27
  92. package/pennyfarthing-dist/commands/pf-continue-session.md +9 -213
  93. package/pennyfarthing-dist/commands/pf-create-branches-from-story.md +11 -353
  94. package/pennyfarthing-dist/commands/pf-docs.md +28 -0
  95. package/pennyfarthing-dist/commands/pf-epic.md +67 -0
  96. package/pennyfarthing-dist/commands/pf-git-cleanup.md +11 -52
  97. package/pennyfarthing-dist/commands/pf-git.md +75 -0
  98. package/pennyfarthing-dist/commands/pf-help.md +110 -128
  99. package/pennyfarthing-dist/commands/pf-job-fair.md +102 -0
  100. package/pennyfarthing-dist/commands/pf-new-work.md +9 -18
  101. package/pennyfarthing-dist/commands/pf-parallel-work.md +6 -66
  102. package/pennyfarthing-dist/commands/pf-release.md +11 -76
  103. package/pennyfarthing-dist/commands/pf-repo-status.md +11 -44
  104. package/pennyfarthing-dist/commands/pf-run-ci.md +8 -111
  105. package/pennyfarthing-dist/commands/pf-session.md +51 -0
  106. package/pennyfarthing-dist/commands/pf-solo.md +447 -0
  107. package/pennyfarthing-dist/commands/pf-sprint-planning.md +8 -104
  108. package/pennyfarthing-dist/commands/pf-standalone.md +1 -1
  109. package/pennyfarthing-dist/commands/pf-start-epic.md +9 -163
  110. package/pennyfarthing-dist/commands/pf-sync-epic-to-jira.md +8 -179
  111. package/pennyfarthing-dist/commands/pf-sync-work-with-sprint.md +8 -368
  112. package/pennyfarthing-dist/commands/pf-update-domain-docs.md +8 -78
  113. package/pennyfarthing-dist/commands/solo.md +8 -442
  114. package/pennyfarthing-dist/guides/agent-behavior.md +13 -13
  115. package/pennyfarthing-dist/guides/agent-coordination.md +7 -7
  116. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -5
  117. package/pennyfarthing-dist/guides/bikerack.md +128 -0
  118. package/pennyfarthing-dist/guides/brownfield-tools.md +133 -0
  119. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +2 -2
  120. package/pennyfarthing-dist/guides/gate-schema.md +227 -0
  121. package/pennyfarthing-dist/guides/gates.md +120 -0
  122. package/pennyfarthing-dist/guides/handoff-cli.md +116 -0
  123. package/pennyfarthing-dist/guides/hooks.md +86 -4
  124. package/pennyfarthing-dist/guides/output-styles.md +65 -0
  125. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +5 -5
  126. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -4
  127. package/pennyfarthing-dist/guides/prompt-patterns.md +5 -5
  128. package/pennyfarthing-dist/guides/reflector.md +4 -4
  129. package/pennyfarthing-dist/guides/session-artifacts.md +1 -1
  130. package/pennyfarthing-dist/guides/skill-schema.md +1 -1
  131. package/pennyfarthing-dist/guides/tandem-protocol.md +13 -1
  132. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  133. package/pennyfarthing-dist/guides/xml-tags.md +5 -4
  134. package/pennyfarthing-dist/personas/themes/hogans-heroes.yaml +11 -22
  135. package/pennyfarthing-dist/personas/themes/stephen-king.yaml +13 -24
  136. package/pennyfarthing-dist/scripts/core/dialogue-manager.sh +322 -0
  137. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +1 -1
  138. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +19 -14
  139. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +191 -57
  140. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +26 -10
  141. package/pennyfarthing-dist/skills/pf-changelog/SKILL.md +4 -4
  142. package/pennyfarthing-dist/skills/pf-sprint/skill.md +1 -1
  143. package/pennyfarthing-dist/skills/skill-registry.schema.json +4 -0
  144. package/pennyfarthing-dist/skills/skill-registry.yaml +5 -0
  145. package/pennyfarthing-dist/workflows/2party-tdd.yaml +11 -0
  146. package/pennyfarthing-dist/workflows/agent-docs.yaml +2 -0
  147. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +4 -0
  148. package/pennyfarthing-dist/workflows/bdd.yaml +4 -0
  149. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  150. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +3 -0
  151. package/pennyfarthing-dist/workflows/tdd.yaml +3 -0
  152. package/pennyfarthing-dist/workflows/trivial.yaml +2 -0
  153. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  154. package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  155. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  156. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  157. package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
  158. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  159. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  160. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  161. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  162. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  163. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  164. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  165. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  166. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  167. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  168. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  169. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  170. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  171. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  172. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  173. package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  174. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  175. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  176. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  177. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  178. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  179. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  180. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  181. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  182. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  183. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  184. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  185. package/pennyfarthing_scripts/bikerack/cli.py +10 -11
  186. package/pennyfarthing_scripts/bikerack/debug_panel.py +218 -0
  187. package/pennyfarthing_scripts/bikerack/diffs_panel.py +203 -27
  188. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  189. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  190. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  191. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  192. package/pennyfarthing_scripts/cli.py +114 -0
  193. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  194. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  195. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  196. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  197. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  198. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  200. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  201. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  202. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  203. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  204. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  205. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  206. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  207. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  208. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  209. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  210. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  211. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  212. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  213. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  214. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  215. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  216. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  217. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  218. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  219. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  220. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  221. package/pennyfarthing_scripts/epic/__init__.py +0 -0
  222. package/pennyfarthing_scripts/epic/cli.py +64 -0
  223. package/pennyfarthing_scripts/gate/__init__.py +1 -0
  224. package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
  225. package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
  226. package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/gate/cli.py +56 -0
  228. package/pennyfarthing_scripts/gate/validate.py +266 -0
  229. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  231. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/git_group/__init__.py +0 -0
  233. package/pennyfarthing_scripts/git_group/cli.py +100 -0
  234. package/pennyfarthing_scripts/handoff/__init__.py +1 -0
  235. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  237. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  238. package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  239. package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  240. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  241. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  242. package/pennyfarthing_scripts/handoff/cli.py +120 -0
  243. package/pennyfarthing_scripts/handoff/complete_phase.py +155 -0
  244. package/pennyfarthing_scripts/handoff/gate_file.py +105 -0
  245. package/pennyfarthing_scripts/handoff/gate_runner.py +152 -0
  246. package/pennyfarthing_scripts/handoff/marker.py +109 -0
  247. package/pennyfarthing_scripts/handoff/resolve_gate.py +152 -0
  248. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  256. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  257. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  259. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  260. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  261. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  262. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  263. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  264. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  265. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  266. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  267. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  268. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  269. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  270. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  271. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  272. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  273. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
  274. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  277. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  278. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  282. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  283. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  284. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  285. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  286. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  287. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  288. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  289. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  291. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  292. package/pennyfarthing_scripts/prime/workflow.py +39 -0
  293. package/pennyfarthing_scripts/session/__init__.py +0 -0
  294. package/pennyfarthing_scripts/session/cli.py +87 -0
  295. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  296. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  297. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  298. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  299. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  302. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  303. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  304. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  305. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  306. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  307. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  309. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  311. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/sprint/story_finish.py +14 -0
  313. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  314. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  315. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  316. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  317. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  318. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  319. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  320. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  321. package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
  322. package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  323. package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  324. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  325. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  326. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  327. package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  328. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  329. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  330. package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  331. package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
  332. package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
  333. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  334. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  335. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  336. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  337. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  338. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  339. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  340. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  341. package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
  342. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  343. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  344. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  345. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  346. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  347. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  348. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  349. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  350. package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  351. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  352. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  353. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  354. package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  355. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  356. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  357. package/pennyfarthing_scripts/tests/test_108_1_gate_migration.py +540 -0
  358. package/pennyfarthing_scripts/tests/test_108_2_remove_handoff_fallback.py +339 -0
  359. package/pennyfarthing_scripts/tests/test_confidence_sm_evaluation.py +253 -0
  360. package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +315 -0
  361. package/pennyfarthing_scripts/tests/test_gate_file_resolution.py +341 -0
  362. package/pennyfarthing_scripts/tests/test_gate_runner.py +620 -0
  363. package/pennyfarthing_scripts/tests/test_handoff_cli.py +929 -0
  364. package/pennyfarthing_scripts/tests/test_handoff_e2e.py +454 -0
  365. package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +464 -0
  366. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  367. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  368. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  369. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  370. package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  371. package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  372. package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  373. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  374. package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  375. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  376. package/pennyfarthing_scripts/validate/adapters/skill_command.py +200 -0
  377. package/pennyfarthing_scripts/validate/adapters/workflow.py +64 -0
  378. package/pennyfarthing_scripts/validate/cli.py +15 -4
  379. package/packages/core/dist/scripts/benchmark-integration.d.ts +0 -182
  380. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +0 -1
  381. package/packages/core/dist/scripts/benchmark-integration.js +0 -691
  382. package/packages/core/dist/scripts/benchmark-integration.js.map +0 -1
  383. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +0 -150
  384. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
  385. package/packages/core/dist/scripts/job-fair-aggregator.js +0 -547
  386. package/packages/core/dist/scripts/job-fair-aggregator.js.map +0 -1
  387. package/pennyfarthing-dist/agents/handoff.md +0 -250
  388. package/pennyfarthing-dist/agents/sm-handoff.md +0 -152
  389. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -112
  390. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  391. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  392. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  393. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  394. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  395. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  396. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  397. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  398. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  399. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  400. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  401. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
@@ -1,250 +0,0 @@
1
- ---
2
- name: handoff
3
- description: Workflow-driven handoff that reads phase requirements from workflow definition
4
- tools: Bash, Read, Edit, Grep
5
- model: haiku
6
- ---
7
-
8
- <arguments>
9
- | Argument | Required | Description |
10
- |----------|----------|-------------|
11
- | `STORY_ID` | Yes | e.g., "31-10" |
12
- | `WORKFLOW` | Yes | "tdd", "trivial", etc. |
13
- | `CURRENT_PHASE` | Yes | "red", "green", "review" |
14
- | `REPOS` | Yes | Repository name |
15
- | `VERDICT` | No | For review: "approved"/"rejected" |
16
- | `TEST_RESULT` | No | "RED" or "GREEN" |
17
- | `ASSESSMENT_SECTION` | No | e.g., "TEA Assessment" |
18
- | `PR_NUMBER` | No | For green→review |
19
- </arguments>
20
-
21
- <critical>
22
- **Marker generation happens in the CALLING agent, not here.**
23
- This subagent does gate checks and session updates only.
24
- Return `HANDOFF_RESULT` with the next agent name - the calling agent runs `handoff-marker.sh` as their last action.
25
- </critical>
26
-
27
- ---
28
-
29
- ## Gate Types
30
-
31
- <gate>
32
- ### tests_fail (TEA → Dev)
33
- - [ ] Tests committed
34
- - [ ] Tests are RED (failing)
35
- - [ ] Assessment exists
36
-
37
- **STOP if tests GREEN** - TEA must verify tests exercise new code.
38
- </gate>
39
-
40
- <gate>
41
- ### tests_pass (Dev → Reviewer)
42
- - [ ] Quality checks pass (run: `.pennyfarthing/scripts/workflow/check.sh`)
43
- - [ ] Git working tree clean
44
- - [ ] Changes pushed to remote
45
- - [ ] Local PR exists and is open
46
- - [ ] Assessment exists
47
-
48
- **STOP if any check fails.**
49
- </gate>
50
-
51
- <gate>
52
- ### approval (Reviewer → SM/Dev)
53
- - [ ] Reviewer Assessment exists
54
- - [ ] Contains APPROVED or REJECTED
55
- - [ ] Verdict matches VERDICT parameter
56
- - [ ] PR pushed to remote
57
-
58
- **If VERDICT=approved:** Status → approved, ready for SM finish
59
- **If VERDICT=rejected:** Return to Dev with issues
60
- </gate>
61
-
62
- <gate>
63
- ### manual (SM setup)
64
- No automated checks. Always passes.
65
- </gate>
66
-
67
- ---
68
-
69
- ## Workflow
70
-
71
- 1. **Find phase and gate type:**
72
- ```bash
73
- ./scripts/handoff-cli.sh find-phase --workflow {WORKFLOW} --phase {CURRENT_PHASE}
74
- ```
75
-
76
- 2. **Verify assessment exists** (if ASSESSMENT_SECTION provided)
77
-
78
- 3. **Run gate-specific checks** (see above)
79
-
80
- 4. **Determine next phase and check for tandem partner:**
81
- ```bash
82
- ./scripts/handoff-cli.sh next-phase --workflow {WORKFLOW} --phase {CURRENT_PHASE}
83
- ```
84
-
85
- After determining the next phase, check for tandem partner:
86
- ```bash
87
- TANDEM_PARTNER=$(yq eval ".workflow.phases[] | select(.name == \"$NEXT_PHASE\") | .tandem.partner // \"\"" "$PROJECT_ROOT/.pennyfarthing/workflows/${WORKFLOW}.yaml" 2>/dev/null)
88
- TANDEM_SCOPE=$(yq eval ".workflow.phases[] | select(.name == \"$NEXT_PHASE\") | .tandem.scope // \"\"" "$PROJECT_ROOT/.pennyfarthing/workflows/${WORKFLOW}.yaml" 2>/dev/null)
89
- ```
90
-
91
- If tandem partner exists, add `**Tandem:** {partner} ({scope})` to session metadata.
92
-
93
- 5. **Update session file using Edit tool:**
94
-
95
- First, get timestamps and calculate duration:
96
- ```bash
97
- PHASE_STARTED=$(grep "^\*\*Phase Started:\*\*" .session/{STORY_ID}-session.md | sed 's/\*\*Phase Started:\*\* //')
98
- NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
99
- DURATION=$(./scripts/handoff-cli.sh calculate-duration --started-at "$PHASE_STARTED" --ended-at "$NOW")
100
- ```
101
-
102
- **5a. Update `**Phase:**` field** - Use Edit tool:
103
- ```
104
- file_path: .session/{STORY_ID}-session.md
105
- old_string: "**Phase:** {CURRENT_PHASE}"
106
- new_string: "**Phase:** {NEXT_PHASE}"
107
- ```
108
-
109
- **5b. Update `**Phase Started:**` field** - Use Edit tool:
110
- ```
111
- file_path: .session/{STORY_ID}-session.md
112
- old_string: "**Phase Started:** {PHASE_STARTED}"
113
- new_string: "**Phase Started:** {NOW}"
114
- ```
115
-
116
- **5c. Update Phase History table** - Use Edit tool to add end timestamp and duration:
117
- Find the row for current phase (has `| - | - |` at end) and update:
118
- ```
119
- file_path: .session/{STORY_ID}-session.md
120
- old_string: "| {CURRENT_PHASE} | {PHASE_STARTED} | - | - |"
121
- new_string: "| {CURRENT_PHASE} | {PHASE_STARTED} | {NOW} | {DURATION} |"
122
- ```
123
-
124
- Phase History table format:
125
- ```
126
- | Phase | Started | Ended | Duration |
127
- |-------|---------|-------|----------|
128
- ```
129
-
130
- **5d. Add Handoff History row** - Use Edit tool to append to Handoff History section:
131
- If `### Handoff History` section doesn't exist, create it first.
132
- Then append a row:
133
- ```
134
- | {CURRENT_PHASE} ({CURRENT_AGENT}) | {NEXT_PHASE} ({NEXT_AGENT}) | {GATE_TYPE} | PASSED | {NOW} |
135
- ```
136
-
137
- Handoff History table format:
138
- ```
139
- | From | To | Gate | Status | Timestamp |
140
- |------|-----|------|--------|-----------|
141
- ```
142
-
143
- 6. **Return HANDOFF_RESULT** (see Output Format below)
144
-
145
- ---
146
-
147
- <output>
148
- ## Output Format
149
-
150
- Return a `HANDOFF_RESULT` block:
151
-
152
- ### Success
153
- ```
154
- HANDOFF_RESULT:
155
- status: success
156
- next_agent: {NEXT_AGENT}
157
- next_phase: {NEXT_PHASE}
158
- gate: {GATE_TYPE}
159
- story_id: {STORY_ID}
160
- tandem_partner: {PARTNER or "none"}
161
- tandem_scope: {SCOPE or "none"}
162
-
163
- next_steps:
164
- - "Handoff complete. Run handoff-marker.sh as ABSOLUTE LAST ACTION."
165
- - "Command: .pennyfarthing/scripts/core/handoff-marker.sh {next_agent}"
166
- - "Output marker result verbatim, then EXIT. Nothing after."
167
- ```
168
-
169
- ### Example (TEA → Dev, with tandem)
170
- ```
171
- HANDOFF_RESULT:
172
- status: success
173
- next_agent: dev
174
- next_phase: green
175
- gate: tests_fail
176
- story_id: 46-5
177
- tandem_partner: ux-designer
178
- tandem_scope: file-watch
179
-
180
- next_steps:
181
- - "Handoff complete. Run handoff-marker.sh as ABSOLUTE LAST ACTION."
182
- - "Command: .pennyfarthing/scripts/core/handoff-marker.sh dev"
183
- - "Output marker result verbatim, then EXIT. Nothing after."
184
- ```
185
-
186
- ### Example (Dev → Reviewer)
187
- ```
188
- HANDOFF_RESULT:
189
- status: success
190
- next_agent: reviewer
191
- next_phase: review
192
- gate: tests_pass
193
- story_id: 46-5
194
- tandem_partner: pm
195
- tandem_scope: file-watch
196
-
197
- next_steps:
198
- - "Handoff complete. Run handoff-marker.sh as ABSOLUTE LAST ACTION."
199
- - "Command: .pennyfarthing/scripts/core/handoff-marker.sh reviewer"
200
- - "Output marker result verbatim, then EXIT. Nothing after."
201
- ```
202
-
203
- ### Blocked
204
- ```
205
- HANDOFF_RESULT:
206
- status: blocked
207
- error: "{description}"
208
- fix: "{recommended action}"
209
- gate: {GATE_TYPE}
210
- failed_check: "{specific check that failed}"
211
-
212
- next_steps:
213
- - "Handoff blocked at gate '{gate}': {error}"
214
- - "Required action: {fix}"
215
- - "Do NOT run handoff-marker.sh. Resolve issue first."
216
- ```
217
- </output>
218
-
219
- ---
220
-
221
- ## Agent Command Mapping
222
-
223
- | Agent | Command |
224
- |-------|---------|
225
- | TEA | `/tea` |
226
- | Dev | `/dev` |
227
- | Reviewer | `/reviewer` |
228
- | SM | `/sm` |
229
- | Architect | `/architect` |
230
- | DevOps | `/devops` |
231
- | Tech-Writer | `/tech-writer` |
232
- | UX-Designer | `/ux-designer` |
233
- | PM | `/pm` |
234
-
235
- ---
236
-
237
- ## Calling Agent Exit Sequence
238
-
239
- When you receive `HANDOFF_RESULT`:
240
-
241
- 1. If `status: blocked` → Report the error, do NOT proceed
242
- 2. If `status: success` → Continue to exit sequence below
243
-
244
- **CRITICAL: The calling agent MUST run this as their ABSOLUTE LAST ACTION:**
245
-
246
- ```bash
247
- .pennyfarthing/scripts/core/handoff-marker.sh {next_agent}
248
- ```
249
-
250
- Then output the script's result verbatim and EXIT. Nothing else after.
@@ -1,152 +0,0 @@
1
- ---
2
- name: sm-handoff
3
- description: Complete handoff bookkeeping when SM work is done
4
- tools: Bash, Read, Edit
5
- model: haiku
6
- ---
7
-
8
- <critical>
9
- **NEVER mark acceptance criteria as complete.** This subagent only:
10
- 1. Verifies prerequisites exist
11
- 2. Updates the Workflow Tracking section for phase transition
12
-
13
- AC checkboxes are marked ONLY by the agent that does the work.
14
- </critical>
15
-
16
- <critical>
17
- **Marker generation happens in the CALLING agent, not here.**
18
- This subagent verifies prerequisites and updates session file only.
19
- Return `HANDOFF_RESULT` with the next agent name - SM runs `handoff-marker.sh` as their last action.
20
- </critical>
21
-
22
- <arguments>
23
- | Argument | Required | Description |
24
- |----------|----------|-------------|
25
- | `STORY_ID` | Yes | Story identifier, e.g., "31-10" |
26
- | `NEXT_AGENT` | Yes | Target agent: `tea`, `dev`, `ux-designer`, `orchestrator` |
27
- | `NEXT_PHASE` | Yes | Target phase from workflow YAML: `red`, `design`, `implement` |
28
- | `WORKFLOW` | Yes | Workflow type: "tdd", "tdd-tandem", "bdd", "bdd-tandem", "trivial", etc. |
29
- </arguments>
30
-
31
- <tandem-awareness>
32
- ## Tandem Partner Detection
33
-
34
- After verifying prerequisites, check if the next phase has a tandem partner:
35
-
36
- ```bash
37
- TANDEM_PARTNER=$(yq eval ".workflow.phases[] | select(.name == \"$NEXT_PHASE\") | .tandem.partner // \"\"" "$PROJECT_ROOT/.pennyfarthing/workflows/${WORKFLOW}.yaml" 2>/dev/null)
38
- TANDEM_SCOPE=$(yq eval ".workflow.phases[] | select(.name == \"$NEXT_PHASE\") | .tandem.scope // \"\"" "$PROJECT_ROOT/.pennyfarthing/workflows/${WORKFLOW}.yaml" 2>/dev/null)
39
- ```
40
-
41
- If `TANDEM_PARTNER` is non-empty, include it in the HANDOFF_RESULT and add a note to the session file:
42
-
43
- ```markdown
44
- **Tandem:** {TANDEM_PARTNER} ({TANDEM_SCOPE})
45
- ```
46
-
47
- This tells the receiving agent they can spawn their tandem partner for consultation.
48
- </tandem-awareness>
49
-
50
- <gate>
51
- ## Handoff Checklist
52
-
53
- - [ ] Session file exists with story context
54
- - [ ] Acceptance criteria defined (count, don't mark)
55
- - [ ] Feature branches created
56
- - [ ] Jira story claimed (if applicable)
57
- - [ ] Update Workflow Tracking section:
58
- - `**Phase:**` → `{NEXT_PHASE}`
59
- - `**Phase Started:**` → `{NOW}`
60
- - Add Phase History row
61
- - [ ] Report status summary
62
- </gate>
63
-
64
- ## Phase Transition Update
65
-
66
- Edit `## Workflow Tracking`:
67
-
68
- ```markdown
69
- ## Workflow Tracking
70
- **Workflow:** {WORKFLOW}
71
- **Phase:** {NEXT_PHASE}
72
- **Phase Started:** {NOW}
73
-
74
- ### Phase History
75
- | Phase | Started | Ended | Duration |
76
- |-------|---------|-------|----------|
77
- | setup | {SM_STARTED} | {NOW} | {DURATION} |
78
- | {NEXT_PHASE} | {NOW} | - | - |
79
- ```
80
-
81
- **Duration:** Subtract SM Started from {NOW}, format as `Xm` or `Xh Ym`.
82
-
83
- <output>
84
- ## Output Format
85
-
86
- Return a `HANDOFF_RESULT` block:
87
-
88
- ### Success
89
- ```
90
- HANDOFF_RESULT:
91
- status: success
92
- next_agent: {NEXT_AGENT}
93
- next_phase: {NEXT_PHASE}
94
- story_id: {STORY_ID}
95
- tandem_partner: {PARTNER or "none"}
96
- tandem_scope: {SCOPE or "none"}
97
- summary: "{what was done}"
98
-
99
- next_steps:
100
- - "Handoff complete. Run handoff-marker.sh as ABSOLUTE LAST ACTION."
101
- - "Command: .pennyfarthing/scripts/core/handoff-marker.sh {next_agent}"
102
- - "Output marker result verbatim, then EXIT. Nothing after."
103
- ```
104
-
105
- ### Example (SM → TEA)
106
- ```
107
- HANDOFF_RESULT:
108
- status: success
109
- next_agent: tea
110
- next_phase: red
111
- story_id: MSSCI-12274
112
- tandem_partner: architect
113
- tandem_scope: file-watch
114
- summary: "Session updated (setup → red), branch verified, 7 AC defined. Tandem: architect available."
115
-
116
- next_steps:
117
- - "Handoff complete. Run handoff-marker.sh as ABSOLUTE LAST ACTION."
118
- - "Command: .pennyfarthing/scripts/core/handoff-marker.sh tea"
119
- - "Output marker result verbatim, then EXIT. Nothing after."
120
- ```
121
-
122
- ### Blocked
123
- ```
124
- HANDOFF_RESULT:
125
- status: blocked
126
- error: "{description}"
127
- fix: "{recommended action}"
128
- failed_check: "{which gate check failed}"
129
-
130
- next_steps:
131
- - "Handoff blocked: {error}"
132
- - "Required action: {fix}"
133
- - "Do NOT run handoff-marker.sh. Resolve issue first."
134
- ```
135
- </output>
136
-
137
- ---
138
-
139
- ## Calling Agent Exit Sequence
140
-
141
- When SM receives `HANDOFF_RESULT`:
142
-
143
- 1. If `status: blocked` → Report the error, do NOT proceed
144
- 2. If `status: success` → Continue to exit sequence below
145
-
146
- **CRITICAL: SM MUST run this as their ABSOLUTE LAST ACTION:**
147
-
148
- ```bash
149
- .pennyfarthing/scripts/core/handoff-marker.sh {next_agent}
150
- ```
151
-
152
- Then output the script's result verbatim and EXIT. Nothing else after.
@@ -1,112 +0,0 @@
1
- #!/bin/bash
2
- # Generate complete AGENT_COMMAND block with pre-rendered marker
3
- # Usage: handoff-marker.sh <next-agent> [--error <message>]
4
- #
5
- # Outputs a complete AGENT_COMMAND block that subagents can emit verbatim.
6
- # Handles IS_CYCLIST and USE_TIREPUMP detection automatically.
7
- #
8
- # Single source of truth for marker format - both agents and quick-actions.js
9
- # should reference this script's output format.
10
-
11
- set -euo pipefail
12
-
13
- NEXT_AGENT=""
14
- IS_ERROR=false
15
- ERROR_MSG=""
16
-
17
- # Parse args
18
- while [[ $# -gt 0 ]]; do
19
- case "$1" in
20
- --error)
21
- IS_ERROR=true
22
- ERROR_MSG="${2:-Error occurred}"
23
- shift 2
24
- ;;
25
- *)
26
- if [[ -z "$NEXT_AGENT" ]]; then
27
- NEXT_AGENT="$1"
28
- fi
29
- shift
30
- ;;
31
- esac
32
- done
33
-
34
- if [[ -z "$NEXT_AGENT" && "$IS_ERROR" != "true" ]]; then
35
- echo "Usage: handoff-marker.sh <next-agent> [--error <message>]" >&2
36
- echo "" >&2
37
- echo "Examples:" >&2
38
- echo " handoff-marker.sh dev # Normal handoff to dev" >&2
39
- echo " handoff-marker.sh tea # Normal handoff to tea" >&2
40
- echo " handoff-marker.sh --error 'Tests failing' # Error case" >&2
41
- exit 1
42
- fi
43
-
44
- # Get environment from check-context.sh
45
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
46
- eval "$("$SCRIPT_DIR/check-context.sh" 2>/dev/null)" || true
47
-
48
- # Default values if check-context.sh failed
49
- IS_CYCLIST="${IS_CYCLIST:-false}"
50
- USE_TIREPUMP="${USE_TIREPUMP:-false}"
51
- RELAY_MODE="${RELAY_MODE:-false}"
52
-
53
- # Generate marker based on environment
54
- if [[ "$IS_ERROR" == "true" ]]; then
55
- # Error case - no marker
56
- cat <<EOF
57
- ---
58
- AGENT_COMMAND:
59
- marker: ""
60
- fallback: "$ERROR_MSG"
61
- error: true
62
- ---
63
- EOF
64
- elif [[ "$IS_CYCLIST" != "true" ]]; then
65
- # Not in Cyclist - no marker, include context info
66
- # Get context percentage for warning
67
- CONTEXT_PCT="${CONTEXT_USABLE_PERCENT:-unknown}"
68
- if [[ "$CONTEXT_PCT" != "unknown" ]] && [[ "$CONTEXT_PCT" -ge 60 ]] 2>/dev/null; then
69
- CONTEXT_WARNING=" (context: ${CONTEXT_PCT}% - consider /clear before continuing)"
70
- elif [[ "$CONTEXT_PCT" != "unknown" ]]; then
71
- CONTEXT_WARNING=" (context: ${CONTEXT_PCT}%)"
72
- else
73
- CONTEXT_WARNING=""
74
- fi
75
- cat <<EOF
76
- ---
77
- AGENT_COMMAND:
78
- marker: ""
79
- fallback: "Run \`/${NEXT_AGENT}\` to continue${CONTEXT_WARNING}"
80
- relay_mode: ${RELAY_MODE}
81
- context_percent: ${CONTEXT_PCT}
82
- ---
83
- EOF
84
- elif [[ "$RELAY_MODE" != "true" ]]; then
85
- # Cyclist + Relay OFF - emit question marker for manual handoff confirmation
86
- cat <<EOF
87
- ---
88
- AGENT_COMMAND:
89
- marker: "<!-- CYCLIST:QUESTION:yesno -->"
90
- question: "Ready to hand off to /${NEXT_AGENT}?"
91
- fallback: "Run \`/${NEXT_AGENT}\` to continue"
92
- ---
93
- EOF
94
- elif [[ "$USE_TIREPUMP" == "true" ]]; then
95
- # Cyclist + Relay ON + high context - context clear marker
96
- cat <<EOF
97
- ---
98
- AGENT_COMMAND:
99
- marker: "<!-- CYCLIST:CONTEXT_CLEAR:/${NEXT_AGENT} -->"
100
- fallback: "Run \`/${NEXT_AGENT}\` to continue"
101
- ---
102
- EOF
103
- else
104
- # Cyclist + Relay ON + low context - handoff marker
105
- cat <<EOF
106
- ---
107
- AGENT_COMMAND:
108
- marker: "<!-- CYCLIST:HANDOFF:/${NEXT_AGENT} -->"
109
- fallback: "Run \`/${NEXT_AGENT}\` to continue"
110
- ---
111
- EOF
112
- fi