@pennyfarthing/core 10.0.5 → 10.2.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 (580) hide show
  1. package/README.md +19 -22
  2. package/package.json +17 -11
  3. package/packages/core/dist/cli/commands/doctor-file-layout.test.js.map +1 -1
  4. package/packages/core/dist/cli/commands/doctor-legacy.test.js +24 -0
  5. package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -1
  6. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  7. package/packages/core/dist/cli/commands/doctor.js +346 -13
  8. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  9. package/packages/core/dist/cli/commands/e2e-fresh-install.test.js +1 -1
  10. package/packages/core/dist/cli/commands/e2e-fresh-install.test.js.map +1 -1
  11. package/packages/core/dist/cli/commands/e2e-upgrade.test.js +1 -1
  12. package/packages/core/dist/cli/commands/e2e-upgrade.test.js.map +1 -1
  13. package/packages/core/dist/cli/commands/hooks-consolidation.test.js +2 -2
  14. package/packages/core/dist/cli/commands/hooks-consolidation.test.js.map +1 -1
  15. package/packages/core/dist/cli/commands/init-consolidation.test.js.map +1 -1
  16. package/packages/core/dist/cli/commands/init.d.ts +7 -0
  17. package/packages/core/dist/cli/commands/init.d.ts.map +1 -1
  18. package/packages/core/dist/cli/commands/init.js +41 -8
  19. package/packages/core/dist/cli/commands/init.js.map +1 -1
  20. package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -1
  21. package/packages/core/dist/cli/commands/uninstall.js +24 -13
  22. package/packages/core/dist/cli/commands/uninstall.js.map +1 -1
  23. package/packages/core/dist/cli/commands/update-consolidation.test.js +0 -10
  24. package/packages/core/dist/cli/commands/update-consolidation.test.js.map +1 -1
  25. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  26. package/packages/core/dist/cli/commands/update.js +26 -0
  27. package/packages/core/dist/cli/commands/update.js.map +1 -1
  28. package/packages/core/dist/cli/index.js +1 -1
  29. package/packages/core/dist/cli/index.js.map +1 -1
  30. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -1
  31. package/packages/core/dist/cli/theme-maker.test.js +64 -115
  32. package/packages/core/dist/cli/theme-maker.test.js.map +1 -1
  33. package/packages/core/dist/cli/utils/python.d.ts +22 -0
  34. package/packages/core/dist/cli/utils/python.d.ts.map +1 -0
  35. package/packages/core/dist/cli/utils/python.js +102 -0
  36. package/packages/core/dist/cli/utils/python.js.map +1 -0
  37. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  38. package/packages/core/dist/cli/utils/settings.js +10 -0
  39. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  40. package/packages/core/dist/index.d.ts +1 -1
  41. package/packages/core/dist/index.d.ts.map +1 -1
  42. package/packages/core/dist/index.js +2 -2
  43. package/packages/core/dist/index.js.map +1 -1
  44. package/packages/core/dist/plugins/plugin-discovery.d.ts +116 -0
  45. package/packages/core/dist/plugins/plugin-discovery.d.ts.map +1 -0
  46. package/packages/core/dist/plugins/plugin-discovery.js +165 -0
  47. package/packages/core/dist/plugins/plugin-discovery.js.map +1 -0
  48. package/packages/core/dist/plugins/plugin-discovery.test.d.ts +22 -0
  49. package/packages/core/dist/plugins/plugin-discovery.test.d.ts.map +1 -0
  50. package/packages/core/dist/plugins/plugin-discovery.test.js +498 -0
  51. package/packages/core/dist/plugins/plugin-discovery.test.js.map +1 -0
  52. package/packages/core/dist/scripts/generate-spider-report.js.map +1 -1
  53. package/packages/core/dist/workflow/context-watch.d.ts +80 -0
  54. package/packages/core/dist/workflow/context-watch.d.ts.map +1 -0
  55. package/packages/core/dist/workflow/context-watch.js +235 -0
  56. package/packages/core/dist/workflow/context-watch.js.map +1 -0
  57. package/packages/core/dist/workflow/context-watch.test.d.ts +1 -0
  58. package/packages/core/dist/workflow/context-watch.test.d.ts.map +1 -0
  59. package/packages/core/dist/workflow/context-watch.test.js +746 -0
  60. package/packages/core/dist/workflow/context-watch.test.js.map +1 -0
  61. package/packages/core/dist/workflow/file-watch.d.ts +82 -0
  62. package/packages/core/dist/workflow/file-watch.d.ts.map +1 -0
  63. package/packages/core/dist/workflow/file-watch.js +198 -0
  64. package/packages/core/dist/workflow/file-watch.js.map +1 -0
  65. package/packages/core/dist/workflow/file-watch.test.d.ts +21 -0
  66. package/packages/core/dist/workflow/file-watch.test.d.ts.map +1 -0
  67. package/packages/core/dist/workflow/file-watch.test.js +469 -0
  68. package/packages/core/dist/workflow/file-watch.test.js.map +1 -0
  69. package/packages/core/dist/workflow/observation-writer.d.ts +79 -0
  70. package/packages/core/dist/workflow/observation-writer.d.ts.map +1 -0
  71. package/packages/core/dist/workflow/observation-writer.js +97 -0
  72. package/packages/core/dist/workflow/observation-writer.js.map +1 -0
  73. package/packages/core/dist/workflow/observation-writer.test.d.ts +18 -0
  74. package/packages/core/dist/workflow/observation-writer.test.d.ts.map +1 -0
  75. package/packages/core/dist/workflow/observation-writer.test.js +424 -0
  76. package/packages/core/dist/workflow/observation-writer.test.js.map +1 -0
  77. package/packages/core/dist/workflow/story-workflow-routing.test.js +4 -2
  78. package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -1
  79. package/packages/core/dist/workflow/tandem-lifecycle.d.ts +117 -0
  80. package/packages/core/dist/workflow/tandem-lifecycle.d.ts.map +1 -0
  81. package/packages/core/dist/workflow/tandem-lifecycle.js +186 -0
  82. package/packages/core/dist/workflow/tandem-lifecycle.js.map +1 -0
  83. package/packages/core/dist/workflow/tandem-lifecycle.test.d.ts +16 -0
  84. package/packages/core/dist/workflow/tandem-lifecycle.test.d.ts.map +1 -0
  85. package/packages/core/dist/workflow/tandem-lifecycle.test.js +531 -0
  86. package/packages/core/dist/workflow/tandem-lifecycle.test.js.map +1 -0
  87. package/packages/core/dist/workflow/tool-watch.d.ts +68 -0
  88. package/packages/core/dist/workflow/tool-watch.d.ts.map +1 -0
  89. package/packages/core/dist/workflow/tool-watch.js +166 -0
  90. package/packages/core/dist/workflow/tool-watch.js.map +1 -0
  91. package/packages/core/dist/workflow/tool-watch.test.d.ts +18 -0
  92. package/packages/core/dist/workflow/tool-watch.test.d.ts.map +1 -0
  93. package/packages/core/dist/workflow/tool-watch.test.js +718 -0
  94. package/packages/core/dist/workflow/tool-watch.test.js.map +1 -0
  95. package/packages/core/dist/workflow/workflow-migration.test.js +8 -4
  96. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
  97. package/packages/core/dist/workflow/workflow-schema.d.ts +7 -0
  98. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
  99. package/packages/core/dist/workflow/workflow-schema.js +44 -0
  100. package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
  101. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -1
  102. package/packages/core/dist/workflow/workflow-schema.test.js +192 -0
  103. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -1
  104. package/pennyfarthing-dist/agents/README.md +1 -3
  105. package/pennyfarthing-dist/agents/architect.md +0 -6
  106. package/pennyfarthing-dist/agents/devops.md +0 -6
  107. package/pennyfarthing-dist/agents/handoff.md +18 -3
  108. package/pennyfarthing-dist/agents/orchestrator.md +0 -6
  109. package/pennyfarthing-dist/agents/pm.md +0 -6
  110. package/pennyfarthing-dist/agents/sm-finish.md +1 -1
  111. package/pennyfarthing-dist/agents/sm-handoff.md +27 -4
  112. package/pennyfarthing-dist/agents/sm.md +11 -11
  113. package/pennyfarthing-dist/agents/tandem-backseat.md +119 -0
  114. package/pennyfarthing-dist/commands/architect.md +11 -3
  115. package/pennyfarthing-dist/commands/close-epic.md +24 -131
  116. package/pennyfarthing-dist/commands/create-theme.md +14 -24
  117. package/pennyfarthing-dist/commands/dev.md +11 -3
  118. package/pennyfarthing-dist/commands/devops.md +11 -3
  119. package/pennyfarthing-dist/commands/health-check.md +1 -3
  120. package/pennyfarthing-dist/commands/help.md +8 -12
  121. package/pennyfarthing-dist/commands/list-themes.md +14 -16
  122. package/pennyfarthing-dist/commands/orchestrator.md +11 -3
  123. package/pennyfarthing-dist/commands/parallel-work.md +1 -3
  124. package/pennyfarthing-dist/commands/pm.md +11 -3
  125. package/pennyfarthing-dist/commands/prime.md +6 -6
  126. package/pennyfarthing-dist/commands/reviewer.md +11 -3
  127. package/pennyfarthing-dist/commands/run-ci.md +1 -1
  128. package/pennyfarthing-dist/commands/set-theme.md +14 -51
  129. package/pennyfarthing-dist/commands/setup.md +5 -1
  130. package/pennyfarthing-dist/commands/show-theme.md +14 -16
  131. package/pennyfarthing-dist/commands/sm.md +11 -3
  132. package/pennyfarthing-dist/commands/tea.md +11 -3
  133. package/pennyfarthing-dist/commands/tech-writer.md +11 -3
  134. package/pennyfarthing-dist/commands/theme-maker.md +14 -671
  135. package/pennyfarthing-dist/commands/theme.md +95 -0
  136. package/pennyfarthing-dist/commands/ux-designer.md +11 -3
  137. package/pennyfarthing-dist/commands/work.md +3 -5
  138. package/pennyfarthing-dist/guides/agent-behavior.md +62 -6
  139. package/pennyfarthing-dist/guides/agent-coordination.md +11 -13
  140. package/pennyfarthing-dist/guides/agent-template-tactical.md +2 -3
  141. package/pennyfarthing-dist/guides/bikelane.md +3 -2
  142. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +212 -0
  143. package/pennyfarthing-dist/guides/hooks.md +5 -5
  144. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +3 -3
  145. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +9 -59
  146. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -5
  147. package/pennyfarthing-dist/guides/prime.md +2 -2
  148. package/pennyfarthing-dist/guides/scale-levels.md +4 -6
  149. package/pennyfarthing-dist/guides/skill-schema.md +4 -4
  150. package/pennyfarthing-dist/guides/tandem-protocol.md +158 -0
  151. package/pennyfarthing-dist/personas/themes/discworld.yaml +1 -1
  152. package/pennyfarthing-dist/personas/themes/fifth-element.yaml +295 -0
  153. package/pennyfarthing-dist/scripts/README.md +1 -1
  154. package/pennyfarthing-dist/scripts/core/agent-session.sh +6 -2
  155. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
  156. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -0
  157. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
  158. package/pennyfarthing-dist/scripts/core/prime.sh +8 -10
  159. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
  160. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
  161. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
  162. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +8 -6
  163. package/pennyfarthing-dist/scripts/git/release.sh +0 -0
  164. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
  165. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
  166. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +131 -54
  167. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  168. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  169. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  170. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
  171. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +32 -15
  172. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +4 -3
  173. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  174. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +11 -5
  175. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
  176. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
  177. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
  178. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
  179. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  180. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
  181. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
  182. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
  183. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
  184. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
  185. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
  186. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
  187. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
  188. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
  189. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
  190. package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
  191. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
  192. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
  193. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
  194. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
  195. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
  196. package/pennyfarthing-dist/scripts/misc/README.md +1 -1
  197. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
  198. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
  199. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
  200. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
  201. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
  202. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
  203. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
  204. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
  205. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
  206. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
  207. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
  208. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
  209. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
  210. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
  211. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
  212. package/pennyfarthing-dist/scripts/misc/statusline.sh +50 -8
  213. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
  214. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +1 -2
  215. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -0
  216. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
  217. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
  218. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
  219. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  220. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
  221. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
  222. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +5 -5
  223. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
  224. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
  225. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
  226. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
  227. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  228. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +3 -79
  229. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  230. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  231. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  232. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
  233. package/pennyfarthing-dist/scripts/theme/README.md +1 -1
  234. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
  235. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -1
  236. package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
  237. package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
  238. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
  239. package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
  240. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +10 -144
  241. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
  242. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
  243. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
  244. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
  245. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
  246. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
  247. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
  248. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
  249. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
  250. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +2 -2
  251. package/pennyfarthing-dist/skills/skill-registry.schema.json +8 -0
  252. package/pennyfarthing-dist/skills/skill-registry.yaml +21 -17
  253. package/pennyfarthing-dist/skills/sprint/skill.md +25 -2
  254. package/pennyfarthing-dist/skills/story/scripts/create-story.sh +0 -0
  255. package/pennyfarthing-dist/skills/story/scripts/size-story.sh +0 -0
  256. package/pennyfarthing-dist/skills/story/scripts/story-template.sh +0 -0
  257. package/pennyfarthing-dist/skills/theme/skill.md +290 -75
  258. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +23 -166
  259. package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +0 -0
  260. package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +0 -0
  261. package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +0 -0
  262. package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +0 -0
  263. package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +0 -0
  264. package/pennyfarthing-dist/skills/workflow/skill.md +27 -4
  265. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -11
  266. package/pennyfarthing-dist/templates/auto-load-sm.sh.template +14 -0
  267. package/pennyfarthing-dist/templates/settings.local.json.template +9 -0
  268. package/pennyfarthing-dist/workflows/2party-tdd.yaml +399 -0
  269. package/pennyfarthing-dist/workflows/architecture/workflow.yaml +65 -0
  270. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +70 -0
  271. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +41 -24
  272. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +61 -0
  273. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  274. package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  277. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  278. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  282. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  283. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  284. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  285. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  286. package/pennyfarthing_scripts/bellmode_hook.py +202 -47
  287. package/pennyfarthing_scripts/brownfield/__init__.py +6 -6
  288. package/pennyfarthing_scripts/brownfield/__main__.py +1 -0
  289. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  291. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  292. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  293. package/pennyfarthing_scripts/brownfield/cli.py +0 -1
  294. package/pennyfarthing_scripts/brownfield/discover.py +1 -2
  295. package/pennyfarthing_scripts/cli.py +23 -3
  296. package/pennyfarthing_scripts/codemarkers/__init__.py +23 -0
  297. package/pennyfarthing_scripts/codemarkers/__main__.py +6 -0
  298. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  299. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  302. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  303. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  304. package/pennyfarthing_scripts/codemarkers/analyze.py +501 -0
  305. package/pennyfarthing_scripts/codemarkers/cli.py +179 -0
  306. package/pennyfarthing_scripts/codemarkers/formatters.py +88 -0
  307. package/pennyfarthing_scripts/codemarkers/models.py +60 -0
  308. package/pennyfarthing_scripts/common/__init__.py +8 -9
  309. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  311. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  313. package/pennyfarthing_scripts/common/config.py +1 -1
  314. package/pennyfarthing_scripts/complexity/__init__.py +15 -0
  315. package/pennyfarthing_scripts/complexity/__main__.py +6 -0
  316. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  317. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  318. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  319. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  320. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  321. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  322. package/pennyfarthing_scripts/complexity/analyze.py +207 -0
  323. package/pennyfarthing_scripts/complexity/cli.py +82 -0
  324. package/pennyfarthing_scripts/complexity/formatters.py +64 -0
  325. package/pennyfarthing_scripts/complexity/models.py +32 -0
  326. package/pennyfarthing_scripts/context.py +14 -15
  327. package/pennyfarthing_scripts/deadcode/__init__.py +6 -0
  328. package/pennyfarthing_scripts/deadcode/__main__.py +6 -0
  329. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  330. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  331. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  332. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  333. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  334. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  335. package/pennyfarthing_scripts/deadcode/analyze.py +322 -0
  336. package/pennyfarthing_scripts/deadcode/cli.py +163 -0
  337. package/pennyfarthing_scripts/deadcode/formatters.py +106 -0
  338. package/pennyfarthing_scripts/deadcode/models.py +54 -0
  339. package/pennyfarthing_scripts/dependencies/__init__.py +20 -0
  340. package/pennyfarthing_scripts/dependencies/__main__.py +5 -0
  341. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  342. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  343. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  344. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  345. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  346. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  347. package/pennyfarthing_scripts/dependencies/analyze.py +155 -0
  348. package/pennyfarthing_scripts/dependencies/cli.py +76 -0
  349. package/pennyfarthing_scripts/dependencies/formatters.py +63 -0
  350. package/pennyfarthing_scripts/dependencies/models.py +39 -0
  351. package/pennyfarthing_scripts/git/__init__.py +5 -5
  352. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  353. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  354. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  355. package/pennyfarthing_scripts/git/create_branches.py +3 -2
  356. package/pennyfarthing_scripts/git/status_all.py +1 -1
  357. package/pennyfarthing_scripts/healthscore/__init__.py +21 -0
  358. package/pennyfarthing_scripts/healthscore/__main__.py +14 -0
  359. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  360. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  361. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  362. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  363. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  364. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  365. package/pennyfarthing_scripts/healthscore/analyze.py +591 -0
  366. package/pennyfarthing_scripts/healthscore/cli.py +80 -0
  367. package/pennyfarthing_scripts/healthscore/formatters.py +46 -0
  368. package/pennyfarthing_scripts/healthscore/models.py +43 -0
  369. package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  370. package/pennyfarthing_scripts/hooks.py +8 -11
  371. package/pennyfarthing_scripts/hotspots/__init__.py +6 -6
  372. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  373. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  374. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  375. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  376. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  377. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  378. package/pennyfarthing_scripts/hotspots/analyze.py +155 -14
  379. package/pennyfarthing_scripts/hotspots/cli.py +12 -10
  380. package/pennyfarthing_scripts/hotspots/models.py +0 -1
  381. package/pennyfarthing_scripts/jira/__init__.py +15 -17
  382. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  383. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  384. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  385. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  386. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  387. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  388. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  389. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  390. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  391. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  392. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  393. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  394. package/pennyfarthing_scripts/jira/bidirectional.py +44 -18
  395. package/pennyfarthing_scripts/jira/claim.py +21 -0
  396. package/pennyfarthing_scripts/jira/cli.py +6 -3
  397. package/pennyfarthing_scripts/jira/client.py +32 -4
  398. package/pennyfarthing_scripts/jira/create.py +45 -1
  399. package/pennyfarthing_scripts/jira/epic.py +3 -2
  400. package/pennyfarthing_scripts/jira/reconcile.py +0 -1
  401. package/pennyfarthing_scripts/jira/story.py +2 -0
  402. package/pennyfarthing_scripts/jira/sync.py +1 -1
  403. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  404. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  405. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  406. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  407. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  408. package/pennyfarthing_scripts/migration/skill.py +0 -1
  409. package/pennyfarthing_scripts/migration/step.py +0 -1
  410. package/pennyfarthing_scripts/migration/validate.py +8 -5
  411. package/pennyfarthing_scripts/patch_mode.py +2 -2
  412. package/pennyfarthing_scripts/preflight/__init__.py +1 -1
  413. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  414. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  415. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  416. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  417. package/pennyfarthing_scripts/preflight/finish.py +0 -1
  418. package/pennyfarthing_scripts/pretooluse_hook.py +6 -7
  419. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  420. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  421. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  422. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  423. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  424. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  425. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  426. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  427. package/pennyfarthing_scripts/prime/cli.py +5 -1
  428. package/pennyfarthing_scripts/prime/loader.py +2 -3
  429. package/pennyfarthing_scripts/prime/persona.py +2 -1
  430. package/pennyfarthing_scripts/prime/tiers.py +4 -4
  431. package/pennyfarthing_scripts/schema_validation_hook.py +2 -3
  432. package/pennyfarthing_scripts/sprint/__init__.py +10 -12
  433. package/pennyfarthing_scripts/sprint/__main__.py +2 -2
  434. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  435. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  436. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  437. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  438. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  439. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  440. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  441. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  442. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  443. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  444. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  445. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  446. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  447. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  448. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  449. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  450. package/pennyfarthing_scripts/sprint/archive.py +0 -1
  451. package/pennyfarthing_scripts/sprint/archive_epic.py +198 -97
  452. package/pennyfarthing_scripts/sprint/cli.py +62 -46
  453. package/pennyfarthing_scripts/sprint/epic_add.py +8 -1
  454. package/pennyfarthing_scripts/sprint/import_epic.py +42 -18
  455. package/pennyfarthing_scripts/sprint/loader.py +6 -0
  456. package/pennyfarthing_scripts/sprint/status.py +1 -2
  457. package/pennyfarthing_scripts/sprint/story_add.py +202 -27
  458. package/pennyfarthing_scripts/sprint/story_finish.py +209 -0
  459. package/pennyfarthing_scripts/sprint/story_update.py +11 -3
  460. package/pennyfarthing_scripts/sprint/validate_cmd.py +0 -1
  461. package/pennyfarthing_scripts/sprint/validator.py +120 -6
  462. package/pennyfarthing_scripts/sprint/work.py +28 -7
  463. package/pennyfarthing_scripts/sprint/yaml_io.py +10 -2
  464. package/pennyfarthing_scripts/story/__init__.py +14 -16
  465. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  466. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  467. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  468. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  469. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  470. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  471. package/pennyfarthing_scripts/story/size.py +0 -1
  472. package/pennyfarthing_scripts/story/template.py +0 -1
  473. package/pennyfarthing_scripts/swebench.py +1 -2
  474. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  475. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  476. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  477. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  478. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  479. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  480. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  481. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  482. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  483. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  484. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  485. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  486. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  487. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  488. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  489. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  490. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  491. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  492. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  493. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  494. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  495. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  496. package/pennyfarthing_scripts/tests/conftest.py +1 -2
  497. package/pennyfarthing_scripts/tests/test_brownfield.py +10 -13
  498. package/pennyfarthing_scripts/tests/test_cli_modules.py +0 -4
  499. package/pennyfarthing_scripts/tests/test_codemarkers.py +687 -0
  500. package/pennyfarthing_scripts/tests/test_common.py +9 -4
  501. package/pennyfarthing_scripts/tests/test_epic_shard_validation.py +699 -0
  502. package/pennyfarthing_scripts/tests/test_git_utils.py +10 -13
  503. package/pennyfarthing_scripts/tests/test_healthscore.py +516 -0
  504. package/pennyfarthing_scripts/tests/test_jira_package.py +0 -3
  505. package/pennyfarthing_scripts/tests/test_package_structure.py +3 -16
  506. package/pennyfarthing_scripts/tests/test_patch_mode.py +7 -11
  507. package/pennyfarthing_scripts/tests/test_prime.py +39 -21
  508. package/pennyfarthing_scripts/tests/test_sprint_package.py +3 -8
  509. package/pennyfarthing_scripts/tests/test_sprint_validator.py +53 -5
  510. package/pennyfarthing_scripts/tests/test_story_add.py +3 -7
  511. package/pennyfarthing_scripts/tests/test_story_package.py +0 -3
  512. package/pennyfarthing_scripts/tests/test_story_update.py +5 -10
  513. package/pennyfarthing_scripts/tests/test_tiers.py +18 -17
  514. package/pennyfarthing_scripts/tests/test_token_counting.py +19 -13
  515. package/pennyfarthing_scripts/tests/test_validate_cmd.py +2 -7
  516. package/pennyfarthing_scripts/tests/test_workflow_check.py +0 -2
  517. package/pennyfarthing_scripts/tests/test_yaml_io.py +0 -3
  518. package/pennyfarthing_scripts/theme/__init__.py +5 -0
  519. package/pennyfarthing_scripts/theme/__main__.py +6 -0
  520. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  521. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  522. package/pennyfarthing_scripts/theme/cli.py +287 -0
  523. package/pennyfarthing_scripts/validate/__init__.py +21 -0
  524. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  525. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  526. package/pennyfarthing_scripts/validate/adapters/__init__.py +0 -0
  527. package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  528. package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  529. package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  530. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  531. package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  532. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  533. package/pennyfarthing_scripts/validate/adapters/agent.py +239 -0
  534. package/pennyfarthing_scripts/validate/adapters/schema.py +30 -0
  535. package/pennyfarthing_scripts/validate/adapters/skill_command.py +292 -0
  536. package/pennyfarthing_scripts/validate/adapters/sprint.py +69 -0
  537. package/pennyfarthing_scripts/validate/adapters/workflow.py +320 -0
  538. package/pennyfarthing_scripts/validate/cli.py +141 -0
  539. package/pennyfarthing_scripts/welcome_hook.py +2 -3
  540. package/pennyfarthing_scripts/workflow.py +3 -3
  541. package/scripts/README.md +41 -0
  542. package/pennyfarthing-dist/agents/workflow-status-check.md +0 -96
  543. package/pennyfarthing-dist/commands/benchmark-control.md +0 -69
  544. package/pennyfarthing-dist/commands/benchmark.md +0 -485
  545. package/pennyfarthing-dist/commands/job-fair.md +0 -102
  546. package/pennyfarthing-dist/commands/solo.md +0 -447
  547. package/pennyfarthing-dist/guides/benchmarks.md +0 -62
  548. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  549. package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +0 -59
  550. package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +0 -220
  551. package/pennyfarthing-dist/scripts/test/swebench-judge.py +0 -374
  552. package/pennyfarthing-dist/scripts/test/test-cache.sh +0 -165
  553. package/pennyfarthing-dist/scripts/test/test-setup.sh +0 -337
  554. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +0 -13
  555. package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +0 -402
  556. package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +0 -97
  557. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +0 -261
  558. package/pennyfarthing-dist/skills/judge/SKILL.md +0 -644
  559. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +0 -187
  560. package/pennyfarthing-dist/workflows/dev-story/checklist.md +0 -80
  561. package/pennyfarthing-dist/workflows/dev-story/instructions.xml +0 -410
  562. package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +0 -50
  563. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +0 -201
  564. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +0 -156
  565. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +0 -140
  566. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +0 -203
  567. package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +0 -74
  568. package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +0 -27
  569. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  570. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  571. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  572. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  573. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  574. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  575. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  576. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  577. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  578. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  579. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  580. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
