@pennyfarthing/core 7.5.0 → 7.6.1

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 (901) hide show
  1. package/LICENSE +14 -0
  2. package/README.md +301 -0
  3. package/package.json +31 -36
  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 +196 -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 +245 -0
  59. package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -0
  60. package/packages/core/dist/cli/commands/doctor-legacy.test.d.ts +13 -0
  61. package/packages/core/dist/cli/commands/doctor-legacy.test.d.ts.map +1 -0
  62. package/packages/core/dist/cli/commands/doctor-legacy.test.js +207 -0
  63. package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -0
  64. package/packages/core/dist/cli/commands/doctor.d.ts +25 -0
  65. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -0
  66. package/packages/core/dist/cli/commands/doctor.js +780 -0
  67. package/packages/core/dist/cli/commands/doctor.js.map +1 -0
  68. package/packages/core/dist/cli/commands/init.d.ts +8 -0
  69. package/packages/core/dist/cli/commands/init.d.ts.map +1 -0
  70. package/packages/core/dist/cli/commands/init.js +515 -0
  71. package/packages/core/dist/cli/commands/init.js.map +1 -0
  72. package/packages/core/dist/cli/commands/skill.d.ts +28 -0
  73. package/packages/core/dist/cli/commands/skill.d.ts.map +1 -0
  74. package/packages/core/dist/cli/commands/skill.js +416 -0
  75. package/packages/core/dist/cli/commands/skill.js.map +1 -0
  76. package/packages/core/dist/cli/commands/theme.d.ts +21 -0
  77. package/packages/core/dist/cli/commands/theme.d.ts.map +1 -0
  78. package/packages/core/dist/cli/commands/theme.js +201 -0
  79. package/packages/core/dist/cli/commands/theme.js.map +1 -0
  80. package/packages/core/dist/cli/commands/uninstall.d.ts +8 -0
  81. package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -0
  82. package/packages/core/dist/cli/commands/uninstall.js +237 -0
  83. package/packages/core/dist/cli/commands/uninstall.js.map +1 -0
  84. package/packages/core/dist/cli/commands/update.d.ts +9 -0
  85. package/packages/core/dist/cli/commands/update.d.ts.map +1 -0
  86. package/packages/core/dist/cli/commands/update.js +390 -0
  87. package/packages/core/dist/cli/commands/update.js.map +1 -0
  88. package/packages/core/dist/cli/commands/version.d.ts +2 -0
  89. package/packages/core/dist/cli/commands/version.d.ts.map +1 -0
  90. package/packages/core/dist/cli/commands/version.js +28 -0
  91. package/packages/core/dist/cli/commands/version.js.map +1 -0
  92. package/packages/core/dist/cli/customization.test.d.ts +12 -0
  93. package/packages/core/dist/cli/customization.test.d.ts.map +1 -0
  94. package/packages/core/dist/cli/customization.test.js +84 -0
  95. package/packages/core/dist/cli/customization.test.js.map +1 -0
  96. package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
  97. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
  98. package/packages/core/dist/cli/cyclist-migration.test.js +225 -0
  99. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
  100. package/packages/core/dist/cli/index.d.ts +3 -0
  101. package/packages/core/dist/cli/index.d.ts.map +1 -0
  102. package/packages/core/dist/cli/index.js +174 -0
  103. package/packages/core/dist/cli/index.js.map +1 -0
  104. package/packages/core/dist/cli/ocean-profiles.test.d.ts +13 -0
  105. package/packages/core/dist/cli/ocean-profiles.test.d.ts.map +1 -0
  106. package/packages/core/dist/cli/ocean-profiles.test.js +134 -0
  107. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -0
  108. package/packages/core/dist/cli/theme-maker.test.d.ts +11 -0
  109. package/packages/core/dist/cli/theme-maker.test.d.ts.map +1 -0
  110. package/packages/core/dist/cli/theme-maker.test.js +356 -0
  111. package/packages/core/dist/cli/theme-maker.test.js.map +1 -0
  112. package/packages/core/dist/cli/utils/constants.d.ts +66 -0
  113. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -0
  114. package/packages/core/dist/cli/utils/constants.js +54 -0
  115. package/packages/core/dist/cli/utils/constants.js.map +1 -0
  116. package/{dist → packages/core/dist}/cli/utils/files.d.ts +1 -0
  117. package/packages/core/dist/cli/utils/files.d.ts.map +1 -0
  118. package/packages/core/dist/cli/utils/files.js +162 -0
  119. package/packages/core/dist/cli/utils/files.js.map +1 -0
  120. package/packages/core/dist/cli/utils/logger.d.ts +26 -0
  121. package/packages/core/dist/cli/utils/logger.d.ts.map +1 -0
  122. package/packages/core/dist/cli/utils/logger.js +88 -0
  123. package/packages/core/dist/cli/utils/logger.js.map +1 -0
  124. package/{dist → packages/core/dist}/cli/utils/manifest.d.ts +1 -0
  125. package/packages/core/dist/cli/utils/manifest.d.ts.map +1 -0
  126. package/packages/core/dist/cli/utils/manifest.js +90 -0
  127. package/packages/core/dist/cli/utils/manifest.js.map +1 -0
  128. package/packages/core/dist/cli/utils/node-modules.d.ts +6 -0
  129. package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -0
  130. package/packages/core/dist/cli/utils/node-modules.js +32 -0
  131. package/packages/core/dist/cli/utils/node-modules.js.map +1 -0
  132. package/packages/core/dist/cli/utils/prompts.d.ts +34 -0
  133. package/packages/core/dist/cli/utils/prompts.d.ts.map +1 -0
  134. package/packages/core/dist/cli/utils/prompts.js +93 -0
  135. package/packages/core/dist/cli/utils/prompts.js.map +1 -0
  136. package/packages/core/dist/cli/utils/symlinks.d.ts +44 -0
  137. package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -0
  138. package/packages/core/dist/cli/utils/symlinks.js +327 -0
  139. package/packages/core/dist/cli/utils/symlinks.js.map +1 -0
  140. package/packages/core/dist/cli/utils/themes.d.ts +101 -0
  141. package/packages/core/dist/cli/utils/themes.d.ts.map +1 -0
  142. package/packages/core/dist/cli/utils/themes.js +382 -0
  143. package/packages/core/dist/cli/utils/themes.js.map +1 -0
  144. package/packages/core/dist/cli/utils/themes.test.d.ts +12 -0
  145. package/packages/core/dist/cli/utils/themes.test.d.ts.map +1 -0
  146. package/packages/core/dist/cli/utils/themes.test.js +147 -0
  147. package/packages/core/dist/cli/utils/themes.test.js.map +1 -0
  148. package/{dist → packages/core/dist}/cli/utils/version.d.ts +1 -0
  149. package/packages/core/dist/cli/utils/version.d.ts.map +1 -0
  150. package/packages/core/dist/cli/utils/version.js +64 -0
  151. package/packages/core/dist/cli/utils/version.js.map +1 -0
  152. package/packages/core/dist/cli/workspace.test.d.ts +8 -0
  153. package/packages/core/dist/cli/workspace.test.d.ts.map +1 -0
  154. package/packages/core/dist/cli/workspace.test.js +156 -0
  155. package/packages/core/dist/cli/workspace.test.js.map +1 -0
  156. package/{dist → packages/core/dist}/index.d.ts +1 -0
  157. package/packages/core/dist/index.d.ts.map +1 -0
  158. package/packages/core/dist/index.js +20 -0
  159. package/packages/core/dist/index.js.map +1 -0
  160. package/packages/core/dist/jira/jira-epic-creation.d.ts +109 -0
  161. package/packages/core/dist/jira/jira-epic-creation.d.ts.map +1 -0
  162. package/packages/core/dist/jira/jira-epic-creation.js +253 -0
  163. package/packages/core/dist/jira/jira-epic-creation.js.map +1 -0
  164. package/packages/core/dist/jira/jira-epic-creation.test.d.ts +16 -0
  165. package/packages/core/dist/jira/jira-epic-creation.test.d.ts.map +1 -0
  166. package/packages/core/dist/jira/jira-epic-creation.test.js +387 -0
  167. package/packages/core/dist/jira/jira-epic-creation.test.js.map +1 -0
  168. package/packages/core/dist/jira/jira-sprint-sync.d.ts +247 -0
  169. package/packages/core/dist/jira/jira-sprint-sync.d.ts.map +1 -0
  170. package/packages/core/dist/jira/jira-sprint-sync.js +670 -0
  171. package/packages/core/dist/jira/jira-sprint-sync.js.map +1 -0
  172. package/packages/core/dist/jira/jira-sprint-sync.test.d.ts +16 -0
  173. package/packages/core/dist/jira/jira-sprint-sync.test.d.ts.map +1 -0
  174. package/packages/core/dist/jira/jira-sprint-sync.test.js +845 -0
  175. package/packages/core/dist/jira/jira-sprint-sync.test.js.map +1 -0
  176. package/{dist → packages/core/dist}/permissions/index.d.ts +1 -0
  177. package/packages/core/dist/permissions/index.d.ts.map +1 -0
  178. package/packages/core/dist/permissions/index.js +13 -0
  179. package/packages/core/dist/permissions/index.js.map +1 -0
  180. package/{dist → packages/core/dist}/permissions/permission-schema.d.ts +1 -0
  181. package/packages/core/dist/permissions/permission-schema.d.ts.map +1 -0
  182. package/{dist → packages/core/dist}/permissions/permission-schema.js +9 -13
  183. package/packages/core/dist/permissions/permission-schema.js.map +1 -0
  184. package/packages/core/dist/permissions/permission-schema.test.d.ts +40 -0
  185. package/packages/core/dist/permissions/permission-schema.test.d.ts.map +1 -0
  186. package/packages/core/dist/permissions/permission-schema.test.js +367 -0
  187. package/packages/core/dist/permissions/permission-schema.test.js.map +1 -0
  188. package/packages/core/dist/scripts/add-ocean-profiles.d.ts +9 -0
  189. package/packages/core/dist/scripts/add-ocean-profiles.d.ts.map +1 -0
  190. package/packages/core/dist/scripts/add-ocean-profiles.js +695 -0
  191. package/packages/core/dist/scripts/add-ocean-profiles.js.map +1 -0
  192. package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
  193. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
  194. package/packages/core/dist/scripts/benchmark-integration.js +691 -0
  195. package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
  196. package/packages/core/dist/scripts/benchmark-integration.test.d.ts +13 -0
  197. package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +1 -0
  198. package/packages/core/dist/scripts/benchmark-integration.test.js +680 -0
  199. package/packages/core/dist/scripts/benchmark-integration.test.js.map +1 -0
  200. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +18 -0
  201. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +1 -0
  202. package/packages/core/dist/scripts/debugging-scenarios.test.js +317 -0
  203. package/packages/core/dist/scripts/debugging-scenarios.test.js.map +1 -0
  204. package/packages/core/dist/scripts/generate-all-spiders.d.ts +10 -0
  205. package/packages/core/dist/scripts/generate-all-spiders.d.ts.map +1 -0
  206. package/packages/core/dist/scripts/generate-all-spiders.js +306 -0
  207. package/packages/core/dist/scripts/generate-all-spiders.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 +47 -0
  225. package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -0
  226. package/packages/core/dist/scripts/generate-spider.js +338 -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 +271 -0
  231. package/packages/core/dist/scripts/generate-spider.test.js.map +1 -0
  232. package/{dist → packages/core/dist}/scripts/job-fair-aggregator.d.ts +1 -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/gate-handler.d.ts +94 -0
  253. package/packages/core/dist/workflow/gate-handler.d.ts.map +1 -0
  254. package/packages/core/dist/workflow/gate-handler.js +189 -0
  255. package/packages/core/dist/workflow/gate-handler.js.map +1 -0
  256. package/packages/core/dist/workflow/gate-handler.test.d.ts +14 -0
  257. package/packages/core/dist/workflow/gate-handler.test.d.ts.map +1 -0
  258. package/packages/core/dist/workflow/gate-handler.test.js +543 -0
  259. package/packages/core/dist/workflow/gate-handler.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/handoff.d.ts +281 -0
  269. package/packages/core/dist/workflow/handoff.d.ts.map +1 -0
  270. package/packages/core/dist/workflow/handoff.js +411 -0
  271. package/packages/core/dist/workflow/handoff.js.map +1 -0
  272. package/packages/core/dist/workflow/handoff.test.d.ts +21 -0
  273. package/packages/core/dist/workflow/handoff.test.d.ts.map +1 -0
  274. package/packages/core/dist/workflow/handoff.test.js +499 -0
  275. package/packages/core/dist/workflow/handoff.test.js.map +1 -0
  276. package/{dist → packages/core/dist}/workflow/index.d.ts +1 -0
  277. package/packages/core/dist/workflow/index.d.ts.map +1 -0
  278. package/packages/core/dist/workflow/index.js +24 -0
  279. package/packages/core/dist/workflow/index.js.map +1 -0
  280. package/packages/core/dist/workflow/session-state.d.ts +92 -0
  281. package/packages/core/dist/workflow/session-state.d.ts.map +1 -0
  282. package/packages/core/dist/workflow/session-state.js +198 -0
  283. package/packages/core/dist/workflow/session-state.js.map +1 -0
  284. package/packages/core/dist/workflow/session-state.test.d.ts +8 -0
  285. package/packages/core/dist/workflow/session-state.test.d.ts.map +1 -0
  286. package/packages/core/dist/workflow/session-state.test.js +551 -0
  287. package/packages/core/dist/workflow/session-state.test.js.map +1 -0
  288. package/packages/core/dist/workflow/sm-subagents.test.d.ts +23 -0
  289. package/packages/core/dist/workflow/sm-subagents.test.d.ts.map +1 -0
  290. package/packages/core/dist/workflow/sm-subagents.test.js +727 -0
  291. package/packages/core/dist/workflow/sm-subagents.test.js.map +1 -0
  292. package/packages/core/dist/workflow/step-parser.d.ts +45 -0
  293. package/packages/core/dist/workflow/step-parser.d.ts.map +1 -0
  294. package/packages/core/dist/workflow/step-parser.js +147 -0
  295. package/packages/core/dist/workflow/step-parser.js.map +1 -0
  296. package/packages/core/dist/workflow/step-parser.test.d.ts +14 -0
  297. package/packages/core/dist/workflow/step-parser.test.d.ts.map +1 -0
  298. package/packages/core/dist/workflow/step-parser.test.js +470 -0
  299. package/packages/core/dist/workflow/step-parser.test.js.map +1 -0
  300. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts +17 -0
  301. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts.map +1 -0
  302. package/packages/core/dist/workflow/story-workflow-routing.test.js +559 -0
  303. package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -0
  304. package/packages/core/dist/workflow/test-cache.d.ts +131 -0
  305. package/packages/core/dist/workflow/test-cache.d.ts.map +1 -0
  306. package/packages/core/dist/workflow/test-cache.js +226 -0
  307. package/packages/core/dist/workflow/test-cache.js.map +1 -0
  308. package/packages/core/dist/workflow/test-cache.test.d.ts +17 -0
  309. package/packages/core/dist/workflow/test-cache.test.d.ts.map +1 -0
  310. package/packages/core/dist/workflow/test-cache.test.js +438 -0
  311. package/packages/core/dist/workflow/test-cache.test.js.map +1 -0
  312. package/packages/core/dist/workflow/trimodal.d.ts +86 -0
  313. package/packages/core/dist/workflow/trimodal.d.ts.map +1 -0
  314. package/packages/core/dist/workflow/trimodal.js +118 -0
  315. package/packages/core/dist/workflow/trimodal.js.map +1 -0
  316. package/packages/core/dist/workflow/trimodal.test.d.ts +11 -0
  317. package/packages/core/dist/workflow/trimodal.test.d.ts.map +1 -0
  318. package/packages/core/dist/workflow/trimodal.test.js +395 -0
  319. package/packages/core/dist/workflow/trimodal.test.js.map +1 -0
  320. package/packages/core/dist/workflow/variable-resolver.d.ts +67 -0
  321. package/packages/core/dist/workflow/variable-resolver.d.ts.map +1 -0
  322. package/packages/core/dist/workflow/variable-resolver.js +156 -0
  323. package/packages/core/dist/workflow/variable-resolver.js.map +1 -0
  324. package/packages/core/dist/workflow/variable-resolver.test.d.ts +14 -0
  325. package/packages/core/dist/workflow/variable-resolver.test.d.ts.map +1 -0
  326. package/packages/core/dist/workflow/variable-resolver.test.js +400 -0
  327. package/packages/core/dist/workflow/variable-resolver.test.js.map +1 -0
  328. package/packages/core/dist/workflow/workflow-executor.d.ts +163 -0
  329. package/packages/core/dist/workflow/workflow-executor.d.ts.map +1 -0
  330. package/packages/core/dist/workflow/workflow-executor.js +197 -0
  331. package/packages/core/dist/workflow/workflow-executor.js.map +1 -0
  332. package/packages/core/dist/workflow/workflow-executor.test.d.ts +8 -0
  333. package/packages/core/dist/workflow/workflow-executor.test.d.ts.map +1 -0
  334. package/packages/core/dist/workflow/workflow-executor.test.js +444 -0
  335. package/packages/core/dist/workflow/workflow-executor.test.js.map +1 -0
  336. package/{dist → packages/core/dist}/workflow/workflow-loader.d.ts +1 -0
  337. package/packages/core/dist/workflow/workflow-loader.d.ts.map +1 -0
  338. package/{dist → packages/core/dist}/workflow/workflow-loader.js +34 -40
  339. package/packages/core/dist/workflow/workflow-loader.js.map +1 -0
  340. package/packages/core/dist/workflow/workflow-loader.test.d.ts +15 -0
  341. package/packages/core/dist/workflow/workflow-loader.test.d.ts.map +1 -0
  342. package/packages/core/dist/workflow/workflow-loader.test.js +354 -0
  343. package/packages/core/dist/workflow/workflow-loader.test.js.map +1 -0
  344. package/packages/core/dist/workflow/workflow-migration.test.d.ts +17 -0
  345. package/packages/core/dist/workflow/workflow-migration.test.d.ts.map +1 -0
  346. package/packages/core/dist/workflow/workflow-migration.test.js +371 -0
  347. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -0
  348. package/{dist → packages/core/dist}/workflow/workflow-permissions.d.ts +1 -0
  349. package/packages/core/dist/workflow/workflow-permissions.d.ts.map +1 -0
  350. package/{dist → packages/core/dist}/workflow/workflow-permissions.js +8 -14
  351. package/packages/core/dist/workflow/workflow-permissions.js.map +1 -0
  352. package/packages/core/dist/workflow/workflow-permissions.test.d.ts +15 -0
  353. package/packages/core/dist/workflow/workflow-permissions.test.d.ts.map +1 -0
  354. package/packages/core/dist/workflow/workflow-permissions.test.js +301 -0
  355. package/packages/core/dist/workflow/workflow-permissions.test.js.map +1 -0
  356. package/{dist → packages/core/dist}/workflow/workflow-router.d.ts +1 -0
  357. package/packages/core/dist/workflow/workflow-router.d.ts.map +1 -0
  358. package/{dist → packages/core/dist}/workflow/workflow-router.js +51 -70
  359. package/packages/core/dist/workflow/workflow-router.js.map +1 -0
  360. package/packages/core/dist/workflow/workflow-router.test.d.ts +20 -0
  361. package/packages/core/dist/workflow/workflow-router.test.d.ts.map +1 -0
  362. package/packages/core/dist/workflow/workflow-router.test.js +607 -0
  363. package/packages/core/dist/workflow/workflow-router.test.js.map +1 -0
  364. package/{dist → packages/core/dist}/workflow/workflow-schema.d.ts +1 -0
  365. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -0
  366. package/{dist → packages/core/dist}/workflow/workflow-schema.js +59 -62
  367. package/packages/core/dist/workflow/workflow-schema.js.map +1 -0
  368. package/packages/core/dist/workflow/workflow-schema.test.d.ts +45 -0
  369. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -0
  370. package/packages/core/dist/workflow/workflow-schema.test.js +512 -0
  371. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -0
  372. package/packages/core/dist/workflow/workflow-stepped-schema.test.d.ts +18 -0
  373. package/packages/core/dist/workflow/workflow-stepped-schema.test.d.ts.map +1 -0
  374. package/packages/core/dist/workflow/workflow-stepped-schema.test.js +608 -0
  375. package/packages/core/dist/workflow/workflow-stepped-schema.test.js.map +1 -0
  376. package/pennyfarthing-dist/agents/README.md +340 -0
  377. package/pennyfarthing-dist/agents/architect.md +193 -0
  378. package/pennyfarthing-dist/agents/dev.md +259 -0
  379. package/pennyfarthing-dist/agents/devops.md +206 -0
  380. package/pennyfarthing-dist/agents/handoff.md +212 -0
  381. package/pennyfarthing-dist/agents/orchestrator.md +355 -0
  382. package/pennyfarthing-dist/agents/pm.md +169 -0
  383. package/pennyfarthing-dist/agents/reviewer-preflight.md +96 -0
  384. package/pennyfarthing-dist/agents/reviewer.md +377 -0
  385. package/pennyfarthing-dist/agents/sm-file-summary.md +58 -0
  386. package/pennyfarthing-dist/agents/sm-finish.md +61 -0
  387. package/pennyfarthing-dist/agents/sm-handoff.md +122 -0
  388. package/pennyfarthing-dist/agents/sm-setup.md +174 -0
  389. package/pennyfarthing-dist/agents/sm.md +649 -0
  390. package/pennyfarthing-dist/agents/tea.md +230 -0
  391. package/pennyfarthing-dist/agents/tech-writer.md +216 -0
  392. package/pennyfarthing-dist/agents/testing-runner.md +141 -0
  393. package/pennyfarthing-dist/agents/ux-designer.md +231 -0
  394. package/pennyfarthing-dist/agents/workflow-status-check.md +68 -0
  395. package/pennyfarthing-dist/commands/architect.md +7 -0
  396. package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
  397. package/pennyfarthing-dist/commands/benchmark.md +467 -0
  398. package/pennyfarthing-dist/commands/brainstorming.md +91 -0
  399. package/pennyfarthing-dist/commands/check.md +156 -0
  400. package/pennyfarthing-dist/commands/chore.md +178 -0
  401. package/pennyfarthing-dist/commands/close-epic.md +139 -0
  402. package/pennyfarthing-dist/commands/continue-session.md +184 -0
  403. package/pennyfarthing-dist/commands/create-branches-from-story.md +358 -0
  404. package/pennyfarthing-dist/commands/create-theme.md +29 -0
  405. package/pennyfarthing-dist/commands/dev.md +7 -0
  406. package/pennyfarthing-dist/commands/devops.md +7 -0
  407. package/pennyfarthing-dist/commands/git-cleanup.md +340 -0
  408. package/pennyfarthing-dist/commands/health-check.md +141 -0
  409. package/pennyfarthing-dist/commands/help.md +264 -0
  410. package/pennyfarthing-dist/commands/job-fair.md +102 -0
  411. package/pennyfarthing-dist/commands/list-themes.md +21 -0
  412. package/pennyfarthing-dist/commands/orchestrator.md +7 -0
  413. package/pennyfarthing-dist/commands/parallel-work.md +71 -0
  414. package/pennyfarthing-dist/commands/party-mode.md +67 -0
  415. package/pennyfarthing-dist/commands/permissions.md +193 -0
  416. package/pennyfarthing-dist/commands/pm.md +7 -0
  417. package/pennyfarthing-dist/commands/prime.md +140 -0
  418. package/pennyfarthing-dist/commands/release.md +58 -0
  419. package/pennyfarthing-dist/commands/repo-status.md +49 -0
  420. package/pennyfarthing-dist/commands/retro.md +200 -0
  421. package/pennyfarthing-dist/commands/reviewer.md +7 -0
  422. package/pennyfarthing-dist/commands/run-ci.md +116 -0
  423. package/pennyfarthing-dist/commands/set-theme.md +56 -0
  424. package/pennyfarthing-dist/commands/show-theme.md +21 -0
  425. package/pennyfarthing-dist/commands/sm.md +7 -0
  426. package/pennyfarthing-dist/commands/solo.md +411 -0
  427. package/pennyfarthing-dist/commands/sprint-planning.md +109 -0
  428. package/pennyfarthing-dist/commands/sprint.md +133 -0
  429. package/pennyfarthing-dist/commands/standalone.md +194 -0
  430. package/pennyfarthing-dist/commands/start-epic.md +168 -0
  431. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +184 -0
  432. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +373 -0
  433. package/pennyfarthing-dist/commands/tea.md +7 -0
  434. package/pennyfarthing-dist/commands/tech-writer.md +7 -0
  435. package/pennyfarthing-dist/commands/theme-maker.md +676 -0
  436. package/pennyfarthing-dist/commands/update-domain-docs.md +83 -0
  437. package/pennyfarthing-dist/commands/ux-designer.md +7 -0
  438. package/pennyfarthing-dist/commands/work.md +122 -0
  439. package/pennyfarthing-dist/commands/workflow.md +21 -0
  440. package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +480 -0
  441. package/pennyfarthing-dist/guides/HOOKS.md +230 -0
  442. package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +338 -0
  443. package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +193 -0
  444. package/pennyfarthing-dist/guides/XML-TAGS.md +156 -0
  445. package/pennyfarthing-dist/guides/agent-behavior.md +286 -0
  446. package/pennyfarthing-dist/guides/agent-template-strategic.md +148 -0
  447. package/pennyfarthing-dist/guides/agent-template-tactical.md +162 -0
  448. package/pennyfarthing-dist/guides/measurement-framework.md +210 -0
  449. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +746 -0
  450. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +574 -0
  451. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +488 -0
  452. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +402 -0
  453. package/pennyfarthing-dist/guides/permission-protocol.md +188 -0
  454. package/pennyfarthing-dist/guides/persona-loading.md +46 -0
  455. package/pennyfarthing-dist/guides/workflow-schema.md +257 -0
  456. package/pennyfarthing-dist/guides/worktree-mode.md +113 -0
  457. package/pennyfarthing-dist/output-styles/teaching.md +33 -0
  458. package/pennyfarthing-dist/output-styles/terse.md +20 -0
  459. package/pennyfarthing-dist/output-styles/verbose.md +28 -0
  460. package/pennyfarthing-dist/personas/themes/1984.yaml +312 -0
  461. package/pennyfarthing-dist/personas/themes/a-team.yaml +337 -0
  462. package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +300 -0
  463. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +330 -0
  464. package/pennyfarthing-dist/personas/themes/all-stars.yaml +332 -0
  465. package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +320 -0
  466. package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +306 -0
  467. package/pennyfarthing-dist/personas/themes/arcane.yaml +288 -0
  468. package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +331 -0
  469. package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +288 -0
  470. package/pennyfarthing-dist/personas/themes/babylon-5.yaml +288 -0
  471. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +288 -0
  472. package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +288 -0
  473. package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +300 -0
  474. package/pennyfarthing-dist/personas/themes/black-sails.yaml +300 -0
  475. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +295 -0
  476. package/pennyfarthing-dist/personas/themes/bobiverse.yaml +288 -0
  477. package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +327 -0
  478. package/pennyfarthing-dist/personas/themes/catch-22.yaml +316 -0
  479. package/pennyfarthing-dist/personas/themes/classical-composers.yaml +310 -0
  480. package/pennyfarthing-dist/personas/themes/control.yaml +197 -0
  481. package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +320 -0
  482. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +323 -0
  483. package/pennyfarthing-dist/personas/themes/deadwood.yaml +300 -0
  484. package/pennyfarthing-dist/personas/themes/dickens.yaml +320 -0
  485. package/pennyfarthing-dist/personas/themes/discworld.yaml +332 -0
  486. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +290 -0
  487. package/pennyfarthing-dist/personas/themes/don-quixote.yaml +320 -0
  488. package/pennyfarthing-dist/personas/themes/dune.yaml +307 -0
  489. package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +320 -0
  490. package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +288 -0
  491. package/pennyfarthing-dist/personas/themes/fargo.yaml +330 -0
  492. package/pennyfarthing-dist/personas/themes/film-auteurs.yaml +312 -0
  493. package/pennyfarthing-dist/personas/themes/firefly.yaml +328 -0
  494. package/pennyfarthing-dist/personas/themes/foundation.yaml +290 -0
  495. package/pennyfarthing-dist/personas/themes/futurama.yaml +321 -0
  496. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +290 -0
  497. package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +373 -0
  498. package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +308 -0
  499. package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +308 -0
  500. package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +330 -0
  501. package/pennyfarthing-dist/personas/themes/hannibal.yaml +300 -0
  502. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +324 -0
  503. package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +291 -0
  504. package/pennyfarthing-dist/personas/themes/historical-figures.yaml +288 -0
  505. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +331 -0
  506. package/pennyfarthing-dist/personas/themes/house-md.yaml +321 -0
  507. package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +289 -0
  508. package/pennyfarthing-dist/personas/themes/inspector-morse.yaml +300 -0
  509. package/pennyfarthing-dist/personas/themes/jane-austen.yaml +287 -0
  510. package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +320 -0
  511. package/pennyfarthing-dist/personas/themes/justified.yaml +300 -0
  512. package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +349 -0
  513. package/pennyfarthing-dist/personas/themes/les-miserables.yaml +299 -0
  514. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +334 -0
  515. package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +334 -0
  516. package/pennyfarthing-dist/personas/themes/mad-max.yaml +355 -0
  517. package/pennyfarthing-dist/personas/themes/mad-men.yaml +289 -0
  518. package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +300 -0
  519. package/pennyfarthing-dist/personas/themes/mash.yaml +337 -0
  520. package/pennyfarthing-dist/personas/themes/mass-effect.yaml +289 -0
  521. package/pennyfarthing-dist/personas/themes/military-commanders.yaml +306 -0
  522. package/pennyfarthing-dist/personas/themes/moby-dick.yaml +320 -0
  523. package/pennyfarthing-dist/personas/themes/monty-python.yaml +303 -0
  524. package/pennyfarthing-dist/personas/themes/neuromancer.yaml +300 -0
  525. package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +329 -0
  526. package/pennyfarthing-dist/personas/themes/parks-and-rec.yaml +372 -0
  527. package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +298 -0
  528. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +350 -0
  529. package/pennyfarthing-dist/personas/themes/renaissance-masters.yaml +320 -0
  530. package/pennyfarthing-dist/personas/themes/rome.yaml +300 -0
  531. package/pennyfarthing-dist/personas/themes/russian-masters.yaml +318 -0
  532. package/pennyfarthing-dist/personas/themes/sandman.yaml +288 -0
  533. package/pennyfarthing-dist/personas/themes/scientific-revolutionaries.yaml +320 -0
  534. package/pennyfarthing-dist/personas/themes/shakespeare.yaml +301 -0
  535. package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +289 -0
  536. package/pennyfarthing-dist/personas/themes/snow-crash.yaml +288 -0
  537. package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +300 -0
  538. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +366 -0
  539. package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +334 -0
  540. package/pennyfarthing-dist/personas/themes/star-wars.yaml +303 -0
  541. package/pennyfarthing-dist/personas/themes/succession.yaml +300 -0
  542. package/pennyfarthing-dist/personas/themes/superfriends.yaml +338 -0
  543. package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +366 -0
  544. package/pennyfarthing-dist/personas/themes/the-americans.yaml +300 -0
  545. package/pennyfarthing-dist/personas/themes/the-crown.yaml +300 -0
  546. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +343 -0
  547. package/pennyfarthing-dist/personas/themes/the-good-place.yaml +322 -0
  548. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +353 -0
  549. package/pennyfarthing-dist/personas/themes/the-odyssey.yaml +300 -0
  550. package/pennyfarthing-dist/personas/themes/the-office.yaml +330 -0
  551. package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +308 -0
  552. package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +300 -0
  553. package/pennyfarthing-dist/personas/themes/the-wire.yaml +311 -0
  554. package/pennyfarthing-dist/personas/themes/the-witcher.yaml +300 -0
  555. package/pennyfarthing-dist/personas/themes/twin-peaks.yaml +302 -0
  556. package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +300 -0
  557. package/pennyfarthing-dist/personas/themes/watchmen.yaml +291 -0
  558. package/pennyfarthing-dist/personas/themes/west-wing.yaml +291 -0
  559. package/pennyfarthing-dist/personas/themes/world-explorers.yaml +320 -0
  560. package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +307 -0
  561. package/pennyfarthing-dist/personas/themes/x-files.yaml +302 -0
  562. package/pennyfarthing-dist/scripts/README.md +68 -0
  563. package/pennyfarthing-dist/scripts/core/README.md +26 -0
  564. package/pennyfarthing-dist/scripts/core/agent-session.sh +378 -0
  565. package/pennyfarthing-dist/scripts/core/check-context.sh +272 -0
  566. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +90 -0
  567. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +95 -0
  568. package/pennyfarthing-dist/scripts/core/prime.sh +136 -0
  569. package/pennyfarthing-dist/scripts/core/run.sh +75 -0
  570. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +21 -0
  571. package/pennyfarthing-dist/scripts/git/README.md +25 -0
  572. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +226 -0
  573. package/pennyfarthing-dist/scripts/git/git-status-all.sh +127 -0
  574. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +91 -0
  575. package/pennyfarthing-dist/scripts/git/release.sh +199 -0
  576. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +494 -0
  577. package/pennyfarthing-dist/scripts/health/drift-detection.sh +162 -0
  578. package/pennyfarthing-dist/scripts/hooks/README.md +32 -0
  579. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +87 -0
  580. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +60 -0
  581. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +65 -0
  582. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +35 -0
  583. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +166 -0
  584. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +50 -0
  585. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +71 -0
  586. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +54 -0
  587. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.mjs +380 -0
  588. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +20 -0
  589. package/pennyfarthing-dist/scripts/hooks/session-start.sh +97 -0
  590. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +58 -0
  591. package/pennyfarthing-dist/scripts/hooks/tests/question-reflector.test.mjs +545 -0
  592. package/pennyfarthing-dist/scripts/jira/README.md +33 -0
  593. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +101 -0
  594. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +97 -0
  595. package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.mjs +327 -0
  596. package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.test.mjs +503 -0
  597. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +164 -0
  598. package/pennyfarthing-dist/scripts/jira/jira-lib.mjs +443 -0
  599. package/pennyfarthing-dist/scripts/jira/jira-lib.sh +464 -0
  600. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +266 -0
  601. package/pennyfarthing-dist/scripts/jira/jira-sync-story.mjs +208 -0
  602. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +8 -0
  603. package/pennyfarthing-dist/scripts/jira/jira-sync.mjs +198 -0
  604. package/pennyfarthing-dist/scripts/jira/jira-sync.sh +8 -0
  605. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +104 -0
  606. package/pennyfarthing-dist/scripts/jira/sync-epic-to-jira.sh +16 -0
  607. package/pennyfarthing-dist/scripts/lib/README.md +29 -0
  608. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +177 -0
  609. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +136 -0
  610. package/pennyfarthing-dist/scripts/lib/common.sh +157 -0
  611. package/pennyfarthing-dist/scripts/lib/file-lock.sh +269 -0
  612. package/pennyfarthing-dist/scripts/lib/find-root.sh +35 -0
  613. package/pennyfarthing-dist/scripts/lib/logging.sh +186 -0
  614. package/pennyfarthing-dist/scripts/lib/retry.sh +76 -0
  615. package/pennyfarthing-dist/scripts/misc/README.md +44 -0
  616. package/pennyfarthing-dist/scripts/misc/add-short-names.mjs +264 -0
  617. package/pennyfarthing-dist/scripts/misc/backlog.sh +91 -0
  618. package/pennyfarthing-dist/scripts/misc/check-status.sh +247 -0
  619. package/pennyfarthing-dist/scripts/misc/deploy.sh +296 -0
  620. package/pennyfarthing-dist/scripts/misc/doctor-dogfood.sh +392 -0
  621. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +231 -0
  622. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +110 -0
  623. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +74 -0
  624. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.mjs +474 -0
  625. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +9 -0
  626. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +141 -0
  627. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +778 -0
  628. package/pennyfarthing-dist/scripts/misc/run-ci.sh +219 -0
  629. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +7 -0
  630. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +319 -0
  631. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +193 -0
  632. package/pennyfarthing-dist/scripts/misc/statusline.sh +252 -0
  633. package/pennyfarthing-dist/scripts/misc/uninstall.sh +270 -0
  634. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +160 -0
  635. package/pennyfarthing-dist/scripts/sprint/README.md +29 -0
  636. package/pennyfarthing-dist/scripts/sprint/archive-story.sh +135 -0
  637. package/pennyfarthing-dist/scripts/sprint/available-stories.sh +97 -0
  638. package/pennyfarthing-dist/scripts/sprint/check-story.sh +164 -0
  639. package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +58 -0
  640. package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +69 -0
  641. package/pennyfarthing-dist/scripts/sprint/import-epic-to-future.mjs +377 -0
  642. package/pennyfarthing-dist/scripts/sprint/import-epic-to-future.sh +9 -0
  643. package/pennyfarthing-dist/scripts/sprint/list-future.sh +151 -0
  644. package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +116 -0
  645. package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +164 -0
  646. package/pennyfarthing-dist/scripts/sprint/sprint-common.sh +421 -0
  647. package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +39 -0
  648. package/pennyfarthing-dist/scripts/sprint/sprint-metrics.sh +241 -0
  649. package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +134 -0
  650. package/pennyfarthing-dist/scripts/story/README.md +23 -0
  651. package/pennyfarthing-dist/scripts/story/create-story.sh +159 -0
  652. package/pennyfarthing-dist/scripts/story/size-story.sh +198 -0
  653. package/pennyfarthing-dist/scripts/story/story-template.sh +162 -0
  654. package/pennyfarthing-dist/scripts/test/README.md +23 -0
  655. package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +289 -0
  656. package/pennyfarthing-dist/scripts/test/swebench-judge.py +400 -0
  657. package/pennyfarthing-dist/scripts/test/test-cache.sh +165 -0
  658. package/pennyfarthing-dist/scripts/test/test-setup.sh +337 -0
  659. package/pennyfarthing-dist/scripts/tests/check.test.sh +582 -0
  660. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +515 -0
  661. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +599 -0
  662. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +332 -0
  663. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +573 -0
  664. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +859 -0
  665. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +662 -0
  666. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +589 -0
  667. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +105 -0
  668. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +597 -0
  669. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +514 -0
  670. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +517 -0
  671. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +331 -0
  672. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +647 -0
  673. package/pennyfarthing-dist/scripts/theme/README.md +22 -0
  674. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.js +492 -0
  675. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +11 -0
  676. package/pennyfarthing-dist/scripts/theme/list-themes.sh +73 -0
  677. package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +97 -0
  678. package/pennyfarthing-dist/scripts/workflow/README.md +28 -0
  679. package/pennyfarthing-dist/scripts/workflow/check.sh +497 -0
  680. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +159 -0
  681. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +228 -0
  682. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +124 -0
  683. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +40 -0
  684. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +163 -0
  685. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +138 -0
  686. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +256 -0
  687. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +167 -0
  688. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +242 -0
  689. package/pennyfarthing-dist/skills/changelog/SKILL.md +367 -0
  690. package/pennyfarthing-dist/skills/code-review/SKILL.md +168 -0
  691. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +274 -0
  692. package/pennyfarthing-dist/skills/cyclist/SKILL.md +88 -0
  693. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +437 -0
  694. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +258 -0
  695. package/pennyfarthing-dist/skills/jira/SKILL.md +484 -0
  696. package/pennyfarthing-dist/skills/judge/SKILL.md +579 -0
  697. package/pennyfarthing-dist/skills/just/SKILL.md +403 -0
  698. package/pennyfarthing-dist/skills/mermaid/SKILL.md +240 -0
  699. package/pennyfarthing-dist/skills/otel/skill.md +223 -0
  700. package/pennyfarthing-dist/skills/permissions/skill.md +172 -0
  701. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +178 -0
  702. package/pennyfarthing-dist/skills/skill-registry.schema.json +107 -0
  703. package/pennyfarthing-dist/skills/skill-registry.yaml +357 -0
  704. package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +101 -0
  705. package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +97 -0
  706. package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +164 -0
  707. package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +101 -0
  708. package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +116 -0
  709. package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +164 -0
  710. package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +39 -0
  711. package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +147 -0
  712. package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +104 -0
  713. package/pennyfarthing-dist/skills/sprint/skill.md +465 -0
  714. package/pennyfarthing-dist/skills/story/scripts/create-story.sh +159 -0
  715. package/pennyfarthing-dist/skills/story/scripts/size-story.sh +198 -0
  716. package/pennyfarthing-dist/skills/story/scripts/story-template.sh +162 -0
  717. package/pennyfarthing-dist/skills/story/skill.md +219 -0
  718. package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +390 -0
  719. package/pennyfarthing-dist/skills/testing/SKILL.md +99 -0
  720. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +124 -0
  721. package/pennyfarthing-dist/skills/theme/skill.md +129 -0
  722. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +174 -0
  723. package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +91 -0
  724. package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +163 -0
  725. package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +138 -0
  726. package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +273 -0
  727. package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +167 -0
  728. package/pennyfarthing-dist/skills/workflow/skill.md +337 -0
  729. package/pennyfarthing-dist/skills/yq/SKILL.md +264 -0
  730. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +187 -0
  731. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +59 -0
  732. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +276 -0
  733. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +61 -0
  734. package/pennyfarthing-dist/templates/persona-config.yaml.template +22 -0
  735. package/pennyfarthing-dist/templates/preferences.yaml.template +15 -0
  736. package/pennyfarthing-dist/templates/settings.local.json.template +90 -0
  737. package/pennyfarthing-dist/templates/setup-env.sh.template +18 -0
  738. package/pennyfarthing-dist/templates/shared-context.md.template +70 -0
  739. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +40 -0
  740. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +37 -0
  741. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +34 -0
  742. package/pennyfarthing-dist/workflows/agent-docs.yaml +70 -0
  743. package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +101 -0
  744. package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +93 -0
  745. package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +115 -0
  746. package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +133 -0
  747. package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +138 -0
  748. package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +133 -0
  749. package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +142 -0
  750. package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +160 -0
  751. package/pennyfarthing-dist/workflows/architecture/templates/architecture-decision.md +102 -0
  752. package/pennyfarthing-dist/workflows/architecture.yaml +65 -0
  753. package/pennyfarthing-dist/workflows/bdd.yaml +60 -0
  754. package/pennyfarthing-dist/workflows/brainstorming/brain-methods.csv +62 -0
  755. package/pennyfarthing-dist/workflows/brainstorming/checklist.md +44 -0
  756. package/pennyfarthing-dist/workflows/brainstorming/instructions.md +736 -0
  757. package/pennyfarthing-dist/workflows/brainstorming/workflow.yaml +49 -0
  758. package/pennyfarthing-dist/workflows/code-review/checklist.md +23 -0
  759. package/pennyfarthing-dist/workflows/code-review/instructions.md +234 -0
  760. package/pennyfarthing-dist/workflows/code-review/workflow.yaml +51 -0
  761. package/pennyfarthing-dist/workflows/dev-story/checklist.md +80 -0
  762. package/pennyfarthing-dist/workflows/dev-story/instructions.xml +410 -0
  763. package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +50 -0
  764. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +256 -0
  765. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +233 -0
  766. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +272 -0
  767. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +153 -0
  768. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +122 -0
  769. package/pennyfarthing-dist/workflows/epics-and-stories/templates/epics-template.md +57 -0
  770. package/pennyfarthing-dist/workflows/epics-and-stories/workflow.yaml +28 -0
  771. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +190 -0
  772. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +178 -0
  773. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
  774. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +139 -0
  775. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
  776. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +133 -0
  777. package/pennyfarthing-dist/workflows/implementation-readiness/templates/readiness-report-template.md +4 -0
  778. package/pennyfarthing-dist/workflows/implementation-readiness/workflow.yaml +40 -0
  779. package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +13 -0
  780. package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +197 -0
  781. package/pennyfarthing-dist/workflows/prd/data/project-types.csv +11 -0
  782. package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +191 -0
  783. package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +153 -0
  784. package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +224 -0
  785. package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +226 -0
  786. package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +213 -0
  787. package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +207 -0
  788. package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +226 -0
  789. package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +237 -0
  790. package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +228 -0
  791. package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +231 -0
  792. package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +242 -0
  793. package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +217 -0
  794. package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +180 -0
  795. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +247 -0
  796. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
  797. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +249 -0
  798. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +253 -0
  799. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +168 -0
  800. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +218 -0
  801. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +191 -0
  802. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +209 -0
  803. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +174 -0
  804. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  805. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +228 -0
  806. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +217 -0
  807. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  808. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  809. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +263 -0
  810. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +209 -0
  811. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  812. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +242 -0
  813. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +232 -0
  814. package/pennyfarthing-dist/workflows/prd/templates/prd-template.md +10 -0
  815. package/pennyfarthing-dist/workflows/prd/workflow.yaml +42 -0
  816. package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +177 -0
  817. package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +161 -0
  818. package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +199 -0
  819. package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +202 -0
  820. package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +205 -0
  821. package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +219 -0
  822. package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +194 -0
  823. package/pennyfarthing-dist/workflows/product-brief/templates/product-brief.template.md +10 -0
  824. package/pennyfarthing-dist/workflows/product-brief/workflow.yaml +31 -0
  825. package/pennyfarthing-dist/workflows/project-context/project-context-template.md +21 -0
  826. package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +184 -0
  827. package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +318 -0
  828. package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +278 -0
  829. package/pennyfarthing-dist/workflows/project-context/workflow.yaml +27 -0
  830. package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +156 -0
  831. package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +120 -0
  832. package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +113 -0
  833. package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +113 -0
  834. package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +106 -0
  835. package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +140 -0
  836. package/pennyfarthing-dist/workflows/quick-dev/workflow.yaml +27 -0
  837. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +189 -0
  838. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +144 -0
  839. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +128 -0
  840. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +191 -0
  841. package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +74 -0
  842. package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +27 -0
  843. package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +137 -0
  844. package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +229 -0
  845. package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +238 -0
  846. package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +206 -0
  847. package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +234 -0
  848. package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +443 -0
  849. package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +182 -0
  850. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +237 -0
  851. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +200 -0
  852. package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +249 -0
  853. package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +259 -0
  854. package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +177 -0
  855. package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +475 -0
  856. package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +137 -0
  857. package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +239 -0
  858. package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +248 -0
  859. package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +202 -0
  860. package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +239 -0
  861. package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +486 -0
  862. package/pennyfarthing-dist/workflows/research/templates/research.template.md +29 -0
  863. package/pennyfarthing-dist/workflows/research/workflow.yaml +45 -0
  864. package/pennyfarthing-dist/workflows/retrospective/checklist.md +31 -0
  865. package/pennyfarthing-dist/workflows/retrospective/instructions.md +1443 -0
  866. package/pennyfarthing-dist/workflows/retrospective/workflow.yaml +50 -0
  867. package/pennyfarthing-dist/workflows/sprint-planning/checklist.md +33 -0
  868. package/pennyfarthing-dist/workflows/sprint-planning/sprint-status-template.yaml +55 -0
  869. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +54 -0
  870. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +44 -0
  871. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +64 -0
  872. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +73 -0
  873. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +56 -0
  874. package/pennyfarthing-dist/workflows/sprint-planning/workflow.yaml +34 -0
  875. package/pennyfarthing-dist/workflows/tdd.yaml +50 -0
  876. package/pennyfarthing-dist/workflows/trivial.yaml +40 -0
  877. package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +135 -0
  878. package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +127 -0
  879. package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +190 -0
  880. package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +216 -0
  881. package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +219 -0
  882. package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +234 -0
  883. package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +252 -0
  884. package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +254 -0
  885. package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +224 -0
  886. package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +224 -0
  887. package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +241 -0
  888. package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +248 -0
  889. package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +237 -0
  890. package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +264 -0
  891. package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +228 -0
  892. package/pennyfarthing-dist/workflows/ux-design/ux-design-template.md +13 -0
  893. package/pennyfarthing-dist/workflows/ux-design/workflow.yaml +41 -0
  894. package/dist/cli/utils/files.js +0 -179
  895. package/dist/cli/utils/manifest.js +0 -93
  896. package/dist/cli/utils/version.js +0 -70
  897. package/dist/index.js +0 -48
  898. package/dist/permissions/index.js +0 -16
  899. package/dist/scripts/job-fair-aggregator.js +0 -690
  900. package/dist/workflow/index.js +0 -31
  901. /package/{bin → packages/core/bin}/pennyfarthing.js +0 -0
