@pennyfarthing/core 11.0.0-alpha.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 (401) hide show
  1. package/README.md +84 -26
  2. package/package.json +14 -16
  3. package/packages/core/dist/cli/cyclist-migration.test.js +2 -1
  4. package/packages/core/dist/cli/cyclist-migration.test.js.map +1 -1
  5. package/packages/core/dist/cli/ocean-profiles.test.js +5 -4
  6. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -1
  7. package/packages/core/dist/cli/theme-maker.test.js +5 -4
  8. package/packages/core/dist/cli/theme-maker.test.js.map +1 -1
  9. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts +20 -0
  10. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.d.ts.map +1 -0
  11. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js +278 -0
  12. package/packages/core/dist/cli/utils/010-detect-remove-old-packages.test.js.map +1 -0
  13. package/packages/core/dist/cli/utils/constants.d.ts +7 -1
  14. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
  15. package/packages/core/dist/cli/utils/constants.js +2 -0
  16. package/packages/core/dist/cli/utils/constants.js.map +1 -1
  17. package/packages/core/dist/cli/utils/constants.test.d.ts +10 -0
  18. package/packages/core/dist/cli/utils/constants.test.d.ts.map +1 -0
  19. package/packages/core/dist/cli/utils/constants.test.js +38 -0
  20. package/packages/core/dist/cli/utils/constants.test.js.map +1 -0
  21. package/packages/core/dist/consultation/consultation-protocol.d.ts +139 -0
  22. package/packages/core/dist/consultation/consultation-protocol.d.ts.map +1 -0
  23. package/packages/core/dist/consultation/consultation-protocol.js +178 -0
  24. package/packages/core/dist/consultation/consultation-protocol.js.map +1 -0
  25. package/packages/core/dist/consultation/consultation-protocol.test.d.ts +20 -0
  26. package/packages/core/dist/consultation/consultation-protocol.test.d.ts.map +1 -0
  27. package/packages/core/dist/consultation/consultation-protocol.test.js +474 -0
  28. package/packages/core/dist/consultation/consultation-protocol.test.js.map +1 -0
  29. package/packages/core/dist/public/js/react/react.js +30 -30
  30. package/packages/core/dist/scripts/generate-report.test.js +2 -2
  31. package/packages/core/dist/scripts/generate-spider-report.test.js +2 -2
  32. package/packages/core/dist/scripts/generate-spider.test.js +2 -1
  33. package/packages/core/dist/scripts/generate-spider.test.js.map +1 -1
  34. package/packages/core/dist/server/api/file-browser.d.ts.map +1 -1
  35. package/packages/core/dist/server/api/file-browser.js +19 -1
  36. package/packages/core/dist/server/api/file-browser.js.map +1 -1
  37. package/packages/core/dist/server/api/git-fetch-cooldown.test.d.ts +10 -0
  38. package/packages/core/dist/server/api/git-fetch-cooldown.test.d.ts.map +1 -0
  39. package/packages/core/dist/server/api/git-fetch-cooldown.test.js +30 -0
  40. package/packages/core/dist/server/api/git-fetch-cooldown.test.js.map +1 -0
  41. package/packages/core/dist/server/api/git.d.ts +8 -0
  42. package/packages/core/dist/server/api/git.d.ts.map +1 -1
  43. package/packages/core/dist/server/api/git.js +37 -10
  44. package/packages/core/dist/server/api/git.js.map +1 -1
  45. package/packages/core/dist/server/api/health-score.d.ts.map +1 -1
  46. package/packages/core/dist/server/api/health-score.js +25 -1
  47. package/packages/core/dist/server/api/health-score.js.map +1 -1
  48. package/packages/core/dist/server/api/index.d.ts +1 -1
  49. package/packages/core/dist/server/api/index.d.ts.map +1 -1
  50. package/packages/core/dist/server/api/index.js +1 -1
  51. package/packages/core/dist/server/api/index.js.map +1 -1
  52. package/packages/core/dist/server/api/settings.d.ts.map +1 -1
  53. package/packages/core/dist/server/api/settings.js +73 -2
  54. package/packages/core/dist/server/api/settings.js.map +1 -1
  55. package/packages/core/dist/server/api/theme-agents.d.ts.map +1 -1
  56. package/packages/core/dist/server/api/theme-agents.js +61 -0
  57. package/packages/core/dist/server/api/theme-agents.js.map +1 -1
  58. package/packages/core/dist/server/otlp-receiver.d.ts +35 -13
  59. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  60. package/packages/core/dist/server/otlp-receiver.js +76 -16
  61. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  62. package/packages/core/dist/server/paths.d.ts.map +1 -1
  63. package/packages/core/dist/server/paths.js +11 -1
  64. package/packages/core/dist/server/paths.js.map +1 -1
  65. package/packages/core/dist/server/server.d.ts +3 -1
  66. package/packages/core/dist/server/server.d.ts.map +1 -1
  67. package/packages/core/dist/server/server.js +23 -16
  68. package/packages/core/dist/server/server.js.map +1 -1
  69. package/packages/core/dist/server/server.test.js.map +1 -1
  70. package/packages/core/dist/workflow/gate-file-validation.d.ts +49 -0
  71. package/packages/core/dist/workflow/gate-file-validation.d.ts.map +1 -0
  72. package/packages/core/dist/workflow/gate-file-validation.js +157 -0
  73. package/packages/core/dist/workflow/gate-file-validation.js.map +1 -0
  74. package/packages/core/dist/workflow/gate-file-validation.test.d.ts +19 -0
  75. package/packages/core/dist/workflow/gate-file-validation.test.d.ts.map +1 -0
  76. package/packages/core/dist/workflow/gate-file-validation.test.js +536 -0
  77. package/packages/core/dist/workflow/gate-file-validation.test.js.map +1 -0
  78. package/packages/core/dist/workflow/gate-schema-validation.test.d.ts +14 -0
  79. package/packages/core/dist/workflow/gate-schema-validation.test.d.ts.map +1 -0
  80. package/packages/core/dist/workflow/gate-schema-validation.test.js +339 -0
  81. package/packages/core/dist/workflow/gate-schema-validation.test.js.map +1 -0
  82. package/packages/core/dist/workflow/handoff.js +2 -2
  83. package/packages/core/dist/workflow/handoff.js.map +1 -1
  84. package/packages/core/dist/workflow/handoff.test.js +16 -0
  85. package/packages/core/dist/workflow/handoff.test.js.map +1 -1
  86. package/packages/core/dist/workflow/variable-resolver.test.js +1 -1
  87. package/packages/core/dist/workflow/variable-resolver.test.js.map +1 -1
  88. package/packages/core/dist/workflow/workflow-migration.test.js +4 -3
  89. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
  90. package/packages/core/dist/workflow/workflow-schema.d.ts +4 -2
  91. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
  92. package/packages/core/dist/workflow/workflow-schema.js +43 -8
  93. package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
  94. package/pennyfarthing-dist/agents/README.md +6 -14
  95. package/pennyfarthing-dist/agents/architect.md +43 -30
  96. package/pennyfarthing-dist/agents/ba.md +30 -29
  97. package/pennyfarthing-dist/agents/dev.md +76 -41
  98. package/pennyfarthing-dist/agents/devops.md +57 -21
  99. package/pennyfarthing-dist/agents/orchestrator.md +3 -11
  100. package/pennyfarthing-dist/agents/pm.md +45 -31
  101. package/pennyfarthing-dist/agents/reviewer.md +20 -66
  102. package/pennyfarthing-dist/agents/sm-setup.md +2 -2
  103. package/pennyfarthing-dist/agents/sm.md +8 -30
  104. package/pennyfarthing-dist/agents/tea.md +25 -41
  105. package/pennyfarthing-dist/agents/tech-writer.md +33 -90
  106. package/pennyfarthing-dist/agents/ux-designer.md +39 -40
  107. package/pennyfarthing-dist/commands/benchmark-control.md +8 -64
  108. package/pennyfarthing-dist/commands/benchmark.md +8 -480
  109. package/pennyfarthing-dist/commands/job-fair.md +8 -97
  110. package/pennyfarthing-dist/commands/pf-benchmark-control.md +70 -0
  111. package/pennyfarthing-dist/commands/pf-benchmark.md +486 -0
  112. package/pennyfarthing-dist/commands/pf-chore.md +4 -4
  113. package/pennyfarthing-dist/commands/pf-ci.md +40 -0
  114. package/pennyfarthing-dist/commands/pf-close-epic.md +9 -27
  115. package/pennyfarthing-dist/commands/pf-continue-session.md +9 -213
  116. package/pennyfarthing-dist/commands/pf-create-branches-from-story.md +11 -353
  117. package/pennyfarthing-dist/commands/pf-docs.md +28 -0
  118. package/pennyfarthing-dist/commands/pf-epic.md +67 -0
  119. package/pennyfarthing-dist/commands/pf-git-cleanup.md +11 -52
  120. package/pennyfarthing-dist/commands/pf-git.md +75 -0
  121. package/pennyfarthing-dist/commands/pf-help.md +110 -128
  122. package/pennyfarthing-dist/commands/pf-job-fair.md +102 -0
  123. package/pennyfarthing-dist/commands/pf-new-work.md +9 -18
  124. package/pennyfarthing-dist/commands/pf-parallel-work.md +6 -66
  125. package/pennyfarthing-dist/commands/pf-release.md +11 -76
  126. package/pennyfarthing-dist/commands/pf-repo-status.md +11 -44
  127. package/pennyfarthing-dist/commands/pf-run-ci.md +8 -111
  128. package/pennyfarthing-dist/commands/pf-session.md +51 -0
  129. package/pennyfarthing-dist/commands/pf-solo.md +447 -0
  130. package/pennyfarthing-dist/commands/pf-sprint-planning.md +8 -104
  131. package/pennyfarthing-dist/commands/pf-standalone.md +1 -1
  132. package/pennyfarthing-dist/commands/pf-start-epic.md +9 -163
  133. package/pennyfarthing-dist/commands/pf-sync-epic-to-jira.md +8 -179
  134. package/pennyfarthing-dist/commands/pf-sync-work-with-sprint.md +8 -368
  135. package/pennyfarthing-dist/commands/pf-update-domain-docs.md +8 -78
  136. package/pennyfarthing-dist/commands/solo.md +8 -442
  137. package/pennyfarthing-dist/guides/agent-behavior.md +14 -14
  138. package/pennyfarthing-dist/guides/agent-coordination.md +7 -7
  139. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
  140. package/pennyfarthing-dist/guides/bikerack.md +128 -0
  141. package/pennyfarthing-dist/guides/brownfield-tools.md +133 -0
  142. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +2 -2
  143. package/pennyfarthing-dist/guides/gate-schema.md +227 -0
  144. package/pennyfarthing-dist/guides/gates.md +120 -0
  145. package/pennyfarthing-dist/guides/handoff-cli.md +116 -0
  146. package/pennyfarthing-dist/guides/hooks.md +86 -4
  147. package/pennyfarthing-dist/guides/output-styles.md +65 -0
  148. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +5 -5
  149. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +4 -4
  150. package/pennyfarthing-dist/guides/prompt-patterns.md +5 -5
  151. package/pennyfarthing-dist/guides/reflector.md +4 -4
  152. package/pennyfarthing-dist/guides/session-artifacts.md +1 -1
  153. package/pennyfarthing-dist/guides/skill-schema.md +1 -1
  154. package/pennyfarthing-dist/guides/tandem-protocol.md +13 -1
  155. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  156. package/pennyfarthing-dist/guides/xml-tags.md +5 -4
  157. package/pennyfarthing-dist/personas/themes/hogans-heroes.yaml +11 -22
  158. package/pennyfarthing-dist/personas/themes/stephen-king.yaml +13 -24
  159. package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -0
  160. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
  161. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +1 -1
  162. package/pennyfarthing-dist/scripts/core/prime.sh +0 -0
  163. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
  164. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
  165. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
  166. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +0 -0
  167. package/pennyfarthing-dist/scripts/git/release.sh +0 -0
  168. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
  169. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
  170. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -0
  171. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  172. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  173. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  174. package/pennyfarthing-dist/scripts/hooks/dispatcher-template.sh +0 -0
  175. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +19 -14
  176. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
  177. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
  178. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  179. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
  180. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
  181. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
  182. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
  183. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
  184. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  185. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
  186. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
  187. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -0
  188. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -0
  189. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
  190. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -0
  191. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
  192. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
  193. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
  194. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
  195. package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
  196. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
  197. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
  198. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
  199. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
  200. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
  201. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
  202. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
  203. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
  204. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
  205. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
  206. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
  207. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
  208. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
  209. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
  210. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
  211. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
  212. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
  213. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
  214. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
  215. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
  216. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
  217. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
  218. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -0
  219. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +191 -57
  220. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +26 -10
  221. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
  222. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
  223. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
  224. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  225. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
  226. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
  227. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -0
  228. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
  229. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
  230. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
  231. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
  232. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  233. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
  234. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  235. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  236. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  237. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
  238. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
  239. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -0
  240. package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
  241. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
  242. package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
  243. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -0
  244. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
  245. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
  246. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
  247. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
  248. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
  249. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
  250. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
  251. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
  252. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
  253. package/pennyfarthing-dist/skills/pf-changelog/SKILL.md +4 -4
  254. package/pennyfarthing-dist/skills/pf-sprint/skill.md +1 -1
  255. package/pennyfarthing-dist/skills/pf-story/scripts/create-story.sh +0 -0
  256. package/pennyfarthing-dist/skills/pf-story/scripts/size-story.sh +0 -0
  257. package/pennyfarthing-dist/skills/pf-story/scripts/story-template.sh +0 -0
  258. package/pennyfarthing-dist/skills/pf-systematic-debugging/SKILL.md +0 -1
  259. package/pennyfarthing-dist/skills/pf-workflow/scripts/list-workflows.sh +0 -0
  260. package/pennyfarthing-dist/skills/pf-workflow/scripts/resume-workflow.sh +0 -0
  261. package/pennyfarthing-dist/skills/pf-workflow/scripts/show-workflow.sh +0 -0
  262. package/pennyfarthing-dist/skills/pf-workflow/scripts/start-workflow.sh +0 -0
  263. package/pennyfarthing-dist/skills/pf-workflow/scripts/workflow-status.sh +0 -0
  264. package/pennyfarthing-dist/skills/skill-registry.schema.json +4 -0
  265. package/pennyfarthing-dist/skills/skill-registry.yaml +8 -21
  266. package/pennyfarthing-dist/workflows/2party-tdd.yaml +11 -0
  267. package/pennyfarthing-dist/workflows/agent-docs.yaml +2 -0
  268. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +4 -0
  269. package/pennyfarthing-dist/workflows/bdd.yaml +4 -0
  270. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  271. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +3 -0
  272. package/pennyfarthing-dist/workflows/tdd.yaml +3 -0
  273. package/pennyfarthing-dist/workflows/trivial.yaml +2 -0
  274. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  277. package/pennyfarthing_scripts/bc/__pycache__/__init__.cpython-314.pyc +0 -0
  278. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  282. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  283. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  284. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  285. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  286. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  287. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  288. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  289. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  291. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  292. package/pennyfarthing_scripts/bikerack/changed_panel.py +105 -0
  293. package/pennyfarthing_scripts/bikerack/debug_panel.py +218 -0
  294. package/pennyfarthing_scripts/bikerack/diffs_panel.py +203 -27
  295. package/pennyfarthing_scripts/cli.py +114 -0
  296. package/pennyfarthing_scripts/epic/__init__.py +0 -0
  297. package/pennyfarthing_scripts/epic/cli.py +64 -0
  298. package/pennyfarthing_scripts/gate/__init__.py +1 -0
  299. package/pennyfarthing_scripts/gate/__pycache__/__init__.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/gate/__pycache__/cli.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/gate/__pycache__/validate.cpython-314.pyc +0 -0
  302. package/pennyfarthing_scripts/gate/cli.py +56 -0
  303. package/pennyfarthing_scripts/gate/validate.py +266 -0
  304. package/pennyfarthing_scripts/git_group/__init__.py +0 -0
  305. package/pennyfarthing_scripts/git_group/cli.py +100 -0
  306. package/pennyfarthing_scripts/handoff/__init__.py +1 -0
  307. package/pennyfarthing_scripts/handoff/__pycache__/__init__.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  309. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/handoff/__pycache__/gate_file.cpython-314.pyc +0 -0
  311. package/pennyfarthing_scripts/handoff/__pycache__/gate_runner.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  313. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  314. package/pennyfarthing_scripts/handoff/cli.py +120 -0
  315. package/pennyfarthing_scripts/handoff/complete_phase.py +155 -0
  316. package/pennyfarthing_scripts/handoff/gate_file.py +105 -0
  317. package/pennyfarthing_scripts/handoff/gate_runner.py +152 -0
  318. package/pennyfarthing_scripts/handoff/marker.py +109 -0
  319. package/pennyfarthing_scripts/handoff/resolve_gate.py +152 -0
  320. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  321. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  322. package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +0 -0
  323. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  324. package/pennyfarthing_scripts/launch/__pycache__/__init__.cpython-314.pyc +0 -0
  325. package/pennyfarthing_scripts/launch/__pycache__/cli.cpython-314.pyc +0 -0
  326. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  327. package/pennyfarthing_scripts/prime/__pycache__/version_sentinel.cpython-314.pyc +0 -0
  328. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  329. package/pennyfarthing_scripts/prime/workflow.py +39 -0
  330. package/pennyfarthing_scripts/session/__init__.py +0 -0
  331. package/pennyfarthing_scripts/session/cli.py +87 -0
  332. package/pennyfarthing_scripts/session_start_hook.py +4 -4
  333. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  334. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  335. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  336. package/pennyfarthing_scripts/sprint/__pycache__/epic_update.cpython-314.pyc +0 -0
  337. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  338. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  339. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  340. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  341. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  342. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  343. package/pennyfarthing_scripts/sprint/archive_epic.py +8 -0
  344. package/pennyfarthing_scripts/tests/__pycache__/test_108_2_remove_handoff_fallback.cpython-314-pytest-9.0.2.pyc +0 -0
  345. package/pennyfarthing_scripts/tests/__pycache__/test_archive_epic.cpython-314-pytest-9.0.2.pyc +0 -0
  346. package/pennyfarthing_scripts/tests/__pycache__/test_bc.cpython-314-pytest-9.0.2.pyc +0 -0
  347. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  348. package/pennyfarthing_scripts/tests/__pycache__/test_cli_normalization.cpython-314-pytest-9.0.2.pyc +0 -0
  349. package/pennyfarthing_scripts/tests/__pycache__/test_gate_file_resolution.cpython-314-pytest-9.0.2.pyc +0 -0
  350. package/pennyfarthing_scripts/tests/__pycache__/test_gate_runner.cpython-314-pytest-9.0.2.pyc +0 -0
  351. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  352. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_e2e.cpython-314-pytest-9.0.2.pyc +0 -0
  353. package/pennyfarthing_scripts/tests/__pycache__/test_resolve_gate_file_field.cpython-314-pytest-9.0.2.pyc +0 -0
  354. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_panel.cpython-314-pytest-9.0.2.pyc +0 -0
  355. package/pennyfarthing_scripts/tests/__pycache__/test_topology_loader.cpython-314-pytest-9.0.2.pyc +0 -0
  356. package/pennyfarthing_scripts/tests/__pycache__/test_tui_focus.cpython-314-pytest-9.0.2.pyc +0 -0
  357. package/pennyfarthing_scripts/tests/__pycache__/test_tui_panel_persistence.cpython-314-pytest-9.0.2.pyc +0 -0
  358. package/pennyfarthing_scripts/tests/__pycache__/test_version_sentinel.cpython-314-pytest-9.0.2.pyc +0 -0
  359. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  360. package/pennyfarthing_scripts/tests/test_108_1_gate_migration.py +540 -0
  361. package/pennyfarthing_scripts/tests/test_108_2_remove_handoff_fallback.py +339 -0
  362. package/pennyfarthing_scripts/tests/test_archive_epic.py +1 -2
  363. package/pennyfarthing_scripts/tests/test_confidence_sm_evaluation.py +253 -0
  364. package/pennyfarthing_scripts/tests/test_confidence_sm_gate.py +315 -0
  365. package/pennyfarthing_scripts/tests/test_gate_file_resolution.py +341 -0
  366. package/pennyfarthing_scripts/tests/test_gate_runner.py +620 -0
  367. package/pennyfarthing_scripts/tests/test_handoff_cli.py +929 -0
  368. package/pennyfarthing_scripts/tests/test_handoff_e2e.py +454 -0
  369. package/pennyfarthing_scripts/tests/test_resolve_gate_file_field.py +464 -0
  370. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  371. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  372. package/pennyfarthing_scripts/validate/adapters/skill_command.py +200 -0
  373. package/pennyfarthing_scripts/validate/adapters/workflow.py +64 -0
  374. package/pennyfarthing_scripts/validate/cli.py +15 -4
  375. package/packages/core/dist/benchmark/package-exports.test.d.ts.map +0 -1
  376. package/packages/core/dist/benchmark/package-exports.test.js.map +0 -1
  377. package/packages/core/dist/scripts/benchmark-integration.d.ts +0 -182
  378. package/packages/core/dist/scripts/benchmark-integration.d.ts.map +0 -1
  379. package/packages/core/dist/scripts/benchmark-integration.js +0 -691
  380. package/packages/core/dist/scripts/benchmark-integration.js.map +0 -1
  381. package/packages/core/dist/scripts/benchmark-integration.test.d.ts +0 -13
  382. package/packages/core/dist/scripts/benchmark-integration.test.d.ts.map +0 -1
  383. package/packages/core/dist/scripts/benchmark-integration.test.js +0 -680
  384. package/packages/core/dist/scripts/benchmark-integration.test.js.map +0 -1
  385. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts +0 -18
  386. package/packages/core/dist/scripts/debugging-scenarios.test.d.ts.map +0 -1
  387. package/packages/core/dist/scripts/debugging-scenarios.test.js +0 -317
  388. package/packages/core/dist/scripts/debugging-scenarios.test.js.map +0 -1
  389. package/packages/core/dist/scripts/job-fair-aggregator.d.ts +0 -150
  390. package/packages/core/dist/scripts/job-fair-aggregator.d.ts.map +0 -1
  391. package/packages/core/dist/scripts/job-fair-aggregator.js +0 -547
  392. package/packages/core/dist/scripts/job-fair-aggregator.js.map +0 -1
  393. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts +0 -14
  394. package/packages/core/dist/scripts/job-fair-aggregator.test.d.ts.map +0 -1
  395. package/packages/core/dist/scripts/job-fair-aggregator.test.js +0 -616
  396. package/packages/core/dist/scripts/job-fair-aggregator.test.js.map +0 -1
  397. package/pennyfarthing-dist/agents/handoff.md +0 -250
  398. package/pennyfarthing-dist/agents/sm-handoff.md +0 -152
  399. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -112
  400. package/pennyfarthing-dist/skills/pf-dev-patterns/SKILL.md +0 -461
  401. package/scripts/README.md +0 -41
