@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
@@ -181,7 +181,7 @@ The `gate.file` value is resolved by the gate file discovery algorithm (project-
181
181
  Validate gate files before use:
182
182
 
183
183
  ```bash
184
- pf gate validate path/to/gate-file.md
184
+ pf.sh gate validate path/to/gate-file.md
185
185
  ```
186
186
 
187
187
  The validator checks:
@@ -215,7 +215,7 @@ Gate 'tests-pass' is valid
215
215
 
216
216
  6. **Add recovery steps.** The `recovery` array in failed results gives the agent a clear path to fix issues and retry.
217
217
 
218
- 7. **Test with the validator.** Run `pf gate validate` on your gate file before referencing it in a workflow.
218
+ 7. **Test with the validator.** Run `pf.sh gate validate` on your gate file before referencing it in a workflow.
219
219
 
220
220
  ## Related
221
221
 
@@ -15,7 +15,12 @@ Gates live in `pennyfarthing-dist/gates/` and are referenced by workflow YAML fi
15
15
  | **tests-pass** | `gates/tests-pass.md` | Verify all tests pass, working tree clean, correct branch | Dev → Reviewer transitions |
16
16
  | **tests-fail** | `gates/tests-fail.md` | Verify tests are RED (failing) with AC coverage | TEA → Dev transitions |
17
17
  | **approval** | `gates/approval.md` | Verify reviewer has issued explicit APPROVED verdict | Reviewer → SM transitions |
18
- | **confidence-sm** | `gates/confidence-sm.md` | Check if user instruction to SM is ambiguous | SM entry gate |
18
+ | **confidence** | `gates/confidence.md` | Check if user instruction is ambiguous | Any agent entry gate |
19
+ | **dev-exit** | `gates/dev-exit.md` | Composite: tests-pass + no debug code | Dev → Reviewer transitions |
20
+ | **sm-setup-exit** | `gates/sm-setup-exit.md` | Session file, fields, context, branch created | SM → next agent transitions |
21
+ | **merge-ready** | `gates/merge-ready.md` | No open non-draft PRs | SM new work gate |
22
+ | **release-ready** | `gates/release-ready.md` | Composite: tests-pass + build, version, changelog | DevOps pre-deploy |
23
+ | **reviewer-preflight-check** | `gates/reviewer-preflight-check.md` | Composite: tests-pass + code smells, error boundaries | Reviewer preflight |
19
24
 
20
25
  ## Gate File Format
21
26
 
@@ -78,14 +83,14 @@ Agents interact with gates through the handoff CLI during their exit sequence:
78
83
 
79
84
  ```
80
85
  1. Agent writes assessment to session file
81
- 2. pf handoff resolve-gate {story-id} {workflow} {phase}
86
+ 2. pf.sh handoff resolve-gate {story-id} {workflow} {phase}
82
87
  → Reads workflow YAML, finds gate for current phase
83
88
  → Returns RESOLVE_RESULT: {status: ready|skip|blocked, gate_file: ...}
84
89
  3. If ready → spawn Haiku subagent with gate file → GATE_RESULT
85
90
  4. If GATE_RESULT.status == fail → fix issues, retry (max 3)
86
91
  5. If GATE_RESULT.status == pass → continue to complete-phase
87
- 6. pf handoff complete-phase {story-id} {workflow} {from} {to} {gate-type}
88
- 7. pf handoff marker {next-agent}
92
+ 6. pf.sh handoff complete-phase {story-id} {workflow} {from} {to} {gate-type}
93
+ 7. pf.sh handoff marker {next-agent}
89
94
  ```
90
95
 
91
96
  If a phase has no `gate:` block, `resolve-gate` returns `status: skip` and the agent proceeds directly to `complete-phase`.
@@ -96,7 +101,7 @@ Extended evaluation criteria can live in `gates/evaluations/`:
96
101
 
97
102
  | File | Purpose |
98
103
  |------|---------|
99
- | `evaluations/confidence-sm.md` | Detailed rubric for SM confidence scoring |
104
+ | `evaluations/confidence-sm.md` | Historical evaluation of SM confidence gate (led to agent-agnostic `confidence` gate) |
100
105
 
101
106
  ## Creating Custom Gates
102
107
 
@@ -1,7 +1,7 @@
1
1
  # Handoff CLI
2
2
 
3
3
  <info>
4
- Python CLI for managing workflow phase transitions. Agents use `pf handoff` to resolve gates, complete phase transitions, and generate handoff markers during their exit protocol.
4
+ Python CLI for managing workflow phase transitions. Agents use `pf.sh handoff` to resolve gates, complete phase transitions, and generate handoff markers during their exit protocol.
5
5
  </info>
6
6
 
7
7
  ## Commands
@@ -11,7 +11,7 @@ Python CLI for managing workflow phase transitions. Agents use `pf handoff` to r
11
11
  Check whether the current phase has a gate and what state it's in.
12
12
 
13
13
  ```bash
14
- pf handoff resolve-gate STORY_ID WORKFLOW PHASE
14
+ pf.sh handoff resolve-gate STORY_ID WORKFLOW PHASE
15
15
  ```
16
16
 
17
17
  **Arguments:**
@@ -39,7 +39,7 @@ RESOLVE_RESULT:
39
39
  Atomically update the session file to record a phase transition.
40
40
 
41
41
  ```bash
42
- pf handoff complete-phase STORY_ID WORKFLOW FROM_PHASE TO_PHASE GATE_TYPE
42
+ pf.sh handoff complete-phase STORY_ID WORKFLOW FROM_PHASE TO_PHASE GATE_TYPE
43
43
  ```
44
44
 
45
45
  **Arguments:**
@@ -66,8 +66,8 @@ Updates the session file: `**Phase:**` line, timestamps, and phase history table
66
66
  Generate an environment-aware handoff marker block.
67
67
 
68
68
  ```bash
69
- pf handoff marker NEXT_AGENT
70
- pf handoff marker --error "Tests failing"
69
+ pf.sh handoff marker NEXT_AGENT
70
+ pf.sh handoff marker --error "Tests failing"
71
71
  ```
72
72
 
73
73
  **Arguments:**
@@ -88,14 +88,14 @@ The handoff CLI is used in sequence during agent exit:
88
88
 
89
89
  ```
90
90
  1. Write assessment to session file
91
- 2. pf handoff resolve-gate {story-id} {workflow} {phase}
91
+ 2. pf.sh handoff resolve-gate {story-id} {workflow} {phase}
92
92
  ├── blocked → report error, STOP
93
93
  ├── skip → jump to step 4
94
94
  └── ready → spawn gate subagent → GATE_RESULT
95
95
  ├── fail → fix issues, retry (max 3)
96
96
  └── pass → continue
97
- 3. pf handoff complete-phase {story-id} {workflow} {from} {to} {gate-type}
98
- 4. pf handoff marker {next-agent} → emit marker → EXIT
97
+ 3. pf.sh handoff complete-phase {story-id} {workflow} {from} {to} {gate-type}
98
+ 4. pf.sh handoff marker {next-agent} → emit marker → EXIT
99
99
  ```
100
100
 
101
101
  See `guides/gates.md` for gate file format and evaluation details.
@@ -16,18 +16,18 @@ Hooks are commands that Claude Code runs at specific events:
16
16
 
17
17
  ### SessionStart Hooks
18
18
 
19
- #### pf hooks session-start
19
+ #### pf.sh hooks session-start
20
20
 
21
- **Location:** `pf hooks session-start`
21
+ **Location:** `pf.sh hooks session-start`
22
22
 
23
23
  Initializes the Pennyfarthing environment:
24
24
  - Creates `.session/` directory structure
25
25
  - Clears stale agent state from previous sessions
26
26
  - Sets `PROJECT_ROOT` and `SESSION_ID` environment variables
27
27
 
28
- #### pf hooks session-stop
28
+ #### pf.sh hooks session-stop
29
29
 
30
- **Location:** `pf hooks session-stop`
30
+ **Location:** `pf.sh hooks session-stop`
31
31
 
32
32
  Cleans up session state when Claude Code exits.
33
33
 
@@ -44,66 +44,66 @@ Project-specific environment setup. Edit this file to:
44
44
 
45
45
  **Location:** `.pennyfarthing/scripts/hooks/otel-auto-config.sh`
46
46
 
47
- Auto-configures OTEL telemetry for Cyclist web mode. Checks for a `.wheelhub-port` file and sets `OTEL_EXPORTER_OTLP_PROTOCOL` and `OTEL_EXPORTER_OTLP_ENDPOINT` to route Claude Code telemetry to the running Cyclist/BikeRack server.
47
+ Auto-configures OTEL telemetry for Cyclist web mode. Checks for a `.bikerack-port` file and sets `OTEL_EXPORTER_OTLP_PROTOCOL` and `OTEL_EXPORTER_OTLP_ENDPOINT` to route Claude Code telemetry to the running Cyclist/BikeRack server.
48
48
 
49
- #### pf hooks session-start (welcome)
49
+ #### pf.sh hooks session-start (welcome)
50
50
 
51
- **Location:** `pf hooks session-start`
51
+ **Location:** `pf.sh hooks session-start`
52
52
 
53
- Welcome display is now folded into `pf hooks session-start`. In CLI mode, shows ASCII art. In Cyclist mode, sends a WebSocket message to display the logo. Runs once per session (lock file guard).
53
+ Welcome display is now folded into `pf.sh hooks session-start`. In CLI mode, shows ASCII art. In Cyclist mode, sends a WebSocket message to display the logo. Runs once per session (lock file guard).
54
54
 
55
55
  ### PreToolUse Hooks
56
56
 
57
- #### pf hooks pre-edit-check
57
+ #### pf.sh hooks pre-edit-check
58
58
 
59
- **Location:** `pf hooks pre-edit-check`
59
+ **Location:** `pf.sh hooks pre-edit-check`
60
60
 
61
61
  Protects sensitive files from accidental edits:
62
62
  - Blocks: `.env`, `.pem`, `.key`, credentials, secrets
63
63
  - Blocks: `.git/`, `node_modules/`, `vendor/`
64
64
  - Blocks: `.pennyfarthing/*` (managed files)
65
65
 
66
- #### pf hooks cyclist-pretooluse
66
+ #### pf.sh hooks cyclist-pretooluse
67
67
 
68
- **Location:** `pf hooks cyclist-pretooluse`
68
+ **Location:** `pf.sh hooks cyclist-pretooluse`
69
69
 
70
70
  Cyclist-specific pre-tool validation. Runs additional safety checks when operating inside Cyclist.
71
71
 
72
- #### pf hooks context-warning
72
+ #### pf.sh hooks context-warning
73
73
 
74
- **Location:** `pf hooks context-warning`
74
+ **Location:** `pf.sh hooks context-warning`
75
75
 
76
76
  Warns agents when context usage is high. Outputs a warning at 60% usage and a critical warning at 85%. Never blocks — warning only (always exits 0).
77
77
 
78
- #### pf hooks context-breaker
78
+ #### pf.sh hooks context-breaker
79
79
 
80
- **Location:** `pf hooks context-breaker`
80
+ **Location:** `pf.sh hooks context-breaker`
81
81
 
82
- Hard stop when context reaches 80% (configurable via `CRITICAL_THRESHOLD`). Unlike `pf hooks context-warning`, this **blocks tool execution** (exit 2). Auto-saves the active agent to a checkpoint so `/pf-session continue` can restore it with FULL tier context.
82
+ Hard stop when context reaches 80% (configurable via `CRITICAL_THRESHOLD`). Unlike `pf.sh hooks context-warning`, this **blocks tool execution** (exit 2). Auto-saves the active agent to a checkpoint so `/pf-session continue` can restore it with FULL tier context.
83
83
 
84
- #### pf hooks schema-validation
84
+ #### pf.sh hooks schema-validation
85
85
 
86
- **Location:** `pf hooks schema-validation`
86
+ **Location:** `pf.sh hooks schema-validation`
87
87
 
88
88
  Validates file writes against XML schema rules for agent definitions, workflow files, and other structured content.
89
89
 
90
- #### pf hooks sprint-yaml
90
+ #### pf.sh hooks sprint-yaml
91
91
 
92
- **Location:** `pf hooks sprint-yaml`
92
+ **Location:** `pf.sh hooks sprint-yaml`
93
93
 
94
94
  Validates sprint YAML files on write to prevent structural corruption.
95
95
 
96
96
  ### PostToolUse Hooks
97
97
 
98
- #### pf hooks bell-mode
98
+ #### pf.sh hooks bell-mode
99
99
 
100
- **Location:** `pf hooks bell-mode`
100
+ **Location:** `pf.sh hooks bell-mode`
101
101
 
102
102
  Bell mode message injection. Checks the bell mode queue and injects queued messages into the agent's context at the next tool execution. Also handles tandem observation injection.
103
103
 
104
- #### pf hooks reflector-check
104
+ #### pf.sh hooks reflector-check
105
105
 
106
- **Location:** `pf hooks reflector-check`
106
+ **Location:** `pf.sh hooks reflector-check`
107
107
 
108
108
  Stop hook enforcing that every agent turn ends with a CYCLIST marker. Detects questions, handoff phrases, and validates marker presence. Blocks turns without valid markers in Cyclist mode.
109
109
 
@@ -133,7 +133,7 @@ Hooks are configured in `.claude/settings.local.json`:
133
133
  "hooks": [
134
134
  {
135
135
  "type": "command",
136
- "command": "pf hooks session-start"
136
+ "command": "pf.sh hooks session-start"
137
137
  }
138
138
  ]
139
139
  }
