@pennyfarthing/core 11.0.0 → 11.1.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 (485) hide show
  1. package/README.md +80 -22
  2. package/package.json +14 -16
  3. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts +20 -0
  4. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts.map +1 -0
  5. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js +278 -0
  6. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js.map +1 -0
  7. package/packages/core/dist/cli/utils/constants.d.ts +7 -1
  8. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
  9. package/packages/core/dist/cli/utils/constants.js +2 -0
  10. package/packages/core/dist/cli/utils/constants.js.map +1 -1
  11. package/packages/core/dist/cli/utils/constants.test.d.ts +10 -0
  12. package/packages/core/dist/cli/utils/constants.test.d.ts.map +1 -0
  13. package/packages/core/dist/cli/utils/constants.test.js +38 -0
  14. package/packages/core/dist/cli/utils/constants.test.js.map +1 -0
  15. package/packages/core/dist/consultation/consultation-protocol.d.ts +139 -0
  16. package/packages/core/dist/consultation/consultation-protocol.d.ts.map +1 -0
  17. package/packages/core/dist/consultation/consultation-protocol.js +178 -0
  18. package/packages/core/dist/consultation/consultation-protocol.js.map +1 -0
  19. package/packages/core/dist/consultation/consultation-protocol.test.d.ts +20 -0
  20. package/packages/core/dist/consultation/consultation-protocol.test.d.ts.map +1 -0
  21. package/packages/core/dist/consultation/consultation-protocol.test.js +474 -0
  22. package/packages/core/dist/consultation/consultation-protocol.test.js.map +1 -0
  23. package/packages/core/dist/public/js/react/react.js +3 -3
  24. package/packages/core/dist/scripts/theme-detail.test.d.ts +10 -0
  25. package/packages/core/dist/scripts/theme-detail.test.js +199 -0
  26. package/packages/core/dist/server/api/health-score.d.ts.map +1 -1
  27. package/packages/core/dist/server/api/health-score.js +25 -1
  28. package/packages/core/dist/server/api/health-score.js.map +1 -1
  29. package/packages/core/dist/server/api/settings.d.ts.map +1 -1
  30. package/packages/core/dist/server/api/settings.js +63 -1
  31. package/packages/core/dist/server/api/settings.js.map +1 -1
  32. package/packages/core/dist/server/api/theme-agents.d.ts.map +1 -1
  33. package/packages/core/dist/server/api/theme-agents.js +61 -0
  34. package/packages/core/dist/server/api/theme-agents.js.map +1 -1
  35. package/packages/core/dist/server/server.d.ts.map +1 -1
  36. package/packages/core/dist/server/server.js +17 -12
  37. package/packages/core/dist/server/server.js.map +1 -1
  38. package/packages/core/dist/workflow/gate-file-validation.d.ts +49 -0
  39. package/packages/core/dist/workflow/gate-file-validation.d.ts.map +1 -0
  40. package/packages/core/dist/workflow/gate-file-validation.js +157 -0
  41. package/packages/core/dist/workflow/gate-file-validation.js.map +1 -0
  42. package/packages/core/dist/workflow/gate-file-validation.test.d.ts +19 -0
  43. package/packages/core/dist/workflow/gate-file-validation.test.d.ts.map +1 -0
  44. package/packages/core/dist/workflow/gate-file-validation.test.js +536 -0
  45. package/packages/core/dist/workflow/gate-file-validation.test.js.map +1 -0
  46. package/packages/core/dist/workflow/gate-schema-validation.test.d.ts +14 -0
  47. package/packages/core/dist/workflow/gate-schema-validation.test.d.ts.map +1 -0
  48. package/packages/core/dist/workflow/gate-schema-validation.test.js +339 -0
  49. package/packages/core/dist/workflow/gate-schema-validation.test.js.map +1 -0
  50. package/packages/core/dist/workflow/handoff.js +2 -2
  51. package/packages/core/dist/workflow/handoff.js.map +1 -1
  52. package/packages/core/dist/workflow/handoff.test.js +16 -0
  53. package/packages/core/dist/workflow/handoff.test.js.map +1 -1
  54. package/packages/core/dist/workflow/workflow-schema.d.ts +4 -2
  55. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
  56. package/packages/core/dist/workflow/workflow-schema.js +43 -8
  57. package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
  58. package/pennyfarthing-dist/agents/README.md +6 -14
  59. package/pennyfarthing-dist/agents/architect.md +43 -29
  60. package/pennyfarthing-dist/agents/ba.md +30 -29
  61. package/pennyfarthing-dist/agents/dev.md +32 -43
  62. package/pennyfarthing-dist/agents/devops.md +57 -21
  63. package/pennyfarthing-dist/agents/orchestrator.md +3 -10
  64. package/pennyfarthing-dist/agents/pm.md +45 -31
  65. package/pennyfarthing-dist/agents/reviewer.md +20 -66
  66. package/pennyfarthing-dist/agents/sm-setup.md +2 -2
  67. package/pennyfarthing-dist/agents/sm.md +8 -30
  68. package/pennyfarthing-dist/agents/tea.md +25 -41
  69. package/pennyfarthing-dist/agents/tech-writer.md +33 -90
  70. package/pennyfarthing-dist/agents/ux-designer.md +39 -39
  71. package/pennyfarthing-dist/commands/benchmark-control.md +8 -64
  72. package/pennyfarthing-dist/commands/benchmark.md +8 -480
  73. package/pennyfarthing-dist/commands/job-fair.md +8 -97
  74. package/pennyfarthing-dist/commands/pf-benchmark-control.md +70 -0
  75. package/pennyfarthing-dist/commands/pf-benchmark.md +486 -0
  76. package/pennyfarthing-dist/commands/pf-chore.md +4 -4
  77. package/pennyfarthing-dist/commands/pf-ci.md +40 -0
  78. package/pennyfarthing-dist/commands/pf-close-epic.md +9 -27
  79. package/pennyfarthing-dist/commands/pf-continue-session.md +9 -213
  80. package/pennyfarthing-dist/commands/pf-create-branches-from-story.md +11 -353
  81. package/pennyfarthing-dist/commands/pf-docs.md +28 -0
  82. package/pennyfarthing-dist/commands/pf-epic.md +67 -0
  83. package/pennyfarthing-dist/commands/pf-git-cleanup.md +11 -52
  84. package/pennyfarthing-dist/commands/pf-git.md +75 -0
  85. package/pennyfarthing-dist/commands/pf-help.md +110 -128
  86. package/pennyfarthing-dist/commands/pf-job-fair.md +102 -0
  87. package/pennyfarthing-dist/commands/pf-new-work.md +9 -18
  88. package/pennyfarthing-dist/commands/pf-parallel-work.md +6 -66
  89. package/pennyfarthing-dist/commands/pf-release.md +11 -76
  90. package/pennyfarthing-dist/commands/pf-repo-status.md +11 -44
  91. package/pennyfarthing-dist/commands/pf-run-ci.md +8 -111
  92. package/pennyfarthing-dist/commands/pf-session.md +51 -0
  93. package/pennyfarthing-dist/commands/pf-solo.md +447 -0
  94. package/pennyfarthing-dist/commands/pf-sprint-planning.md +8 -104
  95. package/pennyfarthing-dist/commands/pf-standalone.md +1 -1
  96. package/pennyfarthing-dist/commands/pf-start-epic.md +9 -163
  97. package/pennyfarthing-dist/commands/pf-sync-epic-to-jira.md +8 -179
  98. package/pennyfarthing-dist/commands/pf-sync-work-with-sprint.md +8 -368
  99. package/pennyfarthing-dist/commands/pf-update-domain-docs.md +8 -78
  100. package/pennyfarthing-dist/commands/solo.md +8 -442
  101. package/pennyfarthing-dist/guides/agent-behavior.md +13 -13
  102. package/pennyfarthing-dist/guides/agent-coordination.md +7 -7
  103. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -5
  104. package/pennyfarthing-dist/guides/bikerack.md +128 -0
  105. package/pennyfarthing-dist/guides/brownfield-tools.md +133 -0
  106. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +2 -2
  107. package/pennyfarthing-dist/guides/gate-schema.md +227 -0
  108. package/pennyfarthing-dist/guides/gates.md +120 -0
  109. package/pennyfarthing-dist/guides/handoff-cli.md +116 -0
  110. package/pennyfarthing-dist/guides/hooks.md +86 -4
  111. package/pennyfarthing-dist/guides/output-styles.md +65 -0
  112. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +5 -5
  113. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -4
  114. package/pennyfarthing-dist/guides/prompt-patterns.md +5 -5
  115. package/pennyfarthing-dist/guides/reflector.md +4 -4
  116. package/pennyfarthing-dist/guides/session-artifacts.md +1 -1
  117. package/pennyfarthing-dist/guides/skill-schema.md +1 -1
  118. package/pennyfarthing-dist/guides/tandem-protocol.md +13 -1
  119. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  120. package/pennyfarthing-dist/guides/xml-tags.md +5 -4
  121. package/pennyfarthing-dist/personas/themes/hogans-heroes.yaml +11 -22
  122. package/pennyfarthing-dist/personas/themes/stephen-king.yaml +13 -24
  123. package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -0
  124. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
  125. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +1 -1
  126. package/pennyfarthing-dist/scripts/core/prime.sh +0 -0
  127. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
  128. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
  129. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
  130. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +0 -0
  131. package/pennyfarthing-dist/scripts/git/release.sh +0 -0
  132. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
  133. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
  134. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -0
  135. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  136. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  137. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  138. package/pennyfarthing-dist/scripts/hooks/dispatcher-template.sh +0 -0
  139. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +19 -14
  140. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
  141. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
  142. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  143. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
  144. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
  145. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
  146. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
  147. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
  148. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  149. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
  150. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
  151. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
  152. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
  153. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
  154. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
  155. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
  156. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
  157. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
  158. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
  159. package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
  160. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
  161. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
  162. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
  163. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
  164. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
  165. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
  166. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
  167. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
  168. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
  169. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
  170. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
  171. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
  172. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
  173. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
  174. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
  175. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
  176. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
  177. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
  178. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
  179. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
  180. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
  181. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
  182. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -0
  183. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +191 -57
  184. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +26 -10
  185. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
  186. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
  187. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
  188. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  189. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
  190. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
  191. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -0
  192. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
  193. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
  194. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
  195. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
  196. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  197. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
  198. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  199. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  200. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  201. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
  202. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
  203. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -0
  204. package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
  205. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
  206. package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
  207. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -0
  208. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
  209. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
  210. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
  211. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
  212. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
  213. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
  214. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
  215. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
  216. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
  217. package/pennyfarthing-dist/skills/pf-changelog/SKILL.md +4 -4
  218. package/pennyfarthing-dist/skills/pf-sprint/skill.md +1 -1
  219. package/pennyfarthing-dist/skills/pf-story/scripts/create-story.sh +0 -0
  220. package/pennyfarthing-dist/skills/pf-story/scripts/size-story.sh +0 -0
  221. package/pennyfarthing-dist/skills/pf-story/scripts/story-template.sh +0 -0
  222. package/pennyfarthing-dist/skills/pf-workflow/scripts/list-workflows.sh +0 -0
  223. package/pennyfarthing-dist/skills/pf-workflow/scripts/resume-workflow.sh +0 -0
  224. package/pennyfarthing-dist/skills/pf-workflow/scripts/show-workflow.sh +0 -0
  225. package/pennyfarthing-dist/skills/pf-workflow/scripts/start-workflow.sh +0 -0
  226. package/pennyfarthing-dist/skills/pf-workflow/scripts/workflow-status.sh +0 -0
  227. package/pennyfarthing-dist/skills/skill-registry.schema.json +4 -0
  228. package/pennyfarthing-dist/skills/skill-registry.yaml +5 -0
  229. package/pennyfarthing-dist/workflows/2party-tdd.yaml +11 -0
  230. package/pennyfarthing-dist/workflows/agent-docs.yaml +2 -0
  231. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +4 -0
  232. package/pennyfarthing-dist/workflows/bdd.yaml +4 -0
  233. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  234. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +3 -0
  235. package/pennyfarthing-dist/workflows/tdd.yaml +3 -0
  236. package/pennyfarthing-dist/workflows/trivial.yaml +2 -0
  237. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  238. package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  239. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  240. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  241. package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
  242. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  243. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  244. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  245. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  247. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  256. package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  257. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  259. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  260. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  261. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  262. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  263. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  264. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  265. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  266. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  267. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  268. package/pennyfarthing_scripts/bikerack/debug_panel.py +218 -0
  269. package/pennyfarthing_scripts/bikerack/diffs_panel.py +203 -27
  270. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  271. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  272. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  273. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  274. package/pennyfarthing_scripts/cli.py +114 -0
  275. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  277. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  278. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  282. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  283. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  284. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  285. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  286. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  287. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  288. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  289. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  291. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  292. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  293. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  294. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  295. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  296. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  297. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  298. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  299. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  302. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  303. package/pennyfarthing_scripts/epic/__init__.py +0 -0
  304. package/pennyfarthing_scripts/epic/cli.py +64 -0
  305. package/pennyfarthing_scripts/gate/__init__.py +1 -0
  306. package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
  307. package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
  309. package/pennyfarthing_scripts/gate/cli.py +56 -0
  310. package/pennyfarthing_scripts/gate/validate.py +266 -0
  311. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  313. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  314. package/pennyfarthing_scripts/git_group/__init__.py +0 -0
  315. package/pennyfarthing_scripts/git_group/cli.py +100 -0
  316. package/pennyfarthing_scripts/handoff/__init__.py +1 -0
  317. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  318. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  319. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  320. package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  321. package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  322. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  323. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  324. package/pennyfarthing_scripts/handoff/cli.py +120 -0
  325. package/pennyfarthing_scripts/handoff/complete_phase.py +155 -0
  326. package/pennyfarthing_scripts/handoff/gate_file.py +105 -0
  327. package/pennyfarthing_scripts/handoff/gate_runner.py +152 -0
  328. package/pennyfarthing_scripts/handoff/marker.py +109 -0
  329. package/pennyfarthing_scripts/handoff/resolve_gate.py +152 -0
  330. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  331. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  332. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  333. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  334. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  335. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  336. package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  337. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  338. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  339. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  340. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  341. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  342. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  343. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  344. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  345. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  346. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  347. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  348. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  349. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  350. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  351. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  352. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  353. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  354. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  355. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  356. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
  357. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  358. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  359. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  360. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  361. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  362. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  363. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  364. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  365. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  366. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  367. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  368. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  369. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  370. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  371. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  372. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  373. package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  374. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  375. package/pennyfarthing_scripts/prime/workflow.py +39 -0
  376. package/pennyfarthing_scripts/session/__init__.py +0 -0
  377. package/pennyfarthing_scripts/session/cli.py +87 -0
  378. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  379. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  380. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  381. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  382. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  383. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  384. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  385. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  386. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  387. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  388. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  389. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  390. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  391. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  392. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  393. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  394. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  395. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  396. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  397. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  398. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  399. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  400. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  401. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  402. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  403. package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
  404. package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  405. package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  406. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  407. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  408. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  409. package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  410. package/pennyfarthing_scripts/tests/__pycache__/test_codemarkers.cpython-314-pytest-9.0.2.pyc +0 -0
  411. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  412. package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  413. package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
  414. package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
  415. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  416. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  417. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  418. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  419. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  420. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  421. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  422. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  423. package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
  424. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  425. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  426. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  427. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  428. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  429. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  430. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  431. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  432. package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  433. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  434. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  435. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  436. package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  437. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  438. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  439. package/pennyfarthing_scripts/tests/test_108_1_gate_migration.py +540 -0
  440. package/pennyfarthing_scripts/tests/test_108_2_remove_handoff_fallback.py +339 -0
  441. package/pennyfarthing_scripts/tests/test_confidence_sm_evaluation.py +253 -0
  442. package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +315 -0
  443. package/pennyfarthing_scripts/tests/test_gate_file_resolution.py +341 -0
  444. package/pennyfarthing_scripts/tests/test_gate_runner.py +620 -0
  445. package/pennyfarthing_scripts/tests/test_handoff_cli.py +929 -0
  446. package/pennyfarthing_scripts/tests/test_handoff_e2e.py +454 -0
  447. package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +464 -0
  448. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  449. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  450. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  451. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  452. package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  453. package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  454. package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  455. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  456. package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  457. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  458. package/pennyfarthing_scripts/validate/adapters/skill_command.py +200 -0
  459. package/pennyfarthing_scripts/validate/adapters/workflow.py +64 -0
  460. package/pennyfarthing_scripts/validate/cli.py +15 -4
  461. package/packages/core/dist/scripts/benchmark-integration.d.ts +0 -182
  462. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +0 -1
  463. package/packages/core/dist/scripts/benchmark-integration.js +0 -691
  464. package/packages/core/dist/scripts/benchmark-integration.js.map +0 -1
  465. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +0 -150
  466. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
  467. package/packages/core/dist/scripts/job-fair-aggregator.js +0 -547
  468. package/packages/core/dist/scripts/job-fair-aggregator.js.map +0 -1
  469. package/pennyfarthing-dist/agents/handoff.md +0 -250
  470. package/pennyfarthing-dist/agents/sm-handoff.md +0 -152
  471. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -112
  472. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  473. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  474. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  475. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  476. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  477. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  478. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  479. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  480. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  481. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  482. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  483. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  484. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  485. package/scripts/README.md +0 -41
