@pennyfarthing/core 7.4.0 → 7.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/dist/cli/utils/files.d.ts +0 -1
  2. package/dist/cli/utils/files.js +73 -56
  3. package/dist/cli/utils/manifest.d.ts +0 -1
  4. package/dist/cli/utils/manifest.js +48 -45
  5. package/dist/cli/utils/version.d.ts +0 -1
  6. package/dist/cli/utils/version.js +38 -32
  7. package/dist/index.d.ts +0 -1
  8. package/dist/index.js +39 -11
  9. package/dist/permissions/index.d.ts +0 -1
  10. package/dist/permissions/index.js +7 -4
  11. package/dist/permissions/permission-schema.d.ts +0 -1
  12. package/dist/permissions/permission-schema.js +13 -9
  13. package/dist/scripts/job-fair-aggregator.d.ts +0 -1
  14. package/dist/scripts/job-fair-aggregator.js +484 -341
  15. package/dist/workflow/index.d.ts +0 -1
  16. package/dist/workflow/index.js +12 -5
  17. package/dist/workflow/workflow-loader.d.ts +0 -1
  18. package/dist/workflow/workflow-loader.js +40 -34
  19. package/dist/workflow/workflow-permissions.d.ts +0 -1
  20. package/dist/workflow/workflow-permissions.js +14 -8
  21. package/dist/workflow/workflow-router.d.ts +0 -1
  22. package/dist/workflow/workflow-router.js +70 -51
  23. package/dist/workflow/workflow-schema.d.ts +0 -1
  24. package/dist/workflow/workflow-schema.js +62 -59
  25. package/package.json +1 -1
  26. package/dist/bmad/context-reader.d.ts +0 -71
  27. package/dist/bmad/context-reader.d.ts.map +0 -1
  28. package/dist/bmad/context-reader.js +0 -369
  29. package/dist/bmad/context-reader.js.map +0 -1
  30. package/dist/bmad/context-reader.test.d.ts +0 -71
  31. package/dist/bmad/context-reader.test.d.ts.map +0 -1
  32. package/dist/bmad/context-reader.test.js +0 -878
  33. package/dist/bmad/context-reader.test.js.map +0 -1
  34. package/dist/bmad/epics-parser.d.ts +0 -61
  35. package/dist/bmad/epics-parser.d.ts.map +0 -1
  36. package/dist/bmad/epics-parser.js +0 -331
  37. package/dist/bmad/epics-parser.js.map +0 -1
  38. package/dist/bmad/epics-parser.test.d.ts +0 -7
  39. package/dist/bmad/epics-parser.test.d.ts.map +0 -1
  40. package/dist/bmad/epics-parser.test.js +0 -449
  41. package/dist/bmad/epics-parser.test.js.map +0 -1
  42. package/dist/bmad/index.d.ts +0 -11
  43. package/dist/bmad/index.d.ts.map +0 -1
  44. package/dist/bmad/index.js +0 -24
  45. package/dist/bmad/index.js.map +0 -1
  46. package/dist/bmad/status-sync.d.ts +0 -173
  47. package/dist/bmad/status-sync.d.ts.map +0 -1
  48. package/dist/bmad/status-sync.js +0 -463
  49. package/dist/bmad/status-sync.js.map +0 -1
  50. package/dist/bmad/status-sync.test.d.ts +0 -7
  51. package/dist/bmad/status-sync.test.d.ts.map +0 -1
  52. package/dist/bmad/status-sync.test.js +0 -702
  53. package/dist/bmad/status-sync.test.js.map +0 -1
  54. package/dist/bmad/story-exporter.d.ts +0 -55
  55. package/dist/bmad/story-exporter.d.ts.map +0 -1
  56. package/dist/bmad/story-exporter.js +0 -170
  57. package/dist/bmad/story-exporter.js.map +0 -1
  58. package/dist/bmad/story-exporter.test.d.ts +0 -51
  59. package/dist/bmad/story-exporter.test.d.ts.map +0 -1
  60. package/dist/bmad/story-exporter.test.js +0 -603
  61. package/dist/bmad/story-exporter.test.js.map +0 -1
  62. package/dist/bmad/story-parser.d.ts +0 -44
  63. package/dist/bmad/story-parser.d.ts.map +0 -1
  64. package/dist/bmad/story-parser.js +0 -307
  65. package/dist/bmad/story-parser.js.map +0 -1
  66. package/dist/bmad/story-parser.test.d.ts +0 -44
  67. package/dist/bmad/story-parser.test.d.ts.map +0 -1
  68. package/dist/bmad/story-parser.test.js +0 -693
  69. package/dist/bmad/story-parser.test.js.map +0 -1
  70. package/dist/cli/commands/command.d.ts +0 -28
  71. package/dist/cli/commands/command.d.ts.map +0 -1
  72. package/dist/cli/commands/command.js +0 -399
  73. package/dist/cli/commands/command.js.map +0 -1
  74. package/dist/cli/commands/cyclist.d.ts +0 -46
  75. package/dist/cli/commands/cyclist.d.ts.map +0 -1
  76. package/dist/cli/commands/cyclist.js +0 -196
  77. package/dist/cli/commands/cyclist.js.map +0 -1
  78. package/dist/cli/commands/cyclist.test.d.ts +0 -13
  79. package/dist/cli/commands/cyclist.test.d.ts.map +0 -1
  80. package/dist/cli/commands/cyclist.test.js +0 -245
  81. package/dist/cli/commands/cyclist.test.js.map +0 -1
  82. package/dist/cli/commands/doctor.d.ts +0 -9
  83. package/dist/cli/commands/doctor.d.ts.map +0 -1
  84. package/dist/cli/commands/doctor.js +0 -652
  85. package/dist/cli/commands/doctor.js.map +0 -1
  86. package/dist/cli/commands/init.d.ts +0 -8
  87. package/dist/cli/commands/init.d.ts.map +0 -1
  88. package/dist/cli/commands/init.js +0 -524
  89. package/dist/cli/commands/init.js.map +0 -1
  90. package/dist/cli/commands/skill.d.ts +0 -28
  91. package/dist/cli/commands/skill.d.ts.map +0 -1
  92. package/dist/cli/commands/skill.js +0 -416
  93. package/dist/cli/commands/skill.js.map +0 -1
  94. package/dist/cli/commands/theme.d.ts +0 -21
  95. package/dist/cli/commands/theme.d.ts.map +0 -1
  96. package/dist/cli/commands/theme.js +0 -201
  97. package/dist/cli/commands/theme.js.map +0 -1
  98. package/dist/cli/commands/uninstall.d.ts +0 -8
  99. package/dist/cli/commands/uninstall.d.ts.map +0 -1
  100. package/dist/cli/commands/uninstall.js +0 -237
  101. package/dist/cli/commands/uninstall.js.map +0 -1
  102. package/dist/cli/commands/update.d.ts +0 -9
  103. package/dist/cli/commands/update.d.ts.map +0 -1
  104. package/dist/cli/commands/update.js +0 -418
  105. package/dist/cli/commands/update.js.map +0 -1
  106. package/dist/cli/commands/version.d.ts +0 -2
  107. package/dist/cli/commands/version.d.ts.map +0 -1
  108. package/dist/cli/commands/version.js +0 -28
  109. package/dist/cli/commands/version.js.map +0 -1
  110. package/dist/cli/customization.test.d.ts +0 -12
  111. package/dist/cli/customization.test.d.ts.map +0 -1
  112. package/dist/cli/customization.test.js +0 -84
  113. package/dist/cli/customization.test.js.map +0 -1
  114. package/dist/cli/cyclist-migration.test.d.ts +0 -16
  115. package/dist/cli/cyclist-migration.test.d.ts.map +0 -1
  116. package/dist/cli/cyclist-migration.test.js +0 -225
  117. package/dist/cli/cyclist-migration.test.js.map +0 -1
  118. package/dist/cli/index.d.ts +0 -3
  119. package/dist/cli/index.d.ts.map +0 -1
  120. package/dist/cli/index.js +0 -174
  121. package/dist/cli/index.js.map +0 -1
  122. package/dist/cli/ocean-profiles.test.d.ts +0 -13
  123. package/dist/cli/ocean-profiles.test.d.ts.map +0 -1
  124. package/dist/cli/ocean-profiles.test.js +0 -134
  125. package/dist/cli/ocean-profiles.test.js.map +0 -1
  126. package/dist/cli/theme-maker.test.d.ts +0 -11
  127. package/dist/cli/theme-maker.test.d.ts.map +0 -1
  128. package/dist/cli/theme-maker.test.js +0 -356
  129. package/dist/cli/theme-maker.test.js.map +0 -1
  130. package/dist/cli/utils/constants.d.ts +0 -66
  131. package/dist/cli/utils/constants.d.ts.map +0 -1
  132. package/dist/cli/utils/constants.js +0 -54
  133. package/dist/cli/utils/constants.js.map +0 -1
  134. package/dist/cli/utils/files.d.ts.map +0 -1
  135. package/dist/cli/utils/files.js.map +0 -1
  136. package/dist/cli/utils/logger.d.ts +0 -26
  137. package/dist/cli/utils/logger.d.ts.map +0 -1
  138. package/dist/cli/utils/logger.js +0 -88
  139. package/dist/cli/utils/logger.js.map +0 -1
  140. package/dist/cli/utils/manifest.d.ts.map +0 -1
  141. package/dist/cli/utils/manifest.js.map +0 -1
  142. package/dist/cli/utils/node-modules.d.ts +0 -6
  143. package/dist/cli/utils/node-modules.d.ts.map +0 -1
  144. package/dist/cli/utils/node-modules.js +0 -31
  145. package/dist/cli/utils/node-modules.js.map +0 -1
  146. package/dist/cli/utils/prompts.d.ts +0 -34
  147. package/dist/cli/utils/prompts.d.ts.map +0 -1
  148. package/dist/cli/utils/prompts.js +0 -93
  149. package/dist/cli/utils/prompts.js.map +0 -1
  150. package/dist/cli/utils/symlinks.d.ts +0 -29
  151. package/dist/cli/utils/symlinks.d.ts.map +0 -1
  152. package/dist/cli/utils/symlinks.js +0 -181
  153. package/dist/cli/utils/symlinks.js.map +0 -1
  154. package/dist/cli/utils/themes.d.ts +0 -101
  155. package/dist/cli/utils/themes.d.ts.map +0 -1
  156. package/dist/cli/utils/themes.js +0 -373
  157. package/dist/cli/utils/themes.js.map +0 -1
  158. package/dist/cli/utils/themes.test.d.ts +0 -12
  159. package/dist/cli/utils/themes.test.d.ts.map +0 -1
  160. package/dist/cli/utils/themes.test.js +0 -147
  161. package/dist/cli/utils/themes.test.js.map +0 -1
  162. package/dist/cli/utils/version.d.ts.map +0 -1
  163. package/dist/cli/utils/version.js.map +0 -1
  164. package/dist/cli/workspace.test.d.ts +0 -8
  165. package/dist/cli/workspace.test.d.ts.map +0 -1
  166. package/dist/cli/workspace.test.js +0 -151
  167. package/dist/cli/workspace.test.js.map +0 -1
  168. package/dist/index.d.ts.map +0 -1
  169. package/dist/index.js.map +0 -1
  170. package/dist/jira/jira-epic-creation.d.ts +0 -109
  171. package/dist/jira/jira-epic-creation.d.ts.map +0 -1
  172. package/dist/jira/jira-epic-creation.js +0 -253
  173. package/dist/jira/jira-epic-creation.js.map +0 -1
  174. package/dist/jira/jira-epic-creation.test.d.ts +0 -16
  175. package/dist/jira/jira-epic-creation.test.d.ts.map +0 -1
  176. package/dist/jira/jira-epic-creation.test.js +0 -387
  177. package/dist/jira/jira-epic-creation.test.js.map +0 -1
  178. package/dist/jira/jira-sprint-sync.d.ts +0 -247
  179. package/dist/jira/jira-sprint-sync.d.ts.map +0 -1
  180. package/dist/jira/jira-sprint-sync.js +0 -670
  181. package/dist/jira/jira-sprint-sync.js.map +0 -1
  182. package/dist/jira/jira-sprint-sync.test.d.ts +0 -16
  183. package/dist/jira/jira-sprint-sync.test.d.ts.map +0 -1
  184. package/dist/jira/jira-sprint-sync.test.js +0 -845
  185. package/dist/jira/jira-sprint-sync.test.js.map +0 -1
  186. package/dist/permissions/index.d.ts.map +0 -1
  187. package/dist/permissions/index.js.map +0 -1
  188. package/dist/permissions/permission-schema.d.ts.map +0 -1
  189. package/dist/permissions/permission-schema.js.map +0 -1
  190. package/dist/permissions/permission-schema.test.d.ts +0 -40
  191. package/dist/permissions/permission-schema.test.d.ts.map +0 -1
  192. package/dist/permissions/permission-schema.test.js +0 -367
  193. package/dist/permissions/permission-schema.test.js.map +0 -1
  194. package/dist/scripts/add-ocean-profiles.d.ts +0 -9
  195. package/dist/scripts/add-ocean-profiles.d.ts.map +0 -1
  196. package/dist/scripts/add-ocean-profiles.js +0 -695
  197. package/dist/scripts/add-ocean-profiles.js.map +0 -1
  198. package/dist/scripts/benchmark-integration.d.ts +0 -182
  199. package/dist/scripts/benchmark-integration.d.ts.map +0 -1
  200. package/dist/scripts/benchmark-integration.js +0 -691
  201. package/dist/scripts/benchmark-integration.js.map +0 -1
  202. package/dist/scripts/benchmark-integration.test.d.ts +0 -13
  203. package/dist/scripts/benchmark-integration.test.d.ts.map +0 -1
  204. package/dist/scripts/benchmark-integration.test.js +0 -680
  205. package/dist/scripts/benchmark-integration.test.js.map +0 -1
  206. package/dist/scripts/debugging-scenarios.test.d.ts +0 -18
  207. package/dist/scripts/debugging-scenarios.test.d.ts.map +0 -1
  208. package/dist/scripts/debugging-scenarios.test.js +0 -317
  209. package/dist/scripts/debugging-scenarios.test.js.map +0 -1
  210. package/dist/scripts/generate-all-spiders.d.ts +0 -10
  211. package/dist/scripts/generate-all-spiders.d.ts.map +0 -1
  212. package/dist/scripts/generate-all-spiders.js +0 -306
  213. package/dist/scripts/generate-all-spiders.js.map +0 -1
  214. package/dist/scripts/generate-report.d.ts +0 -65
  215. package/dist/scripts/generate-report.d.ts.map +0 -1
  216. package/dist/scripts/generate-report.js +0 -378
  217. package/dist/scripts/generate-report.js.map +0 -1
  218. package/dist/scripts/generate-report.test.d.ts +0 -13
  219. package/dist/scripts/generate-report.test.d.ts.map +0 -1
  220. package/dist/scripts/generate-report.test.js +0 -363
  221. package/dist/scripts/generate-report.test.js.map +0 -1
  222. package/dist/scripts/generate-spider-report.d.ts +0 -65
  223. package/dist/scripts/generate-spider-report.d.ts.map +0 -1
  224. package/dist/scripts/generate-spider-report.js +0 -366
  225. package/dist/scripts/generate-spider-report.js.map +0 -1
  226. package/dist/scripts/generate-spider-report.test.d.ts +0 -13
  227. package/dist/scripts/generate-spider-report.test.d.ts.map +0 -1
  228. package/dist/scripts/generate-spider-report.test.js +0 -367
  229. package/dist/scripts/generate-spider-report.test.js.map +0 -1
  230. package/dist/scripts/generate-spider.d.ts +0 -47
  231. package/dist/scripts/generate-spider.d.ts.map +0 -1
  232. package/dist/scripts/generate-spider.js +0 -338
  233. package/dist/scripts/generate-spider.js.map +0 -1
  234. package/dist/scripts/generate-spider.test.d.ts +0 -14
  235. package/dist/scripts/generate-spider.test.d.ts.map +0 -1
  236. package/dist/scripts/generate-spider.test.js +0 -271
  237. package/dist/scripts/generate-spider.test.js.map +0 -1
  238. package/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
  239. package/dist/scripts/job-fair-aggregator.js.map +0 -1
  240. package/dist/scripts/job-fair-aggregator.test.d.ts +0 -14
  241. package/dist/scripts/job-fair-aggregator.test.d.ts.map +0 -1
  242. package/dist/scripts/job-fair-aggregator.test.js +0 -616
  243. package/dist/scripts/job-fair-aggregator.test.js.map +0 -1
  244. package/dist/scripts/run-ci.test.d.ts +0 -20
  245. package/dist/scripts/run-ci.test.d.ts.map +0 -1
  246. package/dist/scripts/run-ci.test.js +0 -127
  247. package/dist/scripts/run-ci.test.js.map +0 -1
  248. package/dist/scripts/theme-detail.test.d.ts +0 -10
  249. package/dist/scripts/theme-detail.test.d.ts.map +0 -1
  250. package/dist/scripts/theme-detail.test.js +0 -199
  251. package/dist/scripts/theme-detail.test.js.map +0 -1
  252. package/dist/scripts/validate-ocean-profiles.d.ts +0 -9
  253. package/dist/scripts/validate-ocean-profiles.d.ts.map +0 -1
  254. package/dist/scripts/validate-ocean-profiles.js +0 -130
  255. package/dist/scripts/validate-ocean-profiles.js.map +0 -1
  256. package/dist/workflow/gate-handler.d.ts +0 -94
  257. package/dist/workflow/gate-handler.d.ts.map +0 -1
  258. package/dist/workflow/gate-handler.js +0 -189
  259. package/dist/workflow/gate-handler.js.map +0 -1
  260. package/dist/workflow/gate-handler.test.d.ts +0 -14
  261. package/dist/workflow/gate-handler.test.d.ts.map +0 -1
  262. package/dist/workflow/gate-handler.test.js +0 -543
  263. package/dist/workflow/gate-handler.test.js.map +0 -1
  264. package/dist/workflow/generic-handoff.d.ts +0 -281
  265. package/dist/workflow/generic-handoff.d.ts.map +0 -1
  266. package/dist/workflow/generic-handoff.js +0 -411
  267. package/dist/workflow/generic-handoff.js.map +0 -1
  268. package/dist/workflow/generic-handoff.test.d.ts +0 -21
  269. package/dist/workflow/generic-handoff.test.d.ts.map +0 -1
  270. package/dist/workflow/generic-handoff.test.js +0 -499
  271. package/dist/workflow/generic-handoff.test.js.map +0 -1
  272. package/dist/workflow/generic-sm-finish.d.ts +0 -89
  273. package/dist/workflow/generic-sm-finish.d.ts.map +0 -1
  274. package/dist/workflow/generic-sm-finish.js +0 -157
  275. package/dist/workflow/generic-sm-finish.js.map +0 -1
  276. package/dist/workflow/generic-sm-setup.d.ts +0 -138
  277. package/dist/workflow/generic-sm-setup.d.ts.map +0 -1
  278. package/dist/workflow/generic-sm-setup.js +0 -382
  279. package/dist/workflow/generic-sm-setup.js.map +0 -1
  280. package/dist/workflow/index.d.ts.map +0 -1
  281. package/dist/workflow/index.js.map +0 -1
  282. package/dist/workflow/session-state.d.ts +0 -92
  283. package/dist/workflow/session-state.d.ts.map +0 -1
  284. package/dist/workflow/session-state.js +0 -198
  285. package/dist/workflow/session-state.js.map +0 -1
  286. package/dist/workflow/session-state.test.d.ts +0 -8
  287. package/dist/workflow/session-state.test.d.ts.map +0 -1
  288. package/dist/workflow/session-state.test.js +0 -551
  289. package/dist/workflow/session-state.test.js.map +0 -1
  290. package/dist/workflow/sm-subagents.test.d.ts +0 -23
  291. package/dist/workflow/sm-subagents.test.d.ts.map +0 -1
  292. package/dist/workflow/sm-subagents.test.js +0 -727
  293. package/dist/workflow/sm-subagents.test.js.map +0 -1
  294. package/dist/workflow/step-parser.d.ts +0 -45
  295. package/dist/workflow/step-parser.d.ts.map +0 -1
  296. package/dist/workflow/step-parser.js +0 -147
  297. package/dist/workflow/step-parser.js.map +0 -1
  298. package/dist/workflow/step-parser.test.d.ts +0 -14
  299. package/dist/workflow/step-parser.test.d.ts.map +0 -1
  300. package/dist/workflow/step-parser.test.js +0 -470
  301. package/dist/workflow/step-parser.test.js.map +0 -1
  302. package/dist/workflow/story-workflow-routing.test.d.ts +0 -17
  303. package/dist/workflow/story-workflow-routing.test.d.ts.map +0 -1
  304. package/dist/workflow/story-workflow-routing.test.js +0 -559
  305. package/dist/workflow/story-workflow-routing.test.js.map +0 -1
  306. package/dist/workflow/test-cache.d.ts +0 -131
  307. package/dist/workflow/test-cache.d.ts.map +0 -1
  308. package/dist/workflow/test-cache.js +0 -226
  309. package/dist/workflow/test-cache.js.map +0 -1
  310. package/dist/workflow/test-cache.test.d.ts +0 -17
  311. package/dist/workflow/test-cache.test.d.ts.map +0 -1
  312. package/dist/workflow/test-cache.test.js +0 -438
  313. package/dist/workflow/test-cache.test.js.map +0 -1
  314. package/dist/workflow/trimodal.d.ts +0 -86
  315. package/dist/workflow/trimodal.d.ts.map +0 -1
  316. package/dist/workflow/trimodal.js +0 -118
  317. package/dist/workflow/trimodal.js.map +0 -1
  318. package/dist/workflow/trimodal.test.d.ts +0 -11
  319. package/dist/workflow/trimodal.test.d.ts.map +0 -1
  320. package/dist/workflow/trimodal.test.js +0 -395
  321. package/dist/workflow/trimodal.test.js.map +0 -1
  322. package/dist/workflow/variable-resolver.d.ts +0 -67
  323. package/dist/workflow/variable-resolver.d.ts.map +0 -1
  324. package/dist/workflow/variable-resolver.js +0 -156
  325. package/dist/workflow/variable-resolver.js.map +0 -1
  326. package/dist/workflow/variable-resolver.test.d.ts +0 -14
  327. package/dist/workflow/variable-resolver.test.d.ts.map +0 -1
  328. package/dist/workflow/variable-resolver.test.js +0 -400
  329. package/dist/workflow/variable-resolver.test.js.map +0 -1
  330. package/dist/workflow/workflow-executor.d.ts +0 -163
  331. package/dist/workflow/workflow-executor.d.ts.map +0 -1
  332. package/dist/workflow/workflow-executor.js +0 -197
  333. package/dist/workflow/workflow-executor.js.map +0 -1
  334. package/dist/workflow/workflow-executor.test.d.ts +0 -8
  335. package/dist/workflow/workflow-executor.test.d.ts.map +0 -1
  336. package/dist/workflow/workflow-executor.test.js +0 -444
  337. package/dist/workflow/workflow-executor.test.js.map +0 -1
  338. package/dist/workflow/workflow-loader.d.ts.map +0 -1
  339. package/dist/workflow/workflow-loader.js.map +0 -1
  340. package/dist/workflow/workflow-loader.test.d.ts +0 -15
  341. package/dist/workflow/workflow-loader.test.d.ts.map +0 -1
  342. package/dist/workflow/workflow-loader.test.js +0 -354
  343. package/dist/workflow/workflow-loader.test.js.map +0 -1
  344. package/dist/workflow/workflow-migration.test.d.ts +0 -17
  345. package/dist/workflow/workflow-migration.test.d.ts.map +0 -1
  346. package/dist/workflow/workflow-migration.test.js +0 -371
  347. package/dist/workflow/workflow-migration.test.js.map +0 -1
  348. package/dist/workflow/workflow-permissions.d.ts.map +0 -1
  349. package/dist/workflow/workflow-permissions.js.map +0 -1
  350. package/dist/workflow/workflow-permissions.test.d.ts +0 -15
  351. package/dist/workflow/workflow-permissions.test.d.ts.map +0 -1
  352. package/dist/workflow/workflow-permissions.test.js +0 -301
  353. package/dist/workflow/workflow-permissions.test.js.map +0 -1
  354. package/dist/workflow/workflow-router.d.ts.map +0 -1
  355. package/dist/workflow/workflow-router.js.map +0 -1
  356. package/dist/workflow/workflow-router.test.d.ts +0 -20
  357. package/dist/workflow/workflow-router.test.d.ts.map +0 -1
  358. package/dist/workflow/workflow-router.test.js +0 -607
  359. package/dist/workflow/workflow-router.test.js.map +0 -1
  360. package/dist/workflow/workflow-schema.d.ts.map +0 -1
  361. package/dist/workflow/workflow-schema.js.map +0 -1
  362. package/dist/workflow/workflow-schema.test.d.ts +0 -45
  363. package/dist/workflow/workflow-schema.test.d.ts.map +0 -1
  364. package/dist/workflow/workflow-schema.test.js +0 -512
  365. package/dist/workflow/workflow-schema.test.js.map +0 -1
  366. package/dist/workflow/workflow-stepped-schema.test.d.ts +0 -18
  367. package/dist/workflow/workflow-stepped-schema.test.d.ts.map +0 -1
  368. package/dist/workflow/workflow-stepped-schema.test.js +0 -608
  369. package/dist/workflow/workflow-stepped-schema.test.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  /**
2
3
  * Job-Fair Aggregator Module
3
4
  *
@@ -14,13 +15,68 @@
14
15
  * - Self-contained baseline (mean score as baseline reference)
15
16
  * - Dimension grouping for comparative analysis (7-5)
16
17
  */
