@pennyfarthing/core 11.2.1 → 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 (467) hide show
  1. package/README.md +100 -40
  2. package/package.json +1 -1
  3. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  4. package/packages/core/dist/cli/commands/doctor.js +121 -28
  5. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  6. package/packages/core/dist/cli/utils/settings.d.ts +0 -4
  7. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  8. package/packages/core/dist/cli/utils/settings.js +31 -26
  9. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  10. package/packages/core/dist/consultation/dialogue-manager.d.ts +1 -1
  11. package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -1
  12. package/packages/core/dist/consultation/dialogue-manager.js +1 -1
  13. package/packages/core/dist/consultation/dialogue-manager.js.map +1 -1
  14. package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -1
  15. package/packages/core/dist/consultation/tandem-metrics.test.js.map +1 -1
  16. package/packages/core/dist/public/css/react.css +1 -1
  17. package/packages/core/dist/public/js/react/react.js +9 -9
  18. package/packages/core/dist/server/api/git.d.ts.map +1 -1
  19. package/packages/core/dist/server/api/git.js +0 -1
  20. package/packages/core/dist/server/api/git.js.map +1 -1
  21. package/packages/core/dist/server/api/index.d.ts +2 -0
  22. package/packages/core/dist/server/api/index.d.ts.map +1 -1
  23. package/packages/core/dist/server/api/index.js +2 -0
  24. package/packages/core/dist/server/api/index.js.map +1 -1
  25. package/packages/core/dist/server/api/project-info.d.ts +11 -0
  26. package/packages/core/dist/server/api/project-info.d.ts.map +1 -0
  27. package/packages/core/dist/server/api/project-info.js +18 -0
  28. package/packages/core/dist/server/api/project-info.js.map +1 -0
  29. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  30. package/packages/core/dist/server/otlp-receiver.js +18 -1
  31. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  32. package/packages/core/dist/server/otlp-receiver.test.js +1 -1
  33. package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
  34. package/packages/core/dist/server/server.d.ts.map +1 -1
  35. package/packages/core/dist/server/server.js +3 -2
  36. package/packages/core/dist/server/server.js.map +1 -1
  37. package/packages/core/dist/server/server.test.d.ts +1 -1
  38. package/packages/core/dist/server/server.test.js +8 -8
  39. package/packages/core/dist/server/settings.d.ts +1 -0
  40. package/packages/core/dist/server/settings.d.ts.map +1 -1
  41. package/packages/core/dist/server/settings.js +13 -0
  42. package/packages/core/dist/server/settings.js.map +1 -1
  43. package/packages/core/dist/workflow/team-lifecycle.d.ts +169 -0
  44. package/packages/core/dist/workflow/team-lifecycle.d.ts.map +1 -0
  45. package/packages/core/dist/workflow/team-lifecycle.js +217 -0
  46. package/packages/core/dist/workflow/team-lifecycle.js.map +1 -0
  47. package/packages/core/dist/workflow/team-lifecycle.test.d.ts +20 -0
  48. package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +1 -0
  49. package/packages/core/dist/workflow/team-lifecycle.test.js +966 -0
  50. package/packages/core/dist/workflow/team-lifecycle.test.js.map +1 -0
  51. package/packages/core/dist/workflow/workflow-team-templates.test.d.ts +17 -0
  52. package/packages/core/dist/workflow/workflow-team-templates.test.d.ts.map +1 -0
  53. package/packages/core/dist/workflow/workflow-team-templates.test.js +275 -0
  54. package/packages/core/dist/workflow/workflow-team-templates.test.js.map +1 -0
  55. package/pennyfarthing-dist/agents/dev.md +15 -2
  56. package/pennyfarthing-dist/agents/reviewer.md +17 -4
  57. package/pennyfarthing-dist/agents/sm-finish.md +1 -1
  58. package/pennyfarthing-dist/agents/sm-setup.md +7 -7
  59. package/pennyfarthing-dist/agents/sm.md +12 -12
  60. package/pennyfarthing-dist/agents/tea.md +2 -2
  61. package/pennyfarthing-dist/agents/testing-runner.md +1 -1
  62. package/pennyfarthing-dist/commands/pf-architect.md +1 -1
  63. package/pennyfarthing-dist/commands/pf-ba.md +1 -1
  64. package/pennyfarthing-dist/commands/pf-chore.md +2 -2
  65. package/pennyfarthing-dist/commands/pf-dev.md +1 -1
  66. package/pennyfarthing-dist/commands/pf-devops.md +1 -1
  67. package/pennyfarthing-dist/commands/pf-epic.md +6 -6
  68. package/pennyfarthing-dist/commands/pf-git.md +10 -10
  69. package/pennyfarthing-dist/commands/pf-health-check.md +1 -1
  70. package/pennyfarthing-dist/commands/pf-help.md +12 -12
  71. package/pennyfarthing-dist/commands/pf-orchestrator.md +1 -1
  72. package/pennyfarthing-dist/commands/pf-pm.md +1 -1
  73. package/pennyfarthing-dist/commands/pf-prime.md +8 -8
  74. package/pennyfarthing-dist/commands/pf-reviewer.md +1 -1
  75. package/pennyfarthing-dist/commands/pf-session.md +7 -7
  76. package/pennyfarthing-dist/commands/pf-sm.md +1 -1
  77. package/pennyfarthing-dist/commands/pf-sprint.md +7 -7
  78. package/pennyfarthing-dist/commands/pf-tea.md +1 -1
  79. package/pennyfarthing-dist/commands/pf-tech-writer.md +1 -1
  80. package/pennyfarthing-dist/commands/pf-theme.md +9 -9
  81. package/pennyfarthing-dist/commands/pf-ux-designer.md +1 -1
  82. package/pennyfarthing-dist/commands/pf-work.md +1 -1
  83. package/pennyfarthing-dist/guides/agent-behavior.md +70 -19
  84. package/pennyfarthing-dist/guides/agent-coordination.md +10 -10
  85. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
  86. package/pennyfarthing-dist/guides/agent-template-tactical.md +1 -1
  87. package/pennyfarthing-dist/guides/bell-mode.md +1 -1
  88. package/pennyfarthing-dist/guides/bikerack.md +10 -10
  89. package/pennyfarthing-dist/guides/brownfield-tools.md +24 -24
  90. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +1 -1
  91. package/pennyfarthing-dist/guides/gate-schema.md +2 -2
  92. package/pennyfarthing-dist/guides/gates.md +3 -3
  93. package/pennyfarthing-dist/guides/handoff-cli.md +8 -8
  94. package/pennyfarthing-dist/guides/hooks.md +27 -27
  95. package/pennyfarthing-dist/guides/prime.md +2 -2
  96. package/pennyfarthing-dist/guides/reflector.md +1 -1
  97. package/pennyfarthing-dist/guides/skill-schema.md +6 -6
  98. package/pennyfarthing-dist/guides/tandem-protocol.md +3 -3
  99. package/pennyfarthing-dist/guides/workflow-schema.md +1 -1
  100. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  101. package/pennyfarthing-dist/guides/xml-tags.md +8 -8
  102. package/pennyfarthing-dist/scripts/README.md +4 -4
  103. package/pennyfarthing-dist/scripts/core/agent-session.sh +2 -5
  104. package/pennyfarthing-dist/scripts/core/check-context.sh +1 -1
  105. package/pennyfarthing-dist/scripts/core/pf.sh +5 -0
  106. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +2 -5
  107. package/pennyfarthing-dist/scripts/core/prime.sh +2 -25
  108. package/pennyfarthing-dist/scripts/git/README.md +14 -14
  109. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +2 -3
  110. package/pennyfarthing-dist/scripts/git/git-status-all.sh +2 -3
  111. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +2 -3
  112. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +2 -4
  113. package/pennyfarthing-dist/scripts/hooks/README.md +6 -6
  114. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +3 -3
  115. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +3 -3
  116. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +3 -3
  117. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -3
  118. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +5 -4
  119. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +2 -1
  120. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +3 -3
  121. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -3
  122. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +3 -3
  123. package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -3
  124. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +3 -3
  125. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +3 -3
  126. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +3 -4
  127. package/pennyfarthing-dist/scripts/lib/env.sh +34 -0
  128. package/pennyfarthing-dist/scripts/lib/run-pf.sh +39 -0
  129. package/pennyfarthing-dist/scripts/misc/README.md +1 -1
  130. package/pennyfarthing-dist/scripts/misc/statusline.sh +3 -3
  131. package/pennyfarthing-dist/scripts/sprint/README.md +21 -21
  132. package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
  133. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +2 -16
  134. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +3 -3
  135. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +3 -3
  136. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +3 -3
  137. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +3 -3
  138. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +3 -3
  139. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +3 -3
  140. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +3 -3
  141. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +3 -3
  142. package/pennyfarthing-dist/skills/pf-bc/examples.md +23 -23
  143. package/pennyfarthing-dist/skills/pf-bc/skill.md +17 -17
  144. package/pennyfarthing-dist/skills/pf-bc/usage.md +8 -8
  145. package/pennyfarthing-dist/skills/pf-jira/SKILL.md +15 -15
  146. package/pennyfarthing-dist/skills/pf-jira/examples.md +48 -48
  147. package/pennyfarthing-dist/skills/pf-jira/usage.md +15 -15
  148. package/pennyfarthing-dist/skills/pf-sprint/examples.md +80 -80
  149. package/pennyfarthing-dist/skills/pf-sprint/skill.md +35 -35
  150. package/pennyfarthing-dist/skills/pf-sprint/usage.md +30 -30
  151. package/pennyfarthing-dist/skills/pf-theme/examples.md +15 -15
  152. package/pennyfarthing-dist/skills/pf-theme/skill.md +6 -6
  153. package/pennyfarthing-dist/skills/pf-theme/usage.md +5 -5
  154. package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -27
  155. package/pennyfarthing-dist/skills/pf-workflow/skill.md +11 -11
  156. package/pennyfarthing-dist/skills/pf-workflow/usage.md +11 -11
  157. package/pennyfarthing-dist/skills/skill-registry.yaml +19 -19
  158. package/pennyfarthing-dist/templates/settings.local.json.template +11 -11
  159. package/pennyfarthing-dist/workflows/bdd-team.yaml +89 -0
  160. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +1 -1
  161. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
  162. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
  163. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  164. package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +47 -0
  165. package/pennyfarthing-dist/workflows/tdd-team.yaml +80 -0
  166. package/pennyfarthing_scripts/__init__.py +1 -1
  167. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  168. package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  169. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  170. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  171. package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
  172. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  173. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  174. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  175. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  176. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  177. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  178. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  179. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  180. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  181. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  182. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  183. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  184. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  185. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  186. package/pennyfarthing_scripts/bc/__pycache__/split.cpython-314.pyc +0 -0
  187. package/pennyfarthing_scripts/bc/cli.py +2 -2
  188. package/pennyfarthing_scripts/bellmode_hook.py +2 -5
  189. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  190. package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  191. package/pennyfarthing_scripts/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
  192. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  193. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  194. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  195. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  196. package/pennyfarthing_scripts/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
  197. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  198. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  200. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  201. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  202. package/pennyfarthing_scripts/bikerack/__pycache__/portrait.cpython-314.pyc +0 -0
  203. package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  204. package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  205. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  206. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  207. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  208. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  209. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  210. package/pennyfarthing_scripts/bikerack/audit_log_panel.py +48 -6
  211. package/pennyfarthing_scripts/bikerack/launcher.py +6 -6
  212. package/pennyfarthing_scripts/bikerack/progress_panel.py +0 -1
  213. package/pennyfarthing_scripts/bikerack/sprint_panel.py +1 -1
  214. package/pennyfarthing_scripts/bikerack/story_detail_data.py +4 -1
  215. package/pennyfarthing_scripts/bikerack/story_detail_screen.py +2 -1
  216. package/pennyfarthing_scripts/bikerack/tui.py +12 -2
  217. package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
  218. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  219. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  220. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  221. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  222. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  223. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  224. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  225. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  226. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  228. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  229. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  231. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/common/config.py +29 -2
  233. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  234. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  235. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  237. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  238. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  239. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  240. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  241. package/pennyfarthing_scripts/consultation/cli.py +3 -3
  242. package/pennyfarthing_scripts/context.py +3 -3
  243. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  244. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  245. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  247. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  256. package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-314.pyc +0 -0
  257. package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
  259. package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
  260. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  261. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  262. package/pennyfarthing_scripts/git/__pycache__/hooks_installer.cpython-314.pyc +0 -0
  263. package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
  264. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  265. package/pennyfarthing_scripts/git/__pycache__/worktree.cpython-314.pyc +0 -0
  266. package/pennyfarthing_scripts/git/hooks_installer.py +2 -3
  267. package/pennyfarthing_scripts/git/status_all.py +1 -1
  268. package/pennyfarthing_scripts/git/worktree.py +2 -2
  269. package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  270. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  271. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  272. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  273. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  274. package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  277. package/pennyfarthing_scripts/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  278. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  282. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  283. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  284. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  285. package/pennyfarthing_scripts/hooks/__init__.py +8 -3
  286. package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  287. package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  288. package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  289. package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  291. package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  292. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  293. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  294. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  295. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  296. package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  297. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  298. package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  299. package/pennyfarthing_scripts/hooks/bell_mode.py +0 -1
  300. package/pennyfarthing_scripts/hooks/pre_edit_check.py +0 -1
  301. package/pennyfarthing_scripts/hooks/reflector_check.py +1 -2
  302. package/pennyfarthing_scripts/hooks/schema_validation.py +0 -1
  303. package/pennyfarthing_scripts/hooks/session_start.py +6 -8
  304. package/pennyfarthing_scripts/hooks/statusline.py +10 -1
  305. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  306. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  307. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  309. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  311. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  313. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  314. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  315. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  316. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  317. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  318. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  319. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  320. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  321. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  322. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  323. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  324. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
  325. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  326. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  327. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  328. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  329. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  330. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  331. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  332. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  333. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  334. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  335. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  336. package/pennyfarthing_scripts/prime/__pycache__/heatmap.cpython-314.pyc +0 -0
  337. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  338. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  339. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  340. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  341. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  342. package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  343. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  344. package/pennyfarthing_scripts/prime/heatmap.py +3 -15
  345. package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
  346. package/pennyfarthing_scripts/session/__pycache__/cli.cpython-314.pyc +0 -0
  347. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  348. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  349. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  350. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  351. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  352. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  353. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  354. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  355. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  356. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  357. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  358. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  359. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  360. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  361. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  362. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  363. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  364. package/pennyfarthing_scripts/sprint/cli.py +121 -0
  365. package/pennyfarthing_scripts/sprint/loader.py +154 -3
  366. package/pennyfarthing_scripts/sprint/story_update.py +7 -0
  367. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  368. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  369. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  370. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  371. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  372. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  373. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  374. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  375. package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
  376. package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  377. package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  378. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  379. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  380. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  381. package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  382. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  383. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  384. package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  385. package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
  386. package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
  387. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  388. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  389. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  390. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  391. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  392. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  393. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  394. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  395. package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
  396. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  397. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  398. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  399. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  400. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  401. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  402. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  403. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  404. package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  405. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  406. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  407. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  408. package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  409. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  410. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314-pytest-9.0.2.pyc +0 -0
  411. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  412. package/pennyfarthing_scripts/tests/test_bikerack.py +26 -26
  413. package/pennyfarthing_scripts/tests/test_dialogue_manager.py +0 -1
  414. package/pennyfarthing_scripts/tests/test_workflow_list_team.py +147 -0
  415. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  416. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  417. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  418. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  419. package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  420. package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  421. package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  422. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  423. package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  424. package/pennyfarthing_scripts/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
  425. package/pennyfarthing_scripts/validate/adapters/__pycache__/team_mode.cpython-314.pyc +0 -0
  426. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  427. package/pennyfarthing_scripts/validate/adapters/team_mode.py +323 -0
  428. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  429. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  430. package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  431. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  432. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
  433. package/pennyfarthing_scripts/workflow/__pycache__/team_lifecycle.cpython-314.pyc +0 -0
  434. package/pennyfarthing_scripts/workflow/cli.py +15 -14
  435. package/pennyfarthing_scripts/workflow/state.py +0 -1
  436. package/pennyfarthing_scripts/workflow/team_lifecycle.py +3 -4
  437. package/packages/core/dist/cli/cyclist-migration.test.d.ts +0 -16
  438. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +0 -1
  439. package/packages/core/dist/cli/cyclist-migration.test.js +0 -229
  440. package/packages/core/dist/cli/cyclist-migration.test.js.map +0 -1
  441. package/packages/core/dist/scripts/benchmark-integration.d.ts +0 -182
  442. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +0 -1
  443. package/packages/core/dist/scripts/benchmark-integration.js +0 -691
  444. package/packages/core/dist/scripts/benchmark-integration.js.map +0 -1
  445. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +0 -150
  446. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
  447. package/packages/core/dist/scripts/job-fair-aggregator.js +0 -547
  448. package/packages/core/dist/scripts/job-fair-aggregator.js.map +0 -1
  449. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +0 -1
  450. package/packages/core/dist/scripts/theme-detail.test.js.map +0 -1
  451. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  452. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  453. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  454. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  455. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  456. package/pennyfarthing_scripts/consultation/__pycache__/dialogue_manager.cpython-314.pyc +0 -0
  457. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  458. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  459. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  460. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  461. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  462. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  463. package/pennyfarthing_scripts/tests/__pycache__/test_108_1_gate_migration.cpython-314-pytest-9.0.2.pyc +0 -0
  464. package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
  465. package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
  466. package/pennyfarthing_scripts/tests/__pycache__/test_dialogue_manager.cpython-314-pytest-9.0.2.pyc +0 -0
  467. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
