@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
@@ -0,0 +1,96 @@
1
+ """
2
+ Hook CLI group — internal hooks called by Claude Code settings.
3
+
4
+ All hooks read JSON from stdin (Claude Code protocol) and output
5
+ JSON/text to stdout. Exit codes: 0=allow, 2=block (PreToolUse).
6
+
7
+ Usage in settings.local.json:
8
+ "command": "pf hooks session-start"
9
+ "command": "pf hooks bell-mode"
10
+ "command": "pf hooks statusline"
11
+ """
12
+
13
+ import click
14
+
15
+
16
+ @click.group(hidden=True)
17
+ def hooks():
18
+ """Internal hooks (called by Claude Code settings)."""
19
+ pass
20
+
21
+
22
+ @hooks.command("session-start")
23
+ def session_start():
24
+ """SessionStart hook — session setup, WheelHub auto-start, OTEL config."""
25
+ from pennyfarthing_scripts.hooks.session_start import main
26
+ main()
27
+
28
+
29
+ @hooks.command("session-stop")
30
+ def session_stop():
31
+ """Stop hook — save checkpoint for cross-session continuity."""
32
+ from pennyfarthing_scripts.hooks.session_stop import main
33
+ main()
34
+
35
+
36
+ @hooks.command("reflector-check")
37
+ def reflector_check():
38
+ """Stop hook — enforce CYCLIST reflector markers on every turn."""
39
+ from pennyfarthing_scripts.hooks.reflector_check import main
40
+ main()
41
+
42
+
43
+ @hooks.command("pre-edit-check")
44
+ def pre_edit_check():
45
+ """PreToolUse hook — block edits to protected files."""
46
+ from pennyfarthing_scripts.hooks.pre_edit_check import main
47
+ main()
48
+
49
+
50
+ @hooks.command("context-warning")
51
+ def context_warning():
52
+ """PreToolUse hook — warn when context usage is high."""
53
+ from pennyfarthing_scripts.hooks.context_warning import main
54
+ main()
55
+
56
+
57
+ @hooks.command("context-breaker")
58
+ def context_breaker():
59
+ """PreToolUse hook — block tool execution at critical context usage."""
60
+ from pennyfarthing_scripts.hooks.context_breaker import main
61
+ main()
62
+
63
+
64
+ @hooks.command("cyclist-pretooluse")
65
+ def cyclist_pretooluse():
66
+ """PreToolUse hook — route approval through WheelHub when Cyclist is running."""
67
+ from pennyfarthing_scripts.hooks.cyclist_pretooluse import main
68
+ main()
69
+
70
+
71
+ @hooks.command("schema-validation")
72
+ def schema_validation():
73
+ """PreToolUse hook — validate XML schema on Write operations."""
74
+ from pennyfarthing_scripts.hooks.schema_validation import main
75
+ main()
76
+
77
+
78
+ @hooks.command("bell-mode")
79
+ def bell_mode():
80
+ """PostToolUse hook — bell queue + tandem observation injection."""
81
+ from pennyfarthing_scripts.hooks.bell_mode import main
82
+ main()
83
+
84
+
85
+ @hooks.command("sprint-yaml")
86
+ def sprint_yaml():
87
+ """PostToolUse hook — validate sprint YAML after Edit/Write."""
88
+ from pennyfarthing_scripts.hooks.sprint_yaml_validation import main
89
+ main()
90
+
91
+
92
+ @hooks.command("statusline")
93
+ def statusline():
94
+ """statusLine hook — render Claude Code status bar."""
95
+ from pennyfarthing_scripts.hooks.statusline import main
96
+ main()
@@ -0,0 +1,104 @@
1
+ """
2
+ Context circuit breaker hook (PreToolUse) — block tool execution at critical usage.
3
+
4
+ When context exceeds the critical threshold (default 80%), blocks tool execution
5
+ with exit code 2 and saves the active agent to a checkpoint for /continue-session.
6
+
7
+ Unlike context_warning.py which only warns, this is a hard stop.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import json
13
+ import os
14
+ import sys
15
+ from datetime import UTC, datetime
16
+ from pathlib import Path
17
+
18
+ from pennyfarthing_scripts.context import check_context, load_config
19
+
20
+
21
+ def _checkpoint_save(project_dir: str, label: str, data: str) -> None:
22
+ """Save a checkpoint entry (reimplements checkpoint.sh logic in Python)."""
23
+ try:
24
+ checkpoint_file = Path(project_dir) / ".session" / "checkpoints.log"
25
+ checkpoint_file.parent.mkdir(parents=True, exist_ok=True)
26
+ timestamp = datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%SZ")
27
+ with open(checkpoint_file, "a") as f:
28
+ f.write(f"{timestamp}|{label}|{data}\n")
29
+ except OSError:
30
+ pass
31
+
32
+
33
+ def main() -> None:
34
+ """Main entry point for context circuit breaker hook."""
35
+ try:
36
+ # Read stdin to get session_id
37
+ raw_input = sys.stdin.read()
38
+ input_data = {}
39
+ try:
40
+ input_data = json.loads(raw_input)
41
+ except (json.JSONDecodeError, ValueError):
42
+ pass
43
+
44
+ project_dir = os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
45
+ config = load_config(project_dir)
46
+
47
+ result = check_context(project_dir=project_dir)
48
+
49
+ if result.error:
50
+ sys.exit(0)
51
+
52
+ critical_threshold = config.critical_threshold
53
+ pct = result.usable_percent
54
+
55
+ if pct >= critical_threshold:
56
+ # Auto-save active agent to checkpoint
57
+ session_id = input_data.get("session_id", "")
58
+ active_agent = ""
59
+
60
+ if session_id:
61
+ agent_file = Path(project_dir) / ".session" / "agents" / session_id
62
+ if agent_file.is_file():
63
+ try:
64
+ active_agent = agent_file.read_text().strip()
65
+ except OSError:
66
+ pass
67
+
68
+ if active_agent:
69
+ _checkpoint_save(project_dir, "circuit_breaker_agent", active_agent)
70
+
71
+ # Send error to stderr (Claude sees this)
72
+ msg = f"""CONTEXT CIRCUIT BREAKER TRIGGERED
73
+
74
+ Context usage: {pct}% - CRITICAL (threshold: {critical_threshold}%)
75
+
76
+ Tool execution BLOCKED. You must stop and hand off."""
77
+
78
+ if active_agent:
79
+ msg += f"""
80
+
81
+ Active agent saved: {active_agent}
82
+ The agent will be restored with FULL context when you run /continue-session."""
83
+
84
+ msg += """
85
+
86
+ Required actions:
87
+ 1. Commit any pending changes
88
+ 2. Tell user to start fresh session with /continue-session
89
+
90
+ DO NOT attempt further tool calls. This is a hard stop.
91
+
92
+ To resume later: /continue-session"""
93
+
94
+ print(msg, file=sys.stderr)
95
+ sys.exit(2)
96
+
97
+ except Exception:
98
+ pass
99
+
100
+ sys.exit(0)
101
+
102
+
103
+ if __name__ == "__main__":
104
+ main()
@@ -0,0 +1,66 @@
1
+ """
2
+ Context warning hook (PreToolUse) — warn agent when context usage is high.
3
+
4
+ Uses context.py to check transcript-based context percentage.
5
+ Outputs warning text to stdout but always exits 0 (never blocks).
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import os
11
+ import sys
12
+
13
+ from pennyfarthing_scripts.context import check_context, load_config
14
+
15
+
16
+ def main() -> None:
17
+ """Main entry point for context warning hook."""
18
+ try:
19
+ # Read and discard stdin (required by hook protocol)
20
+ sys.stdin.read()
21
+
22
+ project_dir = os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
23
+ config = load_config(project_dir)
24
+
25
+ result = check_context(project_dir=project_dir)
26
+
27
+ if result.error:
28
+ sys.exit(0)
29
+
30
+ warning_threshold = config.warning_threshold
31
+ critical_threshold = config.critical_threshold
32
+ pct = result.usable_percent
33
+
34
+ if pct >= critical_threshold:
35
+ print(f"""
36
+ ---
37
+ CONTEXT WARNING: {pct}% (CRITICAL)
38
+
39
+ Context usage is critically high. Recommended actions:
40
+ 1. Complete current task immediately
41
+ 2. Commit any pending changes
42
+ 3. Hand off to next agent or ask user to start fresh session
43
+
44
+ Do NOT start new subtasks. Wrap up and hand off.
45
+ ---
46
+ """)
47
+ elif pct >= warning_threshold:
48
+ print(f"""
49
+ ---
50
+ CONTEXT WARNING: {pct}%
51
+
52
+ Context usage is high. Consider:
53
+ - Wrapping up current task soon
54
+ - Preparing for handoff to next agent
55
+ - Avoiding large file reads or complex operations
56
+ ---
57
+ """)
58
+
59
+ except Exception:
60
+ pass
61
+
62
+ sys.exit(0)
63
+
64
+
65
+ if __name__ == "__main__":
66
+ main()
@@ -0,0 +1,129 @@
1
+ """
2
+ Cyclist PreToolUse Hook — route tool approval through WheelHub.
3
+
4
+ When Cyclist is running, sends approval requests to WheelHub's /api/hook-request
5
+ endpoint. Falls back to Claude Code's built-in permissions when Cyclist is not active.
6
+
7
+ Consolidates pretooluse_hook.py into the hooks subpackage.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import sys
13
+ from pathlib import Path
14
+
15
+ from pennyfarthing_scripts.hooks import (
16
+ HookResponse,
17
+ find_project_root,
18
+ get_context_state,
19
+ is_cyclist_running,
20
+ load_settings,
21
+ output_hook_response,
22
+ read_stdin_json,
23
+ send_to_cyclist,
24
+ )
25
+
26
+
27
+ def _resolve_agent(session_id: str | None, project_root: Path | None) -> str | None:
28
+ """Resolve agent name from session file."""
29
+ if not project_root:
30
+ return None
31
+
32
+ agents_dir = project_root / ".session" / "agents"
33
+ if not agents_dir.is_dir():
34
+ return None
35
+
36
+ if session_id:
37
+ agent_file = agents_dir / session_id
38
+ if agent_file.is_file():
39
+ try:
40
+ return agent_file.read_text().strip() or None
41
+ except OSError:
42
+ pass
43
+
44
+ try:
45
+ agent_files = sorted(
46
+ (f for f in agents_dir.iterdir() if f.is_file()),
47
+ key=lambda f: f.stat().st_mtime,
48
+ reverse=True,
49
+ )
50
+ if agent_files:
51
+ return agent_files[0].read_text().strip() or None
52
+ except OSError:
53
+ pass
54
+
55
+ return None
56
+
57
+
58
+ def main() -> None:
59
+ """Main entry point for PreToolUse hook."""
60
+ try:
61
+ tool_data = read_stdin_json()
62
+ tool_name = tool_data.get("tool_name", "")
63
+ tool_id = tool_data.get("tool_use_id", "")
64
+ tool_input = tool_data.get("tool_input", {})
65
+ session_id = tool_data.get("session_id")
66
+
67
+ project_root = find_project_root()
68
+ agent_name = _resolve_agent(session_id, project_root)
69
+
70
+ if not is_cyclist_running(project_root):
71
+ sys.exit(0)
72
+
73
+ settings = load_settings(project_root)
74
+ if settings.permission_mode == "accept":
75
+ output_hook_response(HookResponse(
76
+ event_name="PreToolUse",
77
+ decision="allow",
78
+ reason="Auto-accept mode enabled",
79
+ ))
80
+ sys.exit(0)
81
+
82
+ context = get_context_state(project_root)
83
+ request_data = {
84
+ "toolName": tool_name,
85
+ "toolId": tool_id,
86
+ "input": tool_input,
87
+ "sessionId": session_id,
88
+ "context": {
89
+ "percentage": context.percentage,
90
+ "isHigh": context.is_high,
91
+ "isCritical": context.is_critical,
92
+ },
93
+ }
94
+ if agent_name:
95
+ request_data["agent"] = agent_name
96
+
97
+ response = send_to_cyclist(
98
+ endpoint="/api/hook-request",
99
+ data=request_data,
100
+ project_root=project_root,
101
+ )
102
+
103
+ if response is None:
104
+ output_hook_response(HookResponse(
105
+ event_name="PreToolUse",
106
+ decision="ask",
107
+ reason="Could not connect to WheelHub",
108
+ ))
109
+ sys.exit(0)
110
+
111
+ decision = response.get("decision", "ask")
112
+ reason = response.get("reason", "")
113
+ data = response.get("data")
114
+
115
+ output_hook_response(HookResponse(
116
+ event_name="PreToolUse",
117
+ decision=decision,
118
+ reason=reason,
119
+ updated_input=data,
120
+ ))
121
+ sys.exit(0)
122
+
123
+ except Exception as e:
124
+ print(f"[pretooluse-hook] Error: {e}", file=sys.stderr)
125
+ sys.exit(0)
126
+
127
+
128
+ if __name__ == "__main__":
129
+ main()
@@ -0,0 +1,77 @@
1
+ """
2
+ Pre-edit check hook (PreToolUse) — block edits to protected files.
3
+
4
+ Prevents editing sensitive files (.env, .pem, .key, credentials, secrets),
5
+ git internals, node_modules, and managed pennyfarthing files.
6
+
7
+ Exit 0 = allow, Exit 2 = block.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import fnmatch
13
+ import json
14
+ import os
15
+ import sys
16
+ from pathlib import Path
17
+
18
+ # Protected patterns — files that should never be edited automatically
19
+ PROTECTED_PATTERNS = [
20
+ "*.env",
21
+ "*.pem",
22
+ "*.key",
23
+ "*credentials*",
24
+ "*secrets*",
25
+ ".git/*",
26
+ "node_modules/*",
27
+ "vendor/*",
28
+ ]
29
+
30
+
31
+ def main() -> None:
32
+ """Main entry point for pre-edit check hook."""
33
+ try:
34
+ raw = sys.stdin.read()
35
+ try:
36
+ input_data = json.loads(raw)
37
+ except (json.JSONDecodeError, ValueError):
38
+ sys.exit(0)
39
+
40
+ tool_input = input_data.get("tool_input", {})
41
+ file_path = tool_input.get("file_path", "") or tool_input.get("path", "")
42
+
43
+ if not file_path:
44
+ sys.exit(0)
45
+
46
+ # Check managed pennyfarthing files protection
47
+ # EXCEPTION: If we ARE in the pennyfarthing library itself, allow edits
48
+ project_dir = os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
49
+ is_pennyfarthing_lib = Path(project_dir, "pennyfarthing-dist").is_dir()
50
+
51
+ if ".claude/pennyfarthing/" in file_path and not is_pennyfarthing_lib:
52
+ print("BLOCKED: Cannot edit managed pennyfarthing files.", file=sys.stderr)
53
+ print(f"File: {file_path}", file=sys.stderr)
54
+ print("", file=sys.stderr)
55
+ print("These files are managed by pennyfarthing and will be overwritten on update.", file=sys.stderr)
56
+ print("Instead:", file=sys.stderr)
57
+ print(" - Put project-specific customizations in .claude/project/", file=sys.stderr)
58
+ print(" - For framework changes, edit the pennyfarthing repo and run 'pennyfarthing update'", file=sys.stderr)
59
+ sys.exit(2)
60
+
61
+ # Check protected patterns
62
+ for pattern in PROTECTED_PATTERNS:
63
+ if fnmatch.fnmatch(file_path, pattern):
64
+ print(f"BLOCKED: Cannot edit protected file matching pattern: {pattern}", file=sys.stderr)
65
+ print(f"File: {file_path}", file=sys.stderr)
66
+ sys.exit(2)
67
+
68
+ except SystemExit:
69
+ raise
70
+ except Exception:
71
+ pass
72
+
73
+ sys.exit(0)
74
+
75
+
76
+ if __name__ == "__main__":
77
+ main()