@@ -53,6 +53,7 @@ workflow:
53
53
  Present findings to user. User decides what to add/change.
54
54
  Update the story description with agreed refinements.
55
55
  gate:
56
+ file: gates/approval
56
57
  type: approval
57
58
  condition: User reviewed dev-perspective gaps and decided on each item
58
59
 
@@ -73,6 +74,7 @@ workflow:
73
74
  Present findings to user. User decides what to add/change.
74
75
  Update the story description with agreed refinements.
75
76
  gate:
77
+ file: gates/approval
76
78
  type: approval
77
79
  condition: User reviewed tea-perspective gaps and decided on each item
78
80
 
@@ -93,6 +95,7 @@ workflow:
93
95
 
94
96
  Fix any remaining issues, then hand off to TEA.
95
97
  gate:
98
+ file: gates/approval
96
99
  type: approval
97
100
  condition: Story passes quality check and is ready for TEA
98
101
 
@@ -122,6 +125,7 @@ workflow:
122
125
  In the TEA Assessment handoff, list what quality gates Dev
123
126
  should expect to pass beyond the functional tests.
124
127
  gate:
128
+ file: gates/tests-fail
125
129
  type: tests_fail
126
130
  condition: All acceptance criteria have test coverage, including quality gate check
127
131
 
@@ -154,6 +158,7 @@ workflow:
154
158
 
