@pennyfarthing/core 7.0.2 → 7.4.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 (692) hide show
  1. package/{packages/core/dist → dist}/cli/commands/cyclist.d.ts +2 -2
  2. package/{packages/core/dist → dist}/cli/commands/cyclist.d.ts.map +1 -1
  3. package/{packages/core/dist → dist}/cli/commands/cyclist.js +8 -9
  4. package/dist/cli/commands/cyclist.js.map +1 -0
  5. package/{packages/core/dist → dist}/cli/commands/cyclist.test.js +6 -4
  6. package/dist/cli/commands/cyclist.test.js.map +1 -0
  7. package/{packages/core/dist → dist}/cli/commands/update.d.ts.map +1 -1
  8. package/{packages/core/dist → dist}/cli/commands/update.js +9 -136
  9. package/dist/cli/commands/update.js.map +1 -0
  10. package/{packages/core/dist → dist}/cli/cyclist-migration.test.js +4 -3
  11. package/{packages/core/dist → dist}/cli/cyclist-migration.test.js.map +1 -1
  12. package/{packages/core/dist → dist}/cli/utils/constants.d.ts +7 -1
  13. package/dist/cli/utils/constants.d.ts.map +1 -0
  14. package/{packages/core/dist → dist}/cli/utils/constants.js +4 -2
  15. package/{packages/core/dist → dist}/cli/utils/constants.js.map +1 -1
  16. package/{packages/core/dist → dist}/cli/utils/themes.d.ts +1 -4
  17. package/{packages/core/dist → dist}/cli/utils/themes.d.ts.map +1 -1
  18. package/{packages/core/dist → dist}/cli/utils/themes.js +2 -22
  19. package/dist/cli/utils/themes.js.map +1 -0
  20. package/dist/cli/utils/themes.test.d.ts +12 -0
  21. package/{packages/core/dist → dist}/cli/utils/themes.test.js +16 -13
  22. package/dist/cli/utils/themes.test.js.map +1 -0
  23. package/{packages/core/dist → dist}/cli/workspace.test.js +5 -8
  24. package/{packages/core/dist → dist}/cli/workspace.test.js.map +1 -1
  25. package/{packages/core/dist → dist}/index.d.ts +1 -0
  26. package/{packages/core/dist → dist}/index.d.ts.map +1 -1
  27. package/{packages/core/dist → dist}/index.js +10 -0
  28. package/{packages/core/dist → dist}/index.js.map +1 -1
  29. package/dist/jira/jira-epic-creation.d.ts +109 -0
  30. package/dist/jira/jira-epic-creation.d.ts.map +1 -0
  31. package/dist/jira/jira-epic-creation.js +253 -0
  32. package/dist/jira/jira-epic-creation.js.map +1 -0
  33. package/dist/jira/jira-epic-creation.test.d.ts +16 -0
  34. package/dist/jira/jira-epic-creation.test.d.ts.map +1 -0
  35. package/dist/jira/jira-epic-creation.test.js +387 -0
  36. package/dist/jira/jira-epic-creation.test.js.map +1 -0
  37. package/dist/jira/jira-sprint-sync.d.ts +247 -0
  38. package/dist/jira/jira-sprint-sync.d.ts.map +1 -0
  39. package/dist/jira/jira-sprint-sync.js +670 -0
  40. package/dist/jira/jira-sprint-sync.js.map +1 -0
  41. package/dist/jira/jira-sprint-sync.test.d.ts +16 -0
  42. package/dist/jira/jira-sprint-sync.test.d.ts.map +1 -0
  43. package/dist/jira/jira-sprint-sync.test.js +845 -0
  44. package/dist/jira/jira-sprint-sync.test.js.map +1 -0
  45. package/{packages/core/dist → dist}/scripts/generate-spider.d.ts +11 -1
  46. package/{packages/core/dist → dist}/scripts/generate-spider.d.ts.map +1 -1
  47. package/{packages/core/dist → dist}/scripts/generate-spider.js +24 -1
  48. package/dist/scripts/generate-spider.js.map +1 -0
  49. package/{packages/core/dist → dist}/scripts/generate-spider.test.js +6 -4
  50. package/dist/scripts/generate-spider.test.js.map +1 -0
  51. package/dist/workflow/gate-handler.d.ts +94 -0
  52. package/dist/workflow/gate-handler.d.ts.map +1 -0
  53. package/dist/workflow/gate-handler.js +189 -0
  54. package/dist/workflow/gate-handler.js.map +1 -0
  55. package/dist/workflow/gate-handler.test.d.ts +14 -0
  56. package/dist/workflow/gate-handler.test.d.ts.map +1 -0
  57. package/dist/workflow/gate-handler.test.js +543 -0
  58. package/dist/workflow/gate-handler.test.js.map +1 -0
  59. package/{packages/core/dist → dist}/workflow/generic-handoff.d.ts +46 -0
  60. package/{packages/core/dist → dist}/workflow/generic-handoff.d.ts.map +1 -1
  61. package/{packages/core/dist → dist}/workflow/generic-handoff.js +53 -0
  62. package/{packages/core/dist → dist}/workflow/generic-handoff.js.map +1 -1
  63. package/{packages/core/dist → dist}/workflow/generic-handoff.test.js +2 -2
  64. package/{packages/core/dist → dist}/workflow/generic-handoff.test.js.map +1 -1
  65. package/dist/workflow/index.d.ts +16 -0
  66. package/dist/workflow/index.d.ts.map +1 -0
  67. package/dist/workflow/index.js +24 -0
  68. package/dist/workflow/index.js.map +1 -0
  69. package/dist/workflow/session-state.d.ts +92 -0
  70. package/dist/workflow/session-state.d.ts.map +1 -0
  71. package/dist/workflow/session-state.js +198 -0
  72. package/dist/workflow/session-state.js.map +1 -0
  73. package/dist/workflow/session-state.test.d.ts +8 -0
  74. package/dist/workflow/session-state.test.d.ts.map +1 -0
  75. package/dist/workflow/session-state.test.js +551 -0
  76. package/dist/workflow/session-state.test.js.map +1 -0
  77. package/dist/workflow/step-parser.d.ts +45 -0
  78. package/dist/workflow/step-parser.d.ts.map +1 -0
  79. package/dist/workflow/step-parser.js +147 -0
  80. package/dist/workflow/step-parser.js.map +1 -0
  81. package/dist/workflow/step-parser.test.d.ts +14 -0
  82. package/dist/workflow/step-parser.test.d.ts.map +1 -0
  83. package/dist/workflow/step-parser.test.js +470 -0
  84. package/dist/workflow/step-parser.test.js.map +1 -0
  85. package/dist/workflow/trimodal.d.ts +86 -0
  86. package/dist/workflow/trimodal.d.ts.map +1 -0
  87. package/dist/workflow/trimodal.js +118 -0
  88. package/dist/workflow/trimodal.js.map +1 -0
  89. package/dist/workflow/trimodal.test.d.ts +11 -0
  90. package/dist/workflow/trimodal.test.d.ts.map +1 -0
  91. package/dist/workflow/trimodal.test.js +395 -0
  92. package/dist/workflow/trimodal.test.js.map +1 -0
  93. package/dist/workflow/variable-resolver.d.ts +67 -0
  94. package/dist/workflow/variable-resolver.d.ts.map +1 -0
  95. package/dist/workflow/variable-resolver.js +156 -0
  96. package/dist/workflow/variable-resolver.js.map +1 -0
  97. package/dist/workflow/variable-resolver.test.d.ts +14 -0
  98. package/dist/workflow/variable-resolver.test.d.ts.map +1 -0
  99. package/dist/workflow/variable-resolver.test.js +400 -0
  100. package/dist/workflow/variable-resolver.test.js.map +1 -0
  101. package/dist/workflow/workflow-executor.d.ts +163 -0
  102. package/dist/workflow/workflow-executor.d.ts.map +1 -0
  103. package/dist/workflow/workflow-executor.js +197 -0
  104. package/dist/workflow/workflow-executor.js.map +1 -0
  105. package/dist/workflow/workflow-executor.test.d.ts +8 -0
  106. package/dist/workflow/workflow-executor.test.d.ts.map +1 -0
  107. package/dist/workflow/workflow-executor.test.js +444 -0
  108. package/dist/workflow/workflow-executor.test.js.map +1 -0
  109. package/{packages/core/dist → dist}/workflow/workflow-loader.test.js +5 -5
  110. package/dist/workflow/workflow-loader.test.js.map +1 -0
  111. package/{packages/core/dist → dist}/workflow/workflow-migration.test.js +8 -9
  112. package/{packages/core/dist → dist}/workflow/workflow-migration.test.js.map +1 -1
  113. package/dist/workflow/workflow-permissions.d.ts +55 -0
  114. package/dist/workflow/workflow-permissions.d.ts.map +1 -0
  115. package/dist/workflow/workflow-permissions.js +64 -0
  116. package/dist/workflow/workflow-permissions.js.map +1 -0
  117. package/dist/workflow/workflow-permissions.test.d.ts +15 -0
  118. package/dist/workflow/workflow-permissions.test.d.ts.map +1 -0
  119. package/dist/workflow/workflow-permissions.test.js +301 -0
  120. package/dist/workflow/workflow-permissions.test.js.map +1 -0
  121. package/{packages/core/dist → dist}/workflow/workflow-schema.d.ts +61 -2
  122. package/dist/workflow/workflow-schema.d.ts.map +1 -0
  123. package/dist/workflow/workflow-schema.js +454 -0
  124. package/dist/workflow/workflow-schema.js.map +1 -0
  125. package/{packages/core/dist → dist}/workflow/workflow-schema.test.js +6 -6
  126. package/{packages/core/dist → dist}/workflow/workflow-schema.test.js.map +1 -1
  127. package/dist/workflow/workflow-stepped-schema.test.d.ts +18 -0
  128. package/dist/workflow/workflow-stepped-schema.test.d.ts.map +1 -0
  129. package/dist/workflow/workflow-stepped-schema.test.js +608 -0
  130. package/dist/workflow/workflow-stepped-schema.test.js.map +1 -0
  131. package/package.json +38 -32
  132. package/README.md +0 -301
  133. package/packages/core/dist/cli/commands/cyclist.js.map +0 -1
  134. package/packages/core/dist/cli/commands/cyclist.test.js.map +0 -1
  135. package/packages/core/dist/cli/commands/update.js.map +0 -1
  136. package/packages/core/dist/cli/utils/constants.d.ts.map +0 -1
  137. package/packages/core/dist/cli/utils/themes.js.map +0 -1
  138. package/packages/core/dist/cli/utils/themes.test.d.ts +0 -12
  139. package/packages/core/dist/cli/utils/themes.test.js.map +0 -1
  140. package/packages/core/dist/scripts/generate-all-faces.d.ts +0 -10
  141. package/packages/core/dist/scripts/generate-all-faces.d.ts.map +0 -1
  142. package/packages/core/dist/scripts/generate-all-faces.js +0 -256
  143. package/packages/core/dist/scripts/generate-all-faces.js.map +0 -1
  144. package/packages/core/dist/scripts/generate-all-faces.test.d.ts +0 -17
  145. package/packages/core/dist/scripts/generate-all-faces.test.d.ts.map +0 -1
  146. package/packages/core/dist/scripts/generate-all-faces.test.js +0 -372
  147. package/packages/core/dist/scripts/generate-all-faces.test.js.map +0 -1
  148. package/packages/core/dist/scripts/generate-ascii-face.d.ts +0 -52
  149. package/packages/core/dist/scripts/generate-ascii-face.d.ts.map +0 -1
  150. package/packages/core/dist/scripts/generate-ascii-face.js +0 -155
  151. package/packages/core/dist/scripts/generate-ascii-face.js.map +0 -1
  152. package/packages/core/dist/scripts/generate-face.d.ts +0 -52
  153. package/packages/core/dist/scripts/generate-face.d.ts.map +0 -1
  154. package/packages/core/dist/scripts/generate-face.js +0 -199
  155. package/packages/core/dist/scripts/generate-face.js.map +0 -1
  156. package/packages/core/dist/scripts/generate-face.test.d.ts +0 -13
  157. package/packages/core/dist/scripts/generate-face.test.d.ts.map +0 -1
  158. package/packages/core/dist/scripts/generate-face.test.js +0 -301
  159. package/packages/core/dist/scripts/generate-face.test.js.map +0 -1
  160. package/packages/core/dist/scripts/generate-spider.js.map +0 -1
  161. package/packages/core/dist/scripts/generate-spider.test.js.map +0 -1
  162. package/packages/core/dist/workflow/workflow-loader.test.js.map +0 -1
  163. package/packages/core/dist/workflow/workflow-schema.d.ts.map +0 -1
  164. package/packages/core/dist/workflow/workflow-schema.js +0 -230
  165. package/packages/core/dist/workflow/workflow-schema.js.map +0 -1
  166. package/pennyfarthing-dist/agents/README.md +0 -411
  167. package/pennyfarthing-dist/agents/architect.md +0 -185
  168. package/pennyfarthing-dist/agents/dev.md +0 -239
  169. package/pennyfarthing-dist/agents/devops.md +0 -197
  170. package/pennyfarthing-dist/agents/generic-handoff.md +0 -454
  171. package/pennyfarthing-dist/agents/generic-sm-finish.md +0 -261
  172. package/pennyfarthing-dist/agents/generic-sm-setup.md +0 -214
  173. package/pennyfarthing-dist/agents/orchestrator.md +0 -333
  174. package/pennyfarthing-dist/agents/pm.md +0 -164
  175. package/pennyfarthing-dist/agents/reviewer-preflight.md +0 -182
  176. package/pennyfarthing-dist/agents/reviewer.md +0 -335
  177. package/pennyfarthing-dist/agents/sm-file-summary.md +0 -109
  178. package/pennyfarthing-dist/agents/sm-handoff.md +0 -97
  179. package/pennyfarthing-dist/agents/sm.md +0 -509
  180. package/pennyfarthing-dist/agents/tea.md +0 -205
  181. package/pennyfarthing-dist/agents/tech-writer.md +0 -148
  182. package/pennyfarthing-dist/agents/testing-runner.md +0 -423
  183. package/pennyfarthing-dist/agents/ux-designer.md +0 -158
  184. package/pennyfarthing-dist/agents/workflow-status-check.md +0 -332
  185. package/pennyfarthing-dist/commands/architect.md +0 -62
  186. package/pennyfarthing-dist/commands/benchmark-control.md +0 -69
  187. package/pennyfarthing-dist/commands/benchmark.md +0 -467
  188. package/pennyfarthing-dist/commands/brainstorm.md +0 -91
  189. package/pennyfarthing-dist/commands/check.md +0 -156
  190. package/pennyfarthing-dist/commands/chore.md +0 -178
  191. package/pennyfarthing-dist/commands/close-epic.md +0 -136
  192. package/pennyfarthing-dist/commands/continue-session.md +0 -184
  193. package/pennyfarthing-dist/commands/create-branches-from-story.md +0 -374
  194. package/pennyfarthing-dist/commands/create-theme.md +0 -29
  195. package/pennyfarthing-dist/commands/dev.md +0 -60
  196. package/pennyfarthing-dist/commands/devops.md +0 -59
  197. package/pennyfarthing-dist/commands/git-cleanup.md +0 -340
  198. package/pennyfarthing-dist/commands/health-check.md +0 -108
  199. package/pennyfarthing-dist/commands/help.md +0 -264
  200. package/pennyfarthing-dist/commands/job-fair.md +0 -102
  201. package/pennyfarthing-dist/commands/list-themes.md +0 -17
  202. package/pennyfarthing-dist/commands/new-work.md +0 -127
  203. package/pennyfarthing-dist/commands/orchestrator.md +0 -56
  204. package/pennyfarthing-dist/commands/parallel-work.md +0 -71
  205. package/pennyfarthing-dist/commands/party-mode.md +0 -67
  206. package/pennyfarthing-dist/commands/permissions.md +0 -193
  207. package/pennyfarthing-dist/commands/pm.md +0 -60
  208. package/pennyfarthing-dist/commands/prime.md +0 -140
  209. package/pennyfarthing-dist/commands/release.md +0 -58
  210. package/pennyfarthing-dist/commands/repo-status.md +0 -49
  211. package/pennyfarthing-dist/commands/retro.md +0 -200
  212. package/pennyfarthing-dist/commands/reviewer.md +0 -64
  213. package/pennyfarthing-dist/commands/run-ci.md +0 -116
  214. package/pennyfarthing-dist/commands/set-theme.md +0 -52
  215. package/pennyfarthing-dist/commands/show-theme.md +0 -21
  216. package/pennyfarthing-dist/commands/sm.md +0 -70
  217. package/pennyfarthing-dist/commands/solo.md +0 -411
  218. package/pennyfarthing-dist/commands/sprint-planning.md +0 -109
  219. package/pennyfarthing-dist/commands/start-epic.md +0 -156
  220. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +0 -184
  221. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +0 -376
  222. package/pennyfarthing-dist/commands/tea.md +0 -63
  223. package/pennyfarthing-dist/commands/tech-writer.md +0 -53
  224. package/pennyfarthing-dist/commands/theme-maker.md +0 -671
  225. package/pennyfarthing-dist/commands/update-domain-docs.md +0 -83
  226. package/pennyfarthing-dist/commands/ux-designer.md +0 -62
  227. package/pennyfarthing-dist/commands/work.md +0 -111
  228. package/pennyfarthing-dist/guides/AGENT-COORDINATION.md +0 -480
  229. package/pennyfarthing-dist/guides/AGENT-SCOPES.md +0 -201
  230. package/pennyfarthing-dist/guides/HOOKS.md +0 -230
  231. package/pennyfarthing-dist/guides/PROMPT-PATTERNS.md +0 -338
  232. package/pennyfarthing-dist/guides/SESSION-ARTIFACTS.md +0 -193
  233. package/pennyfarthing-dist/guides/agent-template-strategic.md +0 -148
  234. package/pennyfarthing-dist/guides/agent-template-tactical.md +0 -162
  235. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +0 -746
  236. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +0 -574
  237. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +0 -488
  238. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +0 -402
  239. package/pennyfarthing-dist/guides/permission-protocol.md +0 -188
  240. package/pennyfarthing-dist/guides/persona-loading.md +0 -46
  241. package/pennyfarthing-dist/guides/persona-system.md +0 -294
  242. package/pennyfarthing-dist/guides/shared-agent-behavior.md +0 -388
  243. package/pennyfarthing-dist/guides/shared-context.md +0 -147
  244. package/pennyfarthing-dist/guides/strategic-agent-behavior.md +0 -348
  245. package/pennyfarthing-dist/guides/tactical-agent-behavior.md +0 -1041
  246. package/pennyfarthing-dist/guides/workflow-schema.md +0 -195
  247. package/pennyfarthing-dist/guides/worktree-mode.md +0 -113
  248. package/pennyfarthing-dist/output-styles/teaching.md +0 -33
  249. package/pennyfarthing-dist/output-styles/terse.md +0 -20
  250. package/pennyfarthing-dist/output-styles/verbose.md +0 -28
  251. package/pennyfarthing-dist/personas/themes/1984.yaml +0 -312
  252. package/pennyfarthing-dist/personas/themes/a-team.yaml +0 -207
  253. package/pennyfarthing-dist/personas/themes/agatha-christie.yaml +0 -300
  254. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +0 -330
  255. package/pennyfarthing-dist/personas/themes/all-stars.yaml +0 -332
  256. package/pennyfarthing-dist/personas/themes/ancient-philosophers.yaml +0 -320
  257. package/pennyfarthing-dist/personas/themes/ancient-strategists.yaml +0 -306
  258. package/pennyfarthing-dist/personas/themes/arcane.yaml +0 -288
  259. package/pennyfarthing-dist/personas/themes/arthurian-mythos.yaml +0 -331
  260. package/pennyfarthing-dist/personas/themes/avatar-the-last-airbender.yaml +0 -288
  261. package/pennyfarthing-dist/personas/themes/babylon-5.yaml +0 -288
  262. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +0 -288
  263. package/pennyfarthing-dist/personas/themes/better-call-saul.yaml +0 -288
  264. package/pennyfarthing-dist/personas/themes/big-lebowski.yaml +0 -300
  265. package/pennyfarthing-dist/personas/themes/black-sails.yaml +0 -300
  266. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +0 -295
  267. package/pennyfarthing-dist/personas/themes/bobiverse.yaml +0 -288
  268. package/pennyfarthing-dist/personas/themes/breaking-bad.yaml +0 -327
  269. package/pennyfarthing-dist/personas/themes/catch-22.yaml +0 -316
  270. package/pennyfarthing-dist/personas/themes/classical-composers.yaml +0 -310
  271. package/pennyfarthing-dist/personas/themes/control.yaml +0 -197
  272. package/pennyfarthing-dist/personas/themes/count-of-monte-cristo.yaml +0 -320
  273. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +0 -323
  274. package/pennyfarthing-dist/personas/themes/deadwood.yaml +0 -300
  275. package/pennyfarthing-dist/personas/themes/dickens.yaml +0 -320
  276. package/pennyfarthing-dist/personas/themes/discworld.yaml +0 -332
  277. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +0 -290
  278. package/pennyfarthing-dist/personas/themes/don-quixote.yaml +0 -320
  279. package/pennyfarthing-dist/personas/themes/dune.yaml +0 -307
  280. package/pennyfarthing-dist/personas/themes/enlightenment-thinkers.yaml +0 -320
  281. package/pennyfarthing-dist/personas/themes/expeditionary-force.yaml +0 -288
  282. package/pennyfarthing-dist/personas/themes/fargo.yaml +0 -330
  283. package/pennyfarthing-dist/personas/themes/film-auteurs.yaml +0 -312
  284. package/pennyfarthing-dist/personas/themes/firefly.yaml +0 -328
  285. package/pennyfarthing-dist/personas/themes/foundation.yaml +0 -290
  286. package/pennyfarthing-dist/personas/themes/futurama.yaml +0 -321
  287. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +0 -290
  288. package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +0 -243
  289. package/pennyfarthing-dist/personas/themes/gothic-literature.yaml +0 -308
  290. package/pennyfarthing-dist/personas/themes/great-gatsby.yaml +0 -308
  291. package/pennyfarthing-dist/personas/themes/greek-mythology.yaml +0 -330
  292. package/pennyfarthing-dist/personas/themes/hannibal.yaml +0 -300
  293. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +0 -324
  294. package/pennyfarthing-dist/personas/themes/his-dark-materials.yaml +0 -291
  295. package/pennyfarthing-dist/personas/themes/historical-figures.yaml +0 -288
  296. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +0 -331
  297. package/pennyfarthing-dist/personas/themes/house-md.yaml +0 -321
  298. package/pennyfarthing-dist/personas/themes/imperial-radch.yaml +0 -289
  299. package/pennyfarthing-dist/personas/themes/inspector-morse.yaml +0 -300
  300. package/pennyfarthing-dist/personas/themes/jane-austen.yaml +0 -287
  301. package/pennyfarthing-dist/personas/themes/jazz-legends.yaml +0 -320
  302. package/pennyfarthing-dist/personas/themes/justified.yaml +0 -300
  303. package/pennyfarthing-dist/personas/themes/legion-of-doom.yaml +0 -219
  304. package/pennyfarthing-dist/personas/themes/les-miserables.yaml +0 -299
  305. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +0 -334
  306. package/pennyfarthing-dist/personas/themes/lovecraft-mythos.yaml +0 -334
  307. package/pennyfarthing-dist/personas/themes/mad-max.yaml +0 -355
  308. package/pennyfarthing-dist/personas/themes/mad-men.yaml +0 -289
  309. package/pennyfarthing-dist/personas/themes/marvel-mcu.yaml +0 -300
  310. package/pennyfarthing-dist/personas/themes/mash.yaml +0 -334
  311. package/pennyfarthing-dist/personas/themes/mass-effect.yaml +0 -289
  312. package/pennyfarthing-dist/personas/themes/military-commanders.yaml +0 -306
  313. package/pennyfarthing-dist/personas/themes/moby-dick.yaml +0 -320
  314. package/pennyfarthing-dist/personas/themes/monty-python.yaml +0 -303
  315. package/pennyfarthing-dist/personas/themes/neuromancer.yaml +0 -300
  316. package/pennyfarthing-dist/personas/themes/norse-mythology.yaml +0 -329
  317. package/pennyfarthing-dist/personas/themes/parks-and-rec.yaml +0 -242
  318. package/pennyfarthing-dist/personas/themes/peaky-blinders.yaml +0 -298
  319. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +0 -220
  320. package/pennyfarthing-dist/personas/themes/renaissance-masters.yaml +0 -320
  321. package/pennyfarthing-dist/personas/themes/rome.yaml +0 -300
  322. package/pennyfarthing-dist/personas/themes/russian-masters.yaml +0 -318
  323. package/pennyfarthing-dist/personas/themes/sandman.yaml +0 -288
  324. package/pennyfarthing-dist/personas/themes/scientific-revolutionaries.yaml +0 -320
  325. package/pennyfarthing-dist/personas/themes/shakespeare.yaml +0 -301
  326. package/pennyfarthing-dist/personas/themes/sherlock-holmes.yaml +0 -289
  327. package/pennyfarthing-dist/personas/themes/snow-crash.yaml +0 -288
  328. package/pennyfarthing-dist/personas/themes/software-pioneers.yaml +0 -300
  329. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +0 -230
  330. package/pennyfarthing-dist/personas/themes/star-trek-tos.yaml +0 -210
  331. package/pennyfarthing-dist/personas/themes/star-wars.yaml +0 -303
  332. package/pennyfarthing-dist/personas/themes/succession.yaml +0 -300
  333. package/pennyfarthing-dist/personas/themes/superfriends.yaml +0 -208
  334. package/pennyfarthing-dist/personas/themes/ted-lasso.yaml +0 -236
  335. package/pennyfarthing-dist/personas/themes/the-americans.yaml +0 -300
  336. package/pennyfarthing-dist/personas/themes/the-crown.yaml +0 -300
  337. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +0 -213
  338. package/pennyfarthing-dist/personas/themes/the-good-place.yaml +0 -322
  339. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +0 -353
  340. package/pennyfarthing-dist/personas/themes/the-odyssey.yaml +0 -300
  341. package/pennyfarthing-dist/personas/themes/the-office.yaml +0 -330
  342. package/pennyfarthing-dist/personas/themes/the-simpsons.yaml +0 -308
  343. package/pennyfarthing-dist/personas/themes/the-sopranos.yaml +0 -300
  344. package/pennyfarthing-dist/personas/themes/the-wire.yaml +0 -311
  345. package/pennyfarthing-dist/personas/themes/the-witcher.yaml +0 -300
  346. package/pennyfarthing-dist/personas/themes/twin-peaks.yaml +0 -302
  347. package/pennyfarthing-dist/personas/themes/vorkosigan-saga.yaml +0 -300
  348. package/pennyfarthing-dist/personas/themes/watchmen.yaml +0 -291
  349. package/pennyfarthing-dist/personas/themes/west-wing.yaml +0 -291
  350. package/pennyfarthing-dist/personas/themes/world-explorers.yaml +0 -320
  351. package/pennyfarthing-dist/personas/themes/wwii-leaders.yaml +0 -307
  352. package/pennyfarthing-dist/personas/themes/x-files.yaml +0 -302
  353. package/pennyfarthing-dist/scripts/add-short-names.mjs +0 -264
  354. package/pennyfarthing-dist/scripts/agent-session.sh +0 -367
  355. package/pennyfarthing-dist/scripts/check-context.sh +0 -187
  356. package/pennyfarthing-dist/scripts/check.sh +0 -497
  357. package/pennyfarthing-dist/scripts/deploy.sh +0 -284
  358. package/pennyfarthing-dist/scripts/doctor-dogfood.sh +0 -395
  359. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -61
  360. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -66
  361. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -35
  362. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -166
  363. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -50
  364. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -71
  365. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -54
  366. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -98
  367. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -59
  368. package/pennyfarthing-dist/scripts/install-git-hooks.sh +0 -91
  369. package/pennyfarthing-dist/scripts/prime.sh +0 -161
  370. package/pennyfarthing-dist/scripts/release.sh +0 -198
  371. package/pennyfarthing-dist/scripts/repo-utils.sh +0 -778
  372. package/pennyfarthing-dist/scripts/run-ci.sh +0 -219
  373. package/pennyfarthing-dist/scripts/run.sh +0 -65
  374. package/pennyfarthing-dist/scripts/statusline.sh +0 -264
  375. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -582
  376. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -107
  377. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -597
  378. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -514
  379. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -517
  380. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -331
  381. package/pennyfarthing-dist/scripts/uninstall.sh +0 -271
  382. package/pennyfarthing-dist/scripts/utils/background-tasks.sh +0 -177
  383. package/pennyfarthing-dist/scripts/utils/check-status.sh +0 -251
  384. package/pennyfarthing-dist/scripts/utils/checkpoint.sh +0 -136
  385. package/pennyfarthing-dist/scripts/utils/common.sh +0 -157
  386. package/pennyfarthing-dist/scripts/utils/create-feature-branches.sh +0 -230
  387. package/pennyfarthing-dist/scripts/utils/file-lock.sh +0 -269
  388. package/pennyfarthing-dist/scripts/utils/find-related-work.sh +0 -231
  389. package/pennyfarthing-dist/scripts/utils/find-root.sh +0 -33
  390. package/pennyfarthing-dist/scripts/utils/generate-skill-docs.sh +0 -110
  391. package/pennyfarthing-dist/scripts/utils/git-status-all.sh +0 -127
  392. package/pennyfarthing-dist/scripts/utils/ground-truth-judge.py +0 -289
  393. package/pennyfarthing-dist/scripts/utils/jira/jira-lib.mjs +0 -443
  394. package/pennyfarthing-dist/scripts/utils/jira/jira-sync-story.mjs +0 -208
  395. package/pennyfarthing-dist/scripts/utils/jira/jira-sync.mjs +0 -198
  396. package/pennyfarthing-dist/scripts/utils/jira-claim-story.sh +0 -162
  397. package/pennyfarthing-dist/scripts/utils/jira-lib.sh +0 -463
  398. package/pennyfarthing-dist/scripts/utils/jira-sync-story.sh +0 -8
  399. package/pennyfarthing-dist/scripts/utils/jira-sync.sh +0 -8
  400. package/pennyfarthing-dist/scripts/utils/log-skill-usage.sh +0 -74
  401. package/pennyfarthing-dist/scripts/utils/logging.sh +0 -186
  402. package/pennyfarthing-dist/scripts/utils/repo-scan.sh +0 -141
  403. package/pennyfarthing-dist/scripts/utils/retry.sh +0 -76
  404. package/pennyfarthing-dist/scripts/utils/run-timestamp.sh +0 -7
  405. package/pennyfarthing-dist/scripts/utils/session-cleanup.sh +0 -319
  406. package/pennyfarthing-dist/scripts/utils/skill-usage-report.sh +0 -193
  407. package/pennyfarthing-dist/scripts/utils/sprint-common.sh +0 -286
  408. package/pennyfarthing-dist/scripts/utils/sprint-metrics.sh +0 -241
  409. package/pennyfarthing-dist/scripts/utils/swebench-judge.py +0 -400
  410. package/pennyfarthing-dist/scripts/utils/sync-epic-to-jira.sh +0 -16
  411. package/pennyfarthing-dist/scripts/utils/test-setup.sh +0 -337
  412. package/pennyfarthing-dist/scripts/utils/validate-subagent-frontmatter.sh +0 -160
  413. package/pennyfarthing-dist/scripts/worktree-manager.sh +0 -498
  414. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +0 -236
  415. package/pennyfarthing-dist/skills/changelog/SKILL.md +0 -367
  416. package/pennyfarthing-dist/skills/code-review/SKILL.md +0 -168
  417. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +0 -268
  418. package/pennyfarthing-dist/skills/cyclist/SKILL.md +0 -171
  419. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +0 -421
  420. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +0 -258
  421. package/pennyfarthing-dist/skills/jira/SKILL.md +0 -281
  422. package/pennyfarthing-dist/skills/judge/SKILL.md +0 -524
  423. package/pennyfarthing-dist/skills/just/SKILL.md +0 -160
  424. package/pennyfarthing-dist/skills/mermaid/SKILL.md +0 -240
  425. package/pennyfarthing-dist/skills/otel/skill.md +0 -222
  426. package/pennyfarthing-dist/skills/permissions/skill.md +0 -172
  427. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +0 -173
  428. package/pennyfarthing-dist/skills/skill-registry.schema.json +0 -102
  429. package/pennyfarthing-dist/skills/skill-registry.yaml +0 -335
  430. package/pennyfarthing-dist/skills/sprint-context/SKILL.md +0 -120
  431. package/pennyfarthing-dist/skills/story-management/SKILL.md +0 -208
  432. package/pennyfarthing-dist/skills/testing/SKILL.md +0 -99
  433. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +0 -124
  434. package/pennyfarthing-dist/skills/theme/skill.md +0 -129
  435. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +0 -169
  436. package/pennyfarthing-dist/skills/workflow/SKILL.md +0 -160
  437. package/pennyfarthing-dist/skills/yq/SKILL.md +0 -264
  438. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +0 -187
  439. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +0 -59
  440. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -276
  441. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +0 -61
  442. package/pennyfarthing-dist/templates/persona-config.yaml.template +0 -22
  443. package/pennyfarthing-dist/templates/preferences.yaml.template +0 -15
  444. package/pennyfarthing-dist/templates/settings.local.json.template +0 -90
  445. package/pennyfarthing-dist/templates/setup-env.sh.template +0 -18
  446. package/pennyfarthing-dist/templates/shared-context.md.template +0 -70
  447. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +0 -40
  448. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +0 -37
  449. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +0 -34
  450. package/pennyfarthing-dist/workflows/agent-docs.yaml +0 -70
  451. package/pennyfarthing-dist/workflows/bdd.yaml +0 -58
  452. package/pennyfarthing-dist/workflows/tdd.yaml +0 -50
  453. package/pennyfarthing-dist/workflows/trivial.yaml +0 -40
  454. /package/{packages/core/bin → bin}/pennyfarthing.js +0 -0
  455. /package/{packages/core/dist → dist}/bmad/context-reader.d.ts +0 -0
  456. /package/{packages/core/dist → dist}/bmad/context-reader.d.ts.map +0 -0
  457. /package/{packages/core/dist → dist}/bmad/context-reader.js +0 -0
  458. /package/{packages/core/dist → dist}/bmad/context-reader.js.map +0 -0
  459. /package/{packages/core/dist → dist}/bmad/context-reader.test.d.ts +0 -0
  460. /package/{packages/core/dist → dist}/bmad/context-reader.test.d.ts.map +0 -0
  461. /package/{packages/core/dist → dist}/bmad/context-reader.test.js +0 -0
  462. /package/{packages/core/dist → dist}/bmad/context-reader.test.js.map +0 -0
  463. /package/{packages/core/dist → dist}/bmad/epics-parser.d.ts +0 -0
  464. /package/{packages/core/dist → dist}/bmad/epics-parser.d.ts.map +0 -0
  465. /package/{packages/core/dist → dist}/bmad/epics-parser.js +0 -0
  466. /package/{packages/core/dist → dist}/bmad/epics-parser.js.map +0 -0
  467. /package/{packages/core/dist → dist}/bmad/epics-parser.test.d.ts +0 -0
  468. /package/{packages/core/dist → dist}/bmad/epics-parser.test.d.ts.map +0 -0
  469. /package/{packages/core/dist → dist}/bmad/epics-parser.test.js +0 -0
  470. /package/{packages/core/dist → dist}/bmad/epics-parser.test.js.map +0 -0
  471. /package/{packages/core/dist → dist}/bmad/index.d.ts +0 -0
  472. /package/{packages/core/dist → dist}/bmad/index.d.ts.map +0 -0
  473. /package/{packages/core/dist → dist}/bmad/index.js +0 -0
  474. /package/{packages/core/dist → dist}/bmad/index.js.map +0 -0
  475. /package/{packages/core/dist → dist}/bmad/status-sync.d.ts +0 -0
  476. /package/{packages/core/dist → dist}/bmad/status-sync.d.ts.map +0 -0
  477. /package/{packages/core/dist → dist}/bmad/status-sync.js +0 -0
  478. /package/{packages/core/dist → dist}/bmad/status-sync.js.map +0 -0
  479. /package/{packages/core/dist → dist}/bmad/status-sync.test.d.ts +0 -0
  480. /package/{packages/core/dist → dist}/bmad/status-sync.test.d.ts.map +0 -0
  481. /package/{packages/core/dist → dist}/bmad/status-sync.test.js +0 -0
  482. /package/{packages/core/dist → dist}/bmad/status-sync.test.js.map +0 -0
  483. /package/{packages/core/dist → dist}/bmad/story-exporter.d.ts +0 -0
  484. /package/{packages/core/dist → dist}/bmad/story-exporter.d.ts.map +0 -0
  485. /package/{packages/core/dist → dist}/bmad/story-exporter.js +0 -0
  486. /package/{packages/core/dist → dist}/bmad/story-exporter.js.map +0 -0
  487. /package/{packages/core/dist → dist}/bmad/story-exporter.test.d.ts +0 -0
  488. /package/{packages/core/dist → dist}/bmad/story-exporter.test.d.ts.map +0 -0
  489. /package/{packages/core/dist → dist}/bmad/story-exporter.test.js +0 -0
  490. /package/{packages/core/dist → dist}/bmad/story-exporter.test.js.map +0 -0
  491. /package/{packages/core/dist → dist}/bmad/story-parser.d.ts +0 -0
  492. /package/{packages/core/dist → dist}/bmad/story-parser.d.ts.map +0 -0
  493. /package/{packages/core/dist → dist}/bmad/story-parser.js +0 -0
  494. /package/{packages/core/dist → dist}/bmad/story-parser.js.map +0 -0
  495. /package/{packages/core/dist → dist}/bmad/story-parser.test.d.ts +0 -0
  496. /package/{packages/core/dist → dist}/bmad/story-parser.test.d.ts.map +0 -0
  497. /package/{packages/core/dist → dist}/bmad/story-parser.test.js +0 -0
  498. /package/{packages/core/dist → dist}/bmad/story-parser.test.js.map +0 -0
  499. /package/{packages/core/dist → dist}/cli/commands/command.d.ts +0 -0
  500. /package/{packages/core/dist → dist}/cli/commands/command.d.ts.map +0 -0
  501. /package/{packages/core/dist → dist}/cli/commands/command.js +0 -0
  502. /package/{packages/core/dist → dist}/cli/commands/command.js.map +0 -0
  503. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.d.ts +0 -0
  504. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.d.ts.map +0 -0
  505. /package/{packages/core/dist → dist}/cli/commands/doctor.d.ts +0 -0
  506. /package/{packages/core/dist → dist}/cli/commands/doctor.d.ts.map +0 -0
  507. /package/{packages/core/dist → dist}/cli/commands/doctor.js +0 -0
  508. /package/{packages/core/dist → dist}/cli/commands/doctor.js.map +0 -0
  509. /package/{packages/core/dist → dist}/cli/commands/init.d.ts +0 -0
  510. /package/{packages/core/dist → dist}/cli/commands/init.d.ts.map +0 -0
  511. /package/{packages/core/dist → dist}/cli/commands/init.js +0 -0
  512. /package/{packages/core/dist → dist}/cli/commands/init.js.map +0 -0
  513. /package/{packages/core/dist → dist}/cli/commands/skill.d.ts +0 -0
  514. /package/{packages/core/dist → dist}/cli/commands/skill.d.ts.map +0 -0
  515. /package/{packages/core/dist → dist}/cli/commands/skill.js +0 -0
  516. /package/{packages/core/dist → dist}/cli/commands/skill.js.map +0 -0
  517. /package/{packages/core/dist → dist}/cli/commands/theme.d.ts +0 -0
  518. /package/{packages/core/dist → dist}/cli/commands/theme.d.ts.map +0 -0
  519. /package/{packages/core/dist → dist}/cli/commands/theme.js +0 -0
  520. /package/{packages/core/dist → dist}/cli/commands/theme.js.map +0 -0
  521. /package/{packages/core/dist → dist}/cli/commands/uninstall.d.ts +0 -0
  522. /package/{packages/core/dist → dist}/cli/commands/uninstall.d.ts.map +0 -0
  523. /package/{packages/core/dist → dist}/cli/commands/uninstall.js +0 -0
  524. /package/{packages/core/dist → dist}/cli/commands/uninstall.js.map +0 -0
  525. /package/{packages/core/dist → dist}/cli/commands/update.d.ts +0 -0
  526. /package/{packages/core/dist → dist}/cli/commands/version.d.ts +0 -0
  527. /package/{packages/core/dist → dist}/cli/commands/version.d.ts.map +0 -0
  528. /package/{packages/core/dist → dist}/cli/commands/version.js +0 -0
  529. /package/{packages/core/dist → dist}/cli/commands/version.js.map +0 -0
  530. /package/{packages/core/dist → dist}/cli/customization.test.d.ts +0 -0
  531. /package/{packages/core/dist → dist}/cli/customization.test.d.ts.map +0 -0
  532. /package/{packages/core/dist → dist}/cli/customization.test.js +0 -0
  533. /package/{packages/core/dist → dist}/cli/customization.test.js.map +0 -0
  534. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.d.ts +0 -0
  535. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.d.ts.map +0 -0
  536. /package/{packages/core/dist → dist}/cli/index.d.ts +0 -0
  537. /package/{packages/core/dist → dist}/cli/index.d.ts.map +0 -0
  538. /package/{packages/core/dist → dist}/cli/index.js +0 -0
  539. /package/{packages/core/dist → dist}/cli/index.js.map +0 -0
  540. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.d.ts +0 -0
  541. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.d.ts.map +0 -0
  542. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.js +0 -0
  543. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.js.map +0 -0
  544. /package/{packages/core/dist → dist}/cli/theme-maker.test.d.ts +0 -0
  545. /package/{packages/core/dist → dist}/cli/theme-maker.test.d.ts.map +0 -0
  546. /package/{packages/core/dist → dist}/cli/theme-maker.test.js +0 -0
  547. /package/{packages/core/dist → dist}/cli/theme-maker.test.js.map +0 -0
  548. /package/{packages/core/dist → dist}/cli/utils/files.d.ts +0 -0
  549. /package/{packages/core/dist → dist}/cli/utils/files.d.ts.map +0 -0
  550. /package/{packages/core/dist → dist}/cli/utils/files.js +0 -0
  551. /package/{packages/core/dist → dist}/cli/utils/files.js.map +0 -0
  552. /package/{packages/core/dist → dist}/cli/utils/logger.d.ts +0 -0
  553. /package/{packages/core/dist → dist}/cli/utils/logger.d.ts.map +0 -0
  554. /package/{packages/core/dist → dist}/cli/utils/logger.js +0 -0
  555. /package/{packages/core/dist → dist}/cli/utils/logger.js.map +0 -0
  556. /package/{packages/core/dist → dist}/cli/utils/manifest.d.ts +0 -0
  557. /package/{packages/core/dist → dist}/cli/utils/manifest.d.ts.map +0 -0
  558. /package/{packages/core/dist → dist}/cli/utils/manifest.js +0 -0
  559. /package/{packages/core/dist → dist}/cli/utils/manifest.js.map +0 -0
  560. /package/{packages/core/dist → dist}/cli/utils/node-modules.d.ts +0 -0
  561. /package/{packages/core/dist → dist}/cli/utils/node-modules.d.ts.map +0 -0
  562. /package/{packages/core/dist → dist}/cli/utils/node-modules.js +0 -0
  563. /package/{packages/core/dist → dist}/cli/utils/node-modules.js.map +0 -0
  564. /package/{packages/core/dist → dist}/cli/utils/prompts.d.ts +0 -0
  565. /package/{packages/core/dist → dist}/cli/utils/prompts.d.ts.map +0 -0
  566. /package/{packages/core/dist → dist}/cli/utils/prompts.js +0 -0
  567. /package/{packages/core/dist → dist}/cli/utils/prompts.js.map +0 -0
  568. /package/{packages/core/dist → dist}/cli/utils/symlinks.d.ts +0 -0
  569. /package/{packages/core/dist → dist}/cli/utils/symlinks.d.ts.map +0 -0
  570. /package/{packages/core/dist → dist}/cli/utils/symlinks.js +0 -0
  571. /package/{packages/core/dist → dist}/cli/utils/symlinks.js.map +0 -0
  572. /package/{packages/core/dist → dist}/cli/utils/themes.test.d.ts.map +0 -0
  573. /package/{packages/core/dist → dist}/cli/utils/version.d.ts +0 -0
  574. /package/{packages/core/dist → dist}/cli/utils/version.d.ts.map +0 -0
  575. /package/{packages/core/dist → dist}/cli/utils/version.js +0 -0
  576. /package/{packages/core/dist → dist}/cli/utils/version.js.map +0 -0
  577. /package/{packages/core/dist → dist}/cli/workspace.test.d.ts +0 -0
  578. /package/{packages/core/dist → dist}/cli/workspace.test.d.ts.map +0 -0
  579. /package/{packages/core/dist → dist}/permissions/index.d.ts +0 -0
  580. /package/{packages/core/dist → dist}/permissions/index.d.ts.map +0 -0
  581. /package/{packages/core/dist → dist}/permissions/index.js +0 -0
  582. /package/{packages/core/dist → dist}/permissions/index.js.map +0 -0
  583. /package/{packages/core/dist → dist}/permissions/permission-schema.d.ts +0 -0
  584. /package/{packages/core/dist → dist}/permissions/permission-schema.d.ts.map +0 -0
  585. /package/{packages/core/dist → dist}/permissions/permission-schema.js +0 -0
  586. /package/{packages/core/dist → dist}/permissions/permission-schema.js.map +0 -0
  587. /package/{packages/core/dist → dist}/permissions/permission-schema.test.d.ts +0 -0
  588. /package/{packages/core/dist → dist}/permissions/permission-schema.test.d.ts.map +0 -0
  589. /package/{packages/core/dist → dist}/permissions/permission-schema.test.js +0 -0
  590. /package/{packages/core/dist → dist}/permissions/permission-schema.test.js.map +0 -0
  591. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.d.ts +0 -0
  592. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.d.ts.map +0 -0
  593. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.js +0 -0
  594. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.js.map +0 -0
  595. /package/{packages/core/dist → dist}/scripts/benchmark-integration.d.ts +0 -0
  596. /package/{packages/core/dist → dist}/scripts/benchmark-integration.d.ts.map +0 -0
  597. /package/{packages/core/dist → dist}/scripts/benchmark-integration.js +0 -0
  598. /package/{packages/core/dist → dist}/scripts/benchmark-integration.js.map +0 -0
  599. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.d.ts +0 -0
  600. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.d.ts.map +0 -0
  601. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.js +0 -0
  602. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.js.map +0 -0
  603. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.d.ts +0 -0
  604. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.d.ts.map +0 -0
  605. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.js +0 -0
  606. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.js.map +0 -0
  607. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.d.ts +0 -0
  608. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.d.ts.map +0 -0
  609. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.js +0 -0
  610. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.js.map +0 -0
  611. /package/{packages/core/dist → dist}/scripts/generate-report.d.ts +0 -0
  612. /package/{packages/core/dist → dist}/scripts/generate-report.d.ts.map +0 -0
  613. /package/{packages/core/dist → dist}/scripts/generate-report.js +0 -0
  614. /package/{packages/core/dist → dist}/scripts/generate-report.js.map +0 -0
  615. /package/{packages/core/dist → dist}/scripts/generate-report.test.d.ts +0 -0
  616. /package/{packages/core/dist → dist}/scripts/generate-report.test.d.ts.map +0 -0
  617. /package/{packages/core/dist → dist}/scripts/generate-report.test.js +0 -0
  618. /package/{packages/core/dist → dist}/scripts/generate-report.test.js.map +0 -0
  619. /package/{packages/core/dist → dist}/scripts/generate-spider-report.d.ts +0 -0
  620. /package/{packages/core/dist → dist}/scripts/generate-spider-report.d.ts.map +0 -0
  621. /package/{packages/core/dist → dist}/scripts/generate-spider-report.js +0 -0
  622. /package/{packages/core/dist → dist}/scripts/generate-spider-report.js.map +0 -0
  623. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.d.ts +0 -0
  624. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.d.ts.map +0 -0
  625. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.js +0 -0
  626. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.js.map +0 -0
  627. /package/{packages/core/dist → dist}/scripts/generate-spider.test.d.ts +0 -0
  628. /package/{packages/core/dist → dist}/scripts/generate-spider.test.d.ts.map +0 -0
  629. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.d.ts +0 -0
  630. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.d.ts.map +0 -0
  631. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.js +0 -0
  632. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.js.map +0 -0
  633. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.d.ts +0 -0
  634. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.d.ts.map +0 -0
  635. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.js +0 -0
  636. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.js.map +0 -0
  637. /package/{packages/core/dist → dist}/scripts/run-ci.test.d.ts +0 -0
  638. /package/{packages/core/dist → dist}/scripts/run-ci.test.d.ts.map +0 -0
  639. /package/{packages/core/dist → dist}/scripts/run-ci.test.js +0 -0
  640. /package/{packages/core/dist → dist}/scripts/run-ci.test.js.map +0 -0
  641. /package/{packages/core/dist → dist}/scripts/theme-detail.test.d.ts +0 -0
  642. /package/{packages/core/dist → dist}/scripts/theme-detail.test.d.ts.map +0 -0
  643. /package/{packages/core/dist → dist}/scripts/theme-detail.test.js +0 -0
  644. /package/{packages/core/dist → dist}/scripts/theme-detail.test.js.map +0 -0
  645. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.d.ts +0 -0
  646. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.d.ts.map +0 -0
  647. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.js +0 -0
  648. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.js.map +0 -0
  649. /package/{packages/core/dist → dist}/workflow/generic-handoff.test.d.ts +0 -0
  650. /package/{packages/core/dist → dist}/workflow/generic-handoff.test.d.ts.map +0 -0
  651. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.d.ts +0 -0
  652. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.d.ts.map +0 -0
  653. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.js +0 -0
  654. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.js.map +0 -0
  655. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.d.ts +0 -0
  656. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.d.ts.map +0 -0
  657. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.js +0 -0
  658. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.js.map +0 -0
  659. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.d.ts +0 -0
  660. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.d.ts.map +0 -0
  661. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.js +0 -0
  662. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.js.map +0 -0
  663. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.d.ts +0 -0
  664. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.d.ts.map +0 -0
  665. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.js +0 -0
  666. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.js.map +0 -0
  667. /package/{packages/core/dist → dist}/workflow/test-cache.d.ts +0 -0
  668. /package/{packages/core/dist → dist}/workflow/test-cache.d.ts.map +0 -0
  669. /package/{packages/core/dist → dist}/workflow/test-cache.js +0 -0
  670. /package/{packages/core/dist → dist}/workflow/test-cache.js.map +0 -0
  671. /package/{packages/core/dist → dist}/workflow/test-cache.test.d.ts +0 -0
  672. /package/{packages/core/dist → dist}/workflow/test-cache.test.d.ts.map +0 -0
  673. /package/{packages/core/dist → dist}/workflow/test-cache.test.js +0 -0
  674. /package/{packages/core/dist → dist}/workflow/test-cache.test.js.map +0 -0
  675. /package/{packages/core/dist → dist}/workflow/workflow-loader.d.ts +0 -0
  676. /package/{packages/core/dist → dist}/workflow/workflow-loader.d.ts.map +0 -0
  677. /package/{packages/core/dist → dist}/workflow/workflow-loader.js +0 -0
  678. /package/{packages/core/dist → dist}/workflow/workflow-loader.js.map +0 -0
  679. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.d.ts +0 -0
  680. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.d.ts.map +0 -0
  681. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.d.ts +0 -0
  682. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.d.ts.map +0 -0
  683. /package/{packages/core/dist → dist}/workflow/workflow-router.d.ts +0 -0
  684. /package/{packages/core/dist → dist}/workflow/workflow-router.d.ts.map +0 -0
  685. /package/{packages/core/dist → dist}/workflow/workflow-router.js +0 -0
  686. /package/{packages/core/dist → dist}/workflow/workflow-router.js.map +0 -0
  687. /package/{packages/core/dist → dist}/workflow/workflow-router.test.d.ts +0 -0
  688. /package/{packages/core/dist → dist}/workflow/workflow-router.test.d.ts.map +0 -0
  689. /package/{packages/core/dist → dist}/workflow/workflow-router.test.js +0 -0
  690. /package/{packages/core/dist → dist}/workflow/workflow-router.test.js.map +0 -0
  691. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.d.ts +0 -0
  692. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.d.ts.map +0 -0
