@pennyfarthing/core 6.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/README.md +293 -0
  2. package/package.json +58 -0
  3. package/packages/core/bin/pennyfarthing.js +14 -0
  4. package/packages/core/dist/bmad/context-reader.d.ts +71 -0
  5. package/packages/core/dist/bmad/context-reader.d.ts.map +1 -0
  6. package/packages/core/dist/bmad/context-reader.js +369 -0
  7. package/packages/core/dist/bmad/context-reader.js.map +1 -0
  8. package/packages/core/dist/bmad/context-reader.test.d.ts +71 -0
  9. package/packages/core/dist/bmad/context-reader.test.d.ts.map +1 -0
  10. package/packages/core/dist/bmad/context-reader.test.js +878 -0
  11. package/packages/core/dist/bmad/context-reader.test.js.map +1 -0
  12. package/packages/core/dist/bmad/epics-parser.d.ts +61 -0
  13. package/packages/core/dist/bmad/epics-parser.d.ts.map +1 -0
  14. package/packages/core/dist/bmad/epics-parser.js +331 -0
  15. package/packages/core/dist/bmad/epics-parser.js.map +1 -0
  16. package/packages/core/dist/bmad/epics-parser.test.d.ts +7 -0
  17. package/packages/core/dist/bmad/epics-parser.test.d.ts.map +1 -0
  18. package/packages/core/dist/bmad/epics-parser.test.js +449 -0
  19. package/packages/core/dist/bmad/epics-parser.test.js.map +1 -0
  20. package/packages/core/dist/bmad/index.d.ts +11 -0
  21. package/packages/core/dist/bmad/index.d.ts.map +1 -0
  22. package/packages/core/dist/bmad/index.js +24 -0
  23. package/packages/core/dist/bmad/index.js.map +1 -0
  24. package/packages/core/dist/bmad/status-sync.d.ts +173 -0
  25. package/packages/core/dist/bmad/status-sync.d.ts.map +1 -0
  26. package/packages/core/dist/bmad/status-sync.js +463 -0
  27. package/packages/core/dist/bmad/status-sync.js.map +1 -0
  28. package/packages/core/dist/bmad/status-sync.test.d.ts +7 -0
  29. package/packages/core/dist/bmad/status-sync.test.d.ts.map +1 -0
  30. package/packages/core/dist/bmad/status-sync.test.js +702 -0
  31. package/packages/core/dist/bmad/status-sync.test.js.map +1 -0
  32. package/packages/core/dist/bmad/story-exporter.d.ts +55 -0
  33. package/packages/core/dist/bmad/story-exporter.d.ts.map +1 -0
  34. package/packages/core/dist/bmad/story-exporter.js +170 -0
  35. package/packages/core/dist/bmad/story-exporter.js.map +1 -0
  36. package/packages/core/dist/bmad/story-exporter.test.d.ts +51 -0
  37. package/packages/core/dist/bmad/story-exporter.test.d.ts.map +1 -0
  38. package/packages/core/dist/bmad/story-exporter.test.js +603 -0
  39. package/packages/core/dist/bmad/story-exporter.test.js.map +1 -0
  40. package/packages/core/dist/bmad/story-parser.d.ts +44 -0
  41. package/packages/core/dist/bmad/story-parser.d.ts.map +1 -0
  42. package/packages/core/dist/bmad/story-parser.js +307 -0
  43. package/packages/core/dist/bmad/story-parser.js.map +1 -0
  44. package/packages/core/dist/bmad/story-parser.test.d.ts +44 -0
  45. package/packages/core/dist/bmad/story-parser.test.d.ts.map +1 -0
  46. package/packages/core/dist/bmad/story-parser.test.js +693 -0
  47. package/packages/core/dist/bmad/story-parser.test.js.map +1 -0
  48. package/packages/core/dist/cli/commands/command.d.ts +28 -0
  49. package/packages/core/dist/cli/commands/command.d.ts.map +1 -0
  50. package/packages/core/dist/cli/commands/command.js +399 -0
  51. package/packages/core/dist/cli/commands/command.js.map +1 -0
  52. package/packages/core/dist/cli/commands/cyclist.d.ts +46 -0
  53. package/packages/core/dist/cli/commands/cyclist.d.ts.map +1 -0
  54. package/packages/core/dist/cli/commands/cyclist.js +191 -0
  55. package/packages/core/dist/cli/commands/cyclist.js.map +1 -0
  56. package/packages/core/dist/cli/commands/cyclist.test.d.ts +13 -0
  57. package/packages/core/dist/cli/commands/cyclist.test.d.ts.map +1 -0
  58. package/packages/core/dist/cli/commands/cyclist.test.js +243 -0
  59. package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -0
  60. package/packages/core/dist/cli/commands/doctor.d.ts +9 -0
  61. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -0
  62. package/packages/core/dist/cli/commands/doctor.js +652 -0
  63. package/packages/core/dist/cli/commands/doctor.js.map +1 -0
  64. package/packages/core/dist/cli/commands/init.d.ts +8 -0
  65. package/packages/core/dist/cli/commands/init.d.ts.map +1 -0
  66. package/packages/core/dist/cli/commands/init.js +524 -0
  67. package/packages/core/dist/cli/commands/init.js.map +1 -0
  68. package/packages/core/dist/cli/commands/skill.d.ts +28 -0
  69. package/packages/core/dist/cli/commands/skill.d.ts.map +1 -0
  70. package/packages/core/dist/cli/commands/skill.js +416 -0
  71. package/packages/core/dist/cli/commands/skill.js.map +1 -0
  72. package/packages/core/dist/cli/commands/theme.d.ts +21 -0
  73. package/packages/core/dist/cli/commands/theme.d.ts.map +1 -0
  74. package/packages/core/dist/cli/commands/theme.js +201 -0
  75. package/packages/core/dist/cli/commands/theme.js.map +1 -0
  76. package/packages/core/dist/cli/commands/uninstall.d.ts +8 -0
  77. package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -0
  78. package/packages/core/dist/cli/commands/uninstall.js +237 -0
  79. package/packages/core/dist/cli/commands/uninstall.js.map +1 -0
  80. package/packages/core/dist/cli/commands/update.d.ts +9 -0
  81. package/packages/core/dist/cli/commands/update.d.ts.map +1 -0
  82. package/packages/core/dist/cli/commands/update.js +545 -0
  83. package/packages/core/dist/cli/commands/update.js.map +1 -0
  84. package/packages/core/dist/cli/commands/version.d.ts +2 -0
  85. package/packages/core/dist/cli/commands/version.d.ts.map +1 -0
  86. package/packages/core/dist/cli/commands/version.js +28 -0
  87. package/packages/core/dist/cli/commands/version.js.map +1 -0
  88. package/packages/core/dist/cli/customization.test.d.ts +12 -0
  89. package/packages/core/dist/cli/customization.test.d.ts.map +1 -0
  90. package/packages/core/dist/cli/customization.test.js +84 -0
  91. package/packages/core/dist/cli/customization.test.js.map +1 -0
  92. package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
  93. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
  94. package/packages/core/dist/cli/cyclist-migration.test.js +224 -0
  95. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
  96. package/packages/core/dist/cli/index.d.ts +3 -0
  97. package/packages/core/dist/cli/index.d.ts.map +1 -0
  98. package/packages/core/dist/cli/index.js +174 -0
  99. package/packages/core/dist/cli/index.js.map +1 -0
  100. package/packages/core/dist/cli/ocean-profiles.test.d.ts +13 -0
  101. package/packages/core/dist/cli/ocean-profiles.test.d.ts.map +1 -0
  102. package/packages/core/dist/cli/ocean-profiles.test.js +134 -0
  103. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -0
  104. package/packages/core/dist/cli/theme-maker.test.d.ts +11 -0
  105. package/packages/core/dist/cli/theme-maker.test.d.ts.map +1 -0
  106. package/packages/core/dist/cli/theme-maker.test.js +356 -0
  107. package/packages/core/dist/cli/theme-maker.test.js.map +1 -0
  108. package/packages/core/dist/cli/utils/constants.d.ts +60 -0
  109. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -0
  110. package/packages/core/dist/cli/utils/constants.js +52 -0
  111. package/packages/core/dist/cli/utils/constants.js.map +1 -0
  112. package/packages/core/dist/cli/utils/files.d.ts +71 -0
  113. package/packages/core/dist/cli/utils/files.d.ts.map +1 -0
  114. package/packages/core/dist/cli/utils/files.js +162 -0
  115. package/packages/core/dist/cli/utils/files.js.map +1 -0
  116. package/packages/core/dist/cli/utils/logger.d.ts +26 -0
  117. package/packages/core/dist/cli/utils/logger.d.ts.map +1 -0
  118. package/packages/core/dist/cli/utils/logger.js +88 -0
  119. package/packages/core/dist/cli/utils/logger.js.map +1 -0
  120. package/packages/core/dist/cli/utils/manifest.d.ts +47 -0
  121. package/packages/core/dist/cli/utils/manifest.d.ts.map +1 -0
  122. package/packages/core/dist/cli/utils/manifest.js +90 -0
  123. package/packages/core/dist/cli/utils/manifest.js.map +1 -0
  124. package/packages/core/dist/cli/utils/node-modules.d.ts +6 -0
  125. package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -0
  126. package/packages/core/dist/cli/utils/node-modules.js +22 -0
  127. package/packages/core/dist/cli/utils/node-modules.js.map +1 -0
  128. package/packages/core/dist/cli/utils/prompts.d.ts +34 -0
  129. package/packages/core/dist/cli/utils/prompts.d.ts.map +1 -0
  130. package/packages/core/dist/cli/utils/prompts.js +93 -0
  131. package/packages/core/dist/cli/utils/prompts.js.map +1 -0
  132. package/packages/core/dist/cli/utils/symlinks.d.ts +29 -0
  133. package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -0
  134. package/packages/core/dist/cli/utils/symlinks.js +181 -0
  135. package/packages/core/dist/cli/utils/symlinks.js.map +1 -0
  136. package/packages/core/dist/cli/utils/themes.d.ts +104 -0
  137. package/packages/core/dist/cli/utils/themes.d.ts.map +1 -0
  138. package/packages/core/dist/cli/utils/themes.js +393 -0
  139. package/packages/core/dist/cli/utils/themes.js.map +1 -0
  140. package/packages/core/dist/cli/utils/themes.test.d.ts +12 -0
  141. package/packages/core/dist/cli/utils/themes.test.d.ts.map +1 -0
  142. package/packages/core/dist/cli/utils/themes.test.js +144 -0
  143. package/packages/core/dist/cli/utils/themes.test.js.map +1 -0
  144. package/packages/core/dist/cli/utils/version.d.ts +10 -0
  145. package/packages/core/dist/cli/utils/version.d.ts.map +1 -0
  146. package/packages/core/dist/cli/utils/version.js +63 -0
  147. package/packages/core/dist/cli/utils/version.js.map +1 -0
  148. package/packages/core/dist/cli/workspace.test.d.ts +8 -0
  149. package/packages/core/dist/cli/workspace.test.d.ts.map +1 -0
  150. package/packages/core/dist/cli/workspace.test.js +154 -0
  151. package/packages/core/dist/cli/workspace.test.js.map +1 -0
  152. package/packages/core/dist/index.d.ts +6 -0
  153. package/packages/core/dist/index.d.ts.map +1 -0
  154. package/packages/core/dist/index.js +10 -0
  155. package/packages/core/dist/index.js.map +1 -0
  156. package/packages/core/dist/permissions/index.d.ts +9 -0
  157. package/packages/core/dist/permissions/index.d.ts.map +1 -0
  158. package/packages/core/dist/permissions/index.js +13 -0
  159. package/packages/core/dist/permissions/index.js.map +1 -0
  160. package/packages/core/dist/permissions/permission-schema.d.ts +89 -0
  161. package/packages/core/dist/permissions/permission-schema.d.ts.map +1 -0
  162. package/packages/core/dist/permissions/permission-schema.js +120 -0
  163. package/packages/core/dist/permissions/permission-schema.js.map +1 -0
  164. package/packages/core/dist/permissions/permission-schema.test.d.ts +40 -0
  165. package/packages/core/dist/permissions/permission-schema.test.d.ts.map +1 -0
  166. package/packages/core/dist/permissions/permission-schema.test.js +367 -0
  167. package/packages/core/dist/permissions/permission-schema.test.js.map +1 -0
  168. package/packages/core/dist/scripts/add-ocean-profiles.d.ts +9 -0
  169. package/packages/core/dist/scripts/add-ocean-profiles.d.ts.map +1 -0
  170. package/packages/core/dist/scripts/add-ocean-profiles.js +695 -0
  171. package/packages/core/dist/scripts/add-ocean-profiles.js.map +1 -0
  172. package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
  173. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
  174. package/packages/core/dist/scripts/benchmark-integration.js +691 -0
  175. package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
  176. package/packages/core/dist/scripts/benchmark-integration.test.d.ts +13 -0
  177. package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +1 -0
  178. package/packages/core/dist/scripts/benchmark-integration.test.js +680 -0
  179. package/packages/core/dist/scripts/benchmark-integration.test.js.map +1 -0
  180. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +18 -0
  181. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +1 -0
  182. package/packages/core/dist/scripts/debugging-scenarios.test.js +317 -0
  183. package/packages/core/dist/scripts/debugging-scenarios.test.js.map +1 -0
  184. package/packages/core/dist/scripts/generate-all-faces.d.ts +10 -0
  185. package/packages/core/dist/scripts/generate-all-faces.d.ts.map +1 -0
  186. package/packages/core/dist/scripts/generate-all-faces.js +256 -0
  187. package/packages/core/dist/scripts/generate-all-faces.js.map +1 -0
  188. package/packages/core/dist/scripts/generate-all-faces.test.d.ts +17 -0
  189. package/packages/core/dist/scripts/generate-all-faces.test.d.ts.map +1 -0
  190. package/packages/core/dist/scripts/generate-all-faces.test.js +372 -0
  191. package/packages/core/dist/scripts/generate-all-faces.test.js.map +1 -0
  192. package/packages/core/dist/scripts/generate-all-spiders.d.ts +10 -0
  193. package/packages/core/dist/scripts/generate-all-spiders.d.ts.map +1 -0
  194. package/packages/core/dist/scripts/generate-all-spiders.js +306 -0
  195. package/packages/core/dist/scripts/generate-all-spiders.js.map +1 -0
  196. package/packages/core/dist/scripts/generate-ascii-face.d.ts +52 -0
  197. package/packages/core/dist/scripts/generate-ascii-face.d.ts.map +1 -0
  198. package/packages/core/dist/scripts/generate-ascii-face.js +155 -0
  199. package/packages/core/dist/scripts/generate-ascii-face.js.map +1 -0
  200. package/packages/core/dist/scripts/generate-face.d.ts +52 -0
  201. package/packages/core/dist/scripts/generate-face.d.ts.map +1 -0
  202. package/packages/core/dist/scripts/generate-face.js +199 -0
  203. package/packages/core/dist/scripts/generate-face.js.map +1 -0
  204. package/packages/core/dist/scripts/generate-face.test.d.ts +13 -0
  205. package/packages/core/dist/scripts/generate-face.test.d.ts.map +1 -0
  206. package/packages/core/dist/scripts/generate-face.test.js +301 -0
  207. package/packages/core/dist/scripts/generate-face.test.js.map +1 -0
  208. package/packages/core/dist/scripts/generate-report.d.ts +65 -0
  209. package/packages/core/dist/scripts/generate-report.d.ts.map +1 -0
  210. package/packages/core/dist/scripts/generate-report.js +378 -0
  211. package/packages/core/dist/scripts/generate-report.js.map +1 -0
  212. package/packages/core/dist/scripts/generate-report.test.d.ts +13 -0
  213. package/packages/core/dist/scripts/generate-report.test.d.ts.map +1 -0
  214. package/packages/core/dist/scripts/generate-report.test.js +363 -0
  215. package/packages/core/dist/scripts/generate-report.test.js.map +1 -0
  216. package/packages/core/dist/scripts/generate-spider-report.d.ts +65 -0
  217. package/packages/core/dist/scripts/generate-spider-report.d.ts.map +1 -0
  218. package/packages/core/dist/scripts/generate-spider-report.js +366 -0
  219. package/packages/core/dist/scripts/generate-spider-report.js.map +1 -0
  220. package/packages/core/dist/scripts/generate-spider-report.test.d.ts +13 -0
  221. package/packages/core/dist/scripts/generate-spider-report.test.d.ts.map +1 -0
  222. package/packages/core/dist/scripts/generate-spider-report.test.js +367 -0
  223. package/packages/core/dist/scripts/generate-spider-report.test.js.map +1 -0
  224. package/packages/core/dist/scripts/generate-spider.d.ts +37 -0
  225. package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -0
  226. package/packages/core/dist/scripts/generate-spider.js +315 -0
  227. package/packages/core/dist/scripts/generate-spider.js.map +1 -0
  228. package/packages/core/dist/scripts/generate-spider.test.d.ts +14 -0
  229. package/packages/core/dist/scripts/generate-spider.test.d.ts.map +1 -0
  230. package/packages/core/dist/scripts/generate-spider.test.js +269 -0
  231. package/packages/core/dist/scripts/generate-spider.test.js.map +1 -0
  232. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -0
  233. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
  234. package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
  235. package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
  236. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts +14 -0
  237. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts.map +1 -0
  238. package/packages/core/dist/scripts/job-fair-aggregator.test.js +616 -0
  239. package/packages/core/dist/scripts/job-fair-aggregator.test.js.map +1 -0
  240. package/packages/core/dist/scripts/run-ci.test.d.ts +20 -0
  241. package/packages/core/dist/scripts/run-ci.test.d.ts.map +1 -0
  242. package/packages/core/dist/scripts/run-ci.test.js +127 -0
  243. package/packages/core/dist/scripts/run-ci.test.js.map +1 -0
  244. package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
  245. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +1 -0
  246. package/packages/core/dist/scripts/theme-detail.test.js +199 -0
  247. package/packages/core/dist/scripts/theme-detail.test.js.map +1 -0
  248. package/packages/core/dist/scripts/validate-ocean-profiles.d.ts +9 -0
  249. package/packages/core/dist/scripts/validate-ocean-profiles.d.ts.map +1 -0
  250. package/packages/core/dist/scripts/validate-ocean-profiles.js +130 -0
  251. package/packages/core/dist/scripts/validate-ocean-profiles.js.map +1 -0
  252. package/packages/core/dist/workflow/generic-handoff.d.ts +235 -0
  253. package/packages/core/dist/workflow/generic-handoff.d.ts.map +1 -0
  254. package/packages/core/dist/workflow/generic-handoff.js +358 -0
  255. package/packages/core/dist/workflow/generic-handoff.js.map +1 -0
  256. package/packages/core/dist/workflow/generic-handoff.test.d.ts +21 -0
  257. package/packages/core/dist/workflow/generic-handoff.test.d.ts.map +1 -0
  258. package/packages/core/dist/workflow/generic-handoff.test.js +499 -0
  259. package/packages/core/dist/workflow/generic-handoff.test.js.map +1 -0
  260. package/packages/core/dist/workflow/generic-sm-finish.d.ts +89 -0
  261. package/packages/core/dist/workflow/generic-sm-finish.d.ts.map +1 -0
  262. package/packages/core/dist/workflow/generic-sm-finish.js +157 -0
  263. package/packages/core/dist/workflow/generic-sm-finish.js.map +1 -0
  264. package/packages/core/dist/workflow/generic-sm-setup.d.ts +138 -0
  265. package/packages/core/dist/workflow/generic-sm-setup.d.ts.map +1 -0
  266. package/packages/core/dist/workflow/generic-sm-setup.js +382 -0
  267. package/packages/core/dist/workflow/generic-sm-setup.js.map +1 -0
  268. package/packages/core/dist/workflow/sm-subagents.test.d.ts +23 -0
  269. package/packages/core/dist/workflow/sm-subagents.test.d.ts.map +1 -0
  270. package/packages/core/dist/workflow/sm-subagents.test.js +727 -0
  271. package/packages/core/dist/workflow/sm-subagents.test.js.map +1 -0
  272. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts +17 -0
  273. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts.map +1 -0
  274. package/packages/core/dist/workflow/story-workflow-routing.test.js +559 -0
  275. package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -0
  276. package/packages/core/dist/workflow/test-cache.d.ts +131 -0
  277. package/packages/core/dist/workflow/test-cache.d.ts.map +1 -0
  278. package/packages/core/dist/workflow/test-cache.js +226 -0
  279. package/packages/core/dist/workflow/test-cache.js.map +1 -0
  280. package/packages/core/dist/workflow/test-cache.test.d.ts +17 -0
  281. package/packages/core/dist/workflow/test-cache.test.d.ts.map +1 -0
  282. package/packages/core/dist/workflow/test-cache.test.js +438 -0
  283. package/packages/core/dist/workflow/test-cache.test.js.map +1 -0
  284. package/packages/core/dist/workflow/workflow-loader.d.ts +76 -0
  285. package/packages/core/dist/workflow/workflow-loader.d.ts.map +1 -0
  286. package/packages/core/dist/workflow/workflow-loader.js +133 -0
  287. package/packages/core/dist/workflow/workflow-loader.js.map +1 -0
  288. package/packages/core/dist/workflow/workflow-loader.test.d.ts +15 -0
  289. package/packages/core/dist/workflow/workflow-loader.test.d.ts.map +1 -0
  290. package/packages/core/dist/workflow/workflow-loader.test.js +354 -0
  291. package/packages/core/dist/workflow/workflow-loader.test.js.map +1 -0
  292. package/packages/core/dist/workflow/workflow-migration.test.d.ts +17 -0
  293. package/packages/core/dist/workflow/workflow-migration.test.d.ts.map +1 -0
  294. package/packages/core/dist/workflow/workflow-migration.test.js +372 -0
  295. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -0
  296. package/packages/core/dist/workflow/workflow-router.d.ts +55 -0
  297. package/packages/core/dist/workflow/workflow-router.d.ts.map +1 -0
  298. package/packages/core/dist/workflow/workflow-router.js +245 -0
  299. package/packages/core/dist/workflow/workflow-router.js.map +1 -0
  300. package/packages/core/dist/workflow/workflow-router.test.d.ts +20 -0
  301. package/packages/core/dist/workflow/workflow-router.test.d.ts.map +1 -0
  302. package/packages/core/dist/workflow/workflow-router.test.js +607 -0
  303. package/packages/core/dist/workflow/workflow-router.test.js.map +1 -0
  304. package/packages/core/dist/workflow/workflow-schema.d.ts +98 -0
  305. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -0
  306. package/packages/core/dist/workflow/workflow-schema.js +230 -0
  307. package/packages/core/dist/workflow/workflow-schema.js.map +1 -0
  308. package/packages/core/dist/workflow/workflow-schema.test.d.ts +45 -0
  309. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -0
  310. package/packages/core/dist/workflow/workflow-schema.test.js +512 -0
  311. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -0
  312. package/pennyfarthing-dist/agents/README.md +397 -0
  313. package/pennyfarthing-dist/agents/architect.md +171 -0
  314. package/pennyfarthing-dist/agents/dev.md +225 -0
  315. package/pennyfarthing-dist/agents/devops.md +183 -0
  316. package/pennyfarthing-dist/agents/generic-handoff.md +451 -0
  317. package/pennyfarthing-dist/agents/generic-sm-finish.md +261 -0
  318. package/pennyfarthing-dist/agents/generic-sm-setup.md +214 -0
  319. package/pennyfarthing-dist/agents/orchestrator.md +316 -0
  320. package/pennyfarthing-dist/agents/pm.md +153 -0
  321. package/pennyfarthing-dist/agents/reviewer-preflight.md +224 -0
  322. package/pennyfarthing-dist/agents/reviewer.md +315 -0
  323. package/pennyfarthing-dist/agents/sm-file-summary.md +109 -0
  324. package/pennyfarthing-dist/agents/sm-handoff.md +97 -0
  325. package/pennyfarthing-dist/agents/sm.md +480 -0
  326. package/pennyfarthing-dist/agents/tea.md +191 -0
  327. package/pennyfarthing-dist/agents/tech-writer.md +148 -0
  328. package/pennyfarthing-dist/agents/testing-runner.md +420 -0
  329. package/pennyfarthing-dist/agents/ux-designer.md +158 -0
  330. package/pennyfarthing-dist/agents/workflow-status-check.md +332 -0
  331. package/pennyfarthing-dist/commands/architect.md +62 -0
  332. package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
  333. package/pennyfarthing-dist/commands/benchmark.md +467 -0
  334. package/pennyfarthing-dist/commands/brainstorm.md +91 -0
  335. package/pennyfarthing-dist/commands/check.md +156 -0
  336. package/pennyfarthing-dist/commands/chore.md +178 -0
  337. package/pennyfarthing-dist/commands/close-epic.md +136 -0
  338. package/pennyfarthing-dist/commands/continue-session.md +184 -0
  339. package/pennyfarthing-dist/commands/create-branches-from-story.md +374 -0
  340. package/pennyfarthing-dist/commands/create-theme.md +29 -0
  341. package/pennyfarthing-dist/commands/dev.md +60 -0
  342. package/pennyfarthing-dist/commands/devops.md +59 -0
  343. package/pennyfarthing-dist/commands/git-cleanup.md +340 -0
  344. package/pennyfarthing-dist/commands/health-check.md +108 -0
  345. package/pennyfarthing-dist/commands/help.md +264 -0
  346. package/pennyfarthing-dist/commands/job-fair.md +102 -0
  347. package/pennyfarthing-dist/commands/list-themes.md +17 -0
  348. package/pennyfarthing-dist/commands/new-work.md +127 -0
  349. package/pennyfarthing-dist/commands/orchestrator.md +56 -0
  350. package/pennyfarthing-dist/commands/parallel-work.md +71 -0
  351. package/pennyfarthing-dist/commands/party-mode.md +67 -0
  352. package/pennyfarthing-dist/commands/permissions.md +193 -0
  353. package/pennyfarthing-dist/commands/pm.md +60 -0
  354. package/pennyfarthing-dist/commands/prime.md +140 -0
  355. package/pennyfarthing-dist/commands/release.md +58 -0
  356. package/pennyfarthing-dist/commands/repo-status.md +49 -0
  357. package/pennyfarthing-dist/commands/retro.md +200 -0
  358. package/pennyfarthing-dist/commands/reviewer.md +64 -0
  359. package/pennyfarthing-dist/commands/run-ci.md +116 -0
  360. package/pennyfarthing-dist/commands/set-theme.md +52 -0
  361. package/pennyfarthing-dist/commands/show-theme.md +21 -0
  362. package/pennyfarthing-dist/commands/sm.md +70 -0
  363. package/pennyfarthing-dist/commands/solo.md +411 -0
  364. package/pennyfarthing-dist/commands/sprint-planning.md +109 -0
  365. package/pennyfarthing-dist/commands/start-epic.md +156 -0
  366. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +184 -0
  367. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +376 -0
  368. package/pennyfarthing-dist/commands/tea.md +63 -0
  369. package/pennyfarthing-dist/commands/tech-writer.md +53 -0
  370. package/pennyfarthing-dist/commands/theme-maker.md +671 -0
  371. package/pennyfarthing-dist/commands/update-domain-docs.md +83 -0
  372. package/pennyfarthing-dist/commands/ux-designer.md +62 -0
  373. package/pennyfarthing-dist/commands/work.md +111 -0
  374. package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +480 -0
  375. package/pennyfarthing-dist/guides/AGENT-SCOPES.md +201 -0
  376. package/pennyfarthing-dist/guides/HOOKS.md +230 -0
  377. package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +338 -0
  378. package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +193 -0
  379. package/pennyfarthing-dist/guides/agent-template-strategic.md +148 -0
  380. package/pennyfarthing-dist/guides/agent-template-tactical.md +162 -0
  381. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +746 -0
  382. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +574 -0
  383. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +488 -0
  384. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +402 -0
  385. package/pennyfarthing-dist/guides/permission-protocol.md +188 -0
  386. package/pennyfarthing-dist/guides/persona-loading.md +46 -0
  387. package/pennyfarthing-dist/guides/persona-system.md +294 -0
  388. package/pennyfarthing-dist/guides/shared-agent-behavior.md +388 -0
  389. package/pennyfarthing-dist/guides/shared-context.md +147 -0
  390. package/pennyfarthing-dist/guides/strategic-agent-behavior.md +348 -0
  391. package/pennyfarthing-dist/guides/tactical-agent-behavior.md +1041 -0
  392. package/pennyfarthing-dist/guides/workflow-schema.md +195 -0
  393. package/pennyfarthing-dist/guides/worktree-mode.md +113 -0
  394. package/pennyfarthing-dist/output-styles/teaching.md +33 -0
  395. package/pennyfarthing-dist/output-styles/terse.md +20 -0
  396. package/pennyfarthing-dist/output-styles/verbose.md +28 -0
  397. package/pennyfarthing-dist/personas/themes/1984.yaml +312 -0
  398. package/pennyfarthing-dist/personas/themes/a-team.yaml +207 -0
  399. package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +300 -0
  400. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +330 -0
  401. package/pennyfarthing-dist/personas/themes/all-stars.yaml +332 -0
  402. package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +320 -0
  403. package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +306 -0
  404. package/pennyfarthing-dist/personas/themes/arcane.yaml +288 -0
  405. package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +331 -0
  406. package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +288 -0
  407. package/pennyfarthing-dist/personas/themes/babylon-5.yaml +288 -0
  408. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +288 -0
  409. package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +288 -0
  410. package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +300 -0
  411. package/pennyfarthing-dist/personas/themes/black-sails.yaml +300 -0
  412. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +295 -0
  413. package/pennyfarthing-dist/personas/themes/bobiverse.yaml +288 -0
  414. package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +327 -0
  415. package/pennyfarthing-dist/personas/themes/catch-22.yaml +316 -0
  416. package/pennyfarthing-dist/personas/themes/classical-composers.yaml +310 -0
  417. package/pennyfarthing-dist/personas/themes/control.yaml +197 -0
  418. package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +320 -0
  419. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +323 -0
  420. package/pennyfarthing-dist/personas/themes/deadwood.yaml +300 -0
  421. package/pennyfarthing-dist/personas/themes/dickens.yaml +320 -0
  422. package/pennyfarthing-dist/personas/themes/discworld.yaml +332 -0
  423. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +290 -0
  424. package/pennyfarthing-dist/personas/themes/don-quixote.yaml +320 -0
  425. package/pennyfarthing-dist/personas/themes/dune.yaml +307 -0
  426. package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +320 -0
  427. package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +288 -0
  428. package/pennyfarthing-dist/personas/themes/fargo.yaml +330 -0
  429. package/pennyfarthing-dist/personas/themes/film-auteurs.yaml +312 -0
  430. package/pennyfarthing-dist/personas/themes/firefly.yaml +328 -0
  431. package/pennyfarthing-dist/personas/themes/foundation.yaml +290 -0
  432. package/pennyfarthing-dist/personas/themes/futurama.yaml +321 -0
  433. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +290 -0
  434. package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +243 -0
  435. package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +308 -0
  436. package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +308 -0
  437. package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +330 -0
  438. package/pennyfarthing-dist/personas/themes/hannibal.yaml +300 -0
  439. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +324 -0
  440. package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +291 -0
  441. package/pennyfarthing-dist/personas/themes/historical-figures.yaml +288 -0
  442. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +331 -0
  443. package/pennyfarthing-dist/personas/themes/house-md.yaml +321 -0
  444. package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +289 -0
  445. package/pennyfarthing-dist/personas/themes/inspector-morse.yaml +300 -0
  446. package/pennyfarthing-dist/personas/themes/jane-austen.yaml +287 -0
  447. package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +320 -0
  448. package/pennyfarthing-dist/personas/themes/justified.yaml +300 -0
  449. package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +219 -0
  450. package/pennyfarthing-dist/personas/themes/les-miserables.yaml +299 -0
  451. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +334 -0
  452. package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +334 -0
  453. package/pennyfarthing-dist/personas/themes/mad-max.yaml +355 -0
  454. package/pennyfarthing-dist/personas/themes/mad-men.yaml +289 -0
  455. package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +300 -0
  456. package/pennyfarthing-dist/personas/themes/mash.yaml +334 -0
  457. package/pennyfarthing-dist/personas/themes/mass-effect.yaml +289 -0
  458. package/pennyfarthing-dist/personas/themes/military-commanders.yaml +306 -0
  459. package/pennyfarthing-dist/personas/themes/moby-dick.yaml +320 -0
  460. package/pennyfarthing-dist/personas/themes/monty-python.yaml +303 -0
  461. package/pennyfarthing-dist/personas/themes/neuromancer.yaml +300 -0
  462. package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +329 -0
  463. package/pennyfarthing-dist/personas/themes/parks-and-rec.yaml +242 -0
  464. package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +298 -0
  465. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +220 -0
  466. package/pennyfarthing-dist/personas/themes/renaissance-masters.yaml +320 -0
  467. package/pennyfarthing-dist/personas/themes/rome.yaml +300 -0
  468. package/pennyfarthing-dist/personas/themes/russian-masters.yaml +318 -0
  469. package/pennyfarthing-dist/personas/themes/sandman.yaml +288 -0
  470. package/pennyfarthing-dist/personas/themes/scientific-revolutionaries.yaml +320 -0
  471. package/pennyfarthing-dist/personas/themes/shakespeare.yaml +301 -0
  472. package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +289 -0
  473. package/pennyfarthing-dist/personas/themes/snow-crash.yaml +288 -0
  474. package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +300 -0
  475. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +230 -0
  476. package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +210 -0
  477. package/pennyfarthing-dist/personas/themes/star-wars.yaml +303 -0
  478. package/pennyfarthing-dist/personas/themes/succession.yaml +300 -0
  479. package/pennyfarthing-dist/personas/themes/superfriends.yaml +208 -0
  480. package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +236 -0
  481. package/pennyfarthing-dist/personas/themes/the-americans.yaml +300 -0
  482. package/pennyfarthing-dist/personas/themes/the-crown.yaml +300 -0
  483. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +213 -0
  484. package/pennyfarthing-dist/personas/themes/the-good-place.yaml +322 -0
  485. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +353 -0
  486. package/pennyfarthing-dist/personas/themes/the-odyssey.yaml +300 -0
  487. package/pennyfarthing-dist/personas/themes/the-office.yaml +330 -0
  488. package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +308 -0
  489. package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +300 -0
  490. package/pennyfarthing-dist/personas/themes/the-wire.yaml +311 -0
  491. package/pennyfarthing-dist/personas/themes/the-witcher.yaml +300 -0
  492. package/pennyfarthing-dist/personas/themes/twin-peaks.yaml +302 -0
  493. package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +300 -0
  494. package/pennyfarthing-dist/personas/themes/watchmen.yaml +291 -0
  495. package/pennyfarthing-dist/personas/themes/west-wing.yaml +291 -0
  496. package/pennyfarthing-dist/personas/themes/world-explorers.yaml +320 -0
  497. package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +307 -0
  498. package/pennyfarthing-dist/personas/themes/x-files.yaml +302 -0
  499. package/pennyfarthing-dist/scripts/add-short-names.mjs +264 -0
  500. package/pennyfarthing-dist/scripts/agent-session.sh +367 -0
  501. package/pennyfarthing-dist/scripts/check-context.sh +187 -0
  502. package/pennyfarthing-dist/scripts/check.sh +497 -0
  503. package/pennyfarthing-dist/scripts/deploy.sh +284 -0
  504. package/pennyfarthing-dist/scripts/doctor-dogfood.sh +360 -0
  505. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +61 -0
  506. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +66 -0
  507. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +35 -0
  508. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +166 -0
  509. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +50 -0
  510. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +71 -0
  511. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +54 -0
  512. package/pennyfarthing-dist/scripts/hooks/session-start.sh +98 -0
  513. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +59 -0
  514. package/pennyfarthing-dist/scripts/install-git-hooks.sh +91 -0
  515. package/pennyfarthing-dist/scripts/prime.sh +161 -0
  516. package/pennyfarthing-dist/scripts/release.sh +198 -0
  517. package/pennyfarthing-dist/scripts/repo-utils.sh +778 -0
  518. package/pennyfarthing-dist/scripts/run-ci.sh +219 -0
  519. package/pennyfarthing-dist/scripts/run.sh +65 -0
  520. package/pennyfarthing-dist/scripts/statusline.sh +264 -0
  521. package/pennyfarthing-dist/scripts/tests/check.test.sh +582 -0
  522. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +107 -0
  523. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +597 -0
  524. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +514 -0
  525. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +517 -0
  526. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +331 -0
  527. package/pennyfarthing-dist/scripts/uninstall.sh +271 -0
  528. package/pennyfarthing-dist/scripts/utils/background-tasks.sh +177 -0
  529. package/pennyfarthing-dist/scripts/utils/check-status.sh +251 -0
  530. package/pennyfarthing-dist/scripts/utils/checkpoint.sh +136 -0
  531. package/pennyfarthing-dist/scripts/utils/common.sh +157 -0
  532. package/pennyfarthing-dist/scripts/utils/create-feature-branches.sh +230 -0
  533. package/pennyfarthing-dist/scripts/utils/file-lock.sh +269 -0
  534. package/pennyfarthing-dist/scripts/utils/find-related-work.sh +231 -0
  535. package/pennyfarthing-dist/scripts/utils/find-root.sh +33 -0
  536. package/pennyfarthing-dist/scripts/utils/generate-skill-docs.sh +110 -0
  537. package/pennyfarthing-dist/scripts/utils/git-status-all.sh +127 -0
  538. package/pennyfarthing-dist/scripts/utils/ground-truth-judge.py +289 -0
  539. package/pennyfarthing-dist/scripts/utils/jira/jira-lib.mjs +443 -0
  540. package/pennyfarthing-dist/scripts/utils/jira/jira-sync-story.mjs +208 -0
  541. package/pennyfarthing-dist/scripts/utils/jira/jira-sync.mjs +198 -0
  542. package/pennyfarthing-dist/scripts/utils/jira-claim-story.sh +162 -0
  543. package/pennyfarthing-dist/scripts/utils/jira-lib.sh +463 -0
  544. package/pennyfarthing-dist/scripts/utils/jira-sync-story.sh +8 -0
  545. package/pennyfarthing-dist/scripts/utils/jira-sync.sh +8 -0
  546. package/pennyfarthing-dist/scripts/utils/log-skill-usage.sh +74 -0
  547. package/pennyfarthing-dist/scripts/utils/logging.sh +186 -0
  548. package/pennyfarthing-dist/scripts/utils/repo-scan.sh +141 -0
  549. package/pennyfarthing-dist/scripts/utils/retry.sh +76 -0
  550. package/pennyfarthing-dist/scripts/utils/run-timestamp.sh +7 -0
  551. package/pennyfarthing-dist/scripts/utils/session-cleanup.sh +319 -0
  552. package/pennyfarthing-dist/scripts/utils/skill-usage-report.sh +193 -0
  553. package/pennyfarthing-dist/scripts/utils/sprint-common.sh +286 -0
  554. package/pennyfarthing-dist/scripts/utils/sprint-metrics.sh +241 -0
  555. package/pennyfarthing-dist/scripts/utils/swebench-judge.py +400 -0
  556. package/pennyfarthing-dist/scripts/utils/sync-epic-to-jira.sh +16 -0
  557. package/pennyfarthing-dist/scripts/utils/test-setup.sh +337 -0
  558. package/pennyfarthing-dist/scripts/utils/validate-subagent-frontmatter.sh +160 -0
  559. package/pennyfarthing-dist/scripts/worktree-manager.sh +498 -0
  560. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +236 -0
  561. package/pennyfarthing-dist/skills/changelog/SKILL.md +367 -0
  562. package/pennyfarthing-dist/skills/code-review/SKILL.md +168 -0
  563. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +268 -0
  564. package/pennyfarthing-dist/skills/cyclist/SKILL.md +117 -0
  565. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +421 -0
  566. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +258 -0
  567. package/pennyfarthing-dist/skills/jira/SKILL.md +281 -0
  568. package/pennyfarthing-dist/skills/judge/SKILL.md +524 -0
  569. package/pennyfarthing-dist/skills/just/SKILL.md +160 -0
  570. package/pennyfarthing-dist/skills/mermaid/SKILL.md +240 -0
  571. package/pennyfarthing-dist/skills/otel/skill.md +222 -0
  572. package/pennyfarthing-dist/skills/permissions/skill.md +172 -0
  573. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +173 -0
  574. package/pennyfarthing-dist/skills/skill-registry.schema.json +102 -0
  575. package/pennyfarthing-dist/skills/skill-registry.yaml +335 -0
  576. package/pennyfarthing-dist/skills/sprint-context/SKILL.md +120 -0
  577. package/pennyfarthing-dist/skills/story-management/SKILL.md +208 -0
  578. package/pennyfarthing-dist/skills/testing/SKILL.md +99 -0
  579. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +124 -0
  580. package/pennyfarthing-dist/skills/theme/skill.md +129 -0
  581. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +169 -0
  582. package/pennyfarthing-dist/skills/workflow/SKILL.md +160 -0
  583. package/pennyfarthing-dist/skills/yq/SKILL.md +264 -0
  584. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +187 -0
  585. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +59 -0
  586. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +276 -0
  587. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +61 -0
  588. package/pennyfarthing-dist/templates/persona-config.yaml.template +22 -0
  589. package/pennyfarthing-dist/templates/preferences.yaml.template +15 -0
  590. package/pennyfarthing-dist/templates/settings.local.json.template +90 -0
  591. package/pennyfarthing-dist/templates/setup-env.sh.template +18 -0
  592. package/pennyfarthing-dist/templates/shared-context.md.template +70 -0
  593. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +40 -0
  594. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +37 -0
  595. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +34 -0
  596. package/pennyfarthing-dist/workflows/agent-docs.yaml +70 -0
  597. package/pennyfarthing-dist/workflows/bdd.yaml +58 -0
  598. package/pennyfarthing-dist/workflows/tdd.yaml +50 -0
  599. package/pennyfarthing-dist/workflows/trivial.yaml +40 -0
