@pennyfarthing/core 11.2.0 → 11.2.2

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 (367) hide show
  1. package/README.md +100 -40
  2. package/package.json +2 -1
  3. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  4. package/packages/core/dist/cli/commands/doctor.js +474 -66
  5. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  6. package/packages/core/dist/cli/commands/init.js +4 -4
  7. package/packages/core/dist/cli/commands/init.js.map +1 -1
  8. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  9. package/packages/core/dist/cli/commands/update.js +4 -5
  10. package/packages/core/dist/cli/commands/update.js.map +1 -1
  11. package/packages/core/dist/cli/utils/constants.d.ts +3 -8
  12. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
  13. package/packages/core/dist/cli/utils/constants.js +3 -4
  14. package/packages/core/dist/cli/utils/constants.js.map +1 -1
  15. package/packages/core/dist/cli/utils/settings.d.ts +7 -0
  16. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  17. package/packages/core/dist/cli/utils/settings.js +70 -29
  18. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  19. package/packages/core/dist/cli/utils/symlinks.js +16 -16
  20. package/packages/core/dist/cli/utils/symlinks.js.map +1 -1
  21. package/packages/core/dist/consultation/dialogue-manager.d.ts +1 -1
  22. package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -1
  23. package/packages/core/dist/consultation/dialogue-manager.js +1 -1
  24. package/packages/core/dist/consultation/dialogue-manager.js.map +1 -1
  25. package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -1
  26. package/packages/core/dist/consultation/tandem-metrics.d.ts +91 -0
  27. package/packages/core/dist/consultation/tandem-metrics.d.ts.map +1 -0
  28. package/packages/core/dist/consultation/tandem-metrics.js +131 -0
  29. package/packages/core/dist/consultation/tandem-metrics.js.map +1 -0
  30. package/packages/core/dist/consultation/tandem-metrics.test.d.ts +18 -0
  31. package/packages/core/dist/consultation/tandem-metrics.test.d.ts.map +1 -0
  32. package/packages/core/dist/consultation/tandem-metrics.test.js +457 -0
  33. package/packages/core/dist/consultation/tandem-metrics.test.js.map +1 -0
  34. package/packages/core/dist/public/css/react.css +1 -1
  35. package/packages/core/dist/public/js/react/react.js +14 -14
  36. package/packages/core/dist/server/api/agent-load.js +1 -1
  37. package/packages/core/dist/server/api/agent-load.js.map +1 -1
  38. package/packages/core/dist/server/api/git.d.ts.map +1 -1
  39. package/packages/core/dist/server/api/git.js +0 -1
  40. package/packages/core/dist/server/api/git.js.map +1 -1
  41. package/packages/core/dist/server/api/index.d.ts +2 -0
  42. package/packages/core/dist/server/api/index.d.ts.map +1 -1
  43. package/packages/core/dist/server/api/index.js +2 -0
  44. package/packages/core/dist/server/api/index.js.map +1 -1
  45. package/packages/core/dist/server/api/project-info.d.ts +11 -0
  46. package/packages/core/dist/server/api/project-info.d.ts.map +1 -0
  47. package/packages/core/dist/server/api/project-info.js +18 -0
  48. package/packages/core/dist/server/api/project-info.js.map +1 -0
  49. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  50. package/packages/core/dist/server/otlp-receiver.js +18 -1
  51. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  52. package/packages/core/dist/server/otlp-receiver.test.js +1 -1
  53. package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
  54. package/packages/core/dist/server/server.d.ts +0 -3
  55. package/packages/core/dist/server/server.d.ts.map +1 -1
  56. package/packages/core/dist/server/server.js +5 -38
  57. package/packages/core/dist/server/server.js.map +1 -1
  58. package/packages/core/dist/server/server.test.d.ts +1 -1
  59. package/packages/core/dist/server/server.test.js +12 -23
  60. package/packages/core/dist/server/server.test.js.map +1 -1
  61. package/packages/core/dist/server/settings.d.ts +1 -0
  62. package/packages/core/dist/server/settings.d.ts.map +1 -1
  63. package/packages/core/dist/server/settings.js +13 -0
  64. package/packages/core/dist/server/settings.js.map +1 -1
  65. package/packages/core/dist/shared/capabilities.d.ts +88 -0
  66. package/packages/core/dist/shared/capabilities.d.ts.map +1 -0
  67. package/packages/core/dist/shared/capabilities.js +133 -0
  68. package/packages/core/dist/shared/capabilities.js.map +1 -0
  69. package/packages/core/dist/shared/capabilities.test.d.ts +2 -0
  70. package/packages/core/dist/shared/capabilities.test.d.ts.map +1 -0
  71. package/packages/core/dist/shared/capabilities.test.js +217 -0
  72. package/packages/core/dist/shared/capabilities.test.js.map +1 -0
  73. package/packages/core/dist/shared/spawn-prompt.d.ts +47 -0
  74. package/packages/core/dist/shared/spawn-prompt.d.ts.map +1 -0
  75. package/packages/core/dist/shared/spawn-prompt.js +82 -0
  76. package/packages/core/dist/shared/spawn-prompt.js.map +1 -0
  77. package/packages/core/dist/shared/spawn-prompt.test.d.ts +2 -0
  78. package/packages/core/dist/shared/spawn-prompt.test.d.ts.map +1 -0
  79. package/packages/core/dist/shared/spawn-prompt.test.js +251 -0
  80. package/packages/core/dist/shared/spawn-prompt.test.js.map +1 -0
  81. package/packages/core/dist/workflow/tandem-workflow-templates.test.d.ts +18 -0
  82. package/packages/core/dist/workflow/tandem-workflow-templates.test.d.ts.map +1 -0
  83. package/packages/core/dist/workflow/tandem-workflow-templates.test.js +434 -0
  84. package/packages/core/dist/workflow/tandem-workflow-templates.test.js.map +1 -0
  85. package/packages/core/dist/workflow/team-lifecycle.d.ts +169 -0
  86. package/packages/core/dist/workflow/team-lifecycle.d.ts.map +1 -0
  87. package/packages/core/dist/workflow/team-lifecycle.js +217 -0
  88. package/packages/core/dist/workflow/team-lifecycle.js.map +1 -0
  89. package/packages/core/dist/workflow/team-lifecycle.test.d.ts +20 -0
  90. package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +1 -0
  91. package/packages/core/dist/workflow/team-lifecycle.test.js +966 -0
  92. package/packages/core/dist/workflow/team-lifecycle.test.js.map +1 -0
  93. package/packages/core/dist/workflow/workflow-schema.d.ts +32 -0
  94. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
  95. package/packages/core/dist/workflow/workflow-schema.js +120 -0
  96. package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
  97. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -1
  98. package/packages/core/dist/workflow/workflow-schema.test.js +570 -1
  99. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -1
  100. package/packages/core/dist/workflow/workflow-team-templates.test.d.ts +17 -0
  101. package/packages/core/dist/workflow/workflow-team-templates.test.d.ts.map +1 -0
  102. package/packages/core/dist/workflow/workflow-team-templates.test.js +275 -0
  103. package/packages/core/dist/workflow/workflow-team-templates.test.js.map +1 -0
  104. package/pennyfarthing-dist/agents/dev.md +21 -12
  105. package/pennyfarthing-dist/agents/reviewer.md +23 -4
  106. package/pennyfarthing-dist/agents/sm-finish.md +19 -2
  107. package/pennyfarthing-dist/agents/sm-setup.md +7 -7
  108. package/pennyfarthing-dist/agents/sm.md +12 -12
  109. package/pennyfarthing-dist/agents/tea.md +2 -2
  110. package/pennyfarthing-dist/agents/testing-runner.md +1 -1
  111. package/pennyfarthing-dist/commands/pf-architect.md +1 -1
  112. package/pennyfarthing-dist/commands/pf-ba.md +1 -1
  113. package/pennyfarthing-dist/commands/pf-chore.md +2 -2
  114. package/pennyfarthing-dist/commands/pf-dev.md +1 -1
  115. package/pennyfarthing-dist/commands/pf-devops.md +1 -1
  116. package/pennyfarthing-dist/commands/pf-epic.md +6 -6
  117. package/pennyfarthing-dist/commands/pf-git.md +12 -10
  118. package/pennyfarthing-dist/commands/pf-health-check.md +1 -1
  119. package/pennyfarthing-dist/commands/pf-help.md +12 -12
  120. package/pennyfarthing-dist/commands/pf-orchestrator.md +1 -1
  121. package/pennyfarthing-dist/commands/pf-pm.md +1 -1
  122. package/pennyfarthing-dist/commands/pf-prime.md +8 -8
  123. package/pennyfarthing-dist/commands/pf-reviewer.md +1 -1
  124. package/pennyfarthing-dist/commands/pf-session.md +7 -7
  125. package/pennyfarthing-dist/commands/pf-sm.md +1 -1
  126. package/pennyfarthing-dist/commands/pf-sprint.md +7 -7
  127. package/pennyfarthing-dist/commands/pf-tea.md +1 -1
  128. package/pennyfarthing-dist/commands/pf-tech-writer.md +1 -1
  129. package/pennyfarthing-dist/commands/pf-theme.md +9 -9
  130. package/pennyfarthing-dist/commands/pf-ux-designer.md +1 -1
  131. package/pennyfarthing-dist/commands/pf-work.md +1 -1
  132. package/pennyfarthing-dist/gates/approval.md +63 -0
  133. package/pennyfarthing-dist/gates/confidence-sm.md +71 -0
  134. package/pennyfarthing-dist/gates/context-ok.md +56 -0
  135. package/pennyfarthing-dist/gates/evaluations/confidence-sm.md +54 -0
  136. package/pennyfarthing-dist/gates/quality-pass.md +67 -0
  137. package/pennyfarthing-dist/gates/tests-fail.md +84 -0
  138. package/pennyfarthing-dist/gates/tests-pass.md +79 -0
  139. package/pennyfarthing-dist/guides/agent-behavior.md +84 -29
  140. package/pennyfarthing-dist/guides/agent-coordination.md +10 -10
  141. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
  142. package/pennyfarthing-dist/guides/agent-template-tactical.md +1 -1
  143. package/pennyfarthing-dist/guides/bell-mode.md +1 -1
  144. package/pennyfarthing-dist/guides/bikerack.md +10 -10
  145. package/pennyfarthing-dist/guides/brownfield-tools.md +24 -24
  146. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +1 -1
  147. package/pennyfarthing-dist/guides/gate-schema.md +2 -2
  148. package/pennyfarthing-dist/guides/gates.md +3 -3
  149. package/pennyfarthing-dist/guides/handoff-cli.md +8 -8
  150. package/pennyfarthing-dist/guides/hooks.md +29 -29
  151. package/pennyfarthing-dist/guides/prime.md +2 -2
  152. package/pennyfarthing-dist/guides/reflector.md +1 -1
  153. package/pennyfarthing-dist/guides/skill-schema.md +6 -6
  154. package/pennyfarthing-dist/guides/tandem-protocol.md +3 -3
  155. package/pennyfarthing-dist/guides/workflow-schema.md +1 -1
  156. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  157. package/pennyfarthing-dist/guides/xml-tags.md +8 -8
  158. package/pennyfarthing-dist/scripts/README.md +4 -4
  159. package/pennyfarthing-dist/scripts/core/agent-session.sh +2 -5
  160. package/pennyfarthing-dist/scripts/core/check-context.sh +3 -1
  161. package/pennyfarthing-dist/scripts/core/pf.sh +5 -0
  162. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +4 -89
  163. package/pennyfarthing-dist/scripts/core/prime.sh +2 -25
  164. package/pennyfarthing-dist/scripts/git/README.md +14 -14
  165. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +2 -3
  166. package/pennyfarthing-dist/scripts/git/git-status-all.sh +2 -3
  167. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +2 -3
  168. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +2 -4
  169. package/pennyfarthing-dist/scripts/hooks/README.md +6 -6
  170. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +4 -183
  171. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +4 -95
  172. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +4 -65
  173. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -31
  174. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +5 -4
  175. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +29 -34
  176. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +4 -71
  177. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -19
  178. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +4 -30
  179. package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -32
  180. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +4 -65
  181. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +4 -78
  182. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +3 -93
  183. package/pennyfarthing-dist/scripts/lib/env.sh +34 -0
  184. package/pennyfarthing-dist/scripts/lib/run-pf.sh +39 -0
  185. package/pennyfarthing-dist/scripts/misc/README.md +1 -1
  186. package/pennyfarthing-dist/scripts/misc/statusline.sh +4 -301
  187. package/pennyfarthing-dist/scripts/sprint/README.md +21 -21
  188. package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
  189. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +2 -16
  190. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +3 -3
  191. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +3 -3
  192. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +3 -3
  193. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +3 -3
  194. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +3 -3
  195. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +3 -3
  196. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +3 -3
  197. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +3 -3
  198. package/pennyfarthing-dist/skills/pf-bc/examples.md +23 -23
  199. package/pennyfarthing-dist/skills/pf-bc/skill.md +17 -17
  200. package/pennyfarthing-dist/skills/pf-bc/usage.md +8 -8
  201. package/pennyfarthing-dist/skills/pf-jira/SKILL.md +15 -15
  202. package/pennyfarthing-dist/skills/pf-jira/examples.md +48 -48
  203. package/pennyfarthing-dist/skills/pf-jira/usage.md +15 -15
  204. package/pennyfarthing-dist/skills/pf-sprint/examples.md +80 -80
  205. package/pennyfarthing-dist/skills/pf-sprint/skill.md +35 -35
  206. package/pennyfarthing-dist/skills/pf-sprint/usage.md +30 -30
  207. package/pennyfarthing-dist/skills/pf-theme/examples.md +15 -15
  208. package/pennyfarthing-dist/skills/pf-theme/skill.md +6 -6
  209. package/pennyfarthing-dist/skills/pf-theme/usage.md +5 -5
  210. package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -27
  211. package/pennyfarthing-dist/skills/pf-workflow/skill.md +11 -11
  212. package/pennyfarthing-dist/skills/pf-workflow/usage.md +11 -11
  213. package/pennyfarthing-dist/skills/skill-registry.yaml +19 -19
  214. package/pennyfarthing-dist/templates/settings.local.json.template +19 -10
  215. package/pennyfarthing-dist/workflows/bdd-team.yaml +89 -0
  216. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +1 -1
  217. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
  218. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
  219. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  220. package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +47 -0
  221. package/pennyfarthing-dist/workflows/tdd-team.yaml +80 -0
  222. package/pennyfarthing-dist/workflows/tdd.yaml +11 -2
  223. package/pennyfarthing_scripts/CLAUDE.md +19 -10
  224. package/pennyfarthing_scripts/__init__.py +1 -1
  225. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  226. package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  228. package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
  229. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  231. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  233. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  234. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  235. package/pennyfarthing_scripts/bc/__pycache__/split.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/bc/cli.py +2 -2
  237. package/pennyfarthing_scripts/bellmode_hook.py +9 -296
  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__/context_meter_footer.cpython-314.pyc +0 -0
  243. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  244. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  245. package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  247. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/bikerack/audit_log_panel.py +161 -0
  256. package/pennyfarthing_scripts/bikerack/base_panel.py +27 -4
  257. package/pennyfarthing_scripts/bikerack/changed_panel.py +96 -4
  258. package/pennyfarthing_scripts/bikerack/context_meter_footer.py +88 -0
  259. package/pennyfarthing_scripts/bikerack/debug_panel.py +1 -1
  260. package/pennyfarthing_scripts/bikerack/diffs_panel.py +30 -0
  261. package/pennyfarthing_scripts/bikerack/events.py +28 -0
  262. package/pennyfarthing_scripts/bikerack/launcher.py +6 -6
  263. package/pennyfarthing_scripts/bikerack/portrait_resolver.py +139 -0
  264. package/pennyfarthing_scripts/bikerack/progress_panel.py +0 -1
  265. package/pennyfarthing_scripts/bikerack/sprint_panel.py +373 -142
  266. package/pennyfarthing_scripts/bikerack/story_detail_data.py +247 -0
  267. package/pennyfarthing_scripts/bikerack/story_detail_screen.py +177 -0
  268. package/pennyfarthing_scripts/bikerack/tui.py +304 -62
  269. package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
  270. package/pennyfarthing_scripts/cli.py +5 -0
  271. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  272. package/pennyfarthing_scripts/common/config.py +29 -2
  273. package/pennyfarthing_scripts/common/pr_config.py +38 -0
  274. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/consultation/cli.py +3 -3
  277. package/pennyfarthing_scripts/context.py +3 -3
  278. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  282. package/pennyfarthing_scripts/git/hooks_installer.py +2 -3
  283. package/pennyfarthing_scripts/git/status_all.py +1 -1
  284. package/pennyfarthing_scripts/git/worktree.py +2 -2
  285. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  286. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  287. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  288. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  289. package/pennyfarthing_scripts/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  291. package/pennyfarthing_scripts/handoff/cli.py +33 -1
  292. package/pennyfarthing_scripts/handoff/complete_phase.py +28 -0
  293. package/pennyfarthing_scripts/handoff/marker.py +15 -15
  294. package/pennyfarthing_scripts/handoff/phase_check.py +96 -0
  295. package/pennyfarthing_scripts/handoff/resolve_gate.py +13 -1
  296. package/pennyfarthing_scripts/hooks/__init__.py +442 -0
  297. package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  298. package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  299. package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  302. package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  303. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  304. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  305. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  306. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  307. package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  309. package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/hooks/bell_mode.py +214 -0
  311. package/pennyfarthing_scripts/hooks/cli.py +96 -0
  312. package/pennyfarthing_scripts/hooks/context_breaker.py +104 -0
  313. package/pennyfarthing_scripts/hooks/context_warning.py +66 -0
  314. package/pennyfarthing_scripts/hooks/cyclist_pretooluse.py +129 -0
  315. package/pennyfarthing_scripts/hooks/pre_edit_check.py +77 -0
  316. package/pennyfarthing_scripts/hooks/reflector_check.py +270 -0
  317. package/pennyfarthing_scripts/hooks/schema_validation.py +202 -0
  318. package/pennyfarthing_scripts/hooks/session_start.py +294 -0
  319. package/pennyfarthing_scripts/hooks/session_stop.py +111 -0
  320. package/pennyfarthing_scripts/hooks/sprint_yaml_validation.py +97 -0
  321. package/pennyfarthing_scripts/hooks/statusline.py +429 -0
  322. package/pennyfarthing_scripts/hooks.py +27 -432
  323. package/pennyfarthing_scripts/pretooluse_hook.py +3 -185
  324. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  325. package/pennyfarthing_scripts/prime/heatmap.py +3 -15
  326. package/pennyfarthing_scripts/prime/workflow.py +2 -1
  327. package/pennyfarthing_scripts/schema_validation_hook.py +3 -298
  328. package/pennyfarthing_scripts/session_start_hook.py +4 -186
  329. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  330. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  331. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  332. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  333. package/pennyfarthing_scripts/sprint/cli.py +121 -0
  334. package/pennyfarthing_scripts/sprint/loader.py +154 -3
  335. package/pennyfarthing_scripts/sprint/story_update.py +26 -0
  336. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  337. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  338. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314-pytest-9.0.2.pyc +0 -0
  339. package/pennyfarthing_scripts/tests/test_bikerack.py +26 -26
  340. package/pennyfarthing_scripts/tests/test_dialogue_manager.py +0 -1
  341. package/pennyfarthing_scripts/tests/test_sprint_panel.py +344 -265
  342. package/pennyfarthing_scripts/tests/test_workflow_list_team.py +147 -0
  343. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  344. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  345. package/pennyfarthing_scripts/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
  346. package/pennyfarthing_scripts/validate/adapters/__pycache__/team_mode.cpython-314.pyc +0 -0
  347. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  348. package/pennyfarthing_scripts/validate/adapters/team_mode.py +323 -0
  349. package/pennyfarthing_scripts/validate/adapters/workflow.py +19 -0
  350. package/pennyfarthing_scripts/welcome_hook.py +3 -149
  351. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  352. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  353. package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  354. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  355. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
  356. package/pennyfarthing_scripts/workflow/__pycache__/team_lifecycle.cpython-314.pyc +0 -0
  357. package/pennyfarthing_scripts/workflow/cli.py +22 -20
  358. package/pennyfarthing_scripts/workflow/state.py +0 -1
  359. package/pennyfarthing_scripts/workflow/team_lifecycle.py +256 -0
  360. package/packages/core/dist/cli/cyclist-migration.test.d.ts +0 -16
  361. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +0 -1
  362. package/packages/core/dist/cli/cyclist-migration.test.js +0 -229
  363. package/packages/core/dist/cli/cyclist-migration.test.js.map +0 -1
  364. package/packages/core/dist/scripts/theme-detail.test.d.ts +0 -10
  365. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +0 -1
  366. package/packages/core/dist/scripts/theme-detail.test.js +0 -199
  367. package/packages/core/dist/scripts/theme-detail.test.js.map +0 -1
