@pennyfarthing/core 11.2.2 → 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 (448) hide show
  1. package/README.md +3 -3
  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 +204 -23
  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/cyclist-migration.test.d.ts +16 -0
  27. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
  28. package/packages/core/dist/cli/cyclist-migration.test.js +229 -0
  29. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
  30. package/packages/core/dist/cli/index.js +2 -0
  31. package/packages/core/dist/cli/index.js.map +1 -1
  32. package/packages/core/dist/cli/utils/python.d.ts.map +1 -1
  33. package/packages/core/dist/cli/utils/python.js +11 -0
  34. package/packages/core/dist/cli/utils/python.js.map +1 -1
  35. package/packages/core/dist/cli/utils/settings-hook-migration.test.d.ts +17 -0
  36. package/packages/core/dist/cli/utils/settings-hook-migration.test.d.ts.map +1 -0
  37. package/packages/core/dist/cli/utils/settings-hook-migration.test.js +382 -0
  38. package/packages/core/dist/cli/utils/settings-hook-migration.test.js.map +1 -0
  39. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  40. package/packages/core/dist/cli/utils/settings.js +15 -2
  41. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  42. package/packages/core/dist/cli/utils/stale-artifacts.d.ts +59 -0
  43. package/packages/core/dist/cli/utils/stale-artifacts.d.ts.map +1 -0
  44. package/packages/core/dist/cli/utils/stale-artifacts.js +163 -0
  45. package/packages/core/dist/cli/utils/stale-artifacts.js.map +1 -0
  46. package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
  47. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
  48. package/packages/core/dist/scripts/benchmark-integration.js +691 -0
  49. package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
  50. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -0
  51. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
  52. package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
  53. package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
  54. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +1 -0
  55. package/packages/core/dist/scripts/theme-detail.test.js.map +1 -0
  56. package/packages/core/dist/server/settings.d.ts.map +1 -1
  57. package/packages/core/dist/server/settings.js +5 -0
  58. package/packages/core/dist/server/settings.js.map +1 -1
  59. package/packages/core/dist/workflow/tandem-workflow-templates.test.js +7 -5
  60. package/packages/core/dist/workflow/tandem-workflow-templates.test.js.map +1 -1
  61. package/packages/core/dist/workflow/workflow-migration.test.js +6 -5
  62. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
  63. package/pennyfarthing-dist/agents/dev.md +4 -2
  64. package/pennyfarthing-dist/agents/devops.md +2 -10
  65. package/pennyfarthing-dist/agents/reviewer-preflight.md +4 -5
  66. package/pennyfarthing-dist/agents/sm.md +4 -17
  67. package/pennyfarthing-dist/commands/pf-health-check.md +30 -11
  68. package/pennyfarthing-dist/gates/{confidence-sm.md → confidence.md} +16 -17
  69. package/pennyfarthing-dist/gates/dev-exit.md +75 -0
  70. package/pennyfarthing-dist/gates/merge-ready.md +49 -0
  71. package/pennyfarthing-dist/gates/release-ready.md +95 -0
  72. package/pennyfarthing-dist/gates/reviewer-preflight-check.md +90 -0
  73. package/pennyfarthing-dist/gates/sm-setup-exit.md +82 -0
  74. package/pennyfarthing-dist/guides/agent-behavior.md +88 -30
  75. package/pennyfarthing-dist/guides/gates.md +7 -2
  76. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  77. package/pennyfarthing-dist/scripts/lib/find-root.sh +5 -0
  78. package/pennyfarthing-dist/scripts/lib/run-pf.sh +4 -0
  79. package/pennyfarthing-dist/skills/pf-settings/skill.md +42 -0
  80. package/pennyfarthing-dist/skills/skill-registry.yaml +15 -0
  81. package/pennyfarthing-dist/templates/pyproject.toml +27 -0
  82. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +7 -3
  83. package/pennyfarthing-dist/workflows/bdd.yaml +7 -3
  84. package/pennyfarthing-dist/workflows/installation-check/steps/step-01-foundation.md +77 -0
  85. package/pennyfarthing-dist/workflows/installation-check/steps/step-02-commands.md +82 -0
  86. package/pennyfarthing-dist/workflows/installation-check/steps/step-03-hooks.md +121 -0
  87. package/pennyfarthing-dist/workflows/installation-check/steps/step-04-scripts.md +83 -0
  88. package/pennyfarthing-dist/workflows/installation-check/steps/step-05-layout.md +81 -0
  89. package/pennyfarthing-dist/workflows/installation-check/steps/step-06-legacy.md +94 -0
  90. package/pennyfarthing-dist/workflows/installation-check/steps/step-07-tools.md +80 -0
  91. package/pennyfarthing-dist/workflows/installation-check/steps/step-08-summary.md +99 -0
  92. package/pennyfarthing-dist/workflows/installation-check/workflow.yaml +47 -0
  93. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +7 -3
  94. package/pennyfarthing-dist/workflows/tdd.yaml +7 -3
  95. package/pennyfarthing-dist/workflows/trivial.yaml +7 -3
  96. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  97. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  98. package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  99. package/pennyfarthing_scripts/__pycache__/cli.cpython-311.pyc +0 -0
  100. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  101. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  102. package/pennyfarthing_scripts/__pycache__/context.cpython-311.pyc +0 -0
  103. package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
  104. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  105. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  106. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  107. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  108. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  109. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  110. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  111. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  112. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  113. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  114. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  115. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  116. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  117. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  118. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-311.pyc +0 -0
  119. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  120. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-311.pyc +0 -0
  121. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  122. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-311.pyc +0 -0
  123. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  124. package/pennyfarthing_scripts/bc/__pycache__/split.cpython-314.pyc +0 -0
  125. package/pennyfarthing_scripts/bc/cli.py +21 -0
  126. package/pennyfarthing_scripts/bc/focus.py +1 -0
  127. package/pennyfarthing_scripts/bc/split.py +52 -0
  128. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-311.pyc +0 -0
  129. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  130. package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  131. package/pennyfarthing_scripts/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
  132. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  133. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  134. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  135. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-311.pyc +0 -0
  136. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  137. package/pennyfarthing_scripts/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
  138. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  139. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  140. package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  141. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  142. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-311.pyc +0 -0
  143. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  144. package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  145. package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  146. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  147. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  148. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  149. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  150. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  151. package/pennyfarthing_scripts/bikerack/context_meter_footer.py +53 -3
  152. package/pennyfarthing_scripts/bikerack/tui.py +202 -8
  153. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  154. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  155. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  156. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  157. package/pennyfarthing_scripts/cli.py +5 -0
  158. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  159. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  160. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  161. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  162. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  163. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  164. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-311.pyc +0 -0
  165. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  166. package/pennyfarthing_scripts/common/__pycache__/config.cpython-311.pyc +0 -0
  167. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  168. package/pennyfarthing_scripts/common/__pycache__/output.cpython-311.pyc +0 -0
  169. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  170. package/pennyfarthing_scripts/common/__pycache__/pr_config.cpython-314.pyc +0 -0
  171. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  172. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  173. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  174. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  175. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  176. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  177. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  178. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-311.pyc +0 -0
  179. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  180. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-311.pyc +0 -0
  181. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  182. package/pennyfarthing_scripts/consultation/__pycache__/dialogue_manager.cpython-314.pyc +0 -0
  183. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-311.pyc +0 -0
  184. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  185. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  186. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  187. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-311.pyc +0 -0
  188. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  189. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  190. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  191. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  192. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  193. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  194. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  195. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  196. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  197. package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-311.pyc +0 -0
  198. package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-311.pyc +0 -0
  200. package/pennyfarthing_scripts/epic/__pycache__/cli.cpython-314.pyc +0 -0
  201. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  202. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  203. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  204. package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-311.pyc +0 -0
  205. package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  206. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-311.pyc +0 -0
  207. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  208. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-311.pyc +0 -0
  209. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  210. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-311.pyc +0 -0
  211. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  212. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  213. package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  214. package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  215. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  216. package/pennyfarthing_scripts/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  217. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  218. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-311.pyc +0 -0
  219. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  220. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  221. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-311.pyc +0 -0
  222. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  223. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-311.pyc +0 -0
  224. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  225. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  226. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-311.pyc +0 -0
  227. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  228. package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  229. package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-311.pyc +0 -0
  231. package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-311.pyc +0 -0
  233. package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  234. package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-311.pyc +0 -0
  235. package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-311.pyc +0 -0
  237. package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  238. package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-311.pyc +0 -0
  239. package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  240. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-311.pyc +0 -0
  241. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  242. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-311.pyc +0 -0
  243. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  244. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-311.pyc +0 -0
  245. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-311.pyc +0 -0
  247. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-311.pyc +0 -0
  250. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-311.pyc +0 -0
  252. package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-311.pyc +0 -0
  254. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  256. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-311.pyc +0 -0
  257. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-311.pyc +0 -0
  259. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  260. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  261. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-311.pyc +0 -0
  262. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  263. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-311.pyc +0 -0
  264. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  265. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  266. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-311.pyc +0 -0
  267. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  268. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-311.pyc +0 -0
  269. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  270. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-311.pyc +0 -0
  271. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  272. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-311.pyc +0 -0
  273. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  274. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-311.pyc +0 -0
  276. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  277. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-311.pyc +0 -0
  278. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-311.pyc +0 -0
  282. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  283. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-311.pyc +0 -0
  284. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  285. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-311.pyc +0 -0
  286. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  287. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-311.pyc +0 -0
  288. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  289. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-311.pyc +0 -0
  290. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  291. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-311.pyc +0 -0
  292. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
  293. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  294. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  295. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  296. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  297. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  298. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  299. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  302. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  303. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  304. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  305. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  306. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  307. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  309. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  311. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  313. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  314. package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-311.pyc +0 -0
  315. package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
  316. package/pennyfarthing_scripts/session/__pycache__/cli.cpython-311.pyc +0 -0
  317. package/pennyfarthing_scripts/session/__pycache__/cli.cpython-314.pyc +0 -0
  318. package/pennyfarthing_scripts/settings/__init__.py +0 -0
  319. package/pennyfarthing_scripts/settings/__pycache__/__init__.cpython-314.pyc +0 -0
  320. package/pennyfarthing_scripts/settings/__pycache__/cli.cpython-314.pyc +0 -0
  321. package/pennyfarthing_scripts/settings/__pycache__/settings.cpython-314.pyc +0 -0
  322. package/pennyfarthing_scripts/settings/cli.py +55 -0
  323. package/pennyfarthing_scripts/settings/settings.py +98 -0
  324. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-311.pyc +0 -0
  325. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  326. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  327. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-311.pyc +0 -0
  328. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  329. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  330. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-311.pyc +0 -0
  331. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  332. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-311.pyc +0 -0
  333. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  334. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-311.pyc +0 -0
  335. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  336. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  337. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-311.pyc +0 -0
  338. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  339. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-311.pyc +0 -0
  340. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  341. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-311.pyc +0 -0
  342. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  343. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  344. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-311.pyc +0 -0
  345. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  346. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-311.pyc +0 -0
  347. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  348. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-311.pyc +0 -0
  349. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  350. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-311.pyc +0 -0
  351. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  352. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-311.pyc +0 -0
  353. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  354. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  355. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  356. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  357. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  358. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  359. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  360. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  361. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  362. package/pennyfarthing_scripts/tests/__pycache__/test_108_1_gate_migration.cpython-314-pytest-9.0.2.pyc +0 -0
  363. package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  364. package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  365. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  366. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  367. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  368. package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  369. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  370. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  371. package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
  372. package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
  373. package/pennyfarthing_scripts/tests/__pycache__/test_dialogue_manager.cpython-314-pytest-9.0.2.pyc +0 -0
  374. package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  375. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  376. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  377. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  378. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  379. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  380. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  381. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  382. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  383. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  384. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  385. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  386. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  387. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  388. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  389. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  390. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  391. package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  392. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  393. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  394. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  395. package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  396. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  397. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  398. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  399. package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +17 -16
  400. package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +45 -47
  401. package/pennyfarthing_scripts/tests/test_workflow_list_team.py +0 -4
  402. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-311.pyc +0 -0
  403. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  404. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-311.pyc +0 -0
  405. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  406. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-311.pyc +0 -0
  407. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  408. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-311.pyc +0 -0
  409. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  410. package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  411. package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  412. package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  413. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  414. package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  415. package/pennyfarthing_scripts/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
  416. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  417. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-311.pyc +0 -0
  418. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  419. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-311.pyc +0 -0
  420. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  421. package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  422. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-311.pyc +0 -0
  423. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  424. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-311.pyc +0 -0
  425. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
  426. package/packages/core/dist/workflow/team-lifecycle.d.ts +0 -169
  427. package/packages/core/dist/workflow/team-lifecycle.d.ts.map +0 -1
  428. package/packages/core/dist/workflow/team-lifecycle.js +0 -217
  429. package/packages/core/dist/workflow/team-lifecycle.js.map +0 -1
  430. package/packages/core/dist/workflow/team-lifecycle.test.d.ts +0 -20
  431. package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +0 -1
  432. package/packages/core/dist/workflow/team-lifecycle.test.js +0 -966
  433. package/packages/core/dist/workflow/team-lifecycle.test.js.map +0 -1
  434. package/pennyfarthing_scripts/bikerack/__pycache__/portrait.cpython-314.pyc +0 -0
  435. package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
  436. package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
  437. package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
  438. package/pennyfarthing_scripts/git/__pycache__/hooks_installer.cpython-314.pyc +0 -0
  439. package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
  440. package/pennyfarthing_scripts/git/__pycache__/worktree.cpython-314.pyc +0 -0
  441. package/pennyfarthing_scripts/prime/__pycache__/heatmap.cpython-314.pyc +0 -0
  442. package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
  443. package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
  444. package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
  445. package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
  446. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314-pytest-9.0.2.pyc +0 -0
  447. package/pennyfarthing_scripts/validate/adapters/__pycache__/team_mode.cpython-314.pyc +0 -0
  448. package/pennyfarthing_scripts/workflow/__pycache__/team_lifecycle.cpython-314.pyc +0 -0