@@ -144,7 +144,7 @@ Hooks are configured in `.claude/settings.local.json`:
144
144
  "hooks": [
145
145
  {
146
146
  "type": "command",
147
- "command": "pf hooks pre-edit-check"
147
+ "command": "pf.sh hooks pre-edit-check"
148
148
  }
149
149
  ]
150
150
  }
@@ -53,7 +53,7 @@ Prime selects a context tier based on session state to manage token overhead:
53
53
 
54
54
  ```bash
55
55
  # From agent commands (via pf CLI)
56
- pf agent start "<agent>" --quiet
56
+ pf.sh agent start "<agent>" --quiet
57
57
 
58
58
  # TypeScript API (from Cyclist)
59
59
  getPrimeContext(agentName, projectDir)
@@ -63,7 +63,7 @@ getPrimeContextJson(agentName, projectDir, tier) # JSON for Cyclist
63
63
 
64
64
  ## Integration Points
65
65
 
66
- - **Agent commands** (`/sm`, `/dev`, `/tea`) invoke prime on activation
66
+ - **Agent commands** (`/pf-sm`, `/pf-dev`, `/pf-tea`) invoke prime on activation
67
67
  - **TirePump** calls prime to reload agent context after clearing
68
68
  - **Cyclist** uses JSON output for context display and token tracking
69
69
 
@@ -41,7 +41,7 @@ Marker pattern: /<!--\s*CYCLIST:(\w+)(?::([^>]+?))?\s*-->/gi
41
41
  | `packages/cyclist/src/public/components/QuickActions.tsx` | Renders action buttons from detected markers |
42
42
  | `packages/cyclist/src/public/hooks/useMarkerActions.ts` | Detects markers, builds action metadata |
43
43
  | `pennyfarthing-dist/scripts/hooks/question_reflector_check.py` | Stop hook — enforces marker presence |
44
- | `pf hooks reflector-check` | CLI entry point for stop hook |
44
+ | `pf.sh hooks reflector-check` | CLI entry point for stop hook |
45
45
 
46
46
  ## Enforcement Hook
47
47
 
@@ -146,7 +146,7 @@ args: "[arg1|arg2]" # Optional: argument summary
146
146
  **Example:**
147
147
  ```xml
