@pennyfarthing/core 11.2.1 → 11.3.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 (405) hide show
  1. package/README.md +102 -42
  2. package/package.json +1 -1
  3. package/packages/core/dist/cli/commands/doctor-legacy.test.js +2 -2
  4. package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -1
  5. package/packages/core/dist/cli/commands/doctor.d.ts +55 -0
  6. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  7. package/packages/core/dist/cli/commands/doctor.js +324 -50
  8. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  9. package/packages/core/dist/cli/commands/init.d.ts +12 -0
  10. package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
  11. package/packages/core/dist/cli/commands/init.js +45 -0
  12. package/packages/core/dist/cli/commands/init.js.map +1 -1
  13. package/packages/core/dist/cli/commands/pyproject-install.test.d.ts +19 -0
  14. package/packages/core/dist/cli/commands/pyproject-install.test.d.ts.map +1 -0
  15. package/packages/core/dist/cli/commands/pyproject-install.test.js +261 -0
  16. package/packages/core/dist/cli/commands/pyproject-install.test.js.map +1 -0
  17. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts +17 -0
  18. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts.map +1 -0
  19. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js +470 -0
  20. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js.map +1 -0
  21. package/packages/core/dist/cli/commands/update-consolidation.test.js +14 -6
  22. package/packages/core/dist/cli/commands/update-consolidation.test.js.map +1 -1
  23. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  24. package/packages/core/dist/cli/commands/update.js +31 -2
  25. package/packages/core/dist/cli/commands/update.js.map +1 -1
  26. package/packages/core/dist/cli/index.js +2 -0
  27. package/packages/core/dist/cli/index.js.map +1 -1
  28. package/packages/core/dist/cli/utils/python.d.ts.map +1 -1
  29. package/packages/core/dist/cli/utils/python.js +11 -0
  30. package/packages/core/dist/cli/utils/python.js.map +1 -1
  31. package/packages/core/dist/cli/utils/settings-hook-migration.test.d.ts +17 -0
  32. package/packages/core/dist/cli/utils/settings-hook-migration.test.d.ts.map +1 -0
  33. package/packages/core/dist/cli/utils/settings-hook-migration.test.js +382 -0
  34. package/packages/core/dist/cli/utils/settings-hook-migration.test.js.map +1 -0
  35. package/packages/core/dist/cli/utils/settings.d.ts +0 -4
  36. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  37. package/packages/core/dist/cli/utils/settings.js +45 -27
  38. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  39. package/packages/core/dist/cli/utils/stale-artifacts.d.ts +59 -0
  40. package/packages/core/dist/cli/utils/stale-artifacts.d.ts.map +1 -0
  41. package/packages/core/dist/cli/utils/stale-artifacts.js +163 -0
  42. package/packages/core/dist/cli/utils/stale-artifacts.js.map +1 -0
  43. package/packages/core/dist/consultation/dialogue-manager.d.ts +1 -1
  44. package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -1
  45. package/packages/core/dist/consultation/dialogue-manager.js +1 -1
  46. package/packages/core/dist/consultation/dialogue-manager.js.map +1 -1
  47. package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -1
  48. package/packages/core/dist/consultation/tandem-metrics.test.js.map +1 -1
  49. package/packages/core/dist/public/css/react.css +1 -1
  50. package/packages/core/dist/public/js/react/react.js +9 -9
  51. package/packages/core/dist/server/api/git.d.ts.map +1 -1
  52. package/packages/core/dist/server/api/git.js +0 -1
  53. package/packages/core/dist/server/api/git.js.map +1 -1
  54. package/packages/core/dist/server/api/index.d.ts +2 -0
  55. package/packages/core/dist/server/api/index.d.ts.map +1 -1
  56. package/packages/core/dist/server/api/index.js +2 -0
  57. package/packages/core/dist/server/api/index.js.map +1 -1
  58. package/packages/core/dist/server/api/project-info.d.ts +11 -0
  59. package/packages/core/dist/server/api/project-info.d.ts.map +1 -0
  60. package/packages/core/dist/server/api/project-info.js +18 -0
  61. package/packages/core/dist/server/api/project-info.js.map +1 -0
  62. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  63. package/packages/core/dist/server/otlp-receiver.js +18 -1
  64. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  65. package/packages/core/dist/server/otlp-receiver.test.js +1 -1
  66. package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
  67. package/packages/core/dist/server/server.d.ts.map +1 -1
  68. package/packages/core/dist/server/server.js +3 -2
  69. package/packages/core/dist/server/server.js.map +1 -1
  70. package/packages/core/dist/server/server.test.d.ts +1 -1
  71. package/packages/core/dist/server/server.test.js +8 -8
  72. package/packages/core/dist/server/settings.d.ts +1 -0
  73. package/packages/core/dist/server/settings.d.ts.map +1 -1
  74. package/packages/core/dist/server/settings.js +18 -0
  75. package/packages/core/dist/server/settings.js.map +1 -1
  76. package/packages/core/dist/workflow/tandem-workflow-templates.test.js +7 -5
  77. package/packages/core/dist/workflow/tandem-workflow-templates.test.js.map +1 -1
  78. package/packages/core/dist/workflow/workflow-migration.test.js +6 -5
  79. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
  80. package/packages/core/dist/workflow/workflow-team-templates.test.d.ts +17 -0
  81. package/packages/core/dist/workflow/workflow-team-templates.test.d.ts.map +1 -0
  82. package/packages/core/dist/workflow/workflow-team-templates.test.js +275 -0
  83. package/packages/core/dist/workflow/workflow-team-templates.test.js.map +1 -0
  84. package/pennyfarthing-dist/agents/dev.md +19 -4
  85. package/pennyfarthing-dist/agents/devops.md +2 -10
  86. package/pennyfarthing-dist/agents/reviewer-preflight.md +4 -5
  87. package/pennyfarthing-dist/agents/reviewer.md +17 -4
  88. package/pennyfarthing-dist/agents/sm-finish.md +1 -1
  89. package/pennyfarthing-dist/agents/sm-setup.md +7 -7
  90. package/pennyfarthing-dist/agents/sm.md +16 -29
  91. package/pennyfarthing-dist/agents/tea.md +2 -2
  92. package/pennyfarthing-dist/agents/testing-runner.md +1 -1
  93. package/pennyfarthing-dist/commands/pf-architect.md +1 -1
  94. package/pennyfarthing-dist/commands/pf-ba.md +1 -1
  95. package/pennyfarthing-dist/commands/pf-chore.md +2 -2
  96. package/pennyfarthing-dist/commands/pf-dev.md +1 -1
  97. package/pennyfarthing-dist/commands/pf-devops.md +1 -1
  98. package/pennyfarthing-dist/commands/pf-epic.md +6 -6
  99. package/pennyfarthing-dist/commands/pf-git.md +10 -10
  100. package/pennyfarthing-dist/commands/pf-health-check.md +31 -12
  101. package/pennyfarthing-dist/commands/pf-help.md +12 -12
  102. package/pennyfarthing-dist/commands/pf-orchestrator.md +1 -1
  103. package/pennyfarthing-dist/commands/pf-pm.md +1 -1
  104. package/pennyfarthing-dist/commands/pf-prime.md +8 -8
  105. package/pennyfarthing-dist/commands/pf-reviewer.md +1 -1
  106. package/pennyfarthing-dist/commands/pf-session.md +7 -7
  107. package/pennyfarthing-dist/commands/pf-sm.md +1 -1
  108. package/pennyfarthing-dist/commands/pf-sprint.md +7 -7
  109. package/pennyfarthing-dist/commands/pf-tea.md +1 -1
  110. package/pennyfarthing-dist/commands/pf-tech-writer.md +1 -1
  111. package/pennyfarthing-dist/commands/pf-theme.md +9 -9
  112. package/pennyfarthing-dist/commands/pf-ux-designer.md +1 -1
  113. package/pennyfarthing-dist/commands/pf-work.md +1 -1
  114. package/pennyfarthing-dist/gates/{confidence-sm.md → confidence.md} +16 -17
  115. package/pennyfarthing-dist/gates/dev-exit.md +75 -0
  116. package/pennyfarthing-dist/gates/merge-ready.md +49 -0
  117. package/pennyfarthing-dist/gates/release-ready.md +95 -0
  118. package/pennyfarthing-dist/gates/reviewer-preflight-check.md +90 -0
  119. package/pennyfarthing-dist/gates/sm-setup-exit.md +82 -0
  120. package/pennyfarthing-dist/guides/agent-behavior.md +129 -20
  121. package/pennyfarthing-dist/guides/agent-coordination.md +10 -10
  122. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
  123. package/pennyfarthing-dist/guides/agent-template-tactical.md +1 -1
  124. package/pennyfarthing-dist/guides/bell-mode.md +1 -1
  125. package/pennyfarthing-dist/guides/bikerack.md +10 -10
  126. package/pennyfarthing-dist/guides/brownfield-tools.md +24 -24
  127. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +1 -1
  128. package/pennyfarthing-dist/guides/gate-schema.md +2 -2
  129. package/pennyfarthing-dist/guides/gates.md +10 -5
  130. package/pennyfarthing-dist/guides/handoff-cli.md +8 -8
  131. package/pennyfarthing-dist/guides/hooks.md +27 -27
  132. package/pennyfarthing-dist/guides/prime.md +2 -2
  133. package/pennyfarthing-dist/guides/reflector.md +1 -1
  134. package/pennyfarthing-dist/guides/skill-schema.md +6 -6
  135. package/pennyfarthing-dist/guides/tandem-protocol.md +3 -3
  136. package/pennyfarthing-dist/guides/workflow-schema.md +1 -1
  137. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  138. package/pennyfarthing-dist/guides/xml-tags.md +8 -8
  139. package/pennyfarthing-dist/scripts/README.md +4 -4
  140. package/pennyfarthing-dist/scripts/core/agent-session.sh +2 -5
  141. package/pennyfarthing-dist/scripts/core/check-context.sh +1 -1
  142. package/pennyfarthing-dist/scripts/core/pf.sh +5 -0
  143. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +2 -5
  144. package/pennyfarthing-dist/scripts/core/prime.sh +2 -25
  145. package/pennyfarthing-dist/scripts/git/README.md +14 -14
  146. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +2 -3
  147. package/pennyfarthing-dist/scripts/git/git-status-all.sh +2 -3
  148. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +2 -3
  149. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +2 -4
  150. package/pennyfarthing-dist/scripts/hooks/README.md +6 -6
  151. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +3 -3
  152. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +3 -3
  153. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +3 -3
  154. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -3
  155. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +5 -4
  156. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +2 -1
  157. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +3 -3
  158. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -3
  159. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +3 -3
  160. package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -3
  161. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +3 -3
  162. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +3 -3
  163. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +3 -4
  164. package/pennyfarthing-dist/scripts/lib/env.sh +34 -0
  165. package/pennyfarthing-dist/scripts/lib/find-root.sh +5 -0
  166. package/pennyfarthing-dist/scripts/lib/run-pf.sh +43 -0
  167. package/pennyfarthing-dist/scripts/misc/README.md +1 -1
  168. package/pennyfarthing-dist/scripts/misc/statusline.sh +3 -3
  169. package/pennyfarthing-dist/scripts/sprint/README.md +21 -21
  170. package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
  171. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +2 -16
  172. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +3 -3
  173. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +3 -3
  174. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +3 -3
  175. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +3 -3
  176. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +3 -3
  177. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +3 -3
  178. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +3 -3
  179. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +3 -3
  180. package/pennyfarthing-dist/skills/pf-bc/examples.md +23 -23
  181. package/pennyfarthing-dist/skills/pf-bc/skill.md +17 -17
  182. package/pennyfarthing-dist/skills/pf-bc/usage.md +8 -8
  183. package/pennyfarthing-dist/skills/pf-jira/SKILL.md +15 -15
  184. package/pennyfarthing-dist/skills/pf-jira/examples.md +48 -48
  185. package/pennyfarthing-dist/skills/pf-jira/usage.md +15 -15
  186. package/pennyfarthing-dist/skills/pf-settings/skill.md +42 -0
  187. package/pennyfarthing-dist/skills/pf-sprint/examples.md +80 -80
  188. package/pennyfarthing-dist/skills/pf-sprint/skill.md +35 -35
  189. package/pennyfarthing-dist/skills/pf-sprint/usage.md +30 -30
  190. package/pennyfarthing-dist/skills/pf-theme/examples.md +15 -15
  191. package/pennyfarthing-dist/skills/pf-theme/skill.md +6 -6
  192. package/pennyfarthing-dist/skills/pf-theme/usage.md +5 -5
  193. package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -27
  194. package/pennyfarthing-dist/skills/pf-workflow/skill.md +11 -11
  195. package/pennyfarthing-dist/skills/pf-workflow/usage.md +11 -11
  196. package/pennyfarthing-dist/skills/skill-registry.yaml +34 -19
  197. package/pennyfarthing-dist/templates/pyproject.toml +27 -0
  198. package/pennyfarthing-dist/templates/settings.local.json.template +11 -11
  199. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +7 -3
  200. package/pennyfarthing-dist/workflows/bdd-team.yaml +89 -0
  201. package/pennyfarthing-dist/workflows/bdd.yaml +7 -3
  202. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +1 -1
  203. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
  204. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
  205. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  206. package/pennyfarthing-dist/workflows/installation-check/steps/step-01-foundation.md +77 -0
  207. package/pennyfarthing-dist/workflows/installation-check/steps/step-02-commands.md +82 -0
  208. package/pennyfarthing-dist/workflows/installation-check/steps/step-03-hooks.md +121 -0
  209. package/pennyfarthing-dist/workflows/installation-check/steps/step-04-scripts.md +83 -0
  210. package/pennyfarthing-dist/workflows/installation-check/steps/step-05-layout.md +81 -0
  211. package/pennyfarthing-dist/workflows/installation-check/steps/step-06-legacy.md +94 -0
  212. package/pennyfarthing-dist/workflows/installation-check/steps/step-07-tools.md +80 -0
  213. package/pennyfarthing-dist/workflows/installation-check/steps/step-08-summary.md +99 -0
  214. package/pennyfarthing-dist/workflows/installation-check/workflow.yaml +47 -0
  215. package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +47 -0
  216. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +7 -3
  217. package/pennyfarthing-dist/workflows/tdd-team.yaml +80 -0
  218. package/pennyfarthing-dist/workflows/tdd.yaml +7 -3
  219. package/pennyfarthing-dist/workflows/trivial.yaml +7 -3
  220. package/pennyfarthing_scripts/__init__.py +1 -1
  221. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  222. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  223. package/pennyfarthing_scripts/__pycache__/cli.cpython-311.pyc +0 -0
  224. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  225. package/pennyfarthing_scripts/__pycache__/context.cpython-311.pyc +0 -0
  226. package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-311.pyc +0 -0
  228. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-311.pyc +0 -0
  229. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-311.pyc +0 -0
  231. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/bc/__pycache__/split.cpython-314.pyc +0 -0
  233. package/pennyfarthing_scripts/bc/cli.py +23 -2
  234. package/pennyfarthing_scripts/bc/focus.py +1 -0
  235. package/pennyfarthing_scripts/bc/split.py +52 -0
  236. package/pennyfarthing_scripts/bellmode_hook.py +2 -5
  237. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-311.pyc +0 -0
  238. package/pennyfarthing_scripts/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
  239. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  240. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  241. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  242. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-311.pyc +0 -0
  243. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  244. package/pennyfarthing_scripts/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
  245. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  247. package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-311.pyc +0 -0
  250. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  256. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  257. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/bikerack/audit_log_panel.py +48 -6
  259. package/pennyfarthing_scripts/bikerack/context_meter_footer.py +53 -3
  260. package/pennyfarthing_scripts/bikerack/launcher.py +6 -6
  261. package/pennyfarthing_scripts/bikerack/progress_panel.py +0 -1
  262. package/pennyfarthing_scripts/bikerack/sprint_panel.py +1 -1
  263. package/pennyfarthing_scripts/bikerack/story_detail_data.py +4 -1
  264. package/pennyfarthing_scripts/bikerack/story_detail_screen.py +2 -1
  265. package/pennyfarthing_scripts/bikerack/tui.py +214 -10
  266. package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
  267. package/pennyfarthing_scripts/cli.py +5 -0
  268. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-311.pyc +0 -0
  269. package/pennyfarthing_scripts/common/__pycache__/config.cpython-311.pyc +0 -0
  270. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  271. package/pennyfarthing_scripts/common/__pycache__/output.cpython-311.pyc +0 -0
  272. package/pennyfarthing_scripts/common/__pycache__/pr_config.cpython-314.pyc +0 -0
  273. package/pennyfarthing_scripts/common/config.py +29 -2
  274. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-311.pyc +0 -0
  275. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-311.pyc +0 -0
  277. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  278. package/pennyfarthing_scripts/consultation/cli.py +3 -3
  279. package/pennyfarthing_scripts/context.py +3 -3
  280. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-311.pyc +0 -0
  281. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-311.pyc +0 -0
  282. package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-311.pyc +0 -0
  283. package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-311.pyc +0 -0
  284. package/pennyfarthing_scripts/git/hooks_installer.py +2 -3
  285. package/pennyfarthing_scripts/git/status_all.py +1 -1
  286. package/pennyfarthing_scripts/git/worktree.py +2 -2
  287. package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-311.pyc +0 -0
  288. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-311.pyc +0 -0
  289. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-311.pyc +0 -0
  291. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-311.pyc +0 -0
  292. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  293. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  294. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  295. package/pennyfarthing_scripts/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  296. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  297. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-311.pyc +0 -0
  298. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-311.pyc +0 -0
  299. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-311.pyc +0 -0
  300. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-311.pyc +0 -0
  301. package/pennyfarthing_scripts/hooks/__init__.py +8 -3
  302. package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  303. package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  304. package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-311.pyc +0 -0
  305. package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  306. package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-311.pyc +0 -0
  307. package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-311.pyc +0 -0
  309. package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-311.pyc +0 -0
  311. package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-311.pyc +0 -0
  313. package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  314. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-311.pyc +0 -0
  315. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  316. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-311.pyc +0 -0
  317. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  318. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-311.pyc +0 -0
  319. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  320. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-311.pyc +0 -0
  321. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  322. package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  323. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-311.pyc +0 -0
  324. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  325. package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-311.pyc +0 -0
  326. package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  327. package/pennyfarthing_scripts/hooks/bell_mode.py +0 -1
  328. package/pennyfarthing_scripts/hooks/pre_edit_check.py +0 -1
  329. package/pennyfarthing_scripts/hooks/reflector_check.py +1 -2
  330. package/pennyfarthing_scripts/hooks/schema_validation.py +0 -1
  331. package/pennyfarthing_scripts/hooks/session_start.py +6 -8
  332. package/pennyfarthing_scripts/hooks/statusline.py +10 -1
  333. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-311.pyc +0 -0
  334. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-311.pyc +0 -0
  335. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-311.pyc +0 -0
  336. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-311.pyc +0 -0
  337. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-311.pyc +0 -0
  338. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-311.pyc +0 -0
  339. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-311.pyc +0 -0
  340. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-311.pyc +0 -0
  341. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-311.pyc +0 -0
  342. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-311.pyc +0 -0
  343. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-311.pyc +0 -0
  344. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-311.pyc +0 -0
  345. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-311.pyc +0 -0
  346. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-311.pyc +0 -0
  347. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-311.pyc +0 -0
  348. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-311.pyc +0 -0
  349. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-311.pyc +0 -0
  350. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  351. package/pennyfarthing_scripts/prime/heatmap.py +3 -15
  352. package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-311.pyc +0 -0
  353. package/pennyfarthing_scripts/session/__pycache__/cli.cpython-311.pyc +0 -0
  354. package/pennyfarthing_scripts/settings/__init__.py +0 -0
  355. package/pennyfarthing_scripts/settings/__pycache__/__init__.cpython-314.pyc +0 -0
  356. package/pennyfarthing_scripts/settings/__pycache__/cli.cpython-314.pyc +0 -0
  357. package/pennyfarthing_scripts/settings/__pycache__/settings.cpython-314.pyc +0 -0
  358. package/pennyfarthing_scripts/settings/cli.py +55 -0
  359. package/pennyfarthing_scripts/settings/settings.py +98 -0
  360. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-311.pyc +0 -0
  361. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-311.pyc +0 -0
  362. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-311.pyc +0 -0
  363. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  364. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-311.pyc +0 -0
  365. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-311.pyc +0 -0
  366. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-311.pyc +0 -0
  367. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  368. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-311.pyc +0 -0
  369. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-311.pyc +0 -0
  370. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  371. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-311.pyc +0 -0
  372. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  373. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-311.pyc +0 -0
  374. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-311.pyc +0 -0
  375. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-311.pyc +0 -0
  376. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-311.pyc +0 -0
  377. package/pennyfarthing_scripts/sprint/cli.py +121 -0
  378. package/pennyfarthing_scripts/sprint/loader.py +154 -3
  379. package/pennyfarthing_scripts/sprint/story_update.py +7 -0
  380. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  381. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  382. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  383. package/pennyfarthing_scripts/tests/test_bikerack.py +26 -26
  384. package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +17 -16
  385. package/pennyfarthing_scripts/tests/test_dialogue_manager.py +0 -1
  386. package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +45 -47
  387. package/pennyfarthing_scripts/tests/test_workflow_list_team.py +143 -0
  388. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-311.pyc +0 -0
  389. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-311.pyc +0 -0
  390. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-311.pyc +0 -0
  391. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-311.pyc +0 -0
  392. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  393. package/pennyfarthing_scripts/validate/adapters/team_mode.py +323 -0
  394. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-311.pyc +0 -0
  395. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  396. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-311.pyc +0 -0
  397. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  398. package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  399. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-311.pyc +0 -0
  400. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  401. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-311.pyc +0 -0
  402. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
  403. package/pennyfarthing_scripts/workflow/cli.py +15 -14
  404. package/pennyfarthing_scripts/workflow/state.py +0 -1
  405. package/pennyfarthing_scripts/workflow/team_lifecycle.py +3 -4
