@pennyfarthing/core 11.0.0 → 11.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/README.md +81 -23
  2. package/package.json +1 -1
  3. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts +20 -0
  4. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts.map +1 -0
  5. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js +278 -0
  6. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js.map +1 -0
  7. package/packages/core/dist/cli/utils/constants.d.ts +8 -2
  8. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
  9. package/packages/core/dist/cli/utils/constants.js +4 -1
  10. package/packages/core/dist/cli/utils/constants.js.map +1 -1
  11. package/packages/core/dist/cli/utils/constants.test.d.ts +10 -0
  12. package/packages/core/dist/cli/utils/constants.test.d.ts.map +1 -0
  13. package/packages/core/dist/cli/utils/constants.test.js +38 -0
  14. package/packages/core/dist/cli/utils/constants.test.js.map +1 -0
  15. package/packages/core/dist/consultation/consultation-protocol.d.ts +139 -0
  16. package/packages/core/dist/consultation/consultation-protocol.d.ts.map +1 -0
  17. package/packages/core/dist/consultation/consultation-protocol.js +178 -0
  18. package/packages/core/dist/consultation/consultation-protocol.js.map +1 -0
  19. package/packages/core/dist/consultation/consultation-protocol.test.d.ts +20 -0
  20. package/packages/core/dist/consultation/consultation-protocol.test.d.ts.map +1 -0
  21. package/packages/core/dist/consultation/consultation-protocol.test.js +474 -0
  22. package/packages/core/dist/consultation/consultation-protocol.test.js.map +1 -0
  23. package/packages/core/dist/consultation/dialogue-manager.d.ts +75 -0
  24. package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -0
  25. package/packages/core/dist/consultation/dialogue-manager.js +334 -0
  26. package/packages/core/dist/consultation/dialogue-manager.js.map +1 -0
  27. package/packages/core/dist/consultation/dialogue-manager.test.d.ts +19 -0
  28. package/packages/core/dist/consultation/dialogue-manager.test.d.ts.map +1 -0
  29. package/packages/core/dist/consultation/dialogue-manager.test.js +444 -0
  30. package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -0
  31. package/packages/core/dist/public/js/react/react.js +3 -3
  32. package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
  33. package/packages/core/dist/scripts/theme-detail.test.js +199 -0
  34. package/packages/core/dist/server/api/git.d.ts +13 -1
  35. package/packages/core/dist/server/api/git.d.ts.map +1 -1
  36. package/packages/core/dist/server/api/git.js +53 -34
  37. package/packages/core/dist/server/api/git.js.map +1 -1
  38. package/packages/core/dist/server/api/health-score.d.ts.map +1 -1
  39. package/packages/core/dist/server/api/health-score.js +25 -1
  40. package/packages/core/dist/server/api/health-score.js.map +1 -1
  41. package/packages/core/dist/server/api/settings.d.ts.map +1 -1
  42. package/packages/core/dist/server/api/settings.js +63 -1
  43. package/packages/core/dist/server/api/settings.js.map +1 -1
  44. package/packages/core/dist/server/api/theme-agents.d.ts.map +1 -1
  45. package/packages/core/dist/server/api/theme-agents.js +61 -0
  46. package/packages/core/dist/server/api/theme-agents.js.map +1 -1
  47. package/packages/core/dist/server/server.d.ts.map +1 -1
  48. package/packages/core/dist/server/server.js +17 -12
  49. package/packages/core/dist/server/server.js.map +1 -1
  50. package/packages/core/dist/shared/skill-search.test.js +2 -2
  51. package/packages/core/dist/workflow/gate-file-validation.d.ts +49 -0
  52. package/packages/core/dist/workflow/gate-file-validation.d.ts.map +1 -0
  53. package/packages/core/dist/workflow/gate-file-validation.js +157 -0
  54. package/packages/core/dist/workflow/gate-file-validation.js.map +1 -0
  55. package/packages/core/dist/workflow/gate-file-validation.test.d.ts +19 -0
  56. package/packages/core/dist/workflow/gate-file-validation.test.d.ts.map +1 -0
  57. package/packages/core/dist/workflow/gate-file-validation.test.js +536 -0
  58. package/packages/core/dist/workflow/gate-file-validation.test.js.map +1 -0
  59. package/packages/core/dist/workflow/gate-schema-validation.test.d.ts +14 -0
  60. package/packages/core/dist/workflow/gate-schema-validation.test.d.ts.map +1 -0
  61. package/packages/core/dist/workflow/gate-schema-validation.test.js +339 -0
  62. package/packages/core/dist/workflow/gate-schema-validation.test.js.map +1 -0
  63. package/packages/core/dist/workflow/handoff.js +2 -2
  64. package/packages/core/dist/workflow/handoff.js.map +1 -1
  65. package/packages/core/dist/workflow/handoff.test.js +16 -0
  66. package/packages/core/dist/workflow/handoff.test.js.map +1 -1
  67. package/packages/core/dist/workflow/workflow-schema.d.ts +4 -2
  68. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
  69. package/packages/core/dist/workflow/workflow-schema.js +43 -8
  70. package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
  71. package/pennyfarthing-dist/agents/README.md +6 -14
  72. package/pennyfarthing-dist/agents/architect.md +43 -29
  73. package/pennyfarthing-dist/agents/ba.md +30 -29
  74. package/pennyfarthing-dist/agents/dev.md +32 -43
  75. package/pennyfarthing-dist/agents/devops.md +57 -21
  76. package/pennyfarthing-dist/agents/orchestrator.md +3 -10
  77. package/pennyfarthing-dist/agents/pm.md +45 -31
  78. package/pennyfarthing-dist/agents/reviewer.md +20 -66
  79. package/pennyfarthing-dist/agents/sm-setup.md +2 -2
  80. package/pennyfarthing-dist/agents/sm.md +8 -30
  81. package/pennyfarthing-dist/agents/tea.md +25 -41
  82. package/pennyfarthing-dist/agents/tech-writer.md +33 -90
  83. package/pennyfarthing-dist/agents/ux-designer.md +39 -39
  84. package/pennyfarthing-dist/commands/benchmark-control.md +8 -64
  85. package/pennyfarthing-dist/commands/benchmark.md +8 -480
  86. package/pennyfarthing-dist/commands/job-fair.md +8 -97
  87. package/pennyfarthing-dist/commands/pf-benchmark-control.md +70 -0
  88. package/pennyfarthing-dist/commands/pf-benchmark.md +486 -0
  89. package/pennyfarthing-dist/commands/pf-chore.md +4 -4
  90. package/pennyfarthing-dist/commands/pf-ci.md +40 -0
  91. package/pennyfarthing-dist/commands/pf-close-epic.md +9 -27
  92. package/pennyfarthing-dist/commands/pf-continue-session.md +9 -213
  93. package/pennyfarthing-dist/commands/pf-create-branches-from-story.md +11 -353
  94. package/pennyfarthing-dist/commands/pf-docs.md +28 -0
  95. package/pennyfarthing-dist/commands/pf-epic.md +67 -0
  96. package/pennyfarthing-dist/commands/pf-git-cleanup.md +11 -52
  97. package/pennyfarthing-dist/commands/pf-git.md +75 -0
  98. package/pennyfarthing-dist/commands/pf-help.md +110 -128
  99. package/pennyfarthing-dist/commands/pf-job-fair.md +102 -0
  100. package/pennyfarthing-dist/commands/pf-new-work.md +9 -18
  101. package/pennyfarthing-dist/commands/pf-parallel-work.md +6 -66
  102. package/pennyfarthing-dist/commands/pf-release.md +11 -76
  103. package/pennyfarthing-dist/commands/pf-repo-status.md +11 -44
  104. package/pennyfarthing-dist/commands/pf-run-ci.md +8 -111
  105. package/pennyfarthing-dist/commands/pf-session.md +51 -0
  106. package/pennyfarthing-dist/commands/pf-solo.md +447 -0
  107. package/pennyfarthing-dist/commands/pf-sprint-planning.md +8 -104
  108. package/pennyfarthing-dist/commands/pf-standalone.md +1 -1
  109. package/pennyfarthing-dist/commands/pf-start-epic.md +9 -163
  110. package/pennyfarthing-dist/commands/pf-sync-epic-to-jira.md +8 -179
  111. package/pennyfarthing-dist/commands/pf-sync-work-with-sprint.md +8 -368
  112. package/pennyfarthing-dist/commands/pf-update-domain-docs.md +8 -78
  113. package/pennyfarthing-dist/commands/solo.md +8 -442
  114. package/pennyfarthing-dist/guides/agent-behavior.md +13 -13
  115. package/pennyfarthing-dist/guides/agent-coordination.md +7 -7
  116. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -5
  117. package/pennyfarthing-dist/guides/bikerack.md +128 -0
  118. package/pennyfarthing-dist/guides/brownfield-tools.md +133 -0
  119. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +2 -2
  120. package/pennyfarthing-dist/guides/gate-schema.md +227 -0
  121. package/pennyfarthing-dist/guides/gates.md +120 -0
  122. package/pennyfarthing-dist/guides/handoff-cli.md +116 -0
  123. package/pennyfarthing-dist/guides/hooks.md +86 -4
  124. package/pennyfarthing-dist/guides/output-styles.md +65 -0
  125. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +5 -5
  126. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -4
  127. package/pennyfarthing-dist/guides/prompt-patterns.md +5 -5
  128. package/pennyfarthing-dist/guides/reflector.md +4 -4
  129. package/pennyfarthing-dist/guides/session-artifacts.md +1 -1
  130. package/pennyfarthing-dist/guides/skill-schema.md +1 -1
  131. package/pennyfarthing-dist/guides/tandem-protocol.md +13 -1
  132. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  133. package/pennyfarthing-dist/guides/xml-tags.md +5 -4
  134. package/pennyfarthing-dist/personas/themes/hogans-heroes.yaml +11 -22
  135. package/pennyfarthing-dist/personas/themes/stephen-king.yaml +13 -24
  136. package/pennyfarthing-dist/scripts/core/dialogue-manager.sh +322 -0
  137. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +1 -1
  138. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +19 -14
  139. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +191 -57
  140. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +26 -10
  141. package/pennyfarthing-dist/skills/pf-changelog/SKILL.md +4 -4
  142. package/pennyfarthing-dist/skills/pf-sprint/skill.md +1 -1
  143. package/pennyfarthing-dist/skills/skill-registry.schema.json +4 -0
  144. package/pennyfarthing-dist/skills/skill-registry.yaml +5 -0
  145. package/pennyfarthing-dist/workflows/2party-tdd.yaml +11 -0
  146. package/pennyfarthing-dist/workflows/agent-docs.yaml +2 -0
  147. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +4 -0
  148. package/pennyfarthing-dist/workflows/bdd.yaml +4 -0
  149. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  150. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +3 -0
  151. package/pennyfarthing-dist/workflows/tdd.yaml +3 -0
  152. package/pennyfarthing-dist/workflows/trivial.yaml +2 -0
  153. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  154. package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  155. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  156. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  157. package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
  158. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  159. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  160. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  161. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  162. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  163. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  164. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  165. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  166. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  167. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  168. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  169. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  170. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  171. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  172. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  173. package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  174. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  175. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  176. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  177. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  178. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  179. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  180. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  181. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  182. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  183. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  184. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  185. package/pennyfarthing_scripts/bikerack/cli.py +10 -11
  186. package/pennyfarthing_scripts/bikerack/debug_panel.py +218 -0
  187. package/pennyfarthing_scripts/bikerack/diffs_panel.py +203 -27
  188. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  189. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  190. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  191. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  192. package/pennyfarthing_scripts/cli.py +114 -0
  193. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  194. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  195. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  196. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  197. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  198. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  200. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  201. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  202. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  203. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  204. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  205. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  206. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  207. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  208. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  209. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  210. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  211. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  212. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  213. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  214. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  215. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  216. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  217. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  218. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  219. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  220. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  221. package/pennyfarthing_scripts/epic/__init__.py +0 -0
  222. package/pennyfarthing_scripts/epic/cli.py +64 -0
  223. package/pennyfarthing_scripts/gate/__init__.py +1 -0
  224. package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
  225. package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
  226. package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/gate/cli.py +56 -0
  228. package/pennyfarthing_scripts/gate/validate.py +266 -0
  229. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  231. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/git_group/__init__.py +0 -0
  233. package/pennyfarthing_scripts/git_group/cli.py +100 -0
  234. package/pennyfarthing_scripts/handoff/__init__.py +1 -0
  235. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  237. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  238. package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  239. package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  240. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  241. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  242. package/pennyfarthing_scripts/handoff/cli.py +120 -0
  243. package/pennyfarthing_scripts/handoff/complete_phase.py +155 -0
  244. package/pennyfarthing_scripts/handoff/gate_file.py +105 -0
  245. package/pennyfarthing_scripts/handoff/gate_runner.py +152 -0
  246. package/pennyfarthing_scripts/handoff/marker.py +109 -0
  247. package/pennyfarthing_scripts/handoff/resolve_gate.py +152 -0
  248. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  256. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  257. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  259. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  260. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  261. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  262. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  263. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  264. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  265. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  266. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  267. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  268. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  269. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  270. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  271. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  272. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  273. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
  274. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  277. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  278. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  282. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  283. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  284. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  285. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  286. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  287. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  288. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  289. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  291. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  292. package/pennyfarthing_scripts/prime/workflow.py +39 -0
  293. package/pennyfarthing_scripts/session/__init__.py +0 -0
  294. package/pennyfarthing_scripts/session/cli.py +87 -0
  295. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  296. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  297. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  298. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  299. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  302. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  303. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  304. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  305. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  306. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  307. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  309. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  311. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/sprint/story_finish.py +14 -0
  313. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  314. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  315. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  316. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  317. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  318. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  319. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  320. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  321. package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
  322. package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  323. package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  324. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  325. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  326. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  327. package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  328. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  329. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  330. package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  331. package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
  332. package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
  333. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  334. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  335. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  336. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  337. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  338. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  339. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  340. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  341. package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
  342. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  343. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  344. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  345. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  346. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  347. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  348. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  349. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  350. package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  351. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  352. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  353. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  354. package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  355. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  356. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  357. package/pennyfarthing_scripts/tests/test_108_1_gate_migration.py +540 -0
  358. package/pennyfarthing_scripts/tests/test_108_2_remove_handoff_fallback.py +339 -0
  359. package/pennyfarthing_scripts/tests/test_confidence_sm_evaluation.py +253 -0
  360. package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +315 -0
  361. package/pennyfarthing_scripts/tests/test_gate_file_resolution.py +341 -0
  362. package/pennyfarthing_scripts/tests/test_gate_runner.py +620 -0
  363. package/pennyfarthing_scripts/tests/test_handoff_cli.py +929 -0
  364. package/pennyfarthing_scripts/tests/test_handoff_e2e.py +454 -0
  365. package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +464 -0
  366. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  367. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  368. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  369. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  370. package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  371. package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  372. package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  373. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  374. package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  375. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  376. package/pennyfarthing_scripts/validate/adapters/skill_command.py +200 -0
  377. package/pennyfarthing_scripts/validate/adapters/workflow.py +64 -0
  378. package/pennyfarthing_scripts/validate/cli.py +15 -4
  379. package/packages/core/dist/scripts/benchmark-integration.d.ts +0 -182
  380. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +0 -1
  381. package/packages/core/dist/scripts/benchmark-integration.js +0 -691
  382. package/packages/core/dist/scripts/benchmark-integration.js.map +0 -1
  383. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +0 -150
  384. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
  385. package/packages/core/dist/scripts/job-fair-aggregator.js +0 -547
  386. package/packages/core/dist/scripts/job-fair-aggregator.js.map +0 -1
  387. package/pennyfarthing-dist/agents/handoff.md +0 -250
  388. package/pennyfarthing-dist/agents/sm-handoff.md +0 -152
  389. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -112
  390. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  391. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  392. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  393. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  394. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  395. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  396. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  397. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  398. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  399. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  400. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  401. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Pennyfarthing
