@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,338 +0,0 @@
1
- /**
2
- * OCEAN Spider Chart Generator
3
- *
4
- * Story 11-10: Build OCEAN spider chart generator (complement to Chernoff faces)
5
- *
6
- * Generates pentagon-shaped spider charts showing OCEAN personality profiles.
7
- * Charts are unfilled (stroke only) to enable clean stacking for comparisons.
8
- */
9
- import { readFileSync } from 'fs';
10
- import { join, dirname } from 'path';
11
- import { fileURLToPath } from 'url';
12
- import { parse as parseYaml } from 'yaml';
13
- import { findMonorepoRoot } from '../cli/utils/files.js';
14
- const __filename = fileURLToPath(import.meta.url);
15
- const __dirname = dirname(__filename);
16
- // Find monorepo root by walking up from current directory
17
- const projectRoot = findMonorepoRoot(__dirname);
18
- const themesDir = join(projectRoot, 'pennyfarthing-dist', 'personas', 'themes');
19
- /**
20
- * Load OCEAN scores for a specific theme and agent
21
- */
22
- export function loadThemeOcean(theme, agent) {
23
- const themePath = join(themesDir, `${theme}.yaml`);
24
- const content = readFileSync(themePath, 'utf-8');
25
- const data = parseYaml(content);
26
- const agents = data.agents;
27
- if (!agents || !agents[agent]) {
28
- return { O: 3, C: 3, E: 3, A: 3, N: 3 }; // Default neutral scores
29
- }
30
- const ocean = agents[agent].ocean;
31
- return ocean || { O: 3, C: 3, E: 3, A: 3, N: 3 };
32
- }
33
- // Chart configuration
34
- const VIEW_SIZE = 200;
35
- const CENTER_X = VIEW_SIZE / 2;
36
- const CENTER_Y = VIEW_SIZE / 2 + 8; // Shifted down to balance top/bottom margins
37
- const OUTER_RADIUS = 70; // Leaves room for labels
38
- const LABEL_RADIUS = OUTER_RADIUS + 18;
39
- // OCEAN dimension order (clockwise from top)
40
- const DIMENSIONS = ['O', 'C', 'E', 'A', 'N'];
41
- const DIMENSION_LABELS = {
42
- O: 'O',
43
- C: 'C',
44
- E: 'E',
45
- A: 'A',
46
- N: 'N',
47
- };
48
- // Role-specific colors (consistent across all charts for visual training)
49
- export const ROLE_COLORS = {
50
- orchestrator: '#f59e0b', // Amber
51
- sm: '#10b981', // Emerald
52
- tea: '#ef4444', // Red
53
- dev: '#3b82f6', // Blue
54
- reviewer: '#8b5cf6', // Purple
55
- architect: '#06b6d4', // Cyan
56
- pm: '#ec4899', // Pink
57
- 'tech-writer': '#84cc16', // Lime
58
- 'ux-designer': '#f97316', // Orange
59
- devops: '#6366f1', // Indigo
60
- };
61
- // Legacy overlay colors (for arbitrary comparisons)
62
- const OVERLAY_COLORS = [
63
- '#2563eb', // Blue
64
- '#dc2626', // Red
65
- '#16a34a', // Green
66
- '#9333ea', // Purple
67
- '#ea580c', // Orange
68
- ];
69
- // Background and styling (dark theme for consistent rendering)
70
- const BACKGROUND_COLOR = '#000000';
71
- const GRID_COLOR = '#374151';
72
- const AXIS_COLOR = '#4b5563';
73
- const LABEL_COLOR = '#e5e7eb';
74
- const DATA_STROKE_WIDTH = 2;
75
- const GRID_STROKE_WIDTH = 1;
76
- /**
77
- * Calculate point on pentagon for given dimension and score
78
- * @param dimensionIndex - Index 0-4 for O, C, E, A, N
79
- * @param score - Score 1-5
80
- * @param radius - Base radius to use
81
- */
82
- function getPoint(dimensionIndex, score, radius) {
83
- // Start from top (-90°), go clockwise
84
- // Each vertex is 72° apart (360° / 5)
85
- const angle = ((dimensionIndex * 72 - 90) * Math.PI) / 180;
86
- // Map score 1-5 to 20%-100% of radius
87
- const normalizedScore = 0.2 + ((score - 1) / 4) * 0.8;
88
- const r = radius * normalizedScore;
89
- return {
90
- x: CENTER_X + r * Math.cos(angle),
91
- y: CENTER_Y + r * Math.sin(angle),
92
- };
93
- }
94
- /**
95
- * Get vertex position (at full radius) for a dimension
96
- */
97
- function getVertex(dimensionIndex) {
98
- const angle = ((dimensionIndex * 72 - 90) * Math.PI) / 180;
99
- return {
100
- x: CENTER_X + OUTER_RADIUS * Math.cos(angle),
101
- y: CENTER_Y + OUTER_RADIUS * Math.sin(angle),
102
- };
103
- }
104
- /**
105
- * Get label position (outside the pentagon)
106
- */
107
- function getLabelPosition(dimensionIndex) {
108
- const angle = ((dimensionIndex * 72 - 90) * Math.PI) / 180;
109
- const x = CENTER_X + LABEL_RADIUS * Math.cos(angle);
110
- const y = CENTER_Y + LABEL_RADIUS * Math.sin(angle);
111
- // Text anchor depends on position
112
- let anchor = 'middle';
113
- if (dimensionIndex === 1 || dimensionIndex === 2)
114
- anchor = 'start'; // Right side
115
- if (dimensionIndex === 3 || dimensionIndex === 4)
116
- anchor = 'end'; // Left side
117
- return { x, y, anchor };
118
- }
119
- /**
120
- * Generate grid pentagon at a specific scale
121
- */
122
- function generateGridPolygon(scale) {
123
- const points = DIMENSIONS.map((_, i) => {
124
- const angle = ((i * 72 - 90) * Math.PI) / 180;
125
- const r = OUTER_RADIUS * scale;
126
- const x = CENTER_X + r * Math.cos(angle);
127
- const y = CENTER_Y + r * Math.sin(angle);
128
- return `${x.toFixed(1)},${y.toFixed(1)}`;
129
- }).join(' ');
130
- return `<polygon points="${points}" fill="none" stroke="${GRID_COLOR}" stroke-width="${GRID_STROKE_WIDTH}" />`;
131
- }
132
- /**
133
- * Generate axis line from center to vertex
134
- */
135
- function generateAxisLine(dimensionIndex) {
136
- const vertex = getVertex(dimensionIndex);
137
- return `<line x1="${CENTER_X}" y1="${CENTER_Y}" x2="${vertex.x.toFixed(1)}" y2="${vertex.y.toFixed(1)}" stroke="${AXIS_COLOR}" stroke-width="${GRID_STROKE_WIDTH}" />`;
138
- }
139
- /**
140
- * Generate dimension label
141
- */
142
- function generateLabel(dimensionIndex) {
143
- const pos = getLabelPosition(dimensionIndex);
144
- const label = DIMENSION_LABELS[DIMENSIONS[dimensionIndex]];
145
- // Adjust y for vertical centering
146
- const yOffset = dimensionIndex === 0 ? -4 : dimensionIndex === 2 || dimensionIndex === 3 ? 4 : 0;
147
- return `<text x="${pos.x.toFixed(1)}" y="${(pos.y + yOffset).toFixed(1)}" text-anchor="${pos.anchor}" font-family="sans-serif" font-size="12" font-weight="bold" fill="${LABEL_COLOR}">${label}</text>`;
148
- }
149
- /**
150
- * Generate data polygon from OCEAN scores
151
- */
152
- function generateDataPolygon(ocean, color = '#2563eb', strokeWidth = DATA_STROKE_WIDTH) {
153
- const points = DIMENSIONS.map((dim, i) => {
154
- const point = getPoint(i, ocean[dim], OUTER_RADIUS);
155
- return `${point.x.toFixed(1)},${point.y.toFixed(1)}`;
156
- }).join(' ');
157
- return `<polygon points="${points}" fill="none" stroke="${color}" stroke-width="${strokeWidth}" stroke-linejoin="round" />`;
158
- }
159
- /**
160
- * Generate SVG spider chart from OCEAN scores
161
- */
162
- export function generateSpiderFromOcean(ocean, color = '#2563eb') {
163
- // Grid pentagons at 20%, 40%, 60%, 80%, 100%
164
- const gridPolygons = [0.2, 0.4, 0.6, 0.8, 1.0]
165
- .map((scale) => generateGridPolygon(scale))
166
- .join('\n ');
167
- // Axis lines
168
- const axisLines = DIMENSIONS.map((_, i) => generateAxisLine(i)).join('\n ');
169
- // Dimension labels
170
- const labels = DIMENSIONS.map((_, i) => generateLabel(i)).join('\n ');
171
- // Data polygon
172
- const dataPolygon = generateDataPolygon(ocean, color);
173
- return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${VIEW_SIZE} ${VIEW_SIZE}">
174
- <!-- Background -->
175
- <rect width="${VIEW_SIZE}" height="${VIEW_SIZE}" fill="${BACKGROUND_COLOR}" />
176
-
177
- <!-- Grid -->
178
- ${gridPolygons}
179
-
180
- <!-- Axes -->
181
- ${axisLines}
182
-
183
- <!-- Data -->
184
- ${dataPolygon}
185
-
186
- <!-- Labels -->
187
- ${labels}
188
- </svg>`;
189
- }
190
- /**
191
- * Generate SVG spider chart from theme and agent
192
- * Uses role-specific color for consistent visual training
193
- */
194
- export function generateSpider(theme, agent) {
195
- const ocean = loadThemeOcean(theme, agent);
196
- const color = ROLE_COLORS[agent] || '#2563eb';
197
- return generateSpiderFromOcean(ocean, color);
198
- }
199
- /**
200
- * Format theme name for display
201
- */
202
- function formatThemeName(theme) {
203
- return theme
204
- .split('-')
205
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
206
- .join(' ');
207
- }
208
- /**
209
- * Generate legend item
210
- */
211
- function generateLegendItem(index, label, color, yOffset) {
212
- const x = 10;
213
- const y = VIEW_SIZE - 10 - yOffset;
214
- return `<rect x="${x}" y="${y - 8}" width="12" height="12" fill="none" stroke="${color}" stroke-width="2" />
215
- <text x="${x + 16}" y="${y}" font-family="sans-serif" font-size="10" fill="${LABEL_COLOR}">${label}</text>`;
216
- }
217
- /**
218
- * Generate overlay spider chart comparing multiple characters
219
- */
220
- export function generateOverlaySpider(characters) {
221
- // Grid pentagons
222
- const gridPolygons = [0.2, 0.4, 0.6, 0.8, 1.0]
223
- .map((scale) => generateGridPolygon(scale))
224
- .join('\n ');
225
- // Axis lines
226
- const axisLines = DIMENSIONS.map((_, i) => generateAxisLine(i)).join('\n ');
227
- // Dimension labels
228
- const labels = DIMENSIONS.map((_, i) => generateLabel(i)).join('\n ');
229
- // Data polygons for each character
230
- const dataPolygons = characters
231
- .map((char, index) => {
232
- const ocean = loadThemeOcean(char.theme, char.agent);
233
- const color = OVERLAY_COLORS[index % OVERLAY_COLORS.length];
234
- return generateDataPolygon(ocean, color);
235
- })
236
- .join('\n ');
237
- // Legend items
238
- const legendItems = characters
239
- .map((char, index) => {
240
- const color = OVERLAY_COLORS[index % OVERLAY_COLORS.length];
241
- const label = char.label || `${formatThemeName(char.theme)} (${char.agent})`;
242
- const yOffset = (characters.length - 1 - index) * 16;
243
- return generateLegendItem(index, label, color, yOffset);
244
- })
245
- .join('\n ');
246
- return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${VIEW_SIZE} ${VIEW_SIZE}">
247
- <!-- Background -->
248
- <rect width="${VIEW_SIZE}" height="${VIEW_SIZE}" fill="${BACKGROUND_COLOR}" />
249
-
250
- <!-- Grid -->
251
- ${gridPolygons}
252
-
253
- <!-- Axes -->
254
- ${axisLines}
255
-
256
- <!-- Data -->
257
- ${dataPolygons}
258
-
259
- <!-- Labels -->
260
- ${labels}
261
-
262
- <!-- Legend -->
263
- ${legendItems}
264
- </svg>`;
265
- }
266
- // Agent order for team overlay (matches AGENTS in generate-all-spiders.ts)
267
- const TEAM_AGENTS = [
268
- 'orchestrator',
269
- 'sm',
270
- 'tea',
271
- 'dev',
272
- 'reviewer',
273
- 'architect',
274
- 'pm',
275
- 'tech-writer',
276
- 'ux-designer',
277
- 'devops',
278
- ];
279
- // Human-readable agent names for legend (reserved for future use)
280
- const _AGENT_DISPLAY_NAMES = {
281
- orchestrator: 'Orch',
282
- sm: 'SM',
283
- tea: 'TEA',
284
- dev: 'Dev',
285
- reviewer: 'Rev',
286
- architect: 'Arch',
287
- pm: 'PM',
288
- 'tech-writer': 'TW',
289
- 'ux-designer': 'UX',
290
- devops: 'Ops',
291
- };
292
- // Tactical agents get emphasized (thicker stroke) in team overlays
293
- const TACTICAL_AGENTS = new Set(['sm', 'tea', 'dev', 'reviewer']);
294
- const TACTICAL_STROKE_WIDTH = 2.5;
295
- const STRATEGIC_STROKE_WIDTH = 1;
296
- /**
297
- * Generate team overlay spider chart showing all 10 agents for a theme
298
- * Uses role-specific colors for consistent visual training
299
- */
300
- export function generateTeamOverlay(theme) {
301
- // Grid pentagons
302
- const gridPolygons = [0.2, 0.4, 0.6, 0.8, 1.0]
303
- .map((scale) => generateGridPolygon(scale))
304
- .join('\n ');
305
- // Axis lines
306
- const axisLines = TEAM_AGENTS.slice(0, 5)
307
- .map((_, i) => generateAxisLine(i))
308
- .join('\n ');
309
- // Dimension labels
310
- const labels = DIMENSIONS.map((_, i) => generateLabel(i)).join('\n ');
311
- // Data polygons for each agent (using role colors)
312
- // Tactical agents (sm, tea, dev, reviewer) emphasized with thicker strokes
313
- // Strategic/support agents de-emphasized with thinner strokes
314
- const dataPolygons = TEAM_AGENTS.map((agent) => {
315
- const ocean = loadThemeOcean(theme, agent);
316
- const color = ROLE_COLORS[agent];
317
- const strokeWidth = TACTICAL_AGENTS.has(agent) ? TACTICAL_STROKE_WIDTH : STRATEGIC_STROKE_WIDTH;
318
- return generateDataPolygon(ocean, color, strokeWidth);
319
- }).join('\n ');
320
- // Legend removed - color key is in markdown header
321
- return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${VIEW_SIZE} ${VIEW_SIZE}">
322
- <!-- Background -->
323
- <rect width="${VIEW_SIZE}" height="${VIEW_SIZE}" fill="${BACKGROUND_COLOR}" />
324
-
325
- <!-- Grid -->
326
- ${gridPolygons}
327
-
328
- <!-- Axes -->
329
- ${axisLines}
330
-
331
- <!-- Data -->
332
- ${dataPolygons}
333
-
334
- <!-- Labels -->
335
- ${labels}
336
- </svg>`;
337
- }
338
- //# sourceMappingURL=generate-spider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-spider.js","sourceRoot":"","sources":["../../src/scripts/generate-spider.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Tests for Story 11-10: Build OCEAN Spider Chart Generator
3
- *
4
- * These tests verify:
5
- * AC1: scripts/generate-spider.ts functional (module exists and exports work)
6
- * AC2: Takes theme + agent as input, outputs SVG
7
- * AC3: Spider charts clearly show all 5 OCEAN dimensions
8
- * AC4: Overlay mode compares 2-3 characters on same chart
9
- * AC5: SVGs render correctly in browsers and markdown (valid SVG structure)
10
- *
11
- * Run with: npm test
12
- */
13
- export {};
14
- //# sourceMappingURL=generate-spider.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-spider.test.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-spider.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -1,271 +0,0 @@
1
- /**
2
- * Tests for Story 11-10: Build OCEAN Spider Chart Generator
3
- *
4
- * These tests verify:
5
- * AC1: scripts/generate-spider.ts functional (module exists and exports work)
6
- * AC2: Takes theme + agent as input, outputs SVG
7
- * AC3: Spider charts clearly show all 5 OCEAN dimensions
8
- * AC4: Overlay mode compares 2-3 characters on same chart
9
- * AC5: SVGs render correctly in browsers and markdown (valid SVG structure)
10
- *
11
- * Run with: npm test
12
- */
13
- import { describe, it } from 'node:test';
14
- import assert from 'node:assert';
15
- // ============================================================================
16
- // AC1: scripts/generate-spider.ts functional
17
- // ============================================================================
18
- describe('AC1: Spider Chart Module Exists and Exports', () => {
19
- it('should export generateSpider function', async () => {
20
- const module = await import('./generate-spider.js');
21
- assert.ok(typeof module.generateSpider === 'function', 'generateSpider should be a function');
22
- });
23
- it('should export generateSpiderFromOcean function for direct OCEAN input', async () => {
24
- const module = await import('./generate-spider.js');
25
- assert.ok(typeof module.generateSpiderFromOcean === 'function', 'generateSpiderFromOcean should be a function');
26
- });
27
- it('should export generateOverlaySpider function for comparison mode', async () => {
28
- const module = await import('./generate-spider.js');
29
- assert.ok(typeof module.generateOverlaySpider === 'function', 'generateOverlaySpider should be a function');
30
- });
31
- });
32
- // ============================================================================
33
- // AC2: Takes theme + agent as input, outputs SVG
34
- // ============================================================================
35
- describe('AC2: Theme + Agent Input -> SVG Output', () => {
36
- it('should generate SVG string from theme and agent', async () => {
37
- const { generateSpider } = await import('./generate-spider.js');
38
- const svg = generateSpider('deadwood', 'sm');
39
- assert.ok(typeof svg === 'string', 'Should return string');
40
- assert.ok(svg.includes('<svg'), 'Should contain SVG opening tag');
41
- assert.ok(svg.includes('</svg>'), 'Should contain SVG closing tag');
42
- });
43
- it('should work for all 10 agent roles', async () => {
44
- const { generateSpider } = await import('./generate-spider.js');
45
- const roles = [
46
- 'orchestrator',
47
- 'sm',
48
- 'tea',
49
- 'dev',
50
- 'reviewer',
51
- 'architect',
52
- 'pm',
53
- 'tech-writer',
54
- 'ux-designer',
55
- 'devops',
56
- ];
57
- for (const role of roles) {
58
- const svg = generateSpider('deadwood', role);
59
- assert.ok(svg.includes('<svg'), `Should generate SVG for ${role}`);
60
- }
61
- });
62
- it('should throw ENOENT for non-existent theme', async () => {
63
- const { generateSpider } = await import('./generate-spider.js');
64
- assert.throws(() => generateSpider('nonexistent-theme', 'sm'), /ENOENT/, 'Should throw ENOENT for missing theme file');
65
- });
66
- it('should return default OCEAN scores for non-existent agent', async () => {
67
- const { generateSpider } = await import('./generate-spider.js');
68
- // Non-existent agents get default neutral scores (3,3,3,3,3) rather than error
69
- const svg = generateSpider('deadwood', 'nonexistent-agent');
70
- assert.ok(svg.includes('<svg'), 'Should generate SVG with default scores');
71
- });
72
- it('should accept OCEAN scores directly via generateSpiderFromOcean', async () => {
73
- const { generateSpiderFromOcean } = await import('./generate-spider.js');
74
- const svg = generateSpiderFromOcean({ O: 3, C: 4, E: 2, A: 5, N: 1 });
75
- assert.ok(typeof svg === 'string', 'Should return string');
76
- assert.ok(svg.includes('<svg'), 'Should contain SVG opening tag');
77
- });
78
- });
79
- // ============================================================================
80
- // AC3: Spider charts clearly show all 5 OCEAN dimensions
81
- // ============================================================================
82
- describe('AC3: Pentagon Structure with 5 OCEAN Dimensions', () => {
83
- it('should generate a polygon element for the data', async () => {
84
- const { generateSpider } = await import('./generate-spider.js');
85
- const svg = generateSpider('deadwood', 'sm');
86
- assert.ok(svg.includes('<polygon') || svg.includes('<path'), 'Should contain polygon or path element for data shape');
87
- });
88
- it('should label all 5 OCEAN dimensions', async () => {
89
- const { generateSpider } = await import('./generate-spider.js');
90
- const svg = generateSpider('deadwood', 'sm');
91
- // Check for dimension labels (as text elements or in comments)
92
- const hasO = svg.includes('>O<') || svg.includes('"O"') || svg.includes('Openness');
93
- const hasC = svg.includes('>C<') || svg.includes('"C"') || svg.includes('Conscientiousness');
94
- const hasE = svg.includes('>E<') || svg.includes('"E"') || svg.includes('Extraversion');
95
- const hasA = svg.includes('>A<') || svg.includes('"A"') || svg.includes('Agreeableness');
96
- const hasN = svg.includes('>N<') || svg.includes('"N"') || svg.includes('Neuroticism');
97
- assert.ok(hasO, 'Should label Openness dimension');
98
- assert.ok(hasC, 'Should label Conscientiousness dimension');
99
- assert.ok(hasE, 'Should label Extraversion dimension');
100
- assert.ok(hasA, 'Should label Agreeableness dimension');
101
- assert.ok(hasN, 'Should label Neuroticism dimension');
102
- });
103
- it('should include grid lines for reference (5 levels)', async () => {
104
- const { generateSpider } = await import('./generate-spider.js');
105
- const svg = generateSpider('deadwood', 'sm');
106
- // Grid lines create concentric pentagons
107
- // Count polygon/path elements - should have at least 5 for grid + 1 for data
108
- const polygonCount = (svg.match(/<polygon/g) || []).length;
109
- const pathCount = (svg.match(/<path/g) || []).length;
110
- // Grid could be polygons or paths - at minimum should have grid structure
111
- assert.ok(polygonCount >= 1 || pathCount >= 5, 'Should have grid lines (pentagons or paths for 5 levels)');
112
- });
113
- it('should have 5 axis lines from center to vertices', async () => {
114
- const { generateSpider } = await import('./generate-spider.js');
115
- const svg = generateSpider('deadwood', 'sm');
116
- // Axis lines are typically <line> elements
117
- const lineCount = (svg.match(/<line/g) || []).length;
118
- assert.ok(lineCount >= 5, `Should have at least 5 axis lines, found ${lineCount}`);
119
- });
120
- it('should use unfilled polygon (stroke only, no fill)', async () => {
121
- const { generateSpider } = await import('./generate-spider.js');
122
- const svg = generateSpider('deadwood', 'sm');
123
- // The data polygon should have fill="none" or no fill
124
- // Looking for the data polygon specifically (not grid lines)
125
- assert.ok(svg.includes('fill="none"') || !svg.includes('fill="'), 'Data polygon should be unfilled (stroke only)');
126
- });
127
- it('should map score 1 to 20% radius and score 5 to 100% radius', async () => {
128
- const { generateSpiderFromOcean } = await import('./generate-spider.js');
129
- // Generate with all 1s - polygon should be small (inner)
130
- const small = generateSpiderFromOcean({ O: 1, C: 1, E: 1, A: 1, N: 1 });
131
- // Generate with all 5s - polygon should be large (outer)
132
- const large = generateSpiderFromOcean({ O: 5, C: 5, E: 5, A: 5, N: 5 });
133
- // SVGs should be different (different polygon sizes)
134
- assert.notStrictEqual(small, large, 'Score 1-1-1-1-1 and 5-5-5-5-5 should produce different polygons');
135
- });
136
- });
137
- // ============================================================================
138
- // AC4: Overlay mode compares 2-3 characters on same chart
139
- // ============================================================================
140
- describe('AC4: Overlay Mode for Character Comparison', () => {
141
- it('should accept array of theme+agent pairs for overlay', async () => {
142
- const { generateOverlaySpider } = await import('./generate-spider.js');
143
- const svg = generateOverlaySpider([
144
- { theme: 'deadwood', agent: 'sm' },
145
- { theme: 'firefly', agent: 'sm' },
146
- ]);
147
- assert.ok(typeof svg === 'string', 'Should return string');
148
- assert.ok(svg.includes('<svg'), 'Should contain SVG');
149
- });
150
- it('should render 2 distinct polygons for 2 characters', async () => {
151
- const { generateOverlaySpider } = await import('./generate-spider.js');
152
- const svg = generateOverlaySpider([
153
- { theme: 'deadwood', agent: 'sm' },
154
- { theme: 'firefly', agent: 'sm' },
155
- ]);
156
- // Count data polygons (excluding grid)
157
- // Grid lines typically have a specific class or lighter stroke
158
- const polygonMatches = svg.match(/<polygon[^>]*>/g) || [];
159
- const pathMatches = svg.match(/<path[^>]*d="M[^"]*"[^>]*>/g) || [];
160
- // Should have at least 2 data shapes
161
- assert.ok(polygonMatches.length >= 2 || pathMatches.length >= 2, 'Should have at least 2 data polygons for comparison');
162
- });
163
- it('should render 3 distinct polygons for 3 characters', async () => {
164
- const { generateOverlaySpider } = await import('./generate-spider.js');
165
- const svg = generateOverlaySpider([
166
- { theme: 'deadwood', agent: 'sm' },
167
- { theme: 'firefly', agent: 'sm' },
168
- { theme: 'star-trek-tng', agent: 'sm' },
169
- ]);
170
- // Should have at least 3 data shapes
171
- const polygonMatches = svg.match(/<polygon[^>]*>/g) || [];
172
- const pathMatches = svg.match(/<path[^>]*d="M[^"]*"[^>]*>/g) || [];
173
- assert.ok(polygonMatches.length >= 3 || pathMatches.length >= 3, 'Should have at least 3 data polygons for comparison');
174
- });
175
- it('should use different stroke colors for each character', async () => {
176
- const { generateOverlaySpider } = await import('./generate-spider.js');
177
- const svg = generateOverlaySpider([
178
- { theme: 'deadwood', agent: 'sm' },
179
- { theme: 'firefly', agent: 'sm' },
180
- ]);
181
- // Extract stroke colors - should find at least 2 different colors
182
- const strokeColors = svg.match(/stroke="([^"]+)"/g) || [];
183
- const uniqueColors = new Set(strokeColors);
184
- assert.ok(uniqueColors.size >= 2, 'Should use different stroke colors for different characters');
185
- });
186
- it('should include legend identifying each character', async () => {
187
- const { generateOverlaySpider } = await import('./generate-spider.js');
188
- const svg = generateOverlaySpider([
189
- { theme: 'deadwood', agent: 'sm' },
190
- { theme: 'firefly', agent: 'sm' },
191
- ]);
192
- // Legend should include theme or character names
193
- assert.ok(svg.includes('deadwood') || svg.includes('Deadwood') ||
194
- svg.includes('firefly') || svg.includes('Firefly'), 'Should include legend with theme/character names');
195
- });
196
- it('should accept optional labels for overlay characters', async () => {
197
- const { generateOverlaySpider } = await import('./generate-spider.js');
198
- const svg = generateOverlaySpider([
199
- { theme: 'deadwood', agent: 'sm', label: 'Al Swearengen' },
200
- { theme: 'firefly', agent: 'sm', label: 'Mal Reynolds' },
201
- ]);
202
- assert.ok(svg.includes('Al Swearengen') || svg.includes('Mal Reynolds'), 'Should display custom labels when provided');
203
- });
204
- });
205
- // ============================================================================
206
- // AC5: SVGs render correctly in browsers and markdown
207
- // ============================================================================
208
- describe('AC5: Valid SVG Structure', () => {
209
- it('should include viewBox attribute for scaling', async () => {
210
- const { generateSpider } = await import('./generate-spider.js');
211
- const svg = generateSpider('deadwood', 'sm');
212
- assert.ok(svg.includes('viewBox='), 'Should have viewBox attribute for proper scaling');
213
- });
214
- it('should include xmlns attribute for browser compatibility', async () => {
215
- const { generateSpider } = await import('./generate-spider.js');
216
- const svg = generateSpider('deadwood', 'sm');
217
- assert.ok(svg.includes('xmlns="http://www.w3.org/2000/svg"'), 'Should have SVG xmlns for browser rendering');
218
- });
219
- it('should be well-formed XML', async () => {
220
- const { generateSpider } = await import('./generate-spider.js');
221
- const svg = generateSpider('deadwood', 'sm');
222
- assert.ok(svg.startsWith('<svg'), 'Should start with <svg');
223
- assert.ok(svg.endsWith('</svg>'), 'Should end with </svg>');
224
- });
225
- it('should use text elements for dimension labels', async () => {
226
- const { generateSpider } = await import('./generate-spider.js');
227
- const svg = generateSpider('deadwood', 'sm');
228
- const textCount = (svg.match(/<text/g) || []).length;
229
- assert.ok(textCount >= 5, `Should have at least 5 text elements for labels, found ${textCount}`);
230
- });
231
- it('should have consistent stroke styling', async () => {
232
- const { generateSpider } = await import('./generate-spider.js');
233
- const svg = generateSpider('deadwood', 'sm');
234
- assert.ok(svg.includes('stroke='), 'Should use stroke for lines');
235
- assert.ok(svg.includes('stroke-width'), 'Should specify stroke-width');
236
- });
237
- it('should use 200x200 viewBox like face generator', async () => {
238
- const { generateSpider } = await import('./generate-spider.js');
239
- const svg = generateSpider('deadwood', 'sm');
240
- assert.ok(svg.includes('viewBox="0 0 200 200"'), 'Should use 200x200 viewBox for consistency with face generator');
241
- });
242
- });
243
- // ============================================================================
244
- // Integration: Full Pipeline Test
245
- // ============================================================================
246
- describe('Integration: Spider Chart Generation Pipeline', () => {
247
- it('should generate valid SVG for multiple themes', async () => {
248
- const { generateSpider } = await import('./generate-spider.js');
249
- const themes = ['deadwood', 'firefly', 'star-trek-tng', 'discworld'];
250
- for (const theme of themes) {
251
- const svg = generateSpider(theme, 'sm');
252
- assert.ok(svg.includes('<svg') && svg.includes('</svg>'), `Should generate valid SVG for ${theme}`);
253
- }
254
- });
255
- it('should produce visually different charts for different OCEAN profiles', async () => {
256
- const { generateSpiderFromOcean } = await import('./generate-spider.js');
257
- const introvert = generateSpiderFromOcean({ O: 4, C: 3, E: 1, A: 3, N: 2 });
258
- const extravert = generateSpiderFromOcean({ O: 4, C: 3, E: 5, A: 3, N: 2 });
259
- assert.notStrictEqual(introvert, extravert, 'Different E scores should produce different charts');
260
- });
261
- it('should work with overlay of same agent across themes', async () => {
262
- const { generateOverlaySpider } = await import('./generate-spider.js');
263
- const svg = generateOverlaySpider([
264
- { theme: 'deadwood', agent: 'reviewer' },
265
- { theme: 'firefly', agent: 'reviewer' },
266
- { theme: 'star-trek-tng', agent: 'reviewer' },
267
- ]);
268
- assert.ok(svg.includes('<svg') && svg.includes('</svg>'), 'Should generate valid overlay SVG');
269
- });
270
- });
271
- //# sourceMappingURL=generate-spider.test.js.map