@@ -3,21 +3,22 @@
3
3
  Tests context loading for prime command.
4
4
  """
5
5
 
6
- import pytest
7
6
  from pathlib import Path
8
- from unittest.mock import patch, MagicMock
7
+ from unittest.mock import patch
8
+
9
+ import pytest
9
10
 
11
+ from pennyfarthing_scripts.prime.cli import main, prime
10
12
  from pennyfarthing_scripts.prime.loader import (
13
+ _extract_session_parts,
14
+ _find_session_file,
11
15
  load_agent_definition,
12
16
  load_behavior_guide,
13
- load_sprint_context,
17
+ load_domain_docs,
14
18
  load_session_context,
15
19
  load_sidecars,
16
- load_domain_docs,
17
- _extract_session_parts,
18
- _find_session_file,
20
+ load_sprint_context,
19
21
  )
20
- from pennyfarthing_scripts.prime.cli import prime, main
21
22
 
22
23
 
23
24
  class TestLoadAgentDefinition:
@@ -407,8 +408,8 @@ class TestWorkflowStateDetection:
407
408
 
408
409
  def test_detect_finish_state(self, tmp_path: Path) -> None:
409
410
  """Test detecting FINISH_STATE when phase is approved."""
410
- from pennyfarthing_scripts.prime.workflow import detect_workflow_state
411
411
  from pennyfarthing_scripts.prime.models import WorkflowState
412
+ from pennyfarthing_scripts.prime.workflow import detect_workflow_state
412
413
 
413
414
  # Setup
414
415
  pf_dir = tmp_path / ".pennyfarthing"
@@ -436,10 +437,11 @@ class TestWorkflowStateDetection:
436
437
 
437
438
  def test_detect_in_progress_state(self, tmp_path: Path) -> None:
438
439
  """Test detecting IN_PROGRESS_STATE with active phase."""
439
- from pennyfarthing_scripts.prime.workflow import detect_workflow_state
440
- from pennyfarthing_scripts.prime.models import WorkflowState
441
440
  import yaml
442
441
 
442
+ from pennyfarthing_scripts.prime.models import WorkflowState
443
+ from pennyfarthing_scripts.prime.workflow import detect_workflow_state
444
+
443
445
  # Setup
444
446
  pf_dir = tmp_path / ".pennyfarthing"
445
447
  pf_dir.mkdir()
@@ -483,10 +485,11 @@ class TestWorkflowStateDetection:
483
485
 
484
486
  def test_detect_new_work_state(self, tmp_path: Path) -> None:
485
487
  """Test detecting NEW_WORK_STATE with backlog stories."""
486
- from pennyfarthing_scripts.prime.workflow import detect_workflow_state
487
- from pennyfarthing_scripts.prime.models import WorkflowState
488
488
  import yaml
489
489
 
490
+ from pennyfarthing_scripts.prime.models import WorkflowState
491
+ from pennyfarthing_scripts.prime.workflow import detect_workflow_state
492
+
490
493
  # Setup
491
494
  pf_dir = tmp_path / ".pennyfarthing"
492
495
  pf_dir.mkdir()
@@ -514,10 +517,11 @@ class TestWorkflowStateDetection:
514
517
 
515
518
  def test_detect_empty_backlog_state(self, tmp_path: Path) -> None:
516
519
  """Test detecting EMPTY_BACKLOG_STATE with no backlog."""
517
- from pennyfarthing_scripts.prime.workflow import detect_workflow_state
518
- from pennyfarthing_scripts.prime.models import WorkflowState
519
520
  import yaml
520
521
 
522
+ from pennyfarthing_scripts.prime.models import WorkflowState
523
+ from pennyfarthing_scripts.prime.workflow import detect_workflow_state
524
+
521
525
  # Setup
522
526
  pf_dir = tmp_path / ".pennyfarthing"
523
527
  pf_dir.mkdir()
@@ -587,8 +591,8 @@ class TestCheckRedirect:
587
591
 
588
592
  def test_redirect_when_wrong_agent(self) -> None:
589
593
  """Test redirect is detected when wrong agent is activated."""
590
- from pennyfarthing_scripts.prime.workflow import check_redirect
591
594
  from pennyfarthing_scripts.prime.models import WorkflowState, WorkflowStatus
595
+ from pennyfarthing_scripts.prime.workflow import check_redirect
592
596
 
593
597
  status = WorkflowStatus(
594
598
  state=WorkflowState.IN_PROGRESS_STATE,
@@ -606,8 +610,8 @@ class TestCheckRedirect:
606
610
 
607
611
  def test_no_redirect_when_correct_agent(self) -> None:
608
612
  """Test no redirect when correct agent is activated."""
609
- from pennyfarthing_scripts.prime.workflow import check_redirect
610
613
  from pennyfarthing_scripts.prime.models import WorkflowState, WorkflowStatus
614
+ from pennyfarthing_scripts.prime.workflow import check_redirect
611
615
 
612
616
  status = WorkflowStatus(
613
617
  state=WorkflowState.IN_PROGRESS_STATE,
@@ -621,8 +625,8 @@ class TestCheckRedirect:
621
625
 
622
626
  def test_no_redirect_for_new_work(self) -> None:
623
627
  """Test no redirect for NEW_WORK_STATE."""
624
- from pennyfarthing_scripts.prime.workflow import check_redirect
625
628
  from pennyfarthing_scripts.prime.models import WorkflowState, WorkflowStatus
629
+ from pennyfarthing_scripts.prime.workflow import check_redirect
626
630
 
627
631
  status = WorkflowStatus(
628
632
  state=WorkflowState.NEW_WORK_STATE,
@@ -644,9 +648,10 @@ class TestPersonaLoading:
644
648
 
645
649
  def test_load_persona_from_theme(self, tmp_path: Path) -> None:
646
650
  """Test loading persona from theme YAML."""
647
- from pennyfarthing_scripts.prime.persona import load_persona
648
651
  import yaml
649
652
 
653
+ from pennyfarthing_scripts.prime.persona import load_persona
654
+
650
655
  # Setup
651
656
  pf_dir = tmp_path / ".pennyfarthing"
652
657
  pf_dir.mkdir()
@@ -697,9 +702,10 @@ class TestPersonaLoading:
697
702
 
698
703
  def test_get_crew_manifest(self, tmp_path: Path) -> None:
699
704
  """Test getting crew manifest for handoff reference."""
700
- from pennyfarthing_scripts.prime.persona import get_crew_manifest
701
705
  import yaml
702
706
 
707
+ from pennyfarthing_scripts.prime.persona import get_crew_manifest
708
+
703
709
  # Setup
704
710
  pf_dir = tmp_path / ".pennyfarthing"
705
711
  pf_dir.mkdir()
@@ -730,8 +736,8 @@ class TestPersonaLoading:
730
736
 
731
737
  def test_format_persona_output(self) -> None:
732
738
  """Test formatting persona as XML."""
739
+ from pennyfarthing_scripts.prime.models import CrewMember, Persona
733
740
  from pennyfarthing_scripts.prime.persona import format_persona_output
734
- from pennyfarthing_scripts.prime.models import Persona, CrewMember
735
741
 
736
742
  persona = Persona(
737
743
  character="Naomi Nagata",
@@ -798,9 +804,10 @@ class TestSessionRegistration:
798
804
 
799
805
  def test_cleanup_old_sessions(self, tmp_path: Path) -> None:
800
806
  """Test cleanup of old session files."""
801
- from pennyfarthing_scripts.prime.session import cleanup_old_sessions
802
807
  import time
803
808
 
809
+ from pennyfarthing_scripts.prime.session import cleanup_old_sessions
810
+
804
811
  # Setup
805
812
  pf_dir = tmp_path / ".pennyfarthing"
806
813
  pf_dir.mkdir()
@@ -886,11 +893,15 @@ class TestJSONOutput:
886
893
  def test_json_output_with_workflow(self, tmp_path: Path, capsys) -> None:
887
894
  """Test JSON output includes workflow status."""
888
895
  import json
896
+
889
897
  import yaml
890
898
 
891
899
  # Setup
892
900
  pf_dir = tmp_path / ".pennyfarthing"
893
901
  pf_dir.mkdir()
902
+ agents_dir = pf_dir / "agents"
903
+ agents_dir.mkdir()
904
+ (agents_dir / "sm.md").write_text("# SM Agent\nScrum Master")
894
905
  sprint_dir = tmp_path / "sprint"
895
906
  sprint_dir.mkdir()
896
907
  (sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
@@ -925,11 +936,15 @@ class TestJSONOutput:
925
936
  def test_json_output_with_redirect(self, tmp_path: Path, capsys) -> None:
926
937
  """Test JSON output includes redirect info."""
927
938
  import json
939
+
928
940
  import yaml
929
941
 
930
942
  # Setup
931
943
  pf_dir = tmp_path / ".pennyfarthing"
932
944
  pf_dir.mkdir()
945
+ agents_dir = pf_dir / "agents"
946
+ agents_dir.mkdir()
947
+ (agents_dir / "tea.md").write_text("# TEA Agent\nTest Engineer")
933
948
 
934
949
  # Create workflow YAML
935
950
  workflows_dir = tmp_path / "pennyfarthing-dist" / "workflows"
@@ -1039,6 +1054,9 @@ class TestCLIFlagsV2:
1039
1054
 
1040
1055
  pf_dir = tmp_path / ".pennyfarthing"
1041
1056
  pf_dir.mkdir()
1057
+ agents_dir = pf_dir / "agents"
1058
+ agents_dir.mkdir()
1059
+ (agents_dir / "sm.md").write_text("# SM Agent\nScrum Master")
1042
1060
 
1043
1061
  with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
1044
1062
  result = main(["--agent", "sm", "--session-id", "explicit-123", "--no-workflow"])
@@ -7,10 +7,7 @@ after reorganization from flat modules.
7
7
  """
