@pennyfarthing/core 7.0.2 → 7.4.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 (628) hide show
  1. package/LICENSE +14 -0
  2. package/README.md +2 -2
  3. package/package.json +11 -10
  4. package/packages/core/dist/cli/commands/cyclist.d.ts +2 -2
  5. package/packages/core/dist/cli/commands/cyclist.d.ts.map +1 -1
  6. package/packages/core/dist/cli/commands/cyclist.js +8 -9
  7. package/packages/core/dist/cli/commands/cyclist.js.map +1 -1
  8. package/packages/core/dist/cli/commands/cyclist.test.js +6 -4
  9. package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -1
  10. package/packages/core/dist/cli/commands/init.js +4 -3
  11. package/packages/core/dist/cli/commands/init.js.map +1 -1
  12. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  13. package/packages/core/dist/cli/commands/update.js +15 -139
  14. package/packages/core/dist/cli/commands/update.js.map +1 -1
  15. package/packages/core/dist/cli/cyclist-migration.test.js +4 -3
  16. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -1
  17. package/packages/core/dist/cli/utils/constants.d.ts +7 -1
  18. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
  19. package/packages/core/dist/cli/utils/constants.js +4 -2
  20. package/packages/core/dist/cli/utils/constants.js.map +1 -1
  21. package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -1
  22. package/packages/core/dist/cli/utils/node-modules.js +2 -1
  23. package/packages/core/dist/cli/utils/node-modules.js.map +1 -1
  24. package/packages/core/dist/cli/utils/themes.d.ts +1 -4
  25. package/packages/core/dist/cli/utils/themes.d.ts.map +1 -1
  26. package/packages/core/dist/cli/utils/themes.js +2 -22
  27. package/packages/core/dist/cli/utils/themes.js.map +1 -1
  28. package/packages/core/dist/cli/utils/themes.test.d.ts +3 -3
  29. package/packages/core/dist/cli/utils/themes.test.js +16 -13
  30. package/packages/core/dist/cli/utils/themes.test.js.map +1 -1
  31. package/packages/core/dist/cli/workspace.test.js +11 -9
  32. package/packages/core/dist/cli/workspace.test.js.map +1 -1
  33. package/packages/core/dist/index.d.ts +1 -0
  34. package/packages/core/dist/index.d.ts.map +1 -1
  35. package/packages/core/dist/index.js +10 -0
  36. package/packages/core/dist/index.js.map +1 -1
  37. package/packages/core/dist/jira/jira-epic-creation.d.ts +109 -0
  38. package/packages/core/dist/jira/jira-epic-creation.d.ts.map +1 -0
  39. package/packages/core/dist/jira/jira-epic-creation.js +253 -0
  40. package/packages/core/dist/jira/jira-epic-creation.js.map +1 -0
  41. package/packages/core/dist/jira/jira-epic-creation.test.d.ts +16 -0
  42. package/packages/core/dist/jira/jira-epic-creation.test.d.ts.map +1 -0
  43. package/packages/core/dist/jira/jira-epic-creation.test.js +387 -0
  44. package/packages/core/dist/jira/jira-epic-creation.test.js.map +1 -0
  45. package/packages/core/dist/jira/jira-sprint-sync.d.ts +247 -0
  46. package/packages/core/dist/jira/jira-sprint-sync.d.ts.map +1 -0
  47. package/packages/core/dist/jira/jira-sprint-sync.js +670 -0
  48. package/packages/core/dist/jira/jira-sprint-sync.js.map +1 -0
  49. package/packages/core/dist/jira/jira-sprint-sync.test.d.ts +16 -0
  50. package/packages/core/dist/jira/jira-sprint-sync.test.d.ts.map +1 -0
  51. package/packages/core/dist/jira/jira-sprint-sync.test.js +845 -0
  52. package/packages/core/dist/jira/jira-sprint-sync.test.js.map +1 -0
  53. package/packages/core/dist/scripts/generate-spider.d.ts +11 -1
  54. package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -1
  55. package/packages/core/dist/scripts/generate-spider.js +24 -1
  56. package/packages/core/dist/scripts/generate-spider.js.map +1 -1
  57. package/packages/core/dist/scripts/generate-spider.test.js +6 -4
  58. package/packages/core/dist/scripts/generate-spider.test.js.map +1 -1
  59. package/packages/core/dist/workflow/gate-handler.d.ts +94 -0
  60. package/packages/core/dist/workflow/gate-handler.d.ts.map +1 -0
  61. package/packages/core/dist/workflow/gate-handler.js +189 -0
  62. package/packages/core/dist/workflow/gate-handler.js.map +1 -0
  63. package/packages/core/dist/workflow/gate-handler.test.d.ts +14 -0
  64. package/packages/core/dist/workflow/gate-handler.test.d.ts.map +1 -0
  65. package/packages/core/dist/workflow/gate-handler.test.js +543 -0
  66. package/packages/core/dist/workflow/gate-handler.test.js.map +1 -0
  67. package/packages/core/dist/workflow/generic-handoff.d.ts +46 -0
  68. package/packages/core/dist/workflow/generic-handoff.d.ts.map +1 -1
  69. package/packages/core/dist/workflow/generic-handoff.js +53 -0
  70. package/packages/core/dist/workflow/generic-handoff.js.map +1 -1
  71. package/packages/core/dist/workflow/generic-handoff.test.js +2 -2
  72. package/packages/core/dist/workflow/generic-handoff.test.js.map +1 -1
  73. package/packages/core/dist/workflow/handoff.d.ts +281 -0
  74. package/packages/core/dist/workflow/handoff.d.ts.map +1 -0
  75. package/packages/core/dist/workflow/handoff.js +411 -0
  76. package/packages/core/dist/workflow/handoff.js.map +1 -0
  77. package/packages/core/dist/workflow/handoff.test.d.ts +21 -0
  78. package/packages/core/dist/workflow/handoff.test.d.ts.map +1 -0
  79. package/packages/core/dist/workflow/handoff.test.js +499 -0
  80. package/packages/core/dist/workflow/handoff.test.js.map +1 -0
  81. package/packages/core/dist/workflow/index.d.ts +16 -0
  82. package/packages/core/dist/workflow/index.d.ts.map +1 -0
  83. package/packages/core/dist/workflow/index.js +24 -0
  84. package/packages/core/dist/workflow/index.js.map +1 -0
  85. package/packages/core/dist/workflow/session-state.d.ts +92 -0
  86. package/packages/core/dist/workflow/session-state.d.ts.map +1 -0
  87. package/packages/core/dist/workflow/session-state.js +198 -0
  88. package/packages/core/dist/workflow/session-state.js.map +1 -0
  89. package/packages/core/dist/workflow/session-state.test.d.ts +8 -0
  90. package/packages/core/dist/workflow/session-state.test.d.ts.map +1 -0
  91. package/packages/core/dist/workflow/session-state.test.js +551 -0
  92. package/packages/core/dist/workflow/session-state.test.js.map +1 -0
  93. package/packages/core/dist/workflow/sm-subagents.test.d.ts +2 -2
  94. package/packages/core/dist/workflow/sm-subagents.test.js +6 -6
  95. package/packages/core/dist/workflow/sm-subagents.test.js.map +1 -1
  96. package/packages/core/dist/workflow/step-parser.d.ts +45 -0
  97. package/packages/core/dist/workflow/step-parser.d.ts.map +1 -0
  98. package/packages/core/dist/workflow/step-parser.js +147 -0
  99. package/packages/core/dist/workflow/step-parser.js.map +1 -0
  100. package/packages/core/dist/workflow/step-parser.test.d.ts +14 -0
  101. package/packages/core/dist/workflow/step-parser.test.d.ts.map +1 -0
  102. package/packages/core/dist/workflow/step-parser.test.js +470 -0
  103. package/packages/core/dist/workflow/step-parser.test.js.map +1 -0
  104. package/packages/core/dist/workflow/trimodal.d.ts +86 -0
  105. package/packages/core/dist/workflow/trimodal.d.ts.map +1 -0
  106. package/packages/core/dist/workflow/trimodal.js +118 -0
  107. package/packages/core/dist/workflow/trimodal.js.map +1 -0
  108. package/packages/core/dist/workflow/trimodal.test.d.ts +11 -0
  109. package/packages/core/dist/workflow/trimodal.test.d.ts.map +1 -0
  110. package/packages/core/dist/workflow/trimodal.test.js +395 -0
  111. package/packages/core/dist/workflow/trimodal.test.js.map +1 -0
  112. package/packages/core/dist/workflow/variable-resolver.d.ts +67 -0
  113. package/packages/core/dist/workflow/variable-resolver.d.ts.map +1 -0
  114. package/packages/core/dist/workflow/variable-resolver.js +156 -0
  115. package/packages/core/dist/workflow/variable-resolver.js.map +1 -0
  116. package/packages/core/dist/workflow/variable-resolver.test.d.ts +14 -0
  117. package/packages/core/dist/workflow/variable-resolver.test.d.ts.map +1 -0
  118. package/packages/core/dist/workflow/variable-resolver.test.js +400 -0
  119. package/packages/core/dist/workflow/variable-resolver.test.js.map +1 -0
  120. package/packages/core/dist/workflow/workflow-executor.d.ts +163 -0
  121. package/packages/core/dist/workflow/workflow-executor.d.ts.map +1 -0
  122. package/packages/core/dist/workflow/workflow-executor.js +197 -0
  123. package/packages/core/dist/workflow/workflow-executor.js.map +1 -0
  124. package/packages/core/dist/workflow/workflow-executor.test.d.ts +8 -0
  125. package/packages/core/dist/workflow/workflow-executor.test.d.ts.map +1 -0
  126. package/packages/core/dist/workflow/workflow-executor.test.js +444 -0
  127. package/packages/core/dist/workflow/workflow-executor.test.js.map +1 -0
  128. package/packages/core/dist/workflow/workflow-loader.test.js +5 -5
  129. package/packages/core/dist/workflow/workflow-loader.test.js.map +1 -1
  130. package/packages/core/dist/workflow/workflow-migration.test.js +8 -9
  131. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
  132. package/packages/core/dist/workflow/workflow-permissions.d.ts +55 -0
  133. package/packages/core/dist/workflow/workflow-permissions.d.ts.map +1 -0
  134. package/packages/core/dist/workflow/workflow-permissions.js +64 -0
  135. package/packages/core/dist/workflow/workflow-permissions.js.map +1 -0
  136. package/packages/core/dist/workflow/workflow-permissions.test.d.ts +15 -0
  137. package/packages/core/dist/workflow/workflow-permissions.test.d.ts.map +1 -0
  138. package/packages/core/dist/workflow/workflow-permissions.test.js +301 -0
  139. package/packages/core/dist/workflow/workflow-permissions.test.js.map +1 -0
  140. package/packages/core/dist/workflow/workflow-schema.d.ts +61 -2
  141. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
  142. package/packages/core/dist/workflow/workflow-schema.js +293 -69
  143. package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
  144. package/packages/core/dist/workflow/workflow-schema.test.js +6 -6
  145. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -1
  146. package/packages/core/dist/workflow/workflow-stepped-schema.test.d.ts +18 -0
  147. package/packages/core/dist/workflow/workflow-stepped-schema.test.d.ts.map +1 -0
  148. package/packages/core/dist/workflow/workflow-stepped-schema.test.js +608 -0
  149. package/packages/core/dist/workflow/workflow-stepped-schema.test.js.map +1 -0
  150. package/pennyfarthing-dist/agents/README.md +63 -134
  151. package/pennyfarthing-dist/agents/architect.md +18 -10
  152. package/pennyfarthing-dist/agents/dev.md +47 -32
  153. package/pennyfarthing-dist/agents/devops.md +18 -9
  154. package/pennyfarthing-dist/agents/handoff.md +289 -0
  155. package/pennyfarthing-dist/agents/orchestrator.md +44 -22
  156. package/pennyfarthing-dist/agents/pm.md +13 -8
  157. package/pennyfarthing-dist/agents/reviewer-preflight.md +42 -128
  158. package/pennyfarthing-dist/agents/reviewer.md +104 -57
  159. package/pennyfarthing-dist/agents/sm-file-summary.md +24 -75
  160. package/pennyfarthing-dist/agents/sm-finish.md +61 -0
  161. package/pennyfarthing-dist/agents/sm-handoff.md +102 -54
  162. package/pennyfarthing-dist/agents/sm-setup.md +174 -0
  163. package/pennyfarthing-dist/agents/sm.md +223 -100
  164. package/pennyfarthing-dist/agents/tea.md +42 -34
  165. package/pennyfarthing-dist/agents/tech-writer.md +74 -6
  166. package/pennyfarthing-dist/agents/testing-runner.md +78 -360
  167. package/pennyfarthing-dist/agents/ux-designer.md +80 -7
  168. package/pennyfarthing-dist/agents/workflow-status-check.md +35 -299
  169. package/pennyfarthing-dist/commands/architect.md +2 -2
  170. package/pennyfarthing-dist/commands/close-epic.md +5 -2
  171. package/pennyfarthing-dist/commands/create-branches-from-story.md +7 -23
  172. package/pennyfarthing-dist/commands/dev.md +2 -2
  173. package/pennyfarthing-dist/commands/devops.md +3 -3
  174. package/pennyfarthing-dist/commands/git-cleanup.md +5 -5
  175. package/pennyfarthing-dist/commands/health-check.md +1 -1
  176. package/pennyfarthing-dist/commands/list-themes.md +7 -3
  177. package/pennyfarthing-dist/commands/orchestrator.md +2 -2
  178. package/pennyfarthing-dist/commands/parallel-work.md +4 -4
  179. package/pennyfarthing-dist/commands/pm.md +2 -2
  180. package/pennyfarthing-dist/commands/prime.md +7 -7
  181. package/pennyfarthing-dist/commands/release.md +1 -1
  182. package/pennyfarthing-dist/commands/repo-status.md +2 -2
  183. package/pennyfarthing-dist/commands/retro.md +2 -2
  184. package/pennyfarthing-dist/commands/reviewer.md +2 -2
  185. package/pennyfarthing-dist/commands/set-theme.md +5 -1
  186. package/pennyfarthing-dist/commands/sm.md +2 -2
  187. package/pennyfarthing-dist/commands/start-epic.md +26 -14
  188. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +8 -8
  189. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +1 -4
  190. package/pennyfarthing-dist/commands/tea.md +2 -2
  191. package/pennyfarthing-dist/commands/tech-writer.md +2 -2
  192. package/pennyfarthing-dist/commands/ux-designer.md +3 -3
  193. package/pennyfarthing-dist/commands/work.md +15 -4
  194. package/pennyfarthing-dist/commands/workflow.md +21 -0
  195. package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +15 -15
  196. package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +1 -1
  197. package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +4 -4
  198. package/pennyfarthing-dist/guides/agent-behavior.md +238 -0
  199. package/pennyfarthing-dist/guides/agent-template-strategic.md +2 -2
  200. package/pennyfarthing-dist/guides/agent-template-tactical.md +4 -4
  201. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +1 -1
  202. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +17 -17
  203. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +8 -8
  204. package/pennyfarthing-dist/guides/workflow-schema.md +62 -0
  205. package/pennyfarthing-dist/guides/worktree-mode.md +5 -5
  206. package/pennyfarthing-dist/personas/themes/1984.yaml +1 -1
  207. package/pennyfarthing-dist/personas/themes/a-team.yaml +1 -1
  208. package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +1 -1
  209. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +1 -1
  210. package/pennyfarthing-dist/personas/themes/all-stars.yaml +1 -1
  211. package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +1 -1
  212. package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +1 -1
  213. package/pennyfarthing-dist/personas/themes/arcane.yaml +1 -1
  214. package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +1 -1
  215. package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +1 -1
  216. package/pennyfarthing-dist/personas/themes/babylon-5.yaml +1 -1
  217. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +1 -1
  218. package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +1 -1
  219. package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +2 -2
  220. package/pennyfarthing-dist/personas/themes/black-sails.yaml +1 -1
  221. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +1 -1
  222. package/pennyfarthing-dist/personas/themes/bobiverse.yaml +1 -1
  223. package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +1 -1
  224. package/pennyfarthing-dist/personas/themes/catch-22.yaml +1 -1
  225. package/pennyfarthing-dist/personas/themes/classical-composers.yaml +1 -1
  226. package/pennyfarthing-dist/personas/themes/control.yaml +1 -1
  227. package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +1 -1
  228. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +1 -1
  229. package/pennyfarthing-dist/personas/themes/deadwood.yaml +2 -2
  230. package/pennyfarthing-dist/personas/themes/discworld.yaml +2 -2
  231. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +1 -1
  232. package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +1 -1
  233. package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +1 -1
  234. package/pennyfarthing-dist/personas/themes/firefly.yaml +1 -1
  235. package/pennyfarthing-dist/personas/themes/foundation.yaml +1 -1
  236. package/pennyfarthing-dist/personas/themes/futurama.yaml +1 -1
  237. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +2 -2
  238. package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +1 -1
  239. package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +1 -1
  240. package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +1 -1
  241. package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +1 -1
  242. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +2 -2
  243. package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +1 -1
  244. package/pennyfarthing-dist/personas/themes/historical-figures.yaml +1 -1
  245. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +1 -1
  246. package/pennyfarthing-dist/personas/themes/house-md.yaml +1 -1
  247. package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +1 -1
  248. package/pennyfarthing-dist/personas/themes/jane-austen.yaml +1 -1
  249. package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +1 -1
  250. package/pennyfarthing-dist/personas/themes/justified.yaml +1 -1
  251. package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +1 -1
  252. package/pennyfarthing-dist/personas/themes/les-miserables.yaml +1 -1
  253. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +1 -1
  254. package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +1 -1
  255. package/pennyfarthing-dist/personas/themes/mad-men.yaml +1 -1
  256. package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +1 -1
  257. package/pennyfarthing-dist/personas/themes/mash.yaml +69 -66
  258. package/pennyfarthing-dist/personas/themes/mass-effect.yaml +1 -1
  259. package/pennyfarthing-dist/personas/themes/military-commanders.yaml +1 -1
  260. package/pennyfarthing-dist/personas/themes/moby-dick.yaml +1 -1
  261. package/pennyfarthing-dist/personas/themes/monty-python.yaml +1 -1
  262. package/pennyfarthing-dist/personas/themes/neuromancer.yaml +1 -1
  263. package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +1 -1
  264. package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +1 -1
  265. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +1 -1
  266. package/pennyfarthing-dist/personas/themes/rome.yaml +1 -1
  267. package/pennyfarthing-dist/personas/themes/russian-masters.yaml +1 -1
  268. package/pennyfarthing-dist/personas/themes/sandman.yaml +1 -1
  269. package/pennyfarthing-dist/personas/themes/shakespeare.yaml +1 -1
  270. package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +1 -1
  271. package/pennyfarthing-dist/personas/themes/snow-crash.yaml +1 -1
  272. package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +1 -1
  273. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +1 -1
  274. package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +1 -1
  275. package/pennyfarthing-dist/personas/themes/star-wars.yaml +1 -1
  276. package/pennyfarthing-dist/personas/themes/superfriends.yaml +1 -1
  277. package/pennyfarthing-dist/personas/themes/the-americans.yaml +1 -1
  278. package/pennyfarthing-dist/personas/themes/the-crown.yaml +1 -1
  279. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +1 -1
  280. package/pennyfarthing-dist/personas/themes/the-good-place.yaml +1 -1
  281. package/pennyfarthing-dist/personas/themes/the-office.yaml +1 -1
  282. package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +1 -1
  283. package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +1 -1
  284. package/pennyfarthing-dist/personas/themes/the-wire.yaml +1 -1
  285. package/pennyfarthing-dist/personas/themes/the-witcher.yaml +1 -1
  286. package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +1 -1
  287. package/pennyfarthing-dist/personas/themes/west-wing.yaml +1 -1
  288. package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +1 -1
  289. package/pennyfarthing-dist/scripts/README.md +68 -0
  290. package/pennyfarthing-dist/scripts/core/README.md +26 -0
  291. package/pennyfarthing-dist/scripts/{agent-session.sh → core/agent-session.sh} +34 -23
  292. package/pennyfarthing-dist/scripts/{check-context.sh → core/check-context.sh} +93 -37
  293. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +90 -0
  294. package/pennyfarthing-dist/scripts/core/prime.sh +136 -0
  295. package/pennyfarthing-dist/scripts/core/run.sh +75 -0
  296. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +21 -0
  297. package/pennyfarthing-dist/scripts/git/README.md +25 -0
  298. package/pennyfarthing-dist/scripts/{utils → git}/create-feature-branches.sh +11 -15
  299. package/pennyfarthing-dist/scripts/{utils → git}/git-status-all.sh +1 -1
  300. package/pennyfarthing-dist/scripts/{install-git-hooks.sh → git/install-git-hooks.sh} +0 -0
  301. package/pennyfarthing-dist/scripts/{release.sh → git/release.sh} +0 -0
  302. package/pennyfarthing-dist/scripts/{worktree-manager.sh → git/worktree-manager.sh} +0 -4
  303. package/pennyfarthing-dist/scripts/hooks/README.md +32 -0
  304. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +3 -4
  305. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +1 -2
  306. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
  307. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +1 -1
  308. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
  309. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  310. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
  311. package/pennyfarthing-dist/scripts/hooks/session-start.sh +2 -3
  312. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +2 -3
  313. package/pennyfarthing-dist/scripts/jira/README.md +33 -0
  314. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +101 -0
  315. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +97 -0
  316. package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.mjs +327 -0
  317. package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.test.mjs +503 -0
  318. package/pennyfarthing-dist/scripts/{utils → jira}/jira-claim-story.sh +8 -6
  319. package/pennyfarthing-dist/scripts/{utils/jira → jira}/jira-lib.mjs +10 -10
  320. package/pennyfarthing-dist/scripts/{utils → jira}/jira-lib.sh +18 -17
  321. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +266 -0
  322. package/pennyfarthing-dist/scripts/{utils/jira → jira}/jira-sync-story.mjs +14 -14
  323. package/pennyfarthing-dist/scripts/{utils → jira}/jira-sync-story.sh +0 -0
  324. package/pennyfarthing-dist/scripts/{utils/jira → jira}/jira-sync.mjs +4 -4
  325. package/pennyfarthing-dist/scripts/{utils → jira}/jira-sync.sh +0 -0
  326. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +104 -0
  327. package/pennyfarthing-dist/scripts/{utils → jira}/sync-epic-to-jira.sh +1 -1
  328. package/pennyfarthing-dist/scripts/lib/README.md +29 -0
  329. package/pennyfarthing-dist/scripts/{utils → lib}/background-tasks.sh +1 -1
  330. package/pennyfarthing-dist/scripts/{utils → lib}/checkpoint.sh +0 -0
  331. package/pennyfarthing-dist/scripts/{utils → lib}/common.sh +1 -1
  332. package/pennyfarthing-dist/scripts/{utils → lib}/file-lock.sh +0 -0
  333. package/pennyfarthing-dist/scripts/{utils → lib}/find-root.sh +7 -5
  334. package/pennyfarthing-dist/scripts/{utils → lib}/logging.sh +0 -0
  335. package/pennyfarthing-dist/scripts/{utils → lib}/retry.sh +0 -0
  336. package/pennyfarthing-dist/scripts/misc/README.md +44 -0
  337. package/pennyfarthing-dist/scripts/{add-short-names.mjs → misc/add-short-names.mjs} +0 -0
  338. package/pennyfarthing-dist/scripts/misc/backlog.sh +91 -0
  339. package/pennyfarthing-dist/scripts/{utils → misc}/check-status.sh +4 -8
  340. package/pennyfarthing-dist/scripts/{deploy.sh → misc/deploy.sh} +0 -0
  341. package/pennyfarthing-dist/scripts/{doctor-dogfood.sh → misc/doctor-dogfood.sh} +2 -5
  342. package/pennyfarthing-dist/scripts/{utils → misc}/find-related-work.sh +0 -0
  343. package/pennyfarthing-dist/scripts/{utils → misc}/generate-skill-docs.sh +0 -0
  344. package/pennyfarthing-dist/scripts/{utils → misc}/log-skill-usage.sh +0 -0
  345. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.mjs +474 -0
  346. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +9 -0
  347. package/pennyfarthing-dist/scripts/{utils → misc}/repo-scan.sh +0 -0
  348. package/pennyfarthing-dist/scripts/{repo-utils.sh → misc/repo-utils.sh} +2 -2
  349. package/pennyfarthing-dist/scripts/{run-ci.sh → misc/run-ci.sh} +0 -0
  350. package/pennyfarthing-dist/scripts/{utils → misc}/run-timestamp.sh +0 -0
  351. package/pennyfarthing-dist/scripts/{utils → misc}/session-cleanup.sh +0 -0
  352. package/pennyfarthing-dist/scripts/{utils → misc}/skill-usage-report.sh +0 -0
  353. package/pennyfarthing-dist/scripts/{statusline.sh → misc/statusline.sh} +2 -7
  354. package/pennyfarthing-dist/scripts/{uninstall.sh → misc/uninstall.sh} +4 -5
  355. package/pennyfarthing-dist/scripts/{utils → misc}/validate-subagent-frontmatter.sh +3 -3
  356. package/pennyfarthing-dist/scripts/sprint/README.md +29 -0
  357. package/pennyfarthing-dist/scripts/sprint/archive-story.sh +135 -0
  358. package/pennyfarthing-dist/scripts/sprint/available-stories.sh +97 -0
  359. package/pennyfarthing-dist/scripts/sprint/check-story.sh +164 -0
  360. package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +58 -0
  361. package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +69 -0
  362. package/pennyfarthing-dist/scripts/sprint/list-future.sh +151 -0
  363. package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +116 -0
  364. package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +164 -0
  365. package/pennyfarthing-dist/scripts/{utils → sprint}/sprint-common.sh +135 -0
  366. package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +39 -0
  367. package/pennyfarthing-dist/scripts/{utils → sprint}/sprint-metrics.sh +0 -0
  368. package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +134 -0
  369. package/pennyfarthing-dist/scripts/story/README.md +23 -0
  370. package/pennyfarthing-dist/scripts/story/create-story.sh +159 -0
  371. package/pennyfarthing-dist/scripts/story/size-story.sh +198 -0
  372. package/pennyfarthing-dist/scripts/story/story-template.sh +162 -0
  373. package/pennyfarthing-dist/scripts/test/README.md +23 -0
  374. package/pennyfarthing-dist/scripts/{utils → test}/swebench-judge.py +0 -0
  375. package/pennyfarthing-dist/scripts/test/test-cache.sh +165 -0
  376. package/pennyfarthing-dist/scripts/{utils → test}/test-setup.sh +5 -5
  377. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  378. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +515 -0
  379. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +599 -0
  380. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +332 -0
  381. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +573 -0
  382. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +859 -0
  383. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +662 -0
  384. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +589 -0
  385. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +7 -9
  386. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +18 -18
  387. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +10 -10
  388. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +1 -1
  389. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  390. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +647 -0
  391. package/pennyfarthing-dist/scripts/theme/README.md +22 -0
  392. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +203 -0
  393. package/pennyfarthing-dist/scripts/theme/list-themes.sh +73 -0
  394. package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +97 -0
  395. package/pennyfarthing-dist/scripts/workflow/README.md +28 -0
  396. package/pennyfarthing-dist/scripts/{check.sh → workflow/check.sh} +0 -0
  397. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +159 -0
  398. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +228 -0
  399. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +91 -0
  400. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +163 -0
  401. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +138 -0
  402. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +256 -0
  403. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +167 -0
  404. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +6 -0
  405. package/pennyfarthing-dist/skills/changelog/SKILL.md +2 -2
  406. package/pennyfarthing-dist/skills/code-review/SKILL.md +3 -3
  407. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +6 -0
  408. package/pennyfarthing-dist/skills/cyclist/SKILL.md +56 -139
  409. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +21 -5
  410. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +1 -1
  411. package/pennyfarthing-dist/skills/jira/SKILL.md +381 -178
  412. package/pennyfarthing-dist/skills/judge/SKILL.md +76 -21
  413. package/pennyfarthing-dist/skills/just/SKILL.md +345 -102
  414. package/pennyfarthing-dist/skills/otel/skill.md +1 -0
  415. package/pennyfarthing-dist/skills/permissions/skill.md +1 -1
  416. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +5 -0
  417. package/pennyfarthing-dist/skills/skill-registry.schema.json +5 -0
  418. package/pennyfarthing-dist/skills/skill-registry.yaml +22 -0
  419. package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +101 -0
  420. package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +97 -0
  421. package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +164 -0
  422. package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +101 -0
  423. package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +116 -0
  424. package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +164 -0
  425. package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +39 -0
  426. package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +147 -0
  427. package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +104 -0
  428. package/pennyfarthing-dist/skills/sprint/skill.md +465 -0
  429. package/pennyfarthing-dist/skills/story/scripts/create-story.sh +159 -0
  430. package/pennyfarthing-dist/skills/story/scripts/size-story.sh +198 -0
  431. package/pennyfarthing-dist/skills/story/scripts/story-template.sh +162 -0
  432. package/pennyfarthing-dist/skills/story/skill.md +219 -0
  433. package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +390 -0
  434. package/pennyfarthing-dist/skills/theme/skill.md +1 -1
  435. package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +91 -0
  436. package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +163 -0
  437. package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +138 -0
  438. package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +273 -0
  439. package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +167 -0
  440. package/pennyfarthing-dist/skills/workflow/skill.md +337 -0
  441. package/pennyfarthing-dist/templates/settings.local.json.template +1 -1
  442. package/pennyfarthing-dist/workflows/agent-docs.yaml +1 -1
  443. package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +101 -0
  444. package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +93 -0
  445. package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +115 -0
  446. package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +133 -0
  447. package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +138 -0
  448. package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +133 -0
  449. package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +142 -0
  450. package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +160 -0
  451. package/pennyfarthing-dist/workflows/architecture/templates/architecture-decision.md +102 -0
  452. package/pennyfarthing-dist/workflows/architecture.yaml +65 -0
  453. package/pennyfarthing-dist/workflows/bdd.yaml +3 -1
  454. package/pennyfarthing-dist/workflows/brainstorming/brain-methods.csv +62 -0
  455. package/pennyfarthing-dist/workflows/brainstorming/checklist.md +44 -0
  456. package/pennyfarthing-dist/workflows/brainstorming/instructions.md +736 -0
  457. package/pennyfarthing-dist/workflows/brainstorming/workflow.yaml +49 -0
  458. package/pennyfarthing-dist/workflows/code-review/checklist.md +23 -0
  459. package/pennyfarthing-dist/workflows/code-review/instructions.md +234 -0
  460. package/pennyfarthing-dist/workflows/code-review/workflow.yaml +51 -0
  461. package/pennyfarthing-dist/workflows/dev-story/checklist.md +80 -0
  462. package/pennyfarthing-dist/workflows/dev-story/instructions.xml +410 -0
  463. package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +50 -0
  464. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +256 -0
  465. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +233 -0
  466. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +272 -0
  467. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +145 -0
  468. package/pennyfarthing-dist/workflows/epics-and-stories/templates/epics-template.md +57 -0
  469. package/pennyfarthing-dist/workflows/epics-and-stories/workflow.yaml +27 -0
  470. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +190 -0
  471. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +178 -0
  472. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
  473. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +139 -0
  474. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
  475. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +133 -0
  476. package/pennyfarthing-dist/workflows/implementation-readiness/templates/readiness-report-template.md +4 -0
  477. package/pennyfarthing-dist/workflows/implementation-readiness/workflow.yaml +40 -0
  478. package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +13 -0
  479. package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +197 -0
  480. package/pennyfarthing-dist/workflows/prd/data/project-types.csv +11 -0
  481. package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +191 -0
  482. package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +153 -0
  483. package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +224 -0
  484. package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +226 -0
  485. package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +213 -0
  486. package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +207 -0
  487. package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +226 -0
  488. package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +237 -0
  489. package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +228 -0
  490. package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +231 -0
  491. package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +242 -0
  492. package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +217 -0
  493. package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +180 -0
  494. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +247 -0
  495. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
  496. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +249 -0
  497. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +253 -0
  498. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +168 -0
  499. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +218 -0
  500. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +191 -0
  501. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +209 -0
  502. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +174 -0
  503. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  504. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +228 -0
  505. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +217 -0
  506. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  507. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  508. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +263 -0
  509. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +209 -0
  510. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  511. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +242 -0
  512. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +232 -0
  513. package/pennyfarthing-dist/workflows/prd/templates/prd-template.md +10 -0
  514. package/pennyfarthing-dist/workflows/prd/workflow.yaml +42 -0
  515. package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +177 -0
  516. package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +161 -0
  517. package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +199 -0
  518. package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +202 -0
  519. package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +205 -0
  520. package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +219 -0
  521. package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +194 -0
  522. package/pennyfarthing-dist/workflows/product-brief/templates/product-brief.template.md +10 -0
  523. package/pennyfarthing-dist/workflows/product-brief/workflow.yaml +31 -0
  524. package/pennyfarthing-dist/workflows/project-context/project-context-template.md +21 -0
  525. package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +184 -0
  526. package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +318 -0
  527. package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +278 -0
  528. package/pennyfarthing-dist/workflows/project-context/workflow.yaml +27 -0
  529. package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +156 -0
  530. package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +120 -0
  531. package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +113 -0
  532. package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +113 -0
  533. package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +106 -0
  534. package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +140 -0
  535. package/pennyfarthing-dist/workflows/quick-dev/workflow.yaml +27 -0
  536. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +189 -0
  537. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +144 -0
  538. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +128 -0
  539. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +191 -0
  540. package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +74 -0
  541. package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +27 -0
  542. package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +137 -0
  543. package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +229 -0
  544. package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +238 -0
  545. package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +206 -0
  546. package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +234 -0
  547. package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +443 -0
  548. package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +182 -0
  549. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +237 -0
  550. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +200 -0
  551. package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +249 -0
  552. package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +259 -0
  553. package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +177 -0
  554. package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +475 -0
  555. package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +137 -0
  556. package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +239 -0
  557. package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +248 -0
  558. package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +202 -0
  559. package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +239 -0
  560. package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +486 -0
  561. package/pennyfarthing-dist/workflows/research/templates/research.template.md +29 -0
  562. package/pennyfarthing-dist/workflows/research/workflow.yaml +45 -0
  563. package/pennyfarthing-dist/workflows/retrospective/checklist.md +31 -0
  564. package/pennyfarthing-dist/workflows/retrospective/instructions.md +1443 -0
  565. package/pennyfarthing-dist/workflows/retrospective/workflow.yaml +50 -0
  566. package/pennyfarthing-dist/workflows/sprint-planning/checklist.md +33 -0
  567. package/pennyfarthing-dist/workflows/sprint-planning/sprint-status-template.yaml +55 -0
  568. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +54 -0
  569. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +44 -0
  570. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +64 -0
  571. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +73 -0
  572. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +56 -0
  573. package/pennyfarthing-dist/workflows/sprint-planning/workflow.yaml +34 -0
  574. package/pennyfarthing-dist/workflows/trivial.yaml +1 -1
  575. package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +135 -0
  576. package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +127 -0
  577. package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +190 -0
  578. package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +216 -0
  579. package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +219 -0
  580. package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +234 -0
  581. package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +252 -0
  582. package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +254 -0
  583. package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +224 -0
  584. package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +224 -0
  585. package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +241 -0
  586. package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +248 -0
  587. package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +237 -0
  588. package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +264 -0
  589. package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +228 -0
  590. package/pennyfarthing-dist/workflows/ux-design/ux-design-template.md +13 -0
  591. package/pennyfarthing-dist/workflows/ux-design/workflow.yaml +41 -0
  592. package/packages/core/dist/scripts/generate-all-faces.d.ts +0 -10
  593. package/packages/core/dist/scripts/generate-all-faces.d.ts.map +0 -1
  594. package/packages/core/dist/scripts/generate-all-faces.js +0 -256
  595. package/packages/core/dist/scripts/generate-all-faces.js.map +0 -1
  596. package/packages/core/dist/scripts/generate-all-faces.test.d.ts +0 -17
  597. package/packages/core/dist/scripts/generate-all-faces.test.d.ts.map +0 -1
  598. package/packages/core/dist/scripts/generate-all-faces.test.js +0 -372
  599. package/packages/core/dist/scripts/generate-all-faces.test.js.map +0 -1
  600. package/packages/core/dist/scripts/generate-ascii-face.d.ts +0 -52
  601. package/packages/core/dist/scripts/generate-ascii-face.d.ts.map +0 -1
  602. package/packages/core/dist/scripts/generate-ascii-face.js +0 -155
  603. package/packages/core/dist/scripts/generate-ascii-face.js.map +0 -1
  604. package/packages/core/dist/scripts/generate-face.d.ts +0 -52
  605. package/packages/core/dist/scripts/generate-face.d.ts.map +0 -1
  606. package/packages/core/dist/scripts/generate-face.js +0 -199
  607. package/packages/core/dist/scripts/generate-face.js.map +0 -1
  608. package/packages/core/dist/scripts/generate-face.test.d.ts +0 -13
  609. package/packages/core/dist/scripts/generate-face.test.d.ts.map +0 -1
  610. package/packages/core/dist/scripts/generate-face.test.js +0 -301
  611. package/packages/core/dist/scripts/generate-face.test.js.map +0 -1
  612. package/pennyfarthing-dist/agents/generic-handoff.md +0 -454
  613. package/pennyfarthing-dist/agents/generic-sm-finish.md +0 -261
  614. package/pennyfarthing-dist/agents/generic-sm-setup.md +0 -214
  615. package/pennyfarthing-dist/commands/new-work.md +0 -127
  616. package/pennyfarthing-dist/guides/AGENT-SCOPES.md +0 -201
  617. package/pennyfarthing-dist/guides/persona-system.md +0 -294
  618. package/pennyfarthing-dist/guides/shared-agent-behavior.md +0 -388
  619. package/pennyfarthing-dist/guides/shared-context.md +0 -147
  620. package/pennyfarthing-dist/guides/strategic-agent-behavior.md +0 -348
  621. package/pennyfarthing-dist/guides/tactical-agent-behavior.md +0 -1041
  622. package/pennyfarthing-dist/scripts/prime.sh +0 -161
  623. package/pennyfarthing-dist/scripts/run.sh +0 -65
  624. package/pennyfarthing-dist/skills/sprint-context/SKILL.md +0 -120
  625. package/pennyfarthing-dist/skills/story-management/SKILL.md +0 -208
  626. package/pennyfarthing-dist/skills/workflow/SKILL.md +0 -160
  627. /package/pennyfarthing-dist/commands/{brainstorm.md → brainstorming.md} +0 -0
  628. /package/pennyfarthing-dist/scripts/{utils → test}/ground-truth-judge.py +0 -0
