@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,662 @@
1
+ #!/usr/bin/env bash
2
+ # prd-workflow-import.test.sh - Tests for Story MSSCI-12133: Import PRD workflow (all 3 modes)
3
+ #
4
+ # These tests verify that the PRD workflow from BMAD is correctly imported into Pennyfarthing's
5
+ # stepped workflow format with all three modes (create, validate, edit) working correctly.
6
+ #
7
+ # AC1: Migration script successfully converts PRD workflow from BMAD format
8
+ # AC2: Generated workflow.yaml validates against Pennyfarthing schema
9
+ # AC3: All variable syntax converted ({var-name} → {var_name})
10
+ # AC4-AC6: Each mode executes correctly
11
+ # AC7: Gates pause at correct steps (2, 8, 12)
12
+ # AC8: Templates and data directories copied and accessible
13
+ #
14
+ # Run with: ./prd-workflow-import.test.sh
15
+ # Or: bash prd-workflow-import.test.sh
16
+
17
+ set -euo pipefail
18
+
19
+ # Colors for output
20
+ RED='\033[0;31m'
21
+ GREEN='\033[0;32m'
22
+ YELLOW='\033[1;33m'
23
+ NC='\033[0m' # No Color
24
+
25
+ # Test counters
26
+ TESTS_RUN=0
27
+ TESTS_PASSED=0
28
+ TESTS_FAILED=0
29
+
30
+ # Paths
31
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
32
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
33
+ MIGRATE_SCRIPT="$SCRIPT_DIR/migrate-bmad-workflow.sh"
34
+ BMAD_PRD_SOURCE="${BMAD_PRD_SOURCE:-$HOME/Projects/BMAD-METHOD/src/modules/bmm/workflows/2-plan-workflows/prd}"
35
+ TARGET_DIR="$PROJECT_ROOT/pennyfarthing-dist/workflows/prd"
36
+
37
+ # =============================================================================
38
+ # Test Framework
39
+ # =============================================================================
40
+
41
+ assert_eq() {
42
+ local expected="$1"
43
+ local actual="$2"
44
+ local message="${3:-Values should be equal}"
45
+
46
+ if [[ "$expected" == "$actual" ]]; then
47
+ return 0
48
+ else
49
+ echo -e "${RED}FAIL${NC}: $message"
50
+ echo " Expected: $expected"
51
+ echo " Actual: $actual"
52
+ return 1
53
+ fi
54
+ }
55
+
56
+ assert_contains() {
57
+ local haystack="$1"
58
+ local needle="$2"
59
+ local message="${3:-Output should contain expected text}"
60
+
61
+ if [[ "$haystack" == *"$needle"* ]]; then
62
+ return 0
63
+ else
64
+ echo -e "${RED}FAIL${NC}: $message"
65
+ echo " Expected to contain: $needle"
66
+ echo " Actual output: ${haystack:0:200}..."
67
+ return 1
68
+ fi
69
+ }
70
+
71
+ assert_not_contains() {
72
+ local haystack="$1"
73
+ local needle="$2"
74
+ local message="${3:-Output should not contain text}"
75
+
76
+ if [[ "$haystack" != *"$needle"* ]]; then
77
+ return 0
78
+ else
79
+ echo -e "${RED}FAIL${NC}: $message"
80
+ echo " Should not contain: $needle"
81
+ return 1
82
+ fi
83
+ }
84
+
85
+ assert_file_exists() {
86
+ local filepath="$1"
87
+ local message="${2:-File should exist}"
88
+
89
+ if [[ -f "$filepath" ]]; then
90
+ return 0
91
+ else
92
+ echo -e "${RED}FAIL${NC}: $message"
93
+ echo " File not found: $filepath"
94
+ return 1
95
+ fi
96
+ }
97
+
98
+ assert_dir_exists() {
99
+ local dirpath="$1"
100
+ local message="${2:-Directory should exist}"
101
+
102
+ if [[ -d "$dirpath" ]]; then
103
+ return 0
104
+ else
105
+ echo -e "${RED}FAIL${NC}: $message"
106
+ echo " Directory not found: $dirpath"
107
+ return 1
108
+ fi
109
+ }
110
+
111
+ assert_file_contains() {
112
+ local filepath="$1"
113
+ local needle="$2"
114
+ local message="${3:-File should contain text}"
115
+
116
+ if [[ ! -f "$filepath" ]]; then
117
+ echo -e "${RED}FAIL${NC}: $message"
118
+ echo " File not found: $filepath"
119
+ return 1
120
+ fi
121
+
122
+ local content
123
+ content=$(cat "$filepath")
124
+
125
+ if [[ "$content" == *"$needle"* ]]; then
126
+ return 0
127
+ else
128
+ echo -e "${RED}FAIL${NC}: $message"
129
+ echo " Expected file to contain: $needle"
130
+ echo " File: $filepath"
131
+ return 1
132
+ fi
133
+ }
134
+
135
+ assert_file_not_contains() {
136
+ local filepath="$1"
137
+ local needle="$2"
138
+ local message="${3:-File should not contain text}"
139
+
140
+ if [[ ! -f "$filepath" ]]; then
141
+ echo -e "${RED}FAIL${NC}: $message"
142
+ echo " File not found: $filepath"
143
+ return 1
144
+ fi
145
+
146
+ local content
147
+ content=$(cat "$filepath")
148
+
149
+ if [[ "$content" != *"$needle"* ]]; then
150
+ return 0
151
+ else
152
+ echo -e "${RED}FAIL${NC}: $message"
153
+ echo " Should not contain: $needle"
154
+ echo " File: $filepath"
155
+ return 1
156
+ fi
157
+ }
158
+
159
+ assert_file_count() {
160
+ local dirpath="$1"
161
+ local pattern="$2"
162
+ local expected_count="$3"
163
+ local message="${4:-File count should match}"
164
+
165
+ if [[ ! -d "$dirpath" ]]; then
166
+ echo -e "${RED}FAIL${NC}: $message"
167
+ echo " Directory not found: $dirpath"
168
+ return 1
169
+ fi
170
+
171
+ local actual_count
172
+ actual_count=$(find "$dirpath" -maxdepth 1 -name "$pattern" -type f | wc -l | tr -d ' ')
173
+
174
+ if [[ "$actual_count" -eq "$expected_count" ]]; then
175
+ return 0
176
+ else
177
+ echo -e "${RED}FAIL${NC}: $message"
178
+ echo " Expected: $expected_count files matching $pattern"
179
+ echo " Actual: $actual_count files"
180
+ return 1
181
+ fi
182
+ }
183
+
184
+ run_test() {
185
+ local test_name="$1"
186
+ local test_func="$2"
187
+
188
+ TESTS_RUN=$((TESTS_RUN + 1))
189
+
190
+ echo -n " $test_name... "
191
+
192
+ if $test_func; then
193
+ echo -e "${GREEN}PASS${NC}"
194
+ TESTS_PASSED=$((TESTS_PASSED + 1))
195
+ else
196
+ TESTS_FAILED=$((TESTS_FAILED + 1))
197
+ fi
198
+ }
199
+
200
+ # =============================================================================
201
+ # Prerequisites Check
202
+ # =============================================================================
203
+
204
+ check_prerequisites() {
205
+ echo "Checking prerequisites..."
206
+
207
+ if [[ ! -d "$BMAD_PRD_SOURCE" ]]; then
208
+ echo -e "${RED}ERROR${NC}: BMAD PRD workflow source not found at: $BMAD_PRD_SOURCE"
209
+ echo "Set BMAD_PRD_SOURCE environment variable to point to the BMAD PRD workflow directory"
210
+ exit 1
211
+ fi
212
+
213
+ if [[ ! -f "$MIGRATE_SCRIPT" ]]; then
214
+ echo -e "${RED}ERROR${NC}: Migration script not found at: $MIGRATE_SCRIPT"
215
+ exit 1
216
+ fi
217
+
218
+ echo -e "${GREEN}OK${NC}: Prerequisites met"
219
+ echo ""
220
+ }
221
+
222
+ # =============================================================================
223
+ # AC1: Migration script successfully converts PRD workflow from BMAD format
224
+ # =============================================================================
225
+
226
+ test_ac1_migration_completes() {
227
+ # This test verifies the migration script runs without error on PRD source
228
+ # EXPECTED: FAIL until Dev runs the migration
229
+
230
+ if [[ ! -d "$TARGET_DIR" ]]; then
231
+ echo -e "${RED}FAIL${NC}: PRD workflow not yet migrated to $TARGET_DIR"
232
+ return 1
233
+ fi
234
+
235
+ assert_file_exists "$TARGET_DIR/workflow.yaml" \
236
+ "Migration should produce workflow.yaml"
237
+ }
238
+
239
+ test_ac1_workflow_yaml_has_name() {
240
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "name: prd" \
241
+ "workflow.yaml should have name: prd"
242
+ }
243
+
244
+ test_ac1_workflow_yaml_has_description() {
245
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "description:" \
246
+ "workflow.yaml should have a description"
247
+ }
248
+
249
+ test_ac1_workflow_yaml_has_type_stepped() {
250
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "type: stepped" \
251
+ "workflow.yaml should have type: stepped"
252
+ }
253
+
254
+ # =============================================================================
255
+ # AC2: Generated workflow.yaml validates against Pennyfarthing schema
256
+ # =============================================================================
257
+
258
+ test_ac2_schema_validation_passes() {
259
+ # This test verifies the generated workflow.yaml passes schema validation
260
+ # We'll use the workflow-schema.test.ts validation or a simple structure check
261
+
262
+ local content
263
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
264
+
265
+ # Check for required stepped workflow fields
266
+ assert_contains "$content" "workflow:" "Should have workflow root key" && \
267
+ assert_contains "$content" "type: stepped" "Should have type: stepped" && \
268
+ assert_contains "$content" "steps:" "Should have steps configuration"
269
+ }
270
+
271
+ test_ac2_has_steps_path() {
272
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "path:" \
273
+ "workflow.yaml should have steps.path"
274
+ }
275
+
276
+ test_ac2_has_steps_pattern() {
277
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "pattern:" \
278
+ "workflow.yaml should have steps.pattern"
279
+ }
280
+
281
+ test_ac2_has_agent() {
282
+ # PRD workflow should have an agent assignment
283
+ local content
284
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
285
+
286
+ assert_contains "$content" "agent:" \
287
+ "workflow.yaml should have an agent assignment"
288
+ }
289
+
290
+ # =============================================================================
291
+ # AC3: All variable syntax converted ({var-name} → {var_name})
292
+ # =============================================================================
293
+
294
+ test_ac3_no_dashed_variables_in_workflow() {
295
+ local content
296
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
297
+
298
+ # Check that common BMAD dashed variables are converted
299
+ assert_not_contains "$content" "{project-root}" \
300
+ "Should not have {project-root}" && \
301
+ assert_not_contains "$content" "{planning-artifacts}" \
302
+ "Should not have {planning-artifacts}" && \
303
+ assert_not_contains "$content" "{output-folder}" \
304
+ "Should not have {output-folder}"
305
+ }
306
+
307
+ test_ac3_no_dashed_variables_in_create_steps() {
308
+ # Check all step files in steps-c/ for unconverted variables
309
+ local found_dashed=0
310
+
311
+ for stepfile in "$TARGET_DIR"/steps-c/*.md; do
312
+ if [[ -f "$stepfile" ]]; then
313
+ if grep -qE '\{[a-z]+-[a-z-]+\}' "$stepfile" 2>/dev/null; then
314
+ echo " Found dashed variable in: $(basename "$stepfile")"
315
+ found_dashed=1
316
+ fi
317
+ fi
318
+ done
319
+
320
+ if [[ $found_dashed -eq 0 ]]; then
321
+ return 0
322
+ else
323
+ echo -e "${RED}FAIL${NC}: Found unconverted dashed variables in steps-c/"
324
+ return 1
325
+ fi
326
+ }
327
+
328
+ test_ac3_no_dashed_variables_in_validate_steps() {
329
+ local found_dashed=0
330
+
331
+ for stepfile in "$TARGET_DIR"/steps-v/*.md; do
332
+ if [[ -f "$stepfile" ]]; then
333
+ if grep -qE '\{[a-z]+-[a-z-]+\}' "$stepfile" 2>/dev/null; then
334
+ echo " Found dashed variable in: $(basename "$stepfile")"
335
+ found_dashed=1
336
+ fi
337
+ fi
338
+ done
339
+
340
+ if [[ $found_dashed -eq 0 ]]; then
341
+ return 0
342
+ else
343
+ echo -e "${RED}FAIL${NC}: Found unconverted dashed variables in steps-v/"
344
+ return 1
345
+ fi
346
+ }
347
+
348
+ test_ac3_no_dashed_variables_in_edit_steps() {
349
+ local found_dashed=0
350
+
351
+ for stepfile in "$TARGET_DIR"/steps-e/*.md; do
352
+ if [[ -f "$stepfile" ]]; then
353
+ if grep -qE '\{[a-z]+-[a-z-]+\}' "$stepfile" 2>/dev/null; then
354
+ echo " Found dashed variable in: $(basename "$stepfile")"
355
+ found_dashed=1
356
+ fi
357
+ fi
358
+ done
359
+
360
+ if [[ $found_dashed -eq 0 ]]; then
361
+ return 0
362
+ else
363
+ echo -e "${RED}FAIL${NC}: Found unconverted dashed variables in steps-e/"
364
+ return 1
365
+ fi
366
+ }
367
+
368
+ test_ac3_preserves_non_variable_dashes() {
369
+ # Filenames like step-01-init.md should keep their dashes
370
+ assert_file_exists "$TARGET_DIR/steps-c/step-01-init.md" \
371
+ "Step files should keep dashed names"
372
+ }
373
+
374
+ # =============================================================================
375
+ # AC4: Create mode (steps-c/) executes correctly
376
+ # =============================================================================
377
+
378
+ test_ac4_steps_c_directory_exists() {
379
+ assert_dir_exists "$TARGET_DIR/steps-c" \
380
+ "Create mode steps directory (steps-c/) should exist"
381
+ }
382
+
383
+ test_ac4_steps_c_has_correct_count() {
384
+ # BMAD PRD has 13 create steps (including step-01b)
385
+ local step_count
386
+ step_count=$(find "$TARGET_DIR/steps-c" -maxdepth 1 -name "step-*.md" -type f 2>/dev/null | wc -l | tr -d ' ')
387
+
388
+ if [[ "$step_count" -ge 12 ]]; then
389
+ return 0
390
+ else
391
+ echo -e "${RED}FAIL${NC}: Expected at least 12 create steps, found $step_count"
392
+ return 1
393
+ fi
394
+ }
395
+
396
+ test_ac4_steps_c_has_init_step() {
397
+ assert_file_exists "$TARGET_DIR/steps-c/step-01-init.md" \
398
+ "Create mode should have step-01-init.md"
399
+ }
400
+
401
+ test_ac4_steps_c_has_complete_step() {
402
+ assert_file_exists "$TARGET_DIR/steps-c/step-12-complete.md" \
403
+ "Create mode should have step-12-complete.md"
404
+ }
405
+
406
+ test_ac4_workflow_references_create_mode() {
407
+ local content
408
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
409
+
410
+ assert_contains "$content" "create:" \
411
+ "workflow.yaml modes should reference create"
412
+ }
413
+
414
+ # =============================================================================
415
+ # AC5: Validate mode (steps-v/) executes correctly
416
+ # =============================================================================
417
+
418
+ test_ac5_steps_v_directory_exists() {
419
+ assert_dir_exists "$TARGET_DIR/steps-v" \
420
+ "Validate mode steps directory (steps-v/) should exist"
421
+ }
422
+
423
+ test_ac5_steps_v_has_files() {
424
+ local step_count
425
+ step_count=$(find "$TARGET_DIR/steps-v" -maxdepth 1 -name "step-*.md" -type f 2>/dev/null | wc -l | tr -d ' ')
426
+
427
+ if [[ "$step_count" -gt 0 ]]; then
428
+ return 0
429
+ else
430
+ echo -e "${RED}FAIL${NC}: Expected validate steps, found $step_count"
431
+ return 1
432
+ fi
433
+ }
434
+
435
+ test_ac5_steps_v_has_discovery_step() {
436
+ assert_file_exists "$TARGET_DIR/steps-v/step-v-01-discovery.md" \
437
+ "Validate mode should have step-v-01-discovery.md"
438
+ }
439
+
440
+ test_ac5_workflow_references_validate_mode() {
441
+ local content
442
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
443
+
444
+ assert_contains "$content" "validate:" \
445
+ "workflow.yaml modes should reference validate"
446
+ }
447
+
448
+ # =============================================================================
449
+ # AC6: Edit mode (steps-e/) executes correctly
450
+ # =============================================================================
451
+
452
+ test_ac6_steps_e_directory_exists() {
453
+ assert_dir_exists "$TARGET_DIR/steps-e" \
454
+ "Edit mode steps directory (steps-e/) should exist"
455
+ }
456
+
457
+ test_ac6_steps_e_has_files() {
458
+ local step_count
459
+ step_count=$(find "$TARGET_DIR/steps-e" -maxdepth 1 -name "step-*.md" -type f 2>/dev/null | wc -l | tr -d ' ')
460
+
461
+ if [[ "$step_count" -gt 0 ]]; then
462
+ return 0
463
+ else
464
+ echo -e "${RED}FAIL${NC}: Expected edit steps, found $step_count"
465
+ return 1
466
+ fi
467
+ }
468
+
469
+ test_ac6_steps_e_has_discovery_step() {
470
+ assert_file_exists "$TARGET_DIR/steps-e/step-e-01-discovery.md" \
471
+ "Edit mode should have step-e-01-discovery.md"
472
+ }
473
+
474
+ test_ac6_workflow_references_edit_mode() {
475
+ local content
476
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
477
+
478
+ assert_contains "$content" "edit:" \
479
+ "workflow.yaml modes should reference edit"
480
+ }
481
+
482
+ # =============================================================================
483
+ # AC7: Gates pause for user approval at steps 2, 8, 12
484
+ # =============================================================================
485
+
486
+ test_ac7_workflow_has_gates_config() {
487
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "gates:" \
488
+ "workflow.yaml should have gates configuration"
489
+ }
490
+
491
+ test_ac7_gates_has_after_steps() {
492
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "after_steps:" \
493
+ "gates should have after_steps array"
494
+ }
495
+
496
+ test_ac7_gates_include_discovery() {
497
+ # Gate after step 2 (discovery)
498
+ local content
499
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
500
+
501
+ # Look for 2 in after_steps array
502
+ if echo "$content" | grep -A5 "after_steps:" | grep -q "2"; then
503
+ return 0
504
+ else
505
+ echo -e "${RED}FAIL${NC}: Gates should include step 2 (discovery)"
506
+ return 1
507
+ fi
508
+ }
509
+
510
+ test_ac7_gates_include_scoping() {
511
+ # Gate after step 8 (scoping)
512
+ local content
513
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
514
+
515
+ if echo "$content" | grep -A10 "after_steps:" | grep -q "8"; then
516
+ return 0
517
+ else
518
+ echo -e "${RED}FAIL${NC}: Gates should include step 8 (scoping)"
519
+ return 1
520
+ fi
521
+ }
522
+
523
+ test_ac7_gates_include_completion() {
524
+ # Gate after step 12 (completion)
525
+ local content
526
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
527
+
528
+ if echo "$content" | grep -A15 "after_steps:" | grep -q "12"; then
529
+ return 0
530
+ else
531
+ echo -e "${RED}FAIL${NC}: Gates should include step 12 (completion)"
532
+ return 1
533
+ fi
534
+ }
535
+
536
+ # =============================================================================
537
+ # AC8: Templates and data directories copied and accessible
538
+ # =============================================================================
539
+
540
+ test_ac8_templates_directory_exists() {
541
+ assert_dir_exists "$TARGET_DIR/templates" \
542
+ "Templates directory should exist"
543
+ }
544
+
545
+ test_ac8_data_directory_exists() {
546
+ assert_dir_exists "$TARGET_DIR/data" \
547
+ "Data directory should exist"
548
+ }
549
+
550
+ test_ac8_prd_template_exists() {
551
+ # Check for a PRD template file
552
+ local template_count
553
+ template_count=$(find "$TARGET_DIR/templates" -name "*.md" -type f 2>/dev/null | wc -l | tr -d ' ')
554
+
555
+ if [[ "$template_count" -gt 0 ]]; then
556
+ return 0
557
+ else
558
+ echo -e "${RED}FAIL${NC}: Expected at least one template file in templates/"
559
+ return 1
560
+ fi
561
+ }
562
+
563
+ test_ac8_workflow_references_template() {
564
+ local content
565
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
566
+
567
+ assert_contains "$content" "template:" \
568
+ "workflow.yaml should reference template"
569
+ }
570
+
571
+ # =============================================================================
572
+ # Run All Tests
573
+ # =============================================================================
574
+
575
+ echo ""
576
+ echo "=============================================="
577
+ echo "Story MSSCI-12133: Import PRD Workflow Tests"
578
+ echo "=============================================="
579
+ echo ""
580
+
581
+ check_prerequisites
582
+
583
+ echo "AC1: Migration script converts PRD workflow from BMAD format"
584
+ run_test "migration completes (workflow dir exists)" test_ac1_migration_completes
585
+ run_test "workflow.yaml has name: prd" test_ac1_workflow_yaml_has_name
586
+ run_test "workflow.yaml has description" test_ac1_workflow_yaml_has_description
587
+ run_test "workflow.yaml has type: stepped" test_ac1_workflow_yaml_has_type_stepped
588
+
589
+ echo ""
590
+ echo "AC2: Generated workflow.yaml validates against schema"
591
+ run_test "schema validation passes" test_ac2_schema_validation_passes
592
+ run_test "has steps.path" test_ac2_has_steps_path
593
+ run_test "has steps.pattern" test_ac2_has_steps_pattern
594
+ run_test "has agent assignment" test_ac2_has_agent
595
+
596
+ echo ""
597
+ echo "AC3: Variable syntax converted"
598
+ run_test "no dashed variables in workflow.yaml" test_ac3_no_dashed_variables_in_workflow
599
+ run_test "no dashed variables in steps-c/" test_ac3_no_dashed_variables_in_create_steps
600
+ run_test "no dashed variables in steps-v/" test_ac3_no_dashed_variables_in_validate_steps
601
+ run_test "no dashed variables in steps-e/" test_ac3_no_dashed_variables_in_edit_steps
602
+ run_test "preserves non-variable dashes in filenames" test_ac3_preserves_non_variable_dashes
603
+
604
+ echo ""
605
+ echo "AC4: Create mode (steps-c/) executes correctly"
606
+ run_test "steps-c/ directory exists" test_ac4_steps_c_directory_exists
607
+ run_test "steps-c/ has correct step count" test_ac4_steps_c_has_correct_count
608
+ run_test "steps-c/ has init step" test_ac4_steps_c_has_init_step
609
+ run_test "steps-c/ has complete step" test_ac4_steps_c_has_complete_step
610
+ run_test "workflow references create mode" test_ac4_workflow_references_create_mode
611
+
612
+ echo ""
613
+ echo "AC5: Validate mode (steps-v/) executes correctly"
614
+ run_test "steps-v/ directory exists" test_ac5_steps_v_directory_exists
615
+ run_test "steps-v/ has files" test_ac5_steps_v_has_files
616
+ run_test "steps-v/ has discovery step" test_ac5_steps_v_has_discovery_step
617
+ run_test "workflow references validate mode" test_ac5_workflow_references_validate_mode
618
+
619
+ echo ""
620
+ echo "AC6: Edit mode (steps-e/) executes correctly"
621
+ run_test "steps-e/ directory exists" test_ac6_steps_e_directory_exists
622
+ run_test "steps-e/ has files" test_ac6_steps_e_has_files
623
+ run_test "steps-e/ has discovery step" test_ac6_steps_e_has_discovery_step
624
+ run_test "workflow references edit mode" test_ac6_workflow_references_edit_mode
625
+
626
+ echo ""
627
+ echo "AC7: Gates pause at steps 2, 8, 12"
628
+ run_test "workflow has gates config" test_ac7_workflow_has_gates_config
629
+ run_test "gates has after_steps" test_ac7_gates_has_after_steps
630
+ run_test "gates include step 2 (discovery)" test_ac7_gates_include_discovery
631
+ run_test "gates include step 8 (scoping)" test_ac7_gates_include_scoping
632
+ run_test "gates include step 12 (completion)" test_ac7_gates_include_completion
633
+
634
+ echo ""
635
+ echo "AC8: Templates and data directories accessible"
636
+ run_test "templates/ directory exists" test_ac8_templates_directory_exists
637
+ run_test "data/ directory exists" test_ac8_data_directory_exists
638
+ run_test "PRD template exists" test_ac8_prd_template_exists
639
+ run_test "workflow references template" test_ac8_workflow_references_template
640
+
641
+ # =============================================================================
642
+ # Summary
643
+ # =============================================================================
644
+
645
+ echo ""
646
+ echo "=============================================="
647
+ echo "Test Summary"
648
+ echo "=============================================="
649
+ echo -e "Tests run: $TESTS_RUN"
650
+ echo -e "Tests passed: ${GREEN}$TESTS_PASSED${NC}"
651
+ echo -e "Tests failed: ${RED}$TESTS_FAILED${NC}"
652
+ echo ""
653
+
654
+ if [[ $TESTS_FAILED -gt 0 ]]; then
655
+ echo -e "${RED}FAILED${NC} - $TESTS_FAILED test(s) failed"
656
+ echo ""
657
+ echo "This is expected in RED state - Dev needs to implement the migration."
658
+ exit 1
659
+ else
660
+ echo -e "${GREEN}PASSED${NC} - All tests passed"
661
+ exit 0
662
+ fi