17
- import { readdirSync, readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
18
- import { join, dirname } from 'path';
19
- import { fileURLToPath } from 'url';
20
- import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
18
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
19
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
20
+ return new (P || (P = Promise))(function (resolve, reject) {
21
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
22
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
23
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
24
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
25
+ });
26
+ };
27
+ var __generator = (this && this.__generator) || function (thisArg, body) {
28
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
29
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
30
+ function verb(n) { return function (v) { return step([n, v]); }; }
31
+ function step(op) {
32
+ if (f) throw new TypeError("Generator is already executing.");
33
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
34
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
35
+ if (y = 0, t) op = [op[0] & 2, t.value];
36
+ switch (op[0]) {
37
+ case 0: case 1: t = op; break;
38
+ case 4: _.label++; return { value: op[1], done: false };
39
+ case 5: _.label++; y = op[1]; op = [0]; continue;
40
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
41
+ default:
42
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
43
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
44
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
45
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
46
+ if (t[2]) _.ops.pop();
47
+ _.trys.pop(); continue;
48
+ }
49
+ op = body.call(thisArg, _);
50
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
51
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
52
+ }
53
+ };
54
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
55
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
56
+ if (ar || !(i in from)) {
57
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
58
+ ar[i] = from[i];
59
+ }
60
+ }
61
+ return to.concat(ar || Array.prototype.slice.call(from));
62
+ };
63
+ Object.defineProperty(exports, "__esModule", { value: true });
64
+ exports.aggregateJobFairResults = aggregateJobFairResults;
65
+ exports.getBaselineComparison = getBaselineComparison;
66
+ exports.getRoleStatistics = getRoleStatistics;
67
+ exports.getTopPerformers = getTopPerformers;
68
+ exports.getHistoricalTrend = getHistoricalTrend;
69
+ exports.saveHistoricalSnapshot = saveHistoricalSnapshot;
70
+ exports.aggregateByDimension = aggregateByDimension;
71
+ exports.getDimensionValues = getDimensionValues;
72
+ exports.generateDifferentialReport = generateDifferentialReport;
73
+ var fs_1 = require("fs");
74
+ var path_1 = require("path");
75
+ var url_1 = require("url");
76
+ var yaml_1 = require("yaml");
21
77
  // ESM-compatible __dirname equivalent
