@pennyfarthing/core 11.4.0 → 11.5.0-alpha.0

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 (511) hide show
  1. package/package.json +1 -1
  2. package/packages/core/dist/cli/commands/cyclist.js +1 -1
  3. package/packages/core/dist/cli/commands/cyclist.js.map +1 -1
  4. package/packages/core/dist/cli/commands/cyclist.test.js +3 -3
  5. package/packages/core/dist/cli/commands/cyclist.test.js.map +1 -1
  6. package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.d.ts +22 -0
  7. package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.d.ts.map +1 -0
  8. package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.js +161 -0
  9. package/packages/core/dist/cli/commands/doctor-persona-config-false-negative.test.js.map +1 -0
  10. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  11. package/packages/core/dist/cli/commands/doctor.js +101 -33
  12. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  13. package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
  14. package/packages/core/dist/cli/commands/init.js +33 -13
  15. package/packages/core/dist/cli/commands/init.js.map +1 -1
  16. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts +17 -0
  17. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.d.ts.map +1 -0
  18. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js +470 -0
  19. package/packages/core/dist/cli/commands/stale-artifacts-cleanup.test.js.map +1 -0
  20. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  21. package/packages/core/dist/cli/commands/update.js +68 -17
  22. package/packages/core/dist/cli/commands/update.js.map +1 -1
  23. package/packages/core/dist/cli/cyclist-migration.test.d.ts +16 -0
  24. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +1 -0
  25. package/packages/core/dist/cli/cyclist-migration.test.js +229 -0
  26. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -0
  27. package/packages/core/dist/cli/index.js +2 -21
  28. package/packages/core/dist/cli/index.js.map +1 -1
  29. package/packages/core/dist/cli/utils/node-modules.d.ts +7 -0
  30. package/packages/core/dist/cli/utils/node-modules.d.ts.map +1 -1
  31. package/packages/core/dist/cli/utils/node-modules.js +39 -0
  32. package/packages/core/dist/cli/utils/node-modules.js.map +1 -1
  33. package/packages/core/dist/cli/utils/settings.d.ts +1 -1
  34. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  35. package/packages/core/dist/cli/utils/settings.js +24 -21
  36. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  37. package/packages/core/dist/cli/utils/stale-artifacts.d.ts +59 -0
  38. package/packages/core/dist/cli/utils/stale-artifacts.d.ts.map +1 -0
  39. package/packages/core/dist/cli/utils/stale-artifacts.js +163 -0
  40. package/packages/core/dist/cli/utils/stale-artifacts.js.map +1 -0
  41. package/packages/core/dist/public/css/react.css +1 -1
  42. package/packages/core/dist/public/js/react/react.js +39 -39
  43. package/packages/core/dist/scripts/benchmark-integration.d.ts +182 -0
  44. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +1 -0
  45. package/packages/core/dist/scripts/benchmark-integration.js +691 -0
  46. package/packages/core/dist/scripts/benchmark-integration.js.map +1 -0
  47. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +150 -0
  48. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +1 -0
  49. package/packages/core/dist/scripts/job-fair-aggregator.js +547 -0
  50. package/packages/core/dist/scripts/job-fair-aggregator.js.map +1 -0
  51. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +1 -0
  52. package/packages/core/dist/scripts/theme-detail.test.js.map +1 -0
  53. package/packages/core/dist/server/api/context.d.ts.map +1 -1
  54. package/packages/core/dist/server/api/context.js +23 -5
  55. package/packages/core/dist/server/api/context.js.map +1 -1
  56. package/packages/core/dist/server/api/index.d.ts +0 -1
  57. package/packages/core/dist/server/api/index.d.ts.map +1 -1
  58. package/packages/core/dist/server/api/index.js +0 -2
  59. package/packages/core/dist/server/api/index.js.map +1 -1
  60. package/packages/core/dist/server/api/settings.d.ts.map +1 -1
  61. package/packages/core/dist/server/api/settings.js +6 -0
  62. package/packages/core/dist/server/api/settings.js.map +1 -1
  63. package/packages/core/dist/server/otlp-receiver.d.ts +0 -4
  64. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  65. package/packages/core/dist/server/otlp-receiver.js +0 -18
  66. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  67. package/packages/core/dist/server/otlp-receiver.test.js +0 -27
  68. package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
  69. package/packages/core/dist/server/server.d.ts +1 -1
  70. package/packages/core/dist/server/server.d.ts.map +1 -1
  71. package/packages/core/dist/server/server.js +2 -4
  72. package/packages/core/dist/server/server.js.map +1 -1
  73. package/packages/core/dist/workflow/cross-entity-validation.d.ts.map +1 -1
  74. package/packages/core/dist/workflow/cross-entity-validation.js.map +1 -1
  75. package/packages/core/src/public/App.tsx +0 -2
  76. package/packages/core/src/public/components/BikeRackWorkspace.tsx +0 -2
  77. package/packages/core/src/public/components/DockviewWorkspace.tsx +0 -4
  78. package/packages/core/src/public/components/StandalonePanel.tsx +0 -2
  79. package/packages/core/src/public/components/panels/SettingsPanel.tsx +83 -283
  80. package/packages/core/src/public/components/panels/SprintPanel.tsx +9 -1
  81. package/packages/core/src/public/components/panels/index.ts +0 -1
  82. package/packages/core/src/public/hooks/index.ts +0 -3
  83. package/packages/core/src/public/hooks/useSprint.ts +11 -2
  84. package/packages/core/src/public/images/cyclist-tandem-source.png +0 -0
  85. package/packages/core/src/public/styles/tailwind.css +0 -101
  86. package/pennyfarthing-dist/guides/bikerack.md +94 -0
  87. package/pennyfarthing-dist/personas/themes/firefly.yaml +12 -12
  88. package/pennyfarthing-dist/pf/__pycache__/__init__.cpython-311.pyc +0 -0
  89. package/pennyfarthing-dist/pf/__pycache__/__init__.cpython-314.pyc +0 -0
  90. package/pennyfarthing-dist/pf/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  91. package/pennyfarthing-dist/pf/__pycache__/cli.cpython-311.pyc +0 -0
  92. package/pennyfarthing-dist/pf/__pycache__/cli.cpython-314.pyc +0 -0
  93. package/pennyfarthing-dist/pf/__pycache__/config.cpython-314.pyc +0 -0
  94. package/pennyfarthing-dist/pf/__pycache__/context.cpython-311.pyc +0 -0
  95. package/pennyfarthing-dist/pf/__pycache__/context.cpython-314.pyc +0 -0
  96. package/pennyfarthing-dist/pf/__pycache__/hooks.cpython-314.pyc +0 -0
  97. package/pennyfarthing-dist/pf/__pycache__/jira.cpython-314.pyc +0 -0
  98. package/pennyfarthing-dist/pf/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  99. package/pennyfarthing-dist/pf/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  100. package/pennyfarthing-dist/pf/__pycache__/jira_sync.cpython-314.pyc +0 -0
  101. package/pennyfarthing-dist/pf/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  102. package/pennyfarthing-dist/pf/__pycache__/output.cpython-314.pyc +0 -0
  103. package/pennyfarthing-dist/pf/__pycache__/patch_mode.cpython-314.pyc +0 -0
  104. package/pennyfarthing-dist/pf/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  105. package/pennyfarthing-dist/pf/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  106. package/pennyfarthing-dist/pf/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  107. package/pennyfarthing-dist/pf/__pycache__/sprint.cpython-314.pyc +0 -0
  108. package/pennyfarthing-dist/pf/__pycache__/workflow.cpython-311.pyc +0 -0
  109. package/pennyfarthing-dist/pf/__pycache__/workflow.cpython-314.pyc +0 -0
  110. package/pennyfarthing-dist/pf/bc/__pycache__/__init__.cpython-311.pyc +0 -0
  111. package/pennyfarthing-dist/pf/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  112. package/pennyfarthing-dist/pf/bc/__pycache__/cli.cpython-311.pyc +0 -0
  113. package/pennyfarthing-dist/pf/bc/__pycache__/cli.cpython-314.pyc +0 -0
  114. package/pennyfarthing-dist/pf/bc/__pycache__/focus.cpython-311.pyc +0 -0
  115. package/pennyfarthing-dist/pf/bc/__pycache__/focus.cpython-314.pyc +0 -0
  116. package/pennyfarthing-dist/pf/bc/__pycache__/split.cpython-314.pyc +0 -0
  117. package/pennyfarthing-dist/pf/bc/cli.py +0 -1
  118. package/pennyfarthing-dist/pf/bc/focus.py +0 -1
  119. package/pennyfarthing-dist/pf/bikerack/__pycache__/__init__.cpython-311.pyc +0 -0
  120. package/pennyfarthing-dist/pf/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  121. package/pennyfarthing-dist/pf/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  122. package/pennyfarthing-dist/pf/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
  123. package/pennyfarthing-dist/pf/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  124. package/pennyfarthing-dist/pf/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  125. package/pennyfarthing-dist/pf/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  126. package/pennyfarthing-dist/pf/bikerack/__pycache__/cli.cpython-311.pyc +0 -0
  127. package/pennyfarthing-dist/pf/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  128. package/pennyfarthing-dist/pf/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
  129. package/pennyfarthing-dist/pf/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  130. package/pennyfarthing-dist/pf/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  131. package/pennyfarthing-dist/pf/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  132. package/pennyfarthing-dist/pf/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  133. package/pennyfarthing-dist/pf/bikerack/__pycache__/launcher.cpython-311.pyc +0 -0
  134. package/pennyfarthing-dist/pf/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  135. package/pennyfarthing-dist/pf/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  136. package/pennyfarthing-dist/pf/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  137. package/pennyfarthing-dist/pf/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  138. package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  139. package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  140. package/pennyfarthing-dist/pf/bikerack/__pycache__/story_detail_widget.cpython-314.pyc +0 -0
  141. package/pennyfarthing-dist/pf/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  142. package/pennyfarthing-dist/pf/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  143. package/pennyfarthing-dist/pf/bikerack/context_meter_footer.py +115 -35
  144. package/pennyfarthing-dist/pf/bikerack/portrait_resolver.py +14 -2
  145. package/pennyfarthing-dist/pf/bikerack/progress_panel.py +54 -0
  146. package/pennyfarthing-dist/pf/bikerack/sprint_panel.py +58 -0
  147. package/pennyfarthing-dist/pf/bikerack/story_detail_screen.py +10 -105
  148. package/pennyfarthing-dist/pf/bikerack/story_detail_widget.py +167 -0
  149. package/pennyfarthing-dist/pf/bikerack/tui.py +140 -50
  150. package/pennyfarthing-dist/pf/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
  151. package/pennyfarthing-dist/pf/bmad/__pycache__/cli.cpython-314.pyc +0 -0
  152. package/pennyfarthing-dist/pf/bmad/cli.py +0 -1
  153. package/pennyfarthing-dist/pf/bmad/importer.py +0 -1
  154. package/pennyfarthing-dist/pf/bmad/parser.py +0 -1
  155. package/pennyfarthing-dist/pf/bmad/sync.py +1 -3
  156. package/pennyfarthing-dist/pf/bmad/test_parser.py +0 -4
  157. package/pennyfarthing-dist/pf/bmad/test_sync.py +0 -3
  158. package/pennyfarthing-dist/pf/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  159. package/pennyfarthing-dist/pf/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  160. package/pennyfarthing-dist/pf/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  161. package/pennyfarthing-dist/pf/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  162. package/pennyfarthing-dist/pf/brownfield/cli.py +1 -1
  163. package/pennyfarthing-dist/pf/cli.py +145 -111
  164. package/pennyfarthing-dist/pf/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  165. package/pennyfarthing-dist/pf/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  166. package/pennyfarthing-dist/pf/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  167. package/pennyfarthing-dist/pf/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  168. package/pennyfarthing-dist/pf/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  169. package/pennyfarthing-dist/pf/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  170. package/pennyfarthing-dist/pf/common/__init__.py +2 -0
  171. package/pennyfarthing-dist/pf/common/__pycache__/__init__.cpython-311.pyc +0 -0
  172. package/pennyfarthing-dist/pf/common/__pycache__/__init__.cpython-314.pyc +0 -0
  173. package/pennyfarthing-dist/pf/common/__pycache__/config.cpython-311.pyc +0 -0
  174. package/pennyfarthing-dist/pf/common/__pycache__/config.cpython-314.pyc +0 -0
  175. package/pennyfarthing-dist/pf/common/__pycache__/output.cpython-311.pyc +0 -0
  176. package/pennyfarthing-dist/pf/common/__pycache__/output.cpython-314.pyc +0 -0
  177. package/pennyfarthing-dist/pf/common/__pycache__/pr_config.cpython-314.pyc +0 -0
  178. package/pennyfarthing-dist/pf/common/__pycache__/themes.cpython-314.pyc +0 -0
  179. package/pennyfarthing-dist/pf/common/config.py +43 -0
  180. package/pennyfarthing-dist/pf/common/themes.py +7 -5
  181. package/pennyfarthing-dist/pf/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  182. package/pennyfarthing-dist/pf/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  183. package/pennyfarthing-dist/pf/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  184. package/pennyfarthing-dist/pf/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  185. package/pennyfarthing-dist/pf/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  186. package/pennyfarthing-dist/pf/complexity/__pycache__/models.cpython-314.pyc +0 -0
  187. package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-311.pyc +0 -0
  188. package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  189. package/pennyfarthing-dist/pf/consultation/__pycache__/cli.cpython-311.pyc +0 -0
  190. package/pennyfarthing-dist/pf/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  191. package/pennyfarthing-dist/pf/consultation/__pycache__/dialogue_manager.cpython-314.pyc +0 -0
  192. package/pennyfarthing-dist/pf/context.py +1 -1
  193. package/pennyfarthing-dist/pf/deadcode/__pycache__/__init__.cpython-311.pyc +0 -0
  194. package/pennyfarthing-dist/pf/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  195. package/pennyfarthing-dist/pf/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  196. package/pennyfarthing-dist/pf/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  197. package/pennyfarthing-dist/pf/deadcode/__pycache__/cli.cpython-311.pyc +0 -0
  198. package/pennyfarthing-dist/pf/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  199. package/pennyfarthing-dist/pf/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  200. package/pennyfarthing-dist/pf/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  201. package/pennyfarthing-dist/pf/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  202. package/pennyfarthing-dist/pf/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  203. package/pennyfarthing-dist/pf/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  204. package/pennyfarthing-dist/pf/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  205. package/pennyfarthing-dist/pf/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  206. package/pennyfarthing-dist/pf/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  207. package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-311.pyc +0 -0
  208. package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  209. package/pennyfarthing-dist/pf/epic/__pycache__/cli.cpython-311.pyc +0 -0
  210. package/pennyfarthing-dist/pf/epic/__pycache__/cli.cpython-314.pyc +0 -0
  211. package/pennyfarthing-dist/pf/git/__pycache__/__init__.cpython-314.pyc +0 -0
  212. package/pennyfarthing-dist/pf/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  213. package/pennyfarthing-dist/pf/git/__pycache__/status_all.cpython-314.pyc +0 -0
  214. package/pennyfarthing-dist/pf/git/hooks_installer.py +7 -6
  215. package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-311.pyc +0 -0
  216. package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  217. package/pennyfarthing-dist/pf/git_group/__pycache__/cli.cpython-311.pyc +0 -0
  218. package/pennyfarthing-dist/pf/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  219. package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-311.pyc +0 -0
  220. package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  221. package/pennyfarthing-dist/pf/handoff/__pycache__/cli.cpython-311.pyc +0 -0
  222. package/pennyfarthing-dist/pf/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  223. package/pennyfarthing-dist/pf/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  224. package/pennyfarthing-dist/pf/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  225. package/pennyfarthing-dist/pf/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  226. package/pennyfarthing-dist/pf/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  227. package/pennyfarthing-dist/pf/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  228. package/pennyfarthing-dist/pf/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  229. package/pennyfarthing-dist/pf/handoff/gate_file.py +5 -1
  230. package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-311.pyc +0 -0
  231. package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  232. package/pennyfarthing-dist/pf/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  233. package/pennyfarthing-dist/pf/healthscore/__pycache__/analyze.cpython-311.pyc +0 -0
  234. package/pennyfarthing-dist/pf/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  235. package/pennyfarthing-dist/pf/healthscore/__pycache__/cli.cpython-311.pyc +0 -0
  236. package/pennyfarthing-dist/pf/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  237. package/pennyfarthing-dist/pf/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  238. package/pennyfarthing-dist/pf/healthscore/__pycache__/models.cpython-311.pyc +0 -0
  239. package/pennyfarthing-dist/pf/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  240. package/pennyfarthing-dist/pf/hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  241. package/pennyfarthing-dist/pf/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  242. package/pennyfarthing-dist/pf/hooks/__pycache__/bell_mode.cpython-311.pyc +0 -0
  243. package/pennyfarthing-dist/pf/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  244. package/pennyfarthing-dist/pf/hooks/__pycache__/cli.cpython-311.pyc +0 -0
  245. package/pennyfarthing-dist/pf/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  246. package/pennyfarthing-dist/pf/hooks/__pycache__/context_breaker.cpython-311.pyc +0 -0
  247. package/pennyfarthing-dist/pf/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  248. package/pennyfarthing-dist/pf/hooks/__pycache__/context_warning.cpython-311.pyc +0 -0
  249. package/pennyfarthing-dist/pf/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  250. package/pennyfarthing-dist/pf/hooks/__pycache__/cyclist_pretooluse.cpython-311.pyc +0 -0
  251. package/pennyfarthing-dist/pf/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  252. package/pennyfarthing-dist/pf/hooks/__pycache__/pre_edit_check.cpython-311.pyc +0 -0
  253. package/pennyfarthing-dist/pf/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  254. package/pennyfarthing-dist/pf/hooks/__pycache__/reflector_check.cpython-311.pyc +0 -0
  255. package/pennyfarthing-dist/pf/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  256. package/pennyfarthing-dist/pf/hooks/__pycache__/schema_validation.cpython-311.pyc +0 -0
  257. package/pennyfarthing-dist/pf/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  258. package/pennyfarthing-dist/pf/hooks/__pycache__/session_start.cpython-311.pyc +0 -0
  259. package/pennyfarthing-dist/pf/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  260. package/pennyfarthing-dist/pf/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  261. package/pennyfarthing-dist/pf/hooks/__pycache__/sprint_yaml_validation.cpython-311.pyc +0 -0
  262. package/pennyfarthing-dist/pf/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  263. package/pennyfarthing-dist/pf/hooks/__pycache__/statusline.cpython-311.pyc +0 -0
  264. package/pennyfarthing-dist/pf/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  265. package/pennyfarthing-dist/pf/hooks/statusline.py +11 -0
  266. package/pennyfarthing-dist/pf/hotspots/__pycache__/__init__.cpython-311.pyc +0 -0
  267. package/pennyfarthing-dist/pf/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  268. package/pennyfarthing-dist/pf/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  269. package/pennyfarthing-dist/pf/hotspots/__pycache__/analyze.cpython-311.pyc +0 -0
  270. package/pennyfarthing-dist/pf/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  271. package/pennyfarthing-dist/pf/hotspots/__pycache__/cli.cpython-311.pyc +0 -0
  272. package/pennyfarthing-dist/pf/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  273. package/pennyfarthing-dist/pf/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  274. package/pennyfarthing-dist/pf/hotspots/__pycache__/models.cpython-311.pyc +0 -0
  275. package/pennyfarthing-dist/pf/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  276. package/pennyfarthing-dist/pf/jira/__init__.py +0 -6
  277. package/pennyfarthing-dist/pf/jira/__pycache__/__init__.cpython-311.pyc +0 -0
  278. package/pennyfarthing-dist/pf/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/pennyfarthing-dist/pf/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  280. package/pennyfarthing-dist/pf/jira/__pycache__/bidirectional.cpython-311.pyc +0 -0
  281. package/pennyfarthing-dist/pf/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  282. package/pennyfarthing-dist/pf/jira/__pycache__/claim.cpython-311.pyc +0 -0
  283. package/pennyfarthing-dist/pf/jira/__pycache__/claim.cpython-314.pyc +0 -0
  284. package/pennyfarthing-dist/pf/jira/__pycache__/cli.cpython-311.pyc +0 -0
  285. package/pennyfarthing-dist/pf/jira/__pycache__/cli.cpython-314.pyc +0 -0
  286. package/pennyfarthing-dist/pf/jira/__pycache__/client.cpython-311.pyc +0 -0
  287. package/pennyfarthing-dist/pf/jira/__pycache__/client.cpython-314.pyc +0 -0
  288. package/pennyfarthing-dist/pf/jira/__pycache__/compat.cpython-314.pyc +0 -0
  289. package/pennyfarthing-dist/pf/jira/__pycache__/create.cpython-311.pyc +0 -0
  290. package/pennyfarthing-dist/pf/jira/__pycache__/create.cpython-314.pyc +0 -0
  291. package/pennyfarthing-dist/pf/jira/__pycache__/epic.cpython-311.pyc +0 -0
  292. package/pennyfarthing-dist/pf/jira/__pycache__/epic.cpython-314.pyc +0 -0
  293. package/pennyfarthing-dist/pf/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  294. package/pennyfarthing-dist/pf/jira/__pycache__/models.cpython-314.pyc +0 -0
  295. package/pennyfarthing-dist/pf/jira/__pycache__/operations.cpython-311.pyc +0 -0
  296. package/pennyfarthing-dist/pf/jira/__pycache__/operations.cpython-314.pyc +0 -0
  297. package/pennyfarthing-dist/pf/jira/__pycache__/reconcile.cpython-311.pyc +0 -0
  298. package/pennyfarthing-dist/pf/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  299. package/pennyfarthing-dist/pf/jira/__pycache__/story.cpython-311.pyc +0 -0
  300. package/pennyfarthing-dist/pf/jira/__pycache__/story.cpython-314.pyc +0 -0
  301. package/pennyfarthing-dist/pf/jira/__pycache__/sync.cpython-311.pyc +0 -0
  302. package/pennyfarthing-dist/pf/jira/__pycache__/sync.cpython-314.pyc +0 -0
  303. package/pennyfarthing-dist/pf/jira/claim.py +14 -44
  304. package/pennyfarthing-dist/pf/jira/cli.py +124 -14
  305. package/pennyfarthing-dist/pf/jira/client.py +51 -87
  306. package/pennyfarthing-dist/pf/jira/reconcile.py +1 -1
  307. package/pennyfarthing-dist/pf/jira/story.py +6 -4
  308. package/pennyfarthing-dist/pf/jira/sync.py +2 -2
  309. package/pennyfarthing-dist/pf/launch/__pycache__/__init__.cpython-311.pyc +0 -0
  310. package/pennyfarthing-dist/pf/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  311. package/pennyfarthing-dist/pf/launch/__pycache__/cli.cpython-311.pyc +0 -0
  312. package/pennyfarthing-dist/pf/launch/__pycache__/cli.cpython-314.pyc +0 -0
  313. package/pennyfarthing-dist/pf/migration/__init__.py +1 -1
  314. package/pennyfarthing-dist/pf/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  315. package/pennyfarthing-dist/pf/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  316. package/pennyfarthing-dist/pf/migration/__pycache__/cli.cpython-314.pyc +0 -0
  317. package/pennyfarthing-dist/pf/migration/__pycache__/session.cpython-314.pyc +0 -0
  318. package/pennyfarthing-dist/pf/migration/__pycache__/skill.cpython-314.pyc +0 -0
  319. package/pennyfarthing-dist/pf/migration/__pycache__/step.cpython-314.pyc +0 -0
  320. package/pennyfarthing-dist/pf/migration/__pycache__/validate.cpython-314.pyc +0 -0
  321. package/pennyfarthing-dist/pf/migration/cli.py +0 -1
  322. package/pennyfarthing-dist/pf/package/__init__.py +0 -0
  323. package/pennyfarthing-dist/pf/package/__pycache__/__init__.cpython-314.pyc +0 -0
  324. package/pennyfarthing-dist/pf/package/__pycache__/cli.cpython-314.pyc +0 -0
  325. package/pennyfarthing-dist/pf/package/__pycache__/discovery.cpython-314.pyc +0 -0
  326. package/pennyfarthing-dist/pf/package/__pycache__/portraits.cpython-314.pyc +0 -0
  327. package/pennyfarthing-dist/pf/package/cli.py +186 -0
  328. package/pennyfarthing-dist/pf/package/discovery.py +130 -0
  329. package/pennyfarthing-dist/pf/package/portraits.py +243 -0
  330. package/pennyfarthing-dist/pf/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  331. package/pennyfarthing-dist/pf/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  332. package/pennyfarthing-dist/pf/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  333. package/pennyfarthing-dist/pf/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  334. package/pennyfarthing-dist/pf/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  335. package/pennyfarthing-dist/pf/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  336. package/pennyfarthing-dist/pf/prime/__pycache__/cli.cpython-314.pyc +0 -0
  337. package/pennyfarthing-dist/pf/prime/__pycache__/loader.cpython-314.pyc +0 -0
  338. package/pennyfarthing-dist/pf/prime/__pycache__/models.cpython-314.pyc +0 -0
  339. package/pennyfarthing-dist/pf/prime/__pycache__/persona.cpython-314.pyc +0 -0
  340. package/pennyfarthing-dist/pf/prime/__pycache__/session.cpython-314.pyc +0 -0
  341. package/pennyfarthing-dist/pf/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  342. package/pennyfarthing-dist/pf/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  343. package/pennyfarthing-dist/pf/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  344. package/pennyfarthing-dist/pf/prime/loader.py +21 -7
  345. package/pennyfarthing-dist/pf/prime/workflow.py +11 -3
  346. package/pennyfarthing-dist/pf/release/__init__.py +0 -0
  347. package/pennyfarthing-dist/pf/release/__pycache__/__init__.cpython-314.pyc +0 -0
  348. package/pennyfarthing-dist/pf/release/__pycache__/cli.cpython-314.pyc +0 -0
  349. package/pennyfarthing-dist/pf/release/__pycache__/deprecate.cpython-314.pyc +0 -0
  350. package/pennyfarthing-dist/pf/release/__pycache__/dry_run.cpython-314.pyc +0 -0
  351. package/pennyfarthing-dist/pf/release/cli.py +112 -0
  352. package/pennyfarthing-dist/pf/release/deprecate.py +187 -0
  353. package/pennyfarthing-dist/pf/release/dry_run.py +187 -0
  354. package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-311.pyc +0 -0
  355. package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-314.pyc +0 -0
  356. package/pennyfarthing-dist/pf/session/__pycache__/cli.cpython-311.pyc +0 -0
  357. package/pennyfarthing-dist/pf/session/__pycache__/cli.cpython-314.pyc +0 -0
  358. package/pennyfarthing-dist/pf/settings/__pycache__/__init__.cpython-314.pyc +0 -0
  359. package/pennyfarthing-dist/pf/settings/__pycache__/cli.cpython-314.pyc +0 -0
  360. package/pennyfarthing-dist/pf/settings/__pycache__/settings.cpython-314.pyc +0 -0
  361. package/pennyfarthing-dist/pf/sprint/__pycache__/__init__.cpython-311.pyc +0 -0
  362. package/pennyfarthing-dist/pf/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  363. package/pennyfarthing-dist/pf/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  364. package/pennyfarthing-dist/pf/sprint/__pycache__/archive.cpython-311.pyc +0 -0
  365. package/pennyfarthing-dist/pf/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  366. package/pennyfarthing-dist/pf/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  367. package/pennyfarthing-dist/pf/sprint/__pycache__/cli.cpython-311.pyc +0 -0
  368. package/pennyfarthing-dist/pf/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  369. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_add.cpython-311.pyc +0 -0
  370. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  371. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_update.cpython-311.pyc +0 -0
  372. package/pennyfarthing-dist/pf/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  373. package/pennyfarthing-dist/pf/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  374. package/pennyfarthing-dist/pf/sprint/__pycache__/loader.cpython-311.pyc +0 -0
  375. package/pennyfarthing-dist/pf/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  376. package/pennyfarthing-dist/pf/sprint/__pycache__/shard_merge.cpython-314.pyc +0 -0
  377. package/pennyfarthing-dist/pf/sprint/__pycache__/status.cpython-311.pyc +0 -0
  378. package/pennyfarthing-dist/pf/sprint/__pycache__/status.cpython-314.pyc +0 -0
  379. package/pennyfarthing-dist/pf/sprint/__pycache__/story_add.cpython-311.pyc +0 -0
  380. package/pennyfarthing-dist/pf/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  381. package/pennyfarthing-dist/pf/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  382. package/pennyfarthing-dist/pf/sprint/__pycache__/story_update.cpython-311.pyc +0 -0
  383. package/pennyfarthing-dist/pf/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  384. package/pennyfarthing-dist/pf/sprint/__pycache__/validate_cmd.cpython-311.pyc +0 -0
  385. package/pennyfarthing-dist/pf/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  386. package/pennyfarthing-dist/pf/sprint/__pycache__/validator.cpython-311.pyc +0 -0
  387. package/pennyfarthing-dist/pf/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  388. package/pennyfarthing-dist/pf/sprint/__pycache__/work.cpython-311.pyc +0 -0
  389. package/pennyfarthing-dist/pf/sprint/__pycache__/work.cpython-314.pyc +0 -0
  390. package/pennyfarthing-dist/pf/sprint/__pycache__/yaml_io.cpython-311.pyc +0 -0
  391. package/pennyfarthing-dist/pf/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  392. package/pennyfarthing-dist/pf/sprint/cli.py +1 -1
  393. package/pennyfarthing-dist/pf/sprint/loader.py +6 -74
  394. package/pennyfarthing-dist/pf/sprint/shard_merge.py +126 -0
  395. package/pennyfarthing-dist/pf/sprint/story_finish.py +4 -2
  396. package/pennyfarthing-dist/pf/sprint/yaml_io.py +8 -53
  397. package/pennyfarthing-dist/pf/story/__pycache__/__init__.cpython-314.pyc +0 -0
  398. package/pennyfarthing-dist/pf/story/__pycache__/__main__.cpython-314.pyc +0 -0
  399. package/pennyfarthing-dist/pf/story/__pycache__/cli.cpython-314.pyc +0 -0
  400. package/pennyfarthing-dist/pf/story/__pycache__/create.cpython-314.pyc +0 -0
  401. package/pennyfarthing-dist/pf/story/__pycache__/size.cpython-314.pyc +0 -0
  402. package/pennyfarthing-dist/pf/story/__pycache__/template.cpython-314.pyc +0 -0
  403. package/pennyfarthing-dist/pf/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  404. package/pennyfarthing-dist/pf/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  405. package/pennyfarthing-dist/pf/tests/__pycache__/test_108_1_gate_migration.cpython-314-pytest-9.0.2.pyc +0 -0
  406. package/pennyfarthing-dist/pf/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  407. package/pennyfarthing-dist/pf/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  408. package/pennyfarthing-dist/pf/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  409. package/pennyfarthing-dist/pf/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  410. package/pennyfarthing-dist/pf/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  411. package/pennyfarthing-dist/pf/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  412. package/pennyfarthing-dist/pf/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  413. package/pennyfarthing-dist/pf/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  414. package/pennyfarthing-dist/pf/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
  415. package/pennyfarthing-dist/pf/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
  416. package/pennyfarthing-dist/pf/tests/__pycache__/test_dialogue_manager.cpython-314-pytest-9.0.2.pyc +0 -0
  417. package/pennyfarthing-dist/pf/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  418. package/pennyfarthing-dist/pf/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  419. package/pennyfarthing-dist/pf/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  420. package/pennyfarthing-dist/pf/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  421. package/pennyfarthing-dist/pf/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  422. package/pennyfarthing-dist/pf/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  423. package/pennyfarthing-dist/pf/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  424. package/pennyfarthing-dist/pf/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  425. package/pennyfarthing-dist/pf/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  426. package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  427. package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  428. package/pennyfarthing-dist/pf/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  429. package/pennyfarthing-dist/pf/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  430. package/pennyfarthing-dist/pf/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  431. package/pennyfarthing-dist/pf/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  432. package/pennyfarthing-dist/pf/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  433. package/pennyfarthing-dist/pf/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  434. package/pennyfarthing-dist/pf/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  435. package/pennyfarthing-dist/pf/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  436. package/pennyfarthing-dist/pf/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  437. package/pennyfarthing-dist/pf/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  438. package/pennyfarthing-dist/pf/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  439. package/pennyfarthing-dist/pf/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  440. package/pennyfarthing-dist/pf/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  441. package/pennyfarthing-dist/pf/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  442. package/pennyfarthing-dist/pf/tests/test_cli_modules.py +32 -137
  443. package/pennyfarthing-dist/pf/tests/test_codemarkers.py +0 -15
  444. package/pennyfarthing-dist/pf/tests/test_dist_root.py +720 -0
  445. package/pennyfarthing-dist/pf/tests/test_package_structure.py +24 -70
  446. package/pennyfarthing-dist/pf/theme/__pycache__/__init__.cpython-311.pyc +0 -0
  447. package/pennyfarthing-dist/pf/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  448. package/pennyfarthing-dist/pf/theme/__pycache__/cli.cpython-311.pyc +0 -0
  449. package/pennyfarthing-dist/pf/theme/__pycache__/cli.cpython-314.pyc +0 -0
  450. package/pennyfarthing-dist/pf/validate/__pycache__/__init__.cpython-311.pyc +0 -0
  451. package/pennyfarthing-dist/pf/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  452. package/pennyfarthing-dist/pf/validate/__pycache__/cli.cpython-311.pyc +0 -0
  453. package/pennyfarthing-dist/pf/validate/__pycache__/cli.cpython-314.pyc +0 -0
  454. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  455. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  456. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  457. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  458. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  459. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
  460. package/pennyfarthing-dist/pf/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  461. package/pennyfarthing-dist/pf/validate/adapters/agent.py +11 -1
  462. package/pennyfarthing-dist/pf/validate/adapters/skill_command.py +15 -4
  463. package/pennyfarthing-dist/pf/validate/adapters/tandem_awareness.py +7 -1
  464. package/pennyfarthing-dist/pf/validate/adapters/team_mode.py +8 -2
  465. package/pennyfarthing-dist/pf/validate/adapters/workflow.py +12 -2
  466. package/pennyfarthing-dist/pf/workflow/__pycache__/__init__.cpython-311.pyc +0 -0
  467. package/pennyfarthing-dist/pf/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  468. package/pennyfarthing-dist/pf/workflow/__pycache__/cli.cpython-311.pyc +0 -0
  469. package/pennyfarthing-dist/pf/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  470. package/pennyfarthing-dist/pf/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  471. package/pennyfarthing-dist/pf/workflow/__pycache__/scale.cpython-311.pyc +0 -0
  472. package/pennyfarthing-dist/pf/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  473. package/pennyfarthing-dist/pf/workflow/__pycache__/state.cpython-311.pyc +0 -0
  474. package/pennyfarthing-dist/pf/workflow/__pycache__/state.cpython-314.pyc +0 -0
  475. package/pennyfarthing-dist/pyproject.toml +1 -1
  476. package/pennyfarthing-dist/scripts/core/check-context.sh +2 -2
  477. package/pennyfarthing-dist/scripts/git/changelog-links.sh +216 -0
  478. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  479. package/pennyfarthing-dist/scripts/lib/README.md +0 -1
  480. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +54 -0
  481. package/pennyfarthing-dist/scripts/portraits/generate-tandem-portraits.sh +7 -3
  482. package/pennyfarthing-dist/workflows/patch.yaml +5 -6
  483. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +12 -0
  484. package/packages/core/dist/workflow/team-lifecycle.d.ts +0 -169
  485. package/packages/core/dist/workflow/team-lifecycle.d.ts.map +0 -1
  486. package/packages/core/dist/workflow/team-lifecycle.js +0 -217
  487. package/packages/core/dist/workflow/team-lifecycle.js.map +0 -1
  488. package/packages/core/dist/workflow/team-lifecycle.test.d.ts +0 -20
  489. package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +0 -1
  490. package/packages/core/dist/workflow/team-lifecycle.test.js +0 -966
  491. package/packages/core/dist/workflow/team-lifecycle.test.js.map +0 -1
  492. package/packages/core/src/public/components/FontPicker/FontPicker.css +0 -276
  493. package/packages/core/src/public/components/FontPicker/index.tsx +0 -430
  494. package/packages/core/src/public/components/ThemePalette/ThemePalette.css +0 -179
  495. package/packages/core/src/public/components/ThemePalette/index.tsx +0 -326
  496. package/packages/core/src/public/components/panels/BackgroundPanel.tsx +0 -115
  497. package/packages/core/src/public/components/ui/switch.tsx +0 -27
  498. package/packages/core/src/public/hooks/useBackgroundTasks.ts +0 -131
  499. package/pennyfarthing-dist/pf/bikerack/background_panel.py +0 -162
  500. package/pennyfarthing-dist/pf/bmad/__pycache__/parser.cpython-314.pyc +0 -0
  501. package/pennyfarthing-dist/pf/brownfield/__main__.py +0 -8
  502. package/pennyfarthing-dist/pf/config.py +0 -21
  503. package/pennyfarthing-dist/pf/hooks.py +0 -32
  504. package/pennyfarthing-dist/pf/jira_bidirectional_sync.py +0 -37
  505. package/pennyfarthing-dist/pf/jira_epic_creation.py +0 -30
  506. package/pennyfarthing-dist/pf/jira_sync.py +0 -36
  507. package/pennyfarthing-dist/pf/jira_sync_story.py +0 -30
  508. package/pennyfarthing-dist/pf/migration/__main__.py +0 -10
  509. package/pennyfarthing-dist/pf/output.py +0 -37
  510. package/pennyfarthing-dist/pf/theme/__main__.py +0 -6
  511. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -177
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pennyfarthing/core",
3
- "version": "11.4.0",
3
+ "version": "11.5.0-alpha.0",
4
4
  "description": "Claude Code agent framework with TDD workflow and persona system",
