@pennyfarthing/core 10.0.2 → 10.0.3

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 (792) hide show
  1. package/README.md +287 -0
  2. package/package.json +30 -44
  3. package/packages/core/dist/cli/commands/doctor-file-layout.test.d.ts +13 -0
  4. package/packages/core/dist/cli/commands/doctor-file-layout.test.d.ts.map +1 -0
  5. package/packages/core/dist/cli/commands/doctor-file-layout.test.js +234 -0
  6. package/packages/core/dist/cli/commands/doctor-file-layout.test.js.map +1 -0
  7. package/{dist → packages/core/dist}/cli/commands/doctor.d.ts +8 -0
  8. package/{dist → packages/core/dist}/cli/commands/doctor.d.ts.map +1 -1
  9. package/{dist → packages/core/dist}/cli/commands/doctor.js +224 -3
  10. package/packages/core/dist/cli/commands/doctor.js.map +1 -0
  11. package/{dist → packages/core/dist}/cli/commands/e2e-fresh-install.test.js +1 -1
  12. package/{dist → packages/core/dist}/cli/commands/e2e-fresh-install.test.js.map +1 -1
  13. package/{dist → packages/core/dist}/cli/commands/e2e-upgrade.test.js +1 -1
  14. package/{dist → packages/core/dist}/cli/commands/e2e-upgrade.test.js.map +1 -1
  15. package/packages/core/dist/cli/commands/hooks-consolidation.test.d.ts +19 -0
  16. package/packages/core/dist/cli/commands/hooks-consolidation.test.d.ts.map +1 -0
  17. package/packages/core/dist/cli/commands/hooks-consolidation.test.js +358 -0
  18. package/packages/core/dist/cli/commands/hooks-consolidation.test.js.map +1 -0
  19. package/{dist → packages/core/dist}/cli/commands/update.d.ts.map +1 -1
  20. package/{dist → packages/core/dist}/cli/commands/update.js +53 -1
  21. package/{dist → packages/core/dist}/cli/commands/update.js.map +1 -1
  22. package/{dist → packages/core/dist}/cli/utils/settings.d.ts.map +1 -1
  23. package/{dist → packages/core/dist}/cli/utils/settings.js +24 -0
  24. package/packages/core/dist/cli/utils/settings.js.map +1 -0
  25. package/{dist → packages/core/dist}/cli/utils/themes.d.ts +1 -0
  26. package/packages/core/dist/cli/utils/themes.d.ts.map +1 -0
  27. package/{dist → packages/core/dist}/cli/utils/themes.js.map +1 -1
  28. package/pennyfarthing-dist/agents/sm-setup.md +4 -4
  29. package/pennyfarthing-dist/agents/sm.md +8 -1
  30. package/pennyfarthing-dist/guides/bell-mode.md +65 -0
  31. package/pennyfarthing-dist/guides/benchmarks.md +62 -0
  32. package/pennyfarthing-dist/guides/bikelane.md +86 -0
  33. package/pennyfarthing-dist/guides/prime.md +72 -0
  34. package/pennyfarthing-dist/guides/reflector.md +59 -0
  35. package/pennyfarthing-dist/guides/relay-mode.md +53 -0
  36. package/pennyfarthing-dist/guides/tirepump.md +54 -0
  37. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +59 -58
  38. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +10 -10
  39. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +10 -10
  40. package/pennyfarthing-dist/personas/themes/dune.yaml +64 -69
  41. package/pennyfarthing-dist/personas/themes/firefly.yaml +60 -73
  42. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +60 -69
  43. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +59 -73
  44. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +45 -57
  45. package/pennyfarthing-dist/personas/themes/mad-max.yaml +5 -11
  46. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +53 -63
  47. package/pennyfarthing-dist/personas/themes/sandman.yaml +59 -59
  48. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +61 -62
  49. package/pennyfarthing-dist/personas/themes/west-wing.yaml +8 -9
  50. package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -0
  51. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -0
  52. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -0
  53. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -0
  54. package/pennyfarthing-dist/scripts/core/prime.sh +0 -0
  55. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -0
  56. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -0
  57. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -0
  58. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +0 -0
  59. package/pennyfarthing-dist/scripts/git/release.sh +0 -0
  60. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -0
  61. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -0
  62. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -0
  63. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  64. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  65. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +32 -0
  66. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
  67. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
  68. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
  69. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  70. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
  71. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -0
  72. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -0
  73. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -0
  74. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
  75. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  76. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -0
  77. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -0
  78. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +12 -91
  79. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +11 -86
  80. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -0
  81. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +11 -255
  82. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -0
  83. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -0
  84. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -0
  85. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -0
  86. package/pennyfarthing-dist/scripts/lib/common.sh +0 -0
  87. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -0
  88. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -0
  89. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -0
  90. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -0
  91. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -0
  92. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -0
  93. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -0
  94. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -0
  95. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -0
  96. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -0
  97. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -0
  98. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -0
  99. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -0
  100. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -0
  101. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -0
  102. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -0
  103. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -0
  104. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -0
  105. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -0
  106. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -0
  107. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -0
  108. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -0
  109. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -0
  110. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -0
  111. package/pennyfarthing-dist/scripts/sprint/archive-story.sh +0 -0
  112. package/pennyfarthing-dist/scripts/sprint/available-stories.sh +0 -0
  113. package/pennyfarthing-dist/scripts/sprint/check-story.sh +0 -0
  114. package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +0 -0
  115. package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +0 -0
  116. package/pennyfarthing-dist/scripts/sprint/list-future.sh +0 -0
  117. package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +0 -0
  118. package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +0 -0
  119. package/pennyfarthing-dist/scripts/sprint/sprint-common.sh +0 -0
  120. package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +0 -0
  121. package/pennyfarthing-dist/scripts/sprint/sprint-metrics.sh +0 -0
  122. package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +0 -0
  123. package/pennyfarthing-dist/scripts/sprint/validate-sprint-yaml.sh +0 -0
  124. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -0
  125. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -0
  126. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -0
  127. package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +0 -0
  128. package/pennyfarthing-dist/scripts/test/swebench-judge.py +0 -0
  129. package/pennyfarthing-dist/scripts/test/test-cache.sh +0 -0
  130. package/pennyfarthing-dist/scripts/test/test-setup.sh +0 -0
  131. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  132. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -0
  133. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -0
  134. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -0
  135. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -0
  136. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -0
  137. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -0
  138. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -0
  139. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  140. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
  141. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  142. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  143. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  144. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -0
  145. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +0 -0
  146. package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +0 -0
  147. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -0
  148. package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +0 -0
  149. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -0
  150. package/pennyfarthing-dist/scripts/workflow/check.py +0 -0
  151. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -0
  152. package/pennyfarthing-dist/scripts/workflow/complete-step.py +0 -0
  153. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -0
  154. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -0
  155. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -0
  156. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -0
  157. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -0
  158. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -0
  159. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -0
  160. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -0
  161. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -0
  162. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -0
  163. package/pennyfarthing-dist/skills/jira/SKILL.md +107 -408
  164. package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +0 -0
  165. package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +0 -0
  166. package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +0 -0
  167. package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +17 -95
  168. package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +0 -0
  169. package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +0 -0
  170. package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +0 -0
  171. package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +0 -0
  172. package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +20 -90
  173. package/pennyfarthing-dist/skills/story/scripts/create-story.sh +0 -0
  174. package/pennyfarthing-dist/skills/story/scripts/size-story.sh +0 -0
  175. package/pennyfarthing-dist/skills/story/scripts/story-template.sh +0 -0
  176. package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +0 -0
  177. package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +0 -0
  178. package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +0 -0
  179. package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +0 -0
  180. package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +0 -0
  181. package/pennyfarthing-dist/templates/settings.local.json.template +9 -1
  182. package/pennyfarthing_scripts/README.md +66 -0
  183. package/pennyfarthing_scripts/__init__.py +17 -0
  184. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  185. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  186. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  187. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  188. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  189. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  190. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  191. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  192. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  193. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  194. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  195. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  196. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  197. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  198. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  200. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  201. package/pennyfarthing_scripts/bellmode_hook.py +154 -0
  202. package/pennyfarthing_scripts/brownfield/__init__.py +35 -0
  203. package/pennyfarthing_scripts/brownfield/__main__.py +7 -0
  204. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  205. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  206. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  207. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  208. package/pennyfarthing_scripts/brownfield/cli.py +131 -0
  209. package/pennyfarthing_scripts/brownfield/discover.py +753 -0
  210. package/pennyfarthing_scripts/cli.py +184 -0
  211. package/pennyfarthing_scripts/common/__init__.py +49 -0
  212. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  213. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  214. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  215. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  216. package/pennyfarthing_scripts/common/config.py +91 -0
  217. package/pennyfarthing_scripts/common/output.py +180 -0
  218. package/pennyfarthing_scripts/common/themes.py +253 -0
  219. package/pennyfarthing_scripts/config.py +21 -0
  220. package/pennyfarthing_scripts/context.py +414 -0
  221. package/pennyfarthing_scripts/git/__init__.py +29 -0
  222. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  223. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  224. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  225. package/pennyfarthing_scripts/git/create_branches.py +439 -0
  226. package/pennyfarthing_scripts/git/status_all.py +310 -0
  227. package/pennyfarthing_scripts/hooks/cyclist-pretooluse-hook.sh +7 -0
  228. package/pennyfarthing_scripts/hooks.py +454 -0
  229. package/pennyfarthing_scripts/hotspots/__init__.py +31 -0
  230. package/pennyfarthing_scripts/hotspots/__main__.py +6 -0
  231. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/hotspots/__pycache__/__main__.cpython-314.pyc +0 -0
  233. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  234. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  235. package/pennyfarthing_scripts/hotspots/__pycache__/formatters.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  237. package/pennyfarthing_scripts/hotspots/analyze.py +472 -0
  238. package/pennyfarthing_scripts/hotspots/cli.py +152 -0
  239. package/pennyfarthing_scripts/hotspots/formatters.py +109 -0
  240. package/pennyfarthing_scripts/hotspots/models.py +60 -0
  241. package/pennyfarthing_scripts/jira/__init__.py +99 -0
  242. package/pennyfarthing_scripts/jira/__main__.py +10 -0
  243. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  244. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  245. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  247. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/jira/__pycache__/operations.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  256. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  257. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/jira/bidirectional.py +561 -0
  259. package/pennyfarthing_scripts/jira/claim.py +211 -0
  260. package/pennyfarthing_scripts/jira/cli.py +277 -0
  261. package/pennyfarthing_scripts/jira/client.py +762 -0
  262. package/pennyfarthing_scripts/jira/create.py +267 -0
  263. package/pennyfarthing_scripts/jira/epic.py +176 -0
  264. package/pennyfarthing_scripts/jira/operations.py +124 -0
  265. package/pennyfarthing_scripts/jira/reconcile.py +277 -0
  266. package/pennyfarthing_scripts/jira/story.py +219 -0
  267. package/pennyfarthing_scripts/jira/sync.py +350 -0
  268. package/pennyfarthing_scripts/jira_bidirectional_sync.py +37 -0
  269. package/pennyfarthing_scripts/jira_epic_creation.py +30 -0
  270. package/pennyfarthing_scripts/jira_sync.py +36 -0
  271. package/pennyfarthing_scripts/jira_sync_story.py +30 -0
  272. package/pennyfarthing_scripts/migration/__init__.py +39 -0
  273. package/pennyfarthing_scripts/migration/__main__.py +10 -0
  274. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  277. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  278. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/migration/cli.py +304 -0
  282. package/pennyfarthing_scripts/migration/session.py +384 -0
  283. package/pennyfarthing_scripts/migration/skill.py +188 -0
  284. package/pennyfarthing_scripts/migration/step.py +229 -0
  285. package/pennyfarthing_scripts/migration/validate.py +282 -0
  286. package/pennyfarthing_scripts/output.py +37 -0
  287. package/pennyfarthing_scripts/patch_mode.py +449 -0
  288. package/pennyfarthing_scripts/preflight/__init__.py +17 -0
  289. package/pennyfarthing_scripts/preflight/__main__.py +10 -0
  290. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  291. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  292. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  293. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  294. package/pennyfarthing_scripts/preflight/cli.py +141 -0
  295. package/pennyfarthing_scripts/preflight/finish.py +382 -0
  296. package/pennyfarthing_scripts/pretooluse_hook.py +193 -0
  297. package/pennyfarthing_scripts/prime/__init__.py +125 -0
  298. package/pennyfarthing_scripts/prime/__main__.py +8 -0
  299. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  302. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  303. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  304. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  305. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  306. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  307. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/prime/cli.py +645 -0
  309. package/pennyfarthing_scripts/prime/loader.py +239 -0
  310. package/pennyfarthing_scripts/prime/models.py +206 -0
  311. package/pennyfarthing_scripts/prime/persona.py +309 -0
  312. package/pennyfarthing_scripts/prime/session.py +183 -0
  313. package/pennyfarthing_scripts/prime/tiers.py +201 -0
  314. package/pennyfarthing_scripts/prime/workflow.py +275 -0
  315. package/pennyfarthing_scripts/schema_validation_hook.py +306 -0
  316. package/pennyfarthing_scripts/sprint/__init__.py +66 -0
  317. package/pennyfarthing_scripts/sprint/__main__.py +10 -0
  318. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  319. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  320. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  321. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  322. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  323. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  324. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  325. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  326. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  327. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  328. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  329. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  330. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  331. package/pennyfarthing_scripts/sprint/archive.py +108 -0
  332. package/pennyfarthing_scripts/sprint/archive_epic.py +399 -0
  333. package/pennyfarthing_scripts/sprint/cli.py +373 -0
  334. package/pennyfarthing_scripts/sprint/import_epic.py +431 -0
  335. package/pennyfarthing_scripts/sprint/loader.py +193 -0
  336. package/pennyfarthing_scripts/sprint/status.py +122 -0
  337. package/pennyfarthing_scripts/sprint/story_add.py +187 -0
  338. package/pennyfarthing_scripts/sprint/story_update.py +181 -0
  339. package/pennyfarthing_scripts/sprint/validate_cmd.py +268 -0
  340. package/pennyfarthing_scripts/sprint/validator.py +570 -0
  341. package/pennyfarthing_scripts/sprint/work.py +192 -0
  342. package/pennyfarthing_scripts/sprint/yaml_io.py +258 -0
  343. package/pennyfarthing_scripts/story/__init__.py +67 -0
  344. package/pennyfarthing_scripts/story/__main__.py +10 -0
  345. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  346. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  347. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  348. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  349. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  350. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  351. package/pennyfarthing_scripts/story/cli.py +105 -0
  352. package/pennyfarthing_scripts/story/create.py +167 -0
  353. package/pennyfarthing_scripts/story/size.py +113 -0
  354. package/pennyfarthing_scripts/story/template.py +151 -0
  355. package/pennyfarthing_scripts/swebench.py +216 -0
  356. package/pennyfarthing_scripts/tests/__init__.py +1 -0
  357. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  358. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  359. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  360. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  361. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  362. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  363. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  364. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  365. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  366. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  367. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  368. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  369. package/pennyfarthing_scripts/tests/__pycache__/test_story_add.cpython-314-pytest-9.0.2.pyc +0 -0
  370. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  371. package/pennyfarthing_scripts/tests/__pycache__/test_story_update.cpython-314-pytest-9.0.2.pyc +0 -0
  372. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  373. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  374. package/pennyfarthing_scripts/tests/__pycache__/test_validate_cmd.cpython-314-pytest-9.0.2.pyc +0 -0
  375. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  376. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  377. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  378. package/pennyfarthing_scripts/tests/conftest.py +106 -0
  379. package/pennyfarthing_scripts/tests/test_brownfield.py +842 -0
  380. package/pennyfarthing_scripts/tests/test_cli_modules.py +245 -0
  381. package/pennyfarthing_scripts/tests/test_common.py +180 -0
  382. package/pennyfarthing_scripts/tests/test_git_utils.py +866 -0
  383. package/pennyfarthing_scripts/tests/test_jira_package.py +334 -0
  384. package/pennyfarthing_scripts/tests/test_package_structure.py +372 -0
  385. package/pennyfarthing_scripts/tests/test_patch_mode.py +830 -0
  386. package/pennyfarthing_scripts/tests/test_prime.py +1050 -0
  387. package/pennyfarthing_scripts/tests/test_sprint_package.py +236 -0
  388. package/pennyfarthing_scripts/tests/test_sprint_validator.py +731 -0
  389. package/pennyfarthing_scripts/tests/test_story_add.py +921 -0
  390. package/pennyfarthing_scripts/tests/test_story_package.py +156 -0
  391. package/pennyfarthing_scripts/tests/test_story_update.py +769 -0
  392. package/pennyfarthing_scripts/tests/test_tiers.py +1090 -0
  393. package/pennyfarthing_scripts/tests/test_token_counting.py +559 -0
  394. package/pennyfarthing_scripts/tests/test_validate_cmd.py +500 -0
  395. package/pennyfarthing_scripts/tests/test_workflow_check.py +341 -0
  396. package/pennyfarthing_scripts/tests/test_yaml_io.py +698 -0
  397. package/pennyfarthing_scripts/welcome_hook.py +157 -0
  398. package/pennyfarthing_scripts/workflow.py +287 -0
  399. package/dist/cli/commands/doctor.js.map +0 -1
  400. package/dist/cli/utils/settings.js.map +0 -1
  401. package/dist/cli/utils/themes.d.ts.map +0 -1
  402. package/pennyfarthing-dist/scripts/jira/jira-lib.sh +0 -464
  403. package/pennyfarthing-dist/scripts/jira/jira-sync.sh +0 -16
  404. package/pennyfarthing-dist/scripts/jira/sync-epic-to-jira.sh +0 -16
  405. /package/{bin → packages/core/bin}/pennyfarthing.js +0 -0
  406. /package/{dist → packages/core/dist}/bmad/context-reader.d.ts +0 -0
  407. /package/{dist → packages/core/dist}/bmad/context-reader.d.ts.map +0 -0
  408. /package/{dist → packages/core/dist}/bmad/context-reader.js +0 -0
  409. /package/{dist → packages/core/dist}/bmad/context-reader.js.map +0 -0
  410. /package/{dist → packages/core/dist}/bmad/context-reader.test.d.ts +0 -0
  411. /package/{dist → packages/core/dist}/bmad/context-reader.test.d.ts.map +0 -0
  412. /package/{dist → packages/core/dist}/bmad/context-reader.test.js +0 -0
  413. /package/{dist → packages/core/dist}/bmad/context-reader.test.js.map +0 -0
  414. /package/{dist → packages/core/dist}/bmad/epics-parser.d.ts +0 -0
  415. /package/{dist → packages/core/dist}/bmad/epics-parser.d.ts.map +0 -0
  416. /package/{dist → packages/core/dist}/bmad/epics-parser.js +0 -0
  417. /package/{dist → packages/core/dist}/bmad/epics-parser.js.map +0 -0
  418. /package/{dist → packages/core/dist}/bmad/epics-parser.test.d.ts +0 -0
  419. /package/{dist → packages/core/dist}/bmad/epics-parser.test.d.ts.map +0 -0
  420. /package/{dist → packages/core/dist}/bmad/epics-parser.test.js +0 -0
  421. /package/{dist → packages/core/dist}/bmad/epics-parser.test.js.map +0 -0
  422. /package/{dist → packages/core/dist}/bmad/index.d.ts +0 -0
  423. /package/{dist → packages/core/dist}/bmad/index.d.ts.map +0 -0
  424. /package/{dist → packages/core/dist}/bmad/index.js +0 -0
  425. /package/{dist → packages/core/dist}/bmad/index.js.map +0 -0
  426. /package/{dist → packages/core/dist}/bmad/status-sync.d.ts +0 -0
  427. /package/{dist → packages/core/dist}/bmad/status-sync.d.ts.map +0 -0
  428. /package/{dist → packages/core/dist}/bmad/status-sync.js +0 -0
  429. /package/{dist → packages/core/dist}/bmad/status-sync.js.map +0 -0
  430. /package/{dist → packages/core/dist}/bmad/status-sync.test.d.ts +0 -0
  431. /package/{dist → packages/core/dist}/bmad/status-sync.test.d.ts.map +0 -0
  432. /package/{dist → packages/core/dist}/bmad/status-sync.test.js +0 -0
  433. /package/{dist → packages/core/dist}/bmad/status-sync.test.js.map +0 -0
  434. /package/{dist → packages/core/dist}/bmad/story-exporter.d.ts +0 -0
  435. /package/{dist → packages/core/dist}/bmad/story-exporter.d.ts.map +0 -0
  436. /package/{dist → packages/core/dist}/bmad/story-exporter.js +0 -0
  437. /package/{dist → packages/core/dist}/bmad/story-exporter.js.map +0 -0
  438. /package/{dist → packages/core/dist}/bmad/story-exporter.test.d.ts +0 -0
  439. /package/{dist → packages/core/dist}/bmad/story-exporter.test.d.ts.map +0 -0
  440. /package/{dist → packages/core/dist}/bmad/story-exporter.test.js +0 -0
  441. /package/{dist → packages/core/dist}/bmad/story-exporter.test.js.map +0 -0
  442. /package/{dist → packages/core/dist}/bmad/story-parser.d.ts +0 -0
  443. /package/{dist → packages/core/dist}/bmad/story-parser.d.ts.map +0 -0
  444. /package/{dist → packages/core/dist}/bmad/story-parser.js +0 -0
  445. /package/{dist → packages/core/dist}/bmad/story-parser.js.map +0 -0
  446. /package/{dist → packages/core/dist}/bmad/story-parser.test.d.ts +0 -0
  447. /package/{dist → packages/core/dist}/bmad/story-parser.test.d.ts.map +0 -0
  448. /package/{dist → packages/core/dist}/bmad/story-parser.test.js +0 -0
  449. /package/{dist → packages/core/dist}/bmad/story-parser.test.js.map +0 -0
  450. /package/{dist → packages/core/dist}/cli/commands/command.d.ts +0 -0
  451. /package/{dist → packages/core/dist}/cli/commands/command.d.ts.map +0 -0
  452. /package/{dist → packages/core/dist}/cli/commands/command.js +0 -0
  453. /package/{dist → packages/core/dist}/cli/commands/command.js.map +0 -0
  454. /package/{dist → packages/core/dist}/cli/commands/cyclist.d.ts +0 -0
  455. /package/{dist → packages/core/dist}/cli/commands/cyclist.d.ts.map +0 -0
  456. /package/{dist → packages/core/dist}/cli/commands/cyclist.js +0 -0
  457. /package/{dist → packages/core/dist}/cli/commands/cyclist.js.map +0 -0
  458. /package/{dist → packages/core/dist}/cli/commands/cyclist.test.d.ts +0 -0
  459. /package/{dist → packages/core/dist}/cli/commands/cyclist.test.d.ts.map +0 -0
  460. /package/{dist → packages/core/dist}/cli/commands/cyclist.test.js +0 -0
  461. /package/{dist → packages/core/dist}/cli/commands/cyclist.test.js.map +0 -0
  462. /package/{dist → packages/core/dist}/cli/commands/doctor-legacy.test.d.ts +0 -0
  463. /package/{dist → packages/core/dist}/cli/commands/doctor-legacy.test.d.ts.map +0 -0
  464. /package/{dist → packages/core/dist}/cli/commands/doctor-legacy.test.js +0 -0
  465. /package/{dist → packages/core/dist}/cli/commands/doctor-legacy.test.js.map +0 -0
  466. /package/{dist → packages/core/dist}/cli/commands/e2e-fresh-install.test.d.ts +0 -0
  467. /package/{dist → packages/core/dist}/cli/commands/e2e-fresh-install.test.d.ts.map +0 -0
  468. /package/{dist → packages/core/dist}/cli/commands/e2e-upgrade.test.d.ts +0 -0
  469. /package/{dist → packages/core/dist}/cli/commands/e2e-upgrade.test.d.ts.map +0 -0
  470. /package/{dist → packages/core/dist}/cli/commands/init-consolidation.test.d.ts +0 -0
  471. /package/{dist → packages/core/dist}/cli/commands/init-consolidation.test.d.ts.map +0 -0
  472. /package/{dist → packages/core/dist}/cli/commands/init-consolidation.test.js +0 -0
  473. /package/{dist → packages/core/dist}/cli/commands/init-consolidation.test.js.map +0 -0
  474. /package/{dist → packages/core/dist}/cli/commands/init.d.ts +0 -0
  475. /package/{dist → packages/core/dist}/cli/commands/init.d.ts.map +0 -0
  476. /package/{dist → packages/core/dist}/cli/commands/init.js +0 -0
  477. /package/{dist → packages/core/dist}/cli/commands/init.js.map +0 -0
  478. /package/{dist → packages/core/dist}/cli/commands/persona-config-consolidation.test.d.ts +0 -0
  479. /package/{dist → packages/core/dist}/cli/commands/persona-config-consolidation.test.d.ts.map +0 -0
  480. /package/{dist → packages/core/dist}/cli/commands/persona-config-consolidation.test.js +0 -0
  481. /package/{dist → packages/core/dist}/cli/commands/persona-config-consolidation.test.js.map +0 -0
  482. /package/{dist → packages/core/dist}/cli/commands/skill.d.ts +0 -0
  483. /package/{dist → packages/core/dist}/cli/commands/skill.d.ts.map +0 -0
  484. /package/{dist → packages/core/dist}/cli/commands/skill.js +0 -0
  485. /package/{dist → packages/core/dist}/cli/commands/skill.js.map +0 -0
  486. /package/{dist → packages/core/dist}/cli/commands/theme.d.ts +0 -0
  487. /package/{dist → packages/core/dist}/cli/commands/theme.d.ts.map +0 -0
  488. /package/{dist → packages/core/dist}/cli/commands/theme.js +0 -0
  489. /package/{dist → packages/core/dist}/cli/commands/theme.js.map +0 -0
  490. /package/{dist → packages/core/dist}/cli/commands/uninstall.d.ts +0 -0
  491. /package/{dist → packages/core/dist}/cli/commands/uninstall.d.ts.map +0 -0
  492. /package/{dist → packages/core/dist}/cli/commands/uninstall.js +0 -0
  493. /package/{dist → packages/core/dist}/cli/commands/uninstall.js.map +0 -0
  494. /package/{dist → packages/core/dist}/cli/commands/update-consolidation.test.d.ts +0 -0
  495. /package/{dist → packages/core/dist}/cli/commands/update-consolidation.test.d.ts.map +0 -0
  496. /package/{dist → packages/core/dist}/cli/commands/update-consolidation.test.js +0 -0
  497. /package/{dist → packages/core/dist}/cli/commands/update-consolidation.test.js.map +0 -0
  498. /package/{dist → packages/core/dist}/cli/commands/update.d.ts +0 -0
  499. /package/{dist → packages/core/dist}/cli/commands/version.d.ts +0 -0
  500. /package/{dist → packages/core/dist}/cli/commands/version.d.ts.map +0 -0
  501. /package/{dist → packages/core/dist}/cli/commands/version.js +0 -0
  502. /package/{dist → packages/core/dist}/cli/commands/version.js.map +0 -0
  503. /package/{dist → packages/core/dist}/cli/customization.test.d.ts +0 -0
  504. /package/{dist → packages/core/dist}/cli/customization.test.d.ts.map +0 -0
  505. /package/{dist → packages/core/dist}/cli/customization.test.js +0 -0
  506. /package/{dist → packages/core/dist}/cli/customization.test.js.map +0 -0
  507. /package/{dist → packages/core/dist}/cli/cyclist-migration.test.d.ts +0 -0
  508. /package/{dist → packages/core/dist}/cli/cyclist-migration.test.d.ts.map +0 -0
  509. /package/{dist → packages/core/dist}/cli/cyclist-migration.test.js +0 -0
  510. /package/{dist → packages/core/dist}/cli/cyclist-migration.test.js.map +0 -0
  511. /package/{dist → packages/core/dist}/cli/index.d.ts +0 -0
  512. /package/{dist → packages/core/dist}/cli/index.d.ts.map +0 -0
  513. /package/{dist → packages/core/dist}/cli/index.js +0 -0
  514. /package/{dist → packages/core/dist}/cli/index.js.map +0 -0
  515. /package/{dist → packages/core/dist}/cli/ocean-profiles.test.d.ts +0 -0
  516. /package/{dist → packages/core/dist}/cli/ocean-profiles.test.d.ts.map +0 -0
  517. /package/{dist → packages/core/dist}/cli/ocean-profiles.test.js +0 -0
  518. /package/{dist → packages/core/dist}/cli/ocean-profiles.test.js.map +0 -0
  519. /package/{dist → packages/core/dist}/cli/theme-maker.test.d.ts +0 -0
  520. /package/{dist → packages/core/dist}/cli/theme-maker.test.d.ts.map +0 -0
  521. /package/{dist → packages/core/dist}/cli/theme-maker.test.js +0 -0
  522. /package/{dist → packages/core/dist}/cli/theme-maker.test.js.map +0 -0
  523. /package/{dist → packages/core/dist}/cli/utils/constants.d.ts +0 -0
  524. /package/{dist → packages/core/dist}/cli/utils/constants.d.ts.map +0 -0
  525. /package/{dist → packages/core/dist}/cli/utils/constants.js +0 -0
  526. /package/{dist → packages/core/dist}/cli/utils/constants.js.map +0 -0
  527. /package/{dist → packages/core/dist}/cli/utils/files.d.ts +0 -0
  528. /package/{dist → packages/core/dist}/cli/utils/files.d.ts.map +0 -0
  529. /package/{dist → packages/core/dist}/cli/utils/files.js +0 -0
  530. /package/{dist → packages/core/dist}/cli/utils/files.js.map +0 -0
  531. /package/{dist → packages/core/dist}/cli/utils/logger.d.ts +0 -0
  532. /package/{dist → packages/core/dist}/cli/utils/logger.d.ts.map +0 -0
  533. /package/{dist → packages/core/dist}/cli/utils/logger.js +0 -0
  534. /package/{dist → packages/core/dist}/cli/utils/logger.js.map +0 -0
  535. /package/{dist → packages/core/dist}/cli/utils/manifest.d.ts +0 -0
  536. /package/{dist → packages/core/dist}/cli/utils/manifest.d.ts.map +0 -0
  537. /package/{dist → packages/core/dist}/cli/utils/manifest.js +0 -0
  538. /package/{dist → packages/core/dist}/cli/utils/manifest.js.map +0 -0
  539. /package/{dist → packages/core/dist}/cli/utils/node-modules.d.ts +0 -0
  540. /package/{dist → packages/core/dist}/cli/utils/node-modules.d.ts.map +0 -0
  541. /package/{dist → packages/core/dist}/cli/utils/node-modules.js +0 -0
  542. /package/{dist → packages/core/dist}/cli/utils/node-modules.js.map +0 -0
  543. /package/{dist → packages/core/dist}/cli/utils/prompts.d.ts +0 -0
  544. /package/{dist → packages/core/dist}/cli/utils/prompts.d.ts.map +0 -0
  545. /package/{dist → packages/core/dist}/cli/utils/prompts.js +0 -0
  546. /package/{dist → packages/core/dist}/cli/utils/prompts.js.map +0 -0
  547. /package/{dist → packages/core/dist}/cli/utils/settings-consolidation.test.d.ts +0 -0
  548. /package/{dist → packages/core/dist}/cli/utils/settings-consolidation.test.d.ts.map +0 -0
  549. /package/{dist → packages/core/dist}/cli/utils/settings-consolidation.test.js +0 -0
  550. /package/{dist → packages/core/dist}/cli/utils/settings-consolidation.test.js.map +0 -0
  551. /package/{dist → packages/core/dist}/cli/utils/settings.d.ts +0 -0
  552. /package/{dist → packages/core/dist}/cli/utils/symlinks.d.ts +0 -0
  553. /package/{dist → packages/core/dist}/cli/utils/symlinks.d.ts.map +0 -0
  554. /package/{dist → packages/core/dist}/cli/utils/symlinks.js +0 -0
  555. /package/{dist → packages/core/dist}/cli/utils/symlinks.js.map +0 -0
  556. /package/{dist → packages/core/dist}/cli/utils/themes.js +0 -0
  557. /package/{dist → packages/core/dist}/cli/utils/themes.test.d.ts +0 -0
  558. /package/{dist → packages/core/dist}/cli/utils/themes.test.d.ts.map +0 -0
  559. /package/{dist → packages/core/dist}/cli/utils/themes.test.js +0 -0
  560. /package/{dist → packages/core/dist}/cli/utils/themes.test.js.map +0 -0
  561. /package/{dist → packages/core/dist}/cli/utils/version.d.ts +0 -0
  562. /package/{dist → packages/core/dist}/cli/utils/version.d.ts.map +0 -0
  563. /package/{dist → packages/core/dist}/cli/utils/version.js +0 -0
  564. /package/{dist → packages/core/dist}/cli/utils/version.js.map +0 -0
  565. /package/{dist → packages/core/dist}/cli/workspace.test.d.ts +0 -0
  566. /package/{dist → packages/core/dist}/cli/workspace.test.d.ts.map +0 -0
  567. /package/{dist → packages/core/dist}/cli/workspace.test.js +0 -0
  568. /package/{dist → packages/core/dist}/cli/workspace.test.js.map +0 -0
  569. /package/{dist → packages/core/dist}/index.d.ts +0 -0
  570. /package/{dist → packages/core/dist}/index.d.ts.map +0 -0
  571. /package/{dist → packages/core/dist}/index.js +0 -0
  572. /package/{dist → packages/core/dist}/index.js.map +0 -0
  573. /package/{dist → packages/core/dist}/jira/jira-epic-creation.d.ts +0 -0
  574. /package/{dist → packages/core/dist}/jira/jira-epic-creation.d.ts.map +0 -0
  575. /package/{dist → packages/core/dist}/jira/jira-epic-creation.js +0 -0
  576. /package/{dist → packages/core/dist}/jira/jira-epic-creation.js.map +0 -0
  577. /package/{dist → packages/core/dist}/jira/jira-epic-creation.test.d.ts +0 -0
  578. /package/{dist → packages/core/dist}/jira/jira-epic-creation.test.d.ts.map +0 -0
  579. /package/{dist → packages/core/dist}/jira/jira-epic-creation.test.js +0 -0
  580. /package/{dist → packages/core/dist}/jira/jira-epic-creation.test.js.map +0 -0
  581. /package/{dist → packages/core/dist}/jira/jira-sprint-sync.d.ts +0 -0
  582. /package/{dist → packages/core/dist}/jira/jira-sprint-sync.d.ts.map +0 -0
  583. /package/{dist → packages/core/dist}/jira/jira-sprint-sync.js +0 -0
  584. /package/{dist → packages/core/dist}/jira/jira-sprint-sync.js.map +0 -0
  585. /package/{dist → packages/core/dist}/jira/jira-sprint-sync.test.d.ts +0 -0
  586. /package/{dist → packages/core/dist}/jira/jira-sprint-sync.test.d.ts.map +0 -0
  587. /package/{dist → packages/core/dist}/jira/jira-sprint-sync.test.js +0 -0
  588. /package/{dist → packages/core/dist}/jira/jira-sprint-sync.test.js.map +0 -0
  589. /package/{dist → packages/core/dist}/permissions/index.d.ts +0 -0
  590. /package/{dist → packages/core/dist}/permissions/index.d.ts.map +0 -0
  591. /package/{dist → packages/core/dist}/permissions/index.js +0 -0
  592. /package/{dist → packages/core/dist}/permissions/index.js.map +0 -0
  593. /package/{dist → packages/core/dist}/permissions/permission-schema.d.ts +0 -0
  594. /package/{dist → packages/core/dist}/permissions/permission-schema.d.ts.map +0 -0
  595. /package/{dist → packages/core/dist}/permissions/permission-schema.js +0 -0
  596. /package/{dist → packages/core/dist}/permissions/permission-schema.js.map +0 -0
  597. /package/{dist → packages/core/dist}/permissions/permission-schema.test.d.ts +0 -0
  598. /package/{dist → packages/core/dist}/permissions/permission-schema.test.d.ts.map +0 -0
  599. /package/{dist → packages/core/dist}/permissions/permission-schema.test.js +0 -0
  600. /package/{dist → packages/core/dist}/permissions/permission-schema.test.js.map +0 -0
  601. /package/{dist → packages/core/dist}/scripts/add-ocean-profiles.d.ts +0 -0
  602. /package/{dist → packages/core/dist}/scripts/add-ocean-profiles.d.ts.map +0 -0
  603. /package/{dist → packages/core/dist}/scripts/add-ocean-profiles.js +0 -0
  604. /package/{dist → packages/core/dist}/scripts/add-ocean-profiles.js.map +0 -0
  605. /package/{dist → packages/core/dist}/scripts/benchmark-integration.d.ts +0 -0
  606. /package/{dist → packages/core/dist}/scripts/benchmark-integration.d.ts.map +0 -0
  607. /package/{dist → packages/core/dist}/scripts/benchmark-integration.js +0 -0
  608. /package/{dist → packages/core/dist}/scripts/benchmark-integration.js.map +0 -0
  609. /package/{dist → packages/core/dist}/scripts/benchmark-integration.test.d.ts +0 -0
  610. /package/{dist → packages/core/dist}/scripts/benchmark-integration.test.d.ts.map +0 -0
  611. /package/{dist → packages/core/dist}/scripts/benchmark-integration.test.js +0 -0
  612. /package/{dist → packages/core/dist}/scripts/benchmark-integration.test.js.map +0 -0
  613. /package/{dist → packages/core/dist}/scripts/debugging-scenarios.test.d.ts +0 -0
  614. /package/{dist → packages/core/dist}/scripts/debugging-scenarios.test.d.ts.map +0 -0
  615. /package/{dist → packages/core/dist}/scripts/debugging-scenarios.test.js +0 -0
  616. /package/{dist → packages/core/dist}/scripts/debugging-scenarios.test.js.map +0 -0
  617. /package/{dist → packages/core/dist}/scripts/generate-all-spiders.d.ts +0 -0
  618. /package/{dist → packages/core/dist}/scripts/generate-all-spiders.d.ts.map +0 -0
  619. /package/{dist → packages/core/dist}/scripts/generate-all-spiders.js +0 -0
  620. /package/{dist → packages/core/dist}/scripts/generate-all-spiders.js.map +0 -0
  621. /package/{dist → packages/core/dist}/scripts/generate-report.d.ts +0 -0
  622. /package/{dist → packages/core/dist}/scripts/generate-report.d.ts.map +0 -0
  623. /package/{dist → packages/core/dist}/scripts/generate-report.js +0 -0
  624. /package/{dist → packages/core/dist}/scripts/generate-report.js.map +0 -0
  625. /package/{dist → packages/core/dist}/scripts/generate-report.test.d.ts +0 -0
  626. /package/{dist → packages/core/dist}/scripts/generate-report.test.d.ts.map +0 -0
  627. /package/{dist → packages/core/dist}/scripts/generate-report.test.js +0 -0
  628. /package/{dist → packages/core/dist}/scripts/generate-report.test.js.map +0 -0
  629. /package/{dist → packages/core/dist}/scripts/generate-spider-report.d.ts +0 -0
  630. /package/{dist → packages/core/dist}/scripts/generate-spider-report.d.ts.map +0 -0
  631. /package/{dist → packages/core/dist}/scripts/generate-spider-report.js +0 -0
  632. /package/{dist → packages/core/dist}/scripts/generate-spider-report.js.map +0 -0
  633. /package/{dist → packages/core/dist}/scripts/generate-spider-report.test.d.ts +0 -0
  634. /package/{dist → packages/core/dist}/scripts/generate-spider-report.test.d.ts.map +0 -0
  635. /package/{dist → packages/core/dist}/scripts/generate-spider-report.test.js +0 -0
  636. /package/{dist → packages/core/dist}/scripts/generate-spider-report.test.js.map +0 -0
  637. /package/{dist → packages/core/dist}/scripts/generate-spider.d.ts +0 -0
  638. /package/{dist → packages/core/dist}/scripts/generate-spider.d.ts.map +0 -0
  639. /package/{dist → packages/core/dist}/scripts/generate-spider.js +0 -0
  640. /package/{dist → packages/core/dist}/scripts/generate-spider.js.map +0 -0
  641. /package/{dist → packages/core/dist}/scripts/generate-spider.test.d.ts +0 -0
  642. /package/{dist → packages/core/dist}/scripts/generate-spider.test.d.ts.map +0 -0
  643. /package/{dist → packages/core/dist}/scripts/generate-spider.test.js +0 -0
  644. /package/{dist → packages/core/dist}/scripts/generate-spider.test.js.map +0 -0
  645. /package/{dist → packages/core/dist}/scripts/job-fair-aggregator.d.ts +0 -0
  646. /package/{dist → packages/core/dist}/scripts/job-fair-aggregator.d.ts.map +0 -0
  647. /package/{dist → packages/core/dist}/scripts/job-fair-aggregator.js +0 -0
  648. /package/{dist → packages/core/dist}/scripts/job-fair-aggregator.js.map +0 -0
  649. /package/{dist → packages/core/dist}/scripts/job-fair-aggregator.test.d.ts +0 -0
  650. /package/{dist → packages/core/dist}/scripts/job-fair-aggregator.test.d.ts.map +0 -0
  651. /package/{dist → packages/core/dist}/scripts/job-fair-aggregator.test.js +0 -0
  652. /package/{dist → packages/core/dist}/scripts/job-fair-aggregator.test.js.map +0 -0
  653. /package/{dist → packages/core/dist}/scripts/run-ci.test.d.ts +0 -0
  654. /package/{dist → packages/core/dist}/scripts/run-ci.test.d.ts.map +0 -0
  655. /package/{dist → packages/core/dist}/scripts/run-ci.test.js +0 -0
  656. /package/{dist → packages/core/dist}/scripts/run-ci.test.js.map +0 -0
  657. /package/{dist → packages/core/dist}/scripts/theme-detail.test.d.ts +0 -0
  658. /package/{dist → packages/core/dist}/scripts/theme-detail.test.d.ts.map +0 -0
  659. /package/{dist → packages/core/dist}/scripts/theme-detail.test.js +0 -0
  660. /package/{dist → packages/core/dist}/scripts/theme-detail.test.js.map +0 -0
  661. /package/{dist → packages/core/dist}/scripts/validate-ocean-profiles.d.ts +0 -0
  662. /package/{dist → packages/core/dist}/scripts/validate-ocean-profiles.d.ts.map +0 -0
  663. /package/{dist → packages/core/dist}/scripts/validate-ocean-profiles.js +0 -0
  664. /package/{dist → packages/core/dist}/scripts/validate-ocean-profiles.js.map +0 -0
  665. /package/{dist → packages/core/dist}/workflow/complete-step-integration.test.d.ts +0 -0
  666. /package/{dist → packages/core/dist}/workflow/complete-step-integration.test.d.ts.map +0 -0
  667. /package/{dist → packages/core/dist}/workflow/complete-step-integration.test.js +0 -0
  668. /package/{dist → packages/core/dist}/workflow/complete-step-integration.test.js.map +0 -0
  669. /package/{dist → packages/core/dist}/workflow/gate-handler.d.ts +0 -0
  670. /package/{dist → packages/core/dist}/workflow/gate-handler.d.ts.map +0 -0
  671. /package/{dist → packages/core/dist}/workflow/gate-handler.js +0 -0
  672. /package/{dist → packages/core/dist}/workflow/gate-handler.js.map +0 -0
  673. /package/{dist → packages/core/dist}/workflow/gate-handler.test.d.ts +0 -0
  674. /package/{dist → packages/core/dist}/workflow/gate-handler.test.d.ts.map +0 -0
  675. /package/{dist → packages/core/dist}/workflow/gate-handler.test.js +0 -0
  676. /package/{dist → packages/core/dist}/workflow/gate-handler.test.js.map +0 -0
  677. /package/{dist → packages/core/dist}/workflow/generic-sm-finish.d.ts +0 -0
  678. /package/{dist → packages/core/dist}/workflow/generic-sm-finish.d.ts.map +0 -0
  679. /package/{dist → packages/core/dist}/workflow/generic-sm-finish.js +0 -0
  680. /package/{dist → packages/core/dist}/workflow/generic-sm-finish.js.map +0 -0
  681. /package/{dist → packages/core/dist}/workflow/generic-sm-setup.d.ts +0 -0
  682. /package/{dist → packages/core/dist}/workflow/generic-sm-setup.d.ts.map +0 -0
  683. /package/{dist → packages/core/dist}/workflow/generic-sm-setup.js +0 -0
  684. /package/{dist → packages/core/dist}/workflow/generic-sm-setup.js.map +0 -0
  685. /package/{dist → packages/core/dist}/workflow/handoff.d.ts +0 -0
  686. /package/{dist → packages/core/dist}/workflow/handoff.d.ts.map +0 -0
  687. /package/{dist → packages/core/dist}/workflow/handoff.js +0 -0
  688. /package/{dist → packages/core/dist}/workflow/handoff.js.map +0 -0
  689. /package/{dist → packages/core/dist}/workflow/handoff.test.d.ts +0 -0
  690. /package/{dist → packages/core/dist}/workflow/handoff.test.d.ts.map +0 -0
  691. /package/{dist → packages/core/dist}/workflow/handoff.test.js +0 -0
  692. /package/{dist → packages/core/dist}/workflow/handoff.test.js.map +0 -0
  693. /package/{dist → packages/core/dist}/workflow/index.d.ts +0 -0
  694. /package/{dist → packages/core/dist}/workflow/index.d.ts.map +0 -0
  695. /package/{dist → packages/core/dist}/workflow/index.js +0 -0
  696. /package/{dist → packages/core/dist}/workflow/index.js.map +0 -0
  697. /package/{dist → packages/core/dist}/workflow/session-state.d.ts +0 -0
  698. /package/{dist → packages/core/dist}/workflow/session-state.d.ts.map +0 -0
  699. /package/{dist → packages/core/dist}/workflow/session-state.js +0 -0
  700. /package/{dist → packages/core/dist}/workflow/session-state.js.map +0 -0
  701. /package/{dist → packages/core/dist}/workflow/session-state.test.d.ts +0 -0
  702. /package/{dist → packages/core/dist}/workflow/session-state.test.d.ts.map +0 -0
  703. /package/{dist → packages/core/dist}/workflow/session-state.test.js +0 -0
  704. /package/{dist → packages/core/dist}/workflow/session-state.test.js.map +0 -0
  705. /package/{dist → packages/core/dist}/workflow/sm-subagents.test.d.ts +0 -0
  706. /package/{dist → packages/core/dist}/workflow/sm-subagents.test.d.ts.map +0 -0
  707. /package/{dist → packages/core/dist}/workflow/sm-subagents.test.js +0 -0
  708. /package/{dist → packages/core/dist}/workflow/sm-subagents.test.js.map +0 -0
  709. /package/{dist → packages/core/dist}/workflow/step-parser.d.ts +0 -0
  710. /package/{dist → packages/core/dist}/workflow/step-parser.d.ts.map +0 -0
  711. /package/{dist → packages/core/dist}/workflow/step-parser.js +0 -0
  712. /package/{dist → packages/core/dist}/workflow/step-parser.js.map +0 -0
  713. /package/{dist → packages/core/dist}/workflow/step-parser.test.d.ts +0 -0
  714. /package/{dist → packages/core/dist}/workflow/step-parser.test.d.ts.map +0 -0
  715. /package/{dist → packages/core/dist}/workflow/step-parser.test.js +0 -0
  716. /package/{dist → packages/core/dist}/workflow/step-parser.test.js.map +0 -0
  717. /package/{dist → packages/core/dist}/workflow/story-workflow-routing.test.d.ts +0 -0
  718. /package/{dist → packages/core/dist}/workflow/story-workflow-routing.test.d.ts.map +0 -0
  719. /package/{dist → packages/core/dist}/workflow/story-workflow-routing.test.js +0 -0
  720. /package/{dist → packages/core/dist}/workflow/story-workflow-routing.test.js.map +0 -0
  721. /package/{dist → packages/core/dist}/workflow/test-cache.d.ts +0 -0
  722. /package/{dist → packages/core/dist}/workflow/test-cache.d.ts.map +0 -0
  723. /package/{dist → packages/core/dist}/workflow/test-cache.js +0 -0
  724. /package/{dist → packages/core/dist}/workflow/test-cache.js.map +0 -0
  725. /package/{dist → packages/core/dist}/workflow/test-cache.test.d.ts +0 -0
  726. /package/{dist → packages/core/dist}/workflow/test-cache.test.d.ts.map +0 -0
  727. /package/{dist → packages/core/dist}/workflow/test-cache.test.js +0 -0
  728. /package/{dist → packages/core/dist}/workflow/test-cache.test.js.map +0 -0
  729. /package/{dist → packages/core/dist}/workflow/trimodal.d.ts +0 -0
  730. /package/{dist → packages/core/dist}/workflow/trimodal.d.ts.map +0 -0
  731. /package/{dist → packages/core/dist}/workflow/trimodal.js +0 -0
  732. /package/{dist → packages/core/dist}/workflow/trimodal.js.map +0 -0
  733. /package/{dist → packages/core/dist}/workflow/trimodal.test.d.ts +0 -0
  734. /package/{dist → packages/core/dist}/workflow/trimodal.test.d.ts.map +0 -0
  735. /package/{dist → packages/core/dist}/workflow/trimodal.test.js +0 -0
  736. /package/{dist → packages/core/dist}/workflow/trimodal.test.js.map +0 -0
  737. /package/{dist → packages/core/dist}/workflow/variable-resolver.d.ts +0 -0
  738. /package/{dist → packages/core/dist}/workflow/variable-resolver.d.ts.map +0 -0
  739. /package/{dist → packages/core/dist}/workflow/variable-resolver.js +0 -0
  740. /package/{dist → packages/core/dist}/workflow/variable-resolver.js.map +0 -0
  741. /package/{dist → packages/core/dist}/workflow/variable-resolver.test.d.ts +0 -0
  742. /package/{dist → packages/core/dist}/workflow/variable-resolver.test.d.ts.map +0 -0
  743. /package/{dist → packages/core/dist}/workflow/variable-resolver.test.js +0 -0
  744. /package/{dist → packages/core/dist}/workflow/variable-resolver.test.js.map +0 -0
  745. /package/{dist → packages/core/dist}/workflow/workflow-executor.d.ts +0 -0
  746. /package/{dist → packages/core/dist}/workflow/workflow-executor.d.ts.map +0 -0
  747. /package/{dist → packages/core/dist}/workflow/workflow-executor.js +0 -0
  748. /package/{dist → packages/core/dist}/workflow/workflow-executor.js.map +0 -0
  749. /package/{dist → packages/core/dist}/workflow/workflow-executor.test.d.ts +0 -0
  750. /package/{dist → packages/core/dist}/workflow/workflow-executor.test.d.ts.map +0 -0
  751. /package/{dist → packages/core/dist}/workflow/workflow-executor.test.js +0 -0
  752. /package/{dist → packages/core/dist}/workflow/workflow-executor.test.js.map +0 -0
  753. /package/{dist → packages/core/dist}/workflow/workflow-loader.d.ts +0 -0
  754. /package/{dist → packages/core/dist}/workflow/workflow-loader.d.ts.map +0 -0
  755. /package/{dist → packages/core/dist}/workflow/workflow-loader.js +0 -0
  756. /package/{dist → packages/core/dist}/workflow/workflow-loader.js.map +0 -0
  757. /package/{dist → packages/core/dist}/workflow/workflow-loader.test.d.ts +0 -0
  758. /package/{dist → packages/core/dist}/workflow/workflow-loader.test.d.ts.map +0 -0
  759. /package/{dist → packages/core/dist}/workflow/workflow-loader.test.js +0 -0
  760. /package/{dist → packages/core/dist}/workflow/workflow-loader.test.js.map +0 -0
  761. /package/{dist → packages/core/dist}/workflow/workflow-migration.test.d.ts +0 -0
  762. /package/{dist → packages/core/dist}/workflow/workflow-migration.test.d.ts.map +0 -0
  763. /package/{dist → packages/core/dist}/workflow/workflow-migration.test.js +0 -0
  764. /package/{dist → packages/core/dist}/workflow/workflow-migration.test.js.map +0 -0
  765. /package/{dist → packages/core/dist}/workflow/workflow-permissions.d.ts +0 -0
  766. /package/{dist → packages/core/dist}/workflow/workflow-permissions.d.ts.map +0 -0
  767. /package/{dist → packages/core/dist}/workflow/workflow-permissions.js +0 -0
  768. /package/{dist → packages/core/dist}/workflow/workflow-permissions.js.map +0 -0
  769. /package/{dist → packages/core/dist}/workflow/workflow-permissions.test.d.ts +0 -0
  770. /package/{dist → packages/core/dist}/workflow/workflow-permissions.test.d.ts.map +0 -0
  771. /package/{dist → packages/core/dist}/workflow/workflow-permissions.test.js +0 -0
  772. /package/{dist → packages/core/dist}/workflow/workflow-permissions.test.js.map +0 -0
  773. /package/{dist → packages/core/dist}/workflow/workflow-router.d.ts +0 -0
  774. /package/{dist → packages/core/dist}/workflow/workflow-router.d.ts.map +0 -0
  775. /package/{dist → packages/core/dist}/workflow/workflow-router.js +0 -0
  776. /package/{dist → packages/core/dist}/workflow/workflow-router.js.map +0 -0
  777. /package/{dist → packages/core/dist}/workflow/workflow-router.test.d.ts +0 -0
  778. /package/{dist → packages/core/dist}/workflow/workflow-router.test.d.ts.map +0 -0
  779. /package/{dist → packages/core/dist}/workflow/workflow-router.test.js +0 -0
  780. /package/{dist → packages/core/dist}/workflow/workflow-router.test.js.map +0 -0
  781. /package/{dist → packages/core/dist}/workflow/workflow-schema.d.ts +0 -0
  782. /package/{dist → packages/core/dist}/workflow/workflow-schema.d.ts.map +0 -0
  783. /package/{dist → packages/core/dist}/workflow/workflow-schema.js +0 -0
  784. /package/{dist → packages/core/dist}/workflow/workflow-schema.js.map +0 -0
  785. /package/{dist → packages/core/dist}/workflow/workflow-schema.test.d.ts +0 -0
  786. /package/{dist → packages/core/dist}/workflow/workflow-schema.test.d.ts.map +0 -0
  787. /package/{dist → packages/core/dist}/workflow/workflow-schema.test.js +0 -0
  788. /package/{dist → packages/core/dist}/workflow/workflow-schema.test.js.map +0 -0
  789. /package/{dist → packages/core/dist}/workflow/workflow-stepped-schema.test.d.ts +0 -0
  790. /package/{dist → packages/core/dist}/workflow/workflow-stepped-schema.test.d.ts.map +0 -0
  791. /package/{dist → packages/core/dist}/workflow/workflow-stepped-schema.test.js +0 -0
  792. /package/{dist → packages/core/dist}/workflow/workflow-stepped-schema.test.js.map +0 -0
