@pennyfarthing/core 7.0.1 → 7.4.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 (692) hide show
  1. package/{packages/core/dist → dist}/cli/commands/cyclist.d.ts +2 -2
  2. package/{packages/core/dist → dist}/cli/commands/cyclist.d.ts.map +1 -1
  3. package/{packages/core/dist → dist}/cli/commands/cyclist.js +8 -9
  4. package/dist/cli/commands/cyclist.js.map +1 -0
  5. package/{packages/core/dist → dist}/cli/commands/cyclist.test.js +6 -4
  6. package/dist/cli/commands/cyclist.test.js.map +1 -0
  7. package/{packages/core/dist → dist}/cli/commands/update.d.ts.map +1 -1
  8. package/{packages/core/dist → dist}/cli/commands/update.js +9 -136
  9. package/dist/cli/commands/update.js.map +1 -0
  10. package/{packages/core/dist → dist}/cli/cyclist-migration.test.js +4 -3
  11. package/{packages/core/dist → dist}/cli/cyclist-migration.test.js.map +1 -1
  12. package/{packages/core/dist → dist}/cli/utils/constants.d.ts +7 -1
  13. package/dist/cli/utils/constants.d.ts.map +1 -0
  14. package/{packages/core/dist → dist}/cli/utils/constants.js +4 -2
  15. package/{packages/core/dist → dist}/cli/utils/constants.js.map +1 -1
  16. package/{packages/core/dist → dist}/cli/utils/themes.d.ts +1 -4
  17. package/{packages/core/dist → dist}/cli/utils/themes.d.ts.map +1 -1
  18. package/{packages/core/dist → dist}/cli/utils/themes.js +2 -22
  19. package/dist/cli/utils/themes.js.map +1 -0
  20. package/dist/cli/utils/themes.test.d.ts +12 -0
  21. package/{packages/core/dist → dist}/cli/utils/themes.test.js +16 -13
  22. package/dist/cli/utils/themes.test.js.map +1 -0
  23. package/{packages/core/dist → dist}/cli/workspace.test.js +5 -8
  24. package/{packages/core/dist → dist}/cli/workspace.test.js.map +1 -1
  25. package/{packages/core/dist → dist}/index.d.ts +1 -0
  26. package/{packages/core/dist → dist}/index.d.ts.map +1 -1
  27. package/{packages/core/dist → dist}/index.js +10 -0
  28. package/{packages/core/dist → dist}/index.js.map +1 -1
  29. package/dist/jira/jira-epic-creation.d.ts +109 -0
  30. package/dist/jira/jira-epic-creation.d.ts.map +1 -0
  31. package/dist/jira/jira-epic-creation.js +253 -0
  32. package/dist/jira/jira-epic-creation.js.map +1 -0
  33. package/dist/jira/jira-epic-creation.test.d.ts +16 -0
  34. package/dist/jira/jira-epic-creation.test.d.ts.map +1 -0
  35. package/dist/jira/jira-epic-creation.test.js +387 -0
  36. package/dist/jira/jira-epic-creation.test.js.map +1 -0
  37. package/dist/jira/jira-sprint-sync.d.ts +247 -0
  38. package/dist/jira/jira-sprint-sync.d.ts.map +1 -0
  39. package/dist/jira/jira-sprint-sync.js +670 -0
  40. package/dist/jira/jira-sprint-sync.js.map +1 -0
  41. package/dist/jira/jira-sprint-sync.test.d.ts +16 -0
  42. package/dist/jira/jira-sprint-sync.test.d.ts.map +1 -0
  43. package/dist/jira/jira-sprint-sync.test.js +845 -0
  44. package/dist/jira/jira-sprint-sync.test.js.map +1 -0
  45. package/{packages/core/dist → dist}/scripts/generate-spider.d.ts +11 -1
  46. package/{packages/core/dist → dist}/scripts/generate-spider.d.ts.map +1 -1
  47. package/{packages/core/dist → dist}/scripts/generate-spider.js +24 -1
  48. package/dist/scripts/generate-spider.js.map +1 -0
  49. package/{packages/core/dist → dist}/scripts/generate-spider.test.js +6 -4
  50. package/dist/scripts/generate-spider.test.js.map +1 -0
  51. package/dist/workflow/gate-handler.d.ts +94 -0
  52. package/dist/workflow/gate-handler.d.ts.map +1 -0
  53. package/dist/workflow/gate-handler.js +189 -0
  54. package/dist/workflow/gate-handler.js.map +1 -0
  55. package/dist/workflow/gate-handler.test.d.ts +14 -0
  56. package/dist/workflow/gate-handler.test.d.ts.map +1 -0
  57. package/dist/workflow/gate-handler.test.js +543 -0
  58. package/dist/workflow/gate-handler.test.js.map +1 -0
  59. package/{packages/core/dist → dist}/workflow/generic-handoff.d.ts +46 -0
  60. package/{packages/core/dist → dist}/workflow/generic-handoff.d.ts.map +1 -1
  61. package/{packages/core/dist → dist}/workflow/generic-handoff.js +53 -0
  62. package/{packages/core/dist → dist}/workflow/generic-handoff.js.map +1 -1
  63. package/{packages/core/dist → dist}/workflow/generic-handoff.test.js +2 -2
  64. package/{packages/core/dist → dist}/workflow/generic-handoff.test.js.map +1 -1
  65. package/dist/workflow/index.d.ts +16 -0
  66. package/dist/workflow/index.d.ts.map +1 -0
  67. package/dist/workflow/index.js +24 -0
  68. package/dist/workflow/index.js.map +1 -0
  69. package/dist/workflow/session-state.d.ts +92 -0
  70. package/dist/workflow/session-state.d.ts.map +1 -0
  71. package/dist/workflow/session-state.js +198 -0
  72. package/dist/workflow/session-state.js.map +1 -0
  73. package/dist/workflow/session-state.test.d.ts +8 -0
  74. package/dist/workflow/session-state.test.d.ts.map +1 -0
  75. package/dist/workflow/session-state.test.js +551 -0
  76. package/dist/workflow/session-state.test.js.map +1 -0
  77. package/dist/workflow/step-parser.d.ts +45 -0
  78. package/dist/workflow/step-parser.d.ts.map +1 -0
  79. package/dist/workflow/step-parser.js +147 -0
  80. package/dist/workflow/step-parser.js.map +1 -0
  81. package/dist/workflow/step-parser.test.d.ts +14 -0
  82. package/dist/workflow/step-parser.test.d.ts.map +1 -0
  83. package/dist/workflow/step-parser.test.js +470 -0
  84. package/dist/workflow/step-parser.test.js.map +1 -0
  85. package/dist/workflow/trimodal.d.ts +86 -0
  86. package/dist/workflow/trimodal.d.ts.map +1 -0
  87. package/dist/workflow/trimodal.js +118 -0
  88. package/dist/workflow/trimodal.js.map +1 -0
  89. package/dist/workflow/trimodal.test.d.ts +11 -0
  90. package/dist/workflow/trimodal.test.d.ts.map +1 -0
  91. package/dist/workflow/trimodal.test.js +395 -0
  92. package/dist/workflow/trimodal.test.js.map +1 -0
  93. package/dist/workflow/variable-resolver.d.ts +67 -0
  94. package/dist/workflow/variable-resolver.d.ts.map +1 -0
  95. package/dist/workflow/variable-resolver.js +156 -0
  96. package/dist/workflow/variable-resolver.js.map +1 -0
  97. package/dist/workflow/variable-resolver.test.d.ts +14 -0
  98. package/dist/workflow/variable-resolver.test.d.ts.map +1 -0
  99. package/dist/workflow/variable-resolver.test.js +400 -0
  100. package/dist/workflow/variable-resolver.test.js.map +1 -0
  101. package/dist/workflow/workflow-executor.d.ts +163 -0
  102. package/dist/workflow/workflow-executor.d.ts.map +1 -0
  103. package/dist/workflow/workflow-executor.js +197 -0
  104. package/dist/workflow/workflow-executor.js.map +1 -0
  105. package/dist/workflow/workflow-executor.test.d.ts +8 -0
  106. package/dist/workflow/workflow-executor.test.d.ts.map +1 -0
  107. package/dist/workflow/workflow-executor.test.js +444 -0
  108. package/dist/workflow/workflow-executor.test.js.map +1 -0
  109. package/{packages/core/dist → dist}/workflow/workflow-loader.test.js +5 -5
  110. package/dist/workflow/workflow-loader.test.js.map +1 -0
  111. package/{packages/core/dist → dist}/workflow/workflow-migration.test.js +8 -9
  112. package/{packages/core/dist → dist}/workflow/workflow-migration.test.js.map +1 -1
  113. package/dist/workflow/workflow-permissions.d.ts +55 -0
  114. package/dist/workflow/workflow-permissions.d.ts.map +1 -0
  115. package/dist/workflow/workflow-permissions.js +64 -0
  116. package/dist/workflow/workflow-permissions.js.map +1 -0
  117. package/dist/workflow/workflow-permissions.test.d.ts +15 -0
  118. package/dist/workflow/workflow-permissions.test.d.ts.map +1 -0
  119. package/dist/workflow/workflow-permissions.test.js +301 -0
  120. package/dist/workflow/workflow-permissions.test.js.map +1 -0
  121. package/{packages/core/dist → dist}/workflow/workflow-schema.d.ts +61 -2
  122. package/dist/workflow/workflow-schema.d.ts.map +1 -0
  123. package/dist/workflow/workflow-schema.js +454 -0
  124. package/dist/workflow/workflow-schema.js.map +1 -0
  125. package/{packages/core/dist → dist}/workflow/workflow-schema.test.js +6 -6
  126. package/{packages/core/dist → dist}/workflow/workflow-schema.test.js.map +1 -1
  127. package/dist/workflow/workflow-stepped-schema.test.d.ts +18 -0
  128. package/dist/workflow/workflow-stepped-schema.test.d.ts.map +1 -0
  129. package/dist/workflow/workflow-stepped-schema.test.js +608 -0
  130. package/dist/workflow/workflow-stepped-schema.test.js.map +1 -0
  131. package/package.json +36 -31
  132. package/README.md +0 -301
  133. package/packages/core/dist/cli/commands/cyclist.js.map +0 -1
  134. package/packages/core/dist/cli/commands/cyclist.test.js.map +0 -1
  135. package/packages/core/dist/cli/commands/update.js.map +0 -1
  136. package/packages/core/dist/cli/utils/constants.d.ts.map +0 -1
  137. package/packages/core/dist/cli/utils/themes.js.map +0 -1
  138. package/packages/core/dist/cli/utils/themes.test.d.ts +0 -12
  139. package/packages/core/dist/cli/utils/themes.test.js.map +0 -1
  140. package/packages/core/dist/scripts/generate-all-faces.d.ts +0 -10
  141. package/packages/core/dist/scripts/generate-all-faces.d.ts.map +0 -1
  142. package/packages/core/dist/scripts/generate-all-faces.js +0 -256
  143. package/packages/core/dist/scripts/generate-all-faces.js.map +0 -1
  144. package/packages/core/dist/scripts/generate-all-faces.test.d.ts +0 -17
  145. package/packages/core/dist/scripts/generate-all-faces.test.d.ts.map +0 -1
  146. package/packages/core/dist/scripts/generate-all-faces.test.js +0 -372
  147. package/packages/core/dist/scripts/generate-all-faces.test.js.map +0 -1
  148. package/packages/core/dist/scripts/generate-ascii-face.d.ts +0 -52
  149. package/packages/core/dist/scripts/generate-ascii-face.d.ts.map +0 -1
  150. package/packages/core/dist/scripts/generate-ascii-face.js +0 -155
  151. package/packages/core/dist/scripts/generate-ascii-face.js.map +0 -1
  152. package/packages/core/dist/scripts/generate-face.d.ts +0 -52
  153. package/packages/core/dist/scripts/generate-face.d.ts.map +0 -1
  154. package/packages/core/dist/scripts/generate-face.js +0 -199
  155. package/packages/core/dist/scripts/generate-face.js.map +0 -1
  156. package/packages/core/dist/scripts/generate-face.test.d.ts +0 -13
  157. package/packages/core/dist/scripts/generate-face.test.d.ts.map +0 -1
  158. package/packages/core/dist/scripts/generate-face.test.js +0 -301
  159. package/packages/core/dist/scripts/generate-face.test.js.map +0 -1
  160. package/packages/core/dist/scripts/generate-spider.js.map +0 -1
  161. package/packages/core/dist/scripts/generate-spider.test.js.map +0 -1
  162. package/packages/core/dist/workflow/workflow-loader.test.js.map +0 -1
  163. package/packages/core/dist/workflow/workflow-schema.d.ts.map +0 -1
  164. package/packages/core/dist/workflow/workflow-schema.js +0 -230
  165. package/packages/core/dist/workflow/workflow-schema.js.map +0 -1
  166. package/pennyfarthing-dist/agents/README.md +0 -397
  167. package/pennyfarthing-dist/agents/architect.md +0 -171
  168. package/pennyfarthing-dist/agents/dev.md +0 -225
  169. package/pennyfarthing-dist/agents/devops.md +0 -183
  170. package/pennyfarthing-dist/agents/generic-handoff.md +0 -451
  171. package/pennyfarthing-dist/agents/generic-sm-finish.md +0 -261
  172. package/pennyfarthing-dist/agents/generic-sm-setup.md +0 -214
  173. package/pennyfarthing-dist/agents/orchestrator.md +0 -316
  174. package/pennyfarthing-dist/agents/pm.md +0 -153
  175. package/pennyfarthing-dist/agents/reviewer-preflight.md +0 -224
  176. package/pennyfarthing-dist/agents/reviewer.md +0 -315
  177. package/pennyfarthing-dist/agents/sm-file-summary.md +0 -109
  178. package/pennyfarthing-dist/agents/sm-handoff.md +0 -97
  179. package/pennyfarthing-dist/agents/sm.md +0 -480
  180. package/pennyfarthing-dist/agents/tea.md +0 -191
  181. package/pennyfarthing-dist/agents/tech-writer.md +0 -148
  182. package/pennyfarthing-dist/agents/testing-runner.md +0 -420
  183. package/pennyfarthing-dist/agents/ux-designer.md +0 -158
  184. package/pennyfarthing-dist/agents/workflow-status-check.md +0 -332
  185. package/pennyfarthing-dist/commands/architect.md +0 -62
  186. package/pennyfarthing-dist/commands/benchmark-control.md +0 -69
  187. package/pennyfarthing-dist/commands/benchmark.md +0 -467
  188. package/pennyfarthing-dist/commands/brainstorm.md +0 -91
  189. package/pennyfarthing-dist/commands/check.md +0 -156
  190. package/pennyfarthing-dist/commands/chore.md +0 -178
  191. package/pennyfarthing-dist/commands/close-epic.md +0 -136
  192. package/pennyfarthing-dist/commands/continue-session.md +0 -184
  193. package/pennyfarthing-dist/commands/create-branches-from-story.md +0 -374
  194. package/pennyfarthing-dist/commands/create-theme.md +0 -29
  195. package/pennyfarthing-dist/commands/dev.md +0 -60
  196. package/pennyfarthing-dist/commands/devops.md +0 -59
  197. package/pennyfarthing-dist/commands/git-cleanup.md +0 -340
  198. package/pennyfarthing-dist/commands/health-check.md +0 -108
  199. package/pennyfarthing-dist/commands/help.md +0 -264
  200. package/pennyfarthing-dist/commands/job-fair.md +0 -102
  201. package/pennyfarthing-dist/commands/list-themes.md +0 -17
  202. package/pennyfarthing-dist/commands/new-work.md +0 -127
  203. package/pennyfarthing-dist/commands/orchestrator.md +0 -56
  204. package/pennyfarthing-dist/commands/parallel-work.md +0 -71
  205. package/pennyfarthing-dist/commands/party-mode.md +0 -67
  206. package/pennyfarthing-dist/commands/permissions.md +0 -193
  207. package/pennyfarthing-dist/commands/pm.md +0 -60
  208. package/pennyfarthing-dist/commands/prime.md +0 -140
  209. package/pennyfarthing-dist/commands/release.md +0 -58
  210. package/pennyfarthing-dist/commands/repo-status.md +0 -49
  211. package/pennyfarthing-dist/commands/retro.md +0 -200
  212. package/pennyfarthing-dist/commands/reviewer.md +0 -64
  213. package/pennyfarthing-dist/commands/run-ci.md +0 -116
  214. package/pennyfarthing-dist/commands/set-theme.md +0 -52
  215. package/pennyfarthing-dist/commands/show-theme.md +0 -21
  216. package/pennyfarthing-dist/commands/sm.md +0 -70
  217. package/pennyfarthing-dist/commands/solo.md +0 -411
  218. package/pennyfarthing-dist/commands/sprint-planning.md +0 -109
  219. package/pennyfarthing-dist/commands/start-epic.md +0 -156
  220. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +0 -184
  221. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +0 -376
  222. package/pennyfarthing-dist/commands/tea.md +0 -63
  223. package/pennyfarthing-dist/commands/tech-writer.md +0 -53
  224. package/pennyfarthing-dist/commands/theme-maker.md +0 -671
  225. package/pennyfarthing-dist/commands/update-domain-docs.md +0 -83
  226. package/pennyfarthing-dist/commands/ux-designer.md +0 -62
  227. package/pennyfarthing-dist/commands/work.md +0 -111
  228. package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +0 -480
  229. package/pennyfarthing-dist/guides/AGENT-SCOPES.md +0 -201
  230. package/pennyfarthing-dist/guides/HOOKS.md +0 -230
  231. package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +0 -338
  232. package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +0 -193
  233. package/pennyfarthing-dist/guides/agent-template-strategic.md +0 -148
  234. package/pennyfarthing-dist/guides/agent-template-tactical.md +0 -162
  235. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +0 -746
  236. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +0 -574
  237. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +0 -488
  238. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +0 -402
  239. package/pennyfarthing-dist/guides/permission-protocol.md +0 -188
  240. package/pennyfarthing-dist/guides/persona-loading.md +0 -46
  241. package/pennyfarthing-dist/guides/persona-system.md +0 -294
  242. package/pennyfarthing-dist/guides/shared-agent-behavior.md +0 -388
  243. package/pennyfarthing-dist/guides/shared-context.md +0 -147
  244. package/pennyfarthing-dist/guides/strategic-agent-behavior.md +0 -348
  245. package/pennyfarthing-dist/guides/tactical-agent-behavior.md +0 -1041
  246. package/pennyfarthing-dist/guides/workflow-schema.md +0 -195
  247. package/pennyfarthing-dist/guides/worktree-mode.md +0 -113
  248. package/pennyfarthing-dist/output-styles/teaching.md +0 -33
  249. package/pennyfarthing-dist/output-styles/terse.md +0 -20
  250. package/pennyfarthing-dist/output-styles/verbose.md +0 -28
  251. package/pennyfarthing-dist/personas/themes/1984.yaml +0 -312
  252. package/pennyfarthing-dist/personas/themes/a-team.yaml +0 -207
  253. package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +0 -300
  254. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +0 -330
  255. package/pennyfarthing-dist/personas/themes/all-stars.yaml +0 -332
  256. package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +0 -320
  257. package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +0 -306
  258. package/pennyfarthing-dist/personas/themes/arcane.yaml +0 -288
  259. package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +0 -331
  260. package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +0 -288
  261. package/pennyfarthing-dist/personas/themes/babylon-5.yaml +0 -288
  262. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +0 -288
  263. package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +0 -288
  264. package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +0 -300
  265. package/pennyfarthing-dist/personas/themes/black-sails.yaml +0 -300
  266. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +0 -295
  267. package/pennyfarthing-dist/personas/themes/bobiverse.yaml +0 -288
  268. package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +0 -327
  269. package/pennyfarthing-dist/personas/themes/catch-22.yaml +0 -316
  270. package/pennyfarthing-dist/personas/themes/classical-composers.yaml +0 -310
  271. package/pennyfarthing-dist/personas/themes/control.yaml +0 -197
  272. package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +0 -320
  273. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +0 -323
  274. package/pennyfarthing-dist/personas/themes/deadwood.yaml +0 -300
  275. package/pennyfarthing-dist/personas/themes/dickens.yaml +0 -320
  276. package/pennyfarthing-dist/personas/themes/discworld.yaml +0 -332
  277. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +0 -290
  278. package/pennyfarthing-dist/personas/themes/don-quixote.yaml +0 -320
  279. package/pennyfarthing-dist/personas/themes/dune.yaml +0 -307
  280. package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +0 -320
  281. package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +0 -288
  282. package/pennyfarthing-dist/personas/themes/fargo.yaml +0 -330
  283. package/pennyfarthing-dist/personas/themes/film-auteurs.yaml +0 -312
  284. package/pennyfarthing-dist/personas/themes/firefly.yaml +0 -328
  285. package/pennyfarthing-dist/personas/themes/foundation.yaml +0 -290
  286. package/pennyfarthing-dist/personas/themes/futurama.yaml +0 -321
  287. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +0 -290
  288. package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +0 -243
  289. package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +0 -308
  290. package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +0 -308
  291. package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +0 -330
  292. package/pennyfarthing-dist/personas/themes/hannibal.yaml +0 -300
  293. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +0 -324
  294. package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +0 -291
  295. package/pennyfarthing-dist/personas/themes/historical-figures.yaml +0 -288
  296. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +0 -331
  297. package/pennyfarthing-dist/personas/themes/house-md.yaml +0 -321
  298. package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +0 -289
  299. package/pennyfarthing-dist/personas/themes/inspector-morse.yaml +0 -300
  300. package/pennyfarthing-dist/personas/themes/jane-austen.yaml +0 -287
  301. package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +0 -320
  302. package/pennyfarthing-dist/personas/themes/justified.yaml +0 -300
  303. package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +0 -219
  304. package/pennyfarthing-dist/personas/themes/les-miserables.yaml +0 -299
  305. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +0 -334
  306. package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +0 -334
  307. package/pennyfarthing-dist/personas/themes/mad-max.yaml +0 -355
  308. package/pennyfarthing-dist/personas/themes/mad-men.yaml +0 -289
  309. package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +0 -300
  310. package/pennyfarthing-dist/personas/themes/mash.yaml +0 -334
  311. package/pennyfarthing-dist/personas/themes/mass-effect.yaml +0 -289
  312. package/pennyfarthing-dist/personas/themes/military-commanders.yaml +0 -306
  313. package/pennyfarthing-dist/personas/themes/moby-dick.yaml +0 -320
  314. package/pennyfarthing-dist/personas/themes/monty-python.yaml +0 -303
  315. package/pennyfarthing-dist/personas/themes/neuromancer.yaml +0 -300
  316. package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +0 -329
  317. package/pennyfarthing-dist/personas/themes/parks-and-rec.yaml +0 -242
  318. package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +0 -298
  319. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +0 -220
  320. package/pennyfarthing-dist/personas/themes/renaissance-masters.yaml +0 -320
  321. package/pennyfarthing-dist/personas/themes/rome.yaml +0 -300
  322. package/pennyfarthing-dist/personas/themes/russian-masters.yaml +0 -318
  323. package/pennyfarthing-dist/personas/themes/sandman.yaml +0 -288
  324. package/pennyfarthing-dist/personas/themes/scientific-revolutionaries.yaml +0 -320
  325. package/pennyfarthing-dist/personas/themes/shakespeare.yaml +0 -301
  326. package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +0 -289
  327. package/pennyfarthing-dist/personas/themes/snow-crash.yaml +0 -288
  328. package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +0 -300
  329. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +0 -230
  330. package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +0 -210
  331. package/pennyfarthing-dist/personas/themes/star-wars.yaml +0 -303
  332. package/pennyfarthing-dist/personas/themes/succession.yaml +0 -300
  333. package/pennyfarthing-dist/personas/themes/superfriends.yaml +0 -208
  334. package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +0 -236
  335. package/pennyfarthing-dist/personas/themes/the-americans.yaml +0 -300
  336. package/pennyfarthing-dist/personas/themes/the-crown.yaml +0 -300
  337. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +0 -213
  338. package/pennyfarthing-dist/personas/themes/the-good-place.yaml +0 -322
  339. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +0 -353
  340. package/pennyfarthing-dist/personas/themes/the-odyssey.yaml +0 -300
  341. package/pennyfarthing-dist/personas/themes/the-office.yaml +0 -330
  342. package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +0 -308
  343. package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +0 -300
  344. package/pennyfarthing-dist/personas/themes/the-wire.yaml +0 -311
  345. package/pennyfarthing-dist/personas/themes/the-witcher.yaml +0 -300
  346. package/pennyfarthing-dist/personas/themes/twin-peaks.yaml +0 -302
  347. package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +0 -300
  348. package/pennyfarthing-dist/personas/themes/watchmen.yaml +0 -291
  349. package/pennyfarthing-dist/personas/themes/west-wing.yaml +0 -291
  350. package/pennyfarthing-dist/personas/themes/world-explorers.yaml +0 -320
  351. package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +0 -307
  352. package/pennyfarthing-dist/personas/themes/x-files.yaml +0 -302
  353. package/pennyfarthing-dist/scripts/add-short-names.mjs +0 -264
  354. package/pennyfarthing-dist/scripts/agent-session.sh +0 -367
  355. package/pennyfarthing-dist/scripts/check-context.sh +0 -187
  356. package/pennyfarthing-dist/scripts/check.sh +0 -497
  357. package/pennyfarthing-dist/scripts/deploy.sh +0 -284
  358. package/pennyfarthing-dist/scripts/doctor-dogfood.sh +0 -395
  359. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -61
  360. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -66
  361. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -35
  362. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -166
  363. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -50
  364. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -71
  365. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -54
  366. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -98
  367. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -59
  368. package/pennyfarthing-dist/scripts/install-git-hooks.sh +0 -91
  369. package/pennyfarthing-dist/scripts/prime.sh +0 -161
  370. package/pennyfarthing-dist/scripts/release.sh +0 -198
  371. package/pennyfarthing-dist/scripts/repo-utils.sh +0 -778
  372. package/pennyfarthing-dist/scripts/run-ci.sh +0 -219
  373. package/pennyfarthing-dist/scripts/run.sh +0 -65
  374. package/pennyfarthing-dist/scripts/statusline.sh +0 -264
  375. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -582
  376. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -107
  377. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -597
  378. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -514
  379. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -517
  380. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -331
  381. package/pennyfarthing-dist/scripts/uninstall.sh +0 -271
  382. package/pennyfarthing-dist/scripts/utils/background-tasks.sh +0 -177
  383. package/pennyfarthing-dist/scripts/utils/check-status.sh +0 -251
  384. package/pennyfarthing-dist/scripts/utils/checkpoint.sh +0 -136
  385. package/pennyfarthing-dist/scripts/utils/common.sh +0 -157
  386. package/pennyfarthing-dist/scripts/utils/create-feature-branches.sh +0 -230
  387. package/pennyfarthing-dist/scripts/utils/file-lock.sh +0 -269
  388. package/pennyfarthing-dist/scripts/utils/find-related-work.sh +0 -231
  389. package/pennyfarthing-dist/scripts/utils/find-root.sh +0 -33
  390. package/pennyfarthing-dist/scripts/utils/generate-skill-docs.sh +0 -110
  391. package/pennyfarthing-dist/scripts/utils/git-status-all.sh +0 -127
  392. package/pennyfarthing-dist/scripts/utils/ground-truth-judge.py +0 -289
  393. package/pennyfarthing-dist/scripts/utils/jira/jira-lib.mjs +0 -443
  394. package/pennyfarthing-dist/scripts/utils/jira/jira-sync-story.mjs +0 -208
  395. package/pennyfarthing-dist/scripts/utils/jira/jira-sync.mjs +0 -198
  396. package/pennyfarthing-dist/scripts/utils/jira-claim-story.sh +0 -162
  397. package/pennyfarthing-dist/scripts/utils/jira-lib.sh +0 -463
  398. package/pennyfarthing-dist/scripts/utils/jira-sync-story.sh +0 -8
  399. package/pennyfarthing-dist/scripts/utils/jira-sync.sh +0 -8
  400. package/pennyfarthing-dist/scripts/utils/log-skill-usage.sh +0 -74
  401. package/pennyfarthing-dist/scripts/utils/logging.sh +0 -186
  402. package/pennyfarthing-dist/scripts/utils/repo-scan.sh +0 -141
  403. package/pennyfarthing-dist/scripts/utils/retry.sh +0 -76
  404. package/pennyfarthing-dist/scripts/utils/run-timestamp.sh +0 -7
  405. package/pennyfarthing-dist/scripts/utils/session-cleanup.sh +0 -319
  406. package/pennyfarthing-dist/scripts/utils/skill-usage-report.sh +0 -193
  407. package/pennyfarthing-dist/scripts/utils/sprint-common.sh +0 -286
  408. package/pennyfarthing-dist/scripts/utils/sprint-metrics.sh +0 -241
  409. package/pennyfarthing-dist/scripts/utils/swebench-judge.py +0 -400
  410. package/pennyfarthing-dist/scripts/utils/sync-epic-to-jira.sh +0 -16
  411. package/pennyfarthing-dist/scripts/utils/test-setup.sh +0 -337
  412. package/pennyfarthing-dist/scripts/utils/validate-subagent-frontmatter.sh +0 -160
  413. package/pennyfarthing-dist/scripts/worktree-manager.sh +0 -498
  414. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +0 -236
  415. package/pennyfarthing-dist/skills/changelog/SKILL.md +0 -367
  416. package/pennyfarthing-dist/skills/code-review/SKILL.md +0 -168
  417. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +0 -268
  418. package/pennyfarthing-dist/skills/cyclist/SKILL.md +0 -117
  419. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +0 -421
  420. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +0 -258
  421. package/pennyfarthing-dist/skills/jira/SKILL.md +0 -281
  422. package/pennyfarthing-dist/skills/judge/SKILL.md +0 -524
  423. package/pennyfarthing-dist/skills/just/SKILL.md +0 -160
  424. package/pennyfarthing-dist/skills/mermaid/SKILL.md +0 -240
  425. package/pennyfarthing-dist/skills/otel/skill.md +0 -222
  426. package/pennyfarthing-dist/skills/permissions/skill.md +0 -172
  427. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +0 -173
  428. package/pennyfarthing-dist/skills/skill-registry.schema.json +0 -102
  429. package/pennyfarthing-dist/skills/skill-registry.yaml +0 -335
  430. package/pennyfarthing-dist/skills/sprint-context/SKILL.md +0 -120
  431. package/pennyfarthing-dist/skills/story-management/SKILL.md +0 -208
  432. package/pennyfarthing-dist/skills/testing/SKILL.md +0 -99
  433. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +0 -124
  434. package/pennyfarthing-dist/skills/theme/skill.md +0 -129
  435. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +0 -169
  436. package/pennyfarthing-dist/skills/workflow/SKILL.md +0 -160
  437. package/pennyfarthing-dist/skills/yq/SKILL.md +0 -264
  438. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +0 -187
  439. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +0 -59
  440. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -276
  441. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +0 -61
  442. package/pennyfarthing-dist/templates/persona-config.yaml.template +0 -22
  443. package/pennyfarthing-dist/templates/preferences.yaml.template +0 -15
  444. package/pennyfarthing-dist/templates/settings.local.json.template +0 -90
  445. package/pennyfarthing-dist/templates/setup-env.sh.template +0 -18
  446. package/pennyfarthing-dist/templates/shared-context.md.template +0 -70
  447. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +0 -40
  448. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +0 -37
  449. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +0 -34
  450. package/pennyfarthing-dist/workflows/agent-docs.yaml +0 -70
  451. package/pennyfarthing-dist/workflows/bdd.yaml +0 -58
  452. package/pennyfarthing-dist/workflows/tdd.yaml +0 -50
  453. package/pennyfarthing-dist/workflows/trivial.yaml +0 -40
  454. /package/{packages/core/bin → bin}/pennyfarthing.js +0 -0
  455. /package/{packages/core/dist → dist}/bmad/context-reader.d.ts +0 -0
  456. /package/{packages/core/dist → dist}/bmad/context-reader.d.ts.map +0 -0
  457. /package/{packages/core/dist → dist}/bmad/context-reader.js +0 -0
  458. /package/{packages/core/dist → dist}/bmad/context-reader.js.map +0 -0
  459. /package/{packages/core/dist → dist}/bmad/context-reader.test.d.ts +0 -0
  460. /package/{packages/core/dist → dist}/bmad/context-reader.test.d.ts.map +0 -0
  461. /package/{packages/core/dist → dist}/bmad/context-reader.test.js +0 -0
  462. /package/{packages/core/dist → dist}/bmad/context-reader.test.js.map +0 -0
  463. /package/{packages/core/dist → dist}/bmad/epics-parser.d.ts +0 -0
  464. /package/{packages/core/dist → dist}/bmad/epics-parser.d.ts.map +0 -0
  465. /package/{packages/core/dist → dist}/bmad/epics-parser.js +0 -0
  466. /package/{packages/core/dist → dist}/bmad/epics-parser.js.map +0 -0
  467. /package/{packages/core/dist → dist}/bmad/epics-parser.test.d.ts +0 -0
  468. /package/{packages/core/dist → dist}/bmad/epics-parser.test.d.ts.map +0 -0
  469. /package/{packages/core/dist → dist}/bmad/epics-parser.test.js +0 -0
  470. /package/{packages/core/dist → dist}/bmad/epics-parser.test.js.map +0 -0
  471. /package/{packages/core/dist → dist}/bmad/index.d.ts +0 -0
  472. /package/{packages/core/dist → dist}/bmad/index.d.ts.map +0 -0
  473. /package/{packages/core/dist → dist}/bmad/index.js +0 -0
  474. /package/{packages/core/dist → dist}/bmad/index.js.map +0 -0
  475. /package/{packages/core/dist → dist}/bmad/status-sync.d.ts +0 -0
  476. /package/{packages/core/dist → dist}/bmad/status-sync.d.ts.map +0 -0
  477. /package/{packages/core/dist → dist}/bmad/status-sync.js +0 -0
  478. /package/{packages/core/dist → dist}/bmad/status-sync.js.map +0 -0
  479. /package/{packages/core/dist → dist}/bmad/status-sync.test.d.ts +0 -0
  480. /package/{packages/core/dist → dist}/bmad/status-sync.test.d.ts.map +0 -0
  481. /package/{packages/core/dist → dist}/bmad/status-sync.test.js +0 -0
  482. /package/{packages/core/dist → dist}/bmad/status-sync.test.js.map +0 -0
  483. /package/{packages/core/dist → dist}/bmad/story-exporter.d.ts +0 -0
  484. /package/{packages/core/dist → dist}/bmad/story-exporter.d.ts.map +0 -0
  485. /package/{packages/core/dist → dist}/bmad/story-exporter.js +0 -0
  486. /package/{packages/core/dist → dist}/bmad/story-exporter.js.map +0 -0
  487. /package/{packages/core/dist → dist}/bmad/story-exporter.test.d.ts +0 -0
  488. /package/{packages/core/dist → dist}/bmad/story-exporter.test.d.ts.map +0 -0
  489. /package/{packages/core/dist → dist}/bmad/story-exporter.test.js +0 -0
  490. /package/{packages/core/dist → dist}/bmad/story-exporter.test.js.map +0 -0
  491. /package/{packages/core/dist → dist}/bmad/story-parser.d.ts +0 -0
  492. /package/{packages/core/dist → dist}/bmad/story-parser.d.ts.map +0 -0
  493. /package/{packages/core/dist → dist}/bmad/story-parser.js +0 -0
  494. /package/{packages/core/dist → dist}/bmad/story-parser.js.map +0 -0
  495. /package/{packages/core/dist → dist}/bmad/story-parser.test.d.ts +0 -0
  496. /package/{packages/core/dist → dist}/bmad/story-parser.test.d.ts.map +0 -0
  497. /package/{packages/core/dist → dist}/bmad/story-parser.test.js +0 -0
  498. /package/{packages/core/dist → dist}/bmad/story-parser.test.js.map +0 -0
  499. /package/{packages/core/dist → dist}/cli/commands/command.d.ts +0 -0
  500. /package/{packages/core/dist → dist}/cli/commands/command.d.ts.map +0 -0
  501. /package/{packages/core/dist → dist}/cli/commands/command.js +0 -0
  502. /package/{packages/core/dist → dist}/cli/commands/command.js.map +0 -0
  503. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.d.ts +0 -0
  504. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.d.ts.map +0 -0
  505. /package/{packages/core/dist → dist}/cli/commands/doctor.d.ts +0 -0
  506. /package/{packages/core/dist → dist}/cli/commands/doctor.d.ts.map +0 -0
  507. /package/{packages/core/dist → dist}/cli/commands/doctor.js +0 -0
  508. /package/{packages/core/dist → dist}/cli/commands/doctor.js.map +0 -0
  509. /package/{packages/core/dist → dist}/cli/commands/init.d.ts +0 -0
  510. /package/{packages/core/dist → dist}/cli/commands/init.d.ts.map +0 -0
  511. /package/{packages/core/dist → dist}/cli/commands/init.js +0 -0
  512. /package/{packages/core/dist → dist}/cli/commands/init.js.map +0 -0
  513. /package/{packages/core/dist → dist}/cli/commands/skill.d.ts +0 -0
  514. /package/{packages/core/dist → dist}/cli/commands/skill.d.ts.map +0 -0
  515. /package/{packages/core/dist → dist}/cli/commands/skill.js +0 -0
  516. /package/{packages/core/dist → dist}/cli/commands/skill.js.map +0 -0
  517. /package/{packages/core/dist → dist}/cli/commands/theme.d.ts +0 -0
  518. /package/{packages/core/dist → dist}/cli/commands/theme.d.ts.map +0 -0
  519. /package/{packages/core/dist → dist}/cli/commands/theme.js +0 -0
  520. /package/{packages/core/dist → dist}/cli/commands/theme.js.map +0 -0
  521. /package/{packages/core/dist → dist}/cli/commands/uninstall.d.ts +0 -0
  522. /package/{packages/core/dist → dist}/cli/commands/uninstall.d.ts.map +0 -0
  523. /package/{packages/core/dist → dist}/cli/commands/uninstall.js +0 -0
  524. /package/{packages/core/dist → dist}/cli/commands/uninstall.js.map +0 -0
  525. /package/{packages/core/dist → dist}/cli/commands/update.d.ts +0 -0
  526. /package/{packages/core/dist → dist}/cli/commands/version.d.ts +0 -0
  527. /package/{packages/core/dist → dist}/cli/commands/version.d.ts.map +0 -0
  528. /package/{packages/core/dist → dist}/cli/commands/version.js +0 -0
  529. /package/{packages/core/dist → dist}/cli/commands/version.js.map +0 -0
  530. /package/{packages/core/dist → dist}/cli/customization.test.d.ts +0 -0
  531. /package/{packages/core/dist → dist}/cli/customization.test.d.ts.map +0 -0
  532. /package/{packages/core/dist → dist}/cli/customization.test.js +0 -0
  533. /package/{packages/core/dist → dist}/cli/customization.test.js.map +0 -0
  534. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.d.ts +0 -0
  535. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.d.ts.map +0 -0
  536. /package/{packages/core/dist → dist}/cli/index.d.ts +0 -0
  537. /package/{packages/core/dist → dist}/cli/index.d.ts.map +0 -0
  538. /package/{packages/core/dist → dist}/cli/index.js +0 -0
  539. /package/{packages/core/dist → dist}/cli/index.js.map +0 -0
  540. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.d.ts +0 -0
  541. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.d.ts.map +0 -0
  542. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.js +0 -0
  543. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.js.map +0 -0
  544. /package/{packages/core/dist → dist}/cli/theme-maker.test.d.ts +0 -0
  545. /package/{packages/core/dist → dist}/cli/theme-maker.test.d.ts.map +0 -0
  546. /package/{packages/core/dist → dist}/cli/theme-maker.test.js +0 -0
  547. /package/{packages/core/dist → dist}/cli/theme-maker.test.js.map +0 -0
  548. /package/{packages/core/dist → dist}/cli/utils/files.d.ts +0 -0
  549. /package/{packages/core/dist → dist}/cli/utils/files.d.ts.map +0 -0
  550. /package/{packages/core/dist → dist}/cli/utils/files.js +0 -0
  551. /package/{packages/core/dist → dist}/cli/utils/files.js.map +0 -0
  552. /package/{packages/core/dist → dist}/cli/utils/logger.d.ts +0 -0
  553. /package/{packages/core/dist → dist}/cli/utils/logger.d.ts.map +0 -0
  554. /package/{packages/core/dist → dist}/cli/utils/logger.js +0 -0
  555. /package/{packages/core/dist → dist}/cli/utils/logger.js.map +0 -0
  556. /package/{packages/core/dist → dist}/cli/utils/manifest.d.ts +0 -0
  557. /package/{packages/core/dist → dist}/cli/utils/manifest.d.ts.map +0 -0
  558. /package/{packages/core/dist → dist}/cli/utils/manifest.js +0 -0
  559. /package/{packages/core/dist → dist}/cli/utils/manifest.js.map +0 -0
  560. /package/{packages/core/dist → dist}/cli/utils/node-modules.d.ts +0 -0
  561. /package/{packages/core/dist → dist}/cli/utils/node-modules.d.ts.map +0 -0
  562. /package/{packages/core/dist → dist}/cli/utils/node-modules.js +0 -0
  563. /package/{packages/core/dist → dist}/cli/utils/node-modules.js.map +0 -0
  564. /package/{packages/core/dist → dist}/cli/utils/prompts.d.ts +0 -0
  565. /package/{packages/core/dist → dist}/cli/utils/prompts.d.ts.map +0 -0
  566. /package/{packages/core/dist → dist}/cli/utils/prompts.js +0 -0
  567. /package/{packages/core/dist → dist}/cli/utils/prompts.js.map +0 -0
  568. /package/{packages/core/dist → dist}/cli/utils/symlinks.d.ts +0 -0
  569. /package/{packages/core/dist → dist}/cli/utils/symlinks.d.ts.map +0 -0
  570. /package/{packages/core/dist → dist}/cli/utils/symlinks.js +0 -0
  571. /package/{packages/core/dist → dist}/cli/utils/symlinks.js.map +0 -0
  572. /package/{packages/core/dist → dist}/cli/utils/themes.test.d.ts.map +0 -0
  573. /package/{packages/core/dist → dist}/cli/utils/version.d.ts +0 -0
  574. /package/{packages/core/dist → dist}/cli/utils/version.d.ts.map +0 -0
  575. /package/{packages/core/dist → dist}/cli/utils/version.js +0 -0
  576. /package/{packages/core/dist → dist}/cli/utils/version.js.map +0 -0
  577. /package/{packages/core/dist → dist}/cli/workspace.test.d.ts +0 -0
  578. /package/{packages/core/dist → dist}/cli/workspace.test.d.ts.map +0 -0
  579. /package/{packages/core/dist → dist}/permissions/index.d.ts +0 -0
  580. /package/{packages/core/dist → dist}/permissions/index.d.ts.map +0 -0
  581. /package/{packages/core/dist → dist}/permissions/index.js +0 -0
  582. /package/{packages/core/dist → dist}/permissions/index.js.map +0 -0
  583. /package/{packages/core/dist → dist}/permissions/permission-schema.d.ts +0 -0
  584. /package/{packages/core/dist → dist}/permissions/permission-schema.d.ts.map +0 -0
  585. /package/{packages/core/dist → dist}/permissions/permission-schema.js +0 -0
  586. /package/{packages/core/dist → dist}/permissions/permission-schema.js.map +0 -0
  587. /package/{packages/core/dist → dist}/permissions/permission-schema.test.d.ts +0 -0
  588. /package/{packages/core/dist → dist}/permissions/permission-schema.test.d.ts.map +0 -0
  589. /package/{packages/core/dist → dist}/permissions/permission-schema.test.js +0 -0
  590. /package/{packages/core/dist → dist}/permissions/permission-schema.test.js.map +0 -0
  591. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.d.ts +0 -0
  592. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.d.ts.map +0 -0
  593. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.js +0 -0
  594. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.js.map +0 -0
  595. /package/{packages/core/dist → dist}/scripts/benchmark-integration.d.ts +0 -0
  596. /package/{packages/core/dist → dist}/scripts/benchmark-integration.d.ts.map +0 -0
  597. /package/{packages/core/dist → dist}/scripts/benchmark-integration.js +0 -0
  598. /package/{packages/core/dist → dist}/scripts/benchmark-integration.js.map +0 -0
  599. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.d.ts +0 -0
  600. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.d.ts.map +0 -0
  601. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.js +0 -0
  602. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.js.map +0 -0
  603. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.d.ts +0 -0
  604. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.d.ts.map +0 -0
  605. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.js +0 -0
  606. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.js.map +0 -0
  607. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.d.ts +0 -0
  608. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.d.ts.map +0 -0
  609. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.js +0 -0
  610. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.js.map +0 -0
  611. /package/{packages/core/dist → dist}/scripts/generate-report.d.ts +0 -0
  612. /package/{packages/core/dist → dist}/scripts/generate-report.d.ts.map +0 -0
  613. /package/{packages/core/dist → dist}/scripts/generate-report.js +0 -0
  614. /package/{packages/core/dist → dist}/scripts/generate-report.js.map +0 -0
  615. /package/{packages/core/dist → dist}/scripts/generate-report.test.d.ts +0 -0
  616. /package/{packages/core/dist → dist}/scripts/generate-report.test.d.ts.map +0 -0
  617. /package/{packages/core/dist → dist}/scripts/generate-report.test.js +0 -0
  618. /package/{packages/core/dist → dist}/scripts/generate-report.test.js.map +0 -0
  619. /package/{packages/core/dist → dist}/scripts/generate-spider-report.d.ts +0 -0
  620. /package/{packages/core/dist → dist}/scripts/generate-spider-report.d.ts.map +0 -0
  621. /package/{packages/core/dist → dist}/scripts/generate-spider-report.js +0 -0
  622. /package/{packages/core/dist → dist}/scripts/generate-spider-report.js.map +0 -0
  623. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.d.ts +0 -0
  624. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.d.ts.map +0 -0
  625. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.js +0 -0
  626. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.js.map +0 -0
  627. /package/{packages/core/dist → dist}/scripts/generate-spider.test.d.ts +0 -0
  628. /package/{packages/core/dist → dist}/scripts/generate-spider.test.d.ts.map +0 -0
  629. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.d.ts +0 -0
  630. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.d.ts.map +0 -0
  631. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.js +0 -0
  632. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.js.map +0 -0
  633. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.d.ts +0 -0
  634. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.d.ts.map +0 -0
  635. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.js +0 -0
  636. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.js.map +0 -0
  637. /package/{packages/core/dist → dist}/scripts/run-ci.test.d.ts +0 -0
  638. /package/{packages/core/dist → dist}/scripts/run-ci.test.d.ts.map +0 -0
  639. /package/{packages/core/dist → dist}/scripts/run-ci.test.js +0 -0
  640. /package/{packages/core/dist → dist}/scripts/run-ci.test.js.map +0 -0
  641. /package/{packages/core/dist → dist}/scripts/theme-detail.test.d.ts +0 -0
  642. /package/{packages/core/dist → dist}/scripts/theme-detail.test.d.ts.map +0 -0
  643. /package/{packages/core/dist → dist}/scripts/theme-detail.test.js +0 -0
  644. /package/{packages/core/dist → dist}/scripts/theme-detail.test.js.map +0 -0
  645. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.d.ts +0 -0
  646. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.d.ts.map +0 -0
  647. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.js +0 -0
  648. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.js.map +0 -0
  649. /package/{packages/core/dist → dist}/workflow/generic-handoff.test.d.ts +0 -0
  650. /package/{packages/core/dist → dist}/workflow/generic-handoff.test.d.ts.map +0 -0
  651. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.d.ts +0 -0
  652. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.d.ts.map +0 -0
  653. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.js +0 -0
  654. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.js.map +0 -0
  655. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.d.ts +0 -0
  656. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.d.ts.map +0 -0
  657. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.js +0 -0
  658. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.js.map +0 -0
  659. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.d.ts +0 -0
  660. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.d.ts.map +0 -0
  661. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.js +0 -0
  662. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.js.map +0 -0
  663. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.d.ts +0 -0
  664. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.d.ts.map +0 -0
  665. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.js +0 -0
  666. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.js.map +0 -0
  667. /package/{packages/core/dist → dist}/workflow/test-cache.d.ts +0 -0
  668. /package/{packages/core/dist → dist}/workflow/test-cache.d.ts.map +0 -0
  669. /package/{packages/core/dist → dist}/workflow/test-cache.js +0 -0
  670. /package/{packages/core/dist → dist}/workflow/test-cache.js.map +0 -0
  671. /package/{packages/core/dist → dist}/workflow/test-cache.test.d.ts +0 -0
  672. /package/{packages/core/dist → dist}/workflow/test-cache.test.d.ts.map +0 -0
  673. /package/{packages/core/dist → dist}/workflow/test-cache.test.js +0 -0
  674. /package/{packages/core/dist → dist}/workflow/test-cache.test.js.map +0 -0
  675. /package/{packages/core/dist → dist}/workflow/workflow-loader.d.ts +0 -0
  676. /package/{packages/core/dist → dist}/workflow/workflow-loader.d.ts.map +0 -0
  677. /package/{packages/core/dist → dist}/workflow/workflow-loader.js +0 -0
  678. /package/{packages/core/dist → dist}/workflow/workflow-loader.js.map +0 -0
  679. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.d.ts +0 -0
  680. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.d.ts.map +0 -0
  681. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.d.ts +0 -0
  682. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.d.ts.map +0 -0
  683. /package/{packages/core/dist → dist}/workflow/workflow-router.d.ts +0 -0
  684. /package/{packages/core/dist → dist}/workflow/workflow-router.d.ts.map +0 -0
  685. /package/{packages/core/dist → dist}/workflow/workflow-router.js +0 -0
  686. /package/{packages/core/dist → dist}/workflow/workflow-router.js.map +0 -0
  687. /package/{packages/core/dist → dist}/workflow/workflow-router.test.d.ts +0 -0
  688. /package/{packages/core/dist → dist}/workflow/workflow-router.test.d.ts.map +0 -0
  689. /package/{packages/core/dist → dist}/workflow/workflow-router.test.js +0 -0
  690. /package/{packages/core/dist → dist}/workflow/workflow-router.test.js.map +0 -0
  691. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.d.ts +0 -0
  692. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.d.ts.map +0 -0
