@pennyfarthing/core 9.2.0 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1039) hide show
  1. package/package.json +36 -32
  2. package/LICENSE +0 -14
  3. package/README.md +0 -218
  4. package/pennyfarthing-dist/agents/README.md +0 -348
  5. package/pennyfarthing-dist/agents/architect.md +0 -180
  6. package/pennyfarthing-dist/agents/dev.md +0 -169
  7. package/pennyfarthing-dist/agents/devops.md +0 -203
  8. package/pennyfarthing-dist/agents/handoff.md +0 -235
  9. package/pennyfarthing-dist/agents/orchestrator.md +0 -182
  10. package/pennyfarthing-dist/agents/pm.md +0 -152
  11. package/pennyfarthing-dist/agents/reviewer-preflight.md +0 -129
  12. package/pennyfarthing-dist/agents/reviewer.md +0 -197
  13. package/pennyfarthing-dist/agents/sm-file-summary.md +0 -79
  14. package/pennyfarthing-dist/agents/sm-finish.md +0 -82
  15. package/pennyfarthing-dist/agents/sm-handoff.md +0 -129
  16. package/pennyfarthing-dist/agents/sm-setup.md +0 -251
  17. package/pennyfarthing-dist/agents/sm.md +0 -294
  18. package/pennyfarthing-dist/agents/tea.md +0 -161
  19. package/pennyfarthing-dist/agents/tech-writer.md +0 -226
  20. package/pennyfarthing-dist/agents/testing-runner.md +0 -184
  21. package/pennyfarthing-dist/agents/ux-designer.md +0 -236
  22. package/pennyfarthing-dist/agents/workflow-status-check.md +0 -96
  23. package/pennyfarthing-dist/commands/architect.md +0 -9
  24. package/pennyfarthing-dist/commands/benchmark-control.md +0 -69
  25. package/pennyfarthing-dist/commands/benchmark.md +0 -485
  26. package/pennyfarthing-dist/commands/brainstorming.md +0 -91
  27. package/pennyfarthing-dist/commands/check.md +0 -156
  28. package/pennyfarthing-dist/commands/chore.md +0 -218
  29. package/pennyfarthing-dist/commands/close-epic.md +0 -139
  30. package/pennyfarthing-dist/commands/continue-session.md +0 -218
  31. package/pennyfarthing-dist/commands/create-branches-from-story.md +0 -358
  32. package/pennyfarthing-dist/commands/create-theme.md +0 -29
  33. package/pennyfarthing-dist/commands/dev.md +0 -9
  34. package/pennyfarthing-dist/commands/devops.md +0 -9
  35. package/pennyfarthing-dist/commands/fix-blocker.md +0 -22
  36. package/pennyfarthing-dist/commands/git-cleanup.md +0 -57
  37. package/pennyfarthing-dist/commands/health-check.md +0 -143
  38. package/pennyfarthing-dist/commands/help.md +0 -264
  39. package/pennyfarthing-dist/commands/job-fair.md +0 -102
  40. package/pennyfarthing-dist/commands/list-themes.md +0 -21
  41. package/pennyfarthing-dist/commands/new-work.md +0 -23
  42. package/pennyfarthing-dist/commands/orchestrator.md +0 -9
  43. package/pennyfarthing-dist/commands/parallel-work.md +0 -73
  44. package/pennyfarthing-dist/commands/party-mode.md +0 -77
  45. package/pennyfarthing-dist/commands/patch.md +0 -210
  46. package/pennyfarthing-dist/commands/permissions.md +0 -193
  47. package/pennyfarthing-dist/commands/pm.md +0 -9
  48. package/pennyfarthing-dist/commands/prime.md +0 -136
  49. package/pennyfarthing-dist/commands/release.md +0 -58
  50. package/pennyfarthing-dist/commands/repo-status.md +0 -49
  51. package/pennyfarthing-dist/commands/retro.md +0 -200
  52. package/pennyfarthing-dist/commands/reviewer.md +0 -9
  53. package/pennyfarthing-dist/commands/run-ci.md +0 -116
  54. package/pennyfarthing-dist/commands/set-theme.md +0 -56
  55. package/pennyfarthing-dist/commands/setup.md +0 -65
  56. package/pennyfarthing-dist/commands/show-theme.md +0 -21
  57. package/pennyfarthing-dist/commands/sm.md +0 -9
  58. package/pennyfarthing-dist/commands/solo.md +0 -447
  59. package/pennyfarthing-dist/commands/sprint-planning.md +0 -109
  60. package/pennyfarthing-dist/commands/sprint.md +0 -142
  61. package/pennyfarthing-dist/commands/standalone.md +0 -194
  62. package/pennyfarthing-dist/commands/start-epic.md +0 -168
  63. package/pennyfarthing-dist/commands/sync-epic-to-jira.md +0 -184
  64. package/pennyfarthing-dist/commands/sync-work-with-sprint.md +0 -373
  65. package/pennyfarthing-dist/commands/tea.md +0 -9
  66. package/pennyfarthing-dist/commands/tech-writer.md +0 -9
  67. package/pennyfarthing-dist/commands/theme-maker.md +0 -676
  68. package/pennyfarthing-dist/commands/update-domain-docs.md +0 -83
  69. package/pennyfarthing-dist/commands/ux-designer.md +0 -9
  70. package/pennyfarthing-dist/commands/work.md +0 -25
  71. package/pennyfarthing-dist/commands/workflow.md +0 -21
  72. package/pennyfarthing-dist/guides/agent-behavior.md +0 -90
  73. package/pennyfarthing-dist/guides/agent-coordination.md +0 -480
  74. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +0 -432
  75. package/pennyfarthing-dist/guides/agent-template-strategic.md +0 -148
  76. package/pennyfarthing-dist/guides/agent-template-tactical.md +0 -162
  77. package/pennyfarthing-dist/guides/hooks.md +0 -230
  78. package/pennyfarthing-dist/guides/measurement-framework.md +0 -210
  79. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +0 -766
  80. package/pennyfarthing-dist/guides/patterns/fan-out-fan-in-pattern.md +0 -574
  81. package/pennyfarthing-dist/guides/patterns/helper-delegation-pattern.md +0 -488
  82. package/pennyfarthing-dist/guides/patterns/tdd-flow-pattern.md +0 -402
  83. package/pennyfarthing-dist/guides/permission-protocol.md +0 -188
  84. package/pennyfarthing-dist/guides/persona-loading.md +0 -46
  85. package/pennyfarthing-dist/guides/prompt-patterns.md +0 -338
  86. package/pennyfarthing-dist/guides/scale-levels.md +0 -114
  87. package/pennyfarthing-dist/guides/session-artifacts.md +0 -193
  88. package/pennyfarthing-dist/guides/session-schema.md +0 -346
  89. package/pennyfarthing-dist/guides/skill-schema.md +0 -412
  90. package/pennyfarthing-dist/guides/workflow-schema.md +0 -257
  91. package/pennyfarthing-dist/guides/workflow-step-schema.md +0 -512
  92. package/pennyfarthing-dist/guides/worktree-mode.md +0 -113
  93. package/pennyfarthing-dist/guides/xml-tags.md +0 -627
  94. package/pennyfarthing-dist/output-styles/teaching.md +0 -33
  95. package/pennyfarthing-dist/output-styles/terse.md +0 -20
  96. package/pennyfarthing-dist/output-styles/verbose.md +0 -28
  97. package/pennyfarthing-dist/personas/themes/a-team.yaml +0 -331
  98. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +0 -324
  99. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +0 -282
  100. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +0 -289
  101. package/pennyfarthing-dist/personas/themes/catch-22.yaml +0 -304
  102. package/pennyfarthing-dist/personas/themes/control.yaml +0 -201
  103. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +0 -315
  104. package/pennyfarthing-dist/personas/themes/discworld.yaml +0 -334
  105. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +0 -284
  106. package/pennyfarthing-dist/personas/themes/dune.yaml +0 -301
  107. package/pennyfarthing-dist/personas/themes/firefly.yaml +0 -320
  108. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +0 -284
  109. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +0 -316
  110. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +0 -323
  111. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +0 -326
  112. package/pennyfarthing-dist/personas/themes/mad-max.yaml +0 -349
  113. package/pennyfarthing-dist/personas/themes/mash.yaml +0 -329
  114. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +0 -344
  115. package/pennyfarthing-dist/personas/themes/sandman.yaml +0 -282
  116. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +0 -358
  117. package/pennyfarthing-dist/personas/themes/star-wars.yaml +0 -297
  118. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +0 -337
  119. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +0 -342
  120. package/pennyfarthing-dist/personas/themes/watchmen.yaml +0 -285
  121. package/pennyfarthing-dist/personas/themes/west-wing.yaml +0 -285
  122. package/pennyfarthing-dist/personas/themes/x-files.yaml +0 -296
  123. package/pennyfarthing-dist/scripts/README.md +0 -87
  124. package/pennyfarthing-dist/scripts/core/README.md +0 -25
  125. package/pennyfarthing-dist/scripts/core/agent-session.sh +0 -390
  126. package/pennyfarthing-dist/scripts/core/check-context.sh +0 -194
  127. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +0 -112
  128. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +0 -90
  129. package/pennyfarthing-dist/scripts/core/prime.sh +0 -30
  130. package/pennyfarthing-dist/scripts/cyclist/is-cyclist.sh +0 -21
  131. package/pennyfarthing-dist/scripts/git/README.md +0 -25
  132. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +0 -267
  133. package/pennyfarthing-dist/scripts/git/git-status-all.sh +0 -152
  134. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +0 -79
  135. package/pennyfarthing-dist/scripts/git/release.sh +0 -246
  136. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +0 -497
  137. package/pennyfarthing-dist/scripts/health/drift-detection.sh +0 -156
  138. package/pennyfarthing-dist/scripts/hooks/README.md +0 -32
  139. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  140. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +0 -106
  141. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -95
  142. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -65
  143. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -35
  144. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -150
  145. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -102
  146. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -71
  147. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -42
  148. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +0 -20
  149. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +0 -499
  150. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +0 -30
  151. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -97
  152. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -65
  153. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +0 -78
  154. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +0 -94
  155. package/pennyfarthing-dist/scripts/jira/README.md +0 -36
  156. package/pennyfarthing-dist/scripts/jira/create-jira-epic.sh +0 -95
  157. package/pennyfarthing-dist/scripts/jira/create-jira-story.sh +0 -91
  158. package/pennyfarthing-dist/scripts/jira/jira-claim-story.sh +0 -22
  159. package/pennyfarthing-dist/scripts/jira/jira-lib.sh +0 -464
  160. package/pennyfarthing-dist/scripts/jira/jira-reconcile.sh +0 -260
  161. package/pennyfarthing-dist/scripts/jira/jira-sync-story.sh +0 -18
  162. package/pennyfarthing-dist/scripts/jira/jira-sync.sh +0 -16
  163. package/pennyfarthing-dist/scripts/jira/sync-epic-jira.sh +0 -16
  164. package/pennyfarthing-dist/scripts/jira/sync-epic-to-jira.sh +0 -16
  165. package/pennyfarthing-dist/scripts/lib/README.md +0 -29
  166. package/pennyfarthing-dist/scripts/lib/background-tasks.sh +0 -177
  167. package/pennyfarthing-dist/scripts/lib/checkpoint.sh +0 -136
  168. package/pennyfarthing-dist/scripts/lib/common.sh +0 -212
  169. package/pennyfarthing-dist/scripts/lib/file-lock.sh +0 -269
  170. package/pennyfarthing-dist/scripts/lib/find-root.sh +0 -58
  171. package/pennyfarthing-dist/scripts/lib/logging.sh +0 -186
  172. package/pennyfarthing-dist/scripts/lib/retry.sh +0 -76
  173. package/pennyfarthing-dist/scripts/maintenance/migrate-theme-schema.mjs +0 -102
  174. package/pennyfarthing-dist/scripts/maintenance/sidecar-health.sh +0 -91
  175. package/pennyfarthing-dist/scripts/misc/README.md +0 -44
  176. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +0 -13
  177. package/pennyfarthing-dist/scripts/misc/add_short_names.py +0 -226
  178. package/pennyfarthing-dist/scripts/misc/backlog.sh +0 -77
  179. package/pennyfarthing-dist/scripts/misc/check-status.sh +0 -247
  180. package/pennyfarthing-dist/scripts/misc/find-related-work.sh +0 -231
  181. package/pennyfarthing-dist/scripts/misc/generate-skill-docs.sh +0 -107
  182. package/pennyfarthing-dist/scripts/misc/log-skill-usage.sh +0 -74
  183. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +0 -10
  184. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +0 -319
  185. package/pennyfarthing-dist/scripts/misc/repo-scan.sh +0 -141
  186. package/pennyfarthing-dist/scripts/misc/repo-utils.sh +0 -778
  187. package/pennyfarthing-dist/scripts/misc/run-ci.sh +0 -212
  188. package/pennyfarthing-dist/scripts/misc/run-timestamp.sh +0 -7
  189. package/pennyfarthing-dist/scripts/misc/session-cleanup.sh +0 -319
  190. package/pennyfarthing-dist/scripts/misc/skill-usage-report.sh +0 -193
  191. package/pennyfarthing-dist/scripts/misc/statusline.sh +0 -259
  192. package/pennyfarthing-dist/scripts/misc/uninstall.sh +0 -275
  193. package/pennyfarthing-dist/scripts/misc/validate-subagent-frontmatter.sh +0 -160
  194. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +0 -417
  195. package/pennyfarthing-dist/scripts/portraits/generate-portraits.sh +0 -54
  196. package/pennyfarthing-dist/scripts/sprint/README.md +0 -29
  197. package/pennyfarthing-dist/scripts/sprint/archive-story.sh +0 -133
  198. package/pennyfarthing-dist/scripts/sprint/available-stories.sh +0 -91
  199. package/pennyfarthing-dist/scripts/sprint/check-story.sh +0 -158
  200. package/pennyfarthing-dist/scripts/sprint/get-epic-field.sh +0 -52
  201. package/pennyfarthing-dist/scripts/sprint/get-story-field.sh +0 -63
  202. package/pennyfarthing-dist/scripts/sprint/list-future.sh +0 -145
  203. package/pennyfarthing-dist/scripts/sprint/new-sprint.sh +0 -110
  204. package/pennyfarthing-dist/scripts/sprint/promote-epic.sh +0 -148
  205. package/pennyfarthing-dist/scripts/sprint/sprint-common.sh +0 -415
  206. package/pennyfarthing-dist/scripts/sprint/sprint-info.sh +0 -33
  207. package/pennyfarthing-dist/scripts/sprint/sprint-metrics.sh +0 -230
  208. package/pennyfarthing-dist/scripts/sprint/sprint-status.sh +0 -134
  209. package/pennyfarthing-dist/scripts/sprint/validate-sprint-yaml.sh +0 -139
  210. package/pennyfarthing-dist/scripts/story/README.md +0 -23
  211. package/pennyfarthing-dist/scripts/story/create-story.sh +0 -19
  212. package/pennyfarthing-dist/scripts/story/size-story.sh +0 -18
  213. package/pennyfarthing-dist/scripts/story/story-template.sh +0 -18
  214. package/pennyfarthing-dist/scripts/test/README.md +0 -23
  215. package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +0 -59
  216. package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +0 -220
  217. package/pennyfarthing-dist/scripts/test/swebench-judge.py +0 -374
  218. package/pennyfarthing-dist/scripts/test/test-cache.sh +0 -165
  219. package/pennyfarthing-dist/scripts/test/test-setup.sh +0 -337
  220. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -582
  221. package/pennyfarthing-dist/scripts/tests/dev-story-workflow-import.test.sh +0 -515
  222. package/pennyfarthing-dist/scripts/tests/epics-and-stories-workflow-import.test.sh +0 -599
  223. package/pennyfarthing-dist/scripts/tests/handoff-phase-update.test.sh +0 -332
  224. package/pennyfarthing-dist/scripts/tests/implementation-readiness-workflow-import.test.sh +0 -573
  225. package/pennyfarthing-dist/scripts/tests/migrate-bmad-workflow.test.sh +0 -859
  226. package/pennyfarthing-dist/scripts/tests/prd-workflow-import.test.sh +0 -662
  227. package/pennyfarthing-dist/scripts/tests/project-context-workflow-import.test.sh +0 -589
  228. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -106
  229. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -597
  230. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -514
  231. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -517
  232. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -331
  233. package/pennyfarthing-dist/scripts/tests/ux-design-workflow-import.test.sh +0 -647
  234. package/pennyfarthing-dist/scripts/theme/README.md +0 -22
  235. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +0 -13
  236. package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +0 -402
  237. package/pennyfarthing-dist/scripts/theme/list-themes.sh +0 -30
  238. package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +0 -97
  239. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +0 -576
  240. package/pennyfarthing-dist/scripts/workflow/README.md +0 -28
  241. package/pennyfarthing-dist/scripts/workflow/check.py +0 -502
  242. package/pennyfarthing-dist/scripts/workflow/check.sh +0 -24
  243. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +0 -154
  244. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +0 -222
  245. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +0 -61
  246. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +0 -13
  247. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +0 -124
  248. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +0 -34
  249. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +0 -157
  250. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +0 -132
  251. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +0 -250
  252. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +0 -161
  253. package/pennyfarthing-dist/skills/agentic-patterns/SKILL.md +0 -246
  254. package/pennyfarthing-dist/skills/changelog/SKILL.md +0 -385
  255. package/pennyfarthing-dist/skills/code-review/SKILL.md +0 -172
  256. package/pennyfarthing-dist/skills/context-engineering/SKILL.md +0 -277
  257. package/pennyfarthing-dist/skills/cyclist/SKILL.md +0 -88
  258. package/pennyfarthing-dist/skills/dev-patterns/SKILL.md +0 -461
  259. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +0 -261
  260. package/pennyfarthing-dist/skills/jira/SKILL.md +0 -508
  261. package/pennyfarthing-dist/skills/judge/SKILL.md +0 -644
  262. package/pennyfarthing-dist/skills/just/SKILL.md +0 -414
  263. package/pennyfarthing-dist/skills/mermaid/SKILL.md +0 -256
  264. package/pennyfarthing-dist/skills/otel/skill.md +0 -227
  265. package/pennyfarthing-dist/skills/permissions/skill.md +0 -175
  266. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +0 -187
  267. package/pennyfarthing-dist/skills/skill-registry.schema.json +0 -107
  268. package/pennyfarthing-dist/skills/skill-registry.yaml +0 -393
  269. package/pennyfarthing-dist/skills/sprint/scripts/archive-story.sh +0 -101
  270. package/pennyfarthing-dist/skills/sprint/scripts/available-stories.sh +0 -97
  271. package/pennyfarthing-dist/skills/sprint/scripts/check-story.sh +0 -164
  272. package/pennyfarthing-dist/skills/sprint/scripts/create-jira-epic.sh +0 -101
  273. package/pennyfarthing-dist/skills/sprint/scripts/new-sprint.sh +0 -116
  274. package/pennyfarthing-dist/skills/sprint/scripts/promote-epic.sh +0 -164
  275. package/pennyfarthing-dist/skills/sprint/scripts/sprint-info.sh +0 -39
  276. package/pennyfarthing-dist/skills/sprint/scripts/sprint-status.sh +0 -147
  277. package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +0 -93
  278. package/pennyfarthing-dist/skills/sprint/skill.md +0 -465
  279. package/pennyfarthing-dist/skills/story/scripts/create-story.sh +0 -159
  280. package/pennyfarthing-dist/skills/story/scripts/size-story.sh +0 -198
  281. package/pennyfarthing-dist/skills/story/scripts/story-template.sh +0 -162
  282. package/pennyfarthing-dist/skills/story/skill.md +0 -219
  283. package/pennyfarthing-dist/skills/systematic-debugging/SKILL.md +0 -446
  284. package/pennyfarthing-dist/skills/testing/SKILL.md +0 -121
  285. package/pennyfarthing-dist/skills/testing/references/troubleshooting.md +0 -124
  286. package/pennyfarthing-dist/skills/theme/skill.md +0 -141
  287. package/pennyfarthing-dist/skills/theme-creation/SKILL.md +0 -178
  288. package/pennyfarthing-dist/skills/workflow/scripts/list-workflows.sh +0 -91
  289. package/pennyfarthing-dist/skills/workflow/scripts/resume-workflow.sh +0 -163
  290. package/pennyfarthing-dist/skills/workflow/scripts/show-workflow.sh +0 -138
  291. package/pennyfarthing-dist/skills/workflow/scripts/start-workflow.sh +0 -273
  292. package/pennyfarthing-dist/skills/workflow/scripts/workflow-status.sh +0 -167
  293. package/pennyfarthing-dist/skills/workflow/skill.md +0 -345
  294. package/pennyfarthing-dist/skills/yq/SKILL.md +0 -272
  295. package/pennyfarthing-dist/templates/LEADERBOARD.schema.yaml +0 -187
  296. package/pennyfarthing-dist/templates/LEADERBOARD.template.md +0 -59
  297. package/pennyfarthing-dist/templates/agent-scopes.yaml.template +0 -276
  298. package/pennyfarthing-dist/templates/pennyfarthing-settings.yaml.template +0 -61
  299. package/pennyfarthing-dist/templates/persona-config.yaml.template +0 -22
  300. package/pennyfarthing-dist/templates/preferences.yaml.template +0 -15
  301. package/pennyfarthing-dist/templates/settings.local.json.template +0 -110
  302. package/pennyfarthing-dist/templates/setup-env.sh.template +0 -18
  303. package/pennyfarthing-dist/templates/shared-context.md.template +0 -70
  304. package/pennyfarthing-dist/templates/sidecar/decisions.md.template +0 -40
  305. package/pennyfarthing-dist/templates/sidecar/gotchas.md.template +0 -37
  306. package/pennyfarthing-dist/templates/sidecar/patterns.md.template +0 -34
  307. package/pennyfarthing-dist/workflows/agent-docs.yaml +0 -70
  308. package/pennyfarthing-dist/workflows/architecture/steps/step-01-initialize.md +0 -113
  309. package/pennyfarthing-dist/workflows/architecture/steps/step-01b-continue.md +0 -105
  310. package/pennyfarthing-dist/workflows/architecture/steps/step-02-context.md +0 -127
  311. package/pennyfarthing-dist/workflows/architecture/steps/step-03-patterns.md +0 -145
  312. package/pennyfarthing-dist/workflows/architecture/steps/step-04-components.md +0 -150
  313. package/pennyfarthing-dist/workflows/architecture/steps/step-05-interfaces.md +0 -145
  314. package/pennyfarthing-dist/workflows/architecture/steps/step-06-risks.md +0 -154
  315. package/pennyfarthing-dist/workflows/architecture/steps/step-07-document.md +0 -172
  316. package/pennyfarthing-dist/workflows/architecture/templates/architecture-decision.md +0 -102
  317. package/pennyfarthing-dist/workflows/architecture.yaml +0 -65
  318. package/pennyfarthing-dist/workflows/bdd.yaml +0 -60
  319. package/pennyfarthing-dist/workflows/brainstorming/brain-methods.csv +0 -62
  320. package/pennyfarthing-dist/workflows/brainstorming/checklist.md +0 -44
  321. package/pennyfarthing-dist/workflows/brainstorming/instructions.md +0 -736
  322. package/pennyfarthing-dist/workflows/brainstorming/workflow.yaml +0 -49
  323. package/pennyfarthing-dist/workflows/code-review/checklist.md +0 -23
  324. package/pennyfarthing-dist/workflows/code-review/instructions.md +0 -234
  325. package/pennyfarthing-dist/workflows/code-review/workflow.yaml +0 -51
  326. package/pennyfarthing-dist/workflows/dev-story/checklist.md +0 -80
  327. package/pennyfarthing-dist/workflows/dev-story/instructions.xml +0 -410
  328. package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +0 -50
  329. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-01-validate-prerequisites.md +0 -281
  330. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-02-design-epics.md +0 -256
  331. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-03-create-stories.md +0 -298
  332. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-04-final-validation.md +0 -177
  333. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +0 -145
  334. package/pennyfarthing-dist/workflows/epics-and-stories/templates/epics-template.md +0 -57
  335. package/pennyfarthing-dist/workflows/epics-and-stories/workflow.yaml +0 -28
  336. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +0 -103
  337. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-02-categorize.md +0 -147
  338. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-03-execute.md +0 -215
  339. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +0 -97
  340. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +0 -78
  341. package/pennyfarthing-dist/workflows/git-cleanup.yaml +0 -59
  342. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-01-document-discovery.md +0 -211
  343. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-02-prd-analysis.md +0 -199
  344. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-03-epic-coverage-validation.md +0 -202
  345. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-04-ux-alignment.md +0 -162
  346. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-05-epic-quality-review.md +0 -280
  347. package/pennyfarthing-dist/workflows/implementation-readiness/steps/step-06-final-assessment.md +0 -158
  348. package/pennyfarthing-dist/workflows/implementation-readiness/templates/readiness-report-template.md +0 -4
  349. package/pennyfarthing-dist/workflows/implementation-readiness/workflow.yaml +0 -40
  350. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-01-connect.md +0 -257
  351. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-02-explore.md +0 -107
  352. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-03-fix.md +0 -127
  353. package/pennyfarthing-dist/workflows/interactive-debug/steps/step-04-commit.md +0 -122
  354. package/pennyfarthing-dist/workflows/interactive-debug/workflow.yaml +0 -51
  355. package/pennyfarthing-dist/workflows/patch.yaml +0 -67
  356. package/pennyfarthing-dist/workflows/prd/data/domain-complexity.csv +0 -13
  357. package/pennyfarthing-dist/workflows/prd/data/prd-purpose.md +0 -197
  358. package/pennyfarthing-dist/workflows/prd/data/project-types.csv +0 -11
  359. package/pennyfarthing-dist/workflows/prd/steps-c/step-01-init.md +0 -197
  360. package/pennyfarthing-dist/workflows/prd/steps-c/step-01b-continue.md +0 -159
  361. package/pennyfarthing-dist/workflows/prd/steps-c/step-02-discovery.md +0 -230
  362. package/pennyfarthing-dist/workflows/prd/steps-c/step-03-success.md +0 -232
  363. package/pennyfarthing-dist/workflows/prd/steps-c/step-04-journeys.md +0 -219
  364. package/pennyfarthing-dist/workflows/prd/steps-c/step-05-domain.md +0 -213
  365. package/pennyfarthing-dist/workflows/prd/steps-c/step-06-innovation.md +0 -232
  366. package/pennyfarthing-dist/workflows/prd/steps-c/step-07-project-type.md +0 -243
  367. package/pennyfarthing-dist/workflows/prd/steps-c/step-08-scoping.md +0 -234
  368. package/pennyfarthing-dist/workflows/prd/steps-c/step-09-functional.md +0 -237
  369. package/pennyfarthing-dist/workflows/prd/steps-c/step-10-nonfunctional.md +0 -248
  370. package/pennyfarthing-dist/workflows/prd/steps-c/step-11-polish.md +0 -223
  371. package/pennyfarthing-dist/workflows/prd/steps-c/step-12-complete.md +0 -186
  372. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01-discovery.md +0 -253
  373. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-01b-legacy-conversion.md +0 -214
  374. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-02-review.md +0 -255
  375. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-03-edit.md +0 -259
  376. package/pennyfarthing-dist/workflows/prd/steps-e/step-e-04-complete.md +0 -174
  377. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-01-discovery.md +0 -224
  378. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02-format-detection.md +0 -197
  379. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-02b-parity-check.md +0 -215
  380. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-03-density-validation.md +0 -180
  381. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +0 -220
  382. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-05-measurability-validation.md +0 -234
  383. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-06-traceability-validation.md +0 -223
  384. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +0 -211
  385. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +0 -249
  386. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-09-project-type-validation.md +0 -269
  387. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-10-smart-validation.md +0 -215
  388. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +0 -270
  389. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-12-completeness-validation.md +0 -248
  390. package/pennyfarthing-dist/workflows/prd/steps-v/step-v-13-report-complete.md +0 -238
  391. package/pennyfarthing-dist/workflows/prd/templates/prd-template.md +0 -10
  392. package/pennyfarthing-dist/workflows/prd/workflow.yaml +0 -42
  393. package/pennyfarthing-dist/workflows/product-brief/steps/step-01-init.md +0 -195
  394. package/pennyfarthing-dist/workflows/product-brief/steps/step-01b-continue.md +0 -180
  395. package/pennyfarthing-dist/workflows/product-brief/steps/step-02-vision.md +0 -221
  396. package/pennyfarthing-dist/workflows/product-brief/steps/step-03-users.md +0 -224
  397. package/pennyfarthing-dist/workflows/product-brief/steps/step-04-metrics.md +0 -228
  398. package/pennyfarthing-dist/workflows/product-brief/steps/step-05-scope.md +0 -243
  399. package/pennyfarthing-dist/workflows/product-brief/steps/step-06-complete.md +0 -216
  400. package/pennyfarthing-dist/workflows/product-brief/templates/product-brief.template.md +0 -10
  401. package/pennyfarthing-dist/workflows/product-brief/workflow.yaml +0 -31
  402. package/pennyfarthing-dist/workflows/project-context/project-context-template.md +0 -21
  403. package/pennyfarthing-dist/workflows/project-context/steps/step-01-discover.md +0 -206
  404. package/pennyfarthing-dist/workflows/project-context/steps/step-02-generate.md +0 -349
  405. package/pennyfarthing-dist/workflows/project-context/steps/step-03-complete.md +0 -306
  406. package/pennyfarthing-dist/workflows/project-context/workflow.yaml +0 -27
  407. package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +0 -157
  408. package/pennyfarthing-dist/workflows/project-setup/steps/step-02-clone-repos.md +0 -217
  409. package/pennyfarthing-dist/workflows/project-setup/steps/step-03-repos-yaml.md +0 -159
  410. package/pennyfarthing-dist/workflows/project-setup/steps/step-04-claude-md.md +0 -186
  411. package/pennyfarthing-dist/workflows/project-setup/steps/step-05-shared-context.md +0 -185
  412. package/pennyfarthing-dist/workflows/project-setup/steps/step-06-task-runner.md +0 -279
  413. package/pennyfarthing-dist/workflows/project-setup/steps/step-07-theme.md +0 -200
  414. package/pennyfarthing-dist/workflows/project-setup/steps/step-08-theme-packs.md +0 -142
  415. package/pennyfarthing-dist/workflows/project-setup/steps/step-09-cyclist.md +0 -245
  416. package/pennyfarthing-dist/workflows/project-setup/steps/step-10-complete.md +0 -204
  417. package/pennyfarthing-dist/workflows/project-setup/workflow.yaml +0 -41
  418. package/pennyfarthing-dist/workflows/quick-dev/steps/step-01-mode-detection.md +0 -177
  419. package/pennyfarthing-dist/workflows/quick-dev/steps/step-02-context-gathering.md +0 -143
  420. package/pennyfarthing-dist/workflows/quick-dev/steps/step-03-execute.md +0 -138
  421. package/pennyfarthing-dist/workflows/quick-dev/steps/step-04-self-check.md +0 -135
  422. package/pennyfarthing-dist/workflows/quick-dev/steps/step-05-adversarial-review.md +0 -129
  423. package/pennyfarthing-dist/workflows/quick-dev/steps/step-06-resolve-findings.md +0 -163
  424. package/pennyfarthing-dist/workflows/quick-dev/workflow.yaml +0 -27
  425. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +0 -201
  426. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +0 -156
  427. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +0 -140
  428. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +0 -203
  429. package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +0 -74
  430. package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +0 -27
  431. package/pennyfarthing-dist/workflows/research/steps-domain/step-01-init.md +0 -159
  432. package/pennyfarthing-dist/workflows/research/steps-domain/step-02-domain-analysis.md +0 -253
  433. package/pennyfarthing-dist/workflows/research/steps-domain/step-03-competitive-landscape.md +0 -263
  434. package/pennyfarthing-dist/workflows/research/steps-domain/step-04-regulatory-focus.md +0 -232
  435. package/pennyfarthing-dist/workflows/research/steps-domain/step-05-technical-trends.md +0 -260
  436. package/pennyfarthing-dist/workflows/research/steps-domain/step-06-research-synthesis.md +0 -477
  437. package/pennyfarthing-dist/workflows/research/steps-market/step-01-init.md +0 -205
  438. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-behavior.md +0 -262
  439. package/pennyfarthing-dist/workflows/research/steps-market/step-02-customer-insights.md +0 -227
  440. package/pennyfarthing-dist/workflows/research/steps-market/step-03-customer-pain-points.md +0 -275
  441. package/pennyfarthing-dist/workflows/research/steps-market/step-04-customer-decisions.md +0 -286
  442. package/pennyfarthing-dist/workflows/research/steps-market/step-05-competitive-analysis.md +0 -203
  443. package/pennyfarthing-dist/workflows/research/steps-market/step-06-research-completion.md +0 -510
  444. package/pennyfarthing-dist/workflows/research/steps-technical/step-01-init.md +0 -159
  445. package/pennyfarthing-dist/workflows/research/steps-technical/step-02-technical-overview.md +0 -264
  446. package/pennyfarthing-dist/workflows/research/steps-technical/step-03-integration-patterns.md +0 -274
  447. package/pennyfarthing-dist/workflows/research/steps-technical/step-04-architectural-patterns.md +0 -228
  448. package/pennyfarthing-dist/workflows/research/steps-technical/step-05-implementation-research.md +0 -267
  449. package/pennyfarthing-dist/workflows/research/steps-technical/step-06-research-synthesis.md +0 -522
  450. package/pennyfarthing-dist/workflows/research/templates/research.template.md +0 -29
  451. package/pennyfarthing-dist/workflows/research/workflow.yaml +0 -45
  452. package/pennyfarthing-dist/workflows/retrospective/checklist.md +0 -31
  453. package/pennyfarthing-dist/workflows/retrospective/instructions.md +0 -1443
  454. package/pennyfarthing-dist/workflows/retrospective/workflow.yaml +0 -50
  455. package/pennyfarthing-dist/workflows/sprint-planning/checklist.md +0 -33
  456. package/pennyfarthing-dist/workflows/sprint-planning/sprint-status-template.yaml +0 -55
  457. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-01-parse-epic-files.md +0 -69
  458. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-02-build-sprint-status.md +0 -61
  459. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-03-status-detection.md +0 -80
  460. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-04-generate-status-file.md +0 -90
  461. package/pennyfarthing-dist/workflows/sprint-planning/steps/step-05-validate-and-report.md +0 -78
  462. package/pennyfarthing-dist/workflows/sprint-planning/workflow.yaml +0 -34
  463. package/pennyfarthing-dist/workflows/tdd.yaml +0 -50
  464. package/pennyfarthing-dist/workflows/trivial.yaml +0 -40
  465. package/pennyfarthing-dist/workflows/ux-design/steps/step-01-init.md +0 -141
  466. package/pennyfarthing-dist/workflows/ux-design/steps/step-01b-continue.md +0 -133
  467. package/pennyfarthing-dist/workflows/ux-design/steps/step-02-discovery.md +0 -196
  468. package/pennyfarthing-dist/workflows/ux-design/steps/step-03-core-experience.md +0 -222
  469. package/pennyfarthing-dist/workflows/ux-design/steps/step-04-emotional-response.md +0 -225
  470. package/pennyfarthing-dist/workflows/ux-design/steps/step-05-inspiration.md +0 -240
  471. package/pennyfarthing-dist/workflows/ux-design/steps/step-06-design-system.md +0 -258
  472. package/pennyfarthing-dist/workflows/ux-design/steps/step-07-defining-experience.md +0 -260
  473. package/pennyfarthing-dist/workflows/ux-design/steps/step-08-visual-foundation.md +0 -230
  474. package/pennyfarthing-dist/workflows/ux-design/steps/step-09-design-directions.md +0 -230
  475. package/pennyfarthing-dist/workflows/ux-design/steps/step-10-user-journeys.md +0 -247
  476. package/pennyfarthing-dist/workflows/ux-design/steps/step-11-component-strategy.md +0 -254
  477. package/pennyfarthing-dist/workflows/ux-design/steps/step-12-ux-patterns.md +0 -243
  478. package/pennyfarthing-dist/workflows/ux-design/steps/step-13-responsive-accessibility.md +0 -270
  479. package/pennyfarthing-dist/workflows/ux-design/steps/step-14-complete.md +0 -234
  480. package/pennyfarthing-dist/workflows/ux-design/ux-design-template.md +0 -13
  481. package/pennyfarthing-dist/workflows/ux-design/workflow.yaml +0 -41
  482. package/pennyfarthing_scripts/README.md +0 -66
  483. package/pennyfarthing_scripts/__init__.py +0 -17
  484. package/pennyfarthing_scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  485. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  486. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  487. package/pennyfarthing_scripts/__pycache__/config.cpython-314.pyc +0 -0
  488. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  489. package/pennyfarthing_scripts/__pycache__/jira.cpython-314.pyc +0 -0
  490. package/pennyfarthing_scripts/__pycache__/jira_bidirectional_sync.cpython-314.pyc +0 -0
  491. package/pennyfarthing_scripts/__pycache__/jira_epic_creation.cpython-314.pyc +0 -0
  492. package/pennyfarthing_scripts/__pycache__/jira_sync.cpython-314.pyc +0 -0
  493. package/pennyfarthing_scripts/__pycache__/jira_sync_story.cpython-314.pyc +0 -0
  494. package/pennyfarthing_scripts/__pycache__/output.cpython-314.pyc +0 -0
  495. package/pennyfarthing_scripts/__pycache__/patch_mode.cpython-314.pyc +0 -0
  496. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  497. package/pennyfarthing_scripts/__pycache__/sprint.cpython-314.pyc +0 -0
  498. package/pennyfarthing_scripts/__pycache__/workflow.cpython-311.pyc +0 -0
  499. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  500. package/pennyfarthing_scripts/bellmode_hook.py +0 -154
  501. package/pennyfarthing_scripts/brownfield/__init__.py +0 -35
  502. package/pennyfarthing_scripts/brownfield/__main__.py +0 -7
  503. package/pennyfarthing_scripts/brownfield/__pycache__/__init__.cpython-314.pyc +0 -0
  504. package/pennyfarthing_scripts/brownfield/__pycache__/__main__.cpython-314.pyc +0 -0
  505. package/pennyfarthing_scripts/brownfield/__pycache__/cli.cpython-314.pyc +0 -0
  506. package/pennyfarthing_scripts/brownfield/__pycache__/discover.cpython-314.pyc +0 -0
  507. package/pennyfarthing_scripts/brownfield/cli.py +0 -131
  508. package/pennyfarthing_scripts/brownfield/discover.py +0 -753
  509. package/pennyfarthing_scripts/cli.py +0 -174
  510. package/pennyfarthing_scripts/common/__init__.py +0 -49
  511. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  512. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  513. package/pennyfarthing_scripts/common/__pycache__/output.cpython-314.pyc +0 -0
  514. package/pennyfarthing_scripts/common/__pycache__/themes.cpython-314.pyc +0 -0
  515. package/pennyfarthing_scripts/common/config.py +0 -91
  516. package/pennyfarthing_scripts/common/output.py +0 -180
  517. package/pennyfarthing_scripts/common/themes.py +0 -253
  518. package/pennyfarthing_scripts/config.py +0 -21
  519. package/pennyfarthing_scripts/context.py +0 -414
  520. package/pennyfarthing_scripts/git/__init__.py +0 -29
  521. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  522. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  523. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  524. package/pennyfarthing_scripts/git/create_branches.py +0 -439
  525. package/pennyfarthing_scripts/git/status_all.py +0 -310
  526. package/pennyfarthing_scripts/hooks.py +0 -455
  527. package/pennyfarthing_scripts/jira/__init__.py +0 -93
  528. package/pennyfarthing_scripts/jira/__main__.py +0 -10
  529. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  530. package/pennyfarthing_scripts/jira/__pycache__/__main__.cpython-314.pyc +0 -0
  531. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  532. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  533. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  534. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  535. package/pennyfarthing_scripts/jira/__pycache__/compat.cpython-314.pyc +0 -0
  536. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  537. package/pennyfarthing_scripts/jira/__pycache__/mappings.cpython-314.pyc +0 -0
  538. package/pennyfarthing_scripts/jira/__pycache__/models.cpython-314.pyc +0 -0
  539. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  540. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  541. package/pennyfarthing_scripts/jira/bidirectional.py +0 -561
  542. package/pennyfarthing_scripts/jira/claim.py +0 -211
  543. package/pennyfarthing_scripts/jira/cli.py +0 -150
  544. package/pennyfarthing_scripts/jira/client.py +0 -613
  545. package/pennyfarthing_scripts/jira/epic.py +0 -176
  546. package/pennyfarthing_scripts/jira/story.py +0 -219
  547. package/pennyfarthing_scripts/jira/sync.py +0 -350
  548. package/pennyfarthing_scripts/jira_bidirectional_sync.py +0 -37
  549. package/pennyfarthing_scripts/jira_epic_creation.py +0 -30
  550. package/pennyfarthing_scripts/jira_sync.py +0 -36
  551. package/pennyfarthing_scripts/jira_sync_story.py +0 -30
  552. package/pennyfarthing_scripts/migration/__init__.py +0 -39
  553. package/pennyfarthing_scripts/migration/__main__.py +0 -10
  554. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  555. package/pennyfarthing_scripts/migration/__pycache__/__main__.cpython-314.pyc +0 -0
  556. package/pennyfarthing_scripts/migration/__pycache__/cli.cpython-314.pyc +0 -0
  557. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  558. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  559. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  560. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  561. package/pennyfarthing_scripts/migration/cli.py +0 -304
  562. package/pennyfarthing_scripts/migration/session.py +0 -384
  563. package/pennyfarthing_scripts/migration/skill.py +0 -188
  564. package/pennyfarthing_scripts/migration/step.py +0 -229
  565. package/pennyfarthing_scripts/migration/validate.py +0 -282
  566. package/pennyfarthing_scripts/output.py +0 -37
  567. package/pennyfarthing_scripts/patch_mode.py +0 -449
  568. package/pennyfarthing_scripts/preflight/__init__.py +0 -17
  569. package/pennyfarthing_scripts/preflight/__main__.py +0 -10
  570. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  571. package/pennyfarthing_scripts/preflight/__pycache__/__main__.cpython-314.pyc +0 -0
  572. package/pennyfarthing_scripts/preflight/__pycache__/cli.cpython-314.pyc +0 -0
  573. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  574. package/pennyfarthing_scripts/preflight/cli.py +0 -141
  575. package/pennyfarthing_scripts/preflight/finish.py +0 -382
  576. package/pennyfarthing_scripts/pretooluse_hook.py +0 -142
  577. package/pennyfarthing_scripts/prime/__init__.py +0 -125
  578. package/pennyfarthing_scripts/prime/__main__.py +0 -8
  579. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  580. package/pennyfarthing_scripts/prime/__pycache__/__main__.cpython-314.pyc +0 -0
  581. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  582. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  583. package/pennyfarthing_scripts/prime/__pycache__/models.cpython-314.pyc +0 -0
  584. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  585. package/pennyfarthing_scripts/prime/__pycache__/session.cpython-314.pyc +0 -0
  586. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  587. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  588. package/pennyfarthing_scripts/prime/cli.py +0 -645
  589. package/pennyfarthing_scripts/prime/loader.py +0 -239
  590. package/pennyfarthing_scripts/prime/models.py +0 -206
  591. package/pennyfarthing_scripts/prime/persona.py +0 -308
  592. package/pennyfarthing_scripts/prime/session.py +0 -183
  593. package/pennyfarthing_scripts/prime/tiers.py +0 -201
  594. package/pennyfarthing_scripts/prime/workflow.py +0 -275
  595. package/pennyfarthing_scripts/schema_validation_hook.py +0 -306
  596. package/pennyfarthing_scripts/sprint/__init__.py +0 -66
  597. package/pennyfarthing_scripts/sprint/__main__.py +0 -10
  598. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  599. package/pennyfarthing_scripts/sprint/__pycache__/__main__.cpython-314.pyc +0 -0
  600. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  601. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  602. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  603. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  604. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  605. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  606. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  607. package/pennyfarthing_scripts/sprint/archive.py +0 -108
  608. package/pennyfarthing_scripts/sprint/archive_epic.py +0 -399
  609. package/pennyfarthing_scripts/sprint/cli.py +0 -284
  610. package/pennyfarthing_scripts/sprint/import_epic.py +0 -431
  611. package/pennyfarthing_scripts/sprint/loader.py +0 -193
  612. package/pennyfarthing_scripts/sprint/status.py +0 -122
  613. package/pennyfarthing_scripts/sprint/validator.py +0 -405
  614. package/pennyfarthing_scripts/sprint/work.py +0 -192
  615. package/pennyfarthing_scripts/story/__init__.py +0 -67
  616. package/pennyfarthing_scripts/story/__main__.py +0 -10
  617. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  618. package/pennyfarthing_scripts/story/__pycache__/__main__.cpython-314.pyc +0 -0
  619. package/pennyfarthing_scripts/story/__pycache__/cli.cpython-314.pyc +0 -0
  620. package/pennyfarthing_scripts/story/__pycache__/create.cpython-314.pyc +0 -0
  621. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  622. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  623. package/pennyfarthing_scripts/story/cli.py +0 -105
  624. package/pennyfarthing_scripts/story/create.py +0 -167
  625. package/pennyfarthing_scripts/story/size.py +0 -113
  626. package/pennyfarthing_scripts/story/template.py +0 -151
  627. package/pennyfarthing_scripts/swebench.py +0 -216
  628. package/pennyfarthing_scripts/tests/__init__.py +0 -1
  629. package/pennyfarthing_scripts/tests/__pycache__/__init__.cpython-314.pyc +0 -0
  630. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  631. package/pennyfarthing_scripts/tests/__pycache__/test_brownfield.cpython-314-pytest-9.0.2.pyc +0 -0
  632. package/pennyfarthing_scripts/tests/__pycache__/test_cli_modules.cpython-314-pytest-9.0.2.pyc +0 -0
  633. package/pennyfarthing_scripts/tests/__pycache__/test_common.cpython-314-pytest-9.0.2.pyc +0 -0
  634. package/pennyfarthing_scripts/tests/__pycache__/test_git_utils.cpython-314-pytest-9.0.2.pyc +0 -0
  635. package/pennyfarthing_scripts/tests/__pycache__/test_jira_package.cpython-314-pytest-9.0.2.pyc +0 -0
  636. package/pennyfarthing_scripts/tests/__pycache__/test_package_structure.cpython-314-pytest-9.0.2.pyc +0 -0
  637. package/pennyfarthing_scripts/tests/__pycache__/test_patch_mode.cpython-314-pytest-9.0.2.pyc +0 -0
  638. package/pennyfarthing_scripts/tests/__pycache__/test_prime.cpython-314-pytest-9.0.2.pyc +0 -0
  639. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_package.cpython-314-pytest-9.0.2.pyc +0 -0
  640. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  641. package/pennyfarthing_scripts/tests/__pycache__/test_story_package.cpython-314-pytest-9.0.2.pyc +0 -0
  642. package/pennyfarthing_scripts/tests/__pycache__/test_tiers.cpython-314-pytest-9.0.2.pyc +0 -0
  643. package/pennyfarthing_scripts/tests/__pycache__/test_token_counting.cpython-314-pytest-9.0.2.pyc +0 -0
  644. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_check.cpython-314-pytest-9.0.2.pyc +0 -0
  645. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  646. package/pennyfarthing_scripts/tests/conftest.py +0 -106
  647. package/pennyfarthing_scripts/tests/test_brownfield.py +0 -842
  648. package/pennyfarthing_scripts/tests/test_cli_modules.py +0 -245
  649. package/pennyfarthing_scripts/tests/test_common.py +0 -180
  650. package/pennyfarthing_scripts/tests/test_git_utils.py +0 -866
  651. package/pennyfarthing_scripts/tests/test_jira_package.py +0 -334
  652. package/pennyfarthing_scripts/tests/test_package_structure.py +0 -372
  653. package/pennyfarthing_scripts/tests/test_patch_mode.py +0 -830
  654. package/pennyfarthing_scripts/tests/test_prime.py +0 -1050
  655. package/pennyfarthing_scripts/tests/test_sprint_package.py +0 -236
  656. package/pennyfarthing_scripts/tests/test_sprint_validator.py +0 -675
  657. package/pennyfarthing_scripts/tests/test_story_package.py +0 -156
  658. package/pennyfarthing_scripts/tests/test_tiers.py +0 -1090
  659. package/pennyfarthing_scripts/tests/test_token_counting.py +0 -559
  660. package/pennyfarthing_scripts/tests/test_workflow_check.py +0 -341
  661. package/pennyfarthing_scripts/welcome_hook.py +0 -157
  662. package/pennyfarthing_scripts/workflow.py +0 -287
  663. /package/{packages/core/bin → bin}/pennyfarthing.js +0 -0
  664. /package/{packages/core/dist → dist}/bmad/context-reader.d.ts +0 -0
  665. /package/{packages/core/dist → dist}/bmad/context-reader.d.ts.map +0 -0
  666. /package/{packages/core/dist → dist}/bmad/context-reader.js +0 -0
  667. /package/{packages/core/dist → dist}/bmad/context-reader.js.map +0 -0
  668. /package/{packages/core/dist → dist}/bmad/context-reader.test.d.ts +0 -0
  669. /package/{packages/core/dist → dist}/bmad/context-reader.test.d.ts.map +0 -0
  670. /package/{packages/core/dist → dist}/bmad/context-reader.test.js +0 -0
  671. /package/{packages/core/dist → dist}/bmad/context-reader.test.js.map +0 -0
  672. /package/{packages/core/dist → dist}/bmad/epics-parser.d.ts +0 -0
  673. /package/{packages/core/dist → dist}/bmad/epics-parser.d.ts.map +0 -0
  674. /package/{packages/core/dist → dist}/bmad/epics-parser.js +0 -0
  675. /package/{packages/core/dist → dist}/bmad/epics-parser.js.map +0 -0
  676. /package/{packages/core/dist → dist}/bmad/epics-parser.test.d.ts +0 -0
  677. /package/{packages/core/dist → dist}/bmad/epics-parser.test.d.ts.map +0 -0
  678. /package/{packages/core/dist → dist}/bmad/epics-parser.test.js +0 -0
  679. /package/{packages/core/dist → dist}/bmad/epics-parser.test.js.map +0 -0
  680. /package/{packages/core/dist → dist}/bmad/index.d.ts +0 -0
  681. /package/{packages/core/dist → dist}/bmad/index.d.ts.map +0 -0
  682. /package/{packages/core/dist → dist}/bmad/index.js +0 -0
  683. /package/{packages/core/dist → dist}/bmad/index.js.map +0 -0
  684. /package/{packages/core/dist → dist}/bmad/status-sync.d.ts +0 -0
  685. /package/{packages/core/dist → dist}/bmad/status-sync.d.ts.map +0 -0
  686. /package/{packages/core/dist → dist}/bmad/status-sync.js +0 -0
  687. /package/{packages/core/dist → dist}/bmad/status-sync.js.map +0 -0
  688. /package/{packages/core/dist → dist}/bmad/status-sync.test.d.ts +0 -0
  689. /package/{packages/core/dist → dist}/bmad/status-sync.test.d.ts.map +0 -0
  690. /package/{packages/core/dist → dist}/bmad/status-sync.test.js +0 -0
  691. /package/{packages/core/dist → dist}/bmad/status-sync.test.js.map +0 -0
  692. /package/{packages/core/dist → dist}/bmad/story-exporter.d.ts +0 -0
  693. /package/{packages/core/dist → dist}/bmad/story-exporter.d.ts.map +0 -0
  694. /package/{packages/core/dist → dist}/bmad/story-exporter.js +0 -0
  695. /package/{packages/core/dist → dist}/bmad/story-exporter.js.map +0 -0
  696. /package/{packages/core/dist → dist}/bmad/story-exporter.test.d.ts +0 -0
  697. /package/{packages/core/dist → dist}/bmad/story-exporter.test.d.ts.map +0 -0
  698. /package/{packages/core/dist → dist}/bmad/story-exporter.test.js +0 -0
  699. /package/{packages/core/dist → dist}/bmad/story-exporter.test.js.map +0 -0
  700. /package/{packages/core/dist → dist}/bmad/story-parser.d.ts +0 -0
  701. /package/{packages/core/dist → dist}/bmad/story-parser.d.ts.map +0 -0
  702. /package/{packages/core/dist → dist}/bmad/story-parser.js +0 -0
  703. /package/{packages/core/dist → dist}/bmad/story-parser.js.map +0 -0
  704. /package/{packages/core/dist → dist}/bmad/story-parser.test.d.ts +0 -0
  705. /package/{packages/core/dist → dist}/bmad/story-parser.test.d.ts.map +0 -0
  706. /package/{packages/core/dist → dist}/bmad/story-parser.test.js +0 -0
  707. /package/{packages/core/dist → dist}/bmad/story-parser.test.js.map +0 -0
  708. /package/{packages/core/dist → dist}/cli/commands/command.d.ts +0 -0
  709. /package/{packages/core/dist → dist}/cli/commands/command.d.ts.map +0 -0
  710. /package/{packages/core/dist → dist}/cli/commands/command.js +0 -0
  711. /package/{packages/core/dist → dist}/cli/commands/command.js.map +0 -0
  712. /package/{packages/core/dist → dist}/cli/commands/cyclist.d.ts +0 -0
  713. /package/{packages/core/dist → dist}/cli/commands/cyclist.d.ts.map +0 -0
  714. /package/{packages/core/dist → dist}/cli/commands/cyclist.js +0 -0
  715. /package/{packages/core/dist → dist}/cli/commands/cyclist.js.map +0 -0
  716. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.d.ts +0 -0
  717. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.d.ts.map +0 -0
  718. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.js +0 -0
  719. /package/{packages/core/dist → dist}/cli/commands/cyclist.test.js.map +0 -0
  720. /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.d.ts +0 -0
  721. /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.d.ts.map +0 -0
  722. /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.js +0 -0
  723. /package/{packages/core/dist → dist}/cli/commands/doctor-legacy.test.js.map +0 -0
  724. /package/{packages/core/dist → dist}/cli/commands/doctor.d.ts +0 -0
  725. /package/{packages/core/dist → dist}/cli/commands/doctor.d.ts.map +0 -0
  726. /package/{packages/core/dist → dist}/cli/commands/doctor.js +0 -0
  727. /package/{packages/core/dist → dist}/cli/commands/doctor.js.map +0 -0
  728. /package/{packages/core/dist → dist}/cli/commands/init.d.ts +0 -0
  729. /package/{packages/core/dist → dist}/cli/commands/init.d.ts.map +0 -0
  730. /package/{packages/core/dist → dist}/cli/commands/init.js +0 -0
  731. /package/{packages/core/dist → dist}/cli/commands/init.js.map +0 -0
  732. /package/{packages/core/dist → dist}/cli/commands/skill.d.ts +0 -0
  733. /package/{packages/core/dist → dist}/cli/commands/skill.d.ts.map +0 -0
  734. /package/{packages/core/dist → dist}/cli/commands/skill.js +0 -0
  735. /package/{packages/core/dist → dist}/cli/commands/skill.js.map +0 -0
  736. /package/{packages/core/dist → dist}/cli/commands/theme.d.ts +0 -0
  737. /package/{packages/core/dist → dist}/cli/commands/theme.d.ts.map +0 -0
  738. /package/{packages/core/dist → dist}/cli/commands/theme.js +0 -0
  739. /package/{packages/core/dist → dist}/cli/commands/theme.js.map +0 -0
  740. /package/{packages/core/dist → dist}/cli/commands/uninstall.d.ts +0 -0
  741. /package/{packages/core/dist → dist}/cli/commands/uninstall.d.ts.map +0 -0
  742. /package/{packages/core/dist → dist}/cli/commands/uninstall.js +0 -0
  743. /package/{packages/core/dist → dist}/cli/commands/uninstall.js.map +0 -0
  744. /package/{packages/core/dist → dist}/cli/commands/update.d.ts +0 -0
  745. /package/{packages/core/dist → dist}/cli/commands/update.d.ts.map +0 -0
  746. /package/{packages/core/dist → dist}/cli/commands/update.js +0 -0
  747. /package/{packages/core/dist → dist}/cli/commands/update.js.map +0 -0
  748. /package/{packages/core/dist → dist}/cli/commands/version.d.ts +0 -0
  749. /package/{packages/core/dist → dist}/cli/commands/version.d.ts.map +0 -0
  750. /package/{packages/core/dist → dist}/cli/commands/version.js +0 -0
  751. /package/{packages/core/dist → dist}/cli/commands/version.js.map +0 -0
  752. /package/{packages/core/dist → dist}/cli/customization.test.d.ts +0 -0
  753. /package/{packages/core/dist → dist}/cli/customization.test.d.ts.map +0 -0
  754. /package/{packages/core/dist → dist}/cli/customization.test.js +0 -0
  755. /package/{packages/core/dist → dist}/cli/customization.test.js.map +0 -0
  756. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.d.ts +0 -0
  757. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.d.ts.map +0 -0
  758. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.js +0 -0
  759. /package/{packages/core/dist → dist}/cli/cyclist-migration.test.js.map +0 -0
  760. /package/{packages/core/dist → dist}/cli/index.d.ts +0 -0
  761. /package/{packages/core/dist → dist}/cli/index.d.ts.map +0 -0
  762. /package/{packages/core/dist → dist}/cli/index.js +0 -0
  763. /package/{packages/core/dist → dist}/cli/index.js.map +0 -0
  764. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.d.ts +0 -0
  765. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.d.ts.map +0 -0
  766. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.js +0 -0
  767. /package/{packages/core/dist → dist}/cli/ocean-profiles.test.js.map +0 -0
  768. /package/{packages/core/dist → dist}/cli/theme-maker.test.d.ts +0 -0
  769. /package/{packages/core/dist → dist}/cli/theme-maker.test.d.ts.map +0 -0
  770. /package/{packages/core/dist → dist}/cli/theme-maker.test.js +0 -0
  771. /package/{packages/core/dist → dist}/cli/theme-maker.test.js.map +0 -0
  772. /package/{packages/core/dist → dist}/cli/utils/constants.d.ts +0 -0
  773. /package/{packages/core/dist → dist}/cli/utils/constants.d.ts.map +0 -0
  774. /package/{packages/core/dist → dist}/cli/utils/constants.js +0 -0
  775. /package/{packages/core/dist → dist}/cli/utils/constants.js.map +0 -0
  776. /package/{packages/core/dist → dist}/cli/utils/files.d.ts +0 -0
  777. /package/{packages/core/dist → dist}/cli/utils/files.d.ts.map +0 -0
  778. /package/{packages/core/dist → dist}/cli/utils/files.js +0 -0
  779. /package/{packages/core/dist → dist}/cli/utils/files.js.map +0 -0
  780. /package/{packages/core/dist → dist}/cli/utils/logger.d.ts +0 -0
  781. /package/{packages/core/dist → dist}/cli/utils/logger.d.ts.map +0 -0
  782. /package/{packages/core/dist → dist}/cli/utils/logger.js +0 -0
  783. /package/{packages/core/dist → dist}/cli/utils/logger.js.map +0 -0
  784. /package/{packages/core/dist → dist}/cli/utils/manifest.d.ts +0 -0
  785. /package/{packages/core/dist → dist}/cli/utils/manifest.d.ts.map +0 -0
  786. /package/{packages/core/dist → dist}/cli/utils/manifest.js +0 -0
  787. /package/{packages/core/dist → dist}/cli/utils/manifest.js.map +0 -0
  788. /package/{packages/core/dist → dist}/cli/utils/node-modules.d.ts +0 -0
  789. /package/{packages/core/dist → dist}/cli/utils/node-modules.d.ts.map +0 -0
  790. /package/{packages/core/dist → dist}/cli/utils/node-modules.js +0 -0
  791. /package/{packages/core/dist → dist}/cli/utils/node-modules.js.map +0 -0
  792. /package/{packages/core/dist → dist}/cli/utils/prompts.d.ts +0 -0
  793. /package/{packages/core/dist → dist}/cli/utils/prompts.d.ts.map +0 -0
  794. /package/{packages/core/dist → dist}/cli/utils/prompts.js +0 -0
  795. /package/{packages/core/dist → dist}/cli/utils/prompts.js.map +0 -0
  796. /package/{packages/core/dist → dist}/cli/utils/settings.d.ts +0 -0
  797. /package/{packages/core/dist → dist}/cli/utils/settings.d.ts.map +0 -0
  798. /package/{packages/core/dist → dist}/cli/utils/settings.js +0 -0
  799. /package/{packages/core/dist → dist}/cli/utils/settings.js.map +0 -0
  800. /package/{packages/core/dist → dist}/cli/utils/symlinks.d.ts +0 -0
  801. /package/{packages/core/dist → dist}/cli/utils/symlinks.d.ts.map +0 -0
  802. /package/{packages/core/dist → dist}/cli/utils/symlinks.js +0 -0
  803. /package/{packages/core/dist → dist}/cli/utils/symlinks.js.map +0 -0
  804. /package/{packages/core/dist → dist}/cli/utils/themes.d.ts +0 -0
  805. /package/{packages/core/dist → dist}/cli/utils/themes.d.ts.map +0 -0
  806. /package/{packages/core/dist → dist}/cli/utils/themes.js +0 -0
  807. /package/{packages/core/dist → dist}/cli/utils/themes.js.map +0 -0
  808. /package/{packages/core/dist → dist}/cli/utils/themes.test.d.ts +0 -0
  809. /package/{packages/core/dist → dist}/cli/utils/themes.test.d.ts.map +0 -0
  810. /package/{packages/core/dist → dist}/cli/utils/themes.test.js +0 -0
  811. /package/{packages/core/dist → dist}/cli/utils/themes.test.js.map +0 -0
  812. /package/{packages/core/dist → dist}/cli/utils/version.d.ts +0 -0
  813. /package/{packages/core/dist → dist}/cli/utils/version.d.ts.map +0 -0
  814. /package/{packages/core/dist → dist}/cli/utils/version.js +0 -0
  815. /package/{packages/core/dist → dist}/cli/utils/version.js.map +0 -0
  816. /package/{packages/core/dist → dist}/cli/workspace.test.d.ts +0 -0
  817. /package/{packages/core/dist → dist}/cli/workspace.test.d.ts.map +0 -0
  818. /package/{packages/core/dist → dist}/cli/workspace.test.js +0 -0
  819. /package/{packages/core/dist → dist}/cli/workspace.test.js.map +0 -0
  820. /package/{packages/core/dist → dist}/index.d.ts +0 -0
  821. /package/{packages/core/dist → dist}/index.d.ts.map +0 -0
  822. /package/{packages/core/dist → dist}/index.js +0 -0
  823. /package/{packages/core/dist → dist}/index.js.map +0 -0
  824. /package/{packages/core/dist → dist}/jira/jira-epic-creation.d.ts +0 -0
  825. /package/{packages/core/dist → dist}/jira/jira-epic-creation.d.ts.map +0 -0
  826. /package/{packages/core/dist → dist}/jira/jira-epic-creation.js +0 -0
  827. /package/{packages/core/dist → dist}/jira/jira-epic-creation.js.map +0 -0
  828. /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.d.ts +0 -0
  829. /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.d.ts.map +0 -0
  830. /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.js +0 -0
  831. /package/{packages/core/dist → dist}/jira/jira-epic-creation.test.js.map +0 -0
  832. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.d.ts +0 -0
  833. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.d.ts.map +0 -0
  834. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.js +0 -0
  835. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.js.map +0 -0
  836. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.d.ts +0 -0
  837. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.d.ts.map +0 -0
  838. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.js +0 -0
  839. /package/{packages/core/dist → dist}/jira/jira-sprint-sync.test.js.map +0 -0
  840. /package/{packages/core/dist → dist}/permissions/index.d.ts +0 -0
  841. /package/{packages/core/dist → dist}/permissions/index.d.ts.map +0 -0
  842. /package/{packages/core/dist → dist}/permissions/index.js +0 -0
  843. /package/{packages/core/dist → dist}/permissions/index.js.map +0 -0
  844. /package/{packages/core/dist → dist}/permissions/permission-schema.d.ts +0 -0
  845. /package/{packages/core/dist → dist}/permissions/permission-schema.d.ts.map +0 -0
  846. /package/{packages/core/dist → dist}/permissions/permission-schema.js +0 -0
  847. /package/{packages/core/dist → dist}/permissions/permission-schema.js.map +0 -0
  848. /package/{packages/core/dist → dist}/permissions/permission-schema.test.d.ts +0 -0
  849. /package/{packages/core/dist → dist}/permissions/permission-schema.test.d.ts.map +0 -0
  850. /package/{packages/core/dist → dist}/permissions/permission-schema.test.js +0 -0
  851. /package/{packages/core/dist → dist}/permissions/permission-schema.test.js.map +0 -0
  852. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.d.ts +0 -0
  853. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.d.ts.map +0 -0
  854. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.js +0 -0
  855. /package/{packages/core/dist → dist}/scripts/add-ocean-profiles.js.map +0 -0
  856. /package/{packages/core/dist → dist}/scripts/benchmark-integration.d.ts +0 -0
  857. /package/{packages/core/dist → dist}/scripts/benchmark-integration.d.ts.map +0 -0
  858. /package/{packages/core/dist → dist}/scripts/benchmark-integration.js +0 -0
  859. /package/{packages/core/dist → dist}/scripts/benchmark-integration.js.map +0 -0
  860. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.d.ts +0 -0
  861. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.d.ts.map +0 -0
  862. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.js +0 -0
  863. /package/{packages/core/dist → dist}/scripts/benchmark-integration.test.js.map +0 -0
  864. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.d.ts +0 -0
  865. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.d.ts.map +0 -0
  866. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.js +0 -0
  867. /package/{packages/core/dist → dist}/scripts/debugging-scenarios.test.js.map +0 -0
  868. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.d.ts +0 -0
  869. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.d.ts.map +0 -0
  870. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.js +0 -0
  871. /package/{packages/core/dist → dist}/scripts/generate-all-spiders.js.map +0 -0
  872. /package/{packages/core/dist → dist}/scripts/generate-report.d.ts +0 -0
  873. /package/{packages/core/dist → dist}/scripts/generate-report.d.ts.map +0 -0
  874. /package/{packages/core/dist → dist}/scripts/generate-report.js +0 -0
  875. /package/{packages/core/dist → dist}/scripts/generate-report.js.map +0 -0
  876. /package/{packages/core/dist → dist}/scripts/generate-report.test.d.ts +0 -0
  877. /package/{packages/core/dist → dist}/scripts/generate-report.test.d.ts.map +0 -0
  878. /package/{packages/core/dist → dist}/scripts/generate-report.test.js +0 -0
  879. /package/{packages/core/dist → dist}/scripts/generate-report.test.js.map +0 -0
  880. /package/{packages/core/dist → dist}/scripts/generate-spider-report.d.ts +0 -0
  881. /package/{packages/core/dist → dist}/scripts/generate-spider-report.d.ts.map +0 -0
  882. /package/{packages/core/dist → dist}/scripts/generate-spider-report.js +0 -0
  883. /package/{packages/core/dist → dist}/scripts/generate-spider-report.js.map +0 -0
  884. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.d.ts +0 -0
  885. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.d.ts.map +0 -0
  886. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.js +0 -0
  887. /package/{packages/core/dist → dist}/scripts/generate-spider-report.test.js.map +0 -0
  888. /package/{packages/core/dist → dist}/scripts/generate-spider.d.ts +0 -0
  889. /package/{packages/core/dist → dist}/scripts/generate-spider.d.ts.map +0 -0
  890. /package/{packages/core/dist → dist}/scripts/generate-spider.js +0 -0
  891. /package/{packages/core/dist → dist}/scripts/generate-spider.js.map +0 -0
  892. /package/{packages/core/dist → dist}/scripts/generate-spider.test.d.ts +0 -0
  893. /package/{packages/core/dist → dist}/scripts/generate-spider.test.d.ts.map +0 -0
  894. /package/{packages/core/dist → dist}/scripts/generate-spider.test.js +0 -0
  895. /package/{packages/core/dist → dist}/scripts/generate-spider.test.js.map +0 -0
  896. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.d.ts +0 -0
  897. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.d.ts.map +0 -0
  898. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.js +0 -0
  899. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.js.map +0 -0
  900. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.d.ts +0 -0
  901. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.d.ts.map +0 -0
  902. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.js +0 -0
  903. /package/{packages/core/dist → dist}/scripts/job-fair-aggregator.test.js.map +0 -0
  904. /package/{packages/core/dist → dist}/scripts/run-ci.test.d.ts +0 -0
  905. /package/{packages/core/dist → dist}/scripts/run-ci.test.d.ts.map +0 -0
  906. /package/{packages/core/dist → dist}/scripts/run-ci.test.js +0 -0
  907. /package/{packages/core/dist → dist}/scripts/run-ci.test.js.map +0 -0
  908. /package/{packages/core/dist → dist}/scripts/theme-detail.test.d.ts +0 -0
  909. /package/{packages/core/dist → dist}/scripts/theme-detail.test.d.ts.map +0 -0
  910. /package/{packages/core/dist → dist}/scripts/theme-detail.test.js +0 -0
  911. /package/{packages/core/dist → dist}/scripts/theme-detail.test.js.map +0 -0
  912. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.d.ts +0 -0
  913. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.d.ts.map +0 -0
  914. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.js +0 -0
  915. /package/{packages/core/dist → dist}/scripts/validate-ocean-profiles.js.map +0 -0
  916. /package/{packages/core/dist → dist}/workflow/gate-handler.d.ts +0 -0
  917. /package/{packages/core/dist → dist}/workflow/gate-handler.d.ts.map +0 -0
  918. /package/{packages/core/dist → dist}/workflow/gate-handler.js +0 -0
  919. /package/{packages/core/dist → dist}/workflow/gate-handler.js.map +0 -0
  920. /package/{packages/core/dist → dist}/workflow/gate-handler.test.d.ts +0 -0
  921. /package/{packages/core/dist → dist}/workflow/gate-handler.test.d.ts.map +0 -0
  922. /package/{packages/core/dist → dist}/workflow/gate-handler.test.js +0 -0
  923. /package/{packages/core/dist → dist}/workflow/gate-handler.test.js.map +0 -0
  924. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.d.ts +0 -0
  925. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.d.ts.map +0 -0
  926. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.js +0 -0
  927. /package/{packages/core/dist → dist}/workflow/generic-sm-finish.js.map +0 -0
  928. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.d.ts +0 -0
  929. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.d.ts.map +0 -0
  930. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.js +0 -0
  931. /package/{packages/core/dist → dist}/workflow/generic-sm-setup.js.map +0 -0
  932. /package/{packages/core/dist → dist}/workflow/handoff.d.ts +0 -0
  933. /package/{packages/core/dist → dist}/workflow/handoff.d.ts.map +0 -0
  934. /package/{packages/core/dist → dist}/workflow/handoff.js +0 -0
  935. /package/{packages/core/dist → dist}/workflow/handoff.js.map +0 -0
  936. /package/{packages/core/dist → dist}/workflow/handoff.test.d.ts +0 -0
  937. /package/{packages/core/dist → dist}/workflow/handoff.test.d.ts.map +0 -0
  938. /package/{packages/core/dist → dist}/workflow/handoff.test.js +0 -0
  939. /package/{packages/core/dist → dist}/workflow/handoff.test.js.map +0 -0
  940. /package/{packages/core/dist → dist}/workflow/index.d.ts +0 -0
  941. /package/{packages/core/dist → dist}/workflow/index.d.ts.map +0 -0
  942. /package/{packages/core/dist → dist}/workflow/index.js +0 -0
  943. /package/{packages/core/dist → dist}/workflow/index.js.map +0 -0
  944. /package/{packages/core/dist → dist}/workflow/session-state.d.ts +0 -0
  945. /package/{packages/core/dist → dist}/workflow/session-state.d.ts.map +0 -0
  946. /package/{packages/core/dist → dist}/workflow/session-state.js +0 -0
  947. /package/{packages/core/dist → dist}/workflow/session-state.js.map +0 -0
  948. /package/{packages/core/dist → dist}/workflow/session-state.test.d.ts +0 -0
  949. /package/{packages/core/dist → dist}/workflow/session-state.test.d.ts.map +0 -0
  950. /package/{packages/core/dist → dist}/workflow/session-state.test.js +0 -0
  951. /package/{packages/core/dist → dist}/workflow/session-state.test.js.map +0 -0
  952. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.d.ts +0 -0
  953. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.d.ts.map +0 -0
  954. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.js +0 -0
  955. /package/{packages/core/dist → dist}/workflow/sm-subagents.test.js.map +0 -0
  956. /package/{packages/core/dist → dist}/workflow/step-parser.d.ts +0 -0
  957. /package/{packages/core/dist → dist}/workflow/step-parser.d.ts.map +0 -0
  958. /package/{packages/core/dist → dist}/workflow/step-parser.js +0 -0
  959. /package/{packages/core/dist → dist}/workflow/step-parser.js.map +0 -0
  960. /package/{packages/core/dist → dist}/workflow/step-parser.test.d.ts +0 -0
  961. /package/{packages/core/dist → dist}/workflow/step-parser.test.d.ts.map +0 -0
  962. /package/{packages/core/dist → dist}/workflow/step-parser.test.js +0 -0
  963. /package/{packages/core/dist → dist}/workflow/step-parser.test.js.map +0 -0
  964. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.d.ts +0 -0
  965. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.d.ts.map +0 -0
  966. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.js +0 -0
  967. /package/{packages/core/dist → dist}/workflow/story-workflow-routing.test.js.map +0 -0
  968. /package/{packages/core/dist → dist}/workflow/test-cache.d.ts +0 -0
  969. /package/{packages/core/dist → dist}/workflow/test-cache.d.ts.map +0 -0
  970. /package/{packages/core/dist → dist}/workflow/test-cache.js +0 -0
  971. /package/{packages/core/dist → dist}/workflow/test-cache.js.map +0 -0
  972. /package/{packages/core/dist → dist}/workflow/test-cache.test.d.ts +0 -0
  973. /package/{packages/core/dist → dist}/workflow/test-cache.test.d.ts.map +0 -0
  974. /package/{packages/core/dist → dist}/workflow/test-cache.test.js +0 -0
  975. /package/{packages/core/dist → dist}/workflow/test-cache.test.js.map +0 -0
  976. /package/{packages/core/dist → dist}/workflow/trimodal.d.ts +0 -0
  977. /package/{packages/core/dist → dist}/workflow/trimodal.d.ts.map +0 -0
  978. /package/{packages/core/dist → dist}/workflow/trimodal.js +0 -0
  979. /package/{packages/core/dist → dist}/workflow/trimodal.js.map +0 -0
  980. /package/{packages/core/dist → dist}/workflow/trimodal.test.d.ts +0 -0
  981. /package/{packages/core/dist → dist}/workflow/trimodal.test.d.ts.map +0 -0
  982. /package/{packages/core/dist → dist}/workflow/trimodal.test.js +0 -0
  983. /package/{packages/core/dist → dist}/workflow/trimodal.test.js.map +0 -0
  984. /package/{packages/core/dist → dist}/workflow/variable-resolver.d.ts +0 -0
  985. /package/{packages/core/dist → dist}/workflow/variable-resolver.d.ts.map +0 -0
  986. /package/{packages/core/dist → dist}/workflow/variable-resolver.js +0 -0
  987. /package/{packages/core/dist → dist}/workflow/variable-resolver.js.map +0 -0
  988. /package/{packages/core/dist → dist}/workflow/variable-resolver.test.d.ts +0 -0
  989. /package/{packages/core/dist → dist}/workflow/variable-resolver.test.d.ts.map +0 -0
  990. /package/{packages/core/dist → dist}/workflow/variable-resolver.test.js +0 -0
  991. /package/{packages/core/dist → dist}/workflow/variable-resolver.test.js.map +0 -0
  992. /package/{packages/core/dist → dist}/workflow/workflow-executor.d.ts +0 -0
  993. /package/{packages/core/dist → dist}/workflow/workflow-executor.d.ts.map +0 -0
  994. /package/{packages/core/dist → dist}/workflow/workflow-executor.js +0 -0
  995. /package/{packages/core/dist → dist}/workflow/workflow-executor.js.map +0 -0
  996. /package/{packages/core/dist → dist}/workflow/workflow-executor.test.d.ts +0 -0
  997. /package/{packages/core/dist → dist}/workflow/workflow-executor.test.d.ts.map +0 -0
  998. /package/{packages/core/dist → dist}/workflow/workflow-executor.test.js +0 -0
  999. /package/{packages/core/dist → dist}/workflow/workflow-executor.test.js.map +0 -0
  1000. /package/{packages/core/dist → dist}/workflow/workflow-loader.d.ts +0 -0
  1001. /package/{packages/core/dist → dist}/workflow/workflow-loader.d.ts.map +0 -0
  1002. /package/{packages/core/dist → dist}/workflow/workflow-loader.js +0 -0
  1003. /package/{packages/core/dist → dist}/workflow/workflow-loader.js.map +0 -0
  1004. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.d.ts +0 -0
  1005. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.d.ts.map +0 -0
  1006. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.js +0 -0
  1007. /package/{packages/core/dist → dist}/workflow/workflow-loader.test.js.map +0 -0
  1008. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.d.ts +0 -0
  1009. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.d.ts.map +0 -0
  1010. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.js +0 -0
  1011. /package/{packages/core/dist → dist}/workflow/workflow-migration.test.js.map +0 -0
  1012. /package/{packages/core/dist → dist}/workflow/workflow-permissions.d.ts +0 -0
  1013. /package/{packages/core/dist → dist}/workflow/workflow-permissions.d.ts.map +0 -0
  1014. /package/{packages/core/dist → dist}/workflow/workflow-permissions.js +0 -0
  1015. /package/{packages/core/dist → dist}/workflow/workflow-permissions.js.map +0 -0
  1016. /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.d.ts +0 -0
  1017. /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.d.ts.map +0 -0
  1018. /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.js +0 -0
  1019. /package/{packages/core/dist → dist}/workflow/workflow-permissions.test.js.map +0 -0
  1020. /package/{packages/core/dist → dist}/workflow/workflow-router.d.ts +0 -0
  1021. /package/{packages/core/dist → dist}/workflow/workflow-router.d.ts.map +0 -0
  1022. /package/{packages/core/dist → dist}/workflow/workflow-router.js +0 -0
  1023. /package/{packages/core/dist → dist}/workflow/workflow-router.js.map +0 -0
  1024. /package/{packages/core/dist → dist}/workflow/workflow-router.test.d.ts +0 -0
  1025. /package/{packages/core/dist → dist}/workflow/workflow-router.test.d.ts.map +0 -0
  1026. /package/{packages/core/dist → dist}/workflow/workflow-router.test.js +0 -0
  1027. /package/{packages/core/dist → dist}/workflow/workflow-router.test.js.map +0 -0
  1028. /package/{packages/core/dist → dist}/workflow/workflow-schema.d.ts +0 -0
  1029. /package/{packages/core/dist → dist}/workflow/workflow-schema.d.ts.map +0 -0
  1030. /package/{packages/core/dist → dist}/workflow/workflow-schema.js +0 -0
  1031. /package/{packages/core/dist → dist}/workflow/workflow-schema.js.map +0 -0
  1032. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.d.ts +0 -0
  1033. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.d.ts.map +0 -0
  1034. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.js +0 -0
  1035. /package/{packages/core/dist → dist}/workflow/workflow-schema.test.js.map +0 -0
  1036. /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.d.ts +0 -0
  1037. /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.d.ts.map +0 -0
  1038. /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.js +0 -0
  1039. /package/{packages/core/dist → dist}/workflow/workflow-stepped-schema.test.js.map +0 -0