@@ -32,7 +32,6 @@ from pennyfarthing_scripts.hooks import (
32
32
  send_to_cyclist,
33
33
  )
34
34
 
35
-
36
35
  # =============================================================================
37
36
  # Bell Queue
38
37
  # =============================================================================
@@ -15,7 +15,6 @@ import os
15
15
  import sys
16
16
  from pathlib import Path
17
17
 
18
-
19
18
  # Protected patterns — files that should never be edited automatically
20
19
  PROTECTED_PATTERNS = [
21
20
  "*.env",
@@ -17,7 +17,6 @@ import sys
17
17
  from pathlib import Path
18
18
  from typing import Any
19
19
 
20
-
21
20
  # =============================================================================
22
21
  # Import detection logic — inline to avoid import path issues
23
22
  # The logic lives in question_reflector_check.py in pennyfarthing-dist/scripts/hooks/
@@ -214,7 +213,7 @@ def main() -> None:
214
213
  sys.exit(0)
215
214
 
216
215
  project_dir = os.environ.get('CLAUDE_PROJECT_DIR', os.getcwd())
217
- config = _load_config(project_dir)
216
+ _load_config(project_dir)
218
217
 
219
218
  # Prevent infinite loops
220
219
  if input_data.get('stop_hook_active'):
@@ -18,7 +18,6 @@ from pennyfarthing_scripts.hooks import (
18
18
  read_stdin_json,
19
19
  )
20
20
 
21
-
22
21
  # =============================================================================
23
22
  # File Type Detection
24
23
  # =============================================================================
@@ -21,13 +21,11 @@ from datetime import UTC, datetime
21
21
  from pathlib import Path
22
22
 
23
23
  from pennyfarthing_scripts.hooks import (
24
- find_project_root,
25
24
  is_cyclist_running,
26
25
  load_settings,
27
26
  send_to_cyclist,
28
27
  )
29
28
 
30
-
31
29
  # =============================================================================
32
30
  # Session Setup
33
31
  # =============================================================================
@@ -138,7 +136,7 @@ def _ensure_wheelhub(project_dir: Path) -> int | None:
138
136
  )