@@ -1,1041 +0,0 @@
1
- # Tactical Agent Behavior (Shared)
2
-
3
- **This file defines common behavior for tactical agents (SM, TEA, Dev, Reviewer).**
4
-
5
- Auto-loaded by `/prime --agent <name>` for tactical agents only.
6
-
7
- Tactical agents work on story-scoped tasks within the TDD flow: SM → TEA → Dev → Reviewer
8
-
9
- ---
10
-
11
- ## Critical Pattern: Bash Tool with Absolute Paths
12
-
13
- ⚠️ **ALL tactical agents must follow this pattern when using the Bash tool.**
14
-
15
- ### The Problem
16
-
17
- The Bash tool maintains a persistent working directory across calls, but relative `cd` commands fail when already in a different directory. This is the #1 source of frustration and wasted time.
18
-
19
- **Symptoms:**
20
- - `cd API && just test` fails with "no such file or directory: API"
21
- - Already in `API` but trying to `cd API` again
22
- - Commands fail because assuming wrong directory
23
-
24
- ### The Solution: Always Use Absolute Paths
25
-
26
- 1. **At session start, use the PROJECT_ROOT from the `<env>` block:**
27
- ```
28
- Working directory: $CLAUDE_PROJECT_DIR
29
- ```
30
- This is your absolute reference point!
31
-
32
- 2. **Always use absolute paths for cd:**
33
- ```bash
34
- # WRONG - relative cd fails if you're already somewhere else
35
- cd myrepo && just test
36
-
37
- # CORRECT - absolute path always works
38
- cd $CLAUDE_PROJECT_DIR && just test
39
- ```
40
-
41
- 3. **Best Practice - Explicit cd in every Bash call that needs a specific directory:**
42
- ```bash
43
- # Single repo project
44
- cd $CLAUDE_PROJECT_DIR && git push -u origin feat/branch
45
- cd $CLAUDE_PROJECT_DIR && just test
46
-
47
- # Multi-repo project (use repo-utils.sh)
48
- source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
49
- for repo in $(get_repo_names); do
50
- cd $CLAUDE_PROJECT_DIR/$(get_repo_path "$repo") && $(get_test_command "$repo")
51
- done
52
- ```
53
-
54
- ### Why This Works
55
-
56
- - Absolute paths work from ANY directory
57
- - No need to track where you are
58
- - Explicit `cd` in every command that needs it = no confusion
59
- - The `&&` ensures the command only runs if cd succeeds
60
-
61
- ---
62
-
63
- ## Single-Repo Projects
64
-
65
- For projects where Pennyfarthing is installed directly in the repo (not as an orchestrator):
66
-
67
- ### Configuration
68
-
69
- ```yaml
70
- # .claude/project/repos.yaml
71
- repos:
72
- my-project:
73
- path: . # "." means project root IS the repo
74
- type: service # or: api, ui, cli, lib, monorepo
75
- language: go # or: typescript, python, rust, etc.
76
- test_command: just test
77
- build_command: just build
78
- lint_command: just lint
79
- ```
80
-
81
- ### Key Differences from Multi-Repo
82
-
83
- | Aspect | Multi-Repo | Single-Repo |
84
- |--------|------------|-------------|
85
- | `path` | `api/`, `ui/` | `.` (project root) |
86
- | Branches | One per repo | One branch total |
87
- | PRs | Multiple PRs | Single PR |
88
- | `cd` pattern | `cd $PROJECT_ROOT/$repo_path` | `cd $PROJECT_ROOT` |
89
-
90
- ### Commands Still Work
91
-
92
- The same repo-utils functions work — they just iterate over one repo:
93
-
94
- ```bash
95
- source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
96
-
97
- # Returns single repo name
98
- get_repos # → "my-project"
99
-
100
- # Path is "." so this works:
101
- cd $CLAUDE_PROJECT_DIR/$(get_repo_path "my-project")
102
- # Equivalent to: cd $CLAUDE_PROJECT_DIR/.
103
-
104
- # Test command
105
- $(get_test_command "my-project") # → "just test"
106
- ```
107
-
108
- ### Simplified Patterns
109
-
110
- For single-repo, you can also just work directly:
111
-
112
- ```bash
113
- # Direct approach (single-repo only)
114
- cd $CLAUDE_PROJECT_DIR && just test
115
- cd $CLAUDE_PROJECT_DIR && just build
116
-
117
- # Still works with repo-utils (recommended for consistency)
118
- for repo in $(get_repos); do
119
- cd $CLAUDE_PROJECT_DIR/$(get_repo_path "$repo")
120
- eval "$(get_test_command "$repo")"
121
- done
122
- ```
123
-
124
- ---
125
-
126
- ## Multi-Repo Operations
127
-
128
- For projects with multiple repositories, use `repo-utils.sh` for dynamic iteration.
129
-
130
- ### Loading Repo Configuration
131
-
132
- ```bash
133
- source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
134
-
135
- # Check configuration mode
136
- if is_legacy_mode; then
137
- echo "Using legacy API_REPO/UI_REPO mode"
138
- else
139
- echo "Using repos.yaml configuration"
140
- fi
141
-
142
- # Show current configuration
143
- show_config
144
- ```
145
-
146
- ### Iterating Through Repos
147
-
148
- ```bash
149
- source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
150
-
151
- # All repos
152
- for repo in $(get_repos); do
153
- repo_path=$(get_repo_path "$repo")
154
- repo_type=$(get_repo_type "$repo")
155
-
156
- echo "=== $repo ($repo_type) ==="
157
- cd $CLAUDE_PROJECT_DIR/$repo_path
158
- git status --short
159
- done
160
-
161
- # Filter by type (api, ui, adapter, service, shared, lib)
162
- for repo in $(get_repos_of_type "api"); do
163
- cd $CLAUDE_PROJECT_DIR/$(get_repo_path "$repo")
164
- # API-specific operations
165
- done
166
-
167
- # Build order (respects dependencies)
168
- for repo in $(get_build_order); do
169
- cd $CLAUDE_PROJECT_DIR/$(get_repo_path "$repo")
170
- eval "$(get_build_command "$repo")"
171
- done
172
- ```
173
-
174
- ### Getting Repo Information
175
-
176
- ```bash
177
- source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
178
-
179
- # For a specific repo
180
- repo="conductor-api"
181
- get_repo_path "$repo" # conductor-api
182
- get_repo_type "$repo" # api
183
- get_repo_language "$repo" # go
184
- get_test_command "$repo" # just test
185
- get_build_command "$repo" # just build
186
- get_lint_command "$repo" # golangci-lint run
187
- get_dependencies "$repo" # comma-separated list or empty
188
- ```
189
-
190
- ### Running Tests Across Repos
191
-
192
- ```bash
193
- source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
194
-
195
- # Run tests in all repos
196
- run_all_tests
197
-
198
- # Run tests for specific type
199
- run_tests_of_type "api"
200
-
201
- # Manual iteration with custom logic
202
- for repo in $(get_repos); do
203
- test_cmd=$(get_test_command "$repo")
204
- if [ -n "$test_cmd" ]; then
205
- cd $CLAUDE_PROJECT_DIR/$(get_repo_path "$repo")
206
- eval "$test_cmd" 2>&1 | tee $CLAUDE_PROJECT_DIR/.session/test-${STORY_ID}-${repo}.log
207
- fi
208
- done
209
- ```
210
-
211
- ### Filtering Repos by Session Scope
212
-
213
- ```bash
214
- source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
215
-
216
- # Extract scope from session file
217
- REPOS=$(grep "^\*\*Repos:\*\*" $SESSION_FILE | cut -d: -f2 | xargs)
218
-
219
- # filter_repos handles: all, both, api, ui, adapter, or comma-separated names
220
- for repo in $(filter_repos "$REPOS"); do
221
- # Work on this repo
222
- done
223
- ```
224
-
225
- ---
226
-
227
- ## Skill References for Subagents
228
-
229
- When spawning subagents that need specialized knowledge, reference the appropriate skill file in the prompt:
230
-
231
- ### Testing
232
- ```
233
- Read the testing skill at .claude/skills/testing/SKILL.md for test commands.
234
- For troubleshooting, see .claude/skills/testing/references/troubleshooting.md
235
- ```
236
-
237
- ### Just Commands
238
- ```
239
- Read the just skill at .claude/skills/just/SKILL.md for available commands.
240
- ```
241
-
242
- ### Code Patterns
243
- ```
244
- Read .claude/skills/dev-patterns/SKILL.md for common patterns and fixes.
245
- ```
246
-
247
- **Why this matters:** Subagents don't automatically load skills. Including the skill reference in the prompt ensures they have access to project-specific commands and patterns.
248
-
249
- ---
250
-
251
- ### For Worktrees
252
-
253
- Same pattern - use absolute paths:
254
- ```bash
255
- # WRONG
256
- cd worktrees/11-2/myrepo && just test
257
-
258
- # CORRECT (single-repo)
259
- cd $CLAUDE_PROJECT_DIR/worktrees/11-2 && just test
260
-
261
- # CORRECT (multi-repo with dynamic lookup)
262
- WORKTREE="$CLAUDE_PROJECT_DIR/worktrees/11-2"
263
- source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
264
- cd $WORKTREE/$(get_repo_path "myrepo") && just test
265
- ```
266
-
267
- ---
268
-
269
- ## On Activation (All Tactical Agents)
270
-
271
- Every tactical agent MUST perform these steps on activation:
272
-
273
- ### Step 1: Check for Active Work
274
-
275
- **Session File Naming Convention:**
276
- - Pattern: `.session/{story-id}-session.md`
277
- - Examples: `2-1-session.md`, `5-3a-session.md`, `epic-4-session.md`
278
- - Story ID matches sprint YAML (e.g., story `id: "2-1"` → `2-1-session.md`)
279
-
280
- ```bash
281
- cd $CLAUDE_PROJECT_DIR
282
-
283
- # Find ALL session files
284
- SESSIONS=($(ls .session/*-session.md 2>/dev/null))
285
-
286
- # Each session is named after its story ID
287
- # e.g., 2-1-session.md, 5-3a-session.md
288
- ```
289
-
290
- ### Step 2: Handle Multiple Sessions
291
-
292
- If multiple sessions exist, check which are relevant to this agent:
293
-
294
- ```bash
295
- cd $CLAUDE_PROJECT_DIR
296
-
297
- # Find sessions relevant to this agent based on Phase
298
- MY_SESSIONS=()
299
- for f in .session/*-session.md; do
300
- PHASE=$(grep "^\*\*Phase:\*\*" "$f" | sed 's/.*\*\* //')
301
- case "$AGENT_TYPE" in
302
- sm) [[ "$PHASE" =~ ^(sm-setup|approved)$ ]] && MY_SESSIONS+=("$f") ;;
303
- tea) [[ "$PHASE" == "tea" ]] && MY_SESSIONS+=("$f") ;;
304
- dev) [[ "$PHASE" == "dev" ]] && MY_SESSIONS+=("$f") ;;
305
- reviewer) [[ "$PHASE" == "review" ]] && MY_SESSIONS+=("$f") ;;
306
- esac
307
- done
308
- ```
309
-
310
- **If multiple relevant sessions exist, ask:**
311
- ```
312
- Multiple sessions need my attention:
313
- - 2-1-session.md (Phase: dev) - Story 2-1: Add logging
314
- - 5-3a-session.md (Phase: dev) - Story 5-3a: Fix auth bug
315
-
316
- Which session should I work on?
317
- ```
318
-
319
- **Detecting worktree context from session file content:**
320
- ```bash
321
- # Read worktree info from session file (if present)
322
- if grep -q "^worktree:" "$SESSION_FILE"; then
323
- WORKTREE_NAME=$(grep "^worktree:" "$SESSION_FILE" | cut -d' ' -f2)
324
- WORKTREE_PATH=$(grep "^path:" "$SESSION_FILE" | cut -d' ' -f2)
325
- fi
326
- ```
327
-
328
- See `pennyfarthing-dist/guides/worktree-mode.md` for complete worktree documentation.
329
-
330
- ### Step 3: Check Phase and Handoff Status
331
-
332
- Read the selected session file and parse:
333
- - **Phase:** field (sm, tea, dev, review, approved) - PRIMARY handoff indicator
334
- - **Status:** field (e.g., `in-progress`, `review`)
335
- - **Feature Branch:** field for branch name
336
- - **Repos:** field to determine which repos are affected
337
- - **Scope:** field (backend/frontend/both) - determines which test patterns to use
338
-
339
- **Phase Values (for handoff detection):**
340
- | Phase | Current Agent | Next Agent |
341
- |-------|---------------|------------|
342
- | `sm` | SM setting up | TEA |
343
- | `tea` | TEA writing tests | Dev |
344
- | `dev` | Dev implementing | Reviewer |
345
- | `review` | Reviewer reviewing | SM (if approved) or Dev (if rejected) |
346
- | `approved` | Ready for finish | SM |
347
-
348
- ```bash
349
- # Extract scope from session file
350
- SCOPE=$(grep "^\*\*Scope:\*\*" $SESSION_FILE | cut -d: -f2 | xargs | tr '[:upper:]' '[:lower:]')
351
-
352
- # If scope not in session file, derive from repos
353
- if [ -z "$SCOPE" ]; then
354
- REPOS=$(grep "^\*\*Repos:\*\*" $SESSION_FILE | cut -d: -f2 | xargs | tr '[:upper:]' '[:lower:]')
355
- case "$REPOS" in
356
- api) SCOPE="backend" ;;
357
- ui) SCOPE="frontend" ;;
358
- *) SCOPE="both" ;;
359
- esac
360
- fi
361
- ```
362
-
363
- ### Step 4: Verify Actual State (CRITICAL)
364
-
365
- **MANDATORY:** Before offering to start work, verify the actual state matches the session file.
366
-
367
- ```bash
368
- cd $CLAUDE_PROJECT_DIR
369
-
370
- # Check for uncommitted work in affected repos
371
- REPOS=$(grep "^\*\*Repos:\*\*" $SESSION_FILE | cut -d: -f2 | xargs | tr '[:upper:]' '[:lower:]')
372
-
373
- case "$REPOS" in
374
- *api*)
375
- echo "=== API Status ==="
376
- cd API && git status --short
377
- cd ..
378
- ;;
379
- esac
380
-
381
- case "$REPOS" in
382
- *ui*)
383
- echo "=== UI Status ==="
384
- cd UI && git status --short
385
- cd ..
386
- ;;
387
- esac
388
- ```
389
-
390
- **If uncommitted changes exist:**
391
- 1. Report them to the user immediately
392
- 2. Ask: "Session file says [status] but I found uncommitted work. What should I do?"
393
- 3. Options: commit & continue, discard, or investigate
394
-
395
- **If implementing (Dev agent), also verify test state:**
396
- ```bash
397
- # Run tests to confirm actual RED/GREEN state
398
- cd API && just test ./... 2>&1 | tail -5
399
- cd ../UI && npm test -- --run 2>&1 | tail -10
400
- ```
401
-
402
- **If test state differs from session file:**
403
- 1. Report: "Session says RED but tests are GREEN" (or vice versa)
404
- 2. Update session file to reflect reality
405
- 3. Offer appropriate next action
406
-
407
- **Why this matters:** Session files can become stale if a previous session crashed, was interrupted, or forgot to update. Always trust `git status` and test results over documentation.
408
-
409
- ---
410
-
411
- ### Step 5: Create/Checkout Feature Branches
412
-
413
- **MANDATORY:** All tactical agents must ensure they're on the correct branches before starting work.
414
-
415
- ```bash
416
- cd $CLAUDE_PROJECT_DIR
417
-
418
- # Extract from session file
419
- BRANCH=$(grep "Feature Branch:" $SESSION_FILE | cut -d: -f2 | xargs)
420
- REPOS=$(grep "Repos:" $SESSION_FILE | cut -d: -f2 | xargs | tr '[:upper:]' '[:lower:]')
421
-
422
- # Map repo field to script parameter
423
- # "API" → "api", "UI" → "ui", "Both" → "all", etc.
424
- case "$REPOS" in
425
- *api*ui* | *ui*api* | both) REPOS="all" ;;
426
- *api*) REPOS="api" ;;
427
- *ui*) REPOS="ui" ;;
428
- *sim-ui*) REPOS="sim-ui" ;;
429
- *sim*) REPOS="sim" ;;
430
- *) REPOS="all" ;; # Default to all if unclear
431
- esac
432
-
433
- # Create or checkout branches (idempotent, includes verification)
434
- ./scripts/run.sh create-feature-branches.sh "$BRANCH" "$REPOS"
435
- ```
436
-
437
- **What this does:**
438
- - ✅ Creates branches if they don't exist (from develop)
439
- - ✅ Checks out existing branches if they do exist
440
- - ✅ Verifies branches are correct
441
- - ✅ Shows sync status with remote
442
- - ✅ Works in both main checkout and worktrees
443
-
444
- **Never skip this step.** It ensures consistency across all agents in the TDD flow.
445
-
446
- ### Step 6: Offer to Start if Handed Off
447
-
448
- If this agent is the "Next Agent", offer to start immediately:
449
-
450
- | Agent | Match Pattern | Action |
451
- |-------|---------------|--------|
452
- | TEA | `Next Agent: TEA` or `Next Agent: Igor` | Offer to write tests |
453
- | Dev | `Next Agent: Dev` or `Next Agent: Ponder` | Offer to implement |
454
- | Reviewer | `Next Agent: Reviewer` or `Next Agent: Granny` or status=`review` | Offer to review |
455
-
456
- **Offer format:**
457
- ```
458
- I see [Story ID] is ready for [my task].
459
- The handoff indicates I'm next.
460
-
461
- **Story:** [title]
462
- **Phase:** [current] → [next]
463
- **Location:** [main checkout | worktrees/{name}]
464
-
465
- Say 'yes' to start, or ask me something else.
466
- ```
467
-
468
- ### Step 7: If Not Handed Off
469
-
470
- Show the agent's task menu and wait for selection.
471
-
472
- ## Session File Location
473
-
474
- Tactical agents work with session files named after story IDs:
475
-
476
- | Pattern | Example | Description |
477
- |---------|---------|-------------|
478
- | `{story-id}-session.md` | `2-1-session.md` | Story 2-1 from sprint |
479
- | `{story-id}-session.md` | `5-3a-session.md` | Story 5-3a (worktree variant) |
480
- | `epic-{id}-session.md` | `epic-4-session.md` | Epic-level work |
481
-
482
- **Discovery:** `ls .session/*-session.md`
483
- **Traceability:** Story ID → `sprint/current-sprint.yaml`
484
-
485
- **For worktree sessions, check the Worktree Context section:**
486
- ```yaml
487
- ## Worktree Context
488
- worktree: wt-5-3a
489
- path: /path/to/worktrees/wt-5-3a
490
- api_port: 8082
491
- ui_port: 5175
492
- ```
493
-
494
- **Always check the session file for:**
495
- - `Phase:` field to determine whose turn it is (sm, tea, dev, review, approved)
496
- - `Workflow:` field to know which workflow is active (tdd, trivial, etc.)
497
- - `Phase Started:` field for when the current phase began (ISO 8601)
498
- - `Repos:` field to know which subrepos to work in
499
- - `Feature Branch:` field for branch names
500
- - `worktree:` field if working in a worktree (use `path:` for commands)
501
-
502
- ## Workflow Tracking Section
503
-
504
- Every session file includes a `## Workflow Tracking` section that tracks workflow state and phase history:
505
-
506
- ```markdown
507
- ## Workflow Tracking
508
- **Workflow:** tdd
509
- **Phase:** dev
510
- **Phase Started:** 2026-01-13T14:30:00Z
511
-
512
- ### Phase History
513
- | Phase | Started | Ended | Duration |
514
- |-------|---------|-------|----------|
515
- | sm | 2026-01-13T14:00:00Z | 2026-01-13T14:15:00Z | 15m |
516
- | tea | 2026-01-13T14:15:00Z | 2026-01-13T14:30:00Z | 15m |
517
- | dev | 2026-01-13T14:30:00Z | - | - |
518
- ```
519
-
520
- **Field extraction (grep-friendly):**
521
- ```bash
522
- # Extract workflow name (defaults to "tdd" if missing for backward compatibility)
523
- WORKFLOW=$(grep "^\*\*Workflow:\*\*" "$SESSION_FILE" | head -1 | sed 's/\*\*Workflow:\*\* //' | xargs)
524
- [ -z "$WORKFLOW" ] && WORKFLOW="tdd"
525
-
526
- # Extract current phase
527
- PHASE=$(grep "^\*\*Phase:\*\*" "$SESSION_FILE" | head -1 | sed 's/\*\*Phase:\*\* //' | xargs)
528
-
529
- # Extract phase started timestamp
530
- PHASE_STARTED=$(grep "^\*\*Phase Started:\*\*" "$SESSION_FILE" | head -1 | sed 's/\*\*Phase Started:\*\* //' | xargs)
531
- ```
532
-
533
- **On phase transition:** Handoff subagents update this section:
534
- 1. Set previous phase's Ended timestamp and calculate Duration
535
- 2. Update `**Phase:**` to new phase name
536
- 3. Update `**Phase Started:**` to current timestamp
537
- 4. Add new row to Phase History table
538
-
539
- ## Phase Assessment Templates (MANDATORY)
540
-
541
- Each agent MUST document their work using the structured template for their phase. This is what makes handoffs reliable.
542
-
543
- ### SM Assessment Template
544
- ```markdown
545
- ## SM Assessment
546
-
547
- **Story:** {ID} - {title}
548
- **Points:** {N} | **Priority:** {P0/P1/P2}
549
- **Repos:** api | ui | both
550
- **Branch:** feat/{story-id}-{description}
551
-
552
- **Acceptance Criteria:**
553
- - [ ] AC1: {criterion}
554
- - [ ] AC2: {criterion}
555
-
556
- **Technical Notes:** {any context Dev/TEA needs}
557
- **Jira:** {MSSCI-XXXX} (claimed)
558
-
559
- **Handoff:** To TEA for test writing
560
- ```
561
- **Handoff phrase:** "TEA, Story X-Y is ready. Write failing tests for these ACs."
562
-
563
- ---
564
-
565
- ### TEA Assessment Template
566
- ```markdown
567
- ## TEA Assessment
568
-
569
- **Tests Required:** Yes | No
570
- **Reason:** {if No: documentation/config/dependency update}
571
-
572
- **Test Files:** (if Yes)
573
- - `path/to/test_file.go` - {description}
574
- - `path/to/component.test.tsx` - {description}
575
-
576
- **Tests Written:** {N} tests covering {M} ACs
577
- **Status:** RED (failing - ready for Dev)
578
-
579
- **Handoff:** To Dev for implementation
580
- ```
581
- **Handoff phrase:** "Dev, tests are RED and ready. Make them GREEN."
582
-
583
- ---
584
-
585
- ### Dev Assessment Template
586
- ```markdown
587
- ## Dev Assessment
588
-
589
- **Implementation Complete:** Yes
590
- **Files Changed:**
591
- - `path/to/file.go` - {description}
592
- - `path/to/Component.tsx` - {description}
593
-
594
- **Tests:** {N}/{N} passing (GREEN)
595
- **PR:** #{number} - {title}
596
- **Branch:** {branch-name} (pushed)
597
-
598
- **Handoff:** To Reviewer for code review
599
- ```
600
- **Handoff phrase:** "Reviewer, PR #{N} is ready. All tests GREEN."
601
-
602
- ---
603
-
604
- ### Reviewer Assessment Template
605
- ```markdown
606
- ## Reviewer Assessment
607
-
608
- **PR:** #{number}
609
- **Verdict:** APPROVED | REJECTED
610
-
611
- **If APPROVED:**
612
- **Quality:** Tests comprehensive, code follows patterns
613
- **Handoff:** To SM for finish-story workflow
614
-
615
- **If REJECTED:**
616
- **Issues Found:**
617
- - {severity}: {issue} → {fix required}
618
- - {severity}: {issue} → {fix required}
619
-
620
- **Handoff:** Back to Dev for fixes
621
- ```
622
- **Handoff phrase (approved):** "SM, Story X-Y is approved and ready to be finished."
623
- **Handoff phrase (rejected):** "Dev, {N} issues found. See assessment for details."
624
-
625
- ---
626
-
627
- ## Session File Update (MANDATORY Before Handoff)
628
-
629
- > **🚨 CRITICAL: WRITE BEFORE YOU OFFER**
630
- >
631
- > The #1 handoff failure is offering to hand off before writing the assessment to disk.
632
- > Never say "Ready for Reviewer" or "Ready for Dev" until YOU have written YOUR assessment.
633
- > The subagent does NOT write the assessment - YOU do.
634
-
635
- ### The Correct Handoff Sequence
636
-
637
- ```
638
- 1. COMPLETE your work (tests written, code implemented, review done)
639
- 2. WRITE your Assessment section to the session file (using Edit tool)
640
- 3. VERIFY the assessment is written (read the file back or check Edit output)
641
- 4. SPAWN the handoff subagent (it verifies and updates status/workflow checkboxes)
642
- 5. WAIT for subagent to complete and report success
643
- 6. ONLY THEN offer the next agent handoff
644
- ```
645
-
646
- ### What YOU Write vs What SUBAGENT Writes
647
-
648
- | Agent | YOU Write (Assessment) | SUBAGENT Updates |
649
- |-------|------------------------|------------------|
650
- | TEA | `## TEA Assessment` with test files, RED status | Workflow checkbox, Phase, Next Agent |
651
- | Dev | `## Dev Assessment` with files changed, PR link | Workflow checkbox, Phase, Next Agent |
652
- | Reviewer | `## Reviewer Assessment` with verdict, issues | Workflow checkbox, Phase, Next Agent |
653
-
654
- ### Before Spawning Handoff Subagent
655
-
656
- **YOU must have already written:**
657
- ```markdown
658
- ## {Agent} Assessment
659
-
660
- {All required fields from the template below}
661
-
662
- **Handoff:** To {next agent} for {next task}
663
- ```
664
-
665
- **Verify your assessment exists:**
666
- ```bash
667
- grep -A 20 "## Dev Assessment" "$SESSION_FILE" # For Dev
668
- grep -A 20 "## Reviewer Assessment" "$SESSION_FILE" # For Reviewer
669
- ```
670
-
671
- If the assessment is NOT in the file, do NOT spawn the subagent yet.
672
-
673
- ### Common Mistake
674
-
675
- ```
676
- ❌ WRONG:
677
- 1. Dev: "All tests GREEN, PR created!"
678
- 2. Dev: [spawns handoff subagent]
679
- 3. Dev: "Ready for Reviewer!"
680
- 4. Reviewer: [activates, finds no Dev Assessment in session file]
681
-
682
- ✅ CORRECT:
683
- 1. Dev: "All tests GREEN, PR created!"
684
- 2. Dev: [uses Edit tool to write Dev Assessment to session file]
685
- 3. Dev: [verifies assessment was written]
686
- 4. Dev: [spawns handoff subagent]
687
- 5. Dev: [waits for subagent to report success]
688
- 6. Dev: "Ready for Reviewer!"
689
- 7. Reviewer: [activates, reads Dev Assessment, knows what to review]
690
- ```
691
-
692
- The subagent will verify the assessment exists and update workflow checkboxes.
693
-
694
- ## Skills Usage
695
-
696
- Tactical agents invoke skills naturally based on their task:
697
-
698
- | Skill | When to Use |
699
- |-------|-------------|
700
- | `/testing` | Running tests, writing tests, TDD workflow |
701
- | `/dev-patterns` | Implementation patterns, common gotchas |
702
- | `/sprint-context` | Sprint status, backlog, story context |
703
-
704
- ### Scope Values
705
-
706
- | Session Repos | Scope | Testing Skill Reference |
707
- |---------------|-------|-------------------------|
708
- | `api` | `backend` | `references/backend-patterns.md` |
709
- | `ui` | `frontend` | `references/frontend-patterns.md` |
710
- | `both` | `both` | Full skill + both pattern refs |
711
-
712
- ## Worktree Awareness
713
-
714
- When working in a worktree, read context from the session file:
715
-
716
- ```bash
717
- # Get worktree path from session file
718
- WORKTREE_PATH=$(grep "^path:" "$SESSION_FILE" | cut -d' ' -f2)
719
-
720
- # Use worktree path for all commands (single-repo)
721
- cd $WORKTREE_PATH && just test
722
-
723
- # Multi-repo: iterate with repo-utils
724
- source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
725
- for repo in $(get_repo_names); do
726
- cd $WORKTREE_PATH/$(get_repo_path "$repo") && $(get_test_command "$repo")
727
- done
728
- ```
729
-
730
- **Ports are in the session file:**
731
- ```bash
732
- API_PORT=$(grep "^api_port:" "$SESSION_FILE" | cut -d' ' -f2)
733
- UI_PORT=$(grep "^ui_port:" "$SESSION_FILE" | cut -d' ' -f2)
734
- ```
735
-
736
- **See `core/guides/worktree-mode.md` for complete worktree documentation.**
737
-
738
- ## Sidecar Memory (Tactical Agents)
739
-
740
- **See `shared-agent-behavior.md` for full sidecar protocol.**
741
-
742
- For tactical agents, key moments to check/update sidecars:
743
-
744
- | When | Action |
745
- |------|--------|
746
- | **On Activation** | Load sidecar after checking handoff status (Step 7) |
747
- | **Before Handoff** | Capture any learnings BEFORE spawning handoff subagent |
748
- | **On Gotcha** | Immediately note it - don't wait for handoff |
749
-
750
- ### Tactical-Specific Patterns
751
-
752
- - **TEA:** Test patterns, mocking approaches, test data gotchas
753
- - **Dev:** Implementation patterns, API quirks, performance fixes
754
- - **Reviewer:** Common issues found, patterns to watch for
755
- - **SM:** Story breakdown patterns, estimation notes
756
-
757
- ---
758
-
759
- ## Completing Work (Automatic Handoff via Helper)
760
-
761
- When done with your phase, send your helper to handle the bookkeeping.
762
-
763
- **Helper prompts are in:** `.pennyfarthing/agents/`
764
-
765
- | Agent | Helper | Prompt File | Purpose |
766
- |-------|--------|-------------|---------|
767
- | SM | Nobby | `sm-*.md` | Status checks, research, file summaries, story setup |
768
- | TEA | Igor | `tea-handoff.md` | Update session after tests written (RED) |
769
- | Dev | Hex | `dev-handoff.md` | Update session after PR created (GREEN) |
770
- | Reviewer | Nanny Ogg | `reviewer-handoff-approve.md` | Mark approved, route to SM |
771
- | Reviewer | Nanny Ogg | `reviewer-handoff-reject.md` | Route back to Dev with issues |
772
-
773
- ### Helper Model Selection
774
-
775
- Helpers use Haiku for fast, mechanical bookkeeping:
776
-
777
- ```yaml
778
- Task tool:
779
- subagent_type: "general-purpose"
780
- model: "haiku" # ← Haiku for helpers
781
- description: "Hex handles handoff" # Use your helper's name
782
- prompt: [loaded from subagent file with placeholders replaced]
783
- ```
784
-
785
- **Helpers (Haiku) handle:**
786
- - Workflow handoffs (updating session files, workflow checkboxes)
787
- - Work teardown (completion checks, archival)
788
- - Status checks and validation
789
- - File updates and bookkeeping
790
-
791
- **You (Opus) handle:**
792
- - Complex code analysis or generation
793
- - Architectural decisions
794
- - Tasks requiring judgment
795
-
796
- ### Handoff Output
797
-
798
- ```
799
- ✓ Pre-flight: Tests 36/36 GREEN, git clean, PR #59 exists
800
- ✓ Assessment: Dev Assessment written to session file
801
- ✓ Workflow: [x] Dev marked complete
802
-
803
- Handoff complete: Dev → Reviewer
804
- Invoke /reviewer to continue.
805
- ```
806
-
807
- ### If Handoff Fails
808
-
809
- Your helper reports what blocked:
810
-
811
- ```
812
- ✗ Handoff blocked
813
-
814
- Issue: Tests failing (3 failures)
815
- Fix: Run tests, fix failures, then retry handoff.
816
- ```
817
-
818
- Address the issue and send your helper again.
819
-
820
- ## Auto-Invoke Next Agent (Context-Aware)
821
-
822
- **After handoff helper succeeds**, check context usage to decide whether to auto-invoke or defer:
823
-
824
- ```bash
825
- eval $(./scripts/run.sh check-context.sh)
826
- # Returns: HANDOFF_MODE=auto (<60%) or HANDOFF_MODE=ask (>60%)
827
- ```
828
-
829
- ### If HANDOFF_MODE=auto (< 60% context)
830
-
831
- **Use the Skill tool to invoke the next agent directly.** Do not wait for user input.
832
-
833
- | Current Agent | Next Agent | Skill Invocation |
834
- |---------------|------------|------------------|
835
- | SM | TEA | `Skill(tea)` |
836
- | SM (trivial) | Dev | `Skill(dev)` |
837
- | TEA | Dev | `Skill(dev)` |
838
- | Dev | Reviewer | `Skill(reviewer)` |
839
- | Reviewer (approved) | SM | `Skill(sm)` |
840
- | Reviewer (rejected) | Dev | `Skill(dev)` |
841
-
842
- **Example flow:**
843
- ```
844
- 1. Dev completes implementation, spawns handoff helper
845
- 2. Helper updates session file, reports success
846
- 3. Dev runs: eval $(./scripts/run.sh check-context.sh)
847
- 4. Result: HANDOFF_MODE=auto (context at 45%)
848
- 5. Dev uses Skill tool: skill="reviewer"
849
- 6. Reviewer activates automatically, continues work
850
- ```
851
-
852
- ### If HANDOFF_MODE=ask (> 60% context)
853
-
854
- **Do not auto-invoke.** Tell the user to start a fresh session:
855
-
856
- ```
857
- Context is at {N}% - recommend fresh session for next agent.
858
- Run `/{next-agent}` in a new conversation to continue.
859
- ```
860
-
861
- ### Why This Matters
862
-
863
- - Auto-invoke keeps momentum when context allows
864
- - Fresh sessions prevent context overflow and degraded performance
865
- - The 70% threshold leaves buffer for the next agent's work
866
-
867
- ### Pre-flight Check Commands
868
-
869
- **Single-repo project:**
870
- ```bash
871
- cd $CLAUDE_PROJECT_DIR && just test
872
- cd $CLAUDE_PROJECT_DIR && git status --porcelain
873
- cd $CLAUDE_PROJECT_DIR && git log @{u}..HEAD --oneline
874
- cd $CLAUDE_PROJECT_DIR && gh pr view --json url -q .url
875
- ```
876
-
877
- **Multi-repo project (use repo-utils.sh):**
878
- ```bash
879
- source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
880
- for repo in $(get_repo_names); do
881
- repo_path=$(get_repo_path "$repo")
882
- cd $CLAUDE_PROJECT_DIR/$repo_path && $(get_test_command "$repo")
883
- cd $CLAUDE_PROJECT_DIR/$repo_path && git status --porcelain
884
- done
885
- ```
886
-
887
- ## Subagent Error Handling (Shared Protocol)
888
-
889
- When spawning subagents, the **caller handles all error recovery**. Subagents just report success or structured failure.
890
-
891
- ### Subagent Return Format
892
-
893
- Subagents return structured results:
894
-
895
- ```yaml
896
- # Success
897
- status: success
898
- result: "Session updated, handoff complete"
899
-
900
- # Failure
901
- status: blocked
902
- blocked_step: "verify_tests_green"
903
- error: "3 tests failing in conductor-api"
904
- diagnosis: "Implementation incomplete"
905
- ```
906
-
907
- ### Caller Retry Protocol
908
-
909
- When a subagent returns `status: blocked`:
910
-
911
- ```
912
- 1. LOG the failure
913
- - Which subagent
914
- - Which step failed
915
- - Error message
916
-
917
- 2. DIAGNOSE
918
- - Is this fixable by the caller?
919
- - Is it a transient issue (retry might work)?
920
- - Does it need user intervention?
921
-
922
- 3. IF FIXABLE by caller:
923
- - Fix the issue (e.g., commit forgotten files)
924
- - Retry subagent (max 2 retries)
925
-
926
- 4. IF NOT FIXABLE:
927
- - Escalate to user with structured format
928
- ```
929
-
930
- ### Common Failures and Fixes
931
-
932
- | Subagent | Failure | Caller Action |
933
- |----------|---------|---------------|
934
- | `testing-runner` | Tests RED | Don't retry - report to user, this is expected state info |
935
- | `testing-runner` | Container not running | Run `ensure_test_containers`, retry |
936
- | `*-handoff` | Assessment missing | Write assessment first, retry |
937
- | `*-handoff` | Uncommitted changes | Commit changes, retry |
938
- | `*-handoff` | Not pushed | Push to remote, retry |
939
- | `workflow-status-check` | Session file unreadable | Report to user for manual inspection |
940
- | `sm-*` | Jira CLI failed | Check `gh auth status`, report to user |
941
-
942
- ### Escalation Format
943
-
944
- When a subagent failure can't be recovered:
945
-
946
- ```markdown
947
- ## Subagent Blocked
948
-
949
- **Subagent:** {name}
950
- **Step Failed:** {step}
951
- **Error:** {message}
952
- **Diagnosis:** {what went wrong}
953
-
954
- **Retries:** {N}/2 attempted
955
- **Fixable by Caller:** No
956
-
957
- **User Action Required:**
958
- {specific action the user needs to take}
959
- ```
960
-
961
- ### Example: Caller Handling Handoff Failure
962
-
963
- ```
964
- 1. Dev spawns `dev-handoff` subagent
965
- 2. Subagent returns:
966
- status: blocked
967
- blocked_step: "verify_pushed"
968
- error: "Branch not pushed to remote"
969
-
970
- 3. Dev (caller) handles:
971
- - Diagnose: Forgot to push
972
- - Fix: git push -u origin {branch}
973
- - Retry: Spawn dev-handoff again
974
-
975
- 4. If still failing after 2 retries:
976
- - Escalate to user with structured format
977
- ```
978
-
979
- ### Why Callers Handle Errors
980
-
981
- - **Subagents stay simple** - just do the task, report result
982
- - **Callers have context** - know what they were trying to do
983
- - **Retry logic is consistent** - same pattern across all agents
984
- - **Easier to debug** - failure handling in one place
985
-
986
- ---
987
-
988
- ## Agent Flow Reference
989
-
990
- ```
991
- /new-work → SM → TEA → Dev → Reviewer → SM (finish)
992
- ↓ ↓ ↓ ↓
993
- setup tests impl review
994
- │ │ │ │
995
- └──────┴─────┴─────────┘
996
- helper handoffs
997
- ```
998
-
999
- **Entry point:** `/new-work` only
1000
- **State detection:** Agents read session file on activation
1001
- **Handoffs:** Agents send helpers to update session file
1002
- **Finish:** SM handles when status = `approved`
1003
-
1004
- ---
1005
-
1006
- ## Dogfooding: Known Issues When Working on Pennyfarthing
1007
-
1008
- When working on the Pennyfarthing framework itself, be aware of these quirks:
1009
-
1010
- ### Symlink Permission Issue (Epic 26)
1011
-
1012
- **Problem:** Claude Code's permission system doesn't follow symlinks. The `.claude/` directory contains symlinks to `pennyfarthing-dist/`:
1013
-
1014
- ```
1015
- .claude/commands → pennyfarthing-dist/commands
1016
- .claude/agents → pennyfarthing-dist/agents
1017
- .claude/skills → pennyfarthing-dist/skills
1018
- ```
1019
-
1020
- When Claude Code prompts for permission to write to `.claude/commands/foo.md`, the permission grant **fails silently** because the actual file is at `pennyfarthing-dist/commands/foo.md`.
1021
-
1022
- **Workaround:** Write directly to `pennyfarthing-dist/` instead of `.claude/`:
1023
-
1024
- ```bash
1025
- # WRONG - permission will fail
1026
- Write to: .claude/commands/close-epic.md
1027
-
1028
- # CORRECT - works because it's the real path
1029
- Write to: pennyfarthing-dist/commands/close-epic.md
1030
- ```
1031
-
1032
- **Status:** Tracked in Epic 26-1. Future fix may replace symlinks with copies during `pennyfarthing init`.
1033
-
1034
- ### Self-Referential Context
1035
-
1036
- When agents work on Pennyfarthing itself:
1037
- - Agent definitions you're reading are the same ones you're modifying
1038
- - Changes to `tactical-agent-behavior.md` affect how you behave
1039
- - Test carefully - breaking changes can break the workflow mid-session
1040
-
1041
- **Best practice:** Complete and commit agent/guide changes before testing them in a new session.