@pennyfarthing/core 9.2.0 → 9.3.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 (1039) hide show
  1. package/package.json +36 -32
  2. package/LICENSE +0 -14
  3. package/README.md +0 -218
  4. package/pennyfarthing-dist/agents/README.md +0 -348
  5. package/pennyfarthing-dist/agents/architect.md +0 -180
  6. package/pennyfarthing-dist/agents/dev.md +0 -169
  7. package/pennyfarthing-dist/agents/devops.md +0 -203
  8. package/pennyfarthing-dist/agents/handoff.md +0 -235
  9. package/pennyfarthing-dist/agents/orchestrator.md +0 -182
  10. package/pennyfarthing-dist/agents/pm.md +0 -152
  11. package/pennyfarthing-dist/agents/reviewer-preflight.md +0 -129
  12. package/pennyfarthing-dist/agents/reviewer.md +0 -197
  13. package/pennyfarthing-dist/agents/sm-file-summary.md +0 -79
  14. package/pennyfarthing-dist/agents/sm-finish.md +0 -82
  15. package/pennyfarthing-dist/agents/sm-handoff.md +0 -129
  16. package/pennyfarthing-dist/agents/sm-setup.md +0 -251
  17. package/pennyfarthing-dist/agents/sm.md +0 -294
  18. package/pennyfarthing-dist/agents/tea.md +0 -161
  19. package/pennyfarthing-dist/agents/tech-writer.md +0 -226
  20. package/pennyfarthing-dist/agents/testing-runner.md +0 -184
  21. package/pennyfarthing-dist/agents/ux-designer.md +0 -236
  22. package/pennyfarthing-dist/agents/workflow-status-check.md +0 -96
  23. package/pennyfarthing-dist/commands/architect.md +0 -9
  24. package/pennyfarthing-dist/commands/benchmark-control.md +0 -69
  25. package/pennyfarthing-dist/commands/benchmark.md +0 -485
  26. package/pennyfarthing-dist/commands/brainstorming.md +0 -91
  27. package/pennyfarthing-dist/commands/check.md +0 -156
  28. package/pennyfarthing-dist/commands/chore.md +0 -218
  29. package/pennyfarthing-dist/commands/close-epic.md +0 -139
  30. package/pennyfarthing-dist/commands/continue-session.md +0 -218
  31. package/pennyfarthing-dist/commands/create-branches-from-story.md +0 -358
  32. package/pennyfarthing-dist/commands/create-theme.md +0 -29
  33. package/pennyfarthing-dist/commands/dev.md +0 -9
  34. package/pennyfarthing-dist/commands/devops.md +0 -9
  35. package/pennyfarthing-dist/commands/fix-blocker.md +0 -22
  36. package/pennyfarthing-dist/commands/git-cleanup.md +0 -57
  37. package/pennyfarthing-dist/commands/health-check.md +0 -143
  38. package/pennyfarthing-dist/commands/help.md +0 -264
  39. package/pennyfarthing-dist/commands/job-fair.md +0 -102
  40. package/pennyfarthing-dist/commands/list-themes.md +0 -21
  41. package/pennyfarthing-dist/commands/new-work.md +0 -23
  42. package/pennyfarthing-dist/commands/orchestrator.md +0 -9
  43. package/pennyfarthing-dist/commands/parallel-work.md +0 -73
  44. package/pennyfarthing-dist/commands/party-mode.md +0 -77
  45. package/pennyfarthing-dist/commands/patch.md +0 -210
  46. package/pennyfarthing-dist/commands/permissions.md +0 -193
  47. package/pennyfarthing-dist/commands/pm.md +0 -9
  48. package/pennyfarthing-dist/commands/prime.md +0 -136
  49. package/pennyfarthing-dist/commands/release.md +0 -58
  50. package/pennyfarthing-dist/commands/repo-status.md +0 -49
  51. package/pennyfarthing-dist/commands/retro.md +0 -200
  52. package/pennyfarthing-dist/commands/reviewer.md +0 -9
  53. package/pennyfarthing-dist/commands/run-ci.md +0 -116
  54. package/pennyfarthing-dist/commands/set-theme.md +0 -56
  55. package/pennyfarthing-dist/commands/setup.md +0 -65
  56. package/pennyfarthing-dist/commands/show-theme.md +0 -21
  57. package/pennyfarthing-dist/commands/sm.md +0 -9
  58. package/pennyfarthing-dist/commands/solo.md +0 -447
  59. package/pennyfarthing-dist/commands/sprint-planning.md +0 -109
  60. package/pennyfarthing-dist/commands/sprint.md +0 -142
  61. package/pennyfarthing-dist/commands/standalone.md +0 -194
  62. package/pennyfarthing-dist/commands/start-epic.md +0 -168
  63. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +0 -184
  64. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +0 -373
  65. package/pennyfarthing-dist/commands/tea.md +0 -9
  66. package/pennyfarthing-dist/commands/tech-writer.md +0 -9
  67. package/pennyfarthing-dist/commands/theme-maker.md +0 -676
  68. package/pennyfarthing-dist/commands/update-domain-docs.md +0 -83
  69. package/pennyfarthing-dist/commands/ux-designer.md +0 -9
  70. package/pennyfarthing-dist/commands/work.md +0 -25
  71. package/pennyfarthing-dist/commands/workflow.md +0 -21
  72. package/pennyfarthing-dist/guides/agent-behavior.md +0 -90
  73. package/pennyfarthing-dist/guides/agent-coordination.md +0 -480
  74. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +0 -432
  75. package/pennyfarthing-dist/guides/agent-template-strategic.md +0 -148
  76. package/pennyfarthing-dist/guides/agent-template-tactical.md +0 -162
  77. package/pennyfarthing-dist/guides/hooks.md +0 -230
  78. package/pennyfarthing-dist/guides/measurement-framework.md +0 -210
  79. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +0 -766
  80. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +0 -574
  81. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +0 -488
  82. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +0 -402
  83. package/pennyfarthing-dist/guides/permission-protocol.md +0 -188
  84. package/pennyfarthing-dist/guides/persona-loading.md +0 -46
  85. package/pennyfarthing-dist/guides/prompt-patterns.md +0 -338
  86. package/pennyfarthing-dist/guides/scale-levels.md +0 -114
  87. package/pennyfarthing-dist/guides/session-artifacts.md +0 -193
  88. package/pennyfarthing-dist/guides/session-schema.md +0 -346
  89. package/pennyfarthing-dist/guides/skill-schema.md +0 -412
  90. package/pennyfarthing-dist/guides/workflow-schema.md +0 -257
  91. package/pennyfarthing-dist/guides/workflow-step-schema.md +0 -512
  92. package/pennyfarthing-dist/guides/worktree-mode.md +0 -113
  93. package/pennyfarthing-dist/guides/xml-tags.md +0 -627
  94. package/pennyfarthing-dist/output-styles/teaching.md +0 -33
  95. package/pennyfarthing-dist/output-styles/terse.md +0 -20
  96. package/pennyfarthing-dist/output-styles/verbose.md +0 -28
  97. package/pennyfarthing-dist/personas/themes/a-team.yaml +0 -331
  98. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +0 -324
  99. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +0 -282
  100. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +0 -289
  101. package/pennyfarthing-dist/personas/themes/catch-22.yaml +0 -304
  102. package/pennyfarthing-dist/personas/themes/control.yaml +0 -201
  103. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +0 -315
  104. package/pennyfarthing-dist/personas/themes/discworld.yaml +0 -334
  105. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +0 -284
  106. package/pennyfarthing-dist/personas/themes/dune.yaml +0 -301
  107. package/pennyfarthing-dist/personas/themes/firefly.yaml +0 -320
  108. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +0 -284
  109. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +0 -316
  110. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +0 -323
  111. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +0 -326
  112. package/pennyfarthing-dist/personas/themes/mad-max.yaml +0 -349
  113. package/pennyfarthing-dist/personas/themes/mash.yaml +0 -329
  114. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +0 -344
  115. package/pennyfarthing-dist/personas/themes/sandman.yaml +0 -282
  116. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +0 -358
  117. package/pennyfarthing-dist/personas/themes/star-wars.yaml +0 -297
  118. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +0 -337
  119. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +0 -342
  120. package/pennyfarthing-dist/personas/themes/watchmen.yaml +0 -285
  121. package/pennyfarthing-dist/personas/themes/west-wing.yaml +0 -285
  122. package/pennyfarthing-dist/personas/themes/x-files.yaml +0 -296
  123. package/pennyfarthing-dist/scripts/README.md +0 -87
  124. package/pennyfarthing-dist/scripts/core/README.md +0 -25
  125. package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -390
  126. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -194
  127. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -112
  128. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -90
  129. package/pennyfarthing-dist/scripts/core/prime.sh +0 -30
  130. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -21
  131. package/pennyfarthing-dist/scripts/git/README.md +0 -25
  132. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -267
  133. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -152
  134. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +0 -79
  135. package/pennyfarthing-dist/scripts/git/release.sh +0 -246
  136. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -497
  137. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -156
  138. package/pennyfarthing-dist/scripts/hooks/README.md +0 -32
  139. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  140. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -106
  141. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -95
  142. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -65
  143. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -35
  144. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -150
  145. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -102
  146. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -71
  147. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -42
  148. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -20
  149. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -499
  150. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -30
  151. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -97
  152. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -65
  153. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -78
  154. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -94
  155. package/pennyfarthing-dist/scripts/jira/README.md +0 -36
  156. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -95
  157. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -91
  158. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -22
  159. package/pennyfarthing-dist/scripts/jira/jira-lib.sh +0 -464
  160. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -260
  161. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -18
  162. package/pennyfarthing-dist/scripts/jira/jira-sync.sh +0 -16
  163. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -16
  164. package/pennyfarthing-dist/scripts/jira/sync-epic-to-jira.sh +0 -16
  165. package/pennyfarthing-dist/scripts/lib/README.md +0 -29
  166. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -177
  167. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -136
  168. package/pennyfarthing-dist/scripts/lib/common.sh +0 -212
  169. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -269
  170. package/pennyfarthing-dist/scripts/lib/find-root.sh +0 -58
  171. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -186
  172. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -76
  173. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -102
  174. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -91
  175. package/pennyfarthing-dist/scripts/misc/README.md +0 -44
  176. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -13
  177. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -226
  178. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -77
  179. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -247
  180. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -231
  181. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -107
  182. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -74
  183. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -10
  184. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -319
  185. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -141
  186. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -778
  187. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -212
  188. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -7
  189. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -319
  190. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -193
  191. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -259
  192. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -275
  193. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -160
  194. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +0 -417
  195. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -54
  196. package/pennyfarthing-dist/scripts/sprint/README.md +0 -29
  197. package/pennyfarthing-dist/scripts/sprint/archive-story.sh +0 -133
  198. package/pennyfarthing-dist/scripts/sprint/available-stories.sh +0 -91
  199. package/pennyfarthing-dist/scripts/sprint/check-story.sh +0 -158
  200. package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +0 -52
  201. package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +0 -63
  202. package/pennyfarthing-dist/scripts/sprint/list-future.sh +0 -145
  203. package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +0 -110
  204. package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +0 -148
  205. package/pennyfarthing-dist/scripts/sprint/sprint-common.sh +0 -415
  206. package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +0 -33
  207. package/pennyfarthing-dist/scripts/sprint/sprint-metrics.sh +0 -230
  208. package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +0 -134
  209. package/pennyfarthing-dist/scripts/sprint/validate-sprint-yaml.sh +0 -139
  210. package/pennyfarthing-dist/scripts/story/README.md +0 -23
  211. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -19
  212. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -18
  213. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -18
  214. package/pennyfarthing-dist/scripts/test/README.md +0 -23
  215. package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +0 -59
  216. package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +0 -220
  217. package/pennyfarthing-dist/scripts/test/swebench-judge.py +0 -374
  218. package/pennyfarthing-dist/scripts/test/test-cache.sh +0 -165
  219. package/pennyfarthing-dist/scripts/test/test-setup.sh +0 -337
  220. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -582
  221. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -515
  222. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -599
  223. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -332
  224. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -573
  225. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -859
  226. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -662
  227. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -589
  228. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -106
  229. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -597
  230. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -514
  231. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -517
  232. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -331
  233. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -647
  234. package/pennyfarthing-dist/scripts/theme/README.md +0 -22
  235. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +0 -13
  236. package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +0 -402
  237. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -30
  238. package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +0 -97
  239. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -576
  240. package/pennyfarthing-dist/scripts/workflow/README.md +0 -28
  241. package/pennyfarthing-dist/scripts/workflow/check.py +0 -502
  242. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -24
  243. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -154
  244. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -222
  245. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -61
  246. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -13
  247. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -124
  248. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -34
  249. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -157
  250. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -132
  251. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -250
  252. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -161
  253. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +0 -246
  254. package/pennyfarthing-dist/skills/changelog/SKILL.md +0 -385
  255. package/pennyfarthing-dist/skills/code-review/SKILL.md +0 -172
  256. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +0 -277
  257. package/pennyfarthing-dist/skills/cyclist/SKILL.md +0 -88
  258. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +0 -461
  259. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +0 -261
  260. package/pennyfarthing-dist/skills/jira/SKILL.md +0 -508
  261. package/pennyfarthing-dist/skills/judge/SKILL.md +0 -644
  262. package/pennyfarthing-dist/skills/just/SKILL.md +0 -414
  263. package/pennyfarthing-dist/skills/mermaid/SKILL.md +0 -256
  264. package/pennyfarthing-dist/skills/otel/skill.md +0 -227
  265. package/pennyfarthing-dist/skills/permissions/skill.md +0 -175
  266. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +0 -187
  267. package/pennyfarthing-dist/skills/skill-registry.schema.json +0 -107
  268. package/pennyfarthing-dist/skills/skill-registry.yaml +0 -393
  269. package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +0 -101
  270. package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +0 -97
  271. package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +0 -164
  272. package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +0 -101
  273. package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +0 -116
  274. package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +0 -164
  275. package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +0 -39
  276. package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +0 -147
  277. package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +0 -93
  278. package/pennyfarthing-dist/skills/sprint/skill.md +0 -465
  279. package/pennyfarthing-dist/skills/story/scripts/create-story.sh +0 -159
  280. package/pennyfarthing-dist/skills/story/scripts/size-story.sh +0 -198
  281. package/pennyfarthing-dist/skills/story/scripts/story-template.sh +0 -162
  282. package/pennyfarthing-dist/skills/story/skill.md +0 -219
  283. package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +0 -446
  284. package/pennyfarthing-dist/skills/testing/SKILL.md +0 -121
  285. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +0 -124
  286. package/pennyfarthing-dist/skills/theme/skill.md +0 -141
  287. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +0 -178
  288. package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +0 -91
  289. package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +0 -163
  290. package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +0 -138
  291. package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +0 -273
  292. package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +0 -167
  293. package/pennyfarthing-dist/skills/workflow/skill.md +0 -345
  294. package/pennyfarthing-dist/skills/yq/SKILL.md +0 -272
  295. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +0 -187
  296. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +0 -59
  297. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -276
  298. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +0 -61
  299. package/pennyfarthing-dist/templates/persona-config.yaml.template +0 -22
  300. package/pennyfarthing-dist/templates/preferences.yaml.template +0 -15
  301. package/pennyfarthing-dist/templates/settings.local.json.template +0 -110
  302. package/pennyfarthing-dist/templates/setup-env.sh.template +0 -18
  303. package/pennyfarthing-dist/templates/shared-context.md.template +0 -70
  304. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +0 -40
  305. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +0 -37
  306. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +0 -34
  307. package/pennyfarthing-dist/workflows/agent-docs.yaml +0 -70
  308. package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +0 -113
  309. package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +0 -105
  310. package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +0 -127
  311. package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +0 -145
  312. package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +0 -150
  313. package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +0 -145
  314. package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +0 -154
  315. package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +0 -172
  316. package/pennyfarthing-dist/workflows/architecture/templates/architecture-decision.md +0 -102
  317. package/pennyfarthing-dist/workflows/architecture.yaml +0 -65
  318. package/pennyfarthing-dist/workflows/bdd.yaml +0 -60
  319. package/pennyfarthing-dist/workflows/brainstorming/brain-methods.csv +0 -62
  320. package/pennyfarthing-dist/workflows/brainstorming/checklist.md +0 -44
  321. package/pennyfarthing-dist/workflows/brainstorming/instructions.md +0 -736
  322. package/pennyfarthing-dist/workflows/brainstorming/workflow.yaml +0 -49
  323. package/pennyfarthing-dist/workflows/code-review/checklist.md +0 -23
  324. package/pennyfarthing-dist/workflows/code-review/instructions.md +0 -234
  325. package/pennyfarthing-dist/workflows/code-review/workflow.yaml +0 -51
  326. package/pennyfarthing-dist/workflows/dev-story/checklist.md +0 -80
  327. package/pennyfarthing-dist/workflows/dev-story/instructions.xml +0 -410
  328. package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +0 -50
  329. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +0 -281
  330. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +0 -256
  331. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +0 -298
  332. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +0 -177
  333. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +0 -145
  334. package/pennyfarthing-dist/workflows/epics-and-stories/templates/epics-template.md +0 -57
  335. package/pennyfarthing-dist/workflows/epics-and-stories/workflow.yaml +0 -28
  336. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +0 -103
  337. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-02-categorize.md +0 -147
  338. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-03-execute.md +0 -215
  339. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +0 -97
  340. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +0 -78
  341. package/pennyfarthing-dist/workflows/git-cleanup.yaml +0 -59
  342. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +0 -211
  343. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +0 -199
  344. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +0 -202
  345. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +0 -162
  346. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +0 -280
  347. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +0 -158
  348. package/pennyfarthing-dist/workflows/implementation-readiness/templates/readiness-report-template.md +0 -4
  349. package/pennyfarthing-dist/workflows/implementation-readiness/workflow.yaml +0 -40
  350. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-01-connect.md +0 -257
  351. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-02-explore.md +0 -107
  352. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-03-fix.md +0 -127
  353. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-04-commit.md +0 -122
  354. package/pennyfarthing-dist/workflows/interactive-debug/workflow.yaml +0 -51
  355. package/pennyfarthing-dist/workflows/patch.yaml +0 -67
  356. package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +0 -13
  357. package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +0 -197
  358. package/pennyfarthing-dist/workflows/prd/data/project-types.csv +0 -11
  359. package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +0 -197
  360. package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +0 -159
  361. package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +0 -230
  362. package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +0 -232
  363. package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +0 -219
  364. package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +0 -213
  365. package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +0 -232
  366. package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +0 -243
  367. package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +0 -234
  368. package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +0 -237
  369. package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +0 -248
  370. package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +0 -223
  371. package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +0 -186
  372. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +0 -253
  373. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +0 -214
  374. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +0 -255
  375. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +0 -259
  376. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +0 -174
  377. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +0 -224
  378. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +0 -197
  379. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +0 -215
  380. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +0 -180
  381. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +0 -220
  382. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +0 -234
  383. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +0 -223
  384. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +0 -211
  385. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +0 -249
  386. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +0 -269
  387. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +0 -215
  388. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +0 -270
  389. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +0 -248
  390. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +0 -238
  391. package/pennyfarthing-dist/workflows/prd/templates/prd-template.md +0 -10
  392. package/pennyfarthing-dist/workflows/prd/workflow.yaml +0 -42
  393. package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +0 -195
  394. package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +0 -180
  395. package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +0 -221
  396. package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +0 -224
  397. package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +0 -228
  398. package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +0 -243
  399. package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +0 -216
  400. package/pennyfarthing-dist/workflows/product-brief/templates/product-brief.template.md +0 -10
  401. package/pennyfarthing-dist/workflows/product-brief/workflow.yaml +0 -31
  402. package/pennyfarthing-dist/workflows/project-context/project-context-template.md +0 -21
  403. package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +0 -206
  404. package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +0 -349
  405. package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +0 -306
  406. package/pennyfarthing-dist/workflows/project-context/workflow.yaml +0 -27
  407. package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +0 -157
  408. package/pennyfarthing-dist/workflows/project-setup/steps/step-02-clone-repos.md +0 -217
  409. package/pennyfarthing-dist/workflows/project-setup/steps/step-03-repos-yaml.md +0 -159
  410. package/pennyfarthing-dist/workflows/project-setup/steps/step-04-claude-md.md +0 -186
  411. package/pennyfarthing-dist/workflows/project-setup/steps/step-05-shared-context.md +0 -185
  412. package/pennyfarthing-dist/workflows/project-setup/steps/step-06-task-runner.md +0 -279
  413. package/pennyfarthing-dist/workflows/project-setup/steps/step-07-theme.md +0 -200
  414. package/pennyfarthing-dist/workflows/project-setup/steps/step-08-theme-packs.md +0 -142
  415. package/pennyfarthing-dist/workflows/project-setup/steps/step-09-cyclist.md +0 -245
  416. package/pennyfarthing-dist/workflows/project-setup/steps/step-10-complete.md +0 -204
  417. package/pennyfarthing-dist/workflows/project-setup/workflow.yaml +0 -41
  418. package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +0 -177
  419. package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +0 -143
  420. package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +0 -138
  421. package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +0 -135
  422. package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +0 -129
  423. package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +0 -163
  424. package/pennyfarthing-dist/workflows/quick-dev/workflow.yaml +0 -27
  425. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +0 -201
  426. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +0 -156
  427. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +0 -140
  428. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +0 -203
  429. package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +0 -74
  430. package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +0 -27
  431. package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +0 -159
  432. package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +0 -253
  433. package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +0 -263
  434. package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +0 -232
  435. package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +0 -260
  436. package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +0 -477
  437. package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +0 -205
  438. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +0 -262
  439. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +0 -227
  440. package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +0 -275
  441. package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +0 -286
  442. package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +0 -203
  443. package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +0 -510
  444. package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +0 -159
  445. package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +0 -264
  446. package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +0 -274
  447. package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +0 -228
  448. package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +0 -267
  449. package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +0 -522
  450. package/pennyfarthing-dist/workflows/research/templates/research.template.md +0 -29
  451. package/pennyfarthing-dist/workflows/research/workflow.yaml +0 -45
  452. package/pennyfarthing-dist/workflows/retrospective/checklist.md +0 -31
  453. package/pennyfarthing-dist/workflows/retrospective/instructions.md +0 -1443
  454. package/pennyfarthing-dist/workflows/retrospective/workflow.yaml +0 -50
  455. package/pennyfarthing-dist/workflows/sprint-planning/checklist.md +0 -33
  456. package/pennyfarthing-dist/workflows/sprint-planning/sprint-status-template.yaml +0 -55
  457. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +0 -69
  458. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +0 -61
  459. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +0 -80
  460. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +0 -90
  461. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +0 -78
  462. package/pennyfarthing-dist/workflows/sprint-planning/workflow.yaml +0 -34
  463. package/pennyfarthing-dist/workflows/tdd.yaml +0 -50
  464. package/pennyfarthing-dist/workflows/trivial.yaml +0 -40
  465. package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +0 -141
  466. package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +0 -133
  467. package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +0 -196
  468. package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +0 -222
  469. package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +0 -225
  470. package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +0 -240
  471. package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +0 -258
  472. package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +0 -260
  473. package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +0 -230
  474. package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +0 -230
  475. package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +0 -247
  476. package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +0 -254
  477. package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +0 -243
  478. package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +0 -270
  479. package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +0 -234
  480. package/pennyfarthing-dist/workflows/ux-design/ux-design-template.md +0 -13
  481. package/pennyfarthing-dist/workflows/ux-design/workflow.yaml +0 -41
  482. package/pennyfarthing_scripts/README.md +0 -66
  483. package/pennyfarthing_scripts/__init__.py +0 -17
  484. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  485. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  486. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  487. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  488. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  489. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  490. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  491. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  492. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  493. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  494. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  495. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  496. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  497. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  498. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  499. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  500. package/pennyfarthing_scripts/bellmode_hook.py +0 -154
  501. package/pennyfarthing_scripts/brownfield/__init__.py +0 -35
  502. package/pennyfarthing_scripts/brownfield/__main__.py +0 -7
  503. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  504. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  505. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  506. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  507. package/pennyfarthing_scripts/brownfield/cli.py +0 -131
  508. package/pennyfarthing_scripts/brownfield/discover.py +0 -753
  509. package/pennyfarthing_scripts/cli.py +0 -174
  510. package/pennyfarthing_scripts/common/__init__.py +0 -49
  511. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  512. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  513. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  514. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  515. package/pennyfarthing_scripts/common/config.py +0 -91
  516. package/pennyfarthing_scripts/common/output.py +0 -180
  517. package/pennyfarthing_scripts/common/themes.py +0 -253
  518. package/pennyfarthing_scripts/config.py +0 -21
  519. package/pennyfarthing_scripts/context.py +0 -414
  520. package/pennyfarthing_scripts/git/__init__.py +0 -29
  521. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  522. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  523. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  524. package/pennyfarthing_scripts/git/create_branches.py +0 -439
  525. package/pennyfarthing_scripts/git/status_all.py +0 -310
  526. package/pennyfarthing_scripts/hooks.py +0 -455
  527. package/pennyfarthing_scripts/jira/__init__.py +0 -93
  528. package/pennyfarthing_scripts/jira/__main__.py +0 -10
  529. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  530. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  531. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  532. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  533. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  534. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  535. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  536. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  537. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  538. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  539. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  540. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  541. package/pennyfarthing_scripts/jira/bidirectional.py +0 -561
  542. package/pennyfarthing_scripts/jira/claim.py +0 -211
  543. package/pennyfarthing_scripts/jira/cli.py +0 -150
  544. package/pennyfarthing_scripts/jira/client.py +0 -613
  545. package/pennyfarthing_scripts/jira/epic.py +0 -176
  546. package/pennyfarthing_scripts/jira/story.py +0 -219
  547. package/pennyfarthing_scripts/jira/sync.py +0 -350
  548. package/pennyfarthing_scripts/jira_bidirectional_sync.py +0 -37
  549. package/pennyfarthing_scripts/jira_epic_creation.py +0 -30
  550. package/pennyfarthing_scripts/jira_sync.py +0 -36
  551. package/pennyfarthing_scripts/jira_sync_story.py +0 -30
  552. package/pennyfarthing_scripts/migration/__init__.py +0 -39
  553. package/pennyfarthing_scripts/migration/__main__.py +0 -10
  554. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  555. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  556. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  557. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  558. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  559. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  560. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  561. package/pennyfarthing_scripts/migration/cli.py +0 -304
  562. package/pennyfarthing_scripts/migration/session.py +0 -384
  563. package/pennyfarthing_scripts/migration/skill.py +0 -188
  564. package/pennyfarthing_scripts/migration/step.py +0 -229
  565. package/pennyfarthing_scripts/migration/validate.py +0 -282
  566. package/pennyfarthing_scripts/output.py +0 -37
  567. package/pennyfarthing_scripts/patch_mode.py +0 -449
  568. package/pennyfarthing_scripts/preflight/__init__.py +0 -17
  569. package/pennyfarthing_scripts/preflight/__main__.py +0 -10
  570. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  571. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  572. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  573. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  574. package/pennyfarthing_scripts/preflight/cli.py +0 -141
  575. package/pennyfarthing_scripts/preflight/finish.py +0 -382
  576. package/pennyfarthing_scripts/pretooluse_hook.py +0 -142
  577. package/pennyfarthing_scripts/prime/__init__.py +0 -125
  578. package/pennyfarthing_scripts/prime/__main__.py +0 -8
  579. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  580. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  581. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  582. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  583. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  584. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  585. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  586. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  587. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  588. package/pennyfarthing_scripts/prime/cli.py +0 -645
  589. package/pennyfarthing_scripts/prime/loader.py +0 -239
  590. package/pennyfarthing_scripts/prime/models.py +0 -206
  591. package/pennyfarthing_scripts/prime/persona.py +0 -308
  592. package/pennyfarthing_scripts/prime/session.py +0 -183
  593. package/pennyfarthing_scripts/prime/tiers.py +0 -201
  594. package/pennyfarthing_scripts/prime/workflow.py +0 -275
  595. package/pennyfarthing_scripts/schema_validation_hook.py +0 -306
  596. package/pennyfarthing_scripts/sprint/__init__.py +0 -66
  597. package/pennyfarthing_scripts/sprint/__main__.py +0 -10
  598. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  599. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  600. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  601. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  602. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  603. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  604. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  605. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  606. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  607. package/pennyfarthing_scripts/sprint/archive.py +0 -108
  608. package/pennyfarthing_scripts/sprint/archive_epic.py +0 -399
  609. package/pennyfarthing_scripts/sprint/cli.py +0 -284
  610. package/pennyfarthing_scripts/sprint/import_epic.py +0 -431
  611. package/pennyfarthing_scripts/sprint/loader.py +0 -193
  612. package/pennyfarthing_scripts/sprint/status.py +0 -122
  613. package/pennyfarthing_scripts/sprint/validator.py +0 -405
  614. package/pennyfarthing_scripts/sprint/work.py +0 -192
  615. package/pennyfarthing_scripts/story/__init__.py +0 -67
  616. package/pennyfarthing_scripts/story/__main__.py +0 -10
  617. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  618. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  619. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  620. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  621. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  622. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  623. package/pennyfarthing_scripts/story/cli.py +0 -105
  624. package/pennyfarthing_scripts/story/create.py +0 -167
  625. package/pennyfarthing_scripts/story/size.py +0 -113
  626. package/pennyfarthing_scripts/story/template.py +0 -151
  627. package/pennyfarthing_scripts/swebench.py +0 -216
  628. package/pennyfarthing_scripts/tests/__init__.py +0 -1
  629. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  630. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  631. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  632. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  633. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  634. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  635. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  636. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  637. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  638. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  639. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  640. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  641. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  642. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  643. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  644. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  645. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  646. package/pennyfarthing_scripts/tests/conftest.py +0 -106
  647. package/pennyfarthing_scripts/tests/test_brownfield.py +0 -842
  648. package/pennyfarthing_scripts/tests/test_cli_modules.py +0 -245
  649. package/pennyfarthing_scripts/tests/test_common.py +0 -180
  650. package/pennyfarthing_scripts/tests/test_git_utils.py +0 -866
  651. package/pennyfarthing_scripts/tests/test_jira_package.py +0 -334
  652. package/pennyfarthing_scripts/tests/test_package_structure.py +0 -372
  653. package/pennyfarthing_scripts/tests/test_patch_mode.py +0 -830
  654. package/pennyfarthing_scripts/tests/test_prime.py +0 -1050
  655. package/pennyfarthing_scripts/tests/test_sprint_package.py +0 -236
  656. package/pennyfarthing_scripts/tests/test_sprint_validator.py +0 -675
  657. package/pennyfarthing_scripts/tests/test_story_package.py +0 -156
  658. package/pennyfarthing_scripts/tests/test_tiers.py +0 -1090
  659. package/pennyfarthing_scripts/tests/test_token_counting.py +0 -559
  660. package/pennyfarthing_scripts/tests/test_workflow_check.py +0 -341
  661. package/pennyfarthing_scripts/welcome_hook.py +0 -157
  662. package/pennyfarthing_scripts/workflow.py +0 -287
  663. /package/{packages/core/bin → bin}/pennyfarthing.js +0 -0
  664. /package/{packages/core/dist → dist}/bmad/context-reader.d.ts +0 -0
  665. /package/{packages/core/dist → dist}/bmad/context-reader.d.ts.map +0 -0
  666. /package/{packages/core/dist → dist}/bmad/context-reader.js +0 -0
  667. /package/{packages/core/dist → dist}/bmad/context-reader.js.map +0 -0
  668. /package/{packages/core/dist → dist}/bmad/context-reader.test.d.ts +0 -0
  669. /package/{packages/core/dist → dist}/bmad/context-reader.test.d.ts.map +0 -0
  670. /package/{packages/core/dist → dist}/bmad/context-reader.test.js +0 -0
  671. /package/{packages/core/dist → dist}/bmad/context-reader.test.js.map +0 -0
  672. /package/{packages/core/dist → dist}/bmad/epics-parser.d.ts +0 -0
  673. /package/{packages/core/dist → dist}/bmad/epics-parser.d.ts.map +0 -0
  674. /package/{packages/core/dist → dist}/bmad/epics-parser.js +0 -0
  675. /package/{packages/core/dist → dist}/bmad/epics-parser.js.map +0 -0
  676. /package/{packages/core/dist → dist}/bmad/epics-parser.test.d.ts +0 -0
  677. /package/{packages/core/dist → dist}/bmad/epics-parser.test.d.ts.map +0 -0
  678. /package/{packages/core/dist → dist}/bmad/epics-parser.test.js +0 -0
  679. /package/{packages/core/dist → dist}/bmad/epics-parser.test.js.map +0 -0
  680. /package/{packages/core/dist → dist}/bmad/index.d.ts +0 -0
  681. /package/{packages/core/dist → dist}/bmad/index.d.ts.map +0 -0
  682. /package/{packages/core/dist → dist}/bmad/index.js +0 -0
  683. /package/{packages/core/dist → dist}/bmad/index.js.map +0 -0
  684. /package/{packages/core/dist → dist}/bmad/status-sync.d.ts +0 -0
  685. /package/{packages/core/dist → dist}/bmad/status-sync.d.ts.map +0 -0
  686. /package/{packages/core/dist → dist}/bmad/status-sync.js +0 -0
  687. /package/{packages/core/dist → dist}/bmad/status-sync.js.map +0 -0
  688. /package/{packages/core/dist → dist}/bmad/status-sync.test.d.ts +0 -0
  689. /package/{packages/core/dist → dist}/bmad/status-sync.test.d.ts.map +0 -0
  690. /package/{packages/core/dist → dist}/bmad/status-sync.test.js +0 -0
  691. /package/{packages/core/dist → dist}/bmad/status-sync.test.js.map +0 -0
  692. /package/{packages/core/dist → dist}/bmad/story-exporter.d.ts +0 -0
  693. /package/{packages/core/dist → dist}/bmad/story-exporter.d.ts.map +0 -0
  694. /package/{packages/core/dist → dist}/bmad/story-exporter.js +0 -0
  695. /package/{packages/core/dist → dist}/bmad/story-exporter.js.map +0 -0
  696. /package/{packages/core/dist → dist}/bmad/story-exporter.test.d.ts +0 -0
  697. /package/{packages/core/dist → dist}/bmad/story-exporter.test.d.ts.map +0 -0
  698. /package/{packages/core/dist → dist}/bmad/story-exporter.test.js +0 -0
  699. /package/{packages/core/dist → dist}/bmad/story-exporter.test.js.map +0 -0
  700. /package/{packages/core/dist → dist}/bmad/story-parser.d.ts +0 -0
  701. /package/{packages/core/dist → dist}/bmad/story-parser.d.ts.map +0 -0
  702. /package/{packages/core/dist → dist}/bmad/story-parser.js +0 -0
  703. /package/{packages/core/dist → dist}/bmad/story-parser.js.map +0 -0
  704. /package/{packages/core/dist → dist}/bmad/story-parser.test.d.ts +0 -0
  705. /package/{packages/core/dist → dist}/bmad/story-parser.test.d.ts.map +0 -0
  706. /package/{packages/core/dist → dist}/bmad/story-parser.test.js +0 -0
  707. /package/{packages/core/dist → dist}/bmad/story-parser.test.js.map +0 -0
  708. /package/{packages/core/dist → dist}/cli/commands/command.d.ts +0 -0
  709. /package/{packages/core/dist → dist}/cli/commands/command.d.ts.map +0 -0
  710. /package/{packages/core/dist → dist}/cli/commands/command.js +0 -0
  711. /package/{packages/core/dist → dist}/cli/commands/command.js.map +0 -0
  712. /package/{packages/core/dist → dist}/cli/commands/cyclist.d.ts +0 -0
  713. /package/{packages/core/dist → dist}/cli/commands/cyclist.d.ts.map +0 -0
  714. /package/{packages/core/dist → dist}/cli/commands/cyclist.js +0 -0
  715. /package/{packages/core/dist → dist}/cli/commands/cyclist.js.map +0 -0
  716. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.d.ts +0 -0
  717. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.d.ts.map +0 -0
  718. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.js +0 -0
  719. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.js.map +0 -0
  720. /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.d.ts +0 -0
  721. /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.d.ts.map +0 -0
  722. /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.js +0 -0
  723. /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.js.map +0 -0
  724. /package/{packages/core/dist → dist}/cli/commands/doctor.d.ts +0 -0
  725. /package/{packages/core/dist → dist}/cli/commands/doctor.d.ts.map +0 -0
  726. /package/{packages/core/dist → dist}/cli/commands/doctor.js +0 -0
  727. /package/{packages/core/dist → dist}/cli/commands/doctor.js.map +0 -0
  728. /package/{packages/core/dist → dist}/cli/commands/init.d.ts +0 -0
  729. /package/{packages/core/dist → dist}/cli/commands/init.d.ts.map +0 -0
  730. /package/{packages/core/dist → dist}/cli/commands/init.js +0 -0
  731. /package/{packages/core/dist → dist}/cli/commands/init.js.map +0 -0
  732. /package/{packages/core/dist → dist}/cli/commands/skill.d.ts +0 -0
  733. /package/{packages/core/dist → dist}/cli/commands/skill.d.ts.map +0 -0
  734. /package/{packages/core/dist → dist}/cli/commands/skill.js +0 -0
  735. /package/{packages/core/dist → dist}/cli/commands/skill.js.map +0 -0
  736. /package/{packages/core/dist → dist}/cli/commands/theme.d.ts +0 -0
  737. /package/{packages/core/dist → dist}/cli/commands/theme.d.ts.map +0 -0
  738. /package/{packages/core/dist → dist}/cli/commands/theme.js +0 -0
  739. /package/{packages/core/dist → dist}/cli/commands/theme.js.map +0 -0
  740. /package/{packages/core/dist → dist}/cli/commands/uninstall.d.ts +0 -0
  741. /package/{packages/core/dist → dist}/cli/commands/uninstall.d.ts.map +0 -0
  742. /package/{packages/core/dist → dist}/cli/commands/uninstall.js +0 -0
  743. /package/{packages/core/dist → dist}/cli/commands/uninstall.js.map +0 -0
  744. /package/{packages/core/dist → dist}/cli/commands/update.d.ts +0 -0
  745. /package/{packages/core/dist → dist}/cli/commands/update.d.ts.map +0 -0
  746. /package/{packages/core/dist → dist}/cli/commands/update.js +0 -0
  747. /package/{packages/core/dist → dist}/cli/commands/update.js.map +0 -0
  748. /package/{packages/core/dist → dist}/cli/commands/version.d.ts +0 -0
  749. /package/{packages/core/dist → dist}/cli/commands/version.d.ts.map +0 -0
  750. /package/{packages/core/dist → dist}/cli/commands/version.js +0 -0
  751. /package/{packages/core/dist → dist}/cli/commands/version.js.map +0 -0
  752. /package/{packages/core/dist → dist}/cli/customization.test.d.ts +0 -0
  753. /package/{packages/core/dist → dist}/cli/customization.test.d.ts.map +0 -0
  754. /package/{packages/core/dist → dist}/cli/customization.test.js +0 -0
  755. /package/{packages/core/dist → dist}/cli/customization.test.js.map +0 -0
  756. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.d.ts +0 -0
  757. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.d.ts.map +0 -0
  758. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.js +0 -0
  759. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.js.map +0 -0
  760. /package/{packages/core/dist → dist}/cli/index.d.ts +0 -0
  761. /package/{packages/core/dist → dist}/cli/index.d.ts.map +0 -0
  762. /package/{packages/core/dist → dist}/cli/index.js +0 -0
  763. /package/{packages/core/dist → dist}/cli/index.js.map +0 -0
  764. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.d.ts +0 -0
  765. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.d.ts.map +0 -0
  766. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.js +0 -0
  767. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.js.map +0 -0
  768. /package/{packages/core/dist → dist}/cli/theme-maker.test.d.ts +0 -0
  769. /package/{packages/core/dist → dist}/cli/theme-maker.test.d.ts.map +0 -0
  770. /package/{packages/core/dist → dist}/cli/theme-maker.test.js +0 -0
  771. /package/{packages/core/dist → dist}/cli/theme-maker.test.js.map +0 -0
  772. /package/{packages/core/dist → dist}/cli/utils/constants.d.ts +0 -0
  773. /package/{packages/core/dist → dist}/cli/utils/constants.d.ts.map +0 -0
  774. /package/{packages/core/dist → dist}/cli/utils/constants.js +0 -0
  775. /package/{packages/core/dist → dist}/cli/utils/constants.js.map +0 -0
  776. /package/{packages/core/dist → dist}/cli/utils/files.d.ts +0 -0
  777. /package/{packages/core/dist → dist}/cli/utils/files.d.ts.map +0 -0
  778. /package/{packages/core/dist → dist}/cli/utils/files.js +0 -0
  779. /package/{packages/core/dist → dist}/cli/utils/files.js.map +0 -0
  780. /package/{packages/core/dist → dist}/cli/utils/logger.d.ts +0 -0
  781. /package/{packages/core/dist → dist}/cli/utils/logger.d.ts.map +0 -0
  782. /package/{packages/core/dist → dist}/cli/utils/logger.js +0 -0
  783. /package/{packages/core/dist → dist}/cli/utils/logger.js.map +0 -0
  784. /package/{packages/core/dist → dist}/cli/utils/manifest.d.ts +0 -0
  785. /package/{packages/core/dist → dist}/cli/utils/manifest.d.ts.map +0 -0
  786. /package/{packages/core/dist → dist}/cli/utils/manifest.js +0 -0
  787. /package/{packages/core/dist → dist}/cli/utils/manifest.js.map +0 -0
  788. /package/{packages/core/dist → dist}/cli/utils/node-modules.d.ts +0 -0
  789. /package/{packages/core/dist → dist}/cli/utils/node-modules.d.ts.map +0 -0
  790. /package/{packages/core/dist → dist}/cli/utils/node-modules.js +0 -0
  791. /package/{packages/core/dist → dist}/cli/utils/node-modules.js.map +0 -0
  792. /package/{packages/core/dist → dist}/cli/utils/prompts.d.ts +0 -0
  793. /package/{packages/core/dist → dist}/cli/utils/prompts.d.ts.map +0 -0
  794. /package/{packages/core/dist → dist}/cli/utils/prompts.js +0 -0
  795. /package/{packages/core/dist → dist}/cli/utils/prompts.js.map +0 -0
  796. /package/{packages/core/dist → dist}/cli/utils/settings.d.ts +0 -0
  797. /package/{packages/core/dist → dist}/cli/utils/settings.d.ts.map +0 -0
  798. /package/{packages/core/dist → dist}/cli/utils/settings.js +0 -0
  799. /package/{packages/core/dist → dist}/cli/utils/settings.js.map +0 -0
  800. /package/{packages/core/dist → dist}/cli/utils/symlinks.d.ts +0 -0
  801. /package/{packages/core/dist → dist}/cli/utils/symlinks.d.ts.map +0 -0
  802. /package/{packages/core/dist → dist}/cli/utils/symlinks.js +0 -0
  803. /package/{packages/core/dist → dist}/cli/utils/symlinks.js.map +0 -0
  804. /package/{packages/core/dist → dist}/cli/utils/themes.d.ts +0 -0
  805. /package/{packages/core/dist → dist}/cli/utils/themes.d.ts.map +0 -0
  806. /package/{packages/core/dist → dist}/cli/utils/themes.js +0 -0
  807. /package/{packages/core/dist → dist}/cli/utils/themes.js.map +0 -0
  808. /package/{packages/core/dist → dist}/cli/utils/themes.test.d.ts +0 -0
  809. /package/{packages/core/dist → dist}/cli/utils/themes.test.d.ts.map +0 -0
  810. /package/{packages/core/dist → dist}/cli/utils/themes.test.js +0 -0
  811. /package/{packages/core/dist → dist}/cli/utils/themes.test.js.map +0 -0
  812. /package/{packages/core/dist → dist}/cli/utils/version.d.ts +0 -0
  813. /package/{packages/core/dist → dist}/cli/utils/version.d.ts.map +0 -0
  814. /package/{packages/core/dist → dist}/cli/utils/version.js +0 -0
  815. /package/{packages/core/dist → dist}/cli/utils/version.js.map +0 -0
  816. /package/{packages/core/dist → dist}/cli/workspace.test.d.ts +0 -0
  817. /package/{packages/core/dist → dist}/cli/workspace.test.d.ts.map +0 -0
  818. /package/{packages/core/dist → dist}/cli/workspace.test.js +0 -0
  819. /package/{packages/core/dist → dist}/cli/workspace.test.js.map +0 -0
  820. /package/{packages/core/dist → dist}/index.d.ts +0 -0
  821. /package/{packages/core/dist → dist}/index.d.ts.map +0 -0
  822. /package/{packages/core/dist → dist}/index.js +0 -0
  823. /package/{packages/core/dist → dist}/index.js.map +0 -0
  824. /package/{packages/core/dist → dist}/jira/jira-epic-creation.d.ts +0 -0
  825. /package/{packages/core/dist → dist}/jira/jira-epic-creation.d.ts.map +0 -0
  826. /package/{packages/core/dist → dist}/jira/jira-epic-creation.js +0 -0
  827. /package/{packages/core/dist → dist}/jira/jira-epic-creation.js.map +0 -0
  828. /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.d.ts +0 -0
  829. /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.d.ts.map +0 -0
  830. /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.js +0 -0
  831. /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.js.map +0 -0
  832. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.d.ts +0 -0
  833. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.d.ts.map +0 -0
  834. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.js +0 -0
  835. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.js.map +0 -0
  836. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.d.ts +0 -0
  837. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.d.ts.map +0 -0
  838. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.js +0 -0
  839. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.js.map +0 -0
  840. /package/{packages/core/dist → dist}/permissions/index.d.ts +0 -0
  841. /package/{packages/core/dist → dist}/permissions/index.d.ts.map +0 -0
  842. /package/{packages/core/dist → dist}/permissions/index.js +0 -0
  843. /package/{packages/core/dist → dist}/permissions/index.js.map +0 -0
  844. /package/{packages/core/dist → dist}/permissions/permission-schema.d.ts +0 -0
  845. /package/{packages/core/dist → dist}/permissions/permission-schema.d.ts.map +0 -0
  846. /package/{packages/core/dist → dist}/permissions/permission-schema.js +0 -0
  847. /package/{packages/core/dist → dist}/permissions/permission-schema.js.map +0 -0
  848. /package/{packages/core/dist → dist}/permissions/permission-schema.test.d.ts +0 -0
  849. /package/{packages/core/dist → dist}/permissions/permission-schema.test.d.ts.map +0 -0
  850. /package/{packages/core/dist → dist}/permissions/permission-schema.test.js +0 -0
  851. /package/{packages/core/dist → dist}/permissions/permission-schema.test.js.map +0 -0
  852. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.d.ts +0 -0
  853. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.d.ts.map +0 -0
  854. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.js +0 -0
  855. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.js.map +0 -0
  856. /package/{packages/core/dist → dist}/scripts/benchmark-integration.d.ts +0 -0
  857. /package/{packages/core/dist → dist}/scripts/benchmark-integration.d.ts.map +0 -0
  858. /package/{packages/core/dist → dist}/scripts/benchmark-integration.js +0 -0
  859. /package/{packages/core/dist → dist}/scripts/benchmark-integration.js.map +0 -0
  860. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.d.ts +0 -0
  861. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.d.ts.map +0 -0
  862. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.js +0 -0
  863. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.js.map +0 -0
  864. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.d.ts +0 -0
  865. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.d.ts.map +0 -0
  866. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.js +0 -0
  867. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.js.map +0 -0
  868. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.d.ts +0 -0
  869. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.d.ts.map +0 -0
  870. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.js +0 -0
  871. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.js.map +0 -0
  872. /package/{packages/core/dist → dist}/scripts/generate-report.d.ts +0 -0
  873. /package/{packages/core/dist → dist}/scripts/generate-report.d.ts.map +0 -0
  874. /package/{packages/core/dist → dist}/scripts/generate-report.js +0 -0
  875. /package/{packages/core/dist → dist}/scripts/generate-report.js.map +0 -0
  876. /package/{packages/core/dist → dist}/scripts/generate-report.test.d.ts +0 -0
  877. /package/{packages/core/dist → dist}/scripts/generate-report.test.d.ts.map +0 -0
  878. /package/{packages/core/dist → dist}/scripts/generate-report.test.js +0 -0
  879. /package/{packages/core/dist → dist}/scripts/generate-report.test.js.map +0 -0
  880. /package/{packages/core/dist → dist}/scripts/generate-spider-report.d.ts +0 -0
  881. /package/{packages/core/dist → dist}/scripts/generate-spider-report.d.ts.map +0 -0
  882. /package/{packages/core/dist → dist}/scripts/generate-spider-report.js +0 -0
  883. /package/{packages/core/dist → dist}/scripts/generate-spider-report.js.map +0 -0
  884. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.d.ts +0 -0
  885. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.d.ts.map +0 -0
  886. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.js +0 -0
  887. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.js.map +0 -0
  888. /package/{packages/core/dist → dist}/scripts/generate-spider.d.ts +0 -0
  889. /package/{packages/core/dist → dist}/scripts/generate-spider.d.ts.map +0 -0
  890. /package/{packages/core/dist → dist}/scripts/generate-spider.js +0 -0
  891. /package/{packages/core/dist → dist}/scripts/generate-spider.js.map +0 -0
  892. /package/{packages/core/dist → dist}/scripts/generate-spider.test.d.ts +0 -0
  893. /package/{packages/core/dist → dist}/scripts/generate-spider.test.d.ts.map +0 -0
  894. /package/{packages/core/dist → dist}/scripts/generate-spider.test.js +0 -0
  895. /package/{packages/core/dist → dist}/scripts/generate-spider.test.js.map +0 -0
  896. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.d.ts +0 -0
  897. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.d.ts.map +0 -0
  898. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.js +0 -0
  899. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.js.map +0 -0
  900. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.d.ts +0 -0
  901. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.d.ts.map +0 -0
  902. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.js +0 -0
  903. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.js.map +0 -0
  904. /package/{packages/core/dist → dist}/scripts/run-ci.test.d.ts +0 -0
  905. /package/{packages/core/dist → dist}/scripts/run-ci.test.d.ts.map +0 -0
  906. /package/{packages/core/dist → dist}/scripts/run-ci.test.js +0 -0
  907. /package/{packages/core/dist → dist}/scripts/run-ci.test.js.map +0 -0
  908. /package/{packages/core/dist → dist}/scripts/theme-detail.test.d.ts +0 -0
  909. /package/{packages/core/dist → dist}/scripts/theme-detail.test.d.ts.map +0 -0
  910. /package/{packages/core/dist → dist}/scripts/theme-detail.test.js +0 -0
  911. /package/{packages/core/dist → dist}/scripts/theme-detail.test.js.map +0 -0
  912. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.d.ts +0 -0
  913. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.d.ts.map +0 -0
  914. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.js +0 -0
  915. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.js.map +0 -0
  916. /package/{packages/core/dist → dist}/workflow/gate-handler.d.ts +0 -0
  917. /package/{packages/core/dist → dist}/workflow/gate-handler.d.ts.map +0 -0
  918. /package/{packages/core/dist → dist}/workflow/gate-handler.js +0 -0
  919. /package/{packages/core/dist → dist}/workflow/gate-handler.js.map +0 -0
  920. /package/{packages/core/dist → dist}/workflow/gate-handler.test.d.ts +0 -0
  921. /package/{packages/core/dist → dist}/workflow/gate-handler.test.d.ts.map +0 -0
  922. /package/{packages/core/dist → dist}/workflow/gate-handler.test.js +0 -0
  923. /package/{packages/core/dist → dist}/workflow/gate-handler.test.js.map +0 -0
  924. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.d.ts +0 -0
  925. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.d.ts.map +0 -0
  926. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.js +0 -0
  927. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.js.map +0 -0
  928. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.d.ts +0 -0
  929. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.d.ts.map +0 -0
  930. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.js +0 -0
  931. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.js.map +0 -0
  932. /package/{packages/core/dist → dist}/workflow/handoff.d.ts +0 -0
  933. /package/{packages/core/dist → dist}/workflow/handoff.d.ts.map +0 -0
  934. /package/{packages/core/dist → dist}/workflow/handoff.js +0 -0
  935. /package/{packages/core/dist → dist}/workflow/handoff.js.map +0 -0
  936. /package/{packages/core/dist → dist}/workflow/handoff.test.d.ts +0 -0
  937. /package/{packages/core/dist → dist}/workflow/handoff.test.d.ts.map +0 -0
  938. /package/{packages/core/dist → dist}/workflow/handoff.test.js +0 -0
  939. /package/{packages/core/dist → dist}/workflow/handoff.test.js.map +0 -0
  940. /package/{packages/core/dist → dist}/workflow/index.d.ts +0 -0
  941. /package/{packages/core/dist → dist}/workflow/index.d.ts.map +0 -0
  942. /package/{packages/core/dist → dist}/workflow/index.js +0 -0
  943. /package/{packages/core/dist → dist}/workflow/index.js.map +0 -0
  944. /package/{packages/core/dist → dist}/workflow/session-state.d.ts +0 -0
  945. /package/{packages/core/dist → dist}/workflow/session-state.d.ts.map +0 -0
  946. /package/{packages/core/dist → dist}/workflow/session-state.js +0 -0
  947. /package/{packages/core/dist → dist}/workflow/session-state.js.map +0 -0
  948. /package/{packages/core/dist → dist}/workflow/session-state.test.d.ts +0 -0
  949. /package/{packages/core/dist → dist}/workflow/session-state.test.d.ts.map +0 -0
  950. /package/{packages/core/dist → dist}/workflow/session-state.test.js +0 -0
  951. /package/{packages/core/dist → dist}/workflow/session-state.test.js.map +0 -0
  952. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.d.ts +0 -0
  953. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.d.ts.map +0 -0
  954. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.js +0 -0
  955. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.js.map +0 -0
  956. /package/{packages/core/dist → dist}/workflow/step-parser.d.ts +0 -0
  957. /package/{packages/core/dist → dist}/workflow/step-parser.d.ts.map +0 -0
  958. /package/{packages/core/dist → dist}/workflow/step-parser.js +0 -0
  959. /package/{packages/core/dist → dist}/workflow/step-parser.js.map +0 -0
  960. /package/{packages/core/dist → dist}/workflow/step-parser.test.d.ts +0 -0
  961. /package/{packages/core/dist → dist}/workflow/step-parser.test.d.ts.map +0 -0
  962. /package/{packages/core/dist → dist}/workflow/step-parser.test.js +0 -0
  963. /package/{packages/core/dist → dist}/workflow/step-parser.test.js.map +0 -0
  964. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.d.ts +0 -0
  965. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.d.ts.map +0 -0
  966. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.js +0 -0
  967. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.js.map +0 -0
  968. /package/{packages/core/dist → dist}/workflow/test-cache.d.ts +0 -0
  969. /package/{packages/core/dist → dist}/workflow/test-cache.d.ts.map +0 -0
  970. /package/{packages/core/dist → dist}/workflow/test-cache.js +0 -0
  971. /package/{packages/core/dist → dist}/workflow/test-cache.js.map +0 -0
  972. /package/{packages/core/dist → dist}/workflow/test-cache.test.d.ts +0 -0
  973. /package/{packages/core/dist → dist}/workflow/test-cache.test.d.ts.map +0 -0
  974. /package/{packages/core/dist → dist}/workflow/test-cache.test.js +0 -0
  975. /package/{packages/core/dist → dist}/workflow/test-cache.test.js.map +0 -0
  976. /package/{packages/core/dist → dist}/workflow/trimodal.d.ts +0 -0
  977. /package/{packages/core/dist → dist}/workflow/trimodal.d.ts.map +0 -0
  978. /package/{packages/core/dist → dist}/workflow/trimodal.js +0 -0
  979. /package/{packages/core/dist → dist}/workflow/trimodal.js.map +0 -0
  980. /package/{packages/core/dist → dist}/workflow/trimodal.test.d.ts +0 -0
  981. /package/{packages/core/dist → dist}/workflow/trimodal.test.d.ts.map +0 -0
  982. /package/{packages/core/dist → dist}/workflow/trimodal.test.js +0 -0
  983. /package/{packages/core/dist → dist}/workflow/trimodal.test.js.map +0 -0
  984. /package/{packages/core/dist → dist}/workflow/variable-resolver.d.ts +0 -0
  985. /package/{packages/core/dist → dist}/workflow/variable-resolver.d.ts.map +0 -0
  986. /package/{packages/core/dist → dist}/workflow/variable-resolver.js +0 -0
  987. /package/{packages/core/dist → dist}/workflow/variable-resolver.js.map +0 -0
  988. /package/{packages/core/dist → dist}/workflow/variable-resolver.test.d.ts +0 -0
  989. /package/{packages/core/dist → dist}/workflow/variable-resolver.test.d.ts.map +0 -0
  990. /package/{packages/core/dist → dist}/workflow/variable-resolver.test.js +0 -0
  991. /package/{packages/core/dist → dist}/workflow/variable-resolver.test.js.map +0 -0
  992. /package/{packages/core/dist → dist}/workflow/workflow-executor.d.ts +0 -0
  993. /package/{packages/core/dist → dist}/workflow/workflow-executor.d.ts.map +0 -0
  994. /package/{packages/core/dist → dist}/workflow/workflow-executor.js +0 -0
  995. /package/{packages/core/dist → dist}/workflow/workflow-executor.js.map +0 -0
  996. /package/{packages/core/dist → dist}/workflow/workflow-executor.test.d.ts +0 -0
  997. /package/{packages/core/dist → dist}/workflow/workflow-executor.test.d.ts.map +0 -0
  998. /package/{packages/core/dist → dist}/workflow/workflow-executor.test.js +0 -0
  999. /package/{packages/core/dist → dist}/workflow/workflow-executor.test.js.map +0 -0
  1000. /package/{packages/core/dist → dist}/workflow/workflow-loader.d.ts +0 -0
  1001. /package/{packages/core/dist → dist}/workflow/workflow-loader.d.ts.map +0 -0
  1002. /package/{packages/core/dist → dist}/workflow/workflow-loader.js +0 -0
  1003. /package/{packages/core/dist → dist}/workflow/workflow-loader.js.map +0 -0
  1004. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.d.ts +0 -0
  1005. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.d.ts.map +0 -0
  1006. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.js +0 -0
  1007. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.js.map +0 -0
  1008. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.d.ts +0 -0
  1009. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.d.ts.map +0 -0
  1010. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.js +0 -0
  1011. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.js.map +0 -0
  1012. /package/{packages/core/dist → dist}/workflow/workflow-permissions.d.ts +0 -0
  1013. /package/{packages/core/dist → dist}/workflow/workflow-permissions.d.ts.map +0 -0
  1014. /package/{packages/core/dist → dist}/workflow/workflow-permissions.js +0 -0
  1015. /package/{packages/core/dist → dist}/workflow/workflow-permissions.js.map +0 -0
  1016. /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.d.ts +0 -0
  1017. /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.d.ts.map +0 -0
  1018. /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.js +0 -0
  1019. /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.js.map +0 -0
  1020. /package/{packages/core/dist → dist}/workflow/workflow-router.d.ts +0 -0
  1021. /package/{packages/core/dist → dist}/workflow/workflow-router.d.ts.map +0 -0
  1022. /package/{packages/core/dist → dist}/workflow/workflow-router.js +0 -0
  1023. /package/{packages/core/dist → dist}/workflow/workflow-router.js.map +0 -0
  1024. /package/{packages/core/dist → dist}/workflow/workflow-router.test.d.ts +0 -0
  1025. /package/{packages/core/dist → dist}/workflow/workflow-router.test.d.ts.map +0 -0
  1026. /package/{packages/core/dist → dist}/workflow/workflow-router.test.js +0 -0
  1027. /package/{packages/core/dist → dist}/workflow/workflow-router.test.js.map +0 -0
  1028. /package/{packages/core/dist → dist}/workflow/workflow-schema.d.ts +0 -0
  1029. /package/{packages/core/dist → dist}/workflow/workflow-schema.d.ts.map +0 -0
  1030. /package/{packages/core/dist → dist}/workflow/workflow-schema.js +0 -0
  1031. /package/{packages/core/dist → dist}/workflow/workflow-schema.js.map +0 -0
  1032. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.d.ts +0 -0
  1033. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.d.ts.map +0 -0
  1034. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.js +0 -0
  1035. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.js.map +0 -0
  1036. /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.d.ts +0 -0
  1037. /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.d.ts.map +0 -0
  1038. /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.js +0 -0
  1039. /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.js.map +0 -0