@@ -0,0 +1,90 @@
1
+ <gate name="reviewer-preflight-check" model="haiku">
2
+
3
+ <purpose>
4
+ Composite gate for reviewer preflight. Extends tests-pass with code smell
5
+ detection and error boundary checks. The reviewer-preflight subagent runs
6
+ this gate before the Reviewer does critical analysis.
7
+ </purpose>
8
+
9
+ <ref gate="gates/tests-pass" />
10
+
11
+ <check name="no-debug-code">
12
+ No debug artifacts in changed files.
13
+ Search changed files (`git diff --name-only develop...HEAD`) for:
14
+ - `console.log` (not guarded by `process.env.NODE_ENV`)
15
+ - `dangerouslySetInnerHTML`
16
+ - `.skip(` (test skips)
17
+ - `TODO` / `FIXME`
18
+ Count by category. None found = pass.
19
+ </check>
20
+
21
+ <check name="error-boundaries">
22
+ UI components have error boundaries (UI repos only).
23
+ For React component files in diff, verify error boundary wrapping.
24
+ Skip for non-UI repos.
25
+ </check>
26
+
27
+ <pass>
28
+ Run all checks from `gates/tests-pass` (test-suite, working-tree, branch-status),
29
+ then run no-debug-code and error-boundaries.
30
+
31
+ If ALL pass, return:
32
+
33
+ ```yaml
34
+ GATE_RESULT:
35
+ status: pass
36
+ gate: reviewer-preflight-check
37
+ message: "Preflight clear: tests green, no smells, boundaries present"
38
+ checks:
39
+ - name: test-suite
40
+ status: pass
41
+ detail: "{passed}/{total} passing ({source: cached|fresh})"
42
+ - name: working-tree
43
+ status: pass
44
+ detail: "No uncommitted changes"
45
+ - name: branch-status
46
+ status: pass
47
+ detail: "On branch {branch}"
48
+ - name: no-debug-code
49
+ status: pass
50
+ detail: "No debug patterns in {N} changed files"
51
+ - name: error-boundaries
52
+ status: pass
53
+ detail: "Error boundaries present (or N/A for non-UI)"
54
+ ```
55
+ </pass>
56
+
57
+ <fail>
58
+ If ANY check fails, report all results. Note: code smells are advisory (YELLOW)
59
+ rather than blocking (RED) — the Reviewer makes the final call.
60
+
61
+ ```yaml
62
+ GATE_RESULT:
63
+ status: fail
64
+ gate: reviewer-preflight-check
65
+ message: "Preflight issues: {summary}"
66
+ checks:
67
+ - name: test-suite
68
+ status: pass | fail
69
+ detail: "{test results or failure list}"
70
+ - name: working-tree
71
+ status: pass | fail
72
+ detail: "{clean or list of uncommitted files}"
73
+ - name: branch-status
74
+ status: pass | fail
75
+ detail: "{branch info}"
76
+ - name: no-debug-code
77
+ status: pass | fail
78
+ detail: "{clean or smell counts by category}"
79
+ - name: error-boundaries
80
+ status: pass | fail
81
+ detail: "{present, missing list, or N/A}"
82
+ recovery:
83
+ - "Fix failing tests before review"
84
+ - "Commit or stash uncommitted changes"
85
+ - "Remove debug code: {locations}"
86
+ - "Add error boundaries to: {components}"
87
+ ```
88
+ </fail>
89
+
90
+ </gate>
@@ -0,0 +1,82 @@
1
+ <gate name="sm-setup-exit" model="haiku">
2
+
3
+ <purpose>
4
+ Verify SM has completed story setup before handing off to the next agent.
5
+ Without a properly configured session file, the next agent cannot function.
6
+ Extracts the inline pre-handoff checklist from sm.md.
7
+ </purpose>
8
+
9
+ <pass>
10
+ Run these checks in order:
11
+
12
+ 1. **session-exists:** Check `.session/{story-id}-session.md` exists.
13
+ ```bash
14
+ ls .session/{story-id}-session.md
15
+ ```
16
+
17
+ 2. **session-fields-set:** Read session file and verify:
18
+ - `**Workflow:**` field present and non-empty
19
+ - `**Phase:**` field present and set to `setup`
20
+
21
+ 3. **story-context-exists:** Verify:
22
+ - `sprint/context/context-epic-{N}.md` exists (extract epic number from story ID)
23
+ - Session file contains technical approach section
24
+ - Session file contains acceptance criteria
25
+
26
+ 4. **branch-created:** For each repo in session `**Repos:**`:
27
+ - Run `git branch --show-current`
28
+ - Confirm not on `main` or `develop`
29
+
30
+ If ALL pass, return:
31
+
32
+ ```yaml
33
+ GATE_RESULT:
34
+ status: pass
35
+ gate: sm-setup-exit
36
+ message: "Session {story-id} ready. Workflow: {workflow}, Branch: {branch}"
37
+ checks:
38
+ - name: session-exists
39
+ status: pass
40
+ detail: ".session/{story-id}-session.md exists"
41
+ - name: session-fields-set
42
+ status: pass
43
+ detail: "Workflow: {workflow}, Phase: setup"
44
+ - name: story-context-exists
45
+ status: pass
46
+ detail: "Epic context and story ACs present"
47
+ - name: branch-created
48
+ status: pass
49
+ detail: "Branch {branch} created in {repos}"
50
+ ```
51
+ </pass>
52
+
53
+ <fail>
54
+ If ANY check fails, report all results:
55
+
56
+ ```yaml
57
+ GATE_RESULT:
58
+ status: fail
59
+ gate: sm-setup-exit
60
+ message: "Setup incomplete: {summary}"
61
+ checks:
62
+ - name: session-exists
63
+ status: pass | fail
64
+ detail: "{exists or missing}"
65
+ - name: session-fields-set
66
+ status: pass | fail
67
+ detail: "{fields present or missing fields list}"
68
+ - name: story-context-exists
69
+ status: pass | fail
70
+ detail: "{context present or missing sections}"
71
+ - name: branch-created
72
+ status: pass | fail
73
+ detail: "{branch status per repo}"
74
+ recovery:
75
+ - "Run sm-setup to create session file"
76
+ - "Set Workflow and Phase fields in session"
77
+ - "Write story context with technical approach and ACs"
78
+ - "Create feature branch: git checkout -b feat/{story-slug}"
79
+ ```
80
+ </fail>
81
+
82
+ </gate>
@@ -3,23 +3,28 @@
3
3
 