5
5
  "type": "module",
6
6
  "main": "./packages/core/dist/index.js",
@@ -128,7 +128,7 @@ export async function cyclistCommand(options, deps) {
128
128
  const port = options.port ?? 3000;
129
129
  // Find cyclist installation
130
130
  const cyclistPath = options.cyclistPath ?? findCyclist();
131
- const serverPath = join(cyclistPath, 'dist', 'server.js');
131
+ const serverPath = join(cyclistPath, 'dist', 'bikerack.js');
132
132
  // Load theme configuration
133
133
  const themeConfig = loadThemeConfig(projectDir);
134
134
  const themePath = resolveThemePath(themeConfig.theme, projectDir);
@@ -1 +1 @@
1
- {"version":3,"file":"cyclist.js","sourceRoot":"","sources":["../../../src/cli/commands/cyclist.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAqB,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAsBtC;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,OAA4B;IACtD,mCAAmC;IACnC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAClC,CAAC;IAED,2CAA2C;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,4DAA4D;IAC5D,6DAA6D;IAC7D,MAAM,WAAW,GAAG,OAAO,EAAE,mBAAmB,IAAI;QAClD,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,EAAO,sDAAsD;QACnG,IAAI,CAAC,SAAS,EAAE,iCAAiC,CAAC,EAAG,gCAAgC;QACrF,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAU,WAAW;KACzD,CAAC;IAEF,KAAK,MAAM,WAAW,IAAI,WAAW,EAAE,CAAC;QACtC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAClD,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,qCAAqC,CAAC,CAAC;IACxE,IAAI,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACrD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,4EAA4E;QAC5E,uEAAuE;QACvE,0CAA0C;QAC1C,+CAA+C,CAChD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,WAAW,GAAG;QAClB,IAAI,CAAC,UAAU,EAAE,kCAAkC,CAAC;QACpD,IAAI,CAAC,UAAU,EAAE,oCAAoC,CAAC;KACvD,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAuB,CAAC;gBACxD,IAAI,MAAM,EAAE,KAAK,EAAE,CAAC;oBAClB,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,UAAkB;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;IAEtE,mCAAmC;IACnC,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,4EAA4E;IAC5E,MAAM,YAAY,GAAG;QACnB,8DAA8D;QAC9D,wDAAwD;KACzD,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;QACnE,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,mCAAmC,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;IAC3F,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,oDAAoD;IACpD,uCAAuC;IACvC,OAAO,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5C,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAuB,EACvB,IAAkB;IAElB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAElC,4BAA4B;IAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,WAAW,EAAE,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAE1D,2BAA2B;IAC3B,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAElE,gCAAgC;IAChC,MAAM,GAAG,GAA2B;QAClC,GAAG,OAAO,CAAC,GAA6B;QACxC,mBAAmB,EAAE,UAAU;QAC/B,aAAa,EAAE,WAAW,CAAC,KAAK;QAChC,kBAAkB,EAAE,SAAS;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;KACnB,CAAC;IAEF,sEAAsE;IACtE,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,GAAG,CAAC,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAClD,CAAC;IAED,uDAAuD;IACvD,MAAM,OAAO,GAAG,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC;IAEzC,kFAAkF;IAClF,MAAM,KAAK,GAAiB,OAAO,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;QACxD,GAAG,EAAE,WAAW;QAChB,GAAG;QACH,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;IAEH,wBAAwB;IACxB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;QAC/B,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,IAAI,WAAW,CAAC;QACzC,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;QAEvC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;YACf,sDAAsD;YACtD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,2CAA2C;YAC3C,UAAU,CAAC,KAAK,IAAI,EAAE;gBACpB,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;gBAAC,MAAM,CAAC;oBACP,6BAA6B;gBAC/B,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"cyclist.js","sourceRoot":"","sources":["../../../src/cli/commands/cyclist.ts"],"names":[],"mappings":"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"}
@@ -136,7 +136,7 @@ describe('Story 15-1: Cyclist Launcher Command', () => {
136
136
  mkdirSync(siblingCyclist, { recursive: true });
137
137
  mkdirSync(join(siblingCyclist, 'dist'), { recursive: true });
138
138
  writeFileSync(join(siblingCyclist, 'package.json'), JSON.stringify({ name: 'cyclist' }));
139
- writeFileSync(join(siblingCyclist, 'dist', 'server.js'), '// mock server');
139
+ writeFileSync(join(siblingCyclist, 'dist', 'bikerack.js'), '// mock bikerack entry');
140
140
  // Create theme config at canonical location
141
141
  const pennyfarthingDir = join(testDir, '.pennyfarthing');
142
142
  mkdirSync(pennyfarthingDir, { recursive: true });
@@ -191,7 +191,7 @@ describe('Story 15-1: Cyclist Launcher Command', () => {
191
191
  const command = spawnCall.arguments[0];
192
192
  const args = spawnCall.arguments[1];
193
193
  assert.strictEqual(command, 'node', 'Should spawn node process');
194
- assert.ok(args[0].includes('server.js'), 'Should spawn cyclist server.js');
194
+ assert.ok(args[0].includes('bikerack.js'), 'Should spawn cyclist bikerack.js entry point');
195
195
  });
196
196
  it('should open browser by default', async () => {
197
197
  // AC: Opens browser
@@ -217,7 +217,7 @@ describe('Story 15-1: Cyclist Launcher Command', () => {
217
217
  const customPath = join(testDir, 'custom-cyclist');
218
218
  mkdirSync(join(customPath, 'dist'), { recursive: true });
219
219
  writeFileSync(join(customPath, 'package.json'), JSON.stringify({ name: 'cyclist' }));
220
- writeFileSync(join(customPath, 'dist', 'server.js'), '// mock');
220
+ writeFileSync(join(customPath, 'dist', 'bikerack.js'), '// mock');
221
221
  await cyclistCommand({ cyclistPath: customPath, noOpen: true }, { spawn: spawnMock, open: openMock });
222
222
  const spawnCall = spawnMock.mock.calls[0];
223
223
  const args = spawnCall.arguments[1];
@@ -1 +1 @@
1
- {"version":3,"file":"cyclist.test.js","sourceRoot":"","sources":["../../../src/cli/commands/cyclist.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cyclist.test.js","sourceRoot":"","sources":["../../../src/cli/commands/cyclist.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Tests for Story 117-10: Doctor persona-config check false negative
3
+ * when config.local.yaml missing
4
+ *
5
+ * Bug: Doctor's persona-config check only looks for .pennyfarthing/config.local.yaml
6
+ * existence. When only .pennyfarthing/persona-config.yaml exists (set by /pf-setup),
7
+ * doctor falsely reports "No theme configured" even though getCurrentTheme()
8
+ * correctly falls back to persona-config.yaml.
9
+ *
10
+ * Fix: Doctor should use getCurrentTheme() (or replicate its fallback) to determine
11
+ * whether a theme is configured, not just check config.local.yaml existence.
12
+ *
13
+ * Acceptance Criteria:
14
+ * AC1: Doctor persona-config check passes when theme set in persona-config.yaml only
15
+ * AC2: Doctor persona-config check still passes when theme set in config.local.yaml
16
+ * AC3: config.local.yaml overrides persona-config.yaml when both exist
17
+ * AC4: Doctor correctly warns when NO theme is configured anywhere
18
+ *
19
+ * Run with: cd packages/core && pnpm run build && pnpm test
20
+ */
21
+ export {};
22
+ //# sourceMappingURL=doctor-persona-config-false-negative.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-persona-config-false-negative.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor-persona-config-false-negative.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Tests for Story 117-10: Doctor persona-config check false negative
3
+ * when config.local.yaml missing
4
+ *
5
+ * Bug: Doctor's persona-config check only looks for .pennyfarthing/config.local.yaml
6
+ * existence. When only .pennyfarthing/persona-config.yaml exists (set by /pf-setup),
7
+ * doctor falsely reports "No theme configured" even though getCurrentTheme()
8
+ * correctly falls back to persona-config.yaml.
9
+ *
10
+ * Fix: Doctor should use getCurrentTheme() (or replicate its fallback) to determine
11
+ * whether a theme is configured, not just check config.local.yaml existence.
12
+ *
13
+ * Acceptance Criteria:
14
+ * AC1: Doctor persona-config check passes when theme set in persona-config.yaml only
15
+ * AC2: Doctor persona-config check still passes when theme set in config.local.yaml
16
+ * AC3: config.local.yaml overrides persona-config.yaml when both exist
17
+ * AC4: Doctor correctly warns when NO theme is configured anywhere
18
+ *
19
+ * Run with: cd packages/core && pnpm run build && pnpm test
20
+ */
21
+ import { describe, it, beforeEach, afterEach } from 'node:test';
22
+ import assert from 'node:assert';
23
+ import { existsSync, mkdirSync, writeFileSync, rmSync, } from 'fs';
24
+ import { join } from 'path';
25
+ import { tmpdir } from 'os';
26
+ import { stringify as yamlStringify } from 'yaml';
27
+ import { checkUserFilesBasic, checkFileLayout } from './doctor.js';
28
+ import { getCurrentTheme } from '../utils/themes.js';
29
+ describe('Story 117-10: Doctor persona-config false negative', () => {
30
+ let testDir;
31
+ let pennyfarthingDir;
32
+ let claudeDir;
33
+ beforeEach(() => {
34
+ testDir = join(tmpdir(), `pf-doctor-persona-${Date.now()}-${Math.random().toString(36).slice(2)}`);
35
+ pennyfarthingDir = join(testDir, '.pennyfarthing');
36
+ claudeDir = join(testDir, '.claude');
37
+ mkdirSync(pennyfarthingDir, { recursive: true });
38
+ mkdirSync(claudeDir, { recursive: true });
39
+ });
40
+ afterEach(() => {
41
+ if (existsSync(testDir)) {
42
+ rmSync(testDir, { recursive: true, force: true });
43
+ }
44
+ });
45
+ // ─── AC1: persona-config.yaml fallback ──────────────────────────────
46
+ describe('AC1: Doctor passes when theme set in persona-config.yaml only', () => {
47
+ it('checkUserFilesBasic persona-config should pass with only persona-config.yaml', () => {
48
+ // This is the core false negative: persona-config.yaml has a valid theme
49
+ // but config.local.yaml does not exist
50
+ writeFileSync(join(pennyfarthingDir, 'persona-config.yaml'), yamlStringify({ theme: 'firefly' }));
51
+ // Sanity: getCurrentTheme already handles this correctly
52
+ const theme = getCurrentTheme(testDir);
53
+ assert.strictEqual(theme, 'firefly', 'getCurrentTheme should find theme in persona-config.yaml');
54
+ // Bug: checkUserFilesBasic only checks config.local.yaml existence
55
+ const results = checkUserFilesBasic(testDir);
56
+ const personaResult = results.find((r) => r.name === 'persona-config');
57
+ assert.ok(personaResult, 'Should have persona-config check result');
58
+ assert.strictEqual(personaResult.status, 'pass', 'Should PASS when theme is set in persona-config.yaml (even without config.local.yaml)');
59
+ });
60
+ it('checkFileLayout config check should pass with only persona-config.yaml', () => {
61
+ // Same false negative in checkFileLayout
62
+ writeFileSync(join(pennyfarthingDir, 'persona-config.yaml'), yamlStringify({ theme: 'firefly' }));
63
+ // Also need manifest for checkFileLayout
64
+ writeFileSync(join(pennyfarthingDir, 'manifest.json'), JSON.stringify({ version: '11.0.0' }));
65
+ const results = checkFileLayout(testDir);
66
+ const configResult = results.find((r) => r.name === 'layout/config');
67
+ assert.ok(configResult, 'Should have layout/config check result');
68
+ assert.strictEqual(configResult.status, 'pass', 'Should PASS when theme is set in persona-config.yaml (even without config.local.yaml)');
69
+ });
70
+ });
71
+ // ─── AC2: config.local.yaml still works ────────────────────────────
72
+ describe('AC2: Doctor still passes when theme set in config.local.yaml', () => {
73
+ it('checkUserFilesBasic should pass with config.local.yaml (existing behavior)', () => {
74
+ writeFileSync(join(pennyfarthingDir, 'config.local.yaml'), yamlStringify({ theme: 'game-of-thrones' }));
75
+ const results = checkUserFilesBasic(testDir);
76
+ const personaResult = results.find((r) => r.name === 'persona-config');
77
+ assert.ok(personaResult, 'Should have persona-config check result');
78
+ assert.strictEqual(personaResult.status, 'pass', 'Should pass with config.local.yaml');
79
+ });
80
+ it('checkFileLayout should pass with config.local.yaml (existing behavior)', () => {
81
+ writeFileSync(join(pennyfarthingDir, 'config.local.yaml'), yamlStringify({ theme: 'game-of-thrones' }));
82
+ const results = checkFileLayout(testDir);
83
+ const configResult = results.find((r) => r.name === 'layout/config');
84
+ assert.ok(configResult, 'Should have layout/config check result');
85
+ assert.strictEqual(configResult.status, 'pass', 'Should pass with config.local.yaml');
86
+ });
87
+ });
88
+ // ─── AC3: config.local.yaml overrides persona-config.yaml ──────────
89
+ describe('AC3: config.local.yaml takes priority over persona-config.yaml', () => {
90
+ it('getCurrentTheme prefers config.local.yaml when both exist', () => {
91
+ writeFileSync(join(pennyfarthingDir, 'config.local.yaml'), yamlStringify({ theme: 'star-trek' }));
92
+ writeFileSync(join(pennyfarthingDir, 'persona-config.yaml'), yamlStringify({ theme: 'firefly' }));
93
+ const theme = getCurrentTheme(testDir);
94
+ assert.strictEqual(theme, 'star-trek', 'config.local.yaml should override persona-config.yaml');
95
+ });
96
+ it('doctor should pass when both config files exist', () => {
97
+ writeFileSync(join(pennyfarthingDir, 'config.local.yaml'), yamlStringify({ theme: 'star-trek' }));
98
+ writeFileSync(join(pennyfarthingDir, 'persona-config.yaml'), yamlStringify({ theme: 'firefly' }));
99
+ const results = checkUserFilesBasic(testDir);
100
+ const personaResult = results.find((r) => r.name === 'persona-config');
101
+ assert.ok(personaResult, 'Should have persona-config check result');
102
+ assert.strictEqual(personaResult.status, 'pass', 'Should pass when both configs exist');
103
+ });
104
+ });
105
+ // ─── AC4: Correctly warns when NO theme configured ─────────────────
106
+ describe('AC4: Doctor warns when no theme is configured anywhere', () => {
107
+ it('checkUserFilesBasic should warn when neither config file has a theme', () => {
108
+ // No config.local.yaml, no persona-config.yaml
109
+ const results = checkUserFilesBasic(testDir);
110
+ const personaResult = results.find((r) => r.name === 'persona-config');
111
+ assert.ok(personaResult, 'Should have persona-config check result');
112
+ assert.strictEqual(personaResult.status, 'warn', 'Should warn when no theme configured anywhere');
113
+ assert.ok(personaResult.detail?.includes('No theme configured'), 'Detail should mention no theme configured');
114
+ });
115
+ it('checkFileLayout should warn when neither config file has a theme', () => {
116
+ const results = checkFileLayout(testDir);
117
+ const configResult = results.find((r) => r.name === 'layout/config');
118
+ assert.ok(configResult, 'Should have layout/config check result');
119
+ assert.strictEqual(configResult.status, 'warn', 'Should warn when no theme configured anywhere');
120
+ });
121
+ it('should warn when persona-config.yaml exists but has no theme field', () => {
122
+ // persona-config.yaml exists but without a theme
123
+ writeFileSync(join(pennyfarthingDir, 'persona-config.yaml'), yamlStringify({ output_style: 'terse' }));
124
+ const results = checkUserFilesBasic(testDir);
125
+ const personaResult = results.find((r) => r.name === 'persona-config');
126
+ assert.ok(personaResult, 'Should have persona-config check result');
127
+ assert.strictEqual(personaResult.status, 'warn', 'Should warn when persona-config.yaml exists but has no theme');
128
+ });
129
+ it('should warn when config.local.yaml exists but has no theme field', () => {
130
+ // config.local.yaml exists but without a theme
131
+ writeFileSync(join(pennyfarthingDir, 'config.local.yaml'), yamlStringify({ bell_mode: true }));
132
+ const results = checkUserFilesBasic(testDir);
133
+ const personaResult = results.find((r) => r.name === 'persona-config');
134
+ assert.ok(personaResult, 'Should have persona-config check result');
135
+ assert.strictEqual(personaResult.status, 'warn', 'Should warn when config.local.yaml exists but has no theme');
136
+ });
137
+ });
138
+ // ─── Consistency: Doctor agrees with getCurrentTheme ───────────────
139
+ describe('Doctor and getCurrentTheme should agree', () => {
140
+ it('doctor should pass whenever getCurrentTheme returns a non-null value', () => {
141
+ // The repro scenario: /pf-setup sets theme in persona-config.yaml
142
+ writeFileSync(join(pennyfarthingDir, 'persona-config.yaml'), yamlStringify({ theme: 'firefly' }));
143
+ const theme = getCurrentTheme(testDir);
144
+ assert.ok(theme, 'getCurrentTheme should find the theme');
145
+ const results = checkUserFilesBasic(testDir);
146
+ const personaResult = results.find((r) => r.name === 'persona-config');
147
+ assert.ok(personaResult, 'Should have persona-config check result');
148
+ assert.strictEqual(personaResult.status, 'pass', `Doctor says "${personaResult.status}" but getCurrentTheme returns "${theme}" — they disagree!`);
149
+ });
150
+ it('doctor should warn whenever getCurrentTheme returns null', () => {
151
+ // No theme anywhere
152
+ const theme = getCurrentTheme(testDir);
153
+ assert.strictEqual(theme, null, 'getCurrentTheme should return null');
154
+ const results = checkUserFilesBasic(testDir);
155
+ const personaResult = results.find((r) => r.name === 'persona-config');
156
+ assert.ok(personaResult, 'Should have persona-config check result');
157
+ assert.strictEqual(personaResult.status, 'warn', 'Doctor should warn when getCurrentTheme returns null');
158
+ });
159
+ });
160
+ });
161
+ //# sourceMappingURL=doctor-persona-config-false-negative.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-persona-config-false-negative.test.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor-persona-config-false-negative.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,YAAY,EACb,MAAM,sBAAsB,CAAC;AAc9B,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAQpD,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsKzE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GAAG,WAAW,EAAE,CAW/G;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GAAG,WAAW,EAAE,CAiE5G;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,EAAE,CA4I1G;AA0JD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAsDtE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA2BrE;AA8tCD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAkBnE;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAuD7D;AASD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,EAAE,CA+NhG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA8G/D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAoBtE;AAoBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA+JnE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAkF1E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CA4ExE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAsIlE"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,YAAY,EACb,MAAM,sBAAsB,CAAC;AAe9B,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAQpD,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsKzE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GAAG,WAAW,EAAE,CAW/G;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GAAG,WAAW,EAAE,CAiE5G;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,EAAE,CA4I1G;AAoLD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAuDtE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA2BrE;AA+tCD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAkBnE;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAuD7D;AASD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,EAAE,CAyOhG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA8G/D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAoBtE;AAoBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA+JnE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAkF1E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CA4ExE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAsKlE"}
@@ -8,10 +8,11 @@ import { logger } from '../utils/logger.js';
8
8
  import { readManifest } from '../utils/manifest.js';
9
9
  import { pathExists, isDirectory, isSymlink, fileMatchesHash, filesMatch } from '../utils/files.js';
10
10
  import { getPackageVersion, getAssetsPath } from '../utils/version.js';
11
- import { findNodeModulesPath } from '../utils/node-modules.js';
11
+ import { findNodeModulesPath, findLocalSymlinkTargets } from '../utils/node-modules.js';
12
12
  import { ALL_SYMLINKS, CORE_AGENTS } from '../utils/constants.js';
13
13
  import { getPfVersion, installPfCli } from '../utils/python.js';
14
14
  import { LEGACY_HOOK_MIGRATIONS, migrateHookPaths } from '../utils/settings.js';
15
+ import { getCurrentTheme } from '../utils/themes.js';
15
16
  /**
16
17
  * Category-to-check-function mapping for --category filtering.
17
18
  * Each category maps to the check functions that produce results in that group.
@@ -467,23 +468,45 @@ function refreshSkillsCopy(projectRoot, builtInSkillsPath) {
467
468
  */
468
469
  function checkSymlinks(projectRoot, nodeModulesPath) {
469
470
  const results = [];
470
- // Check if node_modules is available
471
- if (!nodeModulesPath) {
471
+ const localTargets = findLocalSymlinkTargets(projectRoot);
472
+ // Check if we have any source available
473
+ if (!nodeModulesPath && !localTargets) {
472
474
  results.push({
473
475
  name: 'core/node_modules',
474
476
  status: 'fail',
475
- detail: 'pennyfarthing not found in node_modules - run npm install'
477
+ detail: 'pennyfarthing not found in node_modules and no local symlink targets in repos.yaml'
476
478
  });
477
479
  return results;
478
480
  }
479
- results.push({
480
- name: 'core/node_modules',
481
- status: 'pass',
482
- detail: relative(projectRoot, nodeModulesPath)
483
- });
481
+ if (localTargets) {
482
+ results.push({
483
+ name: 'core/source',
484
+ status: 'pass',
485
+ detail: 'repos.yaml local symlink targets'
486
+ });
487
+ }
488
+ if (nodeModulesPath) {
489
+ results.push({
490
+ name: 'core/node_modules',
491
+ status: 'pass',
492
+ detail: relative(projectRoot, nodeModulesPath)
493
+ });
494
+ }
484
495
  for (const { name, link } of ALL_SYMLINKS) {
485
496
  const linkPath = join(projectRoot, link);
486
- const targetPath = join(nodeModulesPath, name);
497
+ // Determine the correct target: local source preferred, node_modules fallback
498
+ const localTarget = localTargets?.get(link);
499
+ const targetPath = localTarget
500
+ ? localTarget
501
+ : nodeModulesPath ? join(nodeModulesPath, name) : null;
502
+ if (!targetPath) {
503
+ results.push({
504
+ name: `symlink/${name}`,
505
+ status: 'warn',
506
+ detail: 'No source path available'
507
+ });
508
+ continue;
509
+ }
487
510
  const expectedRelative = relative(dirname(linkPath), targetPath);
488
511
  if (!isSymlink(linkPath)) {
489
512
  // Not a symlink
@@ -527,7 +550,7 @@ function checkSymlinks(projectRoot, nodeModulesPath) {
527
550
  results.push({
528
551
  name: `symlink/${name}`,
529
552
  status: 'fail',
530
- detail: 'Broken symlink - run npm install',
553
+ detail: `Broken symlink (${resolved}) - run update to fix`,
531
554
  fix: () => {
532
555
  unlinkSync(linkPath);
533
556
  symlinkSync(expectedRelative, linkPath);
@@ -571,12 +594,13 @@ export function checkUserFilesBasic(projectRoot) {
571
594
  detail: `${existingSidecars.length} agent sidecars configured`
572
595
  });
573
596
  }
574
- // Check persona config at canonical location
575
- const personaConfig = join(projectRoot, '.pennyfarthing/config.local.yaml');
597
+ // Check persona config use getCurrentTheme() which checks both
598
+ // config.local.yaml (priority 1) and persona-config.yaml (priority 2)
599
+ const detectedTheme = getCurrentTheme(projectRoot);
576
600
  results.push({
577
601
  name: 'persona-config',
578
- status: pathExists(personaConfig) ? 'pass' : 'warn',
579
- detail: pathExists(personaConfig) ? undefined : 'No theme configured'
602
+ status: detectedTheme ? 'pass' : 'warn',
603
+ detail: detectedTheme ? undefined : 'No theme configured'
580
604
  });
581
605
  // Check settings.local.json exists (CRITICAL - registers hooks with Claude Code)
582
606
  const settingsLocal = join(projectRoot, '.claude/settings.local.json');
@@ -652,12 +676,13 @@ function checkUserFiles(projectRoot) {
652
676
  detail: `${existingSidecars.length} agent sidecars configured`
653
677
  });
654
678
  }
655
- // Check persona config at canonical location
656
- const personaConfig = join(projectRoot, '.pennyfarthing/config.local.yaml');
679
+ // Check persona config use getCurrentTheme() which checks both
680
+ // config.local.yaml (priority 1) and persona-config.yaml (priority 2)
681
+ const detectedTheme = getCurrentTheme(projectRoot);
657
682
  results.push({
658
683
  name: 'persona-config',
659
- status: pathExists(personaConfig) ? 'pass' : 'warn',
660
- detail: pathExists(personaConfig) ? undefined : 'No theme configured'
684
+ status: detectedTheme ? 'pass' : 'warn',
685
+ detail: detectedTheme ? undefined : 'No theme configured'
661
686
  });
662
687
  // Check settings.local.json exists (CRITICAL - registers hooks with Claude Code)
663
688
  const settingsLocal = join(projectRoot, '.claude/settings.local.json');
@@ -1834,11 +1859,21 @@ export function checkGitHooks(projectRoot, nodeModulesPath) {
1834
1859
  if (!pathExists(gitHooksDir)) {
1835
1860
  return results;
1836
1861
  }
1837
- // Detect framework/orchestrator repo (has pennyfarthing-dist/ at project root)
1862
+ // Detect framework repo (has pennyfarthing-dist/ at root)
1838
1863
  const isFrameworkRepo = pathExists(join(projectRoot, 'pennyfarthing-dist'));
1839
- const frameworkHooksDir = isFrameworkRepo
1840
- ? join(projectRoot, 'pennyfarthing-dist/scripts/hooks')
1841
- : null;
1864
+ // Detect orchestrator repo (has pennyfarthing/pennyfarthing-dist/ — inlined framework)
1865
+ const isOrchestratorRepo = !isFrameworkRepo
1866
+ && pathExists(join(projectRoot, 'pennyfarthing/pennyfarthing-dist'));
1867
+ // Either pattern means hooks should be symlinks, not copies
1868
+ const isDevRepo = isFrameworkRepo || isOrchestratorRepo;
1869
+ // Resolve hooks source directory
1870
+ let frameworkHooksDir = null;
1871
+ if (isFrameworkRepo) {
1872
+ frameworkHooksDir = join(projectRoot, 'pennyfarthing-dist/scripts/hooks');
1873
+ }
1874
+ else if (isOrchestratorRepo) {
1875
+ frameworkHooksDir = join(projectRoot, 'pennyfarthing/pennyfarthing-dist/scripts/hooks');
1876
+ }
1842
1877
  // Need either node_modules or framework source to compare against
1843
1878
  if (!nodeModulesPath && !frameworkHooksDir) {
1844
1879
  return results;
@@ -1869,9 +1904,9 @@ export function checkGitHooks(projectRoot, nodeModulesPath) {
1869
1904
  status: 'warn',
1870
1905
  detail: 'Not installed',
1871
1906
  fix: () => {
1872
- if (isFrameworkRepo) {
1873
- // Framework repos: create symlink (relative from hooks dir to source)
1874
- const absSource = join(projectRoot, 'pennyfarthing-dist/scripts/hooks', hook.source);
1907
+ if (isDevRepo) {
1908
+ // Dev repos (framework or orchestrator): create symlink from hooks dir to source
1909
+ const absSource = join(frameworkHooksDir, hook.source);
1875
1910
  const relTarget = relative(gitHooksDir, absSource);
1876
1911
  symlinkSync(relTarget, destPath);
1877
1912
  }
@@ -1886,15 +1921,15 @@ export function checkGitHooks(projectRoot, nodeModulesPath) {
1886
1921
  }
1887
1922
  // Check if hook is a symlink (framework repos should use symlinks)
1888
1923
  const hookIsSymlink = isSymlink(destPath);
1889
- if (isFrameworkRepo && !hookIsSymlink) {
1890
- // Framework repo has a copied hook instead of a symlink — it will go stale
1924
+ if (isDevRepo && !hookIsSymlink) {
1925
+ // Dev repo has a copied hook instead of a symlink — it will go stale
1891
1926
  results.push({
1892
1927
  name: `git-hook/${hook.dest}`,
1893
1928
  status: 'warn',
1894
1929
  detail: 'Copy instead of symlink (will go stale)',
1895
1930
  fix: () => {
1896
1931
  // Backup existing, replace with symlink
1897
- const absSource = join(projectRoot, 'pennyfarthing-dist/scripts/hooks', hook.source);
1932
+ const absSource = join(frameworkHooksDir, hook.source);
1898
1933
  const relTarget = relative(gitHooksDir, absSource);
1899
1934
  renameSync(destPath, `${destPath}.backup`);
1900
1935
  symlinkSync(relTarget, destPath);
@@ -1921,7 +1956,7 @@ export function checkGitHooks(projectRoot, nodeModulesPath) {
1921
1956
  detail: `Broken symlink → ${target}`,
1922
1957
  fix: () => {
1923
1958
  unlinkSync(destPath);
1924
- const absSource = join(projectRoot, 'pennyfarthing-dist/scripts/hooks', hook.source);
1959
+ const absSource = join(frameworkHooksDir ?? join(nodeModulesPath, 'scripts/hooks'), hook.source);
1925
1960
  const relTarget = relative(gitHooksDir, absSource);
1926
1961
  symlinkSync(relTarget, destPath);
1927
1962
  }
@@ -2506,12 +2541,14 @@ export function checkFileLayout(projectRoot) {
2506
2541
  status: existsSync(manifestPath) ? 'pass' : 'fail',
2507
2542
  detail: existsSync(manifestPath) ? undefined : 'Missing .pennyfarthing/manifest.json'
2508
2543
  });
2509
- // 2. Config at .pennyfarthing/config.local.yaml
2544
+ // 2. Theme config — use getCurrentTheme() which checks both
2545
+ // config.local.yaml (priority 1) and persona-config.yaml (priority 2)
2510
2546
  const configPath = join(projectRoot, '.pennyfarthing/config.local.yaml');
2547
+ const layoutTheme = getCurrentTheme(projectRoot);
2511
2548
  results.push({
2512
2549
  name: 'layout/config',
2513
- status: existsSync(configPath) ? 'pass' : 'warn',
2514
- detail: existsSync(configPath) ? undefined : 'No theme configured at .pennyfarthing/config.local.yaml'
2550
+ status: layoutTheme ? 'pass' : 'warn',
2551
+ detail: layoutTheme ? undefined : 'No theme configured at .pennyfarthing/config.local.yaml'
2515
2552
  });
2516
2553
  // 3. Old config at .claude/persona-config.yaml
2517
2554
  const oldConfigPath = join(projectRoot, '.claude/persona-config.yaml');
@@ -2591,6 +2628,26 @@ export function checkFileLayout(projectRoot) {
2591
2628
  status: 'pass',
2592
2629
  detail: undefined
2593
2630
  });
2631
+ // Check execute permission on each shell script in project hooks
2632
+ try {
2633
+ const hookFiles = readdirSync(projectHooksPath).filter(f => f.endsWith('.sh'));
2634
+ for (const file of hookFiles) {
2635
+ const hookPath = join(projectHooksPath, file);
2636
+ const stats = statSync(hookPath);
2637
+ const isExecutable = (stats.mode & 0o111) !== 0;
2638
+ results.push({
2639
+ name: `layout/project-hooks/${file}`,
2640
+ status: isExecutable ? 'pass' : 'warn',
2641
+ detail: isExecutable ? undefined : 'Not executable — will cause Permission denied on session start',
2642
+ fix: isExecutable ? undefined : () => {
2643
+ chmodSync(hookPath, 0o755);
2644
+ }
2645
+ });
2646
+ }
2647
+ }
2648
+ catch {
2649
+ // Ignore read errors
2650
+ }
2594
2651
  }
2595
2652
  // 8. Old project hooks at .claude/project/hooks/
2596
2653
  const oldProjectHooksPath = join(projectRoot, '.claude/project/hooks');
@@ -2620,6 +2677,17 @@ export function checkFileLayout(projectRoot) {
2620
2677
  }
2621
2678
  removeSync(oldProjectHooksPath);
2622
2679
  }
2680
+ // Ensure migrated shell scripts are executable
2681
+ try {
2682
+ for (const file of readdirSync(projectHooksPath)) {
2683
+ if (file.endsWith('.sh')) {
2684
+ chmodSync(join(projectHooksPath, file), 0o755);
2685
+ }
2686
+ }
2687
+ }
2688
+ catch {
2689
+ // Ignore
2690
+ }
2623
2691
  }
2624
2692
  });
2625
2693
  }