139
137
 
140
138
  # Skip if full Cyclist is running
141
- cyclist_port_file = project_dir / ".wheelhub-port"
139
+ cyclist_port_file = project_dir / ".bikerack-port"
142
140
  if cyclist_port_file.exists():
143
141
  try:
144
142
  return int(cyclist_port_file.read_text().strip())
@@ -177,11 +175,11 @@ def _write_env_file(project_dir: Path, session_id: str, otel_port: int | None) -
177
175
  ]
178
176
 
179
177
  if otel_port is not None:
180
- lines.extend([
181
- "# OTEL auto-configuration for Cyclist/WheelHub",
182
- 'export OTEL_EXPORTER_OTLP_PROTOCOL="http/json"',
183
- f'export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:{otel_port}"',
184
- ])
178
+ from pennyfarthing_scripts.bikerack.launcher import build_otel_env
179
+
180
+ lines.append("# OTEL auto-configuration for Cyclist/WheelHub")
181
+ for key, value in build_otel_env(otel_port).items():
182
+ lines.append(f'export {key}="{value}"')
185
183
 
186
184
  with open(env_file, "a") as f:
187
185
  f.write("\n".join(lines) + "\n")
@@ -16,6 +16,8 @@ import subprocess
16
16
  import sys
17
17
  from pathlib import Path
