@pennyfarthing/core 6.6.0

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 (599) hide show
  1. package/README.md +293 -0
  2. package/package.json +58 -0
  3. package/packages/core/bin/pennyfarthing.js +14 -0
  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 +191 -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 +243 -0
  59. package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -0
  60. package/packages/core/dist/cli/commands/doctor.d.ts +9 -0
  61. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -0
  62. package/packages/core/dist/cli/commands/doctor.js +652 -0
  63. package/packages/core/dist/cli/commands/doctor.js.map +1 -0
  64. package/packages/core/dist/cli/commands/init.d.ts +8 -0
  65. package/packages/core/dist/cli/commands/init.d.ts.map +1 -0
  66. package/packages/core/dist/cli/commands/init.js +524 -0
  67. package/packages/core/dist/cli/commands/init.js.map +1 -0
  68. package/packages/core/dist/cli/commands/skill.d.ts +28 -0
  69. package/packages/core/dist/cli/commands/skill.d.ts.map +1 -0
  70. package/packages/core/dist/cli/commands/skill.js +416 -0
  71. package/packages/core/dist/cli/commands/skill.js.map +1 -0
  72. package/packages/core/dist/cli/commands/theme.d.ts +21 -0
  73. package/packages/core/dist/cli/commands/theme.d.ts.map +1 -0
  74. package/packages/core/dist/cli/commands/theme.js +201 -0
  75. package/packages/core/dist/cli/commands/theme.js.map +1 -0
  76. package/packages/core/dist/cli/commands/uninstall.d.ts +8 -0
  77. package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -0
  78. package/packages/core/dist/cli/commands/uninstall.js +237 -0
  79. package/packages/core/dist/cli/commands/uninstall.js.map +1 -0
  80. package/packages/core/dist/cli/commands/update.d.ts +9 -0
  81. package/packages/core/dist/cli/commands/update.d.ts.map +1 -0
  82. package/packages/core/dist/cli/commands/update.js +545 -0
  83. package/packages/core/dist/cli/commands/update.js.map +1 -0
  84. package/packages/core/dist/cli/commands/version.d.ts +2 -0
  85. package/packages/core/dist/cli/commands/version.d.ts.map +1 -0
  86. package/packages/core/dist/cli/commands/version.js +28 -0
  87. package/packages/core/dist/cli/commands/version.js.map +1 -0
  88. package/packages/core/dist/cli/customization.test.d.ts +12 -0
  89. package/packages/core/dist/cli/customization.test.d.ts.map +1 -0
  90. package/packages/core/dist/cli/customization.test.js +84 -0
  91. package/packages/core/dist/cli/customization.test.js.map +1 -0
  92. package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
  93. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
  94. package/packages/core/dist/cli/cyclist-migration.test.js +224 -0
  95. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
  96. package/packages/core/dist/cli/index.d.ts +3 -0
  97. package/packages/core/dist/cli/index.d.ts.map +1 -0
  98. package/packages/core/dist/cli/index.js +174 -0
  99. package/packages/core/dist/cli/index.js.map +1 -0
  100. package/packages/core/dist/cli/ocean-profiles.test.d.ts +13 -0
  101. package/packages/core/dist/cli/ocean-profiles.test.d.ts.map +1 -0
  102. package/packages/core/dist/cli/ocean-profiles.test.js +134 -0
  103. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -0
  104. package/packages/core/dist/cli/theme-maker.test.d.ts +11 -0
  105. package/packages/core/dist/cli/theme-maker.test.d.ts.map +1 -0
  106. package/packages/core/dist/cli/theme-maker.test.js +356 -0
  107. package/packages/core/dist/cli/theme-maker.test.js.map +1 -0
  108. package/packages/core/dist/cli/utils/constants.d.ts +60 -0
  109. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -0
  110. package/packages/core/dist/cli/utils/constants.js +52 -0
  111. package/packages/core/dist/cli/utils/constants.js.map +1 -0
  112. package/packages/core/dist/cli/utils/files.d.ts +71 -0
  113. package/packages/core/dist/cli/utils/files.d.ts.map +1 -0
  114. package/packages/core/dist/cli/utils/files.js +162 -0
  115. package/packages/core/dist/cli/utils/files.js.map +1 -0
  116. package/packages/core/dist/cli/utils/logger.d.ts +26 -0
  117. package/packages/core/dist/cli/utils/logger.d.ts.map +1 -0
  118. package/packages/core/dist/cli/utils/logger.js +88 -0
  119. package/packages/core/dist/cli/utils/logger.js.map +1 -0
  120. package/packages/core/dist/cli/utils/manifest.d.ts +47 -0
  121. package/packages/core/dist/cli/utils/manifest.d.ts.map +1 -0
  122. package/packages/core/dist/cli/utils/manifest.js +90 -0
  123. package/packages/core/dist/cli/utils/manifest.js.map +1 -0
  124. package/packages/core/dist/cli/utils/node-modules.d.ts +6 -0
  125. package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -0
  126. package/packages/core/dist/cli/utils/node-modules.js +22 -0
  127. package/packages/core/dist/cli/utils/node-modules.js.map +1 -0
  128. package/packages/core/dist/cli/utils/prompts.d.ts +34 -0
  129. package/packages/core/dist/cli/utils/prompts.d.ts.map +1 -0
  130. package/packages/core/dist/cli/utils/prompts.js +93 -0
  131. package/packages/core/dist/cli/utils/prompts.js.map +1 -0
  132. package/packages/core/dist/cli/utils/symlinks.d.ts +29 -0
  133. package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -0
  134. package/packages/core/dist/cli/utils/symlinks.js +181 -0
  135. package/packages/core/dist/cli/utils/symlinks.js.map +1 -0
  136. package/packages/core/dist/cli/utils/themes.d.ts +104 -0
  137. package/packages/core/dist/cli/utils/themes.d.ts.map +1 -0
  138. package/packages/core/dist/cli/utils/themes.js +393 -0
  139. package/packages/core/dist/cli/utils/themes.js.map +1 -0
  140. package/packages/core/dist/cli/utils/themes.test.d.ts +12 -0
  141. package/packages/core/dist/cli/utils/themes.test.d.ts.map +1 -0
  142. package/packages/core/dist/cli/utils/themes.test.js +144 -0
  143. package/packages/core/dist/cli/utils/themes.test.js.map +1 -0
  144. package/packages/core/dist/cli/utils/version.d.ts +10 -0
  145. package/packages/core/dist/cli/utils/version.d.ts.map +1 -0
  146. package/packages/core/dist/cli/utils/version.js +63 -0
  147. package/packages/core/dist/cli/utils/version.js.map +1 -0
  148. package/packages/core/dist/cli/workspace.test.d.ts +8 -0
  149. package/packages/core/dist/cli/workspace.test.d.ts.map +1 -0
  150. package/packages/core/dist/cli/workspace.test.js +154 -0
  151. package/packages/core/dist/cli/workspace.test.js.map +1 -0
  152. package/packages/core/dist/index.d.ts +6 -0
  153. package/packages/core/dist/index.d.ts.map +1 -0
  154. package/packages/core/dist/index.js +10 -0
  155. package/packages/core/dist/index.js.map +1 -0
  156. package/packages/core/dist/permissions/index.d.ts +9 -0
  157. package/packages/core/dist/permissions/index.d.ts.map +1 -0
  158. package/packages/core/dist/permissions/index.js +13 -0
  159. package/packages/core/dist/permissions/index.js.map +1 -0
  160. package/packages/core/dist/permissions/permission-schema.d.ts +89 -0
  161. package/packages/core/dist/permissions/permission-schema.d.ts.map +1 -0
  162. package/packages/core/dist/permissions/permission-schema.js +120 -0
  163. package/packages/core/dist/permissions/permission-schema.js.map +1 -0
  164. package/packages/core/dist/permissions/permission-schema.test.d.ts +40 -0
  165. package/packages/core/dist/permissions/permission-schema.test.d.ts.map +1 -0
  166. package/packages/core/dist/permissions/permission-schema.test.js +367 -0
  167. package/packages/core/dist/permissions/permission-schema.test.js.map +1 -0
  168. package/packages/core/dist/scripts/add-ocean-profiles.d.ts +9 -0
  169. package/packages/core/dist/scripts/add-ocean-profiles.d.ts.map +1 -0
  170. package/packages/core/dist/scripts/add-ocean-profiles.js +695 -0
  171. package/packages/core/dist/scripts/add-ocean-profiles.js.map +1 -0
  172. package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
  173. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
  174. package/packages/core/dist/scripts/benchmark-integration.js +691 -0
  175. package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
  176. package/packages/core/dist/scripts/benchmark-integration.test.d.ts +13 -0
  177. package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +1 -0
  178. package/packages/core/dist/scripts/benchmark-integration.test.js +680 -0
  179. package/packages/core/dist/scripts/benchmark-integration.test.js.map +1 -0
  180. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +18 -0
  181. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +1 -0
  182. package/packages/core/dist/scripts/debugging-scenarios.test.js +317 -0
  183. package/packages/core/dist/scripts/debugging-scenarios.test.js.map +1 -0
  184. package/packages/core/dist/scripts/generate-all-faces.d.ts +10 -0
  185. package/packages/core/dist/scripts/generate-all-faces.d.ts.map +1 -0
  186. package/packages/core/dist/scripts/generate-all-faces.js +256 -0
  187. package/packages/core/dist/scripts/generate-all-faces.js.map +1 -0
  188. package/packages/core/dist/scripts/generate-all-faces.test.d.ts +17 -0
  189. package/packages/core/dist/scripts/generate-all-faces.test.d.ts.map +1 -0
  190. package/packages/core/dist/scripts/generate-all-faces.test.js +372 -0
  191. package/packages/core/dist/scripts/generate-all-faces.test.js.map +1 -0
  192. package/packages/core/dist/scripts/generate-all-spiders.d.ts +10 -0
  193. package/packages/core/dist/scripts/generate-all-spiders.d.ts.map +1 -0
  194. package/packages/core/dist/scripts/generate-all-spiders.js +306 -0
  195. package/packages/core/dist/scripts/generate-all-spiders.js.map +1 -0
  196. package/packages/core/dist/scripts/generate-ascii-face.d.ts +52 -0
  197. package/packages/core/dist/scripts/generate-ascii-face.d.ts.map +1 -0
  198. package/packages/core/dist/scripts/generate-ascii-face.js +155 -0
  199. package/packages/core/dist/scripts/generate-ascii-face.js.map +1 -0
  200. package/packages/core/dist/scripts/generate-face.d.ts +52 -0
  201. package/packages/core/dist/scripts/generate-face.d.ts.map +1 -0
  202. package/packages/core/dist/scripts/generate-face.js +199 -0
  203. package/packages/core/dist/scripts/generate-face.js.map +1 -0
  204. package/packages/core/dist/scripts/generate-face.test.d.ts +13 -0
  205. package/packages/core/dist/scripts/generate-face.test.d.ts.map +1 -0
  206. package/packages/core/dist/scripts/generate-face.test.js +301 -0
  207. package/packages/core/dist/scripts/generate-face.test.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 +37 -0
  225. package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -0
  226. package/packages/core/dist/scripts/generate-spider.js +315 -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 +269 -0
  231. package/packages/core/dist/scripts/generate-spider.test.js.map +1 -0
  232. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -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/generic-handoff.d.ts +235 -0
  253. package/packages/core/dist/workflow/generic-handoff.d.ts.map +1 -0
  254. package/packages/core/dist/workflow/generic-handoff.js +358 -0
  255. package/packages/core/dist/workflow/generic-handoff.js.map +1 -0
  256. package/packages/core/dist/workflow/generic-handoff.test.d.ts +21 -0
  257. package/packages/core/dist/workflow/generic-handoff.test.d.ts.map +1 -0
  258. package/packages/core/dist/workflow/generic-handoff.test.js +499 -0
  259. package/packages/core/dist/workflow/generic-handoff.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/sm-subagents.test.d.ts +23 -0
  269. package/packages/core/dist/workflow/sm-subagents.test.d.ts.map +1 -0
  270. package/packages/core/dist/workflow/sm-subagents.test.js +727 -0
  271. package/packages/core/dist/workflow/sm-subagents.test.js.map +1 -0
  272. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts +17 -0
  273. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts.map +1 -0
  274. package/packages/core/dist/workflow/story-workflow-routing.test.js +559 -0
  275. package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -0
  276. package/packages/core/dist/workflow/test-cache.d.ts +131 -0
  277. package/packages/core/dist/workflow/test-cache.d.ts.map +1 -0
  278. package/packages/core/dist/workflow/test-cache.js +226 -0
  279. package/packages/core/dist/workflow/test-cache.js.map +1 -0
  280. package/packages/core/dist/workflow/test-cache.test.d.ts +17 -0
  281. package/packages/core/dist/workflow/test-cache.test.d.ts.map +1 -0
  282. package/packages/core/dist/workflow/test-cache.test.js +438 -0
  283. package/packages/core/dist/workflow/test-cache.test.js.map +1 -0
  284. package/packages/core/dist/workflow/workflow-loader.d.ts +76 -0
  285. package/packages/core/dist/workflow/workflow-loader.d.ts.map +1 -0
  286. package/packages/core/dist/workflow/workflow-loader.js +133 -0
  287. package/packages/core/dist/workflow/workflow-loader.js.map +1 -0
  288. package/packages/core/dist/workflow/workflow-loader.test.d.ts +15 -0
  289. package/packages/core/dist/workflow/workflow-loader.test.d.ts.map +1 -0
  290. package/packages/core/dist/workflow/workflow-loader.test.js +354 -0
  291. package/packages/core/dist/workflow/workflow-loader.test.js.map +1 -0
  292. package/packages/core/dist/workflow/workflow-migration.test.d.ts +17 -0
  293. package/packages/core/dist/workflow/workflow-migration.test.d.ts.map +1 -0
  294. package/packages/core/dist/workflow/workflow-migration.test.js +372 -0
  295. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -0
  296. package/packages/core/dist/workflow/workflow-router.d.ts +55 -0
  297. package/packages/core/dist/workflow/workflow-router.d.ts.map +1 -0
  298. package/packages/core/dist/workflow/workflow-router.js +245 -0
  299. package/packages/core/dist/workflow/workflow-router.js.map +1 -0
  300. package/packages/core/dist/workflow/workflow-router.test.d.ts +20 -0
  301. package/packages/core/dist/workflow/workflow-router.test.d.ts.map +1 -0
  302. package/packages/core/dist/workflow/workflow-router.test.js +607 -0
  303. package/packages/core/dist/workflow/workflow-router.test.js.map +1 -0
  304. package/packages/core/dist/workflow/workflow-schema.d.ts +98 -0
  305. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -0
  306. package/packages/core/dist/workflow/workflow-schema.js +230 -0
  307. package/packages/core/dist/workflow/workflow-schema.js.map +1 -0
  308. package/packages/core/dist/workflow/workflow-schema.test.d.ts +45 -0
  309. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -0
  310. package/packages/core/dist/workflow/workflow-schema.test.js +512 -0
  311. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -0
  312. package/pennyfarthing-dist/agents/README.md +397 -0
  313. package/pennyfarthing-dist/agents/architect.md +171 -0
  314. package/pennyfarthing-dist/agents/dev.md +225 -0
  315. package/pennyfarthing-dist/agents/devops.md +183 -0
  316. package/pennyfarthing-dist/agents/generic-handoff.md +451 -0
  317. package/pennyfarthing-dist/agents/generic-sm-finish.md +261 -0
  318. package/pennyfarthing-dist/agents/generic-sm-setup.md +214 -0
  319. package/pennyfarthing-dist/agents/orchestrator.md +316 -0
  320. package/pennyfarthing-dist/agents/pm.md +153 -0
  321. package/pennyfarthing-dist/agents/reviewer-preflight.md +224 -0
  322. package/pennyfarthing-dist/agents/reviewer.md +315 -0
  323. package/pennyfarthing-dist/agents/sm-file-summary.md +109 -0
  324. package/pennyfarthing-dist/agents/sm-handoff.md +97 -0
  325. package/pennyfarthing-dist/agents/sm.md +480 -0
  326. package/pennyfarthing-dist/agents/tea.md +191 -0
  327. package/pennyfarthing-dist/agents/tech-writer.md +148 -0
  328. package/pennyfarthing-dist/agents/testing-runner.md +420 -0
  329. package/pennyfarthing-dist/agents/ux-designer.md +158 -0
  330. package/pennyfarthing-dist/agents/workflow-status-check.md +332 -0
  331. package/pennyfarthing-dist/commands/architect.md +62 -0
  332. package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
  333. package/pennyfarthing-dist/commands/benchmark.md +467 -0
  334. package/pennyfarthing-dist/commands/brainstorm.md +91 -0
  335. package/pennyfarthing-dist/commands/check.md +156 -0
  336. package/pennyfarthing-dist/commands/chore.md +178 -0
  337. package/pennyfarthing-dist/commands/close-epic.md +136 -0
  338. package/pennyfarthing-dist/commands/continue-session.md +184 -0
  339. package/pennyfarthing-dist/commands/create-branches-from-story.md +374 -0
  340. package/pennyfarthing-dist/commands/create-theme.md +29 -0
  341. package/pennyfarthing-dist/commands/dev.md +60 -0
  342. package/pennyfarthing-dist/commands/devops.md +59 -0
  343. package/pennyfarthing-dist/commands/git-cleanup.md +340 -0
  344. package/pennyfarthing-dist/commands/health-check.md +108 -0
  345. package/pennyfarthing-dist/commands/help.md +264 -0
  346. package/pennyfarthing-dist/commands/job-fair.md +102 -0
  347. package/pennyfarthing-dist/commands/list-themes.md +17 -0
  348. package/pennyfarthing-dist/commands/new-work.md +127 -0
  349. package/pennyfarthing-dist/commands/orchestrator.md +56 -0
  350. package/pennyfarthing-dist/commands/parallel-work.md +71 -0
  351. package/pennyfarthing-dist/commands/party-mode.md +67 -0
  352. package/pennyfarthing-dist/commands/permissions.md +193 -0
  353. package/pennyfarthing-dist/commands/pm.md +60 -0
  354. package/pennyfarthing-dist/commands/prime.md +140 -0
  355. package/pennyfarthing-dist/commands/release.md +58 -0
  356. package/pennyfarthing-dist/commands/repo-status.md +49 -0
  357. package/pennyfarthing-dist/commands/retro.md +200 -0
  358. package/pennyfarthing-dist/commands/reviewer.md +64 -0
  359. package/pennyfarthing-dist/commands/run-ci.md +116 -0
  360. package/pennyfarthing-dist/commands/set-theme.md +52 -0
  361. package/pennyfarthing-dist/commands/show-theme.md +21 -0
  362. package/pennyfarthing-dist/commands/sm.md +70 -0
  363. package/pennyfarthing-dist/commands/solo.md +411 -0
  364. package/pennyfarthing-dist/commands/sprint-planning.md +109 -0
  365. package/pennyfarthing-dist/commands/start-epic.md +156 -0
  366. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +184 -0
  367. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +376 -0
  368. package/pennyfarthing-dist/commands/tea.md +63 -0
  369. package/pennyfarthing-dist/commands/tech-writer.md +53 -0
  370. package/pennyfarthing-dist/commands/theme-maker.md +671 -0
  371. package/pennyfarthing-dist/commands/update-domain-docs.md +83 -0
  372. package/pennyfarthing-dist/commands/ux-designer.md +62 -0
  373. package/pennyfarthing-dist/commands/work.md +111 -0
  374. package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +480 -0
  375. package/pennyfarthing-dist/guides/AGENT-SCOPES.md +201 -0
  376. package/pennyfarthing-dist/guides/HOOKS.md +230 -0
  377. package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +338 -0
  378. package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +193 -0
  379. package/pennyfarthing-dist/guides/agent-template-strategic.md +148 -0
  380. package/pennyfarthing-dist/guides/agent-template-tactical.md +162 -0
  381. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +746 -0
  382. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +574 -0
  383. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +488 -0
  384. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +402 -0
  385. package/pennyfarthing-dist/guides/permission-protocol.md +188 -0
  386. package/pennyfarthing-dist/guides/persona-loading.md +46 -0
  387. package/pennyfarthing-dist/guides/persona-system.md +294 -0
  388. package/pennyfarthing-dist/guides/shared-agent-behavior.md +388 -0
  389. package/pennyfarthing-dist/guides/shared-context.md +147 -0
  390. package/pennyfarthing-dist/guides/strategic-agent-behavior.md +348 -0
  391. package/pennyfarthing-dist/guides/tactical-agent-behavior.md +1041 -0
  392. package/pennyfarthing-dist/guides/workflow-schema.md +195 -0
  393. package/pennyfarthing-dist/guides/worktree-mode.md +113 -0
  394. package/pennyfarthing-dist/output-styles/teaching.md +33 -0
  395. package/pennyfarthing-dist/output-styles/terse.md +20 -0
  396. package/pennyfarthing-dist/output-styles/verbose.md +28 -0
  397. package/pennyfarthing-dist/personas/themes/1984.yaml +312 -0
  398. package/pennyfarthing-dist/personas/themes/a-team.yaml +207 -0
  399. package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +300 -0
  400. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +330 -0
  401. package/pennyfarthing-dist/personas/themes/all-stars.yaml +332 -0
  402. package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +320 -0
  403. package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +306 -0
  404. package/pennyfarthing-dist/personas/themes/arcane.yaml +288 -0
  405. package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +331 -0
  406. package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +288 -0
  407. package/pennyfarthing-dist/personas/themes/babylon-5.yaml +288 -0
  408. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +288 -0
  409. package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +288 -0
  410. package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +300 -0
  411. package/pennyfarthing-dist/personas/themes/black-sails.yaml +300 -0
  412. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +295 -0
  413. package/pennyfarthing-dist/personas/themes/bobiverse.yaml +288 -0
  414. package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +327 -0
  415. package/pennyfarthing-dist/personas/themes/catch-22.yaml +316 -0
  416. package/pennyfarthing-dist/personas/themes/classical-composers.yaml +310 -0
  417. package/pennyfarthing-dist/personas/themes/control.yaml +197 -0
  418. package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +320 -0
  419. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +323 -0
  420. package/pennyfarthing-dist/personas/themes/deadwood.yaml +300 -0
  421. package/pennyfarthing-dist/personas/themes/dickens.yaml +320 -0
  422. package/pennyfarthing-dist/personas/themes/discworld.yaml +332 -0
  423. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +290 -0
  424. package/pennyfarthing-dist/personas/themes/don-quixote.yaml +320 -0
  425. package/pennyfarthing-dist/personas/themes/dune.yaml +307 -0
  426. package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +320 -0
  427. package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +288 -0
  428. package/pennyfarthing-dist/personas/themes/fargo.yaml +330 -0
  429. package/pennyfarthing-dist/personas/themes/film-auteurs.yaml +312 -0
  430. package/pennyfarthing-dist/personas/themes/firefly.yaml +328 -0
  431. package/pennyfarthing-dist/personas/themes/foundation.yaml +290 -0
  432. package/pennyfarthing-dist/personas/themes/futurama.yaml +321 -0
  433. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +290 -0
  434. package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +243 -0
  435. package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +308 -0
  436. package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +308 -0
  437. package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +330 -0
  438. package/pennyfarthing-dist/personas/themes/hannibal.yaml +300 -0
  439. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +324 -0
  440. package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +291 -0
  441. package/pennyfarthing-dist/personas/themes/historical-figures.yaml +288 -0
  442. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +331 -0
  443. package/pennyfarthing-dist/personas/themes/house-md.yaml +321 -0
  444. package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +289 -0
  445. package/pennyfarthing-dist/personas/themes/inspector-morse.yaml +300 -0
  446. package/pennyfarthing-dist/personas/themes/jane-austen.yaml +287 -0
  447. package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +320 -0
  448. package/pennyfarthing-dist/personas/themes/justified.yaml +300 -0
  449. package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +219 -0
  450. package/pennyfarthing-dist/personas/themes/les-miserables.yaml +299 -0
  451. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +334 -0
  452. package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +334 -0
  453. package/pennyfarthing-dist/personas/themes/mad-max.yaml +355 -0
  454. package/pennyfarthing-dist/personas/themes/mad-men.yaml +289 -0
  455. package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +300 -0
  456. package/pennyfarthing-dist/personas/themes/mash.yaml +334 -0
  457. package/pennyfarthing-dist/personas/themes/mass-effect.yaml +289 -0
  458. package/pennyfarthing-dist/personas/themes/military-commanders.yaml +306 -0
  459. package/pennyfarthing-dist/personas/themes/moby-dick.yaml +320 -0
  460. package/pennyfarthing-dist/personas/themes/monty-python.yaml +303 -0
  461. package/pennyfarthing-dist/personas/themes/neuromancer.yaml +300 -0
  462. package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +329 -0
  463. package/pennyfarthing-dist/personas/themes/parks-and-rec.yaml +242 -0
  464. package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +298 -0
  465. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +220 -0
  466. package/pennyfarthing-dist/personas/themes/renaissance-masters.yaml +320 -0
  467. package/pennyfarthing-dist/personas/themes/rome.yaml +300 -0
  468. package/pennyfarthing-dist/personas/themes/russian-masters.yaml +318 -0
  469. package/pennyfarthing-dist/personas/themes/sandman.yaml +288 -0
  470. package/pennyfarthing-dist/personas/themes/scientific-revolutionaries.yaml +320 -0
  471. package/pennyfarthing-dist/personas/themes/shakespeare.yaml +301 -0
  472. package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +289 -0
  473. package/pennyfarthing-dist/personas/themes/snow-crash.yaml +288 -0
  474. package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +300 -0
  475. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +230 -0
  476. package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +210 -0
  477. package/pennyfarthing-dist/personas/themes/star-wars.yaml +303 -0
  478. package/pennyfarthing-dist/personas/themes/succession.yaml +300 -0
  479. package/pennyfarthing-dist/personas/themes/superfriends.yaml +208 -0
  480. package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +236 -0
  481. package/pennyfarthing-dist/personas/themes/the-americans.yaml +300 -0
  482. package/pennyfarthing-dist/personas/themes/the-crown.yaml +300 -0
  483. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +213 -0
  484. package/pennyfarthing-dist/personas/themes/the-good-place.yaml +322 -0
  485. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +353 -0
  486. package/pennyfarthing-dist/personas/themes/the-odyssey.yaml +300 -0
  487. package/pennyfarthing-dist/personas/themes/the-office.yaml +330 -0
  488. package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +308 -0
  489. package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +300 -0
  490. package/pennyfarthing-dist/personas/themes/the-wire.yaml +311 -0
  491. package/pennyfarthing-dist/personas/themes/the-witcher.yaml +300 -0
  492. package/pennyfarthing-dist/personas/themes/twin-peaks.yaml +302 -0
  493. package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +300 -0
  494. package/pennyfarthing-dist/personas/themes/watchmen.yaml +291 -0
  495. package/pennyfarthing-dist/personas/themes/west-wing.yaml +291 -0
  496. package/pennyfarthing-dist/personas/themes/world-explorers.yaml +320 -0
  497. package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +307 -0
  498. package/pennyfarthing-dist/personas/themes/x-files.yaml +302 -0
  499. package/pennyfarthing-dist/scripts/add-short-names.mjs +264 -0
  500. package/pennyfarthing-dist/scripts/agent-session.sh +367 -0
  501. package/pennyfarthing-dist/scripts/check-context.sh +187 -0
  502. package/pennyfarthing-dist/scripts/check.sh +497 -0
  503. package/pennyfarthing-dist/scripts/deploy.sh +284 -0
  504. package/pennyfarthing-dist/scripts/doctor-dogfood.sh +360 -0
  505. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +61 -0
  506. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +66 -0
  507. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +35 -0
  508. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +166 -0
  509. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +50 -0
  510. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +71 -0
  511. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +54 -0
  512. package/pennyfarthing-dist/scripts/hooks/session-start.sh +98 -0
  513. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +59 -0
  514. package/pennyfarthing-dist/scripts/install-git-hooks.sh +91 -0
  515. package/pennyfarthing-dist/scripts/prime.sh +161 -0
  516. package/pennyfarthing-dist/scripts/release.sh +198 -0
  517. package/pennyfarthing-dist/scripts/repo-utils.sh +778 -0
  518. package/pennyfarthing-dist/scripts/run-ci.sh +219 -0
  519. package/pennyfarthing-dist/scripts/run.sh +65 -0
  520. package/pennyfarthing-dist/scripts/statusline.sh +264 -0
  521. package/pennyfarthing-dist/scripts/tests/check.test.sh +582 -0
  522. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +107 -0
  523. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +597 -0
  524. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +514 -0
  525. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +517 -0
  526. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +331 -0
  527. package/pennyfarthing-dist/scripts/uninstall.sh +271 -0
  528. package/pennyfarthing-dist/scripts/utils/background-tasks.sh +177 -0
  529. package/pennyfarthing-dist/scripts/utils/check-status.sh +251 -0
  530. package/pennyfarthing-dist/scripts/utils/checkpoint.sh +136 -0
  531. package/pennyfarthing-dist/scripts/utils/common.sh +157 -0
  532. package/pennyfarthing-dist/scripts/utils/create-feature-branches.sh +230 -0
  533. package/pennyfarthing-dist/scripts/utils/file-lock.sh +269 -0
  534. package/pennyfarthing-dist/scripts/utils/find-related-work.sh +231 -0
  535. package/pennyfarthing-dist/scripts/utils/find-root.sh +33 -0
  536. package/pennyfarthing-dist/scripts/utils/generate-skill-docs.sh +110 -0
  537. package/pennyfarthing-dist/scripts/utils/git-status-all.sh +127 -0
  538. package/pennyfarthing-dist/scripts/utils/ground-truth-judge.py +289 -0
  539. package/pennyfarthing-dist/scripts/utils/jira/jira-lib.mjs +443 -0
  540. package/pennyfarthing-dist/scripts/utils/jira/jira-sync-story.mjs +208 -0
  541. package/pennyfarthing-dist/scripts/utils/jira/jira-sync.mjs +198 -0
  542. package/pennyfarthing-dist/scripts/utils/jira-claim-story.sh +162 -0
  543. package/pennyfarthing-dist/scripts/utils/jira-lib.sh +463 -0
  544. package/pennyfarthing-dist/scripts/utils/jira-sync-story.sh +8 -0
  545. package/pennyfarthing-dist/scripts/utils/jira-sync.sh +8 -0
  546. package/pennyfarthing-dist/scripts/utils/log-skill-usage.sh +74 -0
  547. package/pennyfarthing-dist/scripts/utils/logging.sh +186 -0
  548. package/pennyfarthing-dist/scripts/utils/repo-scan.sh +141 -0
  549. package/pennyfarthing-dist/scripts/utils/retry.sh +76 -0
  550. package/pennyfarthing-dist/scripts/utils/run-timestamp.sh +7 -0
  551. package/pennyfarthing-dist/scripts/utils/session-cleanup.sh +319 -0
  552. package/pennyfarthing-dist/scripts/utils/skill-usage-report.sh +193 -0
  553. package/pennyfarthing-dist/scripts/utils/sprint-common.sh +286 -0
  554. package/pennyfarthing-dist/scripts/utils/sprint-metrics.sh +241 -0
  555. package/pennyfarthing-dist/scripts/utils/swebench-judge.py +400 -0
  556. package/pennyfarthing-dist/scripts/utils/sync-epic-to-jira.sh +16 -0
  557. package/pennyfarthing-dist/scripts/utils/test-setup.sh +337 -0
  558. package/pennyfarthing-dist/scripts/utils/validate-subagent-frontmatter.sh +160 -0
  559. package/pennyfarthing-dist/scripts/worktree-manager.sh +498 -0
  560. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +236 -0
  561. package/pennyfarthing-dist/skills/changelog/SKILL.md +367 -0
  562. package/pennyfarthing-dist/skills/code-review/SKILL.md +168 -0
  563. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +268 -0
  564. package/pennyfarthing-dist/skills/cyclist/SKILL.md +117 -0
  565. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +421 -0
  566. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +258 -0
  567. package/pennyfarthing-dist/skills/jira/SKILL.md +281 -0
  568. package/pennyfarthing-dist/skills/judge/SKILL.md +524 -0
  569. package/pennyfarthing-dist/skills/just/SKILL.md +160 -0
  570. package/pennyfarthing-dist/skills/mermaid/SKILL.md +240 -0
  571. package/pennyfarthing-dist/skills/otel/skill.md +222 -0
  572. package/pennyfarthing-dist/skills/permissions/skill.md +172 -0
  573. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +173 -0
  574. package/pennyfarthing-dist/skills/skill-registry.schema.json +102 -0
  575. package/pennyfarthing-dist/skills/skill-registry.yaml +335 -0
  576. package/pennyfarthing-dist/skills/sprint-context/SKILL.md +120 -0
  577. package/pennyfarthing-dist/skills/story-management/SKILL.md +208 -0
  578. package/pennyfarthing-dist/skills/testing/SKILL.md +99 -0
  579. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +124 -0
  580. package/pennyfarthing-dist/skills/theme/skill.md +129 -0
  581. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +169 -0
  582. package/pennyfarthing-dist/skills/workflow/SKILL.md +160 -0
  583. package/pennyfarthing-dist/skills/yq/SKILL.md +264 -0
  584. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +187 -0
  585. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +59 -0
  586. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +276 -0
  587. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +61 -0
  588. package/pennyfarthing-dist/templates/persona-config.yaml.template +22 -0
  589. package/pennyfarthing-dist/templates/preferences.yaml.template +15 -0
  590. package/pennyfarthing-dist/templates/settings.local.json.template +90 -0
  591. package/pennyfarthing-dist/templates/setup-env.sh.template +18 -0
  592. package/pennyfarthing-dist/templates/shared-context.md.template +70 -0
  593. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +40 -0
  594. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +37 -0
  595. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +34 -0
  596. package/pennyfarthing-dist/workflows/agent-docs.yaml +70 -0
  597. package/pennyfarthing-dist/workflows/bdd.yaml +58 -0
  598. package/pennyfarthing-dist/workflows/tdd.yaml +50 -0
  599. package/pennyfarthing-dist/workflows/trivial.yaml +40 -0