148
148
  <run>
149
- pf sprint status [filter]
149
+ pf.sh sprint status [filter]
150
150
  </run>
151
151
  ```
152
152
 
@@ -195,7 +195,7 @@ pf sprint status [filter]
195
195
  **Example:**
196
196
  ```xml
197
197
  <example>
198
- pf sprint check MSSCI-12038
198
+ pf.sh sprint check MSSCI-12038
199
199
  # Returns: {"type": "story", "available": true, "title": "...", ...}
200
200
  </example>
201
201
  ```
@@ -292,7 +292,7 @@ Never manually edit sprint YAML. Use the provided commands.
292
292
  Add a new story to an epic.
293
293
 
294
294
  <run>
295
- pf sprint story add <epic-id> "<title>" <points>
295
+ pf.sh sprint story add <epic-id> "<title>" <points>
296
296
  </run>
297
297
 
298
298
  <args>
@@ -304,7 +304,7 @@ pf sprint story add <epic-id> "<title>" <points>
304
304
  </args>
305
305
 
306
306
  <example>
307
- pf sprint story add epic-76 "Add user authentication" 3
307
+ pf.sh sprint story add epic-76 "Add user authentication" 3
308
308
  </example>
309
309
 
310
310
  <output>
@@ -322,7 +322,7 @@ After creating, use `/pf-sprint story size` for sizing guidelines.
322
322
  Complete a story after PR merge.
323
323
 
324
324
  <run>
325
- pf sprint story finish <story-id>
325
+ pf.sh sprint story finish <story-id>
326
326
  </run>
327
327
 
328
328
  <args>
@@ -332,7 +332,7 @@ pf sprint story finish <story-id>
332
332
  </args>
333
333
 
334
334
  <example>
335
- pf sprint story finish MSSCI-12052
335
+ pf.sh sprint story finish MSSCI-12052
336
336
  # Archives story, updates Jira, cleans session files
337
337
  </example>
338
338
 
@@ -13,7 +13,7 @@ Primary Agent (Opus) Backseat Agent (Haiku, background)
13
13
  │ │ .session/{story}-tandem-{partner}.md
14
14
  │ │
15
15
  ├── PostToolUse hook fires ────┤
16
- │ pf hooks bell-mode detects │
16
+ │ pf.sh hooks bell-mode detects │
17
17
  │ new observation, injects │
18
18
  │ "[Tandem] Character: ..." │
19
19
  │ │
@@ -163,8 +163,8 @@ For active, synchronous agent-to-agent questions (as opposed to passive observat
163
163
  | `observation-writer.ts` | Built | TypeScript API for observation file I/O |
164
164
  | `file-watch.ts` | Built | File system change detection |
165
165
  | `tool-watch.ts` | Built | Tool call log monitoring |
166
- | `pf hooks bell-mode` | Built | PostToolUse hook with tandem injection |
166
+ | `pf.sh hooks bell-mode` | Built | PostToolUse hook with tandem injection |
167
167
  | `bellmode_hook.py` | Built | Python implementation of bell mode hook |
168
- | `pf hooks statusline` | Built | CLI statusline with tandem indicator |
168
+ | `pf.sh hooks statusline` | Built | CLI statusline with tandem indicator |
169
169
  | `tandem-backseat.md` | Built | Backseat agent prompt template |
170
170
  | `agent-behavior.md` | Built | Shared agent behavior with tandem protocol |
@@ -253,5 +253,5 @@ Error: workflow.triggers.points min (10) cannot be greater than max (5)
253
253
 
254
254
  - Story 31-2: Workflow loader and validator
255
255
  - Story 31-3: Story-to-workflow routing engine
256
- - Story 31-5: /workflow skill for listing and switching
256
+ - Story 31-5: /pf-workflow skill for listing and switching
257
257
  - Story MSSCI-11710: Permission presets by workflow
@@ -86,8 +86,8 @@ Ports are stored in the session file and passed to agents.
86
86
  | Command | Purpose |
87
87
  |---------|---------|
88
88
  | `/pf-session parallel` | Start a new parallel work session |
89
- | `pf git worktree list` | Show active worktrees |
90
- | `pf git worktree remove <name>` | Clean up a worktree |
89
+ | `pf.sh git worktree list` | Show active worktrees |
90
+ | `pf.sh git worktree remove <name>` | Clean up a worktree |
91
91
 
92
92
  ## TDD Flow in Worktrees
93
93
 
@@ -104,7 +104,7 @@ Agents use worktree paths from session file for all operations.
104
104
  When story is complete, SM archives the session and the worktree can be removed:
105
105
 
106
106
  ```bash