155
159
  Reviewer should only receive code that is verified clean.
156
160
  gate:
161
+ file: gates/quality-pass
157
162
  type: quality_pass
158
163
  condition: >
159
164
  All project quality gates pass locally — tests, lint, format,
@@ -181,6 +186,7 @@ workflow:
181
186
  - Set review_verdict: approved in story
182
187
  - DO NOT merge the PR — hand off to SM for finish phase
183
188
  gate:
189
+ file: gates/approval
184
190
  type: approval
185
191
  condition: Code review passed, no blocking issues
186
192
 
@@ -194,6 +200,7 @@ workflow:
194
200
  from the story. Write failing tests for each testable finding.
195
201
  Commit RED tests. Hand off to Dev.
196
202
  gate:
203
+ file: gates/tests-fail
197
204
  type: tests_fail
198
205
  condition: New tests cover reviewer findings
199
206
 
@@ -227,6 +234,7 @@ workflow:
227
234
  If verification fails, hand back to Dev with specifics.
228
235
  If verification passes, hand off to Reviewer for re-review.
229
236
  gate:
237
+ file: gates/quality-pass
230
238
  type: quality_pass
231
239
  condition: >
232
240
  All project quality gates pass. Each review finding verified
@@ -255,6 +263,7 @@ workflow:
255
263
  5. Only after user approves: create PR (draft by default,
256
264
  or per user pr_mode preference in pennyfarthing config)