18
18
 
19
+ from pennyfarthing_scripts.hooks import load_settings
20
+
19
21
  try:
20
22
  import yaml
21
23
  HAS_YAML = True
@@ -349,7 +351,14 @@ def main() -> None:
349
351
  session_id = data.get("session_id", "")
350
352
 
351
353
  model = _get_model_name(data)
352
- branch, branch_dirty = _get_git_info(cwd) if cwd else ("", "")
354
+
355
+ # Check git_monitor setting — skip git calls when disabled
356
+ _settings = load_settings(Path(project_root) if project_root else None)
357
+ if cwd and _settings.git_monitor:
358
+ branch, branch_dirty = _get_git_info(cwd)
359
+ else:
360
+ branch, branch_dirty = "", ""
361
+
353
362
  pct = _get_context_pct(data)
354
363
 
355
364
  agent_name = _resolve_agent(project_root, session_id)
@@ -14,13 +14,10 @@ Usage:
14
14
  from __future__ import annotations
15
15
 
16
16
  import json
17
- import math
18
17
  import re
19
18
  import subprocess
20
19
  import sys
21
20
  from dataclasses import dataclass, field
22
- from pathlib import Path
23
-
24
21
 
25
22
  # ── Section Categories ──────────────────────────────────────────────
26
23
 
