@pennyfarthing/core 7.0.1 → 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 +36 -31
  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 -397
  167. package/pennyfarthing-dist/agents/architect.md +0 -171
  168. package/pennyfarthing-dist/agents/dev.md +0 -225
  169. package/pennyfarthing-dist/agents/devops.md +0 -183
  170. package/pennyfarthing-dist/agents/generic-handoff.md +0 -451
  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 -316
  174. package/pennyfarthing-dist/agents/pm.md +0 -153
  175. package/pennyfarthing-dist/agents/reviewer-preflight.md +0 -224
  176. package/pennyfarthing-dist/agents/reviewer.md +0 -315
  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 -480
  180. package/pennyfarthing-dist/agents/tea.md +0 -191
  181. package/pennyfarthing-dist/agents/tech-writer.md +0 -148
  182. package/pennyfarthing-dist/agents/testing-runner.md +0 -420
  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 -117
  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,778 +0,0 @@
1
- #!/usr/bin/env zsh
2
- # Pennyfarthing Repository Utilities
3
- # Provides functions for multi-repo operations with backward compatibility
4
- #
5
- # Usage: source scripts/repo-utils.sh
6
- #
7
- # If .claude/project/repos.yaml exists, uses that configuration.
8
- # Otherwise, falls back to legacy $API_REPO/$UI_REPO environment variables.
9
- #
10
- # Core Functions:
11
- # load_repos_config - Load repos.yaml or fall back to env vars
12
- # get_repos - List all repo names
13
- # get_repos_of_type TYPE - List repos of a specific type (api, ui, adapter, etc.)
14
- # get_repo_path NAME - Get path for a repo
15
- # get_repo_type NAME - Get type for a repo
16
- # get_repo_language NAME - Get language for a repo
17
- # get_test_command NAME - Get test command for a repo
18
- # get_test_filter_flag NAME - Get test filter flag (auto-discovers from language)
19
- # get_build_command NAME - Get build command for a repo
20
- # get_lint_command NAME - Get lint command for a repo
21
- # get_dependencies NAME - Get dependencies for a repo
22
- # get_build_order - Get repos in dependency order
23
- # for_each_repo CMD - Run command in each repo
24
- # for_each_repo_of_type TYPE CMD - Run command in repos of type
25
- # is_legacy_mode - Check if using legacy API_REPO/UI_REPO
26
-
27
- set -euo pipefail
28
-
29
- # Determine PROJECT_ROOT if not set
30
- PROJECT_ROOT="${PROJECT_ROOT:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
31
- REPOS_CONFIG="${PROJECT_ROOT}/.claude/project/pennyfarthing-settings.yaml"
32
-
33
- # Cache for parsed config (associative arrays)
34
- declare -A _REPO_PATHS 2>/dev/null || true
35
- declare -A _REPO_TYPES 2>/dev/null || true
36
- declare -A _REPO_LANGUAGES 2>/dev/null || true
37
- declare -A _REPO_TEST_CMDS 2>/dev/null || true
38
- declare -A _REPO_TEST_FILTER_FLAGS 2>/dev/null || true
39
- declare -A _REPO_BUILD_CMDS 2>/dev/null || true
40
- declare -A _REPO_LINT_CMDS 2>/dev/null || true
41
- declare -A _REPO_DEPS 2>/dev/null || true
42
- declare -a _REPO_NAMES 2>/dev/null || true
43
- declare -a _BUILD_ORDER 2>/dev/null || true
44
- _LEGACY_MODE=false
45
- _CONFIG_LOADED=false
46
-
47
- # ============================================================================
48
- # Configuration Loading
49
- # ============================================================================
50
-
51
- load_repos_config() {
52
- if [[ "$_CONFIG_LOADED" == "true" ]]; then
53
- return 0
54
- fi
55
-
56
- # Reset arrays
57
- _REPO_PATHS=()
58
- _REPO_TYPES=()
59
- _REPO_LANGUAGES=()
60
- _REPO_TEST_CMDS=()
61
- _REPO_TEST_FILTER_FLAGS=()
62
- _REPO_BUILD_CMDS=()
63
- _REPO_LINT_CMDS=()
64
- _REPO_DEPS=()
65
- _REPO_NAMES=()
66
- _BUILD_ORDER=()
67
-
68
- if [[ -f "$REPOS_CONFIG" ]]; then
69
- _parse_repos_yaml
70
- _apply_legacy_compat
71
- _LEGACY_MODE=false
72
- else
73
- _load_legacy_env
74
- _LEGACY_MODE=true
75
- fi
76
-
77
- _CONFIG_LOADED=true
78
- }
79
-
80
- # Parse repos.yaml using yq (preferred) or Python fallback
81
- _parse_repos_yaml() {
82
- if command -v yq &>/dev/null; then
83
- _parse_with_yq
84
- elif command -v python3 &>/dev/null; then
85
- _parse_with_python
86
- else
87
- echo "ERROR: repos.yaml found but no YAML parser available (yq or python3)" >&2
88
- echo "Install yq: brew install yq" >&2
89
- exit 1
90
- fi
91
- }
92
-
93
- _parse_with_yq() {
94
- local repo_keys
95
- repo_keys=$(yq -r '.repos | keys | .[]' "$REPOS_CONFIG" 2>/dev/null || echo "")
96
-
97
- if [[ -z "$repo_keys" ]]; then
98
- echo "WARNING: No repos defined in $REPOS_CONFIG" >&2
99
- return
100
- fi
101
-
102
- while IFS= read -r repo; do
103
- [[ -z "$repo" ]] && continue
104
- _REPO_NAMES+=("$repo")
105
- _REPO_PATHS[$repo]=$(yq -r ".repos.\"$repo\".path // \"$repo\"" "$REPOS_CONFIG")
106
- _REPO_TYPES[$repo]=$(yq -r ".repos.\"$repo\".type // \"unknown\"" "$REPOS_CONFIG")
107
- _REPO_LANGUAGES[$repo]=$(yq -r ".repos.\"$repo\".language // \"unknown\"" "$REPOS_CONFIG")
108
- _REPO_TEST_CMDS[$repo]=$(yq -r ".repos.\"$repo\".test_command // \"\"" "$REPOS_CONFIG")
109
- _REPO_TEST_FILTER_FLAGS[$repo]=$(yq -r ".repos.\"$repo\".test_filter_flag // \"\"" "$REPOS_CONFIG")
110
- _REPO_BUILD_CMDS[$repo]=$(yq -r ".repos.\"$repo\".build_command // \"\"" "$REPOS_CONFIG")
111
- _REPO_LINT_CMDS[$repo]=$(yq -r ".repos.\"$repo\".lint_command // \"\"" "$REPOS_CONFIG")
112
-
113
- # Dependencies as comma-separated list
114
- local deps
115
- deps=$(yq -r ".repos.\"$repo\".dependencies // [] | join(\",\")" "$REPOS_CONFIG")
116
- _REPO_DEPS[$repo]="$deps"
117
- done <<< "$repo_keys"
118
-
119
- # Build order (explicit or default to repo order)
120
- local build_order
121
- build_order=$(yq -r '.build_order // [] | .[]' "$REPOS_CONFIG" 2>/dev/null || echo "")
122
- if [[ -n "$build_order" ]]; then
123
- while IFS= read -r repo; do
124
- [[ -n "$repo" ]] && _BUILD_ORDER+=("$repo")
125
- done <<< "$build_order"
126
- elif [[ ${#_REPO_NAMES[@]} -gt 0 ]]; then
127
- _BUILD_ORDER=("${_REPO_NAMES[@]}")
128
- fi
129
- }
130
-
131
- _parse_with_python() {
132
- local result
133
- result=$(python3 << 'PYTHON_SCRIPT'
134
- import yaml
135
- import json
136
- import sys
137
- import os
138
-
139
- config_path = os.environ.get('REPOS_CONFIG', '.claude/project/repos.yaml')
140
- try:
141
- with open(config_path) as f:
142
- config = yaml.safe_load(f)
143
- except Exception as e:
144
- print(json.dumps({'error': str(e)}))
145
- sys.exit(1)
146
-
147
- repos = config.get('repos', {})
148
- result = {
149
- 'repos': [],
150
- 'build_order': config.get('build_order', list(repos.keys()))
151
- }
152
-
153
- for name, repo in repos.items():
154
- if repo is None:
155
- repo = {}
156
- result['repos'].append({
157
- 'name': name,
158
- 'path': repo.get('path', name),
159
- 'type': repo.get('type', 'unknown'),
160
- 'language': repo.get('language', 'unknown'),
161
- 'test_command': repo.get('test_command', ''),
162
- 'test_filter_flag': repo.get('test_filter_flag', ''),
163
- 'build_command': repo.get('build_command', ''),
164
- 'lint_command': repo.get('lint_command', ''),
165
- 'dependencies': ','.join(repo.get('dependencies', []))
166
- })
167
-
168
- print(json.dumps(result))
169
- PYTHON_SCRIPT
170
- )
171
-
172
- if echo "$result" | grep -q '"error"'; then
173
- echo "ERROR parsing repos.yaml: $(echo "$result" | python3 -c 'import json,sys; print(json.load(sys.stdin).get("error","unknown"))')" >&2
174
- exit 1
175
- fi
176
-
177
- # Parse JSON output into bash arrays
178
- while IFS= read -r line; do
179
- local name path type language test_cmd test_filter_flag build_cmd lint_cmd deps
180
- name=$(echo "$line" | python3 -c 'import json,sys; print(json.load(sys.stdin)["name"])')
181
- path=$(echo "$line" | python3 -c 'import json,sys; print(json.load(sys.stdin)["path"])')
182
- type=$(echo "$line" | python3 -c 'import json,sys; print(json.load(sys.stdin)["type"])')
183
- language=$(echo "$line" | python3 -c 'import json,sys; print(json.load(sys.stdin)["language"])')
184
- test_cmd=$(echo "$line" | python3 -c 'import json,sys; print(json.load(sys.stdin)["test_command"])')
185
- test_filter_flag=$(echo "$line" | python3 -c 'import json,sys; print(json.load(sys.stdin)["test_filter_flag"])')
186
- build_cmd=$(echo "$line" | python3 -c 'import json,sys; print(json.load(sys.stdin)["build_command"])')
187
- lint_cmd=$(echo "$line" | python3 -c 'import json,sys; print(json.load(sys.stdin)["lint_command"])')
188
- deps=$(echo "$line" | python3 -c 'import json,sys; print(json.load(sys.stdin)["dependencies"])')
189
-
190
- _REPO_NAMES+=("$name")
191
- _REPO_PATHS[$name]="$path"
192
- _REPO_TYPES[$name]="$type"
193
- _REPO_LANGUAGES[$name]="$language"
194
- _REPO_TEST_CMDS[$name]="$test_cmd"
195
- _REPO_TEST_FILTER_FLAGS[$name]="$test_filter_flag"
196
- _REPO_BUILD_CMDS[$name]="$build_cmd"
197
- _REPO_LINT_CMDS[$name]="$lint_cmd"
198
- _REPO_DEPS[$name]="$deps"
199
- done < <(echo "$result" | python3 -c 'import json,sys; [print(json.dumps(r)) for r in json.load(sys.stdin)["repos"]]')
200
-
201
- # Build order
202
- while IFS= read -r repo; do
203
- [[ -n "$repo" ]] && _BUILD_ORDER+=("$repo")
204
- done < <(echo "$result" | python3 -c 'import json,sys; [print(r) for r in json.load(sys.stdin)["build_order"]]')
205
- }
206
-
207
- # Apply legacy_compat section - generate $API_REPO and $UI_REPO for backward compat
208
- _apply_legacy_compat() {
209
- local api_repo ui_repo
210
-
211
- if command -v yq &>/dev/null; then
212
- api_repo=$(yq -r '.legacy_compat.api_repo // ""' "$REPOS_CONFIG" 2>/dev/null || echo "")
213
- ui_repo=$(yq -r '.legacy_compat.ui_repo // ""' "$REPOS_CONFIG" 2>/dev/null || echo "")
214
- elif command -v python3 &>/dev/null; then
215
- api_repo=$(python3 -c "import yaml; c=yaml.safe_load(open('$REPOS_CONFIG')); print(c.get('legacy_compat',{}).get('api_repo','') or '')" 2>/dev/null || echo "")
216
- ui_repo=$(python3 -c "import yaml; c=yaml.safe_load(open('$REPOS_CONFIG')); print(c.get('legacy_compat',{}).get('ui_repo','') or '')" 2>/dev/null || echo "")
217
- fi
218
-
219
- # Export legacy env vars if defined in repos.yaml
220
- if [[ -n "$api_repo" && "$api_repo" != "null" ]]; then
221
- export API_REPO="$api_repo"
222
- fi
223
- if [[ -n "$ui_repo" && "$ui_repo" != "null" ]]; then
224
- export UI_REPO="$ui_repo"
225
- fi
226
- }
227
-
228
- # Fallback to legacy environment variables
229
- _load_legacy_env() {
230
- if [[ -n "${API_REPO:-}" ]]; then
231
- _REPO_NAMES+=("$API_REPO")
232
- _REPO_PATHS[$API_REPO]="$API_REPO"
233
- _REPO_TYPES[$API_REPO]="api"
234
- _REPO_LANGUAGES[$API_REPO]="go"
235
- _REPO_TEST_CMDS[$API_REPO]="just test"
236
- _REPO_BUILD_CMDS[$API_REPO]="just build"
237
- _REPO_LINT_CMDS[$API_REPO]="golangci-lint run"
238
- _REPO_DEPS[$API_REPO]=""
239
- fi
240
-
241
- if [[ -n "${UI_REPO:-}" ]]; then
242
- _REPO_NAMES+=("$UI_REPO")
243
- _REPO_PATHS[$UI_REPO]="$UI_REPO"
244
- _REPO_TYPES[$UI_REPO]="ui"
245
- _REPO_LANGUAGES[$UI_REPO]="typescript"
246
- _REPO_TEST_CMDS[$UI_REPO]="npm run test -- --run"
247
- _REPO_BUILD_CMDS[$UI_REPO]="npm run build"
248
- _REPO_LINT_CMDS[$UI_REPO]="npm run lint"
249
- _REPO_DEPS[$UI_REPO]=""
250
- fi
251
-
252
- # Handle empty array case for set -u compatibility
253
- if [[ ${#_REPO_NAMES[@]} -gt 0 ]]; then
254
- _BUILD_ORDER=("${_REPO_NAMES[@]}")
255
- else
256
- _BUILD_ORDER=()
257
- fi
258
- }
259
-
260
- # ============================================================================
261
- # Public API Functions
262
- # ============================================================================
263
-
264
- # Check if using legacy mode (no repos.yaml)
265
- is_legacy_mode() {
266
- load_repos_config
267
- [[ "$_LEGACY_MODE" == "true" ]]
268
- }
269
-
270
- # Get all repo names
271
- get_repos() {
272
- load_repos_config
273
- printf '%s\n' "${_REPO_NAMES[@]}"
274
- }
275
-
276
- # Get number of repos
277
- get_repo_count() {
278
- load_repos_config
279
- echo "${#_REPO_NAMES[@]}"
280
- }
281
-
282
- # Get repos of a specific type
283
- get_repos_of_type() {
284
- local type="$1"
285
- load_repos_config
286
-
287
- for repo in "${_REPO_NAMES[@]}"; do
288
- if [[ "${_REPO_TYPES[$repo]:-}" == "$type" ]]; then
289
- echo "$repo"
290
- fi
291
- done
292
- }
293
-
294
- # Get path for a repo (relative to PROJECT_ROOT)
295
- get_repo_path() {
296
- local name="$1"
297
- load_repos_config
298
- echo "${_REPO_PATHS[$name]:-}"
299
- }
300
-
301
- # Get full path for a repo
302
- get_repo_full_path() {
303
- local name="$1"
304
- local path
305
- path=$(get_repo_path "$name")
306
- if [[ -n "$path" ]]; then
307
- echo "$PROJECT_ROOT/$path"
308
- fi
309
- }
310
-
311
- # Get type for a repo
312
- get_repo_type() {
313
- local name="$1"
314
- load_repos_config
315
- echo "${_REPO_TYPES[$name]:-unknown}"
316
- }
317
-
318
- # Get language for a repo
319
- get_repo_language() {
320
- local name="$1"
321
- load_repos_config
322
- echo "${_REPO_LANGUAGES[$name]:-unknown}"
323
- }
324
-
325
- # Get test command for a repo
326
- get_test_command() {
327
- local name="$1"
328
- load_repos_config
329
- echo "${_REPO_TEST_CMDS[$name]:-}"
330
- }
331
-
332
- # Get test filter flag for a repo
333
- # Falls back to language-based defaults if not specified
334
- get_test_filter_flag() {
335
- local name="$1"
336
- load_repos_config
337
-
338
- local flag="${_REPO_TEST_FILTER_FLAGS[$name]:-}"
339
-
340
- # If specified in config, use it
341
- if [[ -n "$flag" ]]; then
342
- echo "$flag"
343
- return 0
344
- fi
345
-
346
- # Auto-discover based on language
347
- local language="${_REPO_LANGUAGES[$name]:-unknown}"
348
- case "$language" in
349
- go)
350
- echo "-run"
351
- ;;
352
- typescript|javascript)
353
- # Detect Vitest vs Jest from test command
354
- local test_cmd="${_REPO_TEST_CMDS[$name]:-}"
355
- if [[ "$test_cmd" == *"vitest"* ]] || [[ "$test_cmd" == *"npm run test"* ]]; then
356
- echo "-t" # Vitest
357
- else
358
- echo "--testNamePattern" # Jest
359
- fi
360
- ;;
361
- python)
362
- echo "-k" # pytest
363
- ;;
364
- rust)
365
- echo "--" # cargo test uses -- to pass args
366
- ;;
367
- ruby)
368
- echo "-n" # minitest
369
- ;;
370
- java|kotlin)
371
- echo "--tests" # Gradle
372
- ;;
373
- *)
374
- echo "" # Unknown - no filter support
375
- ;;
376
- esac
377
- }
378
-
379
- # Get build command for a repo
380
- get_build_command() {
381
- local name="$1"
382
- load_repos_config
383
- echo "${_REPO_BUILD_CMDS[$name]:-}"
384
- }
385
-
386
- # Get lint command for a repo
387
- get_lint_command() {
388
- local name="$1"
389
- load_repos_config
390
- echo "${_REPO_LINT_CMDS[$name]:-}"
391
- }
392
-
393
- # Get dependencies for a repo (comma-separated)
394
- get_dependencies() {
395
- local name="$1"
396
- load_repos_config
397
- echo "${_REPO_DEPS[$name]:-}"
398
- }
399
-
400
- # Get repos in build/dependency order
401
- get_build_order() {
402
- load_repos_config
403
- printf '%s\n' "${_BUILD_ORDER[@]}"
404
- }
405
-
406
- # ============================================================================
407
- # Iteration Functions
408
- # ============================================================================
409
-
410
- # Run command in each repo
411
- # Usage: for_each_repo "git status"
412
- for_each_repo() {
413
- local cmd="$1"
414
- load_repos_config
415
-
416
- for repo in "${_REPO_NAMES[@]}"; do
417
- local path="${_REPO_PATHS[$repo]}"
418
- local full_path="$PROJECT_ROOT/$path"
419
-
420
- if [[ -d "$full_path" ]]; then
421
- echo "=== $repo ($path) ==="
422
- (cd "$full_path" && eval "$cmd") || true
423
- else
424
- echo "SKIP: $repo (path not found: $full_path)"
425
- fi
426
- done
427
- }
428
-
429
- # Run command in each repo of a specific type
430
- # Usage: for_each_repo_of_type "api" "just test"
431
- for_each_repo_of_type() {
432
- local type="$1"
433
- local cmd="$2"
434
- load_repos_config
435
-
436
- for repo in "${_REPO_NAMES[@]}"; do
437
- if [[ "${_REPO_TYPES[$repo]:-}" == "$type" ]]; then
438
- local path="${_REPO_PATHS[$repo]}"
439
- local full_path="$PROJECT_ROOT/$path"
440
-
441
- if [[ -d "$full_path" ]]; then
442
- echo "=== $repo ($path) ==="
443
- (cd "$full_path" && eval "$cmd") || true
444
- fi
445
- fi
446
- done
447
- }
448
-
449
- # Run command in repos in build order
450
- # Usage: for_each_repo_ordered "make build"
451
- for_each_repo_ordered() {
452
- local cmd="$1"
453
- load_repos_config
454
-
455
- for repo in "${_BUILD_ORDER[@]}"; do
456
- local path="${_REPO_PATHS[$repo]}"
457
- local full_path="$PROJECT_ROOT/$path"
458
-
459
- if [[ -d "$full_path" ]]; then
460
- echo "=== $repo ($path) ==="
461
- (cd "$full_path" && eval "$cmd") || true
462
- fi
463
- done
464
- }
465
-
466
- # ============================================================================
467
- # Test/Build Functions
468
- # ============================================================================
469
-
470
- # Run tests in all repos, respecting build order
471
- run_all_tests() {
472
- load_repos_config
473
-
474
- local failed=0
475
- for repo in "${_BUILD_ORDER[@]}"; do
476
- local path="${_REPO_PATHS[$repo]}"
477
- local test_cmd="${_REPO_TEST_CMDS[$repo]}"
478
- local full_path="$PROJECT_ROOT/$path"
479
-
480
- if [[ -z "$test_cmd" ]]; then
481
- echo "SKIP: $repo (no test command)"
482
- continue
483
- fi
484
-
485
- if [[ ! -d "$full_path" ]]; then
486
- echo "SKIP: $repo (path not found)"
487
- continue
488
- fi
489
-
490
- echo "=== Testing $repo ==="
491
- if (cd "$full_path" && eval "$test_cmd"); then
492
- echo "PASS: $repo"
493
- else
494
- echo "FAIL: $repo"
495
- ((failed++)) || true
496
- fi
497
- done
498
-
499
- return $failed
500
- }
501
-
502
- # Run tests in repos of a specific type
503
- run_tests_of_type() {
504
- local type="$1"
505
- load_repos_config
506
-
507
- local failed=0
508
- for repo in "${_BUILD_ORDER[@]}"; do
509
- if [[ "${_REPO_TYPES[$repo]:-}" != "$type" ]]; then
510
- continue
511
- fi
512
-
513
- local path="${_REPO_PATHS[$repo]}"
514
- local test_cmd="${_REPO_TEST_CMDS[$repo]}"
515
- local full_path="$PROJECT_ROOT/$path"
516
-
517
- if [[ -z "$test_cmd" ]]; then
518
- echo "SKIP: $repo (no test command)"
519
- continue
520
- fi
521
-
522
- if [[ ! -d "$full_path" ]]; then
523
- echo "SKIP: $repo (path not found)"
524
- continue
525
- fi
526
-
527
- echo "=== Testing $repo ==="
528
- if (cd "$full_path" && eval "$test_cmd"); then
529
- echo "PASS: $repo"
530
- else
531
- echo "FAIL: $repo"
532
- ((failed++)) || true
533
- fi
534
- done
535
-
536
- return $failed
537
- }
538
-
539
- # ============================================================================
540
- # Utility Functions
541
- # ============================================================================
542
-
543
- # Filter repos by a list (for story-scoped operations)
544
- # Usage: filter_repos "conductor-api,conductor-ui" or "all" or "api"
545
- filter_repos() {
546
- local filter="$1"
547
- load_repos_config
548
-
549
- case "$filter" in
550
- all|both)
551
- get_repos
552
- ;;
553
- api|ui|adapter|service|shared|lib)
554
- get_repos_of_type "$filter"
555
- ;;
556
- *)
557
- # Treat as comma-separated list of repo names
558
- echo "$filter" | tr ',' '\n'
559
- ;;
560
- esac
561
- }
562
-
563
- # Check if a repo exists in the configuration
564
- repo_exists() {
565
- local name="$1"
566
- load_repos_config
567
-
568
- for repo in "${_REPO_NAMES[@]}"; do
569
- if [[ "$repo" == "$name" ]]; then
570
- return 0
571
- fi
572
- done
573
- return 1
574
- }
575
-
576
- # Get configuration summary (for debugging)
577
- show_config() {
578
- load_repos_config
579
-
580
- echo "=== Repo Configuration ==="
581
- echo "Mode: $(is_legacy_mode && echo 'Legacy (API_REPO/UI_REPO)' || echo 'repos.yaml')"
582
- echo "Config: $REPOS_CONFIG"
583
- echo "Repos: ${#_REPO_NAMES[@]}"
584
- echo ""
585
-
586
- for repo in "${_REPO_NAMES[@]}"; do
587
- echo "[$repo]"
588
- echo " Path: ${_REPO_PATHS[$repo]:-n/a}"
589
- echo " Type: ${_REPO_TYPES[$repo]:-n/a}"
590
- echo " Language: ${_REPO_LANGUAGES[$repo]:-n/a}"
591
- echo " Test: ${_REPO_TEST_CMDS[$repo]:-n/a}"
592
- echo " Filter Flag: $(get_test_filter_flag "$repo")"
593
- echo " Build: ${_REPO_BUILD_CMDS[$repo]:-n/a}"
594
- echo " Deps: ${_REPO_DEPS[$repo]:-none}"
595
- echo ""
596
- done
597
-
598
- echo "Build Order: ${_BUILD_ORDER[*]}"
599
- }
600
-
601
- # ============================================================================
602
- # Testing Configuration Functions
603
- # ============================================================================
604
-
605
- # Get test environment variables for a repo (as KEY=VALUE lines)
606
- # Usage: eval "$(get_test_env "conductor-api")"
607
- get_test_env() {
608
- local name="$1"
609
- load_repos_config
610
-
611
- if [[ ! -f "$REPOS_CONFIG" ]]; then
612
- return 0
613
- fi
614
-
615
- if command -v yq &>/dev/null; then
616
- yq -r ".repos.\"$name\".test_env // {} | to_entries | .[] | \"export \" + .key + \"=\\\"\" + .value + \"\\\"\"" "$REPOS_CONFIG" 2>/dev/null || true
617
- elif command -v python3 &>/dev/null; then
618
- python3 -c "
619
- import yaml
620
- with open('$REPOS_CONFIG') as f:
621
- c = yaml.safe_load(f)
622
- env = c.get('repos', {}).get('$name', {}).get('test_env', {}) or {}
623
- for k, v in env.items():
624
- print(f'export {k}=\"{v}\"')
625
- " 2>/dev/null || true
626
- fi
627
- }
628
-
629
- # Get test log directory from config
630
- # Usage: LOG_DIR=$(get_test_log_dir)
631
- get_test_log_dir() {
632
- load_repos_config
633
-
634
- local log_dir=".session" # default
635
-
636
- if [[ -f "$REPOS_CONFIG" ]]; then
637
- if command -v yq &>/dev/null; then
638
- log_dir=$(yq -r '.testing.log_dir // ".session"' "$REPOS_CONFIG" 2>/dev/null || echo ".session")
639
- elif command -v python3 &>/dev/null; then
640
- log_dir=$(python3 -c "
641
- import yaml
642
- with open('$REPOS_CONFIG') as f:
643
- c = yaml.safe_load(f)
644
- print(c.get('testing', {}).get('log_dir', '.session') or '.session')
645
- " 2>/dev/null || echo ".session")
646
- fi
647
- fi
648
-
649
- echo "$PROJECT_ROOT/$log_dir"
650
- }
651
-
652
- # Get skip patterns for a language
653
- # Usage: PATTERNS=$(get_skip_patterns "go")
654
- get_skip_patterns() {
655
- local language="$1"
656
- load_repos_config
657
-
658
- if [[ ! -f "$REPOS_CONFIG" ]]; then
659
- # Default patterns if no config
660
- case "$language" in
661
- go) echo 't\.Skip' ;;
662
- typescript|javascript) echo 'it\.skip|describe\.skip|test\.skip' ;;
663
- python) echo '@pytest\.mark\.skip|pytest\.skip' ;;
664
- *) echo '' ;;
665
- esac
666
- return 0
667
- fi
668
-
669
- if command -v yq &>/dev/null; then
670
- local patterns
671
- patterns=$(yq -r ".testing.skip_patterns_by_language.\"$language\".patterns // [] | join(\"|\")" "$REPOS_CONFIG" 2>/dev/null || echo "")
672
- if [[ -n "$patterns" ]]; then
673
- echo "$patterns"
674
- fi
675
- elif command -v python3 &>/dev/null; then
676
- python3 -c "
677
- import yaml
678
- with open('$REPOS_CONFIG') as f:
679
- c = yaml.safe_load(f)
680
- patterns = c.get('testing', {}).get('skip_patterns_by_language', {}).get('$language', {}).get('patterns', []) or []
681
- print('|'.join(patterns))
682
- " 2>/dev/null || true
683
- fi
684
- }
685
-
686
- # Get skip exceptions for a language
687
- # Usage: EXCEPTIONS=$(get_skip_exceptions "go")
688
- get_skip_exceptions() {
689
- local language="$1"
690
- load_repos_config
691
-
692
- if [[ ! -f "$REPOS_CONFIG" ]]; then
693
- # Default exceptions if no config
694
- case "$language" in
695
- go) echo 'LocalStack|not available|CI environment' ;;
696
- *) echo '' ;;
697
- esac
698
- return 0
699
- fi
700
-
701
- if command -v yq &>/dev/null; then
702
- yq -r ".testing.skip_patterns_by_language.\"$language\".exceptions // [] | join(\"|\")" "$REPOS_CONFIG" 2>/dev/null || echo ""
703
- elif command -v python3 &>/dev/null; then
704
- python3 -c "
705
- import yaml
706
- with open('$REPOS_CONFIG') as f:
707
- c = yaml.safe_load(f)
708
- exceptions = c.get('testing', {}).get('skip_patterns_by_language', {}).get('$language', {}).get('exceptions', []) or []
709
- print('|'.join(exceptions))
710
- " 2>/dev/null || true
711
- fi
712
- }
713
-
714
- # Get test file pattern for a language
715
- # Usage: PATTERN=$(get_test_file_pattern "go")
716
- get_test_file_pattern() {
717
- local language="$1"
718
- load_repos_config
719
-
720
- if [[ ! -f "$REPOS_CONFIG" ]]; then
721
- # Default patterns if no config
722
- case "$language" in
723
- go) echo '*_test.go' ;;
724
- typescript|javascript) echo '*.test.*' ;;
725
- python) echo 'test_*.py' ;;
726
- rust) echo '*.rs' ;;
727
- *) echo '*' ;;
728
- esac
729
- return 0
730
- fi
731
-
732
- if command -v yq &>/dev/null; then
733
- local pattern
734
- pattern=$(yq -r ".testing.skip_patterns_by_language.\"$language\".file_pattern // \"\"" "$REPOS_CONFIG" 2>/dev/null || echo "")
735
- if [[ -n "$pattern" && "$pattern" != "null" ]]; then
736
- echo "$pattern"
737
- else
738
- # Fallback to defaults
739
- case "$language" in
740
- go) echo '*_test.go' ;;
741
- typescript|javascript) echo '*.test.*' ;;
742
- python) echo 'test_*.py' ;;
743
- *) echo '*' ;;
744
- esac
745
- fi
746
- fi
747
- }
748
-
749
- # Get container command from config
750
- # Usage: CMD=$(get_container_command)
751
- get_container_command() {
752
- load_repos_config
753
-
754
- if [[ ! -f "$REPOS_CONFIG" ]]; then
755
- echo ""
756
- return 0
757
- fi
758
-
759
- if command -v yq &>/dev/null; then
760
- yq -r '.testing.container_command // ""' "$REPOS_CONFIG" 2>/dev/null || echo ""
761
- elif command -v python3 &>/dev/null; then
762
- python3 -c "
763
- import yaml
764
- with open('$REPOS_CONFIG') as f:
765
- c = yaml.safe_load(f)
766
- print(c.get('testing', {}).get('container_command', '') or '')
767
- " 2>/dev/null || echo ""
768
- fi
769
- }
770
-
771
- # ============================================================================
772
- # Initialization
773
- # ============================================================================
774
-
775
- # Auto-load config when sourced (can be disabled with REPO_UTILS_LAZY=1)
776
- if [[ "${REPO_UTILS_LAZY:-0}" != "1" ]]; then
777
- load_repos_config
778
- fi