@@ -1,830 +0,0 @@
1
- """Tests for Patch Mode - Interrupt-Driven Bug Fix Workflow.
2
-
3
- Story: 74-1 - Implement Patch Mode
4
- Epic: epic-74 (Patch Mode Workflow)
5
-
6
- Acceptance Criteria:
7
- - [AC1] /patch "description" command triggers Patch Mode
8
- - [AC2] State preserved (story_id, workflow, phase, agent, feature_branch)
9
- - [AC3] Patch branch created from feature branch (not develop)
10
- - [AC4] Dev-only workflow (no TEA handoff)
11
- - [AC5] Commit format fix(patch): desc [from:STORY-ID]
12
- - [AC6] Merge back to feature branch on completion
13
- - [AC7] Original workflow state restored after merge
14
- - [AC8] Session file includes patches: section for archive
15
- - [AC9] Tirepump integration auto-handoff back to original agent
16
- - [AC10] Nested patches supported (patch-stack is a stack)
17
-
18
- These tests should FAIL until patch_mode.py is implemented.
19
- """
20
-
21
- import json
22
- import os
23
- import subprocess
24
- import sys
25
- from pathlib import Path
26
- from typing import Any, Generator
27
- from unittest.mock import MagicMock, patch, call
28
-
29
- import pytest
30
- import yaml
31
-
32
- # Import will fail until module exists - this is intentional for RED state
33
- try:
34
- from pennyfarthing_scripts.patch_mode import (
35
- PatchState,
36
- PatchStack,
37
- enter_patch_mode,
38
- exit_patch_mode,
39
- get_patch_stack,
40
- create_patch_branch,
41
- merge_patch_branch,
42
- restore_workflow_state,
43
- log_patch_to_session,
44
- generate_patch_commit_message,
45
- is_in_patch_mode,
46
- )
47
- IMPORT_SUCCESS = True
48
- except ImportError:
49
- IMPORT_SUCCESS = False
50
- # Stub classes for test compilation
51
- class PatchState:
52
- pass
53
- class PatchStack:
54
- pass
55
- def enter_patch_mode(*args, **kwargs):
56
- raise NotImplementedError("patch_mode.py not implemented")
57
- def exit_patch_mode(*args, **kwargs):
58
- raise NotImplementedError("patch_mode.py not implemented")
59
- def get_patch_stack(*args, **kwargs):
60
- raise NotImplementedError("patch_mode.py not implemented")
61
- def create_patch_branch(*args, **kwargs):
62
- raise NotImplementedError("patch_mode.py not implemented")
63
- def merge_patch_branch(*args, **kwargs):
64
- raise NotImplementedError("patch_mode.py not implemented")
65
- def restore_workflow_state(*args, **kwargs):
66
- raise NotImplementedError("patch_mode.py not implemented")
67
- def log_patch_to_session(*args, **kwargs):
68
- raise NotImplementedError("patch_mode.py not implemented")
69
- def generate_patch_commit_message(*args, **kwargs):
70
- raise NotImplementedError("patch_mode.py not implemented")
71
- def is_in_patch_mode(*args, **kwargs):
72
- raise NotImplementedError("patch_mode.py not implemented")
73
-
74
-
75
- class TestPatchModeModuleExists:
76
- """Tests that the patch_mode module exists and is importable."""
77
-
78
- def test_module_importable(self) -> None:
79
- """patch_mode module should be importable."""
80
- assert IMPORT_SUCCESS, "pennyfarthing_scripts.patch_mode module does not exist"
81
-
82
- def test_patch_state_class_exists(self) -> None:
83
- """PatchState class should exist."""
84
- assert IMPORT_SUCCESS, "PatchState class not found"
85
- # When implemented, PatchState should have these attributes
86
- assert hasattr(PatchState, '__init__') or not IMPORT_SUCCESS
87
-
88
- def test_patch_stack_class_exists(self) -> None:
89
- """PatchStack class should exist."""
90
- assert IMPORT_SUCCESS, "PatchStack class not found"
91
-
92
-
93
- class TestPatchStatePreservation:
94
- """Tests for AC2: State preserved (story_id, workflow, phase, agent, feature_branch)."""
95
-
96
- @pytest.fixture
97
- def mock_session_state(self) -> dict[str, Any]:
98
- """Sample session state to preserve."""
99
- return {
100
- "story_id": "MSSCI-12345",
101
- "workflow": "tdd",
102
- "phase": "green",
103
- "agent": "dev",
104
- "feature_branch": "feat/MSSCI-12345-new-feature",
105
- }
106
-
107
- def test_patch_state_stores_story_id(self, mock_session_state: dict) -> None:
108
- """AC2: PatchState should store story_id."""
109
- if not IMPORT_SUCCESS:
110
- pytest.skip("Module not implemented")
111
- state = PatchState(**mock_session_state)
112
- assert state.story_id == "MSSCI-12345"
113
-
114
- def test_patch_state_stores_workflow(self, mock_session_state: dict) -> None:
115
- """AC2: PatchState should store workflow type."""
116
- if not IMPORT_SUCCESS:
117
- pytest.skip("Module not implemented")
118
- state = PatchState(**mock_session_state)
119
- assert state.workflow == "tdd"
120
-
121
- def test_patch_state_stores_phase(self, mock_session_state: dict) -> None:
122
- """AC2: PatchState should store phase."""
123
- if not IMPORT_SUCCESS:
124
- pytest.skip("Module not implemented")
125
- state = PatchState(**mock_session_state)
126
- assert state.phase == "green"
127
-
128
- def test_patch_state_stores_agent(self, mock_session_state: dict) -> None:
129
- """AC2: PatchState should store agent."""
130
- if not IMPORT_SUCCESS:
131
- pytest.skip("Module not implemented")
132
- state = PatchState(**mock_session_state)
133
- assert state.agent == "dev"
134
-
135
- def test_patch_state_stores_feature_branch(self, mock_session_state: dict) -> None:
136
- """AC2: PatchState should store feature_branch."""
137
- if not IMPORT_SUCCESS:
138
- pytest.skip("Module not implemented")
139
- state = PatchState(**mock_session_state)
140
- assert state.feature_branch == "feat/MSSCI-12345-new-feature"
141
-
142
- def test_patch_state_serializes_to_yaml(self, mock_session_state: dict) -> None:
143
- """AC2: PatchState should be serializable to YAML."""
144
- if not IMPORT_SUCCESS:
145
- pytest.skip("Module not implemented")
146
- state = PatchState(**mock_session_state)
147
- yaml_str = state.to_yaml()
148
- parsed = yaml.safe_load(yaml_str)
149
- assert parsed["story_id"] == "MSSCI-12345"
150
- assert parsed["workflow"] == "tdd"
151
-
152
- def test_patch_state_deserializes_from_yaml(self, mock_session_state: dict) -> None:
153
- """AC2: PatchState should be deserializable from YAML."""
154
- if not IMPORT_SUCCESS:
155
- pytest.skip("Module not implemented")
156
- yaml_str = yaml.dump(mock_session_state)
157
- state = PatchState.from_yaml(yaml_str)
158
- assert state.story_id == "MSSCI-12345"
159
-
160
-
161
- class TestPatchBranchCreation:
162
- """Tests for AC3: Patch branch created from feature branch (not develop)."""
163
-
164
- def test_create_branch_from_feature_not_develop(self, tmp_path: Path) -> None:
165
- """AC3: Patch branch should be created from feature branch, not develop."""
166
- if not IMPORT_SUCCESS:
167
- pytest.skip("Module not implemented")
168
- # Mock git operations
169
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
170
- mock_run.return_value = MagicMock(returncode=0)
171
- branch_name = create_patch_branch(
172
- description="fix broken script",
173
- feature_branch="feat/MSSCI-12345-feature",
174
- repo_path=tmp_path,
175
- )
176
- # Should NOT checkout develop first
177
- calls = [str(c) for c in mock_run.call_args_list]
178
- assert not any("checkout develop" in c for c in calls)
179
- # Should create branch from current (feature) branch
180
- assert "patch/" in branch_name
181
-
182
- def test_branch_name_format(self) -> None:
183
- """AC3: Branch name should follow patch/<desc>-<timestamp> format."""
184
- if not IMPORT_SUCCESS:
185
- pytest.skip("Module not implemented")
186
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
187
- mock_run.return_value = MagicMock(returncode=0)
188
- branch_name = create_patch_branch(
189
- description="fix broken script",
190
- feature_branch="feat/MSSCI-12345-feature",
191
- )
192
- assert branch_name.startswith("patch/")
193
- assert "fix-broken-script" in branch_name or "fix_broken_script" in branch_name
194
-
195
- def test_branch_name_sanitizes_description(self) -> None:
196
- """AC3: Branch name should sanitize special characters from description."""
197
- if not IMPORT_SUCCESS:
198
- pytest.skip("Module not implemented")
199
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
200
- mock_run.return_value = MagicMock(returncode=0)
201
- branch_name = create_patch_branch(
202
- description="fix: broken/script (urgent!)",
203
- feature_branch="feat/MSSCI-12345-feature",
204
- )
205
- # Should not contain special characters
206
- assert ":" not in branch_name
207
- assert "(" not in branch_name
208
- assert "!" not in branch_name
209
-
210
-
211
- class TestDevOnlyWorkflow:
212
- """Tests for AC4: Dev-only workflow (no TEA handoff)."""
213
-
214
- def test_patch_workflow_has_no_tea_phase(self) -> None:
215
- """AC4: Patch workflow should not include TEA phase."""
216
- if not IMPORT_SUCCESS:
217
- pytest.skip("Module not implemented")
218
- # Read patch.yaml workflow definition
219
- workflow_path = Path("pennyfarthing-dist/workflows/patch.yaml")
220
- if not workflow_path.exists():
221
- pytest.fail("patch.yaml workflow file does not exist")
222
-
223
- with open(workflow_path) as f:
224
- workflow = yaml.safe_load(f)
225
-
226
- phases = workflow.get("workflow", {}).get("phases", [])
227
- phase_agents = [p.get("agent") for p in phases]
228
- assert "tea" not in phase_agents, "Patch workflow should not include TEA"
229
-
230
- def test_enter_patch_mode_sets_dev_agent(self) -> None:
231
- """AC4: Entering patch mode should set agent to dev."""
232
- if not IMPORT_SUCCESS:
233
- pytest.skip("Module not implemented")
234
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
235
- mock_run.return_value = MagicMock(returncode=0)
236
- result = enter_patch_mode(
237
- description="fix broken script",
238
- story_id="MSSCI-12345",
239
- workflow="tdd",
240
- phase="green",
241
- agent="dev",
242
- feature_branch="feat/MSSCI-12345-feature",
243
- )
244
- # Should indicate dev agent
245
- assert result.get("agent") == "dev" or result.agent == "dev"
246
-
247
-
248
- class TestCommitFormat:
249
- """Tests for AC5: Commit format fix(patch): desc [from:STORY-ID]."""
250
-
251
- def test_commit_message_format(self) -> None:
252
- """AC5: Commit message should follow fix(patch): desc [from:STORY-ID] format."""
253
- if not IMPORT_SUCCESS:
254
- pytest.skip("Module not implemented")
255
- msg = generate_patch_commit_message(
256
- description="fix broken script path",
257
- story_id="MSSCI-12345",
258
- )
259
- assert msg.startswith("fix(patch):")
260
- assert "fix broken script path" in msg
261
- assert "[from:MSSCI-12345]" in msg
262
-
263
- def test_commit_message_with_local_story_id(self) -> None:
264
- """AC5: Commit message should work with local story IDs (no JIRA)."""
265
- if not IMPORT_SUCCESS:
266
- pytest.skip("Module not implemented")
267
- msg = generate_patch_commit_message(
268
- description="fix path error",
269
- story_id="74-1",
270
- )
271
- assert "[from:74-1]" in msg
272
-
273
- def test_commit_message_includes_coauthor(self) -> None:
274
- """AC5: Commit message should include Co-Authored-By line."""
275
- if not IMPORT_SUCCESS:
276
- pytest.skip("Module not implemented")
277
- msg = generate_patch_commit_message(
278
- description="fix script",
279
- story_id="MSSCI-12345",
280
- )
281
- assert "Co-Authored-By:" in msg
282
-
283
-
284
- class TestMergeBack:
285
- """Tests for AC6: Merge back to feature branch on completion."""
286
-
287
- def test_merge_patch_to_feature_branch(self, tmp_path: Path) -> None:
288
- """AC6: merge_patch_branch should merge to feature branch."""
289
- if not IMPORT_SUCCESS:
290
- pytest.skip("Module not implemented")
291
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
292
- mock_run.return_value = MagicMock(returncode=0)
293
- merge_patch_branch(
294
- patch_branch="patch/fix-script-1234567890",
295
- feature_branch="feat/MSSCI-12345-feature",
296
- repo_path=tmp_path,
297
- )
298
- # Should merge patch into feature branch
299
- calls = [str(c) for c in mock_run.call_args_list]
300
- merge_call = [c for c in calls if "merge" in c]
301
- assert len(merge_call) > 0, "Should call git merge"
302
-
303
- def test_merge_deletes_patch_branch(self, tmp_path: Path) -> None:
304
- """AC6: merge_patch_branch should delete the patch branch after merge."""
305
- if not IMPORT_SUCCESS:
306
- pytest.skip("Module not implemented")
307
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
308
- mock_run.return_value = MagicMock(returncode=0)
309
- merge_patch_branch(
310
- patch_branch="patch/fix-script-1234567890",
311
- feature_branch="feat/MSSCI-12345-feature",
312
- repo_path=tmp_path,
313
- )
314
- # Should delete patch branch
315
- calls = [str(c) for c in mock_run.call_args_list]
316
- delete_call = [c for c in calls if "branch" in c and "-d" in c]
317
- assert len(delete_call) > 0, "Should delete patch branch"
318
-
319
-
320
- class TestStateRestoration:
321
- """Tests for AC7: Original workflow state restored after merge."""
322
-
323
- @pytest.fixture
324
- def saved_state(self) -> dict[str, Any]:
325
- """Sample saved state."""
326
- return {
327
- "story_id": "MSSCI-12345",
328
- "workflow": "tdd",
329
- "phase": "green",
330
- "agent": "dev",
331
- "feature_branch": "feat/MSSCI-12345-feature",
332
- }
333
-
334
- def test_restore_returns_original_state(self, saved_state: dict) -> None:
335
- """AC7: restore_workflow_state should return original state."""
336
- if not IMPORT_SUCCESS:
337
- pytest.skip("Module not implemented")
338
- with patch("pennyfarthing_scripts.patch_mode.get_patch_stack") as mock_stack:
339
- state = PatchState(**saved_state)
340
- mock_stack.return_value.peek.return_value = state
341
- mock_stack.return_value.pop.return_value = state
342
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
343
- mock_run.return_value = MagicMock(returncode=0)
344
- result = restore_workflow_state()
345
- assert result["story_id"] == "MSSCI-12345"
346
- assert result["workflow"] == "tdd"
347
- assert result["phase"] == "green"
348
-
349
- def test_restore_checkouts_feature_branch(self, tmp_path: Path, saved_state: dict) -> None:
350
- """AC7: restore should checkout the original feature branch."""
351
- if not IMPORT_SUCCESS:
352
- pytest.skip("Module not implemented")
353
- with patch("pennyfarthing_scripts.patch_mode.get_patch_stack") as mock_stack:
354
- state = PatchState(**saved_state)
355
- mock_stack.return_value.peek.return_value = state
356
- mock_stack.return_value.pop.return_value = state
357
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
358
- mock_run.return_value = MagicMock(returncode=0)
359
- restore_workflow_state(repo_path=tmp_path)
360
- # Should checkout feature branch
361
- calls = [str(c) for c in mock_run.call_args_list]
362
- checkout_call = [c for c in calls if "checkout" in c and "feat/MSSCI-12345" in c]
363
- assert len(checkout_call) > 0
364
-
365
-
366
- class TestSessionPatches:
367
- """Tests for AC8: Session file includes patches: section for archive."""
368
-
369
- def test_log_patch_adds_to_session(self, tmp_path: Path) -> None:
370
- """AC8: log_patch_to_session should add patch to session file."""
371
- if not IMPORT_SUCCESS:
372
- pytest.skip("Module not implemented")
373
- session_file = tmp_path / ".session" / "MSSCI-12345-session.md"
374
- session_file.parent.mkdir(parents=True, exist_ok=True)
375
- session_file.write_text("""# Session: MSSCI-12345
376
-
377
- ## Patches
378
-
379
- <!-- Patches applied during this story will be logged here -->
380
- """)
381
-
382
- log_patch_to_session(
383
- session_file=session_file,
384
- description="fix broken script",
385
- commit_sha="abc1234",
386
- )
387
-
388
- content = session_file.read_text()
389
- assert "fix broken script" in content
390
- assert "abc1234" in content
391
-
392
- def test_log_patch_includes_timestamp(self, tmp_path: Path) -> None:
393
- """AC8: Patch log should include timestamp."""
394
- if not IMPORT_SUCCESS:
395
- pytest.skip("Module not implemented")
396
- session_file = tmp_path / ".session" / "MSSCI-12345-session.md"
397
- session_file.parent.mkdir(parents=True, exist_ok=True)
398
- session_file.write_text("""# Session: MSSCI-12345
399
-
400
- ## Patches
401
-
402
- <!-- Patches applied during this story will be logged here -->
403
- """)
404
-
405
- log_patch_to_session(
406
- session_file=session_file,
407
- description="fix script",
408
- commit_sha="abc1234",
409
- )
410
-
411
- content = session_file.read_text()
412
- # Should have a date in YYYY-MM-DD format
413
- import re
414
- assert re.search(r"\d{4}-\d{2}-\d{2}", content)
415
-
416
-
417
- class TestTirepumpIntegration:
418
- """Tests for AC9: Tirepump integration auto-handoff back to original agent."""
419
-
420
- def test_exit_patch_mode_returns_handoff_marker(self) -> None:
421
- """AC9: exit_patch_mode should return handoff marker for original agent."""
422
- if not IMPORT_SUCCESS:
423
- pytest.skip("Module not implemented")
424
- with patch("pennyfarthing_scripts.patch_mode.get_patch_stack") as mock_stack:
425
- mock_state = MagicMock()
426
- mock_state.agent = "dev"
427
- mock_state.story_id = "MSSCI-12345"
428
- mock_state.workflow = "tdd"
429
- mock_state.phase = "green"
430
- mock_state.feature_branch = "feat/test"
431
- mock_stack.return_value.peek.return_value = mock_state
432
- mock_stack.return_value.pop.return_value = mock_state
433
-
434
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
435
- mock_run.return_value = MagicMock(returncode=0)
436
- result = exit_patch_mode()
437
-
438
- # Should include handoff marker
439
- assert "handoff_marker" in result or hasattr(result, "handoff_marker")
440
- marker = result.get("handoff_marker") or result.handoff_marker
441
- assert "/dev" in marker or "dev" in marker
442
-
443
- def test_exit_preserves_relay_mode(self) -> None:
444
- """AC9: Exiting patch mode should preserve relay mode setting."""
445
- if not IMPORT_SUCCESS:
446
- pytest.skip("Module not implemented")
447
- # Relay mode should continue after patch completes
448
- with patch("pennyfarthing_scripts.patch_mode.get_patch_stack") as mock_stack:
449
- mock_state = MagicMock()
450
- mock_state.agent = "dev"
451
- mock_state.story_id = "MSSCI-12345"
452
- mock_state.workflow = "tdd"
453
- mock_state.phase = "green"
454
- mock_state.feature_branch = "feat/test"
455
- mock_stack.return_value.peek.return_value = mock_state
456
- mock_stack.return_value.pop.return_value = mock_state
457
-
458
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
459
- mock_run.return_value = MagicMock(returncode=0)
460
- result = exit_patch_mode()
461
- # Should not disable relay mode
462
- assert result.get("relay_mode_disabled") is not True
463
-
464
-
465
- class TestNestedPatches:
466
- """Tests for AC10: Nested patches supported (patch-stack is a stack)."""
467
-
468
- def test_patch_stack_supports_push(self, tmp_path: Path) -> None:
469
- """AC10: PatchStack should support push operation."""
470
- if not IMPORT_SUCCESS:
471
- pytest.skip("Module not implemented")
472
- stack = PatchStack(stack_file=tmp_path / ".session" / "patch-stack.yaml")
473
- state1 = PatchState(
474
- story_id="MSSCI-12345",
475
- workflow="tdd",
476
- phase="green",
477
- agent="dev",
478
- feature_branch="feat/MSSCI-12345-feature",
479
- )
480
- stack.push(state1)
481
- assert stack.depth() == 1
482
-
483
- def test_patch_stack_supports_pop(self, tmp_path: Path) -> None:
484
- """AC10: PatchStack should support pop operation."""
485
- if not IMPORT_SUCCESS:
486
- pytest.skip("Module not implemented")
487
- stack = PatchStack(stack_file=tmp_path / ".session" / "patch-stack.yaml")
488
- state1 = PatchState(
489
- story_id="MSSCI-12345",
490
- workflow="tdd",
491
- phase="green",
492
- agent="dev",
493
- feature_branch="feat/MSSCI-12345-feature",
494
- )
495
- stack.push(state1)
496
- popped = stack.pop()
497
- assert popped.story_id == "MSSCI-12345"
498
- assert stack.depth() == 0
499
-
500
- def test_patch_stack_is_lifo(self, tmp_path: Path) -> None:
501
- """AC10: PatchStack should be LIFO (last in, first out)."""
502
- if not IMPORT_SUCCESS:
503
- pytest.skip("Module not implemented")
504
- stack = PatchStack(stack_file=tmp_path / ".session" / "patch-stack.yaml")
505
- state1 = PatchState(
506
- story_id="MSSCI-12345",
507
- workflow="tdd",
508
- phase="green",
509
- agent="dev",
510
- feature_branch="feat/feature-1",
511
- )
512
- state2 = PatchState(
513
- story_id="MSSCI-12345",
514
- workflow="tdd",
515
- phase="green",
516
- agent="dev",
517
- feature_branch="patch/fix-1", # Nested patch
518
- )
519
- stack.push(state1)
520
- stack.push(state2)
521
-
522
- # Pop should return state2 first (LIFO)
523
- popped = stack.pop()
524
- assert popped.feature_branch == "patch/fix-1"
525
-
526
- # Then state1
527
- popped = stack.pop()
528
- assert popped.feature_branch == "feat/feature-1"
529
-
530
- def test_nested_patch_preserves_parent_state(self, tmp_path: Path) -> None:
531
- """AC10: Entering nested patch should preserve parent patch state."""
532
- if not IMPORT_SUCCESS:
533
- pytest.skip("Module not implemented")
534
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
535
- mock_run.return_value = MagicMock(returncode=0)
536
-
537
- # Enter first patch
538
- enter_patch_mode(
539
- description="fix first bug",
540
- story_id="MSSCI-12345",
541
- workflow="tdd",
542
- phase="green",
543
- agent="dev",
544
- feature_branch="feat/MSSCI-12345-feature",
545
- stack_file=tmp_path / ".session" / "patch-stack.yaml",
546
- )
547
-
548
- # Enter nested patch
549
- enter_patch_mode(
550
- description="fix second bug during first fix",
551
- story_id="MSSCI-12345",
552
- workflow="tdd",
553
- phase="green",
554
- agent="dev",
555
- feature_branch="patch/fix-first-bug-1234567890",
556
- stack_file=tmp_path / ".session" / "patch-stack.yaml",
557
- )
558
-
559
- stack = get_patch_stack(tmp_path / ".session" / "patch-stack.yaml")
560
- assert stack.depth() == 2
561
-
562
- def test_patch_stack_persists_to_file(self, tmp_path: Path) -> None:
563
- """AC10: PatchStack should persist state to patch-stack.yaml."""
564
- if not IMPORT_SUCCESS:
565
- pytest.skip("Module not implemented")
566
- stack_file = tmp_path / ".session" / "patch-stack.yaml"
567
- stack_file.parent.mkdir(parents=True, exist_ok=True)
568
-
569
- stack = PatchStack(stack_file=stack_file)
570
- state = PatchState(
571
- story_id="MSSCI-12345",
572
- workflow="tdd",
573
- phase="green",
574
- agent="dev",
575
- feature_branch="feat/feature-1",
576
- )
577
- stack.push(state)
578
-
579
- # File should exist with state
580
- assert stack_file.exists()
581
- content = yaml.safe_load(stack_file.read_text())
582
- assert len(content.get("stack", [])) == 1
583
-
584
- def test_is_in_patch_mode_detects_active_patch(self, tmp_path: Path) -> None:
585
- """AC10: is_in_patch_mode should return True when stack is non-empty."""
586
- if not IMPORT_SUCCESS:
587
- pytest.skip("Module not implemented")
588
- stack_file = tmp_path / ".session" / "patch-stack.yaml"
589
- stack_file.parent.mkdir(parents=True, exist_ok=True)
590
-
591
- # Initially not in patch mode
592
- assert not is_in_patch_mode(stack_file=stack_file)
593
-
594
- # After pushing, should be in patch mode
595
- stack = PatchStack(stack_file=stack_file)
596
- state = PatchState(
597
- story_id="MSSCI-12345",
598
- workflow="tdd",
599
- phase="green",
600
- agent="dev",
601
- feature_branch="feat/feature-1",
602
- )
603
- stack.push(state)
604
-
605
- assert is_in_patch_mode(stack_file=stack_file)
606
-
607
-
608
- class TestPatchStackFileLocation:
609
- """Tests for patch-stack.yaml file location."""
610
-
611
- def test_default_stack_file_in_session_dir(self) -> None:
612
- """Stack file should default to .session/patch-stack.yaml."""
613
- if not IMPORT_SUCCESS:
614
- pytest.skip("Module not implemented")
615
- stack = get_patch_stack()
616
- expected_suffix = Path(".session") / "patch-stack.yaml"
617
- assert str(stack.stack_file).endswith(str(expected_suffix))
618
-
619
-
620
- class TestEnterPatchModeIntegration:
621
- """Integration tests for enter_patch_mode function."""
622
-
623
- def test_enter_creates_branch_and_saves_state(self, tmp_path: Path) -> None:
624
- """enter_patch_mode should create branch and save state atomically."""
625
- if not IMPORT_SUCCESS:
626
- pytest.skip("Module not implemented")
627
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
628
- mock_run.return_value = MagicMock(returncode=0, stdout="patch/fix-bug-123")
629
-
630
- stack_file = tmp_path / ".session" / "patch-stack.yaml"
631
- result = enter_patch_mode(
632
- description="fix bug",
633
- story_id="MSSCI-12345",
634
- workflow="tdd",
635
- phase="green",
636
- agent="dev",
637
- feature_branch="feat/MSSCI-12345-feature",
638
- repo_path=tmp_path,
639
- stack_file=stack_file,
640
- )
641
-
642
- # Should have created branch
643
- assert "patch_branch" in result or hasattr(result, "patch_branch")
644
-
645
- # Should have saved state
646
- assert stack_file.exists()
647
-
648
- def test_enter_fails_gracefully_on_git_error(self, tmp_path: Path) -> None:
649
- """enter_patch_mode should fail gracefully if git fails."""
650
- if not IMPORT_SUCCESS:
651
- pytest.skip("Module not implemented")
652
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
653
- mock_run.return_value = MagicMock(returncode=1, stderr="git error")
654
-
655
- with pytest.raises(Exception) as exc_info:
656
- enter_patch_mode(
657
- description="fix bug",
658
- story_id="MSSCI-12345",
659
- workflow="tdd",
660
- phase="green",
661
- agent="dev",
662
- feature_branch="feat/MSSCI-12345-feature",
663
- repo_path=tmp_path,
664
- )
665
-
666
- assert "git" in str(exc_info.value).lower()
667
-
668
-
669
- class TestExitPatchModeIntegration:
670
- """Integration tests for exit_patch_mode function."""
671
-
672
- def test_exit_merges_restores_and_cleans_up(self, tmp_path: Path) -> None:
673
- """exit_patch_mode should merge, restore state, and clean up."""
674
- if not IMPORT_SUCCESS:
675
- pytest.skip("Module not implemented")
676
-
677
- # Setup: create stack with saved state
678
- stack_file = tmp_path / ".session" / "patch-stack.yaml"
679
- stack_file.parent.mkdir(parents=True, exist_ok=True)
680
- stack = PatchStack(stack_file=stack_file)
681
- state = PatchState(
682
- story_id="MSSCI-12345",
683
- workflow="tdd",
684
- phase="green",
685
- agent="dev",
686
- feature_branch="feat/MSSCI-12345-feature",
687
- )
688
- stack.push(state)
689
-
690
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
691
- mock_run.return_value = MagicMock(returncode=0)
692
-
693
- result = exit_patch_mode(
694
- patch_branch="patch/fix-bug-123",
695
- repo_path=tmp_path,
696
- stack_file=stack_file,
697
- )
698
-
699
- # Should have merged
700
- calls = [str(c) for c in mock_run.call_args_list]
701
- assert any("merge" in c for c in calls)
702
-
703
- # Should have returned original state
704
- assert result["story_id"] == "MSSCI-12345"
705
-
706
- # Stack should be empty (reload from file to check)
707
- reloaded_stack = PatchStack(stack_file=stack_file)
708
- assert reloaded_stack.depth() == 0
709
-
710
- def test_exit_preserves_state_on_merge_failure(self, tmp_path: Path) -> None:
711
- """exit_patch_mode should preserve state if git merge fails."""
712
- if not IMPORT_SUCCESS:
713
- pytest.skip("Module not implemented")
714
-
715
- # Setup: create stack with saved state
716
- stack_file = tmp_path / ".session" / "patch-stack.yaml"
717
- stack_file.parent.mkdir(parents=True, exist_ok=True)
718
- stack = PatchStack(stack_file=stack_file)
719
- state = PatchState(
720
- story_id="MSSCI-12345",
721
- workflow="tdd",
722
- phase="green",
723
- agent="dev",
724
- feature_branch="feat/MSSCI-12345-feature",
725
- )
726
- stack.push(state)
727
-
728
- # Mock git to fail on merge (second call)
729
- call_count = [0]
730
-
731
- def mock_run_side_effect(*args, **kwargs):
732
- call_count[0] += 1
733
- if call_count[0] == 1: # checkout succeeds
734
- return MagicMock(returncode=0)
735
- else: # merge fails
736
- return MagicMock(returncode=1, stderr="merge conflict")
737
-
738
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run", side_effect=mock_run_side_effect):
739
- with pytest.raises(RuntimeError) as exc_info:
740
- exit_patch_mode(
741
- patch_branch="patch/fix-bug-123",
742
- repo_path=tmp_path,
743
- stack_file=stack_file,
744
- )
745
-
746
- assert "merge" in str(exc_info.value).lower()
747
-
748
- # State should be PRESERVED (not lost)
749
- reloaded_stack = PatchStack(stack_file=stack_file)
750
- assert reloaded_stack.depth() == 1, "State should be preserved on merge failure"
751
- preserved = reloaded_stack.peek()
752
- assert preserved.story_id == "MSSCI-12345"
753
-
754
- def test_restore_preserves_state_on_checkout_failure(self, tmp_path: Path) -> None:
755
- """restore_workflow_state should preserve state if git checkout fails."""
756
- if not IMPORT_SUCCESS:
757
- pytest.skip("Module not implemented")
758
-
759
- # Setup: create stack with saved state
760
- stack_file = tmp_path / ".session" / "patch-stack.yaml"
761
- stack_file.parent.mkdir(parents=True, exist_ok=True)
762
- stack = PatchStack(stack_file=stack_file)
763
- state = PatchState(
764
- story_id="MSSCI-12345",
765
- workflow="tdd",
766
- phase="green",
767
- agent="dev",
768
- feature_branch="feat/MSSCI-12345-feature",
769
- )
770
- stack.push(state)
771
-
772
- with patch("pennyfarthing_scripts.patch_mode.subprocess.run") as mock_run:
773
- mock_run.return_value = MagicMock(returncode=1, stderr="branch does not exist")
774
-
775
- with pytest.raises(RuntimeError) as exc_info:
776
- restore_workflow_state(
777
- repo_path=tmp_path,
778
- stack_file=stack_file,
779
- )
780
-
781
- assert "checkout" in str(exc_info.value).lower()
782
-
783
- # State should be PRESERVED (not lost)
784
- reloaded_stack = PatchStack(stack_file=stack_file)
785
- assert reloaded_stack.depth() == 1, "State should be preserved on checkout failure"
786
- preserved = reloaded_stack.peek()
787
- assert preserved.story_id == "MSSCI-12345"
788
-
789
-
790
- class TestDescriptionValidation:
791
- """Tests for description validation in create_patch_branch."""
792
-
793
- def test_empty_description_raises_error(self) -> None:
794
- """create_patch_branch should reject empty description."""
795
- if not IMPORT_SUCCESS:
796
- pytest.skip("Module not implemented")
797
-
798
- with pytest.raises(ValueError) as exc_info:
799
- create_patch_branch(
800
- description="",
801
- feature_branch="feat/test",
802
- )
803
-
804
- assert "empty" in str(exc_info.value).lower()
805
-
806
- def test_whitespace_only_description_raises_error(self) -> None:
807
- """create_patch_branch should reject whitespace-only description."""
808
- if not IMPORT_SUCCESS:
809
- pytest.skip("Module not implemented")
810
-
811
- with pytest.raises(ValueError) as exc_info:
812
- create_patch_branch(
813
- description=" ",
814
- feature_branch="feat/test",
815
- )
816
-
817
- assert "empty" in str(exc_info.value).lower()
818
-
819
- def test_special_chars_only_description_raises_error(self) -> None:
820
- """create_patch_branch should reject description that sanitizes to empty."""
821
- if not IMPORT_SUCCESS:
822
- pytest.skip("Module not implemented")
823
-
824
- with pytest.raises(ValueError) as exc_info:
825
- create_patch_branch(
826
- description="!!!",
827
- feature_branch="feat/test",
828
- )
829
-
830
- assert "empty" in str(exc_info.value).lower()