2
2
 
3
- **v11.0.0** | *The outer loop goes once, the inner loop goes many times.*
3
+ **v11.1.1** | *The outer loop goes once, the inner loop goes many times.*
4
4
 
5
5
  <img src="pennyfarthing.png" alt="Pennyfarthing Logo" width="75" style="float:left; margin:10px">
6
6
 
@@ -35,9 +35,11 @@ The 98 persona themes (Discworld, Star Trek, Breaking Bad, etc.) are instruments
35
35
 
36
36
  ### 3. Integration & Tooling
37
37
 
38
- - **Cyclist Visual Terminal** - Electron-based IDE with 16 draggable Dockview panels, agent portraits, tool visualization, and workflow controls
38
+ - **Cyclist Visual Terminal** - Electron-based IDE with 17 draggable Dockview panels, agent portraits, tool visualization, and workflow controls
39
+ - **BikeRack** - Standalone panel viewer for CLI-first developers — dashboard panels in your browser, Claude in your terminal
39
40
  - **Jira Integration** - Bidirectional sync, epic auto-creation, sprint velocity
40
41
  - **Sprint Management** - Story tracking with `current-sprint.yaml`
42
+ - **Codebase Analysis** - Hotspots, complexity, dead code, dependencies, code markers, and health score via `pf debug`
41
43
 