8
8
 
9
9
  from pathlib import Path
10
- from typing import Any
11
- from unittest.mock import MagicMock, patch
12
-
13
- import pytest
10
+ from unittest.mock import patch
14
11
 
15
12
 
16
13
  class TestSprintLoader:
@@ -28,8 +25,8 @@ class TestSprintLoader:
28
25
 
29
26
  def test_load_sprint_with_custom_root(self) -> None:
30
27
  """load_sprint should accept custom project root."""
31
- from pennyfarthing_scripts.sprint.loader import load_sprint
32
28
  from pennyfarthing_scripts.common.config import get_project_root
29
+ from pennyfarthing_scripts.sprint.loader import load_sprint
33
30
 
34
31
  root = get_project_root()
35
32
  result = load_sprint(project_root=root)
@@ -341,8 +338,7 @@ epics:
341
338
 
342
339
  def test_get_all_stories_with_shards(self, tmp_path: Path) -> None:
343
340
  """get_all_stories should return stories from merged shards."""
344
- from pennyfarthing_scripts.sprint.loader import get_all_stories, load_sprint
345
- from unittest.mock import patch
341
+ from pennyfarthing_scripts.sprint.loader import get_all_stories
346
342
 
347
343
  root = self._create_sharded_sprint(tmp_path)