107
- pf git worktree remove wt-5-3a
107
+ pf.sh git worktree remove wt-5-3a
108
108
  ```
109
109
 
110
110
  This removes:
@@ -124,7 +124,7 @@ Tags used by agents participating in the TDD workflow cycle (SM, TEA, Dev, Revie
124
124
 
125
125
  **Purpose:** Verify agent owns the current workflow phase before proceeding. Prevents agents from acting on stories they shouldn't own.
126
126
 
127
- **Usage:** SM, TEA, Dev, Reviewer - runs `pf workflow phase-check` on activation to determine correct owner.
127
+ **Usage:** SM, TEA, Dev, Reviewer - runs `pf.sh workflow phase-check` on activation to determine correct owner.
128
128
 
129
129
  ```markdown
130
130
  <phase-check>
@@ -132,10 +132,10 @@ Tags used by agents participating in the TDD workflow cycle (SM, TEA, Dev, Revie
132
132
 
133
133
  Read `**Workflow:**` and `**Phase:**` from session. Query:
134
134
  ```bash
135
- OWNER=$(pf workflow phase-check {workflow} {phase})
135
+ OWNER=$("$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh workflow phase-check {workflow} {phase})
136
136
  ```
137
137
 
138
- **If OWNER != "dev":** Run `pf handoff marker $OWNER`, output result, tell user.
138
+ **If OWNER != "dev":** Run `pf.sh handoff marker $OWNER`, output result, tell user.
139
139
  </phase-check>
140
140
  ```
141
141
 
@@ -150,9 +150,9 @@ OWNER=$(pf workflow phase-check {workflow} {phase})
150
150
  ## MANDATORY: Complete Before Exiting
151
151
 
152
152
  - [ ] Write Assessment to session file
153
- - [ ] Run `pf handoff resolve-gate` — verify gate status
154
- - [ ] Run `pf handoff complete-phase` — atomic session update
155
- - [ ] Run `pf handoff marker {next_agent}` — emit marker and EXIT
153
+ - [ ] Run `pf.sh handoff resolve-gate` — verify gate status
154
+ - [ ] Run `pf.sh handoff complete-phase` — atomic session update
155
+ - [ ] Run `pf.sh handoff marker {next_agent}` — emit marker and EXIT
156
156
  </handoff-gate>
157
157
  ```
158
158
 
@@ -448,7 +448,7 @@ Tags used in skill files (`skills/{name}/SKILL.md`) for command documentation.
448
448
 
449
449
  ```markdown
450
450
  <run>
451
- pf sprint status [filter]
451
+ pf.sh sprint status [filter]
452
452
  </run>
453
453
  ```
454
454
 
@@ -474,7 +474,7 @@ pf sprint status [filter]
474
474
 
475
475
  ```markdown
476
476
  <example>
477
- pf sprint check MSSCI-12038
477
+ pf.sh sprint check MSSCI-12038
478
478
  # Returns: {"type": "story", "available": true}
479
479
  </example>
480
480
  ```
@@ -8,10 +8,10 @@ Scripts are organized into categorical subdirectories. **Full paths are required
8
8
  scripts/
9
9
  ├── core/ # Essential scripts (agent-session.sh)
10
10
  ├── workflow/ # Workflow mechanics (finish-story.sh, check.sh)
11
- ├── sprint/ # Sprint YAML operations (migrated to pf sprint CLI)
11
+ ├── sprint/ # Sprint YAML operations (migrated to pf.sh sprint CLI)
12
12
  ├── story/ # Story operations (create-story.sh)
13
13
  ├── jira/ # Jira integration (jira-claim-story.sh)
14
- ├── git/ # Git operations (deprecated shims → pf git CLI)
14
+ ├── git/ # Git operations (deprecated shims → pf.sh git CLI)
15
15
  ├── theme/ # Theme operations (list-themes.sh)
16
16
  ├── test/ # Test infrastructure (test-setup.sh)
17
17
  ├── lib/ # Shared bash libraries (common.sh, logging.sh)
@@ -27,9 +27,9 @@ Scripts are invoked directly with **full category paths**:
27
27
  ```bash
28
28
  # From project root
29
29
  .pennyfarthing/scripts/core/agent-session.sh start sm
30
- pf sprint status
30
+ pf.sh sprint status
31
31
  .pennyfarthing/scripts/jira/jira-claim-story.sh MSSCI-12345
32
- pf sprint story finish MSSCI-12345
32
+ pf.sh sprint story finish MSSCI-12345
33
33
  ```
34
34
 
35
35
  ## Distributed Scripts
@@ -232,11 +232,8 @@ case "$1" in
232
232
  PRIME_ARGS+=(--no-persona)
233
233
  fi
234
234
 
235
- if command -v pf &>/dev/null; then
236
- pf prime "${PRIME_ARGS[@]}"
237
- else
238
- python3 -m pennyfarthing_scripts.prime "${PRIME_ARGS[@]}"
239
- fi
235
+ source "$SCRIPT_DIR/../lib/run-pf.sh"
236
+ run_pf prime "${PRIME_ARGS[@]}"
240
237
  ;;
241
238
  stop)