257
265
  gate:
266
+ file: gates/approval
258
267
  type: approval
259
268
  condition: User has reviewed and approved PR content before submission
260
269
 
@@ -315,6 +324,7 @@ workflow:
315
324
 
316
325
  Present decisions to user. User has final say on every item.
317
326
  gate:
327
+ file: gates/approval
318
328
  type: approval
319
329
  condition: User has decided on every external review comment
320
330
 
@@ -340,6 +350,7 @@ workflow:
340
350
 
341
351
  Commit fixes. Push branch. Present all draft replies to user.
342
352
  gate:
353
+ file: gates/approval
343
354
  type: approval
344
355
  condition: >
345
356
  User has approved every draft reply. Fixes pass quality
@@ -28,6 +28,7 @@ workflow:
28
28
  input: [audit_report, proposed_changes]
29
29
  output: [updated_files]
30
30
  gate:
31
+ file: gates/validation
31
32
  type: validation
32
33
  condition: Agent files parse correctly, no broken references
33
34
 
@@ -36,6 +37,7 @@ workflow:
36
37
  input: [updated_files]
37
38
  output: [approval]
38
39
  gate:
40
+ file: gates/approval
39
41
  type: approval
40
42
  condition: |
41
43
  Documentation quality review:
@@ -21,6 +21,7 @@ workflow:
21
21
  input: [session_file, story_context]