348
344
 
@@ -379,7 +375,6 @@ epics:
379
375
  def test_backlog_count_defensive_on_strings(self) -> None:
380
376
  """get_backlog_count should not crash on string epics."""
381
377
  from pennyfarthing_scripts.prime.workflow import get_backlog_count
382
- from unittest.mock import patch
383
378
 
384
379
  fake_data = {"epics": ["MSSCI-14298", "MSSCI-14317"]}
385
380
  with patch("pennyfarthing_scripts.sprint.loader.load_sprint", return_value=fake_data):
@@ -19,19 +19,18 @@ from typing import Any
19
19
  import pytest
20
20
 
21
21
  from pennyfarthing_scripts.sprint.validator import (
22
- ValidationError,
23
22
  ValidationResult,
24
23
  ValidationSeverity,
25
24
  format_validation_errors,
26
25
  validate_archived_sprint,
27
26
  validate_epic,
27
+ validate_epic_shard,
28
28
  validate_full_sprint,
29
29
  validate_sprint,
30
30
  validate_sprint_file,
31
31
  validate_story,
32
32
  )
33
33
 
34
-
35
34
  # =============================================================================
36
35
  # Test Fixtures - Valid Data
37
36
  # =============================================================================
@@ -239,7 +238,7 @@ class TestStoryValidation:
239
238
 