@@ -55,7 +55,7 @@ skills:
55
55
  anti_patterns:
56
56
  - Don't skip security considerations in review
57
57
  - Don't approve without running tests
58
- related_skills: [pf-testing, pf-dev-patterns]
58
+ related_skills: [pf-testing]
59
59
  keywords: [pr, pull-request, quality, linting, security]
60
60
 
61
61
  pf-context-engineering:
@@ -94,24 +94,6 @@ skills:
94
94
  related_skills: []
95
95
  keywords: [tui, terminal, visualization, dashboard]
96
96
 
97
- pf-dev-patterns:
98
- name: pf-dev-patterns
99
- description: Common development patterns, fixes, and gotchas
100
- category: development
101
- tags: [patterns, debugging, implementation]
102
- version: "1.0.0"
103
- prerequisites: []
104
- examples:
105
- - context: Implementing features
106
- invocation: /dev-patterns
107
- - context: Avoiding known pitfalls
108
- invocation: /dev-patterns gotchas
109
- anti_patterns:
110
- - Don't apply patterns from other frameworks blindly
111
- related_skills: [pf-code-review, pf-testing]
112
- keywords: [implementation, debugging, fixes, best-practices]
113
- allowed_tools: [Read, Glob, Grep, Task] # Reference material - read-only
114
-
115
97
  pf-finalize-run:
116
98
  name: pf-finalize-run
117
99
  description: Validate and save benchmark run results - single exit point for all runs
@@ -133,6 +115,7 @@ skills:
133
115
  category: project-management
134
116
  tags: [jira, issues, sprint]
135
117
  version: "1.0.0"
118
+ command_group: jira
136
119
  prerequisites: []
137
120
  examples:
138
121
  - context: Viewing sprint issues
@@ -218,6 +201,7 @@ skills:
218
201
  category: project-management
219
202
  tags: [permissions, security, tools]
220
203
  version: "1.0.0"
204
+ command_group: permissions
221
205
  prerequisites: []
222
206
  examples:
223
207
  - context: Viewing active grants
@@ -255,6 +239,7 @@ skills:
255
239
  category: project-management
256
240
  tags: [sprint, status, backlog, stories, epics]
257
241
  version: "2.0.0"
242
+ command_group: sprint
258
243
  prerequisites: []
259
244
  examples:
260
245
  - context: Checking sprint status
@@ -288,7 +273,7 @@ skills:
288
273
  anti_patterns:
289
274
  - Don't jump to solutions without reproducing the issue first
290
275
  - Don't fix symptoms instead of root causes
291
- related_skills: [pf-testing, pf-dev-patterns, pf-agentic-patterns]
276
+ related_skills: [pf-testing, pf-agentic-patterns]
292
277
  keywords: [debugging, bisect, reproduce, isolate, root-cause, regression]
