@pennyfarthing/core 11.1.1 → 11.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (487) hide show
  1. package/README.md +8 -8
  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 +381 -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 +11 -0
  16. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  17. package/packages/core/dist/cli/utils/settings.js +65 -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/tandem-metrics.d.ts +91 -0
  22. package/packages/core/dist/consultation/tandem-metrics.d.ts.map +1 -0
  23. package/packages/core/dist/consultation/tandem-metrics.js +131 -0
  24. package/packages/core/dist/consultation/tandem-metrics.js.map +1 -0
  25. package/packages/core/dist/consultation/tandem-metrics.test.d.ts +18 -0
  26. package/packages/core/dist/consultation/tandem-metrics.test.d.ts.map +1 -0
  27. package/packages/core/dist/consultation/tandem-metrics.test.js +457 -0
  28. package/packages/core/dist/consultation/tandem-metrics.test.js.map +1 -0
  29. package/packages/core/dist/public/js/react/react.js +14 -14
  30. package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
  31. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
  32. package/packages/core/dist/scripts/benchmark-integration.js +691 -0
  33. package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
  34. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -0
  35. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
  36. package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
  37. package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
  38. package/packages/core/dist/server/api/agent-load.js +1 -1
  39. package/packages/core/dist/server/api/agent-load.js.map +1 -1
  40. package/packages/core/dist/server/otlp-receiver.d.ts +16 -11
  41. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  42. package/packages/core/dist/server/otlp-receiver.js +185 -24
  43. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  44. package/packages/core/dist/server/otlp-receiver.test.d.ts +21 -0
  45. package/packages/core/dist/server/otlp-receiver.test.d.ts.map +1 -0
  46. package/packages/core/dist/server/otlp-receiver.test.js +446 -0
  47. package/packages/core/dist/server/otlp-receiver.test.js.map +1 -0
  48. package/packages/core/dist/server/server.d.ts +0 -3
  49. package/packages/core/dist/server/server.d.ts.map +1 -1
  50. package/packages/core/dist/server/server.js +3 -37
  51. package/packages/core/dist/server/server.js.map +1 -1
  52. package/packages/core/dist/server/server.test.d.ts +1 -1
  53. package/packages/core/dist/server/server.test.js +12 -23
  54. package/packages/core/dist/server/server.test.js.map +1 -1
  55. package/packages/core/dist/shared/capabilities.d.ts +88 -0
  56. package/packages/core/dist/shared/capabilities.d.ts.map +1 -0
  57. package/packages/core/dist/shared/capabilities.js +133 -0
  58. package/packages/core/dist/shared/capabilities.js.map +1 -0
  59. package/packages/core/dist/shared/capabilities.test.d.ts +2 -0
  60. package/packages/core/dist/shared/capabilities.test.d.ts.map +1 -0
  61. package/packages/core/dist/shared/capabilities.test.js +217 -0
  62. package/packages/core/dist/shared/capabilities.test.js.map +1 -0
  63. package/packages/core/dist/shared/portrait-resolver.d.ts +9 -0
  64. package/packages/core/dist/shared/portrait-resolver.d.ts.map +1 -1
  65. package/packages/core/dist/shared/portrait-resolver.js +27 -0
  66. package/packages/core/dist/shared/portrait-resolver.js.map +1 -1
  67. package/packages/core/dist/shared/portrait-resolver.test.js +47 -1
  68. package/packages/core/dist/shared/portrait-resolver.test.js.map +1 -1
  69. package/packages/core/dist/shared/spawn-prompt.d.ts +47 -0
  70. package/packages/core/dist/shared/spawn-prompt.d.ts.map +1 -0
  71. package/packages/core/dist/shared/spawn-prompt.js +82 -0
  72. package/packages/core/dist/shared/spawn-prompt.js.map +1 -0
  73. package/packages/core/dist/shared/spawn-prompt.test.d.ts +2 -0
  74. package/packages/core/dist/shared/spawn-prompt.test.d.ts.map +1 -0
  75. package/packages/core/dist/shared/spawn-prompt.test.js +251 -0
  76. package/packages/core/dist/shared/spawn-prompt.test.js.map +1 -0
  77. package/packages/core/dist/shared/tandem-portrait-inventory.test.d.ts +13 -0
  78. package/packages/core/dist/shared/tandem-portrait-inventory.test.d.ts.map +1 -0
  79. package/packages/core/dist/shared/tandem-portrait-inventory.test.js +126 -0
  80. package/packages/core/dist/shared/tandem-portrait-inventory.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/workflow-schema.d.ts +32 -0
  86. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
  87. package/packages/core/dist/workflow/workflow-schema.js +120 -0
  88. package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
  89. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -1
  90. package/packages/core/dist/workflow/workflow-schema.test.js +570 -1
  91. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -1
  92. package/pennyfarthing-dist/agents/dev.md +7 -11
  93. package/pennyfarthing-dist/agents/reviewer.md +9 -3
  94. package/pennyfarthing-dist/agents/sm-finish.md +18 -1
  95. package/pennyfarthing-dist/agents/sm-setup.md +1 -1
  96. package/pennyfarthing-dist/agents/sm.md +2 -2
  97. package/pennyfarthing-dist/agents/tea.md +1 -1
  98. package/pennyfarthing-dist/agents/testing-runner.md +2 -1
  99. package/pennyfarthing-dist/commands/pf-chore.md +2 -2
  100. package/pennyfarthing-dist/commands/pf-git.md +4 -2
  101. package/pennyfarthing-dist/commands/pf-standalone.md +7 -2
  102. package/pennyfarthing-dist/gates/approval.md +63 -0
  103. package/pennyfarthing-dist/gates/confidence-sm.md +71 -0
  104. package/pennyfarthing-dist/gates/context-ok.md +56 -0
  105. package/pennyfarthing-dist/gates/evaluations/confidence-sm.md +54 -0
  106. package/pennyfarthing-dist/gates/quality-pass.md +67 -0
  107. package/pennyfarthing-dist/gates/tests-fail.md +84 -0
  108. package/pennyfarthing-dist/gates/tests-pass.md +79 -0
  109. package/pennyfarthing-dist/guides/agent-behavior.md +23 -19
  110. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +1 -1
  111. package/pennyfarthing-dist/guides/bell-mode.md +1 -1
  112. package/pennyfarthing-dist/guides/bikerack.md +3 -3
  113. package/pennyfarthing-dist/guides/hooks.md +29 -29
  114. package/pennyfarthing-dist/guides/reflector.md +1 -1
  115. package/pennyfarthing-dist/guides/tandem-protocol.md +3 -3
  116. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  117. package/pennyfarthing-dist/guides/xml-tags.md +2 -2
  118. package/pennyfarthing-dist/scripts/README.md +1 -1
  119. package/pennyfarthing-dist/scripts/core/check-context.sh +3 -1
  120. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +5 -87
  121. package/pennyfarthing-dist/scripts/git/README.md +24 -14
  122. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +5 -266
  123. package/pennyfarthing-dist/scripts/git/git-status-all.sh +5 -151
  124. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +6 -144
  125. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +5 -496
  126. package/pennyfarthing-dist/scripts/hooks/README.md +6 -6
  127. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  128. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +4 -183
  129. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +4 -95
  130. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +4 -65
  131. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -31
  132. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +9 -11
  133. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +27 -33
  134. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +4 -71
  135. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -19
  136. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +4 -30
  137. package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -32
  138. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +4 -65
  139. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +4 -78
  140. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +4 -93
  141. package/pennyfarthing-dist/scripts/misc/README.md +1 -1
  142. package/pennyfarthing-dist/scripts/misc/statusline.sh +4 -301
  143. package/pennyfarthing-dist/scripts/portraits/generate-tandem-portraits.sh +76 -0
  144. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +4 -221
  145. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +5 -13
  146. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +4 -123
  147. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +4 -33
  148. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +4 -156
  149. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +4 -131
  150. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +4 -249
  151. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +4 -160
  152. package/pennyfarthing-dist/skills/pf-bc/usage.md +1 -1
  153. package/pennyfarthing-dist/skills/pf-jira/examples.md +5 -2
  154. package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -16
  155. package/pennyfarthing-dist/skills/pf-workflow/skill.md +9 -12
  156. package/pennyfarthing-dist/skills/pf-workflow/usage.md +33 -8
  157. package/pennyfarthing-dist/templates/settings.local.json.template +19 -10
  158. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +18 -6
  159. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
  160. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
  161. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  162. package/pennyfarthing-dist/workflows/review-tandem.yaml +65 -0
  163. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +16 -8
  164. package/pennyfarthing-dist/workflows/tdd.yaml +11 -2
  165. package/pennyfarthing_scripts/CLAUDE.md +45 -14
  166. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  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.cpython-314.pyc +0 -0
  174. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  175. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  176. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  177. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  178. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  179. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  180. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  181. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  182. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  183. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  184. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  185. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  186. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  187. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  188. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  189. package/pennyfarthing_scripts/bc/cli.py +3 -5
  190. package/pennyfarthing_scripts/bellmode_hook.py +12 -296
  191. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  192. package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  193. package/pennyfarthing_scripts/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
  194. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  195. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  196. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  197. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  198. package/pennyfarthing_scripts/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  200. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  201. package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  202. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  203. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  204. package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  205. package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  206. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  207. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  208. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  209. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  210. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  211. package/pennyfarthing_scripts/bikerack/audit_log_panel.py +119 -0
  212. package/pennyfarthing_scripts/bikerack/background_panel.py +86 -5
  213. package/pennyfarthing_scripts/bikerack/base_panel.py +87 -2
  214. package/pennyfarthing_scripts/bikerack/changed_panel.py +125 -29
  215. package/pennyfarthing_scripts/bikerack/context_meter_footer.py +88 -0
  216. package/pennyfarthing_scripts/bikerack/debug_panel.py +32 -2
  217. package/pennyfarthing_scripts/bikerack/diffs_panel.py +104 -17
  218. package/pennyfarthing_scripts/bikerack/events.py +28 -0
  219. package/pennyfarthing_scripts/bikerack/git_panel.py +103 -33
  220. package/pennyfarthing_scripts/bikerack/launcher.py +15 -15
  221. package/pennyfarthing_scripts/bikerack/portrait_resolver.py +139 -0
  222. package/pennyfarthing_scripts/bikerack/progress_panel.py +315 -0
  223. package/pennyfarthing_scripts/bikerack/sprint_panel.py +395 -32
  224. package/pennyfarthing_scripts/bikerack/story_detail_data.py +244 -0
  225. package/pennyfarthing_scripts/bikerack/story_detail_screen.py +176 -0
  226. package/pennyfarthing_scripts/bikerack/tui.py +575 -37
  227. package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
  228. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  229. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  231. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/cli.py +42 -65
  233. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  234. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  235. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  237. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  238. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  239. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  240. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  241. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  242. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  243. package/pennyfarthing_scripts/common/pr_config.py +38 -0
  244. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  245. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  247. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/consultation/__init__.py +1 -0
  251. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/consultation/__pycache__/dialogue_manager.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/consultation/cli.py +149 -0
  255. package/pennyfarthing_scripts/consultation/dialogue_manager.py +417 -0
  256. package/pennyfarthing_scripts/context.py +3 -3
  257. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  259. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  260. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  261. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  262. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  263. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  264. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  265. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  266. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  267. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  268. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  269. package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  270. package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-314.pyc +0 -0
  271. package/pennyfarthing_scripts/git/__init__.py +12 -1
  272. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  273. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  274. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/git/create_branches.py +3 -4
  276. package/pennyfarthing_scripts/git/hooks_installer.py +152 -0
  277. package/pennyfarthing_scripts/git/repos.py +196 -0
  278. package/pennyfarthing_scripts/git/status_all.py +27 -11
  279. package/pennyfarthing_scripts/git/worktree.py +302 -0
  280. package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  282. package/pennyfarthing_scripts/git_group/cli.py +143 -40
  283. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  284. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  285. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  286. package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  287. package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  288. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  289. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/handoff/cli.py +33 -1
  291. package/pennyfarthing_scripts/handoff/complete_phase.py +40 -0
  292. package/pennyfarthing_scripts/handoff/marker.py +15 -15
  293. package/pennyfarthing_scripts/handoff/phase_check.py +96 -0
  294. package/pennyfarthing_scripts/handoff/resolve_gate.py +18 -15
  295. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  296. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  297. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  298. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  299. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/hooks/__init__.py +437 -0
  302. package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  303. package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  304. package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  305. package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  306. package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  307. package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  309. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  311. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  313. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  314. package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  315. package/pennyfarthing_scripts/hooks/bell_mode.py +215 -0
  316. package/pennyfarthing_scripts/hooks/cli.py +96 -0
  317. package/pennyfarthing_scripts/hooks/context_breaker.py +104 -0
  318. package/pennyfarthing_scripts/hooks/context_warning.py +66 -0
  319. package/pennyfarthing_scripts/hooks/cyclist_pretooluse.py +129 -0
  320. package/pennyfarthing_scripts/hooks/pre_edit_check.py +78 -0
  321. package/pennyfarthing_scripts/hooks/reflector_check.py +271 -0
  322. package/pennyfarthing_scripts/hooks/schema_validation.py +203 -0
  323. package/pennyfarthing_scripts/hooks/session_start.py +296 -0
  324. package/pennyfarthing_scripts/hooks/session_stop.py +111 -0
  325. package/pennyfarthing_scripts/hooks/sprint_yaml_validation.py +97 -0
  326. package/pennyfarthing_scripts/hooks/statusline.py +420 -0
  327. package/pennyfarthing_scripts/hooks.py +27 -446
  328. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  329. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  330. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  331. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  332. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  333. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  334. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  335. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  336. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  337. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  338. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  339. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  340. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  341. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  342. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  343. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  344. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  345. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  346. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  347. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  348. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  349. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  350. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
  351. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  352. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  353. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  354. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  355. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  356. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  357. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  358. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  359. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  360. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  361. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  362. package/pennyfarthing_scripts/pretooluse_hook.py +3 -185
  363. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  364. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  365. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  366. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  367. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  368. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  369. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  370. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  371. package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  372. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  373. package/pennyfarthing_scripts/prime/heatmap.py +655 -0
  374. package/pennyfarthing_scripts/prime/workflow.py +2 -1
  375. package/pennyfarthing_scripts/schema_validation_hook.py +3 -298
  376. package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
  377. package/pennyfarthing_scripts/session/__pycache__/cli.cpython-314.pyc +0 -0
  378. package/pennyfarthing_scripts/session_start_hook.py +4 -186
  379. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  380. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  381. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  382. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  383. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  384. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  385. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  386. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  387. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  388. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  389. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  390. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  391. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  392. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  393. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  394. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  395. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  396. package/pennyfarthing_scripts/sprint/loader.py +15 -1
  397. package/pennyfarthing_scripts/sprint/story_update.py +19 -0
  398. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  399. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  400. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  401. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  402. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  403. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  404. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  405. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  406. package/pennyfarthing_scripts/tests/__pycache__/test_108_1_gate_migration.cpython-314-pytest-9.0.2.pyc +0 -0
  407. package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  408. package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  409. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  410. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  411. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  412. package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  413. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  414. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  415. package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
  416. package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
  417. package/pennyfarthing_scripts/tests/__pycache__/test_dialogue_manager.cpython-314-pytest-9.0.2.pyc +0 -0
  418. package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  419. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  420. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  421. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  422. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  423. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  424. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  425. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  426. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  427. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  428. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  429. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  430. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  431. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  432. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  433. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  434. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  435. package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  436. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  437. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  438. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  439. package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  440. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  441. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  442. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  443. package/pennyfarthing_scripts/tests/test_bikerack.py +51 -51
  444. package/pennyfarthing_scripts/tests/test_dialogue_manager.py +811 -0
  445. package/pennyfarthing_scripts/tests/test_handoff_cli.py +16 -11
  446. package/pennyfarthing_scripts/tests/test_sprint_panel.py +344 -265
  447. package/pennyfarthing_scripts/tests/test_workflow_check.py +2 -3
  448. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  449. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  450. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  451. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  452. package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  453. package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  454. package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  455. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  456. package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  457. package/pennyfarthing_scripts/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
  458. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  459. package/pennyfarthing_scripts/validate/adapters/tandem_awareness.py +254 -0
  460. package/pennyfarthing_scripts/validate/adapters/workflow.py +19 -0
  461. package/pennyfarthing_scripts/validate/cli.py +17 -5
  462. package/pennyfarthing_scripts/welcome_hook.py +3 -149
  463. package/pennyfarthing_scripts/workflow/__init__.py +40 -0
  464. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  465. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  466. package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  467. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  468. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
  469. package/pennyfarthing_scripts/workflow/cli.py +1100 -0
  470. package/pennyfarthing_scripts/workflow/helpers.py +241 -0
  471. package/pennyfarthing_scripts/{workflow.py → workflow/scale.py} +0 -104
  472. package/pennyfarthing_scripts/workflow/state.py +112 -0
  473. package/pennyfarthing_scripts/workflow/team_lifecycle.py +257 -0
  474. package/packages/core/dist/scripts/theme-detail.test.d.ts +0 -10
  475. package/packages/core/dist/scripts/theme-detail.test.js +0 -199
  476. package/pennyfarthing-dist/skills/pf-workflow/scripts/list-workflows.sh +0 -91
  477. package/pennyfarthing-dist/skills/pf-workflow/scripts/resume-workflow.sh +0 -163
  478. package/pennyfarthing-dist/skills/pf-workflow/scripts/show-workflow.sh +0 -138
  479. package/pennyfarthing-dist/skills/pf-workflow/scripts/start-workflow.sh +0 -273
  480. package/pennyfarthing-dist/skills/pf-workflow/scripts/workflow-status.sh +0 -167
  481. package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
  482. package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
  483. package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
  484. package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
  485. package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
  486. package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
  487. package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