42
44
  ---
43
45
 
@@ -81,6 +83,7 @@ All panels are draggable, floatable, and splittable:
81
83
  |-------|---------|
82
84
  | **Message** | Conversation stream (always visible) |
83
85
  | **Sprint** | Current sprint stories and progress |
86
+ | **Progress** | At-a-glance story dashboard |
84
87
  | **BikeLane** | Stepped workflow state and navigation |
85
88
  | **AC** | Acceptance criteria checklist with progress |
86
89
  | **Acceptance Criteria** | Story ACs with pass/fail tracking |
@@ -92,7 +95,6 @@ All panels are draggable, floatable, and splittable:
92
95
  | **Settings** | Permission mode, relay mode, bell mode toggles |
93
96
  | **Debug** | Prime context inspection with token counts |
94
97
  | **Background** | Background job monitoring |
95
- | **TTY** | Integrated terminal |
96
98
  | **Workflow** | Workflow navigation and status |
97
99
  | **Hotspots** | Codebase health — dead code, complexity, dependencies |
98
100
 
@@ -112,6 +114,17 @@ Cyclist renders tool use as human-readable summaries instead of raw JSON. Consec
112
114
 
113
115
  Each of the 319 persona characters across 29 themes has a unique portrait displayed in the conversation stream, making multi-agent workflows visually distinct.
114
116
 
117
+ ### BikeRack (CLI-First Dashboard)
118
+
119
+ For developers who prefer Claude Code in their own terminal, BikeRack runs WheelHub separately and serves panels in a browser:
120
+
121
+ ```bash
122
+ pf bikerack start # Launch BikeRack + Claude CLI
123
+ just bikerack # Same, via just recipe
124
+ ```
125
+
126
+ BikeRack provides the same panels as Cyclist without the conversation UI. Panels receive data via OTEL telemetry and file watchers.
127
+
115
128
  ## Prime Context System
