@pennyfarthing/core 11.2.1 → 11.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/README.md +102 -42
  2. package/package.json +1 -1
  3. package/packages/core/dist/cli/commands/doctor-legacy.test.js +2 -2
  4. package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -1
  5. package/packages/core/dist/cli/commands/doctor.d.ts +55 -0
  6. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  7. package/packages/core/dist/cli/commands/doctor.js +324 -50
  8. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  9. package/packages/core/dist/cli/commands/init.d.ts +12 -0
  10. package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
  11. package/packages/core/dist/cli/commands/init.js +45 -0
  12. package/packages/core/dist/cli/commands/init.js.map +1 -1
  13. package/packages/core/dist/cli/commands/pyproject-install.test.d.ts +19 -0
  14. package/packages/core/dist/cli/commands/pyproject-install.test.d.ts.map +1 -0
  15. package/packages/core/dist/cli/commands/pyproject-install.test.js +261 -0
  16. package/packages/core/dist/cli/commands/pyproject-install.test.js.map +1 -0
  17. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts +17 -0
  18. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts.map +1 -0
  19. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js +470 -0
  20. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js.map +1 -0
  21. package/packages/core/dist/cli/commands/update-consolidation.test.js +14 -6
  22. package/packages/core/dist/cli/commands/update-consolidation.test.js.map +1 -1
  23. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  24. package/packages/core/dist/cli/commands/update.js +31 -2
  25. package/packages/core/dist/cli/commands/update.js.map +1 -1
  26. package/packages/core/dist/cli/index.js +2 -0
  27. package/packages/core/dist/cli/index.js.map +1 -1
  28. package/packages/core/dist/cli/utils/python.d.ts.map +1 -1
  29. package/packages/core/dist/cli/utils/python.js +11 -0
  30. package/packages/core/dist/cli/utils/python.js.map +1 -1
  31. package/packages/core/dist/cli/utils/settings-hook-migration.test.d.ts +17 -0
  32. package/packages/core/dist/cli/utils/settings-hook-migration.test.d.ts.map +1 -0
  33. package/packages/core/dist/cli/utils/settings-hook-migration.test.js +382 -0
  34. package/packages/core/dist/cli/utils/settings-hook-migration.test.js.map +1 -0
  35. package/packages/core/dist/cli/utils/settings.d.ts +0 -4
  36. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  37. package/packages/core/dist/cli/utils/settings.js +45 -27
  38. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  39. package/packages/core/dist/cli/utils/stale-artifacts.d.ts +59 -0
  40. package/packages/core/dist/cli/utils/stale-artifacts.d.ts.map +1 -0
  41. package/packages/core/dist/cli/utils/stale-artifacts.js +163 -0
  42. package/packages/core/dist/cli/utils/stale-artifacts.js.map +1 -0
  43. package/packages/core/dist/consultation/dialogue-manager.d.ts +1 -1
  44. package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -1
  45. package/packages/core/dist/consultation/dialogue-manager.js +1 -1
  46. package/packages/core/dist/consultation/dialogue-manager.js.map +1 -1
  47. package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -1
  48. package/packages/core/dist/consultation/tandem-metrics.test.js.map +1 -1
  49. package/packages/core/dist/public/css/react.css +1 -1
  50. package/packages/core/dist/public/js/react/react.js +9 -9
  51. package/packages/core/dist/server/api/git.d.ts.map +1 -1
  52. package/packages/core/dist/server/api/git.js +0 -1
  53. package/packages/core/dist/server/api/git.js.map +1 -1
  54. package/packages/core/dist/server/api/index.d.ts +2 -0
  55. package/packages/core/dist/server/api/index.d.ts.map +1 -1
  56. package/packages/core/dist/server/api/index.js +2 -0
  57. package/packages/core/dist/server/api/index.js.map +1 -1
  58. package/packages/core/dist/server/api/project-info.d.ts +11 -0
  59. package/packages/core/dist/server/api/project-info.d.ts.map +1 -0
  60. package/packages/core/dist/server/api/project-info.js +18 -0
  61. package/packages/core/dist/server/api/project-info.js.map +1 -0
  62. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  63. package/packages/core/dist/server/otlp-receiver.js +18 -1
  64. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  65. package/packages/core/dist/server/otlp-receiver.test.js +1 -1
  66. package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
  67. package/packages/core/dist/server/server.d.ts.map +1 -1
  68. package/packages/core/dist/server/server.js +3 -2
  69. package/packages/core/dist/server/server.js.map +1 -1
  70. package/packages/core/dist/server/server.test.d.ts +1 -1
  71. package/packages/core/dist/server/server.test.js +8 -8
  72. package/packages/core/dist/server/settings.d.ts +1 -0
  73. package/packages/core/dist/server/settings.d.ts.map +1 -1
  74. package/packages/core/dist/server/settings.js +18 -0
  75. package/packages/core/dist/server/settings.js.map +1 -1
  76. package/packages/core/dist/workflow/tandem-workflow-templates.test.js +7 -5
  77. package/packages/core/dist/workflow/tandem-workflow-templates.test.js.map +1 -1
  78. package/packages/core/dist/workflow/workflow-migration.test.js +6 -5
  79. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
  80. package/packages/core/dist/workflow/workflow-team-templates.test.d.ts +17 -0
  81. package/packages/core/dist/workflow/workflow-team-templates.test.d.ts.map +1 -0
  82. package/packages/core/dist/workflow/workflow-team-templates.test.js +275 -0
  83. package/packages/core/dist/workflow/workflow-team-templates.test.js.map +1 -0
  84. package/pennyfarthing-dist/agents/dev.md +19 -4
  85. package/pennyfarthing-dist/agents/devops.md +2 -10
  86. package/pennyfarthing-dist/agents/reviewer-preflight.md +4 -5
  87. package/pennyfarthing-dist/agents/reviewer.md +17 -4
  88. package/pennyfarthing-dist/agents/sm-finish.md +1 -1
  89. package/pennyfarthing-dist/agents/sm-setup.md +7 -7
  90. package/pennyfarthing-dist/agents/sm.md +16 -29
  91. package/pennyfarthing-dist/agents/tea.md +2 -2
  92. package/pennyfarthing-dist/agents/testing-runner.md +1 -1
  93. package/pennyfarthing-dist/commands/pf-architect.md +1 -1
  94. package/pennyfarthing-dist/commands/pf-ba.md +1 -1
  95. package/pennyfarthing-dist/commands/pf-chore.md +2 -2
  96. package/pennyfarthing-dist/commands/pf-dev.md +1 -1
  97. package/pennyfarthing-dist/commands/pf-devops.md +1 -1
  98. package/pennyfarthing-dist/commands/pf-epic.md +6 -6
  99. package/pennyfarthing-dist/commands/pf-git.md +10 -10
  100. package/pennyfarthing-dist/commands/pf-health-check.md +31 -12
  101. package/pennyfarthing-dist/commands/pf-help.md +12 -12
  102. package/pennyfarthing-dist/commands/pf-orchestrator.md +1 -1
  103. package/pennyfarthing-dist/commands/pf-pm.md +1 -1
  104. package/pennyfarthing-dist/commands/pf-prime.md +8 -8
  105. package/pennyfarthing-dist/commands/pf-reviewer.md +1 -1
  106. package/pennyfarthing-dist/commands/pf-session.md +7 -7
  107. package/pennyfarthing-dist/commands/pf-sm.md +1 -1
  108. package/pennyfarthing-dist/commands/pf-sprint.md +7 -7
  109. package/pennyfarthing-dist/commands/pf-tea.md +1 -1
  110. package/pennyfarthing-dist/commands/pf-tech-writer.md +1 -1
  111. package/pennyfarthing-dist/commands/pf-theme.md +9 -9
  112. package/pennyfarthing-dist/commands/pf-ux-designer.md +1 -1
  113. package/pennyfarthing-dist/commands/pf-work.md +1 -1
  114. package/pennyfarthing-dist/gates/{confidence-sm.md → confidence.md} +16 -17
  115. package/pennyfarthing-dist/gates/dev-exit.md +75 -0
  116. package/pennyfarthing-dist/gates/merge-ready.md +49 -0
  117. package/pennyfarthing-dist/gates/release-ready.md +95 -0
  118. package/pennyfarthing-dist/gates/reviewer-preflight-check.md +90 -0
  119. package/pennyfarthing-dist/gates/sm-setup-exit.md +82 -0
  120. package/pennyfarthing-dist/guides/agent-behavior.md +129 -20
  121. package/pennyfarthing-dist/guides/agent-coordination.md +10 -10
  122. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
  123. package/pennyfarthing-dist/guides/agent-template-tactical.md +1 -1
  124. package/pennyfarthing-dist/guides/bell-mode.md +1 -1
  125. package/pennyfarthing-dist/guides/bikerack.md +10 -10
  126. package/pennyfarthing-dist/guides/brownfield-tools.md +24 -24
  127. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +1 -1
  128. package/pennyfarthing-dist/guides/gate-schema.md +2 -2
  129. package/pennyfarthing-dist/guides/gates.md +10 -5
  130. package/pennyfarthing-dist/guides/handoff-cli.md +8 -8
  131. package/pennyfarthing-dist/guides/hooks.md +27 -27
  132. package/pennyfarthing-dist/guides/prime.md +2 -2
  133. package/pennyfarthing-dist/guides/reflector.md +1 -1
  134. package/pennyfarthing-dist/guides/skill-schema.md +6 -6
  135. package/pennyfarthing-dist/guides/tandem-protocol.md +3 -3
  136. package/pennyfarthing-dist/guides/workflow-schema.md +1 -1
  137. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  138. package/pennyfarthing-dist/guides/xml-tags.md +8 -8
  139. package/pennyfarthing-dist/scripts/README.md +4 -4
  140. package/pennyfarthing-dist/scripts/core/agent-session.sh +2 -5
  141. package/pennyfarthing-dist/scripts/core/check-context.sh +1 -1
  142. package/pennyfarthing-dist/scripts/core/pf.sh +5 -0
  143. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +2 -5
  144. package/pennyfarthing-dist/scripts/core/prime.sh +2 -25
  145. package/pennyfarthing-dist/scripts/git/README.md +14 -14
  146. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +2 -3
  147. package/pennyfarthing-dist/scripts/git/git-status-all.sh +2 -3
  148. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +2 -3
  149. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +2 -4
  150. package/pennyfarthing-dist/scripts/hooks/README.md +6 -6
  151. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +3 -3
  152. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +3 -3
  153. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +3 -3
  154. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -3
  155. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +5 -4
  156. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +2 -1
  157. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +3 -3
  158. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -3
  159. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +3 -3
  160. package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -3
  161. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +3 -3
  162. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +3 -3
  163. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +3 -4
  164. package/pennyfarthing-dist/scripts/lib/env.sh +34 -0
  165. package/pennyfarthing-dist/scripts/lib/find-root.sh +5 -0
  166. package/pennyfarthing-dist/scripts/lib/run-pf.sh +43 -0
  167. package/pennyfarthing-dist/scripts/misc/README.md +1 -1
  168. package/pennyfarthing-dist/scripts/misc/statusline.sh +3 -3
  169. package/pennyfarthing-dist/scripts/sprint/README.md +21 -21
  170. package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
  171. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +2 -16
  172. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +3 -3
  173. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +3 -3
  174. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +3 -3
  175. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +3 -3
  176. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +3 -3
  177. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +3 -3
  178. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +3 -3
  179. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +3 -3
  180. package/pennyfarthing-dist/skills/pf-bc/examples.md +23 -23
  181. package/pennyfarthing-dist/skills/pf-bc/skill.md +17 -17
  182. package/pennyfarthing-dist/skills/pf-bc/usage.md +8 -8
  183. package/pennyfarthing-dist/skills/pf-jira/SKILL.md +15 -15
  184. package/pennyfarthing-dist/skills/pf-jira/examples.md +48 -48
  185. package/pennyfarthing-dist/skills/pf-jira/usage.md +15 -15
  186. package/pennyfarthing-dist/skills/pf-settings/skill.md +42 -0
  187. package/pennyfarthing-dist/skills/pf-sprint/examples.md +80 -80
  188. package/pennyfarthing-dist/skills/pf-sprint/skill.md +35 -35
  189. package/pennyfarthing-dist/skills/pf-sprint/usage.md +30 -30
  190. package/pennyfarthing-dist/skills/pf-theme/examples.md +15 -15
  191. package/pennyfarthing-dist/skills/pf-theme/skill.md +6 -6
  192. package/pennyfarthing-dist/skills/pf-theme/usage.md +5 -5
  193. package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -27
  194. package/pennyfarthing-dist/skills/pf-workflow/skill.md +11 -11
  195. package/pennyfarthing-dist/skills/pf-workflow/usage.md +11 -11
  196. package/pennyfarthing-dist/skills/skill-registry.yaml +34 -19
  197. package/pennyfarthing-dist/templates/pyproject.toml +27 -0
  198. package/pennyfarthing-dist/templates/settings.local.json.template +11 -11
  199. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +7 -3
  200. package/pennyfarthing-dist/workflows/bdd-team.yaml +89 -0
  201. package/pennyfarthing-dist/workflows/bdd.yaml +7 -3
  202. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +1 -1
  203. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
  204. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
  205. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  206. package/pennyfarthing-dist/workflows/installation-check/steps/step-01-foundation.md +77 -0
  207. package/pennyfarthing-dist/workflows/installation-check/steps/step-02-commands.md +82 -0
  208. package/pennyfarthing-dist/workflows/installation-check/steps/step-03-hooks.md +121 -0
  209. package/pennyfarthing-dist/workflows/installation-check/steps/step-04-scripts.md +83 -0
  210. package/pennyfarthing-dist/workflows/installation-check/steps/step-05-layout.md +81 -0
  211. package/pennyfarthing-dist/workflows/installation-check/steps/step-06-legacy.md +94 -0
  212. package/pennyfarthing-dist/workflows/installation-check/steps/step-07-tools.md +80 -0
  213. package/pennyfarthing-dist/workflows/installation-check/steps/step-08-summary.md +99 -0
  214. package/pennyfarthing-dist/workflows/installation-check/workflow.yaml +47 -0
  215. package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +47 -0
  216. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +7 -3
  217. package/pennyfarthing-dist/workflows/tdd-team.yaml +80 -0
  218. package/pennyfarthing-dist/workflows/tdd.yaml +7 -3
  219. package/pennyfarthing-dist/workflows/trivial.yaml +7 -3
  220. package/pennyfarthing_scripts/__init__.py +1 -1
  221. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  222. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  223. package/pennyfarthing_scripts/__pycache__/cli.cpython-311.pyc +0 -0
  224. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  225. package/pennyfarthing_scripts/__pycache__/context.cpython-311.pyc +0 -0
  226. package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-311.pyc +0 -0
  228. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-311.pyc +0 -0
  229. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-311.pyc +0 -0
  231. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/bc/__pycache__/split.cpython-314.pyc +0 -0
  233. package/pennyfarthing_scripts/bc/cli.py +23 -2
  234. package/pennyfarthing_scripts/bc/focus.py +1 -0
  235. package/pennyfarthing_scripts/bc/split.py +52 -0
  236. package/pennyfarthing_scripts/bellmode_hook.py +2 -5
  237. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-311.pyc +0 -0
  238. package/pennyfarthing_scripts/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
  239. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  240. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  241. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  242. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-311.pyc +0 -0
  243. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  244. package/pennyfarthing_scripts/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
  245. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  247. package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-311.pyc +0 -0
  250. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  256. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  257. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/bikerack/audit_log_panel.py +48 -6
  259. package/pennyfarthing_scripts/bikerack/context_meter_footer.py +53 -3
  260. package/pennyfarthing_scripts/bikerack/launcher.py +6 -6
  261. package/pennyfarthing_scripts/bikerack/progress_panel.py +0 -1
  262. package/pennyfarthing_scripts/bikerack/sprint_panel.py +1 -1
  263. package/pennyfarthing_scripts/bikerack/story_detail_data.py +4 -1
  264. package/pennyfarthing_scripts/bikerack/story_detail_screen.py +2 -1
  265. package/pennyfarthing_scripts/bikerack/tui.py +214 -10
  266. package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
  267. package/pennyfarthing_scripts/cli.py +5 -0
  268. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-311.pyc +0 -0
  269. package/pennyfarthing_scripts/common/__pycache__/config.cpython-311.pyc +0 -0
  270. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  271. package/pennyfarthing_scripts/common/__pycache__/output.cpython-311.pyc +0 -0
  272. package/pennyfarthing_scripts/common/__pycache__/pr_config.cpython-314.pyc +0 -0
  273. package/pennyfarthing_scripts/common/config.py +29 -2
  274. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-311.pyc +0 -0
  275. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-311.pyc +0 -0
  277. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  278. package/pennyfarthing_scripts/consultation/cli.py +3 -3
  279. package/pennyfarthing_scripts/context.py +3 -3
  280. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-311.pyc +0 -0
  281. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-311.pyc +0 -0
  282. package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-311.pyc +0 -0
  283. package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-311.pyc +0 -0
  284. package/pennyfarthing_scripts/git/hooks_installer.py +2 -3
  285. package/pennyfarthing_scripts/git/status_all.py +1 -1
  286. package/pennyfarthing_scripts/git/worktree.py +2 -2
  287. package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-311.pyc +0 -0
  288. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-311.pyc +0 -0
  289. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-311.pyc +0 -0
  291. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-311.pyc +0 -0
  292. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  293. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  294. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  295. package/pennyfarthing_scripts/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  296. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  297. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-311.pyc +0 -0
  298. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-311.pyc +0 -0
  299. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-311.pyc +0 -0
  300. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-311.pyc +0 -0
  301. package/pennyfarthing_scripts/hooks/__init__.py +8 -3
  302. package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  303. package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  304. package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-311.pyc +0 -0
  305. package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  306. package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-311.pyc +0 -0
  307. package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-311.pyc +0 -0
  309. package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-311.pyc +0 -0
  311. package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-311.pyc +0 -0
  313. package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  314. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-311.pyc +0 -0
  315. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  316. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-311.pyc +0 -0
  317. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  318. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-311.pyc +0 -0
  319. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  320. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-311.pyc +0 -0
  321. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  322. package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  323. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-311.pyc +0 -0
  324. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  325. package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-311.pyc +0 -0
  326. package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  327. package/pennyfarthing_scripts/hooks/bell_mode.py +0 -1
  328. package/pennyfarthing_scripts/hooks/pre_edit_check.py +0 -1
  329. package/pennyfarthing_scripts/hooks/reflector_check.py +1 -2
  330. package/pennyfarthing_scripts/hooks/schema_validation.py +0 -1
  331. package/pennyfarthing_scripts/hooks/session_start.py +6 -8
  332. package/pennyfarthing_scripts/hooks/statusline.py +10 -1
  333. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-311.pyc +0 -0
  334. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-311.pyc +0 -0
  335. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-311.pyc +0 -0
  336. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-311.pyc +0 -0
  337. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-311.pyc +0 -0
  338. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-311.pyc +0 -0
  339. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-311.pyc +0 -0
  340. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-311.pyc +0 -0
  341. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-311.pyc +0 -0
  342. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-311.pyc +0 -0
  343. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-311.pyc +0 -0
  344. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-311.pyc +0 -0
  345. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-311.pyc +0 -0
  346. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-311.pyc +0 -0
  347. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-311.pyc +0 -0
  348. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-311.pyc +0 -0
  349. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-311.pyc +0 -0
  350. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  351. package/pennyfarthing_scripts/prime/heatmap.py +3 -15
  352. package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-311.pyc +0 -0
  353. package/pennyfarthing_scripts/session/__pycache__/cli.cpython-311.pyc +0 -0
  354. package/pennyfarthing_scripts/settings/__init__.py +0 -0
  355. package/pennyfarthing_scripts/settings/__pycache__/__init__.cpython-314.pyc +0 -0
  356. package/pennyfarthing_scripts/settings/__pycache__/cli.cpython-314.pyc +0 -0
  357. package/pennyfarthing_scripts/settings/__pycache__/settings.cpython-314.pyc +0 -0
  358. package/pennyfarthing_scripts/settings/cli.py +55 -0
  359. package/pennyfarthing_scripts/settings/settings.py +98 -0
  360. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-311.pyc +0 -0
  361. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-311.pyc +0 -0
  362. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-311.pyc +0 -0
  363. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  364. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-311.pyc +0 -0
  365. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-311.pyc +0 -0
  366. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-311.pyc +0 -0
  367. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  368. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-311.pyc +0 -0
  369. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-311.pyc +0 -0
  370. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  371. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-311.pyc +0 -0
  372. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  373. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-311.pyc +0 -0
  374. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-311.pyc +0 -0
  375. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-311.pyc +0 -0
  376. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-311.pyc +0 -0
  377. package/pennyfarthing_scripts/sprint/cli.py +121 -0
  378. package/pennyfarthing_scripts/sprint/loader.py +154 -3
  379. package/pennyfarthing_scripts/sprint/story_update.py +7 -0
  380. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  381. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  382. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  383. package/pennyfarthing_scripts/tests/test_bikerack.py +26 -26
  384. package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +17 -16
  385. package/pennyfarthing_scripts/tests/test_dialogue_manager.py +0 -1
  386. package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +45 -47
  387. package/pennyfarthing_scripts/tests/test_workflow_list_team.py +143 -0
  388. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-311.pyc +0 -0
  389. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-311.pyc +0 -0
  390. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-311.pyc +0 -0
  391. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-311.pyc +0 -0
  392. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  393. package/pennyfarthing_scripts/validate/adapters/team_mode.py +323 -0
  394. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-311.pyc +0 -0
  395. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  396. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-311.pyc +0 -0
  397. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  398. package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  399. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-311.pyc +0 -0
  400. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  401. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-311.pyc +0 -0
  402. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
  403. package/pennyfarthing_scripts/workflow/cli.py +15 -14
  404. package/pennyfarthing_scripts/workflow/state.py +0 -1
  405. package/pennyfarthing_scripts/workflow/team_lifecycle.py +3 -4
