@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,647 @@
1
+ #!/usr/bin/env bash
2
+ # ux-design-workflow-import.test.sh - Tests for Story MSSCI-12139
3
+ #
4
+ # These tests verify that the BMAD UX Design workflow is correctly
5
+ # imported into Pennyfarthing's stepped workflow format.
6
+ #
7
+ # Source: ~/Projects/BMAD-METHOD/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/
8
+ # Target: pennyfarthing-dist/workflows/ux-design/
9
+ #
10
+ # This is a SINGLE-MODE STEPPED workflow with 14 step files:
11
+ # - step-01-init.md through step-14-complete.md
12
+ # - step-01b-continue.md (continuation handler)
13
+ # - ux-design-template.md (output template)
14
+ #
15
+ # AC1: pennyfarthing-dist/workflows/ux-design/ directory created
16
+ # AC2: workflow.yaml with correct schema (name, description, type: stepped, steps)
17
+ # AC3: All 14 step files copied with variable syntax validated
18
+ # AC4: Template file (ux-design-template.md) copied
19
+ # AC5: Continuation handler (step-01b-continue.md) copied
20
+ # AC6: /workflow list shows ux-design as available workflow
21
+ # AC7: Workflow can be started with /workflow start ux-design
22
+ #
23
+ # Run with: ./ux-design-workflow-import.test.sh
24
+ # Or: bash ux-design-workflow-import.test.sh
25
+
26
+ set -euo pipefail
27
+
28
+ # Colors for output
29
+ RED='\033[0;31m'
30
+ GREEN='\033[0;32m'
31
+ YELLOW='\033[1;33m'
32
+ NC='\033[0m' # No Color
33
+
34
+ # Test counters
35
+ TESTS_RUN=0
36
+ TESTS_PASSED=0
37
+ TESTS_FAILED=0
38
+
39
+ # Paths
40
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
41
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
42
+ BMAD_SOURCE="${BMAD_UX_DESIGN_SOURCE:-$HOME/Projects/BMAD-METHOD/src/modules/bmm/workflows/2-plan-workflows/create-ux-design}"
43
+ TARGET_DIR="$PROJECT_ROOT/pennyfarthing-dist/workflows/ux-design"
44
+
45
+ # =============================================================================
46
+ # Test Framework
47
+ # =============================================================================
48
+
49
+ assert_eq() {
50
+ local expected="$1"
51
+ local actual="$2"
52
+ local message="${3:-Values should be equal}"
53
+
54
+ if [[ "$expected" == "$actual" ]]; then
55
+ return 0
56
+ else
57
+ echo -e "${RED}FAIL${NC}: $message"
58
+ echo " Expected: $expected"
59
+ echo " Actual: $actual"
60
+ return 1
61
+ fi
62
+ }
63
+
64
+ assert_contains() {
65
+ local haystack="$1"
66
+ local needle="$2"
67
+ local message="${3:-Output should contain expected text}"
68
+
69
+ if [[ "$haystack" == *"$needle"* ]]; then
70
+ return 0
71
+ else
72
+ echo -e "${RED}FAIL${NC}: $message"
73
+ echo " Expected to contain: $needle"
74
+ echo " Actual output: ${haystack:0:200}..."
75
+ return 1
76
+ fi
77
+ }
78
+
79
+ assert_not_contains() {
80
+ local haystack="$1"
81
+ local needle="$2"
82
+ local message="${3:-Output should not contain text}"
83
+
84
+ if [[ "$haystack" != *"$needle"* ]]; then
85
+ return 0
86
+ else
87
+ echo -e "${RED}FAIL${NC}: $message"
88
+ echo " Should not contain: $needle"
89
+ return 1
90
+ fi
91
+ }
92
+
93
+ assert_file_exists() {
94
+ local filepath="$1"
95
+ local message="${2:-File should exist}"
96
+
97
+ if [[ -f "$filepath" ]]; then
98
+ return 0
99
+ else
100
+ echo -e "${RED}FAIL${NC}: $message"
101
+ echo " File not found: $filepath"
102
+ return 1
103
+ fi
104
+ }
105
+
106
+ assert_dir_exists() {
107
+ local dirpath="$1"
108
+ local message="${2:-Directory should exist}"
109
+
110
+ if [[ -d "$dirpath" ]]; then
111
+ return 0
112
+ else
113
+ echo -e "${RED}FAIL${NC}: $message"
114
+ echo " Directory not found: $dirpath"
115
+ return 1
116
+ fi
117
+ }
118
+
119
+ assert_file_contains() {
120
+ local filepath="$1"
121
+ local needle="$2"
122
+ local message="${3:-File should contain text}"
123
+
124
+ if [[ ! -f "$filepath" ]]; then
125
+ echo -e "${RED}FAIL${NC}: $message"
126
+ echo " File not found: $filepath"
127
+ return 1
128
+ fi
129
+
130
+ local content
131
+ content=$(cat "$filepath")
132
+
133
+ if [[ "$content" == *"$needle"* ]]; then
134
+ return 0
135
+ else
136
+ echo -e "${RED}FAIL${NC}: $message"
137
+ echo " Expected file to contain: $needle"
138
+ echo " File: $filepath"
139
+ return 1
140
+ fi
141
+ }
142
+
143
+ assert_file_not_contains() {
144
+ local filepath="$1"
145
+ local needle="$2"
146
+ local message="${3:-File should not contain text}"
147
+
148
+ if [[ ! -f "$filepath" ]]; then
149
+ echo -e "${RED}FAIL${NC}: $message"
150
+ echo " File not found: $filepath"
151
+ return 1
152
+ fi
153
+
154
+ local content
155
+ content=$(cat "$filepath")
156
+
157
+ if [[ "$content" != *"$needle"* ]]; then
158
+ return 0
159
+ else
160
+ echo -e "${RED}FAIL${NC}: $message"
161
+ echo " Should not contain: $needle"
162
+ echo " File: $filepath"
163
+ return 1
164
+ fi
165
+ }
166
+
167
+ assert_file_not_empty() {
168
+ local filepath="$1"
169
+ local message="${2:-File should not be empty}"
170
+
171
+ if [[ ! -f "$filepath" ]]; then
172
+ echo -e "${RED}FAIL${NC}: $message"
173
+ echo " File not found: $filepath"
174
+ return 1
175
+ fi
176
+
177
+ if [[ -s "$filepath" ]]; then
178
+ return 0
179
+ else
180
+ echo -e "${RED}FAIL${NC}: $message"
181
+ echo " File is empty: $filepath"
182
+ return 1
183
+ fi
184
+ }
185
+
186
+ run_test() {
187
+ local test_name="$1"
188
+ local test_func="$2"
189
+
190
+ TESTS_RUN=$((TESTS_RUN + 1))
191
+
192
+ echo -n " $test_name... "
193
+
194
+ if $test_func; then
195
+ echo -e "${GREEN}PASS${NC}"
196
+ TESTS_PASSED=$((TESTS_PASSED + 1))
197
+ else
198
+ TESTS_FAILED=$((TESTS_FAILED + 1))
199
+ fi
200
+ }
201
+
202
+ # =============================================================================
203
+ # Prerequisites Check
204
+ # =============================================================================
205
+
206
+ check_prerequisites() {
207
+ echo "Checking prerequisites..."
208
+
209
+ if [[ ! -d "$BMAD_SOURCE" ]]; then
210
+ echo -e "${RED}ERROR${NC}: BMAD UX Design workflow source not found at: $BMAD_SOURCE"
211
+ echo "Set BMAD_UX_DESIGN_SOURCE environment variable to point to the BMAD workflow directory"
212
+ exit 1
213
+ fi
214
+
215
+ if [[ ! -f "$BMAD_SOURCE/workflow.md" ]]; then
216
+ echo -e "${RED}ERROR${NC}: BMAD UX Design workflow.md not found at: $BMAD_SOURCE/workflow.md"
217
+ exit 1
218
+ fi
219
+
220
+ if [[ ! -d "$BMAD_SOURCE/steps" ]]; then
221
+ echo -e "${RED}ERROR${NC}: BMAD UX Design steps directory not found"
222
+ exit 1
223
+ fi
224
+
225
+ echo -e "${GREEN}OK${NC}: Prerequisites met"
226
+ echo ""
227
+ }
228
+
229
+ # =============================================================================
230
+ # AC1: pennyfarthing-dist/workflows/ux-design/ directory created
231
+ # =============================================================================
232
+
233
+ test_ac1_workflow_directory_exists() {
234
+ assert_dir_exists "$TARGET_DIR" \
235
+ "ux-design workflow directory should exist at $TARGET_DIR"
236
+ }
237
+
238
+ test_ac1_workflow_yaml_exists() {
239
+ assert_file_exists "$TARGET_DIR/workflow.yaml" \
240
+ "workflow.yaml should exist in target directory"
241
+ }
242
+
243
+ test_ac1_steps_directory_exists() {
244
+ assert_dir_exists "$TARGET_DIR/steps" \
245
+ "steps/ directory should exist in target"
246
+ }
247
+
248
+ # =============================================================================
249
+ # AC2: workflow.yaml with correct schema (name, description, type: stepped, steps)
250
+ # =============================================================================
251
+
252
+ test_ac2_workflow_yaml_has_name() {
253
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "name:" \
254
+ "workflow.yaml should have name field"
255
+ }
256
+
257
+ test_ac2_workflow_yaml_has_ux_design_name() {
258
+ # The workflow should be named ux-design or create-ux-design
259
+ local content
260
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
261
+
262
+ if [[ "$content" == *"ux-design"* ]] || [[ "$content" == *"create-ux-design"* ]]; then
263
+ return 0
264
+ else
265
+ echo -e "${RED}FAIL${NC}: workflow.yaml should have ux-design in name"
266
+ return 1
267
+ fi
268
+ }
269
+
270
+ test_ac2_workflow_yaml_has_description() {
271
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "description:" \
272
+ "workflow.yaml should have description field"
273
+ }
274
+
275
+ test_ac2_workflow_yaml_has_type() {
276
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "type:" \
277
+ "workflow.yaml should have type field"
278
+ }
279
+
280
+ test_ac2_workflow_yaml_has_stepped_type() {
281
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "stepped" \
282
+ "workflow.yaml should have type: stepped (14 sequential steps)"
283
+ }
284
+
285
+ test_ac2_workflow_yaml_has_steps_config() {
286
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "steps:" \
287
+ "workflow.yaml should have steps configuration"
288
+ }
289
+
290
+ test_ac2_workflow_yaml_has_steps_path() {
291
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "path:" \
292
+ "workflow.yaml should have steps path defined"
293
+ }
294
+
295
+ test_ac2_workflow_yaml_has_agent() {
296
+ # UX Design workflow should be assigned to ux-designer agent
297
+ local content
298
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
299
+
300
+ if [[ "$content" == *"ux-designer"* ]] || [[ "$content" == *"agent:"* ]]; then
301
+ return 0
302
+ else
303
+ echo -e "${RED}FAIL${NC}: workflow.yaml should have agent assignment"
304
+ return 1
305
+ fi
306
+ }
307
+
308
+ # =============================================================================
309
+ # AC3: All 14 step files copied with variable syntax validated
310
+ # =============================================================================
311
+
312
+ test_ac3_step_01_exists() {
313
+ assert_file_exists "$TARGET_DIR/steps/step-01-init.md" \
314
+ "step-01-init.md should exist"
315
+ }
316
+
317
+ test_ac3_step_02_exists() {
318
+ assert_file_exists "$TARGET_DIR/steps/step-02-discovery.md" \
319
+ "step-02-discovery.md should exist"
320
+ }
321
+
322
+ test_ac3_step_03_exists() {
323
+ assert_file_exists "$TARGET_DIR/steps/step-03-core-experience.md" \
324
+ "step-03-core-experience.md should exist"
325
+ }
326
+
327
+ test_ac3_step_04_exists() {
328
+ assert_file_exists "$TARGET_DIR/steps/step-04-emotional-response.md" \
329
+ "step-04-emotional-response.md should exist"
330
+ }
331
+
332
+ test_ac3_step_05_exists() {
333
+ assert_file_exists "$TARGET_DIR/steps/step-05-inspiration.md" \
334
+ "step-05-inspiration.md should exist"
335
+ }
336
+
337
+ test_ac3_step_06_exists() {
338
+ assert_file_exists "$TARGET_DIR/steps/step-06-design-system.md" \
339
+ "step-06-design-system.md should exist"
340
+ }
341
+
342
+ test_ac3_step_07_exists() {
343
+ assert_file_exists "$TARGET_DIR/steps/step-07-defining-experience.md" \
344
+ "step-07-defining-experience.md should exist"
345
+ }
346
+
347
+ test_ac3_step_08_exists() {
348
+ assert_file_exists "$TARGET_DIR/steps/step-08-visual-foundation.md" \
349
+ "step-08-visual-foundation.md should exist"
350
+ }
351
+
352
+ test_ac3_step_09_exists() {
353
+ assert_file_exists "$TARGET_DIR/steps/step-09-design-directions.md" \
354
+ "step-09-design-directions.md should exist"
355
+ }
356
+
357
+ test_ac3_step_10_exists() {
358
+ assert_file_exists "$TARGET_DIR/steps/step-10-user-journeys.md" \
359
+ "step-10-user-journeys.md should exist"
360
+ }
361
+
362
+ test_ac3_step_11_exists() {
363
+ assert_file_exists "$TARGET_DIR/steps/step-11-component-strategy.md" \
364
+ "step-11-component-strategy.md should exist"
365
+ }
366
+
367
+ test_ac3_step_12_exists() {
368
+ assert_file_exists "$TARGET_DIR/steps/step-12-ux-patterns.md" \
369
+ "step-12-ux-patterns.md should exist"
370
+ }
371
+
372
+ test_ac3_step_13_exists() {
373
+ assert_file_exists "$TARGET_DIR/steps/step-13-responsive-accessibility.md" \
374
+ "step-13-responsive-accessibility.md should exist"
375
+ }
376
+
377
+ test_ac3_step_14_exists() {
378
+ assert_file_exists "$TARGET_DIR/steps/step-14-complete.md" \
379
+ "step-14-complete.md should exist"
380
+ }
381
+
382
+ test_ac3_step_01_not_empty() {
383
+ assert_file_not_empty "$TARGET_DIR/steps/step-01-init.md" \
384
+ "step-01-init.md should have content"
385
+ }
386
+
387
+ test_ac3_step_14_not_empty() {
388
+ assert_file_not_empty "$TARGET_DIR/steps/step-14-complete.md" \
389
+ "step-14-complete.md should have content"
390
+ }
391
+
392
+ test_ac3_step_count_is_14() {
393
+ # Count step files in the steps directory (excluding step-01b-continue.md)
394
+ local step_count
395
+ step_count=$(find "$TARGET_DIR/steps" -name "step-[0-9]*.md" ! -name "step-*b-*.md" 2>/dev/null | wc -l | tr -d ' ')
396
+
397
+ if [[ "$step_count" -eq 14 ]]; then
398
+ return 0
399
+ else
400
+ echo -e "${RED}FAIL${NC}: Expected 14 step files, found $step_count"
401
+ return 1
402
+ fi
403
+ }
404
+
405
+ test_ac3_no_dashed_variables() {
406
+ # Check that BMAD-style dashed variables {var-name} have been converted
407
+ # to Pennyfarthing underscore style {var_name}
408
+ local dashed_vars
409
+ dashed_vars=$(grep -r '\{[a-zA-Z0-9_]*-[a-zA-Z0-9_-]*\}' "$TARGET_DIR/steps/" 2>/dev/null || echo "")
410
+
411
+ if [[ -z "$dashed_vars" ]]; then
412
+ return 0
413
+ else
414
+ echo -e "${RED}FAIL${NC}: Found BMAD-style dashed variables that should be converted to underscores"
415
+ echo " Found: ${dashed_vars:0:100}..."
416
+ return 1
417
+ fi
418
+ }
419
+
420
+ # =============================================================================
421
+ # AC4: Template file (ux-design-template.md) copied
422
+ # =============================================================================
423
+
424
+ test_ac4_template_file_exists() {
425
+ assert_file_exists "$TARGET_DIR/ux-design-template.md" \
426
+ "ux-design-template.md should be copied"
427
+ }
428
+
429
+ test_ac4_template_not_empty() {
430
+ assert_file_not_empty "$TARGET_DIR/ux-design-template.md" \
431
+ "template file should not be empty"
432
+ }
433
+
434
+ test_ac4_template_has_ux_content() {
435
+ # Template should have UX-related content
436
+ local content
437
+ content=$(cat "$TARGET_DIR/ux-design-template.md" 2>/dev/null || echo "")
438
+
439
+ if [[ "$content" == *"UX"* ]] || [[ "$content" == *"design"* ]] || \
440
+ [[ "$content" == *"Design"* ]] || [[ "$content" == *"user"* ]]; then
441
+ return 0
442
+ else
443
+ echo -e "${RED}FAIL${NC}: template should have UX/design content"
444
+ return 1
445
+ fi
446
+ }
447
+
448
+ # =============================================================================
449
+ # AC5: Continuation handler (step-01b-continue.md) copied
450
+ # =============================================================================
451
+
452
+ test_ac5_continuation_handler_exists() {
453
+ assert_file_exists "$TARGET_DIR/steps/step-01b-continue.md" \
454
+ "step-01b-continue.md should be copied"
455
+ }
456
+
457
+ test_ac5_continuation_handler_not_empty() {
458
+ assert_file_not_empty "$TARGET_DIR/steps/step-01b-continue.md" \
459
+ "continuation handler should have content"
460
+ }
461
+
462
+ test_ac5_continuation_handler_has_continue_logic() {
463
+ # Should have content about resuming/continuing
464
+ local content
465
+ content=$(cat "$TARGET_DIR/steps/step-01b-continue.md" 2>/dev/null || echo "")
466
+
467
+ if [[ "$content" == *"continu"* ]] || [[ "$content" == *"resum"* ]] || \
468
+ [[ "$content" == *"existing"* ]] || [[ "$content" == *"previous"* ]]; then
469
+ return 0
470
+ else
471
+ echo -e "${RED}FAIL${NC}: continuation handler should have resume/continue logic"
472
+ return 1
473
+ fi
474
+ }
475
+
476
+ # =============================================================================
477
+ # AC6: /workflow list shows ux-design as available workflow
478
+ # =============================================================================
479
+
480
+ test_ac6_workflow_yaml_valid_yaml() {
481
+ if command -v yq &> /dev/null; then
482
+ if yq '.' "$TARGET_DIR/workflow.yaml" > /dev/null 2>&1; then
483
+ return 0
484
+ else
485
+ echo -e "${RED}FAIL${NC}: workflow.yaml is not valid YAML"
486
+ return 1
487
+ fi
488
+ else
489
+ echo -e "${YELLOW}SKIP${NC}: yq not available for YAML validation"
490
+ return 0
491
+ fi
492
+ }
493
+
494
+ test_ac6_workflow_has_triggers() {
495
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "triggers:" \
496
+ "workflow.yaml should have triggers section for workflow listing"
497
+ }
498
+
499
+ test_ac6_workflow_triggers_has_types() {
500
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "types:" \
501
+ "workflow.yaml triggers should have types field"
502
+ }
503
+
504
+ test_ac6_workflow_triggers_has_ux_design() {
505
+ # Triggers should include ux-design for discoverability
506
+ local content
507
+ content=$(cat "$TARGET_DIR/workflow.yaml" 2>/dev/null || echo "")
508
+
509
+ if [[ "$content" == *"ux-design"* ]] || [[ "$content" == *"ux_design"* ]]; then
510
+ return 0
511
+ else
512
+ echo -e "${RED}FAIL${NC}: workflow.yaml triggers should include ux-design"
513
+ return 1
514
+ fi
515
+ }
516
+
517
+ # =============================================================================
518
+ # AC7: Workflow can be started with /workflow start ux-design
519
+ # =============================================================================
520
+
521
+ test_ac7_workflow_has_version() {
522
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "version:" \
523
+ "workflow.yaml should have version field"
524
+ }
525
+
526
+ test_ac7_workflow_has_variables() {
527
+ # Workflow should define variables for step files
528
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "variables:" \
529
+ "workflow.yaml should have variables section"
530
+ }
531
+
532
+ test_ac7_first_step_is_init() {
533
+ # First step should be step-01-init.md for proper startup
534
+ assert_file_exists "$TARGET_DIR/steps/step-01-init.md" \
535
+ "first step (step-01-init.md) should exist for workflow start"
536
+ }
537
+
538
+ test_ac7_last_step_is_complete() {
539
+ # Last step should be step-14-complete.md
540
+ assert_file_exists "$TARGET_DIR/steps/step-14-complete.md" \
541
+ "last step (step-14-complete.md) should exist"
542
+ }
543
+
544
+ test_ac7_steps_pattern_matches() {
545
+ # workflow.yaml should have pattern that matches step files
546
+ assert_file_contains "$TARGET_DIR/workflow.yaml" "step-*.md" \
547
+ "workflow.yaml should have pattern: step-*.md"
548
+ }
549
+
550
+ # =============================================================================
551
+ # Run All Tests
552
+ # =============================================================================
553
+
554
+ echo ""
555
+ echo "=============================================="
556
+ echo "Story MSSCI-12139: Import UX Design Workflow Tests"
557
+ echo "=============================================="
558
+ echo ""
559
+
560
+ check_prerequisites
561
+
562
+ echo "AC1: pennyfarthing-dist/workflows/ux-design/ directory created"
563
+ run_test "workflow directory exists" test_ac1_workflow_directory_exists
564
+ run_test "workflow.yaml exists" test_ac1_workflow_yaml_exists
565
+ run_test "steps/ directory exists" test_ac1_steps_directory_exists
566
+
567
+ echo ""
568
+ echo "AC2: workflow.yaml with correct schema (name, description, type: stepped, steps)"
569
+ run_test "workflow.yaml has name field" test_ac2_workflow_yaml_has_name
570
+ run_test "workflow.yaml has ux-design name" test_ac2_workflow_yaml_has_ux_design_name
571
+ run_test "workflow.yaml has description" test_ac2_workflow_yaml_has_description
572
+ run_test "workflow.yaml has type field" test_ac2_workflow_yaml_has_type
573
+ run_test "workflow.yaml has stepped type" test_ac2_workflow_yaml_has_stepped_type
574
+ run_test "workflow.yaml has steps config" test_ac2_workflow_yaml_has_steps_config
575
+ run_test "workflow.yaml has steps path" test_ac2_workflow_yaml_has_steps_path
576
+ run_test "workflow.yaml has agent assignment" test_ac2_workflow_yaml_has_agent
577
+
578
+ echo ""
579
+ echo "AC3: All 14 step files copied with variable syntax validated"
580
+ run_test "step-01-init.md exists" test_ac3_step_01_exists
581
+ run_test "step-02-discovery.md exists" test_ac3_step_02_exists
582
+ run_test "step-03-core-experience.md exists" test_ac3_step_03_exists
583
+ run_test "step-04-emotional-response.md exists" test_ac3_step_04_exists
584
+ run_test "step-05-inspiration.md exists" test_ac3_step_05_exists
585
+ run_test "step-06-design-system.md exists" test_ac3_step_06_exists
586
+ run_test "step-07-defining-experience.md exists" test_ac3_step_07_exists
587
+ run_test "step-08-visual-foundation.md exists" test_ac3_step_08_exists
588
+ run_test "step-09-design-directions.md exists" test_ac3_step_09_exists
589
+ run_test "step-10-user-journeys.md exists" test_ac3_step_10_exists
590
+ run_test "step-11-component-strategy.md exists" test_ac3_step_11_exists
591
+ run_test "step-12-ux-patterns.md exists" test_ac3_step_12_exists
592
+ run_test "step-13-responsive-accessibility.md exists" test_ac3_step_13_exists
593
+ run_test "step-14-complete.md exists" test_ac3_step_14_exists
594
+ run_test "step-01 has content" test_ac3_step_01_not_empty
595
+ run_test "step-14 has content" test_ac3_step_14_not_empty
596
+ run_test "exactly 14 step files present" test_ac3_step_count_is_14
597
+ run_test "no dashed variables (converted to underscores)" test_ac3_no_dashed_variables
598
+
599
+ echo ""
600
+ echo "AC4: Template file (ux-design-template.md) copied"
601
+ run_test "ux-design-template.md exists" test_ac4_template_file_exists
602
+ run_test "template file has content" test_ac4_template_not_empty
603
+ run_test "template has UX content" test_ac4_template_has_ux_content
604
+
605
+ echo ""
606
+ echo "AC5: Continuation handler (step-01b-continue.md) copied"
607
+ run_test "step-01b-continue.md exists" test_ac5_continuation_handler_exists
608
+ run_test "continuation handler has content" test_ac5_continuation_handler_not_empty
609
+ run_test "continuation handler has continue logic" test_ac5_continuation_handler_has_continue_logic
610
+
611
+ echo ""
612
+ echo "AC6: /workflow list shows ux-design as available workflow"
613
+ run_test "workflow.yaml is valid YAML" test_ac6_workflow_yaml_valid_yaml
614
+ run_test "workflow.yaml has triggers section" test_ac6_workflow_has_triggers
615
+ run_test "triggers has types field" test_ac6_workflow_triggers_has_types
616
+ run_test "triggers includes ux-design" test_ac6_workflow_triggers_has_ux_design
617
+
618
+ echo ""
619
+ echo "AC7: Workflow can be started with /workflow start ux-design"
620
+ run_test "workflow.yaml has version" test_ac7_workflow_has_version
621
+ run_test "workflow.yaml has variables" test_ac7_workflow_has_variables
622
+ run_test "first step is step-01-init.md" test_ac7_first_step_is_init
623
+ run_test "last step is step-14-complete.md" test_ac7_last_step_is_complete
624
+ run_test "steps pattern matches step-*.md" test_ac7_steps_pattern_matches
625
+
626
+ # =============================================================================
627
+ # Summary
628
+ # =============================================================================
629
+
630
+ echo ""
631
+ echo "=============================================="
632
+ echo "Test Summary"
633
+ echo "=============================================="
634
+ echo -e "Tests run: $TESTS_RUN"
635
+ echo -e "Tests passed: ${GREEN}$TESTS_PASSED${NC}"
636
+ echo -e "Tests failed: ${RED}$TESTS_FAILED${NC}"
637
+ echo ""
638
+
639
+ if [[ $TESTS_FAILED -gt 0 ]]; then
640
+ echo -e "${RED}FAILED${NC} - $TESTS_FAILED test(s) failed"
641
+ echo ""
642
+ echo "This is expected in RED state - Dev needs to import the workflow."
643
+ exit 1
644
+ else
645
+ echo -e "${GREEN}PASSED${NC} - All tests passed"
646
+ exit 0
647
+ fi
@@ -0,0 +1,22 @@
1
+ # Theme Scripts
2
+
3
+ Scripts for managing agent persona themes.
4
+
5
+ ## Scripts
6
+
7
+ | Script | Purpose |
8
+ |--------|---------|
9
+ | `list-themes.sh` | List all available themes |
10
+ | `compute-theme-tiers.sh` | Calculate theme quality tiers |
11
+ | `update-theme-tiers.sh` | Update theme tier metadata |
12
+
13
+ ## Usage
14
+
15
+ ```bash
16
+ .pennyfarthing/scripts/core/run.sh theme/list-themes.sh
17
+ ```
18
+
19
+ ## Ownership
20
+
21
+ - **Primary users:** `/theme` skill, `/set-theme` command
22
+ - **Maintained by:** Core Pennyfarthing team