@@ -1,144 +1,6 @@
1
- #!/bin/bash
2
- # install-git-hooks.sh - Install Pennyfarthing git hooks for framework development
3
- #
4
- # Usage: ./pennyfarthing-dist/scripts/install-git-hooks.sh
5
- #
6
- # For the pennyfarthing framework repo and orchestrator repos that inline it.
7
- # End-user projects use `pennyfarthing init` which copies hooks from node_modules.
8
- # This script creates .d/ directories with symlinks so hook changes in
9
- # pennyfarthing-dist/ take effect immediately.
10
-
11
- set -euo pipefail
12
-
13
- # Self-locate and set up PROJECT_ROOT
14
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
15
- source "$SCRIPT_DIR/../lib/find-root.sh"
16
- HOOKS_SOURCE="$PROJECT_ROOT/pennyfarthing-dist/scripts/hooks"
17
- HOOKS_DEST="$PROJECT_ROOT/.git/hooks"
18
-
19
- DISPATCHER_MARKER="pennyfarthing-dispatcher"
20
- PF_PREFIX="10"
21
- MIGRATED_PREFIX="50"
22
-
23
- # Check we're in a repo with pennyfarthing-dist (framework or orchestrator)
24
- if [[ ! -d "$PROJECT_ROOT/pennyfarthing-dist" ]]; then
25
- echo "Error: This script requires pennyfarthing-dist/ at the project root"
26
- echo " (framework repo or orchestrator with inlined pennyfarthing/)"
27
- echo " End-user projects should use: pennyfarthing init"
28
- exit 1
29
- fi
30
-
31
- # Check .git exists
32
- if [[ ! -d "$PROJECT_ROOT/.git" ]]; then
33
- echo "Error: Not a git repository"
34
- exit 1
35
- fi
36
-
37
- echo "Installing git hooks with .d/ dispatcher pattern..."
38
- echo " Source: pennyfarthing-dist/scripts/hooks/"
39
- echo " Dest: .git/hooks/"
40
- echo ""
41
-
42
- # Shared dispatcher template — single source of truth
43
- DISPATCHER_TEMPLATE="$PROJECT_ROOT/pennyfarthing-dist/scripts/hooks/dispatcher-template.sh"
44
-
45
- if [[ ! -f "$DISPATCHER_TEMPLATE" ]]; then
46
- echo "Error: dispatcher-template.sh not found at $DISPATCHER_TEMPLATE"
47
- exit 1
48
- fi
49
-
50
- # Generate a dispatcher script for a given hook name
51
- generate_dispatcher() {
52
- local hook_name="$1"
53
- sed "s/__HOOK_NAME__/${hook_name}/g" "$DISPATCHER_TEMPLATE"
54
- }
55
-
56
- # Define hooks to install
57
- HOOKS=(
58
- "pre-commit.sh:pre-commit"
59
- "pre-push.sh:pre-push"
60
- "post-merge.sh:post-merge"
61
- )
62
-
63
- for hook_pair in "${HOOKS[@]}"; do
64
- source_file="${hook_pair%%:*}"
65
- dest_name="${hook_pair##*:}"
66
-
67
- source_path="$HOOKS_SOURCE/$source_file"
68
- dest_path="$HOOKS_DEST/$dest_name"
69
- d_dir="$HOOKS_DEST/${dest_name}.d"
70
- pf_hook_name="${PF_PREFIX}-pennyfarthing-${dest_name}.sh"
71
- pf_hook_path="${d_dir}/${pf_hook_name}"
72
-
73
- if [[ ! -f "$source_path" ]]; then
74
- echo " SKIP $dest_name (source not found)"
75
- continue
76
- fi
77
-
78
- # Create .d/ directory
79
- mkdir -p "$d_dir"
80
-
81
- # Handle existing hook at the dest path
82
- if [[ -e "$dest_path" ]]; then
83
- if [[ -f "$dest_path" ]] && grep -q "$DISPATCHER_MARKER" "$dest_path" 2>/dev/null; then
84
- echo " OK $dest_name dispatcher (already installed)"
85
- elif [[ -L "$dest_path" ]]; then
86
- # Old-style symlink — migrate to .d/ pattern
87
- rm "$dest_path"
88
- generate_dispatcher "$dest_name" > "$dest_path"
89
- chmod 755 "$dest_path"
90
- echo " UPD $dest_name → dispatcher"
91
- elif [[ -f "$dest_path" ]]; then
92
- existing_content="$(cat "$dest_path")"
93
- if echo "$existing_content" | grep -q "pennyfarthing"; then
94
- # Old pennyfarthing single-file hook — replace with dispatcher
95
- generate_dispatcher "$dest_name" > "$dest_path"
96
- chmod 755 "$dest_path"
97
- echo " UPD $dest_name → dispatcher (was single-file pf hook)"
98
- else
99
- # Non-pennyfarthing hook — migrate into .d/
100
- migrated_name="${MIGRATED_PREFIX}-migrated-${dest_name}.sh"
101
- migrated_path="${d_dir}/${migrated_name}"
102
- if [[ ! -f "$migrated_path" ]]; then
103
- mv "$dest_path" "$migrated_path"
104
- chmod 755 "$migrated_path"
105
- echo " MIG $dest_name → ${dest_name}.d/${migrated_name}"
106
- fi
107
- generate_dispatcher "$dest_name" > "$dest_path"
108
- chmod 755 "$dest_path"
109
- echo " NEW $dest_name dispatcher"
110
- fi
111
- fi
112
- else
113
- # No existing hook — install fresh dispatcher
114
- generate_dispatcher "$dest_name" > "$dest_path"
115
- chmod 755 "$dest_path"
116
- echo " NEW $dest_name dispatcher"
117
- fi
118
-
119
- # Symlink pennyfarthing hook into .d/ (framework dev — symlink for live edits)
120
- # From .git/hooks/{hook}.d/ we need ../../.../pennyfarthing-dist/scripts/hooks/
121
- relative_path="../../../pennyfarthing-dist/scripts/hooks/$source_file"
122
-
123
- if [[ -L "$pf_hook_path" ]]; then
124
- current_target=$(readlink "$pf_hook_path")
125
- if [[ "$current_target" == "$relative_path" ]]; then
126
- echo " OK ${dest_name}.d/${pf_hook_name} (already linked)"
127
- else
128
- rm "$pf_hook_path"
129
- ln -sf "$relative_path" "$pf_hook_path"
130
- echo " UPD ${dest_name}.d/${pf_hook_name} → $relative_path"
131
- fi
132
- elif [[ -f "$pf_hook_path" ]]; then
133
- # Regular file — replace with symlink for dev
134
- rm "$pf_hook_path"
135
- ln -sf "$relative_path" "$pf_hook_path"
136
- echo " UPD ${dest_name}.d/${pf_hook_name} → $relative_path (was copy)"
137
- else
138
- ln -sf "$relative_path" "$pf_hook_path"
139
- echo " NEW ${dest_name}.d/${pf_hook_name} → $relative_path"
140
- fi
141
- done
142
-
143
- echo ""
144
- echo "Done. Verify with: ls -la .git/hooks/*.d/"
1
+ #!/usr/bin/env bash
2
+ # DEPRECATED: Use `pf git install-hooks` instead.
3
+ # This shim forwards to the Python CLI.
4
+ set -e
5
+ echo "DEPRECATED: install-git-hooks.sh — use 'pf git install-hooks' instead" >&2
6
+ exec pf git install-hooks "$@"
@@ -1,497 +1,6 @@
1
- #!/usr/bin/env zsh
2
- # Worktree management utilities for parallel development work
3
- # Usage: worktree-manager.sh {create|remove|list|status|ports|cd} [args]
4
- #
5
- # Configuration (choose one):
6
- # 1. repos.yaml: Define repos in .pennyfarthing/repos.yaml (recommended)
7
- # 2. Legacy env vars: Set API_REPO and UI_REPO in .claude/project/hooks/setup-env.sh
8
-
1
+ #!/usr/bin/env bash
2
+ # DEPRECATED: Use `pf git worktree` instead.
3
+ # This shim forwards to the Python CLI.
9
4
  set -e