@@ -1,301 +1,4 @@
1
- #!/usr/bin/env zsh
2
- # Claude Code statusline - fixed-width segments
3
- # Format: [ROLE] Theme | repo | branch | model [progress] pct%
4
-
5
- input=$(cat)
6
-
7
- # Validate JSON
8
- if ! echo "$input" | jq -e . >/dev/null 2>&1; then
9
- echo "⚠ invalid input"
10
- exit 0
11
- fi
12
-
13
- # Extract fields - use cwd for display only, PROJECT_ROOT for file lookups
14
- cwd=$(echo "$input" | jq -r '.workspace.current_dir // empty' 2>/dev/null)
15
- dir_name=$(basename "$cwd" 2>/dev/null || echo "?")
16
- PROJECT_ROOT="${CLAUDE_PROJECT_DIR:-$cwd}"
17
- session_id=$(echo "$input" | jq -r '.session_id // empty' 2>/dev/null)
18
-
19
- # Model name - clean up
20
- model=$(echo "$input" | jq -r '
21
- if .model | type == "object" then .model.id // .model.name // "claude"
22
- elif .model | type == "string" then .model
23
- else "claude"
24
- end
25
- ' 2>/dev/null)
26
- [ -z "$model" ] || [ "$model" = "null" ] && model="claude"
27
- model=$(echo "$model" | sed 's/claude-//' | sed 's/-[0-9]*$//' | cut -c1-10)
28
-
29
- # Git branch
30
- branch=""
31
- branch_dirty=""
32
- if git -C "$cwd" rev-parse --git-dir > /dev/null 2>&1; then
33
- branch=$(git -C "$cwd" branch --show-current 2>/dev/null)
34
- [ -z "$branch" ] && branch=$(git -C "$cwd" rev-parse --short HEAD 2>/dev/null)
35
-
36
- # Check if dirty using diff-index (doesn't lock the index like status does)
37
- # This avoids "index.lock: File exists" errors when multiple Claude sessions
38
- # run concurrent statusline updates during git operations
39
- if ! git -C "$cwd" diff-index --quiet HEAD -- 2>/dev/null || \
40
- [ -n "$(git -C "$cwd" ls-files --others --exclude-standard 2>/dev/null | head -1)" ]; then
41
- branch_dirty="*"
42
- fi
43
- fi
44
-
45
- # Context percentage
46
- pct="--"
47
- usage=$(echo "$input" | jq '.context_window.current_usage // empty' 2>/dev/null)
48
- if [ -n "$usage" ] && [ "$usage" != "null" ]; then
49
- current=$(echo "$usage" | jq '.input_tokens + .cache_creation_input_tokens + .cache_read_input_tokens' 2>/dev/null)
50
- size=$(echo "$input" | jq '.context_window.context_window_size // 0' 2>/dev/null)
51
- if [ -n "$current" ] && [ "$current" != "null" ] && [ -n "$size" ] && [ "$size" != "null" ] && [ "$size" -gt 0 ] 2>/dev/null; then
52
- pct=$((current * 100 / size))
53
- fi
54
- fi
55
-
56
- # Agent abbreviation map
57
- get_agent_abbrev() {
58
- case "$1" in
59
- pm) echo "PM" ;;
60
- sm) echo "SM" ;;
61
- dev) echo "DEV" ;;
62
- tea) echo "TEA" ;;
63
- reviewer) echo "REV" ;;
64
- architect) echo "ARC" ;;
65
- devops) echo "OPS" ;;
66
- ux-designer) echo "UX" ;;
67
- tech-writer) echo "DOC" ;;
68
- orchestrator) echo "ORC" ;;
69
- ba) echo "BA" ;;
70
- *) echo "???" ;;
71
- esac
72
- }
73
-
74
- # Agent and theme from session
75
- agent_name=""
76
- agent_abbrev=""
77
- theme_display=""
78
-
79
- # Try session_id match first, then fall back to most recent agent file
80
- if [ -n "$session_id" ] && [ -f "$PROJECT_ROOT/.session/agents/${session_id}" ]; then
81
- # Exact session match (ideal case)
82
- agent_name=$(cat "$PROJECT_ROOT/.session/agents/${session_id}")
83
- agent_abbrev=$(get_agent_abbrev "$agent_name")
84
- elif [ -d "$PROJECT_ROOT/.session/agents" ]; then
85
- # Fallback: use most recently modified agent file
86
- # This handles the session_id mismatch between hooks
87
- latest_file=$(ls -t "$PROJECT_ROOT/.session/agents/" 2>/dev/null | head -1)
88
- if [ -n "$latest_file" ] && [ -f "$PROJECT_ROOT/.session/agents/$latest_file" ]; then
89
- agent_name=$(cat "$PROJECT_ROOT/.session/agents/$latest_file")
90
- agent_abbrev=$(get_agent_abbrev "$agent_name")
91
- fi
92
- fi
93
-
94
- # Get character name from theme file (single source of truth)
95
- # Priority: .pennyfarthing/config.local.yaml > .pennyfarthing/persona-config.yaml
96
- config_file=""
97
- if [ -f "$PROJECT_ROOT/.pennyfarthing/config.local.yaml" ]; then
98
- config_file="$PROJECT_ROOT/.pennyfarthing/config.local.yaml"
99
- elif [ -f "$PROJECT_ROOT/.pennyfarthing/persona-config.yaml" ]; then
100
- config_file="$PROJECT_ROOT/.pennyfarthing/persona-config.yaml"
101
- fi
102
-
103
- character_display=""
104
- if [ -n "$config_file" ] && [ -n "$agent_name" ]; then
105
- # Get theme name from config
106
- theme=$(yq '.theme' "$config_file" 2>/dev/null)
107
-
108
- if [ -n "$theme" ] && [ "$theme" != "null" ]; then
109
- # Read character directly from theme file (matches agent-session.sh behavior)
110
- theme_file="$PROJECT_ROOT/.pennyfarthing/personas/themes/${theme}.yaml"
111
- if [ -f "$theme_file" ]; then
112
- full_name=$(yq ".agents.${agent_name}.character" "$theme_file" 2>/dev/null)
113
-
114
- if [ -n "$full_name" ] && [ "$full_name" != "null" ]; then
115
- # Smart character name extraction:
116
- # 1. Remove parenthetical content: "Breq (Justice of Toren)" → "Breq"
117
- # 2. Strip common titles: "Captain Kirk" → "Kirk"
118
- # 3. If single word remains, use it; otherwise take last word
119
- clean_name=$(echo "$full_name" | sed 's/ *([^)]*)//g' | xargs)
120
- clean_name=$(echo "$clean_name" | sed -E 's/^(Captain|Lieutenant|Dr\.|Doc|Mr\.|Mrs\.|Ms\.|Admiral|Commander|Chief|Ensign|Translator|Agent|Colonel|Major|Sergeant|Professor|Lord|Lady|Sir|The) +//i')
121
- word_count=$(echo "$clean_name" | wc -w | tr -d ' ')
122
- if [ "$word_count" -eq 1 ]; then
123
- character_display="$clean_name"
124
- else
125
- character_display=$(echo "$clean_name" | awk '{print $NF}')
126
- fi
127
- fi
128
- fi
129
-
130
- # Fallback to theme name if no character found
131
- if [ -z "$character_display" ]; then
132
- character_display="$(echo "${theme:0:1}" | tr '[:lower:]' '[:upper:]')${theme:1}"
133
- fi
134
- fi
135
- fi
136
- theme_display="$character_display"
137
-
138
- # Tandem indicator: detect active backseat agent from observation files
139
- # Files: .session/{storyId}-tandem-{partner}.md (created by backseat spawn, cleaned on finish)
140
- tandem_partner=""
141
- tandem_partner_display=""
142
- if [ -d "$PROJECT_ROOT/.session" ]; then
143
- tandem_file=$(find "$PROJECT_ROOT/.session" -maxdepth 1 -name "*-tandem-*.md" -print 2>/dev/null | head -1)
144
- if [ -n "$tandem_file" ]; then
145
- # Extract partner name from filename: {storyId}-tandem-{partner}.md
146
- tandem_partner=$(basename "$tandem_file" | sed -n 's/.*-tandem-\([a-zA-Z_-]*\)\.md$/\1/p')
147
- if [ -n "$tandem_partner" ] && [ -n "$theme_file" ] && [ -f "$theme_file" ]; then
148
- # Look up partner's character name from theme
149
- partner_full=$(yq ".agents.${tandem_partner}.character" "$theme_file" 2>/dev/null)
150
- if [ -n "$partner_full" ] && [ "$partner_full" != "null" ]; then
151
- partner_clean=$(echo "$partner_full" | sed 's/ *([^)]*)//g' | xargs)
152
- partner_clean=$(echo "$partner_clean" | sed -E 's/^(Captain|Lieutenant|Dr\.|Doc|Mr\.|Mrs\.|Ms\.|Admiral|Commander|Chief|Ensign|Translator|Agent|Colonel|Major|Sergeant|Professor|Lord|Lady|Sir|The) +//i')
153
- partner_wc=$(echo "$partner_clean" | wc -w | tr -d ' ')
154
- if [ "$partner_wc" -eq 1 ]; then
155
- tandem_partner_display="$partner_clean"
156
- else
157
- tandem_partner_display=$(echo "$partner_clean" | awk '{print $NF}')
158
- fi
159
- fi
160
- # Fallback to agent abbreviation if no theme character
161
- if [ -z "$tandem_partner_display" ]; then
162
- tandem_partner_display=$(get_agent_abbrev "$tandem_partner")
163
- fi
164
- elif [ -n "$tandem_partner" ]; then
165
- # No theme file — use abbreviation
166
- tandem_partner_display=$(get_agent_abbrev "$tandem_partner")
167
- fi
168
- fi
169
- fi
170
-
171
- # ANSI colors
172
- RESET=$'\033[0m'
173
- DIM=$'\033[2m'
174
- BOLD=$'\033[1m'
175
- REVERSE=$'\033[7m'
176
- FG_CYAN=$'\033[36m'
177
- FG_GREEN=$'\033[32m'
178
- FG_YELLOW=$'\033[33m'
179
- FG_RED=$'\033[31m'
180
- FG_MAGENTA=$'\033[35m'
181
- FG_BLUE=$'\033[34m'
182
- FG_WHITE=$'\033[97m'
183
- FG_GRAY=$'\033[38;5;245m'
184
- FG_ORANGE=$'\033[38;5;208m'
185
- FG_PINK=$'\033[38;5;213m'
186
- FG_TEAL=$'\033[38;5;43m'
187
- FG_PURPLE=$'\033[38;5;141m'
188
- FG_LIME=$'\033[38;5;154m'
189
-
190
- # Agent color map
191
- get_agent_color() {
192
- case "$1" in
193
- pm) echo "${FG_PURPLE}${BOLD}" ;; # Purple - strategic
194
- sm) echo "${FG_BLUE}${BOLD}" ;; # Blue - coordination
195
- dev) echo "${FG_GREEN}${BOLD}" ;; # Green - building
196
- tea) echo "${FG_TEAL}${BOLD}" ;; # Teal - testing
197
- reviewer) echo "${FG_RED}${BOLD}" ;; # Red - critical eye
198
- architect) echo "${FG_ORANGE}${BOLD}" ;; # Orange - design
199
- devops) echo "${FG_CYAN}${BOLD}" ;; # Cyan - infrastructure
200
- ux-designer) echo "${FG_PINK}${BOLD}" ;; # Pink - design
201
- tech-writer) echo "${FG_WHITE}${BOLD}" ;; # White - documentation
202
- orchestrator) echo "${FG_MAGENTA}${BOLD}" ;;# Magenta - coordination
203
- ba) echo "${FG_LIME}${BOLD}" ;; # Lime - discovery
204
- *) echo "${FG_MAGENTA}${BOLD}" ;; # Default
205
- esac
206
- }
207
-
208
- # Build progress bar (10 segments)
209
- bar_width=10
210
- if [ "$pct" != "--" ]; then
211
- filled=$((pct * bar_width / 100))
212
- [ "$filled" -gt "$bar_width" ] && filled=$bar_width
213
- [ "$filled" -lt 0 ] && filled=0
214
-
215
- # Color based on level
216
- if [ "$pct" -gt 95 ]; then
217
- bar_color="${FG_RED}${BOLD}"
218
- elif [ "$pct" -gt 85 ]; then
219
- bar_color="${FG_RED}"
220
- elif [ "$pct" -gt 70 ]; then
221
- bar_color="${FG_YELLOW}"
222
- else
223
- bar_color="${FG_GREEN}"
224
- fi
225
-
226
- # Build bar: filled portion with ▓, empty with ░
227
- bar_filled=""
228
- bar_empty=""
229
- for ((i=0; i<filled; i++)); do bar_filled+="▓"; done
230
- for ((i=filled; i<bar_width; i++)); do bar_empty+="░"; done
231
-
232
- progress_bar="${bar_color}${bar_filled}${RESET}${DIM}${bar_empty}${RESET}"
233
- pct_display="${bar_color}${pct}%${RESET}"
234
- else
235
- progress_bar="${DIM}░░░░░░░░░░${RESET}"
236
- pct_display="${FG_GRAY}--%${RESET}"
237
- fi
238
-
239
- # Branch color (yellow if dirty, green if clean)
240
- if [ -n "$branch_dirty" ]; then
241
- branch_color="${FG_YELLOW}"
242
- else
243
- branch_color="${FG_GREEN}"
244
- fi
245
-
246
- # Fixed-width formatting using printf
247
- # Agent+Theme: ~20 chars, Repo: 14 chars, Branch: 12 chars, Model: 10 chars
248
- repo_fmt=$(printf "%-14s" "$dir_name")
249
- branch_fmt=$(printf "%-12s" "${branch}${branch_dirty}")
250
- model_fmt=$(printf "%-10s" "$model")
251
-
252
- # Build tandem suffix: "+ Partner" when backseat agent is active
253
- tandem_suffix=""
254
- tandem_suffix_len=0
255
- if [ -n "$tandem_partner_display" ]; then
256
- partner_color=$(get_agent_color "$tandem_partner")
257
- tandem_suffix=" ${DIM}+${RESET} ${partner_color}${tandem_partner_display}${RESET}"
258
- tandem_suffix_len=$((3 + ${#tandem_partner_display})) # " + " + name
259
- fi
260
-
261
- # Build agent display: [ROLE] Theme (+ Partner) (role in reverse text with color)
262
- if [ -n "$agent_abbrev" ]; then
263
- agent_color=$(get_agent_color "$agent_name")
264
- # Role in reverse text with color, then theme
265
- if [ -n "$theme_display" ]; then
266
- agent_section="${agent_color}${REVERSE} ${agent_abbrev} ${RESET} ${DIM}${theme_display}${RESET}${tandem_suffix}"
267
- # Pad to ~20 chars visual width (abbrev ~3 + spaces ~2 + theme ~10 + tandem = ~15+, pad to 20)
268
- pad_len=$((18 - ${#agent_abbrev} - ${#theme_display} - tandem_suffix_len))
269
- [ "$pad_len" -lt 0 ] && pad_len=0
270
- padding=$(printf "%${pad_len}s" "")
271
- agent_section="${agent_section}${padding}"
272
- else
273
- agent_section="${agent_color}${REVERSE} ${agent_abbrev} ${RESET}${tandem_suffix}"
274
- pad_len=$((17 - ${#agent_abbrev} - tandem_suffix_len))
275
- [ "$pad_len" -lt 0 ] && pad_len=0
276
- padding=$(printf "%${pad_len}s" "")
277
- agent_section="${agent_section}${padding}"
278
- fi
279
- else
280
- # No agent - just show theme if available
281
- if [ -n "$theme_display" ]; then
282
- agent_section="${DIM}${theme_display}${RESET}${tandem_suffix}"
283
- pad_len=$((20 - ${#theme_display} - tandem_suffix_len))
284
- [ "$pad_len" -lt 0 ] && pad_len=0
285
- padding=$(printf "%${pad_len}s" "")
286
- agent_section="${agent_section}${padding}"
287
- else
288
- agent_section=$(printf "%-20s" "")
289
- fi
290
- fi
291
-
292
- # Build output: [ROLE] Theme | repo | branch | model [progress] pct%
293
- echo -n "${agent_section}"
294
- echo -n "${DIM}│${RESET} "
295
- echo -n "${FG_CYAN}${repo_fmt}${RESET}"
296
- echo -n "${DIM}│${RESET} "
297
- echo -n "${branch_color}${branch_fmt}${RESET}"
298
- echo -n "${DIM}│${RESET} "
299
- echo -n "${FG_GRAY}${model_fmt}${RESET}"
300
- echo -n "${progress_bar} "
301
- echo -n "${pct_display}"
1
+ #!/usr/bin/env bash
2
+ # Shim: delegates to Python CLI via uv run — no global pf install needed.
3
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
4
+ exec_pf hooks statusline
@@ -1,35 +1,35 @@
1
1
  # Sprint Scripts
2
2
 
3
- Sprint management is handled by the Python CLI: `pf sprint [COMMAND]`.
3
+ Sprint management is handled by the Python CLI: `pf.sh sprint [COMMAND]`.
4
4
 
5
5
  ## Commands
6
6
 
7
7
  | Command | Purpose |
8
8
  |---------|---------|
9
- | `pf sprint status` | Show current sprint status and metrics |
10
- | `pf sprint backlog` | List available stories grouped by epic |
11
- | `pf sprint info` | Sprint info as JSON (for Cyclist sidebar) |
12
- | `pf sprint metrics` | Sprint velocity and progress metrics |
13
- | `pf sprint check <id>` | Check story/epic availability (JSON) |
14
- | `pf sprint future` | Show future initiatives and epics |
15
- | `pf sprint new` | Initialize a new sprint |
16
- | `pf sprint validate <file>` | Validate sprint YAML structure |
17
- | `pf sprint archive <id>` | Archive a completed story |
18
- | `pf sprint work <id>` | Start work on a story |
19
- | `pf sprint story field <id> <field>` | Get a story field value |
20
- | `pf sprint epic field <id> <field>` | Get an epic field value |
21
- | `pf sprint epic promote <id>` | Move epic from future to current sprint |
22
- | `pf sprint epic show <id>` | Show epic details |
23
- | `pf sprint epic cancel <id>` | Cancel an epic |
24
- | `pf sprint epic archive` | Archive completed epics |
9
+ | `pf.sh sprint status` | Show current sprint status and metrics |
10
+ | `pf.sh sprint backlog` | List available stories grouped by epic |
11
+ | `pf.sh sprint info` | Sprint info as JSON (for Cyclist sidebar) |
12
+ | `pf.sh sprint metrics` | Sprint velocity and progress metrics |
13
+ | `pf.sh sprint check <id>` | Check story/epic availability (JSON) |
14
+ | `pf.sh sprint future` | Show future initiatives and epics |
15
+ | `pf.sh sprint new` | Initialize a new sprint |
16
+ | `pf.sh sprint validate <file>` | Validate sprint YAML structure |
17
+ | `pf.sh sprint archive <id>` | Archive a completed story |
18
+ | `pf.sh sprint work <id>` | Start work on a story |
19
+ | `pf.sh sprint story field <id> <field>` | Get a story field value |
20
+ | `pf.sh sprint epic field <id> <field>` | Get an epic field value |
21
+ | `pf.sh sprint epic promote <id>` | Move epic from future to current sprint |
22
+ | `pf.sh sprint epic show <id>` | Show epic details |
23
+ | `pf.sh sprint epic cancel <id>` | Cancel an epic |
24
+ | `pf.sh sprint epic archive` | Archive completed epics |
25
25
 
26
26
  ## Usage
27
27
 
28
28
  ```bash
29
- pf sprint status
30
- pf sprint backlog
31
- pf sprint future epic-55
32
- pf sprint epic promote epic-41
29
+ pf.sh sprint status
30
+ pf.sh sprint backlog
31
+ pf.sh sprint future epic-55
32
+ pf.sh sprint epic promote epic-41
33
33
  ```
34
34
 
35
35
  ## Ownership
@@ -6,7 +6,7 @@ Scripts for workflow mechanics, phase transitions, and quality gates.
6
6
 
7
7
  | Script | Purpose |
8
8
  |--------|---------|
9
- | `finish-story.sh` | **DEPRECATED** — forwards to `pf sprint story finish` |
9
+ | `finish-story.sh` | **DEPRECATED** — forwards to `pf.sh sprint story finish` |
10
10
  | `fix-session-phase.sh` | Repair session file phase state |
11
11
  | `check.sh` | Quality gates runner (lint, type check, tests) |
12
12
  | `list-workflows.sh` | List available workflows |
@@ -18,7 +18,7 @@ Scripts for workflow mechanics, phase transitions, and quality gates.
18
18
  ## Usage
19
19
 
20
20
  ```bash
21
- pf sprint story finish MSSCI-12345
21
+ pf.sh sprint story finish MSSCI-12345
22
22
  .pennyfarthing/scripts/workflow/start-workflow.sh prd --mode create
23
23
  ```
24
24
 
@@ -1,20 +1,6 @@
1
1
  #!/bin/bash
2
2
  # DEPRECATED: Use `pf sprint story finish` instead.
3
- #
4
- # This shell script had a bug where yq paths targeted .epics[].stories[]
5
- # but the sprint YAML uses sharded epic files with .stories[] at root.
6
- # The Python implementation (pennyfarthing_scripts.sprint.story_finish)
7
- # correctly handles sharded YAML via read_sprint/write_sprint.
8
- #
9
- # Usage: finish-story.sh <story-id> [--dry-run]
10
-
11
3
  set -euo pipefail
12
-
13
4
  echo "DEPRECATED: finish-story.sh is deprecated. Forwarding to 'pf sprint story finish'." >&2
14
-
15
- ARGS=()
16
- for arg in "$@"; do
17
- ARGS+=("$arg")
18
- done
19
-
20
- exec pf sprint story finish "${ARGS[@]}"
5
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
6
+ exec_pf sprint story finish "$@"
@@ -1,5 +1,5 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf workflow fix-phase` instead.
3
- # This shim forwards to the Python CLI for backward compatibility.
4
3
  echo "Warning: fix-session-phase.sh is deprecated. Use: pf workflow fix-phase $*" >&2
5
- exec pf workflow fix-phase "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf workflow fix-phase "$@"
@@ -1,5 +1,5 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf workflow type` instead.
3
- # This shim forwards to the Python CLI for backward compatibility.
4
3
  echo "Warning: get-workflow-type.sh is deprecated. Use: pf workflow type $*" >&2
5
- exec pf workflow type "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf workflow type "$@"
@@ -1,5 +1,5 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf workflow list` instead.
3
- # This shim forwards to the Python CLI for backward compatibility.
4
3
  echo "Warning: list-workflows.sh is deprecated. Use: pf workflow list" >&2
5
- exec pf workflow list "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf workflow list "$@"
@@ -1,5 +1,5 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf workflow phase-check` instead.
3
- # This shim forwards to the Python CLI for backward compatibility.
4
3
  echo "Warning: phase-owner.sh is deprecated. Use: pf workflow phase-check $*" >&2
5
- exec pf workflow phase-check "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf workflow phase-check "$@"
@@ -1,5 +1,5 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf workflow resume` instead.
3
- # This shim forwards to the Python CLI for backward compatibility.
4
3
  echo "Warning: resume-workflow.sh is deprecated. Use: pf workflow resume $*" >&2
5
- exec pf workflow resume "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf workflow resume "$@"
@@ -1,5 +1,5 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf workflow show` instead.
3
- # This shim forwards to the Python CLI for backward compatibility.
4
3
  echo "Warning: show-workflow.sh is deprecated. Use: pf workflow show $*" >&2
5
- exec pf workflow show "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf workflow show "$@"
@@ -1,5 +1,5 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf workflow start` instead.
3
- # This shim forwards to the Python CLI for backward compatibility.
4
3
  echo "Warning: start-workflow.sh is deprecated. Use: pf workflow start $*" >&2
5
- exec pf workflow start "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf workflow start "$@"
@@ -1,5 +1,5 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
  # DEPRECATED: Use `pf workflow status` instead.
3
- # This shim forwards to the Python CLI for backward compatibility.
4
3
  echo "Warning: workflow-status.sh is deprecated. Use: pf workflow status $*" >&2
5
- exec pf workflow status "$@"
4
+ source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../lib/run-pf.sh"
5
+ exec_pf workflow status "$@"
@@ -4,80 +4,80 @@
4
4
 
5
5
  ```bash
6
6
  # Focus on Sprint panel
7
- pf bc sprint
7
+ pf.sh bc sprint
8
8
 
9
9
  # Focus on Diffs panel
10
- pf bc diffs
10
+ pf.sh bc diffs
11
11
 
12
12
  # Focus on Acceptance Criteria
13
- pf bc ac
13
+ pf.sh bc ac
14
14
 
15
15
  # Focus on Git panel
16
- pf bc git
16
+ pf.sh bc git
17
17
 
18
18
  # Preview without changing
19
- pf bc sprint --dry-run
19
+ pf.sh bc sprint --dry-run
20
20
  ```
21
21
 
22
22
  ## Clearing Focus
23
23
 
24
24
  ```bash
25
25
  # Remove focus setting
26
- pf bc reset
26
+ pf.sh bc reset
27
27
 
28
28
  # Preview
29
- pf bc reset --dry-run
29
+ pf.sh bc reset --dry-run
30
30
  ```
31
31
 
32
32
  ## Named Layouts
33
33
 
34
34
  ```bash
35
35
  # Save current layout as "normal"
36
- pf bc save normal
36
+ pf.sh bc save normal
37
37
 
38
38
  # Save current layout as "review"
39
- pf bc save review
39
+ pf.sh bc save review
40
40
 
41
41
  # Save current layout as "debug"
42
- pf bc save debug
42
+ pf.sh bc save debug
43
43
 
44
44
  # List all saved layouts
45
- pf bc list
45
+ pf.sh bc list
46
46
 
47
47
  # Switch to review layout
48
- pf bc load review
48
+ pf.sh bc load review
49
49
 
50
50
  # Switch back to normal
51
- pf bc load normal
51
+ pf.sh bc load normal
52
52
 
53
53
  # Delete a specific layout
54
- pf bc clear review
54
+ pf.sh bc clear review
55
55
 
56
56
  # Delete all layouts
57
- pf bc clear-all
57
+ pf.sh bc clear-all
58
58
  ```
59
59
 
60
60
  ## Common Workflows
61
61
 
62
62
  ### During code review
63
63
  ```bash
64
- pf bc save normal # Save current layout first
65
- pf bc diffs # Focus on diffs
64
+ pf.sh bc save normal # Save current layout first
65
+ pf.sh bc diffs # Focus on diffs
66
66
  # ... do review ...
67
- pf bc load normal # Restore normal layout
67
+ pf.sh bc load normal # Restore normal layout
68
68
  ```
69
69
 
70
70
  ### Debugging session
71
71
  ```bash
72
- pf bc save normal
73
- pf bc debug # Focus debug panel
72
+ pf.sh bc save normal
73
+ pf.sh bc debug # Focus debug panel
74
74
  # ... debug ...
75
- pf bc reset # Clear focus
75
+ pf.sh bc reset # Clear focus
76
76
  ```
77
77
 
78
78
  ### Sprint planning
79
79
  ```bash
80
- pf bc sprint # Focus sprint panel
80
+ pf.sh bc sprint # Focus sprint panel
81
81
  # ... review backlog ...
82
- pf bc reset
82
+ pf.sh bc reset
83
83
  ```
@@ -16,28 +16,28 @@ Set or clear the focused panel in Cyclist/BikeRack. Save and restore named layou
16
16
 
17
17
  | Command | CLI | Purpose |
18
18
  |---------|-----|---------|
19
- | `/bc sprint` | `pf bc sprint [--dry-run]` | Focus Sprint panel |
20
- | `/bc git` | `pf bc git [--dry-run]` | Focus Git panel |
21
- | `/bc diffs` | `pf bc diffs [--dry-run]` | Focus Diffs panel |
22
- | `/bc todo` | `pf bc todo [--dry-run]` | Focus Todo panel |
23
- | `/bc workflow` | `pf bc workflow [--dry-run]` | Focus Workflow panel |
24
- | `/bc background` | `pf bc background [--dry-run]` | Focus Background panel |
25
- | `/bc audit-log` | `pf bc audit-log [--dry-run]` | Focus Audit Log panel |
26
- | `/bc changed` | `pf bc changed [--dry-run]` | Focus Changed panel |
27
- | `/bc ac` | `pf bc ac [--dry-run]` | Focus Acceptance Criteria panel |
28
- | `/bc debug` | `pf bc debug [--dry-run]` | Focus Debug panel |
29
- | `/bc settings` | `pf bc settings [--dry-run]` | Focus Settings panel |
30
- | `/bc reset` | `pf bc reset [--dry-run]` | Clear focus setting |
19
+ | `/bc sprint` | `pf.sh bc sprint [--dry-run]` | Focus Sprint panel |
20
+ | `/bc git` | `pf.sh bc git [--dry-run]` | Focus Git panel |
21
+ | `/bc diffs` | `pf.sh bc diffs [--dry-run]` | Focus Diffs panel |
22
+ | `/bc todo` | `pf.sh bc todo [--dry-run]` | Focus Todo panel |
23
+ | `/bc workflow` | `pf.sh bc workflow [--dry-run]` | Focus Workflow panel |
24
+ | `/bc background` | `pf.sh bc background [--dry-run]` | Focus Background panel |
25
+ | `/bc audit-log` | `pf.sh bc audit-log [--dry-run]` | Focus Audit Log panel |
26
+ | `/bc changed` | `pf.sh bc changed [--dry-run]` | Focus Changed panel |
27
+ | `/bc ac` | `pf.sh bc ac [--dry-run]` | Focus Acceptance Criteria panel |
28
+ | `/bc debug` | `pf.sh bc debug [--dry-run]` | Focus Debug panel |
29
+ | `/bc settings` | `pf.sh bc settings [--dry-run]` | Focus Settings panel |
30
+ | `/bc reset` | `pf.sh bc reset [--dry-run]` | Clear focus setting |
31
31
 
32
32
  ### Named Layouts
33
33
 
34
34
  | Command | CLI | Purpose |
35
35
  |---------|-----|---------|
36
- | `/bc save <name>` | `pf bc save <name> [--dry-run]` | Save current layout from running server |
37
- | `/bc load <name>` | `pf bc load <name> [--dry-run]` | Load a saved layout |
38
- | `/bc list` | `pf bc list` | List all saved layouts |
39
- | `/bc clear <name>` | `pf bc clear <name> [--dry-run]` | Delete a saved layout |
40
- | `/bc clear-all` | `pf bc clear-all [--dry-run]` | Delete all saved layouts |
36
+ | `/bc save <name>` | `pf.sh bc save <name> [--dry-run]` | Save current layout from running server |
37
+ | `/bc load <name>` | `pf.sh bc load <name> [--dry-run]` | Load a saved layout |
38
+ | `/bc list` | `pf.sh bc list` | List all saved layouts |
39
+ | `/bc clear <name>` | `pf.sh bc clear <name> [--dry-run]` | Delete a saved layout |
40
+ | `/bc clear-all` | `pf.sh bc clear-all [--dry-run]` | Delete all saved layouts |
41
41
 
42
42
  ### Notes
43
43