@@ -0,0 +1,1050 @@
1
+ """Tests for pennyfarthing_scripts.prime module.
2
+
3
+ Tests context loading for prime command.
4
+ """
5
+
6
+ import pytest
7
+ from pathlib import Path
8
+ from unittest.mock import patch, MagicMock
9
+
10
+ from pennyfarthing_scripts.prime.loader import (
11
+ load_agent_definition,
12
+ load_behavior_guide,
13
+ load_sprint_context,
14
+ load_session_context,
15
+ load_sidecars,
16
+ load_domain_docs,
17
+ _extract_session_parts,
18
+ _find_session_file,
19
+ )
20
+ from pennyfarthing_scripts.prime.cli import prime, main
21
+
22
+
23
+ class TestLoadAgentDefinition:
24
+ """Tests for load_agent_definition function."""
25
+
26
+ def test_load_existing_agent(self, tmp_path: Path) -> None:
27
+ """Test loading an existing agent definition."""
28
+ # Setup
29
+ agents_dir = tmp_path / ".pennyfarthing" / "agents"
30
+ agents_dir.mkdir(parents=True)
31
+ agent_file = agents_dir / "dev.md"
32
+ agent_file.write_text("# Developer Agent\n\nTest content")
33
+
34
+ # Test
35
+ result = load_agent_definition("dev", tmp_path)
36
+
37
+ # Verify
38
+ assert result is not None
39
+ assert "# Developer Agent" in result
40
+ assert "Test content" in result
41
+
42
+ def test_load_nonexistent_agent(self, tmp_path: Path) -> None:
43
+ """Test loading a non-existent agent returns None."""
44
+ # Setup
45
+ agents_dir = tmp_path / ".pennyfarthing" / "agents"
46
+ agents_dir.mkdir(parents=True)
47
+
48
+ # Test
49
+ result = load_agent_definition("nonexistent", tmp_path)
50
+
51
+ # Verify
52
+ assert result is None
53
+
54
+
55
+ class TestLoadBehaviorGuide:
56
+ """Tests for load_behavior_guide function."""
57
+
58
+ def test_load_existing_guide(self, tmp_path: Path) -> None:
59
+ """Test loading an existing behavior guide."""
60
+ # Setup
61
+ guides_dir = tmp_path / ".pennyfarthing" / "guides"
62
+ guides_dir.mkdir(parents=True)
63
+ guide_file = guides_dir / "agent-behavior.md"
64
+ guide_file.write_text("# Agent Behavior Guide\n\nShared protocols")
65
+
66
+ # Test
67
+ result = load_behavior_guide(tmp_path)
68
+
69
+ # Verify
70
+ assert result is not None
71
+ assert "# Agent Behavior Guide" in result
72
+
73
+ def test_load_nonexistent_guide(self, tmp_path: Path) -> None:
74
+ """Test loading a non-existent guide returns None."""
75
+ # Setup
76
+ guides_dir = tmp_path / ".pennyfarthing" / "guides"
77
+ guides_dir.mkdir(parents=True)
78
+
79
+ # Test
80
+ result = load_behavior_guide(tmp_path)
81
+
82
+ # Verify
83
+ assert result is None
84
+
85
+
86
+ class TestLoadSprintContext:
87
+ """Tests for load_sprint_context function."""
88
+
89
+ def test_load_sprint_context(self, tmp_path: Path, sample_sprint_data: dict) -> None:
90
+ """Test loading sprint context."""
91
+ import yaml
92
+
93
+ # Setup
94
+ sprint_dir = tmp_path / "sprint"
95
+ sprint_dir.mkdir()
96
+ sprint_file = sprint_dir / "current-sprint.yaml"
97
+ # Add sprint number for the test
98
+ sample_sprint_data["sprint"]["number"] = 2604
99
+ sample_sprint_data["sprint"]["goal"] = "Test Goal"
100
+ sprint_file.write_text(yaml.dump(sample_sprint_data))
101
+
102
+ # Also need .pennyfarthing dir for project root detection
103
+ pf_dir = tmp_path / ".pennyfarthing"
104
+ pf_dir.mkdir()
105
+
106
+ # Test
107
+ with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
108
+ with patch("pennyfarthing_scripts.sprint.loader.get_project_root", return_value=tmp_path):
109
+ result = load_sprint_context(tmp_path)
110
+
111
+ # Verify
112
+ assert result is not None
113
+ assert "Sprint 2604" in result
114
+
115
+ def test_no_sprint_file(self, tmp_path: Path) -> None:
116
+ """Test when no sprint file exists."""
117
+ # Setup - no sprint file
118
+ pf_dir = tmp_path / ".pennyfarthing"
119
+ pf_dir.mkdir()
120
+
121
+ # Test
122
+ result = load_sprint_context(tmp_path)
123
+
124
+ # Verify
125
+ assert result is None
126
+
127
+
128
+ class TestExtractSessionParts:
129
+ """Tests for _extract_session_parts function."""
130
+
131
+ def test_extract_header_and_assessment(self) -> None:
132
+ """Test extracting header and assessment from session file."""
133
+ content = """# Session: Test Story
134
+
135
+ Story: 63-1
136
+ Status: in_progress
137
+ Agent: dev
138
+
139
+ ## TEA Assessment
140
+
141
+ Tests written successfully.
142
+ Coverage: 85%
143
+
144
+ ## Dev Assessment
145
+
146
+ Implementation complete.
147
+ All tests passing.
148
+ """
149
+ header, assessment = _extract_session_parts(content)
150
+
151
+ # Header should be everything before first ##
152
+ assert "# Session: Test Story" in header
153
+ assert "Story: 63-1" in header
154
+ assert "Agent: dev" in header
155
+
156
+ # Assessment should be the LAST assessment section
157
+ assert "## Dev Assessment" in assessment
158
+ assert "Implementation complete" in assessment
159
+ # Should NOT include TEA assessment
160
+ assert "TEA Assessment" not in assessment
161
+
162
+ def test_extract_no_assessment(self) -> None:
163
+ """Test when no assessment section exists."""
164
+ content = """# Session: Test Story
165
+
166
+ Story: 63-1
167
+ Status: in_progress
168
+ """
169
+ header, assessment = _extract_session_parts(content)
170
+
171
+ assert "# Session: Test Story" in header
172
+ assert assessment == ""
173
+
174
+ def test_extract_header_only(self) -> None:
175
+ """Test file with only header content."""
176
+ content = "# Session Header\n\nSome metadata"
177
+
178
+ header, assessment = _extract_session_parts(content)
179
+
180
+ assert "# Session Header" in header
181
+ assert assessment == ""
182
+
183
+
184
+ class TestFindSessionFile:
185
+ """Tests for _find_session_file function."""
186
+
187
+ def test_find_session_file(self, tmp_path: Path) -> None:
188
+ """Test finding session file."""
189
+ # Setup
190
+ session_dir = tmp_path / ".session"
191
+ session_dir.mkdir()
192
+ session_file = session_dir / "63-1-session.md"
193
+ session_file.write_text("# Session")
194
+
195
+ # Test
196
+ result = _find_session_file(tmp_path)
197
+
198
+ # Verify
199
+ assert result is not None
200
+ assert result.name == "63-1-session.md"
201
+
202
+ def test_no_session_directory(self, tmp_path: Path) -> None:
203
+ """Test when no session directory exists."""
204
+ result = _find_session_file(tmp_path)
205
+ assert result is None
206
+
207
+ def test_empty_session_directory(self, tmp_path: Path) -> None:
208
+ """Test when session directory is empty."""
209
+ session_dir = tmp_path / ".session"
210
+ session_dir.mkdir()
211
+
212
+ result = _find_session_file(tmp_path)
213
+ assert result is None
214
+
215
+
216
+ class TestLoadSessionContext:
217
+ """Tests for load_session_context function."""
218
+
219
+ def test_load_session_context(self, tmp_path: Path) -> None:
220
+ """Test loading full session context."""
221
+ # Setup
222
+ pf_dir = tmp_path / ".pennyfarthing"
223
+ pf_dir.mkdir()
224
+ session_dir = tmp_path / ".session"
225
+ session_dir.mkdir()
226
+ session_file = session_dir / "63-1-session.md"
227
+ session_file.write_text("""# Session: Story 63-1
228
+
229
+ Story: 63-1
230
+ Status: in_progress
231
+
232
+ ## Dev Assessment
233
+
234
+ Work complete.
235
+ """)
236
+
237
+ # Test
238
+ with patch("pennyfarthing_scripts.prime.loader.get_project_root", return_value=tmp_path):
239
+ result = load_session_context(tmp_path)
240
+
241
+ # Verify
242
+ assert result is not None
243
+ filename, header, assessment = result
244
+ assert filename == "63-1-session.md"
245
+ assert "# Session: Story 63-1" in header
246
+ assert "## Dev Assessment" in assessment
247
+
248
+
249
+ class TestLoadSidecars:
250
+ """Tests for load_sidecars function."""
251
+
252
+ def test_load_all_sidecars(self, tmp_path: Path) -> None:
253
+ """Test loading all sidecar files."""
254
+ # Setup
255
+ sidecar_dir = tmp_path / ".pennyfarthing" / "sidecars" / "dev"
256
+ sidecar_dir.mkdir(parents=True)
257
+ (sidecar_dir / "patterns.md").write_text("# Patterns")
258
+ (sidecar_dir / "gotchas.md").write_text("# Gotchas")
259
+ (sidecar_dir / "decisions.md").write_text("# Decisions")
260
+
261
+ # Test
262
+ result = load_sidecars("dev", tmp_path)
263
+
264
+ # Verify
265
+ assert len(result) == 3
266
+ assert "# Patterns" in result["patterns.md"]
267
+ assert "# Gotchas" in result["gotchas.md"]
268
+ assert "# Decisions" in result["decisions.md"]
269
+
270
+ def test_load_partial_sidecars(self, tmp_path: Path) -> None:
271
+ """Test loading when only some sidecars exist."""
272
+ # Setup
273
+ sidecar_dir = tmp_path / ".pennyfarthing" / "sidecars" / "dev"
274
+ sidecar_dir.mkdir(parents=True)
275
+ (sidecar_dir / "patterns.md").write_text("# Patterns only")
276
+
277
+ # Test
278
+ result = load_sidecars("dev", tmp_path)
279
+
280
+ # Verify
281
+ assert len(result) == 1
282
+ assert "patterns.md" in result
283
+
284
+ def test_no_sidecar_directory(self, tmp_path: Path) -> None:
285
+ """Test when no sidecar directory exists."""
286
+ result = load_sidecars("dev", tmp_path)
287
+ assert result == {}
288
+
289
+
290
+ class TestLoadDomainDocs:
291
+ """Tests for load_domain_docs function."""
292
+
293
+ def test_load_domain_docs(self, tmp_path: Path) -> None:
294
+ """Test loading domain documentation."""
295
+ # Setup
296
+ project_dir = tmp_path / ".claude" / "project"
297
+ project_dir.mkdir(parents=True)
298
+ (project_dir / "CLAUDE-api.md").write_text("# API Docs")
299
+ (project_dir / "CLAUDE-testing.md").write_text("# Testing Docs")
300
+ (project_dir / "other-file.md").write_text("# Not included")
301
+
302
+ # Test
303
+ result = load_domain_docs(tmp_path)
304
+
305
+ # Verify
306
+ assert len(result) == 2
307
+ filenames = [f for f, _ in result]
308
+ assert "CLAUDE-api.md" in filenames
309
+ assert "CLAUDE-testing.md" in filenames
310
+ assert "other-file.md" not in filenames
311
+
312
+ def test_no_domain_docs_directory(self, tmp_path: Path) -> None:
313
+ """Test when no .claude/project directory exists."""
314
+ result = load_domain_docs(tmp_path)
315
+ assert result == []
316
+
317
+
318
+ class TestPrimeFunction:
319
+ """Tests for the prime() function."""
320
+
321
+ def test_minimal_mode(self, tmp_path: Path, capsys) -> None:
322
+ """Test minimal mode returns immediately."""
323
+ result = prime(minimal=True, project_root=tmp_path)
324
+
325
+ assert result == 0
326
+ captured = capsys.readouterr()
327
+ assert captured.out == ""
328
+
329
+ def test_quiet_suppresses_headers(self, tmp_path: Path, capsys) -> None:
330
+ """Test quiet mode suppresses headers but shows content."""
331
+ # Setup
332
+ pf_dir = tmp_path / ".pennyfarthing"
333
+ pf_dir.mkdir()
334
+ agents_dir = pf_dir / "agents"
335
+ agents_dir.mkdir()
336
+ (agents_dir / "dev.md").write_text("Agent content here")
337
+
338
+ # Test
339
+ with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
340
+ result = prime(agent_name="dev", quiet=True, project_root=tmp_path)
341
+
342
+ # Verify
343
+ assert result == 0
344
+ captured = capsys.readouterr()
345
+ assert "Agent content here" in captured.out
346
+ assert "# Agent Definition" not in captured.out
347
+
348
+
349
+ class TestMainCLI:
350
+ """Tests for CLI main() function."""
351
+
352
+ def test_help_flag(self) -> None:
353
+ """Test --help flag."""
354
+ with pytest.raises(SystemExit) as exc_info:
355
+ main(["--help"])
356
+ assert exc_info.value.code == 0
357
+
358
+ def test_minimal_flag(self, capsys) -> None:
359
+ """Test --minimal flag."""
360
+ # With minimal, should just return 0 without any output
361
+ with patch("pennyfarthing_scripts.prime.cli.get_project_root") as mock_root:
362
+ mock_root.return_value = Path("/tmp/test")
363
+ result = main(["--minimal"])
364
+
365
+ assert result == 0
366
+ captured = capsys.readouterr()
367
+ assert captured.out == ""
368
+
369
+ def test_agent_flag(self, tmp_path: Path, capsys) -> None:
370
+ """Test --agent flag."""
371
+ # Setup
372
+ pf_dir = tmp_path / ".pennyfarthing"
373
+ pf_dir.mkdir()
374
+ agents_dir = pf_dir / "agents"
375
+ agents_dir.mkdir()
376
+ (agents_dir / "tea.md").write_text("# TEA Agent\nTest content")
377
+
378
+ # Test
379
+ with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
380
+ result = main(["--agent", "tea"])
381
+
382
+ # Verify
383
+ assert result == 0
384
+ captured = capsys.readouterr()
385
+ assert "# TEA Agent" in captured.out
386
+
387
+ def test_project_not_found_error(self, capsys) -> None:
388
+ """Test error handling when project root not found."""
389
+ with patch(
390
+ "pennyfarthing_scripts.prime.cli.get_project_root",
391
+ side_effect=FileNotFoundError("No project found"),
392
+ ):
393
+ result = main([])
394
+
395
+ assert result == 1
396
+ captured = capsys.readouterr()
397
+ assert "Error" in captured.err
398
+
399
+
400
+ # =============================================================================
401
+ # Prime v2 Tests - Workflow State Detection
402
+ # =============================================================================
403
+
404
+
405
+ class TestWorkflowStateDetection:
406
+ """Tests for workflow state detection (Prime v2)."""
407
+
408
+ def test_detect_finish_state(self, tmp_path: Path) -> None:
409
+ """Test detecting FINISH_STATE when phase is approved."""
410
+ from pennyfarthing_scripts.prime.workflow import detect_workflow_state
411
+ from pennyfarthing_scripts.prime.models import WorkflowState
412
+
413
+ # Setup
414
+ pf_dir = tmp_path / ".pennyfarthing"
415
+ pf_dir.mkdir()
416
+ session_dir = tmp_path / ".session"
417
+ session_dir.mkdir()
418
+ session_file = session_dir / "MSSCI-12345-session.md"
419
+ session_file.write_text("""# MSSCI-12345: Test Story
420
+
421
+ ## Story Context
422
+ - **ID:** MSSCI-12345
423
+ - **Workflow:** tdd
424
+
425
+ ## Workflow Phase
426
+ - **Current Phase:** REVIEW (APPROVED)
427
+ """)
428
+
429
+ # Test
430
+ result = detect_workflow_state(tmp_path)
431
+
432
+ # Verify
433
+ assert result.state == WorkflowState.FINISH_STATE
434
+ assert result.story_id == "MSSCI-12345"
435
+ assert result.phase_owner == "sm"
436
+
437
+ def test_detect_in_progress_state(self, tmp_path: Path) -> None:
438
+ """Test detecting IN_PROGRESS_STATE with active phase."""
439
+ from pennyfarthing_scripts.prime.workflow import detect_workflow_state
440
+ from pennyfarthing_scripts.prime.models import WorkflowState
441
+ import yaml
442
+
443
+ # Setup
444
+ pf_dir = tmp_path / ".pennyfarthing"
445
+ pf_dir.mkdir()
446
+
447
+ # Create workflow YAML
448
+ workflows_dir = tmp_path / "pennyfarthing-dist" / "workflows"
449
+ workflows_dir.mkdir(parents=True)
450
+ (workflows_dir / "tdd.yaml").write_text(yaml.dump({
451
+ "workflow": {
452
+ "phases": [
453
+ {"name": "setup", "agent": "sm"},
454
+ {"name": "red", "agent": "tea"},
455
+ {"name": "green", "agent": "dev"},
456
+ {"name": "review", "agent": "reviewer"},
457
+ ]
458
+ }
459
+ }))
460
+
461
+ session_dir = tmp_path / ".session"
462
+ session_dir.mkdir()
463
+ session_file = session_dir / "63-5-session.md"
464
+ session_file.write_text("""# 63-5: Test Story
465
+
466
+ ## Story Context
467
+ - **ID:** 63-5
468
+ - **Workflow:** tdd
469
+
470
+ ## Workflow Phase
471
+ - **Current Phase:** green
472
+ """)
473
+
474
+ # Test
475
+ result = detect_workflow_state(tmp_path)
476
+
477
+ # Verify
478
+ assert result.state == WorkflowState.IN_PROGRESS_STATE
479
+ assert result.story_id == "63-5"
480
+ assert result.phase == "green"
481
+ assert result.phase_owner == "dev"
482
+ assert result.workflow == "tdd"
483
+
484
+ def test_detect_new_work_state(self, tmp_path: Path) -> None:
485
+ """Test detecting NEW_WORK_STATE with backlog stories."""
486
+ from pennyfarthing_scripts.prime.workflow import detect_workflow_state
487
+ from pennyfarthing_scripts.prime.models import WorkflowState
488
+ import yaml
489
+
490
+ # Setup
491
+ pf_dir = tmp_path / ".pennyfarthing"
492
+ pf_dir.mkdir()
493
+ sprint_dir = tmp_path / "sprint"
494
+ sprint_dir.mkdir()
495
+ (sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
496
+ "sprint": {"number": 12},
497
+ "epics": [
498
+ {
499
+ "id": "epic-1",
500
+ "stories": [
501
+ {"id": "1-1", "status": "backlog", "points": 3},
502
+ {"id": "1-2", "status": "ready", "points": 5},
503
+ ]
504
+ }
505
+ ]
506
+ }))
507
+
508
+ # Test
509
+ result = detect_workflow_state(tmp_path)
510
+
511
+ # Verify
512
+ assert result.state == WorkflowState.NEW_WORK_STATE
513
+ assert result.backlog_count == 2
514
+
515
+ def test_detect_empty_backlog_state(self, tmp_path: Path) -> None:
516
+ """Test detecting EMPTY_BACKLOG_STATE with no backlog."""
517
+ from pennyfarthing_scripts.prime.workflow import detect_workflow_state
518
+ from pennyfarthing_scripts.prime.models import WorkflowState
519
+ import yaml
520
+
521
+ # Setup
522
+ pf_dir = tmp_path / ".pennyfarthing"
523
+ pf_dir.mkdir()
524
+ sprint_dir = tmp_path / "sprint"
525
+ sprint_dir.mkdir()
526
+ (sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
527
+ "sprint": {"number": 12},
528
+ "epics": [
529
+ {
530
+ "id": "epic-1",
531
+ "stories": [
532
+ {"id": "1-1", "status": "done", "points": 3},
533
+ ]
534
+ }
535
+ ]
536
+ }))
537
+
538
+ # Test
539
+ result = detect_workflow_state(tmp_path)
540
+
541
+ # Verify
542
+ assert result.state == WorkflowState.EMPTY_BACKLOG_STATE
543
+
544
+
545
+ class TestParseSessionHeader:
546
+ """Tests for session header parsing."""
547
+
548
+ def test_parse_standard_header(self, tmp_path: Path) -> None:
549
+ """Test parsing a standard session header."""
550
+ from pennyfarthing_scripts.prime.workflow import parse_session_header
551
+
552
+ session_file = tmp_path / "MSSCI-12345-session.md"
553
+ session_file.write_text("""# MSSCI-12345: Test Story
554
+
555
+ ## Story Context
556
+ - **ID:** MSSCI-12345
557
+ - **Workflow:** tdd
558
+
559
+ ## Workflow Phase
560
+ - **Current Phase:** green
561
+ """)
562
+
563
+ result = parse_session_header(session_file)
564
+
565
+ assert result["story_id"] == "MSSCI-12345"
566
+ assert result["workflow"] == "tdd"
567
+ assert result["phase"] == "green"
568
+
569
+ def test_parse_approved_phase(self, tmp_path: Path) -> None:
570
+ """Test parsing phase with APPROVED status."""
571
+ from pennyfarthing_scripts.prime.workflow import parse_session_header
572
+
573
+ session_file = tmp_path / "63-1-session.md"
574
+ session_file.write_text("""# Session
575
+
576
+ - **Current Phase:** REVIEW (APPROVED)
577
+ """)
578
+
579
+ result = parse_session_header(session_file)
580
+
581
+ assert result["phase"] == "review"
582
+ assert result["phase_status"] == "approved"
583
+
584
+
585
+ class TestCheckRedirect:
586
+ """Tests for redirect detection."""
587
+
588
+ def test_redirect_when_wrong_agent(self) -> None:
589
+ """Test redirect is detected when wrong agent is activated."""
590
+ from pennyfarthing_scripts.prime.workflow import check_redirect
591
+ from pennyfarthing_scripts.prime.models import WorkflowState, WorkflowStatus
592
+
593
+ status = WorkflowStatus(
594
+ state=WorkflowState.IN_PROGRESS_STATE,
595
+ phase="green",
596
+ phase_owner="dev",
597
+ )
598
+
599
+ result = check_redirect(status, "tea")
600
+
601
+ assert result is not None
602
+ target, reason = result
603
+ assert target == "dev"
604
+ assert "green" in reason
605
+ assert "dev" in reason
606
+
607
+ def test_no_redirect_when_correct_agent(self) -> None:
608
+ """Test no redirect when correct agent is activated."""
609
+ from pennyfarthing_scripts.prime.workflow import check_redirect
610
+ from pennyfarthing_scripts.prime.models import WorkflowState, WorkflowStatus
611
+
612
+ status = WorkflowStatus(
613
+ state=WorkflowState.IN_PROGRESS_STATE,
614
+ phase="green",
615
+ phase_owner="dev",
616
+ )
617
+
618
+ result = check_redirect(status, "dev")
619
+
620
+ assert result is None
621
+
622
+ def test_no_redirect_for_new_work(self) -> None:
623
+ """Test no redirect for NEW_WORK_STATE."""
624
+ from pennyfarthing_scripts.prime.workflow import check_redirect
625
+ from pennyfarthing_scripts.prime.models import WorkflowState, WorkflowStatus
626
+
627
+ status = WorkflowStatus(
628
+ state=WorkflowState.NEW_WORK_STATE,
629
+ backlog_count=5,
630
+ )
631
+
632
+ result = check_redirect(status, "dev")
633
+
634
+ assert result is None
635
+
636
+
637
+ # =============================================================================
638
+ # Prime v2 Tests - Persona Loading
639
+ # =============================================================================
640
+
641
+
642
+ class TestPersonaLoading:
643
+ """Tests for persona loading (Prime v2)."""
644
+
645
+ def test_load_persona_from_theme(self, tmp_path: Path) -> None:
646
+ """Test loading persona from theme YAML."""
647
+ from pennyfarthing_scripts.prime.persona import load_persona
648
+ import yaml
649
+
650
+ # Setup
651
+ pf_dir = tmp_path / ".pennyfarthing"
652
+ pf_dir.mkdir()
653
+
654
+ # Create config
655
+ (pf_dir / "config.local.yaml").write_text(yaml.dump({"theme": "test-theme"}))
656
+
657
+ # Create theme
658
+ themes_dir = pf_dir / "personas" / "themes"
659
+ themes_dir.mkdir(parents=True)
660
+ (themes_dir / "test-theme.yaml").write_text(yaml.dump({
661
+ "theme": {"name": "Test Theme"},
662
+ "agents": {
663
+ "dev": {
664
+ "character": "Test Developer",
665
+ "style": "Test style",
666
+ "role": "Test role",
667
+ "quote": "Test quote",
668
+ }
669
+ }
670
+ }))
671
+
672
+ # Test
673
+ persona, theme = load_persona("dev", tmp_path)
674
+
675
+ # Verify
676
+ assert persona is not None
677
+ assert persona.character == "Test Developer"
678
+ assert persona.style == "Test style"
679
+ assert persona.role == "Test role"
680
+ assert persona.quote == "Test quote"
681
+ assert theme == "test-theme"
682
+
683
+ def test_load_persona_no_theme(self, tmp_path: Path) -> None:
684
+ """Test load_persona returns None when no theme configured."""
685
+ from pennyfarthing_scripts.prime.persona import load_persona
686
+
687
+ # Setup - no config
688
+ pf_dir = tmp_path / ".pennyfarthing"
689
+ pf_dir.mkdir()
690
+
691
+ # Test
692
+ persona, theme = load_persona("dev", tmp_path)
693
+
694
+ # Verify
695
+ assert persona is None
696
+ assert theme is None
697
+
698
+ def test_get_crew_manifest(self, tmp_path: Path) -> None:
699
+ """Test getting crew manifest for handoff reference."""
700
+ from pennyfarthing_scripts.prime.persona import get_crew_manifest
701
+ import yaml
702
+
703
+ # Setup
704
+ pf_dir = tmp_path / ".pennyfarthing"
705
+ pf_dir.mkdir()
706
+
707
+ # Create config
708
+ (pf_dir / "config.local.yaml").write_text(yaml.dump({"theme": "test-theme"}))
709
+
710
+ # Create theme with multiple agents
711
+ themes_dir = pf_dir / "personas" / "themes"
712
+ themes_dir.mkdir(parents=True)
713
+ (themes_dir / "test-theme.yaml").write_text(yaml.dump({
714
+ "agents": {
715
+ "sm": {"character": "Scrum Master"},
716
+ "tea": {"character": "Test Engineer"},
717
+ "dev": {"character": "Developer"},
718
+ }
719
+ }))
720
+
721
+ # Test
722
+ crew = get_crew_manifest(tmp_path)
723
+
724
+ # Verify
725
+ assert len(crew) == 3
726
+ roles = {c.role for c in crew}
727
+ assert "sm" in roles
728
+ assert "tea" in roles
729
+ assert "dev" in roles
730
+
731
+ def test_format_persona_output(self) -> None:
732
+ """Test formatting persona as XML."""
733
+ from pennyfarthing_scripts.prime.persona import format_persona_output
734
+ from pennyfarthing_scripts.prime.models import Persona, CrewMember
735
+
736
+ persona = Persona(
737
+ character="Naomi Nagata",
738
+ style="Precise, systematic",
739
+ role="The XO and engineer",
740
+ quote="I can fix this.",
741
+ )
742
+ crew = [
743
+ CrewMember(role="sm", character="Drummer"),
744
+ CrewMember(role="dev", character="Naomi"),
745
+ ]
746
+
747
+ result = format_persona_output(persona, "the-expanse", "dev", crew, "Bossmang")
748
+
749
+ assert '<persona agent="dev" theme="the-expanse">' in result
750
+ assert "Character: Naomi Nagata" in result
751
+ assert "Quote: I can fix this." in result
752
+ assert "<user-title>Address the user as: Bossmang</user-title>" in result
753
+ assert '<crew theme="the-expanse">' in result
754
+
755
+
756
+ # =============================================================================
757
+ # Prime v2 Tests - Session Registration
758
+ # =============================================================================
759
+
760
+
761
+ class TestSessionRegistration:
762
+ """Tests for session registration (Prime v2)."""
763
+
764
+ def test_register_session(self, tmp_path: Path) -> None:
765
+ """Test registering a new session."""
766
+ from pennyfarthing_scripts.prime.session import register_session
767
+
768
+ # Setup
769
+ pf_dir = tmp_path / ".pennyfarthing"
770
+ pf_dir.mkdir()
771
+
772
+ # Test
773
+ result = register_session("dev", session_id="test-123", project_root=tmp_path)
774
+
775
+ # Verify
776
+ assert result.session_id == "test-123"
777
+ assert result.agent_name == "dev"
778
+
779
+ # Check file was created
780
+ session_file = tmp_path / ".session" / "agents" / "test-123"
781
+ assert session_file.exists()
782
+ assert session_file.read_text() == "dev"
783
+
784
+ def test_register_session_generates_id(self, tmp_path: Path) -> None:
785
+ """Test that session ID is generated if not provided."""
786
+ from pennyfarthing_scripts.prime.session import register_session
787
+
788
+ # Setup
789
+ pf_dir = tmp_path / ".pennyfarthing"
790
+ pf_dir.mkdir()
791
+
792
+ # Test
793
+ result = register_session("tea", project_root=tmp_path)
794
+
795
+ # Verify - should have a UUID-like session ID
796
+ assert result.session_id is not None
797
+ assert len(result.session_id) > 0
798
+
799
+ def test_cleanup_old_sessions(self, tmp_path: Path) -> None:
800
+ """Test cleanup of old session files."""
801
+ from pennyfarthing_scripts.prime.session import cleanup_old_sessions
802
+ import time
803
+
804
+ # Setup
805
+ pf_dir = tmp_path / ".pennyfarthing"
806
+ pf_dir.mkdir()
807
+ agents_dir = tmp_path / ".session" / "agents"
808
+ agents_dir.mkdir(parents=True)
809
+
810
+ # Create an old session file
811
+ old_session = agents_dir / "old-session"
812
+ old_session.write_text("sm")
813
+ # Set mtime to 10 days ago
814
+ old_time = time.time() - (10 * 86400)
815
+ import os
816
+ os.utime(old_session, (old_time, old_time))
817
+
818
+ # Create a new session file
819
+ new_session = agents_dir / "new-session"
820
+ new_session.write_text("dev")
821
+
822
+ # Test
823
+ removed = cleanup_old_sessions(tmp_path, max_age_days=7)
824
+
825
+ # Verify
826
+ assert removed == 1
827
+ assert not old_session.exists()
828
+ assert new_session.exists()
829
+
830
+ def test_get_session_agent(self, tmp_path: Path) -> None:
831
+ """Test getting agent name for a session."""
832
+ from pennyfarthing_scripts.prime.session import get_session_agent
833
+
834
+ # Setup
835
+ pf_dir = tmp_path / ".pennyfarthing"
836
+ pf_dir.mkdir()
837
+ agents_dir = tmp_path / ".session" / "agents"
838
+ agents_dir.mkdir(parents=True)
839
+ (agents_dir / "test-session").write_text("reviewer")
840
+
841
+ # Test
842
+ result = get_session_agent("test-session", tmp_path)
843
+
844
+ # Verify
845
+ assert result == "reviewer"
846
+
847
+ def test_unregister_session(self, tmp_path: Path) -> None:
848
+ """Test unregistering a session."""
849
+ from pennyfarthing_scripts.prime.session import unregister_session
850
+
851
+ # Setup
852
+ pf_dir = tmp_path / ".pennyfarthing"
853
+ pf_dir.mkdir()
854
+ agents_dir = tmp_path / ".session" / "agents"
855
+ agents_dir.mkdir(parents=True)
856
+ session_file = agents_dir / "to-remove"
857
+ session_file.write_text("dev")
858
+
859
+ # Test
860
+ result = unregister_session("to-remove", tmp_path)
861
+
862
+ # Verify
863
+ assert result is True
864
+ assert not session_file.exists()
865
+
866
+
867
+ # =============================================================================
868
+ # Prime v2 Tests - JSON Output
869
+ # =============================================================================
870
+
871
+
872
+ class TestJSONOutput:
873
+ """Tests for JSON output (Prime v2)."""
874
+
875
+ def test_json_output_minimal(self, tmp_path: Path, capsys) -> None:
876
+ """Test JSON output in minimal mode."""
877
+ import json
878
+
879
+ result = prime(minimal=True, json_output=True, project_root=tmp_path)
880
+
881
+ assert result == 0
882
+ captured = capsys.readouterr()
883
+ data = json.loads(captured.out)
884
+ assert data["minimal"] is True
885
+
886
+ def test_json_output_with_workflow(self, tmp_path: Path, capsys) -> None:
887
+ """Test JSON output includes workflow status."""
888
+ import json
889
+ import yaml
890
+
891
+ # Setup
892
+ pf_dir = tmp_path / ".pennyfarthing"
893
+ pf_dir.mkdir()
894
+ sprint_dir = tmp_path / "sprint"
895
+ sprint_dir.mkdir()
896
+ (sprint_dir / "current-sprint.yaml").write_text(yaml.dump({
897
+ "sprint": {"number": 12},
898
+ "epics": [
899
+ {
900
+ "id": "epic-1",
901
+ "stories": [
902
+ {"id": "1-1", "status": "backlog", "points": 3},
903
+ ]
904
+ }
905
+ ]
906
+ }))
907
+
908
+ # Test
909
+ result = prime(
910
+ agent_name="sm",
911
+ json_output=True,
912
+ no_persona=True,
913
+ no_register=True,
914
+ project_root=tmp_path,
915
+ )
916
+
917
+ assert result == 0
918
+ captured = capsys.readouterr()
919
+ data = json.loads(captured.out)
920
+
921
+ assert "workflow_status" in data
922
+ assert data["workflow_status"]["state"] == "NEW_WORK_STATE"
923
+ assert data["workflow_status"]["backlog_count"] == 1
924
+
925
+ def test_json_output_with_redirect(self, tmp_path: Path, capsys) -> None:
926
+ """Test JSON output includes redirect info."""
927
+ import json
928
+ import yaml
929
+
930
+ # Setup
931
+ pf_dir = tmp_path / ".pennyfarthing"
932
+ pf_dir.mkdir()
933
+
934
+ # Create workflow YAML
935
+ workflows_dir = tmp_path / "pennyfarthing-dist" / "workflows"
936
+ workflows_dir.mkdir(parents=True)
937
+ (workflows_dir / "tdd.yaml").write_text(yaml.dump({
938
+ "workflow": {
939
+ "phases": [
940
+ {"name": "green", "agent": "dev"},
941
+ ]
942
+ }
943
+ }))
944
+
945
+ session_dir = tmp_path / ".session"
946
+ session_dir.mkdir()
947
+ (session_dir / "test-session.md").write_text("""# Test
948
+
949
+ - **Workflow:** tdd
950
+ - **Current Phase:** green
951
+ """)
952
+
953
+ # Test - activating TEA when DEV owns the phase
954
+ result = prime(
955
+ agent_name="tea",
956
+ json_output=True,
957
+ no_persona=True,
958
+ no_register=True,
959
+ project_root=tmp_path,
960
+ )
961
+
962
+ assert result == 0
963
+ captured = capsys.readouterr()
964
+ data = json.loads(captured.out)
965
+
966
+ assert data["redirect_to"] == "dev"
967
+ assert "green" in data["redirect_reason"]
968
+
969
+
970
+ # =============================================================================
971
+ # Prime v2 Tests - CLI Flags
972
+ # =============================================================================
973
+
974
+
975
+ class TestCLIFlagsV2:
976
+ """Tests for new CLI flags in Prime v2."""
977
+
978
+ def test_json_flag(self, tmp_path: Path, capsys) -> None:
979
+ """Test --json flag."""
980
+ import json
981
+
982
+ pf_dir = tmp_path / ".pennyfarthing"
983
+ pf_dir.mkdir()
984
+
985
+ with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
986
+ result = main(["--json", "--no-workflow", "--no-register"])
987
+
988
+ assert result == 0
989
+ captured = capsys.readouterr()
990
+ # Should be valid JSON
991
+ data = json.loads(captured.out)
992
+ assert "agent_name" in data
993
+
994
+ def test_no_persona_flag(self, tmp_path: Path, capsys) -> None:
995
+ """Test --no-persona flag skips persona loading."""
996
+ import yaml
997
+
998
+ # Setup
999
+ pf_dir = tmp_path / ".pennyfarthing"
1000
+ pf_dir.mkdir()
1001
+ agents_dir = pf_dir / "agents"
1002
+ agents_dir.mkdir()
1003
+ (agents_dir / "dev.md").write_text("# Dev Agent")
1004
+
1005
+ # Create config and theme that would normally load
1006
+ (pf_dir / "config.local.yaml").write_text(yaml.dump({"theme": "test"}))
1007
+ themes_dir = pf_dir / "personas" / "themes"
1008
+ themes_dir.mkdir(parents=True)
1009
+ (themes_dir / "test.yaml").write_text(yaml.dump({
1010
+ "agents": {"dev": {"character": "Test", "style": "s", "role": "r"}}
1011
+ }))
1012
+
1013
+ with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
1014
+ result = main(["--agent", "dev", "--no-persona", "--no-workflow", "--no-register"])
1015
+
1016
+ assert result == 0
1017
+ captured = capsys.readouterr()
1018
+ # Should NOT contain persona XML
1019
+ assert "<persona" not in captured.out
1020
+ # Should contain agent definition
1021
+ assert "# Dev Agent" in captured.out
1022
+
1023
+ def test_no_workflow_flag(self, tmp_path: Path, capsys) -> None:
1024
+ """Test --no-workflow flag skips workflow detection."""
1025
+ pf_dir = tmp_path / ".pennyfarthing"
1026
+ pf_dir.mkdir()
1027
+
1028
+ with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
1029
+ result = main(["--no-workflow", "--no-register"])
1030
+
1031
+ assert result == 0
1032
+ captured = capsys.readouterr()
1033
+ # Should NOT contain workflow state header
1034
+ assert "# Workflow State" not in captured.out
1035
+
1036
+ def test_session_id_flag(self, tmp_path: Path) -> None:
1037
+ """Test --session-id flag uses explicit ID."""
1038
+ from pennyfarthing_scripts.prime.session import get_session_agent
1039
+
1040
+ pf_dir = tmp_path / ".pennyfarthing"
1041
+ pf_dir.mkdir()
1042
+
1043
+ with patch("pennyfarthing_scripts.prime.cli.get_project_root", return_value=tmp_path):
1044
+ result = main(["--agent", "sm", "--session-id", "explicit-123", "--no-workflow"])
1045
+
1046
+ assert result == 0
1047
+
1048
+ # Verify session was created with explicit ID
1049
+ agent = get_session_agent("explicit-123", tmp_path)
1050
+ assert agent == "sm"