@@ -204,7 +201,6 @@ def parse_sections(raw_output: str) -> list[Section]:
204
201
  current_section_lines: list[str] = []
205
202
  in_agent_def = False
206
203
  in_behavior_guide = False
207
- in_sidecar = False
208
204
 
209
205
  def _flush_section(end_line: int) -> None:
210
206
  """Emit the current section."""
@@ -245,42 +241,36 @@ def parse_sections(raw_output: str) -> list[Section]:
245
241
  current_section_name = "Workflow State"
246
242
  in_agent_def = False
247
243
  in_behavior_guide = False
248
- in_sidecar = False
249
244
  elif header_text.startswith("Agent Definition"):
250
245
  current_component = "agent_definition"
251
246
  current_section_category = "identity"
252
247
  current_section_name = "Agent Definition"
253
248
  in_agent_def = True
254
249
  in_behavior_guide = False
255
- in_sidecar = False
256
250
  elif header_text.startswith("Persona:"):
257
251
  current_component = "persona"
258
252
  current_section_category = "persona"
259
253
  current_section_name = header_text
260
254
  in_agent_def = False
261
255
  in_behavior_guide = False
262
- in_sidecar = False
263
256
  elif header_text.startswith("Agent Behavior Guide"):
264
257
  current_component = "behavior_guide"