@@ -0,0 +1,94 @@
1
+ # Step 6: Legacy Artifact Cleanup
2
+
3
+ <step-meta>
4
+ step: 6
5
+ name: legacy
6
+ workflow: installation-check
7
+ agent: devops
8
+ gate: true
9
+ next: step-07-tools
10
+ </step-meta>
11
+
12
+ <purpose>
13
+ Detect and clean up legacy artifacts from previous Pennyfarthing versions. These include old statusline scripts, persona configs at deprecated paths, legacy sidecar directories, and hook commands still using `.sh` scripts instead of `pf hooks` commands. This step has a gate because some fixes delete files.
14
+ </purpose>
15
+
16
+ <prerequisites>
17
+ - Layout check completed (step 5)
18
+ - User understands current vs legacy file locations
19
+ </prerequisites>
20
+
21
+ <instructions>
22
+ 1. Run the doctor command for the legacy category
23
+ 2. For each result, explain what the legacy artifact is and why it should be cleaned up:
24
+ - **legacy/.claude/scripts/statusline.sh**: Old statusline location that may shadow the proper `.pennyfarthing/scripts/misc/statusline.sh`.
25
+ - **legacy/.claude/persona-config.yaml**: Pre-v7 theme config. Should be migrated to `.pennyfarthing/config.local.yaml`.
26
+ - **legacy/.claude/project/agents/sidecars**: Pre-v8 sidecar location. Should be at `.pennyfarthing/sidecars/`.
27
+ - **legacy/sprint/sidecars**: Another pre-v8 sidecar location.
28
+ - **legacy/.claude/project/hooks/setup-env.sh**: Pre-v9 hook location. Should be at `.pennyfarthing/project/hooks/`.
29
+ - **settings/statusline-path**: settings.local.json references a legacy statusline script path.
30
+ - **legacy/hook-commands**: Hook entries in settings.local.json still use `.sh` script paths instead of `pf hooks` commands. The `.sh` scripts work (they're shims) but `pf hooks` is faster — no shell indirection.
31
+ 3. For each fix, explain what will be deleted or moved and whether it's reversible
32
+ 4. Present gate criteria — user must approve before files are deleted
33
+
34
+ **IMPORTANT:** Legacy cleanup deletes files. The user may have customized legacy locations. Always explain what will be removed before applying fixes.
35
+ </instructions>
36
+
37
+ <actions>
38
+ - Run: `pennyfarthing doctor --json --category legacy`
39
+ - Check: No legacy artifacts at `.claude/scripts/`, `.claude/persona-config.yaml`
40
+ - Check: No legacy sidecar directories
41
+ - Check: Hook commands use `pf hooks` not `.sh` scripts
42
+ </actions>
43
+
44
+ <output>
45
+ Present results:
46
+
47
+ ```markdown
48
+ ## Legacy Artifact Check Results
49
+
50
+ | Artifact | Status | Detail |
51
+ |----------|--------|--------|
52
+ | statusline.sh | ... | ... |
53
+ | persona-config.yaml | ... | ... |
54
+ | agent sidecars | ... | ... |
55
+ | sprint sidecars | ... | ... |
56
+ | project hooks | ... | ... |
57
+ | statusline path | ... | ... |
58
+ | hook commands | ... | ... |
59
+
60
+ ### Cleanup Actions
61
+ [For each warning, explain what the fix will do: delete, move, or update]
62
+ ```
63
+ </output>
64
+
65
+ <gate>
66
+ ## Completion Criteria
67
+ - [ ] All legacy artifacts reviewed with user
68
+ - [ ] User understands what each cleanup action will do
69
+ - [ ] User approved or declined each destructive cleanup
70
+ - [ ] No unapproved file deletions performed
71
+ </gate>
72
+
73
+ <collaboration-menu>
74
+ - **[F] Fix** - Run `pennyfarthing doctor --fix --category legacy` to clean up (requires gate approval)
75
+ - **[E] Explain** - Deep dive on a specific legacy artifact's history
76
+ - **[C] Continue** - Approve cleanup and proceed to Tools check
77
+ - **[R] Recheck** - Re-run after manual cleanup
78
+ </collaboration-menu>
79
+
80
+ <next-step>
81
+ After user approves legacy cleanup, proceed to step-07-tools.md for Optional Tools verification.
82
+ </next-step>
83
+
84
+ ## Failure Modes
85
+
86
+ - Deleting customized legacy files without checking for user modifications
87
+ - Not explaining that `.sh` shims still work (migration is optional optimization)
88
+ - Removing sidecar directories before confirming new location has the content
89
+
90
+ ## Success Metrics
91
+
92
+ - All legacy artifacts addressed (cleaned up or acknowledged)
93
+ - User made informed decisions about each cleanup action
94
+ - Gate approval recorded
@@ -0,0 +1,80 @@
1
+ # Step 7: Optional Tools
2
+
3
+ <step-meta>
4
+ step: 7
5
+ name: tools
6
+ workflow: installation-check
7
+ agent: devops
8
+ gate: false
9
+ next: step-08-summary
10
+ </step-meta>
11
+
12
+ <purpose>
13
+ Check optional components that enhance but are not required for core Pennyfarthing functionality. These include the Cyclist visual terminal and the pf Python CLI.
14
+ </purpose>
15
+
16
+ <prerequisites>
17
+ - Core installation verified (steps 1-6)
18
+ </prerequisites>
19
+
20
+ <instructions>
21
+ 1. Run the doctor command for the tools category
22
+ 2. For each result, explain what the tool provides and when it's needed:
23
+ - **cyclist/installed**: Cyclist is the Electron visual terminal for Pennyfarthing. It provides a graphical UI with panels for sprint tracking, diffs, workflow visualization, and more. Not required for CLI-only usage.
24
+ - **cyclist/node-pty**: node-pty powers the terminal panel in Cyclist. Without it, the embedded terminal won't work but other panels still function.
25
+ - **cyclist/spawn-helper**: The native binary that node-pty uses to spawn processes. Must have execute permission on macOS/Linux. Missing permission causes `posix_spawnp` failures.
26
+ - **tools/pf-cli**: The Python `pf` command provides agent activation (`pf agent start`), hook dispatch (`pf hooks`), and sprint management. Required for agent workflows. Installable via `uv tool install pennyfarthing-scripts` or `pipx install pennyfarthing-scripts`.
27
+ 3. For missing tools, explain whether they're required or optional based on the user's workflow
28
+ 4. Present the collaboration menu
29
+ </instructions>
30
+
31
+ <actions>
32
+ - Run: `pennyfarthing doctor --json --category tools`
33
+ - Check: Cyclist package location and node-pty health
34
+ - Check: `pf` CLI is available and reports a version
35
+ </actions>
36
+
37
+ <output>
38
+ Present results:
39
+
40
+ ```markdown
41
+ ## Optional Tools Check Results
42
+
43
+ ### Cyclist Visual Terminal
44
+ | Check | Status | Detail |
45
+ |-------|--------|--------|
46
+ | installed | ... | ... |
47
+ | node-pty | ... | ... |
48
+ | spawn-helper | ... | ... |
49
+
50
+ ### Python CLI
51
+ | Check | Status | Detail |
52
+ |-------|--------|--------|
53
+ | pf CLI | ... | ... |
54
+
55
+ ### Recommendation
56
+ [Based on results, recommend which tools to install for the user's use case]
57
+ ```
58
+ </output>
59
+
60
+ <collaboration-menu>
61
+ - **[F] Fix** - Run `pennyfarthing doctor --fix --category tools` to fix permissions or install pf CLI
62
+ - **[E] Explain** - Deep dive on a specific tool's purpose
63
+ - **[C] Continue** - Proceed to Summary
64
+ - **[R] Recheck** - Re-run after installing tools
65
+ </collaboration-menu>
66
+
67
+ <next-step>
68
+ After reviewing tools, proceed to step-08-summary.md for the final health report.
69
+ </next-step>
70
+
71
+ ## Failure Modes
72
+
73
+ - Installing Cyclist when only CLI usage is needed (unnecessary complexity)
74
+ - spawn-helper permission issues after pnpm install (common on macOS)
75
+
76
+ ## Success Metrics
77
+
78
+ - User understands which tools they need
79
+ - Required tools (pf CLI) are installed
80
+ - Optional tools have clear install path if wanted
@@ -0,0 +1,99 @@
1
+ # Step 8: Health Summary
2
+
3
+ <step-meta>
4
+ step: 8
5
+ name: summary
6
+ workflow: installation-check
7
+ agent: devops
8
+ gate: false
9
+ next: complete
10
+ </step-meta>
11
+
12
+ <purpose>
13
+ Aggregate results from all previous steps into a final health report with an overall score and prioritized recommendations.
14
+ </purpose>
15
+
16
+ <prerequisites>
17
+ - All previous steps (1-7) completed
18
+ </prerequisites>
19
+
20
+ <instructions>
21
+ 1. Run the full doctor command to get a complete picture
22
+ 2. Aggregate results into a health score:
23
+ - **HEALTHY**: All checks pass (0 failures, 0 warnings)
24
+ - **GOOD**: No failures, some warnings (non-critical issues)
25
+ - **NEEDS_ATTENTION**: 1-3 failures (some features broken)
26
+ - **NEEDS_FIX**: 4+ failures (significant functionality impaired)
27
+ 3. Group remaining issues by priority:
28
+ - **Critical**: Failures that break core functionality (missing settings.local.json, broken symlinks, missing manifest)
29
+ - **Important**: Warnings that degrade features (missing hooks, stale commands, non-executable scripts)
30
+ - **Optional**: Informational items (legacy artifacts, missing optional tools)
31
+ 4. For each remaining issue, provide the specific fix command
32
+ 5. Write the summary to the output file if configured
33
+ 6. Suggest next steps based on the health score
34
+ </instructions>
35
+
36
+ <actions>
37
+ - Run: `pennyfarthing doctor --json`
38
+ - Write: `{output_file}` with full health report
39
+ </actions>
40
+
41
+ <output>
42
+ Present the final report:
43
+
44
+ ```markdown
45
+ # Pennyfarthing Health Report
46
+
47
+ **Project:** {project_root}
48
+ **Version:** {installed_version} / {package_version}
49
+ **Mode:** {installation_type}
50
+ **Health:** {HEALTHY | GOOD | NEEDS_ATTENTION | NEEDS_FIX}
51
+ **Score:** {pass_count}/{total_count} checks passing
52
+
53
+ ## Results by Category
54
+
55
+ | Category | Pass | Warn | Fail |
56
+ |----------|------|------|------|
57
+ | Installation | ... | ... | ... |
58
+ | Commands & Skills | ... | ... | ... |
59
+ | Hook Configuration | ... | ... | ... |
60
+ | Hook Scripts | ... | ... | ... |
61
+ | Directory Layout | ... | ... | ... |
62
+ | Legacy Artifacts | ... | ... | ... |
63
+ | Optional Tools | ... | ... | ... |
64
+
65
+ ## Remaining Issues (by priority)
66
+
67
+ ### Critical
68
+ [List failures with fix commands]
69
+
70
+ ### Important
71
+ [List warnings with fix commands]
72
+
73
+ ### Optional
74
+ [List informational items]
75
+
76
+ ## Recommended Next Steps
77
+ 1. [Based on health score]
78
+ 2. [Specific to findings]
79
+ ```
80
+ </output>
81
+
82
+ <collaboration-menu>
83
+ - **[F] Fix** - Run `pennyfarthing doctor --fix` to auto-repair all fixable issues
84
+ - **[E] Explain** - Deep dive on any remaining issue
85
+ - **[C] Continue** - Complete the health check workflow
86
+ - **[R] Recheck** - Run full check again to verify fixes
87
+ </collaboration-menu>
88
+
89
+ ## Failure Modes
90
+
91
+ - Reporting HEALTHY when critical issues were skipped in earlier steps
92
+ - Not prioritizing issues (user doesn't know what to fix first)
93
+
94
+ ## Success Metrics
95
+
96
+ - Complete health report generated
97
+ - All issues categorized by priority
98
+ - Clear next steps provided
99
+ - User has actionable path to resolve any remaining issues
@@ -0,0 +1,47 @@
1
+ # Installation Check Workflow
2
+ # Interactive health check with AI-guided explanation and remediation
3
+ #
4
+ # Flow: Foundation → Commands → Hooks (gate) → Scripts → Layout → Legacy (gate) → Tools → Summary
5
+ # Wraps `pennyfarthing doctor --category` for step-by-step guided verification
6
+ #
7
+ # Use for: onboarding, post-update verification, troubleshooting broken installs
8
+
9
+ workflow:
10
+ name: installation-check
11
+ description: Interactive installation health check with AI-guided remediation. Walks through each check category with explanation and targeted fixes.
12
+ version: "1.0.0"
13
+ type: stepped
14
+
15
+ steps:
16
+ path: ./steps/
17
+ pattern: step-{nn}-*.md
18
+
19
+ variables:
20
+ project_root: .
21
+ doctor_command: pennyfarthing doctor --json
22
+ output_file: .session/doctor-results.md
23
+
24
+ gates:
25
+ after_steps: [3, 6]
26
+ gate_marker: "<!-- GATE -->"
27
+
28
+ collaboration:
29
+ menus:
30
+ - key: F
31
+ name: Fix
32
+ description: Apply recommended fixes for this category
33
+ - key: E
34
+ name: Explain
35
+ description: Get detailed explanation of a specific check
36
+ - key: C
37
+ name: Continue
38
+ description: Proceed to next check category
39
+ - key: R
40
+ name: Recheck
41
+ description: Re-run checks after manual changes
42
+
43
+ agent: devops
44
+
45
+ triggers:
46
+ types: [installation-check, doctor, health-check]
47
+ tags: [installation, health, diagnostics]
@@ -20,6 +20,53 @@ Discover the project structure, detect repositories, identify tech stack, and ga
20
20
  - User-confirmed discovery ready for repos.yaml generation
21
21
  </output>
22
22
 
23
+ ## PRE-FLIGHT: Environment Check
24
+
25
+ Before discovery, verify the environment is clean.
26
+
27
+ ### Check for Global `pf` Installation
28
+
29
+ A globally installed `pf` CLI causes version drift between projects. All `pf`
30
+ invocations should go through `uv run` via the shell shims in `.pennyfarthing/scripts/`.
31
+
32
+ ```bash
33
+ # Check for global pf binary
34
+ which pf 2>/dev/null
35
+ ```
36
+
37
+ **If `which pf` returns a path**, the user has a stale global install. Guide them through removal:
38
+
39
+ 1. **Check the source** of the global install:
40
+ ```bash
41
+ which pf
42
+ head -3 "$(which pf)" 2>/dev/null
43
+ pip3 show pennyfarthing-scripts 2>/dev/null | grep -E "^(Version|Location|Editable)"
44
+ uv tool list 2>/dev/null | grep pennyfarthing
45
+ ```
46
+
47
+ 2. **Remove based on source:**
48
+
49
+ | Source | Command |
50
+ |--------|---------|
51
+ | `uv tool` | `uv tool uninstall pennyfarthing-scripts` |
52
+ | `pip` (Homebrew Python) | `pip3 uninstall pennyfarthing-scripts --break-system-packages -y` |
53
+ | `pip` (venv/system) | `pip3 uninstall pennyfarthing-scripts -y` |
54
+ | `pipx` | `pipx uninstall pennyfarthing-scripts` |
55
+
56
+ 3. **Verify removal:**
57
+ ```bash
58
+ hash -r # Clear shell cache
59
+ which pf 2>/dev/null && echo "STILL INSTALLED — check for multiple installs" || echo "Clean"
60
+ ```
61
+
62
+ 4. **Explain to user:** Pennyfarthing hooks use `uv run` to resolve `pf` from the
63
+ local project's `pyproject.toml`. This ensures each project runs its own version
64
+ of the CLI without cross-project contamination. No global install is needed.
65
+
66
+ **If `which pf` returns nothing**, the environment is clean — continue to discovery.
67
+
68
+ ---
69
+
23
70
  ## DISCOVERY TASKS
24
71
 
25
72
  ### 1. Detect Repository Structure
@@ -23,6 +23,10 @@ workflow:
23
23
  - name: setup
24
24
  agent: sm
25
25
  output: [session_file, branches, story_context]
26
+ gate:
27
+ file: gates/sm-setup-exit
28
+ type: sm_setup_exit
29
+ condition: Session file created with workflow, phase, context, and branch
26
30
 
27
31
  - name: red
28
32
  agent: tea
@@ -41,9 +45,9 @@ workflow:
41
45
  input: [failing_tests, story_context]
42
46
  output: [implementation, passing_tests]
43
47
  gate:
44
- file: gates/tests-pass
45
- type: tests_pass
46
- condition: All tests passing, no skipped tests
48
+ file: gates/dev-exit
49
+ type: dev_exit
50
+ condition: Tests green, tree clean, no debug code, correct branch
47
51
  tandem:
48
52
  partner: architect
49
53
  scope: file-watch
@@ -0,0 +1,80 @@
1
+ # TDD Team Workflow - TDD with Native Team Collaboration
2
+ #
3
+ # When to use: Best for 5+ point feature stories where sustained parallel
4
+ # collaboration provides more value than periodic tandem consultation.
5
+ # Use this instead of tdd-tandem when teammates need to work alongside the
6
+ # lead for the full phase — e.g., Architect reviewing patterns as Dev
7
+ # implements, not just answering a single question.
8
+ #
9
+ # Compared to tdd-tandem: Tandem spawns a Haiku subagent for a single
10
+ # request/response exchange. Team mode spawns full teammate sessions that
11
+ # work in parallel with the lead for the entire phase duration.
12
+ #
13
+ # Team pairings:
14
+ # - GREEN phase: Dev (lead) + Architect — Architect reviews implementation
15
+ # approach and patterns in real-time via SendMessage
16
+ # - REVIEW phase: Reviewer (lead) + Architect — Architect validates
17
+ # architectural patterns during code review
18
+ #
19
+ # Fallback: When native teams are unavailable (non-interactive mode, feature
20
+ # flag off, or CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS not set), phases with
21
+ # team blocks fall back to solo execution. The lead agent works alone —
22
+ # consider using tdd-tandem as an alternative that works in all modes.
23
+ #
24
+ # Flow: SM → TEA → Dev (+Architect) → Reviewer (+Architect) → SM
25
+
26
+ workflow:
27
+ name: tdd-team
28
+ description: TDD with native team collaboration — architect pairing on green and review phases
29
+ version: "1.0.0"
30
+
31
+ phases:
32
+ - name: setup
33
+ agent: sm
34
+ output: [session_file, branches, story_context]
35
+
36
+ - name: red
37
+ agent: tea
38
+ input: [session_file, story_context]
39
+ output: [failing_tests]
40
+ gate:
41
+ file: gates/tests-fail
42
+ type: tests_fail
43
+ condition: All acceptance criteria have test coverage
44
+
45
+ - name: green
46
+ agent: dev
47
+ input: [failing_tests, story_context]
48
+ output: [implementation, passing_tests]
49
+ gate:
50
+ file: gates/tests-pass
51
+ type: tests_pass
52
+ condition: All tests passing, no skipped tests
53
+ team:
54
+ teammates:
55
+ - agent: architect
56
+ task: "Review implementation approach and patterns. Send observations via SendMessage as Dev works."
57
+
58
+ - name: review
59
+ agent: reviewer
60
+ input: [implementation, passing_tests]
61
+ output: [approval]
62
+ gate:
63
+ file: gates/approval
64
+ type: approval
65
+ condition: Code review approved, no blocking issues
66
+ team:
67
+ teammates:
68
+ - agent: architect
69
+ task: "Validate architectural patterns and coupling. Flag concerns via SendMessage."
70
+
71
+ - name: finish
72
+ agent: sm
73
+ input: [approval]
74
+ output: [archived_session, story_summary]
75
+
76
+ triggers:
77
+ tags: [team, tdd-team]
78
+ points:
79
+ min: 5
80
+ default: false
@@ -13,6 +13,10 @@ workflow:
13
13
  - name: setup
14
14
  agent: sm
15
15
  output: [session_file, branches, story_context]
16
+ gate:
17
+ file: gates/sm-setup-exit
18
+ type: sm_setup_exit
19
+ condition: Session file created with workflow, phase, context, and branch
16
20
 
17
21
  - name: red
18
22
  agent: tea
@@ -28,9 +32,9 @@ workflow:
28
32
  input: [failing_tests, story_context]
29
33
  output: [implementation, passing_tests]
30
34
  gate:
31
- file: gates/tests-pass
32
- type: tests_pass
33
- condition: All tests passing, no skipped tests
35
+ file: gates/dev-exit
36
+ type: dev_exit
37
+ condition: Tests green, tree clean, no debug code, correct branch
34
38
 
35
39
  - name: verify
36
40
  agent: tea
@@ -13,15 +13,19 @@ workflow:
13
13
  - name: setup
14
14
  agent: sm
15
15
  output: [session_file, branches]
16
+ gate:
17
+ file: gates/sm-setup-exit
18
+ type: sm_setup_exit
19
+ condition: Session file created with workflow, phase, and branch
16
20
 
17
21
  - name: implement
18
22
  agent: dev
19
23
  input: [session_file]
20
24
  output: [implementation]
21
25
  gate:
22
- file: gates/tests-pass
23
- type: tests_pass
24
- condition: Existing tests still pass
26
+ file: gates/dev-exit
27
+ type: dev_exit
28
+ condition: Tests green, tree clean, no debug code, correct branch
25
29
 
26
30
  - name: review
27
31
  agent: reviewer
@@ -14,4 +14,4 @@ Modules:
14
14
  swebench: SWE-bench patch parsing and scenario utilities
15
15
  """
16
16
 
17
- __version__ = "7.6.1"
17
+ __version__ = "8.1.0"
@@ -29,12 +29,13 @@ from pennyfarthing_scripts.bc.focus import (
29
29
  save_named_layout,
30
30
  set_panel_focus,
31
31
  )
32
+ from pennyfarthing_scripts.bc.split import set_split_layout
32
33
 
33
34
 
34
35
  def _get_current_layout() -> dict | None:
35
36
  """Fetch the current layout from a running Cyclist or BikeRack server.
36
37
 
37
- Reads .wheelhub-port (shared by both Cyclist and BikeRack) and fetches
38
+ Reads .bikerack-port (shared by both Cyclist and BikeRack) and fetches
38
39
  the layout endpoint.
39
40
 
40
41
  Returns:
@@ -45,7 +46,7 @@ def _get_current_layout() -> dict | None:
45
46
  root = _get_root()
46
47
 
47
48
  candidates = [
48
- (root / ".wheelhub-port", "/api/settings/bikerack-layout"),
49
+ (root / ".bikerack-port", "/api/settings/bikerack-layout"),
49
50
  ]
50
51
 
51
52
  for port_file, endpoint in candidates:
@@ -206,6 +207,26 @@ def clear_layout(name: str, dry_run: bool):
206
207
  sys.exit(1)
207
208
 
208
209
 
210
+ @bc.command("split")
211
+ @click.argument("left")
212
+ @click.argument("right")
213
+ @click.option("--dry-run", is_flag=True, help="Show what would be done without making changes")
214
+ def split_layout(left: str, right: str, dry_run: bool):
215
+ """Set split-pane layout with LEFT and RIGHT panels.
216
+
217
+ Example: pf bc split sprint diffs
218
+ """
219
+ if dry_run:
220
+ click.echo(json.dumps({"dry_run": True, "action": "split", "left": left, "right": right}))
221
+ return
222
+ result = set_split_layout(left, right)
223
+ if result["success"]:
224
+ click.echo(json.dumps({"success": True, "split": result["data"]}))
225
+ else:
226
+ click.echo(json.dumps({"success": False, "error": result["error"]}), err=True)
227
+ sys.exit(1)
228
+
229
+
209
230
  @bc.command("clear-all")
210
231
  @click.option("--dry-run", is_flag=True, help="Show what would be done without making changes")
211
232
  def clear_all_layouts(dry_run: bool):
@@ -34,6 +34,7 @@ VALID_PANELS = [
34
34
  "changed",
35
35
  "ac",
36
36
  "debug",
37
+ "progress",
37
38
  "settings",
38
39
  "tty",
39
40
  ]
@@ -0,0 +1,52 @@
1
+ """Split layout management — read/write split config in config.local.yaml.
2
+
3
+ Story 110-4: /bc split <left> <right> command support.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from pathlib import Path
9
+
10
+ from pennyfarthing_scripts.bc.focus import (
11
+ VALID_PANELS,
12
+ _read_config,
13
+ _write_config,
14
+ )
15
+
16
+
17
+ def set_split_layout(
18
+ left: str, right: str, project_dir: Path | None = None
19
+ ) -> dict:
20
+ """Set split layout in config.local.yaml.
21
+
22
+ Args:
23
+ left: Panel for left pane (must be in VALID_PANELS).
24
+ right: Panel for right pane (must be in VALID_PANELS).
25
+ project_dir: Override project root (for testing).
26
+
27
+ Returns:
28
+ {success: bool, data?: dict, error?: str}
29
+ """
30
+ if left not in VALID_PANELS:
31
+ return {
32
+ "success": False,
33
+ "error": f"Invalid panel '{left}'. Valid panels: {', '.join(VALID_PANELS)}",
34
+ }
35
+ if right not in VALID_PANELS:
36
+ return {
37
+ "success": False,
38
+ "error": f"Invalid panel '{right}'. Valid panels: {', '.join(VALID_PANELS)}",
39
+ }
40
+ if left == right:
41
+ return {
42
+ "success": False,
43
+ "error": f"Left and right panels must be different (both are '{left}'). Use same panel in single mode instead.",
44
+ }
45
+
46
+ try:
47
+ config_path, config = _read_config(project_dir)
48
+ config["split"] = {"left": left, "right": right}
49
+ _write_config(config_path, config)
50
+ return {"success": True, "data": {"left": left, "right": right}}
51
+ except Exception as exc:
52
+ return {"success": False, "error": str(exc)}