@pennyfarthing/core 6.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/README.md +293 -0
  2. package/package.json +58 -0
  3. package/packages/core/bin/pennyfarthing.js +14 -0
  4. package/packages/core/dist/bmad/context-reader.d.ts +71 -0
  5. package/packages/core/dist/bmad/context-reader.d.ts.map +1 -0
  6. package/packages/core/dist/bmad/context-reader.js +369 -0
  7. package/packages/core/dist/bmad/context-reader.js.map +1 -0
  8. package/packages/core/dist/bmad/context-reader.test.d.ts +71 -0
  9. package/packages/core/dist/bmad/context-reader.test.d.ts.map +1 -0
  10. package/packages/core/dist/bmad/context-reader.test.js +878 -0
  11. package/packages/core/dist/bmad/context-reader.test.js.map +1 -0
  12. package/packages/core/dist/bmad/epics-parser.d.ts +61 -0
  13. package/packages/core/dist/bmad/epics-parser.d.ts.map +1 -0
  14. package/packages/core/dist/bmad/epics-parser.js +331 -0
  15. package/packages/core/dist/bmad/epics-parser.js.map +1 -0
  16. package/packages/core/dist/bmad/epics-parser.test.d.ts +7 -0
  17. package/packages/core/dist/bmad/epics-parser.test.d.ts.map +1 -0
  18. package/packages/core/dist/bmad/epics-parser.test.js +449 -0
  19. package/packages/core/dist/bmad/epics-parser.test.js.map +1 -0
  20. package/packages/core/dist/bmad/index.d.ts +11 -0
  21. package/packages/core/dist/bmad/index.d.ts.map +1 -0
  22. package/packages/core/dist/bmad/index.js +24 -0
  23. package/packages/core/dist/bmad/index.js.map +1 -0
  24. package/packages/core/dist/bmad/status-sync.d.ts +173 -0
  25. package/packages/core/dist/bmad/status-sync.d.ts.map +1 -0
  26. package/packages/core/dist/bmad/status-sync.js +463 -0
  27. package/packages/core/dist/bmad/status-sync.js.map +1 -0
  28. package/packages/core/dist/bmad/status-sync.test.d.ts +7 -0
  29. package/packages/core/dist/bmad/status-sync.test.d.ts.map +1 -0
  30. package/packages/core/dist/bmad/status-sync.test.js +702 -0
  31. package/packages/core/dist/bmad/status-sync.test.js.map +1 -0
  32. package/packages/core/dist/bmad/story-exporter.d.ts +55 -0
  33. package/packages/core/dist/bmad/story-exporter.d.ts.map +1 -0
  34. package/packages/core/dist/bmad/story-exporter.js +170 -0
  35. package/packages/core/dist/bmad/story-exporter.js.map +1 -0
  36. package/packages/core/dist/bmad/story-exporter.test.d.ts +51 -0
  37. package/packages/core/dist/bmad/story-exporter.test.d.ts.map +1 -0
  38. package/packages/core/dist/bmad/story-exporter.test.js +603 -0
  39. package/packages/core/dist/bmad/story-exporter.test.js.map +1 -0
  40. package/packages/core/dist/bmad/story-parser.d.ts +44 -0
  41. package/packages/core/dist/bmad/story-parser.d.ts.map +1 -0
  42. package/packages/core/dist/bmad/story-parser.js +307 -0
  43. package/packages/core/dist/bmad/story-parser.js.map +1 -0
  44. package/packages/core/dist/bmad/story-parser.test.d.ts +44 -0
  45. package/packages/core/dist/bmad/story-parser.test.d.ts.map +1 -0
  46. package/packages/core/dist/bmad/story-parser.test.js +693 -0
  47. package/packages/core/dist/bmad/story-parser.test.js.map +1 -0
  48. package/packages/core/dist/cli/commands/command.d.ts +28 -0
  49. package/packages/core/dist/cli/commands/command.d.ts.map +1 -0
  50. package/packages/core/dist/cli/commands/command.js +399 -0
  51. package/packages/core/dist/cli/commands/command.js.map +1 -0
  52. package/packages/core/dist/cli/commands/cyclist.d.ts +46 -0
  53. package/packages/core/dist/cli/commands/cyclist.d.ts.map +1 -0
  54. package/packages/core/dist/cli/commands/cyclist.js +191 -0
  55. package/packages/core/dist/cli/commands/cyclist.js.map +1 -0
  56. package/packages/core/dist/cli/commands/cyclist.test.d.ts +13 -0
  57. package/packages/core/dist/cli/commands/cyclist.test.d.ts.map +1 -0
  58. package/packages/core/dist/cli/commands/cyclist.test.js +243 -0
  59. package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -0
  60. package/packages/core/dist/cli/commands/doctor.d.ts +9 -0
  61. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -0
  62. package/packages/core/dist/cli/commands/doctor.js +652 -0
  63. package/packages/core/dist/cli/commands/doctor.js.map +1 -0
  64. package/packages/core/dist/cli/commands/init.d.ts +8 -0
  65. package/packages/core/dist/cli/commands/init.d.ts.map +1 -0
  66. package/packages/core/dist/cli/commands/init.js +524 -0
  67. package/packages/core/dist/cli/commands/init.js.map +1 -0
  68. package/packages/core/dist/cli/commands/skill.d.ts +28 -0
  69. package/packages/core/dist/cli/commands/skill.d.ts.map +1 -0
  70. package/packages/core/dist/cli/commands/skill.js +416 -0
  71. package/packages/core/dist/cli/commands/skill.js.map +1 -0
  72. package/packages/core/dist/cli/commands/theme.d.ts +21 -0
  73. package/packages/core/dist/cli/commands/theme.d.ts.map +1 -0
  74. package/packages/core/dist/cli/commands/theme.js +201 -0
  75. package/packages/core/dist/cli/commands/theme.js.map +1 -0
  76. package/packages/core/dist/cli/commands/uninstall.d.ts +8 -0
  77. package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -0
  78. package/packages/core/dist/cli/commands/uninstall.js +237 -0
  79. package/packages/core/dist/cli/commands/uninstall.js.map +1 -0
  80. package/packages/core/dist/cli/commands/update.d.ts +9 -0
  81. package/packages/core/dist/cli/commands/update.d.ts.map +1 -0
  82. package/packages/core/dist/cli/commands/update.js +545 -0
  83. package/packages/core/dist/cli/commands/update.js.map +1 -0
  84. package/packages/core/dist/cli/commands/version.d.ts +2 -0
  85. package/packages/core/dist/cli/commands/version.d.ts.map +1 -0
  86. package/packages/core/dist/cli/commands/version.js +28 -0
  87. package/packages/core/dist/cli/commands/version.js.map +1 -0
  88. package/packages/core/dist/cli/customization.test.d.ts +12 -0
  89. package/packages/core/dist/cli/customization.test.d.ts.map +1 -0
  90. package/packages/core/dist/cli/customization.test.js +84 -0
  91. package/packages/core/dist/cli/customization.test.js.map +1 -0
  92. package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
  93. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
  94. package/packages/core/dist/cli/cyclist-migration.test.js +224 -0
  95. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
  96. package/packages/core/dist/cli/index.d.ts +3 -0
  97. package/packages/core/dist/cli/index.d.ts.map +1 -0
  98. package/packages/core/dist/cli/index.js +174 -0
  99. package/packages/core/dist/cli/index.js.map +1 -0
  100. package/packages/core/dist/cli/ocean-profiles.test.d.ts +13 -0
  101. package/packages/core/dist/cli/ocean-profiles.test.d.ts.map +1 -0
  102. package/packages/core/dist/cli/ocean-profiles.test.js +134 -0
  103. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -0
  104. package/packages/core/dist/cli/theme-maker.test.d.ts +11 -0
  105. package/packages/core/dist/cli/theme-maker.test.d.ts.map +1 -0
  106. package/packages/core/dist/cli/theme-maker.test.js +356 -0
  107. package/packages/core/dist/cli/theme-maker.test.js.map +1 -0
  108. package/packages/core/dist/cli/utils/constants.d.ts +60 -0
  109. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -0
  110. package/packages/core/dist/cli/utils/constants.js +52 -0
  111. package/packages/core/dist/cli/utils/constants.js.map +1 -0
  112. package/packages/core/dist/cli/utils/files.d.ts +71 -0
  113. package/packages/core/dist/cli/utils/files.d.ts.map +1 -0
  114. package/packages/core/dist/cli/utils/files.js +162 -0
  115. package/packages/core/dist/cli/utils/files.js.map +1 -0
  116. package/packages/core/dist/cli/utils/logger.d.ts +26 -0
  117. package/packages/core/dist/cli/utils/logger.d.ts.map +1 -0
  118. package/packages/core/dist/cli/utils/logger.js +88 -0
  119. package/packages/core/dist/cli/utils/logger.js.map +1 -0
  120. package/packages/core/dist/cli/utils/manifest.d.ts +47 -0
  121. package/packages/core/dist/cli/utils/manifest.d.ts.map +1 -0
  122. package/packages/core/dist/cli/utils/manifest.js +90 -0
  123. package/packages/core/dist/cli/utils/manifest.js.map +1 -0
  124. package/packages/core/dist/cli/utils/node-modules.d.ts +6 -0
  125. package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -0
  126. package/packages/core/dist/cli/utils/node-modules.js +22 -0
  127. package/packages/core/dist/cli/utils/node-modules.js.map +1 -0
  128. package/packages/core/dist/cli/utils/prompts.d.ts +34 -0
  129. package/packages/core/dist/cli/utils/prompts.d.ts.map +1 -0
  130. package/packages/core/dist/cli/utils/prompts.js +93 -0
  131. package/packages/core/dist/cli/utils/prompts.js.map +1 -0
  132. package/packages/core/dist/cli/utils/symlinks.d.ts +29 -0
  133. package/packages/core/dist/cli/utils/symlinks.d.ts.map +1 -0
  134. package/packages/core/dist/cli/utils/symlinks.js +181 -0
  135. package/packages/core/dist/cli/utils/symlinks.js.map +1 -0
  136. package/packages/core/dist/cli/utils/themes.d.ts +104 -0
  137. package/packages/core/dist/cli/utils/themes.d.ts.map +1 -0
  138. package/packages/core/dist/cli/utils/themes.js +393 -0
  139. package/packages/core/dist/cli/utils/themes.js.map +1 -0
  140. package/packages/core/dist/cli/utils/themes.test.d.ts +12 -0
  141. package/packages/core/dist/cli/utils/themes.test.d.ts.map +1 -0
  142. package/packages/core/dist/cli/utils/themes.test.js +144 -0
  143. package/packages/core/dist/cli/utils/themes.test.js.map +1 -0
  144. package/packages/core/dist/cli/utils/version.d.ts +10 -0
  145. package/packages/core/dist/cli/utils/version.d.ts.map +1 -0
  146. package/packages/core/dist/cli/utils/version.js +63 -0
  147. package/packages/core/dist/cli/utils/version.js.map +1 -0
  148. package/packages/core/dist/cli/workspace.test.d.ts +8 -0
  149. package/packages/core/dist/cli/workspace.test.d.ts.map +1 -0
  150. package/packages/core/dist/cli/workspace.test.js +154 -0
  151. package/packages/core/dist/cli/workspace.test.js.map +1 -0
  152. package/packages/core/dist/index.d.ts +6 -0
  153. package/packages/core/dist/index.d.ts.map +1 -0
  154. package/packages/core/dist/index.js +10 -0
  155. package/packages/core/dist/index.js.map +1 -0
  156. package/packages/core/dist/permissions/index.d.ts +9 -0
  157. package/packages/core/dist/permissions/index.d.ts.map +1 -0
  158. package/packages/core/dist/permissions/index.js +13 -0
  159. package/packages/core/dist/permissions/index.js.map +1 -0
  160. package/packages/core/dist/permissions/permission-schema.d.ts +89 -0
  161. package/packages/core/dist/permissions/permission-schema.d.ts.map +1 -0
  162. package/packages/core/dist/permissions/permission-schema.js +120 -0
  163. package/packages/core/dist/permissions/permission-schema.js.map +1 -0
  164. package/packages/core/dist/permissions/permission-schema.test.d.ts +40 -0
  165. package/packages/core/dist/permissions/permission-schema.test.d.ts.map +1 -0
  166. package/packages/core/dist/permissions/permission-schema.test.js +367 -0
  167. package/packages/core/dist/permissions/permission-schema.test.js.map +1 -0
  168. package/packages/core/dist/scripts/add-ocean-profiles.d.ts +9 -0
  169. package/packages/core/dist/scripts/add-ocean-profiles.d.ts.map +1 -0
  170. package/packages/core/dist/scripts/add-ocean-profiles.js +695 -0
  171. package/packages/core/dist/scripts/add-ocean-profiles.js.map +1 -0
  172. package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
  173. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
  174. package/packages/core/dist/scripts/benchmark-integration.js +691 -0
  175. package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
  176. package/packages/core/dist/scripts/benchmark-integration.test.d.ts +13 -0
  177. package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +1 -0
  178. package/packages/core/dist/scripts/benchmark-integration.test.js +680 -0
  179. package/packages/core/dist/scripts/benchmark-integration.test.js.map +1 -0
  180. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +18 -0
  181. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +1 -0
  182. package/packages/core/dist/scripts/debugging-scenarios.test.js +317 -0
  183. package/packages/core/dist/scripts/debugging-scenarios.test.js.map +1 -0
  184. package/packages/core/dist/scripts/generate-all-faces.d.ts +10 -0
  185. package/packages/core/dist/scripts/generate-all-faces.d.ts.map +1 -0
  186. package/packages/core/dist/scripts/generate-all-faces.js +256 -0
  187. package/packages/core/dist/scripts/generate-all-faces.js.map +1 -0
  188. package/packages/core/dist/scripts/generate-all-faces.test.d.ts +17 -0
  189. package/packages/core/dist/scripts/generate-all-faces.test.d.ts.map +1 -0
  190. package/packages/core/dist/scripts/generate-all-faces.test.js +372 -0
  191. package/packages/core/dist/scripts/generate-all-faces.test.js.map +1 -0
  192. package/packages/core/dist/scripts/generate-all-spiders.d.ts +10 -0
  193. package/packages/core/dist/scripts/generate-all-spiders.d.ts.map +1 -0
  194. package/packages/core/dist/scripts/generate-all-spiders.js +306 -0
  195. package/packages/core/dist/scripts/generate-all-spiders.js.map +1 -0
  196. package/packages/core/dist/scripts/generate-ascii-face.d.ts +52 -0
  197. package/packages/core/dist/scripts/generate-ascii-face.d.ts.map +1 -0
  198. package/packages/core/dist/scripts/generate-ascii-face.js +155 -0
  199. package/packages/core/dist/scripts/generate-ascii-face.js.map +1 -0
  200. package/packages/core/dist/scripts/generate-face.d.ts +52 -0
  201. package/packages/core/dist/scripts/generate-face.d.ts.map +1 -0
  202. package/packages/core/dist/scripts/generate-face.js +199 -0
  203. package/packages/core/dist/scripts/generate-face.js.map +1 -0
  204. package/packages/core/dist/scripts/generate-face.test.d.ts +13 -0
  205. package/packages/core/dist/scripts/generate-face.test.d.ts.map +1 -0
  206. package/packages/core/dist/scripts/generate-face.test.js +301 -0
  207. package/packages/core/dist/scripts/generate-face.test.js.map +1 -0
  208. package/packages/core/dist/scripts/generate-report.d.ts +65 -0
  209. package/packages/core/dist/scripts/generate-report.d.ts.map +1 -0
  210. package/packages/core/dist/scripts/generate-report.js +378 -0
  211. package/packages/core/dist/scripts/generate-report.js.map +1 -0
  212. package/packages/core/dist/scripts/generate-report.test.d.ts +13 -0
  213. package/packages/core/dist/scripts/generate-report.test.d.ts.map +1 -0
  214. package/packages/core/dist/scripts/generate-report.test.js +363 -0
  215. package/packages/core/dist/scripts/generate-report.test.js.map +1 -0
  216. package/packages/core/dist/scripts/generate-spider-report.d.ts +65 -0
  217. package/packages/core/dist/scripts/generate-spider-report.d.ts.map +1 -0
  218. package/packages/core/dist/scripts/generate-spider-report.js +366 -0
  219. package/packages/core/dist/scripts/generate-spider-report.js.map +1 -0
  220. package/packages/core/dist/scripts/generate-spider-report.test.d.ts +13 -0
  221. package/packages/core/dist/scripts/generate-spider-report.test.d.ts.map +1 -0
  222. package/packages/core/dist/scripts/generate-spider-report.test.js +367 -0
  223. package/packages/core/dist/scripts/generate-spider-report.test.js.map +1 -0
  224. package/packages/core/dist/scripts/generate-spider.d.ts +37 -0
  225. package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -0
  226. package/packages/core/dist/scripts/generate-spider.js +315 -0
  227. package/packages/core/dist/scripts/generate-spider.js.map +1 -0
  228. package/packages/core/dist/scripts/generate-spider.test.d.ts +14 -0
  229. package/packages/core/dist/scripts/generate-spider.test.d.ts.map +1 -0
  230. package/packages/core/dist/scripts/generate-spider.test.js +269 -0
  231. package/packages/core/dist/scripts/generate-spider.test.js.map +1 -0
  232. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -0
  233. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
  234. package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
  235. package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
  236. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts +14 -0
  237. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts.map +1 -0
  238. package/packages/core/dist/scripts/job-fair-aggregator.test.js +616 -0
  239. package/packages/core/dist/scripts/job-fair-aggregator.test.js.map +1 -0
  240. package/packages/core/dist/scripts/run-ci.test.d.ts +20 -0
  241. package/packages/core/dist/scripts/run-ci.test.d.ts.map +1 -0
  242. package/packages/core/dist/scripts/run-ci.test.js +127 -0
  243. package/packages/core/dist/scripts/run-ci.test.js.map +1 -0
  244. package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
  245. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +1 -0
  246. package/packages/core/dist/scripts/theme-detail.test.js +199 -0
  247. package/packages/core/dist/scripts/theme-detail.test.js.map +1 -0
  248. package/packages/core/dist/scripts/validate-ocean-profiles.d.ts +9 -0
  249. package/packages/core/dist/scripts/validate-ocean-profiles.d.ts.map +1 -0
  250. package/packages/core/dist/scripts/validate-ocean-profiles.js +130 -0
  251. package/packages/core/dist/scripts/validate-ocean-profiles.js.map +1 -0
  252. package/packages/core/dist/workflow/generic-handoff.d.ts +235 -0
  253. package/packages/core/dist/workflow/generic-handoff.d.ts.map +1 -0
  254. package/packages/core/dist/workflow/generic-handoff.js +358 -0
  255. package/packages/core/dist/workflow/generic-handoff.js.map +1 -0
  256. package/packages/core/dist/workflow/generic-handoff.test.d.ts +21 -0
  257. package/packages/core/dist/workflow/generic-handoff.test.d.ts.map +1 -0
  258. package/packages/core/dist/workflow/generic-handoff.test.js +499 -0
  259. package/packages/core/dist/workflow/generic-handoff.test.js.map +1 -0
  260. package/packages/core/dist/workflow/generic-sm-finish.d.ts +89 -0
  261. package/packages/core/dist/workflow/generic-sm-finish.d.ts.map +1 -0
  262. package/packages/core/dist/workflow/generic-sm-finish.js +157 -0
  263. package/packages/core/dist/workflow/generic-sm-finish.js.map +1 -0
  264. package/packages/core/dist/workflow/generic-sm-setup.d.ts +138 -0
  265. package/packages/core/dist/workflow/generic-sm-setup.d.ts.map +1 -0
  266. package/packages/core/dist/workflow/generic-sm-setup.js +382 -0
  267. package/packages/core/dist/workflow/generic-sm-setup.js.map +1 -0
  268. package/packages/core/dist/workflow/sm-subagents.test.d.ts +23 -0
  269. package/packages/core/dist/workflow/sm-subagents.test.d.ts.map +1 -0
  270. package/packages/core/dist/workflow/sm-subagents.test.js +727 -0
  271. package/packages/core/dist/workflow/sm-subagents.test.js.map +1 -0
  272. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts +17 -0
  273. package/packages/core/dist/workflow/story-workflow-routing.test.d.ts.map +1 -0
  274. package/packages/core/dist/workflow/story-workflow-routing.test.js +559 -0
  275. package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -0
  276. package/packages/core/dist/workflow/test-cache.d.ts +131 -0
  277. package/packages/core/dist/workflow/test-cache.d.ts.map +1 -0
  278. package/packages/core/dist/workflow/test-cache.js +226 -0
  279. package/packages/core/dist/workflow/test-cache.js.map +1 -0
  280. package/packages/core/dist/workflow/test-cache.test.d.ts +17 -0
  281. package/packages/core/dist/workflow/test-cache.test.d.ts.map +1 -0
  282. package/packages/core/dist/workflow/test-cache.test.js +438 -0
  283. package/packages/core/dist/workflow/test-cache.test.js.map +1 -0
  284. package/packages/core/dist/workflow/workflow-loader.d.ts +76 -0
  285. package/packages/core/dist/workflow/workflow-loader.d.ts.map +1 -0
  286. package/packages/core/dist/workflow/workflow-loader.js +133 -0
  287. package/packages/core/dist/workflow/workflow-loader.js.map +1 -0
  288. package/packages/core/dist/workflow/workflow-loader.test.d.ts +15 -0
  289. package/packages/core/dist/workflow/workflow-loader.test.d.ts.map +1 -0
  290. package/packages/core/dist/workflow/workflow-loader.test.js +354 -0
  291. package/packages/core/dist/workflow/workflow-loader.test.js.map +1 -0
  292. package/packages/core/dist/workflow/workflow-migration.test.d.ts +17 -0
  293. package/packages/core/dist/workflow/workflow-migration.test.d.ts.map +1 -0
  294. package/packages/core/dist/workflow/workflow-migration.test.js +372 -0
  295. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -0
  296. package/packages/core/dist/workflow/workflow-router.d.ts +55 -0
  297. package/packages/core/dist/workflow/workflow-router.d.ts.map +1 -0
  298. package/packages/core/dist/workflow/workflow-router.js +245 -0
  299. package/packages/core/dist/workflow/workflow-router.js.map +1 -0
  300. package/packages/core/dist/workflow/workflow-router.test.d.ts +20 -0
  301. package/packages/core/dist/workflow/workflow-router.test.d.ts.map +1 -0
  302. package/packages/core/dist/workflow/workflow-router.test.js +607 -0
  303. package/packages/core/dist/workflow/workflow-router.test.js.map +1 -0
  304. package/packages/core/dist/workflow/workflow-schema.d.ts +98 -0
  305. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -0
  306. package/packages/core/dist/workflow/workflow-schema.js +230 -0
  307. package/packages/core/dist/workflow/workflow-schema.js.map +1 -0
  308. package/packages/core/dist/workflow/workflow-schema.test.d.ts +45 -0
  309. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -0
  310. package/packages/core/dist/workflow/workflow-schema.test.js +512 -0
  311. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -0
  312. package/pennyfarthing-dist/agents/README.md +397 -0
  313. package/pennyfarthing-dist/agents/architect.md +171 -0
  314. package/pennyfarthing-dist/agents/dev.md +225 -0
  315. package/pennyfarthing-dist/agents/devops.md +183 -0
  316. package/pennyfarthing-dist/agents/generic-handoff.md +451 -0
  317. package/pennyfarthing-dist/agents/generic-sm-finish.md +261 -0
  318. package/pennyfarthing-dist/agents/generic-sm-setup.md +214 -0
  319. package/pennyfarthing-dist/agents/orchestrator.md +316 -0
  320. package/pennyfarthing-dist/agents/pm.md +153 -0
  321. package/pennyfarthing-dist/agents/reviewer-preflight.md +224 -0
  322. package/pennyfarthing-dist/agents/reviewer.md +315 -0
  323. package/pennyfarthing-dist/agents/sm-file-summary.md +109 -0
  324. package/pennyfarthing-dist/agents/sm-handoff.md +97 -0
  325. package/pennyfarthing-dist/agents/sm.md +480 -0
  326. package/pennyfarthing-dist/agents/tea.md +191 -0
  327. package/pennyfarthing-dist/agents/tech-writer.md +148 -0
  328. package/pennyfarthing-dist/agents/testing-runner.md +420 -0
  329. package/pennyfarthing-dist/agents/ux-designer.md +158 -0
  330. package/pennyfarthing-dist/agents/workflow-status-check.md +332 -0
  331. package/pennyfarthing-dist/commands/architect.md +62 -0
  332. package/pennyfarthing-dist/commands/benchmark-control.md +69 -0
  333. package/pennyfarthing-dist/commands/benchmark.md +467 -0
  334. package/pennyfarthing-dist/commands/brainstorm.md +91 -0
  335. package/pennyfarthing-dist/commands/check.md +156 -0
  336. package/pennyfarthing-dist/commands/chore.md +178 -0
  337. package/pennyfarthing-dist/commands/close-epic.md +136 -0
  338. package/pennyfarthing-dist/commands/continue-session.md +184 -0
  339. package/pennyfarthing-dist/commands/create-branches-from-story.md +374 -0
  340. package/pennyfarthing-dist/commands/create-theme.md +29 -0
  341. package/pennyfarthing-dist/commands/dev.md +60 -0
  342. package/pennyfarthing-dist/commands/devops.md +59 -0
  343. package/pennyfarthing-dist/commands/git-cleanup.md +340 -0
  344. package/pennyfarthing-dist/commands/health-check.md +108 -0
  345. package/pennyfarthing-dist/commands/help.md +264 -0
  346. package/pennyfarthing-dist/commands/job-fair.md +102 -0
  347. package/pennyfarthing-dist/commands/list-themes.md +17 -0
  348. package/pennyfarthing-dist/commands/new-work.md +127 -0
  349. package/pennyfarthing-dist/commands/orchestrator.md +56 -0
  350. package/pennyfarthing-dist/commands/parallel-work.md +71 -0
  351. package/pennyfarthing-dist/commands/party-mode.md +67 -0
  352. package/pennyfarthing-dist/commands/permissions.md +193 -0
  353. package/pennyfarthing-dist/commands/pm.md +60 -0
  354. package/pennyfarthing-dist/commands/prime.md +140 -0
  355. package/pennyfarthing-dist/commands/release.md +58 -0
  356. package/pennyfarthing-dist/commands/repo-status.md +49 -0
  357. package/pennyfarthing-dist/commands/retro.md +200 -0
  358. package/pennyfarthing-dist/commands/reviewer.md +64 -0
  359. package/pennyfarthing-dist/commands/run-ci.md +116 -0
  360. package/pennyfarthing-dist/commands/set-theme.md +52 -0
  361. package/pennyfarthing-dist/commands/show-theme.md +21 -0
  362. package/pennyfarthing-dist/commands/sm.md +70 -0
  363. package/pennyfarthing-dist/commands/solo.md +411 -0
  364. package/pennyfarthing-dist/commands/sprint-planning.md +109 -0
  365. package/pennyfarthing-dist/commands/start-epic.md +156 -0
  366. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +184 -0
  367. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +376 -0
  368. package/pennyfarthing-dist/commands/tea.md +63 -0
  369. package/pennyfarthing-dist/commands/tech-writer.md +53 -0
  370. package/pennyfarthing-dist/commands/theme-maker.md +671 -0
  371. package/pennyfarthing-dist/commands/update-domain-docs.md +83 -0
  372. package/pennyfarthing-dist/commands/ux-designer.md +62 -0
  373. package/pennyfarthing-dist/commands/work.md +111 -0
  374. package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +480 -0
  375. package/pennyfarthing-dist/guides/AGENT-SCOPES.md +201 -0
  376. package/pennyfarthing-dist/guides/HOOKS.md +230 -0
  377. package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +338 -0
  378. package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +193 -0
  379. package/pennyfarthing-dist/guides/agent-template-strategic.md +148 -0
  380. package/pennyfarthing-dist/guides/agent-template-tactical.md +162 -0
  381. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +746 -0
  382. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +574 -0
  383. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +488 -0
  384. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +402 -0
  385. package/pennyfarthing-dist/guides/permission-protocol.md +188 -0
  386. package/pennyfarthing-dist/guides/persona-loading.md +46 -0
  387. package/pennyfarthing-dist/guides/persona-system.md +294 -0
  388. package/pennyfarthing-dist/guides/shared-agent-behavior.md +388 -0
  389. package/pennyfarthing-dist/guides/shared-context.md +147 -0
  390. package/pennyfarthing-dist/guides/strategic-agent-behavior.md +348 -0
  391. package/pennyfarthing-dist/guides/tactical-agent-behavior.md +1041 -0
  392. package/pennyfarthing-dist/guides/workflow-schema.md +195 -0
  393. package/pennyfarthing-dist/guides/worktree-mode.md +113 -0
  394. package/pennyfarthing-dist/output-styles/teaching.md +33 -0
  395. package/pennyfarthing-dist/output-styles/terse.md +20 -0
  396. package/pennyfarthing-dist/output-styles/verbose.md +28 -0
  397. package/pennyfarthing-dist/personas/themes/1984.yaml +312 -0
  398. package/pennyfarthing-dist/personas/themes/a-team.yaml +207 -0
  399. package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +300 -0
  400. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +330 -0
  401. package/pennyfarthing-dist/personas/themes/all-stars.yaml +332 -0
  402. package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +320 -0
  403. package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +306 -0
  404. package/pennyfarthing-dist/personas/themes/arcane.yaml +288 -0
  405. package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +331 -0
  406. package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +288 -0
  407. package/pennyfarthing-dist/personas/themes/babylon-5.yaml +288 -0
  408. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +288 -0
  409. package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +288 -0
  410. package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +300 -0
  411. package/pennyfarthing-dist/personas/themes/black-sails.yaml +300 -0
  412. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +295 -0
  413. package/pennyfarthing-dist/personas/themes/bobiverse.yaml +288 -0
  414. package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +327 -0
  415. package/pennyfarthing-dist/personas/themes/catch-22.yaml +316 -0
  416. package/pennyfarthing-dist/personas/themes/classical-composers.yaml +310 -0
  417. package/pennyfarthing-dist/personas/themes/control.yaml +197 -0
  418. package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +320 -0
  419. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +323 -0
  420. package/pennyfarthing-dist/personas/themes/deadwood.yaml +300 -0
  421. package/pennyfarthing-dist/personas/themes/dickens.yaml +320 -0
  422. package/pennyfarthing-dist/personas/themes/discworld.yaml +332 -0
  423. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +290 -0
  424. package/pennyfarthing-dist/personas/themes/don-quixote.yaml +320 -0
  425. package/pennyfarthing-dist/personas/themes/dune.yaml +307 -0
  426. package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +320 -0
  427. package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +288 -0
  428. package/pennyfarthing-dist/personas/themes/fargo.yaml +330 -0
  429. package/pennyfarthing-dist/personas/themes/film-auteurs.yaml +312 -0
  430. package/pennyfarthing-dist/personas/themes/firefly.yaml +328 -0
  431. package/pennyfarthing-dist/personas/themes/foundation.yaml +290 -0
  432. package/pennyfarthing-dist/personas/themes/futurama.yaml +321 -0
  433. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +290 -0
  434. package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +243 -0
  435. package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +308 -0
  436. package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +308 -0
  437. package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +330 -0
  438. package/pennyfarthing-dist/personas/themes/hannibal.yaml +300 -0
  439. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +324 -0
  440. package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +291 -0
  441. package/pennyfarthing-dist/personas/themes/historical-figures.yaml +288 -0
  442. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +331 -0
  443. package/pennyfarthing-dist/personas/themes/house-md.yaml +321 -0
  444. package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +289 -0
  445. package/pennyfarthing-dist/personas/themes/inspector-morse.yaml +300 -0
  446. package/pennyfarthing-dist/personas/themes/jane-austen.yaml +287 -0
  447. package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +320 -0
  448. package/pennyfarthing-dist/personas/themes/justified.yaml +300 -0
  449. package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +219 -0
  450. package/pennyfarthing-dist/personas/themes/les-miserables.yaml +299 -0
  451. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +334 -0
  452. package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +334 -0
  453. package/pennyfarthing-dist/personas/themes/mad-max.yaml +355 -0
  454. package/pennyfarthing-dist/personas/themes/mad-men.yaml +289 -0
  455. package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +300 -0
  456. package/pennyfarthing-dist/personas/themes/mash.yaml +334 -0
  457. package/pennyfarthing-dist/personas/themes/mass-effect.yaml +289 -0
  458. package/pennyfarthing-dist/personas/themes/military-commanders.yaml +306 -0
  459. package/pennyfarthing-dist/personas/themes/moby-dick.yaml +320 -0
  460. package/pennyfarthing-dist/personas/themes/monty-python.yaml +303 -0
  461. package/pennyfarthing-dist/personas/themes/neuromancer.yaml +300 -0
  462. package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +329 -0
  463. package/pennyfarthing-dist/personas/themes/parks-and-rec.yaml +242 -0
  464. package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +298 -0
  465. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +220 -0
  466. package/pennyfarthing-dist/personas/themes/renaissance-masters.yaml +320 -0
  467. package/pennyfarthing-dist/personas/themes/rome.yaml +300 -0
  468. package/pennyfarthing-dist/personas/themes/russian-masters.yaml +318 -0
  469. package/pennyfarthing-dist/personas/themes/sandman.yaml +288 -0
  470. package/pennyfarthing-dist/personas/themes/scientific-revolutionaries.yaml +320 -0
  471. package/pennyfarthing-dist/personas/themes/shakespeare.yaml +301 -0
  472. package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +289 -0
  473. package/pennyfarthing-dist/personas/themes/snow-crash.yaml +288 -0
  474. package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +300 -0
  475. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +230 -0
  476. package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +210 -0
  477. package/pennyfarthing-dist/personas/themes/star-wars.yaml +303 -0
  478. package/pennyfarthing-dist/personas/themes/succession.yaml +300 -0
  479. package/pennyfarthing-dist/personas/themes/superfriends.yaml +208 -0
  480. package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +236 -0
  481. package/pennyfarthing-dist/personas/themes/the-americans.yaml +300 -0
  482. package/pennyfarthing-dist/personas/themes/the-crown.yaml +300 -0
  483. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +213 -0
  484. package/pennyfarthing-dist/personas/themes/the-good-place.yaml +322 -0
  485. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +353 -0
  486. package/pennyfarthing-dist/personas/themes/the-odyssey.yaml +300 -0
  487. package/pennyfarthing-dist/personas/themes/the-office.yaml +330 -0
  488. package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +308 -0
  489. package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +300 -0
  490. package/pennyfarthing-dist/personas/themes/the-wire.yaml +311 -0
  491. package/pennyfarthing-dist/personas/themes/the-witcher.yaml +300 -0
  492. package/pennyfarthing-dist/personas/themes/twin-peaks.yaml +302 -0
  493. package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +300 -0
  494. package/pennyfarthing-dist/personas/themes/watchmen.yaml +291 -0
  495. package/pennyfarthing-dist/personas/themes/west-wing.yaml +291 -0
  496. package/pennyfarthing-dist/personas/themes/world-explorers.yaml +320 -0
  497. package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +307 -0
  498. package/pennyfarthing-dist/personas/themes/x-files.yaml +302 -0
  499. package/pennyfarthing-dist/scripts/add-short-names.mjs +264 -0
  500. package/pennyfarthing-dist/scripts/agent-session.sh +367 -0
  501. package/pennyfarthing-dist/scripts/check-context.sh +187 -0
  502. package/pennyfarthing-dist/scripts/check.sh +497 -0
  503. package/pennyfarthing-dist/scripts/deploy.sh +284 -0
  504. package/pennyfarthing-dist/scripts/doctor-dogfood.sh +360 -0
  505. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +61 -0
  506. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +66 -0
  507. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +35 -0
  508. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +166 -0
  509. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +50 -0
  510. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +71 -0
  511. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +54 -0
  512. package/pennyfarthing-dist/scripts/hooks/session-start.sh +98 -0
  513. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +59 -0
  514. package/pennyfarthing-dist/scripts/install-git-hooks.sh +91 -0
  515. package/pennyfarthing-dist/scripts/prime.sh +161 -0
  516. package/pennyfarthing-dist/scripts/release.sh +198 -0
  517. package/pennyfarthing-dist/scripts/repo-utils.sh +778 -0
  518. package/pennyfarthing-dist/scripts/run-ci.sh +219 -0
  519. package/pennyfarthing-dist/scripts/run.sh +65 -0
  520. package/pennyfarthing-dist/scripts/statusline.sh +264 -0
  521. package/pennyfarthing-dist/scripts/tests/check.test.sh +582 -0
  522. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +107 -0
  523. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +597 -0
  524. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +514 -0
  525. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +517 -0
  526. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +331 -0
  527. package/pennyfarthing-dist/scripts/uninstall.sh +271 -0
  528. package/pennyfarthing-dist/scripts/utils/background-tasks.sh +177 -0
  529. package/pennyfarthing-dist/scripts/utils/check-status.sh +251 -0
  530. package/pennyfarthing-dist/scripts/utils/checkpoint.sh +136 -0
  531. package/pennyfarthing-dist/scripts/utils/common.sh +157 -0
  532. package/pennyfarthing-dist/scripts/utils/create-feature-branches.sh +230 -0
  533. package/pennyfarthing-dist/scripts/utils/file-lock.sh +269 -0
  534. package/pennyfarthing-dist/scripts/utils/find-related-work.sh +231 -0
  535. package/pennyfarthing-dist/scripts/utils/find-root.sh +33 -0
  536. package/pennyfarthing-dist/scripts/utils/generate-skill-docs.sh +110 -0
  537. package/pennyfarthing-dist/scripts/utils/git-status-all.sh +127 -0
  538. package/pennyfarthing-dist/scripts/utils/ground-truth-judge.py +289 -0
  539. package/pennyfarthing-dist/scripts/utils/jira/jira-lib.mjs +443 -0
  540. package/pennyfarthing-dist/scripts/utils/jira/jira-sync-story.mjs +208 -0
  541. package/pennyfarthing-dist/scripts/utils/jira/jira-sync.mjs +198 -0
  542. package/pennyfarthing-dist/scripts/utils/jira-claim-story.sh +162 -0
  543. package/pennyfarthing-dist/scripts/utils/jira-lib.sh +463 -0
  544. package/pennyfarthing-dist/scripts/utils/jira-sync-story.sh +8 -0
  545. package/pennyfarthing-dist/scripts/utils/jira-sync.sh +8 -0
  546. package/pennyfarthing-dist/scripts/utils/log-skill-usage.sh +74 -0
  547. package/pennyfarthing-dist/scripts/utils/logging.sh +186 -0
  548. package/pennyfarthing-dist/scripts/utils/repo-scan.sh +141 -0
  549. package/pennyfarthing-dist/scripts/utils/retry.sh +76 -0
  550. package/pennyfarthing-dist/scripts/utils/run-timestamp.sh +7 -0
  551. package/pennyfarthing-dist/scripts/utils/session-cleanup.sh +319 -0
  552. package/pennyfarthing-dist/scripts/utils/skill-usage-report.sh +193 -0
  553. package/pennyfarthing-dist/scripts/utils/sprint-common.sh +286 -0
  554. package/pennyfarthing-dist/scripts/utils/sprint-metrics.sh +241 -0
  555. package/pennyfarthing-dist/scripts/utils/swebench-judge.py +400 -0
  556. package/pennyfarthing-dist/scripts/utils/sync-epic-to-jira.sh +16 -0
  557. package/pennyfarthing-dist/scripts/utils/test-setup.sh +337 -0
  558. package/pennyfarthing-dist/scripts/utils/validate-subagent-frontmatter.sh +160 -0
  559. package/pennyfarthing-dist/scripts/worktree-manager.sh +498 -0
  560. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +236 -0
  561. package/pennyfarthing-dist/skills/changelog/SKILL.md +367 -0
  562. package/pennyfarthing-dist/skills/code-review/SKILL.md +168 -0
  563. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +268 -0
  564. package/pennyfarthing-dist/skills/cyclist/SKILL.md +117 -0
  565. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +421 -0
  566. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +258 -0
  567. package/pennyfarthing-dist/skills/jira/SKILL.md +281 -0
  568. package/pennyfarthing-dist/skills/judge/SKILL.md +524 -0
  569. package/pennyfarthing-dist/skills/just/SKILL.md +160 -0
  570. package/pennyfarthing-dist/skills/mermaid/SKILL.md +240 -0
  571. package/pennyfarthing-dist/skills/otel/skill.md +222 -0
  572. package/pennyfarthing-dist/skills/permissions/skill.md +172 -0
  573. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +173 -0
  574. package/pennyfarthing-dist/skills/skill-registry.schema.json +102 -0
  575. package/pennyfarthing-dist/skills/skill-registry.yaml +335 -0
  576. package/pennyfarthing-dist/skills/sprint-context/SKILL.md +120 -0
  577. package/pennyfarthing-dist/skills/story-management/SKILL.md +208 -0
  578. package/pennyfarthing-dist/skills/testing/SKILL.md +99 -0
  579. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +124 -0
  580. package/pennyfarthing-dist/skills/theme/skill.md +129 -0
  581. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +169 -0
  582. package/pennyfarthing-dist/skills/workflow/SKILL.md +160 -0
  583. package/pennyfarthing-dist/skills/yq/SKILL.md +264 -0
  584. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +187 -0
  585. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +59 -0
  586. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +276 -0
  587. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +61 -0
  588. package/pennyfarthing-dist/templates/persona-config.yaml.template +22 -0
  589. package/pennyfarthing-dist/templates/preferences.yaml.template +15 -0
  590. package/pennyfarthing-dist/templates/settings.local.json.template +90 -0
  591. package/pennyfarthing-dist/templates/setup-env.sh.template +18 -0
  592. package/pennyfarthing-dist/templates/shared-context.md.template +70 -0
  593. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +40 -0
  594. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +37 -0
  595. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +34 -0
  596. package/pennyfarthing-dist/workflows/agent-docs.yaml +70 -0
  597. package/pennyfarthing-dist/workflows/bdd.yaml +58 -0
  598. package/pennyfarthing-dist/workflows/tdd.yaml +50 -0
  599. package/pennyfarthing-dist/workflows/trivial.yaml +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-face.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-face.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAgBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAgCxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAuC5D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAoG1F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjE"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Chernoff Face Generator - OCEAN → SVG
