@pennyfarthing/core 7.4.0 → 7.5.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 (369) hide show
  1. package/dist/cli/utils/files.d.ts +0 -1
  2. package/dist/cli/utils/files.js +73 -56
  3. package/dist/cli/utils/manifest.d.ts +0 -1
  4. package/dist/cli/utils/manifest.js +48 -45
  5. package/dist/cli/utils/version.d.ts +0 -1
  6. package/dist/cli/utils/version.js +38 -32
  7. package/dist/index.d.ts +0 -1
  8. package/dist/index.js +39 -11
  9. package/dist/permissions/index.d.ts +0 -1
  10. package/dist/permissions/index.js +7 -4
  11. package/dist/permissions/permission-schema.d.ts +0 -1
  12. package/dist/permissions/permission-schema.js +13 -9
  13. package/dist/scripts/job-fair-aggregator.d.ts +0 -1
  14. package/dist/scripts/job-fair-aggregator.js +484 -341
  15. package/dist/workflow/index.d.ts +0 -1
  16. package/dist/workflow/index.js +12 -5
  17. package/dist/workflow/workflow-loader.d.ts +0 -1
  18. package/dist/workflow/workflow-loader.js +40 -34
  19. package/dist/workflow/workflow-permissions.d.ts +0 -1
  20. package/dist/workflow/workflow-permissions.js +14 -8
  21. package/dist/workflow/workflow-router.d.ts +0 -1
  22. package/dist/workflow/workflow-router.js +70 -51
  23. package/dist/workflow/workflow-schema.d.ts +0 -1
  24. package/dist/workflow/workflow-schema.js +62 -59
  25. package/package.json +1 -1
  26. package/dist/bmad/context-reader.d.ts +0 -71
  27. package/dist/bmad/context-reader.d.ts.map +0 -1
  28. package/dist/bmad/context-reader.js +0 -369
  29. package/dist/bmad/context-reader.js.map +0 -1
  30. package/dist/bmad/context-reader.test.d.ts +0 -71
  31. package/dist/bmad/context-reader.test.d.ts.map +0 -1
  32. package/dist/bmad/context-reader.test.js +0 -878
  33. package/dist/bmad/context-reader.test.js.map +0 -1
  34. package/dist/bmad/epics-parser.d.ts +0 -61
  35. package/dist/bmad/epics-parser.d.ts.map +0 -1
  36. package/dist/bmad/epics-parser.js +0 -331
  37. package/dist/bmad/epics-parser.js.map +0 -1
  38. package/dist/bmad/epics-parser.test.d.ts +0 -7
  39. package/dist/bmad/epics-parser.test.d.ts.map +0 -1
  40. package/dist/bmad/epics-parser.test.js +0 -449
  41. package/dist/bmad/epics-parser.test.js.map +0 -1
  42. package/dist/bmad/index.d.ts +0 -11
  43. package/dist/bmad/index.d.ts.map +0 -1
  44. package/dist/bmad/index.js +0 -24
  45. package/dist/bmad/index.js.map +0 -1
  46. package/dist/bmad/status-sync.d.ts +0 -173
  47. package/dist/bmad/status-sync.d.ts.map +0 -1
  48. package/dist/bmad/status-sync.js +0 -463
  49. package/dist/bmad/status-sync.js.map +0 -1
  50. package/dist/bmad/status-sync.test.d.ts +0 -7
  51. package/dist/bmad/status-sync.test.d.ts.map +0 -1
  52. package/dist/bmad/status-sync.test.js +0 -702
  53. package/dist/bmad/status-sync.test.js.map +0 -1
  54. package/dist/bmad/story-exporter.d.ts +0 -55
  55. package/dist/bmad/story-exporter.d.ts.map +0 -1
  56. package/dist/bmad/story-exporter.js +0 -170
  57. package/dist/bmad/story-exporter.js.map +0 -1
  58. package/dist/bmad/story-exporter.test.d.ts +0 -51
  59. package/dist/bmad/story-exporter.test.d.ts.map +0 -1
  60. package/dist/bmad/story-exporter.test.js +0 -603
  61. package/dist/bmad/story-exporter.test.js.map +0 -1
  62. package/dist/bmad/story-parser.d.ts +0 -44
  63. package/dist/bmad/story-parser.d.ts.map +0 -1
  64. package/dist/bmad/story-parser.js +0 -307
  65. package/dist/bmad/story-parser.js.map +0 -1
  66. package/dist/bmad/story-parser.test.d.ts +0 -44
  67. package/dist/bmad/story-parser.test.d.ts.map +0 -1
  68. package/dist/bmad/story-parser.test.js +0 -693
  69. package/dist/bmad/story-parser.test.js.map +0 -1
  70. package/dist/cli/commands/command.d.ts +0 -28
  71. package/dist/cli/commands/command.d.ts.map +0 -1
  72. package/dist/cli/commands/command.js +0 -399
  73. package/dist/cli/commands/command.js.map +0 -1
  74. package/dist/cli/commands/cyclist.d.ts +0 -46
  75. package/dist/cli/commands/cyclist.d.ts.map +0 -1
  76. package/dist/cli/commands/cyclist.js +0 -196
  77. package/dist/cli/commands/cyclist.js.map +0 -1
  78. package/dist/cli/commands/cyclist.test.d.ts +0 -13
  79. package/dist/cli/commands/cyclist.test.d.ts.map +0 -1
  80. package/dist/cli/commands/cyclist.test.js +0 -245
  81. package/dist/cli/commands/cyclist.test.js.map +0 -1
  82. package/dist/cli/commands/doctor.d.ts +0 -9
  83. package/dist/cli/commands/doctor.d.ts.map +0 -1
  84. package/dist/cli/commands/doctor.js +0 -652
  85. package/dist/cli/commands/doctor.js.map +0 -1
  86. package/dist/cli/commands/init.d.ts +0 -8
  87. package/dist/cli/commands/init.d.ts.map +0 -1
  88. package/dist/cli/commands/init.js +0 -524
  89. package/dist/cli/commands/init.js.map +0 -1
  90. package/dist/cli/commands/skill.d.ts +0 -28
  91. package/dist/cli/commands/skill.d.ts.map +0 -1
  92. package/dist/cli/commands/skill.js +0 -416
  93. package/dist/cli/commands/skill.js.map +0 -1
  94. package/dist/cli/commands/theme.d.ts +0 -21
  95. package/dist/cli/commands/theme.d.ts.map +0 -1
  96. package/dist/cli/commands/theme.js +0 -201
  97. package/dist/cli/commands/theme.js.map +0 -1
  98. package/dist/cli/commands/uninstall.d.ts +0 -8
  99. package/dist/cli/commands/uninstall.d.ts.map +0 -1
  100. package/dist/cli/commands/uninstall.js +0 -237
  101. package/dist/cli/commands/uninstall.js.map +0 -1
  102. package/dist/cli/commands/update.d.ts +0 -9
  103. package/dist/cli/commands/update.d.ts.map +0 -1
  104. package/dist/cli/commands/update.js +0 -418
  105. package/dist/cli/commands/update.js.map +0 -1
  106. package/dist/cli/commands/version.d.ts +0 -2
  107. package/dist/cli/commands/version.d.ts.map +0 -1
  108. package/dist/cli/commands/version.js +0 -28
  109. package/dist/cli/commands/version.js.map +0 -1
  110. package/dist/cli/customization.test.d.ts +0 -12
  111. package/dist/cli/customization.test.d.ts.map +0 -1
  112. package/dist/cli/customization.test.js +0 -84
  113. package/dist/cli/customization.test.js.map +0 -1
  114. package/dist/cli/cyclist-migration.test.d.ts +0 -16
  115. package/dist/cli/cyclist-migration.test.d.ts.map +0 -1
  116. package/dist/cli/cyclist-migration.test.js +0 -225
  117. package/dist/cli/cyclist-migration.test.js.map +0 -1
  118. package/dist/cli/index.d.ts +0 -3
  119. package/dist/cli/index.d.ts.map +0 -1
  120. package/dist/cli/index.js +0 -174
  121. package/dist/cli/index.js.map +0 -1
  122. package/dist/cli/ocean-profiles.test.d.ts +0 -13
  123. package/dist/cli/ocean-profiles.test.d.ts.map +0 -1
  124. package/dist/cli/ocean-profiles.test.js +0 -134
  125. package/dist/cli/ocean-profiles.test.js.map +0 -1
  126. package/dist/cli/theme-maker.test.d.ts +0 -11
  127. package/dist/cli/theme-maker.test.d.ts.map +0 -1
  128. package/dist/cli/theme-maker.test.js +0 -356
  129. package/dist/cli/theme-maker.test.js.map +0 -1
  130. package/dist/cli/utils/constants.d.ts +0 -66
  131. package/dist/cli/utils/constants.d.ts.map +0 -1
  132. package/dist/cli/utils/constants.js +0 -54
  133. package/dist/cli/utils/constants.js.map +0 -1
  134. package/dist/cli/utils/files.d.ts.map +0 -1
  135. package/dist/cli/utils/files.js.map +0 -1
  136. package/dist/cli/utils/logger.d.ts +0 -26
  137. package/dist/cli/utils/logger.d.ts.map +0 -1
  138. package/dist/cli/utils/logger.js +0 -88
  139. package/dist/cli/utils/logger.js.map +0 -1
  140. package/dist/cli/utils/manifest.d.ts.map +0 -1
  141. package/dist/cli/utils/manifest.js.map +0 -1
  142. package/dist/cli/utils/node-modules.d.ts +0 -6
  143. package/dist/cli/utils/node-modules.d.ts.map +0 -1
  144. package/dist/cli/utils/node-modules.js +0 -31
  145. package/dist/cli/utils/node-modules.js.map +0 -1
  146. package/dist/cli/utils/prompts.d.ts +0 -34
  147. package/dist/cli/utils/prompts.d.ts.map +0 -1
  148. package/dist/cli/utils/prompts.js +0 -93
  149. package/dist/cli/utils/prompts.js.map +0 -1
  150. package/dist/cli/utils/symlinks.d.ts +0 -29
  151. package/dist/cli/utils/symlinks.d.ts.map +0 -1
  152. package/dist/cli/utils/symlinks.js +0 -181
  153. package/dist/cli/utils/symlinks.js.map +0 -1
  154. package/dist/cli/utils/themes.d.ts +0 -101
  155. package/dist/cli/utils/themes.d.ts.map +0 -1
  156. package/dist/cli/utils/themes.js +0 -373
  157. package/dist/cli/utils/themes.js.map +0 -1
  158. package/dist/cli/utils/themes.test.d.ts +0 -12
  159. package/dist/cli/utils/themes.test.d.ts.map +0 -1
  160. package/dist/cli/utils/themes.test.js +0 -147
  161. package/dist/cli/utils/themes.test.js.map +0 -1
  162. package/dist/cli/utils/version.d.ts.map +0 -1
  163. package/dist/cli/utils/version.js.map +0 -1
  164. package/dist/cli/workspace.test.d.ts +0 -8
  165. package/dist/cli/workspace.test.d.ts.map +0 -1
  166. package/dist/cli/workspace.test.js +0 -151
  167. package/dist/cli/workspace.test.js.map +0 -1
  168. package/dist/index.d.ts.map +0 -1
  169. package/dist/index.js.map +0 -1
  170. package/dist/jira/jira-epic-creation.d.ts +0 -109
  171. package/dist/jira/jira-epic-creation.d.ts.map +0 -1
  172. package/dist/jira/jira-epic-creation.js +0 -253
  173. package/dist/jira/jira-epic-creation.js.map +0 -1
  174. package/dist/jira/jira-epic-creation.test.d.ts +0 -16
  175. package/dist/jira/jira-epic-creation.test.d.ts.map +0 -1
  176. package/dist/jira/jira-epic-creation.test.js +0 -387
  177. package/dist/jira/jira-epic-creation.test.js.map +0 -1
  178. package/dist/jira/jira-sprint-sync.d.ts +0 -247
  179. package/dist/jira/jira-sprint-sync.d.ts.map +0 -1
  180. package/dist/jira/jira-sprint-sync.js +0 -670
  181. package/dist/jira/jira-sprint-sync.js.map +0 -1
  182. package/dist/jira/jira-sprint-sync.test.d.ts +0 -16
  183. package/dist/jira/jira-sprint-sync.test.d.ts.map +0 -1
  184. package/dist/jira/jira-sprint-sync.test.js +0 -845
  185. package/dist/jira/jira-sprint-sync.test.js.map +0 -1
  186. package/dist/permissions/index.d.ts.map +0 -1
  187. package/dist/permissions/index.js.map +0 -1
  188. package/dist/permissions/permission-schema.d.ts.map +0 -1
  189. package/dist/permissions/permission-schema.js.map +0 -1
  190. package/dist/permissions/permission-schema.test.d.ts +0 -40
  191. package/dist/permissions/permission-schema.test.d.ts.map +0 -1
  192. package/dist/permissions/permission-schema.test.js +0 -367
  193. package/dist/permissions/permission-schema.test.js.map +0 -1
  194. package/dist/scripts/add-ocean-profiles.d.ts +0 -9
  195. package/dist/scripts/add-ocean-profiles.d.ts.map +0 -1
  196. package/dist/scripts/add-ocean-profiles.js +0 -695
  197. package/dist/scripts/add-ocean-profiles.js.map +0 -1
  198. package/dist/scripts/benchmark-integration.d.ts +0 -182
  199. package/dist/scripts/benchmark-integration.d.ts.map +0 -1
  200. package/dist/scripts/benchmark-integration.js +0 -691
  201. package/dist/scripts/benchmark-integration.js.map +0 -1
  202. package/dist/scripts/benchmark-integration.test.d.ts +0 -13
  203. package/dist/scripts/benchmark-integration.test.d.ts.map +0 -1
  204. package/dist/scripts/benchmark-integration.test.js +0 -680
  205. package/dist/scripts/benchmark-integration.test.js.map +0 -1
  206. package/dist/scripts/debugging-scenarios.test.d.ts +0 -18
  207. package/dist/scripts/debugging-scenarios.test.d.ts.map +0 -1
  208. package/dist/scripts/debugging-scenarios.test.js +0 -317
  209. package/dist/scripts/debugging-scenarios.test.js.map +0 -1
  210. package/dist/scripts/generate-all-spiders.d.ts +0 -10
  211. package/dist/scripts/generate-all-spiders.d.ts.map +0 -1
  212. package/dist/scripts/generate-all-spiders.js +0 -306
  213. package/dist/scripts/generate-all-spiders.js.map +0 -1
  214. package/dist/scripts/generate-report.d.ts +0 -65
  215. package/dist/scripts/generate-report.d.ts.map +0 -1
  216. package/dist/scripts/generate-report.js +0 -378
  217. package/dist/scripts/generate-report.js.map +0 -1
  218. package/dist/scripts/generate-report.test.d.ts +0 -13
  219. package/dist/scripts/generate-report.test.d.ts.map +0 -1
  220. package/dist/scripts/generate-report.test.js +0 -363
  221. package/dist/scripts/generate-report.test.js.map +0 -1
  222. package/dist/scripts/generate-spider-report.d.ts +0 -65
  223. package/dist/scripts/generate-spider-report.d.ts.map +0 -1
  224. package/dist/scripts/generate-spider-report.js +0 -366
  225. package/dist/scripts/generate-spider-report.js.map +0 -1
  226. package/dist/scripts/generate-spider-report.test.d.ts +0 -13
  227. package/dist/scripts/generate-spider-report.test.d.ts.map +0 -1
  228. package/dist/scripts/generate-spider-report.test.js +0 -367
  229. package/dist/scripts/generate-spider-report.test.js.map +0 -1
  230. package/dist/scripts/generate-spider.d.ts +0 -47
  231. package/dist/scripts/generate-spider.d.ts.map +0 -1
  232. package/dist/scripts/generate-spider.js +0 -338
  233. package/dist/scripts/generate-spider.js.map +0 -1
  234. package/dist/scripts/generate-spider.test.d.ts +0 -14
  235. package/dist/scripts/generate-spider.test.d.ts.map +0 -1
  236. package/dist/scripts/generate-spider.test.js +0 -271
  237. package/dist/scripts/generate-spider.test.js.map +0 -1
  238. package/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
  239. package/dist/scripts/job-fair-aggregator.js.map +0 -1
  240. package/dist/scripts/job-fair-aggregator.test.d.ts +0 -14
  241. package/dist/scripts/job-fair-aggregator.test.d.ts.map +0 -1
  242. package/dist/scripts/job-fair-aggregator.test.js +0 -616
  243. package/dist/scripts/job-fair-aggregator.test.js.map +0 -1
  244. package/dist/scripts/run-ci.test.d.ts +0 -20
  245. package/dist/scripts/run-ci.test.d.ts.map +0 -1
  246. package/dist/scripts/run-ci.test.js +0 -127
  247. package/dist/scripts/run-ci.test.js.map +0 -1
  248. package/dist/scripts/theme-detail.test.d.ts +0 -10
  249. package/dist/scripts/theme-detail.test.d.ts.map +0 -1
  250. package/dist/scripts/theme-detail.test.js +0 -199
  251. package/dist/scripts/theme-detail.test.js.map +0 -1
  252. package/dist/scripts/validate-ocean-profiles.d.ts +0 -9
  253. package/dist/scripts/validate-ocean-profiles.d.ts.map +0 -1
  254. package/dist/scripts/validate-ocean-profiles.js +0 -130
  255. package/dist/scripts/validate-ocean-profiles.js.map +0 -1
  256. package/dist/workflow/gate-handler.d.ts +0 -94
  257. package/dist/workflow/gate-handler.d.ts.map +0 -1
  258. package/dist/workflow/gate-handler.js +0 -189
  259. package/dist/workflow/gate-handler.js.map +0 -1
  260. package/dist/workflow/gate-handler.test.d.ts +0 -14
  261. package/dist/workflow/gate-handler.test.d.ts.map +0 -1
  262. package/dist/workflow/gate-handler.test.js +0 -543
  263. package/dist/workflow/gate-handler.test.js.map +0 -1
  264. package/dist/workflow/generic-handoff.d.ts +0 -281
  265. package/dist/workflow/generic-handoff.d.ts.map +0 -1
  266. package/dist/workflow/generic-handoff.js +0 -411
  267. package/dist/workflow/generic-handoff.js.map +0 -1
  268. package/dist/workflow/generic-handoff.test.d.ts +0 -21
  269. package/dist/workflow/generic-handoff.test.d.ts.map +0 -1
  270. package/dist/workflow/generic-handoff.test.js +0 -499
  271. package/dist/workflow/generic-handoff.test.js.map +0 -1
  272. package/dist/workflow/generic-sm-finish.d.ts +0 -89
  273. package/dist/workflow/generic-sm-finish.d.ts.map +0 -1
  274. package/dist/workflow/generic-sm-finish.js +0 -157
  275. package/dist/workflow/generic-sm-finish.js.map +0 -1
  276. package/dist/workflow/generic-sm-setup.d.ts +0 -138
  277. package/dist/workflow/generic-sm-setup.d.ts.map +0 -1
  278. package/dist/workflow/generic-sm-setup.js +0 -382
  279. package/dist/workflow/generic-sm-setup.js.map +0 -1
  280. package/dist/workflow/index.d.ts.map +0 -1
  281. package/dist/workflow/index.js.map +0 -1
  282. package/dist/workflow/session-state.d.ts +0 -92
  283. package/dist/workflow/session-state.d.ts.map +0 -1
  284. package/dist/workflow/session-state.js +0 -198
  285. package/dist/workflow/session-state.js.map +0 -1
  286. package/dist/workflow/session-state.test.d.ts +0 -8
  287. package/dist/workflow/session-state.test.d.ts.map +0 -1
  288. package/dist/workflow/session-state.test.js +0 -551
  289. package/dist/workflow/session-state.test.js.map +0 -1
  290. package/dist/workflow/sm-subagents.test.d.ts +0 -23
  291. package/dist/workflow/sm-subagents.test.d.ts.map +0 -1
  292. package/dist/workflow/sm-subagents.test.js +0 -727
  293. package/dist/workflow/sm-subagents.test.js.map +0 -1
  294. package/dist/workflow/step-parser.d.ts +0 -45
  295. package/dist/workflow/step-parser.d.ts.map +0 -1
  296. package/dist/workflow/step-parser.js +0 -147
  297. package/dist/workflow/step-parser.js.map +0 -1
  298. package/dist/workflow/step-parser.test.d.ts +0 -14
  299. package/dist/workflow/step-parser.test.d.ts.map +0 -1
  300. package/dist/workflow/step-parser.test.js +0 -470
  301. package/dist/workflow/step-parser.test.js.map +0 -1
  302. package/dist/workflow/story-workflow-routing.test.d.ts +0 -17
  303. package/dist/workflow/story-workflow-routing.test.d.ts.map +0 -1
  304. package/dist/workflow/story-workflow-routing.test.js +0 -559
  305. package/dist/workflow/story-workflow-routing.test.js.map +0 -1
  306. package/dist/workflow/test-cache.d.ts +0 -131
  307. package/dist/workflow/test-cache.d.ts.map +0 -1
  308. package/dist/workflow/test-cache.js +0 -226
  309. package/dist/workflow/test-cache.js.map +0 -1
  310. package/dist/workflow/test-cache.test.d.ts +0 -17
  311. package/dist/workflow/test-cache.test.d.ts.map +0 -1
  312. package/dist/workflow/test-cache.test.js +0 -438
  313. package/dist/workflow/test-cache.test.js.map +0 -1
  314. package/dist/workflow/trimodal.d.ts +0 -86
  315. package/dist/workflow/trimodal.d.ts.map +0 -1
  316. package/dist/workflow/trimodal.js +0 -118
  317. package/dist/workflow/trimodal.js.map +0 -1
  318. package/dist/workflow/trimodal.test.d.ts +0 -11
  319. package/dist/workflow/trimodal.test.d.ts.map +0 -1
  320. package/dist/workflow/trimodal.test.js +0 -395
  321. package/dist/workflow/trimodal.test.js.map +0 -1
  322. package/dist/workflow/variable-resolver.d.ts +0 -67
  323. package/dist/workflow/variable-resolver.d.ts.map +0 -1
  324. package/dist/workflow/variable-resolver.js +0 -156
  325. package/dist/workflow/variable-resolver.js.map +0 -1
  326. package/dist/workflow/variable-resolver.test.d.ts +0 -14
  327. package/dist/workflow/variable-resolver.test.d.ts.map +0 -1
  328. package/dist/workflow/variable-resolver.test.js +0 -400
  329. package/dist/workflow/variable-resolver.test.js.map +0 -1
  330. package/dist/workflow/workflow-executor.d.ts +0 -163
  331. package/dist/workflow/workflow-executor.d.ts.map +0 -1
  332. package/dist/workflow/workflow-executor.js +0 -197
  333. package/dist/workflow/workflow-executor.js.map +0 -1
  334. package/dist/workflow/workflow-executor.test.d.ts +0 -8
  335. package/dist/workflow/workflow-executor.test.d.ts.map +0 -1
  336. package/dist/workflow/workflow-executor.test.js +0 -444
  337. package/dist/workflow/workflow-executor.test.js.map +0 -1
  338. package/dist/workflow/workflow-loader.d.ts.map +0 -1
  339. package/dist/workflow/workflow-loader.js.map +0 -1
  340. package/dist/workflow/workflow-loader.test.d.ts +0 -15
  341. package/dist/workflow/workflow-loader.test.d.ts.map +0 -1
  342. package/dist/workflow/workflow-loader.test.js +0 -354
  343. package/dist/workflow/workflow-loader.test.js.map +0 -1
  344. package/dist/workflow/workflow-migration.test.d.ts +0 -17
  345. package/dist/workflow/workflow-migration.test.d.ts.map +0 -1
  346. package/dist/workflow/workflow-migration.test.js +0 -371
  347. package/dist/workflow/workflow-migration.test.js.map +0 -1
  348. package/dist/workflow/workflow-permissions.d.ts.map +0 -1
  349. package/dist/workflow/workflow-permissions.js.map +0 -1
  350. package/dist/workflow/workflow-permissions.test.d.ts +0 -15
  351. package/dist/workflow/workflow-permissions.test.d.ts.map +0 -1
  352. package/dist/workflow/workflow-permissions.test.js +0 -301
  353. package/dist/workflow/workflow-permissions.test.js.map +0 -1
  354. package/dist/workflow/workflow-router.d.ts.map +0 -1
  355. package/dist/workflow/workflow-router.js.map +0 -1
  356. package/dist/workflow/workflow-router.test.d.ts +0 -20
  357. package/dist/workflow/workflow-router.test.d.ts.map +0 -1
  358. package/dist/workflow/workflow-router.test.js +0 -607
  359. package/dist/workflow/workflow-router.test.js.map +0 -1
  360. package/dist/workflow/workflow-schema.d.ts.map +0 -1
  361. package/dist/workflow/workflow-schema.js.map +0 -1
  362. package/dist/workflow/workflow-schema.test.d.ts +0 -45
  363. package/dist/workflow/workflow-schema.test.d.ts.map +0 -1
  364. package/dist/workflow/workflow-schema.test.js +0 -512
  365. package/dist/workflow/workflow-schema.test.js.map +0 -1
  366. package/dist/workflow/workflow-stepped-schema.test.d.ts +0 -18
  367. package/dist/workflow/workflow-stepped-schema.test.d.ts.map +0 -1
  368. package/dist/workflow/workflow-stepped-schema.test.js +0 -608
  369. package/dist/workflow/workflow-stepped-schema.test.js.map +0 -1