@@ -1,842 +0,0 @@
1
- """Tests for brownfield discovery module.
2
-
3
- Story MSSCI-12419: Brownfield discovery command.
4
-
5
- Tests verify:
6
- 1. Project type detection (monorepo, single package, etc.)
7
- 2. Tech stack extraction from manifest files
8
- 3. Directory scanning with async parallelism
9
- 4. Architecture pattern recognition
10
- 5. Document generation matching _bmad-output format
11
- 6. Depth levels (quick/standard/deep)
12
- 7. CLI integration
13
- """
14
-
15
- import asyncio
16
- import subprocess
17
- import sys
18
- import tempfile
19
- from pathlib import Path
20
- from typing import Generator
21
- from unittest.mock import MagicMock, patch
22
-
23
- import pytest
24
-
25
- from pennyfarthing_scripts.brownfield import (
26
- DepthLevel,
27
- ProjectType,
28
- DiscoveryResult,
29
- detect_project_type,
30
- detect_tech_stack,
31
- scan_directory_structure,
32
- detect_architecture_patterns,
33
- generate_project_overview,
34
- generate_tech_stack_doc,
35
- generate_source_tree_doc,
36
- generate_ai_guidance_doc,
37
- discover,
38
- )
39
- from pennyfarthing_scripts.brownfield.discover import (
40
- TechStackItem,
41
- DirectoryNode,
42
- ArchitecturePattern,
43
- )
44
-
45
-
46
- # =============================================================================
47
- # FIXTURES
48
- # =============================================================================
49
-
50
-
51
- @pytest.fixture
52
- def temp_project_dir() -> Generator[Path, None, None]:
53
- """Create a temporary project directory."""
54
- with tempfile.TemporaryDirectory() as tmp:
55
- yield Path(tmp)
56
-
57
-
58
- @pytest.fixture
59
- def node_project(temp_project_dir: Path) -> Path:
60
- """Create a basic Node.js project structure."""
61
- # package.json
62
- (temp_project_dir / "package.json").write_text('''{
63
- "name": "test-project",
64
- "version": "1.0.0",
65
- "type": "module",
66
- "dependencies": {
67
- "express": "^4.18.2"
68
- },
69
- "devDependencies": {
70
- "typescript": "^5.3.3"
71
- }
72
- }''')
73
-
74
- # tsconfig.json
75
- (temp_project_dir / "tsconfig.json").write_text('''{
76
- "compilerOptions": {
77
- "target": "ES2022",
78
- "module": "NodeNext"
79
- }
80
- }''')
81
-
82
- # src directory
83
- src = temp_project_dir / "src"
84
- src.mkdir()
85
- (src / "index.ts").write_text("export const hello = 'world';")
86
-
87
- return temp_project_dir
88
-
89
-
90
- @pytest.fixture
91
- def python_project(temp_project_dir: Path) -> Path:
92
- """Create a basic Python project structure."""
93
- # pyproject.toml
94
- (temp_project_dir / "pyproject.toml").write_text('''[project]
95
- name = "test-project"
96
- version = "1.0.0"
97
- dependencies = [
98
- "requests>=2.28.0",
99
- "pyyaml>=6.0"
100
- ]
101
-
102
- [project.optional-dependencies]
103
- dev = ["pytest>=7.0.0", "black>=23.0.0"]
104
- ''')
105
-
106
- # src directory
107
- src = temp_project_dir / "src" / "test_project"
108
- src.mkdir(parents=True)
109
- (src / "__init__.py").write_text("__version__ = '1.0.0'")
110
-
111
- return temp_project_dir
112
-
113
-
114
- @pytest.fixture
115
- def monorepo_project(temp_project_dir: Path) -> Path:
116
- """Create a pnpm monorepo structure."""
117
- # Root package.json
118
- (temp_project_dir / "package.json").write_text('''{
119
- "name": "test-monorepo",
120
- "version": "1.0.0",
121
- "private": true,
122
- "workspaces": ["packages/*"]
123
- }''')
124
-
125
- # pnpm-workspace.yaml
126
- (temp_project_dir / "pnpm-workspace.yaml").write_text('''packages:
127
- - packages/*
128
- ''')
129
-
130
- # Package A
131
- pkg_a = temp_project_dir / "packages" / "core"
132
- pkg_a.mkdir(parents=True)
133
- (pkg_a / "package.json").write_text('''{
134
- "name": "@test/core",
135
- "version": "1.0.0"
136
- }''')
137
-
138
- # Package B
139
- pkg_b = temp_project_dir / "packages" / "cli"
140
- pkg_b.mkdir(parents=True)
141
- (pkg_b / "package.json").write_text('''{
142
- "name": "@test/cli",
143
- "version": "1.0.0",
144
- "dependencies": {
145
- "@test/core": "workspace:*"
146
- }
147
- }''')
148
-
149
- return temp_project_dir
150
-
151
-
152
- @pytest.fixture
153
- def multi_language_project(temp_project_dir: Path) -> Path:
154
- """Create a project with multiple languages."""
155
- # Node.js
156
- (temp_project_dir / "package.json").write_text('{"name": "multi", "version": "1.0.0"}')
157
-
158
- # Python
159
- (temp_project_dir / "pyproject.toml").write_text('[project]\nname = "multi"\nversion = "1.0.0"')
160
-
161
- # Go
162
- (temp_project_dir / "go.mod").write_text('module example.com/multi\n\ngo 1.21')
163
-
164
- return temp_project_dir
165
-
166
-
167
- # =============================================================================
168
- # PROJECT TYPE DETECTION TESTS
169
- # =============================================================================
170
-
171
-
172
- class TestProjectTypeDetection:
173
- """Tests for detect_project_type()."""
174
-
175
- @pytest.mark.asyncio
176
- async def test_detect_monorepo_from_workspaces(self, monorepo_project: Path) -> None:
177
- """Should detect monorepo from package.json workspaces."""
178
- result = await detect_project_type(monorepo_project)
179
- assert result == ProjectType.MONOREPO
180
-
181
- @pytest.mark.asyncio
182
- async def test_detect_monorepo_from_pnpm_workspace(self, temp_project_dir: Path) -> None:
183
- """Should detect monorepo from pnpm-workspace.yaml."""
184
- (temp_project_dir / "pnpm-workspace.yaml").write_text("packages:\n - packages/*")
185
- (temp_project_dir / "packages").mkdir()
186
-
187
- result = await detect_project_type(temp_project_dir)
188
- assert result == ProjectType.MONOREPO
189
-
190
- @pytest.mark.asyncio
191
- async def test_detect_single_node_package(self, node_project: Path) -> None:
192
- """Should detect single package from package.json without workspaces."""
193
- result = await detect_project_type(node_project)
194
- assert result == ProjectType.SINGLE_PACKAGE
195
-
196
- @pytest.mark.asyncio
197
- async def test_detect_single_python_package(self, python_project: Path) -> None:
198
- """Should detect single package from pyproject.toml."""
199
- result = await detect_project_type(python_project)
200
- assert result == ProjectType.SINGLE_PACKAGE
201
-
202
- @pytest.mark.asyncio
203
- async def test_detect_multi_language(self, multi_language_project: Path) -> None:
204
- """Should detect multi-language project."""
205
- result = await detect_project_type(multi_language_project)
206
- assert result == ProjectType.MULTI_LANGUAGE
207
-
208
- @pytest.mark.asyncio
209
- async def test_detect_unknown_for_empty_dir(self, temp_project_dir: Path) -> None:
210
- """Should return UNKNOWN for empty directory."""
211
- result = await detect_project_type(temp_project_dir)
212
- assert result == ProjectType.UNKNOWN
213
-
214
-
215
- # =============================================================================
216
- # TECH STACK DETECTION TESTS
217
- # =============================================================================
218
-
219
-
220
- class TestTechStackDetection:
221
- """Tests for detect_tech_stack()."""
222
-
223
- @pytest.mark.asyncio
224
- async def test_detect_node_dependencies(self, node_project: Path) -> None:
225
- """Should detect Node.js dependencies from package.json."""
226
- result = await detect_tech_stack(node_project)
227
-
228
- names = [item.name for item in result]
229
- assert "express" in names
230
- assert "typescript" in names
231
-
232
- @pytest.mark.asyncio
233
- async def test_detect_node_versions(self, node_project: Path) -> None:
234
- """Should extract dependency versions."""
235
- result = await detect_tech_stack(node_project)
236
-
237
- express = next(item for item in result if item.name == "express")
238
- assert express.version == "^4.18.2"
239
-
240
- @pytest.mark.asyncio
241
- async def test_categorize_dev_dependencies(self, node_project: Path) -> None:
242
- """Should categorize devDependencies correctly."""
243
- result = await detect_tech_stack(node_project)
244
-
245
- typescript = next(item for item in result if item.name == "typescript")
246
- assert typescript.category == "dev"
247
-
248
- @pytest.mark.asyncio
249
- async def test_detect_python_dependencies(self, python_project: Path) -> None:
250
- """Should detect Python dependencies from pyproject.toml."""
251
- result = await detect_tech_stack(python_project)
252
-
253
- names = [item.name for item in result]
254
- assert "requests" in names
255
- assert "pyyaml" in names
256
-
257
- @pytest.mark.asyncio
258
- async def test_detect_python_dev_dependencies(self, python_project: Path) -> None:
259
- """Should detect Python dev dependencies."""
260
- result = await detect_tech_stack(python_project)
261
-
262
- pytest_item = next((item for item in result if item.name == "pytest"), None)
263
- assert pytest_item is not None
264
- assert pytest_item.category == "dev"
265
-
266
- @pytest.mark.asyncio
267
- async def test_detect_go_module(self, temp_project_dir: Path) -> None:
268
- """Should detect Go from go.mod."""
269
- (temp_project_dir / "go.mod").write_text('''module example.com/test
270
-
271
- go 1.21
272
-
273
- require (
274
- github.com/gin-gonic/gin v1.9.1
275
- )
276
- ''')
277
-
278
- result = await detect_tech_stack(temp_project_dir)
279
-
280
- names = [item.name for item in result]
281
- assert "go" in names or "gin" in names
282
-
283
- @pytest.mark.asyncio
284
- async def test_detect_rust_crate(self, temp_project_dir: Path) -> None:
285
- """Should detect Rust from Cargo.toml."""
286
- (temp_project_dir / "Cargo.toml").write_text('''[package]
287
- name = "test-crate"
288
- version = "0.1.0"
289
-
290
- [dependencies]
291
- serde = "1.0"
292
- ''')
293
-
294
- result = await detect_tech_stack(temp_project_dir)
295
-
296
- names = [item.name for item in result]
297
- assert "serde" in names or "rust" in names
298
-
299
- @pytest.mark.asyncio
300
- async def test_quick_depth_only_root(self, monorepo_project: Path) -> None:
301
- """Quick depth should only scan root manifest files."""
302
- result = await detect_tech_stack(monorepo_project, depth=DepthLevel.QUICK)
303
-
304
- # Should not include nested package deps
305
- names = [item.name for item in result]
306
- # Should have root project but not workspace packages' specific deps
307
- assert len(names) >= 0 # At least scanned something
308
-
309
- @pytest.mark.asyncio
310
- async def test_deep_depth_includes_nested(self, monorepo_project: Path) -> None:
311
- """Deep depth should scan nested packages."""
312
- result = await detect_tech_stack(monorepo_project, depth=DepthLevel.DEEP)
313
-
314
- # Should include deps from workspace packages
315
- assert len(result) >= 0
316
-
317
-
318
- # =============================================================================
319
- # DIRECTORY SCANNING TESTS
320
- # =============================================================================
321
-
322
-
323
- class TestDirectoryScanning:
324
- """Tests for scan_directory_structure()."""
325
-
326
- @pytest.mark.asyncio
327
- async def test_scan_returns_root_node(self, node_project: Path) -> None:
328
- """Should return root DirectoryNode."""
329
- result = await scan_directory_structure(node_project)
330
-
331
- assert isinstance(result, DirectoryNode)
332
- assert result.path == node_project
333
- assert result.is_dir is True
334
-
335
- @pytest.mark.asyncio
336
- async def test_scan_includes_children(self, node_project: Path) -> None:
337
- """Should include child directories."""
338
- result = await scan_directory_structure(node_project)
339
-
340
- child_names = [c.name for c in result.children]
341
- assert "src" in child_names
342
-
343
- @pytest.mark.asyncio
344
- async def test_scan_respects_max_depth(self, temp_project_dir: Path) -> None:
345
- """Should respect max_depth parameter."""
346
- # Create deep nesting
347
- deep = temp_project_dir / "a" / "b" / "c" / "d" / "e"
348
- deep.mkdir(parents=True)
349
-
350
- result = await scan_directory_structure(temp_project_dir, max_depth=2)
351
-
352
- # Verify we don't go too deep
353
- def count_depth(node: DirectoryNode, current: int = 0) -> int:
354
- if not node.children:
355
- return current
356
- return max(count_depth(c, current + 1) for c in node.children)
357
-
358
- assert count_depth(result) <= 2
359
-
360
- @pytest.mark.asyncio
361
- async def test_scan_annotates_common_dirs(self, node_project: Path) -> None:
362
- """Should annotate common directory names."""
363
- result = await scan_directory_structure(node_project)
364
-
365
- src_node = next((c for c in result.children if c.name == "src"), None)
366
- assert src_node is not None
367
- assert src_node.annotation != "" # Should have annotation
368
-
369
- @pytest.mark.asyncio
370
- async def test_scan_excludes_node_modules(self, node_project: Path) -> None:
371
- """Should exclude node_modules by default."""
372
- (node_project / "node_modules" / "express").mkdir(parents=True)
373
-
374
- result = await scan_directory_structure(node_project)
375
-
376
- child_names = [c.name for c in result.children]
377
- assert "node_modules" not in child_names
378
-
379
- @pytest.mark.asyncio
380
- async def test_scan_excludes_git(self, node_project: Path) -> None:
381
- """Should exclude .git directory."""
382
- (node_project / ".git" / "objects").mkdir(parents=True)
383
-
384
- result = await scan_directory_structure(node_project)
385
-
386
- child_names = [c.name for c in result.children]
387
- assert ".git" not in child_names
388
-
389
- @pytest.mark.asyncio
390
- async def test_scan_parallel_execution(self, temp_project_dir: Path) -> None:
391
- """Should scan directories in parallel."""
392
- # Create multiple directories
393
- for i in range(10):
394
- (temp_project_dir / f"dir_{i}").mkdir()
395
-
396
- # Time the scan (should be fast due to parallelism)
397
- import time
398
- start = time.time()
399
- result = await scan_directory_structure(temp_project_dir)
400
- elapsed = time.time() - start
401
-
402
- assert len(result.children) == 10
403
- # Should complete quickly with parallelism
404
- assert elapsed < 5.0 # Very generous timeout
405
-
406
-
407
- # =============================================================================
408
- # ARCHITECTURE PATTERN DETECTION TESTS
409
- # =============================================================================
410
-
411
-
412
- class TestArchitecturePatterns:
413
- """Tests for detect_architecture_patterns()."""
414
-
415
- @pytest.mark.asyncio
416
- async def test_detect_monorepo_pattern(self, monorepo_project: Path) -> None:
417
- """Should detect monorepo architecture pattern."""
418
- result = await detect_architecture_patterns(monorepo_project)
419
-
420
- pattern_names = [p.name for p in result]
421
- assert "monorepo" in pattern_names or "workspace" in pattern_names
422
-
423
- @pytest.mark.asyncio
424
- async def test_detect_src_lib_pattern(self, node_project: Path) -> None:
425
- """Should detect src/ directory pattern."""
426
- result = await detect_architecture_patterns(node_project)
427
-
428
- pattern_names = [p.name for p in result]
429
- # Should detect layered or src-based architecture
430
- assert len(pattern_names) >= 0
431
-
432
- @pytest.mark.asyncio
433
- async def test_pattern_includes_evidence(self, monorepo_project: Path) -> None:
434
- """Should include evidence for detected patterns."""
435
- result = await detect_architecture_patterns(monorepo_project)
436
-
437
- if result:
438
- pattern = result[0]
439
- assert len(pattern.evidence) > 0
440
-
441
- @pytest.mark.asyncio
442
- async def test_detect_mvc_pattern(self, temp_project_dir: Path) -> None:
443
- """Should detect MVC pattern from directory structure."""
444
- # Create MVC-like structure
445
- (temp_project_dir / "models").mkdir()
446
- (temp_project_dir / "views").mkdir()
447
- (temp_project_dir / "controllers").mkdir()
448
-
449
- result = await detect_architecture_patterns(temp_project_dir)
450
-
451
- pattern_names = [p.name.lower() for p in result]
452
- assert "mvc" in pattern_names
453
-
454
- @pytest.mark.asyncio
455
- async def test_detect_layered_architecture(self, temp_project_dir: Path) -> None:
456
- """Should detect layered architecture."""
457
- # Create layered structure
458
- (temp_project_dir / "api").mkdir()
459
- (temp_project_dir / "services").mkdir()
460
- (temp_project_dir / "repositories").mkdir()
461
-
462
- result = await detect_architecture_patterns(temp_project_dir)
463
-
464
- pattern_names = [p.name.lower() for p in result]
465
- assert "layered" in pattern_names or "service" in pattern_names
466
-
467
-
468
- # =============================================================================
469
- # DOCUMENT GENERATION TESTS
470
- # =============================================================================
471
-
472
-
473
- class TestDocumentGeneration:
474
- """Tests for document generation functions."""
475
-
476
- @pytest.fixture
477
- def sample_result(self, node_project: Path) -> DiscoveryResult:
478
- """Create a sample discovery result."""
479
- return DiscoveryResult(
480
- project_path=node_project,
481
- project_type=ProjectType.SINGLE_PACKAGE,
482
- project_name="test-project",
483
- version="1.0.0",
484
- tech_stack=[
485
- TechStackItem("express", "^4.18.2", "runtime"),
486
- TechStackItem("typescript", "^5.3.3", "dev"),
487
- ],
488
- directory_tree=DirectoryNode(
489
- path=node_project,
490
- name="test-project",
491
- is_dir=True,
492
- children=[
493
- DirectoryNode(
494
- path=node_project / "src",
495
- name="src",
496
- is_dir=True,
497
- annotation="Source code",
498
- ),
499
- ],
500
- ),
501
- patterns=[
502
- ArchitecturePattern(
503
- "typescript",
504
- "TypeScript project with compilation",
505
- ["tsconfig.json present"],
506
- ),
507
- ],
508
- )
509
-
510
- def test_generate_project_overview_markdown(self, sample_result: DiscoveryResult) -> None:
511
- """Should generate valid markdown."""
512
- content = generate_project_overview(sample_result)
513
-
514
- assert isinstance(content, str)
515
- assert len(content) > 0
516
- assert "# " in content # Has markdown headers
517
-
518
- def test_project_overview_includes_name(self, sample_result: DiscoveryResult) -> None:
519
- """Should include project name."""
520
- content = generate_project_overview(sample_result)
521
-
522
- assert "test-project" in content
523
-
524
- def test_project_overview_includes_version(self, sample_result: DiscoveryResult) -> None:
525
- """Should include version."""
526
- content = generate_project_overview(sample_result)
527
-
528
- assert "1.0.0" in content
529
-
530
- def test_generate_tech_stack_markdown(self, sample_result: DiscoveryResult) -> None:
531
- """Should generate tech stack markdown."""
532
- content = generate_tech_stack_doc(sample_result)
533
-
534
- assert isinstance(content, str)
535
- assert "express" in content
536
- assert "typescript" in content
537
-
538
- def test_tech_stack_includes_table(self, sample_result: DiscoveryResult) -> None:
539
- """Should include markdown table."""
540
- content = generate_tech_stack_doc(sample_result)
541
-
542
- assert "|" in content # Table delimiter
543
-
544
- def test_generate_source_tree_markdown(self, sample_result: DiscoveryResult) -> None:
545
- """Should generate source tree markdown."""
546
- content = generate_source_tree_doc(sample_result)
547
-
548
- assert isinstance(content, str)
549
- assert "src" in content
550
-
551
- def test_source_tree_shows_structure(self, sample_result: DiscoveryResult) -> None:
552
- """Should show tree structure."""
553
- content = generate_source_tree_doc(sample_result)
554
-
555
- # Should have tree-like characters or indentation
556
- assert "├" in content or "└" in content or " " in content
557
-
558
- def test_generate_ai_guidance_markdown(self, sample_result: DiscoveryResult) -> None:
559
- """Should generate AI guidance markdown."""
560
- content = generate_ai_guidance_doc(sample_result)
561
-
562
- assert isinstance(content, str)
563
- assert len(content) > 0
564
-
565
- def test_ai_guidance_includes_patterns(self, sample_result: DiscoveryResult) -> None:
566
- """Should mention detected patterns."""
567
- content = generate_ai_guidance_doc(sample_result)
568
-
569
- assert "typescript" in content.lower()
570
-
571
-
572
- # =============================================================================
573
- # INTEGRATION TESTS - discover()
574
- # =============================================================================
575
-
576
-
577
- class TestDiscover:
578
- """Integration tests for discover()."""
579
-
580
- @pytest.mark.asyncio
581
- async def test_discover_returns_result(self, node_project: Path) -> None:
582
- """Should return DiscoveryResult."""
583
- result = await discover(node_project)
584
-
585
- assert isinstance(result, DiscoveryResult)
586
- assert result.success is True
587
-
588
- @pytest.mark.asyncio
589
- async def test_discover_populates_all_fields(self, node_project: Path) -> None:
590
- """Should populate all result fields."""
591
- result = await discover(node_project)
592
-
593
- assert result.project_name is not None
594
- assert result.project_type != ProjectType.UNKNOWN
595
- assert len(result.tech_stack) > 0
596
- assert result.directory_tree is not None
597
-
598
- @pytest.mark.asyncio
599
- async def test_discover_quick_depth(self, node_project: Path) -> None:
600
- """Quick depth should complete quickly."""
601
- import time
602
- start = time.time()
603
- result = await discover(node_project, depth=DepthLevel.QUICK)
604
- elapsed = time.time() - start
605
-
606
- assert result.success is True
607
- assert elapsed < 10.0 # Should be fast
608
-
609
- @pytest.mark.asyncio
610
- async def test_discover_writes_output(self, node_project: Path, temp_project_dir: Path) -> None:
611
- """Should write output files when output_dir specified."""
612
- output_dir = temp_project_dir / "output"
613
- output_dir.mkdir()
614
-
615
- result = await discover(node_project, output_dir=output_dir)
616
-
617
- assert result.success is True
618
- assert (output_dir / "project-overview.md").exists()
619
-
620
- @pytest.mark.asyncio
621
- async def test_discover_all_output_files(self, node_project: Path, temp_project_dir: Path) -> None:
622
- """Should write all expected output files."""
623
- output_dir = temp_project_dir / "output"
624
- output_dir.mkdir()
625
-
626
- result = await discover(node_project, output_dir=output_dir, depth=DepthLevel.DEEP)
627
-
628
- expected_files = [
629
- "project-overview.md",
630
- "technology-stack.md",
631
- "source-tree-analysis.md",
632
- "ai-guidance.md",
633
- ]
634
-
635
- for filename in expected_files:
636
- assert (output_dir / filename).exists(), f"Missing {filename}"
637
-
638
- @pytest.mark.asyncio
639
- async def test_discover_handles_nonexistent_path(self, temp_project_dir: Path) -> None:
640
- """Should handle nonexistent path gracefully."""
641
- nonexistent = temp_project_dir / "does-not-exist"
642
-
643
- result = await discover(nonexistent)
644
-
645
- assert result.success is False
646
- assert result.error is not None
647
-
648
- @pytest.mark.asyncio
649
- async def test_discover_handles_file_path(self, node_project: Path) -> None:
650
- """Should handle file path (not directory) gracefully."""
651
- file_path = node_project / "package.json"
652
-
653
- result = await discover(file_path)
654
-
655
- assert result.success is False
656
- assert result.error is not None
657
-
658
-
659
- # =============================================================================
660
- # CLI TESTS
661
- # =============================================================================
662
-
663
-
664
- class TestBrownfieldCLI:
665
- """Tests for CLI entry point."""
666
-
667
- def test_cli_help(self) -> None:
668
- """CLI should show help with --help."""
669
- result = subprocess.run(
670
- [sys.executable, "-m", "pennyfarthing_scripts.brownfield", "--help"],
671
- capture_output=True,
672
- text=True,
673
- timeout=30,
674
- )
675
-
676
- assert result.returncode == 0
677
- assert "usage" in result.stdout.lower() or "Usage" in result.stdout
678
-
679
- def test_cli_scan_subcommand_help(self) -> None:
680
- """CLI should have scan subcommand."""
681
- result = subprocess.run(
682
- [sys.executable, "-m", "pennyfarthing_scripts.brownfield", "scan", "--help"],
683
- capture_output=True,
684
- text=True,
685
- timeout=30,
686
- )
687
-
688
- assert result.returncode in (0, 1, 2)
689
-
690
- def test_cli_scan_with_path(self, node_project: Path) -> None:
691
- """CLI scan should accept path argument."""
692
- result = subprocess.run(
693
- [
694
- sys.executable, "-m", "pennyfarthing_scripts.brownfield",
695
- "scan", str(node_project), "--depth", "quick"
696
- ],
697
- capture_output=True,
698
- text=True,
699
- timeout=60,
700
- )
701
-
702
- # Should complete (success or expected failure from stub)
703
- assert result.returncode in (0, 1, 2)
704
-
705
- def test_cli_scan_with_output(self, node_project: Path, temp_project_dir: Path) -> None:
706
- """CLI scan should accept --output option."""
707
- output_dir = temp_project_dir / "output"
708
- output_dir.mkdir()
709
-
710
- result = subprocess.run(
711
- [
712
- sys.executable, "-m", "pennyfarthing_scripts.brownfield",
713
- "scan", str(node_project),
714
- "--output", str(output_dir),
715
- "--depth", "quick"
716
- ],
717
- capture_output=True,
718
- text=True,
719
- timeout=60,
720
- )
721
-
722
- assert result.returncode in (0, 1, 2)
723
-
724
-
725
- # =============================================================================
726
- # EDGE CASES AND ERROR HANDLING
727
- # =============================================================================
728
-
729
-
730
- class TestEdgeCases:
731
- """Tests for edge cases and error handling."""
732
-
733
- @pytest.mark.asyncio
734
- async def test_handles_permission_error(self, temp_project_dir: Path) -> None:
735
- """Should handle permission errors gracefully."""
736
- # Create unreadable directory (if supported by OS)
737
- import os
738
- import stat
739
-
740
- restricted = temp_project_dir / "restricted"
741
- restricted.mkdir()
742
-
743
- try:
744
- os.chmod(restricted, 0o000)
745
- result = await discover(temp_project_dir)
746
- # Should not crash, might skip restricted dir
747
- assert result is not None
748
- finally:
749
- # Restore permissions for cleanup
750
- os.chmod(restricted, stat.S_IRWXU)
751
-
752
- @pytest.mark.asyncio
753
- async def test_handles_symlink_loops(self, temp_project_dir: Path) -> None:
754
- """Should handle symlink loops."""
755
- # Create circular symlink
756
- link = temp_project_dir / "loop"
757
- try:
758
- link.symlink_to(temp_project_dir)
759
- except OSError:
760
- pytest.skip("Symlinks not supported")
761
-
762
- result = await scan_directory_structure(temp_project_dir)
763
-
764
- # Should not infinite loop
765
- assert result is not None
766
-
767
- @pytest.mark.asyncio
768
- async def test_handles_very_large_directory(self, temp_project_dir: Path) -> None:
769
- """Should handle directories with many files."""
770
- # Create many files
771
- for i in range(100):
772
- (temp_project_dir / f"file_{i}.txt").write_text(f"content {i}")
773
-
774
- result = await scan_directory_structure(temp_project_dir)
775
-
776
- assert result is not None
777
- assert len(result.children) >= 100
778
-
779
- @pytest.mark.asyncio
780
- async def test_handles_binary_files(self, temp_project_dir: Path) -> None:
781
- """Should handle binary files without crashing."""
782
- # Create binary file
783
- (temp_project_dir / "binary.bin").write_bytes(b"\x00\x01\x02\x03")
784
-
785
- result = await discover(temp_project_dir)
786
-
787
- # Should not crash
788
- assert result is not None
789
-
790
- @pytest.mark.asyncio
791
- async def test_handles_malformed_json(self, temp_project_dir: Path) -> None:
792
- """Should handle malformed package.json."""
793
- (temp_project_dir / "package.json").write_text("{ invalid json }")
794
-
795
- result = await detect_tech_stack(temp_project_dir)
796
-
797
- # Should not crash, return empty or partial results
798
- assert isinstance(result, list)
799
-
800
- @pytest.mark.asyncio
801
- async def test_handles_malformed_toml(self, temp_project_dir: Path) -> None:
802
- """Should handle malformed pyproject.toml."""
803
- (temp_project_dir / "pyproject.toml").write_text("[invalid\ntoml")
804
-
805
- result = await detect_tech_stack(temp_project_dir)
806
-
807
- # Should not crash
808
- assert isinstance(result, list)
809
-
810
-
811
- # =============================================================================
812
- # DEPTH LEVEL TESTS
813
- # =============================================================================
814
-
815
-
816
- class TestDepthLevels:
817
- """Tests verifying depth level behavior."""
818
-
819
- @pytest.mark.asyncio
820
- async def test_quick_depth_fastest(self, monorepo_project: Path) -> None:
821
- """Quick depth should be faster than standard."""
822
- import time
823
-
824
- start = time.time()
825
- await discover(monorepo_project, depth=DepthLevel.QUICK)
826
- quick_time = time.time() - start
827
-
828
- start = time.time()
829
- await discover(monorepo_project, depth=DepthLevel.STANDARD)
830
- standard_time = time.time() - start
831
-
832
- # Quick should be faster (or at least not slower)
833
- assert quick_time <= standard_time + 1.0 # Allow 1s tolerance
834
-
835
- @pytest.mark.asyncio
836
- async def test_deep_depth_most_thorough(self, monorepo_project: Path) -> None:
837
- """Deep depth should find more items than quick."""
838
- quick_result = await discover(monorepo_project, depth=DepthLevel.QUICK)
839
- deep_result = await discover(monorepo_project, depth=DepthLevel.DEEP)
840
-
841
- # Deep should find at least as much as quick
842
- assert len(deep_result.tech_stack) >= len(quick_result.tech_stack)