@mmerterden/multi-agent-pipeline 12.6.0 → 12.8.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 (481) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/README.md +18 -18
  3. package/docs/FIGMA_PIPELINE.md +34 -34
  4. package/docs/adr/0001-three-model-triage.md +12 -12
  5. package/docs/adr/0002-instruction-driven-flag.md +5 -5
  6. package/docs/adr/0003-unified-shared-skills.md +5 -5
  7. package/docs/adr/0004-zero-dependency-philosophy.md +5 -5
  8. package/docs/adr/0005-lazy-phase-docs.md +2 -2
  9. package/docs/adr/0006-skills-core-external-split.md +6 -6
  10. package/docs/adr/0007-multi-tool-adapter-framework.md +19 -19
  11. package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +19 -19
  12. package/docs/adr/README.md +1 -1
  13. package/docs/best-practices.md +3 -3
  14. package/docs/features.md +28 -28
  15. package/docs/performance.md +16 -16
  16. package/docs/recovery-guide.md +39 -39
  17. package/index.js +4 -4
  18. package/install/_common.mjs +53 -11
  19. package/install/_copilot-instructions.mjs +2 -2
  20. package/install/_dev-only-files.mjs +126 -6
  21. package/install/_platform-filter.mjs +1 -1
  22. package/install/_telemetry.mjs +1 -1
  23. package/install/claude.mjs +20 -13
  24. package/install/copilot.mjs +11 -23
  25. package/install/index.mjs +7 -15
  26. package/install/templates/copilot-instructions.md +54 -54
  27. package/install.js +1 -1
  28. package/package.json +29 -11
  29. package/pipeline/commands/multi-agent/SKILL.md +1 -1
  30. package/pipeline/commands/multi-agent/analysis/SKILL.md +2 -2
  31. package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +1 -1
  32. package/pipeline/commands/multi-agent/autopilot/SKILL.md +1 -1
  33. package/pipeline/commands/multi-agent/build-optimize/SKILL.md +1 -1
  34. package/pipeline/commands/multi-agent/create-jira/SKILL.md +1 -1
  35. package/pipeline/commands/multi-agent/design-check/SKILL.md +1 -1
  36. package/pipeline/commands/multi-agent/dev/SKILL.md +1 -1
  37. package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +1 -1
  38. package/pipeline/commands/multi-agent/dev-local/SKILL.md +1 -1
  39. package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +1 -1
  40. package/pipeline/commands/multi-agent/diff-explain/SKILL.md +1 -1
  41. package/pipeline/commands/multi-agent/finish/SKILL.md +6 -6
  42. package/pipeline/commands/multi-agent/forget/SKILL.md +1 -1
  43. package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +1 -1
  44. package/pipeline/commands/multi-agent/help/SKILL.md +3 -3
  45. package/pipeline/commands/multi-agent/issue/SKILL.md +1 -1
  46. package/pipeline/commands/multi-agent/jira/SKILL.md +1 -1
  47. package/pipeline/commands/multi-agent/kill/SKILL.md +1 -1
  48. package/pipeline/commands/multi-agent/language/SKILL.md +1 -1
  49. package/pipeline/commands/multi-agent/local/SKILL.md +1 -1
  50. package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +1 -1
  51. package/pipeline/commands/multi-agent/log/SKILL.md +1 -1
  52. package/pipeline/commands/multi-agent/manual-test/SKILL.md +1 -1
  53. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +1 -1
  54. package/pipeline/commands/multi-agent/purge/SKILL.md +1 -1
  55. package/pipeline/commands/multi-agent/refactor/SKILL.md +16 -8
  56. package/pipeline/commands/multi-agent/resume/SKILL.md +2 -2
  57. package/pipeline/commands/multi-agent/review/SKILL.md +1 -1
  58. package/pipeline/commands/multi-agent/review-issue/SKILL.md +1 -1
  59. package/pipeline/commands/multi-agent/review-jira/SKILL.md +1 -1
  60. package/pipeline/commands/multi-agent/routines/SKILL.md +1 -1
  61. package/pipeline/commands/multi-agent/save/SKILL.md +1 -1
  62. package/pipeline/commands/multi-agent/scan/SKILL.md +1 -1
  63. package/pipeline/commands/multi-agent/search/SKILL.md +1 -1
  64. package/pipeline/commands/multi-agent/setup/SKILL.md +2 -2
  65. package/pipeline/commands/multi-agent/stack/SKILL.md +3 -3
  66. package/pipeline/commands/multi-agent/status/SKILL.md +1 -1
  67. package/pipeline/commands/multi-agent/sync/SKILL.md +5 -5
  68. package/pipeline/commands/multi-agent/test/SKILL.md +1 -1
  69. package/pipeline/commands/multi-agent/uninstall/SKILL.md +1 -1
  70. package/pipeline/commands/multi-agent/update/SKILL.md +3 -3
  71. package/pipeline/lib/account-resolver.sh +1 -1
  72. package/pipeline/lib/channels-multi-repo.sh +1 -1
  73. package/pipeline/lib/context-link-extractor.sh +1 -1
  74. package/pipeline/lib/credential-store.sh +21 -1
  75. package/pipeline/lib/fetch-confluence.sh +1 -1
  76. package/pipeline/lib/fetch-crashlytics.sh +1 -1
  77. package/pipeline/lib/fetch-fortify.sh +1 -1
  78. package/pipeline/lib/fetch-graylog.sh +1 -1
  79. package/pipeline/lib/fetch-swagger.sh +1 -1
  80. package/pipeline/lib/issue-fetcher.sh +1 -1
  81. package/pipeline/lib/multi-repo-pipeline.sh +1 -1
  82. package/pipeline/lib/repo-cache.sh +1 -1
  83. package/pipeline/lib/submodule-detector.sh +1 -1
  84. package/pipeline/multi-agent-refs/_account-picker.md +1 -1
  85. package/pipeline/multi-agent-refs/_dev-context.md +1 -1
  86. package/pipeline/multi-agent-refs/_repo-picker.md +1 -1
  87. package/pipeline/multi-agent-refs/component-dispatch.md +1 -1
  88. package/pipeline/multi-agent-refs/component-generation.md +121 -0
  89. package/pipeline/multi-agent-refs/cross-cli-contract.md +1 -1
  90. package/pipeline/multi-agent-refs/features/model-fallback.md +2 -2
  91. package/pipeline/multi-agent-refs/phases/operations.md +28 -0
  92. package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -0
  93. package/pipeline/multi-agent-refs/phases/phase-2-planning.md +1 -1
  94. package/pipeline/multi-agent-refs/phases/phase-3-dev.md +1 -2
  95. package/pipeline/multi-agent-refs/phases/phase-4-review.md +50 -5
  96. package/pipeline/preferences-template.json +5 -11
  97. package/pipeline/schemas/agent-state.schema.json +39 -9
  98. package/pipeline/schemas/analysis-output.schema.json +18 -4
  99. package/pipeline/schemas/analysis-spec.schema.json +120 -32
  100. package/pipeline/schemas/clarify-output.schema.json +15 -5
  101. package/pipeline/schemas/design-check-config.schema.json +32 -11
  102. package/pipeline/schemas/dev-critic-output.schema.json +20 -5
  103. package/pipeline/schemas/figma-project-config.schema.json +42 -10
  104. package/pipeline/schemas/learnings-ledger.schema.json +10 -2
  105. package/pipeline/schemas/migrations/figma-config-1.0.0-to-2.0.0.mjs +1 -4
  106. package/pipeline/schemas/migrations/prefs-2.0.0-to-2.1.0.mjs +24 -7
  107. package/pipeline/schemas/plan-todos.schema.json +6 -3
  108. package/pipeline/schemas/planning-output.schema.json +5 -1
  109. package/pipeline/schemas/prefs.schema.json +97 -229
  110. package/pipeline/schemas/test-gap.schema.json +5 -5
  111. package/pipeline/schemas/token-budget.json +8 -8
  112. package/pipeline/schemas/triage-corpus.schema.json +1 -1
  113. package/pipeline/scripts/_smoke-root.sh +61 -0
  114. package/pipeline/scripts/aggregate-metrics.mjs +18 -6
  115. package/pipeline/scripts/audit-log.sh +25 -0
  116. package/pipeline/scripts/build-skills-index.mjs +6 -2
  117. package/pipeline/scripts/build-stack-plugins.mjs +142 -39
  118. package/pipeline/scripts/check-derived-drift.mjs +196 -0
  119. package/pipeline/scripts/classify-plan-safety.mjs +20 -7
  120. package/pipeline/scripts/cost-budget-check.mjs +2 -1
  121. package/pipeline/scripts/cost-table.json +1 -1
  122. package/pipeline/scripts/diff-explain.mjs +7 -3
  123. package/pipeline/scripts/diff-risk-score.mjs +13 -3
  124. package/pipeline/scripts/evidence-gate.mjs +7 -2
  125. package/pipeline/scripts/gen-mode-dispatch.mjs +38 -21
  126. package/pipeline/scripts/gen-skills-index.mjs +18 -3
  127. package/pipeline/scripts/learning-curve.mjs +13 -3
  128. package/pipeline/scripts/learnings-ledger.mjs +103 -36
  129. package/pipeline/scripts/localize-commands.mjs +6 -1
  130. package/pipeline/scripts/match-skills.mjs +15 -4
  131. package/pipeline/scripts/migrate-prefs.mjs +33 -16
  132. package/pipeline/scripts/phase-tracker.sh +3 -1
  133. package/pipeline/scripts/repo-map.mjs +110 -64
  134. package/pipeline/scripts/review-scope.mjs +7 -1
  135. package/pipeline/scripts/routine-registry.mjs +4 -9
  136. package/pipeline/scripts/run-aggregator.mjs +11 -5
  137. package/pipeline/scripts/run-metrics.mjs +13 -8
  138. package/pipeline/scripts/smoke-cross-cli-behavior.sh +21 -7
  139. package/pipeline/scripts/test-gap-scan.mjs +44 -12
  140. package/pipeline/scripts/test-integrity-gate.mjs +5 -1
  141. package/pipeline/scripts/token-budget-report.mjs +44 -21
  142. package/pipeline/scripts/triage-memory.mjs +126 -34
  143. package/pipeline/scripts/uninstall.mjs +74 -30
  144. package/pipeline/scripts/validate-analysis-doc.mjs +15 -5
  145. package/pipeline/scripts/validate-diff-risk.mjs +32 -18
  146. package/pipeline/scripts/validate-test-gap.mjs +17 -7
  147. package/pipeline/scripts/validate-triage.mjs +17 -5
  148. package/pipeline/scripts/write-state.mjs +32 -9
  149. package/pipeline/skills/.skills-index.json +91 -91
  150. package/pipeline/skills/shared/README.md +57 -57
  151. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +1 -1
  152. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +1 -1
  153. package/pipeline/skills/shared/core/multi-agent/SKILL.md +26 -279
  154. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +1 -1
  155. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +1 -1
  156. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +1 -1
  157. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +1 -1
  158. package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +1 -1
  159. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +1 -1
  160. package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +1 -1
  161. package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +1 -1
  162. package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +1 -1
  163. package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +1 -1
  164. package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +1 -1
  165. package/pipeline/skills/shared/core/multi-agent-finish/SKILL.md +1 -1
  166. package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +1 -1
  167. package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +1 -1
  168. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +1 -1
  169. package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +1 -1
  170. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +1 -1
  171. package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +1 -1
  172. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +1 -1
  173. package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +1 -1
  174. package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +1 -1
  175. package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +1 -1
  176. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +1 -1
  177. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +1 -1
  178. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +1 -1
  179. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +16 -8
  180. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +1 -1
  181. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +1 -1
  182. package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +1 -1
  183. package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +1 -1
  184. package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +1 -1
  185. package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +1 -1
  186. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +1 -1
  187. package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +1 -1
  188. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -1
  189. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +3 -3
  190. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +1 -1
  191. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +1 -1
  192. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +1 -1
  193. package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +1 -1
  194. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +1 -1
  195. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +1 -1
  196. package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -4
  197. package/pipeline/skills/shared/external/agentflow/SKILL.md +1 -1
  198. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +1 -1
  199. package/pipeline/skills/shared/external/android_ui_verification/SKILL.md +1 -1
  200. package/pipeline/skills/shared/external/api-patterns/SKILL.md +1 -1
  201. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +1 -1
  202. package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +1 -1
  203. package/pipeline/skills/shared/external/backlog/BACKLOG.md +1 -1
  204. package/pipeline/skills/shared/external/backlog/SKILL.md +12 -12
  205. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +1 -1
  206. package/pipeline/skills/shared/external/context-compression/SKILL.md +1 -1
  207. package/pipeline/skills/shared/external/council/SKILL.md +3 -3
  208. package/pipeline/skills/shared/external/css-modern/SKILL.md +1 -1
  209. package/pipeline/skills/shared/external/database-patterns/SKILL.md +1 -1
  210. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +1 -1
  211. package/pipeline/skills/shared/external/docker-expert/SKILL.md +1 -1
  212. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +1 -1
  213. package/pipeline/skills/shared/external/firebase/SKILL.md +1 -1
  214. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +1 -1
  215. package/pipeline/skills/shared/external/help-skills/SKILL.md +1 -1
  216. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +1 -1
  217. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +1 -1
  218. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +1 -1
  219. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +1 -1
  220. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +1 -1
  221. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +1 -1
  222. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +1 -1
  223. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +1 -1
  224. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +1 -1
  225. package/pipeline/skills/shared/external/html-semantic/SKILL.md +1 -1
  226. package/pipeline/skills/shared/external/humanizer/SKILL.md +1 -1
  227. package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +1 -1
  228. package/pipeline/skills/shared/external/ios-developer/SKILL.md +1 -1
  229. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +1 -1
  230. package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +1 -1
  231. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +1 -1
  232. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +1 -1
  233. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +1 -1
  234. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +1 -1
  235. package/pipeline/skills/shared/external/observability-engineer/SKILL.md +1 -1
  236. package/pipeline/skills/shared/external/python-patterns/SKILL.md +1 -1
  237. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +1 -1
  238. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +1 -1
  239. package/pipeline/skills/shared/external/search-first/SKILL.md +2 -2
  240. package/pipeline/skills/shared/external/skill-creator/SKILL.md +12 -12
  241. package/pipeline/skills/shared/external/skill-creator/audit.md +21 -21
  242. package/pipeline/skills/shared/external/skill-creator/checklist.md +3 -3
  243. package/pipeline/skills/shared/external/skill-creator/examples.md +10 -10
  244. package/pipeline/skills/shared/external/skill-creator/label-check.md +17 -17
  245. package/pipeline/skills/shared/external/skill-creator/scripts/audit-panel.js +86 -50
  246. package/pipeline/skills/shared/external/skill-creator/template.md +9 -9
  247. package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +1 -1
  248. package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +1 -1
  249. package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +1 -1
  250. package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +1 -1
  251. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +1 -1
  252. package/pipeline/skills/shared/external/testing-backend/SKILL.md +1 -1
  253. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +1 -1
  254. package/pipeline/skills/shared/external/vue-composition/SKILL.md +1 -1
  255. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +1 -1
  256. package/pipeline/skills/shared/external/web-performance/SKILL.md +1 -1
  257. package/pipeline/skills/shared/external/web-testing/SKILL.md +1 -1
  258. package/pipeline/skills/shared/external/xcode-build-benchmark/schemas/build-benchmark.schema.json +9 -49
  259. package/pipeline/skills/skills-index.md +57 -57
  260. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-1-analysis.json +0 -25
  261. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-2-plan.json +0 -30
  262. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-review.json +0 -20
  263. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/expected/phase-4-triage.json +0 -15
  264. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/metadata.json +0 -14
  265. package/pipeline/eval/golden-tasks/01-ios-bugfix-darkmode/task.json +0 -12
  266. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-1-analysis.json +0 -29
  267. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-2-plan.json +0 -43
  268. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-review.json +0 -35
  269. package/pipeline/eval/golden-tasks/02-android-feature-compose/expected/phase-4-triage.json +0 -35
  270. package/pipeline/eval/golden-tasks/02-android-feature-compose/metadata.json +0 -14
  271. package/pipeline/eval/golden-tasks/02-android-feature-compose/task.json +0 -12
  272. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-1-analysis.json +0 -29
  273. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-2-plan.json +0 -42
  274. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-review.json +0 -20
  275. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/expected/phase-4-triage.json +0 -15
  276. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/metadata.json +0 -14
  277. package/pipeline/eval/golden-tasks/03-backend-python-ratelimit/task.json +0 -12
  278. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-1-analysis.json +0 -29
  279. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-2-plan.json +0 -40
  280. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-review.json +0 -20
  281. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/expected/phase-4-triage.json +0 -15
  282. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/metadata.json +0 -14
  283. package/pipeline/eval/golden-tasks/04-frontend-next-hydration/task.json +0 -12
  284. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-1-analysis.json +0 -29
  285. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-2-plan.json +0 -42
  286. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-review.json +0 -28
  287. package/pipeline/eval/golden-tasks/05-ios-security-keychain/expected/phase-4-triage.json +0 -27
  288. package/pipeline/eval/golden-tasks/05-ios-security-keychain/metadata.json +0 -14
  289. package/pipeline/eval/golden-tasks/05-ios-security-keychain/task.json +0 -12
  290. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-1-analysis.json +0 -29
  291. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-2-plan.json +0 -41
  292. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-review.json +0 -12
  293. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/expected/phase-4-triage.json +0 -6
  294. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/metadata.json +0 -14
  295. package/pipeline/eval/golden-tasks/06-android-refactor-usecase/task.json +0 -12
  296. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-1-analysis.json +0 -29
  297. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-2-plan.json +0 -42
  298. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-review.json +0 -28
  299. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/expected/phase-4-triage.json +0 -27
  300. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/metadata.json +0 -14
  301. package/pipeline/eval/golden-tasks/07-backend-node-idempotency/task.json +0 -12
  302. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-1-analysis.json +0 -25
  303. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-2-plan.json +0 -31
  304. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-review.json +0 -12
  305. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/expected/phase-4-triage.json +0 -18
  306. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/metadata.json +0 -14
  307. package/pipeline/eval/golden-tasks/08-ios-auth-consensus-unverified/task.json +0 -12
  308. package/pipeline/eval/golden-tasks/README.md +0 -65
  309. package/pipeline/eval/intent-cases.json +0 -40
  310. package/pipeline/eval/run-metrics-fixture.json +0 -46
  311. package/pipeline/eval/triage/01-empty-findings/expected.json +0 -6
  312. package/pipeline/eval/triage/01-empty-findings/input.json +0 -5
  313. package/pipeline/eval/triage/01-empty-findings/notes.md +0 -7
  314. package/pipeline/eval/triage/02-real-blocker/expected.json +0 -15
  315. package/pipeline/eval/triage/02-real-blocker/input.json +0 -14
  316. package/pipeline/eval/triage/02-real-blocker/notes.md +0 -7
  317. package/pipeline/eval/triage/03-out-of-scope-defer/expected.json +0 -18
  318. package/pipeline/eval/triage/03-out-of-scope-defer/input.json +0 -14
  319. package/pipeline/eval/triage/03-out-of-scope-defer/notes.md +0 -10
  320. package/pipeline/eval/triage/04-false-positive-reject/expected.json +0 -18
  321. package/pipeline/eval/triage/04-false-positive-reject/input.json +0 -14
  322. package/pipeline/eval/triage/04-false-positive-reject/notes.md +0 -10
  323. package/pipeline/eval/triage/05-mixed-classification/expected.json +0 -43
  324. package/pipeline/eval/triage/05-mixed-classification/input.json +0 -38
  325. package/pipeline/eval/triage/05-mixed-classification/notes.md +0 -17
  326. package/pipeline/eval/triage/06-severity-mismatch/expected.json +0 -15
  327. package/pipeline/eval/triage/06-severity-mismatch/input.json +0 -14
  328. package/pipeline/eval/triage/06-severity-mismatch/notes.md +0 -9
  329. package/pipeline/eval/triage/07-duplicate-reviewers/expected.json +0 -27
  330. package/pipeline/eval/triage/07-duplicate-reviewers/input.json +0 -22
  331. package/pipeline/eval/triage/07-duplicate-reviewers/notes.md +0 -9
  332. package/pipeline/eval/triage/08-style-misclassified/expected.json +0 -18
  333. package/pipeline/eval/triage/08-style-misclassified/input.json +0 -14
  334. package/pipeline/eval/triage/08-style-misclassified/notes.md +0 -9
  335. package/pipeline/eval/triage/09-cascading-finding/expected.json +0 -23
  336. package/pipeline/eval/triage/09-cascading-finding/input.json +0 -22
  337. package/pipeline/eval/triage/09-cascading-finding/notes.md +0 -9
  338. package/pipeline/eval/triage/10-deferred-crossref/expected.json +0 -18
  339. package/pipeline/eval/triage/10-deferred-crossref/input.json +0 -14
  340. package/pipeline/eval/triage/10-deferred-crossref/notes.md +0 -9
  341. package/pipeline/eval/triage/11-vercel-token-leak-blocker/expected.json +0 -27
  342. package/pipeline/eval/triage/11-vercel-token-leak-blocker/input.json +0 -22
  343. package/pipeline/eval/triage/11-vercel-token-leak-blocker/notes.md +0 -14
  344. package/pipeline/eval/triage/README.md +0 -54
  345. package/pipeline/scripts/benchmark-phase-0.sh +0 -128
  346. package/pipeline/scripts/check-md-links.mjs +0 -84
  347. package/pipeline/scripts/eval-golden-tasks-live.mjs +0 -297
  348. package/pipeline/scripts/eval-golden-tasks.mjs +0 -212
  349. package/pipeline/scripts/eval-intent.mjs +0 -103
  350. package/pipeline/scripts/eval-mine-corpus.mjs +0 -201
  351. package/pipeline/scripts/eval-triage.mjs +0 -171
  352. package/pipeline/scripts/fixtures/diff-risk-android.diff +0 -40
  353. package/pipeline/scripts/fixtures/diff-risk-ios.diff +0 -48
  354. package/pipeline/scripts/fixtures/diff-risk-test-removal.diff +0 -40
  355. package/pipeline/scripts/fixtures/install-layout.tsv +0 -19
  356. package/pipeline/scripts/fixtures/pack-expected-count.txt +0 -1
  357. package/pipeline/scripts/fixtures/test-gap-node.diff +0 -30
  358. package/pipeline/scripts/fixtures/test-gap-python.diff +0 -32
  359. package/pipeline/scripts/lint-mcp-refs.mjs +0 -207
  360. package/pipeline/scripts/lint-skills.mjs +0 -143
  361. package/pipeline/scripts/run-smokes.mjs +0 -76
  362. package/pipeline/scripts/smoke-add-detail.sh +0 -137
  363. package/pipeline/scripts/smoke-agent-guard.sh +0 -74
  364. package/pipeline/scripts/smoke-agent-log-cost.sh +0 -262
  365. package/pipeline/scripts/smoke-agent-model-routing.sh +0 -87
  366. package/pipeline/scripts/smoke-ask-choice.sh +0 -42
  367. package/pipeline/scripts/smoke-autopilot-circuit-breaker.sh +0 -36
  368. package/pipeline/scripts/smoke-bitbucket-contract.sh +0 -255
  369. package/pipeline/scripts/smoke-changelog-version.sh +0 -47
  370. package/pipeline/scripts/smoke-channels-approval-gate.sh +0 -60
  371. package/pipeline/scripts/smoke-channels-flow.sh +0 -130
  372. package/pipeline/scripts/smoke-ci-workflows.sh +0 -88
  373. package/pipeline/scripts/smoke-clarify.sh +0 -148
  374. package/pipeline/scripts/smoke-command-inventory.sh +0 -81
  375. package/pipeline/scripts/smoke-commands-skills-parity.sh +0 -87
  376. package/pipeline/scripts/smoke-community-gates.sh +0 -75
  377. package/pipeline/scripts/smoke-compliance-skills.sh +0 -119
  378. package/pipeline/scripts/smoke-config-hygiene.sh +0 -58
  379. package/pipeline/scripts/smoke-cost-budget.sh +0 -70
  380. package/pipeline/scripts/smoke-cost-summary.sh +0 -139
  381. package/pipeline/scripts/smoke-cross-phase-cohesion.sh +0 -128
  382. package/pipeline/scripts/smoke-description-tr.sh +0 -82
  383. package/pipeline/scripts/smoke-dev-critic.sh +0 -144
  384. package/pipeline/scripts/smoke-diff-explain.sh +0 -147
  385. package/pipeline/scripts/smoke-diff-risk.sh +0 -190
  386. package/pipeline/scripts/smoke-dynamic-skill-loading.sh +0 -160
  387. package/pipeline/scripts/smoke-eval-live.sh +0 -136
  388. package/pipeline/scripts/smoke-evidence-gate.sh +0 -93
  389. package/pipeline/scripts/smoke-extract-conventions.sh +0 -163
  390. package/pipeline/scripts/smoke-fetchers-offline.sh +0 -448
  391. package/pipeline/scripts/smoke-figma-dispatch.sh +0 -112
  392. package/pipeline/scripts/smoke-gate-hooks.sh +0 -74
  393. package/pipeline/scripts/smoke-gc-tmp.sh +0 -130
  394. package/pipeline/scripts/smoke-gc-worktrees.sh +0 -125
  395. package/pipeline/scripts/smoke-generate-issue.sh +0 -120
  396. package/pipeline/scripts/smoke-handoff-contract.sh +0 -92
  397. package/pipeline/scripts/smoke-identity-isolation.sh +0 -70
  398. package/pipeline/scripts/smoke-install-layout.sh +0 -248
  399. package/pipeline/scripts/smoke-intent-guard.sh +0 -86
  400. package/pipeline/scripts/smoke-issue-comment-template.sh +0 -86
  401. package/pipeline/scripts/smoke-issue-jira-triad.sh +0 -120
  402. package/pipeline/scripts/smoke-keychain.sh +0 -158
  403. package/pipeline/scripts/smoke-language-axis.sh +0 -109
  404. package/pipeline/scripts/smoke-learning-curve.sh +0 -61
  405. package/pipeline/scripts/smoke-learnings-ledger.sh +0 -86
  406. package/pipeline/scripts/smoke-lib-scripts.sh +0 -448
  407. package/pipeline/scripts/smoke-mcp-gate.sh +0 -68
  408. package/pipeline/scripts/smoke-md-links.sh +0 -8
  409. package/pipeline/scripts/smoke-md2confluence.sh +0 -126
  410. package/pipeline/scripts/smoke-metrics-cache-ratio.sh +0 -72
  411. package/pipeline/scripts/smoke-migrate-state.sh +0 -102
  412. package/pipeline/scripts/smoke-mode-dispatch-drift.sh +0 -161
  413. package/pipeline/scripts/smoke-model-fallback.sh +0 -89
  414. package/pipeline/scripts/smoke-multi-repo-integration.sh +0 -116
  415. package/pipeline/scripts/smoke-multi-repo-worktree.sh +0 -61
  416. package/pipeline/scripts/smoke-no-mcp-in-dev-phases.sh +0 -115
  417. package/pipeline/scripts/smoke-no-token-prompt.sh +0 -85
  418. package/pipeline/scripts/smoke-pack-contents.sh +0 -140
  419. package/pipeline/scripts/smoke-pat-audit.sh +0 -128
  420. package/pipeline/scripts/smoke-per-repo-memory.sh +0 -156
  421. package/pipeline/scripts/smoke-phase-0-multi-repo.sh +0 -170
  422. package/pipeline/scripts/smoke-phase-6-multi.sh +0 -79
  423. package/pipeline/scripts/smoke-phase-banner.sh +0 -101
  424. package/pipeline/scripts/smoke-phase-tracker.sh +0 -324
  425. package/pipeline/scripts/smoke-phase0-bridge-contract.sh +0 -241
  426. package/pipeline/scripts/smoke-phase4-gates.sh +0 -45
  427. package/pipeline/scripts/smoke-phase4-triage.sh +0 -229
  428. package/pipeline/scripts/smoke-plan-approval-gate.sh +0 -71
  429. package/pipeline/scripts/smoke-plan-safety.sh +0 -139
  430. package/pipeline/scripts/smoke-plan-todos.sh +0 -196
  431. package/pipeline/scripts/smoke-plugin-validate.sh +0 -64
  432. package/pipeline/scripts/smoke-pr-review-actions.sh +0 -152
  433. package/pipeline/scripts/smoke-pre-commit.sh +0 -170
  434. package/pipeline/scripts/smoke-pref-migration.sh +0 -226
  435. package/pipeline/scripts/smoke-prefs-language.sh +0 -134
  436. package/pipeline/scripts/smoke-progress-contract.sh +0 -127
  437. package/pipeline/scripts/smoke-prune-logs.sh +0 -137
  438. package/pipeline/scripts/smoke-purge.sh +0 -138
  439. package/pipeline/scripts/smoke-push-retry.sh +0 -75
  440. package/pipeline/scripts/smoke-repo-map.sh +0 -300
  441. package/pipeline/scripts/smoke-review-readiness.sh +0 -92
  442. package/pipeline/scripts/smoke-review-watch.sh +0 -146
  443. package/pipeline/scripts/smoke-routines.sh +0 -84
  444. package/pipeline/scripts/smoke-run-aggregator.sh +0 -216
  445. package/pipeline/scripts/smoke-run-metrics.sh +0 -50
  446. package/pipeline/scripts/smoke-search.sh +0 -187
  447. package/pipeline/scripts/smoke-shadow-git.sh +0 -224
  448. package/pipeline/scripts/smoke-skill-authoring.sh +0 -137
  449. package/pipeline/scripts/smoke-skill-language.sh +0 -83
  450. package/pipeline/scripts/smoke-skill-manifest.sh +0 -138
  451. package/pipeline/scripts/smoke-skill-scan.sh +0 -198
  452. package/pipeline/scripts/smoke-source-parity.sh +0 -85
  453. package/pipeline/scripts/smoke-subagent-validators.sh +0 -108
  454. package/pipeline/scripts/smoke-sync-parity.sh +0 -92
  455. package/pipeline/scripts/smoke-tasklist-ordering.sh +0 -112
  456. package/pipeline/scripts/smoke-telemetry.sh +0 -147
  457. package/pipeline/scripts/smoke-test-gap.sh +0 -183
  458. package/pipeline/scripts/smoke-token-budget.sh +0 -67
  459. package/pipeline/scripts/smoke-token-preflight.sh +0 -82
  460. package/pipeline/scripts/smoke-tracker-contract.sh +0 -191
  461. package/pipeline/scripts/smoke-tracker-tokens-invocation.sh +0 -73
  462. package/pipeline/scripts/smoke-triage-memory.sh +0 -174
  463. package/pipeline/scripts/smoke-update-check.sh +0 -135
  464. package/pipeline/scripts/smoke-url-enrichment.sh +0 -70
  465. package/pipeline/scripts/smoke-validate-analysis-doc.sh +0 -161
  466. package/pipeline/scripts/smoke-validator-contradiction.sh +0 -67
  467. package/pipeline/scripts/smoke-validator-gates.sh +0 -164
  468. package/pipeline/scripts/smoke-vercel-deploy-redact.sh +0 -129
  469. package/pipeline/scripts/smoke-verify-by-test.sh +0 -148
  470. package/pipeline/scripts/smoke-wiki-integration.sh +0 -122
  471. package/pipeline/scripts/smoke-work-summary.sh +0 -163
  472. package/pipeline/scripts/smoke-workflow-audit.sh +0 -69
  473. package/pipeline/scripts/smoke-worktree-path-convention.sh +0 -86
  474. package/pipeline/scripts/smoke-wrapper-preservation.sh +0 -68
  475. package/pipeline/scripts/smoke-write-state.sh +0 -115
  476. package/pipeline/scripts/sync-parity-check.sh +0 -135
  477. package/pipeline/scripts/test-gap-rules/android.json +0 -25
  478. package/pipeline/scripts/test-gap-rules/ios.json +0 -29
  479. package/pipeline/scripts/test-gap-rules/node.json +0 -17
  480. package/pipeline/scripts/test-gap-rules/python.json +0 -19
  481. package/pipeline/scripts/validate-schemas.mjs +0 -88