22
- const __filename = fileURLToPath(import.meta.url);
23
- const __dirname = dirname(__filename);
78
+ var __filename = (0, url_1.fileURLToPath)(import.meta.url);
79
+ var __dirname = (0, path_1.dirname)(__filename);
24
80
  // ============================================================================
25
81
  // Helper Functions
26
82
  // ============================================================================
@@ -30,7 +86,7 @@ const __dirname = dirname(__filename);
30
86
  */
31
87
  function parseDirectoryName(dirName) {
32
88
  // Match pattern: anything-YYYYMMDD or anything-YYYYMMDDTHHMMSSz
33
- const match = dirName.match(/^(.+)-(\d{8}(?:T\d{6}Z?|-\d{6})?)$/);
89
+ var match = dirName.match(/^(.+)-(\d{8}(?:T\d{6}Z?|-\d{6})?)$/);
34
90
  if (!match)
35
91
  return null;
36
92
  return { theme: match[1], timestamp: match[2] };
@@ -39,56 +95,65 @@ function parseDirectoryName(dirName) {
39
95
  * Get latest run directory for each theme
40
96
  */
41
97
  function getLatestRunPerTheme(resultsDir) {
42
- const themeLatest = new Map();
43
- if (!existsSync(resultsDir))
98
+ var themeLatest = new Map();
99
+ if (!(0, fs_1.existsSync)(resultsDir))
44
100
  return new Map();
45
- const entries = readdirSync(resultsDir, { withFileTypes: true });
46
- for (const entry of entries) {
101
+ var entries = (0, fs_1.readdirSync)(resultsDir, { withFileTypes: true });
102
+ for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
103
+ var entry = entries_1[_i];
47
104
  if (!entry.isDirectory())
48
105
  continue;
49
- const parsed = parseDirectoryName(entry.name);
106
+ var parsed = parseDirectoryName(entry.name);
50
107
  if (!parsed)
51
108
  continue;
52
- const existing = themeLatest.get(parsed.theme);
109
+ var existing = themeLatest.get(parsed.theme);
53
110
  if (!existing || parsed.timestamp > existing.timestamp) {
54
111
  themeLatest.set(parsed.theme, { timestamp: parsed.timestamp, dirName: entry.name });
55
112
  }
56
113
  }
57
- return new Map(Array.from(themeLatest.entries()).map(([theme, info]) => [theme, info.dirName]));
114
+ return new Map(Array.from(themeLatest.entries()).map(function (_a) {
115
+ var theme = _a[0], info = _a[1];
116
+ return [theme, info.dirName];
117
+ }));
58
118
  }
59
119
  /**
60
120
  * Parse a summary.yaml file and extract scores
61
121
  */
62
122
  function parseSummaryYaml(filePath, themeName) {
123
+ var _a, _b;
63
124
  try {
64
- const content = readFileSync(filePath, 'utf-8');
65
- const data = parseYaml(content);
66
- const theme = data.meta?.theme || data.theme || themeName;
67
- const timestamp = data.meta?.timestamp || data.timestamp || new Date().toISOString();
68
- const scores = [];
125
+ var content = (0, fs_1.readFileSync)(filePath, 'utf-8');
126
+ var data = (0, yaml_1.parse)(content);
127
+ var theme = ((_a = data.meta) === null || _a === void 0 ? void 0 : _a.theme) || data.theme || themeName;
128
+ var timestamp = ((_b = data.meta) === null || _b === void 0 ? void 0 : _b.timestamp) || data.timestamp || new Date().toISOString();
129
+ var scores = [];
69
130
  // Extract scores from matrix
70
131
  if (data.matrix) {
71
132
  if ('rows' in data.matrix && Array.isArray(data.matrix.rows)) {
72
133
  // Format: { headers: [...], rows: [...] }
73
- const roles = ['dev', 'reviewer', 'tea', 'sm'];
74
- for (const row of data.matrix.rows) {
75
- for (const role of roles) {
76
- const score = row[role];
134
+ var roles = ['dev', 'reviewer', 'tea', 'sm'];
135
+ for (var _i = 0, _c = data.matrix.rows; _i < _c.length; _i++) {
136
+ var row = _c[_i];
137
+ for (var _d = 0, roles_1 = roles; _d < roles_1.length; _d++) {
138
+ var role = roles_1[_d];
139
+ var score = row[role];
77
140
  if (typeof score === 'number') {
78
- scores.push({ character: row.character, role, score });
141
+ scores.push({ character: row.character, role: role, score: score });
79
142
  }
80
143
  }
81
144
  }
82
145
  }
83
146
  else {
84
147
  // Format: { alice: { dev: 85.5, reviewer: 72.0 }, ... }
85
- const matrixObj = data.matrix;
86
- for (const [character, roleScores] of Object.entries(matrixObj)) {
148
+ var matrixObj = data.matrix;
149
+ for (var _e = 0, _f = Object.entries(matrixObj); _e < _f.length; _e++) {
150
+ var _g = _f[_e], character = _g[0], roleScores = _g[1];
87
151
  if (character === 'headers' || character === 'rows')
88
152
  continue;
89
- for (const [role, score] of Object.entries(roleScores)) {
153
+ for (var _h = 0, _j = Object.entries(roleScores); _h < _j.length; _h++) {
154
+ var _k = _j[_h], role = _k[0], score = _k[1];
90
155
  if (typeof score === 'number') {
91
- scores.push({ character, role, score });
156
+ scores.push({ character: character, role: role, score: score });
92
157
  }
93
158
  }
94
159
  }
@@ -96,20 +161,22 @@ function parseSummaryYaml(filePath, themeName) {
96
161
  }
97
162
  // Fallback: extract from role_rankings if matrix didn't yield scores
98
163
  if (scores.length === 0 && data.role_rankings) {
99
- for (const [role, rankings] of Object.entries(data.role_rankings)) {
100
- for (const entry of rankings) {
101
- scores.push({ character: entry.character, role, score: entry.score });
164
+ for (var _l = 0, _m = Object.entries(data.role_rankings); _l < _m.length; _l++) {
165
+ var _o = _m[_l], role = _o[0], rankings = _o[1];
166
+ for (var _p = 0, rankings_1 = rankings; _p < rankings_1.length; _p++) {
167
+ var entry = rankings_1[_p];
168
+ scores.push({ character: entry.character, role: role, score: entry.score });
102
169
  }
103
170
  }
104
171
  }
105
172
  return {
106
- theme,
107
- timestamp,
173
+ theme: theme,
174
+ timestamp: timestamp,
108
175
  champions: data.champions || {},
109
- scores,
176
+ scores: scores,
110
177
  };
111
178
  }
112
- catch {
179
+ catch (_q) {
113
180
  // Skip malformed YAML
114
181
  return null;
115
182
  }
@@ -120,8 +187,8 @@ function parseSummaryYaml(filePath, themeName) {
120
187
  function calculateStdDev(values, mean) {
121
188
  if (values.length <= 1)
122
189
  return 0;
123
- const squaredDiffs = values.map(v => Math.pow(v - mean, 2));
124
- const variance = squaredDiffs.reduce((a, b) => a + b, 0) / values.length;
190
+ var squaredDiffs = values.map(function (v) { return Math.pow(v - mean, 2); });
191
+ var variance = squaredDiffs.reduce(function (a, b) { return a + b; }, 0) / values.length;
125
192
  return Math.sqrt(variance);
126
193
  }
127
194
  /**
@@ -130,28 +197,28 @@ function calculateStdDev(values, mean) {
130
197
  function calculateVariance(values, mean) {
131
198
  if (values.length <= 1)
132
199
  return 0;
133
- const squaredDiffs = values.map(v => Math.pow(v - mean, 2));
134
- return squaredDiffs.reduce((a, b) => a + b, 0) / values.length;
200
+ var squaredDiffs = values.map(function (v) { return Math.pow(v - mean, 2); });
201
+ return squaredDiffs.reduce(function (a, b) { return a + b; }, 0) / values.length;
135
202
  }
136
203
  /**
137
204
  * Get path to history file
138
205
  */
139
206
  function getHistoryFilePath(resultsDir) {
140
- return join(resultsDir, 'aggregate', 'history.yaml');
207
+ return (0, path_1.join)(resultsDir, 'aggregate', 'history.yaml');
141
208
  }
142
209
  /**
143
210
  * Load historical trend data
144
211
  */
145
212
  function loadHistoricalTrend(resultsDir) {
146
- const historyPath = getHistoryFilePath(resultsDir);
147
- if (!existsSync(historyPath))
213
+ var historyPath = getHistoryFilePath(resultsDir);
214
+ if (!(0, fs_1.existsSync)(historyPath))
148
215
  return [];
149
216
  try {
150
- const content = readFileSync(historyPath, 'utf-8');
151
- const data = parseYaml(content);
217
+ var content = (0, fs_1.readFileSync)(historyPath, 'utf-8');
218
+ var data = (0, yaml_1.parse)(content);
152
219
  return data.snapshots || [];
153
220
  }
154
- catch {
221
+ catch (_a) {
155
222
  return [];
156
223
  }
157
224
  }
@@ -163,177 +230,224 @@ function loadHistoricalTrend(resultsDir) {
163
230
  *
164
231
  * AC1: Job-fair results contribute to overall benchmark statistics
165
232
  */
166
- export async function aggregateJobFairResults(resultsDir) {
167
- const latestRuns = getLatestRunPerTheme(resultsDir);
168
- const allResults = [];
169
- // Parse all theme summaries
170
- for (const [theme, dirName] of latestRuns) {
171
- const summaryPath = join(resultsDir, dirName, 'summary.yaml');
172
- if (!existsSync(summaryPath))
173
- continue;
174
- const result = parseSummaryYaml(summaryPath, theme);
175
- if (result && result.scores.length > 0) {
176
- allResults.push(result);
177
- }
178
- }
179
- // Collect scores by role
180
- const scoresByRole = new Map();
181
- for (const result of allResults) {
182
- for (const { character, role, score } of result.scores) {
183
- if (!scoresByRole.has(role)) {
184
- scoresByRole.set(role, []);
233
+ function aggregateJobFairResults(resultsDir) {
234
+ return __awaiter(this, void 0, void 0, function () {
235
+ var latestRuns, allResults, _i, latestRuns_1, _a, theme, dirName, summaryPath, result, scoresByRole, _b, allResults_1, result, _c, _d, _e, character, role, score, allScores, overallMean, byRole, _f, scoresByRole_1, _g, role, entries, scores, mean, stdDev, sorted, characterAverages, _h, allResults_2, result, _j, _k, _l, character, score, key, overallChampions, historicalTrend;
236
+ return __generator(this, function (_m) {
237
+ latestRuns = getLatestRunPerTheme(resultsDir);
238
+ allResults = [];
239
+ // Parse all theme summaries
240
+ for (_i = 0, latestRuns_1 = latestRuns; _i < latestRuns_1.length; _i++) {
241
+ _a = latestRuns_1[_i], theme = _a[0], dirName = _a[1];
242
+ summaryPath = (0, path_1.join)(resultsDir, dirName, 'summary.yaml');
243
+ if (!(0, fs_1.existsSync)(summaryPath))
244
+ continue;
245
+ result = parseSummaryYaml(summaryPath, theme);
246
+ if (result && result.scores.length > 0) {
247
+ allResults.push(result);
248
+ }
185
249
  }
186
- scoresByRole.get(role).push({ character, theme: result.theme, score });
187
- }
188
- }
189
- // Calculate overall mean for baseline
190
- const allScores = Array.from(scoresByRole.values()).flat().map(s => s.score);
191
- const overallMean = allScores.length > 0
192
- ? allScores.reduce((a, b) => a + b, 0) / allScores.length
193
- : 0;
194
- // Build by_role stats
195
- const byRole = {};
196
- for (const [role, entries] of scoresByRole) {
197
- const scores = entries.map(e => e.score);
198
- const mean = scores.reduce((a, b) => a + b, 0) / scores.length;
199
- const stdDev = calculateStdDev(scores, mean);
200
- // Sort by score descending for top performers
201
- const sorted = [...entries].sort((a, b) => b.score - a.score);
202
- byRole[role] = {
203
- mean_score: mean,
204
- std_dev: stdDev,
205
- baseline_comparison: mean - overallMean,
206
- top_performers: sorted.slice(0, 5).map(e => ({
207
- character: e.character,
208
- theme: e.theme,
209
- score: e.score,
210
- })),
211
- };
212
- }
213
- // Calculate overall champions (best average across roles per character+theme)
214
- const characterAverages = new Map();
215
- for (const result of allResults) {
216
- for (const { character, score } of result.scores) {
217
- const key = `${character}|${result.theme}`;
218
- if (!characterAverages.has(key)) {
219
- characterAverages.set(key, { theme: result.theme, scores: [] });
250
+ scoresByRole = new Map();
251
+ for (_b = 0, allResults_1 = allResults; _b < allResults_1.length; _b++) {
252
+ result = allResults_1[_b];
253
+ for (_c = 0, _d = result.scores; _c < _d.length; _c++) {
254
+ _e = _d[_c], character = _e.character, role = _e.role, score = _e.score;
255
+ if (!scoresByRole.has(role)) {
256
+ scoresByRole.set(role, []);
257
+ }
258
+ scoresByRole.get(role).push({ character: character, theme: result.theme, score: score });
259
+ }
220
260
  }
221
- characterAverages.get(key).scores.push(score);
222
- }
223
- }
224
- const overallChampions = Array.from(characterAverages.entries())
225
- .map(([key, data]) => {
226
- const character = key.split('|')[0];
227
- const avgScore = data.scores.reduce((a, b) => a + b, 0) / data.scores.length;
228
- return { character, theme: data.theme, avg_score: avgScore };
229
- })
230
- .sort((a, b) => b.avg_score - a.avg_score)
231
- .slice(0, 10);
232
- // Load historical trend
233
- const historicalTrend = loadHistoricalTrend(resultsDir);
234
- return {
235
- themes_included: allResults.map(r => r.theme),
236
- last_updated: new Date().toISOString(),
237
- by_role: byRole,
238
- overall_champions: overallChampions,
239
- historical_trend: historicalTrend,
240
- };
261
+ allScores = Array.from(scoresByRole.values()).flat().map(function (s) { return s.score; });
262
+ overallMean = allScores.length > 0
263
+ ? allScores.reduce(function (a, b) { return a + b; }, 0) / allScores.length
264
+ : 0;
265
+ byRole = {};
266
+ for (_f = 0, scoresByRole_1 = scoresByRole; _f < scoresByRole_1.length; _f++) {
267
+ _g = scoresByRole_1[_f], role = _g[0], entries = _g[1];
268
+ scores = entries.map(function (e) { return e.score; });
269
+ mean = scores.reduce(function (a, b) { return a + b; }, 0) / scores.length;
270
+ stdDev = calculateStdDev(scores, mean);
271
+ sorted = __spreadArray([], entries, true).sort(function (a, b) { return b.score - a.score; });
272
+ byRole[role] = {
273
+ mean_score: mean,
274
+ std_dev: stdDev,
275
+ baseline_comparison: mean - overallMean,
276
+ top_performers: sorted.slice(0, 5).map(function (e) { return ({
277
+ character: e.character,
278
+ theme: e.theme,
279
+ score: e.score,
280
+ }); }),
281
+ };
282
+ }
283
+ characterAverages = new Map();
284
+ for (_h = 0, allResults_2 = allResults; _h < allResults_2.length; _h++) {
285
+ result = allResults_2[_h];
286
+ for (_j = 0, _k = result.scores; _j < _k.length; _j++) {
287
+ _l = _k[_j], character = _l.character, score = _l.score;
288
+ key = "".concat(character, "|").concat(result.theme);
289
+ if (!characterAverages.has(key)) {
290
+ characterAverages.set(key, { theme: result.theme, scores: [] });
291
+ }
292
+ characterAverages.get(key).scores.push(score);
293
+ }
294
+ }
295
+ overallChampions = Array.from(characterAverages.entries())
296
+ .map(function (_a) {
297
+ var key = _a[0], data = _a[1];
298
+ var character = key.split('|')[0];
299
+ var avgScore = data.scores.reduce(function (a, b) { return a + b; }, 0) / data.scores.length;
300
+ return { character: character, theme: data.theme, avg_score: avgScore };
301
+ })
302
+ .sort(function (a, b) { return b.avg_score - a.avg_score; })
303
+ .slice(0, 10);
304
+ historicalTrend = loadHistoricalTrend(resultsDir);
305
+ return [2 /*return*/, {
306
+ themes_included: allResults.map(function (r) { return r.theme; }),
307
+ last_updated: new Date().toISOString(),
308
+ by_role: byRole,
309
+ overall_champions: overallChampions,
310
+ historical_trend: historicalTrend,
311
+ }];
312
+ });
313
+ });
241
314
  }
242
315
  /**
243
316
  * Get baseline comparison for a specific role
244
317
  *
245
318
  * AC2: Baseline calculations incorporate job-fair control runs
246
319
  */
247
- export async function getBaselineComparison(role, resultsDir) {
248
- const stats = await aggregateJobFairResults(resultsDir);
249
- return stats.by_role[role]?.baseline_comparison ?? null;
320
+ function getBaselineComparison(role, resultsDir) {
321
+ return __awaiter(this, void 0, void 0, function () {
322
+ var stats;
323
+ var _a, _b;
324
+ return __generator(this, function (_c) {
325
+ switch (_c.label) {
326
+ case 0: return [4 /*yield*/, aggregateJobFairResults(resultsDir)];
327
+ case 1:
328
+ stats = _c.sent();
329
+ return [2 /*return*/, (_b = (_a = stats.by_role[role]) === null || _a === void 0 ? void 0 : _a.baseline_comparison) !== null && _b !== void 0 ? _b : null];
330
+ }
331
+ });
332
+ });
250
333
  }
251
334
  /**
252
335
  * Get statistics for a specific role
253
336
  *
254
337
  * AC3: Scenario performance tracked across themes
255
338
  */
256
- export async function getRoleStatistics(role, resultsDir) {
257
- const stats = await aggregateJobFairResults(resultsDir);
258
- return stats.by_role[role] || {
259
- mean_score: 0,
260
- std_dev: 0,
261
- baseline_comparison: null,
262
- top_performers: [],
263
- };
339
+ function getRoleStatistics(role, resultsDir) {
340
+ return __awaiter(this, void 0, void 0, function () {
341
+ var stats;
342
+ return __generator(this, function (_a) {
343
+ switch (_a.label) {
344
+ case 0: return [4 /*yield*/, aggregateJobFairResults(resultsDir)];
345
+ case 1:
346
+ stats = _a.sent();
347
+ return [2 /*return*/, stats.by_role[role] || {
348
+ mean_score: 0,
349
+ std_dev: 0,
350
+ baseline_comparison: null,
351
+ top_performers: [],
352
+ }];
353
+ }
354
+ });
355
+ });
264
356
  }
265
357
  /**
266
358
  * Get top performers for a specific role
267
359
  *
268
360
  * AC4: Summary statistics available (mean by role, variance, top performers)
269
361
  */
270
- export async function getTopPerformers(role, limit, resultsDir) {
271
- const stats = await aggregateJobFairResults(resultsDir);
272
- const roleStats = stats.by_role[role];
273
- if (!roleStats)
274
- return [];
275
- return roleStats.top_performers.slice(0, limit);
362
+ function getTopPerformers(role, limit, resultsDir) {
363
+ return __awaiter(this, void 0, void 0, function () {
364
+ var stats, roleStats;
365
+ return __generator(this, function (_a) {
366
+ switch (_a.label) {
367
+ case 0: return [4 /*yield*/, aggregateJobFairResults(resultsDir)];
368
+ case 1:
369
+ stats = _a.sent();
370
+ roleStats = stats.by_role[role];
371
+ if (!roleStats)
372
+ return [2 /*return*/, []];
373
+ return [2 /*return*/, roleStats.top_performers.slice(0, limit)];
374
+ }
375
+ });
376
+ });
276
377
  }
277
378
  /**
278
379
  * Get historical trend data, optionally filtered by role
279
380
  *
280
381
  * AC5: Historical trend tracking for benchmark quality
281
382
  */
282
- export async function getHistoricalTrend(role, resultsDir) {
283
- const trend = loadHistoricalTrend(resultsDir);
284
- if (!role)
285
- return trend;
286
- // Filter to role-specific points if role is specified
287
- return trend.filter(point => !point.role || point.role === role);
383
+ function getHistoricalTrend(role, resultsDir) {
384
+ return __awaiter(this, void 0, void 0, function () {
385
+ var trend;
386
+ return __generator(this, function (_a) {
387
+ trend = loadHistoricalTrend(resultsDir);
388
+ if (!role)
389
+ return [2 /*return*/, trend];
390
+ // Filter to role-specific points if role is specified
391
+ return [2 /*return*/, trend.filter(function (point) { return !point.role || point.role === role; })];
392
+ });
393
+ });
288
394
  }
289
395
  /**
290
396
  * Save a historical snapshot of current aggregate stats
291
397
  *
292
398
  * AC5: Historical trend tracking for benchmark quality
293
399
  */
294
- export async function saveHistoricalSnapshot(resultsDir) {
295
- const stats = await aggregateJobFairResults(resultsDir);
296
- // Calculate overall mean and variance from all role means
297
- const roleMeans = Object.values(stats.by_role).map(r => r.mean_score);
298
- const overallMean = roleMeans.length > 0
299
- ? roleMeans.reduce((a, b) => a + b, 0) / roleMeans.length
300
- : 0;
301
- const overallVariance = calculateVariance(roleMeans, overallMean);
302
- const newPoint = {
303
- date: new Date().toISOString().split('T')[0],
304
- mean: overallMean,
305
- variance: overallVariance,
306
- };
307
- // Load existing history
308
- const existingTrend = loadHistoricalTrend(resultsDir);
309
- existingTrend.push(newPoint);
310
- // Ensure aggregate directory exists
311
- const aggregateDir = join(resultsDir, 'aggregate');
312
- if (!existsSync(aggregateDir)) {
313
- mkdirSync(aggregateDir, { recursive: true });
314
- }
315
- // Save updated history
316
- const historyPath = getHistoryFilePath(resultsDir);
317
- writeFileSync(historyPath, stringifyYaml({ snapshots: existingTrend }));
400
+ function saveHistoricalSnapshot(resultsDir) {
401
+ return __awaiter(this, void 0, void 0, function () {
402
+ var stats, roleMeans, overallMean, overallVariance, newPoint, existingTrend, aggregateDir, historyPath;
403
+ return __generator(this, function (_a) {
404
+ switch (_a.label) {
405
+ case 0: return [4 /*yield*/, aggregateJobFairResults(resultsDir)];
406
+ case 1:
407
+ stats = _a.sent();
408
+ roleMeans = Object.values(stats.by_role).map(function (r) { return r.mean_score; });
409
+ overallMean = roleMeans.length > 0
410
+ ? roleMeans.reduce(function (a, b) { return a + b; }, 0) / roleMeans.length
411
+ : 0;
412
+ overallVariance = calculateVariance(roleMeans, overallMean);
413
+ newPoint = {
414
+ date: new Date().toISOString().split('T')[0],
415
+ mean: overallMean,
416
+ variance: overallVariance,
417
+ };
418
+ existingTrend = loadHistoricalTrend(resultsDir);
419
+ existingTrend.push(newPoint);
420
+ aggregateDir = (0, path_1.join)(resultsDir, 'aggregate');
421
+ if (!(0, fs_1.existsSync)(aggregateDir)) {
422
+ (0, fs_1.mkdirSync)(aggregateDir, { recursive: true });
423
+ }
424
+ historyPath = getHistoryFilePath(resultsDir);
425
+ (0, fs_1.writeFileSync)(historyPath, (0, yaml_1.stringify)({ snapshots: existingTrend }));
426
+ return [2 /*return*/];
427
+ }
428
+ });
429
+ });
318
430
  }
319
431
  // ============================================================================
320
432
  // Story 7-5: Dimension Aggregation Functions
321
433
  // ============================================================================
322
434
  /** Default path to themes directory */
323
- const DEFAULT_THEMES_DIR = join(__dirname, '../../../../pennyfarthing-dist/personas/themes');
435
+ var DEFAULT_THEMES_DIR = (0, path_1.join)(__dirname, '../../../../pennyfarthing-dist/personas/themes');
324
436
  /**
325
437
  * Load dimensions from a theme YAML file
326
438
  */
327
- function loadThemeDimensions(themeName, themesDir = DEFAULT_THEMES_DIR) {
328
- const themePath = join(themesDir, `${themeName}.yaml`);
329
- if (!existsSync(themePath))
439
+ function loadThemeDimensions(themeName, themesDir) {
440
+ var _a;
441
+ if (themesDir === void 0) { themesDir = DEFAULT_THEMES_DIR; }
442
+ var themePath = (0, path_1.join)(themesDir, "".concat(themeName, ".yaml"));
443
+ if (!(0, fs_1.existsSync)(themePath))
330
444
  return null;
331
445
  try {
332
- const content = readFileSync(themePath, 'utf-8');
333
- const data = parseYaml(content);
334
- return data.theme?.dimensions || null;
446
+ var content = (0, fs_1.readFileSync)(themePath, 'utf-8');
447
+ var data = (0, yaml_1.parse)(content);
448
+ return ((_a = data.theme) === null || _a === void 0 ? void 0 : _a.dimensions) || null;
335
449
  }
336
- catch {
450
+ catch (_b) {
337
451
  return null;
338
452
  }
339
453
  }
@@ -344,11 +458,11 @@ function loadThemeDimensions(themeName, themesDir = DEFAULT_THEMES_DIR) {
344
458
  function calculateSignificance(mean1, mean2, std1, std2, n1, n2) {
345
459
  if (n1 < 2 || n2 < 2)
346
460
  return 'not_significant';
347
- const pooledStd = Math.sqrt(((n1 - 1) * std1 * std1 + (n2 - 1) * std2 * std2) / (n1 + n2 - 2));
461
+ var pooledStd = Math.sqrt(((n1 - 1) * std1 * std1 + (n2 - 1) * std2 * std2) / (n1 + n2 - 2));
348
462
  if (pooledStd === 0)
349
463
  return 'not_significant';
350
464
  // Calculate effect size (Cohen's d)
351
- const effectSize = Math.abs(mean1 - mean2) / pooledStd;
465
+ var effectSize = Math.abs(mean1 - mean2) / pooledStd;
352
466
  // Effect size thresholds: small=0.2, medium=0.5, large=0.8
353
467
  if (effectSize >= 0.8)
354
468
  return 'significant';
@@ -361,187 +475,216 @@ function calculateSignificance(mean1, mean2, std1, std2, n1, n2) {
361
475
  *
362
476
  * Story 7-5: AC - Job-fair aggregator groups results by dimension
363
477
  */
364
- export async function aggregateByDimension(dimension, resultsDir, themesDir = DEFAULT_THEMES_DIR) {
365
- const latestRuns = getLatestRunPerTheme(resultsDir);
366
- // Group themes by dimension value
367
- const themesByValue = new Map();
368
- const themeScores = new Map();
369
- for (const [theme] of latestRuns) {
370
- const dimensions = loadThemeDimensions(theme, themesDir);
371
- if (!dimensions)
372
- continue;
373
- const value = dimensions[dimension];
374
- if (!value)
375
- continue;
376
- if (!themesByValue.has(value)) {
377
- themesByValue.set(value, []);
378
- }
379
- themesByValue.get(value).push(theme);
380
- }
381
- // Parse scores for each theme
382
- for (const [theme, dirName] of latestRuns) {
383
- const summaryPath = join(resultsDir, dirName, 'summary.yaml');
384
- if (!existsSync(summaryPath))
385
- continue;
386
- const result = parseSummaryYaml(summaryPath, theme);
387
- if (result && result.scores.length > 0) {
388
- themeScores.set(theme, result.scores.map(s => ({ role: s.role, score: s.score })));
389
- }
390
- }
391
- // Calculate stats for each dimension value
392
- const values = [];
393
- for (const [value, themes] of themesByValue) {
394
- const roleScores = new Map();
395
- const totalScores = [];
396
- for (const theme of themes) {
397
- const scores = themeScores.get(theme);
398
- if (!scores)
399
- continue;
400
- for (const { role, score } of scores) {
401
- if (!roleScores.has(role)) {
402
- roleScores.set(role, []);
478
+ function aggregateByDimension(dimension_1, resultsDir_1) {
479
+ return __awaiter(this, arguments, void 0, function (dimension, resultsDir, themesDir) {
480
+ var latestRuns, themesByValue, themeScores, _i, latestRuns_2, theme, dimensions, value, _a, latestRuns_3, _b, theme, dirName, summaryPath, result, values, _c, themesByValue_1, _d, value, themes, roleScores, totalScores, _e, themes_1, theme, scores, _f, scores_1, _g, role, score, byRole, _h, roleScores_1, _j, role, scores, mean, stdDev, overallMean, comparisons, i, j, a, b, allRoles, roleComparisons, _k, allRoles_1, role, aRole, bRole, delta, significance, overallDelta, aScores, bScores, aStd, bStd, overallSignificance;
481
+ if (themesDir === void 0) { themesDir = DEFAULT_THEMES_DIR; }
482
+ return __generator(this, function (_l) {
483
+ latestRuns = getLatestRunPerTheme(resultsDir);
484
+ themesByValue = new Map();
485
+ themeScores = new Map();
486
+ for (_i = 0, latestRuns_2 = latestRuns; _i < latestRuns_2.length; _i++) {
487
+ theme = latestRuns_2[_i][0];
488
+ dimensions = loadThemeDimensions(theme, themesDir);
489
+ if (!dimensions)
490
+ continue;
491
+ value = dimensions[dimension];
492
+ if (!value)
493
+ continue;
494
+ if (!themesByValue.has(value)) {
495
+ themesByValue.set(value, []);
403
496
  }
404
- roleScores.get(role).push(score);
405
- totalScores.push(score);
497
+ themesByValue.get(value).push(theme);
406
498
  }
407
- }
408
- const byRole = {};
409
- for (const [role, scores] of roleScores) {
410
- const mean = scores.reduce((a, b) => a + b, 0) / scores.length;
411
- const stdDev = calculateStdDev(scores, mean);
412
- byRole[role] = { mean_score: mean, std_dev: stdDev, n: scores.length };
413
- }
414
- const overallMean = totalScores.length > 0
415
- ? totalScores.reduce((a, b) => a + b, 0) / totalScores.length
416
- : 0;
417
- values.push({
418
- value,
419
- themes,
420
- sample_size: totalScores.length,
421
- by_role: byRole,
422
- overall_mean: overallMean,
423
- });
424
- }
425
- // Generate pairwise comparisons
426
- const comparisons = [];
427
- for (let i = 0; i < values.length; i++) {
428
- for (let j = i + 1; j < values.length; j++) {
429
- const a = values[i];
430
- const b = values[j];
431
- // Get all roles present in both
432
- const allRoles = new Set([...Object.keys(a.by_role), ...Object.keys(b.by_role)]);
433
- const roleComparisons = {};
434
- for (const role of allRoles) {
435
- const aRole = a.by_role[role];
436
- const bRole = b.by_role[role];
437
- if (aRole && bRole) {
438
- const delta = aRole.mean_score - bRole.mean_score;
439
- const significance = calculateSignificance(aRole.mean_score, bRole.mean_score, aRole.std_dev, bRole.std_dev, aRole.n, bRole.n);
440
- roleComparisons[role] = { delta, significance };
499
+ // Parse scores for each theme
500
+ for (_a = 0, latestRuns_3 = latestRuns; _a < latestRuns_3.length; _a++) {
501
+ _b = latestRuns_3[_a], theme = _b[0], dirName = _b[1];
502
+ summaryPath = (0, path_1.join)(resultsDir, dirName, 'summary.yaml');
503
+ if (!(0, fs_1.existsSync)(summaryPath))
504
+ continue;
505
+ result = parseSummaryYaml(summaryPath, theme);
506
+ if (result && result.scores.length > 0) {
507
+ themeScores.set(theme, result.scores.map(function (s) { return ({ role: s.role, score: s.score }); }));
441
508
  }
442
509
  }
443
- // Overall comparison
444
- const overallDelta = a.overall_mean - b.overall_mean;
445
- // For overall significance, use aggregated stats
446
- const aScores = Object.values(a.by_role);
447
- const bScores = Object.values(b.by_role);
448
- const aStd = aScores.length > 0
449
- ? Math.sqrt(aScores.reduce((sum, r) => sum + r.std_dev * r.std_dev, 0) / aScores.length)
450
- : 0;
451
- const bStd = bScores.length > 0
452
- ? Math.sqrt(bScores.reduce((sum, r) => sum + r.std_dev * r.std_dev, 0) / bScores.length)
453
- : 0;
454
- const overallSignificance = calculateSignificance(a.overall_mean, b.overall_mean, aStd, bStd, a.sample_size, b.sample_size);
455
- comparisons.push({
456
- dimension,
457
- value_a: a.value,
458
- value_b: b.value,
459
- delta: overallDelta,
460
- significance: overallSignificance,
461
- by_role: roleComparisons,
462
- });
463
- }
464
- }
465
- return {
466
- dimension,
467
- last_updated: new Date().toISOString(),
468
- values,
469
- comparisons,
470
- };
510
+ values = [];
511
+ for (_c = 0, themesByValue_1 = themesByValue; _c < themesByValue_1.length; _c++) {
512
+ _d = themesByValue_1[_c], value = _d[0], themes = _d[1];
513
+ roleScores = new Map();
514
+ totalScores = [];
515
+ for (_e = 0, themes_1 = themes; _e < themes_1.length; _e++) {
516
+ theme = themes_1[_e];
517
+ scores = themeScores.get(theme);
518
+ if (!scores)
519
+ continue;
520
+ for (_f = 0, scores_1 = scores; _f < scores_1.length; _f++) {
521
+ _g = scores_1[_f], role = _g.role, score = _g.score;
522
+ if (!roleScores.has(role)) {
523
+ roleScores.set(role, []);
524
+ }
525
+ roleScores.get(role).push(score);
526
+ totalScores.push(score);
527
+ }
528
+ }
529
+ byRole = {};
530
+ for (_h = 0, roleScores_1 = roleScores; _h < roleScores_1.length; _h++) {
531
+ _j = roleScores_1[_h], role = _j[0], scores = _j[1];
532
+ mean = scores.reduce(function (a, b) { return a + b; }, 0) / scores.length;
533
+ stdDev = calculateStdDev(scores, mean);
534
+ byRole[role] = { mean_score: mean, std_dev: stdDev, n: scores.length };
535
+ }
536
+ overallMean = totalScores.length > 0
537
+ ? totalScores.reduce(function (a, b) { return a + b; }, 0) / totalScores.length
538
+ : 0;
539
+ values.push({
540
+ value: value,
541
+ themes: themes,
542
+ sample_size: totalScores.length,
543
+ by_role: byRole,
544
+ overall_mean: overallMean,
545
+ });
546
+ }
547
+ comparisons = [];
548
+ for (i = 0; i < values.length; i++) {
549
+ for (j = i + 1; j < values.length; j++) {
550
+ a = values[i];
551
+ b = values[j];
552
+ allRoles = new Set(__spreadArray(__spreadArray([], Object.keys(a.by_role), true), Object.keys(b.by_role), true));
553
+ roleComparisons = {};
554
+ for (_k = 0, allRoles_1 = allRoles; _k < allRoles_1.length; _k++) {
555
+ role = allRoles_1[_k];
556
+ aRole = a.by_role[role];
557
+ bRole = b.by_role[role];
558
+ if (aRole && bRole) {
559
+ delta = aRole.mean_score - bRole.mean_score;
560
+ significance = calculateSignificance(aRole.mean_score, bRole.mean_score, aRole.std_dev, bRole.std_dev, aRole.n, bRole.n);
561
+ roleComparisons[role] = { delta: delta, significance: significance };
562
+ }
563
+ }
564
+ overallDelta = a.overall_mean - b.overall_mean;
565
+ aScores = Object.values(a.by_role);
566
+ bScores = Object.values(b.by_role);
567
+ aStd = aScores.length > 0
568
+ ? Math.sqrt(aScores.reduce(function (sum, r) { return sum + r.std_dev * r.std_dev; }, 0) / aScores.length)
569
+ : 0;
570
+ bStd = bScores.length > 0
571
+ ? Math.sqrt(bScores.reduce(function (sum, r) { return sum + r.std_dev * r.std_dev; }, 0) / bScores.length)
572
+ : 0;
573
+ overallSignificance = calculateSignificance(a.overall_mean, b.overall_mean, aStd, bStd, a.sample_size, b.sample_size);
574
+ comparisons.push({
575
+ dimension: dimension,
576
+ value_a: a.value,
577
+ value_b: b.value,
578
+ delta: overallDelta,
579
+ significance: overallSignificance,
580
+ by_role: roleComparisons,
581
+ });
582
+ }
583
+ }
584
+ return [2 /*return*/, {
585
+ dimension: dimension,
586
+ last_updated: new Date().toISOString(),
587
+ values: values,
588
+ comparisons: comparisons,
589
+ }];
590
+ });
591
+ });
471
592
  }
472
593
  /**
473
594
  * Get all available dimension values with theme counts
474
595
  *
475
596
  * Useful for API endpoints to show available filter options
476
597
  */
477
- export async function getDimensionValues(dimension, themesDir = DEFAULT_THEMES_DIR) {
478
- const valueCounts = new Map();
479
- if (!existsSync(themesDir))
480
- return [];
481
- const entries = readdirSync(themesDir, { withFileTypes: true });
482
- for (const entry of entries) {
483
- if (!entry.isFile() || !entry.name.endsWith('.yaml'))
484
- continue;
485
- const themeName = entry.name.replace('.yaml', '');
486
- const dimensions = loadThemeDimensions(themeName, themesDir);
487
- if (dimensions && dimensions[dimension]) {
488
- const value = dimensions[dimension];
489
- valueCounts.set(value, (valueCounts.get(value) || 0) + 1);
490
- }
491
- }
492
- return Array.from(valueCounts.entries())
493
- .map(([value, theme_count]) => ({ value, theme_count }))
494
- .sort((a, b) => b.theme_count - a.theme_count);
598
+ function getDimensionValues(dimension_1) {
599
+ return __awaiter(this, arguments, void 0, function (dimension, themesDir) {
600
+ var valueCounts, entries, _i, entries_2, entry, themeName, dimensions, value;
601
+ if (themesDir === void 0) { themesDir = DEFAULT_THEMES_DIR; }
602
+ return __generator(this, function (_a) {
603
+ valueCounts = new Map();
604
+ if (!(0, fs_1.existsSync)(themesDir))
605
+ return [2 /*return*/, []];
606
+ entries = (0, fs_1.readdirSync)(themesDir, { withFileTypes: true });
607
+ for (_i = 0, entries_2 = entries; _i < entries_2.length; _i++) {
608
+ entry = entries_2[_i];
609
+ if (!entry.isFile() || !entry.name.endsWith('.yaml'))
610
+ continue;
611
+ themeName = entry.name.replace('.yaml', '');
612
+ dimensions = loadThemeDimensions(themeName, themesDir);
613
+ if (dimensions && dimensions[dimension]) {
614
+ value = dimensions[dimension];
615
+ valueCounts.set(value, (valueCounts.get(value) || 0) + 1);
616
+ }
617
+ }
618
+ return [2 /*return*/, Array.from(valueCounts.entries())
619
+ .map(function (_a) {
620
+ var value = _a[0], theme_count = _a[1];
621
+ return ({ value: value, theme_count: theme_count });
622
+ })
623
+ .sort(function (a, b) { return b.theme_count - a.theme_count; })];
624
+ });
625
+ });
495
626
  }
496
627
  /**
497
628
  * Generate a differential report comparing dimension values
498
629
  *
499
630
  * Story 7-5: AC - Differential report shows performance by dimension value
500
631
  */
501
- export async function generateDifferentialReport(dimension, resultsDir, themesDir = DEFAULT_THEMES_DIR) {
502
- const stats = await aggregateByDimension(dimension, resultsDir, themesDir);
503
- const lines = [
504
- `# Differential Report: ${dimension}`,
505
- '',
506
- `Generated: ${stats.last_updated}`,
507
- '',
508
- '## Summary by Value',
509
- '',
510
- ];
511
- // Sort values by overall mean descending
512
- const sortedValues = [...stats.values].sort((a, b) => b.overall_mean - a.overall_mean);
513
- for (const v of sortedValues) {
514
- lines.push(`### ${v.value}`);
515
- lines.push(`- Themes: ${v.themes.length} (${v.themes.join(', ')})`);
516
- lines.push(`- Sample size: ${v.sample_size}`);
517
- lines.push(`- Overall mean: ${v.overall_mean.toFixed(2)}`);
518
- lines.push('');
519
- lines.push('| Role | Mean | Std Dev | N |');
520
- lines.push('|------|------|---------|---|');
521
- for (const [role, roleStats] of Object.entries(v.by_role)) {
522
- lines.push(`| ${role} | ${roleStats.mean_score.toFixed(2)} | ${roleStats.std_dev.toFixed(2)} | ${roleStats.n} |`);
523
- }
524
- lines.push('');
525
- }
526
- lines.push('## Pairwise Comparisons');
527
- lines.push('');
528
- for (const comp of stats.comparisons) {
529
- const sigLabel = comp.significance === 'significant' ? '**SIGNIFICANT**'
530
- : comp.significance === 'marginal' ? '*marginal*'
531
- : 'not significant';
532
- const direction = comp.delta > 0 ? '>' : comp.delta < 0 ? '<' : '=';
533
- lines.push(`### ${comp.value_a} ${direction} ${comp.value_b}`);
534
- lines.push(`- Delta: ${comp.delta > 0 ? '+' : ''}${comp.delta.toFixed(2)} (${sigLabel})`);
535
- lines.push('');
536
- if (Object.keys(comp.by_role).length > 0) {
537
- lines.push('| Role | Delta | Significance |');
538
- lines.push('|------|-------|--------------|');
539
- for (const [role, roleComp] of Object.entries(comp.by_role)) {
540
- lines.push(`| ${role} | ${roleComp.delta > 0 ? '+' : ''}${roleComp.delta.toFixed(2)} | ${roleComp.significance} |`);
632
+ function generateDifferentialReport(dimension_1, resultsDir_1) {
633
+ return __awaiter(this, arguments, void 0, function (dimension, resultsDir, themesDir) {
634
+ var stats, lines, sortedValues, _i, sortedValues_1, v, _a, _b, _c, role, roleStats, _d, _e, comp, sigLabel, direction, _f, _g, _h, role, roleComp;
635
+ if (themesDir === void 0) { themesDir = DEFAULT_THEMES_DIR; }
636
+ return __generator(this, function (_j) {
637
+ switch (_j.label) {
638
+ case 0: return [4 /*yield*/, aggregateByDimension(dimension, resultsDir, themesDir)];
639
+ case 1:
640
+ stats = _j.sent();
641
+ lines = [
642
+ "# Differential Report: ".concat(dimension),
643
+ '',
644
+ "Generated: ".concat(stats.last_updated),
645
+ '',
646
+ '## Summary by Value',
647
+ '',
648
+ ];
649
+ sortedValues = __spreadArray([], stats.values, true).sort(function (a, b) { return b.overall_mean - a.overall_mean; });
650
+ for (_i = 0, sortedValues_1 = sortedValues; _i < sortedValues_1.length; _i++) {
651
+ v = sortedValues_1[_i];
652
+ lines.push("### ".concat(v.value));
653
+ lines.push("- Themes: ".concat(v.themes.length, " (").concat(v.themes.join(', '), ")"));
654
+ lines.push("- Sample size: ".concat(v.sample_size));
655
+ lines.push("- Overall mean: ".concat(v.overall_mean.toFixed(2)));
656
+ lines.push('');
657
+ lines.push('| Role | Mean | Std Dev | N |');
658
+ lines.push('|------|------|---------|---|');
659
+ for (_a = 0, _b = Object.entries(v.by_role); _a < _b.length; _a++) {
660
+ _c = _b[_a], role = _c[0], roleStats = _c[1];
661
+ lines.push("| ".concat(role, " | ").concat(roleStats.mean_score.toFixed(2), " | ").concat(roleStats.std_dev.toFixed(2), " | ").concat(roleStats.n, " |"));
662
+ }
663
+ lines.push('');
664
+ }
665
+ lines.push('## Pairwise Comparisons');
666
+ lines.push('');
667
+ for (_d = 0, _e = stats.comparisons; _d < _e.length; _d++) {
668
+ comp = _e[_d];
669
+ sigLabel = comp.significance === 'significant' ? '**SIGNIFICANT**'
670
+ : comp.significance === 'marginal' ? '*marginal*'
671
+ : 'not significant';
672
+ direction = comp.delta > 0 ? '>' : comp.delta < 0 ? '<' : '=';
673
+ lines.push("### ".concat(comp.value_a, " ").concat(direction, " ").concat(comp.value_b));
674
+ lines.push("- Delta: ".concat(comp.delta > 0 ? '+' : '').concat(comp.delta.toFixed(2), " (").concat(sigLabel, ")"));
675
+ lines.push('');
676
+ if (Object.keys(comp.by_role).length > 0) {
677
+ lines.push('| Role | Delta | Significance |');
678
+ lines.push('|------|-------|--------------|');
679
+ for (_f = 0, _g = Object.entries(comp.by_role); _f < _g.length; _f++) {
680
+ _h = _g[_f], role = _h[0], roleComp = _h[1];
681
+ lines.push("| ".concat(role, " | ").concat(roleComp.delta > 0 ? '+' : '').concat(roleComp.delta.toFixed(2), " | ").concat(roleComp.significance, " |"));
682
+ }
683
+ lines.push('');
684
+ }
685
+ }
686
+ return [2 /*return*/, lines.join('\n')];
541
687
  }
542
- lines.push('');
543
- }
544
- }
545
- return lines.join('\n');
688
+ });
689
+ });
546
690
  }
547
- //# sourceMappingURL=job-fair-aggregator.js.map