22
22
  output: [design_spec, user_flows, wireframes, behavior_scenarios]
23
23
  gate:
24
+ file: gates/design-review
24
25
  type: design_review
25
26
  condition: UX spec defines user flows and acceptance behaviors
26
27
  tandem:
@@ -32,6 +33,7 @@ workflow:
32
33
  input: [design_spec, behavior_scenarios, story_context]
33
34
  output: [failing_tests]
34
35
  gate:
36
+ file: gates/tests-fail
35
37
  type: tests_fail
36
38
  condition: Behavior scenarios have test coverage
37
39
 
@@ -40,6 +42,7 @@ workflow:
40
42
  input: [failing_tests, design_spec, story_context]
41
43
  output: [implementation, passing_tests]
42
44
  gate:
45
+ file: gates/tests-pass
43
46
  type: tests_pass
44
47
  condition: All tests passing, UX spec implemented
45
48
  tandem:
@@ -51,6 +54,7 @@ workflow:
51
54
  input: [implementation, passing_tests, design_spec]
52
55
  output: [approval]
53
56
  gate:
57
+ file: gates/approval
54
58
  type: approval
55
59
  condition: Code review approved, UX requirements met
56
60
  tandem:
@@ -19,6 +19,7 @@ workflow:
19
19
  input: [session_file, story_context]