240
239
  def test_all_valid_story_statuses_pass(self) -> None:
241
240
  """All valid status values should pass."""
242
- valid_statuses = ["backlog", "in_progress", "done", "cancelled"]
241
+ valid_statuses = ["backlog", "ready", "in_progress", "done", "canceled", "planning"]
243
242
 
244
243
  for status in valid_statuses:
245
244
  story = {"id": "63-1", "title": "Test", "status": status, "points": 3}
@@ -364,6 +363,55 @@ class TestEpicValidation:
364
363
  assert result.valid is False
365
364
  assert any("duplicate" in e.message.lower() for e in result.errors)
366
365
 
366
+ def test_integer_epic_id_fails(self) -> None:
367
+ """Epic with integer id (YAML bare number) should fail.
368
+
369
+ YAML parses `id: 87` as int. Cyclist's sprint-data.ts calls
370
+ epicId.match() which crashes on non-strings, blanking the panel.
371
+ """
372
+ epic = {
373
+ "id": 87, # Bare integer — not quoted in YAML
374
+ "title": "Test Epic",
375
+ "stories": [
376
+ {"id": "87-1", "title": "Story 1", "status": "backlog", "points": 2},
377
+ ],
378
+ }
379
+
380
+ result = validate_epic(epic, set())
381
+
382
+ assert result.valid is False
383
+ assert any("must be a string" in e.message.lower() for e in result.errors)
384
+
385
+ def test_integer_epic_id_fails_in_shard(self) -> None:
386
+ """Epic shard with integer id should fail validation."""
387
+ epic = {
388
+ "id": 87,
389
+ "title": "Test Epic",
390
+ "status": "planning",
391
+ "stories": [
392
+ {"id": "87-1", "title": "Story 1", "status": "backlog", "points": 2},
393
+ ],
394
+ }
395
+
396
+ result = validate_epic_shard(epic)
397
+
398
+ assert result.valid is False
399
+ assert any("must be a string" in e.message.lower() for e in result.errors)
400
+
401
+ def test_string_epic_id_passes(self) -> None:
402
+ """Epic with properly quoted string id should pass."""
403
+ epic = {
404
+ "id": "87", # Quoted in YAML — parsed as string
405
+ "title": "Test Epic",
406
+ "stories": [
407
+ {"id": "87-1", "title": "Story 1", "status": "backlog", "points": 2},
408
+ ],
409
+ }
410
+
411
+ result = validate_epic(epic, set())
412
+
413
+ assert result.valid is True
414
+
367
415
 
