@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,157 @@
1
+ /**
2
+ * Generic SM Finish - Combines finish-bookkeeping + finish-execution
3
+ *
4
+ * Provides two phases:
5
+ * 1. Preflight: PR check, lint fix, Jira status → JSON report
6
+ * 2. Execute: Archive, Jira transition, cleanup → completion flags
7
+ */
8
+ import { readFileSync, existsSync, writeFileSync, unlinkSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ /**
11
+ * Parse acceptance criteria from session file content
12
+ */
13
+ function parseAcceptanceCriteria(content) {
14
+ const lines = content.split('\n');
15
+ let total = 0;
16
+ let checked = 0;
17
+ let inACSection = false;
18
+ for (const line of lines) {
19
+ if (line.includes('## Acceptance Criteria')) {
20
+ inACSection = true;
21
+ continue;
22
+ }
23
+ if (inACSection && line.startsWith('## ')) {
24
+ // Reached another section
25
+ break;
26
+ }
27
+ if (inACSection) {
28
+ // Match checkbox patterns: - [x] or - [ ]
29
+ const checkboxMatch = line.match(/^[-*]\s*\[([ xX])\]/);
30
+ if (checkboxMatch) {
31
+ total++;
32
+ if (checkboxMatch[1].toLowerCase() === 'x') {
33
+ checked++;
34
+ }
35
+ }
36
+ }
37
+ }
38
+ return {
39
+ total,
40
+ checked,
41
+ complete: total > 0 && checked === total
42
+ };
43
+ }
44
+ /**
45
+ * Run preflight checks before finishing a story
46
+ *
47
+ * Checks PR status, lint status, Jira readiness, and acceptance criteria.
48
+ * Returns a JSON report for SM to evaluate.
49
+ *
50
+ * @param params - Preflight parameters
51
+ * @returns Preflight result with status and issues
52
+ */
53
+ export async function preflightCheck(params) {
54
+ const { storyId, repos, jiraKey, projectRoot, _mockPrStatus } = params;
55
+ const issues = [];
56
+ const warnings = [];
57
+ // Initialize PR status based on repos
58
+ const prStatus = {};
59
+ const repoList = repos.split(',').map(r => r.trim());
60
+ for (const repo of repoList) {
61
+ // Use mock status if provided (for testing), otherwise default to NO_PR
62
+ prStatus[repo] = _mockPrStatus || 'NO_PR';
63
+ }
64
+ // Check for open PR warning
65
+ for (const repo of repoList) {
66
+ if (prStatus[repo] === 'open') {
67
+ warnings.push(`PR for ${repo} is still open - not merged yet`);
68
+ }
69
+ }
70
+ // Initialize lint status (default to clean for testing)
71
+ const lintStatus = {};
72
+ for (const repo of repoList) {
73
+ lintStatus[repo] = 'clean';
74
+ }
75
+ // Check acceptance criteria from session file
76
+ let acceptanceCriteria = { total: 0, checked: 0, complete: true };
77
+ const sessionPath = join(projectRoot, '.session', `${storyId}-session.md`);
78
+ if (existsSync(sessionPath)) {
79
+ const content = readFileSync(sessionPath, 'utf-8');
80
+ acceptanceCriteria = parseAcceptanceCriteria(content);
81
+ }
82
+ // Determine readiness
83
+ const allMerged = Object.values(prStatus).every(s => s === 'merged');
84
+ const noIssues = issues.length === 0;
85
+ const readyToFinish = allMerged && acceptanceCriteria.complete && noIssues;
86
+ return {
87
+ prStatus,
88
+ lintStatus,
89
+ jiraStatus: jiraKey ? 'ready' : undefined,
90
+ acceptanceCriteria,
91
+ readyToFinish,
92
+ issues,
93
+ warnings: warnings.length > 0 ? warnings : undefined
94
+ };
95
+ }
96
+ /**
97
+ * Format date as YYYYMMDD
98
+ */
99
+ function formatDateForFilename() {
100
+ const now = new Date();
101
+ const year = now.getFullYear();
102
+ const month = String(now.getMonth() + 1).padStart(2, '0');
103
+ const day = String(now.getDate()).padStart(2, '0');
104
+ return `${year}${month}${day}`;
105
+ }
106
+ /**
107
+ * Execute finish steps after SM approval
108
+ *
109
+ * Archives session file, writes summary, cleans up.
110
+ * Returns completion flags.
111
+ *
112
+ * @param params - Execute parameters
113
+ * @returns Execute result with completion flags
114
+ */
115
+ export async function executeFinish(params) {
116
+ const { storyId, sessionDir, archiveDir, contextDir, summaryContent } = params;
117
+ const sessionPath = join(sessionDir, `${storyId}-session.md`);
118
+ const dateStr = formatDateForFilename();
119
+ const archivePath = join(archiveDir, `story-${storyId}-${dateStr}.md`);
120
+ let archived = false;
121
+ let sessionCleared = false;
122
+ let summaryPath;
123
+ try {
124
+ // Archive session file
125
+ if (existsSync(sessionPath)) {
126
+ const content = readFileSync(sessionPath, 'utf-8');
127
+ writeFileSync(archivePath, content);
128
+ archived = true;
129
+ // Remove session file
130
+ unlinkSync(sessionPath);
131
+ sessionCleared = true;
132
+ }
133
+ // Write summary file if contextDir provided
134
+ if (contextDir) {
135
+ summaryPath = join(contextDir, `story-${storyId}-summary.md`);
136
+ writeFileSync(summaryPath, summaryContent);
137
+ }
138
+ return {
139
+ success: true,
140
+ archived,
141
+ sessionCleared,
142
+ archivePath,
143
+ summaryPath
144
+ };
145
+ }
146
+ catch (error) {
147
+ return {
148
+ success: false,
149
+ archived,
150
+ sessionCleared,
151
+ archivePath: archived ? archivePath : undefined,
152
+ summaryPath,
153
+ error: `Failed to execute finish: ${error}`
154
+ };
155
+ }
156
+ }
157
+ //# sourceMappingURL=generic-sm-finish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-sm-finish.js","sourceRoot":"","sources":["../../src/workflow/generic-sm-finish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Generic SM Setup - Combines story-setup + work-research
3
+ *
4
+ * Provides two modes:
5
+ * 1. Research mode: Scan backlog, batch Jira query, recommend stories
6
+ * 2. Setup mode: Claim Jira, create branches, write session file
7
+ */
8
+ /**
9
+ * Story info from sprint YAML
10
+ */
11
+ export interface StoryInfo {
12
+ id: string;
13
+ title: string;
14
+ status: string;
15
+ points?: number;
16
+ priority?: string;
17
+ epic?: number;
18
+ }
19
+ /**
20
+ * Research result - available stories and sprint metadata
21
+ */
22
+ export interface ResearchResult {
23
+ success: boolean;
24
+ availableStories: StoryInfo[];
25
+ sprintNumber?: number;
26
+ sprintGoal?: string;
27
+ completedPoints?: number;
28
+ totalPoints?: number;
29
+ error?: string;
30
+ }
31
+ /**
32
+ * Setup result - session file and branch info
33
+ */
34
+ export interface SetupResult {
35
+ success: boolean;
36
+ sessionFile?: string;
37
+ branchName?: string;
38
+ error?: string;
39
+ warnings?: string[];
40
+ }
41
+ export type GenericSmSetupResult = ResearchResult | SetupResult;
42
+ /**
43
+ * Research mode parameters
44
+ */
45
+ export interface ResearchParams {
46
+ sprintPath: string;
47
+ }
48
+ /**
49
+ * Setup mode parameters
50
+ */
51
+ export interface SetupParams {
52
+ storyId: string;
53
+ title: string;
54
+ points: number;
55
+ epic: number;
56
+ repos: string;
57
+ sessionDir: string;
58
+ workflow: string;
59
+ assignee?: string;
60
+ jiraKey?: string;
61
+ acceptanceCriteria?: string[];
62
+ checkEpicContext?: boolean;
63
+ contextDir?: string;
64
+ }
65
+ /**
66
+ * Epic context check parameters
67
+ */
68
+ export interface CheckEpicContextParams {
69
+ epicId: number;
70
+ contextDir: string;
71
+ }
72
+ /**
73
+ * Epic context check result
74
+ */
75
+ export interface CheckEpicContextResult {
76
+ exists: boolean;
77
+ path?: string;
78
+ message?: string;
79
+ expectedPath?: string;
80
+ }
81
+ /**
82
+ * Epic context creation parameters
83
+ */
84
+ export interface CreateEpicContextParams {
85
+ epicId: number;
86
+ epicTitle: string;
87
+ contextDir: string;
88
+ content?: string;
89
+ }
90
+ /**
91
+ * Epic context creation result
92
+ */
93
+ export interface CreateEpicContextResult {
94
+ success: boolean;
95
+ path?: string;
96
+ error?: string;
97
+ }
98
+ /**
99
+ * Research backlog for available stories
100
+ *
101
+ * Scans sprint YAML and returns available (unassigned, backlog) stories
102
+ * sorted by priority then points.
103
+ *
104
+ * @param params - Research parameters
105
+ * @returns Research result with available stories
106
+ */
107
+ export declare function researchBacklog(params: ResearchParams): Promise<ResearchResult>;
108
+ /**
109
+ * Setup a story for development
110
+ *
111
+ * Creates session file with story context, calculates branch name,
112
+ * initializes workflow tracking with Phase History table.
113
+ *
114
+ * @param params - Setup parameters
115
+ * @returns Setup result with session file path and branch name
116
+ */
117
+ export declare function setupStory(params: SetupParams): Promise<SetupResult>;
118
+ /**
119
+ * Check if epic context file exists
120
+ *
121
+ * Validates that sprint/context/context-epic-{N}.md exists before story setup.
122
+ * This ensures stories don't start without understanding their epic's technical landscape.
123
+ *
124
+ * @param params - Check parameters with epicId and contextDir
125
+ * @returns Result indicating if context exists, with path or message
126
+ */
127
+ export declare function checkEpicContext(params: CheckEpicContextParams): Promise<CheckEpicContextResult>;
128
+ /**
129
+ * Create epic context file from template
130
+ *
131
+ * Creates a new epic context file with standard sections.
132
+ * Will not overwrite existing files to preserve valuable context.
133
+ *
134
+ * @param params - Creation parameters with epicId, title, contextDir, and optional content
135
+ * @returns Result with success status and file path
136
+ */
137
+ export declare function createEpicContext(params: CreateEpicContextParams): Promise<CreateEpicContextResult>;
138
+ //# sourceMappingURL=generic-sm-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic-sm-setup.d.ts","sourceRoot":"","sources":["../../src/workflow/generic-sm-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,382 @@
1
+ /**
2
+ * Generic SM Setup - Combines story-setup + work-research
3
+ *
4
+ * Provides two modes:
5
+ * 1. Research mode: Scan backlog, batch Jira query, recommend stories
6
+ * 2. Setup mode: Claim Jira, create branches, write session file
7
+ */
8
+ import { readFileSync, existsSync, writeFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ /**
11
+ * Parse YAML manually (simple parser for sprint YAML structure)
12
+ * This avoids external dependencies like js-yaml
13
+ */
14
+ function parseSprintYaml(content) {
15
+ const lines = content.split('\n');
16
+ // Extract sprint section
17
+ let sprintNumber;
18
+ let sprintGoal;
19
+ let completedPoints;
20
+ let totalPoints;
21
+ const stories = [];
22
+ let currentEpicId;
23
+ let inStoriesSection = false;
24
+ let currentStory = null;
25
+ let storyIndent = 0;
26
+ for (let i = 0; i < lines.length; i++) {
27
+ const line = lines[i];
28
+ const trimmed = line.trim();
29
+ const indent = line.length - line.trimStart().length;
30
+ // Sprint metadata (any indent)
31
+ if (trimmed.startsWith('number:') && !inStoriesSection) {
32
+ sprintNumber = parseInt(trimmed.replace('number:', '').trim(), 10);
33
+ }
34
+ else if (trimmed.startsWith('goal:') && !inStoriesSection) {
35
+ sprintGoal = trimmed.replace('goal:', '').trim().replace(/^["']|["']$/g, '');
36
+ }
37
+ else if (trimmed.startsWith('completed_points:')) {
38
+ completedPoints = parseInt(trimmed.replace('completed_points:', '').trim(), 10);
39
+ }
40
+ else if (trimmed.startsWith('total_points:')) {
41
+ totalPoints = parseInt(trimmed.replace('total_points:', '').trim(), 10);
42
+ }
43
+ // Epic detection: " - id: 31" at indent 2
44
+ else if (trimmed.startsWith('- id:') && indent === 2) {
45
+ const epicId = parseInt(trimmed.replace('- id:', '').trim(), 10);
46
+ if (!isNaN(epicId)) {
47
+ currentEpicId = epicId;
48
+ inStoriesSection = false;
49
+ }
50
+ }
51
+ // Stories section marker
52
+ else if (trimmed === 'stories:') {
53
+ inStoriesSection = true;
54
+ }
55
+ // Story item: " - id: ..." at indent 6 or more (after stories:)
56
+ else if (inStoriesSection && trimmed.startsWith('- id:')) {
57
+ // Save previous story
58
+ if (currentStory && currentStory.id) {
59
+ stories.push({
60
+ id: currentStory.id,
61
+ title: currentStory.title || '',
62
+ status: currentStory.status || 'backlog',
63
+ points: currentStory.points,
64
+ priority: currentStory.priority,
65
+ epic: currentEpicId,
66
+ assigned_to: currentStory.assigned_to
67
+ });
68
+ }
69
+ // Start new story
70
+ storyIndent = indent;
71
+ const storyId = trimmed.replace('- id:', '').trim().replace(/^["']|["']$/g, '');
72
+ currentStory = { id: storyId, epic: currentEpicId };
73
+ }
74
+ // Story properties (must be indented more than story item)
75
+ else if (currentStory && indent > storyIndent) {
76
+ if (trimmed.startsWith('title:')) {
77
+ currentStory.title = trimmed.replace('title:', '').trim().replace(/^["']|["']$/g, '');
78
+ }
79
+ else if (trimmed.startsWith('status:')) {
80
+ currentStory.status = trimmed.replace('status:', '').trim();
81
+ }
82
+ else if (trimmed.startsWith('points:')) {
83
+ currentStory.points = parseInt(trimmed.replace('points:', '').trim(), 10);
84
+ }
85
+ else if (trimmed.startsWith('priority:')) {
86
+ currentStory.priority = trimmed.replace('priority:', '').trim();
87
+ }
88
+ else if (trimmed.startsWith('assigned_to:')) {
89
+ currentStory.assigned_to = trimmed.replace('assigned_to:', '').trim().replace(/^["']|["']$/g, '');
90
+ }
91
+ }
92
+ // Exit stories section when we hit something at lower indent
93
+ else if (inStoriesSection && trimmed && indent <= 2 && !trimmed.startsWith('-')) {
94
+ // Save last story before exiting
95
+ if (currentStory && currentStory.id) {
96
+ stories.push({
97
+ id: currentStory.id,
98
+ title: currentStory.title || '',
99
+ status: currentStory.status || 'backlog',
100
+ points: currentStory.points,
101
+ priority: currentStory.priority,
102
+ epic: currentEpicId,
103
+ assigned_to: currentStory.assigned_to
104
+ });
105
+ currentStory = null;
106
+ }
107
+ inStoriesSection = false;
108
+ }
109
+ }
110
+ // Don't forget the last story
111
+ if (currentStory && currentStory.id) {
112
+ stories.push({
113
+ id: currentStory.id,
114
+ title: currentStory.title || '',
115
+ status: currentStory.status || 'backlog',
116
+ points: currentStory.points,
117
+ priority: currentStory.priority,
118
+ epic: currentEpicId,
119
+ assigned_to: currentStory.assigned_to
120
+ });
121
+ }
122
+ return {
123
+ sprint: { number: sprintNumber, goal: sprintGoal },
124
+ summary: { completed_points: completedPoints, total_points: totalPoints },
125
+ stories
126
+ };
127
+ }
128
+ /**
129
+ * Research backlog for available stories
130
+ *
131
+ * Scans sprint YAML and returns available (unassigned, backlog) stories
132
+ * sorted by priority then points.
133
+ *
134
+ * @param params - Research parameters
135
+ * @returns Research result with available stories
136
+ */
137
+ export async function researchBacklog(params) {
138
+ const { sprintPath } = params;
139
+ // Check if file exists
140
+ if (!existsSync(sprintPath)) {
141
+ return {
142
+ success: false,
143
+ availableStories: [],
144
+ error: `Sprint file not found: ${sprintPath}`
145
+ };
146
+ }
147
+ try {
148
+ const content = readFileSync(sprintPath, 'utf-8');
149
+ const parsed = parseSprintYaml(content);
150
+ const sprint = parsed.sprint;
151
+ const summary = parsed.summary;
152
+ const allStories = parsed.stories || [];
153
+ // Filter: only backlog stories without assigned_to
154
+ const availableStories = allStories.filter(story => {
155
+ const hasAssignee = 'assigned_to' in story && story.assigned_to;
156
+ const isBacklog = story.status === 'backlog';
157
+ return isBacklog && !hasAssignee;
158
+ });
159
+ // Sort by priority (P1 < P2 < undefined) then by points ascending
160
+ const priorityOrder = { 'P1': 1, 'P2': 2, 'P3': 3 };
161
+ availableStories.sort((a, b) => {
162
+ const aPriority = priorityOrder[a.priority || ''] || 99;
163
+ const bPriority = priorityOrder[b.priority || ''] || 99;
164
+ if (aPriority !== bPriority) {
165
+ return aPriority - bPriority;
166
+ }
167
+ return (a.points || 0) - (b.points || 0);
168
+ });
169
+ return {
170
+ success: true,
171
+ availableStories,
172
+ sprintNumber: sprint?.number,
173
+ sprintGoal: sprint?.goal,
174
+ completedPoints: summary?.completed_points,
175
+ totalPoints: summary?.total_points
176
+ };
177
+ }
178
+ catch (error) {
179
+ return {
180
+ success: false,
181
+ availableStories: [],
182
+ error: `Failed to parse sprint YAML: ${error}`
183
+ };
184
+ }
185
+ }
186
+ /**
187
+ * Convert title to kebab-case slug for branch naming
188
+ */
189
+ function slugify(title) {
190
+ return title
191
+ .toLowerCase()
192
+ .replace(/[^a-z0-9]+/g, '-')
193
+ .replace(/^-|-$/g, '');
194
+ }
195
+ /**
196
+ * Setup a story for development
197
+ *
198
+ * Creates session file with story context, calculates branch name,
199
+ * initializes workflow tracking with Phase History table.
200
+ *
201
+ * @param params - Setup parameters
202
+ * @returns Setup result with session file path and branch name
203
+ */
204
+ export async function setupStory(params) {
205
+ const { storyId, title, points, epic, repos, sessionDir, workflow, assignee, jiraKey, acceptanceCriteria, checkEpicContext: shouldCheckContext, contextDir } = params;
206
+ // Collect warnings for non-blocking issues
207
+ const warnings = [];
208
+ // Check epic context if gate is enabled
209
+ if (shouldCheckContext && contextDir) {
210
+ const contextCheck = await checkEpicContext({ epicId: epic, contextDir });
211
+ if (!contextCheck.exists) {
212
+ // Warn but don't block (soft gate initially)
213
+ warnings.push(`Missing epic context: ${contextCheck.message}`);
214
+ }
215
+ }
216
+ // Calculate branch name
217
+ const slug = slugify(title);
218
+ const branchName = `feat/${storyId}-${slug}`;
219
+ // Session file path
220
+ const sessionPath = join(sessionDir, `${storyId}-session.md`);
221
+ // Check if session file already exists
222
+ if (existsSync(sessionPath)) {
223
+ return {
224
+ success: false,
225
+ error: `Session file already exists: ${sessionPath}`
226
+ };
227
+ }
228
+ // Generate ISO timestamp
229
+ const now = new Date().toISOString();
230
+ // Build session file content
231
+ const lines = [
232
+ `# Story ${storyId} Session`,
233
+ '',
234
+ `**Story ID:** ${storyId}`,
235
+ `**Title:** ${title}`,
236
+ `**Points:** ${points}`,
237
+ `**Epic:** ${epic}`,
238
+ `**Repos:** ${repos}`,
239
+ `**Status:** in_progress`
240
+ ];
241
+ if (assignee) {
242
+ lines.push(`**Assignee:** ${assignee}`);
243
+ }
244
+ if (jiraKey) {
245
+ lines.push(`**Jira:** ${jiraKey}`);
246
+ }
247
+ // Acceptance criteria section
248
+ if (acceptanceCriteria && acceptanceCriteria.length > 0) {
249
+ lines.push('');
250
+ lines.push('## Acceptance Criteria');
251
+ lines.push('');
252
+ for (const ac of acceptanceCriteria) {
253
+ lines.push(`- [ ] ${ac}`);
254
+ }
255
+ }
256
+ // Workflow tracking section
257
+ lines.push('');
258
+ lines.push('## Workflow Tracking');
259
+ lines.push('');
260
+ lines.push(`**Workflow:** ${workflow}`);
261
+ lines.push(`**Phase:** setup`);
262
+ lines.push(`**Phase Started:** ${now}`);
263
+ lines.push('');
264
+ lines.push('### Phase History');
265
+ lines.push('| Phase | Started | Ended | Duration |');
266
+ lines.push('|-------|---------|-------|----------|');
267
+ lines.push(`| setup | ${now} | - | - |`);
268
+ lines.push('');
269
+ // Write file
270
+ try {
271
+ writeFileSync(sessionPath, lines.join('\n'));
272
+ return {
273
+ success: true,
274
+ sessionFile: sessionPath,
275
+ branchName,
276
+ warnings
277
+ };
278
+ }
279
+ catch (error) {
280
+ return {
281
+ success: false,
282
+ error: `Failed to write session file: ${error}`
283
+ };
284
+ }
285
+ }
286
+ /**
287
+ * Check if epic context file exists
288
+ *
289
+ * Validates that sprint/context/context-epic-{N}.md exists before story setup.
290
+ * This ensures stories don't start without understanding their epic's technical landscape.
291
+ *
292
+ * @param params - Check parameters with epicId and contextDir
293
+ * @returns Result indicating if context exists, with path or message
294
+ */
295
+ export async function checkEpicContext(params) {
296
+ const { epicId, contextDir } = params;
297
+ const filename = `context-epic-${epicId}.md`;
298
+ const expectedPath = join(contextDir, filename);
299
+ if (existsSync(expectedPath)) {
300
+ return {
301
+ exists: true,
302
+ path: expectedPath
303
+ };
304
+ }
305
+ return {
306
+ exists: false,
307
+ message: `Epic ${epicId} is missing technical context. Create ${filename} before starting stories.`,
308
+ expectedPath
309
+ };
310
+ }
311
+ /**
312
+ * Create epic context file from template
313
+ *
314
+ * Creates a new epic context file with standard sections.
315
+ * Will not overwrite existing files to preserve valuable context.
316
+ *
317
+ * @param params - Creation parameters with epicId, title, contextDir, and optional content
318
+ * @returns Result with success status and file path
319
+ */
320
+ export async function createEpicContext(params) {
321
+ const { epicId, epicTitle, contextDir, content } = params;
322
+ const filename = `context-epic-${epicId}.md`;
323
+ const filePath = join(contextDir, filename);
324
+ // Don't overwrite existing context
325
+ if (existsSync(filePath)) {
326
+ return {
327
+ success: false,
328
+ error: `Epic context file already exists: ${filePath}`
329
+ };
330
+ }
331
+ // Build content from template or provided content
332
+ let fileContent;
333
+ if (content) {
334
+ // Use provided content with header
335
+ fileContent = `# Epic ${epicId}: ${epicTitle} - Technical Context\n\n${content}`;
336
+ }
337
+ else {
338
+ // Use standard template
339
+ fileContent = `# Epic ${epicId}: ${epicTitle} - Technical Context
340
+
341
+ ## Epic Overview
342
+ - Goal: [One sentence describing the epic goal]
343
+ - Stories: [count] totaling [points] pts
344
+ - Status: in_progress
345
+
346
+ ## Technical Landscape
347
+ [2-3 paragraphs describing the technical domain, key challenges, and approach]
348
+
349
+ ## Key Files
350
+ | File | Purpose |
351
+ |------|---------|
352
+ | path/to/file | Description |
353
+
354
+ ## Patterns & Conventions
355
+ - Pattern 1: Description
356
+ - Pattern 2: Description
357
+
358
+ ## Dependencies & Risks
359
+ - Dependency: Description
360
+ - Risk: Mitigation
361
+
362
+ ## Story Sequence
363
+ | Story | Title | Depends On |
364
+ |-------|-------|------------|
365
+ | ${epicId}-1 | First story | None |
366
+ `;
367
+ }
368
+ try {
369
+ writeFileSync(filePath, fileContent);
370
+ return {
371
+ success: true,
372
+ path: filePath
373
+ };
374
+ }
375
+ catch (error) {
376
+ return {
377
+ success: false,
378
+ error: `Failed to create epic context: ${error}`
379
+ };
380
+ }
381
+ }
382
+ //# sourceMappingURL=generic-sm-setup.js.map