@@ -1,878 +0,0 @@
1
- /**
2
- * Tests for Story 32-4: BMAD Project Context Reader
3
- *
4
- * These tests define the contract for parsing BMAD project-context.md files.
5
- * Dev will implement parseBmadContext() to pass these tests.
6
- *
7
- * BMAD project-context format:
8
- * - Required: ## Overview, ## Technology Stack, ## Critical Implementation Rules
9
- * - Optional: ## Project Structure, ## Coding Standards, ## AI Agent Guidance,
10
- * ## External Dependencies, ## Environment Setup
11
- *
12
- * Run with: npm test
13
- */
14
- import { describe, it } from 'node:test';
15
- import assert from 'node:assert';
16
- // Import the parser function that Dev will implement
17
- // This import will fail until the module is implemented
18
- import { parseBmadContext, } from './context-reader.js';
19
- // =============================================================================
20
- // TEST DATA: Valid BMAD project-context examples
21
- // =============================================================================
22
- const MINIMAL_VALID_CONTEXT = `# Project Context
23
-
24
- ## Overview
25
- A simple test project for validating the context parser.
26
-
27
- ## Technology Stack
28
-
29
- ### Frontend
30
- - **Framework:** React
31
- - **Language:** TypeScript
32
-
33
- ### Backend
34
- - **Language:** Node.js
35
- - **Framework:** Express
36
-
37
- ## Critical Implementation Rules
38
-
39
- 1. **Test First:** Always write tests before implementation.
40
- `;
41
- const COMPLETE_CONTEXT = `# Project Context
42
-
43
- ## Overview
44
- TaskFlow is a collaborative task management application designed for small teams.
45
- It enables real-time task tracking, team collaboration, and progress visualization.
46
- The application serves 5,000+ daily active users and processes 50,000+ task updates per day.
47
-
48
- ## Technology Stack
49
-
50
- ### Frontend
51
- - **Framework:** React 18 with hooks
52
- - **Language:** TypeScript 5.0+
53
- - **State Management:** Zustand for global state, React Query for server state
54
- - **Styling:** Tailwind CSS with custom design tokens
55
- - **Build Tool:** Vite 5
56
-
57
- ### Backend
58
- - **Language:** Go 1.21+
59
- - **Framework:** Gin with custom middleware
60
- - **Database:** PostgreSQL 15 with pgx driver
61
- - **Cache:** Redis 7 for sessions and real-time updates
62
- - **API Style:** REST with OpenAPI 3.0 documentation
63
-
64
- ### Infrastructure
65
- - **Cloud Provider:** AWS (us-east-1 primary, us-west-2 DR)
66
- - **Container Runtime:** Docker with multi-stage builds
67
- - **Orchestration:** ECS Fargate
68
- - **CI/CD:** GitHub Actions with environment-based deployments
69
-
70
- ## Project Structure
71
-
72
- \`\`\`
73
- taskflow/
74
- ├── api/ # Go backend
75
- │ ├── cmd/server/ # Application entrypoint
76
- │ └── internal/ # Internal packages
77
- ├── web/ # React frontend
78
- └── docs/ # Documentation
79
- \`\`\`
80
-
81
- ## Critical Implementation Rules
82
-
83
- 1. **No Raw SQL:** Always use parameterized queries via repository layer. SQL injection is a critical vulnerability.
84
-
85
- 2. **Auth Required by Default:** All API endpoints require authentication unless explicitly marked public. Use the \`@public\` decorator for exceptions.
86
-
87
- 3. **Soft Deletes Only:** Never hard-delete user data. Use \`deleted_at\` timestamp for all deletions. Required for audit compliance.
88
-
89
- 4. **Rate Limiting:** All public endpoints must have rate limiting. Default: 100 req/min per IP.
90
-
91
- 5. **Error Codes:** All API errors must use standard error codes from \`pkg/errors/codes.go\`. Never expose internal error messages to clients.
92
-
93
- ## Coding Standards
94
-
95
- ### Naming Conventions
96
- - Go: Follow effective Go (MixedCaps for exports, mixedCaps for internal)
97
- - React: PascalCase for components, camelCase for hooks (useXxx)
98
- - Database: snake_case for all columns and tables
99
- - API: camelCase for JSON fields
100
-
101
- ### Error Handling
102
- - Go: Wrap errors with context using \`fmt.Errorf("operation: %w", err)\`
103
- - React: Use error boundaries for component failures
104
- - API: Return structured error responses with code, message, and details
105
-
106
- ### Testing Requirements
107
- - Unit test coverage: minimum 80% for services layer
108
- - Integration tests required for all API endpoints
109
- - E2E tests for critical user journeys (login, task CRUD)
110
-
111
- ## AI Agent Guidance
112
-
113
- ### Do
114
- - Read existing code patterns before implementing new features
115
- - Follow the existing project structure - don't create new top-level directories
116
- - Use existing utilities from \`pkg/\` before creating new ones
117
- - Write tests alongside implementation, not after
118
- - Check \`docs/adr/\` for architectural decision records before major changes
119
-
120
- ### Don't
121
- - Don't add new dependencies without checking for existing alternatives
122
- - Don't modify database schema without creating a migration
123
- - Don't bypass the repository layer for database access
124
- - Don't use \`any\` type in TypeScript - always define proper types
125
-
126
- ### Context Loading
127
- For additional context, check:
128
- - \`docs/adr/\` - Architectural decisions
129
- - \`docs/api/\` - API specifications
130
- - \`.github/CONTRIBUTING.md\` - Contribution guidelines
131
-
132
- ## External Dependencies
133
-
134
- | Dependency | Purpose | Documentation |
135
- |------------|---------|---------------|
136
- | Zustand | Frontend state management | https://zustand-demo.pmnd.rs/ |
137
- | React Query | Server state & caching | https://tanstack.com/query |
138
- | Gin | HTTP router & middleware | https://gin-gonic.com/docs/ |
139
- | pgx | PostgreSQL driver | https://github.com/jackc/pgx |
140
- | Zap | Structured logging | https://pkg.go.dev/go.uber.org/zap |
141
-
142
- ## Environment Setup
143
-
144
- 1. Install dependencies:
145
- \`\`\`bash
146
- cd api && go mod download
147
- cd web && npm install
148
- \`\`\`
149
-
150
- 2. Set up local database:
151
- \`\`\`bash
152
- docker-compose up -d postgres redis
153
- make migrate
154
- \`\`\`
155
- `;
156
- const CONTEXT_WITHOUT_INFRASTRUCTURE = `# Project Context
157
-
158
- ## Overview
159
- A frontend-only project with no backend.
160
-
161
- ## Technology Stack
162
-
163
- ### Frontend
164
- - **Framework:** Vue 3
165
- - **Language:** TypeScript
166
- - **Build Tool:** Vite
167
-
168
- ## Critical Implementation Rules
169
-
170
- 1. **Component Isolation:** Each component should be self-contained.
171
- `;
172
- const CONTEXT_WITH_MULTILINE_RULES = `# Project Context
173
-
174
- ## Overview
175
- Project with multi-line rule descriptions.
176
-
177
- ## Technology Stack
178
-
179
- ### Backend
180
- - **Language:** Python
181
- - **Framework:** FastAPI
182
-
183
- ## Critical Implementation Rules
184
-
185
- 1. **Database Access:** All database queries must go through the ORM layer.
186
- Never write raw SQL. This ensures we maintain proper query logging
187
- and can easily switch databases if needed.
188
-
189
- 2. **Error Handling:** Always catch exceptions at the controller layer.
190
- Log the full stack trace but return sanitized error messages to clients.
191
- Use error codes from the errors module.
192
-
193
- 3. **Simple Rule:** Keep it simple.
194
- `;
195
- // =============================================================================
196
- // AC1: Detects project-context.md in project
197
- // =============================================================================
198
- describe('BMAD Context Reader (32-4)', () => {
199
- describe('AC1: File detection and basic parsing', () => {
200
- it('should parse a minimal valid context file', () => {
201
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
202
- assert.strictEqual(result.success, true, 'Should successfully parse minimal context');
203
- assert.ok(result.context, 'Should return context object');
204
- });
205
- it('should parse a complete context file with all sections', () => {
206
- const result = parseBmadContext(COMPLETE_CONTEXT);
207
- assert.strictEqual(result.success, true, 'Should successfully parse complete context');
208
- assert.ok(result.context, 'Should return context object');
209
- });
210
- it('should extract overview section', () => {
211
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
212
- assert.strictEqual(result.success, true);
213
- assert.ok(result.context?.overview);
214
- assert.ok(result.context?.overview.includes('simple test project'));
215
- });
216
- it('should preserve multi-line overview content', () => {
217
- const result = parseBmadContext(COMPLETE_CONTEXT);
218
- assert.strictEqual(result.success, true);
219
- assert.ok(result.context?.overview.includes('TaskFlow'));
220
- assert.ok(result.context?.overview.includes('5,000+ daily active users'));
221
- });
222
- it('should return errors for empty content', () => {
223
- const result = parseBmadContext('');
224
- assert.strictEqual(result.success, false);
225
- assert.ok(result.errors && result.errors.length > 0);
226
- });
227
- it('should return errors for whitespace-only content', () => {
228
- const result = parseBmadContext(' \n\n \t ');
229
- assert.strictEqual(result.success, false);
230
- });
231
- });
232
- // ===========================================================================
233
- // AC2: Parses technology stack section
234
- // ===========================================================================
235
- describe('AC2: Technology Stack parsing', () => {
236
- describe('Frontend subsection', () => {
237
- it('should extract frontend framework', () => {
238
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
239
- assert.strictEqual(result.success, true);
240
- assert.strictEqual(result.context?.technologyStack.frontend?.framework, 'React');
241
- });
242
- it('should extract frontend language', () => {
243
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
244
- assert.strictEqual(result.success, true);
245
- assert.strictEqual(result.context?.technologyStack.frontend?.language, 'TypeScript');
246
- });
247
- it('should extract all frontend fields when present', () => {
248
- const result = parseBmadContext(COMPLETE_CONTEXT);
249
- assert.strictEqual(result.success, true);
250
- const frontend = result.context?.technologyStack.frontend;
251
- assert.strictEqual(frontend?.framework, 'React 18 with hooks');
252
- assert.strictEqual(frontend?.language, 'TypeScript 5.0+');
253
- assert.strictEqual(frontend?.stateManagement, 'Zustand for global state, React Query for server state');
254
- assert.strictEqual(frontend?.styling, 'Tailwind CSS with custom design tokens');
255
- assert.strictEqual(frontend?.buildTool, 'Vite 5');
256
- });
257
- it('should return undefined for missing frontend section', () => {
258
- const context = `# Project Context
259
-
260
- ## Overview
261
- Backend only project.
262
-
263
- ## Technology Stack
264
-
265
- ### Backend
266
- - **Language:** Go
267
- - **Framework:** Gin
268
-
269
- ## Critical Implementation Rules
270
-
271
- 1. **Rule:** Description.
272
- `;
273
- const result = parseBmadContext(context);
274
- assert.strictEqual(result.success, true);
275
- assert.strictEqual(result.context?.technologyStack.frontend, undefined);
276
- });
277
- });
278
- describe('Backend subsection', () => {
279
- it('should extract backend language', () => {
280
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
281
- assert.strictEqual(result.success, true);
282
- assert.strictEqual(result.context?.technologyStack.backend?.language, 'Node.js');
283
- });
284
- it('should extract backend framework', () => {
285
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
286
- assert.strictEqual(result.success, true);
287
- assert.strictEqual(result.context?.technologyStack.backend?.framework, 'Express');
288
- });
289
- it('should extract all backend fields when present', () => {
290
- const result = parseBmadContext(COMPLETE_CONTEXT);
291
- assert.strictEqual(result.success, true);
292
- const backend = result.context?.technologyStack.backend;
293
- assert.strictEqual(backend?.language, 'Go 1.21+');
294
- assert.strictEqual(backend?.framework, 'Gin with custom middleware');
295
- assert.strictEqual(backend?.database, 'PostgreSQL 15 with pgx driver');
296
- assert.strictEqual(backend?.cache, 'Redis 7 for sessions and real-time updates');
297
- assert.strictEqual(backend?.apiStyle, 'REST with OpenAPI 3.0 documentation');
298
- });
299
- it('should return undefined for missing backend section', () => {
300
- const result = parseBmadContext(CONTEXT_WITHOUT_INFRASTRUCTURE);
301
- assert.strictEqual(result.success, true);
302
- assert.strictEqual(result.context?.technologyStack.backend, undefined);
303
- });
304
- });
305
- describe('Infrastructure subsection', () => {
306
- it('should extract all infrastructure fields when present', () => {
307
- const result = parseBmadContext(COMPLETE_CONTEXT);
308
- assert.strictEqual(result.success, true);
309
- const infra = result.context?.technologyStack.infrastructure;
310
- assert.strictEqual(infra?.cloudProvider, 'AWS (us-east-1 primary, us-west-2 DR)');
311
- assert.strictEqual(infra?.containerRuntime, 'Docker with multi-stage builds');
312
- assert.strictEqual(infra?.orchestration, 'ECS Fargate');
313
- assert.strictEqual(infra?.ciCd, 'GitHub Actions with environment-based deployments');
314
- });
315
- it('should return undefined for missing infrastructure section', () => {
316
- const result = parseBmadContext(CONTEXT_WITHOUT_INFRASTRUCTURE);
317
- assert.strictEqual(result.success, true);
318
- assert.strictEqual(result.context?.technologyStack.infrastructure, undefined);
319
- });
320
- });
321
- describe('Technology Stack edge cases', () => {
322
- it('should handle technology stack with only one subsection', () => {
323
- const context = `# Project Context
324
-
325
- ## Overview
326
- Minimal stack project.
327
-
328
- ## Technology Stack
329
-
330
- ### Backend
331
- - **Language:** Rust
332
-
333
- ## Critical Implementation Rules
334
-
335
- 1. **Rule:** Description.
336
- `;
337
- const result = parseBmadContext(context);
338
- assert.strictEqual(result.success, true);
339
- assert.strictEqual(result.context?.technologyStack.backend?.language, 'Rust');
340
- assert.strictEqual(result.context?.technologyStack.frontend, undefined);
341
- assert.strictEqual(result.context?.technologyStack.infrastructure, undefined);
342
- });
343
- it('should handle fields with extra whitespace', () => {
344
- const context = `# Project Context
345
-
346
- ## Overview
347
- Test project.
348
-
349
- ## Technology Stack
350
-
351
- ### Frontend
352
- - **Framework:** React
353
- - **Language:** TypeScript
354
-
355
- ## Critical Implementation Rules
356
-
357
- 1. **Rule:** Description.
358
- `;
359
- const result = parseBmadContext(context);
360
- assert.strictEqual(result.success, true);
361
- assert.strictEqual(result.context?.technologyStack.frontend?.framework, 'React');
362
- assert.strictEqual(result.context?.technologyStack.frontend?.language, 'TypeScript');
363
- });
364
- it('should handle fields without bold markers', () => {
365
- const context = `# Project Context
366
-
367
- ## Overview
368
- Test project without bold.
369
-
370
- ## Technology Stack
371
-
372
- ### Frontend
373
- - Framework: React
374
- - Language: TypeScript
375
-
376
- ## Critical Implementation Rules
377
-
378
- 1. **Rule:** Description.
379
- `;
380
- const result = parseBmadContext(context);
381
- assert.strictEqual(result.success, true);
382
- // Should still parse even without bold markers
383
- assert.strictEqual(result.context?.technologyStack.frontend?.framework, 'React');
384
- assert.strictEqual(result.context?.technologyStack.frontend?.language, 'TypeScript');
385
- });
386
- });
387
- });
388
- // ===========================================================================
389
- // AC3: Extracts implementation rules
390
- // ===========================================================================
391
- describe('AC3: Critical Implementation Rules parsing', () => {
392
- it('should extract single rule', () => {
393
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
394
- assert.strictEqual(result.success, true);
395
- assert.strictEqual(result.context?.implementationRules.length, 1);
396
- const rule = result.context?.implementationRules[0];
397
- assert.strictEqual(rule?.number, 1);
398
- assert.strictEqual(rule?.title, 'Test First');
399
- assert.strictEqual(rule?.description, 'Always write tests before implementation.');
400
- });
401
- it('should extract multiple rules', () => {
402
- const result = parseBmadContext(COMPLETE_CONTEXT);
403
- assert.strictEqual(result.success, true);
404
- assert.strictEqual(result.context?.implementationRules.length, 5);
405
- });
406
- it('should extract rule numbers correctly', () => {
407
- const result = parseBmadContext(COMPLETE_CONTEXT);
408
- assert.strictEqual(result.success, true);
409
- assert.strictEqual(result.context?.implementationRules[0]?.number, 1);
410
- assert.strictEqual(result.context?.implementationRules[1]?.number, 2);
411
- assert.strictEqual(result.context?.implementationRules[4]?.number, 5);
412
- });
413
- it('should extract rule titles correctly', () => {
414
- const result = parseBmadContext(COMPLETE_CONTEXT);
415
- assert.strictEqual(result.success, true);
416
- assert.strictEqual(result.context?.implementationRules[0]?.title, 'No Raw SQL');
417
- assert.strictEqual(result.context?.implementationRules[1]?.title, 'Auth Required by Default');
418
- assert.strictEqual(result.context?.implementationRules[2]?.title, 'Soft Deletes Only');
419
- });
420
- it('should extract rule descriptions correctly', () => {
421
- const result = parseBmadContext(COMPLETE_CONTEXT);
422
- assert.strictEqual(result.success, true);
423
- const rule = result.context?.implementationRules[0];
424
- assert.ok(rule?.description.includes('parameterized queries'));
425
- assert.ok(rule?.description.includes('SQL injection'));
426
- });
427
- it('should handle multi-line rule descriptions', () => {
428
- const result = parseBmadContext(CONTEXT_WITH_MULTILINE_RULES);
429
- assert.strictEqual(result.success, true);
430
- assert.strictEqual(result.context?.implementationRules.length, 3);
431
- const rule1 = result.context?.implementationRules[0];
432
- assert.strictEqual(rule1?.title, 'Database Access');
433
- assert.ok(rule1?.description.includes('ORM layer'));
434
- assert.ok(rule1?.description.includes('easily switch databases'));
435
- const rule2 = result.context?.implementationRules[1];
436
- assert.strictEqual(rule2?.title, 'Error Handling');
437
- assert.ok(rule2?.description.includes('controller layer'));
438
- assert.ok(rule2?.description.includes('sanitized error messages'));
439
- });
440
- it('should preserve inline code in rule descriptions', () => {
441
- const result = parseBmadContext(COMPLETE_CONTEXT);
442
- assert.strictEqual(result.success, true);
443
- const rule2 = result.context?.implementationRules[1];
444
- assert.ok(rule2?.description.includes('`@public`'));
445
- });
446
- it('should return empty array when rules section is missing', () => {
447
- const context = `# Project Context
448
-
449
- ## Overview
450
- No rules project.
451
-
452
- ## Technology Stack
453
-
454
- ### Frontend
455
- - **Framework:** React
456
- `;
457
- const result = parseBmadContext(context);
458
- // Missing Critical Implementation Rules should cause error (it's required)
459
- assert.strictEqual(result.success, false);
460
- assert.ok(result.errors?.some((e) => e.section === 'Critical Implementation Rules'));
461
- });
462
- it('should handle rules with special characters in title', () => {
463
- const context = `# Project Context
464
-
465
- ## Overview
466
- Test project.
467
-
468
- ## Technology Stack
469
-
470
- ### Frontend
471
- - **Framework:** React
472
-
473
- ## Critical Implementation Rules
474
-
475
- 1. **API Versioning (v1/v2):** Support multiple API versions.
476
- `;
477
- const result = parseBmadContext(context);
478
- assert.strictEqual(result.success, true);
479
- assert.strictEqual(result.context?.implementationRules[0]?.title, 'API Versioning (v1/v2)');
480
- });
481
- });
482
- // ===========================================================================
483
- // AC4: Integrates with agent context loading - proper types and structure
484
- // ===========================================================================
485
- describe('AC4: Type structure and integration', () => {
486
- it('should return success: true for valid context', () => {
487
- const result = parseBmadContext(COMPLETE_CONTEXT);
488
- assert.strictEqual(result.success, true);
489
- assert.ok(result.context);
490
- assert.strictEqual(result.errors, undefined);
491
- });
492
- it('should return success: false with errors for invalid context', () => {
493
- const context = `# Project Context
494
-
495
- ## Overview
496
- Missing required sections.
497
- `;
498
- const result = parseBmadContext(context);
499
- assert.strictEqual(result.success, false);
500
- assert.strictEqual(result.context, undefined);
501
- assert.ok(result.errors && result.errors.length > 0);
502
- });
503
- it('should populate all BmadProjectContext fields', () => {
504
- const result = parseBmadContext(COMPLETE_CONTEXT);
505
- assert.strictEqual(result.success, true);
506
- const context = result.context;
507
- // Required fields
508
- assert.strictEqual(typeof context.overview, 'string');
509
- assert.ok(typeof context.technologyStack === 'object');
510
- assert.ok(Array.isArray(context.implementationRules));
511
- // Optional fields should be present when in content
512
- assert.ok(context.projectStructure === undefined || typeof context.projectStructure === 'string');
513
- assert.ok(context.codingStandards === undefined || typeof context.codingStandards === 'string');
514
- assert.ok(context.aiAgentGuidance === undefined || typeof context.aiAgentGuidance === 'object');
515
- });
516
- it('should have correct TechnologyStack structure', () => {
517
- const result = parseBmadContext(COMPLETE_CONTEXT);
518
- assert.strictEqual(result.success, true);
519
- const stack = result.context?.technologyStack;
520
- // Frontend fields
521
- if (stack.frontend) {
522
- assert.ok(stack.frontend.framework === undefined || typeof stack.frontend.framework === 'string');
523
- assert.ok(stack.frontend.language === undefined || typeof stack.frontend.language === 'string');
524
- assert.ok(stack.frontend.stateManagement === undefined || typeof stack.frontend.stateManagement === 'string');
525
- assert.ok(stack.frontend.styling === undefined || typeof stack.frontend.styling === 'string');
526
- assert.ok(stack.frontend.buildTool === undefined || typeof stack.frontend.buildTool === 'string');
527
- }
528
- // Backend fields
529
- if (stack.backend) {
530
- assert.ok(stack.backend.language === undefined || typeof stack.backend.language === 'string');
531
- assert.ok(stack.backend.framework === undefined || typeof stack.backend.framework === 'string');
532
- assert.ok(stack.backend.database === undefined || typeof stack.backend.database === 'string');
533
- assert.ok(stack.backend.cache === undefined || typeof stack.backend.cache === 'string');
534
- assert.ok(stack.backend.apiStyle === undefined || typeof stack.backend.apiStyle === 'string');
535
- }
536
- // Infrastructure fields
537
- if (stack.infrastructure) {
538
- assert.ok(stack.infrastructure.cloudProvider === undefined || typeof stack.infrastructure.cloudProvider === 'string');
539
- assert.ok(stack.infrastructure.containerRuntime === undefined || typeof stack.infrastructure.containerRuntime === 'string');
540
- assert.ok(stack.infrastructure.orchestration === undefined || typeof stack.infrastructure.orchestration === 'string');
541
- assert.ok(stack.infrastructure.ciCd === undefined || typeof stack.infrastructure.ciCd === 'string');
542
- }
543
- });
544
- it('should have correct ImplementationRule structure', () => {
545
- const result = parseBmadContext(COMPLETE_CONTEXT);
546
- assert.strictEqual(result.success, true);
547
- const rule = result.context?.implementationRules[0];
548
- assert.strictEqual(typeof rule.number, 'number');
549
- assert.strictEqual(typeof rule.title, 'string');
550
- assert.strictEqual(typeof rule.description, 'string');
551
- });
552
- it('should include error details with section name', () => {
553
- const context = `# Project Context
554
-
555
- ## Overview
556
- Missing tech stack and rules.
557
- `;
558
- const result = parseBmadContext(context);
559
- assert.strictEqual(result.success, false);
560
- assert.ok(result.errors?.some((e) => e.section === 'Technology Stack'));
561
- assert.ok(result.errors?.some((e) => e.section === 'Critical Implementation Rules'));
562
- });
563
- it('should accumulate multiple errors', () => {
564
- const context = `# Project Context
565
- `;
566
- // Missing: Overview, Technology Stack, Critical Implementation Rules
567
- const result = parseBmadContext(context);
568
- assert.strictEqual(result.success, false);
569
- assert.ok(result.errors && result.errors.length >= 3, 'Should report multiple errors');
570
- });
571
- });
572
- // ===========================================================================
573
- // AC5: Works alongside CLAUDE.md - optional sections and compatibility
574
- // ===========================================================================
575
- describe('AC5: Optional sections and CLAUDE.md compatibility', () => {
576
- describe('Project Structure section', () => {
577
- it('should extract project structure when present', () => {
578
- const result = parseBmadContext(COMPLETE_CONTEXT);
579
- assert.strictEqual(result.success, true);
580
- assert.ok(result.context?.projectStructure);
581
- assert.ok(result.context?.projectStructure?.includes('taskflow/'));
582
- assert.ok(result.context?.projectStructure?.includes('api/'));
583
- });
584
- it('should return undefined when project structure missing', () => {
585
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
586
- assert.strictEqual(result.success, true);
587
- assert.strictEqual(result.context?.projectStructure, undefined);
588
- });
589
- });
590
- describe('Coding Standards section', () => {
591
- it('should extract coding standards when present', () => {
592
- const result = parseBmadContext(COMPLETE_CONTEXT);
593
- assert.strictEqual(result.success, true);
594
- assert.ok(result.context?.codingStandards);
595
- assert.ok(result.context?.codingStandards?.includes('Naming Conventions'));
596
- assert.ok(result.context?.codingStandards?.includes('Error Handling'));
597
- });
598
- it('should return undefined when coding standards missing', () => {
599
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
600
- assert.strictEqual(result.success, true);
601
- assert.strictEqual(result.context?.codingStandards, undefined);
602
- });
603
- });
604
- describe('AI Agent Guidance section', () => {
605
- it('should extract AI agent guidance when present', () => {
606
- const result = parseBmadContext(COMPLETE_CONTEXT);
607
- assert.strictEqual(result.success, true);
608
- assert.ok(result.context?.aiAgentGuidance);
609
- });
610
- it('should parse Do subsection', () => {
611
- const result = parseBmadContext(COMPLETE_CONTEXT);
612
- assert.strictEqual(result.success, true);
613
- const guidance = result.context?.aiAgentGuidance;
614
- assert.ok(guidance?.do);
615
- assert.ok(Array.isArray(guidance?.do));
616
- assert.ok(guidance?.do?.some((item) => item.includes('existing code patterns')));
617
- });
618
- it('should parse Don\'t subsection', () => {
619
- const result = parseBmadContext(COMPLETE_CONTEXT);
620
- assert.strictEqual(result.success, true);
621
- const guidance = result.context?.aiAgentGuidance;
622
- assert.ok(guidance?.dont);
623
- assert.ok(Array.isArray(guidance?.dont));
624
- assert.ok(guidance?.dont?.some((item) => item.includes('new dependencies')));
625
- });
626
- it('should parse Context Loading subsection', () => {
627
- const result = parseBmadContext(COMPLETE_CONTEXT);
628
- assert.strictEqual(result.success, true);
629
- const guidance = result.context?.aiAgentGuidance;
630
- assert.ok(guidance?.contextLoading);
631
- assert.ok(guidance?.contextLoading?.includes('docs/adr/'));
632
- });
633
- it('should return undefined when AI guidance missing', () => {
634
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
635
- assert.strictEqual(result.success, true);
636
- assert.strictEqual(result.context?.aiAgentGuidance, undefined);
637
- });
638
- });
639
- describe('External Dependencies section', () => {
640
- it('should extract external dependencies when present', () => {
641
- const result = parseBmadContext(COMPLETE_CONTEXT);
642
- assert.strictEqual(result.success, true);
643
- assert.ok(result.context?.externalDependencies);
644
- assert.ok(Array.isArray(result.context?.externalDependencies));
645
- });
646
- it('should parse dependency table rows', () => {
647
- const result = parseBmadContext(COMPLETE_CONTEXT);
648
- assert.strictEqual(result.success, true);
649
- const deps = result.context?.externalDependencies;
650
- assert.ok(deps && deps.length >= 5);
651
- const zustand = deps?.find((d) => d.name === 'Zustand');
652
- assert.ok(zustand);
653
- assert.strictEqual(zustand?.purpose, 'Frontend state management');
654
- assert.strictEqual(zustand?.documentation, 'https://zustand-demo.pmnd.rs/');
655
- });
656
- it('should return undefined when dependencies missing', () => {
657
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
658
- assert.strictEqual(result.success, true);
659
- assert.strictEqual(result.context?.externalDependencies, undefined);
660
- });
661
- });
662
- describe('Environment Setup section', () => {
663
- it('should extract environment setup when present', () => {
664
- const result = parseBmadContext(COMPLETE_CONTEXT);
665
- assert.strictEqual(result.success, true);
666
- assert.ok(result.context?.environmentSetup);
667
- assert.ok(result.context?.environmentSetup?.includes('Install dependencies'));
668
- assert.ok(result.context?.environmentSetup?.includes('docker-compose'));
669
- });
670
- it('should return undefined when environment setup missing', () => {
671
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
672
- assert.strictEqual(result.success, true);
673
- assert.strictEqual(result.context?.environmentSetup, undefined);
674
- });
675
- });
676
- describe('CLAUDE.md compatibility', () => {
677
- it('should not conflict with CLAUDE.md section names', () => {
678
- // CLAUDE.md uses sections like "## Build Commands", "## Architecture"
679
- // Our context reader should ignore these and focus on BMAD sections
680
- const context = `# Project Context
681
-
682
- ## Overview
683
- Test project.
684
-
685
- ## Build Commands
686
- This section should be ignored - it's CLAUDE.md format.
687
-
688
- ## Technology Stack
689
-
690
- ### Frontend
691
- - **Framework:** React
692
-
693
- ## Critical Implementation Rules
694
-
695
- 1. **Rule:** Description.
696
- `;
697
- const result = parseBmadContext(context);
698
- assert.strictEqual(result.success, true);
699
- // Should not have "Build Commands" as a recognized section
700
- assert.ok(result.context);
701
- });
702
- it('should parse context independently of CLAUDE.md', () => {
703
- // The parser should work on project-context.md content alone
704
- // without requiring CLAUDE.md to be present
705
- const result = parseBmadContext(MINIMAL_VALID_CONTEXT);
706
- assert.strictEqual(result.success, true);
707
- assert.ok(result.context);
708
- });
709
- });
710
- });
711
- // ===========================================================================
712
- // Edge cases and error handling
713
- // ===========================================================================
714
- describe('Edge cases and error handling', () => {
715
- it('should handle Windows line endings (CRLF)', () => {
716
- const context = '# Project Context\r\n\r\n## Overview\r\nTest project.\r\n\r\n## Technology Stack\r\n\r\n### Frontend\r\n- **Framework:** React\r\n\r\n## Critical Implementation Rules\r\n\r\n1. **Rule:** Description.\r\n';
717
- const result = parseBmadContext(context);
718
- assert.strictEqual(result.success, true);
719
- assert.strictEqual(result.context?.technologyStack.frontend?.framework, 'React');
720
- });
721
- it('should handle extra blank lines between sections', () => {
722
- const context = `# Project Context
723
-
724
-
725
-
726
- ## Overview
727
-
728
- Test project.
729
-
730
-
731
-
732
- ## Technology Stack
733
-
734
-
735
- ### Frontend
736
- - **Framework:** React
737
-
738
-
739
-
740
- ## Critical Implementation Rules
741
-
742
-
743
- 1. **Rule:** Description.
744
-
745
- `;
746
- const result = parseBmadContext(context);
747
- assert.strictEqual(result.success, true);
748
- });
749
- it('should handle section headers with extra spaces', () => {
750
- const context = `# Project Context
751
-
752
- ## Overview
753
- Test project.
754
-
755
- ## Technology Stack
756
-
757
- ### Frontend
758
- - **Framework:** React
759
-
760
- ## Critical Implementation Rules
761
-
762
- 1. **Rule:** Description.
763
- `;
764
- const result = parseBmadContext(context);
765
- assert.strictEqual(result.success, true);
766
- });
767
- it('should handle missing H1 header gracefully', () => {
768
- const context = `## Overview
769
- Test project without H1.
770
-
771
- ## Technology Stack
772
-
773
- ### Frontend
774
- - **Framework:** React
775
-
776
- ## Critical Implementation Rules
777
-
778
- 1. **Rule:** Description.
779
- `;
780
- const result = parseBmadContext(context);
781
- // Should still parse - H1 is just a title
782
- assert.strictEqual(result.success, true);
783
- });
784
- it('should handle technology fields with colons in values', () => {
785
- const context = `# Project Context
786
-
787
- ## Overview
788
- Test project.
789
-
790
- ## Technology Stack
791
-
792
- ### Frontend
793
- - **Framework:** React: The Modern Way
794
- - **Language:** TypeScript: Strict Mode
795
-
796
- ## Critical Implementation Rules
797
-
798
- 1. **Rule:** Description.
799
- `;
800
- const result = parseBmadContext(context);
801
- assert.strictEqual(result.success, true);
802
- assert.strictEqual(result.context?.technologyStack.frontend?.framework, 'React: The Modern Way');
803
- });
804
- it('should handle empty Technology Stack section', () => {
805
- const context = `# Project Context
806
-
807
- ## Overview
808
- Test project.
809
-
810
- ## Technology Stack
811
-
812
- ## Critical Implementation Rules
813
-
814
- 1. **Rule:** Description.
815
- `;
816
- const result = parseBmadContext(context);
817
- // Empty Technology Stack should result in empty object, not error
818
- assert.strictEqual(result.success, true);
819
- assert.ok(result.context?.technologyStack);
820
- });
821
- it('should handle rules without bold title format', () => {
822
- const context = `# Project Context
823
-
824
- ## Overview
825
- Test project.
826
-
827
- ## Technology Stack
828
-
829
- ### Frontend
830
- - **Framework:** React
831
-
832
- ## Critical Implementation Rules
833
-
834
- 1. Simple Rule: This rule has no bold formatting.
835
- 2. Another Rule: Also without bold.
836
- `;
837
- const result = parseBmadContext(context);
838
- assert.strictEqual(result.success, true);
839
- // Should still parse rules even without bold
840
- assert.ok(result.context && result.context.implementationRules.length >= 2);
841
- });
842
- it('should handle markdown code blocks in content', () => {
843
- const context = `# Project Context
844
-
845
- ## Overview
846
- Test project with code.
847
-
848
- ## Technology Stack
849
-
850
- ### Frontend
851
- - **Framework:** React
852
-
853
- ## Critical Implementation Rules
854
-
855
- 1. **Code Rule:** Use this pattern:
856
- \`\`\`typescript
857
- const x = 1;
858
- \`\`\`
859
- `;
860
- const result = parseBmadContext(context);
861
- assert.strictEqual(result.success, true);
862
- assert.ok(result.context?.implementationRules[0]?.description.includes('pattern'));
863
- });
864
- it('should handle content with no matching sections', () => {
865
- const context = `# Random Document
866
-
867
- This is not a BMAD project context file.
868
-
869
- ## Some Random Section
870
- Content here.
871
- `;
872
- const result = parseBmadContext(context);
873
- assert.strictEqual(result.success, false);
874
- assert.ok(result.errors && result.errors.length > 0);
875
- });
876
- });
877
- });
878
- //# sourceMappingURL=context-reader.test.js.map