10
-
11
- # Self-locate: derive paths from this script's position
12
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd -P)"
13
-
14
- # Load environment
15
- if [ -f "$PROJECT_ROOT/.env" ]; then
16
- set -a; source "$PROJECT_ROOT/.env"; set +a
17
- fi
18
-
19
- # Source project hooks if available
20
- if [ -f "$PROJECT_ROOT/.claude/project/hooks/setup-env.sh" ]; then
21
- source "$PROJECT_ROOT/.claude/project/hooks/setup-env.sh"
22
- fi
23
-
24
- # Source repo utilities (handles repos.yaml or legacy env vars)
25
- REPO_UTILS_LAZY=1 # Don't auto-load, we'll do it after validation
26
- source "$SCRIPT_DIR/../misc/repo-utils.sh"
27
-
28
- WORKTREE_ROOT="${WORKTREE_ROOT:-$PROJECT_ROOT/worktrees}"
29
- WORKTREE_PORT_OFFSET="${WORKTREE_PORT_OFFSET:-100}"
30
-
31
- # ============================================================================
32
- # Services Configuration
33
- # ============================================================================
34
-
35
- # Load services configuration from pennyfarthing-settings.yaml
36
- # Sets: _SERVICES_JSON, _PORT_OFFSET
37
- # Returns 1 if no services configured
38
- load_services_config() {
39
- local config_file="${PROJECT_ROOT}/.claude/project/pennyfarthing-settings.yaml"
40
-
41
- if [[ ! -f "$config_file" ]]; then
42
- _SERVICES_JSON=""
43
- _PORT_OFFSET=$WORKTREE_PORT_OFFSET
44
- return 1
45
- fi
46
-
47
- # Parse services config using yq (preferred) or Python fallback
48
- local config
49
- if command -v yq &>/dev/null; then
50
- # Check if services section exists
51
- local has_services
52
- has_services=$(yq '.services.definitions' "$config_file" 2>/dev/null)
53
- if [[ -z "$has_services" || "$has_services" == "null" ]]; then
54
- _SERVICES_JSON=""
55
- _PORT_OFFSET=$WORKTREE_PORT_OFFSET
56
- return 1
57
- fi
58
-
59
- local port_offset
60
- port_offset=$(yq '.services.port_offset // 100' "$config_file" 2>/dev/null)
61
- local definitions_json
62
- definitions_json=$(yq -o=json '.services.definitions' "$config_file" 2>/dev/null)
63
-
64
- _PORT_OFFSET=$port_offset
65
- _SERVICES_JSON="$definitions_json"
66
- return 0
67
- elif command -v python3 &>/dev/null; then
68
- config=$(python3 -c "
69
- import yaml
70
- import json
71
- import sys
72
-
73
- try:
74
- with open('$config_file', 'r') as f:
75
- settings = yaml.safe_load(f)
76
-
77
- if not settings or 'services' not in settings or 'definitions' not in settings['services']:
78
- sys.exit(1)
79
-
80
- svc = settings['services']
81
- port_offset = svc.get('port_offset', ${WORKTREE_PORT_OFFSET})
82
- definitions = svc['definitions']
83
-
84
- # Ensure env_var is set for each service
85
- for d in definitions:
86
- if 'env_var' not in d:
87
- d['env_var'] = d['name'].upper().replace(' ', '_').replace('-', '_') + '_PORT'
88
-
89
- print(f'_PORT_OFFSET={port_offset}')
90
- print(f\"_SERVICES_JSON='{json.dumps(definitions)}'\")
91
- except Exception:
92
- sys.exit(1)
93
- " 2>/dev/null)
94
-
95
- if [[ $? -eq 0 && -n "$config" ]]; then
96
- eval "$config"
97
- return 0
98
- fi
99
- fi
100
-
101
- _SERVICES_JSON=""
102
- _PORT_OFFSET=$WORKTREE_PORT_OFFSET
103
- return 1
104
- }
105
-
106
- # Load and validate repo configuration
107
- load_repos_config
108
-
109
- if [ "$(get_repo_count)" -eq 0 ]; then
110
- echo "❌ Error: No repositories configured"
111
- echo ""
112
- echo "Option 1: Create .pennyfarthing/repos.yaml (recommended for multi-repo projects)"
113
- echo "Option 2: Set API_REPO and UI_REPO in .claude/project/hooks/setup-env.sh"
114
- exit 1
115
- fi
116
-
117
- # Ensure worktree root exists
118
- mkdir -p "$WORKTREE_ROOT"
119
-
120
- show_help() {
121
- cat << EOF
122
- Worktree Manager - Parallel Development Tool
123
-
124
- Usage: worktree-manager.sh <command> [options]
125
-
126
- Commands:
127
- create <name> <branch> [repos] Create worktree(s) for parallel work
128
- remove <name> Remove worktree and clean up
129
- list List all active worktrees
130
- status Show detailed worktree status
131
- ports <name> Get port configuration for worktree
132
- cd <name> Print path to worktree (use with: cd \$(./scripts/worktree-manager.sh cd <name>))
133
- config Show current repo configuration
134
-
135
- Examples:
136
- # Create worktree for all repos
137
- ./scripts/worktree-manager.sh create 5-1a feat/5-1a-file-upload
138
-
139
- # Create worktree for specific repo type
140
- ./scripts/worktree-manager.sh create bug-123 fix/bug-123-validation api
141
-
142
- # Create worktree for specific repos (comma-separated)
143
- ./scripts/worktree-manager.sh create feat-x feat/x-feature adapter-a,adapter-b
144
-
145
- # Get ports for running dev servers
146
- eval \$(./scripts/worktree-manager.sh ports 5-1a)
147
- echo "API: \$API_PORT, UI: \$UI_PORT"
148
-
149
- # Remove worktree after merge
150
- ./scripts/worktree-manager.sh remove 5-1a
151
-
152
- # Show repo configuration
153
- ./scripts/worktree-manager.sh config
154
-
155
- Repos Filter (third argument):
156
- all - All configured repos (default)
157
- api - Only repos of type 'api'
158
- ui - Only repos of type 'ui'
159
- adapter - Only repos of type 'adapter'
160
- service - Only repos of type 'service'
161
- repo1,repo2 - Comma-separated list of specific repo names
162
-
163
- Configuration:
164
- Option 1 (recommended): Create .pennyfarthing/repos.yaml
165
- Option 2 (legacy): Set API_REPO and UI_REPO environment variables
166
-
167
- Session Files:
168
- Session files are named after story IDs: .session/{story-id}-session.md
169
- Example: .session/5-1a-session.md (with worktree field inside)
170
- Session files are managed by SM agent, not worktree-manager.
171
-
172
- Environment Variables:
173
- PROJECT_ROOT - Project root directory
174
- WORKTREE_ROOT - Where worktrees are created (default: \$PROJECT_ROOT/worktrees)
175
- WORKTREE_PORT_OFFSET - Port offset between worktrees (default: 100)
176
-
177
- EOF
178
- }
179
-
180
- create_worktree() {
181
- local WT_NAME="$1"
182
- local BRANCH="$2"
183
- local REPOS_FILTER="${3:-all}" # all, api, ui, adapter, service, or comma-separated names
184
-
185
- if [ -z "$WT_NAME" ] || [ -z "$BRANCH" ]; then
186
- echo "❌ Usage: worktree-manager.sh create <name> <branch> [repos-filter]"
187
- echo " repos-filter: all, api, ui, adapter, service, or comma-separated names"
188
- exit 1
189
- fi
190
-
191
- local WT_PATH="$WORKTREE_ROOT/$WT_NAME"
192
-
193
- # Check if worktree already exists
194
- if [ -d "$WT_PATH" ]; then
195
- echo "❌ Worktree '$WT_NAME' already exists at $WT_PATH"
196
- exit 1
197
- fi
198
-
199
- mkdir -p "$WT_PATH"
200
-
201
- echo "🔧 Creating worktree: $WT_NAME"
202
- echo " Branch: $BRANCH"
203
- echo " Path: $WT_PATH"
204
- echo " Repos: $REPOS_FILTER"
205
- echo ""
206
-
207
- # Get repos to create worktrees for (handle legacy 'both' as 'all')
208
- local repos_filter="$REPOS_FILTER"
209
- [ "$repos_filter" = "both" ] && repos_filter="all"
210
-
211
- local repos_to_create
212
- repos_to_create=$(filter_repos "$repos_filter")
213
-
214
- local created_repos=()
215
-
216
- while IFS= read -r repo; do
217
- [ -z "$repo" ] && continue
218
-
219
- local repo_path
220
- repo_path=$(get_repo_path "$repo")
221
- local full_path="$PROJECT_ROOT/$repo_path"
222
- local repo_type
223
- repo_type=$(get_repo_type "$repo")
224
-
225
- if [ -d "$full_path" ]; then
226
- echo "📦 Creating worktree for $repo ($repo_type)..."
227
- cd "$full_path"
228
-
229
- # Check if branch exists locally, remotely, or needs to be created
230
- if git show-ref --verify --quiet "refs/heads/$BRANCH" 2>/dev/null; then
231
- git worktree add "$WT_PATH/$repo" "$BRANCH"
232
- elif git show-ref --verify --quiet "refs/remotes/origin/$BRANCH" 2>/dev/null; then
233
- git worktree add "$WT_PATH/$repo" "$BRANCH"
234
- else
235
- # Create new branch from develop (or main if develop doesn't exist)
236
- local base_branch="develop"
237
- if ! git show-ref --verify --quiet "refs/heads/develop" 2>/dev/null; then
238
- base_branch="main"
239
- fi
240
- git worktree add -b "$BRANCH" "$WT_PATH/$repo" "$base_branch"
241
- fi
242
- echo " ✅ $repo worktree created"
243
- created_repos+=("$repo")
244
- else
245
- echo " ⚠️ Repo not found: $full_path"
246
- fi
247
- done <<< "$repos_to_create"
248
-
249
- echo ""
250
- echo "✅ Worktree '$WT_NAME' created successfully!"
251
- echo ""
252
- echo "📝 Session file: Use /sm to create .session/{story-id}-session.md"
253
- echo ""
254
- echo "Next steps:"
255
- for repo in "${created_repos[@]}"; do
256
- echo " cd $WT_PATH/$repo"
257
- done
258
- echo ""
259
- echo "Start dev servers with custom ports:"
260
- echo " eval \$(./scripts/worktree-manager.sh ports $WT_NAME)"
261
- }
262
-
263
- remove_worktree() {
264
- local WT_NAME="$1"
265
-
266
- if [ -z "$WT_NAME" ]; then
267
- echo "❌ Usage: worktree-manager.sh remove <name>"
268
- exit 1
269
- fi
270
-
271
- local WT_PATH="$WORKTREE_ROOT/$WT_NAME"
272
-
273
- if [ ! -d "$WT_PATH" ]; then
274
- echo "❌ Worktree '$WT_NAME' not found at $WT_PATH"
275
- exit 1
276
- fi
277
-
278
- echo "🗑️ Removing worktree: $WT_NAME"
279
-
280
- # Remove worktrees for all configured repos
281
- for repo in $(get_repos); do
282
- local repo_path
283
- repo_path=$(get_repo_path "$repo")
284
-
285
- if [ -d "$WT_PATH/$repo" ]; then
286
- echo " Removing $repo worktree..."
287
- cd "$PROJECT_ROOT/$repo_path"
288
- git worktree remove "$WT_PATH/$repo" --force 2>/dev/null || true
289
- fi
290
- done
291
-
292
- # Clean up directory
293
- rm -rf "$WT_PATH"
294
-
295
- # Note: Session files are managed by SM agent
296
- # Use /sm to finish work and archive the session file
297
- echo ""
298
- echo " Note: Session file (if any) should be archived via /sm finish"
299
-
300
- # Prune worktree references for all repos
301
- for repo in $(get_repos); do
302
- local repo_path
303
- repo_path=$(get_repo_path "$repo")
304
- if [ -d "$PROJECT_ROOT/$repo_path" ]; then
305
- cd "$PROJECT_ROOT/$repo_path" && git worktree prune 2>/dev/null || true
306
- fi
307
- done
308
-
309
- echo ""
310
- echo "✅ Worktree '$WT_NAME' removed successfully!"
311
- }
312
-
313
- list_worktrees() {
314
- echo "=== Active Worktrees ==="
315
- echo ""
316
-
317
- for repo in $(get_repos); do
318
- local repo_path
319
- repo_path=$(get_repo_path "$repo")
320
- local repo_type
321
- repo_type=$(get_repo_type "$repo")
322
-
323
- if [ -d "$PROJECT_ROOT/$repo_path" ]; then
324
- echo "📦 $repo ($repo_type):"
325
- cd "$PROJECT_ROOT/$repo_path" && git worktree list
326
- echo ""
327
- fi
328
- done
329
-
330
- echo "📁 Worktree Directory:"
331
- if [ -d "$WORKTREE_ROOT" ] && [ "$(ls -A "$WORKTREE_ROOT" 2>/dev/null)" ]; then
332
- ls -la "$WORKTREE_ROOT"
333
- else
334
- echo " (empty)"
335
- fi
336
- }
337
-
338
- show_status() {
339
- echo "=== Worktree Status ==="
340
- echo ""
341
-
342
- if [ ! -d "$WORKTREE_ROOT" ] || [ -z "$(ls -A "$WORKTREE_ROOT" 2>/dev/null)" ]; then
343
- echo "No active worktrees."
344
- echo ""
345
- echo "Create one with:"
346
- echo " ./scripts/worktree-manager.sh create <name> <branch>"
347
- return
348
- fi
349
-
350
- for wt in "$WORKTREE_ROOT"/*/; do
351
- if [ -d "$wt" ]; then
352
- local WT_NAME=$(basename "$wt")
353
- echo "📁 $WT_NAME"
354
- echo " Path: $wt"
355
-
356
- # Show status for each configured repo
357
- for repo in $(get_repos); do
358
- if [ -d "$wt/$repo" ]; then
359
- local repo_type
360
- repo_type=$(get_repo_type "$repo")
361
- local branch=$(cd "$wt/$repo" && git branch --show-current 2>/dev/null || echo "unknown")
362
- local status_count=$(cd "$wt/$repo" && git status --short 2>/dev/null | wc -l | tr -d ' ')
363
- echo " $repo ($repo_type): $branch ($status_count uncommitted)"
364
- fi
365
- done
366
-
367
- # Check for session files that reference this worktree
368
- local found_session=""
369
- for sf in "$PROJECT_ROOT"/.session/*-session.md; do
370
- if [ -f "$sf" ] && grep -q "worktree: $WT_NAME" "$sf" 2>/dev/null; then
371
- found_session=$(basename "$sf")
372
- break
373
- fi
374
- done
375
- if [ -n "$found_session" ]; then
376
- echo " Session: ✅ .session/$found_session"
377
- else
378
- echo " Session: ❌ (no session file references this worktree)"
379
- fi
380
-
381
- # Show ports (from services config)
382
- local WT_INDEX=$(ls -1 "$WORKTREE_ROOT" 2>/dev/null | grep -n "^$WT_NAME$" | cut -d: -f1)
383
- WT_INDEX=${WT_INDEX:-1}
384
- if load_services_config; then
385
- local OFFSET=$((_PORT_OFFSET * WT_INDEX))
386
- local ports_display
387
- ports_display=$(python3 -c "
388
- import json
389
- services = $_SERVICES_JSON
390
- offset = $OFFSET
391
- parts = []
392
- for svc in services:
393
- name = svc['name']
394
- port = svc['base_port'] + offset
395
- parts.append(f'{name}={port}')
396
- print(', '.join(parts))
397
- " 2>/dev/null)
398
- echo " Ports: $ports_display"
399
- else
400
- echo " Ports: (no services configured)"
401
- fi
402
- echo ""
403
- fi
404
- done
405
- }
406
-
407
- get_ports() {
408
- local WT_NAME="$1"
409
-
410
- if [ -z "$WT_NAME" ]; then
411
- echo "# Usage: worktree-manager.sh ports <name>" >&2
412
- echo "# Outputs shell variables for service ports" >&2
413
- exit 1
414
- fi
415
-
416
- # Load services configuration
417
- if ! load_services_config; then
418
- echo "# No services configured in .claude/project/pennyfarthing-settings.yaml" >&2
419
- echo "# Add a 'services' section with 'definitions' array" >&2
420
- exit 1
421
- fi
422
-
423
- # Calculate port offset based on worktree index
424
- local WT_INDEX=$(ls -1 "$WORKTREE_ROOT" 2>/dev/null | grep -n "^$WT_NAME$" | cut -d: -f1)
425
- WT_INDEX=${WT_INDEX:-1}
426
- local OFFSET=$((_PORT_OFFSET * WT_INDEX))
427
-
428
- # Output worktree info
429
- echo "export WORKTREE_PATH=$WORKTREE_ROOT/$WT_NAME"
430
- echo "export WORKTREE_INDEX=$WT_INDEX"
431
- echo "export WORKTREE_PORT_OFFSET=$OFFSET"
432
-
433
- # Generate exports for each configured service
434
- python3 -c "
435
- import json
436
-
437
- services = $_SERVICES_JSON
438
- offset = $OFFSET
439
-
440
- for svc in services:
441
- env_var = svc.get('env_var', svc['name'].upper().replace(' ', '_').replace('-', '_') + '_PORT')
442
- port = svc['base_port'] + offset
443
- print(f'export {env_var}={port}')
444
- " 2>/dev/null
445
- }
446
-
447
- get_path() {
448
- local WT_NAME="$1"
449
-
450
- if [ -z "$WT_NAME" ]; then
451
- echo "❌ Usage: worktree-manager.sh cd <name>"
452
- exit 1
453
- fi
454
-
455
- local WT_PATH="$WORKTREE_ROOT/$WT_NAME"
456
-
457
- if [ ! -d "$WT_PATH" ]; then
458
- echo "❌ Worktree '$WT_NAME' not found" >&2
459
- exit 1
460
- fi
461
-
462
- echo "$WT_PATH"
463
- }
464
-
465
- # Main command dispatch
466
- case "${1:-help}" in
467
- create)
468
- create_worktree "$2" "$3" "$4"
469
- ;;
470
- remove|rm|delete)
471
- remove_worktree "$2"
472
- ;;
473
- list|ls)
474
- list_worktrees
475
- ;;
476
- status|st)
477
- show_status
478
- ;;
479
- ports)
480
- get_ports "$2"
481
- ;;
482
- cd|path)
483
- get_path "$2"
484
- ;;
485
- config)
486
- show_config
487
- ;;
488
- help|--help|-h)
489
- show_help
490
- ;;
491
- *)
492
- echo "❌ Unknown command: $1"
493
- echo ""
494
- show_help
495
- exit 1
496
- ;;
497
- esac
5
+ echo "DEPRECATED: worktree-manager.sh — use 'pf git worktree' instead" >&2
6
+ exec pf git worktree "$@"
@@ -6,22 +6,22 @@ Git hooks and Claude Code hooks.
6
6
 
7
7
  | Script | Purpose |
8
8
  |--------|---------|
9
- | `context-circuit-breaker.sh` | Claude hook: halt at context limit |
10
- | `context-warning.sh` | Claude hook: warn on high context |
9
+ | `pf hooks context-breaker` | Claude hook: halt at context limit |
10
+ | `pf hooks context-warning` | Claude hook: warn on high context |
11
11
  | `otel-auto-config.sh` | Claude hook: configure OTEL |
12
12
  | `post-merge.sh` | Git hook: post-merge actions |
13
13
  | `pre-commit.sh` | Git hook: branch protection, agent validation, sprint YAML validation |
14
- | `pre-edit-check.sh` | Claude hook: validate before edit |
14
+ | `pf hooks pre-edit-check` | Claude hook: validate before edit |
15
15
  | `pre-push.sh` | Git hook: pre-push validation |
16
- | `session-start.sh` | Claude hook: session start |
17
- | `session-stop.sh` | Claude hook: session stop |
16
+ | `pf hooks session-start` | Claude hook: session start |
17
+ | `pf hooks session-stop` | Claude hook: session stop |
18
18
 
19
19
  ## Installation
20
20
 
21
21
  Git hooks are installed via:
22
22
 
23
23
  ```bash
24
- .pennyfarthing/scripts/git/install-git-hooks.sh
24
+ pf git install-hooks
25
25
  ```
26
26
 
27
27
  Claude hooks are configured in `.claude/settings.json`.