265
258
  current_section_category = "shared"
266
259
  current_section_name = "BG: Preamble"
267
260
  in_agent_def = False
268
261
  in_behavior_guide = True
269
- in_sidecar = False
270
262
  elif header_text.startswith("Sprint Context"):
271
263
  current_component = "sprint_context"
272
264
  current_section_category = "shared"
273
265
  current_section_name = "Sprint Context"
274
266
  in_agent_def = False
275
267
  in_behavior_guide = False
276
- in_sidecar = False
277
268
  elif header_text.startswith("Repos Topology"):
278
269
  current_component = "repos_topology"
279
270
  current_section_category = "shared"
280
271
  current_section_name = "Repos Topology"
281
272
  in_agent_def = False
282
273
  in_behavior_guide = False
283
- in_sidecar = False
284
274
  elif header_text.startswith("Agent Sidecar:"):
285
275
  current_component = "sidecars"
286
276
  current_section_category = "learned"
@@ -288,14 +278,12 @@ def parse_sections(raw_output: str) -> list[Section]:
288
278
  current_section_name = f"Sidecar: {sidecar_file.replace('.md', '').title()}"
289
279
  in_agent_def = False
290
280
  in_behavior_guide = False
291
- in_sidecar = True
292
281
  elif header_text.startswith("Active Session:"):