@@ -0,0 +1,315 @@
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 { loadThemeOcean } from './generate-face.js';
10
+ // Chart configuration
11
+ const VIEW_SIZE = 200;
12
+ const CENTER_X = VIEW_SIZE / 2;
13
+ const CENTER_Y = VIEW_SIZE / 2 + 8; // Shifted down to balance top/bottom margins
14
+ const OUTER_RADIUS = 70; // Leaves room for labels
15
+ const LABEL_RADIUS = OUTER_RADIUS + 18;
16
+ // OCEAN dimension order (clockwise from top)
17
+ const DIMENSIONS = ['O', 'C', 'E', 'A', 'N'];
18
+ const DIMENSION_LABELS = {
19
+ O: 'O',
20
+ C: 'C',
21
+ E: 'E',
22
+ A: 'A',
23
+ N: 'N',
24
+ };
25
+ // Role-specific colors (consistent across all charts for visual training)
26
+ export const ROLE_COLORS = {
27
+ orchestrator: '#f59e0b', // Amber
28
+ sm: '#10b981', // Emerald
29
+ tea: '#ef4444', // Red
30
+ dev: '#3b82f6', // Blue
31
+ reviewer: '#8b5cf6', // Purple
32
+ architect: '#06b6d4', // Cyan
33
+ pm: '#ec4899', // Pink
34
+ 'tech-writer': '#84cc16', // Lime
35
+ 'ux-designer': '#f97316', // Orange
36
+ devops: '#6366f1', // Indigo
37
+ };
38
+ // Legacy overlay colors (for arbitrary comparisons)
39
+ const OVERLAY_COLORS = [
40
+ '#2563eb', // Blue
41
+ '#dc2626', // Red
42
+ '#16a34a', // Green
43
+ '#9333ea', // Purple
44
+ '#ea580c', // Orange
45
+ ];
46
+ // Background and styling (dark theme for consistent rendering)
47
+ const BACKGROUND_COLOR = '#000000';
48
+ const GRID_COLOR = '#374151';
49
+ const AXIS_COLOR = '#4b5563';
50
+ const LABEL_COLOR = '#e5e7eb';
51
+ const DATA_STROKE_WIDTH = 2;
52
+ const GRID_STROKE_WIDTH = 1;
53
+ /**
54
+ * Calculate point on pentagon for given dimension and score
55
+ * @param dimensionIndex - Index 0-4 for O, C, E, A, N
56
+ * @param score - Score 1-5
57
+ * @param radius - Base radius to use
58
+ */
59
+ function getPoint(dimensionIndex, score, radius) {
60
+ // Start from top (-90°), go clockwise
61
+ // Each vertex is 72° apart (360° / 5)
62
+ const angle = ((dimensionIndex * 72 - 90) * Math.PI) / 180;
63
+ // Map score 1-5 to 20%-100% of radius
64
+ const normalizedScore = 0.2 + ((score - 1) / 4) * 0.8;
65
+ const r = radius * normalizedScore;
66
+ return {
67
+ x: CENTER_X + r * Math.cos(angle),
68
+ y: CENTER_Y + r * Math.sin(angle),
69
+ };
70
+ }
71
+ /**
72
+ * Get vertex position (at full radius) for a dimension
73
+ */
74
+ function getVertex(dimensionIndex) {
75
+ const angle = ((dimensionIndex * 72 - 90) * Math.PI) / 180;
76
+ return {
77
+ x: CENTER_X + OUTER_RADIUS * Math.cos(angle),
78
+ y: CENTER_Y + OUTER_RADIUS * Math.sin(angle),
79
+ };
80
+ }
81
+ /**
82
+ * Get label position (outside the pentagon)
83
+ */
84
+ function getLabelPosition(dimensionIndex) {
85
+ const angle = ((dimensionIndex * 72 - 90) * Math.PI) / 180;
86
+ const x = CENTER_X + LABEL_RADIUS * Math.cos(angle);
87
+ const y = CENTER_Y + LABEL_RADIUS * Math.sin(angle);
88
+ // Text anchor depends on position
89
+ let anchor = 'middle';
90
+ if (dimensionIndex === 1 || dimensionIndex === 2)
91
+ anchor = 'start'; // Right side
92
+ if (dimensionIndex === 3 || dimensionIndex === 4)
93
+ anchor = 'end'; // Left side
94
+ return { x, y, anchor };
95
+ }
96
+ /**
97
+ * Generate grid pentagon at a specific scale
98
+ */
99
+ function generateGridPolygon(scale) {
100
+ const points = DIMENSIONS.map((_, i) => {
101
+ const angle = ((i * 72 - 90) * Math.PI) / 180;
102
+ const r = OUTER_RADIUS * scale;
103
+ const x = CENTER_X + r * Math.cos(angle);
104
+ const y = CENTER_Y + r * Math.sin(angle);
105
+ return `${x.toFixed(1)},${y.toFixed(1)}`;
106
+ }).join(' ');
107
+ return `<polygon points="${points}" fill="none" stroke="${GRID_COLOR}" stroke-width="${GRID_STROKE_WIDTH}" />`;
108
+ }
109
+ /**
110
+ * Generate axis line from center to vertex
111
+ */
112
+ function generateAxisLine(dimensionIndex) {
113
+ const vertex = getVertex(dimensionIndex);
114
+ 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}" />`;
115
+ }
116
+ /**
117
+ * Generate dimension label
118
+ */
119
+ function generateLabel(dimensionIndex) {
120
+ const pos = getLabelPosition(dimensionIndex);
121
+ const label = DIMENSION_LABELS[DIMENSIONS[dimensionIndex]];
122
+ // Adjust y for vertical centering
123
+ const yOffset = dimensionIndex === 0 ? -4 : dimensionIndex === 2 || dimensionIndex === 3 ? 4 : 0;
124
+ 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>`;
125
+ }
126
+ /**
127
+ * Generate data polygon from OCEAN scores
128
+ */
129
+ function generateDataPolygon(ocean, color = '#2563eb', strokeWidth = DATA_STROKE_WIDTH) {
130
+ const points = DIMENSIONS.map((dim, i) => {
131
+ const point = getPoint(i, ocean[dim], OUTER_RADIUS);
132
+ return `${point.x.toFixed(1)},${point.y.toFixed(1)}`;
133
+ }).join(' ');
134
+ return `<polygon points="${points}" fill="none" stroke="${color}" stroke-width="${strokeWidth}" stroke-linejoin="round" />`;
135
+ }
136
+ /**
137
+ * Generate SVG spider chart from OCEAN scores
138
+ */
139
+ export function generateSpiderFromOcean(ocean, color = '#2563eb') {
140
+ // Grid pentagons at 20%, 40%, 60%, 80%, 100%
141
+ const gridPolygons = [0.2, 0.4, 0.6, 0.8, 1.0]
142
+ .map((scale) => generateGridPolygon(scale))
143
+ .join('\n ');
144
+ // Axis lines
145
+ const axisLines = DIMENSIONS.map((_, i) => generateAxisLine(i)).join('\n ');
146
+ // Dimension labels
147
+ const labels = DIMENSIONS.map((_, i) => generateLabel(i)).join('\n ');
148
+ // Data polygon
149
+ const dataPolygon = generateDataPolygon(ocean, color);
150
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${VIEW_SIZE} ${VIEW_SIZE}">
151
+ <!-- Background -->
152
+ <rect width="${VIEW_SIZE}" height="${VIEW_SIZE}" fill="${BACKGROUND_COLOR}" />
153
+
154
+ <!-- Grid -->
155
+ ${gridPolygons}
156
+
157
+ <!-- Axes -->
158
+ ${axisLines}
159
+
160
+ <!-- Data -->
161
+ ${dataPolygon}
162
+
163
+ <!-- Labels -->
164
+ ${labels}
165
+ </svg>`;
166
+ }
167
+ /**
168
+ * Generate SVG spider chart from theme and agent
169
+ * Uses role-specific color for consistent visual training
170
+ */
171
+ export function generateSpider(theme, agent) {
172
+ const ocean = loadThemeOcean(theme, agent);
173
+ const color = ROLE_COLORS[agent] || '#2563eb';
174
+ return generateSpiderFromOcean(ocean, color);
175
+ }
176
+ /**
177
+ * Format theme name for display
178
+ */
179
+ function formatThemeName(theme) {
180
+ return theme
181
+ .split('-')
182
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
183
+ .join(' ');
184
+ }
185
+ /**
186
+ * Generate legend item
187
+ */
188
+ function generateLegendItem(index, label, color, yOffset) {
189
+ const x = 10;
190
+ const y = VIEW_SIZE - 10 - yOffset;
191
+ return `<rect x="${x}" y="${y - 8}" width="12" height="12" fill="none" stroke="${color}" stroke-width="2" />
192
+ <text x="${x + 16}" y="${y}" font-family="sans-serif" font-size="10" fill="${LABEL_COLOR}">${label}</text>`;
193
+ }
194
+ /**
195
+ * Generate overlay spider chart comparing multiple characters
196
+ */
197
+ export function generateOverlaySpider(characters) {
198
+ // Grid pentagons
199
+ const gridPolygons = [0.2, 0.4, 0.6, 0.8, 1.0]
200
+ .map((scale) => generateGridPolygon(scale))
201
+ .join('\n ');
202
+ // Axis lines
203
+ const axisLines = DIMENSIONS.map((_, i) => generateAxisLine(i)).join('\n ');
204
+ // Dimension labels
205
+ const labels = DIMENSIONS.map((_, i) => generateLabel(i)).join('\n ');
206
+ // Data polygons for each character
207
+ const dataPolygons = characters
208
+ .map((char, index) => {
209
+ const ocean = loadThemeOcean(char.theme, char.agent);
210
+ const color = OVERLAY_COLORS[index % OVERLAY_COLORS.length];
211
+ return generateDataPolygon(ocean, color);
212
+ })
213
+ .join('\n ');
214
+ // Legend items
215
+ const legendItems = characters
216
+ .map((char, index) => {
217
+ const color = OVERLAY_COLORS[index % OVERLAY_COLORS.length];
218
+ const label = char.label || `${formatThemeName(char.theme)} (${char.agent})`;
219
+ const yOffset = (characters.length - 1 - index) * 16;
220
+ return generateLegendItem(index, label, color, yOffset);
221
+ })
222
+ .join('\n ');
223
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${VIEW_SIZE} ${VIEW_SIZE}">
224
+ <!-- Background -->
225
+ <rect width="${VIEW_SIZE}" height="${VIEW_SIZE}" fill="${BACKGROUND_COLOR}" />
226
+
227
+ <!-- Grid -->
228
+ ${gridPolygons}
229
+
230
+ <!-- Axes -->
231
+ ${axisLines}
232
+
233
+ <!-- Data -->
234
+ ${dataPolygons}
235
+
236
+ <!-- Labels -->
237
+ ${labels}
238
+
239
+ <!-- Legend -->
240
+ ${legendItems}
241
+ </svg>`;
242
+ }
243
+ // Agent order for team overlay (matches AGENTS in generate-all-spiders.ts)
244
+ const TEAM_AGENTS = [
245
+ 'orchestrator',
246
+ 'sm',
247
+ 'tea',
248
+ 'dev',
249
+ 'reviewer',
250
+ 'architect',
251
+ 'pm',
252
+ 'tech-writer',
253
+ 'ux-designer',
254
+ 'devops',
255
+ ];
256
+ // Human-readable agent names for legend (reserved for future use)
257
+ const _AGENT_DISPLAY_NAMES = {
258
+ orchestrator: 'Orch',
259
+ sm: 'SM',
260
+ tea: 'TEA',
261
+ dev: 'Dev',
262
+ reviewer: 'Rev',
263
+ architect: 'Arch',
264
+ pm: 'PM',
265
+ 'tech-writer': 'TW',
266
+ 'ux-designer': 'UX',
267
+ devops: 'Ops',
268
+ };
269
+ // Tactical agents get emphasized (thicker stroke) in team overlays
270
+ const TACTICAL_AGENTS = new Set(['sm', 'tea', 'dev', 'reviewer']);
271
+ const TACTICAL_STROKE_WIDTH = 2.5;
272
+ const STRATEGIC_STROKE_WIDTH = 1;
273
+ /**
274
+ * Generate team overlay spider chart showing all 10 agents for a theme
275
+ * Uses role-specific colors for consistent visual training
276
+ */
277
+ export function generateTeamOverlay(theme) {
278
+ // Grid pentagons
279
+ const gridPolygons = [0.2, 0.4, 0.6, 0.8, 1.0]
280
+ .map((scale) => generateGridPolygon(scale))
281
+ .join('\n ');
282
+ // Axis lines
283
+ const axisLines = TEAM_AGENTS.slice(0, 5)
284
+ .map((_, i) => generateAxisLine(i))
285
+ .join('\n ');
286
+ // Dimension labels
287
+ const labels = DIMENSIONS.map((_, i) => generateLabel(i)).join('\n ');
288
+ // Data polygons for each agent (using role colors)
289
+ // Tactical agents (sm, tea, dev, reviewer) emphasized with thicker strokes
290
+ // Strategic/support agents de-emphasized with thinner strokes
291
+ const dataPolygons = TEAM_AGENTS.map((agent) => {
292
+ const ocean = loadThemeOcean(theme, agent);
293
+ const color = ROLE_COLORS[agent];
294
+ const strokeWidth = TACTICAL_AGENTS.has(agent) ? TACTICAL_STROKE_WIDTH : STRATEGIC_STROKE_WIDTH;
295
+ return generateDataPolygon(ocean, color, strokeWidth);
296
+ }).join('\n ');
297
+ // Legend removed - color key is in markdown header
298
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${VIEW_SIZE} ${VIEW_SIZE}">
299
+ <!-- Background -->
300
+ <rect width="${VIEW_SIZE}" height="${VIEW_SIZE}" fill="${BACKGROUND_COLOR}" />
301
+
302
+ <!-- Grid -->
303
+ ${gridPolygons}
304
+
305
+ <!-- Axes -->
306
+ ${axisLines}
307
+
308
+ <!-- Data -->
309
+ ${dataPolygons}
310
+
311
+ <!-- Labels -->
312
+ ${labels}
313
+ </svg>`;
314
+ }
315
+ //# sourceMappingURL=generate-spider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-spider.js","sourceRoot":"","sources":["../../src/scripts/generate-spider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-spider.test.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-spider.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,269 @@
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 error for non-existent theme', async () => {
63
+ const { generateSpider } = await import('./generate-spider.js');
64
+ assert.throws(() => generateSpider('nonexistent-theme', 'sm'), /theme.*not found/i, 'Should throw error for missing theme');
65
+ });
66
+ it('should throw error for non-existent agent', async () => {
67
+ const { generateSpider } = await import('./generate-spider.js');
68
+ assert.throws(() => generateSpider('deadwood', 'nonexistent-agent'), /agent.*not found/i, 'Should throw error for missing agent');
69
+ });
70
+ it('should accept OCEAN scores directly via generateSpiderFromOcean', async () => {
71
+ const { generateSpiderFromOcean } = await import('./generate-spider.js');
72
+ const svg = generateSpiderFromOcean({ O: 3, C: 4, E: 2, A: 5, N: 1 });
73
+ assert.ok(typeof svg === 'string', 'Should return string');
74
+ assert.ok(svg.includes('<svg'), 'Should contain SVG opening tag');
75
+ });
76
+ });
77
+ // ============================================================================
78
+ // AC3: Spider charts clearly show all 5 OCEAN dimensions
79
+ // ============================================================================
80
+ describe('AC3: Pentagon Structure with 5 OCEAN Dimensions', () => {
81
+ it('should generate a polygon element for the data', async () => {
82
+ const { generateSpider } = await import('./generate-spider.js');
83
+ const svg = generateSpider('deadwood', 'sm');
84
+ assert.ok(svg.includes('<polygon') || svg.includes('<path'), 'Should contain polygon or path element for data shape');
85
+ });
86
+ it('should label all 5 OCEAN dimensions', async () => {
87
+ const { generateSpider } = await import('./generate-spider.js');
88
+ const svg = generateSpider('deadwood', 'sm');
89
+ // Check for dimension labels (as text elements or in comments)
90
+ const hasO = svg.includes('>O<') || svg.includes('"O"') || svg.includes('Openness');
91
+ const hasC = svg.includes('>C<') || svg.includes('"C"') || svg.includes('Conscientiousness');
92
+ const hasE = svg.includes('>E<') || svg.includes('"E"') || svg.includes('Extraversion');
93
+ const hasA = svg.includes('>A<') || svg.includes('"A"') || svg.includes('Agreeableness');
94
+ const hasN = svg.includes('>N<') || svg.includes('"N"') || svg.includes('Neuroticism');
95
+ assert.ok(hasO, 'Should label Openness dimension');
96
+ assert.ok(hasC, 'Should label Conscientiousness dimension');
97
+ assert.ok(hasE, 'Should label Extraversion dimension');
98
+ assert.ok(hasA, 'Should label Agreeableness dimension');
99
+ assert.ok(hasN, 'Should label Neuroticism dimension');
100
+ });
101
+ it('should include grid lines for reference (5 levels)', async () => {
102
+ const { generateSpider } = await import('./generate-spider.js');
103
+ const svg = generateSpider('deadwood', 'sm');
104
+ // Grid lines create concentric pentagons
105
+ // Count polygon/path elements - should have at least 5 for grid + 1 for data
106
+ const polygonCount = (svg.match(/<polygon/g) || []).length;
107
+ const pathCount = (svg.match(/<path/g) || []).length;
108
+ // Grid could be polygons or paths - at minimum should have grid structure
109
+ assert.ok(polygonCount >= 1 || pathCount >= 5, 'Should have grid lines (pentagons or paths for 5 levels)');
110
+ });
111
+ it('should have 5 axis lines from center to vertices', async () => {
112
+ const { generateSpider } = await import('./generate-spider.js');
113
+ const svg = generateSpider('deadwood', 'sm');
114
+ // Axis lines are typically <line> elements
115
+ const lineCount = (svg.match(/<line/g) || []).length;
116
+ assert.ok(lineCount >= 5, `Should have at least 5 axis lines, found ${lineCount}`);
117
+ });
118
+ it('should use unfilled polygon (stroke only, no fill)', async () => {
119
+ const { generateSpider } = await import('./generate-spider.js');
120
+ const svg = generateSpider('deadwood', 'sm');
121
+ // The data polygon should have fill="none" or no fill
122
+ // Looking for the data polygon specifically (not grid lines)
123
+ assert.ok(svg.includes('fill="none"') || !svg.includes('fill="'), 'Data polygon should be unfilled (stroke only)');
124
+ });
125
+ it('should map score 1 to 20% radius and score 5 to 100% radius', async () => {
126
+ const { generateSpiderFromOcean } = await import('./generate-spider.js');
127
+ // Generate with all 1s - polygon should be small (inner)
128
+ const small = generateSpiderFromOcean({ O: 1, C: 1, E: 1, A: 1, N: 1 });
129
+ // Generate with all 5s - polygon should be large (outer)
130
+ const large = generateSpiderFromOcean({ O: 5, C: 5, E: 5, A: 5, N: 5 });
131
+ // SVGs should be different (different polygon sizes)
132
+ assert.notStrictEqual(small, large, 'Score 1-1-1-1-1 and 5-5-5-5-5 should produce different polygons');
133
+ });
134
+ });
135
+ // ============================================================================
136
+ // AC4: Overlay mode compares 2-3 characters on same chart
137
+ // ============================================================================
138
+ describe('AC4: Overlay Mode for Character Comparison', () => {
139
+ it('should accept array of theme+agent pairs for overlay', async () => {
140
+ const { generateOverlaySpider } = await import('./generate-spider.js');
141
+ const svg = generateOverlaySpider([
142
+ { theme: 'deadwood', agent: 'sm' },
143
+ { theme: 'firefly', agent: 'sm' },
144
+ ]);
145
+ assert.ok(typeof svg === 'string', 'Should return string');
146
+ assert.ok(svg.includes('<svg'), 'Should contain SVG');
147
+ });
148
+ it('should render 2 distinct polygons for 2 characters', async () => {
149
+ const { generateOverlaySpider } = await import('./generate-spider.js');
150
+ const svg = generateOverlaySpider([
151
+ { theme: 'deadwood', agent: 'sm' },
152
+ { theme: 'firefly', agent: 'sm' },
153
+ ]);
154
+ // Count data polygons (excluding grid)
155
+ // Grid lines typically have a specific class or lighter stroke
156
+ const polygonMatches = svg.match(/<polygon[^>]*>/g) || [];
157
+ const pathMatches = svg.match(/<path[^>]*d="M[^"]*"[^>]*>/g) || [];
158
+ // Should have at least 2 data shapes
159
+ assert.ok(polygonMatches.length >= 2 || pathMatches.length >= 2, 'Should have at least 2 data polygons for comparison');
160
+ });
161
+ it('should render 3 distinct polygons for 3 characters', async () => {
162
+ const { generateOverlaySpider } = await import('./generate-spider.js');
163
+ const svg = generateOverlaySpider([
164
+ { theme: 'deadwood', agent: 'sm' },
165
+ { theme: 'firefly', agent: 'sm' },
166
+ { theme: 'star-trek-tng', agent: 'sm' },
167
+ ]);
168
+ // Should have at least 3 data shapes
169
+ const polygonMatches = svg.match(/<polygon[^>]*>/g) || [];
170
+ const pathMatches = svg.match(/<path[^>]*d="M[^"]*"[^>]*>/g) || [];
171
+ assert.ok(polygonMatches.length >= 3 || pathMatches.length >= 3, 'Should have at least 3 data polygons for comparison');
172
+ });
173
+ it('should use different stroke colors for each character', async () => {
174
+ const { generateOverlaySpider } = await import('./generate-spider.js');
175
+ const svg = generateOverlaySpider([
176
+ { theme: 'deadwood', agent: 'sm' },
177
+ { theme: 'firefly', agent: 'sm' },
178
+ ]);
179
+ // Extract stroke colors - should find at least 2 different colors
180
+ const strokeColors = svg.match(/stroke="([^"]+)"/g) || [];
181
+ const uniqueColors = new Set(strokeColors);
182
+ assert.ok(uniqueColors.size >= 2, 'Should use different stroke colors for different characters');
183
+ });
184
+ it('should include legend identifying each character', async () => {
185
+ const { generateOverlaySpider } = await import('./generate-spider.js');
186
+ const svg = generateOverlaySpider([
187
+ { theme: 'deadwood', agent: 'sm' },
188
+ { theme: 'firefly', agent: 'sm' },
189
+ ]);
190
+ // Legend should include theme or character names
191
+ assert.ok(svg.includes('deadwood') || svg.includes('Deadwood') ||
192
+ svg.includes('firefly') || svg.includes('Firefly'), 'Should include legend with theme/character names');
193
+ });
194
+ it('should accept optional labels for overlay characters', async () => {
195
+ const { generateOverlaySpider } = await import('./generate-spider.js');
196
+ const svg = generateOverlaySpider([
197
+ { theme: 'deadwood', agent: 'sm', label: 'Al Swearengen' },
198
+ { theme: 'firefly', agent: 'sm', label: 'Mal Reynolds' },
199
+ ]);
200
+ assert.ok(svg.includes('Al Swearengen') || svg.includes('Mal Reynolds'), 'Should display custom labels when provided');
201
+ });
202
+ });
203
+ // ============================================================================
204
+ // AC5: SVGs render correctly in browsers and markdown
205
+ // ============================================================================
206
+ describe('AC5: Valid SVG Structure', () => {
207
+ it('should include viewBox attribute for scaling', async () => {
208
+ const { generateSpider } = await import('./generate-spider.js');
209
+ const svg = generateSpider('deadwood', 'sm');
210
+ assert.ok(svg.includes('viewBox='), 'Should have viewBox attribute for proper scaling');
211
+ });
212
+ it('should include xmlns attribute for browser compatibility', async () => {
213
+ const { generateSpider } = await import('./generate-spider.js');
214
+ const svg = generateSpider('deadwood', 'sm');
215
+ assert.ok(svg.includes('xmlns="http://www.w3.org/2000/svg"'), 'Should have SVG xmlns for browser rendering');
216
+ });
217
+ it('should be well-formed XML', async () => {
218
+ const { generateSpider } = await import('./generate-spider.js');
219
+ const svg = generateSpider('deadwood', 'sm');
220
+ assert.ok(svg.startsWith('<svg'), 'Should start with <svg');
221
+ assert.ok(svg.endsWith('</svg>'), 'Should end with </svg>');
222
+ });
223
+ it('should use text elements for dimension labels', async () => {
224
+ const { generateSpider } = await import('./generate-spider.js');
225
+ const svg = generateSpider('deadwood', 'sm');
226
+ const textCount = (svg.match(/<text/g) || []).length;
227
+ assert.ok(textCount >= 5, `Should have at least 5 text elements for labels, found ${textCount}`);
228
+ });
229
+ it('should have consistent stroke styling', async () => {
230
+ const { generateSpider } = await import('./generate-spider.js');
231
+ const svg = generateSpider('deadwood', 'sm');
232
+ assert.ok(svg.includes('stroke='), 'Should use stroke for lines');
233
+ assert.ok(svg.includes('stroke-width'), 'Should specify stroke-width');
234
+ });
235
+ it('should use 200x200 viewBox like face generator', async () => {
236
+ const { generateSpider } = await import('./generate-spider.js');
237
+ const svg = generateSpider('deadwood', 'sm');
238
+ assert.ok(svg.includes('viewBox="0 0 200 200"'), 'Should use 200x200 viewBox for consistency with face generator');
239
+ });
240
+ });
241
+ // ============================================================================
242
+ // Integration: Full Pipeline Test
243
+ // ============================================================================
244
+ describe('Integration: Spider Chart Generation Pipeline', () => {
245
+ it('should generate valid SVG for multiple themes', async () => {
246
+ const { generateSpider } = await import('./generate-spider.js');
247
+ const themes = ['deadwood', 'firefly', 'star-trek-tng', 'discworld'];
248
+ for (const theme of themes) {
249
+ const svg = generateSpider(theme, 'sm');
250
+ assert.ok(svg.includes('<svg') && svg.includes('</svg>'), `Should generate valid SVG for ${theme}`);
251
+ }
252
+ });
253
+ it('should produce visually different charts for different OCEAN profiles', async () => {
254
+ const { generateSpiderFromOcean } = await import('./generate-spider.js');
255
+ const introvert = generateSpiderFromOcean({ O: 4, C: 3, E: 1, A: 3, N: 2 });
256
+ const extravert = generateSpiderFromOcean({ O: 4, C: 3, E: 5, A: 3, N: 2 });
257
+ assert.notStrictEqual(introvert, extravert, 'Different E scores should produce different charts');
258
+ });
259
+ it('should work with overlay of same agent across themes', async () => {
260
+ const { generateOverlaySpider } = await import('./generate-spider.js');
261
+ const svg = generateOverlaySpider([
262
+ { theme: 'deadwood', agent: 'reviewer' },
263
+ { theme: 'firefly', agent: 'reviewer' },
264
+ { theme: 'star-trek-tng', agent: 'reviewer' },
265
+ ]);
266
+ assert.ok(svg.includes('<svg') && svg.includes('</svg>'), 'Should generate valid overlay SVG');
267
+ });
268
+ });
269
+ //# sourceMappingURL=generate-spider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-spider.test.js","sourceRoot":"","sources":["../../src/scripts/generate-spider.test.ts"],"names":[],"mappings":"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"}