242
239
  # Use provided session ID, fall back to SESSION_ID env var
@@ -156,7 +156,7 @@ if last_total:
156
156
  status = 'HIGH' if usable_pct > $WARNING_THRESHOLD else 'OK'
157
157
  relay = '$RELAY_MODE' == 'true'
158
158
  tirepump = (relay or '$PERMISSION_MODE' == 'turbo') and usable_pct > $TIREPUMP_THRESHOLD
159
- is_cyclist = os.environ.get('CYCLIST') == '1' or Path('$PROJECT_DIR/packages/cyclist/.wheelhub-port').exists()
159
+ is_cyclist = os.environ.get('CYCLIST') == '1' or Path('$PROJECT_DIR/packages/cyclist/.bikerack-port').exists()
160
160
 
161
161
  print(f'CONTEXT_TOKENS={last_total}')
162
162
  print(f'CONTEXT_PERCENT={total_pct}')
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bash
2
+ # Wrapper: run `pf` CLI via uv run — no global pf install needed.
3
+ # Usage: "$CLAUDE_PROJECT_DIR"/.pennyfarthing/scripts/core/pf.sh <command> [args...]
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf "$@"
@@ -1,8 +1,5 @@
1
1
  #!/bin/bash
2
2
  # DEPRECATED: Use `pf handoff phase-check <agent>` instead.
