@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,1090 +0,0 @@
1
- """Tests for tiered context injection system.
2
-
3
- Tests the --tier argument and tier-specific component loading for the prime command.
4
-
5
- Story: MSSCI-12797 - Python Prime Tier Support
6
- Acceptance Criteria:
7
- - AC1: --tier argument with choices FULL, REFRESH, HANDOFF, MINIMAL
8
- - AC2: Tier-specific component loading per specification
9
- - AC3: Compressed persona format (~100 tokens vs ~300 full)
10
- - AC4: Default behavior unchanged (FULL when --tier not specified)
11
- - AC5: Unit tests for all tier loading paths with >90% coverage
12
- - AC6: Token reduction verified: REFRESH ~600, HANDOFF ~700, MINIMAL ~200
13
- """
14
-
15
- import pytest
16
- from pathlib import Path
17
- from unittest.mock import patch, MagicMock
18
- import yaml
19
-
20
-
21
- # =============================================================================
22
- # AC1: --tier CLI Argument Tests
23
- # =============================================================================
24
-
25
-
26
- class TestTierCLIArgument:
27
- """Tests for --tier CLI argument (AC1)."""
28
-
29
- def test_tier_argument_accepts_full(self, tmp_path: Path) -> None:
30
- """Test --tier FULL is accepted."""
31
- from pennyfarthing_scripts.prime.cli import main
32
-
33
- pf_dir = tmp_path / ".pennyfarthing"
34
- pf_dir.mkdir()
35
- agents_dir = pf_dir / "agents"
36
- agents_dir.mkdir()
37
- (agents_dir / "dev.md").write_text("# Dev Agent")
38
-
39
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
40
- result = main(["--agent", "dev", "--tier", "FULL", "--no-workflow", "--no-register"])
41
-
42
- assert result == 0
43
-
44
- def test_tier_argument_accepts_refresh(self, tmp_path: Path) -> None:
45
- """Test --tier REFRESH is accepted."""
46
- from pennyfarthing_scripts.prime.cli import main
47
-
48
- pf_dir = tmp_path / ".pennyfarthing"
49
- pf_dir.mkdir()
50
- agents_dir = pf_dir / "agents"
51
- agents_dir.mkdir()
52
- (agents_dir / "dev.md").write_text("# Dev Agent")
53
-
54
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
55
- result = main(["--agent", "dev", "--tier", "REFRESH", "--no-workflow", "--no-register"])
56
-
57
- assert result == 0
58
-
59
- def test_tier_argument_accepts_handoff(self, tmp_path: Path) -> None:
60
- """Test --tier HANDOFF is accepted."""
61
- from pennyfarthing_scripts.prime.cli import main
62
-
63
- pf_dir = tmp_path / ".pennyfarthing"
64
- pf_dir.mkdir()
65
- agents_dir = pf_dir / "agents"
66
- agents_dir.mkdir()
67
- (agents_dir / "dev.md").write_text("# Dev Agent")
68
-
69
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
70
- result = main(["--agent", "dev", "--tier", "HANDOFF", "--no-workflow", "--no-register"])
71
-
72
- assert result == 0
73
-
74
- def test_tier_argument_accepts_minimal(self, tmp_path: Path) -> None:
75
- """Test --tier MINIMAL is accepted."""
76
- from pennyfarthing_scripts.prime.cli import main
77
-
78
- pf_dir = tmp_path / ".pennyfarthing"
79
- pf_dir.mkdir()
80
- agents_dir = pf_dir / "agents"
81
- agents_dir.mkdir()
82
- (agents_dir / "dev.md").write_text("# Dev Agent")
83
-
84
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
85
- result = main(["--agent", "dev", "--tier", "MINIMAL", "--no-workflow", "--no-register"])
86
-
87
- assert result == 0
88
-
89
- def test_tier_argument_rejects_invalid_value(self, tmp_path: Path) -> None:
90
- """Test --tier rejects invalid values."""
91
- from pennyfarthing_scripts.prime.cli import main
92
-
93
- with pytest.raises(SystemExit) as exc_info:
94
- main(["--tier", "INVALID"])
95
-
96
- # argparse exits with 2 for invalid arguments
97
- assert exc_info.value.code == 2
98
-
99
- def test_tier_argument_case_insensitive(self, tmp_path: Path) -> None:
100
- """Test --tier accepts lowercase values."""
101
- from pennyfarthing_scripts.prime.cli import main
102
-
103
- pf_dir = tmp_path / ".pennyfarthing"
104
- pf_dir.mkdir()
105
- agents_dir = pf_dir / "agents"
106
- agents_dir.mkdir()
107
- (agents_dir / "dev.md").write_text("# Dev Agent")
108
-
109
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
110
- # Should accept lowercase
111
- result = main(["--agent", "dev", "--tier", "full", "--no-workflow", "--no-register"])
112
-
113
- assert result == 0
114
-
115
-
116
- # =============================================================================
117
- # AC2: Tier-Specific Component Loading Tests
118
- # =============================================================================
119
-
120
-
121
- class TestTierComponentLoading:
122
- """Tests for tier-specific component loading (AC2)."""
123
-
124
- def test_full_tier_loads_all_components(self, tmp_path: Path, capsys) -> None:
125
- """Test FULL tier loads all 10 components."""
126
- from pennyfarthing_scripts.prime.cli import prime
127
-
128
- # Setup complete project structure
129
- self._setup_full_project(tmp_path)
130
-
131
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
132
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
133
- result = prime(
134
- agent_name="dev",
135
- tier="FULL",
136
- no_workflow=True,
137
- no_register=True,
138
- project_root=tmp_path,
139
- )
140
-
141
- assert result == 0
142
- captured = capsys.readouterr()
143
-
144
- # FULL should include all components
145
- assert "# Dev Agent" in captured.out # agent-definition
146
- assert "# Agent Behavior Guide" in captured.out # behavior-guide
147
- assert "patterns.md" in captured.out # sidecars
148
-
149
- def test_refresh_tier_loads_dynamic_only(self, tmp_path: Path, capsys) -> None:
150
- """Test REFRESH tier loads only dynamic state (~600 tokens)."""
151
- from pennyfarthing_scripts.prime.cli import prime
152
-
153
- # Setup
154
- self._setup_full_project(tmp_path)
155
-
156
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
157
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
158
- result = prime(
159
- agent_name="dev",
160
- tier="REFRESH",
161
- no_register=True,
162
- project_root=tmp_path,
163
- )
164
-
165
- assert result == 0
166
- captured = capsys.readouterr()
167
-
168
- # REFRESH should include:
169
- # - workflow-state
170
- # - sprint-context
171
- # - session-header
172
- # - Note about full context in history
173
- assert "Sprint" in captured.out # sprint-context
174
- assert "Full context already in conversation history" in captured.out
175
-
176
- # REFRESH should NOT include:
177
- # - agent-definition
178
- # - behavior-guide
179
- # - sidecars
180
- assert "# Dev Agent" not in captured.out
181
- assert "# Agent Behavior Guide" not in captured.out
182
-
183
- def test_handoff_tier_loads_agent_essentials(self, tmp_path: Path, capsys) -> None:
184
- """Test HANDOFF tier loads agent definition + compressed persona (~700 tokens)."""
185
- from pennyfarthing_scripts.prime.cli import prime
186
-
187
- # Setup
188
- self._setup_full_project(tmp_path)
189
-
190
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
191
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
192
- result = prime(
193
- agent_name="dev",
194
- tier="HANDOFF",
195
- no_register=True,
196
- project_root=tmp_path,
197
- )
198
-
199
- assert result == 0
200
- captured = capsys.readouterr()
201
-
202
- # HANDOFF should include:
203
- # - workflow-state
204
- # - agent-definition
205
- # - persona-compressed
206
- # - Note about behavior guides in history
207
- assert "# Dev Agent" in captured.out
208
- assert "Behavior guides in conversation history" in captured.out
209
-
210
- # HANDOFF should use compressed persona, not full
211
- # Compressed format: <persona agent="dev" character="...">
212
- assert "<persona" in captured.out or "persona-compressed" in captured.out
213
-
214
- # HANDOFF should NOT include:
215
- # - behavior-guide
216
- # - sidecars
217
- # - domain-docs
218
- assert "# Agent Behavior Guide" not in captured.out
219
-
220
- def test_minimal_tier_loads_workflow_only(self, tmp_path: Path, capsys) -> None:
221
- """Test MINIMAL tier loads only workflow state (~200 tokens)."""
222
- from pennyfarthing_scripts.prime.cli import prime
223
-
224
- # Setup
225
- self._setup_full_project(tmp_path)
226
-
227
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
228
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
229
- result = prime(
230
- agent_name="dev",
231
- tier="MINIMAL",
232
- no_register=True,
233
- project_root=tmp_path,
234
- )
235
-
236
- assert result == 0
237
- captured = capsys.readouterr()
238
-
239
- # MINIMAL should include:
240
- # - workflow-state
241
- # - Minimal context note
242
- assert "Minimal context" in captured.out or "conversation history" in captured.out
243
-
244
- # MINIMAL should NOT include:
245
- # - agent-definition
246
- # - persona
247
- # - behavior-guide
248
- # - sprint-context
249
- # - sidecars
250
- assert "# Dev Agent" not in captured.out
251
- assert "# Agent Behavior Guide" not in captured.out
252
- assert "patterns.md" not in captured.out
253
-
254
- def _setup_full_project(self, tmp_path: Path) -> None:
255
- """Set up a complete project structure for testing."""
256
- # .pennyfarthing directory
257
- pf_dir = tmp_path / ".pennyfarthing"
258
- pf_dir.mkdir()
259
-
260
- # Agent definition
261
- agents_dir = pf_dir / "agents"
262
- agents_dir.mkdir()
263
- (agents_dir / "dev.md").write_text("# Dev Agent\n\nDeveloper agent definition.")
264
-
265
- # Behavior guide
266
- guides_dir = pf_dir / "guides"
267
- guides_dir.mkdir()
268
- (guides_dir / "agent-behavior.md").write_text("# Agent Behavior Guide\n\nShared protocols.")
269
-
270
- # Sidecars
271
- sidecar_dir = pf_dir / "sidecars" / "dev"
272
- sidecar_dir.mkdir(parents=True)
273
- (sidecar_dir / "patterns.md").write_text("# Patterns\n\nDev patterns.")
274
-
275
- # Theme config
276
- (pf_dir / "config.local.yaml").write_text(yaml.dump({"theme": "test-theme"}))
277
-
278
- # Theme file
279
- themes_dir = pf_dir / "personas" / "themes"
280
- themes_dir.mkdir(parents=True)
281
- (themes_dir / "test-theme.yaml").write_text(yaml.dump({
282
- "theme": {"name": "Test Theme", "user_title": "Developer"},
283
- "agents": {
284
- "dev": {
285
- "character": "Test Developer",
286
- "style": "Practical and efficient",
287
- "role": "Implementation specialist",
288
- "quote": "Ship it!",
289
- }
290
- }
291
- }))
292
-
293
- # Sprint
294
- sprint_dir = tmp_path / "sprint"
295
- sprint_dir.mkdir()
296
- (sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
297
- "sprint": {"number": 12, "goal": "Test sprint"},
298
- "epics": []
299
- }))
300
-
301
- # Session
302
- session_dir = tmp_path / ".session"
303
- session_dir.mkdir()
304
- (session_dir / "test-session.md").write_text("# Test Session\n\n- **Phase:** green")
305
-
306
-
307
- # =============================================================================
308
- # AC3: Compressed Persona Format Tests
309
- # =============================================================================
310
-
311
-
312
- class TestCompressedPersonaFormat:
313
- """Tests for compressed persona format (AC3)."""
314
-
315
- def test_compressed_persona_has_xml_structure(self, tmp_path: Path) -> None:
316
- """Test compressed persona uses XML format."""
317
- from pennyfarthing_scripts.prime.persona import format_persona_compressed
318
-
319
- # Import will fail until function is implemented
320
- from pennyfarthing_scripts.prime.models import Persona
321
-
322
- persona = Persona(
323
- character="Rosie the Riveter",
324
- style="Can-do wartime spirit, practical, determined",
325
- role="Implementation specialist",
326
- quote="We Can Do It!",
327
- )
328
-
329
- result = format_persona_compressed(persona, "test-theme", "dev")
330
-
331
- assert '<persona agent="dev"' in result
332
- assert 'character="Rosie the Riveter"' in result
333
- assert "</persona>" in result
334
-
335
- def test_compressed_persona_includes_voice(self, tmp_path: Path) -> None:
336
- """Test compressed persona includes voice element."""
337
- from pennyfarthing_scripts.prime.persona import format_persona_compressed
338
- from pennyfarthing_scripts.prime.models import Persona
339
-
340
- persona = Persona(
341
- character="Rosie the Riveter",
342
- style="Can-do wartime spirit, practical, determined",
343
- role="Implementation specialist",
344
- )
345
-
346
- result = format_persona_compressed(persona, "test-theme", "dev")
347
-
348
- assert "<voice>" in result
349
- assert "Can-do" in result
350
-
351
- def test_compressed_persona_includes_style(self, tmp_path: Path) -> None:
352
- """Test compressed persona includes style element."""
353
- from pennyfarthing_scripts.prime.persona import format_persona_compressed
354
- from pennyfarthing_scripts.prime.models import Persona
355
-
356
- persona = Persona(
357
- character="Rosie the Riveter",
358
- style="Direct, encouraging, efficiency-focused",
359
- role="Implementation specialist",
360
- )
361
-
362
- result = format_persona_compressed(persona, "test-theme", "dev")
363
-
364
- assert "<style>" in result
365
-
366
- def test_compressed_persona_includes_catchphrase_if_present(self, tmp_path: Path) -> None:
367
- """Test compressed persona includes catchphrase from quote."""
368
- from pennyfarthing_scripts.prime.persona import format_persona_compressed
369
- from pennyfarthing_scripts.prime.models import Persona
370
-
371
- persona = Persona(
372
- character="Rosie the Riveter",
373
- style="Practical",
374
- role="Dev",
375
- quote="We Can Do It!",
376
- )
377
-
378
- result = format_persona_compressed(persona, "test-theme", "dev")
379
-
380
- assert "<catchphrase>" in result
381
- assert "We Can Do It!" in result
382
-
383
- def test_compressed_persona_token_count(self, tmp_path: Path) -> None:
384
- """Test compressed persona is approximately 100 tokens (~400 chars)."""
385
- from pennyfarthing_scripts.prime.persona import format_persona_compressed
386
- from pennyfarthing_scripts.prime.models import Persona
387
-
388
- persona = Persona(
389
- character="Rosie the Riveter",
390
- style="Can-do wartime spirit, practical, determined",
391
- role="Implementation specialist",
392
- quote="We Can Do It!",
393
- )
394
-
395
- result = format_persona_compressed(persona, "test-theme", "dev")
396
-
397
- # Rough token estimate: ~4 chars per token
398
- # 100 tokens ≈ 400 chars
399
- # Allow some variance (50-600 chars for ~100 tokens)
400
- assert len(result) < 600, f"Compressed persona too long: {len(result)} chars"
401
- assert len(result) > 50, f"Compressed persona too short: {len(result)} chars"
402
-
403
- def test_full_persona_token_count(self, tmp_path: Path) -> None:
404
- """Test full persona is approximately 300 tokens (~1200 chars)."""
405
- from pennyfarthing_scripts.prime.persona import format_persona_output
406
- from pennyfarthing_scripts.prime.models import Persona, CrewMember
407
-
408
- persona = Persona(
409
- character="Rosie the Riveter",
410
- style="Can-do wartime spirit, practical, determined",
411
- role="Implementation specialist",
412
- quote="We Can Do It!",
413
- trait="Never gives up",
414
- motto="Victory through effort",
415
- )
416
- crew = [
417
- CrewMember(role="sm", character="Commander"),
418
- CrewMember(role="dev", character="Rosie"),
419
- ]
420
-
421
- result = format_persona_output(persona, "test-theme", "dev", crew, "Worker")
422
-
423
- # Full persona should be larger than compressed
424
- # ~300 tokens ≈ 1200 chars
425
- assert len(result) > 400, f"Full persona too short: {len(result)} chars"
426
-
427
-
428
- # =============================================================================
429
- # AC4: Default Behavior (Backward Compatibility) Tests
430
- # =============================================================================
431
-
432
-
433
- class TestDefaultBehavior:
434
- """Tests for default behavior / backward compatibility (AC4)."""
435
-
436
- def test_no_tier_argument_defaults_to_full(self, tmp_path: Path, capsys) -> None:
437
- """Test that omitting --tier defaults to FULL behavior."""
438
- from pennyfarthing_scripts.prime.cli import prime
439
-
440
- # Setup
441
- pf_dir = tmp_path / ".pennyfarthing"
442
- pf_dir.mkdir()
443
- agents_dir = pf_dir / "agents"
444
- agents_dir.mkdir()
445
- (agents_dir / "dev.md").write_text("# Dev Agent\n\nFull content here.")
446
-
447
- guides_dir = pf_dir / "guides"
448
- guides_dir.mkdir()
449
- (guides_dir / "agent-behavior.md").write_text("# Behavior Guide")
450
-
451
- sidecar_dir = pf_dir / "sidecars" / "dev"
452
- sidecar_dir.mkdir(parents=True)
453
- (sidecar_dir / "patterns.md").write_text("# Patterns")
454
-
455
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
456
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
457
- # No --tier argument
458
- result = prime(
459
- agent_name="dev",
460
- no_workflow=True,
461
- no_register=True,
462
- project_root=tmp_path,
463
- )
464
-
465
- assert result == 0
466
- captured = capsys.readouterr()
467
-
468
- # Should behave like FULL tier - include all components
469
- assert "# Dev Agent" in captured.out
470
- assert "# Behavior Guide" in captured.out
471
- assert "patterns.md" in captured.out
472
-
473
- def test_explicit_full_tier_matches_default(self, tmp_path: Path, capsys) -> None:
474
- """Test that --tier FULL produces same output as default."""
475
- from pennyfarthing_scripts.prime.cli import prime
476
-
477
- # Setup
478
- pf_dir = tmp_path / ".pennyfarthing"
479
- pf_dir.mkdir()
480
- agents_dir = pf_dir / "agents"
481
- agents_dir.mkdir()
482
- (agents_dir / "dev.md").write_text("# Dev Agent")
483
-
484
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
485
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
486
- # Run without tier
487
- result1 = prime(
488
- agent_name="dev",
489
- no_workflow=True,
490
- no_register=True,
491
- no_persona=True,
492
- project_root=tmp_path,
493
- )
494
- output1 = capsys.readouterr().out
495
-
496
- # Run with explicit FULL
497
- result2 = prime(
498
- agent_name="dev",
499
- tier="FULL",
500
- no_workflow=True,
501
- no_register=True,
502
- no_persona=True,
503
- project_root=tmp_path,
504
- )
505
- output2 = capsys.readouterr().out
506
-
507
- assert result1 == result2 == 0
508
- assert output1 == output2
509
-
510
- def test_existing_flags_still_work_with_tier(self, tmp_path: Path, capsys) -> None:
511
- """Test existing flags (--quiet, --json, etc.) work with --tier."""
512
- from pennyfarthing_scripts.prime.cli import prime
513
- import json
514
-
515
- # Setup
516
- pf_dir = tmp_path / ".pennyfarthing"
517
- pf_dir.mkdir()
518
- agents_dir = pf_dir / "agents"
519
- agents_dir.mkdir()
520
- (agents_dir / "dev.md").write_text("# Dev Agent")
521
-
522
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
523
- result = prime(
524
- agent_name="dev",
525
- tier="REFRESH",
526
- json_output=True,
527
- no_workflow=True,
528
- no_register=True,
529
- no_persona=True,
530
- project_root=tmp_path,
531
- )
532
-
533
- assert result == 0
534
- captured = capsys.readouterr()
535
-
536
- # Should be valid JSON
537
- data = json.loads(captured.out)
538
- assert "tier" in data or "agent_name" in data
539
-
540
-
541
- # =============================================================================
542
- # AC5: Coverage Tests (All Tier Loading Paths)
543
- # =============================================================================
544
-
545
-
546
- class TestTierLoadingPaths:
547
- """Tests for all tier loading paths (AC5)."""
548
-
549
- def test_full_tier_with_all_options(self, tmp_path: Path) -> None:
550
- """Test FULL tier with all context sources available."""
551
- from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
552
-
553
- # Setup complete project
554
- self._setup_complete_project(tmp_path)
555
-
556
- components = load_tier_components(
557
- tier=ContextTier.FULL,
558
- agent_name="dev",
559
- project_root=tmp_path,
560
- )
561
-
562
- # Should return all component types
563
- assert "workflow_state" in components
564
- assert "agent_definition" in components
565
- assert "persona" in components
566
- assert "behavior_guide" in components
567
- assert "sprint_context" in components
568
- assert "sidecars" in components
569
-
570
- def test_full_tier_with_missing_optional(self, tmp_path: Path) -> None:
571
- """Test FULL tier gracefully handles missing optional components."""
572
- from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
573
-
574
- # Minimal setup - only agent definition
575
- pf_dir = tmp_path / ".pennyfarthing"
576
- pf_dir.mkdir()
577
- agents_dir = pf_dir / "agents"
578
- agents_dir.mkdir()
579
- (agents_dir / "dev.md").write_text("# Dev Agent")
580
-
581
- components = load_tier_components(
582
- tier=ContextTier.FULL,
583
- agent_name="dev",
584
- project_root=tmp_path,
585
- )
586
-
587
- # Should have agent definition, gracefully handle missing others
588
- assert components.get("agent_definition") is not None
589
- # Missing components should be None or empty, not raise exceptions
590
-
591
- def test_refresh_tier_components(self, tmp_path: Path) -> None:
592
- """Test REFRESH tier returns correct component set."""
593
- from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
594
-
595
- self._setup_complete_project(tmp_path)
596
-
597
- components = load_tier_components(
598
- tier=ContextTier.REFRESH,
599
- agent_name="dev",
600
- project_root=tmp_path,
601
- )
602
-
603
- # REFRESH should include
604
- assert "workflow_state" in components
605
- assert "sprint_context" in components
606
- assert "session_header" in components
607
-
608
- # REFRESH should NOT include
609
- assert "agent_definition" not in components or components.get("agent_definition") is None
610
- assert "behavior_guide" not in components or components.get("behavior_guide") is None
611
- assert "sidecars" not in components or components.get("sidecars") is None
612
-
613
- def test_handoff_tier_components(self, tmp_path: Path) -> None:
614
- """Test HANDOFF tier returns correct component set."""
615
- from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
616
-
617
- self._setup_complete_project(tmp_path)
618
-
619
- components = load_tier_components(
620
- tier=ContextTier.HANDOFF,
621
- agent_name="dev",
622
- project_root=tmp_path,
623
- )
624
-
625
- # HANDOFF should include
626
- assert "workflow_state" in components
627
- assert "agent_definition" in components
628
- assert "persona_compressed" in components
629
-
630
- # HANDOFF should NOT include
631
- assert "behavior_guide" not in components or components.get("behavior_guide") is None
632
- assert "sidecars" not in components or components.get("sidecars") is None
633
-
634
- def test_minimal_tier_components(self, tmp_path: Path) -> None:
635
- """Test MINIMAL tier returns minimal component set."""
636
- from pennyfarthing_scripts.prime.tiers import load_tier_components, ContextTier
637
-
638
- self._setup_complete_project(tmp_path)
639
-
640
- components = load_tier_components(
641
- tier=ContextTier.MINIMAL,
642
- agent_name="dev",
643
- project_root=tmp_path,
644
- )
645
-
646
- # MINIMAL should include only workflow state
647
- assert "workflow_state" in components
648
-
649
- # MINIMAL should NOT include anything else
650
- assert "agent_definition" not in components or components.get("agent_definition") is None
651
- assert "persona" not in components or components.get("persona") is None
652
- assert "behavior_guide" not in components or components.get("behavior_guide") is None
653
- assert "sidecars" not in components or components.get("sidecars") is None
654
-
655
- def test_tier_enum_values(self) -> None:
656
- """Test ContextTier enum has all required values."""
657
- from pennyfarthing_scripts.prime.tiers import ContextTier
658
-
659
- assert hasattr(ContextTier, "FULL")
660
- assert hasattr(ContextTier, "REFRESH")
661
- assert hasattr(ContextTier, "HANDOFF")
662
- assert hasattr(ContextTier, "MINIMAL")
663
-
664
- def test_tier_from_string(self) -> None:
665
- """Test converting string to ContextTier."""
666
- from pennyfarthing_scripts.prime.tiers import ContextTier, tier_from_string
667
-
668
- assert tier_from_string("FULL") == ContextTier.FULL
669
- assert tier_from_string("REFRESH") == ContextTier.REFRESH
670
- assert tier_from_string("HANDOFF") == ContextTier.HANDOFF
671
- assert tier_from_string("MINIMAL") == ContextTier.MINIMAL
672
-
673
- # Case insensitive
674
- assert tier_from_string("full") == ContextTier.FULL
675
- assert tier_from_string("Refresh") == ContextTier.REFRESH
676
-
677
- def _setup_complete_project(self, tmp_path: Path) -> None:
678
- """Set up a complete project for component testing."""
679
- pf_dir = tmp_path / ".pennyfarthing"
680
- pf_dir.mkdir()
681
-
682
- # Agent
683
- agents_dir = pf_dir / "agents"
684
- agents_dir.mkdir()
685
- (agents_dir / "dev.md").write_text("# Dev Agent")
686
-
687
- # Guides
688
- guides_dir = pf_dir / "guides"
689
- guides_dir.mkdir()
690
- (guides_dir / "agent-behavior.md").write_text("# Behavior")
691
-
692
- # Sidecars
693
- sidecar_dir = pf_dir / "sidecars" / "dev"
694
- sidecar_dir.mkdir(parents=True)
695
- (sidecar_dir / "patterns.md").write_text("# Patterns")
696
-
697
- # Theme
698
- (pf_dir / "config.local.yaml").write_text(yaml.dump({"theme": "test"}))
699
- themes_dir = pf_dir / "personas" / "themes"
700
- themes_dir.mkdir(parents=True)
701
- (themes_dir / "test.yaml").write_text(yaml.dump({
702
- "agents": {"dev": {"character": "Dev", "style": "s", "role": "r"}}
703
- }))
704
-
705
- # Sprint
706
- sprint_dir = tmp_path / "sprint"
707
- sprint_dir.mkdir()
708
- (sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
709
- "sprint": {"number": 12, "goal": "Test"},
710
- "epics": []
711
- }))
712
-
713
- # Session
714
- session_dir = tmp_path / ".session"
715
- session_dir.mkdir()
716
- (session_dir / "test-session.md").write_text("# Session\n\n- **Phase:** green")
717
-
718
-
719
- # =============================================================================
720
- # AC6: Token Reduction Verification Tests
721
- # =============================================================================
722
-
723
-
724
- class TestTokenReduction:
725
- """Tests for token reduction verification (AC6)."""
726
-
727
- def test_refresh_tier_under_800_tokens(self, tmp_path: Path, capsys) -> None:
728
- """Test REFRESH tier output is under 800 tokens (~3200 chars)."""
729
- from pennyfarthing_scripts.prime.cli import prime
730
-
731
- # Setup with realistic content
732
- self._setup_realistic_project(tmp_path)
733
-
734
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
735
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
736
- result = prime(
737
- agent_name="dev",
738
- tier="REFRESH",
739
- no_register=True,
740
- project_root=tmp_path,
741
- )
742
-
743
- assert result == 0
744
- captured = capsys.readouterr()
745
-
746
- # ~600 tokens ≈ 2400 chars, allow up to 800 tokens ≈ 3200 chars
747
- assert len(captured.out) < 3200, f"REFRESH tier too large: {len(captured.out)} chars (~{len(captured.out)//4} tokens)"
748
-
749
- def test_handoff_tier_under_900_tokens(self, tmp_path: Path, capsys) -> None:
750
- """Test HANDOFF tier output is under 900 tokens (~3600 chars)."""
751
- from pennyfarthing_scripts.prime.cli import prime
752
-
753
- # Setup with realistic content
754
- self._setup_realistic_project(tmp_path)
755
-
756
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
757
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
758
- result = prime(
759
- agent_name="dev",
760
- tier="HANDOFF",
761
- no_register=True,
762
- project_root=tmp_path,
763
- )
764
-
765
- assert result == 0
766
- captured = capsys.readouterr()
767
-
768
- # ~700 tokens ≈ 2800 chars, allow up to 900 tokens ≈ 3600 chars
769
- assert len(captured.out) < 3600, f"HANDOFF tier too large: {len(captured.out)} chars (~{len(captured.out)//4} tokens)"
770
-
771
- def test_minimal_tier_under_300_tokens(self, tmp_path: Path, capsys) -> None:
772
- """Test MINIMAL tier output is under 300 tokens (~1200 chars)."""
773
- from pennyfarthing_scripts.prime.cli import prime
774
-
775
- # Setup with realistic content
776
- self._setup_realistic_project(tmp_path)
777
-
778
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
779
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
780
- result = prime(
781
- agent_name="dev",
782
- tier="MINIMAL",
783
- no_register=True,
784
- project_root=tmp_path,
785
- )
786
-
787
- assert result == 0
788
- captured = capsys.readouterr()
789
-
790
- # ~200 tokens ≈ 800 chars, allow up to 300 tokens ≈ 1200 chars
791
- assert len(captured.out) < 1200, f"MINIMAL tier too large: {len(captured.out)} chars (~{len(captured.out)//4} tokens)"
792
-
793
- def test_full_tier_approximately_4000_tokens(self, tmp_path: Path, capsys) -> None:
794
- """Test FULL tier output is approximately 4000 tokens (~16000 chars)."""
795
- from pennyfarthing_scripts.prime.cli import prime
796
-
797
- # Setup with realistic content
798
- self._setup_realistic_project(tmp_path)
799
-
800
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
801
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
802
- result = prime(
803
- agent_name="dev",
804
- tier="FULL",
805
- no_register=True,
806
- project_root=tmp_path,
807
- )
808
-
809
- assert result == 0
810
- captured = capsys.readouterr()
811
-
812
- # FULL should be significantly larger than other tiers
813
- # At minimum, should be larger than HANDOFF limit
814
- assert len(captured.out) > 3600, f"FULL tier too small: {len(captured.out)} chars"
815
-
816
- def test_tier_reduction_ratio(self, tmp_path: Path, capsys) -> None:
817
- """Test that reduced tiers are significantly smaller than FULL."""
818
- from pennyfarthing_scripts.prime.cli import prime
819
-
820
- self._setup_realistic_project(tmp_path)
821
-
822
- sizes = {}
823
- for tier in ["FULL", "REFRESH", "HANDOFF", "MINIMAL"]:
824
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
825
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
826
- prime(
827
- agent_name="dev",
828
- tier=tier,
829
- no_register=True,
830
- project_root=tmp_path,
831
- )
832
- sizes[tier] = len(capsys.readouterr().out)
833
-
834
- # REFRESH should be <20% of FULL
835
- assert sizes["REFRESH"] < sizes["FULL"] * 0.20, \
836
- f"REFRESH not reduced enough: {sizes['REFRESH']}/{sizes['FULL']} = {sizes['REFRESH']/sizes['FULL']:.1%}"
837
-
838
- # HANDOFF should be <25% of FULL
839
- assert sizes["HANDOFF"] < sizes["FULL"] * 0.25, \
840
- f"HANDOFF not reduced enough: {sizes['HANDOFF']}/{sizes['FULL']} = {sizes['HANDOFF']/sizes['FULL']:.1%}"
841
-
842
- # MINIMAL should be <10% of FULL
843
- assert sizes["MINIMAL"] < sizes["FULL"] * 0.10, \
844
- f"MINIMAL not reduced enough: {sizes['MINIMAL']}/{sizes['FULL']} = {sizes['MINIMAL']/sizes['FULL']:.1%}"
845
-
846
- def _setup_realistic_project(self, tmp_path: Path) -> None:
847
- """Set up a realistic project with typical content sizes."""
848
- pf_dir = tmp_path / ".pennyfarthing"
849
- pf_dir.mkdir()
850
-
851
- # Agent definition (~400 tokens = ~1600 chars)
852
- agents_dir = pf_dir / "agents"
853
- agents_dir.mkdir()
854
- (agents_dir / "dev.md").write_text("""# Developer Agent
855
-
856
- <role>
857
- Feature implementation, bug fixes, code quality
858
- </role>
859
-
860
- <critical>
861
- - Write tests before implementation
862
- - Follow existing patterns
863
- - Keep changes focused
864
- </critical>
865
-
866
- <workflow>
867
- 1. Read story context from session
868
- 2. Implement to make tests pass
869
- 3. Refactor if needed
870
- 4. Hand off to reviewer
871
- </workflow>
872
-
873
- <skills>
874
- - `/testing` - Run tests
875
- - `/dev-patterns` - Common patterns
876
- </skills>
877
- """ + ("Additional context. " * 50))
878
-
879
- # Behavior guide (~800 tokens = ~3200 chars)
880
- guides_dir = pf_dir / "guides"
881
- guides_dir.mkdir()
882
- (guides_dir / "agent-behavior.md").write_text("""# Agent Behavior Guide
883
-
884
- <critical>
885
- Session file is source of truth.
886
- Never run tests directly.
887
- Always emit handoff marker.
888
- </critical>
889
-
890
- ## Workflow Reference
891
-
892
- Standard: SM → TEA → Dev → Reviewer → SM
893
-
894
- ## Skills
895
-
896
- - `/sprint` - Sprint management
897
- - `/testing` - Test commands
898
- - `/jira` - Jira operations
899
-
900
- ## Efficiency
901
-
902
- - Parallelize independent operations
903
- - Use subagents for specialized tasks
904
- - Batch bash commands with &&
905
- """ + ("Detailed behavior guidance. " * 80))
906
-
907
- # Sidecars (~1200 tokens = ~4800 chars)
908
- sidecar_dir = pf_dir / "sidecars" / "dev"
909
- sidecar_dir.mkdir(parents=True)
910
- (sidecar_dir / "patterns.md").write_text("""# Dev Patterns
911
-
912
- ## Common Patterns
913
-
914
- ### Error Handling
915
- ```typescript
916
- try {
917
- await operation();
918
- } catch (error) {
919
- logger.error('Operation failed', { error });
920
- throw new OperationError(error);
921
- }
922
- ```
923
-
924
- ### Testing
925
- ```typescript
926
- describe('Component', () => {
927
- it('should handle edge case', () => {
928
- expect(fn(null)).toBeUndefined();
929
- });
930
- });
931
- ```
932
- """ + ("Pattern documentation. " * 100))
933
-
934
- (sidecar_dir / "gotchas.md").write_text("""# Dev Gotchas
935
-
936
- 1. Always read before write
937
- 2. Check symlinks before git add
938
- 3. Run tests before handoff
939
- """ + ("Gotcha details. " * 50))
940
-
941
- # Theme (~300 tokens = ~1200 chars for full persona)
942
- (pf_dir / "config.local.yaml").write_text(yaml.dump({"theme": "test-theme"}))
943
- themes_dir = pf_dir / "personas" / "themes"
944
- themes_dir.mkdir(parents=True)
945
- (themes_dir / "test-theme.yaml").write_text(yaml.dump({
946
- "theme": {"name": "Test Theme", "user_title": "Developer"},
947
- "agents": {
948
- "dev": {
949
- "character": "Rosie the Riveter",
950
- "style": "Can-do wartime spirit, practical, determined, efficient, never gives up",
951
- "role": "The implementation specialist who gets things done",
952
- "quote": "We Can Do It!",
953
- "trait": "Unwavering determination",
954
- "motto": "Victory through effort and teamwork",
955
- },
956
- "sm": {"character": "Commander", "style": "s", "role": "r"},
957
- }
958
- }))
959
-
960
- # Sprint (~150 tokens)
961
- sprint_dir = tmp_path / "sprint"
962
- sprint_dir.mkdir()
963
- (sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
964
- "sprint": {"number": 12, "goal": "Complete tier implementation"},
965
- "epics": [{"id": "epic-1", "stories": [{"id": "1-1", "status": "in_progress"}]}]
966
- }))
967
-
968
- # Session (~200 tokens)
969
- session_dir = tmp_path / ".session"
970
- session_dir.mkdir()
971
- (session_dir / "test-session.md").write_text("""# MSSCI-12797: Python Prime Tier Support
972
-
973
- ## Story Context
974
- - **ID:** MSSCI-12797
975
- - **Workflow:** tdd
976
-
977
- ## Workflow Phase
978
- - **Phase:** green
979
- - **Phase Owner:** dev
980
- """)
981
-
982
-
983
- # =============================================================================
984
- # Integration Tests
985
- # =============================================================================
986
-
987
-
988
- class TestTierIntegration:
989
- """Integration tests for tier system."""
990
-
991
- def test_json_output_includes_tier(self, tmp_path: Path, capsys) -> None:
992
- """Test JSON output includes current tier."""
993
- from pennyfarthing_scripts.prime.cli import prime
994
- import json
995
-
996
- pf_dir = tmp_path / ".pennyfarthing"
997
- pf_dir.mkdir()
998
- agents_dir = pf_dir / "agents"
999
- agents_dir.mkdir()
1000
- (agents_dir / "dev.md").write_text("# Dev Agent")
1001
-
1002
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
1003
- result = prime(
1004
- agent_name="dev",
1005
- tier="REFRESH",
1006
- json_output=True,
1007
- no_workflow=True,
1008
- no_register=True,
1009
- no_persona=True,
1010
- project_root=tmp_path,
1011
- )
1012
-
1013
- assert result == 0
1014
- captured = capsys.readouterr()
1015
- data = json.loads(captured.out)
1016
-
1017
- assert data.get("tier") == "REFRESH"
1018
-
1019
- def test_tier_with_workflow_detection(self, tmp_path: Path, capsys) -> None:
1020
- """Test tier works correctly with workflow detection enabled."""
1021
- from pennyfarthing_scripts.prime.cli import prime
1022
-
1023
- pf_dir = tmp_path / ".pennyfarthing"
1024
- pf_dir.mkdir()
1025
- agents_dir = pf_dir / "agents"
1026
- agents_dir.mkdir()
1027
- (agents_dir / "dev.md").write_text("# Dev Agent")
1028
-
1029
- sprint_dir = tmp_path / "sprint"
1030
- sprint_dir.mkdir()
1031
- (sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
1032
- "sprint": {"number": 12},
1033
- "epics": []
1034
- }))
1035
-
1036
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
1037
- with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
1038
- result = prime(
1039
- agent_name="dev",
1040
- tier="MINIMAL",
1041
- no_register=True,
1042
- project_root=tmp_path,
1043
- )
1044
-
1045
- assert result == 0
1046
- captured = capsys.readouterr()
1047
-
1048
- # Should include workflow state even in MINIMAL
1049
- assert "Workflow State" in captured.out or "state:" in captured.out
1050
-
1051
- def test_tier_with_redirect_detection(self, tmp_path: Path, capsys) -> None:
1052
- """Test tier works correctly with redirect detection."""
1053
- from pennyfarthing_scripts.prime.cli import prime
1054
-
1055
- pf_dir = tmp_path / ".pennyfarthing"
1056
- pf_dir.mkdir()
1057
- agents_dir = pf_dir / "agents"
1058
- agents_dir.mkdir()
1059
- (agents_dir / "tea.md").write_text("# TEA Agent")
1060
-
1061
- # Workflow pointing to dev phase
1062
- workflows_dir = tmp_path / "pennyfarthing-dist" / "workflows"
1063
- workflows_dir.mkdir(parents=True)
1064
- (workflows_dir / "tdd.yaml").write_text(yaml.dump({
1065
- "workflow": {
1066
- "phases": [{"name": "green", "agent": "dev"}]
1067
- }
1068
- }))
1069
-
1070
- session_dir = tmp_path / ".session"
1071
- session_dir.mkdir()
1072
- (session_dir / "test-session.md").write_text("""# Test
1073
- - **Workflow:** tdd
1074
- - **Current Phase:** green
1075
- """)
1076
-
1077
- with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
1078
- result = prime(
1079
- agent_name="tea",
1080
- tier="HANDOFF",
1081
- no_register=True,
1082
- no_persona=True,
1083
- project_root=tmp_path,
1084
- )
1085
-
1086
- assert result == 0
1087
- captured = capsys.readouterr()
1088
-
1089
- # Should still detect redirect even in reduced tier
1090
- assert "REDIRECT" in captured.out or "dev" in captured.out