116
129
 
117
130
  Prime assembles the full agent context at activation: agent definition, persona character, behavior guide, sprint state, active session, and sidecar memory. This is injected via `--append-system-prompt` so agents behave identically whether launched from Cyclist or the CLI.
@@ -155,6 +168,28 @@ BikeLane is the umbrella workflow system supporting two types:
155
168
 
156
169
  Use `/workflow list` to see all workflows. Use `/workflow start <name>` to begin any stepped workflow.
157
170
 
171
+ ### Workflow Gates
172
+
173
+ Gates are conditional checks on phase transitions. When an agent finishes a phase, the gate evaluates whether the transition should proceed:
174
+
175
+ | Gate | Purpose |
176
+ |------|---------|
177
+ | `tests-pass` | Verify all tests pass before review |
178
+ | `tests-fail` | Verify tests are RED before implementation |
179
+ | `approval` | Verify reviewer has approved |
180
+ | `confidence-sm` | Check if user instruction is unambiguous |
181
+
182
+ Gates are defined in `pennyfarthing-dist/gates/` and referenced via `gate.file` in workflow YAML.
183
+
184
+ ### Tandem Mode
185
+
186
+ Tandem workflows pair a background observer with the primary agent. The backseat watches the primary agent's work and injects observations:
187
+
188
+ - **TDD-Tandem** — Architect watches TEA, TEA watches Dev, PM watches Reviewer
189
+ - **BDD-Tandem** — Adds UX Designer watching Dev, Architect watching UX
190
+
191
+ For active questions (not passive observation), agents use the **Consultation Protocol** — synchronous Sonnet-powered request/response between agents.
192
+
158
193
  ## Benchmarking & Personality Research
159
194
 
160
195
  Pennyfarthing includes a scientific benchmarking system for evaluating how personality affects agent performance:
@@ -189,20 +224,35 @@ See [Benchmarking Documentation](docs/BENCHMARKING.md) for methodology.
189
224
  | `pennyfarthing uninstall` | Remove for clean reinstall |
190
225
  | `pennyfarthing theme list` | Show available themes |
191
226
  | `pennyfarthing theme set <name>` | Change active theme |
227
+ | `pennyfarthing cyclist` | Launch Cyclist visual terminal |
228
+ | `pf bikerack start` | Launch BikeRack dashboard |
229
+ | `pf debug hotspots analyze` | Git change frequency analysis |
230
+ | `pf debug complexity analyze` | Code complexity metrics |
231
+ | `pf debug deadcode stale` | Find files with no recent commits |
232
+ | `pf debug healthscore analyze` | Composite codebase health score |
233
+ | `pf handoff marker <agent>` | Generate handoff marker |
234
+ | `pf validate` | Run all validators |
192
235
 
193
236
  ## Documentation
194
237
 
195
- | Document | Description |
196
- |----------|-------------|
197
- | [**User Guide**](docs/USER-GUIDE.md) | Complete documentation |
198
- | [Getting Started](docs/GETTING-STARTED.md) | Quick start guide |
199
- | [BikeLane Diagrams](docs/BIKELANE-DIAGRAMS.md) | Visual Mermaid diagrams for all workflows |
200
- | [BikeLane](docs/BIKELANE.md) | Workflow system architecture |
201
- | [Agents](docs/AGENTS.md) | Agent reference |
202
- | [Commands](docs/COMMANDS.md) | Slash command reference |
203
- | [Benchmarking](packages/benchmark/docs/BENCHMARKING.md) | Scientific persona evaluation |
204
- | [Jira Integration](docs/JIRA-INTEGRATION.md) | Jira CLI and sprint sync |
205
- | [Cyclist Guide](docs/CYCLIST-GUIDE.md) | Visual terminal documentation |
238
+ ### Guides (in `pennyfarthing-dist/guides/`)
239
+
240
+ | Guide | Description |
241
+ |-------|-------------|
242
+ | [BikeLane](pennyfarthing-dist/guides/bikelane.md) | Workflow engine phased, stepped, procedural |
243
+ | [BikeRack](pennyfarthing-dist/guides/bikerack.md) | Standalone panel viewer for CLI-first development |
244
+ | [Gates](pennyfarthing-dist/guides/gates.md) | Workflow phase transition gates |
245
+ | [Handoff CLI](pennyfarthing-dist/guides/handoff-cli.md) | Phase transitions and marker generation |
246
+ | [Hooks](pennyfarthing-dist/guides/hooks.md) | Hook system configuration and reference |
247
+ | [Prime](pennyfarthing-dist/guides/prime.md) | Agent activation and context loading |
248
+ | [Bell Mode](pennyfarthing-dist/guides/bell-mode.md) | Message queue injection |
249
+ | [Relay Mode](pennyfarthing-dist/guides/relay-mode.md) | Automatic agent handoffs |
250
+ | [Reflector](pennyfarthing-dist/guides/reflector.md) | Agent-to-UI marker protocol |
251
+ | [TirePump](pennyfarthing-dist/guides/tirepump.md) | Context clearing system |
252
+ | [Tandem Protocol](pennyfarthing-dist/guides/tandem-protocol.md) | Background observer pairing |
253
+ | [Output Styles](pennyfarthing-dist/guides/output-styles.md) | Configurable response modes |
254
+ | [Brownfield Tools](pennyfarthing-dist/guides/brownfield-tools.md) | Codebase analysis CLI tools |
255
+ | [Benchmarks](packages/benchmark/docs/benchmarks-guide.md) | Persona evaluation system |
206
256
 
207
257
  ## Available Themes (98)
208
258
 
@@ -245,12 +295,15 @@ your-project/
245
295
  ├── .pennyfarthing/
246
296
  │ ├── agents/ # → symlink to @pennyfarthing/core
247
297
  │ ├── guides/ # → symlink to @pennyfarthing/core
298
+ │ ├── gates/ # → symlink to @pennyfarthing/core
299
+ │ ├── output-styles/ # → symlink to @pennyfarthing/core
248
300
  │ ├── personas/ # → symlink to @pennyfarthing/core
249
301
  │ ├── scripts/ # → symlink to @pennyfarthing/core
