@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,616 @@
1
+ /**
2
+ * Tests for Story 7-4: Aggregate Job-Fair Results into Benchmark Statistics
3
+ *
4
+ * These tests verify:
5
+ * AC1: Job-fair results contribute to overall benchmark statistics
6
+ * AC2: Baseline calculations incorporate job-fair control runs
7
+ * AC3: Scenario performance tracked across themes
8
+ * AC4: Summary statistics available (mean by role, variance, top performers)
9
+ * AC5: Historical trend tracking for benchmark quality
10
+ *
11
+ * Run with: npm test
12
+ */
13
+ import { describe, it, beforeEach, afterEach } from 'node:test';
14
+ import assert from 'node:assert';
15
+ import { mkdirSync, writeFileSync, rmSync, existsSync } from 'fs';
16
+ import { join } from 'path';
17
+ // ============================================================================
18
+ // Test Fixtures
19
+ // ============================================================================
20
+ const TEST_RESULTS_DIR = join(process.cwd(), 'internal', 'results', 'job-fair-test');
21
+ // Mock summary.yaml content for theme "alpha"
22
+ const MOCK_ALPHA_SUMMARY = `
23
+ theme: alpha
24
+ timestamp: "2026-01-05T10:00:00Z"
25
+ runs_per_combination: 3
26
+ total_runs: 15
27
+ champions:
28
+ dev:
29
+ character: alice
30
+ score: 85.5
31
+ theme: alpha
32
+ reviewer:
33
+ character: bob
34
+ score: 78.2
35
+ theme: alpha
36
+ matrix:
37
+ alice:
38
+ dev: 85.5
39
+ reviewer: 72.0
40
+ bob:
41
+ dev: 80.0
42
+ reviewer: 78.2
43
+ overall_rankings:
44
+ - character: alice
45
+ average: 78.75
46
+ - character: bob
47
+ average: 79.1
48
+ role_rankings:
49
+ dev:
50
+ - character: alice
51
+ score: 85.5
52
+ - character: bob
53
+ score: 80.0
54
+ reviewer:
55
+ - character: bob
56
+ score: 78.2
57
+ - character: alice
58
+ score: 72.0
59
+ `;
60
+ // Mock summary.yaml content for theme "beta"
61
+ const MOCK_BETA_SUMMARY = `
62
+ theme: beta
63
+ timestamp: "2026-01-06T10:00:00Z"
64
+ runs_per_combination: 3
65
+ total_runs: 15
66
+ champions:
67
+ dev:
68
+ character: carol
69
+ score: 90.0
70
+ theme: beta
71
+ reviewer:
72
+ character: dave
73
+ score: 82.5
74
+ theme: beta
75
+ matrix:
76
+ carol:
77
+ dev: 90.0
78
+ reviewer: 75.0
79
+ dave:
80
+ dev: 70.0
81
+ reviewer: 82.5
82
+ overall_rankings:
83
+ - character: carol
84
+ average: 82.5
85
+ - character: dave
86
+ average: 76.25
87
+ role_rankings:
88
+ dev:
89
+ - character: carol
90
+ score: 90.0
91
+ - character: dave
92
+ score: 70.0
93
+ reviewer:
94
+ - character: dave
95
+ score: 82.5
96
+ - character: carol
97
+ score: 75.0
98
+ `;
99
+ function setupTestFixtures() {
100
+ // Create test directory structure
101
+ const alphaDir = join(TEST_RESULTS_DIR, 'alpha-20260105T100000Z');
102
+ const betaDir = join(TEST_RESULTS_DIR, 'beta-20260106T100000Z');
103
+ mkdirSync(alphaDir, { recursive: true });
104
+ mkdirSync(betaDir, { recursive: true });
105
+ writeFileSync(join(alphaDir, 'summary.yaml'), MOCK_ALPHA_SUMMARY);
106
+ writeFileSync(join(betaDir, 'summary.yaml'), MOCK_BETA_SUMMARY);
107
+ }
108
+ function cleanupTestFixtures() {
109
+ if (existsSync(TEST_RESULTS_DIR)) {
110
+ rmSync(TEST_RESULTS_DIR, { recursive: true, force: true });
111
+ }
112
+ }
113
+ // ============================================================================
114
+ // AC1: Job-fair results contribute to overall benchmark statistics
115
+ // ============================================================================
116
+ describe('AC1: Module Exports Core Aggregation Functions', () => {
117
+ it('should export aggregateJobFairResults function', async () => {
118
+ const module = await import('./job-fair-aggregator.js');
119
+ assert.ok(typeof module.aggregateJobFairResults === 'function', 'aggregateJobFairResults should be a function');
120
+ });
121
+ it('should export AggregateStats type via return type', async () => {
122
+ const module = await import('./job-fair-aggregator.js');
123
+ // Type check happens at compile time; runtime check is function existence
124
+ assert.ok(module.aggregateJobFairResults, 'aggregateJobFairResults should exist');
125
+ });
126
+ });
127
+ describe('AC1: Aggregation Combines Theme Results', () => {
128
+ beforeEach(() => setupTestFixtures());
129
+ afterEach(() => cleanupTestFixtures());
130
+ it('should aggregate results from multiple theme directories', async () => {
131
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
132
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
133
+ assert.ok(stats, 'Should return aggregate stats');
134
+ assert.ok(Array.isArray(stats.themes_included), 'Should list included themes');
135
+ assert.ok(stats.themes_included.length >= 2, 'Should include at least 2 themes');
136
+ assert.ok(stats.themes_included.includes('alpha'), 'Should include alpha theme');
137
+ assert.ok(stats.themes_included.includes('beta'), 'Should include beta theme');
138
+ });
139
+ it('should include last_updated timestamp', async () => {
140
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
141
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
142
+ assert.ok(stats.last_updated, 'Should include last_updated');
143
+ assert.ok(/^\d{4}-\d{2}-\d{2}/.test(stats.last_updated), 'last_updated should be ISO date format');
144
+ });
145
+ it('should handle empty results directory gracefully', async () => {
146
+ const emptyDir = join(TEST_RESULTS_DIR, 'empty');
147
+ mkdirSync(emptyDir, { recursive: true });
148
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
149
+ const stats = await aggregateJobFairResults(emptyDir);
150
+ assert.ok(stats, 'Should return stats even for empty dir');
151
+ assert.deepStrictEqual(stats.themes_included, [], 'Should have empty themes list');
152
+ });
153
+ });
154
+ // ============================================================================
155
+ // AC2: Baseline calculations incorporate job-fair control runs
156
+ // ============================================================================
157
+ describe('AC2: Baseline Comparison Functions', () => {
158
+ it('should export getBaselineComparison function', async () => {
159
+ const module = await import('./job-fair-aggregator.js');
160
+ assert.ok(typeof module.getBaselineComparison === 'function', 'getBaselineComparison should be a function');
161
+ });
162
+ });
163
+ describe('AC2: Baseline Integration', () => {
164
+ beforeEach(() => setupTestFixtures());
165
+ afterEach(() => cleanupTestFixtures());
166
+ it('should calculate baseline_comparison for each role', async () => {
167
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
168
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
169
+ assert.ok(stats.by_role, 'Should have by_role stats');
170
+ assert.ok(stats.by_role.dev, 'Should have dev role stats');
171
+ // baseline_comparison shows delta from control baseline
172
+ assert.ok(typeof stats.by_role.dev.baseline_comparison === 'number', 'dev should have baseline_comparison');
173
+ });
174
+ it('should handle missing baseline gracefully', async () => {
175
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
176
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
177
+ // If no baseline exists for a role, baseline_comparison should be null or 0
178
+ const devComparison = stats.by_role.dev?.baseline_comparison;
179
+ assert.ok(devComparison === null || typeof devComparison === 'number', 'Missing baseline should return null or number');
180
+ });
181
+ });
182
+ // ============================================================================
183
+ // AC3: Scenario performance tracked across themes
184
+ // ============================================================================
185
+ describe('AC3: Role Statistics Functions', () => {
186
+ it('should export getRoleStatistics function', async () => {
187
+ const module = await import('./job-fair-aggregator.js');
188
+ assert.ok(typeof module.getRoleStatistics === 'function', 'getRoleStatistics should be a function');
189
+ });
190
+ });
191
+ describe('AC3: Cross-Theme Role Performance', () => {
192
+ beforeEach(() => setupTestFixtures());
193
+ afterEach(() => cleanupTestFixtures());
194
+ it('should track performance by role across all themes', async () => {
195
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
196
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
197
+ assert.ok(stats.by_role, 'Should have by_role object');
198
+ assert.ok(stats.by_role.dev, 'Should have dev role');
199
+ assert.ok(stats.by_role.reviewer, 'Should have reviewer role');
200
+ });
201
+ it('should calculate per-role mean score across themes', async () => {
202
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
203
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
204
+ // Dev scores: alpha-alice=85.5, alpha-bob=80.0, beta-carol=90.0, beta-dave=70.0
205
+ // Mean should be (85.5 + 80.0 + 90.0 + 70.0) / 4 = 81.375
206
+ assert.ok(typeof stats.by_role.dev.mean_score === 'number', 'dev should have mean_score');
207
+ // Allow some floating point tolerance
208
+ assert.ok(stats.by_role.dev.mean_score > 70 && stats.by_role.dev.mean_score < 95, 'dev mean should be reasonable');
209
+ });
210
+ it('should provide role-specific statistics via getRoleStatistics', async () => {
211
+ const { getRoleStatistics } = await import('./job-fair-aggregator.js');
212
+ const devStats = await getRoleStatistics('dev', TEST_RESULTS_DIR);
213
+ assert.ok(devStats, 'Should return dev statistics');
214
+ assert.ok(typeof devStats.mean_score === 'number', 'Should have mean_score');
215
+ assert.ok(typeof devStats.std_dev === 'number', 'Should have std_dev');
216
+ assert.ok(Array.isArray(devStats.top_performers), 'Should have top_performers array');
217
+ });
218
+ });
219
+ // ============================================================================
220
+ // AC4: Summary statistics (mean by role, variance, top performers)
221
+ // ============================================================================
222
+ describe('AC4: Top Performers Functions', () => {
223
+ it('should export getTopPerformers function', async () => {
224
+ const module = await import('./job-fair-aggregator.js');
225
+ assert.ok(typeof module.getTopPerformers === 'function', 'getTopPerformers should be a function');
226
+ });
227
+ });
228
+ describe('AC4: Summary Statistics', () => {
229
+ beforeEach(() => setupTestFixtures());
230
+ afterEach(() => cleanupTestFixtures());
231
+ it('should calculate standard deviation for each role', async () => {
232
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
233
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
234
+ assert.ok(typeof stats.by_role.dev.std_dev === 'number', 'dev should have std_dev');
235
+ assert.ok(stats.by_role.dev.std_dev >= 0, 'std_dev should be non-negative');
236
+ });
237
+ it('should identify top performers per role', async () => {
238
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
239
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
240
+ assert.ok(Array.isArray(stats.by_role.dev.top_performers), 'dev should have top_performers array');
241
+ assert.ok(stats.by_role.dev.top_performers.length > 0, 'Should have at least one top performer');
242
+ const topDev = stats.by_role.dev.top_performers[0];
243
+ assert.ok(topDev.character, 'Top performer should have character name');
244
+ assert.ok(topDev.theme, 'Top performer should have theme');
245
+ assert.ok(typeof topDev.score === 'number', 'Top performer should have score');
246
+ });
247
+ it('should return top performers via getTopPerformers function', async () => {
248
+ const { getTopPerformers } = await import('./job-fair-aggregator.js');
249
+ const topDevs = await getTopPerformers('dev', 3, TEST_RESULTS_DIR);
250
+ assert.ok(Array.isArray(topDevs), 'Should return array');
251
+ assert.ok(topDevs.length <= 3, 'Should respect limit');
252
+ if (topDevs.length > 1) {
253
+ // Should be sorted by score descending
254
+ assert.ok(topDevs[0].score >= topDevs[1].score, 'Top performers should be sorted by score');
255
+ }
256
+ });
257
+ it('should identify overall champions across all themes', async () => {
258
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
259
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
260
+ assert.ok(Array.isArray(stats.overall_champions), 'Should have overall_champions array');
261
+ if (stats.overall_champions.length > 0) {
262
+ const champion = stats.overall_champions[0];
263
+ assert.ok(champion.character, 'Champion should have character');
264
+ assert.ok(champion.theme, 'Champion should have theme');
265
+ assert.ok(typeof champion.avg_score === 'number', 'Champion should have avg_score');
266
+ }
267
+ });
268
+ });
269
+ // ============================================================================
270
+ // AC5: Historical trend tracking for benchmark quality
271
+ // ============================================================================
272
+ describe('AC5: Historical Trend Functions', () => {
273
+ it('should export getHistoricalTrend function', async () => {
274
+ const module = await import('./job-fair-aggregator.js');
275
+ assert.ok(typeof module.getHistoricalTrend === 'function', 'getHistoricalTrend should be a function');
276
+ });
277
+ it('should export saveHistoricalSnapshot function', async () => {
278
+ const module = await import('./job-fair-aggregator.js');
279
+ assert.ok(typeof module.saveHistoricalSnapshot === 'function', 'saveHistoricalSnapshot should be a function');
280
+ });
281
+ });
282
+ describe('AC5: Historical Trend Tracking', () => {
283
+ beforeEach(() => setupTestFixtures());
284
+ afterEach(() => cleanupTestFixtures());
285
+ it('should include historical_trend in aggregate stats', async () => {
286
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
287
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
288
+ assert.ok(Array.isArray(stats.historical_trend), 'Should have historical_trend array');
289
+ });
290
+ it('should track trend points with date, mean, and variance', async () => {
291
+ const { aggregateJobFairResults, saveHistoricalSnapshot } = await import('./job-fair-aggregator.js');
292
+ // Save a snapshot first
293
+ await saveHistoricalSnapshot(TEST_RESULTS_DIR);
294
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
295
+ if (stats.historical_trend.length > 0) {
296
+ const point = stats.historical_trend[0];
297
+ assert.ok(point.date, 'Trend point should have date');
298
+ assert.ok(typeof point.mean === 'number', 'Trend point should have mean');
299
+ assert.ok(typeof point.variance === 'number', 'Trend point should have variance');
300
+ }
301
+ });
302
+ it('should return trend data via getHistoricalTrend function', async () => {
303
+ const { getHistoricalTrend, saveHistoricalSnapshot } = await import('./job-fair-aggregator.js');
304
+ // Save snapshot to ensure there's data
305
+ await saveHistoricalSnapshot(TEST_RESULTS_DIR);
306
+ const trend = await getHistoricalTrend(undefined, TEST_RESULTS_DIR);
307
+ assert.ok(Array.isArray(trend), 'Should return array');
308
+ });
309
+ it('should support role-specific trend filtering', async () => {
310
+ const { getHistoricalTrend, saveHistoricalSnapshot } = await import('./job-fair-aggregator.js');
311
+ await saveHistoricalSnapshot(TEST_RESULTS_DIR);
312
+ const devTrend = await getHistoricalTrend('dev', TEST_RESULTS_DIR);
313
+ assert.ok(Array.isArray(devTrend), 'Should return array for dev role');
314
+ });
315
+ });
316
+ // ============================================================================
317
+ // Edge Cases and Error Handling
318
+ // ============================================================================
319
+ describe('Edge Cases: Malformed Data', () => {
320
+ beforeEach(() => setupTestFixtures());
321
+ afterEach(() => cleanupTestFixtures());
322
+ it('should skip directories without summary.yaml', async () => {
323
+ // Create a directory without summary.yaml
324
+ const badDir = join(TEST_RESULTS_DIR, 'bad-theme-20260107');
325
+ mkdirSync(badDir, { recursive: true });
326
+ // No summary.yaml written
327
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
328
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
329
+ assert.ok(stats, 'Should still return stats');
330
+ assert.ok(!stats.themes_included.includes('bad-theme'), 'Should not include bad theme');
331
+ });
332
+ it('should handle malformed YAML gracefully', async () => {
333
+ const badDir = join(TEST_RESULTS_DIR, 'malformed-20260107');
334
+ mkdirSync(badDir, { recursive: true });
335
+ writeFileSync(join(badDir, 'summary.yaml'), 'this: is: not: valid: yaml: [[[');
336
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
337
+ // Should not throw, should skip malformed file
338
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
339
+ assert.ok(stats, 'Should return stats despite malformed YAML');
340
+ });
341
+ });
342
+ describe('Edge Cases: Statistical Calculations', () => {
343
+ it('should handle single theme (no variance possible)', async () => {
344
+ cleanupTestFixtures();
345
+ // Create only one theme
346
+ const singleDir = join(TEST_RESULTS_DIR, 'single-20260105');
347
+ mkdirSync(singleDir, { recursive: true });
348
+ writeFileSync(join(singleDir, 'summary.yaml'), MOCK_ALPHA_SUMMARY);
349
+ const { aggregateJobFairResults } = await import('./job-fair-aggregator.js');
350
+ const stats = await aggregateJobFairResults(TEST_RESULTS_DIR);
351
+ assert.ok(stats, 'Should return stats for single theme');
352
+ assert.strictEqual(stats.themes_included.length, 1, 'Should have one theme');
353
+ // std_dev for single value should be 0 or handled gracefully
354
+ assert.ok(stats.by_role.dev.std_dev === 0 || stats.by_role.dev.std_dev >= 0, 'std_dev should be 0 or valid for single theme');
355
+ cleanupTestFixtures();
356
+ });
357
+ });
358
+ // ============================================================================
359
+ // Story 7-5: Persona Differential Dimensions
360
+ // ============================================================================
361
+ const TEST_THEMES_DIR = join(process.cwd(), 'internal', 'results', 'themes-test');
362
+ // Mock theme YAML with dimensions
363
+ const MOCK_THEME_COMEDIC = `
364
+ theme:
365
+ name: comedic-theme
366
+ description: A comedic theme
367
+ dimensions:
368
+ tone: comedic
369
+ era: contemporary
370
+ genre: comedy
371
+ energy: high-energy
372
+ agents:
373
+ orchestrator:
374
+ character: Joker
375
+ `;
376
+ const MOCK_THEME_SERIOUS = `
377
+ theme:
378
+ name: serious-theme
379
+ description: A serious theme
380
+ dimensions:
381
+ tone: serious
382
+ era: futuristic
383
+ genre: sci-fi
384
+ energy: contemplative
385
+ agents:
386
+ orchestrator:
387
+ character: Commander
388
+ `;
389
+ const MOCK_THEME_NO_DIMENSIONS = `
390
+ theme:
391
+ name: no-dims
392
+ description: Theme without dimensions
393
+ agents:
394
+ orchestrator:
395
+ character: Generic
396
+ `;
397
+ function setupDimensionTestFixtures() {
398
+ // Create test theme directory
399
+ mkdirSync(TEST_THEMES_DIR, { recursive: true });
400
+ // Write theme files
401
+ writeFileSync(join(TEST_THEMES_DIR, 'comedic-theme.yaml'), MOCK_THEME_COMEDIC);
402
+ writeFileSync(join(TEST_THEMES_DIR, 'serious-theme.yaml'), MOCK_THEME_SERIOUS);
403
+ writeFileSync(join(TEST_THEMES_DIR, 'no-dims.yaml'), MOCK_THEME_NO_DIMENSIONS);
404
+ // Create results directories for these themes
405
+ const comedicDir = join(TEST_RESULTS_DIR, 'comedic-theme-20260107T100000Z');
406
+ const seriousDir = join(TEST_RESULTS_DIR, 'serious-theme-20260107T100000Z');
407
+ mkdirSync(comedicDir, { recursive: true });
408
+ mkdirSync(seriousDir, { recursive: true });
409
+ // Comedic theme results
410
+ writeFileSync(join(comedicDir, 'summary.yaml'), `
411
+ theme: comedic-theme
412
+ timestamp: "2026-01-07T10:00:00Z"
413
+ matrix:
414
+ joker:
415
+ dev: 92.0
416
+ reviewer: 88.0
417
+ clown:
418
+ dev: 88.0
419
+ reviewer: 85.0
420
+ `);
421
+ // Serious theme results
422
+ writeFileSync(join(seriousDir, 'summary.yaml'), `
423
+ theme: serious-theme
424
+ timestamp: "2026-01-07T10:00:00Z"
425
+ matrix:
426
+ commander:
427
+ dev: 85.0
428
+ reviewer: 90.0
429
+ officer:
430
+ dev: 82.0
431
+ reviewer: 88.0
432
+ `);
433
+ }
434
+ function cleanupDimensionTestFixtures() {
435
+ if (existsSync(TEST_THEMES_DIR)) {
436
+ rmSync(TEST_THEMES_DIR, { recursive: true, force: true });
437
+ }
438
+ cleanupTestFixtures();
439
+ }
440
+ describe('Story 7-5: Dimension Type Exports', () => {
441
+ it('should export DimensionName type', async () => {
442
+ const module = await import('./job-fair-aggregator.js');
443
+ // Type exists at compile time; runtime check is that related functions exist
444
+ assert.ok(module.aggregateByDimension, 'aggregateByDimension should exist');
445
+ });
446
+ it('should export aggregateByDimension function', async () => {
447
+ const module = await import('./job-fair-aggregator.js');
448
+ assert.ok(typeof module.aggregateByDimension === 'function', 'aggregateByDimension should be a function');
449
+ });
450
+ it('should export getDimensionValues function', async () => {
451
+ const module = await import('./job-fair-aggregator.js');
452
+ assert.ok(typeof module.getDimensionValues === 'function', 'getDimensionValues should be a function');
453
+ });
454
+ it('should export generateDifferentialReport function', async () => {
455
+ const module = await import('./job-fair-aggregator.js');
456
+ assert.ok(typeof module.generateDifferentialReport === 'function', 'generateDifferentialReport should be a function');
457
+ });
458
+ });
459
+ describe('Story 7-5: getDimensionValues', () => {
460
+ beforeEach(() => {
461
+ setupTestFixtures();
462
+ setupDimensionTestFixtures();
463
+ });
464
+ afterEach(() => cleanupDimensionTestFixtures());
465
+ it('should list themes by dimension value', async () => {
466
+ const { getDimensionValues } = await import('./job-fair-aggregator.js');
467
+ const values = await getDimensionValues('tone', TEST_THEMES_DIR);
468
+ assert.ok(Array.isArray(values), 'Should return array');
469
+ assert.ok(values.length >= 2, 'Should have at least 2 tone values');
470
+ // Check structure
471
+ const comedic = values.find(v => v.value === 'comedic');
472
+ const serious = values.find(v => v.value === 'serious');
473
+ assert.ok(comedic, 'Should find comedic tone');
474
+ assert.ok(serious, 'Should find serious tone');
475
+ assert.ok(comedic.theme_count >= 1, 'Comedic should have at least 1 theme');
476
+ assert.ok(serious.theme_count >= 1, 'Serious should have at least 1 theme');
477
+ });
478
+ it('should handle all dimension types', async () => {
479
+ const { getDimensionValues } = await import('./job-fair-aggregator.js');
480
+ const toneValues = await getDimensionValues('tone', TEST_THEMES_DIR);
481
+ const eraValues = await getDimensionValues('era', TEST_THEMES_DIR);
482
+ const genreValues = await getDimensionValues('genre', TEST_THEMES_DIR);
483
+ const energyValues = await getDimensionValues('energy', TEST_THEMES_DIR);
484
+ assert.ok(toneValues.length >= 1, 'Should have tone values');
485
+ assert.ok(eraValues.length >= 1, 'Should have era values');
486
+ assert.ok(genreValues.length >= 1, 'Should have genre values');
487
+ assert.ok(energyValues.length >= 1, 'Should have energy values');
488
+ });
489
+ it('should skip themes without dimensions', async () => {
490
+ const { getDimensionValues } = await import('./job-fair-aggregator.js');
491
+ const values = await getDimensionValues('tone', TEST_THEMES_DIR);
492
+ // no-dims theme should not contribute to any dimension counts
493
+ const total = values.reduce((sum, v) => sum + v.theme_count, 0);
494
+ assert.ok(total === 2, 'Total should be 2 (comedic + serious, not no-dims)');
495
+ });
496
+ });
497
+ describe('Story 7-5: aggregateByDimension', () => {
498
+ beforeEach(() => {
499
+ setupTestFixtures();
500
+ setupDimensionTestFixtures();
501
+ });
502
+ afterEach(() => cleanupDimensionTestFixtures());
503
+ it('should group results by dimension value', async () => {
504
+ const { aggregateByDimension } = await import('./job-fair-aggregator.js');
505
+ const stats = await aggregateByDimension('tone', TEST_RESULTS_DIR, TEST_THEMES_DIR);
506
+ assert.ok(stats, 'Should return dimension stats');
507
+ assert.strictEqual(stats.dimension, 'tone', 'Should indicate dimension');
508
+ assert.ok(Array.isArray(stats.values), 'Should have values array');
509
+ });
510
+ it('should calculate per-value statistics', async () => {
511
+ const { aggregateByDimension } = await import('./job-fair-aggregator.js');
512
+ const stats = await aggregateByDimension('tone', TEST_RESULTS_DIR, TEST_THEMES_DIR);
513
+ const comedic = stats.values.find(v => v.value === 'comedic');
514
+ assert.ok(comedic, 'Should find comedic group');
515
+ assert.ok(comedic.themes.length >= 1, 'Comedic should have themes');
516
+ assert.ok(comedic.sample_size > 0, 'Comedic should have samples');
517
+ assert.ok(typeof comedic.overall_mean === 'number', 'Should have overall_mean');
518
+ assert.ok(comedic.by_role.dev, 'Should have dev role stats');
519
+ assert.ok(typeof comedic.by_role.dev.mean_score === 'number', 'Dev should have mean_score');
520
+ });
521
+ it('should generate pairwise comparisons', async () => {
522
+ const { aggregateByDimension } = await import('./job-fair-aggregator.js');
523
+ const stats = await aggregateByDimension('tone', TEST_RESULTS_DIR, TEST_THEMES_DIR);
524
+ assert.ok(Array.isArray(stats.comparisons), 'Should have comparisons array');
525
+ if (stats.comparisons.length > 0) {
526
+ const comp = stats.comparisons[0];
527
+ assert.ok(comp.dimension === 'tone', 'Comparison should have dimension');
528
+ assert.ok(comp.value_a, 'Comparison should have value_a');
529
+ assert.ok(comp.value_b, 'Comparison should have value_b');
530
+ assert.ok(typeof comp.delta === 'number', 'Comparison should have delta');
531
+ assert.ok(['significant', 'marginal', 'not_significant'].includes(comp.significance), 'Comparison should have significance level');
532
+ }
533
+ });
534
+ it('should include per-role comparisons', async () => {
535
+ const { aggregateByDimension } = await import('./job-fair-aggregator.js');
536
+ const stats = await aggregateByDimension('tone', TEST_RESULTS_DIR, TEST_THEMES_DIR);
537
+ if (stats.comparisons.length > 0) {
538
+ const comp = stats.comparisons[0];
539
+ assert.ok(comp.by_role, 'Comparison should have by_role');
540
+ if (comp.by_role.dev) {
541
+ assert.ok(typeof comp.by_role.dev.delta === 'number', 'Role comparison should have delta');
542
+ assert.ok(comp.by_role.dev.significance, 'Role comparison should have significance');
543
+ }
544
+ }
545
+ });
546
+ });
547
+ describe('Story 7-5: generateDifferentialReport', () => {
548
+ beforeEach(() => {
549
+ setupTestFixtures();
550
+ setupDimensionTestFixtures();
551
+ });
552
+ afterEach(() => cleanupDimensionTestFixtures());
553
+ it('should generate markdown report', async () => {
554
+ const { generateDifferentialReport } = await import('./job-fair-aggregator.js');
555
+ const report = await generateDifferentialReport('tone', TEST_RESULTS_DIR, TEST_THEMES_DIR);
556
+ assert.ok(typeof report === 'string', 'Report should be a string');
557
+ assert.ok(report.includes('# Differential Report'), 'Report should have title');
558
+ assert.ok(report.includes('tone'), 'Report should mention dimension');
559
+ });
560
+ it('should include summary by value', async () => {
561
+ const { generateDifferentialReport } = await import('./job-fair-aggregator.js');
562
+ const report = await generateDifferentialReport('tone', TEST_RESULTS_DIR, TEST_THEMES_DIR);
563
+ assert.ok(report.includes('## Summary by Value'), 'Report should have summary section');
564
+ assert.ok(report.includes('Overall mean'), 'Report should include overall mean');
565
+ });
566
+ it('should include pairwise comparisons', async () => {
567
+ const { generateDifferentialReport } = await import('./job-fair-aggregator.js');
568
+ const report = await generateDifferentialReport('tone', TEST_RESULTS_DIR, TEST_THEMES_DIR);
569
+ assert.ok(report.includes('## Pairwise Comparisons'), 'Report should have comparisons section');
570
+ });
571
+ it('should indicate significance levels', async () => {
572
+ const { generateDifferentialReport } = await import('./job-fair-aggregator.js');
573
+ const report = await generateDifferentialReport('tone', TEST_RESULTS_DIR, TEST_THEMES_DIR);
574
+ // Report should mention significance in some form
575
+ const hasSignificance = report.includes('SIGNIFICANT') ||
576
+ report.includes('marginal') ||
577
+ report.includes('not significant');
578
+ assert.ok(hasSignificance, 'Report should indicate significance levels');
579
+ });
580
+ });
581
+ describe('Story 7-5: Edge Cases', () => {
582
+ beforeEach(() => setupDimensionTestFixtures());
583
+ afterEach(() => cleanupDimensionTestFixtures());
584
+ it('should handle empty results directory', async () => {
585
+ const { aggregateByDimension } = await import('./job-fair-aggregator.js');
586
+ const emptyDir = join(TEST_RESULTS_DIR, 'empty');
587
+ mkdirSync(emptyDir, { recursive: true });
588
+ const stats = await aggregateByDimension('tone', emptyDir, TEST_THEMES_DIR);
589
+ assert.ok(stats, 'Should return stats');
590
+ assert.deepStrictEqual(stats.values, [], 'Should have empty values');
591
+ assert.deepStrictEqual(stats.comparisons, [], 'Should have empty comparisons');
592
+ });
593
+ it('should handle themes without matching dimension', async () => {
594
+ const { aggregateByDimension } = await import('./job-fair-aggregator.js');
595
+ // Create a theme with only some dimensions
596
+ const partialTheme = join(TEST_THEMES_DIR, 'partial.yaml');
597
+ writeFileSync(partialTheme, `
598
+ theme:
599
+ name: partial
600
+ dimensions:
601
+ tone: comedic
602
+ # missing era, genre, energy
603
+ `);
604
+ const stats = await aggregateByDimension('era', TEST_RESULTS_DIR, TEST_THEMES_DIR);
605
+ // Should still work, just with fewer themes
606
+ assert.ok(stats, 'Should return stats');
607
+ });
608
+ it('should handle non-existent themes directory', async () => {
609
+ const { getDimensionValues } = await import('./job-fair-aggregator.js');
610
+ const nonExistent = join(process.cwd(), 'does-not-exist');
611
+ const values = await getDimensionValues('tone', nonExistent);
612
+ assert.ok(Array.isArray(values), 'Should return empty array');
613
+ assert.strictEqual(values.length, 0, 'Should have no values');
614
+ });
615
+ });
616
+ //# sourceMappingURL=job-fair-aggregator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-fair-aggregator.test.js","sourceRoot":"","sources":["../../src/scripts/job-fair-aggregator.test.ts"],"names":[],"mappings":"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"}