3
+ *
4
+ * Story 11-3: Build Chernoff face generator (OCEAN → SVG)
5
+ *
6
+ * This module takes OCEAN personality scores and generates SVG Chernoff faces.
7
+ * Mapping follows the OCEAN-TO-FACE.md specification.
8
+ */
9
+ import { readFileSync, existsSync } from 'fs';
10
+ import { join, dirname } from 'path';
11
+ import { fileURLToPath } from 'url';
12
+ import { parse as parseYaml } from 'yaml';
13
+ import { findMonorepoRoot } from '../cli/utils/files.js';
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = dirname(__filename);
16
+ // Find monorepo root by walking up from current directory
17
+ const projectRoot = findMonorepoRoot(__dirname);
18
+ const themesDir = join(projectRoot, 'pennyfarthing-dist', 'personas', 'themes');
19
+ // Pastel background colors by agent role
20
+ const AGENT_COLORS = {
21
+ orchestrator: '#E8D5E8', // Soft lavender
22
+ sm: '#D5E8D5', // Soft mint green
23
+ tea: '#D5E0E8', // Soft sky blue
24
+ dev: '#E8E8D5', // Soft cream
25
+ reviewer: '#E8D5D5', // Soft rose
26
+ architect: '#D5D8E8', // Soft periwinkle
27
+ pm: '#E8DDD5', // Soft peach
28
+ 'tech-writer': '#D5E8E8', // Soft cyan
29
+ 'ux-designer': '#E8D8E8', // Soft orchid
30
+ devops: '#DDE8D5', // Soft sage
31
+ };
32
+ /**
33
+ * Load OCEAN scores from a theme YAML file for a specific agent
34
+ */
35
+ export function loadThemeOcean(theme, agent) {
36
+ const themePath = join(themesDir, `${theme}.yaml`);
37
+ if (!existsSync(themePath)) {
38
+ throw new Error(`Theme not found: ${theme}`);
39
+ }
40
+ const content = readFileSync(themePath, 'utf-8');
41
+ const parsed = parseYaml(content);
42
+ const agents = parsed.agents;
43
+ if (!agents) {
44
+ throw new Error(`Theme ${theme} has no agents section`);
45
+ }
46
+ const agentData = agents[agent];
47
+ if (!agentData) {
48
+ throw new Error(`Agent not found: ${agent} in theme ${theme}`);
49
+ }
50
+ const ocean = agentData.ocean;
51
+ if (!ocean) {
52
+ throw new Error(`Agent ${agent} in theme ${theme} has no OCEAN scores`);
53
+ }
54
+ return {
55
+ O: ocean.O,
56
+ C: ocean.C,
57
+ E: ocean.E,
58
+ A: ocean.A,
59
+ N: ocean.N,
60
+ };
61
+ }
62
+ /**
63
+ * Map OCEAN scores to SVG face parameters per OCEAN-TO-FACE.md spec
64
+ *
65
+ * Mappings (adjusted for visibility):
66
+ * - O (Openness) → Eye size: 1→8px, 5→18px (more extreme)
67
+ * - C (Conscientiousness) → Face shape: 1→95x95 round, 5→85x105 angular (reduced variance)
68
+ * - E (Extraversion) → Mouth width: 1→12px, 5→50px (more extreme)
69
+ * - A (Agreeableness) → Eyebrow angle: 1→-20°, 5→+20° (more extreme)
70
+ * - N (Neuroticism) → Stroke width: 1→1.5px, 5→4px (more visible)
71
+ */
72
+ export function oceanToParams(ocean) {
73
+ // Linear interpolation helper
74
+ const lerp = (value, min, max) => {
75
+ // value is 1-5, normalize to 0-1 then interpolate
76
+ const t = (value - 1) / 4;
77
+ return min + t * (max - min);
78
+ };
79
+ // Openness → Eye Size (8px to 18px - more extreme range)
80
+ const eyeRadius = Math.round(lerp(ocean.O, 8, 18));
81
+ const pupilRadius = Math.round(lerp(ocean.O, 3, 8));
82
+ // Conscientiousness → Face Shape (dramatic variance)
83
+ // C=1: Wide round face (110x90), C=5: Narrow tall angular face (70x120)
84
+ const faceWidth = Math.round(lerp(ocean.C, 110, 70));
85
+ const faceHeight = Math.round(lerp(ocean.C, 90, 120));
86
+ const cornerRadius = Math.round(lerp(ocean.C, 50, 5)); // Round to angular
87
+ // Extraversion → Mouth (width 12 to 50, curve flat to strong - more extreme)
88
+ const mouthWidth = Math.round(lerp(ocean.E, 12, 50));
89
+ const mouthCurve = Math.round(lerp(ocean.E, -5, 20)); // Negative = frown, positive = smile
90
+ // Agreeableness → Eyebrow Angle (-20° to +20° - more extreme)
91
+ const eyebrowAngle = Math.round(lerp(ocean.A, -20, 20));
92
+ // Neuroticism → Stroke Width (1.5px to 4px - more visible)
93
+ const strokeWidth = lerp(ocean.N, 1.5, 4);
94
+ return {
95
+ eyeRadius,
96
+ pupilRadius,
97
+ faceWidth,
98
+ faceHeight,
99
+ cornerRadius,
100
+ mouthWidth,
101
+ mouthCurve,
102
+ eyebrowAngle,
103
+ strokeWidth,
104
+ };
105
+ }
106
+ /**
107
+ * Generate SVG string from face parameters
108
+ * @param params - Face parameters from oceanToParams
109
+ * @param backgroundColor - Optional background color (hex string)
110
+ */
111
+ export function generateSvgFromParams(params, backgroundColor) {
112
+ const { eyeRadius, pupilRadius, faceWidth, faceHeight, cornerRadius: _cornerRadius, mouthWidth, mouthCurve, eyebrowAngle, strokeWidth, } = params;
113
+ // ViewBox is 200x200, center at 100,100
114
+ const cx = 100;
115
+ const cy = 100;
116
+ // Face ellipse (centered)
117
+ const faceRx = faceWidth / 2;
118
+ const faceRy = faceHeight / 2;
119
+ // Eye positions (relative to center)
120
+ const eyeY = cy - faceRy * 0.15; // Slightly above center
121
+ const eyeSpacing = faceWidth * 0.25;
122
+ const leftEyeX = cx - eyeSpacing;
123
+ const rightEyeX = cx + eyeSpacing;
124
+ // Mouth position
125
+ const mouthY = cy + faceRy * 0.35;
126
+ const mouthHalfWidth = mouthWidth / 2;
127
+ // Mouth path (quadratic bezier for curve)
128
+ // In SVG, Y increases downward. For a smile, control point must be BELOW the line (larger Y)
129
+ // Positive mouthCurve = smile (control point BELOW line, curve opens upward)
130
+ // Negative mouthCurve = frown (control point ABOVE line, curve opens downward)
131
+ const mouthStartX = cx - mouthHalfWidth;
132
+ const mouthEndX = cx + mouthHalfWidth;
133
+ const mouthControlY = mouthY + mouthCurve; // Add: positive curve = point goes down = smile opens up
134
+ const mouthPath = `M ${mouthStartX} ${mouthY} Q ${cx} ${mouthControlY} ${mouthEndX} ${mouthY}`;
135
+ // Eyebrow positions and rotation
136
+ const eyebrowY = eyeY - eyeRadius - 8;
137
+ const eyebrowLength = eyeRadius * 1.5;
138
+ // Calculate vertical offset for eyebrow tilt
139
+ // Positive angle (friendly): inner ends UP, outer ends DOWN
140
+ // Negative angle (stern): inner ends DOWN, outer ends UP
141
+ const browTilt = Math.sin((eyebrowAngle * Math.PI) / 180) * (eyebrowLength / 2);
142
+ // Left eyebrow: outer=left (x1), inner=right (x2)
143
+ const leftBrowOuterX = leftEyeX - eyebrowLength / 2;
144
+ const leftBrowInnerX = leftEyeX + eyebrowLength / 2;
145
+ const leftBrowOuterY = eyebrowY + browTilt; // Positive tilt pushes outer DOWN
146
+ const leftBrowInnerY = eyebrowY - browTilt; // Positive tilt pushes inner UP
147
+ // Right eyebrow: inner=left (x1), outer=right (x2) - mirrored
148
+ const rightBrowInnerX = rightEyeX - eyebrowLength / 2;
149
+ const rightBrowOuterX = rightEyeX + eyebrowLength / 2;
150
+ const rightBrowInnerY = eyebrowY - browTilt; // Positive tilt pushes inner UP
151
+ const rightBrowOuterY = eyebrowY + browTilt; // Positive tilt pushes outer DOWN
152
+ // Background (optional)
153
+ const bgRect = backgroundColor
154
+ ? `\n <!-- Background -->\n <rect x="0" y="0" width="200" height="200" fill="${backgroundColor}" />\n`
155
+ : '';
156
+ // Build SVG
157
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">${bgRect}
158
+ <!-- Face -->
159
+ <ellipse cx="${cx}" cy="${cy}" rx="${faceRx}" ry="${faceRy}"
160
+ fill="none" stroke="black" stroke-width="${strokeWidth}" />
161
+
162
+ <!-- Left Eye -->
163
+ <circle cx="${leftEyeX}" cy="${eyeY}" r="${eyeRadius}"
164
+ fill="none" stroke="black" stroke-width="${strokeWidth}" />
165
+ <circle cx="${leftEyeX}" cy="${eyeY}" r="${pupilRadius}"
166
+ fill="black" stroke="none" />
167
+
168
+ <!-- Right Eye -->
169
+ <circle cx="${rightEyeX}" cy="${eyeY}" r="${eyeRadius}"
170
+ fill="none" stroke="black" stroke-width="${strokeWidth}" />
171
+ <circle cx="${rightEyeX}" cy="${eyeY}" r="${pupilRadius}"
172
+ fill="black" stroke="none" />
173
+
174
+ <!-- Left Eyebrow -->
175
+ <line x1="${leftBrowOuterX}" y1="${leftBrowOuterY}"
176
+ x2="${leftBrowInnerX}" y2="${leftBrowInnerY}"
177
+ stroke="black" stroke-width="${strokeWidth}" stroke-linecap="round" />
178
+
179
+ <!-- Right Eyebrow -->
180
+ <line x1="${rightBrowInnerX}" y1="${rightBrowInnerY}"
181
+ x2="${rightBrowOuterX}" y2="${rightBrowOuterY}"
182
+ stroke="black" stroke-width="${strokeWidth}" stroke-linecap="round" />
183
+
184
+ <!-- Mouth -->
185
+ <path d="${mouthPath}"
186
+ fill="none" stroke="black" stroke-width="${strokeWidth}" stroke-linecap="round" />
187
+ </svg>`;
188
+ return svg;
189
+ }
190
+ /**
191
+ * Main function: Generate SVG face for a theme's agent
192
+ */
193
+ export function generateFace(theme, agent) {
194
+ const ocean = loadThemeOcean(theme, agent);
195
+ const params = oceanToParams(ocean);
196
+ const backgroundColor = AGENT_COLORS[agent] || '#F0F0F0'; // Default light gray
197
+ return generateSvgFromParams(params, backgroundColor);
198
+ }
199
+ //# sourceMappingURL=generate-face.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-face.js","sourceRoot":"","sources":["../../src/scripts/generate-face.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Tests for Story 11-3: Build Chernoff Face Generator (OCEAN → SVG)
3
+ *
4
+ * These tests verify:
5
+ * AC1: scripts/generate-face.ts functional (module exists and exports work)
6
+ * AC2: Takes theme + agent as input, outputs SVG
7
+ * AC3: Faces visually distinct across OCEAN profiles
8
+ * AC4: SVGs render correctly in browsers and markdown (valid SVG structure)
9
+ *
10
+ * Run with: npm test
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=generate-face.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-face.test.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-face.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Tests for Story 11-3: Build Chernoff Face Generator (OCEAN → SVG)
3
+ *
4
+ * These tests verify:
5
+ * AC1: scripts/generate-face.ts functional (module exists and exports work)
6
+ * AC2: Takes theme + agent as input, outputs SVG
7
+ * AC3: Faces visually distinct across OCEAN profiles
8
+ * AC4: SVGs render correctly in browsers and markdown (valid SVG structure)
9
+ *
10
+ * Run with: npm test
11
+ */
12
+ import { describe, it } from 'node:test';
13
+ import assert from 'node:assert';
14
+ import { dirname } from 'path';
15
+ import { fileURLToPath } from 'url';
16
+ import { findMonorepoRoot } from '../cli/utils/files.js';
17
+ const __filename = fileURLToPath(import.meta.url);
18
+ const __dirname = dirname(__filename);
19
+ // Find monorepo root by walking up from current directory
20
+ const _projectRoot = findMonorepoRoot(__dirname);
21
+ // ============================================================================
22
+ // AC1: scripts/generate-face.ts functional
23
+ // ============================================================================
24
+ describe('AC1: Generator Module Exists and Exports', () => {
25
+ it('should export generateFace function', async () => {
26
+ // This will fail until the module is created
27
+ const module = await import('./generate-face.js');
28
+ assert.ok(typeof module.generateFace === 'function', 'generateFace should be a function');
29
+ });
30
+ it('should export oceanToParams function for mapping', async () => {
31
+ const module = await import('./generate-face.js');
32
+ assert.ok(typeof module.oceanToParams === 'function', 'oceanToParams should be a function');
33
+ });
34
+ it('should export loadThemeOcean function for YAML parsing', async () => {
35
+ const module = await import('./generate-face.js');
36
+ assert.ok(typeof module.loadThemeOcean === 'function', 'loadThemeOcean should be a function');
37
+ });
38
+ });
39
+ // ============================================================================
40
+ // AC2: Takes theme + agent as input, outputs SVG
41
+ // ============================================================================
42
+ describe('AC2: Theme + Agent Input → SVG Output', () => {
43
+ it('should load OCEAN scores from deadwood theme for sm agent', async () => {
44
+ const { loadThemeOcean } = await import('./generate-face.js');
45
+ const ocean = loadThemeOcean('deadwood', 'sm');
46
+ assert.ok(ocean, 'Should return OCEAN object');
47
+ assert.strictEqual(typeof ocean.O, 'number', 'O should be a number');
48
+ assert.strictEqual(typeof ocean.C, 'number', 'C should be a number');
49
+ assert.strictEqual(typeof ocean.E, 'number', 'E should be a number');
50
+ assert.strictEqual(typeof ocean.A, 'number', 'A should be a number');
51
+ assert.strictEqual(typeof ocean.N, 'number', 'N should be a number');
52
+ });
53
+ it('should generate SVG string from theme and agent', async () => {
54
+ const { generateFace } = await import('./generate-face.js');
55
+ const svg = generateFace('deadwood', 'sm');
56
+ assert.ok(typeof svg === 'string', 'Should return string');
57
+ assert.ok(svg.includes('<svg'), 'Should contain SVG opening tag');
58
+ assert.ok(svg.includes('</svg>'), 'Should contain SVG closing tag');
59
+ });
60
+ it('should work for all 10 agent roles', async () => {
61
+ const { generateFace } = await import('./generate-face.js');
62
+ const roles = [
63
+ 'orchestrator',
64
+ 'sm',
65
+ 'tea',
66
+ 'dev',
67
+ 'reviewer',
68
+ 'architect',
69
+ 'pm',
70
+ 'tech-writer',
71
+ 'ux-designer',
72
+ 'devops',
73
+ ];
74
+ for (const role of roles) {
75
+ const svg = generateFace('deadwood', role);
76
+ assert.ok(svg.includes('<svg'), `Should generate SVG for ${role}`);
77
+ }
78
+ });
79
+ it('should throw error for non-existent theme', async () => {
80
+ const { generateFace } = await import('./generate-face.js');
81
+ assert.throws(() => generateFace('nonexistent-theme', 'sm'), /theme.*not found/i, 'Should throw error for missing theme');
82
+ });
83
+ it('should throw error for non-existent agent', async () => {
84
+ const { generateFace } = await import('./generate-face.js');
85
+ assert.throws(() => generateFace('deadwood', 'nonexistent-agent'), /agent.*not found/i, 'Should throw error for missing agent');
86
+ });
87
+ });
88
+ // ============================================================================
89
+ // AC3: Faces visually distinct across OCEAN profiles
90
+ // ============================================================================
91
+ describe('AC3: OCEAN → SVG Parameter Mapping', () => {
92
+ // Test the mapping function directly with known values
93
+ it('should map O=1 to small eye radius (8px)', async () => {
94
+ const { oceanToParams } = await import('./generate-face.js');
95
+ const params = oceanToParams({ O: 1, C: 3, E: 3, A: 3, N: 3 });
96
+ assert.strictEqual(params.eyeRadius, 8, 'O=1 should map to 8px eye radius');
97
+ });
98
+ it('should map O=5 to large eye radius (18px)', async () => {
99
+ const { oceanToParams } = await import('./generate-face.js');
100
+ const params = oceanToParams({ O: 5, C: 3, E: 3, A: 3, N: 3 });
101
+ assert.strictEqual(params.eyeRadius, 18, 'O=5 should map to 18px eye radius');
102
+ });
103
+ it('should map C=1 to wide round face (110x90)', async () => {
104
+ const { oceanToParams } = await import('./generate-face.js');
105
+ const params = oceanToParams({ O: 3, C: 1, E: 3, A: 3, N: 3 });
106
+ assert.strictEqual(params.faceWidth, 110, 'C=1 should map to 110px face width');
107
+ assert.strictEqual(params.faceHeight, 90, 'C=1 should map to 90px face height');
108
+ assert.strictEqual(params.cornerRadius, 50, 'C=1 should have very round corners');
109
+ });
110
+ it('should map C=5 to narrow angular face (70x120)', async () => {
111
+ const { oceanToParams } = await import('./generate-face.js');
112
+ const params = oceanToParams({ O: 3, C: 5, E: 3, A: 3, N: 3 });
113
+ assert.strictEqual(params.faceWidth, 70, 'C=5 should map to 70px face width');
114
+ assert.strictEqual(params.faceHeight, 120, 'C=5 should map to 120px face height');
115
+ assert.strictEqual(params.cornerRadius, 5, 'C=5 should have angular corners');
116
+ });
117
+ it('should map E=1 to narrow mouth (12px)', async () => {
118
+ const { oceanToParams } = await import('./generate-face.js');
119
+ const params = oceanToParams({ O: 3, C: 3, E: 1, A: 3, N: 3 });
120
+ assert.strictEqual(params.mouthWidth, 12, 'E=1 should map to 12px mouth width');
121
+ });
122
+ it('should map E=5 to wide mouth (50px)', async () => {
123
+ const { oceanToParams } = await import('./generate-face.js');
124
+ const params = oceanToParams({ O: 3, C: 3, E: 5, A: 3, N: 3 });
125
+ assert.strictEqual(params.mouthWidth, 50, 'E=5 should map to 50px mouth width');
126
+ });
127
+ it('should map A=1 to angled-down eyebrows (-20 degrees)', async () => {
128
+ const { oceanToParams } = await import('./generate-face.js');
129
+ const params = oceanToParams({ O: 3, C: 3, E: 3, A: 1, N: 3 });
130
+ assert.strictEqual(params.eyebrowAngle, -20, 'A=1 should map to -20 degree eyebrows');
131
+ });
132
+ it('should map A=5 to raised eyebrows (+20 degrees)', async () => {
133
+ const { oceanToParams } = await import('./generate-face.js');
134
+ const params = oceanToParams({ O: 3, C: 3, E: 3, A: 5, N: 3 });
135
+ assert.strictEqual(params.eyebrowAngle, 20, 'A=5 should map to +20 degree eyebrows');
136
+ });
137
+ it('should map N=1 to light stroke (1.5px)', async () => {
138
+ const { oceanToParams } = await import('./generate-face.js');
139
+ const params = oceanToParams({ O: 3, C: 3, E: 3, A: 3, N: 1 });
140
+ assert.strictEqual(params.strokeWidth, 1.5, 'N=1 should map to 1.5px stroke');
141
+ });
142
+ it('should map N=5 to heavy stroke (4px)', async () => {
143
+ const { oceanToParams } = await import('./generate-face.js');
144
+ const params = oceanToParams({ O: 3, C: 3, E: 3, A: 3, N: 5 });
145
+ assert.strictEqual(params.strokeWidth, 4, 'N=5 should map to 4px stroke');
146
+ });
147
+ });
148
+ describe('AC3: Extreme Profiles Produce Different SVGs', () => {
149
+ it('should produce different SVGs for 1-1-1-1-1 vs 5-5-5-5-5', async () => {
150
+ const { oceanToParams, generateSvgFromParams } = await import('./generate-face.js');
151
+ const stoic = oceanToParams({ O: 1, C: 1, E: 1, A: 1, N: 1 });
152
+ const intense = oceanToParams({ O: 5, C: 5, E: 5, A: 5, N: 5 });
153
+ const stoicSvg = generateSvgFromParams(stoic);
154
+ const intenseSvg = generateSvgFromParams(intense);
155
+ assert.notStrictEqual(stoicSvg, intenseSvg, 'Extreme profiles should produce different SVGs');
156
+ // Verify specific differences exist
157
+ assert.ok(stoicSvg.includes('r="8"') || stoicSvg.includes('r="8px"'), 'Stoic should have small eyes (8px)');
158
+ assert.ok(intenseSvg.includes('r="18"') || intenseSvg.includes('r="18px"'), 'Intense should have large eyes (18px)');
159
+ });
160
+ it('should produce measurably different parameters for each OCEAN value', async () => {
161
+ const { oceanToParams } = await import('./generate-face.js');
162
+ // Generate params for each value of O (1-5)
163
+ const openness1 = oceanToParams({ O: 1, C: 3, E: 3, A: 3, N: 3 });
164
+ const openness3 = oceanToParams({ O: 3, C: 3, E: 3, A: 3, N: 3 });
165
+ const openness5 = oceanToParams({ O: 5, C: 3, E: 3, A: 3, N: 3 });
166
+ // Eye radius should increase with O
167
+ assert.ok(openness1.eyeRadius < openness3.eyeRadius, 'O=1 should have smaller eyes than O=3');
168
+ assert.ok(openness3.eyeRadius < openness5.eyeRadius, 'O=3 should have smaller eyes than O=5');
169
+ });
170
+ });
171
+ // ============================================================================
172
+ // AC4: SVGs render correctly in browsers and markdown
173
+ // ============================================================================
174
+ describe('AC4: Valid SVG Structure', () => {
175
+ it('should include viewBox attribute for scaling', async () => {
176
+ const { generateFace } = await import('./generate-face.js');
177
+ const svg = generateFace('deadwood', 'sm');
178
+ assert.ok(svg.includes('viewBox="0 0 200 200"'), 'Should have 200x200 viewBox for proper scaling');
179
+ });
180
+ it('should include xmlns attribute for browser compatibility', async () => {
181
+ const { generateFace } = await import('./generate-face.js');
182
+ const svg = generateFace('deadwood', 'sm');
183
+ assert.ok(svg.includes('xmlns="http://www.w3.org/2000/svg"'), 'Should have SVG xmlns for browser rendering');
184
+ });
185
+ it('should contain face shape element', async () => {
186
+ const { generateFace } = await import('./generate-face.js');
187
+ const svg = generateFace('deadwood', 'sm');
188
+ // Face could be ellipse, rect with rx/ry, or path
189
+ const hasFaceShape = svg.includes('<ellipse') ||
190
+ svg.includes('<rect') ||
191
+ svg.includes('<circle');
192
+ assert.ok(hasFaceShape, 'Should contain face shape element');
193
+ });
194
+ it('should contain eye elements', async () => {
195
+ const { generateFace } = await import('./generate-face.js');
196
+ const svg = generateFace('deadwood', 'sm');
197
+ // Eyes are typically circles or ellipses
198
+ // Count occurrences - should have at least 2 for eyes
199
+ const circleCount = (svg.match(/<circle/g) || []).length;
200
+ const ellipseCount = (svg.match(/<ellipse/g) || []).length;
201
+ assert.ok(circleCount >= 2 || ellipseCount >= 2, 'Should contain at least 2 eye elements');
202
+ });
203
+ it('should contain mouth element', async () => {
204
+ const { generateFace } = await import('./generate-face.js');
205
+ const svg = generateFace('deadwood', 'sm');
206
+ // Mouth is typically a path or line
207
+ const hasMouth = svg.includes('<path') || svg.includes('<line');
208
+ assert.ok(hasMouth, 'Should contain mouth path or line');
209
+ });
210
+ it('should be well-formed XML', async () => {
211
+ const { generateFace } = await import('./generate-face.js');
212
+ const svg = generateFace('deadwood', 'sm');
213
+ // Check basic XML well-formedness
214
+ assert.ok(svg.startsWith('<svg'), 'Should start with <svg');
215
+ assert.ok(svg.endsWith('</svg>'), 'Should end with </svg>');
216
+ // Check that all opened tags have closing counterparts
217
+ // (This is a simple check - real XML validation would use a parser)
218
+ const openTags = svg.match(/<[a-z]+[^/>]*>/gi) || [];
219
+ const closeTags = svg.match(/<\/[a-z]+>/gi) || [];
220
+ const selfClosing = svg.match(/<[a-z]+[^>]*\/>/gi) || [];
221
+ // Note: This is approximate - real validation needed for production
222
+ assert.ok(openTags.length <= closeTags.length + selfClosing.length + 1, 'Tags should be properly closed');
223
+ });
224
+ it('should use stroke-width for line weights', async () => {
225
+ const { generateFace } = await import('./generate-face.js');
226
+ const svg = generateFace('deadwood', 'sm');
227
+ assert.ok(svg.includes('stroke-width'), 'Should use stroke-width for line weight control');
228
+ });
229
+ it('should be monochrome (black strokes, no fill or light fill)', async () => {
230
+ const { generateFace } = await import('./generate-face.js');
231
+ const svg = generateFace('deadwood', 'sm');
232
+ // Should have black or no stroke color
233
+ const hasStroke = svg.includes('stroke=');
234
+ const strokeIsBlack = svg.includes('stroke="black"') ||
235
+ svg.includes('stroke="#000"') ||
236
+ svg.includes('stroke="currentColor"');
237
+ assert.ok(!hasStroke || strokeIsBlack, 'Strokes should be black or currentColor');
238
+ });
239
+ });
240
+ // ============================================================================
241
+ // Integration: Full Pipeline Test
242
+ // ============================================================================
243
+ describe('Integration: Full Face Generation Pipeline', () => {
244
+ it('should generate valid SVG for all 10 anchor themes', async () => {
245
+ const { generateFace } = await import('./generate-face.js');
246
+ const themes = [
247
+ 'deadwood',
248
+ 'firefly',
249
+ 'breaking-bad',
250
+ 'the-good-place',
251
+ 'star-trek-tng',
252
+ 'discworld',
253
+ 'fargo',
254
+ 'succession',
255
+ 'mass-effect',
256
+ 'software-pioneers',
257
+ ];
258
+ for (const theme of themes) {
259
+ const svg = generateFace(theme, 'sm');
260
+ assert.ok(svg.includes('<svg') && svg.includes('</svg>'), `Should generate valid SVG for ${theme}`);
261
+ }
262
+ });
263
+ it('should produce 100 unique face variations (10 themes × 10 agents)', async () => {
264
+ const { generateFace } = await import('./generate-face.js');
265
+ const themes = [
266
+ 'deadwood',
267
+ 'firefly',
268
+ 'breaking-bad',
269
+ 'the-good-place',
270
+ 'star-trek-tng',
271
+ 'discworld',
272
+ 'fargo',
273
+ 'succession',
274
+ 'mass-effect',
275
+ 'software-pioneers',
276
+ ];
277
+ const roles = [
278
+ 'orchestrator',
279
+ 'sm',
280
+ 'tea',
281
+ 'dev',
282
+ 'reviewer',
283
+ 'architect',
284
+ 'pm',
285
+ 'tech-writer',
286
+ 'ux-designer',
287
+ 'devops',
288
+ ];
289
+ const svgSet = new Set();
290
+ for (const theme of themes) {
291
+ for (const role of roles) {
292
+ const svg = generateFace(theme, role);
293
+ svgSet.add(svg);
294
+ }
295
+ }
296
+ // Not all 100 will be unique (some characters share OCEAN scores)
297
+ // but there should be significant variation
298
+ assert.ok(svgSet.size >= 20, `Should have at least 20 unique face variations, got ${svgSet.size}`);
299
+ });
300
+ });
301
+ //# sourceMappingURL=generate-face.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-face.test.js","sourceRoot":"","sources":["../../src/scripts/generate-face.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,0DAA0D;AAC1D,MAAM,YAAY,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;AAEjD,+EAA+E;AAC/E,2CAA2C;AAC3C,+EAA+E;AAE/E,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,6CAA6C;QAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAClD,MAAM,CAAC,EAAE,CACP,OAAO,MAAM,CAAC,YAAY,KAAK,UAAU,EACzC,mCAAmC,CACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAClD,MAAM,CAAC,EAAE,CACP,OAAO,MAAM,CAAC,aAAa,KAAK,UAAU,EAC1C,oCAAoC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAClD,MAAM,CAAC,EAAE,CACP,OAAO,MAAM,CAAC,cAAc,KAAK,UAAU,EAC3C,qCAAqC,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,iDAAiD;AACjD,+EAA+E;AAE/E,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE/C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;QAC/C,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QACrE,MAAM,CAAC,WAAW,CAAC,OAAO,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3C,MAAM,CAAC,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QAC3D,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,gCAAgC,CAAC,CAAC;QAClE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,gCAAgC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG;YACZ,cAAc;YACd,IAAI;YACJ,KAAK;YACL,KAAK;YACL,UAAU;YACV,WAAW;YACX,IAAI;YACJ,aAAa;YACb,aAAa;YACb,QAAQ;SACT,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,EAAE,CACP,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EACpB,2BAA2B,IAAI,EAAE,CAClC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,YAAY,CAAC,mBAAmB,EAAE,IAAI,CAAC,EAC7C,mBAAmB,EACnB,sCAAsC,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,mBAAmB,CAAC,EACnD,mBAAmB,EACnB,sCAAsC,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,qDAAqD;AACrD,+EAA+E;AAE/E,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,uDAAuD;IAEvD,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,kCAAkC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,mCAAmC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,oCAAoC,CAAC,CAAC;QAChF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,oCAAoC,CAAC,CAAC;QAChF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,EAAE,oCAAoC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,mCAAmC,CAAC,CAAC;QAC9E,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,qCAAqC,CAAC,CAAC;QAClF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,iCAAiC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,oCAAoC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,EAAE,oCAAoC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,uCAAuC,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,EAAE,uCAAuC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,gCAAgC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC5D,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,aAAa,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAEpF,MAAM,KAAK,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAEhE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAElD,MAAM,CAAC,cAAc,CACnB,QAAQ,EACR,UAAU,EACV,gDAAgD,CACjD,CAAC;QAEF,oCAAoC;QACpC,MAAM,CAAC,EAAE,CACP,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC1D,oCAAoC,CACrC,CAAC;QACF,MAAM,CAAC,EAAE,CACP,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAChE,uCAAuC,CACxC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAE7D,4CAA4C;QAC5C,MAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAElE,oCAAoC;QACpC,MAAM,CAAC,EAAE,CACP,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,EACzC,uCAAuC,CACxC,CAAC;QACF,MAAM,CAAC,EAAE,CACP,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,EACzC,uCAAuC,CACxC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,sDAAsD;AACtD,+EAA+E;AAE/E,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3C,MAAM,CAAC,EAAE,CACP,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EACrC,gDAAgD,CACjD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3C,MAAM,CAAC,EAAE,CACP,GAAG,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAClD,6CAA6C,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3C,kDAAkD;QAClD,MAAM,YAAY,GAChB,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;YACxB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;YACrB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAE1B,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,mCAAmC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3C,yCAAyC;QACzC,sDAAsD;QACtD,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACzD,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAE3D,MAAM,CAAC,EAAE,CACP,WAAW,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,EACrC,wCAAwC,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3C,oCAAoC;QACpC,MAAM,QAAQ,GACZ,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEjD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,mCAAmC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3C,kCAAkC;QAClC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC5D,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAE5D,uDAAuD;QACvD,oEAAoE;QACpE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;QAEzD,oEAAoE;QACpE,MAAM,CAAC,EAAE,CACP,QAAQ,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,EAC5D,gCAAgC,CACjC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3C,MAAM,CAAC,EAAE,CACP,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EAC5B,iDAAiD,CAClD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAE3C,uCAAuC;QACvC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,aAAa,GACjB,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC9B,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC7B,GAAG,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;QAExC,MAAM,CAAC,EAAE,CACP,CAAC,SAAS,IAAI,aAAa,EAC3B,yCAAyC,CAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,kCAAkC;AAClC,+EAA+E;AAE/E,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG;YACb,UAAU;YACV,SAAS;YACT,cAAc;YACd,gBAAgB;YAChB,eAAe;YACf,WAAW;YACX,OAAO;YACP,YAAY;YACZ,aAAa;YACb,mBAAmB;SACpB,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,EAAE,CACP,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC9C,iCAAiC,KAAK,EAAE,CACzC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG;YACb,UAAU;YACV,SAAS;YACT,cAAc;YACd,gBAAgB;YAChB,eAAe;YACf,WAAW;YACX,OAAO;YACP,YAAY;YACZ,aAAa;YACb,mBAAmB;SACpB,CAAC;QAEF,MAAM,KAAK,GAAG;YACZ,cAAc;YACd,IAAI;YACJ,KAAK;YACL,KAAK;YACL,UAAU;YACV,WAAW;YACX,IAAI;YACJ,aAAa;YACb,aAAa;YACb,QAAQ;SACT,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QAEjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACtC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,4CAA4C;QAC5C,MAAM,CAAC,EAAE,CACP,MAAM,CAAC,IAAI,IAAI,EAAE,EACjB,uDAAuD,MAAM,CAAC,IAAI,EAAE,CACrE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * OCEAN Face Report Generator
3
+ *
4
+ * Story 11-7: Build slice/report generator
5
+ *
6
+ * Generates filtered face reports and character comparisons with markdown output.
7
+ * Supports filtering by role, theme, and OCEAN dimensions.
8
+ */
9
+ export interface OceanScores {
10
+ O: number;
11
+ C: number;
12
+ E: number;
13
+ A: number;
14
+ N: number;
15
+ }
16
+ export interface CharacterInfo {
17
+ theme: string;
18
+ agent: string;
19
+ character: string;
20
+ ocean: OceanScores;
21
+ }
22
+ export interface OceanFilter {
23
+ dimension: keyof OceanScores;
24
+ operator: '>=' | '<=' | '=' | '>' | '<';
25
+ value: number;
26
+ }
27
+ export interface ReportOptions {
28
+ role?: string;
29
+ theme?: string;
30
+ ocean?: string;
31
+ }
32
+ export interface ReportResult {
33
+ characters: CharacterInfo[];
34
+ markdown: string;
35
+ filter: ReportOptions;
36
+ }
37
+ export interface ComparisonResult {
38
+ characters: CharacterInfo[];
39
+ markdown: string;
40
+ }
41
+ /**
42
+ * Parse an OCEAN filter expression like "O>=4" or "A<=2"
43
+ */
44
+ export declare function parseOceanFilter(expr: string): OceanFilter;
45
+ /**
46
+ * Filter characters by OCEAN dimension expression
47
+ */
48
+ export declare function filterByOcean(expression: string): CharacterInfo[];
49
+ /**
50
+ * Filter characters by agent role
51
+ */
52
+ export declare function filterByRole(role: string): CharacterInfo[];
53
+ /**
54
+ * Filter characters by theme (returns all 10 agents for that theme)
55
+ */
56
+ export declare function filterByTheme(theme: string): CharacterInfo[];
57
+ /**
58
+ * Compare 2-4 characters side-by-side
59
+ */
60
+ export declare function compareCharacters(specs: string[]): ComparisonResult;
61
+ /**
62
+ * Generate a filtered report with markdown output
63
+ */
64
+ export declare function generateReport(options: ReportOptions): ReportResult;
65
+ //# sourceMappingURL=generate-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-report.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-report.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,WAAW,CAAC;IAC7B,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACxC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgKD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAsC1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,CAKjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAO1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAgB5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAkCnE;AAwDD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAgCnE"}