302
+ │ ├── templates/ # → symlink to @pennyfarthing/core
250
303
  │ ├── workflows/ # → symlink to @pennyfarthing/core
251
304
  │ ├── sidecars/ # Agent learning files (local, writable)
252
- │ ├── settings.local.json # Claude Code settings
253
- │ └── config.local.yaml # Theme selection
305
+ │ ├── config.local.yaml # Theme, output style, modes
306
+ │ └── repos.yaml # Multi-repo topology
254
307
  ├── .claude/
255
308
  │ ├── commands/ # → symlinks for Claude Code discovery
256
309
  │ └── skills/ # → symlinks for Claude Code discovery
@@ -261,17 +314,22 @@ your-project/
261
314
  └── {story-id}-session.md # Active work session
262
315
  ```
263
316
 
264
- ## What's New in v10.3.0
317
+ ## What's New in v11.0.0
265
318
 
266
- - **BikeRack Dockview Migration** — Full migration from index page to proper Dockview layout with standalone panel routing, settings panel, and portrait anchoring
267
- - **BikeRack Launcher CLI** — `--project-dir` flag for decoupled launch against any project directory
268
- - **Repos Topology System** — `repos.yaml` schema validation and topology wired into agent prime context for multi-repo awareness
269
- - **BikeRack UX Sweep** — Single group layout, visible sashes, streamlined panel set
270
- - **Business Analyst (BA) Agent** — New 11th agent for requirements discovery and stakeholder analysis, with personas across all core themes
319
+ - **Single Package Consolidation** — `@pennyfarthing/shared` absorbed into `@pennyfarthing/core`. WheelHub server, React UI build, and all shared utilities now live in core. Cyclist is a thin wrapper adding WebSocket + OTLP.
320
+ - **Workflow Gate System** — Conditional checks (tests-pass, tests-fail, approval, confidence) that block phase transitions until quality thresholds are met
321
+ - **Handoff CLI** — Python CLI (`pf handoff`) for gate resolution, session transitions, and environment-aware marker generation
322
+ - **Tandem Consultation Protocol** — Synchronous agent-to-agent questions via Sonnet (complements passive backseat observation)
323
+ - **Output Styles** — Configurable response modes (terse, verbose, teaching) that adjust agent communication without changing behavior
324
+ - **Codebase Analysis Tools** — `pf debug` suite: hotspots, complexity, dead code, dependencies, code markers, health score — with WheelHub API routes for panel integration
325
+ - **Context Circuit Breaker** — Hard stop at 80% context usage, auto-saves agent state for `/continue-session` recovery
326
+ - **Git Hook Chaining** — Dispatcher `.d/` pattern allows multiple tools to install hooks without overwriting each other
327
+ - **v11 Migration Automation** — Detects and removes old packages during upgrade
271
328
 
272
329
  ### Previous Highlights
273
330
 
274
- - **v10.2** - Tandem backseat protocol, tandem workflows (TDD/BDD-tandem), plugin system, benchmark package extraction, CI quality gates, schema validation, Fifth Element theme
331
+ - **v10.3** - BikeRack Dockview migration, BikeRack launcher CLI, repos topology system, BA agent
332
+ - **v10.2** - Tandem backseat protocol, tandem workflows (TDD/BDD-tandem), CI quality gates, schema validation
275
333
  - **v10.1** - Codebase health dashboard, tool dialog system, 2party-TDD workflow, cross-file reference validator
276
334
  - **v10.0** - Clean install consolidation, tool use approval system, plan mode exit UI
277
335
  - **v9.3** - Theme packages (97 themes across 7 packs), release workflow, shadcn/ui migration
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pennyfarthing/core",
3
- "version": "11.0.0",
3
+ "version": "11.1.1",
4
4
  "description": "Claude Code agent framework with TDD workflow and persona system",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Tests for MSSCI-15080: v11 migration automation — detect and remove old multi-package installs
3
+ *
4
+ * Story 98-22: Create migration 010 to detect and remove old multi-package
5
+ * installs (@pennyfarthing/shared, @pennyfarthing/cyclist, @pennyfarthing/benchmark)
6
+ * that were absorbed into @pennyfarthing/core in v11.
7
+ *
8
+ * Acceptance Criteria:
9
+ * - AC1: Migration file exists with correct exports (id, description, up, check)
10
+ * - AC2: check() detects old packages in node_modules/ — false if found, true if clean
11
+ * - AC3: up() removes old package directories from node_modules/@pennyfarthing/
12
+ * - AC4: up() respects ctx.dryRun — logs without deleting
13
+ * - AC5: up() logs removal actions via ctx.logger
14
+ * - AC6: check()/up() handle missing node_modules/ gracefully
15
+ * - AC7: Migration integrates with existing runner (auto-discovered by listMigrationFiles)
16
+ *
17
+ * Run with: cd packages/core && pnpm build && node --test dist/cli/utils/010-detect-remove-old-packages.test.js
18
+ */
19
+ export {};
20
+ //# sourceMappingURL=010-detect-remove-old-packages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"010-detect-remove-old-packages.test.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/010-detect-remove-old-packages.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Tests for MSSCI-15080: v11 migration automation — detect and remove old multi-package installs
3
+ *
4
+ * Story 98-22: Create migration 010 to detect and remove old multi-package
5
+ * installs (@pennyfarthing/shared, @pennyfarthing/cyclist, @pennyfarthing/benchmark)
6
+ * that were absorbed into @pennyfarthing/core in v11.
7
+ *
8
+ * Acceptance Criteria:
9
+ * - AC1: Migration file exists with correct exports (id, description, up, check)
10
+ * - AC2: check() detects old packages in node_modules/ — false if found, true if clean
11
+ * - AC3: up() removes old package directories from node_modules/@pennyfarthing/
12
+ * - AC4: up() respects ctx.dryRun — logs without deleting
13
+ * - AC5: up() logs removal actions via ctx.logger
14
+ * - AC6: check()/up() handle missing node_modules/ gracefully
15
+ * - AC7: Migration integrates with existing runner (auto-discovered by listMigrationFiles)
16
+ *
17
+ * Run with: cd packages/core && pnpm build && node --test dist/cli/utils/010-detect-remove-old-packages.test.js
18
+ */
19
+ import { describe, it, beforeEach, afterEach } from 'node:test';
20
+ import assert from 'node:assert';
21
+ import { existsSync, mkdirSync, rmSync, writeFileSync, } from 'fs';
22
+ import { join, dirname } from 'path';
23
+ import { tmpdir } from 'os';
24
+ import { fileURLToPath } from 'url';
25
+ import { listMigrationFiles } from './migrations.js';
26
+ // Import the migration under test
27
+ // Migration is a plain JS file — we import its named exports
28
+ import { id, description, up, check, } from '../../../../../pennyfarthing-dist/migrations/010-detect-remove-old-packages.js';
29
+ // ─── Helpers ───────────────────────────────────────────────────────
30
+ const __filename = fileURLToPath(import.meta.url);
31
+ const __dirname = dirname(__filename);
32
+ function createTestDir() {
33
+ const dir = join(tmpdir(), `pf-010-migration-${Date.now()}-${Math.random().toString(36).slice(2)}`);
34
+ mkdirSync(dir, { recursive: true });
35
+ return dir;
36
+ }
37
+ /** Create a mock logger that captures messages */
38
+ function createMockLogger() {
39
+ const messages = [];
40
+ return {
41
+ logger: {
42
+ info(message) { messages.push({ level: 'info', message }); },
43
+ warning(message) { messages.push({ level: 'warning', message }); },
44
+ success(message) { messages.push({ level: 'success', message }); },
45
+ },
46
+ messages,
47
+ };
48
+ }
49
+ /** The three old packages that should be detected and removed */
50
+ const OLD_PACKAGES = [
51
+ '@pennyfarthing/shared',
52
+ '@pennyfarthing/cyclist',
53
+ '@pennyfarthing/benchmark',
54
+ ];
55
+ /**
56
+ * Create fake old package directories in node_modules
57
+ */
58
+ function createOldPackageDirs(projectRoot, packages) {
59
+ for (const pkg of packages) {
60
+ const pkgDir = join(projectRoot, 'node_modules', pkg);
61
+ mkdirSync(pkgDir, { recursive: true });
62
+ writeFileSync(join(pkgDir, 'package.json'), JSON.stringify({
63
+ name: pkg,
64
+ version: '10.0.0',
65
+ }));
66
+ }
67
+ }
68
+ // ─── Tests ─────────────────────────────────────────────────────────
69
+ describe('MSSCI-15080: v11 migration — detect and remove old multi-package installs', () => {
70
+ let testDir;
71
+ beforeEach(() => {
72
+ testDir = createTestDir();
73
+ });
74
+ afterEach(() => {
75
+ if (existsSync(testDir)) {
76
+ rmSync(testDir, { recursive: true, force: true });
77
+ }
78
+ });
79
+ // ─── AC1: Migration file exists with correct exports ──────────
80
+ describe('Migration file contract (AC1)', () => {
81
+ it('should export id as a string matching 010-* pattern', () => {
82
+ assert.strictEqual(typeof id, 'string');
83
+ assert.ok(id.startsWith('010-'), `Migration id should start with "010-", got "${id}"`);
84
+ });
85
+ it('should export description as a non-empty string', () => {
86
+ assert.strictEqual(typeof description, 'string');
87
+ assert.ok(description.length > 0, 'Description should not be empty');
88
+ });
89
+ it('should export up as a function', () => {
90
+ assert.strictEqual(typeof up, 'function');
91
+ });
92
+ it('should export check as a function', () => {
93
+ assert.strictEqual(typeof check, 'function');
94
+ });
95
+ });
96
+ // ─── AC2: check() detects old packages ─────────────────────────
97
+ describe('check() detection (AC2)', () => {
98
+ it('should return false when @pennyfarthing/shared exists in node_modules', async () => {
99
+ createOldPackageDirs(testDir, ['@pennyfarthing/shared']);
100
+ const { logger } = createMockLogger();
101
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
102
+ const result = await check(ctx);
103
+ assert.strictEqual(result, false, 'check() should return false when old packages exist');
104
+ });
105
+ it('should return false when @pennyfarthing/cyclist exists in node_modules', async () => {
106
+ createOldPackageDirs(testDir, ['@pennyfarthing/cyclist']);
107
+ const { logger } = createMockLogger();
108
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
109
+ const result = await check(ctx);
110
+ assert.strictEqual(result, false, 'check() should return false when old packages exist');
111
+ });
112
+ it('should return false when @pennyfarthing/benchmark exists in node_modules', async () => {
113
+ createOldPackageDirs(testDir, ['@pennyfarthing/benchmark']);
114
+ const { logger } = createMockLogger();
115
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
116
+ const result = await check(ctx);
117
+ assert.strictEqual(result, false, 'check() should return false when old packages exist');
118
+ });
119
+ it('should return false when multiple old packages exist', async () => {
120
+ createOldPackageDirs(testDir, OLD_PACKAGES);
121
+ const { logger } = createMockLogger();
122
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
123
+ const result = await check(ctx);
124
+ assert.strictEqual(result, false, 'check() should return false when any old packages exist');
125
+ });
126
+ it('should return true when no old packages exist in node_modules', async () => {
127
+ // Create node_modules with only @pennyfarthing/core (the valid package)
128
+ const coreDir = join(testDir, 'node_modules', '@pennyfarthing', 'core');
129
+ mkdirSync(coreDir, { recursive: true });
130
+ writeFileSync(join(coreDir, 'package.json'), '{"name":"@pennyfarthing/core"}');
131
+ const { logger } = createMockLogger();
132
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
133
+ const result = await check(ctx);
134
+ assert.strictEqual(result, true, 'check() should return true when no old packages exist');
135
+ });
136
+ });
137
+ // ─── AC3: up() removes old package directories ─────────────────
138
+ describe('up() removal (AC3)', () => {
139
+ it('should remove @pennyfarthing/shared from node_modules', async () => {
140
+ createOldPackageDirs(testDir, ['@pennyfarthing/shared']);
141
+ const { logger } = createMockLogger();
142
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
143
+ const result = await up(ctx);
144
+ assert.ok(result.success, 'up() should return success');
145
+ assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'shared')), false, '@pennyfarthing/shared should be removed');
146
+ });
147
+ it('should remove @pennyfarthing/cyclist from node_modules', async () => {
148
+ createOldPackageDirs(testDir, ['@pennyfarthing/cyclist']);
149
+ const { logger } = createMockLogger();
150
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
151
+ const result = await up(ctx);
152
+ assert.ok(result.success, 'up() should return success');
153
+ assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'cyclist')), false, '@pennyfarthing/cyclist should be removed');
154
+ });
155
+ it('should remove @pennyfarthing/benchmark from node_modules', async () => {
156
+ createOldPackageDirs(testDir, ['@pennyfarthing/benchmark']);
157
+ const { logger } = createMockLogger();
158
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
159
+ const result = await up(ctx);
160
+ assert.ok(result.success, 'up() should return success');
161
+ assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'benchmark')), false, '@pennyfarthing/benchmark should be removed');
162
+ });
163
+ it('should remove all three old packages when all present', async () => {
164
+ createOldPackageDirs(testDir, OLD_PACKAGES);
165
+ const { logger } = createMockLogger();
166
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
167
+ const result = await up(ctx);
168
+ assert.ok(result.success, 'up() should return success');
169
+ for (const pkg of OLD_PACKAGES) {
170
+ const pkgName = pkg.split('/')[1];
171
+ assert.strictEqual(existsSync(join(testDir, 'node_modules', '@pennyfarthing', pkgName)), false, `${pkg} should be removed`);
172
+ }
173
+ });
174
+ it('should NOT remove @pennyfarthing/core', async () => {
175
+ // Create core alongside old packages
176
+ createOldPackageDirs(testDir, [...OLD_PACKAGES, '@pennyfarthing/core']);
177
+ const { logger } = createMockLogger();
178
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
179
+ await up(ctx);
180
+ assert.ok(existsSync(join(testDir, 'node_modules', '@pennyfarthing', 'core')), '@pennyfarthing/core should NOT be removed');
181
+ });
182
+ it('should return {success: true} result object', async () => {
183
+ createOldPackageDirs(testDir, OLD_PACKAGES);
184
+ const { logger } = createMockLogger();
185
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
186
+ const result = await up(ctx);
187
+ assert.strictEqual(typeof result, 'object');
188
+ assert.strictEqual(result.success, true);
189
+ });
190
+ });
191
+ // ─── AC4: Dry-run mode ─────────────────────────────────────────
192
+ describe('Dry-run mode (AC4)', () => {
193
+ it('should NOT delete packages in dry-run mode', async () => {
194
+ createOldPackageDirs(testDir, OLD_PACKAGES);
195
+ const { logger } = createMockLogger();
196
+ const ctx = { projectRoot: testDir, logger, dryRun: true };
197
+ const result = await up(ctx);
198
+ assert.ok(result.success, 'up() should still return success in dry-run');
199
+ for (const pkg of OLD_PACKAGES) {
200
+ const pkgName = pkg.split('/')[1];
201
+ assert.ok(existsSync(join(testDir, 'node_modules', '@pennyfarthing', pkgName)), `${pkg} should still exist in dry-run mode`);
202
+ }
203
+ });
204
+ it('should log what would be removed in dry-run mode', async () => {
205
+ createOldPackageDirs(testDir, ['@pennyfarthing/shared']);
206
+ const { logger, messages } = createMockLogger();
207
+ const ctx = { projectRoot: testDir, logger, dryRun: true };
208
+ await up(ctx);
209
+ const allMessages = messages.map(m => m.message).join(' ');
210
+ assert.ok(allMessages.includes('shared'), 'Should log about @pennyfarthing/shared in dry-run');
211
+ });
212
+ });
213
+ // ─── AC5: Logging ──────────────────────────────────────────────
214
+ describe('Logging (AC5)', () => {
215
+ it('should log each package being removed', async () => {
216
+ createOldPackageDirs(testDir, OLD_PACKAGES);
217
+ const { logger, messages } = createMockLogger();
218
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
219
+ await up(ctx);
220
+ const allMessages = messages.map(m => m.message).join(' ');
221
+ assert.ok(allMessages.includes('shared'), 'Should log about shared');
222
+ assert.ok(allMessages.includes('cyclist'), 'Should log about cyclist');
223
+ assert.ok(allMessages.includes('benchmark'), 'Should log about benchmark');
224
+ });
225
+ it('should log when no old packages are found', async () => {
226
+ // Empty node_modules — nothing to remove
227
+ mkdirSync(join(testDir, 'node_modules', '@pennyfarthing'), { recursive: true });
228
+ const { logger, messages } = createMockLogger();
229
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
230
+ await up(ctx);
231
+ assert.ok(messages.length > 0, 'Should log something even when nothing to remove');
232
+ });
233
+ });
234
+ // ─── AC6: Missing node_modules graceful handling ───────────────
235
+ describe('Missing node_modules (AC6)', () => {
236
+ it('check() should return true when node_modules does not exist', async () => {
237
+ // testDir has no node_modules at all
238
+ const { logger } = createMockLogger();
239
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
240
+ const result = await check(ctx);
241
+ assert.strictEqual(result, true, 'check() should return true when no node_modules exists');
242
+ });
243
+ it('check() should return true when @pennyfarthing scope dir does not exist', async () => {
244
+ // node_modules exists but no @pennyfarthing scope
245
+ mkdirSync(join(testDir, 'node_modules'), { recursive: true });
246
+ const { logger } = createMockLogger();
247
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
248
+ const result = await check(ctx);
249
+ assert.strictEqual(result, true, 'check() should return true when no @pennyfarthing scope');
250
+ });
251
+ it('up() should return success when node_modules does not exist', async () => {
252
+ const { logger } = createMockLogger();
253
+ const ctx = { projectRoot: testDir, logger, dryRun: false };
254
+ const result = await up(ctx);
255
+ assert.ok(result.success, 'up() should succeed gracefully with no node_modules');
256
+ });
257
+ });
258
+ // ─── AC7: Runner integration ───────────────────────────────────
259
+ describe('Runner integration (AC7)', () => {
260
+ it('should be discovered by listMigrationFiles()', () => {
261
+ // Point at the real migrations directory
262
+ const migrationsDir = join(__dirname, '..', '..', '..', '..', '..', 'pennyfarthing-dist', 'migrations');
263
+ const files = listMigrationFiles(migrationsDir);
264
+ const migration010 = files.find(f => f.includes('010-'));
265
+ assert.ok(migration010, 'Migration 010 should be discoverable in pennyfarthing-dist/migrations/');
266
+ });
267
+ it('should sort after 009 in migration order', () => {
268
+ const migrationsDir = join(__dirname, '..', '..', '..', '..', '..', 'pennyfarthing-dist', 'migrations');
269
+ const files = listMigrationFiles(migrationsDir);
270
+ const idx009 = files.findIndex(f => f.includes('009-'));
271
+ const idx010 = files.findIndex(f => f.includes('010-'));
272
+ assert.ok(idx009 >= 0, 'Migration 009 should exist');
273
+ assert.ok(idx010 >= 0, 'Migration 010 should exist');
274
+ assert.ok(idx010 > idx009, 'Migration 010 should sort after 009');
275
+ });
276
+ });
277
+ });
278
+ //# sourceMappingURL=010-detect-remove-old-packages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"010-detect-remove-old-packages.test.js","sourceRoot":"","sources":["../../../src/cli/utils/010-detect-remove-old-packages.test.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  /**
6
6
  * Core agent types that have sidecars
7
7
  */
8
- export declare const CORE_AGENTS: readonly ["dev", "tea", "sm", "reviewer", "architect", "pm", "tech-writer", "ux-designer", "devops", "orchestrator"];
8
+ export declare const CORE_AGENTS: readonly ["dev", "tea", "sm", "reviewer", "architect", "pm", "tech-writer", "ux-designer", "devops", "orchestrator", "ba"];
9
9
  export type CoreAgent = typeof CORE_AGENTS[number];
10
10
  /**
11
11
  * Symlinks that point directly to node_modules directories
@@ -15,6 +15,9 @@ export type CoreAgent = typeof CORE_AGENTS[number];
15
15
  export declare const DIRECTORY_SYMLINKS: readonly [{
16
16
  readonly name: "agents";
17
17
  readonly link: ".pennyfarthing/agents";
18
+ }, {
19
+ readonly name: "gates";
20
+ readonly link: ".pennyfarthing/gates";
18
21
  }, {
19
22
  readonly name: "guides";
20
23
  readonly link: ".pennyfarthing/guides";
@@ -38,6 +41,9 @@ export declare const DIRECTORY_SYMLINKS: readonly [{
38
41
  export declare const ALL_SYMLINKS: readonly [{
39
42
  readonly name: "agents";
40
43
  readonly link: ".pennyfarthing/agents";
44
+ }, {
45
+ readonly name: "gates";
46
+ readonly link: ".pennyfarthing/gates";
41
47
  }, {
42
48
  readonly name: "guides";
43
49
  readonly link: ".pennyfarthing/guides";
@@ -64,7 +70,7 @@ export declare const ALL_SYMLINKS: readonly [{
64
70
  * Paths managed by Pennyfarthing (used in manifest)
65
71
  * Commands and skills in .claude/ (for discovery), rest in .pennyfarthing/
66
72
  */
67
- export declare const MANAGED_PATHS: readonly [".claude/commands", ".claude/skills", ".pennyfarthing/agents", ".pennyfarthing/guides", ".pennyfarthing/output-styles", ".pennyfarthing/personas", ".pennyfarthing/scripts", ".pennyfarthing/workflows"];
73
+ export declare const MANAGED_PATHS: readonly [".claude/commands", ".claude/skills", ".pennyfarthing/agents", ".pennyfarthing/gates", ".pennyfarthing/guides", ".pennyfarthing/output-styles", ".pennyfarthing/personas", ".pennyfarthing/scripts", ".pennyfarthing/workflows"];
68
74
  export type SymlinkDefinition = {
69
75
  readonly name: string;
70
76
  readonly link: string;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,sHAWd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAOrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;EAIf,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,aAAa,oNAShB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,4HAYd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAEnD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAQrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;EAIf,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,aAAa,4OAUhB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC"}
@@ -15,7 +15,8 @@ export const CORE_AGENTS = [
15
15
  'tech-writer',
16
16
  'ux-designer',
17
17
  'devops',
18
- 'orchestrator'
18
+ 'orchestrator',
19
+ 'ba'
19
20
  ];
20
21
  /**
21
22
  * Symlinks that point directly to node_modules directories
@@ -24,6 +25,7 @@ export const CORE_AGENTS = [
24
25
  */
25
26
  export const DIRECTORY_SYMLINKS = [
26
27
  { name: 'agents', link: '.pennyfarthing/agents' },
28
+ { name: 'gates', link: '.pennyfarthing/gates' },
27
29
  { name: 'guides', link: '.pennyfarthing/guides' },
28
30
  { name: 'output-styles', link: '.pennyfarthing/output-styles' },
29
31
  { name: 'personas', link: '.pennyfarthing/personas' },
@@ -47,6 +49,7 @@ export const MANAGED_PATHS = [
47
49
  '.claude/commands',
48
50
  '.claude/skills',
49
51
  '.pennyfarthing/agents',
52
+ '.pennyfarthing/gates',
50
53
  '.pennyfarthing/guides',
51
54
  '.pennyfarthing/output-styles',
52
55
  '.pennyfarthing/personas',
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK;IACL,KAAK;IACL,IAAI;IACJ,UAAU;IACV,WAAW;IACX,IAAI;IACJ,aAAa;IACb,aAAa;IACb,QAAQ;IACR,cAAc;CACN,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,0BAA0B,EAAE;CAC/C,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,kBAAkB;IACrB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;CAClC,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,gBAAgB;IAChB,uBAAuB;IACvB,uBAAuB;IACvB,8BAA8B;IAC9B,yBAAyB;IACzB,wBAAwB;IACxB,0BAA0B;CAClB,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/cli/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK;IACL,KAAK;IACL,IAAI;IACJ,UAAU;IACV,WAAW;IACX,IAAI;IACJ,aAAa;IACb,aAAa;IACb,QAAQ;IACR,cAAc;IACd,IAAI;CACI,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE;IAC/C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,uBAAuB,EAAE;IACjD,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE;IAC/D,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,yBAAyB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,0BAA0B,EAAE;CAC/C,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,GAAG,kBAAkB;IACrB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAC9C,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE;CAClC,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,kBAAkB;IAClB,gBAAgB;IAChB,uBAAuB;IACvB,sBAAsB;IACtB,uBAAuB;IACvB,8BAA8B;IAC9B,yBAAyB;IACzB,wBAAwB;IACxB,0BAA0B;CAClB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 106-4: Gate file discovery — constants include gates/ symlink
3
+ *
4
+ * Verifies that DIRECTORY_SYMLINKS and MANAGED_PATHS include the gates/
5
+ * directory entry, ensuring init/update will create the symlink.
6
+ *
7
+ * RED phase — these tests should fail until Dev adds gates to the constants.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=constants.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.test.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/constants.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}