20
20
  output: [design_spec, user_flows, wireframes, behavior_scenarios]
21
21
  gate:
22
+ file: gates/design-review
22
23
  type: design_review
23
24
  condition: UX spec defines user flows and acceptance behaviors
24
25
 
@@ -27,6 +28,7 @@ workflow:
27
28
  input: [design_spec, behavior_scenarios, story_context]
28
29
  output: [failing_tests]
29
30
  gate:
31
+ file: gates/tests-fail
30
32
  type: tests_fail
31
33
  condition: Behavior scenarios have test coverage
32
34
 
@@ -35,6 +37,7 @@ workflow:
35
37
  input: [failing_tests, design_spec, story_context]
36
38
  output: [implementation, passing_tests]
37
39
  gate:
40
+ file: gates/tests-pass
38
41
  type: tests_pass
39
42
  condition: All tests passing, UX spec implemented
40
43
 
@@ -43,6 +46,7 @@ workflow:
43
46
  input: [implementation, passing_tests, design_spec]
44
47
  output: [approval]
45
48
  gate:
49
+ file: gates/approval
46
50
  type: approval
47
51
  condition: Code review approved, UX requirements met
48
52
 
@@ -62,7 +62,7 @@ git -C {repo_path} branch --merged develop | grep -v "develop\|main" | xargs -r
62
62
  To run git-cleanup again:
63
63
 
64
64
  ```
65
- /git-cleanup
65
+ /pf-git cleanup
66
66
  ```
67
67
 
68
68
  Or for a quick status check across all repos:
@@ -21,6 +21,7 @@ workflow:
21
21
  input: [session_file, story_context]
22
22
  output: [failing_tests]
23
23
  gate:
24
+ file: gates/tests-fail
24
25
  type: tests_fail
25
26
  condition: All acceptance criteria have test coverage
26
27
  tandem:
@@ -32,6 +33,7 @@ workflow:
32
33
  input: [failing_tests, story_context]
33
34
  output: [implementation, passing_tests]
34
35
  gate:
36
+ file: gates/tests-pass
35
37
  type: tests_pass
36
38
  condition: All tests passing, no skipped tests
37
39
  tandem:
@@ -43,6 +45,7 @@ workflow:
43
45
  input: [implementation, passing_tests]
44
46
  output: [approval]
45
47
  gate:
48
+ file: gates/approval
46
49
  type: approval
47
50
  condition: Code review approved, no blocking issues
48
51
  tandem:
@@ -19,6 +19,7 @@ workflow:
19
19
  input: [session_file, story_context]
20
20
  output: [failing_tests]
21
21
  gate:
22
+ file: gates/tests-fail
22
23
  type: tests_fail
23
24
  condition: All acceptance criteria have test coverage
24
25
 
@@ -27,6 +28,7 @@ workflow:
27
28
  input: [failing_tests, story_context]
28
29
  output: [implementation, passing_tests]
29
30
  gate:
31
+ file: gates/tests-pass
30
32
  type: tests_pass
31
33
  condition: All tests passing, no skipped tests
32
34
 
@@ -35,6 +37,7 @@ workflow:
35
37
  input: [implementation, passing_tests]
36
38
  output: [approval]
37
39
  gate:
40
+ file: gates/approval
38
41
  type: approval
39
42
  condition: Code review approved, no blocking issues
40
43
 
