@pennyfarthing/core 7.5.0 → 7.6.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 (901) hide show
  1. package/LICENSE +14 -0
  2. package/README.md +301 -0
  3. package/package.json +31 -36
  4. package/packages/core/dist/bmad/context-reader.d.ts +71 -0
  5. package/packages/core/dist/bmad/context-reader.d.ts.map +1 -0
  6. package/packages/core/dist/bmad/context-reader.js +369 -0
  7. package/packages/core/dist/bmad/context-reader.js.map +1 -0
  8. package/packages/core/dist/bmad/context-reader.test.d.ts +71 -0
  9. package/packages/core/dist/bmad/context-reader.test.d.ts.map +1 -0
  10. package/packages/core/dist/bmad/context-reader.test.js +878 -0
  11. package/packages/core/dist/bmad/context-reader.test.js.map +1 -0
  12. package/packages/core/dist/bmad/epics-parser.d.ts +61 -0
  13. package/packages/core/dist/bmad/epics-parser.d.ts.map +1 -0
  14. package/packages/core/dist/bmad/epics-parser.js +331 -0
  15. package/packages/core/dist/bmad/epics-parser.js.map +1 -0
  16. package/packages/core/dist/bmad/epics-parser.test.d.ts +7 -0
  17. package/packages/core/dist/bmad/epics-parser.test.d.ts.map +1 -0
  18. package/packages/core/dist/bmad/epics-parser.test.js +449 -0
  19. package/packages/core/dist/bmad/epics-parser.test.js.map +1 -0
  20. package/packages/core/dist/bmad/index.d.ts +11 -0
  21. package/packages/core/dist/bmad/index.d.ts.map +1 -0
  22. package/packages/core/dist/bmad/index.js +24 -0
  23. package/packages/core/dist/bmad/index.js.map +1 -0
  24. package/packages/core/dist/bmad/status-sync.d.ts +173 -0
  25. package/packages/core/dist/bmad/status-sync.d.ts.map +1 -0
  26. package/packages/core/dist/bmad/status-sync.js +463 -0
  27. package/packages/core/dist/bmad/status-sync.js.map +1 -0
  28. package/packages/core/dist/bmad/status-sync.test.d.ts +7 -0
  29. package/packages/core/dist/bmad/status-sync.test.d.ts.map +1 -0
  30. package/packages/core/dist/bmad/status-sync.test.js +702 -0
  31. package/packages/core/dist/bmad/status-sync.test.js.map +1 -0
  32. package/packages/core/dist/bmad/story-exporter.d.ts +55 -0
  33. package/packages/core/dist/bmad/story-exporter.d.ts.map +1 -0
  34. package/packages/core/dist/bmad/story-exporter.js +170 -0
  35. package/packages/core/dist/bmad/story-exporter.js.map +1 -0
  36. package/packages/core/dist/bmad/story-exporter.test.d.ts +51 -0
  37. package/packages/core/dist/bmad/story-exporter.test.d.ts.map +1 -0
  38. package/packages/core/dist/bmad/story-exporter.test.js +603 -0
  39. package/packages/core/dist/bmad/story-exporter.test.js.map +1 -0
  40. package/packages/core/dist/bmad/story-parser.d.ts +44 -0
  41. package/packages/core/dist/bmad/story-parser.d.ts.map +1 -0
  42. package/packages/core/dist/bmad/story-parser.js +307 -0
  43. package/packages/core/dist/bmad/story-parser.js.map +1 -0
  44. package/packages/core/dist/bmad/story-parser.test.d.ts +44 -0
  45. package/packages/core/dist/bmad/story-parser.test.d.ts.map +1 -0
  46. package/packages/core/dist/bmad/story-parser.test.js +693 -0
  47. package/packages/core/dist/bmad/story-parser.test.js.map +1 -0
  48. package/packages/core/dist/cli/commands/command.d.ts +28 -0
  49. package/packages/core/dist/cli/commands/command.d.ts.map +1 -0
  50. package/packages/core/dist/cli/commands/command.js +399 -0
  51. package/packages/core/dist/cli/commands/command.js.map +1 -0
  52. package/packages/core/dist/cli/commands/cyclist.d.ts +46 -0
  53. package/packages/core/dist/cli/commands/cyclist.d.ts.map +1 -0
  54. package/packages/core/dist/cli/commands/cyclist.js +196 -0
  55. package/packages/core/dist/cli/commands/cyclist.js.map +1 -0
  56. package/packages/core/dist/cli/commands/cyclist.test.d.ts +13 -0
  57. package/packages/core/dist/cli/commands/cyclist.test.d.ts.map +1 -0
  58. package/packages/core/dist/cli/commands/cyclist.test.js +245 -0
  59. package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -0
  60. package/packages/core/dist/cli/commands/doctor-legacy.test.d.ts +13 -0
  61. package/packages/core/dist/cli/commands/doctor-legacy.test.d.ts.map +1 -0
  62. package/packages/core/dist/cli/commands/doctor-legacy.test.js +207 -0
  63. package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -0
  64. package/packages/core/dist/cli/commands/doctor.d.ts +25 -0
  65. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -0
  66. package/packages/core/dist/cli/commands/doctor.js +780 -0
  67. package/packages/core/dist/cli/commands/doctor.js.map +1 -0
  68. package/packages/core/dist/cli/commands/init.d.ts +8 -0
  69. package/packages/core/dist/cli/commands/init.d.ts.map +1 -0
  70. package/packages/core/dist/cli/commands/init.js +515 -0
  71. package/packages/core/dist/cli/commands/init.js.map +1 -0
  72. package/packages/core/dist/cli/commands/skill.d.ts +28 -0
  73. package/packages/core/dist/cli/commands/skill.d.ts.map +1 -0
  74. package/packages/core/dist/cli/commands/skill.js +416 -0
  75. package/packages/core/dist/cli/commands/skill.js.map +1 -0
  76. package/packages/core/dist/cli/commands/theme.d.ts +21 -0
  77. package/packages/core/dist/cli/commands/theme.d.ts.map +1 -0
  78. package/packages/core/dist/cli/commands/theme.js +201 -0
  79. package/packages/core/dist/cli/commands/theme.js.map +1 -0
  80. package/packages/core/dist/cli/commands/uninstall.d.ts +8 -0
  81. package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -0
  82. package/packages/core/dist/cli/commands/uninstall.js +237 -0
  83. package/packages/core/dist/cli/commands/uninstall.js.map +1 -0
  84. package/packages/core/dist/cli/commands/update.d.ts +9 -0
  85. package/packages/core/dist/cli/commands/update.d.ts.map +1 -0
  86. package/packages/core/dist/cli/commands/update.js +390 -0
  87. package/packages/core/dist/cli/commands/update.js.map +1 -0
  88. package/packages/core/dist/cli/commands/version.d.ts +2 -0
  89. package/packages/core/dist/cli/commands/version.d.ts.map +1 -0
  90. package/packages/core/dist/cli/commands/version.js +28 -0
  91. package/packages/core/dist/cli/commands/version.js.map +1 -0
  92. package/packages/core/dist/cli/customization.test.d.ts +12 -0
  93. package/packages/core/dist/cli/customization.test.d.ts.map +1 -0
  94. package/packages/core/dist/cli/customization.test.js +84 -0
  95. package/packages/core/dist/cli/customization.test.js.map +1 -0
  96. package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
  97. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
  98. package/packages/core/dist/cli/cyclist-migration.test.js +225 -0
  99. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
  100. package/packages/core/dist/cli/index.d.ts +3 -0
  101. package/packages/core/dist/cli/index.d.ts.map +1 -0
  102. package/packages/core/dist/cli/index.js +174 -0
  103. package/packages/core/dist/cli/index.js.map +1 -0
  104. package/packages/core/dist/cli/ocean-profiles.test.d.ts +13 -0
  105. package/packages/core/dist/cli/ocean-profiles.test.d.ts.map +1 -0
  106. package/packages/core/dist/cli/ocean-profiles.test.js +134 -0
  107. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -0
  108. package/packages/core/dist/cli/theme-maker.test.d.ts +11 -0
  109. package/packages/core/dist/cli/theme-maker.test.d.ts.map +1 -0
  110. package/packages/core/dist/cli/theme-maker.test.js +356 -0
  111. package/packages/core/dist/cli/theme-maker.test.js.map +1 -0
  112. package/packages/core/dist/cli/utils/constants.d.ts +66 -0
  113. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -0
  114. package/packages/core/dist/cli/utils/constants.js +54 -0
  115. package/packages/core/dist/cli/utils/constants.js.map +1 -0
  116. package/{dist → packages/core/dist}/cli/utils/files.d.ts +1 -0
  117. package/packages/core/dist/cli/utils/files.d.ts.map +1 -0
  118. package/packages/core/dist/cli/utils/files.js +162 -0
  119. package/packages/core/dist/cli/utils/files.js.map +1 -0
  120. package/packages/core/dist/cli/utils/logger.d.ts +26 -0
  121. package/packages/core/dist/cli/utils/logger.d.ts.map +1 -0
  122. package/packages/core/dist/cli/utils/logger.js +88 -0
  123. package/packages/core/dist/cli/utils/logger.js.map +1 -0
  124. package/{dist → packages/core/dist}/cli/utils/manifest.d.ts +1 -0
  125. package/packages/core/dist/cli/utils/manifest.d.ts.map +1 -0
  126. package/packages/core/dist/cli/utils/manifest.js +90 -0
  127. package/packages/core/dist/cli/utils/manifest.js.map +1 -0
  128. package/packages/core/dist/cli/utils/node-modules.d.ts +6 -0
  129. package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -0
  130. package/packages/core/dist/cli/utils/node-modules.js +32 -0
  131. package/packages/core/dist/cli/utils/node-modules.js.map +1 -0
  132. package/packages/core/dist/cli/utils/prompts.d.ts +34 -0
  133. package/packages/core/dist/cli/utils/prompts.d.ts.map +1 -0
  134. package/packages/core/dist/cli/utils/prompts.js +93 -0
  135. package/packages/core/dist/cli/utils/prompts.js.map +1 -0
  136. package/packages/core/dist/cli/utils/symlinks.d.ts +44 -0
  137. package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -0
  138. package/packages/core/dist/cli/utils/symlinks.js +327 -0
  139. package/packages/core/dist/cli/utils/symlinks.js.map +1 -0
  140. package/packages/core/dist/cli/utils/themes.d.ts +101 -0
  141. package/packages/core/dist/cli/utils/themes.d.ts.map +1 -0
  142. package/packages/core/dist/cli/utils/themes.js +382 -0
  143. package/packages/core/dist/cli/utils/themes.js.map +1 -0
  144. package/packages/core/dist/cli/utils/themes.test.d.ts +12 -0
  145. package/packages/core/dist/cli/utils/themes.test.d.ts.map +1 -0
  146. package/packages/core/dist/cli/utils/themes.test.js +147 -0
  147. package/packages/core/dist/cli/utils/themes.test.js.map +1 -0
  148. package/{dist → packages/core/dist}/cli/utils/version.d.ts +1 -0
  149. package/packages/core/dist/cli/utils/version.d.ts.map +1 -0
  150. package/packages/core/dist/cli/utils/version.js +64 -0
  151. package/packages/core/dist/cli/utils/version.js.map +1 -0
  152. package/packages/core/dist/cli/workspace.test.d.ts +8 -0
  153. package/packages/core/dist/cli/workspace.test.d.ts.map +1 -0
  154. package/packages/core/dist/cli/workspace.test.js +156 -0
  155. package/packages/core/dist/cli/workspace.test.js.map +1 -0
  156. package/{dist → packages/core/dist}/index.d.ts +1 -0
  157. package/packages/core/dist/index.d.ts.map +1 -0
  158. package/packages/core/dist/index.js +20 -0
  159. package/packages/core/dist/index.js.map +1 -0
  160. package/packages/core/dist/jira/jira-epic-creation.d.ts +109 -0
  161. package/packages/core/dist/jira/jira-epic-creation.d.ts.map +1 -0
  162. package/packages/core/dist/jira/jira-epic-creation.js +253 -0
  163. package/packages/core/dist/jira/jira-epic-creation.js.map +1 -0
  164. package/packages/core/dist/jira/jira-epic-creation.test.d.ts +16 -0
  165. package/packages/core/dist/jira/jira-epic-creation.test.d.ts.map +1 -0
  166. package/packages/core/dist/jira/jira-epic-creation.test.js +387 -0
  167. package/packages/core/dist/jira/jira-epic-creation.test.js.map +1 -0
  168. package/packages/core/dist/jira/jira-sprint-sync.d.ts +247 -0
  169. package/packages/core/dist/jira/jira-sprint-sync.d.ts.map +1 -0
  170. package/packages/core/dist/jira/jira-sprint-sync.js +670 -0
  171. package/packages/core/dist/jira/jira-sprint-sync.js.map +1 -0
  172. package/packages/core/dist/jira/jira-sprint-sync.test.d.ts +16 -0
  173. package/packages/core/dist/jira/jira-sprint-sync.test.d.ts.map +1 -0
  174. package/packages/core/dist/jira/jira-sprint-sync.test.js +845 -0
  175. package/packages/core/dist/jira/jira-sprint-sync.test.js.map +1 -0
  176. package/{dist → packages/core/dist}/permissions/index.d.ts +1 -0
  177. package/packages/core/dist/permissions/index.d.ts.map +1 -0
  178. package/packages/core/dist/permissions/index.js +13 -0
  179. package/packages/core/dist/permissions/index.js.map +1 -0
  180. package/{dist → packages/core/dist}/permissions/permission-schema.d.ts +1 -0
  181. package/packages/core/dist/permissions/permission-schema.d.ts.map +1 -0
  182. package/{dist → packages/core/dist}/permissions/permission-schema.js +9 -13
  183. package/packages/core/dist/permissions/permission-schema.js.map +1 -0
  184. package/packages/core/dist/permissions/permission-schema.test.d.ts +40 -0
  185. package/packages/core/dist/permissions/permission-schema.test.d.ts.map +1 -0
  186. package/packages/core/dist/permissions/permission-schema.test.js +367 -0
  187. package/packages/core/dist/permissions/permission-schema.test.js.map +1 -0
  188. package/packages/core/dist/scripts/add-ocean-profiles.d.ts +9 -0
  189. package/packages/core/dist/scripts/add-ocean-profiles.d.ts.map +1 -0
  190. package/packages/core/dist/scripts/add-ocean-profiles.js +695 -0
  191. package/packages/core/dist/scripts/add-ocean-profiles.js.map +1 -0
  192. package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
  193. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
  194. package/packages/core/dist/scripts/benchmark-integration.js +691 -0
  195. package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
  196. package/packages/core/dist/scripts/benchmark-integration.test.d.ts +13 -0
  197. package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +1 -0
  198. package/packages/core/dist/scripts/benchmark-integration.test.js +680 -0
  199. package/packages/core/dist/scripts/benchmark-integration.test.js.map +1 -0
  200. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +18 -0
  201. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +1 -0
  202. package/packages/core/dist/scripts/debugging-scenarios.test.js +317 -0
  203. package/packages/core/dist/scripts/debugging-scenarios.test.js.map +1 -0
  204. package/packages/core/dist/scripts/generate-all-spiders.d.ts +10 -0
  205. package/packages/core/dist/scripts/generate-all-spiders.d.ts.map +1 -0
  206. package/packages/core/dist/scripts/generate-all-spiders.js +306 -0
  207. package/packages/core/dist/scripts/generate-all-spiders.js.map +1 -0
  208. package/packages/core/dist/scripts/generate-report.d.ts +65 -0
  209. package/packages/core/dist/scripts/generate-report.d.ts.map +1 -0
  210. package/packages/core/dist/scripts/generate-report.js +378 -0
  211. package/packages/core/dist/scripts/generate-report.js.map +1 -0
  212. package/packages/core/dist/scripts/generate-report.test.d.ts +13 -0
  213. package/packages/core/dist/scripts/generate-report.test.d.ts.map +1 -0
  214. package/packages/core/dist/scripts/generate-report.test.js +363 -0
  215. package/packages/core/dist/scripts/generate-report.test.js.map +1 -0
  216. package/packages/core/dist/scripts/generate-spider-report.d.ts +65 -0
  217. package/packages/core/dist/scripts/generate-spider-report.d.ts.map +1 -0
  218. package/packages/core/dist/scripts/generate-spider-report.js +366 -0
  219. package/packages/core/dist/scripts/generate-spider-report.js.map +1 -0
  220. package/packages/core/dist/scripts/generate-spider-report.test.d.ts +13 -0
  221. package/packages/core/dist/scripts/generate-spider-report.test.d.ts.map +1 -0
  222. package/packages/core/dist/scripts/generate-spider-report.test.js +367 -0
  223. package/packages/core/dist/scripts/generate-spider-report.test.js.map +1 -0
  224. package/packages/core/dist/scripts/generate-spider.d.ts +47 -0
  225. package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -0
  226. package/packages/core/dist/scripts/generate-spider.js +338 -0
  227. package/packages/core/dist/scripts/generate-spider.js.map +1 -0
  228. package/packages/core/dist/scripts/generate-spider.test.d.ts +14 -0
  229. package/packages/core/dist/scripts/generate-spider.test.d.ts.map +1 -0
  230. package/packages/core/dist/scripts/generate-spider.test.js +271 -0
  231. package/packages/core/dist/scripts/generate-spider.test.js.map +1 -0
  232. package/{dist → packages/core/dist}/scripts/job-fair-aggregator.d.ts +1 -0
  233. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
  234. package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
  235. package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
  236. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts +14 -0
  237. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts.map +1 -0
  238. package/packages/core/dist/scripts/job-fair-aggregator.test.js +616 -0
  239. package/packages/core/dist/scripts/job-fair-aggregator.test.js.map +1 -0
  240. package/packages/core/dist/scripts/run-ci.test.d.ts +20 -0
  241. package/packages/core/dist/scripts/run-ci.test.d.ts.map +1 -0
  242. package/packages/core/dist/scripts/run-ci.test.js +127 -0
  243. package/packages/core/dist/scripts/run-ci.test.js.map +1 -0
  244. package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
  245. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +1 -0
  246. package/packages/core/dist/scripts/theme-detail.test.js +199 -0
  247. package/packages/core/dist/scripts/theme-detail.test.js.map +1 -0
  248. package/packages/core/dist/scripts/validate-ocean-profiles.d.ts +9 -0
  249. package/packages/core/dist/scripts/validate-ocean-profiles.d.ts.map +1 -0
  250. package/packages/core/dist/scripts/validate-ocean-profiles.js +130 -0
  251. package/packages/core/dist/scripts/validate-ocean-profiles.js.map +1 -0
  252. package/packages/core/dist/workflow/gate-handler.d.ts +94 -0
  253. package/packages/core/dist/workflow/gate-handler.d.ts.map +1 -0
  254. package/packages/core/dist/workflow/gate-handler.js +189 -0
  255. package/packages/core/dist/workflow/gate-handler.js.map +1 -0
  256. package/packages/core/dist/workflow/gate-handler.test.d.ts +14 -0
  257. package/packages/core/dist/workflow/gate-handler.test.d.ts.map +1 -0
  258. package/packages/core/dist/workflow/gate-handler.test.js +543 -0
  259. package/packages/core/dist/workflow/gate-handler.test.js.map +1 -0
  260. package/packages/core/dist/workflow/generic-sm-finish.d.ts +89 -0
  261. package/packages/core/dist/workflow/generic-sm-finish.d.ts.map +1 -0
  262. package/packages/core/dist/workflow/generic-sm-finish.js +157 -0
  263. package/packages/core/dist/workflow/generic-sm-finish.js.map +1 -0
  264. package/packages/core/dist/workflow/generic-sm-setup.d.ts +138 -0
  265. package/packages/core/dist/workflow/generic-sm-setup.d.ts.map +1 -0
  266. package/packages/core/dist/workflow/generic-sm-setup.js +382 -0
  267. package/packages/core/dist/workflow/generic-sm-setup.js.map +1 -0
  268. package/packages/core/dist/workflow/handoff.d.ts +281 -0
  269. package/packages/core/dist/workflow/handoff.d.ts.map +1 -0
  270. package/packages/core/dist/workflow/handoff.js +411 -0
  271. package/packages/core/dist/workflow/handoff.js.map +1 -0
  272. package/packages/core/dist/workflow/handoff.test.d.ts +21 -0
  273. package/packages/core/dist/workflow/handoff.test.d.ts.map +1 -0
  274. package/packages/core/dist/workflow/handoff.test.js +499 -0
  275. package/packages/core/dist/workflow/handoff.test.js.map +1 -0
  276. package/{dist → packages/core/dist}/workflow/index.d.ts +1 -0
  277. package/packages/core/dist/workflow/index.d.ts.map +1 -0
  278. package/packages/core/dist/workflow/index.js +24 -0
  279. package/packages/core/dist/workflow/index.js.map +1 -0
  280. package/packages/core/dist/workflow/session-state.d.ts +92 -0
  281. package/packages/core/dist/workflow/session-state.d.ts.map +1 -0
  282. package/packages/core/dist/workflow/session-state.js +198 -0
  283. package/packages/core/dist/workflow/session-state.js.map +1 -0
  284. package/packages/core/dist/workflow/session-state.test.d.ts +8 -0
  285. package/packages/core/dist/workflow/session-state.test.d.ts.map +1 -0
  286. package/packages/core/dist/workflow/session-state.test.js +551 -0
  287. package/packages/core/dist/workflow/session-state.test.js.map +1 -0
  288. package/packages/core/dist/workflow/sm-subagents.test.d.ts +23 -0
  289. package/packages/core/dist/workflow/sm-subagents.test.d.ts.map +1 -0
  290. package/packages/core/dist/workflow/sm-subagents.test.js +727 -0
  291. package/packages/core/dist/workflow/sm-subagents.test.js.map +1 -0
  292. package/packages/core/dist/workflow/step-parser.d.ts +45 -0
  293. package/packages/core/dist/workflow/step-parser.d.ts.map +1 -0
  294. package/packages/core/dist/workflow/step-parser.js +147 -0
  295. package/packages/core/dist/workflow/step-parser.js.map +1 -0
  296. package/packages/core/dist/workflow/step-parser.test.d.ts +14 -0
  297. package/packages/core/dist/workflow/step-parser.test.d.ts.map +1 -0
  298. package/packages/core/dist/workflow/step-parser.test.js +470 -0
  299. package/packages/core/dist/workflow/step-parser.test.js.map +1 -0
  300. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts +17 -0
  301. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts.map +1 -0
  302. package/packages/core/dist/workflow/story-workflow-routing.test.js +559 -0
  303. package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -0
  304. package/packages/core/dist/workflow/test-cache.d.ts +131 -0
  305. package/packages/core/dist/workflow/test-cache.d.ts.map +1 -0
  306. package/packages/core/dist/workflow/test-cache.js +226 -0
  307. package/packages/core/dist/workflow/test-cache.js.map +1 -0
  308. package/packages/core/dist/workflow/test-cache.test.d.ts +17 -0
  309. package/packages/core/dist/workflow/test-cache.test.d.ts.map +1 -0
  310. package/packages/core/dist/workflow/test-cache.test.js +438 -0
  311. package/packages/core/dist/workflow/test-cache.test.js.map +1 -0
  312. package/packages/core/dist/workflow/trimodal.d.ts +86 -0
  313. package/packages/core/dist/workflow/trimodal.d.ts.map +1 -0
  314. package/packages/core/dist/workflow/trimodal.js +118 -0
  315. package/packages/core/dist/workflow/trimodal.js.map +1 -0
  316. package/packages/core/dist/workflow/trimodal.test.d.ts +11 -0
  317. package/packages/core/dist/workflow/trimodal.test.d.ts.map +1 -0
  318. package/packages/core/dist/workflow/trimodal.test.js +395 -0
  319. package/packages/core/dist/workflow/trimodal.test.js.map +1 -0
  320. package/packages/core/dist/workflow/variable-resolver.d.ts +67 -0
  321. package/packages/core/dist/workflow/variable-resolver.d.ts.map +1 -0
  322. package/packages/core/dist/workflow/variable-resolver.js +156 -0
  323. package/packages/core/dist/workflow/variable-resolver.js.map +1 -0
  324. package/packages/core/dist/workflow/variable-resolver.test.d.ts +14 -0
  325. package/packages/core/dist/workflow/variable-resolver.test.d.ts.map +1 -0
  326. package/packages/core/dist/workflow/variable-resolver.test.js +400 -0
  327. package/packages/core/dist/workflow/variable-resolver.test.js.map +1 -0
  328. package/packages/core/dist/workflow/workflow-executor.d.ts +163 -0
  329. package/packages/core/dist/workflow/workflow-executor.d.ts.map +1 -0
  330. package/packages/core/dist/workflow/workflow-executor.js +197 -0
  331. package/packages/core/dist/workflow/workflow-executor.js.map +1 -0
  332. package/packages/core/dist/workflow/workflow-executor.test.d.ts +8 -0
  333. package/packages/core/dist/workflow/workflow-executor.test.d.ts.map +1 -0
  334. package/packages/core/dist/workflow/workflow-executor.test.js +444 -0
  335. package/packages/core/dist/workflow/workflow-executor.test.js.map +1 -0
  336. package/{dist → packages/core/dist}/workflow/workflow-loader.d.ts +1 -0
  337. package/packages/core/dist/workflow/workflow-loader.d.ts.map +1 -0
  338. package/{dist → packages/core/dist}/workflow/workflow-loader.js +34 -40
  339. package/packages/core/dist/workflow/workflow-loader.js.map +1 -0
  340. package/packages/core/dist/workflow/workflow-loader.test.d.ts +15 -0
  341. package/packages/core/dist/workflow/workflow-loader.test.d.ts.map +1 -0
  342. package/packages/core/dist/workflow/workflow-loader.test.js +354 -0
  343. package/packages/core/dist/workflow/workflow-loader.test.js.map +1 -0
  344. package/packages/core/dist/workflow/workflow-migration.test.d.ts +17 -0
  345. package/packages/core/dist/workflow/workflow-migration.test.d.ts.map +1 -0
  346. package/packages/core/dist/workflow/workflow-migration.test.js +371 -0
  347. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -0
  348. package/{dist → packages/core/dist}/workflow/workflow-permissions.d.ts +1 -0
  349. package/packages/core/dist/workflow/workflow-permissions.d.ts.map +1 -0
  350. package/{dist → packages/core/dist}/workflow/workflow-permissions.js +8 -14
  351. package/packages/core/dist/workflow/workflow-permissions.js.map +1 -0
  352. package/packages/core/dist/workflow/workflow-permissions.test.d.ts +15 -0
  353. package/packages/core/dist/workflow/workflow-permissions.test.d.ts.map +1 -0
  354. package/packages/core/dist/workflow/workflow-permissions.test.js +301 -0
  355. package/packages/core/dist/workflow/workflow-permissions.test.js.map +1 -0
  356. package/{dist → packages/core/dist}/workflow/workflow-router.d.ts +1 -0
  357. package/packages/core/dist/workflow/workflow-router.d.ts.map +1 -0
  358. package/{dist → packages/core/dist}/workflow/workflow-router.js +51 -70
  359. package/packages/core/dist/workflow/workflow-router.js.map +1 -0
  360. package/packages/core/dist/workflow/workflow-router.test.d.ts +20 -0
  361. package/packages/core/dist/workflow/workflow-router.test.d.ts.map +1 -0
  362. package/packages/core/dist/workflow/workflow-router.test.js +607 -0
  363. package/packages/core/dist/workflow/workflow-router.test.js.map +1 -0
  364. package/{dist → packages/core/dist}/workflow/workflow-schema.d.ts +1 -0
  365. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -0
  366. package/{dist → packages/core/dist}/workflow/workflow-schema.js +59 -62
  367. package/packages/core/dist/workflow/workflow-schema.js.map +1 -0
  368. package/packages/core/dist/workflow/workflow-schema.test.d.ts +45 -0
  369. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -0
  370. package/packages/core/dist/workflow/workflow-schema.test.js +512 -0
  371. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -0
  372. package/packages/core/dist/workflow/workflow-stepped-schema.test.d.ts +18 -0
  373. package/packages/core/dist/workflow/workflow-stepped-schema.test.d.ts.map +1 -0
  374. package/packages/core/dist/workflow/workflow-stepped-schema.test.js +608 -0
  375. package/packages/core/dist/workflow/workflow-stepped-schema.test.js.map +1 -0
  376. package/pennyfarthing-dist/agents/README.md +340 -0
  377. package/pennyfarthing-dist/agents/architect.md +193 -0
  378. package/pennyfarthing-dist/agents/dev.md +259 -0
  379. package/pennyfarthing-dist/agents/devops.md +206 -0
  380. package/pennyfarthing-dist/agents/handoff.md +212 -0
  381. package/pennyfarthing-dist/agents/orchestrator.md +355 -0
  382. package/pennyfarthing-dist/agents/pm.md +169 -0
  383. package/pennyfarthing-dist/agents/reviewer-preflight.md +96 -0
  384. package/pennyfarthing-dist/agents/reviewer.md +377 -0
  385. package/pennyfarthing-dist/agents/sm-file-summary.md +58 -0
  386. package/pennyfarthing-dist/agents/sm-finish.md +61 -0
  387. package/pennyfarthing-dist/agents/sm-handoff.md +122 -0
  388. package/pennyfarthing-dist/agents/sm-setup.md +174 -0
  389. package/pennyfarthing-dist/agents/sm.md +649 -0
  390. package/pennyfarthing-dist/agents/tea.md +230 -0
  391. package/pennyfarthing-dist/agents/tech-writer.md +216 -0
  392. package/pennyfarthing-dist/agents/testing-runner.md +141 -0
  393. package/pennyfarthing-dist/agents/ux-designer.md +231 -0
  394. package/pennyfarthing-dist/agents/workflow-status-check.md +68 -0
  395. package/pennyfarthing-dist/commands/architect.md +7 -0
  396. package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
  397. package/pennyfarthing-dist/commands/benchmark.md +467 -0
  398. package/pennyfarthing-dist/commands/brainstorming.md +91 -0
  399. package/pennyfarthing-dist/commands/check.md +156 -0
  400. package/pennyfarthing-dist/commands/chore.md +178 -0
  401. package/pennyfarthing-dist/commands/close-epic.md +139 -0
  402. package/pennyfarthing-dist/commands/continue-session.md +184 -0
  403. package/pennyfarthing-dist/commands/create-branches-from-story.md +358 -0
  404. package/pennyfarthing-dist/commands/create-theme.md +29 -0
  405. package/pennyfarthing-dist/commands/dev.md +7 -0
  406. package/pennyfarthing-dist/commands/devops.md +7 -0
  407. package/pennyfarthing-dist/commands/git-cleanup.md +340 -0
  408. package/pennyfarthing-dist/commands/health-check.md +141 -0
  409. package/pennyfarthing-dist/commands/help.md +264 -0
  410. package/pennyfarthing-dist/commands/job-fair.md +102 -0
  411. package/pennyfarthing-dist/commands/list-themes.md +21 -0
  412. package/pennyfarthing-dist/commands/orchestrator.md +7 -0
  413. package/pennyfarthing-dist/commands/parallel-work.md +71 -0
  414. package/pennyfarthing-dist/commands/party-mode.md +67 -0
  415. package/pennyfarthing-dist/commands/permissions.md +193 -0
  416. package/pennyfarthing-dist/commands/pm.md +7 -0
  417. package/pennyfarthing-dist/commands/prime.md +140 -0
  418. package/pennyfarthing-dist/commands/release.md +58 -0
  419. package/pennyfarthing-dist/commands/repo-status.md +49 -0
  420. package/pennyfarthing-dist/commands/retro.md +200 -0
  421. package/pennyfarthing-dist/commands/reviewer.md +7 -0
  422. package/pennyfarthing-dist/commands/run-ci.md +116 -0
  423. package/pennyfarthing-dist/commands/set-theme.md +56 -0
  424. package/pennyfarthing-dist/commands/show-theme.md +21 -0
  425. package/pennyfarthing-dist/commands/sm.md +7 -0
  426. package/pennyfarthing-dist/commands/solo.md +411 -0
  427. package/pennyfarthing-dist/commands/sprint-planning.md +109 -0
  428. package/pennyfarthing-dist/commands/sprint.md +133 -0
  429. package/pennyfarthing-dist/commands/standalone.md +194 -0
  430. package/pennyfarthing-dist/commands/start-epic.md +168 -0
  431. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +184 -0
  432. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +373 -0
  433. package/pennyfarthing-dist/commands/tea.md +7 -0
  434. package/pennyfarthing-dist/commands/tech-writer.md +7 -0
  435. package/pennyfarthing-dist/commands/theme-maker.md +676 -0
  436. package/pennyfarthing-dist/commands/update-domain-docs.md +83 -0
  437. package/pennyfarthing-dist/commands/ux-designer.md +7 -0
  438. package/pennyfarthing-dist/commands/work.md +122 -0
  439. package/pennyfarthing-dist/commands/workflow.md +21 -0
  440. package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +480 -0
  441. package/pennyfarthing-dist/guides/HOOKS.md +230 -0
  442. package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +338 -0
  443. package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +193 -0
  444. package/pennyfarthing-dist/guides/XML-TAGS.md +156 -0
  445. package/pennyfarthing-dist/guides/agent-behavior.md +286 -0
  446. package/pennyfarthing-dist/guides/agent-template-strategic.md +148 -0
  447. package/pennyfarthing-dist/guides/agent-template-tactical.md +162 -0
  448. package/pennyfarthing-dist/guides/measurement-framework.md +210 -0
  449. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +746 -0
  450. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +574 -0
  451. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +488 -0
  452. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +402 -0
  453. package/pennyfarthing-dist/guides/permission-protocol.md +188 -0
  454. package/pennyfarthing-dist/guides/persona-loading.md +46 -0
  455. package/pennyfarthing-dist/guides/workflow-schema.md +257 -0
  456. package/pennyfarthing-dist/guides/worktree-mode.md +113 -0
  457. package/pennyfarthing-dist/output-styles/teaching.md +33 -0
  458. package/pennyfarthing-dist/output-styles/terse.md +20 -0
  459. package/pennyfarthing-dist/output-styles/verbose.md +28 -0
  460. package/pennyfarthing-dist/personas/themes/1984.yaml +312 -0
  461. package/pennyfarthing-dist/personas/themes/a-team.yaml +337 -0
  462. package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +300 -0
  463. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +330 -0
  464. package/pennyfarthing-dist/personas/themes/all-stars.yaml +332 -0
  465. package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +320 -0
  466. package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +306 -0
  467. package/pennyfarthing-dist/personas/themes/arcane.yaml +288 -0
  468. package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +331 -0
  469. package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +288 -0
  470. package/pennyfarthing-dist/personas/themes/babylon-5.yaml +288 -0
  471. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +288 -0
  472. package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +288 -0
  473. package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +300 -0
  474. package/pennyfarthing-dist/personas/themes/black-sails.yaml +300 -0
  475. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +295 -0
  476. package/pennyfarthing-dist/personas/themes/bobiverse.yaml +288 -0
  477. package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +327 -0
  478. package/pennyfarthing-dist/personas/themes/catch-22.yaml +316 -0
  479. package/pennyfarthing-dist/personas/themes/classical-composers.yaml +310 -0
  480. package/pennyfarthing-dist/personas/themes/control.yaml +197 -0
  481. package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +320 -0
  482. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +323 -0
  483. package/pennyfarthing-dist/personas/themes/deadwood.yaml +300 -0
  484. package/pennyfarthing-dist/personas/themes/dickens.yaml +320 -0
  485. package/pennyfarthing-dist/personas/themes/discworld.yaml +332 -0
  486. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +290 -0
  487. package/pennyfarthing-dist/personas/themes/don-quixote.yaml +320 -0
  488. package/pennyfarthing-dist/personas/themes/dune.yaml +307 -0
  489. package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +320 -0
  490. package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +288 -0
  491. package/pennyfarthing-dist/personas/themes/fargo.yaml +330 -0
  492. package/pennyfarthing-dist/personas/themes/film-auteurs.yaml +312 -0
  493. package/pennyfarthing-dist/personas/themes/firefly.yaml +328 -0
  494. package/pennyfarthing-dist/personas/themes/foundation.yaml +290 -0
  495. package/pennyfarthing-dist/personas/themes/futurama.yaml +321 -0
  496. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +290 -0
  497. package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +373 -0
  498. package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +308 -0
  499. package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +308 -0
  500. package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +330 -0
  501. package/pennyfarthing-dist/personas/themes/hannibal.yaml +300 -0
  502. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +324 -0
  503. package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +291 -0
  504. package/pennyfarthing-dist/personas/themes/historical-figures.yaml +288 -0
  505. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +331 -0
  506. package/pennyfarthing-dist/personas/themes/house-md.yaml +321 -0
  507. package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +289 -0
  508. package/pennyfarthing-dist/personas/themes/inspector-morse.yaml +300 -0
  509. package/pennyfarthing-dist/personas/themes/jane-austen.yaml +287 -0
  510. package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +320 -0
  511. package/pennyfarthing-dist/personas/themes/justified.yaml +300 -0
  512. package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +349 -0
  513. package/pennyfarthing-dist/personas/themes/les-miserables.yaml +299 -0
  514. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +334 -0
  515. package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +334 -0
  516. package/pennyfarthing-dist/personas/themes/mad-max.yaml +355 -0
  517. package/pennyfarthing-dist/personas/themes/mad-men.yaml +289 -0
  518. package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +300 -0
  519. package/pennyfarthing-dist/personas/themes/mash.yaml +337 -0
  520. package/pennyfarthing-dist/personas/themes/mass-effect.yaml +289 -0
  521. package/pennyfarthing-dist/personas/themes/military-commanders.yaml +306 -0
  522. package/pennyfarthing-dist/personas/themes/moby-dick.yaml +320 -0
  523. package/pennyfarthing-dist/personas/themes/monty-python.yaml +303 -0
  524. package/pennyfarthing-dist/personas/themes/neuromancer.yaml +300 -0
  525. package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +329 -0
  526. package/pennyfarthing-dist/personas/themes/parks-and-rec.yaml +372 -0
  527. package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +298 -0
  528. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +350 -0
  529. package/pennyfarthing-dist/personas/themes/renaissance-masters.yaml +320 -0
  530. package/pennyfarthing-dist/personas/themes/rome.yaml +300 -0
  531. package/pennyfarthing-dist/personas/themes/russian-masters.yaml +318 -0
  532. package/pennyfarthing-dist/personas/themes/sandman.yaml +288 -0
  533. package/pennyfarthing-dist/personas/themes/scientific-revolutionaries.yaml +320 -0
  534. package/pennyfarthing-dist/personas/themes/shakespeare.yaml +301 -0
  535. package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +289 -0
  536. package/pennyfarthing-dist/personas/themes/snow-crash.yaml +288 -0
  537. package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +300 -0
  538. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +366 -0
  539. package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +334 -0
  540. package/pennyfarthing-dist/personas/themes/star-wars.yaml +303 -0
  541. package/pennyfarthing-dist/personas/themes/succession.yaml +300 -0
  542. package/pennyfarthing-dist/personas/themes/superfriends.yaml +338 -0
  543. package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +366 -0
  544. package/pennyfarthing-dist/personas/themes/the-americans.yaml +300 -0
  545. package/pennyfarthing-dist/personas/themes/the-crown.yaml +300 -0
  546. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +343 -0
  547. package/pennyfarthing-dist/personas/themes/the-good-place.yaml +322 -0
  548. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +353 -0
  549. package/pennyfarthing-dist/personas/themes/the-odyssey.yaml +300 -0
  550. package/pennyfarthing-dist/personas/themes/the-office.yaml +330 -0
  551. package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +308 -0
  552. package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +300 -0
  553. package/pennyfarthing-dist/personas/themes/the-wire.yaml +311 -0
  554. package/pennyfarthing-dist/personas/themes/the-witcher.yaml +300 -0
  555. package/pennyfarthing-dist/personas/themes/twin-peaks.yaml +302 -0
  556. package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +300 -0
  557. package/pennyfarthing-dist/personas/themes/watchmen.yaml +291 -0
  558. package/pennyfarthing-dist/personas/themes/west-wing.yaml +291 -0
  559. package/pennyfarthing-dist/personas/themes/world-explorers.yaml +320 -0
  560. package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +307 -0
  561. package/pennyfarthing-dist/personas/themes/x-files.yaml +302 -0
  562. package/pennyfarthing-dist/scripts/README.md +68 -0
  563. package/pennyfarthing-dist/scripts/core/README.md +26 -0
  564. package/pennyfarthing-dist/scripts/core/agent-session.sh +378 -0
  565. package/pennyfarthing-dist/scripts/core/check-context.sh +272 -0
  566. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +90 -0
  567. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +95 -0
  568. package/pennyfarthing-dist/scripts/core/prime.sh +136 -0
  569. package/pennyfarthing-dist/scripts/core/run.sh +75 -0
  570. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +21 -0
  571. package/pennyfarthing-dist/scripts/git/README.md +25 -0
  572. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +226 -0
  573. package/pennyfarthing-dist/scripts/git/git-status-all.sh +127 -0
  574. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +91 -0
  575. package/pennyfarthing-dist/scripts/git/release.sh +199 -0
  576. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +494 -0
  577. package/pennyfarthing-dist/scripts/health/drift-detection.sh +162 -0
  578. package/pennyfarthing-dist/scripts/hooks/README.md +32 -0
  579. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +87 -0
  580. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +60 -0
  581. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +65 -0
  582. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +35 -0
  583. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +166 -0
  584. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +50 -0
  585. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +71 -0
  586. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +54 -0
  587. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.mjs +380 -0
  588. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +20 -0
  589. package/pennyfarthing-dist/scripts/hooks/session-start.sh +97 -0
  590. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +58 -0
  591. package/pennyfarthing-dist/scripts/hooks/tests/question-reflector.test.mjs +545 -0
  592. package/pennyfarthing-dist/scripts/jira/README.md +33 -0
  593. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +101 -0
  594. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +97 -0
  595. package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.mjs +327 -0
  596. package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.test.mjs +503 -0
  597. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +164 -0
  598. package/pennyfarthing-dist/scripts/jira/jira-lib.mjs +443 -0
  599. package/pennyfarthing-dist/scripts/jira/jira-lib.sh +464 -0
  600. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +266 -0
  601. package/pennyfarthing-dist/scripts/jira/jira-sync-story.mjs +208 -0
  602. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +8 -0
  603. package/pennyfarthing-dist/scripts/jira/jira-sync.mjs +198 -0
  604. package/pennyfarthing-dist/scripts/jira/jira-sync.sh +8 -0
  605. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +104 -0
  606. package/pennyfarthing-dist/scripts/jira/sync-epic-to-jira.sh +16 -0
  607. package/pennyfarthing-dist/scripts/lib/README.md +29 -0
  608. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +177 -0
  609. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +136 -0
  610. package/pennyfarthing-dist/scripts/lib/common.sh +157 -0
  611. package/pennyfarthing-dist/scripts/lib/file-lock.sh +269 -0
  612. package/pennyfarthing-dist/scripts/lib/find-root.sh +35 -0
  613. package/pennyfarthing-dist/scripts/lib/logging.sh +186 -0
  614. package/pennyfarthing-dist/scripts/lib/retry.sh +76 -0
  615. package/pennyfarthing-dist/scripts/misc/README.md +44 -0
  616. package/pennyfarthing-dist/scripts/misc/add-short-names.mjs +264 -0
  617. package/pennyfarthing-dist/scripts/misc/backlog.sh +91 -0
  618. package/pennyfarthing-dist/scripts/misc/check-status.sh +247 -0
  619. package/pennyfarthing-dist/scripts/misc/deploy.sh +296 -0
  620. package/pennyfarthing-dist/scripts/misc/doctor-dogfood.sh +392 -0
  621. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +231 -0
  622. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +110 -0
  623. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +74 -0
  624. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.mjs +474 -0
  625. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +9 -0
  626. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +141 -0
  627. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +778 -0
  628. package/pennyfarthing-dist/scripts/misc/run-ci.sh +219 -0
  629. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +7 -0
  630. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +319 -0
  631. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +193 -0
  632. package/pennyfarthing-dist/scripts/misc/statusline.sh +252 -0
  633. package/pennyfarthing-dist/scripts/misc/uninstall.sh +270 -0
  634. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +160 -0
  635. package/pennyfarthing-dist/scripts/sprint/README.md +29 -0
  636. package/pennyfarthing-dist/scripts/sprint/archive-story.sh +135 -0
  637. package/pennyfarthing-dist/scripts/sprint/available-stories.sh +97 -0
  638. package/pennyfarthing-dist/scripts/sprint/check-story.sh +164 -0
  639. package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +58 -0
  640. package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +69 -0
  641. package/pennyfarthing-dist/scripts/sprint/import-epic-to-future.mjs +377 -0
  642. package/pennyfarthing-dist/scripts/sprint/import-epic-to-future.sh +9 -0
  643. package/pennyfarthing-dist/scripts/sprint/list-future.sh +151 -0
  644. package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +116 -0
  645. package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +164 -0
  646. package/pennyfarthing-dist/scripts/sprint/sprint-common.sh +421 -0
  647. package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +39 -0
  648. package/pennyfarthing-dist/scripts/sprint/sprint-metrics.sh +241 -0
  649. package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +134 -0
  650. package/pennyfarthing-dist/scripts/story/README.md +23 -0
  651. package/pennyfarthing-dist/scripts/story/create-story.sh +159 -0
  652. package/pennyfarthing-dist/scripts/story/size-story.sh +198 -0
  653. package/pennyfarthing-dist/scripts/story/story-template.sh +162 -0
  654. package/pennyfarthing-dist/scripts/test/README.md +23 -0
  655. package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +289 -0
  656. package/pennyfarthing-dist/scripts/test/swebench-judge.py +400 -0
  657. package/pennyfarthing-dist/scripts/test/test-cache.sh +165 -0
  658. package/pennyfarthing-dist/scripts/test/test-setup.sh +337 -0
  659. package/pennyfarthing-dist/scripts/tests/check.test.sh +582 -0
  660. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +515 -0
  661. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +599 -0
  662. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +332 -0
  663. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +573 -0
  664. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +859 -0
  665. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +662 -0
  666. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +589 -0
  667. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +105 -0
  668. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +597 -0
  669. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +514 -0
  670. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +517 -0
  671. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +331 -0
  672. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +647 -0
  673. package/pennyfarthing-dist/scripts/theme/README.md +22 -0
  674. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.js +492 -0
  675. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +11 -0
  676. package/pennyfarthing-dist/scripts/theme/list-themes.sh +73 -0
  677. package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +97 -0
  678. package/pennyfarthing-dist/scripts/workflow/README.md +28 -0
  679. package/pennyfarthing-dist/scripts/workflow/check.sh +497 -0
  680. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +159 -0
  681. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +228 -0
  682. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +124 -0
  683. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +40 -0
  684. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +163 -0
  685. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +138 -0
  686. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +256 -0
  687. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +167 -0
  688. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +242 -0
  689. package/pennyfarthing-dist/skills/changelog/SKILL.md +367 -0
  690. package/pennyfarthing-dist/skills/code-review/SKILL.md +168 -0
  691. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +274 -0
  692. package/pennyfarthing-dist/skills/cyclist/SKILL.md +88 -0
  693. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +437 -0
  694. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +258 -0
  695. package/pennyfarthing-dist/skills/jira/SKILL.md +484 -0
  696. package/pennyfarthing-dist/skills/judge/SKILL.md +579 -0
  697. package/pennyfarthing-dist/skills/just/SKILL.md +403 -0
  698. package/pennyfarthing-dist/skills/mermaid/SKILL.md +240 -0
  699. package/pennyfarthing-dist/skills/otel/skill.md +223 -0
  700. package/pennyfarthing-dist/skills/permissions/skill.md +172 -0
  701. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +178 -0
  702. package/pennyfarthing-dist/skills/skill-registry.schema.json +107 -0
  703. package/pennyfarthing-dist/skills/skill-registry.yaml +357 -0
  704. package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +101 -0
  705. package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +97 -0
  706. package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +164 -0
  707. package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +101 -0
  708. package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +116 -0
  709. package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +164 -0
  710. package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +39 -0
  711. package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +147 -0
  712. package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +104 -0
  713. package/pennyfarthing-dist/skills/sprint/skill.md +465 -0
  714. package/pennyfarthing-dist/skills/story/scripts/create-story.sh +159 -0
  715. package/pennyfarthing-dist/skills/story/scripts/size-story.sh +198 -0
  716. package/pennyfarthing-dist/skills/story/scripts/story-template.sh +162 -0
  717. package/pennyfarthing-dist/skills/story/skill.md +219 -0
  718. package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +390 -0
  719. package/pennyfarthing-dist/skills/testing/SKILL.md +99 -0
  720. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +124 -0
  721. package/pennyfarthing-dist/skills/theme/skill.md +129 -0
  722. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +174 -0
  723. package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +91 -0
  724. package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +163 -0
  725. package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +138 -0
  726. package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +273 -0
  727. package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +167 -0
  728. package/pennyfarthing-dist/skills/workflow/skill.md +337 -0
  729. package/pennyfarthing-dist/skills/yq/SKILL.md +264 -0
  730. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +187 -0
  731. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +59 -0
  732. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +276 -0
  733. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +61 -0
  734. package/pennyfarthing-dist/templates/persona-config.yaml.template +22 -0
  735. package/pennyfarthing-dist/templates/preferences.yaml.template +15 -0
  736. package/pennyfarthing-dist/templates/settings.local.json.template +90 -0
  737. package/pennyfarthing-dist/templates/setup-env.sh.template +18 -0
  738. package/pennyfarthing-dist/templates/shared-context.md.template +70 -0
  739. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +40 -0
  740. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +37 -0
  741. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +34 -0
  742. package/pennyfarthing-dist/workflows/agent-docs.yaml +70 -0
  743. package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +101 -0
  744. package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +93 -0
  745. package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +115 -0
  746. package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +133 -0
  747. package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +138 -0
  748. package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +133 -0
  749. package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +142 -0
  750. package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +160 -0
  751. package/pennyfarthing-dist/workflows/architecture/templates/architecture-decision.md +102 -0
  752. package/pennyfarthing-dist/workflows/architecture.yaml +65 -0
  753. package/pennyfarthing-dist/workflows/bdd.yaml +60 -0
  754. package/pennyfarthing-dist/workflows/brainstorming/brain-methods.csv +62 -0
  755. package/pennyfarthing-dist/workflows/brainstorming/checklist.md +44 -0
  756. package/pennyfarthing-dist/workflows/brainstorming/instructions.md +736 -0
  757. package/pennyfarthing-dist/workflows/brainstorming/workflow.yaml +49 -0
  758. package/pennyfarthing-dist/workflows/code-review/checklist.md +23 -0
  759. package/pennyfarthing-dist/workflows/code-review/instructions.md +234 -0
  760. package/pennyfarthing-dist/workflows/code-review/workflow.yaml +51 -0
  761. package/pennyfarthing-dist/workflows/dev-story/checklist.md +80 -0
  762. package/pennyfarthing-dist/workflows/dev-story/instructions.xml +410 -0
  763. package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +50 -0
  764. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +256 -0
  765. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +233 -0
  766. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +272 -0
  767. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +153 -0
  768. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +122 -0
  769. package/pennyfarthing-dist/workflows/epics-and-stories/templates/epics-template.md +57 -0
  770. package/pennyfarthing-dist/workflows/epics-and-stories/workflow.yaml +28 -0
  771. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +190 -0
  772. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +178 -0
  773. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
  774. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +139 -0
  775. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
  776. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +133 -0
  777. package/pennyfarthing-dist/workflows/implementation-readiness/templates/readiness-report-template.md +4 -0
  778. package/pennyfarthing-dist/workflows/implementation-readiness/workflow.yaml +40 -0
  779. package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +13 -0
  780. package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +197 -0
  781. package/pennyfarthing-dist/workflows/prd/data/project-types.csv +11 -0
  782. package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +191 -0
  783. package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +153 -0
  784. package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +224 -0
  785. package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +226 -0
  786. package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +213 -0
  787. package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +207 -0
  788. package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +226 -0
  789. package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +237 -0
  790. package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +228 -0
  791. package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +231 -0
  792. package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +242 -0
  793. package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +217 -0
  794. package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +180 -0
  795. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +247 -0
  796. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
  797. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +249 -0
  798. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +253 -0
  799. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +168 -0
  800. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +218 -0
  801. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +191 -0
  802. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +209 -0
  803. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +174 -0
  804. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  805. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +228 -0
  806. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +217 -0
  807. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  808. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  809. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +263 -0
  810. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +209 -0
  811. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  812. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +242 -0
  813. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +232 -0
  814. package/pennyfarthing-dist/workflows/prd/templates/prd-template.md +10 -0
  815. package/pennyfarthing-dist/workflows/prd/workflow.yaml +42 -0
  816. package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +177 -0
  817. package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +161 -0
  818. package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +199 -0
  819. package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +202 -0
  820. package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +205 -0
  821. package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +219 -0
  822. package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +194 -0
  823. package/pennyfarthing-dist/workflows/product-brief/templates/product-brief.template.md +10 -0
  824. package/pennyfarthing-dist/workflows/product-brief/workflow.yaml +31 -0
  825. package/pennyfarthing-dist/workflows/project-context/project-context-template.md +21 -0
  826. package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +184 -0
  827. package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +318 -0
  828. package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +278 -0
  829. package/pennyfarthing-dist/workflows/project-context/workflow.yaml +27 -0
  830. package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +156 -0
  831. package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +120 -0
  832. package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +113 -0
  833. package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +113 -0
  834. package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +106 -0
  835. package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +140 -0
  836. package/pennyfarthing-dist/workflows/quick-dev/workflow.yaml +27 -0
  837. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +189 -0
  838. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +144 -0
  839. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +128 -0
  840. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +191 -0
  841. package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +74 -0
  842. package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +27 -0
  843. package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +137 -0
  844. package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +229 -0
  845. package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +238 -0
  846. package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +206 -0
  847. package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +234 -0
  848. package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +443 -0
  849. package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +182 -0
  850. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +237 -0
  851. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +200 -0
  852. package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +249 -0
  853. package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +259 -0
  854. package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +177 -0
  855. package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +475 -0
  856. package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +137 -0
  857. package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +239 -0
  858. package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +248 -0
  859. package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +202 -0
  860. package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +239 -0
  861. package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +486 -0
  862. package/pennyfarthing-dist/workflows/research/templates/research.template.md +29 -0
  863. package/pennyfarthing-dist/workflows/research/workflow.yaml +45 -0
  864. package/pennyfarthing-dist/workflows/retrospective/checklist.md +31 -0
  865. package/pennyfarthing-dist/workflows/retrospective/instructions.md +1443 -0
  866. package/pennyfarthing-dist/workflows/retrospective/workflow.yaml +50 -0
  867. package/pennyfarthing-dist/workflows/sprint-planning/checklist.md +33 -0
  868. package/pennyfarthing-dist/workflows/sprint-planning/sprint-status-template.yaml +55 -0
  869. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +54 -0
  870. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +44 -0
  871. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +64 -0
  872. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +73 -0
  873. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +56 -0
  874. package/pennyfarthing-dist/workflows/sprint-planning/workflow.yaml +34 -0
  875. package/pennyfarthing-dist/workflows/tdd.yaml +50 -0
  876. package/pennyfarthing-dist/workflows/trivial.yaml +40 -0
  877. package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +135 -0
  878. package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +127 -0
  879. package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +190 -0
  880. package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +216 -0
  881. package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +219 -0
  882. package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +234 -0
  883. package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +252 -0
  884. package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +254 -0
  885. package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +224 -0
  886. package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +224 -0
  887. package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +241 -0
  888. package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +248 -0
  889. package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +237 -0
  890. package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +264 -0
  891. package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +228 -0
  892. package/pennyfarthing-dist/workflows/ux-design/ux-design-template.md +13 -0
  893. package/pennyfarthing-dist/workflows/ux-design/workflow.yaml +41 -0
  894. package/dist/cli/utils/files.js +0 -179
  895. package/dist/cli/utils/manifest.js +0 -93
  896. package/dist/cli/utils/version.js +0 -70
  897. package/dist/index.js +0 -48
  898. package/dist/permissions/index.js +0 -16
  899. package/dist/scripts/job-fair-aggregator.js +0 -690
  900. package/dist/workflow/index.js +0 -31
  901. /package/{bin → packages/core/bin}/pennyfarthing.js +0 -0
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Workflow Executor for MSSCI-12084
3
+ *
4
+ * Implements /workflow start, resume, and status commands for stepped workflows.
5
+ * Coordinates step loading, session state tracking, and progress reporting.
6
+ */
7
+ import { initWorkflowState, updateWorkflowState, parseSessionState, updateSessionContent, } from './session-state.js';
8
+ import { parseStepFromPath } from './step-parser.js';
9
+ import { resolveStepVariables } from './variable-resolver.js';
10
+ /**
11
+ * Start a new stepped workflow
12
+ *
13
+ * @param workflow - Workflow definition
14
+ * @param sessionContent - Current session file content (or empty for new)
15
+ * @param mode - Optional tri-modal mode (default: workflow default or 'create')
16
+ * @returns StartResult with state, first step, and updated session
17
+ */
18
+ export async function startWorkflow(workflow, sessionContent, mode) {
19
+ // Determine mode: explicit > workflow default > 'create'
20
+ const effectiveMode = mode ?? workflow.modes?.default ?? 'create';
21
+ // Initialize workflow state
22
+ const state = initWorkflowState(workflow.name, workflow.type, effectiveMode);
23
+ // Update session content with workflow state
24
+ const updateResult = updateSessionContent(sessionContent, state);
25
+ if (!updateResult.success || !updateResult.content) {
26
+ return {
27
+ success: false,
28
+ error: updateResult.error ?? 'Failed to update session content',
29
+ };
30
+ }
31
+ // Try to load step 1 (may fail if step file doesn't exist)
32
+ const step = await loadStep(workflow, 1, workflow.variables);
33
+ return {
34
+ success: true,
35
+ state,
36
+ step: step ?? undefined,
37
+ sessionContent: updateResult.content,
38
+ };
39
+ }
40
+ /**
41
+ * Resume an existing stepped workflow from last completed step
42
+ *
43
+ * @param workflow - Workflow definition
44
+ * @param sessionContent - Current session file content with state
45
+ * @returns ResumeResult with state and next step
46
+ */
47
+ export async function resumeWorkflow(workflow, sessionContent) {
48
+ // Parse existing state from session
49
+ const parseResult = parseSessionState(sessionContent);
50
+ if (!parseResult.success || !parseResult.state) {
51
+ return {
52
+ success: false,
53
+ error: 'No workflow state found in session',
54
+ };
55
+ }
56
+ const state = parseResult.state;
57
+ // Check if workflow is already complete
58
+ if (state.status === 'completed') {
59
+ return {
60
+ success: true,
61
+ state,
62
+ isComplete: true,
63
+ };
64
+ }
65
+ // Try to load the current step
66
+ const step = await loadStep(workflow, state.currentStep, workflow.variables);
67
+ return {
68
+ success: true,
69
+ state,
70
+ step: step ?? undefined,
71
+ };
72
+ }
73
+ /**
74
+ * Get current workflow status from session
75
+ *
76
+ * @param sessionContent - Session file content
77
+ * @param totalSteps - Total number of steps in workflow
78
+ * @returns StatusResult with progress information
79
+ */
80
+ export function getWorkflowStatus(sessionContent, totalSteps) {
81
+ // Parse state from session
82
+ const parseResult = parseSessionState(sessionContent);
83
+ if (!parseResult.success || !parseResult.state) {
84
+ return {
85
+ success: false,
86
+ error: 'No workflow state found in session',
87
+ };
88
+ }
89
+ const state = parseResult.state;
90
+ // Calculate completion percentage
91
+ const completedCount = state.stepsCompleted.length;
92
+ const completionPercent = totalSteps > 0
93
+ ? Math.round((completedCount / totalSteps) * 100)
94
+ : 0;
95
+ const status = {
96
+ name: state.name,
97
+ type: state.type,
98
+ mode: state.mode,
99
+ currentStep: state.currentStep,
100
+ totalSteps,
101
+ stepsCompleted: state.stepsCompleted,
102
+ completionPercent,
103
+ status: state.status,
104
+ started: state.started,
105
+ lastUpdated: state.lastUpdated,
106
+ };
107
+ return {
108
+ success: true,
109
+ status,
110
+ };
111
+ }
112
+ /**
113
+ * Load step file for a specific step number
114
+ *
115
+ * @param workflow - Workflow definition
116
+ * @param stepNumber - Step number to load
117
+ * @param variables - Variables for content resolution
118
+ * @returns ParsedStep with resolved content
119
+ */
120
+ export async function loadStep(workflow, stepNumber, variables) {
121
+ // Build step file path
122
+ const pattern = workflow.steps.pattern ?? 'step-*.md';
123
+ const paddedNum = String(stepNumber).padStart(2, '0');
124
+ // Replace * in pattern with padded step number
125
+ const filename = pattern.replace('*', paddedNum);
126
+ const stepPath = `${workflow.steps.path}/${filename}`;
127
+ try {
128
+ const parseResult = await parseStepFromPath(stepPath);
129
+ if (!parseResult.success || !parseResult.step) {
130
+ return null;
131
+ }
132
+ // Resolve variables in step content if provided
133
+ if (variables && Object.keys(variables).length > 0) {
134
+ const resolveResult = resolveStepVariables(parseResult.step.content, {
135
+ workflowVars: variables,
136
+ });
137
+ parseResult.step.content = resolveResult.content;
138
+ }
139
+ return parseResult.step;
140
+ }
141
+ catch {
142
+ // Step file doesn't exist or can't be read
143
+ return null;
144
+ }
145
+ }
146
+ /**
147
+ * Complete current step and advance workflow state
148
+ *
149
+ * @param sessionContent - Current session content
150
+ * @param stepNumber - Step number being completed
151
+ * @param nextStep - Optional specific next step (for skip scenarios)
152
+ * @returns Updated session content
153
+ */
154
+ export function completeStep(sessionContent, stepNumber, nextStep) {
155
+ // Parse existing state
156
+ const parseResult = parseSessionState(sessionContent);
157
+ if (!parseResult.success || !parseResult.state) {
158
+ return sessionContent; // Return unchanged if no state
159
+ }
160
+ // Update state with completed step
161
+ const updatedState = updateWorkflowState(parseResult.state, stepNumber, nextStep);
162
+ // Update session content
163
+ const updateResult = updateSessionContent(sessionContent, updatedState);
164
+ return updateResult.content ?? sessionContent;
165
+ }
166
+ /**
167
+ * Check if workflow has an in-progress state in session
168
+ *
169
+ * @param sessionContent - Session file content
170
+ * @returns true if workflow is in progress
171
+ */
172
+ export function hasActiveWorkflow(sessionContent) {
173
+ const parseResult = parseSessionState(sessionContent);
174
+ if (!parseResult.success || !parseResult.state) {
175
+ return false;
176
+ }
177
+ // Active means in_progress or paused (not completed)
178
+ return parseResult.state.status === 'in_progress' || parseResult.state.status === 'paused';
179
+ }
180
+ /**
181
+ * Detect incomplete workflow from session and return name
182
+ *
183
+ * @param sessionContent - Session file content
184
+ * @returns Workflow name if incomplete workflow found, undefined otherwise
185
+ */
186
+ export function detectIncompleteWorkflow(sessionContent) {
187
+ const parseResult = parseSessionState(sessionContent);
188
+ if (!parseResult.success || !parseResult.state) {
189
+ return undefined;
190
+ }
191
+ // Only return name if workflow is not completed
192
+ if (parseResult.state.status === 'completed') {
193
+ return undefined;
194
+ }
195
+ return parseResult.state.name;
196
+ }
197
+ //# sourceMappingURL=workflow-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-executor.js","sourceRoot":"","sources":["../../src/workflow/workflow-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Workflow Executor Tests for MSSCI-12084
3
+ *
4
+ * Tests for /workflow start, resume, and status commands.
5
+ * Covers all 8 acceptance criteria plus edge cases.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=workflow-executor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-executor.test.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow-executor.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,444 @@
1
+ /**
2
+ * Workflow Executor Tests for MSSCI-12084
3
+ *
4
+ * Tests for /workflow start, resume, and status commands.
5
+ * Covers all 8 acceptance criteria plus edge cases.
6
+ */
7
+ import { describe, it } from 'node:test';
8
+ import assert from 'node:assert';
9
+ import { startWorkflow, resumeWorkflow, getWorkflowStatus, loadStep, completeStep, hasActiveWorkflow, detectIncompleteWorkflow, } from './workflow-executor.js';
10
+ // =============================================================================
11
+ // Test Fixtures
12
+ // =============================================================================
13
+ const mockWorkflow = {
14
+ name: 'architecture',
15
+ type: 'stepped',
16
+ description: 'Architecture design workflow',
17
+ steps: {
18
+ path: '/workflows/architecture/steps',
19
+ pattern: 'step-*.md',
20
+ },
21
+ modes: {
22
+ default: 'create',
23
+ available: ['create', 'validate', 'edit'],
24
+ },
25
+ variables: {
26
+ project_name: 'Test Project',
27
+ },
28
+ gates: {
29
+ after_steps: [2, 5],
30
+ },
31
+ totalSteps: 7,
32
+ };
33
+ const emptySession = `# Story Test
34
+
35
+ ## Story Overview
36
+ - **Epic:** Test Epic
37
+
38
+ ## Acceptance Criteria
39
+ - [ ] AC1
40
+ `;
41
+ const sessionWithWorkflowState = `# Story Test
42
+
43
+ ## Story Overview
44
+ - **Epic:** Test Epic
45
+
46
+ ## Workflow State
47
+ - **Workflow Name:** architecture
48
+ - **Type:** stepped
49
+ - **Mode:** create
50
+ - **Started:** 2026-01-20T10:00:00.000Z
51
+ - **Last Updated:** 2026-01-20T11:30:00.000Z
52
+ - **Current Step:** 3
53
+ - **Steps Completed:** [1, 2]
54
+ - **Status:** in_progress
55
+
56
+ ## Acceptance Criteria
57
+ - [ ] AC1
58
+ `;
59
+ const sessionWithCompletedWorkflow = `# Story Test
60
+
61
+ ## Workflow State
62
+ - **Workflow Name:** architecture
63
+ - **Type:** stepped
64
+ - **Mode:** create
65
+ - **Started:** 2026-01-20T10:00:00.000Z
66
+ - **Last Updated:** 2026-01-20T15:00:00.000Z
67
+ - **Current Step:** 7
68
+ - **Steps Completed:** [1, 2, 3, 4, 5, 6, 7]
69
+ - **Status:** completed
70
+ `;
71
+ // =============================================================================
72
+ // AC1: /workflow start <name> [--mode create|validate|edit] implemented
73
+ // =============================================================================
74
+ describe('MSSCI-12084: Workflow Executor', () => {
75
+ describe('AC1: /workflow start command', () => {
76
+ it('should start workflow with given name', async () => {
77
+ const result = await startWorkflow(mockWorkflow, emptySession);
78
+ assert.strictEqual(result.success, true);
79
+ assert.ok(result.state);
80
+ assert.strictEqual(result.state.name, 'architecture');
81
+ assert.strictEqual(result.state.type, 'stepped');
82
+ });
83
+ it('should accept --mode flag for tri-modal selection', async () => {
84
+ const result = await startWorkflow(mockWorkflow, emptySession, 'validate');
85
+ assert.strictEqual(result.success, true);
86
+ assert.strictEqual(result.state?.mode, 'validate');
87
+ });
88
+ it('should accept create mode', async () => {
89
+ const result = await startWorkflow(mockWorkflow, emptySession, 'create');
90
+ assert.strictEqual(result.success, true);
91
+ assert.strictEqual(result.state?.mode, 'create');
92
+ });
93
+ it('should accept validate mode', async () => {
94
+ const result = await startWorkflow(mockWorkflow, emptySession, 'validate');
95
+ assert.strictEqual(result.success, true);
96
+ assert.strictEqual(result.state?.mode, 'validate');
97
+ });
98
+ it('should accept edit mode', async () => {
99
+ const result = await startWorkflow(mockWorkflow, emptySession, 'edit');
100
+ assert.strictEqual(result.success, true);
101
+ assert.strictEqual(result.state?.mode, 'edit');
102
+ });
103
+ it('should return error for invalid workflow definition', async () => {
104
+ const invalidWorkflow = { ...mockWorkflow, name: '' };
105
+ const result = await startWorkflow(invalidWorkflow, emptySession);
106
+ // Should handle invalid workflow gracefully
107
+ assert.ok(result);
108
+ });
109
+ });
110
+ // =============================================================================
111
+ // AC2: /workflow start creates session and loads step 1
112
+ // =============================================================================
113
+ describe('AC2: Start creates session and loads step 1', () => {
114
+ it('should initialize workflow state at step 1', async () => {
115
+ const result = await startWorkflow(mockWorkflow, emptySession);
116
+ assert.strictEqual(result.success, true);
117
+ assert.strictEqual(result.state?.currentStep, 1);
118
+ assert.deepStrictEqual(result.state?.stepsCompleted, []);
119
+ });
120
+ it('should set status to in_progress', async () => {
121
+ const result = await startWorkflow(mockWorkflow, emptySession);
122
+ assert.strictEqual(result.state?.status, 'in_progress');
123
+ });
124
+ it('should include step 1 content in result', async () => {
125
+ const result = await startWorkflow(mockWorkflow, emptySession);
126
+ // Step content should be loaded (or null if file not found)
127
+ assert.ok(result.step !== undefined || result.success === true);
128
+ });
129
+ it('should return updated session content with workflow state', async () => {
130
+ const result = await startWorkflow(mockWorkflow, emptySession);
131
+ assert.ok(result.sessionContent);
132
+ assert.ok(result.sessionContent.includes('## Workflow State'));
133
+ assert.ok(result.sessionContent.includes('**Workflow Name:** architecture'));
134
+ });
135
+ it('should set started timestamp', async () => {
136
+ const result = await startWorkflow(mockWorkflow, emptySession);
137
+ assert.ok(result.state?.started);
138
+ // Should be ISO timestamp
139
+ assert.ok(result.state.started.match(/^\d{4}-\d{2}-\d{2}T/));
140
+ });
141
+ it('should set lastUpdated timestamp', async () => {
142
+ const result = await startWorkflow(mockWorkflow, emptySession);
143
+ assert.ok(result.state?.lastUpdated);
144
+ assert.ok(result.state.lastUpdated.match(/^\d{4}-\d{2}-\d{2}T/));
145
+ });
146
+ });
147
+ // =============================================================================
148
+ // AC3: --mode flag selects tri-modal path (default: create)
149
+ // =============================================================================
150
+ describe('AC3: Tri-modal mode selection', () => {
151
+ it('should use create as default mode when not specified', async () => {
152
+ const result = await startWorkflow(mockWorkflow, emptySession);
153
+ assert.strictEqual(result.state?.mode, 'create');
154
+ });
155
+ it('should use workflow default mode if specified in definition', async () => {
156
+ const workflowWithValidateDefault = {
157
+ ...mockWorkflow,
158
+ modes: {
159
+ default: 'validate',
160
+ available: ['create', 'validate', 'edit'],
161
+ },
162
+ };
163
+ const result = await startWorkflow(workflowWithValidateDefault, emptySession);
164
+ assert.strictEqual(result.state?.mode, 'validate');
165
+ });
166
+ it('should override workflow default with explicit mode', async () => {
167
+ const workflowWithValidateDefault = {
168
+ ...mockWorkflow,
169
+ modes: {
170
+ default: 'validate',
171
+ available: ['create', 'validate', 'edit'],
172
+ },
173
+ };
174
+ const result = await startWorkflow(workflowWithValidateDefault, emptySession, 'edit');
175
+ assert.strictEqual(result.state?.mode, 'edit');
176
+ });
177
+ it('should not set mode for workflows without modes config', async () => {
178
+ const workflowWithoutModes = {
179
+ ...mockWorkflow,
180
+ modes: undefined,
181
+ };
182
+ const result = await startWorkflow(workflowWithoutModes, emptySession);
183
+ // Mode should be undefined or default to create
184
+ assert.ok(result.state?.mode === undefined || result.state?.mode === 'create');
185
+ });
186
+ it('should include mode in session content when set', async () => {
187
+ const result = await startWorkflow(mockWorkflow, emptySession, 'validate');
188
+ assert.ok(result.sessionContent?.includes('**Mode:** validate'));
189
+ });
190
+ });
191
+ // =============================================================================
192
+ // AC4: /workflow resume [name] implemented
193
+ // =============================================================================
194
+ describe('AC4: /workflow resume command', () => {
195
+ it('should resume workflow from existing session state', async () => {
196
+ const result = await resumeWorkflow(mockWorkflow, sessionWithWorkflowState);
197
+ assert.strictEqual(result.success, true);
198
+ assert.ok(result.state);
199
+ });
200
+ it('should return current state from session', async () => {
201
+ const result = await resumeWorkflow(mockWorkflow, sessionWithWorkflowState);
202
+ assert.strictEqual(result.state?.name, 'architecture');
203
+ assert.strictEqual(result.state?.currentStep, 3);
204
+ assert.deepStrictEqual(result.state?.stepsCompleted, [1, 2]);
205
+ });
206
+ it('should return error when no workflow state in session', async () => {
207
+ const result = await resumeWorkflow(mockWorkflow, emptySession);
208
+ // Should fail or return isComplete with no active workflow
209
+ assert.ok(result.error || result.state === undefined);
210
+ });
211
+ it('should preserve mode from existing state', async () => {
212
+ const result = await resumeWorkflow(mockWorkflow, sessionWithWorkflowState);
213
+ assert.strictEqual(result.state?.mode, 'create');
214
+ });
215
+ });
216
+ // =============================================================================
217
+ // AC5: /workflow resume detects incomplete workflow and continues
218
+ // =============================================================================
219
+ describe('AC5: Resume detects incomplete workflow', () => {
220
+ it('should detect incomplete workflow from session', () => {
221
+ const workflowName = detectIncompleteWorkflow(sessionWithWorkflowState);
222
+ assert.strictEqual(workflowName, 'architecture');
223
+ });
224
+ it('should return undefined when no workflow in session', () => {
225
+ const workflowName = detectIncompleteWorkflow(emptySession);
226
+ assert.strictEqual(workflowName, undefined);
227
+ });
228
+ it('should return undefined when workflow is completed', () => {
229
+ const workflowName = detectIncompleteWorkflow(sessionWithCompletedWorkflow);
230
+ // Completed workflows should not be detected as incomplete
231
+ assert.strictEqual(workflowName, undefined);
232
+ });
233
+ it('should continue from last completed step', async () => {
234
+ const result = await resumeWorkflow(mockWorkflow, sessionWithWorkflowState);
235
+ // Current step should be 3 (next after completed steps [1, 2])
236
+ assert.strictEqual(result.state?.currentStep, 3);
237
+ });
238
+ it('should load next step content on resume', async () => {
239
+ const result = await resumeWorkflow(mockWorkflow, sessionWithWorkflowState);
240
+ // Step should be loaded (number should match current step)
241
+ assert.ok(result.step === undefined || result.step?.number === 3);
242
+ });
243
+ it('should mark as complete when all steps done', async () => {
244
+ const result = await resumeWorkflow(mockWorkflow, sessionWithCompletedWorkflow);
245
+ assert.strictEqual(result.isComplete, true);
246
+ });
247
+ });
248
+ // =============================================================================
249
+ // AC6: /workflow status shows step progress and completion %
250
+ // =============================================================================
251
+ describe('AC6: /workflow status command', () => {
252
+ it('should return workflow status from session', () => {
253
+ const result = getWorkflowStatus(sessionWithWorkflowState, 7);
254
+ assert.strictEqual(result.success, true);
255
+ assert.ok(result.status);
256
+ });
257
+ it('should show current step number', () => {
258
+ const result = getWorkflowStatus(sessionWithWorkflowState, 7);
259
+ assert.strictEqual(result.status?.currentStep, 3);
260
+ });
261
+ it('should show total steps', () => {
262
+ const result = getWorkflowStatus(sessionWithWorkflowState, 7);
263
+ assert.strictEqual(result.status?.totalSteps, 7);
264
+ });
265
+ it('should show completed steps array', () => {
266
+ const result = getWorkflowStatus(sessionWithWorkflowState, 7);
267
+ assert.deepStrictEqual(result.status?.stepsCompleted, [1, 2]);
268
+ });
269
+ it('should calculate completion percentage', () => {
270
+ const result = getWorkflowStatus(sessionWithWorkflowState, 7);
271
+ // 2 of 7 steps completed = ~28.57%
272
+ assert.ok(result.status?.completionPercent);
273
+ assert.ok(result.status.completionPercent >= 28 && result.status.completionPercent <= 29);
274
+ });
275
+ it('should show 0% for new workflow', () => {
276
+ const newWorkflowSession = `## Workflow State
277
+ - **Workflow Name:** test
278
+ - **Type:** stepped
279
+ - **Started:** 2026-01-20T10:00:00.000Z
280
+ - **Last Updated:** 2026-01-20T10:00:00.000Z
281
+ - **Current Step:** 1
282
+ - **Steps Completed:** []
283
+ - **Status:** in_progress
284
+ `;
285
+ const result = getWorkflowStatus(newWorkflowSession, 5);
286
+ assert.strictEqual(result.status?.completionPercent, 0);
287
+ });
288
+ it('should show 100% for completed workflow', () => {
289
+ const result = getWorkflowStatus(sessionWithCompletedWorkflow, 7);
290
+ assert.strictEqual(result.status?.completionPercent, 100);
291
+ });
292
+ it('should show workflow name', () => {
293
+ const result = getWorkflowStatus(sessionWithWorkflowState, 7);
294
+ assert.strictEqual(result.status?.name, 'architecture');
295
+ });
296
+ it('should show workflow type', () => {
297
+ const result = getWorkflowStatus(sessionWithWorkflowState, 7);
298
+ assert.strictEqual(result.status?.type, 'stepped');
299
+ });
300
+ it('should show mode if set', () => {
301
+ const result = getWorkflowStatus(sessionWithWorkflowState, 7);
302
+ assert.strictEqual(result.status?.mode, 'create');
303
+ });
304
+ it('should show workflow status', () => {
305
+ const result = getWorkflowStatus(sessionWithWorkflowState, 7);
306
+ assert.strictEqual(result.status?.status, 'in_progress');
307
+ });
308
+ it('should return error when no workflow state', () => {
309
+ const result = getWorkflowStatus(emptySession, 7);
310
+ // Should indicate no active workflow
311
+ assert.ok(!result.status || result.error);
312
+ });
313
+ });
314
+ // =============================================================================
315
+ // AC7: Session file state tracked via Workflow State section
316
+ // =============================================================================
317
+ describe('AC7: Session state integration', () => {
318
+ it('should write workflow state to session on start', async () => {
319
+ const result = await startWorkflow(mockWorkflow, emptySession);
320
+ assert.ok(result.sessionContent?.includes('## Workflow State'));
321
+ });
322
+ it('should update session state on step completion', () => {
323
+ const updated = completeStep(sessionWithWorkflowState, 3);
324
+ assert.ok(updated.includes('**Steps Completed:**'));
325
+ // Should now include step 3
326
+ assert.ok(updated.includes('[1, 2, 3]'));
327
+ });
328
+ it('should advance current step on completion', () => {
329
+ const updated = completeStep(sessionWithWorkflowState, 3);
330
+ assert.ok(updated.includes('**Current Step:** 4'));
331
+ });
332
+ it('should update lastUpdated timestamp on completion', () => {
333
+ const updated = completeStep(sessionWithWorkflowState, 3);
334
+ // lastUpdated should be different from original
335
+ assert.ok(updated.includes('**Last Updated:**'));
336
+ });
337
+ it('should detect active workflow in session', () => {
338
+ const hasActive = hasActiveWorkflow(sessionWithWorkflowState);
339
+ assert.strictEqual(hasActive, true);
340
+ });
341
+ it('should detect no active workflow in empty session', () => {
342
+ const hasActive = hasActiveWorkflow(emptySession);
343
+ assert.strictEqual(hasActive, false);
344
+ });
345
+ it('should preserve other session content when updating state', async () => {
346
+ const result = await startWorkflow(mockWorkflow, emptySession);
347
+ assert.ok(result.sessionContent?.includes('## Story Overview'));
348
+ assert.ok(result.sessionContent?.includes('## Acceptance Criteria'));
349
+ });
350
+ });
351
+ // =============================================================================
352
+ // AC8: Commands available in CLI with help documentation
353
+ // This AC is about CLI integration - tested via bash script existence
354
+ // =============================================================================
355
+ describe('AC8: CLI availability', () => {
356
+ it('should export startWorkflow function', () => {
357
+ assert.strictEqual(typeof startWorkflow, 'function');
358
+ });
359
+ it('should export resumeWorkflow function', () => {
360
+ assert.strictEqual(typeof resumeWorkflow, 'function');
361
+ });
362
+ it('should export getWorkflowStatus function', () => {
363
+ assert.strictEqual(typeof getWorkflowStatus, 'function');
364
+ });
365
+ it('should export loadStep function', () => {
366
+ assert.strictEqual(typeof loadStep, 'function');
367
+ });
368
+ it('should export completeStep function', () => {
369
+ assert.strictEqual(typeof completeStep, 'function');
370
+ });
371
+ it('should export hasActiveWorkflow function', () => {
372
+ assert.strictEqual(typeof hasActiveWorkflow, 'function');
373
+ });
374
+ it('should export detectIncompleteWorkflow function', () => {
375
+ assert.strictEqual(typeof detectIncompleteWorkflow, 'function');
376
+ });
377
+ });
378
+ // =============================================================================
379
+ // Edge Cases
380
+ // =============================================================================
381
+ describe('Edge Cases', () => {
382
+ it('should handle workflow with no steps gracefully', async () => {
383
+ const emptyWorkflow = {
384
+ ...mockWorkflow,
385
+ totalSteps: 0,
386
+ };
387
+ const result = await startWorkflow(emptyWorkflow, emptySession);
388
+ // Should handle gracefully
389
+ assert.ok(result);
390
+ });
391
+ it('should handle single-step workflow', async () => {
392
+ const singleStepWorkflow = {
393
+ ...mockWorkflow,
394
+ totalSteps: 1,
395
+ };
396
+ const result = await startWorkflow(singleStepWorkflow, emptySession);
397
+ assert.ok(result.state?.currentStep === 1);
398
+ });
399
+ it('should handle phased workflow type', async () => {
400
+ const phasedWorkflow = {
401
+ ...mockWorkflow,
402
+ type: 'phased',
403
+ };
404
+ const result = await startWorkflow(phasedWorkflow, emptySession);
405
+ assert.strictEqual(result.state?.type, 'phased');
406
+ });
407
+ it('should handle step completion with explicit next step', () => {
408
+ // Skip from step 3 to step 5
409
+ const updated = completeStep(sessionWithWorkflowState, 3, 5);
410
+ assert.ok(updated.includes('**Current Step:** 5'));
411
+ });
412
+ it('should handle resume on paused workflow', async () => {
413
+ const pausedSession = sessionWithWorkflowState.replace('in_progress', 'paused');
414
+ const result = await resumeWorkflow(mockWorkflow, pausedSession);
415
+ // Should be able to resume paused workflow
416
+ assert.ok(result);
417
+ });
418
+ it('should calculate correct percentage for mid-workflow', () => {
419
+ // 3 of 5 steps = 60%
420
+ const sessionWith3of5 = `## Workflow State
421
+ - **Workflow Name:** test
422
+ - **Type:** stepped
423
+ - **Started:** 2026-01-20T10:00:00.000Z
424
+ - **Last Updated:** 2026-01-20T10:00:00.000Z
425
+ - **Current Step:** 4
426
+ - **Steps Completed:** [1, 2, 3]
427
+ - **Status:** in_progress
428
+ `;
429
+ const result = getWorkflowStatus(sessionWith3of5, 5);
430
+ assert.strictEqual(result.status?.completionPercent, 60);
431
+ });
432
+ it('should handle loadStep for non-existent step', async () => {
433
+ const result = await loadStep(mockWorkflow, 999);
434
+ // Should return null or handle gracefully
435
+ assert.ok(result === null || result !== undefined);
436
+ });
437
+ it('should handle workflow variables in step loading', async () => {
438
+ const result = await loadStep(mockWorkflow, 1, { project_name: 'Custom Project' });
439
+ // Should handle variables (even if step doesn't exist)
440
+ assert.ok(result === null || result !== undefined);
441
+ });
442
+ });
443
+ });
444
+ //# sourceMappingURL=workflow-executor.test.js.map