@@ -0,0 +1,859 @@
1
+ #!/usr/bin/env bash
2
+ # migrate-bmad-workflow.test.sh - Tests for BMAD workflow migration script
3
+ #
4
+ # Story MSSCI-12132: BMAD to Pennyfarthing migration script
5
+ #
6
+ # These tests verify the migrate-bmad-workflow.sh script that converts
7
+ # BMAD workflow format to Pennyfarthing stepped workflow format.
8
+ #
9
+ # Run with: ./migrate-bmad-workflow.test.sh
10
+ # Or: bash migrate-bmad-workflow.test.sh
11
+
12
+ set -euo pipefail
13
+
14
+ # Colors for output
15
+ RED='\033[0;31m'
16
+ GREEN='\033[0;32m'
17
+ YELLOW='\033[1;33m'
18
+ NC='\033[0m' # No Color
19
+
20
+ # Test counters
21
+ TESTS_RUN=0
22
+ TESTS_PASSED=0
23
+ TESTS_FAILED=0
24
+
25
+ # Path to script under test
26
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
27
+ MIGRATE_SCRIPT="$SCRIPT_DIR/migrate-bmad-workflow.sh"
28
+
29
+ # Temp directory for test fixtures
30
+ TEST_TMPDIR=""
31
+
32
+ # =============================================================================
33
+ # Test Framework
34
+ # =============================================================================
35
+
36
+ setup() {
37
+ TEST_TMPDIR=$(mktemp -d)
38
+ cd "$TEST_TMPDIR"
39
+ export PROJECT_ROOT="$TEST_TMPDIR"
40
+ }
41
+
42
+ teardown() {
43
+ cd /
44
+ rm -rf "$TEST_TMPDIR"
45
+ unset PROJECT_ROOT
46
+ }
47
+
48
+ assert_eq() {
49
+ local expected="$1"
50
+ local actual="$2"
51
+ local message="${3:-Values should be equal}"
52
+
53
+ if [[ "$expected" == "$actual" ]]; then
54
+ return 0
55
+ else
56
+ echo -e "${RED}FAIL${NC}: $message"
57
+ echo " Expected: $expected"
58
+ echo " Actual: $actual"
59
+ return 1
60
+ fi
61
+ }
62
+
63
+ assert_exit_code() {
64
+ local expected="$1"
65
+ local actual="$2"
66
+ local message="${3:-Exit code should match}"
67
+
68
+ assert_eq "$expected" "$actual" "$message"
69
+ }
70
+
71
+ assert_contains() {
72
+ local haystack="$1"
73
+ local needle="$2"
74
+ local message="${3:-Output should contain expected text}"
75
+
76
+ if [[ "$haystack" == *"$needle"* ]]; then
77
+ return 0
78
+ else
79
+ echo -e "${RED}FAIL${NC}: $message"
80
+ echo " Expected to contain: $needle"
81
+ echo " Actual output: $haystack"
82
+ return 1
83
+ fi
84
+ }
85
+
86
+ assert_not_contains() {
87
+ local haystack="$1"
88
+ local needle="$2"
89
+ local message="${3:-Output should not contain text}"
90
+
91
+ if [[ "$haystack" != *"$needle"* ]]; then
92
+ return 0
93
+ else
94
+ echo -e "${RED}FAIL${NC}: $message"
95
+ echo " Should not contain: $needle"
96
+ echo " Actual output: $haystack"
97
+ return 1
98
+ fi
99
+ }
100
+
101
+ assert_file_exists() {
102
+ local filepath="$1"
103
+ local message="${2:-File should exist}"
104
+
105
+ if [[ -f "$filepath" ]]; then
106
+ return 0
107
+ else
108
+ echo -e "${RED}FAIL${NC}: $message"
109
+ echo " File not found: $filepath"
110
+ return 1
111
+ fi
112
+ }
113
+
114
+ assert_dir_exists() {
115
+ local dirpath="$1"
116
+ local message="${2:-Directory should exist}"
117
+
118
+ if [[ -d "$dirpath" ]]; then
119
+ return 0
120
+ else
121
+ echo -e "${RED}FAIL${NC}: $message"
122
+ echo " Directory not found: $dirpath"
123
+ return 1
124
+ fi
125
+ }
126
+
127
+ assert_file_contains() {
128
+ local filepath="$1"
129
+ local needle="$2"
130
+ local message="${3:-File should contain text}"
131
+
132
+ if [[ ! -f "$filepath" ]]; then
133
+ echo -e "${RED}FAIL${NC}: $message"
134
+ echo " File not found: $filepath"
135
+ return 1
136
+ fi
137
+
138
+ local content
139
+ content=$(cat "$filepath")
140
+
141
+ if [[ "$content" == *"$needle"* ]]; then
142
+ return 0
143
+ else
144
+ echo -e "${RED}FAIL${NC}: $message"
145
+ echo " Expected file to contain: $needle"
146
+ echo " File: $filepath"
147
+ return 1
148
+ fi
149
+ }
150
+
151
+ run_test() {
152
+ local test_name="$1"
153
+ local test_func="$2"
154
+
155
+ TESTS_RUN=$((TESTS_RUN + 1))
156
+
157
+ echo -n " $test_name... "
158
+
159
+ setup
160
+
161
+ if $test_func; then
162
+ echo -e "${GREEN}PASS${NC}"
163
+ TESTS_PASSED=$((TESTS_PASSED + 1))
164
+ else
165
+ TESTS_FAILED=$((TESTS_FAILED + 1))
166
+ fi
167
+
168
+ teardown
169
+ }
170
+
171
+ # =============================================================================
172
+ # Test Fixtures
173
+ # =============================================================================
174
+
175
+ create_simple_bmad_workflow() {
176
+ # Create a simple single-mode BMAD workflow for testing
177
+ mkdir -p bmad-workflow/steps
178
+
179
+ # Create workflow.md
180
+ cat > bmad-workflow/workflow.md << 'EOF'
181
+ ---
182
+ name: simple-workflow
183
+ description: A simple test workflow
184
+ main_config: '{project-root}/_bmad/config.yaml'
185
+ nextStep: './steps/step-01-init.md'
186
+ ---
187
+
188
+ # Simple Workflow
189
+
190
+ A basic workflow for testing migration.
191
+ EOF
192
+
193
+ # Create a step file with frontmatter
194
+ cat > bmad-workflow/steps/step-01-init.md << 'EOF'
195
+ ---
196
+ name: 'step-01-init'
197
+ description: 'Initialize the workflow'
198
+ nextStepFile: './step-02-work.md'
199
+ outputFile: '{planning_artifacts}/output.md'
200
+ ---
201
+
202
+ # Step 1: Initialize
203
+
204
+ ## STEP GOAL:
205
+
206
+ Initialize the workflow.
207
+ EOF
208
+
209
+ cat > bmad-workflow/steps/step-02-work.md << 'EOF'
210
+ ---
211
+ name: 'step-02-work'
212
+ description: 'Do the work'
213
+ nextStepFile: './step-03-complete.md'
214
+ templateRef: '{project-root}/templates/work.md'
215
+ ---
216
+
217
+ # Step 2: Work
218
+
219
+ Do the actual work here.
220
+ EOF
221
+ }
222
+
223
+ create_trimodal_bmad_workflow() {
224
+ # Create a tri-modal BMAD workflow (like PRD)
225
+ mkdir -p bmad-workflow/{steps-c,steps-v,steps-e,templates,data}
226
+
227
+ # Create workflow.md
228
+ cat > bmad-workflow/workflow.md << 'EOF'
229
+ ---
230
+ name: prd
231
+ description: PRD tri-modal workflow - Create, Validate, or Edit
232
+ main_config: '{project-root}/_bmad/config.yaml'
233
+ nextStep: './steps-c/step-01-init.md'
234
+ validateWorkflow: './steps-v/step-v-01-discovery.md'
235
+ editWorkflow: './steps-e/step-e-01-discovery.md'
236
+ web_bundle: true
237
+ ---
238
+
239
+ # PRD Workflow (Tri-Modal)
240
+
241
+ Create, Validate, or Edit PRDs.
242
+ EOF
243
+
244
+ # Create step file
245
+ cat > bmad-workflow/steps-c/step-01-init.md << 'EOF'
246
+ ---
247
+ name: 'step-01-init'
248
+ description: 'Initialize the PRD creation workflow'
249
+ nextStepFile: './step-02-discovery.md'
250
+ outputFile: '{planning_artifacts}/prd.md'
251
+ prdTemplate: '../templates/prd-template.md'
252
+ ---
253
+
254
+ # Step 1: Workflow Initialization
255
+
256
+ Initialize the PRD workflow.
257
+ EOF
258
+
259
+ # Create validate step
260
+ cat > bmad-workflow/steps-v/step-v-01-discovery.md << 'EOF'
261
+ ---
262
+ name: 'step-v-01-discovery'
263
+ description: 'Document Discovery & Confirmation'
264
+ nextStepFile: './step-v-02-format-detection.md'
265
+ advancedElicitationTask: '{project-root}/_bmad/workflows/advanced-elicitation/workflow.xml'
266
+ ---
267
+
268
+ # Step 1: Document Discovery
269
+
270
+ Discover and validate documents.
271
+ EOF
272
+
273
+ # Create edit step
274
+ cat > bmad-workflow/steps-e/step-e-01-discovery.md << 'EOF'
275
+ ---
276
+ name: 'step-e-01-discovery'
277
+ description: 'Discover PRD for editing'
278
+ nextStepFile: './step-e-02-analysis.md'
279
+ ---
280
+
281
+ # Step 1: Edit Discovery
282
+
283
+ Discover PRD to edit.
284
+ EOF
285
+
286
+ # Create template
287
+ cat > bmad-workflow/templates/prd-template.md << 'EOF'
288
+ # Product Requirements Document
289
+
290
+ ## Overview
291
+ {project_name}
292
+ EOF
293
+ }
294
+
295
+ create_workflow_with_dashed_variables() {
296
+ # Create workflow with BMAD-style dashed variables
297
+ mkdir -p bmad-workflow/steps
298
+
299
+ cat > bmad-workflow/workflow.md << 'EOF'
300
+ ---
301
+ name: variable-test
302
+ description: Workflow to test variable conversion
303
+ main_config: '{project-root}/_bmad/bmm/config.yaml'
304
+ nextStep: './steps/step-01-init.md'
305
+ ---
306
+
307
+ # Variable Test Workflow
308
+ EOF
309
+
310
+ cat > bmad-workflow/steps/step-01-init.md << 'EOF'
311
+ ---
312
+ name: 'step-01-init'
313
+ description: 'Test step with many variables'
314
+ nextStepFile: './step-02-work.md'
315
+ outputFile: '{planning-artifacts}/output.md'
316
+ configRef: '{project-root}/_bmad/bmm/config.yaml'
317
+ templateRef: '{user-templates}/custom.md'
318
+ ---
319
+
320
+ # Step 1: Initialize
321
+
322
+ Load configuration from {main-config} and write to {output-folder}.
323
+ User skill level: {user-skill-level}
324
+ Communication: {communication-language}
325
+ EOF
326
+ }
327
+
328
+ # =============================================================================
329
+ # AC1: Script parses BMAD workflow.md configuration
330
+ # =============================================================================
331
+
332
+ test_ac1_script_exists() {
333
+ if [[ -f "$MIGRATE_SCRIPT" ]]; then
334
+ return 0
335
+ else
336
+ echo -e "${RED}FAIL${NC}: migrate-bmad-workflow.sh script does not exist at $MIGRATE_SCRIPT"
337
+ return 1
338
+ fi
339
+ }
340
+
341
+ test_ac1_accepts_source_path() {
342
+ create_simple_bmad_workflow
343
+
344
+ local output
345
+ output=$("$MIGRATE_SCRIPT" bmad-workflow 2>&1) || true
346
+
347
+ # Should not error on valid source path
348
+ assert_not_contains "$output" "not found" "Should accept valid source path"
349
+ }
350
+
351
+ test_ac1_extracts_workflow_name() {
352
+ create_simple_bmad_workflow
353
+ mkdir -p output
354
+
355
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
356
+
357
+ # Check generated workflow.yaml has correct name
358
+ assert_file_contains "output/workflow.yaml" "name: simple-workflow" \
359
+ "Should extract workflow name from BMAD workflow.md"
360
+ }
361
+
362
+ test_ac1_extracts_workflow_description() {
363
+ create_simple_bmad_workflow
364
+ mkdir -p output
365
+
366
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
367
+
368
+ assert_file_contains "output/workflow.yaml" "description:" \
369
+ "Should extract workflow description from BMAD workflow.md"
370
+ }
371
+
372
+ test_ac1_errors_on_missing_workflowmd() {
373
+ mkdir -p bmad-workflow/steps
374
+ # No workflow.md
375
+
376
+ # Capture exit code properly (|| true swallows it, so use set +e)
377
+ set +e
378
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>&1
379
+ local exit_code=$?
380
+ set -e
381
+
382
+ # Should fail when workflow.md is missing
383
+ if [[ "$exit_code" -ne 0 ]]; then
384
+ return 0
385
+ else
386
+ echo -e "${RED}FAIL${NC}: Should error when workflow.md is missing"
387
+ return 1
388
+ fi
389
+ }
390
+
391
+ # =============================================================================
392
+ # AC2: Script extracts YAML frontmatter from step files
393
+ # =============================================================================
394
+
395
+ test_ac2_extracts_step_frontmatter() {
396
+ create_simple_bmad_workflow
397
+ mkdir -p output
398
+
399
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
400
+
401
+ # Should have copied/processed step files
402
+ assert_file_exists "output/steps/step-01-init.md" \
403
+ "Should copy step files to output"
404
+ }
405
+
406
+ test_ac2_preserves_step_content() {
407
+ create_simple_bmad_workflow
408
+ mkdir -p output
409
+
410
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
411
+
412
+ # Step content should be preserved
413
+ assert_file_contains "output/steps/step-01-init.md" "STEP GOAL" \
414
+ "Should preserve step file content"
415
+ }
416
+
417
+ test_ac2_handles_complex_frontmatter() {
418
+ create_trimodal_bmad_workflow
419
+ mkdir -p output
420
+
421
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
422
+
423
+ # Should handle step files with multiple frontmatter fields
424
+ assert_file_exists "output/steps-c/step-01-init.md" \
425
+ "Should handle step files with complex frontmatter"
426
+ }
427
+
428
+ # =============================================================================
429
+ # AC3: Variable syntax converted (dashes to underscores)
430
+ # =============================================================================
431
+
432
+ test_ac3_converts_dashed_variables_in_workflow() {
433
+ create_workflow_with_dashed_variables
434
+ mkdir -p output
435
+
436
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
437
+
438
+ # Should convert {project-root} to {project_root}
439
+ assert_file_contains "output/workflow.yaml" "project_root" \
440
+ "Should convert dashed variables to underscored in workflow.yaml"
441
+ }
442
+
443
+ test_ac3_converts_dashed_variables_in_steps() {
444
+ create_workflow_with_dashed_variables
445
+ mkdir -p output
446
+
447
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
448
+
449
+ local content
450
+ content=$(cat "output/steps/step-01-init.md" 2>/dev/null || echo "")
451
+
452
+ # Should convert {planning-artifacts} to {planning_artifacts}
453
+ assert_not_contains "$content" "{planning-artifacts}" \
454
+ "Should convert dashed variables in step files"
455
+ assert_contains "$content" "{planning_artifacts}" \
456
+ "Should have underscored variables after conversion"
457
+ }
458
+
459
+ test_ac3_converts_all_common_variables() {
460
+ create_workflow_with_dashed_variables
461
+ mkdir -p output
462
+
463
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
464
+
465
+ local content
466
+ content=$(cat "output/steps/step-01-init.md" 2>/dev/null || echo "")
467
+
468
+ # Check multiple variable conversions
469
+ assert_not_contains "$content" "{main-config}" \
470
+ "Should convert {main-config}"
471
+ assert_not_contains "$content" "{output-folder}" \
472
+ "Should convert {output-folder}"
473
+ assert_not_contains "$content" "{user-skill-level}" \
474
+ "Should convert {user-skill-level}"
475
+ }
476
+
477
+ test_ac3_preserves_non_variable_dashes() {
478
+ create_simple_bmad_workflow
479
+ mkdir -p output
480
+
481
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
482
+
483
+ # Regular dashes (not in braces) should be preserved
484
+ # Step names like 'step-01-init' should remain unchanged
485
+ assert_file_contains "output/steps/step-01-init.md" "step-01-init" \
486
+ "Should preserve dashes outside of variable braces"
487
+ }
488
+
489
+ # =============================================================================
490
+ # AC4: workflow.yaml generated with correct schema
491
+ # =============================================================================
492
+
493
+ test_ac4_generates_workflow_yaml() {
494
+ create_simple_bmad_workflow
495
+ mkdir -p output
496
+
497
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
498
+
499
+ assert_file_exists "output/workflow.yaml" \
500
+ "Should generate workflow.yaml"
501
+ }
502
+
503
+ test_ac4_yaml_has_type_stepped() {
504
+ create_simple_bmad_workflow
505
+ mkdir -p output
506
+
507
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
508
+
509
+ assert_file_contains "output/workflow.yaml" "type: stepped" \
510
+ "Generated workflow.yaml should have type: stepped"
511
+ }
512
+
513
+ test_ac4_yaml_has_steps_config() {
514
+ create_simple_bmad_workflow
515
+ mkdir -p output
516
+
517
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
518
+
519
+ assert_file_contains "output/workflow.yaml" "steps:" \
520
+ "Generated workflow.yaml should have steps configuration"
521
+ }
522
+
523
+ test_ac4_yaml_has_valid_structure() {
524
+ create_simple_bmad_workflow
525
+ mkdir -p output
526
+
527
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
528
+
529
+ # Check for required workflow.yaml structure
530
+ local content
531
+ content=$(cat "output/workflow.yaml" 2>/dev/null || echo "")
532
+
533
+ assert_contains "$content" "workflow:" "Should have workflow: root key"
534
+ assert_contains "$content" "name:" "Should have name field"
535
+ assert_contains "$content" "description:" "Should have description field"
536
+ }
537
+
538
+ # =============================================================================
539
+ # AC5: Tri-modal structure preserved
540
+ # =============================================================================
541
+
542
+ test_ac5_preserves_steps_c_directory() {
543
+ create_trimodal_bmad_workflow
544
+ mkdir -p output
545
+
546
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
547
+
548
+ assert_dir_exists "output/steps-c" \
549
+ "Should preserve steps-c directory for create mode"
550
+ }
551
+
552
+ test_ac5_preserves_steps_v_directory() {
553
+ create_trimodal_bmad_workflow
554
+ mkdir -p output
555
+
556
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
557
+
558
+ assert_dir_exists "output/steps-v" \
559
+ "Should preserve steps-v directory for validate mode"
560
+ }
561
+
562
+ test_ac5_preserves_steps_e_directory() {
563
+ create_trimodal_bmad_workflow
564
+ mkdir -p output
565
+
566
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
567
+
568
+ assert_dir_exists "output/steps-e" \
569
+ "Should preserve steps-e directory for edit mode"
570
+ }
571
+
572
+ test_ac5_copies_all_modal_steps() {
573
+ create_trimodal_bmad_workflow
574
+ mkdir -p output
575
+
576
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
577
+
578
+ assert_file_exists "output/steps-c/step-01-init.md" \
579
+ "Should copy create mode steps"
580
+ assert_file_exists "output/steps-v/step-v-01-discovery.md" \
581
+ "Should copy validate mode steps"
582
+ assert_file_exists "output/steps-e/step-e-01-discovery.md" \
583
+ "Should copy edit mode steps"
584
+ }
585
+
586
+ test_ac5_yaml_references_modes() {
587
+ create_trimodal_bmad_workflow
588
+ mkdir -p output
589
+
590
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
591
+
592
+ local content
593
+ content=$(cat "output/workflow.yaml" 2>/dev/null || echo "")
594
+
595
+ # Should reference all three modes in workflow.yaml
596
+ assert_contains "$content" "modes:" "Should have modes configuration"
597
+ }
598
+
599
+ test_ac5_preserves_supporting_dirs() {
600
+ create_trimodal_bmad_workflow
601
+ mkdir -p output
602
+
603
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
604
+
605
+ # Should copy templates directory
606
+ assert_dir_exists "output/templates" \
607
+ "Should preserve templates directory"
608
+ }
609
+
610
+ # =============================================================================
611
+ # AC6: Dry-run mode shows changes without writing
612
+ # =============================================================================
613
+
614
+ test_ac6_dry_run_flag_accepted() {
615
+ create_simple_bmad_workflow
616
+ mkdir -p output
617
+
618
+ local output
619
+ output=$("$MIGRATE_SCRIPT" --dry-run bmad-workflow output 2>&1) || true
620
+ local exit_code=$?
621
+
622
+ # Should accept --dry-run flag without error
623
+ assert_eq "0" "$exit_code" "--dry-run should be accepted"
624
+ }
625
+
626
+ test_ac6_dry_run_shows_plan() {
627
+ create_simple_bmad_workflow
628
+ mkdir -p output
629
+
630
+ local output
631
+ output=$("$MIGRATE_SCRIPT" --dry-run bmad-workflow output 2>&1)
632
+
633
+ # Should show what would be done
634
+ assert_contains "$output" "workflow.yaml" "Dry-run should mention workflow.yaml"
635
+ }
636
+
637
+ test_ac6_dry_run_does_not_write() {
638
+ create_simple_bmad_workflow
639
+ mkdir -p output
640
+
641
+ "$MIGRATE_SCRIPT" --dry-run bmad-workflow output 2>/dev/null || true
642
+
643
+ # Should NOT create files
644
+ if [[ -f "output/workflow.yaml" ]]; then
645
+ echo -e "${RED}FAIL${NC}: Dry-run should not create workflow.yaml"
646
+ return 1
647
+ fi
648
+ return 0
649
+ }
650
+
651
+ test_ac6_dry_run_does_not_copy_steps() {
652
+ create_simple_bmad_workflow
653
+ mkdir -p output
654
+
655
+ "$MIGRATE_SCRIPT" --dry-run bmad-workflow output 2>/dev/null || true
656
+
657
+ # Should NOT copy step files
658
+ if [[ -f "output/steps/step-01-init.md" ]]; then
659
+ echo -e "${RED}FAIL${NC}: Dry-run should not copy step files"
660
+ return 1
661
+ fi
662
+ return 0
663
+ }
664
+
665
+ test_ac6_dry_run_shows_variable_conversions() {
666
+ create_workflow_with_dashed_variables
667
+ mkdir -p output
668
+
669
+ local output
670
+ output=$("$MIGRATE_SCRIPT" --dry-run bmad-workflow output 2>&1)
671
+
672
+ # Should mention variable conversions
673
+ assert_contains "$output" "variable" "Dry-run should mention variable conversions"
674
+ }
675
+
676
+ # =============================================================================
677
+ # Edge Cases
678
+ # =============================================================================
679
+
680
+ test_edge_missing_target_directory() {
681
+ create_simple_bmad_workflow
682
+
683
+ # Output directory doesn't exist - script should create it
684
+ "$MIGRATE_SCRIPT" bmad-workflow nonexistent-output 2>/dev/null || true
685
+
686
+ assert_dir_exists "nonexistent-output" \
687
+ "Should create target directory if it doesn't exist"
688
+ }
689
+
690
+ test_edge_empty_workflow() {
691
+ mkdir -p bmad-workflow
692
+
693
+ # Just workflow.md with minimal content
694
+ cat > bmad-workflow/workflow.md << 'EOF'
695
+ ---
696
+ name: empty
697
+ description: Empty workflow
698
+ ---
699
+
700
+ # Empty Workflow
701
+ EOF
702
+
703
+ mkdir -p output
704
+
705
+ # Should handle gracefully
706
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
707
+
708
+ assert_file_exists "output/workflow.yaml" \
709
+ "Should handle workflow with no steps"
710
+ }
711
+
712
+ test_edge_nested_step_directories() {
713
+ mkdir -p bmad-workflow/steps/substeps
714
+
715
+ cat > bmad-workflow/workflow.md << 'EOF'
716
+ ---
717
+ name: nested
718
+ description: Nested steps test
719
+ nextStep: './steps/step-01.md'
720
+ ---
721
+ # Nested
722
+ EOF
723
+
724
+ cat > bmad-workflow/steps/step-01.md << 'EOF'
725
+ ---
726
+ name: 'step-01'
727
+ description: 'Step with nested reference'
728
+ substepRef: './substeps/sub-01.md'
729
+ ---
730
+ # Step 1
731
+ EOF
732
+
733
+ cat > bmad-workflow/steps/substeps/sub-01.md << 'EOF'
734
+ ---
735
+ name: 'sub-01'
736
+ description: 'A substep'
737
+ ---
738
+ # Substep 1
739
+ EOF
740
+
741
+ mkdir -p output
742
+
743
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
744
+
745
+ # Should preserve nested structure
746
+ assert_file_exists "output/steps/substeps/sub-01.md" \
747
+ "Should preserve nested step directories"
748
+ }
749
+
750
+ test_edge_special_characters_in_content() {
751
+ mkdir -p bmad-workflow/steps
752
+
753
+ cat > bmad-workflow/workflow.md << 'EOF'
754
+ ---
755
+ name: special-chars
756
+ description: Test with $pecial ch@rs & "quotes"
757
+ ---
758
+ # Special Characters Test
759
+ EOF
760
+
761
+ cat > bmad-workflow/steps/step-01.md << 'EOF'
762
+ ---
763
+ name: 'step-01'
764
+ description: "Step with 'quotes' and $dollars"
765
+ ---
766
+ # Step 1
767
+
768
+ Content with `backticks` and [brackets] and {braces}.
769
+ EOF
770
+
771
+ mkdir -p output
772
+
773
+ "$MIGRATE_SCRIPT" bmad-workflow output 2>/dev/null || true
774
+
775
+ assert_file_contains "output/steps/step-01.md" "backticks" \
776
+ "Should preserve special characters in content"
777
+ }
778
+
779
+ # =============================================================================
780
+ # Run All Tests
781
+ # =============================================================================
782
+
783
+ echo ""
784
+ echo "=============================================="
785
+ echo "Story MSSCI-12132: BMAD Migration Script Tests"
786
+ echo "=============================================="
787
+ echo ""
788
+
789
+ echo "AC1: Script parses BMAD workflow.md configuration"
790
+ run_test "migrate-bmad-workflow.sh script exists" test_ac1_script_exists
791
+ run_test "accepts source path argument" test_ac1_accepts_source_path
792
+ run_test "extracts workflow name" test_ac1_extracts_workflow_name
793
+ run_test "extracts workflow description" test_ac1_extracts_workflow_description
794
+ run_test "errors on missing workflow.md" test_ac1_errors_on_missing_workflowmd
795
+
796
+ echo ""
797
+ echo "AC2: Script extracts YAML frontmatter from step files"
798
+ run_test "extracts step frontmatter" test_ac2_extracts_step_frontmatter
799
+ run_test "preserves step content" test_ac2_preserves_step_content
800
+ run_test "handles complex frontmatter" test_ac2_handles_complex_frontmatter
801
+
802
+ echo ""
803
+ echo "AC3: Variable syntax converted (dashes to underscores)"
804
+ run_test "converts dashed variables in workflow" test_ac3_converts_dashed_variables_in_workflow
805
+ run_test "converts dashed variables in steps" test_ac3_converts_dashed_variables_in_steps
806
+ run_test "converts all common variables" test_ac3_converts_all_common_variables
807
+ run_test "preserves non-variable dashes" test_ac3_preserves_non_variable_dashes
808
+
809
+ echo ""
810
+ echo "AC4: workflow.yaml generated with correct schema"
811
+ run_test "generates workflow.yaml" test_ac4_generates_workflow_yaml
812
+ run_test "yaml has type: stepped" test_ac4_yaml_has_type_stepped
813
+ run_test "yaml has steps config" test_ac4_yaml_has_steps_config
814
+ run_test "yaml has valid structure" test_ac4_yaml_has_valid_structure
815
+
816
+ echo ""
817
+ echo "AC5: Tri-modal structure preserved"
818
+ run_test "preserves steps-c directory" test_ac5_preserves_steps_c_directory
819
+ run_test "preserves steps-v directory" test_ac5_preserves_steps_v_directory
820
+ run_test "preserves steps-e directory" test_ac5_preserves_steps_e_directory
821
+ run_test "copies all modal steps" test_ac5_copies_all_modal_steps
822
+ run_test "yaml references modes" test_ac5_yaml_references_modes
823
+ run_test "preserves supporting directories" test_ac5_preserves_supporting_dirs
824
+
825
+ echo ""
826
+ echo "AC6: Dry-run mode shows changes without writing"
827
+ run_test "--dry-run flag accepted" test_ac6_dry_run_flag_accepted
828
+ run_test "dry-run shows plan" test_ac6_dry_run_shows_plan
829
+ run_test "dry-run does not write files" test_ac6_dry_run_does_not_write
830
+ run_test "dry-run does not copy steps" test_ac6_dry_run_does_not_copy_steps
831
+ run_test "dry-run shows variable conversions" test_ac6_dry_run_shows_variable_conversions
832
+
833
+ echo ""
834
+ echo "Edge Cases"
835
+ run_test "creates missing target directory" test_edge_missing_target_directory
836
+ run_test "handles empty workflow" test_edge_empty_workflow
837
+ run_test "handles nested step directories" test_edge_nested_step_directories
838
+ run_test "handles special characters" test_edge_special_characters_in_content
839
+
840
+ # =============================================================================
841
+ # Summary
842
+ # =============================================================================
843
+
844
+ echo ""
845
+ echo "=============================================="
846
+ echo "Test Summary"
847
+ echo "=============================================="
848
+ echo -e "Tests run: $TESTS_RUN"
849
+ echo -e "Tests passed: ${GREEN}$TESTS_PASSED${NC}"
850
+ echo -e "Tests failed: ${RED}$TESTS_FAILED${NC}"
851
+ echo ""
852
+
853
+ if [[ $TESTS_FAILED -gt 0 ]]; then
854
+ echo -e "${RED}FAILED${NC} - $TESTS_FAILED test(s) failed"
855
+ exit 1
856
+ else
857
+ echo -e "${GREEN}PASSED${NC} - All tests passed"
858
+ exit 0
859
+ fi