@@ -1,256 +0,0 @@
1
- /**
2
- * Batch Chernoff Face Generator
3
- *
4
- * Story 11-4: Generate anchor theme faces + markdown report
5
- * Story 11-6: Generate full 630-face matrix with index
6
- *
7
- * Generates SVG faces for all themes and creates markdown indices.
8
- */
9
- import { writeFileSync, mkdirSync, existsSync, readdirSync, readFileSync } from 'fs';
10
- import { join, dirname } from 'path';
11
- import { fileURLToPath } from 'url';
12
- import { parse as parseYaml } from 'yaml';
13
- import { generateFace } from './generate-face.js';
14
- import { findMonorepoRoot } from '../cli/utils/files.js';
15
- const __filename = fileURLToPath(import.meta.url);
16
- const __dirname = dirname(__filename);
17
- // Find monorepo root by walking up from current directory
18
- const projectRoot = findMonorepoRoot(__dirname);
19
- const facesDir = join(projectRoot, 'pennyfarthing-dist', 'personas', 'faces');
20
- const themesDir = join(projectRoot, 'pennyfarthing-dist', 'personas', 'themes');
21
- // Dynamically load all themes from the themes directory
22
- function getAllThemes() {
23
- const files = readdirSync(themesDir).filter((f) => f.endsWith('.yaml'));
24
- return files.map((f) => f.replace('.yaml', '')).sort();
25
- }
26
- const THEMES = getAllThemes();
27
- // 10 agents per theme
28
- const AGENTS = [
29
- 'orchestrator',
30
- 'sm',
31
- 'tea',
32
- 'dev',
33
- 'reviewer',
34
- 'architect',
35
- 'pm',
36
- 'tech-writer',
37
- 'ux-designer',
38
- 'devops',
39
- ];
40
- // Human-readable agent names for markdown (fallback when character name not available)
41
- const AGENT_NAMES = {
42
- orchestrator: 'Orchestrator',
43
- sm: 'Scrum Master',
44
- tea: 'Test Engineer',
45
- dev: 'Developer',
46
- reviewer: 'Reviewer',
47
- architect: 'Architect',
48
- pm: 'Product Manager',
49
- 'tech-writer': 'Tech Writer',
50
- 'ux-designer': 'UX Designer',
51
- devops: 'DevOps',
52
- };
53
- const themeCache = new Map();
54
- // Convert name to URL-safe slug (lowercase kebab-case)
55
- function toSlug(name) {
56
- return name
57
- .toLowerCase()
58
- .replace(/[^a-z0-9]+/g, '-')
59
- .replace(/^-|-$/g, '');
60
- }
61
- // Generate OCEAN suffix from scores
62
- function oceanSuffix(ocean) {
63
- return `${ocean.O}${ocean.C}${ocean.E}${ocean.A}${ocean.N}`;
64
- }
65
- // Load agent data for all agents in a theme
66
- function getAgentData(theme) {
67
- if (themeCache.has(theme)) {
68
- return themeCache.get(theme);
69
- }
70
- const themePath = join(themesDir, `${theme}.yaml`);
71
- const content = readFileSync(themePath, 'utf-8');
72
- const data = parseYaml(content);
73
- const agents = {};
74
- if (data?.agents) {
75
- for (const agent of AGENTS) {
76
- const agentInfo = data.agents[agent];
77
- if (agentInfo) {
78
- const character = agentInfo.character || AGENT_NAMES[agent];
79
- const shortName = agentInfo.shortName || character.split(' ')[0];
80
- const baseSlug = toSlug(shortName);
81
- const ocean = agentInfo.ocean || { O: 3, C: 3, E: 3, A: 3, N: 3 };
82
- const slug = `${baseSlug}-${oceanSuffix(ocean)}`;
83
- agents[agent] = { character, shortName, slug };
84
- }
85
- else {
86
- agents[agent] = {
87
- character: AGENT_NAMES[agent],
88
- shortName: AGENT_NAMES[agent],
89
- slug: agent,
90
- };
91
- }
92
- }
93
- }
94
- themeCache.set(theme, agents);
95
- return agents;
96
- }
97
- // Load character names for all agents in a theme (backward compat)
98
- function getCharacterNames(theme) {
99
- const agents = getAgentData(theme);
100
- const names = {};
101
- for (const agent of AGENTS) {
102
- names[agent] = agents[agent]?.character || AGENT_NAMES[agent];
103
- }
104
- return names;
105
- }
106
- // Get a specific character name
107
- function getCharacterName(theme, agent) {
108
- const names = getCharacterNames(theme);
109
- return names[agent] || AGENT_NAMES[agent];
110
- }
111
- // Escape quotes for use in HTML attributes
112
- function escapeForAttr(str) {
113
- return str.replace(/"/g, '"');
114
- }
115
- // Escape quotes for use in markdown text (replace with single quotes)
116
- function escapeForMarkdown(str) {
117
- return str.replace(/"/g, "'");
118
- }
119
- // Format theme name for display
120
- function formatTheme(theme) {
121
- return theme
122
- .split('-')
123
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
124
- .join(' ');
125
- }
126
- function ensureDir(dir) {
127
- if (!existsSync(dir)) {
128
- mkdirSync(dir, { recursive: true });
129
- }
130
- }
131
- function generateSvgFiles() {
132
- console.log('Generating SVG files...');
133
- const byThemeDir = join(facesDir, 'by-theme');
134
- const byRoleDir = join(facesDir, 'by-role');
135
- // Create directory structure
136
- ensureDir(byThemeDir);
137
- ensureDir(byRoleDir);
138
- for (const theme of THEMES) {
139
- ensureDir(join(byThemeDir, theme));
140
- }
141
- for (const agent of AGENTS) {
142
- ensureDir(join(byRoleDir, agent));
143
- }
144
- // Generate faces
145
- let count = 0;
146
- for (const theme of THEMES) {
147
- const agentData = getAgentData(theme);
148
- for (const agent of AGENTS) {
149
- const svg = generateFace(theme, agent);
150
- const slug = agentData[agent]?.slug || agent;
151
- // Write to by-theme directory using slug-based naming
152
- const themeFilePath = join(byThemeDir, theme, `${slug}.svg`);
153
- writeFileSync(themeFilePath, svg);
154
- // Write to by-role directory (keeps role-based for cross-theme comparison)
155
- const roleFilePath = join(byRoleDir, agent, `${theme}.svg`);
156
- writeFileSync(roleFilePath, svg);
157
- count++;
158
- }
159
- }
160
- console.log(`Generated ${count} SVG files.`);
161
- }
162
- // Fixed image size for consistent display
163
- const IMG_SIZE = 80;
164
- function imgTag(src, alt) {
165
- return `<img src="${src}" alt="${escapeForAttr(alt)}" width="${IMG_SIZE}" height="${IMG_SIZE}">`;
166
- }
167
- const LEGEND = `## Reading the Faces
168
-
169
- Each face visualizes OCEAN personality scores through facial features:
170
-
171
- | Trait | Feature | Low (1) | High (5) |
172
- |-------|---------|---------|----------|
173
- | **O**penness | Eye size | Small eyes | Large eyes |
174
- | **C**onscientiousness | Face shape | Wide & round | Narrow & angular |
175
- | **E**xtraversion | Mouth | Small frown | Wide smile |
176
- | **A**greeableness | Eyebrows | Angled down (stern) | Arched up (friendly) |
177
- | **N**euroticism | Line weight | Thin strokes | Thick strokes |
178
-
179
- Background colors indicate agent role.
180
-
181
- ---
182
-
183
- `;
184
- // Generate image tag with character name caption (reserved for future use)
185
- function _imgWithName(src, characterName, agentRole) {
186
- const safeName = escapeForMarkdown(characterName);
187
- return `${imgTag(src, characterName)}<br/>**${safeName}**<br/><small>${agentRole}</small>`;
188
- }
189
- function generateTeamPhotos() {
190
- console.log('Generating team-photos.md...');
191
- let md = `# Team Photos
192
-
193
- Chernoff faces for each theme's agent team. Vertical layout for easy visual comparison.
194
-
195
- ${LEGEND}`;
196
- for (const theme of THEMES) {
197
- const themeTitle = formatTheme(theme);
198
- const charNames = getCharacterNames(theme);
199
- md += `## ${themeTitle}\n\n`;
200
- // Vertical list: one agent per row for easy comparison
201
- md += '| Role | Face | Character |\n';
202
- md += '|:-----|:----:|:----------|\n';
203
- const agentData = getAgentData(theme);
204
- for (const agent of AGENTS) {
205
- const charName = escapeForMarkdown(charNames[agent]);
206
- const slug = agentData[agent]?.slug || agent;
207
- const imgSrc = `by-theme/${theme}/${slug}.svg`;
208
- md += `| ${AGENT_NAMES[agent]} | ${imgTag(imgSrc, charNames[agent])} | **${charName}** |\n`;
209
- }
210
- md += '\n';
211
- }
212
- writeFileSync(join(facesDir, 'team-photos.md'), md);
213
- console.log('Generated team-photos.md');
214
- }
215
- // Generate image tag with character name for role gallery (reserved for future use)
216
- function _imgWithCharacter(src, theme, agent) {
217
- const charName = getCharacterName(theme, agent);
218
- const safeName = escapeForMarkdown(charName);
219
- return `${imgTag(src, charName)}<br/>**${safeName}**`;
220
- }
221
- function generateRoleGallery() {
222
- console.log('Generating role-gallery.md...');
223
- let md = `# Role Gallery
224
-
225
- Each agent role across all ${THEMES.length} themes. Vertical layout for easy visual comparison of how personality profiles vary.
226
-
227
- ${LEGEND}`;
228
- for (const agent of AGENTS) {
229
- const agentName = AGENT_NAMES[agent];
230
- md += `## ${agentName}\n\n`;
231
- // Vertical list: one theme per row for easy comparison
232
- md += '| Theme | Face | Character |\n';
233
- md += '|:------|:----:|:----------|\n';
234
- for (const theme of THEMES) {
235
- const charName = escapeForMarkdown(getCharacterName(theme, agent));
236
- const imgSrc = `by-role/${agent}/${theme}.svg`;
237
- md += `| ${formatTheme(theme)} | ${imgTag(imgSrc, charName)} | **${charName}** |\n`;
238
- }
239
- md += '\n';
240
- }
241
- writeFileSync(join(facesDir, 'role-gallery.md'), md);
242
- console.log('Generated role-gallery.md');
243
- }
244
- // Main execution
245
- console.log('=== Batch Chernoff Face Generator ===');
246
- console.log(`Output directory: ${facesDir}`);
247
- console.log(`Themes: ${THEMES.length}`);
248
- console.log(`Agents: ${AGENTS.length}`);
249
- console.log(`Total faces: ${THEMES.length * AGENTS.length}`);
250
- console.log('');
251
- generateSvgFiles();
252
- generateTeamPhotos();
253
- generateRoleGallery();
254
- console.log('');
255
- console.log('Done!');
256
- //# sourceMappingURL=generate-all-faces.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-all-faces.js","sourceRoot":"","sources":["../../src/scripts/generate-all-faces.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Tests for Story 11-6: Generate full 630-face matrix with index
3
- *
4
- * SKIPPED: The faces/ directory was never created.
5
- * Story 11-6 was planned but not implemented. These tests are retained
6
- * for when the feature is implemented, but skipped to avoid false failures.
7
- *
8
- * These tests verify:
9
- * AC1: 630 SVG faces in pennyfarthing-dist/personas/faces/
10
- * AC2: Master matrix viewable (HTML or markdown)
11
- * AC3: Navigation by theme, role, or OCEAN profile
12
- * AC4: File size and load time acceptable
13
- *
14
- * Run with: npm test
15
- */
16
- export {};
17
- //# sourceMappingURL=generate-all-faces.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-all-faces.test.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-all-faces.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -1,372 +0,0 @@
1
- /**
2
- * Tests for Story 11-6: Generate full 630-face matrix with index
3
- *
4
- * SKIPPED: The faces/ directory was never created.
5
- * Story 11-6 was planned but not implemented. These tests are retained
6
- * for when the feature is implemented, but skipped to avoid false failures.
7
- *
8
- * These tests verify:
9
- * AC1: 630 SVG faces in pennyfarthing-dist/personas/faces/
10
- * AC2: Master matrix viewable (HTML or markdown)
11
- * AC3: Navigation by theme, role, or OCEAN profile
12
- * AC4: File size and load time acceptable
13
- *
14
- * Run with: npm test
15
- */
16
- import { describe, it } from 'node:test';
17
- import assert from 'node:assert';
18
- import { join, dirname } from 'path';
19
- import { fileURLToPath } from 'url';
20
- import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
21
- import { findMonorepoRoot } from '../cli/utils/files.js';
22
- const __filename = fileURLToPath(import.meta.url);
23
- const __dirname = dirname(__filename);
24
- // Find monorepo root by walking up from current directory
25
- const projectRoot = findMonorepoRoot(__dirname);
26
- const facesDir = join(projectRoot, 'pennyfarthing-dist', 'personas', 'faces');
27
- const themesDir = join(projectRoot, 'pennyfarthing-dist', 'personas', 'themes');
28
- // Expected counts - derive from actual theme files
29
- const EXPECTED_AGENT_COUNT = 10;
30
- // Count actual themes dynamically (was hardcoded to 63, now 91+)
31
- const actualThemeFiles = existsSync(themesDir)
32
- ? readdirSync(themesDir).filter((f) => f.endsWith('.yaml')).length
33
- : 0;
34
- const EXPECTED_THEME_COUNT = actualThemeFiles;
35
- const EXPECTED_TOTAL_FACES = EXPECTED_THEME_COUNT * EXPECTED_AGENT_COUNT;
36
- // All 10 agent roles
37
- const AGENTS = [
38
- 'orchestrator',
39
- 'sm',
40
- 'tea',
41
- 'dev',
42
- 'reviewer',
43
- 'architect',
44
- 'pm',
45
- 'tech-writer',
46
- 'ux-designer',
47
- 'devops',
48
- ];
49
- // Helper to get all theme names from themes directory
50
- function getAllThemes() {
51
- const files = readdirSync(themesDir).filter((f) => f.endsWith('.yaml'));
52
- return files.map((f) => f.replace('.yaml', '')).sort();
53
- }
54
- // ============================================================================
55
- // AC1: 630 SVG faces in pennyfarthing-dist/personas/faces/
56
- // ============================================================================
57
- describe('AC1: 630 SVG Faces Generated', { skip: 'Story 11-6 not implemented - faces/ directory does not exist' }, () => {
58
- it('should have faces directory structure', () => {
59
- assert.ok(existsSync(facesDir), 'faces/ directory should exist');
60
- assert.ok(existsSync(join(facesDir, 'by-theme')), 'faces/by-theme/ should exist');
61
- assert.ok(existsSync(join(facesDir, 'by-role')), 'faces/by-role/ should exist');
62
- });
63
- it('should have 63 theme directories in by-theme/', () => {
64
- const byThemeDir = join(facesDir, 'by-theme');
65
- const themeDirs = readdirSync(byThemeDir).filter((f) => statSync(join(byThemeDir, f)).isDirectory());
66
- assert.strictEqual(themeDirs.length, EXPECTED_THEME_COUNT, `Should have ${EXPECTED_THEME_COUNT} theme directories, got ${themeDirs.length}`);
67
- });
68
- it('should have 10 agent directories in by-role/', () => {
69
- const byRoleDir = join(facesDir, 'by-role');
70
- const roleDirs = readdirSync(byRoleDir).filter((f) => statSync(join(byRoleDir, f)).isDirectory());
71
- assert.strictEqual(roleDirs.length, EXPECTED_AGENT_COUNT, `Should have ${EXPECTED_AGENT_COUNT} role directories, got ${roleDirs.length}`);
72
- });
73
- it('should have 10 SVG files per theme directory', () => {
74
- const byThemeDir = join(facesDir, 'by-theme');
75
- const themes = getAllThemes();
76
- for (const theme of themes) {
77
- const themeDir = join(byThemeDir, theme);
78
- if (!existsSync(themeDir)) {
79
- assert.fail(`Missing theme directory: ${theme}`);
80
- }
81
- const svgFiles = readdirSync(themeDir).filter((f) => f.endsWith('.svg'));
82
- assert.strictEqual(svgFiles.length, EXPECTED_AGENT_COUNT, `Theme ${theme} should have ${EXPECTED_AGENT_COUNT} SVG files, got ${svgFiles.length}`);
83
- }
84
- });
85
- it('should have 63 SVG files per role directory', () => {
86
- const byRoleDir = join(facesDir, 'by-role');
87
- for (const agent of AGENTS) {
88
- const roleDir = join(byRoleDir, agent);
89
- if (!existsSync(roleDir)) {
90
- assert.fail(`Missing role directory: ${agent}`);
91
- }
92
- const svgFiles = readdirSync(roleDir).filter((f) => f.endsWith('.svg'));
93
- assert.strictEqual(svgFiles.length, EXPECTED_THEME_COUNT, `Role ${agent} should have ${EXPECTED_THEME_COUNT} SVG files, got ${svgFiles.length}`);
94
- }
95
- });
96
- it('should have exactly 630 total SVG files in by-theme/', () => {
97
- const byThemeDir = join(facesDir, 'by-theme');
98
- let totalCount = 0;
99
- const themes = readdirSync(byThemeDir).filter((f) => statSync(join(byThemeDir, f)).isDirectory());
100
- for (const theme of themes) {
101
- const svgFiles = readdirSync(join(byThemeDir, theme)).filter((f) => f.endsWith('.svg'));
102
- totalCount += svgFiles.length;
103
- }
104
- assert.strictEqual(totalCount, EXPECTED_TOTAL_FACES, `Should have ${EXPECTED_TOTAL_FACES} total SVG files, got ${totalCount}`);
105
- });
106
- it('should have matching files in by-theme/ and by-role/', () => {
107
- const byThemeDir = join(facesDir, 'by-theme');
108
- const byRoleDir = join(facesDir, 'by-role');
109
- // by-theme uses character names (e.g., seth-25334.svg)
110
- // by-role uses theme names (e.g., deadwood.svg)
111
- // Verify structure exists and counts match
112
- const sampleThemes = ['deadwood', 'firefly', 'dune', 'discworld'].filter((t) => existsSync(join(byThemeDir, t)));
113
- for (const theme of sampleThemes) {
114
- // Check by-theme has 10 character files
115
- const themeDir = join(byThemeDir, theme);
116
- const themeSvgs = readdirSync(themeDir).filter((f) => f.endsWith('.svg'));
117
- assert.strictEqual(themeSvgs.length, EXPECTED_AGENT_COUNT, `by-theme/${theme}/ should have ${EXPECTED_AGENT_COUNT} SVG files`);
118
- // Check by-role/{agent}/ has this theme's file
119
- for (const agent of AGENTS) {
120
- const roleFile = join(byRoleDir, agent, `${theme}.svg`);
121
- assert.ok(existsSync(roleFile), `Missing by-role file: ${agent}/${theme}.svg`);
122
- }
123
- }
124
- });
125
- it('should generate valid SVG content in each file', () => {
126
- const byThemeDir = join(facesDir, 'by-theme');
127
- const themes = readdirSync(byThemeDir)
128
- .filter((f) => statSync(join(byThemeDir, f)).isDirectory())
129
- .slice(0, 5); // Check first 5 themes to save time
130
- for (const theme of themes) {
131
- const themeDir = join(byThemeDir, theme);
132
- const svgFiles = readdirSync(themeDir).filter((f) => f.endsWith('.svg'));
133
- for (const file of svgFiles) {
134
- const content = readFileSync(join(themeDir, file), 'utf-8');
135
- assert.ok(content.includes('<svg'), `${theme}/${file} should contain <svg tag`);
136
- assert.ok(content.includes('</svg>'), `${theme}/${file} should contain </svg> tag`);
137
- assert.ok(content.includes('xmlns="http://www.w3.org/2000/svg"'), `${theme}/${file} should have SVG xmlns`);
138
- }
139
- }
140
- });
141
- });
142
- // ============================================================================
143
- // AC2: Master matrix viewable (HTML or markdown)
144
- // ============================================================================
145
- describe('AC2: Master Matrix Documentation', { skip: 'Story 11-6 not implemented' }, () => {
146
- it('should have team-photos.md with all 63 themes', () => {
147
- const teamPhotosPath = join(facesDir, 'team-photos.md');
148
- assert.ok(existsSync(teamPhotosPath), 'team-photos.md should exist');
149
- const content = readFileSync(teamPhotosPath, 'utf-8');
150
- const themes = getAllThemes();
151
- // Each theme should have a section
152
- for (const theme of themes) {
153
- const formattedTheme = theme
154
- .split('-')
155
- .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
156
- .join(' ');
157
- assert.ok(content.includes(`## ${formattedTheme}`) || content.includes(`# ${formattedTheme}`), `team-photos.md should have section for ${formattedTheme}`);
158
- }
159
- });
160
- it('should have role-gallery.md with all 10 agents', () => {
161
- const roleGalleryPath = join(facesDir, 'role-gallery.md');
162
- assert.ok(existsSync(roleGalleryPath), 'role-gallery.md should exist');
163
- const content = readFileSync(roleGalleryPath, 'utf-8');
164
- // Each agent should have a section
165
- const agentNames = [
166
- 'Orchestrator',
167
- 'Scrum Master',
168
- 'Test Engineer',
169
- 'Developer',
170
- 'Reviewer',
171
- 'Architect',
172
- 'Product Manager',
173
- 'Tech Writer',
174
- 'UX Designer',
175
- 'DevOps',
176
- ];
177
- for (const agentName of agentNames) {
178
- assert.ok(content.includes(`## ${agentName}`) || content.includes(`# ${agentName}`), `role-gallery.md should have section for ${agentName}`);
179
- }
180
- });
181
- it('should have image references for all 630 faces in team-photos.md', () => {
182
- const teamPhotosPath = join(facesDir, 'team-photos.md');
183
- const content = readFileSync(teamPhotosPath, 'utf-8');
184
- // Count image references (img tags or markdown images)
185
- const imgTagMatches = content.match(/<img[^>]*>/g) || [];
186
- const mdImgMatches = content.match(/!\[.*?\]\(.*?\.svg\)/g) || [];
187
- const totalImages = imgTagMatches.length + mdImgMatches.length;
188
- assert.ok(totalImages >= EXPECTED_TOTAL_FACES, `team-photos.md should reference ${EXPECTED_TOTAL_FACES} images, found ${totalImages}`);
189
- });
190
- it('should have image references for all 630 faces in role-gallery.md', () => {
191
- const roleGalleryPath = join(facesDir, 'role-gallery.md');
192
- const content = readFileSync(roleGalleryPath, 'utf-8');
193
- // Count image references
194
- const imgTagMatches = content.match(/<img[^>]*>/g) || [];
195
- const mdImgMatches = content.match(/!\[.*?\]\(.*?\.svg\)/g) || [];
196
- const totalImages = imgTagMatches.length + mdImgMatches.length;
197
- assert.ok(totalImages >= EXPECTED_TOTAL_FACES, `role-gallery.md should reference ${EXPECTED_TOTAL_FACES} images, found ${totalImages}`);
198
- });
199
- it('should include OCEAN legend/explanation', () => {
200
- const teamPhotosPath = join(facesDir, 'team-photos.md');
201
- const content = readFileSync(teamPhotosPath, 'utf-8');
202
- // Check for OCEAN explanation
203
- assert.ok(content.includes('Openness') || content.includes('OCEAN'), 'team-photos.md should explain OCEAN traits');
204
- assert.ok(content.includes('Eye') || content.includes('eye'), 'team-photos.md should explain eye feature mapping');
205
- });
206
- });
207
- // ============================================================================
208
- // AC3: Navigation by theme, role, or OCEAN profile
209
- // ============================================================================
210
- describe('AC3: Navigation Structure', { skip: 'Story 11-6 not implemented' }, () => {
211
- it('should organize faces by theme for theme-based navigation', () => {
212
- const byThemeDir = join(facesDir, 'by-theme');
213
- const themes = getAllThemes();
214
- // Verify structure allows finding all agents for a given theme
215
- // Note: by-theme uses character names (e.g., seth-25334.svg), not role names
216
- for (const theme of themes.slice(0, 5)) {
217
- // Sample 5 themes
218
- const themeDir = join(byThemeDir, theme);
219
- assert.ok(existsSync(themeDir), `by-theme/${theme}/ should exist`);
220
- // Should have 10 SVG files (one per agent role)
221
- const svgFiles = readdirSync(themeDir).filter((f) => f.endsWith('.svg'));
222
- assert.strictEqual(svgFiles.length, EXPECTED_AGENT_COUNT, `by-theme/${theme}/ should have ${EXPECTED_AGENT_COUNT} SVGs, got ${svgFiles.length}`);
223
- }
224
- });
225
- it('should organize faces by role for role-based navigation', () => {
226
- const byRoleDir = join(facesDir, 'by-role');
227
- const themes = getAllThemes();
228
- // Verify structure allows finding all themes for a given role
229
- for (const agent of AGENTS) {
230
- const roleDir = join(byRoleDir, agent);
231
- assert.ok(existsSync(roleDir), `by-role/${agent}/ should exist`);
232
- // Check sample of themes
233
- for (const theme of themes.slice(0, 5)) {
234
- const themeFile = join(roleDir, `${theme}.svg`);
235
- assert.ok(existsSync(themeFile), `by-role/${agent}/${theme}.svg should exist`);
236
- }
237
- }
238
- });
239
- it('should have navigable markdown sections for each theme', () => {
240
- const teamPhotosPath = join(facesDir, 'team-photos.md');
241
- const content = readFileSync(teamPhotosPath, 'utf-8');
242
- // Markdown headings create navigable anchors
243
- const headingMatches = content.match(/^## .+$/gm) || [];
244
- const themes = getAllThemes();
245
- assert.ok(headingMatches.length >= themes.length, `team-photos.md should have at least ${themes.length} theme sections, found ${headingMatches.length}`);
246
- });
247
- it('should have navigable markdown sections for each role', () => {
248
- const roleGalleryPath = join(facesDir, 'role-gallery.md');
249
- const content = readFileSync(roleGalleryPath, 'utf-8');
250
- // Markdown headings create navigable anchors
251
- const headingMatches = content.match(/^## .+$/gm) || [];
252
- assert.ok(headingMatches.length >= EXPECTED_AGENT_COUNT, `role-gallery.md should have at least ${EXPECTED_AGENT_COUNT} role sections, found ${headingMatches.length}`);
253
- });
254
- });
255
- // ============================================================================
256
- // AC4: File size and load time acceptable
257
- // ============================================================================
258
- describe('AC4: Performance - File Size and Load Time', { skip: 'Story 11-6 not implemented' }, () => {
259
- it('should have reasonable individual SVG file sizes (<50KB each)', () => {
260
- const byThemeDir = join(facesDir, 'by-theme');
261
- const MAX_SVG_SIZE = 50 * 1024; // 50KB per SVG
262
- const themes = readdirSync(byThemeDir)
263
- .filter((f) => statSync(join(byThemeDir, f)).isDirectory())
264
- .slice(0, 10); // Check first 10 themes
265
- for (const theme of themes) {
266
- const themeDir = join(byThemeDir, theme);
267
- const svgFiles = readdirSync(themeDir).filter((f) => f.endsWith('.svg'));
268
- for (const file of svgFiles) {
269
- const filePath = join(themeDir, file);
270
- const stats = statSync(filePath);
271
- assert.ok(stats.size < MAX_SVG_SIZE, `${theme}/${file} is ${stats.size} bytes, exceeds ${MAX_SVG_SIZE} byte limit`);
272
- }
273
- }
274
- });
275
- it('should have total by-theme directory size under 10MB', () => {
276
- const byThemeDir = join(facesDir, 'by-theme');
277
- const MAX_TOTAL_SIZE = 10 * 1024 * 1024; // 10MB
278
- let totalSize = 0;
279
- const themes = readdirSync(byThemeDir).filter((f) => statSync(join(byThemeDir, f)).isDirectory());
280
- for (const theme of themes) {
281
- const themeDir = join(byThemeDir, theme);
282
- const svgFiles = readdirSync(themeDir).filter((f) => f.endsWith('.svg'));
283
- for (const file of svgFiles) {
284
- const stats = statSync(join(themeDir, file));
285
- totalSize += stats.size;
286
- }
287
- }
288
- assert.ok(totalSize < MAX_TOTAL_SIZE, `Total by-theme size is ${(totalSize / 1024 / 1024).toFixed(2)}MB, exceeds 10MB limit`);
289
- });
290
- it('should have markdown files under 2MB each', () => {
291
- const MAX_MD_SIZE = 2 * 1024 * 1024; // 2MB per markdown file
292
- const mdFiles = ['team-photos.md', 'role-gallery.md'];
293
- for (const file of mdFiles) {
294
- const filePath = join(facesDir, file);
295
- if (existsSync(filePath)) {
296
- const stats = statSync(filePath);
297
- assert.ok(stats.size < MAX_MD_SIZE, `${file} is ${(stats.size / 1024).toFixed(2)}KB, exceeds 2MB limit`);
298
- }
299
- }
300
- });
301
- it('should have SVG files that parse quickly (no excessive complexity)', () => {
302
- const byThemeDir = join(facesDir, 'by-theme');
303
- const MAX_ELEMENTS = 100; // Max SVG elements per face
304
- // Sample a few files
305
- const themes = readdirSync(byThemeDir)
306
- .filter((f) => statSync(join(byThemeDir, f)).isDirectory())
307
- .slice(0, 3);
308
- for (const theme of themes) {
309
- const themeDir = join(byThemeDir, theme);
310
- const svgFile = readdirSync(themeDir).find((f) => f.endsWith('.svg'));
311
- if (svgFile) {
312
- const content = readFileSync(join(themeDir, svgFile), 'utf-8');
313
- const elementCount = (content.match(/<[a-z]+/gi) || []).length;
314
- assert.ok(elementCount < MAX_ELEMENTS, `${theme}/${svgFile} has ${elementCount} elements, exceeds ${MAX_ELEMENTS} limit`);
315
- }
316
- }
317
- });
318
- });
319
- // ============================================================================
320
- // Integration: Full Matrix Validation
321
- // ============================================================================
322
- describe('Integration: Complete 630-Face Matrix', { skip: 'Story 11-6 not implemented' }, () => {
323
- it('should have no missing theme-agent combinations', () => {
324
- const byThemeDir = join(facesDir, 'by-theme');
325
- const byRoleDir = join(facesDir, 'by-role');
326
- const themes = getAllThemes();
327
- const missing = [];
328
- // by-theme uses character names, so check count per theme
329
- for (const theme of themes) {
330
- const themeDir = join(byThemeDir, theme);
331
- if (!existsSync(themeDir)) {
332
- missing.push(`${theme}/ (directory missing)`);
333
- continue;
334
- }
335
- const svgCount = readdirSync(themeDir).filter((f) => f.endsWith('.svg')).length;
336
- if (svgCount !== EXPECTED_AGENT_COUNT) {
337
- missing.push(`${theme}/ (has ${svgCount} SVGs, expected ${EXPECTED_AGENT_COUNT})`);
338
- }
339
- }
340
- // by-role uses theme names, so verify each role has all themes
341
- for (const agent of AGENTS) {
342
- const roleDir = join(byRoleDir, agent);
343
- if (!existsSync(roleDir)) {
344
- missing.push(`by-role/${agent}/ (directory missing)`);
345
- continue;
346
- }
347
- for (const theme of themes) {
348
- const filePath = join(roleDir, `${theme}.svg`);
349
- if (!existsSync(filePath)) {
350
- missing.push(`by-role/${agent}/${theme}.svg`);
351
- }
352
- }
353
- }
354
- assert.strictEqual(missing.length, 0, `Missing ${missing.length} face files: ${missing.slice(0, 10).join(', ')}${missing.length > 10 ? '...' : ''}`);
355
- });
356
- it('should have consistent directory structure', () => {
357
- const byThemeDir = join(facesDir, 'by-theme');
358
- const byRoleDir = join(facesDir, 'by-role');
359
- // by-theme should have 63 dirs
360
- const themeDirs = readdirSync(byThemeDir).filter((f) => statSync(join(byThemeDir, f)).isDirectory());
361
- // by-role should have 10 dirs
362
- const roleDirs = readdirSync(byRoleDir).filter((f) => statSync(join(byRoleDir, f)).isDirectory());
363
- assert.strictEqual(themeDirs.length, EXPECTED_THEME_COUNT, 'by-theme should have 63 dirs');
364
- assert.strictEqual(roleDirs.length, EXPECTED_AGENT_COUNT, 'by-role should have 10 dirs');
365
- // Each role dir should have 63 SVGs
366
- for (const role of roleDirs) {
367
- const svgs = readdirSync(join(byRoleDir, role)).filter((f) => f.endsWith('.svg'));
368
- assert.strictEqual(svgs.length, EXPECTED_THEME_COUNT, `by-role/${role} should have 63 SVGs`);
369
- }
370
- });
371
- });
372
- //# sourceMappingURL=generate-all-faces.test.js.map