@pennyfarthing/core 11.3.3 → 11.3.5

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 (577) hide show
  1. package/README.md +1 -1
  2. package/package.json +3 -2
  3. package/packages/core/dist/workflow/__test_context_watch__/.session/.tandem-turn-counter +1 -0
  4. package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-session.md +3 -0
  5. package/packages/core/dist/workflow/__test_context_watch__/.session/95-6-tandem-architect.md +6 -0
  6. package/packages/core/dist/workflow/__test_file_watch__/.session/95-4-tandem-architect.md +6 -0
  7. package/packages/core/dist/workflow/__test_file_watch__/workdir/trigger.ts +1 -0
  8. package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-architect.md +6 -0
  9. package/packages/core/dist/workflow/__test_tool_watch__/.session/95-5-tandem-toolcalls.jsonl +1 -0
  10. package/packages/core/dist/workflow/cross-entity-validation.d.ts +117 -0
  11. package/packages/core/dist/workflow/cross-entity-validation.d.ts.map +1 -0
  12. package/packages/core/dist/workflow/cross-entity-validation.js +148 -0
  13. package/packages/core/dist/workflow/cross-entity-validation.js.map +1 -0
  14. package/packages/core/dist/workflow/cross-entity-validation.test.d.ts +10 -0
  15. package/packages/core/dist/workflow/cross-entity-validation.test.d.ts.map +1 -0
  16. package/packages/core/dist/workflow/cross-entity-validation.test.js +512 -0
  17. package/packages/core/dist/workflow/cross-entity-validation.test.js.map +1 -0
  18. package/pennyfarthing-dist/agents/sm-finish.md +2 -2
  19. package/pennyfarthing-dist/agents/testing-runner.md +1 -1
  20. package/pennyfarthing-dist/commands/pf-prime.md +1 -1
  21. package/pennyfarthing-dist/guides/agent-behavior.md +1 -1
  22. package/pennyfarthing-dist/guides/bikerack.md +1 -1
  23. package/pennyfarthing-dist/guides/brownfield-tools.md +7 -7
  24. package/pennyfarthing-dist/guides/gates.md +3 -3
  25. package/pennyfarthing-dist/guides/handoff-cli.md +6 -6
  26. package/pennyfarthing-dist/guides/prime.md +6 -6
  27. package/pennyfarthing-dist/guides/scale-levels.md +1 -1
  28. package/pennyfarthing-dist/personas/themes/firefly.yaml +4 -4
  29. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/CLAUDE.md +2 -2
  30. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/README.md +2 -2
  31. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__pycache__/__init__.cpython-314.pyc +0 -0
  32. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__pycache__/cli.cpython-314.pyc +0 -0
  33. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__pycache__/context.cpython-314.pyc +0 -0
  34. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  35. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/cli.cpython-314.pyc +0 -0
  36. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/focus.cpython-314.pyc +0 -0
  37. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__pycache__/split.cpython-314.pyc +0 -0
  38. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/cli.py +3 -3
  39. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/focus.py +1 -1
  40. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/split.py +1 -1
  41. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bellmode_hook.py +2 -2
  42. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__init__.py +1 -1
  43. package/pennyfarthing-dist/pf/bikerack/__main__.py +5 -0
  44. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  45. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  46. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  47. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/audit_log_panel.py +1 -1
  48. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/background_panel.py +1 -1
  49. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/changed_panel.py +2 -2
  50. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/cli.py +3 -3
  51. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/context_meter_footer.py +1 -1
  52. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/debug_panel.py +1 -1
  53. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/diffs_panel.py +1 -1
  54. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/git_panel.py +1 -1
  55. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/launcher.py +2 -2
  56. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/portrait_resolver.py +2 -2
  57. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/progress_panel.py +1 -1
  58. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/sprint_panel.py +3 -3
  59. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/story_detail_data.py +1 -1
  60. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/story_detail_screen.py +2 -2
  61. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/tui.py +17 -17
  62. package/pennyfarthing-dist/pf/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
  63. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/__pycache__/cli.cpython-314.pyc +0 -0
  64. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/cli.py +7 -7
  65. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/importer.py +4 -4
  66. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/sync.py +9 -9
  67. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/test_parser.py +2 -2
  68. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/test_sync.py +2 -2
  69. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/brownfield/__init__.py +1 -1
  70. package/pennyfarthing-dist/pf/brownfield/__main__.py +8 -0
  71. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/brownfield/cli.py +2 -2
  72. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/cli.py +24 -24
  73. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/__init__.py +2 -2
  74. package/pennyfarthing-dist/pf/codemarkers/__main__.py +6 -0
  75. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/analyze.py +1 -1
  76. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/cli.py +8 -8
  77. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/formatters.py +2 -2
  78. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__init__.py +2 -2
  79. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__pycache__/__init__.cpython-314.pyc +0 -0
  80. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__pycache__/config.cpython-314.pyc +0 -0
  81. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/__pycache__/output.cpython-314.pyc +0 -0
  82. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/pr_config.py +1 -1
  83. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/themes.py +1 -1
  84. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/__init__.py +2 -2
  85. package/pennyfarthing-dist/pf/complexity/__main__.py +6 -0
  86. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/analyze.py +1 -1
  87. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/cli.py +4 -4
  88. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/formatters.py +1 -1
  89. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/config.py +2 -2
  90. package/pennyfarthing-dist/pf/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  91. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  92. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/cli.py +5 -5
  93. package/pennyfarthing-dist/pf/deadcode/__main__.py +6 -0
  94. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  95. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  96. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/analyze.py +1 -1
  97. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/cli.py +8 -8
  98. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/formatters.py +1 -1
  99. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/__init__.py +2 -2
  100. package/pennyfarthing-dist/pf/dependencies/__main__.py +5 -0
  101. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/analyze.py +1 -1
  102. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/cli.py +4 -4
  103. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/formatters.py +1 -1
  104. package/pennyfarthing-dist/pf/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  105. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/epic/__pycache__/cli.cpython-314.pyc +0 -0
  106. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/gate/cli.py +2 -2
  107. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/__init__.py +3 -3
  108. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/create_branches.py +3 -3
  109. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/hooks_installer.py +1 -1
  110. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/repos.py +2 -2
  111. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/status_all.py +1 -1
  112. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git/worktree.py +3 -3
  113. package/pennyfarthing-dist/pf/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  114. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  115. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git_group/cli.py +10 -10
  116. package/pennyfarthing-dist/pf/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  117. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  118. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/cli.py +5 -5
  119. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/marker.py +1 -1
  120. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/phase_check.py +2 -2
  121. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__init__.py +2 -2
  122. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__main__.py +2 -2
  123. package/pennyfarthing-dist/pf/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  124. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  125. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  126. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  127. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/analyze.py +8 -8
  128. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/cli.py +3 -3
  129. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/formatters.py +1 -1
  130. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  131. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  132. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  133. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  134. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  135. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  136. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  137. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/bell_mode.py +1 -1
  138. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/cli.py +11 -11
  139. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/context_breaker.py +1 -1
  140. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/context_warning.py +1 -1
  141. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/cyclist_pretooluse.py +1 -1
  142. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/schema_validation.py +1 -1
  143. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/session_start.py +3 -3
  144. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/sprint_yaml_validation.py +1 -1
  145. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/statusline.py +1 -1
  146. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks.py +3 -3
  147. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__init__.py +2 -2
  148. package/pennyfarthing-dist/pf/hotspots/__main__.py +6 -0
  149. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  150. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  151. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  152. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  153. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/analyze.py +2 -2
  154. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/cli.py +5 -5
  155. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/formatters.py +2 -2
  156. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__init__.py +5 -5
  157. package/pennyfarthing-dist/pf/jira/__main__.py +10 -0
  158. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  159. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  160. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/claim.cpython-314.pyc +0 -0
  161. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/cli.cpython-314.pyc +0 -0
  162. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/client.cpython-314.pyc +0 -0
  163. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/create.cpython-314.pyc +0 -0
  164. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/epic.cpython-314.pyc +0 -0
  165. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/operations.cpython-314.pyc +0 -0
  166. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  167. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/story.cpython-314.pyc +0 -0
  168. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/__pycache__/sync.cpython-314.pyc +0 -0
  169. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/bidirectional.py +9 -9
  170. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/claim.py +4 -4
  171. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/cli.py +15 -15
  172. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/client.py +1 -1
  173. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/create.py +5 -5
  174. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/epic.py +6 -6
  175. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/operations.py +1 -1
  176. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/reconcile.py +2 -2
  177. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/story.py +6 -6
  178. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira/sync.py +5 -5
  179. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_bidirectional_sync.py +3 -3
  180. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_epic_creation.py +3 -3
  181. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_sync.py +3 -3
  182. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/jira_sync_story.py +3 -3
  183. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  184. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/__pycache__/cli.cpython-314.pyc +0 -0
  185. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/cli.py +7 -7
  186. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/__init__.py +5 -5
  187. package/pennyfarthing-dist/pf/migration/__main__.py +10 -0
  188. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/cli.py +6 -6
  189. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/validate.py +7 -7
  190. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/output.py +2 -2
  191. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/patch_mode.py +1 -1
  192. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/preflight/__init__.py +1 -1
  193. package/pennyfarthing-dist/pf/preflight/__main__.py +10 -0
  194. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/preflight/cli.py +2 -2
  195. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/pretooluse_hook.py +1 -1
  196. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/__init__.py +7 -7
  197. package/pennyfarthing-dist/pf/prime/__main__.py +8 -0
  198. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/cli.py +9 -9
  199. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/heatmap.py +1 -1
  200. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/loader.py +3 -3
  201. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/persona.py +4 -4
  202. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/session.py +2 -2
  203. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/tiers.py +4 -4
  204. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/workflow.py +3 -3
  205. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/schema_validation_hook.py +1 -1
  206. package/pennyfarthing-dist/pf/session/__pycache__/__init__.cpython-314.pyc +0 -0
  207. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session/__pycache__/cli.cpython-314.pyc +0 -0
  208. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session/cli.py +2 -2
  209. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session_start_hook.py +1 -1
  210. package/pennyfarthing-dist/pf/settings/__pycache__/__init__.cpython-314.pyc +0 -0
  211. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/__pycache__/cli.cpython-314.pyc +0 -0
  212. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/cli.py +3 -3
  213. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/settings.py +1 -1
  214. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__init__.py +5 -5
  215. package/pennyfarthing-dist/pf/sprint/__main__.py +10 -0
  216. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  217. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  218. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  219. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  220. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  221. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  222. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/status.cpython-314.pyc +0 -0
  223. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  224. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  225. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  226. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  227. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/work.cpython-314.pyc +0 -0
  228. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  229. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/archive.py +3 -3
  230. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/archive_epic.py +3 -3
  231. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/cli.py +41 -41
  232. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/epic_add.py +3 -3
  233. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/epic_update.py +3 -3
  234. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/import_epic.py +2 -2
  235. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/loader.py +1 -1
  236. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/status.py +1 -1
  237. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/story_add.py +5 -5
  238. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/story_finish.py +3 -3
  239. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/story_update.py +4 -4
  240. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/validate_cmd.py +2 -2
  241. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/validator.py +3 -3
  242. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/work.py +4 -4
  243. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/__init__.py +7 -7
  244. package/pennyfarthing-dist/pf/story/__main__.py +10 -0
  245. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/cli.py +4 -4
  246. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/create.py +2 -2
  247. package/pennyfarthing-dist/pf/tests/__init__.py +1 -0
  248. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/conftest.py +3 -3
  249. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_108_1_gate_migration.py +3 -3
  250. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_108_2_remove_handoff_fallback.py +2 -2
  251. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_archive_epic.py +2 -2
  252. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_bc.py +1 -1
  253. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_bikerack.py +39 -39
  254. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_brownfield.py +6 -6
  255. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_cli_modules.py +20 -20
  256. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_cli_normalization.py +1 -1
  257. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_codemarkers.py +60 -60
  258. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_common.py +17 -17
  259. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_confidence_sm_evaluation.py +1 -1
  260. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_confidence_sm_gate.py +3 -3
  261. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_dialogue_manager.py +11 -11
  262. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_epic_shard_validation.py +15 -15
  263. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_gate_file_resolution.py +1 -1
  264. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_gate_runner.py +1 -1
  265. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_git_utils.py +8 -8
  266. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_handoff_cli.py +12 -12
  267. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_handoff_e2e.py +2 -2
  268. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_healthscore.py +20 -20
  269. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_jira_package.py +29 -29
  270. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_package_structure.py +42 -42
  271. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_patch_mode.py +22 -22
  272. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_prime.py +41 -41
  273. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_resolve_gate_file_field.py +1 -3
  274. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_sprint_package.py +30 -30
  275. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_sprint_panel.py +2 -2
  276. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_sprint_validator.py +1 -1
  277. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_story_add.py +11 -11
  278. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_story_package.py +12 -12
  279. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_story_update.py +16 -16
  280. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_tiers.py +72 -72
  281. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_token_counting.py +28 -28
  282. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_topology_loader.py +37 -37
  283. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_tui_focus.py +2 -2
  284. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_tui_panel_persistence.py +10 -10
  285. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_validate_cmd.py +1 -1
  286. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_version_sentinel.py +1 -1
  287. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_workflow_check.py +7 -7
  288. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_workflow_list_team.py +1 -1
  289. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/tests/test_yaml_io.py +1 -1
  290. package/pennyfarthing-dist/pf/theme/__main__.py +6 -0
  291. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  292. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/__pycache__/cli.cpython-314.pyc +0 -0
  293. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/cli.py +6 -6
  294. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  295. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/__pycache__/cli.cpython-314.pyc +0 -0
  296. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/agent.py +1 -1
  297. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/schema.py +2 -2
  298. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/skill_command.py +1 -1
  299. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/sprint.py +2 -2
  300. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/tandem_awareness.py +1 -1
  301. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/team_mode.py +1 -1
  302. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/workflow.py +1 -1
  303. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/cli.py +9 -9
  304. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/welcome_hook.py +1 -1
  305. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__init__.py +3 -3
  306. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  307. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  308. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  309. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/__pycache__/state.cpython-314.pyc +0 -0
  310. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/cli.py +18 -18
  311. package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/helpers.py +1 -1
  312. package/pennyfarthing-dist/pyproject.toml +18 -0
  313. package/pennyfarthing-dist/scripts/core/agent-session.sh +3 -3
  314. package/pennyfarthing-dist/scripts/core/check-context.sh +8 -8
  315. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +3 -3
  316. package/pennyfarthing-dist/scripts/jira/README.md +1 -1
  317. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +1 -1
  318. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +1 -1
  319. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +1 -1
  320. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +1 -1
  321. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +1 -1
  322. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +1 -1
  323. package/pennyfarthing-dist/scripts/lib/common.sh +3 -3
  324. package/pennyfarthing-dist/scripts/lib/run-pf.sh +11 -13
  325. package/pennyfarthing-dist/scripts/sprint/README.md +1 -1
  326. package/pennyfarthing-dist/scripts/story/create-story.sh +1 -1
  327. package/pennyfarthing-dist/scripts/story/size-story.sh +1 -1
  328. package/pennyfarthing-dist/scripts/story/story-template.sh +1 -1
  329. package/pennyfarthing-dist/scripts/theme/list-themes.sh +3 -3
  330. package/pennyfarthing-dist/templates/pyproject.toml +3 -3
  331. package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  332. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  333. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  334. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  335. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  336. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  337. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  338. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  339. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  340. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  341. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  342. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  343. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  344. package/pennyfarthing_scripts/bikerack/__main__.py +0 -5
  345. package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  346. package/pennyfarthing_scripts/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
  347. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  348. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  349. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  350. package/pennyfarthing_scripts/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
  351. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  352. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  353. package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  354. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  355. package/pennyfarthing_scripts/bikerack/__pycache__/portrait.cpython-314.pyc +0 -0
  356. package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  357. package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  358. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  359. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  360. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  361. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  362. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  363. package/pennyfarthing_scripts/bmad/__pycache__/__init__.cpython-314.pyc +0 -0
  364. package/pennyfarthing_scripts/bmad/__pycache__/parser.cpython-314.pyc +0 -0
  365. package/pennyfarthing_scripts/bmad/__pycache__/sync.cpython-314.pyc +0 -0
  366. package/pennyfarthing_scripts/bmad/__pycache__/test_parser.cpython-314-pytest-9.0.2.pyc +0 -0
  367. package/pennyfarthing_scripts/bmad/__pycache__/test_sync.cpython-314-pytest-9.0.2.pyc +0 -0
  368. package/pennyfarthing_scripts/brownfield/__main__.py +0 -8
  369. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  370. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  371. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  372. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  373. package/pennyfarthing_scripts/codemarkers/__main__.py +0 -6
  374. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  375. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  376. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  377. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  378. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  379. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  380. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  381. package/pennyfarthing_scripts/complexity/__main__.py +0 -6
  382. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  383. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  384. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  385. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  386. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  387. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  388. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  389. package/pennyfarthing_scripts/deadcode/__main__.py +0 -6
  390. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  391. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  392. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  393. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  394. package/pennyfarthing_scripts/dependencies/__main__.py +0 -5
  395. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  396. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  397. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  398. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  399. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  400. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  401. package/pennyfarthing_scripts/epic/__pycache__/__init__.cpython-314.pyc +0 -0
  402. package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
  403. package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
  404. package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
  405. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  406. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  407. package/pennyfarthing_scripts/git/__pycache__/hooks_installer.cpython-314.pyc +0 -0
  408. package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
  409. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  410. package/pennyfarthing_scripts/git/__pycache__/worktree.cpython-314.pyc +0 -0
  411. package/pennyfarthing_scripts/git_group/__pycache__/__init__.cpython-314.pyc +0 -0
  412. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  413. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  414. package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  415. package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  416. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  417. package/pennyfarthing_scripts/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  418. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  419. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  420. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  421. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  422. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  423. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  424. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  425. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  426. package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  427. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  428. package/pennyfarthing_scripts/hotspots/__main__.py +0 -6
  429. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  430. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  431. package/pennyfarthing_scripts/jira/__main__.py +0 -10
  432. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  433. package/pennyfarthing_scripts/migration/__main__.py +0 -10
  434. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  435. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  436. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  437. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  438. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  439. package/pennyfarthing_scripts/preflight/__main__.py +0 -10
  440. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  441. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  442. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  443. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  444. package/pennyfarthing_scripts/prime/__main__.py +0 -8
  445. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  446. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  447. package/pennyfarthing_scripts/prime/__pycache__/heatmap.cpython-314.pyc +0 -0
  448. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  449. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  450. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  451. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  452. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  453. package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  454. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  455. package/pennyfarthing_scripts/session/__pycache__/__init__.cpython-314.pyc +0 -0
  456. package/pennyfarthing_scripts/settings/__pycache__/__init__.cpython-314.pyc +0 -0
  457. package/pennyfarthing_scripts/settings/__pycache__/settings.cpython-314.pyc +0 -0
  458. package/pennyfarthing_scripts/sprint/__main__.py +0 -10
  459. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  460. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  461. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  462. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  463. package/pennyfarthing_scripts/story/__main__.py +0 -10
  464. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  465. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  466. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  467. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  468. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  469. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  470. package/pennyfarthing_scripts/tests/__init__.py +0 -1
  471. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  472. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  473. package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
  474. package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  475. package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  476. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  477. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  478. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  479. package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  480. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  481. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  482. package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_evaluation.cpython-314-pytest-9.0.2.pyc +0 -0
  483. package/pennyfarthing_scripts/tests/__pycache__/test_confidence_sm_gate.cpython-314-pytest-9.0.2.pyc +0 -0
  484. package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  485. package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
  486. package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
  487. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  488. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  489. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  490. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  491. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  492. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  493. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  494. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  495. package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
  496. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  497. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  498. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  499. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  500. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  501. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  502. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  503. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  504. package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  505. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  506. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  507. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  508. package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  509. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  510. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314-pytest-9.0.2.pyc +0 -0
  511. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314.pyc +0 -0
  512. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  513. package/pennyfarthing_scripts/theme/__main__.py +0 -6
  514. package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  515. package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  516. package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  517. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  518. package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  519. package/pennyfarthing_scripts/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
  520. package/pennyfarthing_scripts/validate/adapters/__pycache__/team_mode.cpython-314.pyc +0 -0
  521. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  522. package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  523. package/pennyfarthing_scripts/workflow/__pycache__/team_lifecycle.cpython-314.pyc +0 -0
  524. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/__init__.py +0 -0
  525. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bc/__init__.py +0 -0
  526. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/base_panel.py +0 -0
  527. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/events.py +0 -0
  528. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bikerack/ws_client.py +0 -0
  529. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/__init__.py +0 -0
  530. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/bmad/parser.py +0 -0
  531. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/brownfield/discover.py +0 -0
  532. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/codemarkers/models.py +0 -0
  533. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/config.py +0 -0
  534. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/common/output.py +0 -0
  535. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/complexity/models.py +0 -0
  536. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/__init__.py +0 -0
  537. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/consultation/dialogue_manager.py +0 -0
  538. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/context.py +0 -0
  539. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/__init__.py +0 -0
  540. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/deadcode/models.py +0 -0
  541. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/dependencies/models.py +0 -0
  542. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/epic/__init__.py +0 -0
  543. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/epic/cli.py +0 -0
  544. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/gate/__init__.py +0 -0
  545. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/gate/validate.py +0 -0
  546. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/git_group/__init__.py +0 -0
  547. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/__init__.py +0 -0
  548. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/complete_phase.py +0 -0
  549. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/gate_file.py +0 -0
  550. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/gate_runner.py +0 -0
  551. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/handoff/resolve_gate.py +0 -0
  552. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/healthscore/models.py +0 -0
  553. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/__init__.py +0 -0
  554. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/cyclist-pretooluse-hook.sh +0 -0
  555. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/pre_edit_check.py +0 -0
  556. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/reflector_check.py +0 -0
  557. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hooks/session_stop.py +0 -0
  558. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/hotspots/models.py +0 -0
  559. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/launch/__init__.py +0 -0
  560. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/session.py +0 -0
  561. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/skill.py +0 -0
  562. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/migration/step.py +0 -0
  563. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/preflight/finish.py +0 -0
  564. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/models.py +0 -0
  565. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/prime/version_sentinel.py +0 -0
  566. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/session/__init__.py +0 -0
  567. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/settings/__init__.py +0 -0
  568. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/sprint/yaml_io.py +0 -0
  569. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/size.py +0 -0
  570. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/story/template.py +0 -0
  571. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/swebench.py +0 -0
  572. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/theme/__init__.py +0 -0
  573. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/__init__.py +0 -0
  574. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/validate/adapters/__init__.py +0 -0
  575. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/scale.py +0 -0
  576. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/state.py +0 -0
  577. /package/{pennyfarthing_scripts → pennyfarthing-dist/pf}/workflow/team_lifecycle.py +0 -0