293
278
 
294
279
  pf-story:
@@ -326,7 +311,7 @@ skills:
326
311
  anti_patterns:
327
312
  - Don't run tests directly - use testing-runner subagent
328
313
  - Don't skip RED phase in TDD workflow
329
- related_skills: [pf-dev-patterns, pf-code-review]
314
+ related_skills: [pf-code-review]
330
315
  keywords: [jest, vitest, pytest, unit-test, integration, tdd, red-green]
331
316
 
332
317
  pf-theme:
@@ -335,6 +320,7 @@ skills:
335
320
  category: theming
336
321
  tags: [personas, themes, customization, creation]
337
322
  version: "2.0.0"
323
+ command_group: theme
338
324
  prerequisites: []
339
325
  examples:
340
326
  - context: Listing available themes
@@ -375,6 +361,7 @@ skills:
375
361
  category: project-management
376
362
  tags: [workflow, phases, tdd]
377
363
  version: "1.0.0"
364
+ command_group: workflow
378
365
  prerequisites: []
379
366
  examples:
380
367
  - context: Listing available workflows
@@ -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,105 @@
1
+ """ChangedPanel — Changed file list with status for BikeRack TUI.
2
+
3
+ Story 103-14: Subscribes to /ws/git, extracts dirtyFiles from all repos,
4
+ renders Rich table with file path, change type icon, and status.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from typing import Any
10
+
11
+ from rich.table import Table
12
+ from rich.text import Text
13
+
14
+ from pennyfarthing_scripts.bikerack.base_panel import PANEL_ICONS, BasePanel
15
+
16
+ # Status code → (icon, label, style)
17
+ _STATUS_MAP: dict[str, tuple[str, str, str]] = {
18
+ "M": ("~", "Modified", "yellow"),
19
+ "A": ("+", "Added", "green"),
20
+ "D": ("-", "Deleted", "red"),
21
+ "?": ("?", "Untracked", "dim"),
22
+ "R": ("→", "Renamed", "cyan"),
23
+ }
24
+
25
+ _DEFAULT_STATUS: tuple[str, str, str] = ("·", "Changed", "yellow")
26
+
27
+
28
+ def _parse_status(status: str) -> tuple[str, str, str]:
29
+ """Parse 2-char git status code into (icon, label, style).
30
+
31
+ First char = index (staging area), second char = working tree.
32
+ Uses the most significant non-space character.
33
+ """
34
+ if len(status) < 2:
35
+ return _STATUS_MAP.get(status[:1], _DEFAULT_STATUS)
36
+
37
+ idx, wt = status[0], status[1]
38
+
39
+ # Untracked: both chars are '?'
40
+ if idx == "?" and wt == "?":
41
+ return _STATUS_MAP["?"]
42
+
43
+ # Index change takes priority if present
44
+ if idx not in (" ", "?"):
45
+ return _STATUS_MAP.get(idx, _DEFAULT_STATUS)
46
+
47
+ # Working tree change
48
+ if wt not in (" ", "?"):
49
+ return _STATUS_MAP.get(wt, _DEFAULT_STATUS)
50
+
51
+ return _DEFAULT_STATUS
52
+
53
+
54
+ class ChangedPanel(BasePanel):
55
+ """Changed file list panel.
56
+
57
+ Subscribes to the ``git`` WebSocket channel and renders
58
+ dirty files from all repos as a Rich table with file path,
59
+ change type icon, and status.
60
+ """
61
+
62
+ channel: str = "git"
63
+ panel_name: str = "Changed"
64
+ icon: str = PANEL_ICONS["changed"][0]
65
+
66
+ def render_panel(self, payload: dict[str, Any]) -> Any:
67
+ """Render changed file data from WebSocket payload."""
68
+ repos = payload.get("repos", [])
69
+ if not isinstance(repos, list):
70
+ return Text("No changed files", style="dim italic")
71
+
72
+ files: list[tuple[str, dict[str, Any]]] = []
73
+ for repo in repos:
74
+ if not isinstance(repo, dict):
75
+ continue
76
+ repo_name = repo.get("name", "")
77
+ dirty_files = repo.get("dirtyFiles", [])
78
+ if not isinstance(dirty_files, list):
79
+ continue
80
+ for f in dirty_files:
81
+ if not isinstance(f, dict):
82
+ continue
83
+ files.append((repo_name, f))
84
+
85
+ if not files:
86
+ return Text("No changed files", style="dim italic")
87
+
88
+ table = Table()
89
+ table.add_column("", width=2)
90
+ table.add_column("File", style="cyan")
91
+ table.add_column("Status")
92
+ table.add_column("Repo", style="dim")
93
+
94
+ for repo_name, f in files:
95
+ status_code = f.get("status", " ")
96
+ path = f.get("path", "")
97
+ icon, label, style = _parse_status(status_code)
98
+ table.add_row(
99
+ Text(icon, style=f"bold {style}"),
100
+ path,
101
+ Text(label, style=style),
102
+ repo_name,
103
+ )
104
+
105
+ return table