@@ -0,0 +1,680 @@
1
+ /**
2
+ * Tests for Story 11-8: Integrate with Benchmark Output
3
+ *
4
+ * These tests verify:
5
+ * AC1: Benchmark output includes character face visualization
6
+ * AC2: Correlation report shows OCEAN dimensions vs task performance
7
+ * AC3: Identifies optimal personality profiles for each role type
8
+ * AC4: Supports "find characters good at X" queries
9
+ *
10
+ * Run with: npm test
11
+ */
12
+ import { describe, it } from 'node:test';
13
+ import assert from 'node:assert';
14
+ // ============================================================================
15
+ // AC1: Module Exists and Exports Core Functions
16
+ // ============================================================================
17
+ describe('AC1: Benchmark Integration Module Exists', () => {
18
+ it('should export loadBenchmarkData function', async () => {
19
+ const module = await import('./benchmark-integration.js');
20
+ assert.ok(typeof module.loadBenchmarkData === 'function', 'loadBenchmarkData should be a function');
21
+ });
22
+ it('should export getBenchmarkWithFace function', async () => {
23
+ const module = await import('./benchmark-integration.js');
24
+ assert.ok(typeof module.getBenchmarkWithFace === 'function', 'getBenchmarkWithFace should be a function');
25
+ });
26
+ it('should export generateBenchmarkReport function', async () => {
27
+ const module = await import('./benchmark-integration.js');
28
+ assert.ok(typeof module.generateBenchmarkReport === 'function', 'generateBenchmarkReport should be a function');
29
+ });
30
+ });
31
+ describe('AC1: Benchmark Output Includes Face Visualization', () => {
32
+ it('should include face SVG path in benchmark result', async () => {
33
+ const { getBenchmarkWithFace } = await import('./benchmark-integration.js');
34
+ const result = getBenchmarkWithFace('discworld', 'dev', 'race-condition-cache');
35
+ assert.ok(result !== null, 'Result should not be null');
36
+ assert.ok(result.face, 'Result should include face property');
37
+ assert.ok(result.face.includes('.svg') || result.face.includes('data:image/svg'), 'Face should be SVG path or data URL');
38
+ });
39
+ it('should include character name from theme', async () => {
40
+ const { getBenchmarkWithFace } = await import('./benchmark-integration.js');
41
+ const result = getBenchmarkWithFace('discworld', 'dev', 'race-condition-cache');
42
+ assert.ok(result !== null, 'Result should not be null');
43
+ assert.ok(result.character, 'Result should include character name');
44
+ assert.ok(result.character.length > 0, 'Character name should not be empty');
45
+ });
46
+ it('should include benchmark statistics', async () => {
47
+ const { getBenchmarkWithFace } = await import('./benchmark-integration.js');
48
+ const result = getBenchmarkWithFace('discworld', 'dev', 'race-condition-cache');
49
+ assert.ok(result !== null, 'Result should not be null');
50
+ assert.ok(typeof result.mean === 'number', 'Result should include mean score');
51
+ assert.ok(typeof result.delta === 'number', 'Result should include delta vs baseline');
52
+ });
53
+ it('should include OCEAN scores alongside benchmark data', async () => {
54
+ const { getBenchmarkWithFace } = await import('./benchmark-integration.js');
55
+ const result = getBenchmarkWithFace('discworld', 'dev', 'race-condition-cache');
56
+ assert.ok(result !== null, 'Result should not be null');
57
+ assert.ok(result.ocean, 'Result should include OCEAN scores');
58
+ assert.ok(typeof result.ocean.O === 'number', 'O should be a number');
59
+ assert.ok(typeof result.ocean.C === 'number', 'C should be a number');
60
+ assert.ok(typeof result.ocean.E === 'number', 'E should be a number');
61
+ assert.ok(typeof result.ocean.A === 'number', 'A should be a number');
62
+ assert.ok(typeof result.ocean.N === 'number', 'N should be a number');
63
+ });
64
+ });
65
+ // ============================================================================
66
+ // AC2: Correlation Report Shows OCEAN vs Task Performance
67
+ // ============================================================================
68
+ describe('AC2: Correlation Analysis Module', () => {
69
+ it('should export calculateOceanCorrelation function', async () => {
70
+ const module = await import('./benchmark-integration.js');
71
+ assert.ok(typeof module.calculateOceanCorrelation === 'function', 'calculateOceanCorrelation should be a function');
72
+ });
73
+ it('should export generateCorrelationReport function', async () => {
74
+ const module = await import('./benchmark-integration.js');
75
+ assert.ok(typeof module.generateCorrelationReport === 'function', 'generateCorrelationReport should be a function');
76
+ });
77
+ });
78
+ describe('AC2: OCEAN vs Performance Correlation', () => {
79
+ it('should calculate correlation for each OCEAN dimension', async () => {
80
+ const { calculateOceanCorrelation } = await import('./benchmark-integration.js');
81
+ const correlation = calculateOceanCorrelation('race-condition-cache', 'dev');
82
+ assert.ok(correlation, 'Should return correlation object');
83
+ assert.ok('O' in correlation, 'Should include Openness correlation');
84
+ assert.ok('C' in correlation, 'Should include Conscientiousness correlation');
85
+ assert.ok('E' in correlation, 'Should include Extraversion correlation');
86
+ assert.ok('A' in correlation, 'Should include Agreeableness correlation');
87
+ assert.ok('N' in correlation, 'Should include Neuroticism correlation');
88
+ });
89
+ it('should return correlation strength for each dimension', async () => {
90
+ const { calculateOceanCorrelation } = await import('./benchmark-integration.js');
91
+ const correlation = calculateOceanCorrelation('race-condition-cache', 'dev');
92
+ // Each dimension should have a correlation coefficient or effect size
93
+ assert.ok(typeof correlation.O.effect === 'number', 'O should have numeric effect size');
94
+ assert.ok(typeof correlation.C.effect === 'number', 'C should have numeric effect size');
95
+ assert.ok(typeof correlation.E.effect === 'number', 'E should have numeric effect size');
96
+ assert.ok(typeof correlation.A.effect === 'number', 'A should have numeric effect size');
97
+ assert.ok(typeof correlation.N.effect === 'number', 'N should have numeric effect size');
98
+ });
99
+ it('should identify strongest correlating dimension', async () => {
100
+ const { calculateOceanCorrelation } = await import('./benchmark-integration.js');
101
+ const correlation = calculateOceanCorrelation('race-condition-cache', 'dev');
102
+ assert.ok(correlation.strongest, 'Should identify strongest correlating dimension');
103
+ assert.ok(['O', 'C', 'E', 'A', 'N'].includes(correlation.strongest.dimension), 'Strongest should be a valid OCEAN dimension');
104
+ });
105
+ it('should generate markdown correlation report', async () => {
106
+ const { generateCorrelationReport } = await import('./benchmark-integration.js');
107
+ const report = generateCorrelationReport('race-condition-cache', 'dev');
108
+ assert.ok(typeof report === 'string', 'Report should be a string');
109
+ assert.ok(report.includes('Correlation'), 'Report should mention correlation');
110
+ assert.ok(report.includes('|'), 'Report should include markdown table');
111
+ });
112
+ it('should include performance delta in correlation context', async () => {
113
+ const { generateCorrelationReport } = await import('./benchmark-integration.js');
114
+ const report = generateCorrelationReport('race-condition-cache', 'dev');
115
+ // Report should show how OCEAN relates to performance delta
116
+ assert.ok(report.includes('delta') || report.includes('Delta') || report.includes('+') || report.includes('-'), 'Report should include performance delta information');
117
+ });
118
+ });
119
+ // ============================================================================
120
+ // AC3: Identifies Optimal Personality Profiles for Each Role
121
+ // ============================================================================
122
+ describe('AC3: Optimal Profile Identification Module', () => {
123
+ it('should export getOptimalProfile function', async () => {
124
+ const module = await import('./benchmark-integration.js');
125
+ assert.ok(typeof module.getOptimalProfile === 'function', 'getOptimalProfile should be a function');
126
+ });
127
+ it('should export getRoleRecommendations function', async () => {
128
+ const module = await import('./benchmark-integration.js');
129
+ assert.ok(typeof module.getRoleRecommendations === 'function', 'getRoleRecommendations should be a function');
130
+ });
131
+ });
132
+ describe('AC3: Optimal Profile for Role', () => {
133
+ it('should return optimal OCEAN profile for dev role', async () => {
134
+ const { getOptimalProfile } = await import('./benchmark-integration.js');
135
+ const profile = getOptimalProfile('dev');
136
+ assert.ok(profile, 'Should return a profile');
137
+ assert.ok(profile.ocean, 'Profile should include OCEAN scores');
138
+ assert.ok(profile.reasoning, 'Profile should include reasoning');
139
+ });
140
+ it('should identify top performing themes for a role', async () => {
141
+ const { getRoleRecommendations } = await import('./benchmark-integration.js');
142
+ const recommendations = getRoleRecommendations('dev');
143
+ assert.ok(Array.isArray(recommendations.topThemes), 'Should return array of top themes');
144
+ assert.ok(recommendations.topThemes.length > 0, 'Should have at least one recommendation');
145
+ const firstRec = recommendations.topThemes[0];
146
+ assert.ok(firstRec.theme, 'Recommendation should include theme name');
147
+ assert.ok(typeof firstRec.score === 'number', 'Recommendation should include score');
148
+ });
149
+ it('should identify themes to avoid for a role', async () => {
150
+ const { getRoleRecommendations } = await import('./benchmark-integration.js');
151
+ const recommendations = getRoleRecommendations('dev');
152
+ assert.ok(Array.isArray(recommendations.avoidThemes), 'Should identify themes to avoid');
153
+ });
154
+ it('should explain why certain profiles excel', async () => {
155
+ const { getRoleRecommendations } = await import('./benchmark-integration.js');
156
+ const recommendations = getRoleRecommendations('dev');
157
+ assert.ok(recommendations.insight, 'Should provide insight about why profiles excel');
158
+ assert.ok(recommendations.insight.length > 20, 'Insight should be substantive');
159
+ });
160
+ it('should work for reviewer role', async () => {
161
+ const { getOptimalProfile } = await import('./benchmark-integration.js');
162
+ const profile = getOptimalProfile('reviewer');
163
+ assert.ok(profile, 'Should return profile for reviewer');
164
+ });
165
+ it('should work for tea role', async () => {
166
+ const { getOptimalProfile } = await import('./benchmark-integration.js');
167
+ const profile = getOptimalProfile('tea');
168
+ assert.ok(profile, 'Should return profile for tea');
169
+ });
170
+ });
171
+ // ============================================================================
172
+ // AC4: Supports "Find Characters Good at X" Queries
173
+ // ============================================================================
174
+ describe('AC4: Query Module Exports', () => {
175
+ it('should export findTopPerformers function', async () => {
176
+ const module = await import('./benchmark-integration.js');
177
+ assert.ok(typeof module.findTopPerformers === 'function', 'findTopPerformers should be a function');
178
+ });
179
+ it('should export queryBenchmarks function', async () => {
180
+ const module = await import('./benchmark-integration.js');
181
+ assert.ok(typeof module.queryBenchmarks === 'function', 'queryBenchmarks should be a function');
182
+ });
183
+ });
184
+ describe('AC4: Find Characters Good at X Queries', () => {
185
+ it('should find top performers for a specific scenario', async () => {
186
+ const { findTopPerformers } = await import('./benchmark-integration.js');
187
+ const results = findTopPerformers({
188
+ scenario: 'race-condition-cache',
189
+ role: 'dev',
190
+ limit: 3,
191
+ });
192
+ assert.ok(Array.isArray(results), 'Should return array');
193
+ assert.ok(results.length <= 3, 'Should respect limit');
194
+ assert.ok(results.length > 0, 'Should find at least one performer');
195
+ const first = results[0];
196
+ assert.ok(first.theme, 'Result should include theme');
197
+ assert.ok(first.character, 'Result should include character');
198
+ assert.ok(typeof first.score === 'number', 'Result should include score');
199
+ });
200
+ it('should sort results by score descending', async () => {
201
+ const { findTopPerformers } = await import('./benchmark-integration.js');
202
+ const results = findTopPerformers({
203
+ scenario: 'race-condition-cache',
204
+ role: 'dev',
205
+ limit: 5,
206
+ });
207
+ for (let i = 1; i < results.length; i++) {
208
+ assert.ok(results[i - 1].score >= results[i].score, 'Results should be sorted by score descending');
209
+ }
210
+ });
211
+ it('should support filtering by minimum score', async () => {
212
+ const { findTopPerformers } = await import('./benchmark-integration.js');
213
+ const results = findTopPerformers({
214
+ scenario: 'race-condition-cache',
215
+ role: 'dev',
216
+ minScore: 80,
217
+ });
218
+ for (const result of results) {
219
+ assert.ok(result.score >= 80, `Score ${result.score} should be >= 80`);
220
+ }
221
+ });
222
+ it('should support filtering by OCEAN criteria', async () => {
223
+ const { findTopPerformers } = await import('./benchmark-integration.js');
224
+ const results = findTopPerformers({
225
+ scenario: 'race-condition-cache',
226
+ role: 'dev',
227
+ ocean: 'E<=3', // Low extraversion (per research findings)
228
+ });
229
+ for (const result of results) {
230
+ assert.ok(result.ocean.E <= 3, `Extraversion ${result.ocean.E} should be <= 3`);
231
+ }
232
+ });
233
+ it('should include face in query results', async () => {
234
+ const { findTopPerformers } = await import('./benchmark-integration.js');
235
+ const results = findTopPerformers({
236
+ scenario: 'race-condition-cache',
237
+ role: 'dev',
238
+ limit: 1,
239
+ });
240
+ assert.ok(results[0].face, 'Result should include face');
241
+ });
242
+ it('should support general query syntax', async () => {
243
+ const { queryBenchmarks } = await import('./benchmark-integration.js');
244
+ // Query: "find top 3 dev personas for debugging with low extraversion"
245
+ const results = queryBenchmarks({
246
+ role: 'dev',
247
+ scenario: 'race-condition-cache',
248
+ filter: 'E<=3',
249
+ limit: 3,
250
+ sortBy: 'score',
251
+ });
252
+ assert.ok(Array.isArray(results), 'Should return array');
253
+ });
254
+ });
255
+ // ============================================================================
256
+ // Edge Cases and Error Handling
257
+ // ============================================================================
258
+ describe('Edge Cases: Missing Data Handling', () => {
259
+ it('should handle missing benchmark data gracefully', async () => {
260
+ const { getBenchmarkWithFace } = await import('./benchmark-integration.js');
261
+ // Theme exists but has no benchmark data
262
+ const result = getBenchmarkWithFace('minimalist', 'pm', 'nonexistent-scenario');
263
+ assert.ok(result === null || result.benchmarkMissing === true, 'Should return null or indicate missing benchmark');
264
+ });
265
+ it('should handle theme without OCEAN scores', async () => {
266
+ const { findTopPerformers } = await import('./benchmark-integration.js');
267
+ // Should not throw, should skip themes without OCEAN
268
+ const results = findTopPerformers({
269
+ scenario: 'race-condition-cache',
270
+ role: 'dev',
271
+ });
272
+ assert.ok(Array.isArray(results), 'Should return array even with missing data');
273
+ });
274
+ it('should return empty array for scenarios with no benchmark data', async () => {
275
+ const { findTopPerformers } = await import('./benchmark-integration.js');
276
+ const results = findTopPerformers({
277
+ scenario: 'completely-fake-scenario',
278
+ role: 'dev',
279
+ });
280
+ assert.ok(Array.isArray(results), 'Should return empty array');
281
+ assert.strictEqual(results.length, 0, 'Should have no results');
282
+ });
283
+ });
284
+ describe('Edge Cases: Invalid Inputs', () => {
285
+ it('should throw for invalid role', async () => {
286
+ const { getOptimalProfile } = await import('./benchmark-integration.js');
287
+ assert.throws(() => getOptimalProfile('invalid-role'), /invalid.*role/i, 'Should throw for invalid role');
288
+ });
289
+ it('should throw for invalid OCEAN filter syntax', async () => {
290
+ const { findTopPerformers } = await import('./benchmark-integration.js');
291
+ assert.throws(() => findTopPerformers({
292
+ scenario: 'race-condition-cache',
293
+ role: 'dev',
294
+ ocean: 'X>=5', // Invalid dimension
295
+ }), /invalid.*dimension/i, 'Should throw for invalid OCEAN dimension');
296
+ });
297
+ });
298
+ // ============================================================================
299
+ // Integration: Full Pipeline Tests
300
+ // ============================================================================
301
+ describe('Integration: Benchmark Report Generation', () => {
302
+ it('should generate complete benchmark report with faces and correlations', async () => {
303
+ const { generateBenchmarkReport } = await import('./benchmark-integration.js');
304
+ const report = generateBenchmarkReport({
305
+ scenario: 'race-condition-cache',
306
+ role: 'dev',
307
+ });
308
+ assert.ok(report.markdown, 'Should include markdown output');
309
+ assert.ok(report.data, 'Should include structured data');
310
+ // Should have face references
311
+ assert.ok(report.markdown.includes('.svg') || report.markdown.includes('data:image'), 'Markdown should include face visualizations');
312
+ // Should have correlation info
313
+ assert.ok(report.markdown.includes('O') && report.markdown.includes('C') &&
314
+ report.markdown.includes('E') && report.markdown.includes('A') &&
315
+ report.markdown.includes('N'), 'Markdown should include all OCEAN dimensions');
316
+ });
317
+ it('should include top performers in report', async () => {
318
+ const { generateBenchmarkReport } = await import('./benchmark-integration.js');
319
+ const report = generateBenchmarkReport({
320
+ scenario: 'race-condition-cache',
321
+ role: 'dev',
322
+ });
323
+ assert.ok(report.markdown.includes('Top') || report.markdown.includes('Best') ||
324
+ report.markdown.includes('Recommended'), 'Report should highlight top performers');
325
+ });
326
+ it('should include themes to avoid in report', async () => {
327
+ const { generateBenchmarkReport } = await import('./benchmark-integration.js');
328
+ const report = generateBenchmarkReport({
329
+ scenario: 'race-condition-cache',
330
+ role: 'dev',
331
+ });
332
+ assert.ok(report.markdown.includes('Avoid') || report.markdown.includes('underperform') ||
333
+ report.markdown.includes('below'), 'Report should indicate themes to avoid');
334
+ });
335
+ });
336
+ // ============================================================================
337
+ // Story 14-5: OCEAN × Error-Type Correlation Heat Map
338
+ // ============================================================================
339
+ describe('AC1: calculateErrorTypeCorrelation Function', () => {
340
+ it('should export calculateErrorTypeCorrelation function', async () => {
341
+ const module = await import('./benchmark-integration.js');
342
+ assert.ok(typeof module.calculateErrorTypeCorrelation === 'function', 'calculateErrorTypeCorrelation should be a function');
343
+ });
344
+ it('should return OceanErrorCorrelation object with 5×3 matrix', async () => {
345
+ const { calculateErrorTypeCorrelation } = await import('./benchmark-integration.js');
346
+ // Mock benchmark results with OCEAN scores
347
+ const results = [
348
+ { ocean: { O: 5, C: 4, E: 2, A: 3, N: 2 }, mean: 85 },
349
+ { ocean: { O: 2, C: 5, E: 4, A: 4, N: 4 }, mean: 72 },
350
+ { ocean: { O: 4, C: 2, E: 3, A: 2, N: 3 }, mean: 78 },
351
+ ];
352
+ // Mock judge scores with detection_by_type
353
+ const judgeScores = [
354
+ { detection_by_type: { reasoning: 0.8, planning: 0.6, execution: 0.7 } },
355
+ { detection_by_type: { reasoning: 0.5, planning: 0.9, execution: 0.8 } },
356
+ { detection_by_type: { reasoning: 0.7, planning: 0.7, execution: 0.6 } },
357
+ ];
358
+ const correlation = calculateErrorTypeCorrelation(results, judgeScores);
359
+ assert.ok(correlation, 'Should return correlation object');
360
+ assert.ok(correlation.matrix, 'Should have matrix property');
361
+ // Check all 5 OCEAN dimensions present
362
+ for (const dim of ['O', 'C', 'E', 'A', 'N']) {
363
+ assert.ok(correlation.matrix[dim], `Matrix should have ${dim} dimension`);
364
+ assert.ok('reasoning' in correlation.matrix[dim], `${dim} should have reasoning`);
365
+ assert.ok('planning' in correlation.matrix[dim], `${dim} should have planning`);
366
+ assert.ok('execution' in correlation.matrix[dim], `${dim} should have execution`);
367
+ }
368
+ });
369
+ it('should calculate correlation values as numbers', async () => {
370
+ const { calculateErrorTypeCorrelation } = await import('./benchmark-integration.js');
371
+ const results = [
372
+ { ocean: { O: 5, C: 4, E: 2, A: 3, N: 2 }, mean: 85 },
373
+ { ocean: { O: 2, C: 5, E: 4, A: 4, N: 4 }, mean: 72 },
374
+ ];
375
+ const judgeScores = [
376
+ { detection_by_type: { reasoning: 0.8, planning: 0.6, execution: 0.7 } },
377
+ { detection_by_type: { reasoning: 0.5, planning: 0.9, execution: 0.8 } },
378
+ ];
379
+ const correlation = calculateErrorTypeCorrelation(results, judgeScores);
380
+ assert.ok(typeof correlation.matrix.O.reasoning.correlation === 'number', 'Correlation value should be a number');
381
+ assert.ok(correlation.matrix.O.reasoning.correlation >= -1 &&
382
+ correlation.matrix.O.reasoning.correlation <= 1, 'Correlation should be between -1 and 1');
383
+ });
384
+ it('should identify strongest correlation', async () => {
385
+ const { calculateErrorTypeCorrelation } = await import('./benchmark-integration.js');
386
+ const results = [
387
+ { ocean: { O: 5, C: 4, E: 2, A: 3, N: 2 }, mean: 85 },
388
+ { ocean: { O: 2, C: 5, E: 4, A: 4, N: 4 }, mean: 72 },
389
+ ];
390
+ const judgeScores = [
391
+ { detection_by_type: { reasoning: 0.8, planning: 0.6, execution: 0.7 } },
392
+ { detection_by_type: { reasoning: 0.5, planning: 0.9, execution: 0.8 } },
393
+ ];
394
+ const correlation = calculateErrorTypeCorrelation(results, judgeScores);
395
+ assert.ok(correlation.strongest, 'Should identify strongest correlation');
396
+ assert.ok(['O', 'C', 'E', 'A', 'N'].includes(correlation.strongest.dimension), 'Strongest dimension should be valid OCEAN');
397
+ assert.ok(['reasoning', 'planning', 'execution'].includes(correlation.strongest.errorType), 'Strongest errorType should be valid');
398
+ assert.ok(typeof correlation.strongest.correlation === 'number', 'Strongest correlation should be a number');
399
+ });
400
+ });
401
+ describe('AC2: generateOceanErrorHeatMap Function', () => {
402
+ it('should export generateOceanErrorHeatMap function', async () => {
403
+ const module = await import('./benchmark-integration.js');
404
+ assert.ok(typeof module.generateOceanErrorHeatMap === 'function', 'generateOceanErrorHeatMap should be a function');
405
+ });
406
+ it('should produce markdown with 5×3 matrix table', async () => {
407
+ const { generateOceanErrorHeatMap } = await import('./benchmark-integration.js');
408
+ // Create mock correlation data
409
+ const correlation = {
410
+ matrix: {
411
+ O: {
412
+ reasoning: { correlation: 0.42, arrow: '↑' },
413
+ planning: { correlation: 0.08, arrow: '→' },
414
+ execution: { correlation: -0.15, arrow: '→' },
415
+ },
416
+ C: {
417
+ reasoning: { correlation: 0.12, arrow: '→' },
418
+ planning: { correlation: 0.38, arrow: '↑' },
419
+ execution: { correlation: 0.45, arrow: '↑' },
420
+ },
421
+ E: {
422
+ reasoning: { correlation: -0.22, arrow: '→' },
423
+ planning: { correlation: 0.05, arrow: '→' },
424
+ execution: { correlation: 0.10, arrow: '→' },
425
+ },
426
+ A: {
427
+ reasoning: { correlation: 0.08, arrow: '→' },
428
+ planning: { correlation: -0.03, arrow: '→' },
429
+ execution: { correlation: 0.11, arrow: '→' },
430
+ },
431
+ N: {
432
+ reasoning: { correlation: -0.31, arrow: '↓' },
433
+ planning: { correlation: -0.25, arrow: '→' },
434
+ execution: { correlation: -0.18, arrow: '→' },
435
+ },
436
+ },
437
+ strongest: { dimension: 'C', errorType: 'execution', correlation: 0.45 },
438
+ };
439
+ const heatMap = generateOceanErrorHeatMap(correlation);
440
+ assert.ok(typeof heatMap === 'string', 'Should return a string');
441
+ assert.ok(heatMap.includes('|'), 'Should include markdown table separators');
442
+ // Should have all column headers
443
+ assert.ok(heatMap.includes('Reasoning'), 'Should have Reasoning column');
444
+ assert.ok(heatMap.includes('Planning'), 'Should have Planning column');
445
+ assert.ok(heatMap.includes('Execution'), 'Should have Execution column');
446
+ // Should have all row labels
447
+ assert.ok(heatMap.includes('O'), 'Should have O (Openness) row');
448
+ assert.ok(heatMap.includes('C'), 'Should have C (Conscientiousness) row');
449
+ assert.ok(heatMap.includes('E'), 'Should have E (Extraversion) row');
450
+ assert.ok(heatMap.includes('A'), 'Should have A (Agreeableness) row');
451
+ assert.ok(heatMap.includes('N'), 'Should have N (Neuroticism) row');
452
+ });
453
+ });
454
+ describe('AC3: Directional Arrows and Effect Sizes', () => {
455
+ it('should include directional arrows (↑↓→) in output', async () => {
456
+ const { generateOceanErrorHeatMap } = await import('./benchmark-integration.js');
457
+ const correlation = {
458
+ matrix: {
459
+ O: {
460
+ reasoning: { correlation: 0.42, arrow: '↑' },
461
+ planning: { correlation: 0.08, arrow: '→' },
462
+ execution: { correlation: -0.35, arrow: '↓' },
463
+ },
464
+ C: {
465
+ reasoning: { correlation: 0.12, arrow: '→' },
466
+ planning: { correlation: 0.38, arrow: '↑' },
467
+ execution: { correlation: 0.45, arrow: '↑' },
468
+ },
469
+ E: {
470
+ reasoning: { correlation: -0.22, arrow: '→' },
471
+ planning: { correlation: 0.05, arrow: '→' },
472
+ execution: { correlation: 0.10, arrow: '→' },
473
+ },
474
+ A: {
475
+ reasoning: { correlation: 0.08, arrow: '→' },
476
+ planning: { correlation: -0.03, arrow: '→' },
477
+ execution: { correlation: 0.11, arrow: '→' },
478
+ },
479
+ N: {
480
+ reasoning: { correlation: -0.31, arrow: '↓' },
481
+ planning: { correlation: -0.25, arrow: '→' },
482
+ execution: { correlation: -0.18, arrow: '→' },
483
+ },
484
+ },
485
+ strongest: { dimension: 'C', errorType: 'execution', correlation: 0.45 },
486
+ };
487
+ const heatMap = generateOceanErrorHeatMap(correlation);
488
+ // Check for directional arrows
489
+ assert.ok(heatMap.includes('↑'), 'Should include upward arrow for positive correlations');
490
+ assert.ok(heatMap.includes('↓'), 'Should include downward arrow for negative correlations');
491
+ assert.ok(heatMap.includes('→'), 'Should include neutral arrow');
492
+ });
493
+ it('should show effect sizes with appropriate precision', async () => {
494
+ const { generateOceanErrorHeatMap } = await import('./benchmark-integration.js');
495
+ const correlation = {
496
+ matrix: {
497
+ O: {
498
+ reasoning: { correlation: 0.42, arrow: '↑' },
499
+ planning: { correlation: 0.08, arrow: '→' },
500
+ execution: { correlation: -0.15, arrow: '→' },
501
+ },
502
+ C: {
503
+ reasoning: { correlation: 0.12, arrow: '→' },
504
+ planning: { correlation: 0.38, arrow: '↑' },
505
+ execution: { correlation: 0.45, arrow: '↑' },
506
+ },
507
+ E: {
508
+ reasoning: { correlation: -0.22, arrow: '→' },
509
+ planning: { correlation: 0.05, arrow: '→' },
510
+ execution: { correlation: 0.10, arrow: '→' },
511
+ },
512
+ A: {
513
+ reasoning: { correlation: 0.08, arrow: '→' },
514
+ planning: { correlation: -0.03, arrow: '→' },
515
+ execution: { correlation: 0.11, arrow: '→' },
516
+ },
517
+ N: {
518
+ reasoning: { correlation: -0.31, arrow: '↓' },
519
+ planning: { correlation: -0.25, arrow: '→' },
520
+ execution: { correlation: -0.18, arrow: '→' },
521
+ },
522
+ },
523
+ strongest: { dimension: 'C', errorType: 'execution', correlation: 0.45 },
524
+ };
525
+ const heatMap = generateOceanErrorHeatMap(correlation);
526
+ // Should include numeric effect sizes
527
+ assert.ok(heatMap.includes('0.42') || heatMap.includes('.42'), 'Should show effect sizes');
528
+ assert.ok(heatMap.includes('0.45') || heatMap.includes('.45'), 'Should show largest effect size');
529
+ });
530
+ it('should use correct arrow based on correlation magnitude', async () => {
531
+ const { calculateErrorTypeCorrelation } = await import('./benchmark-integration.js');
532
+ // High O correlates with high reasoning detection
533
+ const results = [
534
+ { ocean: { O: 5, C: 3, E: 3, A: 3, N: 3 }, mean: 80 },
535
+ { ocean: { O: 5, C: 3, E: 3, A: 3, N: 3 }, mean: 82 },
536
+ { ocean: { O: 1, C: 3, E: 3, A: 3, N: 3 }, mean: 70 },
537
+ { ocean: { O: 1, C: 3, E: 3, A: 3, N: 3 }, mean: 68 },
538
+ ];
539
+ const judgeScores = [
540
+ { detection_by_type: { reasoning: 0.9, planning: 0.5, execution: 0.5 } },
541
+ { detection_by_type: { reasoning: 0.85, planning: 0.5, execution: 0.5 } },
542
+ { detection_by_type: { reasoning: 0.4, planning: 0.5, execution: 0.5 } },
543
+ { detection_by_type: { reasoning: 0.35, planning: 0.5, execution: 0.5 } },
544
+ ];
545
+ const correlation = calculateErrorTypeCorrelation(results, judgeScores);
546
+ // High O should positively correlate with reasoning detection
547
+ assert.ok(correlation.matrix.O.reasoning.arrow === '↑', 'High positive correlation (>=0.3) should use ↑ arrow');
548
+ });
549
+ it('should include legend explaining arrows', async () => {
550
+ const { generateOceanErrorHeatMap } = await import('./benchmark-integration.js');
551
+ const correlation = {
552
+ matrix: {
553
+ O: { reasoning: { correlation: 0.42, arrow: '↑' }, planning: { correlation: 0.08, arrow: '→' }, execution: { correlation: -0.15, arrow: '→' } },
554
+ C: { reasoning: { correlation: 0.12, arrow: '→' }, planning: { correlation: 0.38, arrow: '↑' }, execution: { correlation: 0.45, arrow: '↑' } },
555
+ E: { reasoning: { correlation: -0.22, arrow: '→' }, planning: { correlation: 0.05, arrow: '→' }, execution: { correlation: 0.10, arrow: '→' } },
556
+ A: { reasoning: { correlation: 0.08, arrow: '→' }, planning: { correlation: -0.03, arrow: '→' }, execution: { correlation: 0.11, arrow: '→' } },
557
+ N: { reasoning: { correlation: -0.31, arrow: '↓' }, planning: { correlation: -0.25, arrow: '→' }, execution: { correlation: -0.18, arrow: '→' } },
558
+ },
559
+ strongest: { dimension: 'C', errorType: 'execution', correlation: 0.45 },
560
+ };
561
+ const heatMap = generateOceanErrorHeatMap(correlation);
562
+ assert.ok(heatMap.includes('Legend') || heatMap.includes('legend') ||
563
+ (heatMap.includes('↑') && heatMap.includes('positive')), 'Should include legend explaining arrow meanings');
564
+ });
565
+ });
566
+ describe('AC4: Integration with generateBenchmarkReport', () => {
567
+ it('should include error-type heat map when judge scores provided', async () => {
568
+ const { generateBenchmarkReport } = await import('./benchmark-integration.js');
569
+ const report = generateBenchmarkReport({
570
+ scenario: 'race-condition-cache',
571
+ role: 'dev',
572
+ includeErrorTypeCorrelation: true,
573
+ });
574
+ // When error correlation is requested, report should include the heat map section
575
+ assert.ok(report.markdown.includes('Error-Type') ||
576
+ report.markdown.includes('error-type') ||
577
+ report.markdown.includes('Reasoning'), 'Report should include error-type correlation section when requested');
578
+ });
579
+ it('should add error correlation data to report data object', async () => {
580
+ const { generateBenchmarkReport } = await import('./benchmark-integration.js');
581
+ const report = generateBenchmarkReport({
582
+ scenario: 'race-condition-cache',
583
+ role: 'dev',
584
+ includeErrorTypeCorrelation: true,
585
+ });
586
+ // Report data should include error correlation when flag is set
587
+ if (report.data.errorCorrelation) {
588
+ assert.ok(report.data.errorCorrelation.matrix, 'Error correlation data should have matrix');
589
+ }
590
+ });
591
+ });
592
+ describe('AC5: Edge Cases - No Data', () => {
593
+ it('should handle empty results array', async () => {
594
+ const { calculateErrorTypeCorrelation } = await import('./benchmark-integration.js');
595
+ const correlation = calculateErrorTypeCorrelation([], []);
596
+ assert.ok(correlation !== undefined, 'Should not throw on empty input');
597
+ // Should return null or default structure
598
+ assert.ok(correlation === null ||
599
+ (correlation.matrix && Object.keys(correlation.matrix).length === 5), 'Should return null or default 5×3 matrix');
600
+ });
601
+ it('should handle single entry', async () => {
602
+ const { calculateErrorTypeCorrelation } = await import('./benchmark-integration.js');
603
+ const results = [
604
+ { ocean: { O: 4, C: 3, E: 3, A: 3, N: 3 }, mean: 75 },
605
+ ];
606
+ const judgeScores = [
607
+ { detection_by_type: { reasoning: 0.7, planning: 0.6, execution: 0.5 } },
608
+ ];
609
+ const correlation = calculateErrorTypeCorrelation(results, judgeScores);
610
+ // With single entry, correlation can't be calculated meaningfully
611
+ assert.ok(correlation !== undefined, 'Should handle single entry gracefully');
612
+ });
613
+ });
614
+ describe('AC5: Edge Cases - Partial Data', () => {
615
+ it('should handle missing detection_by_type in judge scores', async () => {
616
+ const { calculateErrorTypeCorrelation } = await import('./benchmark-integration.js');
617
+ const results = [
618
+ { ocean: { O: 4, C: 3, E: 3, A: 3, N: 3 }, mean: 75 },
619
+ { ocean: { O: 2, C: 4, E: 4, A: 4, N: 4 }, mean: 80 },
620
+ ];
621
+ const judgeScores = [
622
+ { detection_by_type: { reasoning: 0.7, planning: 0.6, execution: 0.5 } },
623
+ {}, // Missing detection_by_type
624
+ ];
625
+ // Should not throw
626
+ let threw = false;
627
+ try {
628
+ calculateErrorTypeCorrelation(results, judgeScores);
629
+ }
630
+ catch {
631
+ threw = true;
632
+ }
633
+ assert.ok(!threw, 'Should handle missing detection_by_type without throwing');
634
+ });
635
+ it('should handle mismatched array lengths', async () => {
636
+ const { calculateErrorTypeCorrelation } = await import('./benchmark-integration.js');
637
+ const results = [
638
+ { ocean: { O: 4, C: 3, E: 3, A: 3, N: 3 }, mean: 75 },
639
+ { ocean: { O: 2, C: 4, E: 4, A: 4, N: 4 }, mean: 80 },
640
+ { ocean: { O: 3, C: 3, E: 3, A: 3, N: 3 }, mean: 77 },
641
+ ];
642
+ const judgeScores = [
643
+ { detection_by_type: { reasoning: 0.7, planning: 0.6, execution: 0.5 } },
644
+ ];
645
+ // Should not throw
646
+ let threw = false;
647
+ try {
648
+ calculateErrorTypeCorrelation(results, judgeScores);
649
+ }
650
+ catch {
651
+ threw = true;
652
+ }
653
+ assert.ok(!threw, 'Should handle mismatched array lengths without throwing');
654
+ });
655
+ });
656
+ describe('AC5: Edge Cases - Single Dimension Variation', () => {
657
+ it('should handle all same OCEAN values', async () => {
658
+ const { calculateErrorTypeCorrelation } = await import('./benchmark-integration.js');
659
+ // All characters have identical OCEAN scores
660
+ const results = [
661
+ { ocean: { O: 3, C: 3, E: 3, A: 3, N: 3 }, mean: 75 },
662
+ { ocean: { O: 3, C: 3, E: 3, A: 3, N: 3 }, mean: 80 },
663
+ { ocean: { O: 3, C: 3, E: 3, A: 3, N: 3 }, mean: 77 },
664
+ ];
665
+ const judgeScores = [
666
+ { detection_by_type: { reasoning: 0.7, planning: 0.6, execution: 0.5 } },
667
+ { detection_by_type: { reasoning: 0.8, planning: 0.7, execution: 0.6 } },
668
+ { detection_by_type: { reasoning: 0.6, planning: 0.5, execution: 0.4 } },
669
+ ];
670
+ const correlation = calculateErrorTypeCorrelation(results, judgeScores);
671
+ // With no variation in OCEAN, correlation should be 0 or undefined
672
+ assert.ok(correlation !== undefined, 'Should handle identical OCEAN scores');
673
+ if (correlation && correlation.matrix) {
674
+ // All correlations should be 0 or neutral
675
+ assert.ok(correlation.matrix.O.reasoning.correlation === 0 ||
676
+ correlation.matrix.O.reasoning.arrow === '→', 'No variance should result in zero or neutral correlation');
677
+ }
678
+ });
679
+ });
680
+ //# sourceMappingURL=benchmark-integration.test.js.map