@@ -0,0 +1,512 @@
1
+ /**
2
+ * Tests for Story 91-15: Cross-Entity Reference Validation
3
+ *
4
+ * Layer 4 validation — semantic cross-references between agents, workflows,
5
+ * commands, and skills. Builds on Layers 0-3 (formatting, file refs, schema, graph).
6
+ *
7
+ * Run with: node --test dist/workflow/cross-entity-validation.test.js
8
+ */
9
+ import { describe, it } from 'node:test';
10
+ import assert from 'node:assert/strict';
11
+ import { validateCrossEntityRefs, } from './cross-entity-validation.js';
12
+ // ---------------------------------------------------------------------------
13
+ // Helpers
14
+ // ---------------------------------------------------------------------------
15
+ /** Minimal valid context with typical agents, workflows, commands, skills */
16
+ function defaultContext(overrides) {
17
+ return {
18
+ knownAgentFiles: ['sm', 'tea', 'dev', 'reviewer', 'architect', 'pm'],
19
+ knownWorkflowNames: ['tdd', 'trivial', 'bdd', 'tdd-tandem'],
20
+ knownCommandFiles: ['pf-sprint', 'pf-dev', 'pf-tea', 'pf-reviewer', 'pf-sm'],
21
+ knownSkillNames: ['pf-sprint', 'pf-testing', 'pf-jira', 'pf-code-review'],
22
+ workflowAgentRefs: [
23
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'dev', 'reviewer'] },
24
+ { workflow: 'trivial', referencedAgents: ['sm', 'dev', 'reviewer'] },
25
+ ],
26
+ agentWorkflowRefs: [
27
+ { agent: 'sm', referencedWorkflows: ['tdd', 'trivial'] },
28
+ { agent: 'tea', referencedWorkflows: ['tdd'] },
29
+ { agent: 'dev', referencedWorkflows: ['tdd', 'trivial'] },
30
+ { agent: 'reviewer', referencedWorkflows: ['tdd', 'trivial'] },
31
+ ],
32
+ skillEntityRefs: [
33
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira'] },
34
+ { skill: 'pf-testing', relatedSkills: ['pf-code-review'] },
35
+ { skill: 'pf-jira', relatedSkills: ['pf-sprint'] },
36
+ { skill: 'pf-code-review', relatedSkills: ['pf-testing'] },
37
+ ],
38
+ commandSkillRefs: [
39
+ { command: 'pf-sprint', referencedSkills: ['pf-sprint'] },
40
+ { command: 'pf-dev', referencedSkills: ['pf-testing'] },
41
+ ],
42
+ ...overrides,
43
+ };
44
+ }
45
+ /** Helper to collect error messages from result */
46
+ function errorMessages(result) {
47
+ return (result.errors ?? []).map(e => e.message);
48
+ }
49
+ /** Helper to collect warning messages from result */
50
+ function warningMessages(result) {
51
+ return (result.warnings ?? []).map(w => w.message);
52
+ }
53
+ // ===========================================================================
54
+ // Tests
55
+ // ===========================================================================
56
+ describe('Cross-Entity Reference Validation (91-15)', () => {
57
+ // -------------------------------------------------------------------------
58
+ // AC1: Validate that agents referenced in workflows exist
59
+ // -------------------------------------------------------------------------
60
+ describe('AC1: Agents referenced in workflows exist', () => {
61
+ it('should accept when all workflow-referenced agents have agent files', () => {
62
+ const ctx = defaultContext();
63
+ const result = validateCrossEntityRefs(ctx);
64
+ assert.strictEqual(result.valid, true, 'All agents exist — should be valid');
65
+ assert.strictEqual((result.errors ?? []).length, 0, 'No errors expected');
66
+ });
67
+ it('should error when workflow references an agent with no agent file', () => {
68
+ const ctx = defaultContext({
69
+ workflowAgentRefs: [
70
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'ghost-agent', 'reviewer'] },
71
+ ],
72
+ });
73
+ const result = validateCrossEntityRefs(ctx);
74
+ assert.strictEqual(result.valid, false, 'Missing agent file should fail');
75
+ const msgs = errorMessages(result);
76
+ assert.ok(msgs.some(m => m.includes('ghost-agent') && m.includes('tdd')), `Expected error about 'ghost-agent' in workflow 'tdd', got: ${msgs.join('; ')}`);
77
+ });
78
+ it('should report all missing agents across multiple workflows', () => {
79
+ const ctx = defaultContext({
80
+ workflowAgentRefs: [
81
+ { workflow: 'tdd', referencedAgents: ['sm', 'phantom'] },
82
+ { workflow: 'trivial', referencedAgents: ['missing-dev', 'reviewer'] },
83
+ ],
84
+ });
85
+ const result = validateCrossEntityRefs(ctx);
86
+ assert.strictEqual(result.valid, false);
87
+ const msgs = errorMessages(result);
88
+ assert.ok(msgs.some(m => m.includes('phantom')), 'Should report phantom');
89
+ assert.ok(msgs.some(m => m.includes('missing-dev')), 'Should report missing-dev');
90
+ });
91
+ it('should error for each distinct missing agent in a workflow', () => {
92
+ const ctx = defaultContext({
93
+ workflowAgentRefs: [
94
+ { workflow: 'broken', referencedAgents: ['nobody', 'also-nobody'] },
95
+ ],
96
+ });
97
+ const result = validateCrossEntityRefs(ctx);
98
+ assert.strictEqual(result.valid, false);
99
+ const msgs = errorMessages(result);
100
+ assert.ok(msgs.some(m => m.includes('nobody')), 'Should report nobody');
101
+ assert.ok(msgs.some(m => m.includes('also-nobody')), 'Should report also-nobody');
102
+ });
103
+ });
104
+ // -------------------------------------------------------------------------
105
+ // AC2: Validate that workflows referenced in agents are properly defined
106
+ // -------------------------------------------------------------------------
107
+ describe('AC2: Workflows referenced in agents are properly defined', () => {
108
+ it('should accept when all agent-referenced workflows exist', () => {
109
+ const ctx = defaultContext();
110
+ const result = validateCrossEntityRefs(ctx);
111
+ assert.strictEqual(result.valid, true, 'All workflows exist — should be valid');
112
+ });
113
+ it('should error when agent references a workflow that does not exist', () => {
114
+ const ctx = defaultContext({
115
+ agentWorkflowRefs: [
116
+ { agent: 'dev', referencedWorkflows: ['tdd', 'nonexistent-workflow'] },
117
+ ],
118
+ });
119
+ const result = validateCrossEntityRefs(ctx);
120
+ assert.strictEqual(result.valid, false, 'Missing workflow should fail');
121
+ const msgs = errorMessages(result);
122
+ assert.ok(msgs.some(m => m.includes('nonexistent-workflow') && m.includes('dev')), `Expected error about 'nonexistent-workflow' referenced by 'dev', got: ${msgs.join('; ')}`);
123
+ });
124
+ it('should report multiple missing workflow references across agents', () => {
125
+ const ctx = defaultContext({
126
+ agentWorkflowRefs: [
127
+ { agent: 'sm', referencedWorkflows: ['tdd', 'missing-wf-1'] },
128
+ { agent: 'tea', referencedWorkflows: ['missing-wf-2'] },
129
+ ],
130
+ });
131
+ const result = validateCrossEntityRefs(ctx);
132
+ assert.strictEqual(result.valid, false);
133
+ const msgs = errorMessages(result);
134
+ assert.ok(msgs.some(m => m.includes('missing-wf-1')), 'Should report missing-wf-1');
135
+ assert.ok(msgs.some(m => m.includes('missing-wf-2')), 'Should report missing-wf-2');
136
+ });
137
+ it('should accept agents with empty workflow references', () => {
138
+ const ctx = defaultContext({
139
+ agentWorkflowRefs: [
140
+ { agent: 'orchestrator', referencedWorkflows: [] },
141
+ ],
142
+ });
143
+ const result = validateCrossEntityRefs(ctx);
144
+ // An agent that doesn't reference any workflows is fine
145
+ assert.strictEqual(result.valid, true);
146
+ });
147
+ });
148
+ // -------------------------------------------------------------------------
149
+ // AC3: Validate that commands referenced in skills exist
150
+ // (skills' related_skills references exist in the skill registry)
151
+ // -------------------------------------------------------------------------
152
+ describe('AC3: Skill related_skills references exist', () => {
153
+ it('should accept when all related_skills references point to known skills', () => {
154
+ const ctx = defaultContext();
155
+ const result = validateCrossEntityRefs(ctx);
156
+ assert.strictEqual(result.valid, true);
157
+ });
158
+ it('should error when a skill references a nonexistent related_skill', () => {
159
+ const ctx = defaultContext({
160
+ skillEntityRefs: [
161
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira', 'pf-nonexistent'] },
162
+ ],
163
+ });
164
+ const result = validateCrossEntityRefs(ctx);
165
+ assert.strictEqual(result.valid, false, 'Missing related skill should fail');
166
+ const msgs = errorMessages(result);
167
+ assert.ok(msgs.some(m => m.includes('pf-nonexistent') && m.includes('pf-sprint')), `Expected error about 'pf-nonexistent' referenced by 'pf-sprint', got: ${msgs.join('; ')}`);
168
+ });
169
+ it('should report all broken related_skill references', () => {
170
+ const ctx = defaultContext({
171
+ skillEntityRefs: [
172
+ { skill: 'pf-sprint', relatedSkills: ['ghost-skill-1'] },
173
+ { skill: 'pf-testing', relatedSkills: ['ghost-skill-2'] },
174
+ ],
175
+ });
176
+ const result = validateCrossEntityRefs(ctx);
177
+ assert.strictEqual(result.valid, false);
178
+ const msgs = errorMessages(result);
179
+ assert.ok(msgs.some(m => m.includes('ghost-skill-1')), 'Should report ghost-skill-1');
180
+ assert.ok(msgs.some(m => m.includes('ghost-skill-2')), 'Should report ghost-skill-2');
181
+ });
182
+ it('should accept skills with empty related_skills', () => {
183
+ const ctx = defaultContext({
184
+ skillEntityRefs: [
185
+ { skill: 'pf-cyclist', relatedSkills: [] },
186
+ ],
187
+ });
188
+ const result = validateCrossEntityRefs(ctx);
189
+ assert.strictEqual(result.valid, true);
190
+ });
191
+ it('should not allow a skill to list itself as related', () => {
192
+ const ctx = defaultContext({
193
+ skillEntityRefs: [
194
+ { skill: 'pf-sprint', relatedSkills: ['pf-sprint'] },
195
+ ],
196
+ });
197
+ const result = validateCrossEntityRefs(ctx);
198
+ // Self-reference is an error or warning
199
+ const msgs = errorMessages(result);
200
+ const warns = warningMessages(result);
201
+ const allMsgs = [...msgs, ...warns];
202
+ assert.ok(allMsgs.some(m => m.includes('pf-sprint') && (m.includes('self') || m.includes('itself'))), `Expected self-reference flagged for 'pf-sprint', got: ${allMsgs.join('; ')}`);
203
+ });
204
+ });
205
+ // -------------------------------------------------------------------------
206
+ // AC4: Validate that skills referenced in command definitions exist
207
+ // -------------------------------------------------------------------------
208
+ describe('AC4: Skills referenced in commands exist', () => {
209
+ it('should accept when all command-referenced skills exist', () => {
210
+ const ctx = defaultContext();
211
+ const result = validateCrossEntityRefs(ctx);
212
+ assert.strictEqual(result.valid, true);
213
+ });
214
+ it('should error when command references a nonexistent skill', () => {
215
+ const ctx = defaultContext({
216
+ commandSkillRefs: [
217
+ { command: 'pf-sprint', referencedSkills: ['pf-sprint', 'pf-ghost-skill'] },
218
+ ],
219
+ });
220
+ const result = validateCrossEntityRefs(ctx);
221
+ assert.strictEqual(result.valid, false, 'Missing skill reference should fail');
222
+ const msgs = errorMessages(result);
223
+ assert.ok(msgs.some(m => m.includes('pf-ghost-skill') && m.includes('pf-sprint')), `Expected error about 'pf-ghost-skill' in command 'pf-sprint', got: ${msgs.join('; ')}`);
224
+ });
225
+ it('should report all missing skill references across commands', () => {
226
+ const ctx = defaultContext({
227
+ commandSkillRefs: [
228
+ { command: 'pf-dev', referencedSkills: ['missing-skill-a'] },
229
+ { command: 'pf-tea', referencedSkills: ['missing-skill-b'] },
230
+ ],
231
+ });
232
+ const result = validateCrossEntityRefs(ctx);
233
+ assert.strictEqual(result.valid, false);
234
+ const msgs = errorMessages(result);
235
+ assert.ok(msgs.some(m => m.includes('missing-skill-a')), 'Should report missing-skill-a');
236
+ assert.ok(msgs.some(m => m.includes('missing-skill-b')), 'Should report missing-skill-b');
237
+ });
238
+ it('should accept commands with no skill references', () => {
239
+ const ctx = defaultContext({
240
+ commandSkillRefs: [
241
+ { command: 'pf-help', referencedSkills: [] },
242
+ ],
243
+ });
244
+ const result = validateCrossEntityRefs(ctx);
245
+ assert.strictEqual(result.valid, true);
246
+ });
247
+ });
248
+ // -------------------------------------------------------------------------
249
+ // AC5: Bidirectional consistency of all references
250
+ // -------------------------------------------------------------------------
251
+ describe('AC5: Bidirectional consistency', () => {
252
+ it('should accept fully bidirectional references', () => {
253
+ // TDD references sm, and sm references tdd — both directions match
254
+ const ctx = defaultContext();
255
+ const result = validateCrossEntityRefs(ctx);
256
+ assert.strictEqual(result.valid, true);
257
+ assert.strictEqual((result.warnings ?? []).length, 0, 'No warnings for bidirectional match');
258
+ });
259
+ it('should warn when workflow references agent but agent does not reference that workflow', () => {
260
+ const ctx = defaultContext({
261
+ // tdd references architect, but architect doesn't claim tdd
262
+ workflowAgentRefs: [
263
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'dev', 'reviewer', 'architect'] },
264
+ ],
265
+ agentWorkflowRefs: [
266
+ { agent: 'sm', referencedWorkflows: ['tdd'] },
267
+ { agent: 'tea', referencedWorkflows: ['tdd'] },
268
+ { agent: 'dev', referencedWorkflows: ['tdd'] },
269
+ { agent: 'reviewer', referencedWorkflows: ['tdd'] },
270
+ { agent: 'architect', referencedWorkflows: [] }, // doesn't claim tdd
271
+ ],
272
+ });
273
+ const result = validateCrossEntityRefs(ctx);
274
+ // This is a warning (advisory), not an error
275
+ const warns = warningMessages(result);
276
+ assert.ok(warns.some(m => m.includes('architect') && m.includes('tdd')), `Expected warning about architect not referencing tdd, got: ${warns.join('; ')}`);
277
+ });
278
+ it('should warn when agent references workflow but workflow does not use that agent', () => {
279
+ const ctx = defaultContext({
280
+ workflowAgentRefs: [
281
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'dev', 'reviewer'] },
282
+ ],
283
+ agentWorkflowRefs: [
284
+ // pm claims to participate in tdd, but tdd doesn't reference pm
285
+ { agent: 'pm', referencedWorkflows: ['tdd'] },
286
+ ],
287
+ });
288
+ const result = validateCrossEntityRefs(ctx);
289
+ const warns = warningMessages(result);
290
+ assert.ok(warns.some(m => m.includes('pm') && m.includes('tdd')), `Expected warning about pm claiming tdd but not used, got: ${warns.join('; ')}`);
291
+ });
292
+ it('should warn for asymmetric related_skills (A lists B but B does not list A)', () => {
293
+ const ctx = defaultContext({
294
+ skillEntityRefs: [
295
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira'] },
296
+ { skill: 'pf-jira', relatedSkills: [] }, // doesn't list pf-sprint back
297
+ ],
298
+ });
299
+ const result = validateCrossEntityRefs(ctx);
300
+ const warns = warningMessages(result);
301
+ assert.ok(warns.some(m => m.includes('pf-sprint') && m.includes('pf-jira')), `Expected asymmetric related_skills warning, got: ${warns.join('; ')}`);
302
+ });
303
+ it('should not warn when related_skills are fully symmetric', () => {
304
+ const ctx = defaultContext({
305
+ skillEntityRefs: [
306
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira'] },
307
+ { skill: 'pf-jira', relatedSkills: ['pf-sprint'] },
308
+ ],
309
+ });
310
+ const result = validateCrossEntityRefs(ctx);
311
+ assert.strictEqual((result.warnings ?? []).length, 0, 'Symmetric refs = no warnings');
312
+ });
313
+ it('should detect multiple bidirectional inconsistencies', () => {
314
+ const ctx = defaultContext({
315
+ workflowAgentRefs: [
316
+ { workflow: 'tdd', referencedAgents: ['sm', 'architect'] },
317
+ { workflow: 'bdd', referencedAgents: ['sm', 'pm'] },
318
+ ],
319
+ agentWorkflowRefs: [
320
+ { agent: 'sm', referencedWorkflows: ['tdd', 'bdd'] },
321
+ { agent: 'architect', referencedWorkflows: [] }, // missing tdd
322
+ { agent: 'pm', referencedWorkflows: [] }, // missing bdd
323
+ ],
324
+ skillEntityRefs: [
325
+ { skill: 'pf-testing', relatedSkills: ['pf-code-review'] },
326
+ { skill: 'pf-code-review', relatedSkills: [] }, // asymmetric
327
+ ],
328
+ });
329
+ const result = validateCrossEntityRefs(ctx);
330
+ const warns = warningMessages(result);
331
+ // Should have warnings for architect↔tdd, pm↔bdd, and pf-testing↔pf-code-review
332
+ assert.ok(warns.length >= 3, `Expected at least 3 warnings, got ${warns.length}: ${warns.join('; ')}`);
333
+ });
334
+ });
335
+ // -------------------------------------------------------------------------
336
+ // Edge cases
337
+ // -------------------------------------------------------------------------
338
+ describe('Edge cases', () => {
339
+ it('should handle empty context gracefully', () => {
340
+ const ctx = {
341
+ knownAgentFiles: [],
342
+ knownWorkflowNames: [],
343
+ knownCommandFiles: [],
344
+ knownSkillNames: [],
345
+ workflowAgentRefs: [],
346
+ agentWorkflowRefs: [],
347
+ skillEntityRefs: [],
348
+ commandSkillRefs: [],
349
+ };
350
+ const result = validateCrossEntityRefs(ctx);
351
+ assert.strictEqual(result.valid, true, 'Empty context has nothing to validate');
352
+ });
353
+ it('should handle context with only agents and no workflows', () => {
354
+ const ctx = {
355
+ knownAgentFiles: ['sm', 'dev'],
356
+ knownWorkflowNames: [],
357
+ knownCommandFiles: [],
358
+ knownSkillNames: [],
359
+ workflowAgentRefs: [],
360
+ agentWorkflowRefs: [],
361
+ skillEntityRefs: [],
362
+ commandSkillRefs: [],
363
+ };
364
+ const result = validateCrossEntityRefs(ctx);
365
+ assert.strictEqual(result.valid, true, 'Agents alone, no cross-refs to break');
366
+ });
367
+ it('should treat agent file names case-sensitively', () => {
368
+ const ctx = defaultContext({
369
+ knownAgentFiles: ['sm', 'dev'],
370
+ workflowAgentRefs: [
371
+ { workflow: 'test', referencedAgents: ['SM'] }, // wrong case
372
+ ],
373
+ });
374
+ const result = validateCrossEntityRefs(ctx);
375
+ assert.strictEqual(result.valid, false, 'Agent name matching should be case-sensitive');
376
+ const msgs = errorMessages(result);
377
+ assert.ok(msgs.some(m => m.includes('SM')), 'Should report case-sensitive mismatch');
378
+ });
379
+ it('should treat skill names case-sensitively', () => {
380
+ const ctx = defaultContext({
381
+ knownSkillNames: ['pf-sprint'],
382
+ skillEntityRefs: [
383
+ { skill: 'pf-testing', relatedSkills: ['PF-Sprint'] }, // wrong case
384
+ ],
385
+ });
386
+ const result = validateCrossEntityRefs(ctx);
387
+ assert.strictEqual(result.valid, false, 'Skill name matching should be case-sensitive');
388
+ });
389
+ it('should handle workflows that reference no agents', () => {
390
+ const ctx = defaultContext({
391
+ workflowAgentRefs: [
392
+ { workflow: 'empty-workflow', referencedAgents: [] },
393
+ ],
394
+ });
395
+ const result = validateCrossEntityRefs(ctx);
396
+ // A workflow with no agent refs is valid (maybe it's a stepped workflow)
397
+ assert.strictEqual(result.valid, true);
398
+ });
399
+ it('should handle a mixed scenario with both errors and warnings', () => {
400
+ const ctx = defaultContext({
401
+ workflowAgentRefs: [
402
+ { workflow: 'tdd', referencedAgents: ['sm', 'ghost'] }, // ghost = error
403
+ ],
404
+ agentWorkflowRefs: [
405
+ { agent: 'sm', referencedWorkflows: ['tdd'] },
406
+ { agent: 'pm', referencedWorkflows: ['tdd'] }, // pm not in tdd = warning
407
+ ],
408
+ });
409
+ const result = validateCrossEntityRefs(ctx);
410
+ assert.strictEqual(result.valid, false, 'Should fail due to missing agent error');
411
+ const msgs = errorMessages(result);
412
+ const warns = warningMessages(result);
413
+ assert.ok(msgs.length > 0, 'Should have errors');
414
+ assert.ok(warns.length > 0, 'Should have warnings');
415
+ assert.ok(msgs.some(m => m.includes('ghost')), 'Should error on ghost agent');
416
+ assert.ok(warns.some(m => m.includes('pm')), 'Should warn on pm bidirectional mismatch');
417
+ });
418
+ });
419
+ // -------------------------------------------------------------------------
420
+ // Integration: realistic scenario
421
+ // -------------------------------------------------------------------------
422
+ describe('Integration with realistic data', () => {
423
+ it('should validate a realistic pennyfarthing-like context successfully', () => {
424
+ const ctx = {
425
+ knownAgentFiles: [
426
+ 'sm', 'tea', 'dev', 'reviewer', 'architect', 'pm',
427
+ 'tech-writer', 'ux-designer', 'devops', 'ba', 'orchestrator',
428
+ 'sm-setup', 'sm-finish', 'testing-runner', 'reviewer-preflight',
429
+ ],
430
+ knownWorkflowNames: [
431
+ 'tdd', 'tdd-tandem', 'trivial', 'bdd', 'bdd-tandem', 'agent-docs', 'patch',
432
+ ],
433
+ knownCommandFiles: [
434
+ 'pf-sprint', 'pf-dev', 'pf-tea', 'pf-sm', 'pf-reviewer',
435
+ 'pf-architect', 'pf-pm', 'pf-workflow',
436
+ ],
437
+ knownSkillNames: [
438
+ 'pf-sprint', 'pf-testing', 'pf-jira', 'pf-code-review',
439
+ 'pf-workflow', 'pf-theme', 'pf-just',
440
+ ],
441
+ workflowAgentRefs: [
442
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'dev', 'reviewer'] },
443
+ { workflow: 'trivial', referencedAgents: ['sm', 'dev', 'reviewer'] },
444
+ { workflow: 'bdd', referencedAgents: ['sm', 'ux-designer', 'tea', 'dev', 'reviewer'] },
445
+ { workflow: 'agent-docs', referencedAgents: ['sm', 'orchestrator', 'tech-writer'] },
446
+ ],
447
+ agentWorkflowRefs: [
448
+ { agent: 'sm', referencedWorkflows: ['tdd', 'trivial', 'bdd', 'agent-docs'] },
449
+ { agent: 'tea', referencedWorkflows: ['tdd', 'bdd'] },
450
+ { agent: 'dev', referencedWorkflows: ['tdd', 'trivial', 'bdd'] },
451
+ { agent: 'reviewer', referencedWorkflows: ['tdd', 'trivial', 'bdd'] },
452
+ { agent: 'ux-designer', referencedWorkflows: ['bdd'] },
453
+ { agent: 'orchestrator', referencedWorkflows: ['agent-docs'] },
454
+ { agent: 'tech-writer', referencedWorkflows: ['agent-docs'] },
455
+ ],
456
+ skillEntityRefs: [
457
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira'] },
458
+ { skill: 'pf-jira', relatedSkills: ['pf-sprint'] },
459
+ { skill: 'pf-testing', relatedSkills: ['pf-code-review'] },
460
+ { skill: 'pf-code-review', relatedSkills: ['pf-testing'] },
461
+ ],
462
+ commandSkillRefs: [
463
+ { command: 'pf-sprint', referencedSkills: ['pf-sprint'] },
464
+ { command: 'pf-workflow', referencedSkills: ['pf-workflow'] },
465
+ ],
466
+ };
467
+ const result = validateCrossEntityRefs(ctx);
468
+ assert.strictEqual(result.valid, true, 'Realistic context should validate');
469
+ assert.strictEqual((result.errors ?? []).length, 0, 'No errors');
470
+ assert.strictEqual((result.warnings ?? []).length, 0, 'No warnings');
471
+ });
472
+ it('should catch multiple issues in a broken realistic scenario', () => {
473
+ const ctx = {
474
+ knownAgentFiles: ['sm', 'dev', 'reviewer'],
475
+ knownWorkflowNames: ['tdd'],
476
+ knownCommandFiles: ['pf-sprint'],
477
+ knownSkillNames: ['pf-sprint', 'pf-jira'],
478
+ workflowAgentRefs: [
479
+ // tea and architect referenced but no agent files
480
+ { workflow: 'tdd', referencedAgents: ['sm', 'tea', 'dev', 'architect', 'reviewer'] },
481
+ ],
482
+ agentWorkflowRefs: [
483
+ // dev references bdd which doesn't exist
484
+ { agent: 'dev', referencedWorkflows: ['tdd', 'bdd'] },
485
+ ],
486
+ skillEntityRefs: [
487
+ // references nonexistent skill
488
+ { skill: 'pf-sprint', relatedSkills: ['pf-jira', 'pf-nonexistent'] },
489
+ ],
490
+ commandSkillRefs: [
491
+ // references nonexistent skill
492
+ { command: 'pf-sprint', referencedSkills: ['pf-sprint', 'pf-ghost'] },
493
+ ],
494
+ };
495
+ const result = validateCrossEntityRefs(ctx);
496
+ assert.strictEqual(result.valid, false, 'Broken scenario should fail');
497
+ const msgs = errorMessages(result);
498
+ // AC1: missing agent files for tea and architect
499
+ assert.ok(msgs.some(m => m.includes('tea')), 'Should report missing tea agent file');
500
+ assert.ok(msgs.some(m => m.includes('architect')), 'Should report missing architect agent file');
501
+ // AC2: missing bdd workflow
502
+ assert.ok(msgs.some(m => m.includes('bdd')), 'Should report missing bdd workflow');
503
+ // AC3: missing related skill
504
+ assert.ok(msgs.some(m => m.includes('pf-nonexistent')), 'Should report missing related skill');
505
+ // AC4: missing command skill reference
506
+ assert.ok(msgs.some(m => m.includes('pf-ghost')), 'Should report missing command skill ref');
507
+ // Should have at least 5 errors total
508
+ assert.ok(msgs.length >= 5, `Expected at least 5 errors, got ${msgs.length}: ${msgs.join('; ')}`);
509
+ });
510
+ });
511
+ });
512
+ //# sourceMappingURL=cross-entity-validation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-entity-validation.test.js","sourceRoot":"","sources":["../../src/workflow/cross-entity-validation.test.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ using the project's `pr_mode` config:
22
22
 