368
416
  # =============================================================================
369
417
  # AC4: Clear error messages for validation failures
@@ -470,7 +518,7 @@ class TestArchivedSprintValidation:
470
518
  assert result.valid is True
471
519
 
472
520
  def test_archived_sprint_allows_all_done_stories(self) -> None:
473
- """Archived sprints should allow all stories to be done/cancelled."""
521
+ """Archived sprints should allow all stories to be done/canceled."""
474
522
  data = {
475
523
  "sprint": {
476
524
  "number": 11,
@@ -486,7 +534,7 @@ class TestArchivedSprintValidation:
486
534
  "title": "Old Epic",
487
535
  "stories": [
488
536
  {"id": "50-1", "title": "Done Story", "status": "done", "points": 3},
489
- {"id": "50-2", "title": "Cancelled Story", "status": "cancelled", "points": 2},
537
+ {"id": "50-2", "title": "Canceled Story", "status": "canceled", "points": 2},
490
538
  ],
491
539
  }
492
540
  ],
@@ -15,11 +15,10 @@ Acceptance Criteria:
15
15
  """
16
16
 
17
17
  from pathlib import Path
18
- from typing import Any
19
18
 
20
19
  import pytest
21
20
  from click.testing import CliRunner
22
- from ruamel.yaml.comments import CommentedMap, CommentedSeq
21
+ from ruamel.yaml.comments import CommentedMap
23
22
 
24
23
  from pennyfarthing_scripts.sprint.story_add import (
25
24
  add_story,
@@ -28,10 +27,8 @@ from pennyfarthing_scripts.sprint.story_add import (
28
27
  from pennyfarthing_scripts.sprint.yaml_io import (
29
28
  STORY_KEY_ORDER,
30
29
  read_sprint,
31
- write_sprint,
32
30
  )
33
31
 
34
-
35
32
  # =============================================================================
36
33
  # Test Fixtures
37
34
  # =============================================================================
@@ -676,7 +673,6 @@ epics:
676
673
  """