@@ -1,64 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # smoke-plugin-validate.sh - run `claude plugin validate --strict` against
4
- # every plugin / marketplace surface committed to this repo.
5
- #
6
- # Discovery: any directory containing `.claude-plugin/plugin.json` or
7
- # `.claude-plugin/marketplace.json` (node_modules excluded). The `claude`
8
- # CLI validates the containing directory; --strict promotes warnings
9
- # (unrecognized fields, missing metadata) to failures so CI catches drift
10
- # the runtime would silently tolerate.
11
- #
12
- # Skip semantics (exit 0 with a SKIP line):
13
- # - `claude` binary not on PATH (optional tooling; billing-friendly CI
14
- # runners don't install it)
15
- # - no validatable surface in the repo (the marketplace plugins live in
16
- # the separate multi-agent-plugins repo; this repo may carry none)
17
- #
18
- # Exit codes: 0=pass or skip, 1=validation failure
19
-
20
- set -uo pipefail
21
-
22
- REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
23
-
24
- if ! command -v claude >/dev/null 2>&1; then
25
- echo "SKIP smoke-plugin-validate: claude binary not on PATH"
26
- exit 0
27
- fi
28
-
29
- # Each hit is a manifest; the validatable surface is its .claude-plugin parent's parent.
30
- MANIFESTS=$(find "$REPO_ROOT" \
31
- -path "$REPO_ROOT/node_modules" -prune -o \
32
- -path "$REPO_ROOT/coverage" -prune -o \
33
- -type f -path '*/.claude-plugin/*' \( -name plugin.json -o -name marketplace.json \) -print \
34
- 2>/dev/null | sort)
35
-
36
- if [ -z "$MANIFESTS" ]; then
37
- echo "SKIP smoke-plugin-validate: no .claude-plugin plugin/marketplace manifest in this repo"
38
- exit 0
39
- fi
40
-
41
- PASS=0
42
- FAIL=0
43
- pass() { PASS=$((PASS + 1)); echo " ✓ $1"; }
44
- fail() { FAIL=$((FAIL + 1)); echo " ✗ $1"; }
45
-
46
- # Validate each surface directory once, even if it carries both manifests.
47
- SURFACES=$(echo "$MANIFESTS" | sed 's|/\.claude-plugin/[^/]*$||' | sort -u)
48
-
49
- for surface in $SURFACES; do
50
- rel="${surface#"$REPO_ROOT"/}"
51
- [ "$surface" = "$REPO_ROOT" ] && rel="."
52
- echo ""
53
- echo "→ claude plugin validate --strict $rel"
54
- if OUT=$(claude plugin validate --strict "$surface" 2>&1); then
55
- pass "$rel validates clean (strict)"
56
- else
57
- fail "$rel failed strict validation"
58
- echo "$OUT" | sed 's/^/ /'
59
- fi
60
- done
61
-
62
- echo ""
63
- echo "══ smoke-plugin-validate: $PASS passed, $FAIL failed ══"
64
- [ "$FAIL" -gt 0 ] && exit 1 || exit 0
@@ -1,152 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # smoke-pr-review-actions.sh
4
- #
5
- # Asserts the review-actions contract is wired correctly: the new channel
6
- # doc, the orchestrator, the decision rule, both languages, the github +
7
- # bitbucket-server provider switch, and the absence of the legacy monolith
8
- # comment artifacts.
9
- #
10
- # This is a lint, not a behavioural test. Behavioural drift is caught at
11
- # runtime by the chat summary + the actual PR state on the provider.
12
-
13
- set -euo pipefail
14
-
15
- SELF_DIR=$(cd "$(dirname "$0")" && pwd)
16
- PIPELINE_ROOT=$(cd "$SELF_DIR/.." && pwd)
17
-
18
- cd "$PIPELINE_ROOT"
19
-
20
- FAIL=0
21
-
22
- CHANNEL="multi-agent-refs/channels/pr-review-actions.md"
23
- REVIEW="commands/multi-agent/review/SKILL.md"
24
- POSTER="lib/post-pr-review.sh"
25
-
26
- # 1. New canonical template + new poster exist.
27
- if [ ! -f "$CHANNEL" ]; then
28
- echo "FAIL [smoke-pr-review-actions]: $CHANNEL missing"
29
- exit 1
30
- fi
31
- if [ ! -x "$POSTER" ]; then
32
- echo "FAIL [smoke-pr-review-actions]: $POSTER missing or not executable"
33
- FAIL=$((FAIL + 1))
34
- fi
35
-
36
- # 2. Legacy monolith artifacts must not exist or be referenced.
37
- LEGACY_TEMPLATE="multi-agent-refs/channels/pr-review-comment.md"
38
- LEGACY_RENDERER="lib/render-pr-review-body.sh"
39
- if [ -e "$LEGACY_TEMPLATE" ]; then
40
- echo "FAIL [smoke-pr-review-actions]: $LEGACY_TEMPLATE must not exist (monolith comment template forbidden)"
41
- FAIL=$((FAIL + 1))
42
- fi
43
- if [ -e "$LEGACY_RENDERER" ]; then
44
- echo "FAIL [smoke-pr-review-actions]: $LEGACY_RENDERER must not exist (monolith comment renderer forbidden)"
45
- FAIL=$((FAIL + 1))
46
- fi
47
- # Reference scan - no spec files should still WIRE the legacy artifacts.
48
- # Match only call-site patterns (bash <path>, --body-file <path>), NOT prose
49
- # references. Migration notes like "render-pr-review-body.sh is GONE" are
50
- # allowed; an actual `bash render-pr-review-body.sh` call is not.
51
- LEAK=$(grep -rEl '(bash|sh|source) [^ ]*render-pr-review-body\.sh|--body-file [^ ]*pr-review-comment\.md' \
52
- commands/ lib/ scripts/ 2>/dev/null \
53
- | grep -v "$(basename "$0")" \
54
- | grep -v "CHANGELOG\." \
55
- | head -1 || true)
56
- if [ -n "$LEAK" ]; then
57
- echo "FAIL [smoke-pr-review-actions]: stale call-site to legacy artifact in: $LEAK"
58
- FAIL=$((FAIL + 1))
59
- fi
60
-
61
- # 3. Decision rule is documented verbatim in the channel doc.
62
- declare -a DECISION_ANCHORS=(
63
- "0 accepted blocking AND 0 accepted important"
64
- "≥1 accepted blocking OR ≥1 accepted important"
65
- "Suggestions never block"
66
- "APPROVE"
67
- "NEEDS_WORK"
68
- )
69
- for a in "${DECISION_ANCHORS[@]}"; do
70
- if ! grep -qF "$a" "$CHANNEL" "$REVIEW"; then
71
- echo "FAIL [smoke-pr-review-actions]: decision rule anchor missing across $CHANNEL + $REVIEW: $a"
72
- FAIL=$((FAIL + 1))
73
- fi
74
- done
75
-
76
- # 4. Both languages render - the template documents tr + en shapes.
77
- if ! grep -qE 'outputLanguage *= *"tr"|Turkish \(outputLanguage' "$CHANNEL"; then
78
- echo "FAIL [smoke-pr-review-actions]: $CHANNEL must document the tr inline-comment shape"
79
- FAIL=$((FAIL + 1))
80
- fi
81
- if ! grep -qE 'outputLanguage *= *"en"|English \(outputLanguage' "$CHANNEL"; then
82
- echo "FAIL [smoke-pr-review-actions]: $CHANNEL must document the en inline-comment shape"
83
- FAIL=$((FAIL + 1))
84
- fi
85
-
86
- # 5. Provider switch covers github + bitbucket-server explicitly.
87
- declare -a PROVIDER_HINTS=(
88
- "github"
89
- "bitbucket-server"
90
- )
91
- for p in "${PROVIDER_HINTS[@]}"; do
92
- if ! grep -qF "$p" "$REVIEW" "$CHANNEL" "$POSTER"; then
93
- echo "FAIL [smoke-pr-review-actions]: provider '$p' missing across review.md + channel + poster"
94
- FAIL=$((FAIL + 1))
95
- fi
96
- done
97
-
98
- # 6. review.md wires post-pr-review.sh and references the new channel doc.
99
- if ! grep -qF "post-pr-review.sh" "$REVIEW"; then
100
- echo "FAIL [smoke-pr-review-actions]: $REVIEW must wire post-pr-review.sh"
101
- FAIL=$((FAIL + 1))
102
- fi
103
- if ! grep -qF "refs/channels/pr-review-actions.md" "$REVIEW"; then
104
- echo "FAIL [smoke-pr-review-actions]: $REVIEW must reference refs/channels/pr-review-actions.md"
105
- FAIL=$((FAIL + 1))
106
- fi
107
-
108
- # 7. post-pr-review.sh enforces the decision rule and the language axis.
109
- if ! grep -qF "outputLanguage" "$POSTER"; then
110
- echo "FAIL [smoke-pr-review-actions]: $POSTER must read prefs.global.outputLanguage"
111
- FAIL=$((FAIL + 1))
112
- fi
113
- if ! grep -qE 'DECISION=approve|DECISION=needs_work' "$POSTER"; then
114
- echo "FAIL [smoke-pr-review-actions]: $POSTER must compute DECISION=approve|needs_work"
115
- FAIL=$((FAIL + 1))
116
- fi
117
- if ! grep -qE '"status":"APPROVED"' "$POSTER"; then
118
- echo "FAIL [smoke-pr-review-actions]: $POSTER must include the Bitbucket APPROVED participant payload"
119
- FAIL=$((FAIL + 1))
120
- fi
121
- if ! grep -qE '"status":"NEEDS_WORK"' "$POSTER"; then
122
- echo "FAIL [smoke-pr-review-actions]: $POSTER must include the Bitbucket NEEDS_WORK participant payload"
123
- FAIL=$((FAIL + 1))
124
- fi
125
-
126
- # 8. No suggestion severity ever posts inline (hard prohibition in template).
127
- if ! grep -qE 'No suggestion-severity inline comments|Suggestions are chat-only|never get inline comments by default' "$CHANNEL"; then
128
- echo "FAIL [smoke-pr-review-actions]: $CHANNEL must declare suggestions are chat-only (never inline)"
129
- FAIL=$((FAIL + 1))
130
- fi
131
- if grep -qE 'severity.*suggestion.*inline' "$POSTER"; then
132
- echo "FAIL [smoke-pr-review-actions]: $POSTER must NOT post suggestion-severity findings inline"
133
- FAIL=$((FAIL + 1))
134
- fi
135
-
136
- # 9. Bitbucket URL parser is wired into review.md Step 1.
137
- if ! grep -qE 'bitbucket\.\*/projects/\*/repos/\*/pull-requests/\*' "$REVIEW"; then
138
- echo "FAIL [smoke-pr-review-actions]: $REVIEW must parse bitbucket.* PR URLs in Step 1"
139
- FAIL=$((FAIL + 1))
140
- fi
141
- if ! grep -qF "bbProjectKey" "$REVIEW"; then
142
- echo "FAIL [smoke-pr-review-actions]: $REVIEW must persist bbProjectKey in agent-state.review.input"
143
- FAIL=$((FAIL + 1))
144
- fi
145
-
146
- if [ "$FAIL" -gt 0 ]; then
147
- echo ""
148
- echo "smoke-pr-review-actions: $FAIL violation(s)."
149
- exit 1
150
- fi
151
-
152
- echo "smoke-pr-review-actions: ok"
@@ -1,170 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-pre-commit.sh - verify pre-commit-check.sh catches all secret patterns.
3
- # Uses a real temp git repo to test the actual hook behavior end-to-end.
4
- # No mocks, no test-only flags - tests exactly what runs in production.
5
-
6
- set -uo pipefail
7
-
8
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
9
- HOOK="$SCRIPT_DIR/pre-commit-check.sh"
10
-
11
- if [ ! -f "$HOOK" ]; then
12
- echo "FAIL: pre-commit-check.sh not found at $HOOK" >&2
13
- exit 1
14
- fi
15
-
16
- PASS=0
17
- FAIL=0
18
-
19
- pass() { PASS=$((PASS+1)); echo " ✓ $1"; }
20
- fail() { FAIL=$((FAIL+1)); echo " ✗ $1"; }
21
-
22
- TMPDIR=$(mktemp -d) || { echo "FAIL: mktemp" >&2; exit 1; }
23
- trap 'rm -rf "$TMPDIR"' EXIT
24
-
25
- # Bootstrap a real git repo with an initial commit
26
- git -C "$TMPDIR" init -q
27
- git -C "$TMPDIR" config user.email "test@test.com"
28
- git -C "$TMPDIR" config user.name "Test"
29
- echo "init" > "$TMPDIR/init.txt"
30
- git -C "$TMPDIR" add init.txt
31
- git -C "$TMPDIR" commit -q -m "init"
32
-
33
- # Stage a file with content and run the hook inside the temp repo
34
- stage_and_check() {
35
- local filename="$1" content="$2"
36
- echo "$content" > "$TMPDIR/$filename"
37
- git -C "$TMPDIR" add "$filename"
38
- }
39
-
40
- reset_stage() {
41
- git -C "$TMPDIR" reset -q HEAD -- . 2>/dev/null
42
- git -C "$TMPDIR" checkout -q -- . 2>/dev/null
43
- rm -f "$TMPDIR"/test-* "$TMPDIR"/.env* 2>/dev/null
44
- }
45
-
46
- run_hook() {
47
- (cd "$TMPDIR" && bash "$HOOK") >/dev/null 2>&1
48
- return $?
49
- }
50
-
51
- check_detects() {
52
- local desc="$1" filename="$2" content="$3"
53
- reset_stage
54
- stage_and_check "$filename" "$content"
55
- if run_hook; then
56
- fail "$desc (hook passed, expected block)"
57
- else
58
- pass "$desc"
59
- fi
60
- }
61
-
62
- check_passes() {
63
- local desc="$1" filename="$2" content="$3"
64
- reset_stage
65
- stage_and_check "$filename" "$content"
66
- if run_hook; then
67
- pass "$desc"
68
- else
69
- fail "$desc (hook blocked, expected pass)"
70
- fi
71
- }
72
-
73
- echo "→ 1. Secret pattern detection"
74
-
75
- check_detects "API key (api_key=long_string)" \
76
- "test-file.swift" \
77
- 'let api_key = "ghp_aBcDeFgHiJkLmNoPqRsT1234567890"'
78
-
79
- check_detects "AWS access key (AKIA prefix)" \
80
- "test-file.py" \
81
- 'aws_key = "AKIAIOSFODNN7EXAMPLE"'
82
-
83
- check_detects "RSA private key header" \
84
- "test-file.pem" \
85
- '-----BEGIN RSA PRIVATE KEY-----'
86
-
87
- check_detects "Generic private key header" \
88
- "test-file.key" \
89
- '-----BEGIN PRIVATE KEY-----'
90
-
91
- check_detects "EC private key header" \
92
- "test-file.key" \
93
- '-----BEGIN EC PRIVATE KEY-----'
94
-
95
- check_detects "GCP service account JSON" \
96
- "test-file.json" \
97
- '{"type": "service_account", "project_id": "my-project"}'
98
-
99
- check_detects "GitHub PAT (ghp_ 36 chars)" \
100
- "test-file.txt" \
101
- 'token: ghp_aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789'
102
-
103
- check_detects "Slack token (xoxb-)" \
104
- "test-file.txt" \
105
- 'slack = "xoxb-123456789012-abcdefghijklmnop"'
106
-
107
- check_detects "Google API key (AIza)" \
108
- "test-file.txt" \
109
- 'gmaps = "AIzaSyA1234567890abcdefghijklmnopqrstuv"'
110
-
111
- check_detects "JWT three-segment token" \
112
- "test-file.txt" \
113
- 'auth = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N"'
114
-
115
- check_detects "High-entropy custom secret (no known prefix)" \
116
- "test-file.txt" \
117
- 'session = "Zx9Kq2Lm7Pw4Nv8Rt3Yb6Hc1Df5Gj0Sa2Wd7Qe4Uo9Ik"'
118
-
119
- check_detects "Secret in a filename WITH SPACES (no false-negative)" \
120
- "test secret file.txt" \
121
- 'token: ghp_aBcDeFgHiJkLmNoPqRsTuVwXyZ0123456789'
122
-
123
- echo ""
124
- echo "→ 2. File-name based detection"
125
-
126
- check_detects ".env file blocked by name" \
127
- ".env" \
128
- "DATABASE_URL=postgres://localhost/db"
129
-
130
- check_detects ".env.local blocked by name" \
131
- ".env.local" \
132
- "SECRET=foo"
133
-
134
- check_detects "Credentials JSON blocked by name" \
135
- "credentials.json" \
136
- '{"user": "admin"}'
137
-
138
- echo ""
139
- echo "→ 3. Clean files pass"
140
-
141
- check_passes "Normal Swift code" \
142
- "test-file.swift" \
143
- 'import Foundation
144
- let greeting = "Hello, World!"
145
- func add(_ a: Int, _ b: Int) -> Int { a + b }'
146
-
147
- check_passes "Empty file" \
148
- "test-file.txt" \
149
- ""
150
-
151
- check_passes "Git SHA / hex hash is not flagged as high-entropy" \
152
- "test-file.txt" \
153
- 'commit a1b2c3d4e5f6789012345678901234567890abcd resolved'
154
-
155
- check_passes "Lockfile integrity hash is exempt" \
156
- "test-yarn.lock" \
157
- 'resolved "https://r.npm/x" integrity sha512-Zx9Kq2Lm7Pw4Nv8Rt3Yb6Hc1Df5Gj0Sa2Wd7Qe4Uo9IkLp=='
158
-
159
- echo ""
160
- echo "→ 4. No staged files = clean exit"
161
- reset_stage
162
- if run_hook; then
163
- pass "No staged files exits 0"
164
- else
165
- fail "No staged files exits 0"
166
- fi
167
-
168
- echo ""
169
- echo "══ pre-commit smoke: $PASS passed, $FAIL failed ══"
170
- [ "$FAIL" -eq 0 ]
@@ -1,226 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-pref-migration.sh - exercises migrate-prefs.mjs against representative
3
- # v2.0.0 and pre-2.0.0 fixtures, asserts the output is v2.1.0-shaped.
4
- #
5
- # Fixtures are synthesized inline (no external files) to keep the test self-contained.
6
- # Run after any change to migrate-prefs.mjs or prefs.schema.json.
7
-
8
- set -uo pipefail
9
-
10
- HERE="$(cd "$(dirname "$0")" && pwd)"
11
- MIGRATE="$HERE/migrate-prefs.mjs"
12
- TMP="$(mktemp -d -t ma-smoke-migration-XXXX)"
13
- trap 'rm -rf "$TMP"' EXIT
14
-
15
- PASS=0
16
- FAIL=0
17
- pass() { PASS=$((PASS + 1)); echo " ✓ $1"; }
18
- fail() { FAIL=$((FAIL + 1)); echo " ✗ $1"; }
19
-
20
- if [ ! -f "$MIGRATE" ]; then
21
- fail "migrate-prefs.mjs not found at $MIGRATE"
22
- echo "══ pref-migration smoke: aborted ══"
23
- exit 2
24
- fi
25
-
26
- # Helper: write fixture to $TMP/<name>.json, run migration, read back
27
- run_fixture() {
28
- local name="$1"
29
- local content="$2"
30
- local file="$TMP/$name.json"
31
- printf '%s' "$content" > "$file"
32
- node "$MIGRATE" --file "$file" >/dev/null 2>&1
33
- cat "$file"
34
- }
35
-
36
- assert_json_has() {
37
- local name="$1"
38
- local json="$2"
39
- local path="$3" # e.g. .schemaVersion or .global.identities
40
- local expected="$4"
41
- local actual
42
- actual=$(echo "$json" | node -e "
43
- const j = JSON.parse(require('fs').readFileSync(0, 'utf8'));
44
- const p = '$path'.split('.').filter(Boolean);
45
- let v = j; for (const k of p) v = v?.[k];
46
- if (Array.isArray(v)) console.log('array:' + v.length);
47
- else if (typeof v === 'object' && v !== null) console.log('object:' + Object.keys(v).length);
48
- else console.log(String(v));
49
- " 2>/dev/null)
50
- if [ "$actual" = "$expected" ]; then
51
- pass "$name: $path == $expected"
52
- else
53
- fail "$name: $path expected '$expected', got '$actual'"
54
- fi
55
- }
56
-
57
- # ──────────────────────────────────────────────────────────────────────────
58
- echo "→ Fixture 1: v2.0.0 with gitIdentities (legacy)"
59
- F1=$(run_fixture "f1-v2.0.0-legacy" '{
60
- "schemaVersion": "2.0.0",
61
- "global": {
62
- "gitIdentities": [{"name": "Test User", "email": "test@example.com"}],
63
- "keychainMapping": {"jira": "user_Jira_Access_Token"}
64
- },
65
- "projects": {}
66
- }')
67
- assert_json_has "f1" "$F1" ".schemaVersion" "2.4.0"
68
- assert_json_has "f1" "$F1" ".global.identities" "array:1"
69
- assert_json_has "f1" "$F1" ".global.gitIdentities" "undefined"
70
- assert_json_has "f1" "$F1" ".global.settings" "object:8"
71
- assert_json_has "f1" "$F1" ".global.keychainMapping" "object:10"
72
- assert_json_has "f1" "$F1" ".global.platformIdentityRouting" "object:0"
73
- assert_json_has "f1" "$F1" ".global.recentGroups" "array:0"
74
- assert_json_has "f1" "$F1" ".global.recentAccounts" "array:0"
75
- assert_json_has "f1" "$F1" ".global.accounts" "array:0"
76
- assert_json_has "f1" "$F1" ".global.routines" "array:0"
77
-
78
- echo ""
79
- echo "→ Fixture 2: no schemaVersion (pre-2.0.0 fossil)"
80
- F2=$(run_fixture "f2-no-version" '{
81
- "global": {"gitIdentities": []},
82
- "projects": {}
83
- }')
84
- assert_json_has "f2" "$F2" ".schemaVersion" "2.4.0"
85
- assert_json_has "f2" "$F2" ".global.identities" "array:0"
86
-
87
- echo ""
88
- echo "→ Fixture 3: v2.4.0 already (no-op)"
89
- F3_FILE="$TMP/f3-v2.4.0.json"
90
- cat > "$F3_FILE" <<'EOF'
91
- {
92
- "schemaVersion": "2.4.0",
93
- "global": {
94
- "identities": [],
95
- "keychainMapping": {
96
- "jira": null, "bitbucket_token": null, "bitbucket_user": null,
97
- "github": null, "confluence": null, "figma": null,
98
- "figma_mcp": null, "fortify": null,
99
- "firebase": null, "jenkins": null
100
- },
101
- "platformIdentityRouting": {},
102
- "recentProjects": [],
103
- "recentBranches": {},
104
- "recentGroups": [],
105
- "serviceStatus": {},
106
- "settings": {
107
- "branchTtlDays": 15, "pushRetryMax": 5, "buildRetryMax": 3,
108
- "serviceStatusCacheSeconds": 300, "repoScanDays": 90,
109
- "identityRoutingEnabled": false, "multiRepoEnabled": false,
110
- "pushMustSucceed": true
111
- },
112
- "triageCrossCheck": {
113
- "enabled": false, "samplePct": 10, "model": "sonnet", "blockOnDisagreement": false
114
- },
115
- "promptLanguage": "en",
116
- "reportChannels": {"pr": true, "jira": true, "confluence": false, "wiki": false},
117
- "reportContent": {"normalAnalysis": true, "technicalAnalysis": false, "testScenarios": true, "autoDiff": false, "manualNote": false},
118
- "wikiScope": ["main", "ios", "screenshots", "index"],
119
- "autopilotReportTimeoutSeconds": 1800,
120
- "recentAccounts": [],
121
- "accounts": [],
122
- "routines": []
123
- },
124
- "projects": {}
125
- }
126
- EOF
127
- # Hash before
128
- BEFORE=$(shasum -a 256 "$F3_FILE" | awk '{print $1}')
129
- node "$MIGRATE" --file "$F3_FILE" >/dev/null 2>&1
130
- AFTER=$(shasum -a 256 "$F3_FILE" | awk '{print $1}')
131
- if [ "$BEFORE" = "$AFTER" ]; then
132
- pass "f3: idempotent (v2.3.0 unchanged by re-run)"
133
- else
134
- fail "f3: v2.3.0 file mutated by re-run (hash changed)"
135
- fi
136
-
137
- echo ""
138
- echo "→ Fixture 4: obsolete fields pruned"
139
- F4=$(run_fixture "f4-obsolete" '{
140
- "global": {
141
- "defaultPriority": "Medium",
142
- "defaultIssueType": "Story",
143
- "gitIdentities": []
144
- },
145
- "projects": {}
146
- }')
147
- assert_json_has "f4" "$F4" ".global.defaultPriority" "undefined"
148
- assert_json_has "f4" "$F4" ".global.defaultIssueType" "undefined"
149
-
150
- echo ""
151
- echo "→ Fixture 5: keychainMapping values preserved"
152
- F5=$(run_fixture "f5-km-preserve" '{
153
- "global": {
154
- "gitIdentities": [],
155
- "keychainMapping": {
156
- "jira": "user_Jira_Access_Token",
157
- "github": "user_Github_Access_Token"
158
- }
159
- },
160
- "projects": {}
161
- }')
162
- # Parse and inspect specific keychain values
163
- JIRA_VAL=$(echo "$F5" | node -e "const j=JSON.parse(require('fs').readFileSync(0,'utf8')); console.log(j.global.keychainMapping.jira)")
164
- if [ "$JIRA_VAL" = "user_Jira_Access_Token" ]; then
165
- pass "f5: existing keychainMapping.jira value preserved"
166
- else
167
- fail "f5: keychainMapping.jira lost or changed: got '$JIRA_VAL'"
168
- fi
169
-
170
- echo ""
171
- echo "→ Fixture 6: v2.1.0 firebase_sa + firebase_project → firebase (consolidation)"
172
- F6=$(run_fixture "f6-firebase-consolidate" '{
173
- "schemaVersion": "2.1.0",
174
- "global": {
175
- "identities": [{
176
- "name": "corporate",
177
- "email": "x@y.com",
178
- "servicePatMap": {
179
- "firebase_sa": "user_Firebase_Access_Json",
180
- "firebase_project": "user_Firebase_Project_Id"
181
- }
182
- }],
183
- "keychainMapping": {
184
- "jira": null, "bitbucket_token": null, "bitbucket_user": null,
185
- "github": null, "confluence": null, "figma_pat": "user_Figma_Access_Token",
186
- "figma_user": "user_figma_email", "figma_mcp": null, "fortify": null,
187
- "firebase_sa": "user_Firebase_Access_Json",
188
- "firebase_project": "user_Firebase_Project_Id",
189
- "jenkins": null
190
- },
191
- "platformIdentityRouting": {},
192
- "recentProjects": [], "recentBranches": {}, "recentGroups": [],
193
- "serviceStatus": {},
194
- "settings": {
195
- "branchTtlDays": 15, "pushRetryMax": 5, "buildRetryMax": 3,
196
- "serviceStatusCacheSeconds": 300, "repoScanDays": 90,
197
- "identityRoutingEnabled": false, "multiRepoEnabled": false,
198
- "pushMustSucceed": true
199
- }
200
- },
201
- "projects": {}
202
- }')
203
- # keychainMapping.firebase_sa must be gone, firebase_project must be gone, firebase must carry the old firebase_sa value
204
- FB_SA=$(echo "$F6" | node -e "const j=JSON.parse(require('fs').readFileSync(0,'utf8')); console.log(j.global.keychainMapping.firebase_sa === undefined ? 'absent' : 'present')")
205
- FB_PROJ=$(echo "$F6" | node -e "const j=JSON.parse(require('fs').readFileSync(0,'utf8')); console.log(j.global.keychainMapping.firebase_project === undefined ? 'absent' : 'present')")
206
- FB=$(echo "$F6" | node -e "const j=JSON.parse(require('fs').readFileSync(0,'utf8')); console.log(j.global.keychainMapping.firebase)")
207
- SPM_SA=$(echo "$F6" | node -e "const j=JSON.parse(require('fs').readFileSync(0,'utf8')); console.log(j.global.identities[0].servicePatMap.firebase_sa === undefined ? 'absent' : 'present')")
208
- SPM_PROJ=$(echo "$F6" | node -e "const j=JSON.parse(require('fs').readFileSync(0,'utf8')); console.log(j.global.identities[0].servicePatMap.firebase_project === undefined ? 'absent' : 'present')")
209
- SPM_FB=$(echo "$F6" | node -e "const j=JSON.parse(require('fs').readFileSync(0,'utf8')); console.log(j.global.identities[0].servicePatMap.firebase)")
210
- [ "$FB_SA" = "absent" ] && pass "f6: keychainMapping.firebase_sa removed" || fail "f6: keychainMapping.firebase_sa still present"
211
- [ "$FB_PROJ" = "absent" ] && pass "f6: keychainMapping.firebase_project removed" || fail "f6: keychainMapping.firebase_project still present"
212
- [ "$FB" = "user_Firebase_Access_Json" ] && pass "f6: keychainMapping.firebase carries old firebase_sa value" || fail "f6: keychainMapping.firebase wrong value: '$FB'"
213
- [ "$SPM_SA" = "absent" ] && pass "f6: servicePatMap.firebase_sa removed" || fail "f6: servicePatMap.firebase_sa still present"
214
- [ "$SPM_PROJ" = "absent" ] && pass "f6: servicePatMap.firebase_project removed" || fail "f6: servicePatMap.firebase_project still present"
215
- [ "$SPM_FB" = "user_Firebase_Access_Json" ] && pass "f6: servicePatMap.firebase carries old value" || fail "f6: servicePatMap.firebase wrong value: '$SPM_FB'"
216
- # figma consolidation: figma_pat → figma, figma_user removed
217
- FIG_PAT=$(echo "$F6" | node -e "const j=JSON.parse(require('fs').readFileSync(0,'utf8')); console.log(j.global.keychainMapping.figma_pat === undefined ? 'absent' : 'present')")
218
- FIG_USER=$(echo "$F6" | node -e "const j=JSON.parse(require('fs').readFileSync(0,'utf8')); console.log(j.global.keychainMapping.figma_user === undefined ? 'absent' : 'present')")
219
- FIG=$(echo "$F6" | node -e "const j=JSON.parse(require('fs').readFileSync(0,'utf8')); console.log(j.global.keychainMapping.figma)")
220
- [ "$FIG_PAT" = "absent" ] && pass "f6: keychainMapping.figma_pat removed" || fail "f6: keychainMapping.figma_pat still present"
221
- [ "$FIG_USER" = "absent" ] && pass "f6: keychainMapping.figma_user removed" || fail "f6: keychainMapping.figma_user still present"
222
- [ "$FIG" = "user_Figma_Access_Token" ] && pass "f6: keychainMapping.figma carries old figma_pat value" || fail "f6: keychainMapping.figma wrong value: '$FIG'"
223
-
224
- echo ""
225
- echo "══ pref-migration smoke: $PASS passed, $FAIL failed ══"
226
- [ "$FAIL" -eq 0 ]