23
23
  ```bash
24
24
  # Read pr_mode: draft | ready | none
25
- PR_MODE=$(source .venv/bin/activate && python -m pennyfarthing_scripts.common.pr_config)
25
+ PR_MODE=$(source .venv/bin/activate && python -m pf.common.pr_config)
26
26
  ```
27
27
 
28
28
  - If `PR_MODE=draft`: `gh pr create --draft --title "feat({STORY_ID}): {title}" --body "..." --base develop`
@@ -37,7 +37,7 @@ If a PR already exists, skip creation.
37
37
  The preflight script runs all checks in parallel using asyncio:
38
38
 
39
39
  ```bash
40
- source .venv/bin/activate && python -m pennyfarthing_scripts.preflight finish {STORY_ID} --branch {BRANCH} --jira {JIRA_KEY}
40
+ source .venv/bin/activate && python -m pf.preflight finish {STORY_ID} --branch {BRANCH} --jira {JIRA_KEY}
41
41
  ```
42
42
 
43
43
  If no JIRA_KEY, omit the `--jira` flag.
@@ -41,7 +41,7 @@ This runs lint + typecheck + tests. Exit 0 = all passed.
41
41
 
42
42
  ```bash
43
43
  # Repo config available via: pf.sh git status, or Python API:
44
- # from pennyfarthing_scripts.git.repos import load_repos_config
44
+ # from pf.git.repos import load_repos_config
45
45
  source .pennyfarthing/scripts/test/test-setup.sh
46
46
 
47
47
  RUN_ID="${RUN_ID:-$(generate_run_id)}"
@@ -129,7 +129,7 @@ If context becomes stale mid-session, run `/prime` manually:
129
129
  </integration>
130
130
 
131
131
  <reference>
132
- - **CLI:** `pf.sh agent start <name>` or `python3 -m pennyfarthing_scripts.cli agent start <name>`
132
+ - **CLI:** `pf.sh agent start <name>` or `python3 -m pf.cli agent start <name>`
133
133
  - **Loads:** Workflow state, agent definition, persona, behavior guide, sprint context, session, sidecars
134
134
  - **Sidecar location:** `.pennyfarthing/sidecars/{agent}/*.md`
135
135
  - **Behavior guide:** `.pennyfarthing/guides/agent-behavior.md` (all agents)
@@ -7,7 +7,7 @@
7
7
 
8
8
  **Sidecars:** Write learnings BEFORE starting exit protocol.
9
9
 
10
- **Scripts:** Pennyfarthing scripts are Python-based (`pennyfarthing_scripts/`), not shell—check before assuming `.sh`.
10
+ **Scripts:** Pennyfarthing scripts are Python-based (`pf/`), not shell—check before assuming `.sh`.
11
11
 
12
12
  **pf CLI:** Never call bare `pf` — it is not globally installed. Always use the wrapper:
13
13
  ```bash
@@ -115,7 +115,7 @@ pf.sh bc list # List saved layouts
115
115
  | `packages/core/src/public/components/BikeRackWorkspace.tsx` | Dockview layout for BikeRack |
116
116
  | `packages/core/src/public/components/BikeRackIndex.tsx` | Panel listing index page |
117
117
  | `packages/core/src/public/components/StandalonePanel.tsx` | `?panel=X` routing + `PANEL_REGISTRY` |
118
- | `pennyfarthing_scripts/bikerack/cli.py` | `pf.sh bikerack` launcher CLI |
118
+ | `pf/bikerack/cli.py` | `pf.sh bikerack` launcher CLI |
119
119
 
120
120
  ## Constraints
121
121
 
@@ -123,11 +123,11 @@ These power the **HotspotsPanel** in Cyclist and BikeRack.
123
123
 
124
124
  | Directory | Purpose |
125
125
  |-----------|---------|
126
- | `pennyfarthing_scripts/hotspots/` | Hotspot analysis (analyze, formatters, models) |
127
- | `pennyfarthing_scripts/complexity/` | Complexity analysis |
128
- | `pennyfarthing_scripts/deadcode/` | Dead code detection |
129
- | `pennyfarthing_scripts/dependencies/` | Dependency analysis |
130
- | `pennyfarthing_scripts/codemarkers/` | Code marker detection |
131
- | `pennyfarthing_scripts/healthscore/` | Composite health score |
132
- | `pennyfarthing_scripts/brownfield/` | Brownfield codebase discovery |
126
+ | `pf/hotspots/` | Hotspot analysis (analyze, formatters, models) |
127
+ | `pf/complexity/` | Complexity analysis |
128
+ | `pf/deadcode/` | Dead code detection |
129
+ | `pf/dependencies/` | Dependency analysis |
130
+ | `pf/codemarkers/` | Code marker detection |
131
+ | `pf/healthscore/` | Composite health score |
132
+ | `pf/brownfield/` | Brownfield codebase discovery |
133
133
  | `packages/core/src/server/api/` | WheelHub API routes |