@@ -19,6 +19,7 @@ workflow:
19
19
  input: [session_file]
20
20
  output: [implementation]
21
21
  gate:
22
+ file: gates/tests-pass
22
23
  type: tests_pass
23
24
  condition: Existing tests still pass
24
25
 
@@ -27,6 +28,7 @@ workflow:
27
28
  input: [implementation]
28
29
  output: [approval]
29
30
  gate:
31
+ file: gates/approval
30
32
  type: approval
31
33
 
32
34
  - name: finish
@@ -0,0 +1,218 @@
1
+ """DebugPanel — Context usage and token stats for BikeRack TUI.
2
+
3
+ Story 103-17: Port of the React DebugPanel. Subscribes to /ws/context
4
+ and /ws/token-stats, renders context usage (tokens, percent, tier) and
5
+ token consumption stats (input, output, cache, cost).
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Any
11
+
12
+ from rich.console import Group
13
+ from rich.table import Table
14
+ from rich.text import Text
15
+
16
+ from pennyfarthing_scripts.bikerack.base_panel import PANEL_ICONS, BasePanel
17
+
18
+ # Tier → Rich style mapping
19
+ _TIER_STYLES: dict[str, str] = {
20
+ "FULL": "bold green",
21
+ "REFRESH": "bold yellow",
22
+ "HANDOFF": "bold cyan",
23
+ "MINIMAL": "bold red",
24
+ }
25
+
26
+
27
+ def _safe_int(value: Any) -> int | None:
28
+ """Safely convert a value to int, returning None on failure."""
29
+ if value is None:
30
+ return None
31
+ try:
32
+ return int(value)
33
+ except (ValueError, TypeError):
34
+ return None
35
+
36
+
37
+ def _safe_float(value: Any) -> float | None:
38
+ """Safely convert a value to float, returning None on failure."""
39
+ if value is None:
40
+ return None
41
+ try:
42
+ return float(value)
43
+ except (ValueError, TypeError):
44
+ return None
45
+
46
+
47
+ def _format_tokens(value: Any) -> str:
48
+ """Format a token count with comma separators."""
49
+ n = _safe_int(value)
50
+ if n is None:
51
+ return "—"
52
+ return f"{n:,}"
53
+
54
+
55
+ class DebugPanel(BasePanel):
56
+ """Context usage and token stats panel.
57
+
58
+ Subscribes to both ``context`` and ``token-stats`` WebSocket channels.
59
+ Renders context usage (tokens, percentage, tier) and token consumption
60
+ stats (input, output, cache read/write, cost).
61
+ """
62
+
63
+ channel: str = "context"
64
+ panel_name: str = "Debug"
65
+ icon: str = PANEL_ICONS["debug"][0]
66
+
67
+ def __init__(self, client: Any = None, **kwargs: Any) -> None:
68
+ super().__init__(client=client, **kwargs)
69
+ self._context_data: dict[str, Any] | None = None
70
+ self._token_stats: dict[str, Any] | None = None
71
+
72
+ def on_mount(self) -> None:
73
+ """Subscribe to both context and token-stats channels."""
74
+ self._mounted = True
75
+ if self._client is not None:
76
+ self._client.subscribe("context", self._handle_context_message)
77
+ self._client.subscribe("token-stats", self._handle_token_stats_message)
78
+
79
+ def _handle_context_message(self, message: dict[str, Any] | None) -> None:
80
+ """Handle incoming context channel message."""
81
+ if message is None:
82
+ return
83
+ ctx = message.get("context")
84
+ if isinstance(ctx, dict):
85
+ self._context_data = ctx
86
+ else:
87
+ self._context_data = {}
88
+ self._rerender()
89
+
90
+ def _handle_token_stats_message(self, message: dict[str, Any] | None) -> None:
91
+ """Handle incoming token-stats channel message."""
92
+ if message is None:
93
+ return
94
+ self._token_stats = message
95
+ self._rerender()
96
+
97
+ def _rerender(self) -> None:
98
+ """Re-render with the latest data from both channels."""
99
+ rendered = self.render_panel(self._context_data or {})
100
+ try:
101
+ self.update(rendered)
102
+ except Exception:
103
+ pass
104
+
105
+ def render_panel(self, payload: dict[str, Any]) -> Any:
106
+ """Render combined context usage and token stats."""
107
+ parts: list[Any] = []
108
+
109
+ # --- Context Usage Section ---
110
+ ctx = self._context_data
111
+ if ctx:
112
+ parts.append(_render_context(ctx))
113
+ elif not self._token_stats:
114
+ return Text("No context data", style="dim italic")
115
+
116
+ # --- Token Stats Section ---
117
+ if self._token_stats:
118
+ if parts:
119
+ parts.append(Text("")) # spacer
120
+ parts.append(_render_token_stats(self._token_stats))
121
+
122
+ if not parts:
123
+ return Text("No context data", style="dim italic")
124
+
125
+ return Group(*parts)
126
+
127
+
128
+ def _render_context(ctx: dict[str, Any]) -> Any:
129
+ """Render context usage section."""
130
+ parts: list[Any] = []
131
+
132
+ # Tier badge
133
+ tier = ctx.get("tier")
134
+ if tier and isinstance(tier, str):
135
+ style = _TIER_STYLES.get(tier, "bold")
136
+ tier_text = Text()
137
+ tier_text.append(tier, style=style)
138
+ savings = _tier_savings(tier)
139
+ if savings > 0:
140
+ tier_text.append(f" {savings}% savings", style="dim")
141
+ parts.append(tier_text)
142
+
143
+ # Token usage
144
+ tokens = _safe_int(ctx.get("tokens"))
145
+ percent = _safe_int(ctx.get("percent"))
146
+ baseline = _safe_int(ctx.get("baseline"))
147
+ available = _safe_int(ctx.get("available"))
148
+
149
+ if tokens is not None:
150
+ usage_text = Text()
151
+ usage_text.append(f"{tokens:,}", style="bold")
152
+ if baseline is not None and available is not None:
153
+ total = baseline + available
154
+ usage_text.append(f" / {total:,}")
155
+ usage_text.append(" tokens")
156
+ if percent is not None:
157
+ usage_text.append(f" ({percent}%)")
158
+ parts.append(usage_text)
159
+
160
+ # Breakdown: baseline / conversation / available
161
+ if baseline is not None:
162
+ breakdown = Table(show_header=False, show_edge=False, pad_edge=False, box=None)
163
+ breakdown.add_column("Label", style="dim")
164
+ breakdown.add_column("Value", justify="right")
165
+ breakdown.add_row("System Prompt", _format_tokens(baseline))
166
+ usable = _safe_int(ctx.get("usableTokens"))
167
+ if usable is not None:
168
+ breakdown.add_row("Conversation", _format_tokens(usable))
169
+ if available is not None:
170
+ breakdown.add_row("Available", _format_tokens(available))
171
+ parts.append(breakdown)
172
+
173
+ if not parts:
174
+ return Text("No context data", style="dim italic")
175
+
176
+ return Group(*parts)
177
+
178
+
179
+ def _render_token_stats(stats: dict[str, Any]) -> Any:
180
+ """Render token stats section."""
181
+ table = Table(show_header=False, show_edge=False, pad_edge=False, box=None)
182
+ table.add_column("Stat", style="dim")
183
+ table.add_column("Value", justify="right")
184
+
185
+ rows: list[tuple[str, str]] = []
186
+
187
+ input_t = _safe_int(stats.get("inputTokens"))
188
+ if input_t is not None:
189
+ rows.append(("Input", f"{input_t:,}"))
190
+
191
+ output_t = _safe_int(stats.get("outputTokens"))
192
+ if output_t is not None:
193
+ rows.append(("Output", f"{output_t:,}"))
194
+
195
+ cache_read = _safe_int(stats.get("cacheReadTokens"))
196
+ if cache_read is not None:
197
+ rows.append(("Cache Read", f"{cache_read:,}"))
198
+
199
+ cache_write = _safe_int(stats.get("cacheCreationTokens"))
200
+ if cache_write is not None:
201
+ rows.append(("Cache Write", f"{cache_write:,}"))
202
+
203
+ cost = _safe_float(stats.get("totalCostUsd"))
204
+ if cost is not None and cost > 0:
205
+ rows.append(("Cost", f"${cost:.4f}"))
206
+
207
+ if not rows:
208
+ return Text("No token stats", style="dim italic")
209
+
210
+ for label, value in rows:
211
+ table.add_row(label, value)
212
+
213
+ return table
214
+
215
+
216
+ def _tier_savings(tier: str) -> int:
217
+ """Calculate token savings percentage for a tier vs FULL."""
218
+ return {"FULL": 0, "REFRESH": 85, "HANDOFF": 82, "MINIMAL": 95}.get(tier, 0)