@@ -0,0 +1,438 @@
1
+ /**
2
+ * Tests for Story 31-8: Test Result Caching
3
+ *
4
+ * These tests verify the test cache module that eliminates redundant
5
+ * test runs in subagents by caching results in the session file.
6
+ *
7
+ * Test categories:
8
+ * 1. parseTestCache() - Parse cache from session file markdown
9
+ * 2. validateTestCache() - Validate cache freshness
10
+ * 3. formatTestCache() - Format cache for session file
11
+ * 4. createTestCacheEntry() - Create entry from results
12
+ * 5. shouldSkipTests() - Convenience function for subagents
13
+ *
14
+ * Run with: npm test
15
+ */
16
+ import { describe, it } from 'node:test';
17
+ import assert from 'node:assert';
18
+ import { parseTestCache, validateTestCache, formatTestCache, createTestCacheEntry, shouldSkipTests, DEFAULT_CACHE_MAX_AGE_MINUTES } from './test-cache.js';
19
+ // Test fixtures
20
+ const VALID_CACHE_SECTION = `## Test Cache
21
+
22
+ | Field | Value |
23
+ |-------|-------|
24
+ | Last Run | 2026-01-14T09:00:00Z |
25
+ | Git SHA | abc1234def5678 |
26
+ | Result | GREEN |
27
+ | Pass | 78 |
28
+ | Fail | 0 |
29
+ | Duration | 36s |
30
+ `;
31
+ const CACHE_WITH_SKIPS = `## Test Cache
32
+
33
+ | Field | Value |
34
+ |-------|-------|
35
+ | Last Run | 2026-01-14T09:00:00Z |
36
+ | Git SHA | abc1234def5678 |
37
+ | Result | YELLOW |
38
+ | Pass | 75 |
39
+ | Fail | 0 |
40
+ | Skip | 3 |
41
+ | Duration | 34s |
42
+ `;
43
+ const CACHE_WITH_FAILURES = `## Test Cache
44
+
45
+ | Field | Value |
46
+ |-------|-------|
47
+ | Last Run | 2026-01-14T09:00:00Z |
48
+ | Git SHA | abc1234def5678 |
49
+ | Result | RED |
50
+ | Pass | 70 |
51
+ | Fail | 8 |
52
+ | Duration | 42s |
53
+ `;
54
+ const SESSION_WITH_CACHE = `# Story 31-8: Eliminate Redundant Test Runs
55
+
56
+ | Field | Value |
57
+ |-------|-------|
58
+ | Story | 31-8 |
59
+ | Title | Eliminate redundant test runs in subagents |
60
+ | Points | 2 |
61
+
62
+ ## Acceptance Criteria
63
+
64
+ - [ ] Test suite runs only once per TDD phase
65
+
66
+ ${VALID_CACHE_SECTION}
67
+
68
+ ## Technical Context
69
+
70
+ Some context here...
71
+ `;
72
+ const SESSION_WITHOUT_CACHE = `# Story 31-8: Eliminate Redundant Test Runs
73
+
74
+ | Field | Value |
75
+ |-------|-------|
76
+ | Story | 31-8 |
77
+ | Title | Eliminate redundant test runs in subagents |
78
+
79
+ ## Acceptance Criteria
80
+
81
+ - [ ] Test suite runs only once per TDD phase
82
+
83
+ ## Technical Context
84
+
85
+ Some context here...
86
+ `;
87
+ describe('Test Cache (31-8)', () => {
88
+ describe('parseTestCache() - Parse cache from session file', () => {
89
+ it('should parse valid cache section with all required fields', () => {
90
+ const entry = parseTestCache(SESSION_WITH_CACHE);
91
+ assert.ok(entry, 'Should parse cache entry');
92
+ assert.strictEqual(entry.lastRun, '2026-01-14T09:00:00Z');
93
+ assert.strictEqual(entry.gitSha, 'abc1234def5678');
94
+ assert.strictEqual(entry.result, 'GREEN');
95
+ assert.strictEqual(entry.passCount, 78);
96
+ assert.strictEqual(entry.failCount, 0);
97
+ assert.strictEqual(entry.durationSeconds, 36);
98
+ });
99
+ it('should parse cache with skip count', () => {
100
+ const entry = parseTestCache(CACHE_WITH_SKIPS);
101
+ assert.ok(entry, 'Should parse cache entry');
102
+ assert.strictEqual(entry.result, 'YELLOW');
103
+ assert.strictEqual(entry.passCount, 75);
104
+ assert.strictEqual(entry.failCount, 0);
105
+ assert.strictEqual(entry.skipCount, 3);
106
+ });
107
+ it('should parse cache with failures', () => {
108
+ const entry = parseTestCache(CACHE_WITH_FAILURES);
109
+ assert.ok(entry, 'Should parse cache entry');
110
+ assert.strictEqual(entry.result, 'RED');
111
+ assert.strictEqual(entry.passCount, 70);
112
+ assert.strictEqual(entry.failCount, 8);
113
+ });
114
+ it('should return null when no cache section exists', () => {
115
+ const entry = parseTestCache(SESSION_WITHOUT_CACHE);
116
+ assert.strictEqual(entry, null);
117
+ });
118
+ it('should return null for malformed cache table', () => {
119
+ const malformed = `## Test Cache
120
+
121
+ | Field | Value |
122
+ |-------|-------|
123
+ | Last Run | 2026-01-14T09:00:00Z |
124
+ `; // Missing required fields
125
+ const entry = parseTestCache(malformed);
126
+ assert.strictEqual(entry, null);
127
+ });
128
+ it('should return null for invalid result value', () => {
129
+ const invalid = `## Test Cache
130
+
131
+ | Field | Value |
132
+ |-------|-------|
133
+ | Last Run | 2026-01-14T09:00:00Z |
134
+ | Git SHA | abc1234 |
135
+ | Result | INVALID |
136
+ | Pass | 78 |
137
+ | Fail | 0 |
138
+ | Duration | 36s |
139
+ `;
140
+ const entry = parseTestCache(invalid);
141
+ assert.strictEqual(entry, null);
142
+ });
143
+ it('should handle case-insensitive field names', () => {
144
+ const mixedCase = `## Test Cache
145
+
146
+ | Field | Value |
147
+ |-------|-------|
148
+ | LAST RUN | 2026-01-14T09:00:00Z |
149
+ | Git Sha | abc1234 |
150
+ | result | green |
151
+ | PASS | 78 |
152
+ | fail | 0 |
153
+ | duration | 36s |
154
+ `;
155
+ const entry = parseTestCache(mixedCase);
156
+ assert.ok(entry, 'Should parse case-insensitive fields');
157
+ assert.strictEqual(entry.result, 'GREEN');
158
+ });
159
+ it('should handle duration with or without s suffix', () => {
160
+ const withS = `## Test Cache
161
+
162
+ | Field | Value |
163
+ |-------|-------|
164
+ | Last Run | 2026-01-14T09:00:00Z |
165
+ | Git SHA | abc1234 |
166
+ | Result | GREEN |
167
+ | Pass | 78 |
168
+ | Fail | 0 |
169
+ | Duration | 36s |
170
+ `;
171
+ const withoutS = `## Test Cache
172
+
173
+ | Field | Value |
174
+ |-------|-------|
175
+ | Last Run | 2026-01-14T09:00:00Z |
176
+ | Git SHA | abc1234 |
177
+ | Result | GREEN |
178
+ | Pass | 78 |
179
+ | Fail | 0 |
180
+ | Duration | 36 |
181
+ `;
182
+ const entryWithS = parseTestCache(withS);
183
+ const entryWithoutS = parseTestCache(withoutS);
184
+ assert.ok(entryWithS, 'Should parse with s suffix');
185
+ assert.ok(entryWithoutS, 'Should parse without s suffix');
186
+ assert.strictEqual(entryWithS.durationSeconds, 36);
187
+ assert.strictEqual(entryWithoutS.durationSeconds, 36);
188
+ });
189
+ });
190
+ describe('validateTestCache() - Validate cache freshness', () => {
191
+ it('should return valid for fresh cache with matching SHA', () => {
192
+ const now = new Date('2026-01-14T09:01:00Z'); // 1 minute after cache
193
+ const result = validateTestCache(SESSION_WITH_CACHE, {
194
+ currentGitSha: 'abc1234def5678',
195
+ currentTime: now
196
+ });
197
+ assert.strictEqual(result.valid, true);
198
+ assert.ok(result.reason.includes('Valid cache'));
199
+ assert.ok(result.entry);
200
+ });
201
+ it('should return invalid when cache not found', () => {
202
+ const result = validateTestCache(SESSION_WITHOUT_CACHE, {
203
+ currentGitSha: 'abc1234def5678'
204
+ });
205
+ assert.strictEqual(result.valid, false);
206
+ assert.ok(result.reason.includes('No test cache found'));
207
+ });
208
+ it('should return invalid when git SHA differs', () => {
209
+ const result = validateTestCache(SESSION_WITH_CACHE, {
210
+ currentGitSha: 'different1234567',
211
+ currentTime: new Date('2026-01-14T09:01:00Z')
212
+ });
213
+ assert.strictEqual(result.valid, false);
214
+ assert.ok(result.reason.includes('Code changed'));
215
+ assert.ok(result.entry, 'Should still return the entry');
216
+ });
217
+ it('should return invalid when cache is too old', () => {
218
+ const now = new Date('2026-01-14T09:15:00Z'); // 15 minutes after cache
219
+ const result = validateTestCache(SESSION_WITH_CACHE, {
220
+ currentGitSha: 'abc1234def5678',
221
+ currentTime: now,
222
+ maxAgeMinutes: 5
223
+ });
224
+ assert.strictEqual(result.valid, false);
225
+ assert.ok(result.reason.includes('Cache too old'));
226
+ });
227
+ it('should use default max age when not specified', () => {
228
+ const now = new Date('2026-01-14T09:04:00Z'); // 4 minutes after cache
229
+ const result = validateTestCache(SESSION_WITH_CACHE, {
230
+ currentGitSha: 'abc1234def5678',
231
+ currentTime: now
232
+ });
233
+ assert.strictEqual(result.valid, true); // 4min < 5min default
234
+ });
235
+ it('should allow custom max age', () => {
236
+ const now = new Date('2026-01-14T09:10:00Z'); // 10 minutes after cache
237
+ const resultDefault = validateTestCache(SESSION_WITH_CACHE, {
238
+ currentGitSha: 'abc1234def5678',
239
+ currentTime: now,
240
+ maxAgeMinutes: 5 // default
241
+ });
242
+ const resultExtended = validateTestCache(SESSION_WITH_CACHE, {
243
+ currentGitSha: 'abc1234def5678',
244
+ currentTime: now,
245
+ maxAgeMinutes: 15 // extended
246
+ });
247
+ assert.strictEqual(resultDefault.valid, false, 'Should fail with 5min limit');
248
+ assert.strictEqual(resultExtended.valid, true, 'Should pass with 15min limit');
249
+ });
250
+ it('should handle invalid timestamp in cache', () => {
251
+ const invalid = `## Test Cache
252
+
253
+ | Field | Value |
254
+ |-------|-------|
255
+ | Last Run | not-a-timestamp |
256
+ | Git SHA | abc1234 |
257
+ | Result | GREEN |
258
+ | Pass | 78 |
259
+ | Fail | 0 |
260
+ | Duration | 36s |
261
+ `;
262
+ const result = validateTestCache(invalid, {
263
+ currentGitSha: 'abc1234'
264
+ });
265
+ assert.strictEqual(result.valid, false);
266
+ assert.ok(result.reason.includes('Invalid timestamp'));
267
+ });
268
+ });
269
+ describe('formatTestCache() - Format cache for session file', () => {
270
+ it('should format basic cache entry', () => {
271
+ const entry = {
272
+ lastRun: '2026-01-14T09:00:00Z',
273
+ gitSha: 'abc1234def5678',
274
+ result: 'GREEN',
275
+ passCount: 78,
276
+ failCount: 0,
277
+ durationSeconds: 36
278
+ };
279
+ const formatted = formatTestCache(entry);
280
+ assert.ok(formatted.includes('## Test Cache'));
281
+ assert.ok(formatted.includes('| Last Run | 2026-01-14T09:00:00Z |'));
282
+ assert.ok(formatted.includes('| Git SHA | abc1234def5678 |'));
283
+ assert.ok(formatted.includes('| Result | GREEN |'));
284
+ assert.ok(formatted.includes('| Pass | 78 |'));
285
+ assert.ok(formatted.includes('| Fail | 0 |'));
286
+ assert.ok(formatted.includes('| Duration | 36s |'));
287
+ });
288
+ it('should include skip count when present', () => {
289
+ const entry = {
290
+ lastRun: '2026-01-14T09:00:00Z',
291
+ gitSha: 'abc1234def5678',
292
+ result: 'YELLOW',
293
+ passCount: 75,
294
+ failCount: 0,
295
+ skipCount: 3,
296
+ durationSeconds: 34
297
+ };
298
+ const formatted = formatTestCache(entry);
299
+ assert.ok(formatted.includes('| Skip | 3 |'));
300
+ });
301
+ it('should not include skip row when skipCount is undefined', () => {
302
+ const entry = {
303
+ lastRun: '2026-01-14T09:00:00Z',
304
+ gitSha: 'abc1234',
305
+ result: 'GREEN',
306
+ passCount: 78,
307
+ failCount: 0,
308
+ durationSeconds: 36
309
+ };
310
+ const formatted = formatTestCache(entry);
311
+ assert.ok(!formatted.includes('| Skip |'));
312
+ });
313
+ it('should produce valid markdown table', () => {
314
+ const entry = {
315
+ lastRun: '2026-01-14T09:00:00Z',
316
+ gitSha: 'abc1234',
317
+ result: 'RED',
318
+ passCount: 70,
319
+ failCount: 8,
320
+ durationSeconds: 42
321
+ };
322
+ const formatted = formatTestCache(entry);
323
+ const lines = formatted.split('\n').filter(l => l.trim());
324
+ // Should have header, separator, and at least 6 data rows
325
+ assert.ok(lines.length >= 8, `Should have at least 8 lines, got ${lines.length}`);
326
+ assert.ok(lines[0].includes('## Test Cache'));
327
+ assert.ok(lines[1].includes('| Field | Value |'));
328
+ assert.ok(lines[2].includes('|-------|-------|'));
329
+ });
330
+ });
331
+ describe('createTestCacheEntry() - Create entry from results', () => {
332
+ it('should create GREEN entry when no failures', () => {
333
+ const entry = createTestCacheEntry({ passCount: 78, failCount: 0, durationSeconds: 36 }, 'abc1234', new Date('2026-01-14T09:00:00Z'));
334
+ assert.strictEqual(entry.result, 'GREEN');
335
+ assert.strictEqual(entry.passCount, 78);
336
+ assert.strictEqual(entry.failCount, 0);
337
+ assert.strictEqual(entry.gitSha, 'abc1234');
338
+ assert.strictEqual(entry.lastRun, '2026-01-14T09:00:00.000Z');
339
+ });
340
+ it('should create RED entry when failures exist', () => {
341
+ const entry = createTestCacheEntry({ passCount: 70, failCount: 8, durationSeconds: 42 }, 'def5678');
342
+ assert.strictEqual(entry.result, 'RED');
343
+ assert.strictEqual(entry.failCount, 8);
344
+ });
345
+ it('should create YELLOW entry when skips exist but no failures', () => {
346
+ const entry = createTestCacheEntry({ passCount: 75, failCount: 0, skipCount: 3, durationSeconds: 34 }, 'ghi9012');
347
+ assert.strictEqual(entry.result, 'YELLOW');
348
+ assert.strictEqual(entry.skipCount, 3);
349
+ });
350
+ it('should prioritize RED over YELLOW when both failures and skips', () => {
351
+ const entry = createTestCacheEntry({ passCount: 65, failCount: 5, skipCount: 8, durationSeconds: 40 }, 'jkl3456');
352
+ assert.strictEqual(entry.result, 'RED', 'Failures should take priority');
353
+ });
354
+ it('should use current time when timestamp not provided', () => {
355
+ const before = new Date();
356
+ const entry = createTestCacheEntry({ passCount: 78, failCount: 0, durationSeconds: 36 }, 'abc1234');
357
+ const after = new Date();
358
+ const entryTime = new Date(entry.lastRun);
359
+ assert.ok(entryTime >= before, 'Entry time should be after call start');
360
+ assert.ok(entryTime <= after, 'Entry time should be before call end');
361
+ });
362
+ });
363
+ describe('shouldSkipTests() - Convenience function for subagents', () => {
364
+ it('should return skip=true for valid cache', () => {
365
+ const _now = new Date('2026-01-14T09:01:00Z');
366
+ const _result = shouldSkipTests(SESSION_WITH_CACHE, 'abc1234def5678', 5);
367
+ // Note: This test depends on the current time, so we use a mock
368
+ // For the implementation, we'll need to check if the validation
369
+ // passes with default time handling
370
+ });
371
+ it('should return skip=false when cache not found', () => {
372
+ const result = shouldSkipTests(SESSION_WITHOUT_CACHE, 'abc1234');
373
+ assert.strictEqual(result.skip, false);
374
+ assert.ok(result.reason.includes('No test cache found'));
375
+ assert.strictEqual(result.cachedResult, undefined);
376
+ });
377
+ it('should return skip=false when SHA differs', () => {
378
+ const result = shouldSkipTests(SESSION_WITH_CACHE, 'different1234');
379
+ assert.strictEqual(result.skip, false);
380
+ assert.ok(result.reason.includes('Code changed'));
381
+ });
382
+ it('should include cached result when valid', () => {
383
+ // For a truly time-independent test, we'd need dependency injection
384
+ // This test verifies the structure of the response
385
+ const withCache = parseTestCache(SESSION_WITH_CACHE);
386
+ assert.ok(withCache, 'Test setup: cache should parse');
387
+ // The shouldSkipTests function will return cachedResult only if valid
388
+ // Since we can't mock time easily, we verify the function signature
389
+ // Use very high max age (1 year in minutes) to ensure cache is always valid
390
+ const result = shouldSkipTests(SESSION_WITH_CACHE, 'abc1234def5678', 525600);
391
+ // With a very high max age, the cache should be valid
392
+ assert.strictEqual(result.skip, true);
393
+ assert.strictEqual(result.cachedResult, 'GREEN');
394
+ });
395
+ });
396
+ describe('DEFAULT_CACHE_MAX_AGE_MINUTES constant', () => {
397
+ it('should be 5 minutes', () => {
398
+ assert.strictEqual(DEFAULT_CACHE_MAX_AGE_MINUTES, 5);
399
+ });
400
+ });
401
+ describe('Round-trip: format and parse', () => {
402
+ it('should parse what was formatted', () => {
403
+ const original = {
404
+ lastRun: '2026-01-14T09:00:00Z',
405
+ gitSha: 'abc1234def5678',
406
+ result: 'GREEN',
407
+ passCount: 78,
408
+ failCount: 0,
409
+ durationSeconds: 36
410
+ };
411
+ const formatted = formatTestCache(original);
412
+ const parsed = parseTestCache(formatted);
413
+ assert.ok(parsed, 'Should parse formatted cache');
414
+ assert.strictEqual(parsed.lastRun, original.lastRun);
415
+ assert.strictEqual(parsed.gitSha, original.gitSha);
416
+ assert.strictEqual(parsed.result, original.result);
417
+ assert.strictEqual(parsed.passCount, original.passCount);
418
+ assert.strictEqual(parsed.failCount, original.failCount);
419
+ assert.strictEqual(parsed.durationSeconds, original.durationSeconds);
420
+ });
421
+ it('should handle skip count in round-trip', () => {
422
+ const original = {
423
+ lastRun: '2026-01-14T09:00:00Z',
424
+ gitSha: 'abc1234def5678',
425
+ result: 'YELLOW',
426
+ passCount: 75,
427
+ failCount: 0,
428
+ skipCount: 3,
429
+ durationSeconds: 34
430
+ };
431
+ const formatted = formatTestCache(original);
432
+ const parsed = parseTestCache(formatted);
433
+ assert.ok(parsed, 'Should parse formatted cache with skips');
434
+ assert.strictEqual(parsed.skipCount, 3);
435
+ });
436
+ });
437
+ });
438
+ //# sourceMappingURL=test-cache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-cache.test.js","sourceRoot":"","sources":["../../src/workflow/test-cache.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Workflow Loader
3
+ *
4
+ * Story 31-2: Load workflow definitions from YAML files
5
+ *
6
+ * This module provides functions to:
7
+ * - Load a single workflow YAML file
8
+ * - Load all workflows from a directory
9
+ * - Validate loaded workflows against the schema
10
+ *
11
+ * Uses validateWorkflow() from workflow-schema.ts (Story 31-1)
12
+ */
13
+ import { type WorkflowDefinition, type WorkflowValidationError } from './workflow-schema.js';
14
+ /**
15
+ * Result of loading a single workflow file
16
+ */
17
+ export interface WorkflowLoadResult {
18
+ /** Whether the load and validation succeeded */
19
+ success: boolean;
20
+ /** Path to the workflow file */
21
+ filePath: string;
22
+ /** Parsed and validated workflow (only present if success) */
23
+ workflow?: WorkflowDefinition;
24
+ /** Validation or parse errors (only present if failed) */
25
+ errors?: WorkflowValidationError[];
26
+ }
27
+ /**
28
+ * Result of loading multiple workflows from a directory
29
+ */
30
+ export interface WorkflowLoadResults {
31
+ /** Successfully loaded and validated workflows */
32
+ workflows: WorkflowDefinition[];
33
+ /** Files that failed to load or validate */
34
+ errors: Array<{
35
+ filePath: string;
36
+ errors: WorkflowValidationError[];
37
+ }>;
38
+ }
39
+ /**
40
+ * Load and validate a single workflow YAML file
41
+ *
42
+ * @param filePath - Absolute or relative path to the workflow YAML file
43
+ * @returns Load result with workflow or errors
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * const result = loadWorkflowFile('.claude/workflows/tdd.yaml');
48
+ * if (result.success) {
49
+ * console.log(`Loaded workflow: ${result.workflow.name}`);
50
+ * } else {
51
+ * console.error('Errors:', result.errors);
52
+ * }
53
+ * ```
54
+ */
55
+ export declare function loadWorkflowFile(filePath: string): WorkflowLoadResult;
56
+ /**
57
+ * Load and validate all workflow YAML files from a directory
58
+ *
59
+ * Only processes files with .yaml or .yml extensions.
60
+ * Returns partial results - valid workflows are returned even if some fail.
61
+ *
62
+ * @param dirPath - Path to directory containing workflow files
63
+ * @returns Load results with workflows and errors
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const results = loadWorkflowsFromDir('.claude/workflows');
68
+ * console.log(`Loaded ${results.workflows.length} workflows`);
69
+ * if (results.errors.length > 0) {
70
+ * console.error(`${results.errors.length} files failed to load`);
71
+ * }
72
+ * ```
73
+ */
74
+ export declare function loadWorkflowsFromDir(dirPath: string): WorkflowLoadResults;
75
+ export type { WorkflowDefinition, WorkflowPhase, WorkflowTriggers, WorkflowValidationError, WorkflowValidationResult } from './workflow-schema.js';
76
+ //# sourceMappingURL=workflow-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-loader.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAE7B,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,4CAA4C;IAC5C,MAAM,EAAE,KAAK,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,uBAAuB,EAAE,CAAC;KACnC,CAAC,CAAC;CACJ;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAkDrE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAsCzE;AAGD,YAAY,EACV,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Workflow Loader
3
+ *
4
+ * Story 31-2: Load workflow definitions from YAML files
5
+ *
6
+ * This module provides functions to:
7
+ * - Load a single workflow YAML file
8
+ * - Load all workflows from a directory
9
+ * - Validate loaded workflows against the schema
10
+ *
11
+ * Uses validateWorkflow() from workflow-schema.ts (Story 31-1)
12
+ */
13
+ import { readFileSync, readdirSync, existsSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import { parse as parseYaml } from 'yaml';
16
+ import { validateWorkflow } from './workflow-schema.js';
17
+ /**
18
+ * Load and validate a single workflow YAML file
19
+ *
20
+ * @param filePath - Absolute or relative path to the workflow YAML file
21
+ * @returns Load result with workflow or errors
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const result = loadWorkflowFile('.claude/workflows/tdd.yaml');
26
+ * if (result.success) {
27
+ * console.log(`Loaded workflow: ${result.workflow.name}`);
28
+ * } else {
29
+ * console.error('Errors:', result.errors);
30
+ * }
31
+ * ```
32
+ */
33
+ export function loadWorkflowFile(filePath) {
34
+ // 1. Read file from disk
35
+ let content;
36
+ try {
37
+ content = readFileSync(filePath, 'utf-8');
38
+ }
39
+ catch (err) {
40
+ const message = err instanceof Error ? err.message : 'Unknown file read error';
41
+ return {
42
+ success: false,
43
+ filePath,
44
+ errors: [{
45
+ field: 'file',
46
+ message: message.includes('ENOENT') ? `File not found: ${filePath}` : message
47
+ }]
48
+ };
49
+ }
50
+ // 2. Parse YAML
51
+ let parsed;
52
+ try {
53
+ parsed = parseYaml(content);
54
+ }
55
+ catch (err) {
56
+ const message = err instanceof Error ? err.message : 'Unknown YAML parse error';
57
+ return {
58
+ success: false,
59
+ filePath,
60
+ errors: [{
61
+ field: 'yaml',
62
+ message: `YAML parse error: ${message}`
63
+ }]
64
+ };
65
+ }
66
+ // 3. Call validateWorkflow()
67
+ const result = validateWorkflow(parsed);
68
+ // 4. Return result
69
+ if (result.valid && result.workflow) {
70
+ return {
71
+ success: true,
72
+ filePath,
73
+ workflow: result.workflow
74
+ };
75
+ }
76
+ return {
77
+ success: false,
78
+ filePath,
79
+ errors: result.errors
80
+ };
81
+ }
82
+ /**
83
+ * Load and validate all workflow YAML files from a directory
84
+ *
85
+ * Only processes files with .yaml or .yml extensions.
86
+ * Returns partial results - valid workflows are returned even if some fail.
87
+ *
88
+ * @param dirPath - Path to directory containing workflow files
89
+ * @returns Load results with workflows and errors
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * const results = loadWorkflowsFromDir('.claude/workflows');
94
+ * console.log(`Loaded ${results.workflows.length} workflows`);
95
+ * if (results.errors.length > 0) {
96
+ * console.error(`${results.errors.length} files failed to load`);
97
+ * }
98
+ * ```
99
+ */
100
+ export function loadWorkflowsFromDir(dirPath) {
101
+ const workflows = [];
102
+ const errors = [];
103
+ // 1. Check directory exists
104
+ if (!existsSync(dirPath)) {
105
+ return { workflows, errors };
106
+ }
107
+ // 2. List files and filter for .yaml/.yml extensions
108
+ let files;
109
+ try {
110
+ files = readdirSync(dirPath);
111
+ }
112
+ catch {
113
+ return { workflows, errors };
114
+ }
115
+ const yamlFiles = files.filter(f => f.endsWith('.yaml') || f.endsWith('.yml'));
116
+ // 3. Call loadWorkflowFile() for each
117
+ for (const file of yamlFiles) {
118
+ const filePath = join(dirPath, file);
119
+ const result = loadWorkflowFile(filePath);
120
+ // 4. Aggregate results
121
+ if (result.success && result.workflow) {
122
+ workflows.push(result.workflow);
123
+ }
124
+ else if (result.errors) {
125
+ errors.push({
126
+ filePath,
127
+ errors: result.errors
128
+ });
129
+ }
130
+ }
131
+ return { workflows, errors };
132
+ }
133
+ //# sourceMappingURL=workflow-loader.js.map