@@ -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]
@@ -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
@@ -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
@@ -29,6 +29,7 @@ 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:
@@ -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)}
@@ -4,11 +4,15 @@ Story 110-5: Context meter footer bar. Displays context window usage
4
4
  percentage with color-coded tier thresholds, always visible at the
5
5
  bottom of the layout.
6
6
 
7
+ Story 110-12: Periodic refresh timer, event-driven redraws, and
8
+ throttling for more frequent updates without performance degradation.
9
+
7
10
  Subscribes to /ws/context WebSocket channel.
8
11
  """
9
12
 
10
13
  from __future__ import annotations
11
14
 
15
+ import time
12
16
  from typing import Any
13
17
 
14
18
  from rich.text import Text
@@ -35,34 +39,80 @@ class ContextMeterFooter(Static):
35
39
  #: WebSocket channel this footer subscribes to
36
40
  channel: str = "context"
37
41
 
42
+ #: Seconds between periodic refresh redraws
43
+ refresh_interval: float = 5.0
44
+
45
+ #: Minimum seconds between redraws (throttle)
46
+ min_redraw_interval: float = 0.25
47
+
38
48
  def __init__(self, client: Any = None, **kwargs: Any) -> None:
39
49
  super().__init__(**kwargs)
40
50
  self._client = client
41
51
  self._context_data: dict[str, Any] | None = None
42
52
  self._mounted = False
53
+ self._refresh_timer: Any = None
54
+ self._last_redraw_time: float = 0.0
55
+ self.last_update_time: float = 0.0
56
+
57
+ @property
58
+ def is_stale(self) -> bool:
59
+ """True if no context data has been received."""
60
+ return self._context_data is None
43
61
 
44
62
  def on_mount(self) -> None:
45
- """Subscribe to context channel on mount."""
63
+ """Subscribe to context channel and start periodic refresh on mount."""
46
64
  self._mounted = True
47
65
  if self._client is not None:
48
66
  self._client.subscribe("context", self.handle_context_message)
67
+ self._client.on_state_change(self.on_connection_state_change)
68
+ try:
69
+ self._refresh_timer = self.set_interval(
70
+ self.refresh_interval, self.request_refresh
71
+ )
72
+ except RuntimeError:
73
+ # No running event loop (e.g. unit tests calling on_mount directly)
74
+ pass
49
75
 
50
76
  def on_unmount(self) -> None:
51
- """Mark as unmounted so further messages are ignored."""
77
+ """Stop timer and mark as unmounted so further messages are ignored."""
52
78
  self._mounted = False
79
+ if self._refresh_timer is not None:
80
+ self._refresh_timer.stop()
53
81
 
54
82
  def on_context_meter_footer_meter_update(self, event: MeterUpdate) -> None:
55
83
  """Process MeterUpdate in Textual message context — triggers repaint."""
56
84
  self.update(event.content)
57
85
 
86
+ def request_refresh(self) -> None:
87
+ """Redraw from cached context data. Safe to call at any time."""
88
+ if not self._mounted or self._context_data is None:
89
+ return
90
+ try:
91
+ rendered = self.render_meter(self._context_data)
92
+ self.post_message(self.MeterUpdate(rendered))
93
+ except Exception:
94
+ pass
95
+
96
+ def on_connection_state_change(self, state: Any) -> None:
97
+ """Redraw on WebSocket reconnection."""
98
+ self.request_refresh()
99
+
58
100
  def handle_context_message(self, msg: dict[str, Any] | None) -> None:
59
- """Process incoming /ws/context message."""
101
+ """Process incoming /ws/context message with throttling."""
60
102
  if not self._mounted or msg is None:
61
103
  return
62
104
  ctx = msg.get("context")
63
105
  if ctx is None:
64
106
  return
65
107
  self._context_data = ctx
108
+ self.last_update_time = time.monotonic()
109
+
110
+ # Throttle: skip redraw if too soon after last one
111
+ now = time.monotonic()
112
+ if now - self._last_redraw_time < self.min_redraw_interval:
113
+ return
114
+ self._last_redraw_time = now
115
+
66
116
  try:
67
117
  rendered = self.render_meter(ctx)
68
118
  self.post_message(self.MeterUpdate(rendered))