3
- # This shim delegates to the Python implementation.
4
- #
5
- # Usage: phase-check-start.sh <agent>
6
-
7
3
  echo "DEPRECATED: phase-check-start.sh — use 'pf handoff phase-check $1' instead" >&2
8
- exec pf handoff phase-check "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf handoff phase-check "$@"
@@ -1,28 +1,5 @@
1
1
  #!/usr/bin/env bash
2
2
  # prime.sh - Load essential project context at agent activation
3
3
  # Usage: prime.sh [--minimal] [--full] [--quiet] [--agent <name>]
4
- #
5
- # Uses the `pf` CLI (installed via uv/pipx during pennyfarthing init).
6
- # Falls back to python3 -m with PYTHONPATH if pf is not available.
7
-
8
- # Prefer pf CLI if available
9
- if command -v pf &>/dev/null; then
10
- exec pf prime "$@"
11
- fi
12
-
13
- # Fallback: find pennyfarthing_scripts via PYTHONPATH
14
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
15
- PACKAGE_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd -P)"
16
-
17
- if [[ ! -d "$PACKAGE_ROOT/pennyfarthing_scripts" ]]; then
18
- PROJECT_ROOT="$PWD"
19
- while [[ ! -d "$PROJECT_ROOT/.pennyfarthing" ]] && [[ "$PROJECT_ROOT" != "/" ]]; do
20
- PROJECT_ROOT="$(dirname "$PROJECT_ROOT")"
21
- done
22
- if [[ -d "$PROJECT_ROOT/node_modules/@pennyfarthing/core/pennyfarthing_scripts" ]]; then
23
- PACKAGE_ROOT="$PROJECT_ROOT/node_modules/@pennyfarthing/core"
24
- fi
25
- fi
26
-
27
- export PYTHONPATH="${PACKAGE_ROOT}:${PYTHONPATH:-}"
28
- exec python3 -m pennyfarthing_scripts.prime "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf prime "$@"
@@ -4,29 +4,29 @@ Scripts for Git operations, branching, and worktree management.
4
4
 