293
282
  current_component = "session"
294
283
  current_section_category = "routing"
295
284
  current_section_name = "Active Session"
296
285
  in_agent_def = False
297
286
  in_behavior_guide = False
298
- in_sidecar = False
299
287
 
300
288
  current_section_start = i
301
289
  current_section_lines = [line]
@@ -347,7 +335,7 @@ def _pretty_tag(tag: str) -> str:
347
335
  def capture_agent_output(agent_name: str) -> str:
348
336
  """Run pf agent start and capture raw output."""
349
337
  result = subprocess.run(
350
- ["pf", "agent", "start", agent_name],
338
+ [sys.executable, "-m", "pennyfarthing_scripts.cli", "agent", "start", agent_name],
351
339
  capture_output=True,
352
340
  text=True,
353
341
  timeout=30,
@@ -484,10 +472,10 @@ def render_summary(heatmaps: list[AgentHeatmap]) -> str:
484
472
  comp_labels = ["Route", "Ident", "Guard", "Proced", "Refer", "Perso", "Shared", "Learn"]
485
473
 
486
474
  # Find max per category across all agents
487
- cat_maxes: dict[str, int] = {c: 0 for c in components}
475
+ cat_maxes: dict[str, int] = dict.fromkeys(components, 0)
488
476
  agent_cats: dict[str, dict[str, int]] = {}
489
477
  for hm in heatmaps:
490
- agent_cats[hm.agent] = {c: 0 for c in components}
478
+ agent_cats[hm.agent] = dict.fromkeys(components, 0)
491
479
  for s in hm.sections:
492
480
  agent_cats[hm.agent][s.category] = agent_cats[hm.agent].get(s.category, 0) + s.tokens
493
481
  for c in components:
@@ -7,6 +7,9 @@ Usage:
7
7
  Commands:
8
8
  status Show sprint status
9
9
  backlog Show available stories
10
+ use Switch active sprint (multi-sprint projects)
11
+ list Show registered sprints from sprint/sprints.yaml
12
+ active Show which sprint is currently active
10
13
  work Start work on a story
11
14
  archive Archive a completed story
12
15
  story Story subcommands (show, add, update, size, template, finish, claim)
@@ -25,6 +28,9 @@ def sprint():
25
28
  Commands:
26
29
  status - Show sprint status
27
30
  backlog - Show available stories
31
+ use - Switch active sprint (multi-sprint projects)
32
+ list - Show registered sprints
33
+ active - Show which sprint is active
28
34
  story - Story operations (show, add, update, size, template, finish, claim)
29
35
  epic - Epic operations (show, add, promote, archive, cancel, import, remove)
30
36
  initiative - Initiative operations (show, cancel)
@@ -118,6 +124,121 @@ def backlog():
118
124
  click.echo(f"**Total available:** {total_count} stories, {total_points} points")
119
125
 
120
126
 
127
+ @sprint.command("use")
128
+ @click.argument("name")
129
+ def sprint_use(name: str):
130
+ """Switch the active sprint (per-user preference).
131
+
132
+ \b
133
+ Validates the sprint name against sprint/sprints.yaml, then saves
134
+ the preference to .pennyfarthing/config.local.yaml. Does not modify
135
+ any shared repo files. Use "default" to clear the preference.
136
+
137
+ \b
138
+ Arguments:
139
+ NAME - Sprint name from the registry, or "default" to clear
140
+
141
+ \b
142
+ Examples:
143
+ pf sprint use main # Switch to main project sprint
144
+ pf sprint use ocsf-rs1 # Switch to OCSF research spike
145
+ pf sprint use default # Clear preference, use sprint/current-sprint.yaml
146
+ """
147
+ # Lazy import
148
+ from pennyfarthing_scripts.sprint.loader import switch_sprint
149
+
150
+ result = switch_sprint(name)
151
+ if result["success"]:
152
+ entry = result.get("sprint", {})
153
+ click.echo(result["message"])
154
+ if entry.get("description"):
155
+ click.echo(f" {entry['description']}")
156
+ if entry.get("type"):
157
+ click.echo(f" Type: {entry['type']}")
158
+ if entry.get("repos"):
159
+ click.echo(f" Repos: {', '.join(entry['repos'])}")
160
+ else:
161
+ raise click.ClickException(result["error"])
162
+
163
+
164
+ @sprint.command("list")
165
+ def sprint_list():
166
+ """Show all registered sprints from the sprint registry.
167
+
168
+ \b
169
+ Reads sprint/sprints.yaml and displays each registered sprint
170
+ with its type, description, and whether it is currently active
171
+ for this user (based on .pennyfarthing/config.local.yaml).
172
+ """
173
+ # Lazy import
174
+ from pennyfarthing_scripts.sprint.loader import get_active_sprint_name, load_sprint_registry
175
+
176
+ registry = load_sprint_registry()
177
+ if registry is None:
178
+ click.echo("No sprint registry found (sprint/sprints.yaml)")
179
+ click.echo("This project uses a single sprint.")
180
+ return
181
+
182
+ active = get_active_sprint_name()
183
+ sprints = registry.get("sprints", {})
184
+
185
+ if not sprints:
186
+ click.echo("Sprint registry is empty.")
187
+ return
188
+
189
+ click.echo("Registered Sprints:")
190
+ click.echo("")
191
+
192
+ for name, entry in sprints.items():
193
+ marker = "*" if name == active else " "
194
+ desc = entry.get("description", "")
195
+ sprint_type = entry.get("type", "project")
196
+ repos = ", ".join(entry.get("repos", []))
197
+ click.echo(f" {marker} {name:<16} [{sprint_type}] {desc}")
198
+ if repos:
199
+ click.echo(f" Repos: {repos}")
200
+
201
+ click.echo("")
202
+ if active:
203
+ click.echo(f"Active: {active} (per-user preference)")
204
+ else:
205
+ click.echo("Active: default (sprint/current-sprint.yaml)")
206
+ click.echo("Switch: pf sprint use <name>")
207
+
208
+
209
+ @sprint.command("active")
210
+ def sprint_active():
211
+ """Show which sprint is currently active for this user.
212
+
213
+ \b
214
+ Reads the per-user preference from .pennyfarthing/config.local.yaml
215
+ and displays the active sprint name and metadata. If no preference
216
+ is set, reports the default sprint/current-sprint.yaml.
217
+ """
218
+ # Lazy import
219
+ from pennyfarthing_scripts.sprint.loader import get_active_sprint_name, load_sprint_registry
220
+
221
+ active = get_active_sprint_name()
222
+ if not active:
223
+ click.echo("default (sprint/current-sprint.yaml)")
224
+ click.echo(" No per-user sprint preference set.")
225
+ click.echo(" Set one with: pf sprint use <name>")
226
+ return
227
+
228
+ registry = load_sprint_registry()
229
+ if registry:
230
+ sprints = registry.get("sprints", {})
231
+ entry = sprints.get(active, {})
232
+ sprint_type = entry.get("type", "project")
233
+ desc = entry.get("description", "")
234
+ click.echo(f"{active} ({sprint_type})")
235
+ if desc:
236
+ click.echo(f" {desc}")
237
+ else:
238
+ click.echo(f"{active}")
239
+ click.echo(" (no sprint registry found to look up metadata)")
240
+
241
+
121
242
  @sprint.command()
122
243
  @click.argument("story_id", required=False)
123
244
  @click.option("--dry-run", is_flag=True, help="Show what would be done without making changes")