4
4
  **Tests:** Use `testing-runner` subagent, never run directly.
5
5
 
6
- **Handoff:** Run `pf handoff resolve-gate` → gate check → `pf handoff complete-phase` → `pf handoff marker` → EXIT. See `<agent-exit-protocol>`.
6
+ **Handoff:** Run pf.sh `handoff resolve-gate` → gate check → pf.sh `handoff complete-phase` → pf.sh `handoff marker` → EXIT. See `<agent-exit-protocol>`.
7
7
 
8
8
  **Sidecars:** Write learnings BEFORE starting exit protocol.
9
9
 
10
10
  **Scripts:** Pennyfarthing scripts are Python-based (`pennyfarthing_scripts/`), not shell—check before assuming `.sh`.
11
+
12
+ **pf CLI:** Never call bare `pf` — it is not globally installed. Always use the wrapper:
13
+ ```bash
14
+ "$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh <command> [args...]
15
+ ```
11
16
  </critical>
12
17
 
13
18
  <critical>
14
19
  **Story completion is MANDATORY.** A story is NOT done until:
15
20
  1. Reviewer approves and merges the PR
16
- 2. SM runs `pf sprint story finish` (archive session, update Jira, clean up)
21
+ 2. SM runs pf.sh `sprint story finish` (archive session, update Jira, clean up)
17
22
 
