@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,589 @@
1
+ #!/usr/bin/env bash
2
+ # project-context-workflow-import.test.sh - Tests for Story MSSCI-12145: Import Project Context workflow
3
+ #
4
+ # These tests verify that the generate-project-context workflow from BMAD is correctly imported
5
+ # into Pennyfarthing's stepped workflow format.
6
+ #
7
+ # AC1: Migration script successfully imports workflow from BMAD source
8
+ # AC2: Generated workflow.yaml passes Pennyfarthing stepped workflow schema
9
+ # AC3: All BMAD-style dashed variables converted to underscore style
10
+ # AC4: /workflow start project-context lists correct 3 steps
11
+ # AC5: Template file copied and variables converted
12
+ # AC6: Workflow produces valid project-context.md output when run
13
+ #
14
+ # Run with: ./project-context-workflow-import.test.sh
15
+ # Or: bash project-context-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.mjs"
34
+ BMAD_SOURCE="${BMAD_PROJECT_CONTEXT_SOURCE:-$HOME/Projects/BMAD-METHOD/src/modules/bmm/workflows/generate-project-context}"
35
+ TARGET_DIR="$PROJECT_ROOT/pennyfarthing-dist/workflows/project-context"
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_SOURCE" ]]; then
208
+ echo -e "${RED}ERROR${NC}: BMAD project-context workflow source not found at: $BMAD_SOURCE"
209
+ echo "Set BMAD_PROJECT_CONTEXT_SOURCE environment variable to point to the BMAD 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 imports workflow from BMAD source
224
+ # =============================================================================
225
+
226
+ test_ac1_workflow_directory_exists() {
227
+ # This test verifies the workflow was migrated to the target directory
228
+ # EXPECTED: FAIL until Dev runs the migration
229
+
230
+ if [[ ! -d "$TARGET_DIR" ]]; then
231
+ echo -e "${RED}FAIL${NC}: project-context workflow not yet migrated to $TARGET_DIR"
232
+ return 1
233
+ fi
234
+ return 0
235
+ }
236
+
237
+ test_ac1_workflow_yaml_exists() {
238
+ assert_file_exists "$TARGET_DIR/workflow.yaml" \
239
+ "Migration should produce workflow.yaml"
240
+ }
241
+
242
+ test_ac1_workflow_yaml_has_name() {
243
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "name: generate-project-context" \
244
+ "workflow.yaml should have name: generate-project-context"
245
+ }
246
+
247
+ test_ac1_workflow_yaml_has_description() {
248
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "description:" \
249
+ "workflow.yaml should have a description"
250
+ }
251
+
252
+ test_ac1_steps_directory_exists() {
253
+ assert_dir_exists "$TARGET_DIR/steps" \
254
+ "Steps directory should exist"
255
+ }
256
+
257
+ # =============================================================================
258
+ # AC2: Generated workflow.yaml passes Pennyfarthing stepped workflow schema
259
+ # =============================================================================
260
+
261
+ test_ac2_workflow_yaml_has_type_stepped() {
262
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "type: stepped" \
263
+ "workflow.yaml should have type: stepped"
264
+ }
265
+
266
+ test_ac2_schema_has_steps_config() {
267
+ local content
268
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
269
+
270
+ assert_contains "$content" "steps:" "Should have steps configuration"
271
+ }
272
+
273
+ test_ac2_has_steps_path() {
274
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "path:" \
275
+ "workflow.yaml should have steps.path"
276
+ }
277
+
278
+ test_ac2_has_steps_pattern() {
279
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "pattern:" \
280
+ "workflow.yaml should have steps.pattern"
281
+ }
282
+
283
+ test_ac2_has_agent() {
284
+ # project-context workflow should have an agent assignment
285
+ local content
286
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
287
+
288
+ assert_contains "$content" "agent:" \
289
+ "workflow.yaml should have an agent assignment"
290
+ }
291
+
292
+ test_ac2_has_variables() {
293
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "variables:" \
294
+ "workflow.yaml should have variables section"
295
+ }
296
+
297
+ # =============================================================================
298
+ # AC3: All BMAD-style dashed variables converted to underscore style
299
+ # =============================================================================
300
+
301
+ test_ac3_no_dashed_variables_in_workflow() {
302
+ local content
303
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
304
+
305
+ # Check that common BMAD dashed variables are converted
306
+ assert_not_contains "$content" "{project-root}" \
307
+ "Should not have {project-root}" && \
308
+ assert_not_contains "$content" "{planning-artifacts}" \
309
+ "Should not have {planning-artifacts}" && \
310
+ assert_not_contains "$content" "{output-folder}" \
311
+ "Should not have {output-folder}"
312
+ }
313
+
314
+ test_ac3_no_dashed_variables_in_steps() {
315
+ # Check all step files in steps/ for unconverted variables
316
+ local found_dashed=0
317
+
318
+ for stepfile in "$TARGET_DIR"/steps/*.md; do
319
+ if [[ -f "$stepfile" ]]; then
320
+ # Look for dashed variables like {var-name}
321
+ if grep -qE '\{[a-z]+-[a-z-]+\}' "$stepfile" 2>/dev/null; then
322
+ echo " Found dashed variable in: $(basename "$stepfile")"
323
+ found_dashed=1
324
+ fi
325
+ fi
326
+ done
327
+
328
+ if [[ $found_dashed -eq 0 ]]; then
329
+ return 0
330
+ else
331
+ echo -e "${RED}FAIL${NC}: Found unconverted dashed variables in steps/"
332
+ return 1
333
+ fi
334
+ }
335
+
336
+ test_ac3_project_root_converted() {
337
+ # Check that {project-root} is converted to {project_root}
338
+ local found_old=0
339
+
340
+ for file in "$TARGET_DIR"/steps/*.md "$TARGET_DIR/workflow.yaml"; do
341
+ if [[ -f "$file" ]]; then
342
+ if grep -q '{project-root}' "$file" 2>/dev/null; then
343
+ found_old=1
344
+ fi
345
+ fi
346
+ done
347
+
348
+ if [[ $found_old -eq 0 ]]; then
349
+ return 0
350
+ else
351
+ echo -e "${RED}FAIL${NC}: Found unconverted {project-root} variable"
352
+ return 1
353
+ fi
354
+ }
355
+
356
+ test_ac3_user_skill_level_converted() {
357
+ # Check that {user-skill-level} is converted to {user_skill_level}
358
+ local found_old=0
359
+
360
+ for file in "$TARGET_DIR"/steps/*.md; do
361
+ if [[ -f "$file" ]]; then
362
+ if grep -q '{user-skill-level}' "$file" 2>/dev/null; then
363
+ found_old=1
364
+ fi
365
+ fi
366
+ done
367
+
368
+ if [[ $found_old -eq 0 ]]; then
369
+ return 0
370
+ else
371
+ echo -e "${RED}FAIL${NC}: Found unconverted {user-skill-level} variable"
372
+ return 1
373
+ fi
374
+ }
375
+
376
+ test_ac3_communication_language_converted() {
377
+ # Check that {communication-language} is converted to {communication_language}
378
+ local found_old=0
379
+
380
+ for file in "$TARGET_DIR"/steps/*.md; do
381
+ if [[ -f "$file" ]]; then
382
+ if grep -q '{communication-language}' "$file" 2>/dev/null; then
383
+ found_old=1
384
+ fi
385
+ fi
386
+ done
387
+
388
+ if [[ $found_old -eq 0 ]]; then
389
+ return 0
390
+ else
391
+ echo -e "${RED}FAIL${NC}: Found unconverted {communication-language} variable"
392
+ return 1
393
+ fi
394
+ }
395
+
396
+ test_ac3_preserves_non_variable_dashes() {
397
+ # Filenames like step-01-discover.md should keep their dashes
398
+ assert_file_exists "$TARGET_DIR/steps/step-01-discover.md" \
399
+ "Step files should keep dashed names"
400
+ }
401
+
402
+ # =============================================================================
403
+ # AC4: /workflow start project-context lists correct 3 steps
404
+ # =============================================================================
405
+
406
+ test_ac4_has_step_01_discover() {
407
+ assert_file_exists "$TARGET_DIR/steps/step-01-discover.md" \
408
+ "Should have step-01-discover.md"
409
+ }
410
+
411
+ test_ac4_has_step_02_generate() {
412
+ assert_file_exists "$TARGET_DIR/steps/step-02-generate.md" \
413
+ "Should have step-02-generate.md"
414
+ }
415
+
416
+ test_ac4_has_step_03_complete() {
417
+ assert_file_exists "$TARGET_DIR/steps/step-03-complete.md" \
418
+ "Should have step-03-complete.md"
419
+ }
420
+
421
+ test_ac4_step_count_is_3() {
422
+ local step_count
423
+ step_count=$(find "$TARGET_DIR/steps" -maxdepth 1 -name "step-*.md" -type f 2>/dev/null | wc -l | tr -d ' ')
424
+
425
+ if [[ "$step_count" -eq 3 ]]; then
426
+ return 0
427
+ else
428
+ echo -e "${RED}FAIL${NC}: Expected exactly 3 steps, found $step_count"
429
+ return 1
430
+ fi
431
+ }
432
+
433
+ test_ac4_steps_path_correct() {
434
+ # workflow.yaml steps.path should point to ./steps/
435
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "./steps/" \
436
+ "Steps path should be ./steps/"
437
+ }
438
+
439
+ # =============================================================================
440
+ # AC5: Template file copied and variables converted
441
+ # =============================================================================
442
+
443
+ test_ac5_template_file_exists() {
444
+ assert_file_exists "$TARGET_DIR/project-context-template.md" \
445
+ "project-context-template.md should exist"
446
+ }
447
+
448
+ test_ac5_template_has_content() {
449
+ # Template should have the Project Context header
450
+ assert_file_contains "$TARGET_DIR/project-context-template.md" "Project Context" \
451
+ "Template should have Project Context header"
452
+ }
453
+
454
+ test_ac5_template_variables_converted() {
455
+ # Template variables should be converted
456
+ local content
457
+ content=$(cat "$TARGET_DIR/project-context-template.md" 2>/dev/null || echo "")
458
+
459
+ # Should NOT have dashed variables
460
+ assert_not_contains "$content" "{project-name}" \
461
+ "Template should not have {project-name}"
462
+ }
463
+
464
+ test_ac5_template_has_sections() {
465
+ # Template should have expected sections
466
+ assert_file_contains "$TARGET_DIR/project-context-template.md" "Technology Stack" \
467
+ "Template should have Technology Stack section"
468
+ }
469
+
470
+ # =============================================================================
471
+ # AC6: Workflow produces valid project-context.md output when run
472
+ # (This test validates the workflow structure can produce valid output)
473
+ # =============================================================================
474
+
475
+ test_ac6_workflow_has_output_file_variable() {
476
+ # workflow.yaml should define output_file variable
477
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "output_file:" \
478
+ "workflow.yaml should have output_file variable"
479
+ }
480
+
481
+ test_ac6_step_01_has_discovery_section() {
482
+ # Step 1 should contain discovery logic
483
+ assert_file_contains "$TARGET_DIR/steps/step-01-discover.md" "Discovery" \
484
+ "Step 1 should have discovery content"
485
+ }
486
+
487
+ test_ac6_step_02_has_generation_section() {
488
+ # Step 2 should contain generation logic
489
+ assert_file_contains "$TARGET_DIR/steps/step-02-generate.md" "Generate" \
490
+ "Step 2 should have generation content"
491
+ }
492
+
493
+ test_ac6_step_03_has_completion_section() {
494
+ # Step 3 should contain completion logic
495
+ assert_file_contains "$TARGET_DIR/steps/step-03-complete.md" "Complete" \
496
+ "Step 3 should have completion content"
497
+ }
498
+
499
+ test_ac6_workflow_is_single_mode() {
500
+ # This workflow should NOT have tri-modal structure (steps-c/v/e)
501
+ if [[ -d "$TARGET_DIR/steps-c" ]] || [[ -d "$TARGET_DIR/steps-v" ]] || [[ -d "$TARGET_DIR/steps-e" ]]; then
502
+ echo -e "${RED}FAIL${NC}: project-context workflow should be single-mode, not tri-modal"
503
+ return 1
504
+ fi
505
+ return 0
506
+ }
507
+
508
+ # =============================================================================
509
+ # Run All Tests
510
+ # =============================================================================
511
+
512
+ echo ""
513
+ echo "=============================================="
514
+ echo "Story MSSCI-12145: Import Project Context Workflow Tests"
515
+ echo "=============================================="
516
+ echo ""
517
+
518
+ check_prerequisites
519
+
520
+ echo "AC1: Migration script successfully imports workflow from BMAD source"
521
+ run_test "workflow directory exists" test_ac1_workflow_directory_exists
522
+ run_test "workflow.yaml exists" test_ac1_workflow_yaml_exists
523
+ run_test "workflow.yaml has name" test_ac1_workflow_yaml_has_name
524
+ run_test "workflow.yaml has description" test_ac1_workflow_yaml_has_description
525
+ run_test "steps directory exists" test_ac1_steps_directory_exists
526
+
527
+ echo ""
528
+ echo "AC2: Generated workflow.yaml passes Pennyfarthing stepped workflow schema"
529
+ run_test "workflow.yaml has type: stepped" test_ac2_workflow_yaml_has_type_stepped
530
+ run_test "has steps configuration" test_ac2_schema_has_steps_config
531
+ run_test "has steps.path" test_ac2_has_steps_path
532
+ run_test "has steps.pattern" test_ac2_has_steps_pattern
533
+ run_test "has agent assignment" test_ac2_has_agent
534
+ run_test "has variables section" test_ac2_has_variables
535
+
536
+ echo ""
537
+ echo "AC3: All BMAD-style dashed variables converted to underscore style"
538
+ run_test "no dashed variables in workflow.yaml" test_ac3_no_dashed_variables_in_workflow
539
+ run_test "no dashed variables in steps" test_ac3_no_dashed_variables_in_steps
540
+ run_test "{project-root} converted" test_ac3_project_root_converted
541
+ run_test "{user-skill-level} converted" test_ac3_user_skill_level_converted
542
+ run_test "{communication-language} converted" test_ac3_communication_language_converted
543
+ run_test "preserves non-variable dashes in filenames" test_ac3_preserves_non_variable_dashes
544
+
545
+ echo ""
546
+ echo "AC4: /workflow start project-context lists correct 3 steps"
547
+ run_test "has step-01-discover.md" test_ac4_has_step_01_discover
548
+ run_test "has step-02-generate.md" test_ac4_has_step_02_generate
549
+ run_test "has step-03-complete.md" test_ac4_has_step_03_complete
550
+ run_test "step count is 3" test_ac4_step_count_is_3
551
+ run_test "steps path correct" test_ac4_steps_path_correct
552
+
553
+ echo ""
554
+ echo "AC5: Template file copied and variables converted"
555
+ run_test "template file exists" test_ac5_template_file_exists
556
+ run_test "template has content" test_ac5_template_has_content
557
+ run_test "template variables converted" test_ac5_template_variables_converted
558
+ run_test "template has expected sections" test_ac5_template_has_sections
559
+
560
+ echo ""
561
+ echo "AC6: Workflow produces valid project-context.md output when run"
562
+ run_test "workflow has output_file variable" test_ac6_workflow_has_output_file_variable
563
+ run_test "step 1 has discovery content" test_ac6_step_01_has_discovery_section
564
+ run_test "step 2 has generation content" test_ac6_step_02_has_generation_section
565
+ run_test "step 3 has completion content" test_ac6_step_03_has_completion_section
566
+ run_test "workflow is single-mode (not tri-modal)" test_ac6_workflow_is_single_mode
567
+
568
+ # =============================================================================
569
+ # Summary
570
+ # =============================================================================
571
+
572
+ echo ""
573
+ echo "=============================================="
574
+ echo "Test Summary"
575
+ echo "=============================================="
576
+ echo -e "Tests run: $TESTS_RUN"
577
+ echo -e "Tests passed: ${GREEN}$TESTS_PASSED${NC}"
578
+ echo -e "Tests failed: ${RED}$TESTS_FAILED${NC}"
579
+ echo ""
580
+
581
+ if [[ $TESTS_FAILED -gt 0 ]]; then
582
+ echo -e "${RED}FAILED${NC} - $TESTS_FAILED test(s) failed"
583
+ echo ""
584
+ echo "This is expected in RED state - Dev needs to run the migration script."
585
+ exit 1
586
+ else
587
+ echo -e "${GREEN}PASSED${NC} - All tests passed"
588
+ exit 0
589
+ fi
@@ -9,10 +9,6 @@
9
9
 
10
10
  set -euo pipefail
11
11
 
12
- # Find project root
13
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
14
- source "$SCRIPT_DIR/../utils/find-root.sh"
15
-
16
12
  # Colors
17
13
  RED='\033[0;31m'
18
14
  GREEN='\033[0;32m'
@@ -30,8 +26,10 @@ mkdir -p "$TEST_DIR/.pennyfarthing/personas/themes"
30
26
  mkdir -p "$TEST_DIR/.claude/pennyfarthing"
31
27
  mkdir -p "$TEST_DIR/scripts"
32
28
 
33
- # Copy agent-session.sh
34
- cp "$PROJECT_ROOT/scripts/agent-session.sh" "$TEST_DIR/scripts/"
29
+ # Copy core scripts (including agent-session.sh)
30
+ mkdir -p "$TEST_DIR/scripts/core"
31
+ cp "$PROJECT_ROOT/scripts/core/agent-session.sh" "$TEST_DIR/scripts/core/"
32
+ cp "$PROJECT_ROOT/scripts/core/run.sh" "$TEST_DIR/scripts/"
35
33
 
36
34
  # Create minimal theme file
37
35
  cat > "$TEST_DIR/.pennyfarthing/personas/themes/test-theme.yaml" << 'EOF'
@@ -54,7 +52,7 @@ EOF
54
52
  echo ""
55
53
  echo "Test 1: Without preferences file (should show persona)..."
56
54
  cd "$TEST_DIR"
57
- OUTPUT=$("$TEST_DIR/scripts/agent-session.sh" start sm test-session 2>&1 || true)
55
+ OUTPUT=$("$TEST_DIR/scripts/core/agent-session.sh" start sm test-session 2>&1 || true)
58
56
 
59
57
  if echo "$OUTPUT" | grep -q "Character:"; then
60
58
  echo -e "${GREEN}PASS${NC}: Persona shown when no preferences file"
@@ -73,7 +71,7 @@ explain_decisions: true
73
71
  auto_commit: false
74
72
  EOF
75
73
 
76
- OUTPUT=$("$TEST_DIR/scripts/agent-session.sh" start sm test-session-2 2>&1 || true)
74
+ OUTPUT=$("$TEST_DIR/scripts/core/agent-session.sh" start sm test-session-2 2>&1 || true)
77
75
 
78
76
  if echo "$OUTPUT" | grep -q "Character:"; then
79
77
  echo -e "${GREEN}PASS${NC}: Persona shown when character_voice=true"
@@ -92,7 +90,7 @@ explain_decisions: true
92
90
  auto_commit: false
93
91
  EOF
94
92
 
95
- OUTPUT=$("$TEST_DIR/scripts/agent-session.sh" start sm test-session-3 2>&1 || true)
93
+ OUTPUT=$("$TEST_DIR/scripts/core/agent-session.sh" start sm test-session-3 2>&1 || true)
96
94
 
97
95
  if echo "$OUTPUT" | grep -q "<persona"; then
98
96
  echo -e "${RED}FAIL${NC}: Persona shown when character_voice=false (should be suppressed)"