5
5
  ## CLI Commands (preferred)
6
6
 
7
- All git operations are available via the `pf git` CLI:
7
+ All git operations are available via the `pf.sh git` CLI:
8
8
 
9
9
  | Command | Purpose |
10
10
  |---------|---------|
11
- | `pf git status [--brief]` | Show git status across all repos |
12
- | `pf git branches <name> [--repos all\|api\|ui]` | Create feature branches in repos |
13
- | `pf git worktree create <name> <branch>` | Create worktrees for parallel work |
14
- | `pf git worktree remove <name>` | Remove worktree and clean up |
15
- | `pf git worktree list` | List all active worktrees |
16
- | `pf git worktree status` | Show detailed worktree status |
17
- | `pf git install-hooks` | Install git hooks with .d/ dispatcher |
18
- | `pf git cleanup` | Organize changes into commits/branches |
11
+ | `pf.sh git status [--brief]` | Show git status across all repos |
12
+ | `pf.sh git branches <name> [--repos all\|api\|ui]` | Create feature branches in repos |
13
+ | `pf.sh git worktree create <name> <branch>` | Create worktrees for parallel work |
14
+ | `pf.sh git worktree remove <name>` | Remove worktree and clean up |
15
+ | `pf.sh git worktree list` | List all active worktrees |
16
+ | `pf.sh git worktree status` | Show detailed worktree status |
17
+ | `pf.sh git install-hooks` | Install git hooks with .d/ dispatcher |
18
+ | `pf.sh git cleanup` | Organize changes into commits/branches |
19
19
 