18
23
  **Never** start new work while stories have open PRs. The merge gate blocks `/pf-sprint work` if open PRs exist.
19
24
 
20
25
  **If stuck in incomplete state:**
21
- - Open PRs? → Run `/reviewer` to complete reviews and merge
22
- - Merged but not finished? → Run `/sm` to trigger finish flow
26
+ - Open PRs? → Run `/pf-reviewer` to complete reviews and merge
27
+ - Merged but not finished? → Run `/pf-sm` to trigger finish flow
23
28
  </critical>
24
29
 
25
30
  ---
@@ -49,7 +54,7 @@ On activation, check session file for a `**Tandem:**` line (e.g., `**Tandem:** a
49
54
 
50
55
  **If tandem is configured:**
51
56
 
52
- 1. **Resolve backseat persona** from theme using the `pf theme`
57
+ 1. **Resolve backseat persona** from theme using the `pf.sh theme`
53
58
  ```bash
54
59
  THEME=$(yq '.theme' .pennyfarthing/config.local.yaml)
55
60
  PARTNER_CHARACTER=$(yq ".agents.{PARTNER}.character" .pennyfarthing/personas/themes/${THEME}.yaml)
@@ -95,6 +100,109 @@ See `.pennyfarthing/guides/tandem-protocol.md` for full protocol details.
95
100
 
96
101
  ---
97
102
 
103
+ <team-mode>
104
+ ## Team Mode — Phase-Scoped Native Teams
105
+
106
+ Team mode enables parallel agent collaboration within a single workflow phase using Claude Code's native Agent Teams. The phase agent is always the **team lead**; spawned agents are **teammates**. Teams are created at phase start and destroyed before handoff.
107
+
108
+ **Prerequisites:**
109
+ - Workflow phase has a `team:` block in its YAML definition
110
+ - `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` env var is set
111
+ - Interactive session (not `-p` mode)
112
+ - Feature detection passes (`pf detect teams` or equivalent)
113
+
114
+ **If prerequisites are not met:** Fall back to solo execution (optionally with tandem consultation). No error — team mode is always optional.
115
+
116
+ ### Detection
117
+
118
+ On activation, check the workflow YAML for a `team:` block on your phase:
119
+
120
+ ```yaml
121
+ phases:
122
+ - name: green
123
+ agent: dev
124
+ team:
125
+ teammates:
126
+ - agent: architect
127
+ task: "Review implementation approach and patterns"
128
+ - agent: tea
129
+ task: "Verify tests stay green, flag regressions"
130
+ ```
131
+
132
+ If `team:` is present and prerequisites are met, you are the **team lead** for this phase.
133
+
134
+ ### Team Lead Responsibilities
135
+
136
+ **On phase entry:**
137
+
138
+ 1. **Create the team:**
139
+ ```
140
+ TeamCreate("phase-{PHASE}-{STORY_ID}")
141
+ ```
142
+
143
+ 2. **Spawn teammates** per workflow YAML config. Each teammate gets a spawn prompt:
144
+ ```
145
+ Task(team_name="phase-{PHASE}-{STORY_ID}", name="{agent}",
146
+ prompt="Run `pf agent start {agent}`. Story: {STORY_ID}.
147
+ {task assignment from YAML}")
148
+ ```
149
+ Teammates auto-load CLAUDE.md, MCP servers, and skills from the working directory. Spawn prompts only need the activation command and task assignment — keep under 500 tokens.
150
+
151
+ 3. **Coordinate via SendMessage.** Use `SendMessage` for all intra-phase communication with teammates:
152
+ - Assign work: `SendMessage(to="{teammate}", message="Implement the adapter pattern for...")`
153
+ - Check status: `SendMessage(to="{teammate}", message="Status on your review?")`
154
+ - Broadcast: `SendMessage(message="Shifting approach — using strategy pattern instead")`
155
+
156
+ 4. **Do your own work.** You are still the primary implementer. Teammates assist — they don't replace you.
157
+
158
+ **Before exit protocol:**
159
+
160
+ 5. **Shut down all teammates.** This is mandatory before starting the normal exit protocol:
161
+ ```
162
+ SendMessage(to="{teammate}", message="Phase complete. Shut down.")
163
+ ```
164
+ Wait for teammates to go idle, then:
165
+ ```
166
+ TeamDelete("phase-{PHASE}-{STORY_ID}")
167
+ ```
168
+
169
+ 6. **Proceed with normal exit protocol** (assessment → resolve-gate → complete-phase → marker).
170
+
171
+ ### Teammate Responsibilities
172
+
173
+ When spawned as a teammate (you receive a task via spawn prompt, not a phase handoff):
174
+
175
+ 1. **Recognize you are a teammate, not the lead.** You do not own the phase. You do not run the exit protocol. You do not emit handoff markers.
176
+
177
+ 2. **Activate normally** via `pf agent start {agent}`. Read the session file for story context.
178
+
179
+ 3. **Communicate via SendMessage.** All collaboration with the lead and other teammates uses `SendMessage`:
180
+ - Report findings: `SendMessage(to="lead", message="Found coupling issue in...")`
181
+ - Ask questions: `SendMessage(to="lead", message="Should I use the existing adapter?")`
182
+ - Share status: `SendMessage(to="lead", message="Review complete. 2 issues found.")`
183
+
184
+ 4. **Go idle when your task is done.** Once your assigned task is complete, send a final status message and wait. Do not start new work unprompted.
185
+
186
+ 5. **Respond to shutdown requests.** When the lead sends a shutdown message, wrap up immediately. Save any observations to the session file or sidecar, then stop.
187
+
188
+ ### Communication Channels
189
+
190
+ | Channel | Scope | Used For |
191
+ |---------|-------|----------|
192
+ | `SendMessage` | Intra-phase (within team) | Lead ↔ teammate collaboration, status updates, task assignment |
193
+ | Reflector markers (`<!-- CYCLIST:... -->`) | Inter-phase (between phases) | Handoff from one phase agent to the next — **unchanged** |
194
+ | Session file | Cross-phase persistence | Story state, assessments, ACs — written by lead only in team mode |
195
+ | Sidecar files | Agent learning | Teammates may write to their own sidecar with file locking |
196
+
197
+ <critical>
198
+ **Never use SendMessage for inter-phase handoff.** Markers and `pf handoff` are the only way to transition between phases. SendMessage is for real-time collaboration within a phase.
199
+
200
+ **Never use markers for intra-phase communication.** Markers are routing signals for Cyclist UI and the handoff system. They have no meaning inside a team.
201
+ </critical>
202
+ </team-mode>
203
+
204
+ ---
205
+
98
206
  ## Reflector
99
207
 
100
208
  <critical>
@@ -117,20 +225,21 @@ See `.pennyfarthing/guides/tandem-protocol.md` for full protocol details.
117
225
  ## Exit Protocol
118
226
 
119
227
  1. Write assessment to session
120
- 2. Terminate tandem backseat (if active)
121
- 3. `pf handoff resolve-gate {story-id} {workflow} {phase}` → RESOLVE_RESULT
122
- 4. If blocked report error, STOP
123
- 5. If skipjump to step 7
124
- 6. If readyspawn gate subagent with gate file → GATE_RESULT
125
- - If failfix issues, retry from step 3 (max 3 retries)
228
+ 2. **If team mode active:** Shut down all teammates via `SendMessage`, then `TeamDelete`. Wait for cleanup before proceeding.
229
+ 3. Terminate tandem backseat (if active)
230
+ 4. `"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh handoff resolve-gate {story-id} {workflow} {phase}` → RESOLVE_RESULT
231
+ 5. If blockedreport error, STOP
232
+ 6. If skipjump to step 8
233
+ 7. If readyspawn gate subagent with gate file GATE_RESULT
234
+ - If fail → fix issues, retry from step 4 (max 3 retries)
126
235
  - If pass → continue
127
- 7. `pf handoff complete-phase {story-id} {workflow} {from} {to} {gate-type}`
128
- 8. `pf handoff marker {next_agent}` → AGENT_COMMAND block
129
- 9. **Act on AGENT_COMMAND:**
130
- - Has `marker:` field → emit the CYCLIST marker (Cyclist path)
131
- - `action: "inline_handoff"` → run `activation_command` via Bash, output result, adopt new agent identity
132
- - `action: "tirepump_handoff"` → tell user: "Context is high. Run `/clear` then `{fallback}`"
133
- - No action, no marker → output `fallback` text and EXIT
236
+ 8. `"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh handoff complete-phase {story-id} {workflow} {from} {to} {gate-type}`
237
+ 9. `"$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh handoff marker {next_agent}` → AGENT_COMMAND block
238
+ 10. **Act on AGENT_COMMAND:**
239
+ - Has `marker:` field → emit the CYCLIST marker (Cyclist path)
240
+ - `action: "inline_handoff"` → run `activation_command` via Bash, output result, adopt new agent identity
241
+ - `action: "tirepump_handoff"` → tell user: "Context is high. Run `/clear` then `{fallback}`"
242
+ - No action, no marker → output `fallback` text and EXIT
134
243
 
135
244
  **Agents drive exit directly — no handoff subagent.** Scripts handle routing and session updates atomically.
136
245
  </agent-exit-protocol>
@@ -141,12 +250,12 @@ See `.pennyfarthing/guides/tandem-protocol.md` for full protocol details.
141
250
  On activation, check if story phase belongs to you:
142
251
 
143
252
  ```bash
144
- pf handoff phase-check {your_agent_name}
253
+ "$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh handoff phase-check {your_agent_name}
145
254
  ```
146
255
 
147
256
  If result has `action: "redirect"`:
148
257
 
149
258
  - **Cyclist:** Emit `<!-- CYCLIST:HANDOFF:/{phase_owner} -->` and EXIT
150
- - **CLI + relay ON:** Run `pf agent start {phase_owner} --tier handoff --quiet` via Bash, adopt new identity
259
+ - **CLI + relay ON:** Run `source .pennyfarthing/scripts/lib/env.sh && source "$CLAUDE_PROJECT_DIR/.pennyfarthing/scripts/lib/run-pf.sh" && run_pf agent start {phase_owner} --tier handoff --quiet` via Bash, adopt new identity
151
260
  - **CLI + relay OFF:** Output `Run /pf-{phase_owner} to continue` and EXIT
152
261
  </wrong-phase-detection>
@@ -4,7 +4,7 @@
4
4
 
5
5
  This document describes how Pennyfarthing agents are coordinated. The framework supports both single-repo and multi-repo projects.
6
6
 
7
- **Key Principle:** Single entry point (`/pf-session new` or `/work`), state detection via session files, handoffs via Haiku subagents.
7
+ **Key Principle:** Single entry point (`/pf-session new` or `/pf-work`), state detection via session files, handoffs via Haiku subagents.
8
8
 
9
9
  ## The TDD Flow
10
10
 
@@ -12,7 +12,7 @@ SM → TEA → Dev → Reviewer → SM (setup → red → green → review → f
12
12
 
13
13
  Handoffs between agents are managed by Haiku subagents.
14
14
 
15
- **Entry points:** `/pf-session new` (new story) or `/work` (smart resume/start)
15
+ **Entry points:** `/pf-session new` (new story) or `/pf-work` (smart resume/start)
16
16
  **State detection:** Agents read session file on activation
17
17
  **Handoffs:** Agents spawn Haiku subagents to update session file
18
18
  **Finish:** SM handles when status = `approved`
@@ -263,7 +263,7 @@ User: @/pm
263
263
  ### Tactical Agent Workflow (Dev Example)
264
264
 
265
265
  ```
266
- User: @/dev
266
+ User: @/pf-dev
267
267
 
268
268
  1. Load Dev agent definition (.pennyfarthing/agents/dev.md)
269
269
  2. Load base context:
@@ -428,7 +428,7 @@ Dev Agent Example (API story):
428
428
  - No subagent extraction
429
429
 
430
430
  ### Current Architecture (January 2026)
431
- - Smart entry point: `/work` (resumes or starts new)
431
+ - Smart entry point: `/pf-work` (resumes or starts new)
432
432
  - Alternative: `/pf-session new` (explicitly start new story)
433
433
  - State detection via session file in `.session/`
434
434
  - Handoffs via Haiku subagents in `.pennyfarthing/agents/`
@@ -447,17 +447,17 @@ sprint/ # Sprint tracking
447
447
  ### Commands Reference
448
448
  ```bash
449
449
  # Entry points
450
- /work # Smart entry - resume or start new
450
+ /pf-work # Smart entry - resume or start new
451
451
  /pf-session new # Explicitly start new story
452
452
 
453
453
  # TDD Flow agents
454
- /sm # Scrum Master (setup + finish)
455
- /tea # Test Engineer (RED phase)
456
- /dev # Developer (GREEN phase)
457
- /reviewer # Code Reviewer
454
+ /pf-sm # Scrum Master (setup + finish)
455
+ /pf-tea # Test Engineer (RED phase)
456
+ /pf-dev # Developer (GREEN phase)
457
+ /pf-reviewer # Code Reviewer
458
458
 
459
459
  # Support agents
460
- /architect # Architecture design
460
+ /pf-architect # Architecture design
461
461
  /tech-writer # Documentation
462
462
  /ux-designer # UI/UX design
463
463
  /devops # Infrastructure
@@ -106,7 +106,7 @@ High-priority instruction that MUST be followed.
106
106
  ```xml
107
107
  <critical>
108
108
  **HANDOFF REQUIRES MARKER OUTPUT.** After exit protocol completes:
109
- Run `pf handoff marker {next_agent}` as ABSOLUTE LAST ACTION, output result, EXIT.
109
+ Run `pf.sh handoff marker {next_agent}` as ABSOLUTE LAST ACTION, output result, EXIT.
110
110
  </critical>
111
111
  ```
112
112
  - **Validation:** First `<critical>` should be within line 30
@@ -175,10 +175,10 @@ Logic for checking if this agent owns the current phase.
175
175
 
176
176
  Read `**Workflow:**` and `**Phase:**` from session. Query:
177
177
  ```bash
178
- OWNER=$(pf workflow phase-check {workflow} {phase})
178
+ OWNER=$("$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh workflow phase-check {workflow} {phase})
179
179
  ```
180
180
 
181
- **If OWNER != "dev":** Run `pf handoff marker $OWNER`, output result, tell user.
181
+ **If OWNER != "dev":** Run `pf.sh handoff marker $OWNER`, output result, tell user.
182
182
  </phase-check>
183
183
  ```
184
184
 
@@ -250,9 +250,9 @@ Tags that contain checklists with `- [ ]` items.
250
250
  ## MANDATORY: Complete Before Exiting
251
251
 
252
252
  - [ ] Write Dev Assessment to session file
253
- - [ ] Run `pf handoff resolve-gate` — verify gate status
254
- - [ ] Run `pf handoff complete-phase` — atomic session update
255
- - [ ] Run `pf handoff marker {next_agent}` — emit marker and EXIT
253
+ - [ ] Run `pf.sh handoff resolve-gate` — verify gate status
254
+ - [ ] Run `pf.sh handoff complete-phase` — atomic session update
255
+ - [ ] Run `pf.sh handoff marker {next_agent}` — emit marker and EXIT
256
256
  </handoff-gate>
257
257
  ```
258
258
 
@@ -38,7 +38,7 @@ Auto-loaded by `agent-session.sh start` from theme config. See output above.
38
38
  </persona>
39
39
 
40
40
  <role>
41
- **Primary:** {When this agent is invoked, e.g., "via /tea for TDD test writing"}
41
+ **Primary:** {When this agent is invoked, e.g., "via /pf-tea for TDD test writing"}
42
42
  **Position:** {Where in TDD flow, e.g., "SM → **TEA** → Dev → Reviewer"}
43
43
  </role>
44
44
 
@@ -26,7 +26,7 @@ User queues message in Editor
26
26
  |------|---------|
27
27
  | `packages/cyclist/src/bell-mode.ts` | State management: `isBellModeEnabled()`, `setBellMode()`, `toggleBellMode()` |
28
28
  | `packages/cyclist/src/api/bell.ts` | WebSocket broadcast of bell-consumed events |
29
- | `pf hooks bell-mode` | PostToolUse hook — reads queue, returns `additionalContext` |
29
+ | `pf.sh hooks bell-mode` | PostToolUse hook — reads queue, returns `additionalContext` |
30
30
  | `packages/cyclist/src/public/hooks/useMessageQueue.ts` | React hook: `queueMessage()`, `dequeueMessage()`, `injectMessage()`, `handleTurnComplete()` |
31
31
  | `packages/cyclist/src/public/contexts/MessageQueueContext.tsx` | Shared React context (single queue instance across components) |
32
32
  | `packages/cyclist/src/public/components/ControlBar.tsx` | Bell mode toggle button |
@@ -28,7 +28,7 @@ Cyclist bundles the conversation UI and dashboard panels into one Electron app.
28
28
 
29
29
  ```bash
30
30
  # Launch BikeRack + Claude CLI together
31
- pf bikerack start
31
+ pf.sh bikerack start
32
32
 
33
33
  # Or via just recipe
34
34
  just bikerack
@@ -37,10 +37,10 @@ just bikerack
37
37
  just bikerack dir=/path/to/project
38
38
 
39
39
  # Stop a running instance
40
- pf bikerack stop
40
+ pf.sh bikerack stop
41
41
 
42
42
  # Check status
43
- pf bikerack status
43
+ pf.sh bikerack status
44
44
  ```
45
45
 
46
46
  BikeRack opens a browser with the Dockview panel layout. Claude CLI runs in the foreground. When Claude exits, BikeRack shuts down automatically via `trap EXIT`.
@@ -71,7 +71,7 @@ BikeRack supports two modes:
71
71
 
72
72
  ## How It Works
73
73
 
74
- 1. **Launcher** (`pf bikerack start`) starts WheelHub with `IS_BIKERACK=1`
74
+ 1. **Launcher** (`pf.sh bikerack start`) starts WheelHub with `IS_BIKERACK=1`
75
75
  2. **WheelHub** listens on port 2898 (separate from Cyclist's 1898)
76
76
  3. **ClaudeService is skipped** — no `/ws/claude` WebSocket channel
77
77
  4. **OTEL telemetry** flows from Claude CLI to WheelHub's OTLP receiver
@@ -92,8 +92,8 @@ Client-side detection is URL-based: the presence of `?panel=X` triggers standalo
92
92
 
93
93
  | File | Purpose |
94
94
  |------|---------|
95
- | `.wheelhub-port` | Port number, written after `server.listen()` — readiness signal |
96
- | `.wheelhub-pid` | WheelHub PID, written by launcher — enables `pf bikerack stop` |
95
+ | `.bikerack-port` | Port number, written after `server.listen()` — readiness signal |
96
+ | `.wheelhub-pid` | WheelHub PID, written by launcher — enables `pf.sh bikerack stop` |
97
97
 
98
98
  Both are deleted on shutdown. Shared with Cyclist (single WheelHub namespace).
99
99
 
@@ -102,9 +102,9 @@ Both are deleted on shutdown. Shared with Cyclist (single WheelHub namespace).
102
102
  Save and restore BikeRack panel layouts:
103
103
 
104
104
  ```bash
105
- pf bc save my-layout # Save current layout
106
- pf bc load my-layout # Restore a saved layout
107
- pf bc list # List saved layouts
105
+ pf.sh bc save my-layout # Save current layout
106
+ pf.sh bc load my-layout # Restore a saved layout
107
+ pf.sh bc list # List saved layouts
108
108
  ```
109
109
 
110
110
  ## Key Files
@@ -115,7 +115,7 @@ pf bc list # List saved layouts
115
115
  | `packages/core/src/public/components/BikeRackWorkspace.tsx` | Dockview layout for BikeRack |
116
116
  | `packages/core/src/public/components/BikeRackIndex.tsx` | Panel listing index page |
117
117
  | `packages/core/src/public/components/StandalonePanel.tsx` | `?panel=X` routing + `PANEL_REGISTRY` |
118
- | `pennyfarthing_scripts/bikerack/cli.py` | `pf bikerack` launcher CLI |
118
+ | `pennyfarthing_scripts/bikerack/cli.py` | `pf.sh bikerack` launcher CLI |
119
119
 
120
120
  ## Constraints
121
121
 
@@ -6,7 +6,7 @@ CLI tools for analyzing existing codebases. Identify change hotspots, complexity
6
6
 
7
7
  ## Overview
8
8
 
9
- All tools are available under `pf debug` and share a consistent interface: `--format` (table/json/csv), `--output` (file), `--top` (result count), `--exclude` (patterns), and `--repo` (target).
9
+ All tools are available under `pf.sh debug` and share a consistent interface: `--format` (table/json/csv), `--output` (file), `--top` (result count), `--exclude` (patterns), and `--repo` (target).
10
10
 
11
11
  ## Tools
12
12
 
@@ -16,19 +16,19 @@ Find files that change most frequently — high churn often correlates with bugs
16
16
 
17
17
  ```bash
18
18
  # Full analysis (files + directories)
19
- pf debug hotspots analyze
19
+ pf.sh debug hotspots analyze
20
20
 
21
21
  # File-level only
22
- pf debug hotspots files
22
+ pf.sh debug hotspots files
23
23
 
24
24
  # Directory-level only
25
- pf debug hotspots dirs
25
+ pf.sh debug hotspots dirs
26
26
 
27
27
  # Options
28
- pf debug hotspots analyze --days 90 --top 20 --repo pennyfarthing
29
- pf debug hotspots analyze --format json --output hotspots.json
30
- pf debug hotspots analyze --exclude "*.test.ts" --branch main
31
- pf debug hotspots analyze --skip-type orchestrator
28
+ pf.sh debug hotspots analyze --days 90 --top 20 --repo pennyfarthing
29
+ pf.sh debug hotspots analyze --format json --output hotspots.json
30
+ pf.sh debug hotspots analyze --exclude "*.test.ts" --branch main
31
+ pf.sh debug hotspots analyze --skip-type orchestrator
32
32
  ```
33
33
 
34
34
  ### Complexity
@@ -36,9 +36,9 @@ pf debug hotspots analyze --skip-type orchestrator
36
36
  Measure code complexity metrics across files.
37
37
 
38
38
  ```bash
39
- pf debug complexity analyze
40
- pf debug complexity analyze --path ./packages/core/src
41
- pf debug complexity analyze --top 30 --format csv
39
+ pf.sh debug complexity analyze
40
+ pf.sh debug complexity analyze --path ./packages/core/src
41
+ pf.sh debug complexity analyze --top 30 --format csv
42
42
  ```
43
43
 
44
44
  ### Dead Code
@@ -47,12 +47,12 @@ Find unused code: stale files with no recent commits, and unused TypeScript expo
47
47
 
48
48
  ```bash
49
49
  # Files with no recent commits (default: 180 days)
50
- pf debug deadcode stale
51
- pf debug deadcode stale --days 90 --repo pennyfarthing
50
+ pf.sh debug deadcode stale
51
+ pf.sh debug deadcode stale --days 90 --repo pennyfarthing
52
52
 
53
53
  # Unused TypeScript exports (via ts-prune)
54
- pf debug deadcode exports
55
- pf debug deadcode exports --repo pennyfarthing --format json
54
+ pf.sh debug deadcode exports
55
+ pf.sh debug deadcode exports --repo pennyfarthing --format json
56
56
  ```
57
57
 
58
58
  ### Code Markers
@@ -61,16 +61,16 @@ Detect TODO, FIXME, HACK, and XXX comments with git blame data.
61
61
 
62
62
  ```bash
63
63
  # Full analysis with blame data
64
- pf debug codemarkers analyze
64
+ pf.sh debug codemarkers analyze
65
65
 
66
66
  # Only stale markers (older than threshold)
67
- pf debug codemarkers stale --days 90
67
+ pf.sh debug codemarkers stale --days 90
68
68
 
69
69
  # Summary counts by type
70
- pf debug codemarkers summary
70
+ pf.sh debug codemarkers summary
71
71
 
72
72
  # Deprecated symbol detection
73
- pf debug codemarkers deprecations
73
+ pf.sh debug codemarkers deprecations
74
74
  ```
75
75
 
76
76
  ### Dependencies
@@ -78,8 +78,8 @@ pf debug codemarkers deprecations
78
78
  Analyze dependency staleness and security advisories.
79
79
 
80
80
  ```bash
81
- pf debug dependencies analyze
82
- pf debug dependencies analyze --path ./pennyfarthing --format json
81
+ pf.sh debug dependencies analyze
82
+ pf.sh debug dependencies analyze --path ./pennyfarthing --format json
83
83
  ```
84
84
 
85
85
  ### Health Score
@@ -87,9 +87,9 @@ pf debug dependencies analyze --path ./pennyfarthing --format json
87
87
  Composite health score across all dimensions (hotspots, complexity, dead code, dependencies, markers).
88
88
 
89
89
  ```bash
90
- pf debug healthscore analyze
91
- pf debug healthscore analyze --no-cache # Bypass cache
92
- pf debug healthscore analyze --format json --output health.json
90
+ pf.sh debug healthscore analyze
91
+ pf.sh debug healthscore analyze --no-cache # Bypass cache
92
+ pf.sh debug healthscore analyze --format json --output health.json
93
93
  ```
94
94
 
95
95
  ## Common Options
@@ -61,7 +61,7 @@
61
61
 
62
62
  ### Conditional by Type
63
63
 
64
- **Workflow/Agent Commands (e.g., /sm, /dev, /tea)**
64
+ **Workflow/Agent Commands (e.g., /pf-sm, /pf-dev, /pf-tea)**
65
65
  - `<agent-activation>` — Required to show activation
66
66
  - `<instructions>` — Required for agent behavior
67
67