677
674
  p = tmp_path / "current-sprint.yaml"
678
675
  p.write_text(yaml_content)
679
- original_content = p.read_text()
680
676
 
681
677
  # Normal add should work fine
682
678
  result = add_story(
@@ -699,10 +695,10 @@ class TestCLIIntegration:
699
695
 
700
696
  def test_story_add_command_exists(self) -> None:
701
697
  """story_add_command should be importable and be a Click command."""
702
- from pennyfarthing_scripts.sprint.story_add import story_add_command
703
-
704
698
  import click
705
699
 
700
+ from pennyfarthing_scripts.sprint.story_add import story_add_command
701
+
706
702
  assert isinstance(story_add_command, click.BaseCommand)
707
703
 
708
704
  def test_basic_add_via_cli(self, runner: CliRunner, sprint_file: Path) -> None:
@@ -5,10 +5,7 @@ Story 63-9: Reorganize pennyfarthing_scripts into fan-out CLI pattern.
5
5
  These tests verify the story/ package modules work correctly.
6
6
  """
7
7
 
8
- from typing import Any
9
- from unittest.mock import patch
10
8
 
11
- import pytest
12
9
 
13
10
 
14
11
  class TestStorySizeModule:
@@ -14,12 +14,10 @@ Acceptance Criteria:
14
14
  """
15
15
 
16
16
  from pathlib import Path
17
- from typing import Any
18
17
  from unittest.mock import patch
19
18
 
20
19
  import pytest
21
20
  from click.testing import CliRunner
22
- from ruamel.yaml.comments import CommentedMap
23
21
 
24
22
  from pennyfarthing_scripts.sprint.story_update import (
25
23
  update_story,
@@ -28,7 +26,6 @@ from pennyfarthing_scripts.sprint.yaml_io import (
28
26
  read_sprint,
29
27
  )
30
28
 
31
-
32
29
  # =============================================================================
33
30
  # Test Fixtures
34
31
  # =============================================================================
@@ -275,8 +272,6 @@ class TestUpdateStoryFields:
275
272
 
276
273
  def test_no_updates_provided(self, sprint_file: Path) -> None:
277
274
  """Calling with no field updates should succeed as a noop."""
278
- original_content = sprint_file.read_text()
279
-
280
275
  result = update_story(
281
276
  sprint_path=sprint_file,
282
277
  story_id="76-3",
@@ -378,8 +373,8 @@ class TestFindStoryAcrossEpics:
378
373
  class TestAutoCleanup:
379
374
  """Auto-cleanup rules for status transitions."""
380
375
 
381
- def test_done_removes_assigned_to(self, assigned_story_file: Path) -> None:
382
- """Setting status=done should remove assigned_to."""
376
+ def test_done_preserves_assigned_to(self, assigned_story_file: Path) -> None:
377
+ """Setting status=done should preserve assigned_to (no auto-removal)."""
383
378
  result = update_story(
384
379
  sprint_path=assigned_story_file,
385
380
  story_id="76-1",
@@ -390,7 +385,7 @@ class TestAutoCleanup:
390
385
 
391
386
  data = read_sprint(assigned_story_file)
392
387
  story = data["epics"][0]["stories"][0]
393
- assert "assigned_to" not in story
388
+ assert story["assigned_to"] == "kavery"
394
389
 
395
390
  def test_done_auto_sets_completed(self, assigned_story_file: Path) -> None:
396
391
  """Setting status=done should auto-set completed to today."""
@@ -611,10 +606,10 @@ class TestCLIIntegration:
611
606
 
612
607
  def test_update_command_exists(self) -> None:
613
608
  """story_update_command should be importable and be a Click command."""
614
- from pennyfarthing_scripts.sprint.story_update import story_update_command
615
-
616
609
  import click
617
610
 
611
+ from pennyfarthing_scripts.sprint.story_update import story_update_command
612
+
618
613
  assert isinstance(story_update_command, click.BaseCommand)
619
614
 
620
615
  def test_basic_update_via_cli(self, runner: CliRunner, sprint_file: Path) -> None:
@@ -12,11 +12,11 @@ Acceptance Criteria:
12
12
  - AC6: Token reduction verified: REFRESH ~600, HANDOFF ~700, MINIMAL ~200
13
13
  """
14
14
 
15
- import pytest
16
15
  from pathlib import Path
17
- from unittest.mock import patch, MagicMock
18
- import yaml
16
+ from unittest.mock import patch
19
17
 
18
+ import pytest
19
+ import yaml
20
20
 
21
21
  # =============================================================================
22
22
  # AC1: --tier CLI Argument Tests
@@ -314,10 +314,9 @@ class TestCompressedPersonaFormat:
314
314
 
315
315
  def test_compressed_persona_has_xml_structure(self, tmp_path: Path) -> None:
316
316
  """Test compressed persona uses XML format."""
317
- from pennyfarthing_scripts.prime.persona import format_persona_compressed
318
-
319
317
  # Import will fail until function is implemented
320
318
  from pennyfarthing_scripts.prime.models import Persona
319
+ from pennyfarthing_scripts.prime.persona import format_persona_compressed
321
320
 
322
321
  persona = Persona(
323
322
  character="Rosie the Riveter",
@@ -334,8 +333,8 @@ class TestCompressedPersonaFormat:
334
333
 
335
334
  def test_compressed_persona_includes_voice(self, tmp_path: Path) -> None:
336
335
  """Test compressed persona includes voice element."""
337
- from pennyfarthing_scripts.prime.persona import format_persona_compressed
338
336
  from pennyfarthing_scripts.prime.models import Persona
337
+ from pennyfarthing_scripts.prime.persona import format_persona_compressed
339
338
 
340
339
  persona = Persona(
341
340
  character="Rosie the Riveter",
@@ -350,8 +349,8 @@ class TestCompressedPersonaFormat:
350
349
 
351
350
  def test_compressed_persona_includes_style(self, tmp_path: Path) -> None:
352
351
  """Test compressed persona includes style element."""
353
- from pennyfarthing_scripts.prime.persona import format_persona_compressed
354
352
  from pennyfarthing_scripts.prime.models import Persona
353
+ from pennyfarthing_scripts.prime.persona import format_persona_compressed
355
354
 
356
355
  persona = Persona(
357
356
  character="Rosie the Riveter",
@@ -365,8 +364,8 @@ class TestCompressedPersonaFormat:
365
364
 
366
365
  def test_compressed_persona_includes_catchphrase_if_present(self, tmp_path: Path) -> None:
367
366
  """Test compressed persona includes catchphrase from quote."""
368
- from pennyfarthing_scripts.prime.persona import format_persona_compressed
369
367
  from pennyfarthing_scripts.prime.models import Persona
368
+ from pennyfarthing_scripts.prime.persona import format_persona_compressed
370
369
 
371
370
  persona = Persona(
372
371
  character="Rosie the Riveter",
@@ -382,8 +381,8 @@ class TestCompressedPersonaFormat:
382
381
 
383
382
  def test_compressed_persona_token_count(self, tmp_path: Path) -> None:
384
383
  """Test compressed persona is approximately 100 tokens (~400 chars)."""
385
- from pennyfarthing_scripts.prime.persona import format_persona_compressed
386
384
  from pennyfarthing_scripts.prime.models import Persona
385
+ from pennyfarthing_scripts.prime.persona import format_persona_compressed
387
386
 
388
387
  persona = Persona(
389
388
  character="Rosie the Riveter",
@@ -402,8 +401,8 @@ class TestCompressedPersonaFormat:
402
401
 
403
402
  def test_full_persona_token_count(self, tmp_path: Path) -> None:
404
403
  """Test full persona is approximately 300 tokens (~1200 chars)."""
404
+ from pennyfarthing_scripts.prime.models import CrewMember, Persona
405
405
  from pennyfarthing_scripts.prime.persona import format_persona_output
406
- from pennyfarthing_scripts.prime.models import Persona, CrewMember
407
406
 
408
407
  persona = Persona(
409
408
  character="Rosie the Riveter",
@@ -509,9 +508,10 @@ class TestDefaultBehavior:
509
508
 
510
509
  def test_existing_flags_still_work_with_tier(self, tmp_path: Path, capsys) -> None:
511
510
  """Test existing flags (--quiet, --json, etc.) work with --tier."""
512
- from pennyfarthing_scripts.prime.cli import prime
513
511
  import json
514
512
 
513
+ from pennyfarthing_scripts.prime.cli import prime
514
+
515
515
  # Setup
516
516
  pf_dir = tmp_path / ".pennyfarthing"
517
517
  pf_dir.mkdir()
@@ -548,7 +548,7 @@ class TestTierLoadingPaths:
548
548
 
549
549
  def test_full_tier_with_all_options(self, tmp_path: Path) -> None:
550
550
  """Test FULL tier with all context sources available."""
551
- from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
551
+ from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
552
552
 
553
553
  # Setup complete project
554
554
  self._setup_complete_project(tmp_path)
@@ -569,7 +569,7 @@ class TestTierLoadingPaths:
569
569
 
570
570
  def test_full_tier_with_missing_optional(self, tmp_path: Path) -> None:
571
571
  """Test FULL tier gracefully handles missing optional components."""
572
- from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
572
+ from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
573
573
 
574
574
  # Minimal setup - only agent definition
575
575
  pf_dir = tmp_path / ".pennyfarthing"
@@ -590,7 +590,7 @@ class TestTierLoadingPaths:
590
590
 
591
591
  def test_refresh_tier_components(self, tmp_path: Path) -> None:
592
592
  """Test REFRESH tier returns correct component set."""
593
- from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
593
+ from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
594
594
 
595
595
  self._setup_complete_project(tmp_path)
596
596
 
@@ -612,7 +612,7 @@ class TestTierLoadingPaths:
612
612
 
613
613
  def test_handoff_tier_components(self, tmp_path: Path) -> None:
614
614
  """Test HANDOFF tier returns correct component set."""
615
- from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
615
+ from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
616
616
 
617
617
  self._setup_complete_project(tmp_path)
618
618
 
@@ -633,7 +633,7 @@ class TestTierLoadingPaths:
633
633
 
634
634
  def test_minimal_tier_components(self, tmp_path: Path) -> None:
635
635
  """Test MINIMAL tier returns minimal component set."""
636
- from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
636
+ from pennyfarthing_scripts.prime.tiers import ContextTier, load_tier_components
637
637
 
638
638
  self._setup_complete_project(tmp_path)
639
639
 
@@ -990,9 +990,10 @@ class TestTierIntegration:
990
990
 
991
991
  def test_json_output_includes_tier(self, tmp_path: Path, capsys) -> None:
992
992
  """Test JSON output includes current tier."""
993
- from pennyfarthing_scripts.prime.cli import prime
994
993
  import json
995
994
 
995
+ from pennyfarthing_scripts.prime.cli import prime
996
+
996
997
  pf_dir = tmp_path / ".pennyfarthing"
997
998
  pf_dir.mkdir()
998
999
  agents_dir = pf_dir / "agents"