20
20
  ## Legacy Scripts (deprecated shims)
21
21
 
22
- These scripts now forward to `pf git` commands:
22
+ These scripts now forward to `pf.sh git` commands:
23
23
 
24
24
  | Script | Forwards to |
25
25
  |--------|-------------|
26
- | `git-status-all.sh` | `pf git status` |
27
- | `create-feature-branches.sh` | `pf git branches` |
28
- | `worktree-manager.sh` | `pf git worktree` |
29
- | `install-git-hooks.sh` | `pf git install-hooks` |
26
+ | `git-status-all.sh` | `pf.sh git status` |
27
+ | `create-feature-branches.sh` | `pf.sh git branches` |
28
+ | `worktree-manager.sh` | `pf.sh git worktree` |
29
+ | `install-git-hooks.sh` | `pf.sh git install-hooks` |
30
30
  | `release.sh` | Release workflow (use `/pf-workflow start release`) |
31
31
 
32
32
  ## Ownership
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf git branches` instead.
3
- # This shim forwards to the Python CLI.
4
- set -e
5
3
  echo "DEPRECATED: create-feature-branches.sh — use 'pf git branches' instead" >&2
6
- exec pf git branches "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf git branches "$@"
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf git status` instead.
3
- # This shim forwards to the Python CLI.
4
- set -e
5
3
  echo "DEPRECATED: git-status-all.sh — use 'pf git status' instead" >&2
6
- exec pf git status "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf git status "$@"
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf git install-hooks` instead.
3
- # This shim forwards to the Python CLI.
4
- set -e
5
3
  echo "DEPRECATED: install-git-hooks.sh — use 'pf git install-hooks' instead" >&2
6
- exec pf git install-hooks "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf git install-hooks "$@"
@@ -1,6 +1,4 @@
1
1
  #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf git worktree` instead.
3
- # This shim forwards to the Python CLI.
4
- set -e
5
- echo "DEPRECATED: worktree-manager.sh — use 'pf git worktree' instead" >&2
6
- exec pf git worktree "$@"
3
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
4
+ exec_pf git worktree "$@"
@@ -6,22 +6,22 @@ Git hooks and Claude Code hooks.
6
6
 
7
7
  | Script | Purpose |
8
8
  |--------|---------|
9
- | `pf hooks context-breaker` | Claude hook: halt at context limit |
10
- | `pf hooks context-warning` | Claude hook: warn on high context |
9
+ | `pf.sh hooks context-breaker` | Claude hook: halt at context limit |
10
+ | `pf.sh hooks context-warning` | Claude hook: warn on high context |
11
11
  | `otel-auto-config.sh` | Claude hook: configure OTEL |
12
12
  | `post-merge.sh` | Git hook: post-merge actions |
13
13
  | `pre-commit.sh` | Git hook: branch protection, agent validation, sprint YAML validation |
14
- | `pf hooks pre-edit-check` | Claude hook: validate before edit |
14
+ | `pf.sh hooks pre-edit-check` | Claude hook: validate before edit |
15
15
  | `pre-push.sh` | Git hook: pre-push validation |
16
- | `pf hooks session-start` | Claude hook: session start |
17
- | `pf hooks session-stop` | Claude hook: session stop |
16
+ | `pf.sh hooks session-start` | Claude hook: session start |
17
+ | `pf.sh hooks session-stop` | Claude hook: session stop |
18
18
 
19
19
  ## Installation
20
20
 
21
21
  Git hooks are installed via:
22
22
 
23
23
  ```bash
24
- pf git install-hooks
24
+ pf.sh git install-hooks
25
25
  ```
26
26
 
27
27
  Claude hooks are configured in `.claude/settings.json`.