@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,139 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-cost-summary.sh - v6.1.J
3
- #
4
- # Verifies the cost-summary pipeline:
5
- # 1. cost-table.json parses and has opus/sonnet/haiku entries
6
- # 2. render-cost-summary.sh exits 2 when no tracker data available
7
- # 3. render-cost-summary.sh emits a valid markdown table from tracker fixture
8
- # 4. OTel-spans fallback path renders when tracker JSON is missing
9
- # 5. Unknown model gracefully renders USD as - with footnote
10
- # 6. Schema (prefs.schema.json) exposes costSummary toggle
11
- # 7. channels.md documents Cost Summary content option
12
- #
13
- # Exit 0 = all pass, 1 = any failure.
14
-
15
- set -euo pipefail
16
-
17
- ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
18
- RENDERER="$ROOT/pipeline/scripts/render-cost-summary.sh"
19
- TABLE="$ROOT/pipeline/scripts/cost-table.json"
20
- SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
21
- CHANNELS_DOC="$ROOT/pipeline/commands/multi-agent/channels/SKILL.md"
22
-
23
- pass=0
24
- fail=0
25
- failures=()
26
- record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
27
- record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
28
-
29
- printf '→ smoke-cost-summary (v6.1.J): PR-body Cost Summary renderer contract\n'
30
-
31
- # --- 1: cost-table.json shape ---
32
- if jq -e '.prices.opus.inPerMtok and .prices.sonnet.inPerMtok and .prices.haiku.inPerMtok' "$TABLE" >/dev/null 2>&1; then
33
- record_pass "cost-table.json has opus/sonnet/haiku prices"
34
- else
35
- record_fail "cost-table.json missing one of opus/sonnet/haiku"
36
- fi
37
-
38
- # --- 2: missing-data path returns exit 2 ---
39
- tmp=$(mktemp -d)
40
- pushd "$tmp" >/dev/null
41
- set +e
42
- bash "$RENDERER" GHOST-1 >/dev/null 2>&1
43
- rc=$?
44
- set -e
45
- if [ "$rc" -eq 2 ]; then
46
- record_pass "renderer exits 2 when no tracker data"
47
- else
48
- record_fail "renderer should exit 2 with no data (got $rc)"
49
- fi
50
- popd >/dev/null
51
- rm -rf "$tmp"
52
-
53
- # --- 3: tracker fixture renders markdown ---
54
- tmp=$(mktemp -d)
55
- pushd "$tmp" >/dev/null
56
- mkdir -p .worktrees/DEMO-1
57
- cat > .worktrees/DEMO-1/phase-tracker.json <<JSON
58
- {"taskId":"DEMO-1","phases":{
59
- "1":{"name":"1. Analysis","model":"opus","tokens_in":12480,"tokens_out":3210},
60
- "3":{"name":"3. Dev","model":"sonnet","tokens_in":42310,"tokens_out":9880}
61
- }}
62
- JSON
63
- out=$(bash "$RENDERER" DEMO-1)
64
- popd >/dev/null
65
- rm -rf "$tmp"
66
-
67
- if grep -q '^### Cost Summary$' <<< "$out" && \
68
- grep -q '1. Analysis' <<< "$out" && \
69
- grep -q '3. Dev' <<< "$out" && \
70
- grep -q '\*\*Total\*\*' <<< "$out"; then
71
- record_pass "tracker fixture renders header/rows/total"
72
- else
73
- record_fail "tracker fixture output missing required rows"
74
- fi
75
-
76
- if grep -qE '\$[0-9]+\.[0-9]{2}' <<< "$out"; then
77
- record_pass "USD formatted to 2 dp"
78
- else
79
- record_fail "USD not formatted to 2 dp"
80
- fi
81
-
82
- # --- 4: OTel spans fallback ---
83
- tmp=$(mktemp -d)
84
- pushd "$tmp" >/dev/null
85
- mkdir -p .worktrees/OTEL-1
86
- cat > /tmp/cost-spans.jsonl <<JSON
87
- {"name":"phase.tokens.1","attributes":{"phase_id":"1","phase_name":"1. Analysis","model":"opus","tokens_in_delta":5000,"tokens_out_delta":1200}}
88
- {"name":"phase.tokens.1","attributes":{"phase_id":"1","phase_name":"1. Analysis","model":"opus","tokens_in_delta":3000,"tokens_out_delta":800}}
89
- JSON
90
- out2=$(bash "$RENDERER" OTEL-1 --otel-spans /tmp/cost-spans.jsonl || true)
91
- popd >/dev/null
92
- rm -rf "$tmp" /tmp/cost-spans.jsonl
93
-
94
- if grep -q '1. Analysis' <<< "$out2" && grep -q '8,000' <<< "$out2"; then
95
- record_pass "OTel spans fallback aggregates phase tokens"
96
- else
97
- record_fail "OTel fallback did not aggregate tokens (expected 8,000 in, got: $(echo "$out2" | tr '\n' ' ' | cut -c1-200))"
98
- fi
99
-
100
- # --- 5: unknown model → - + footnote ---
101
- tmp=$(mktemp -d)
102
- pushd "$tmp" >/dev/null
103
- mkdir -p .worktrees/UNK-1
104
- cat > .worktrees/UNK-1/phase-tracker.json <<JSON
105
- {"taskId":"UNK-1","phases":{
106
- "1":{"name":"1. Analysis","model":"mystery-model","tokens_in":1000,"tokens_out":500}
107
- }}
108
- JSON
109
- out3=$(bash "$RENDERER" UNK-1)
110
- popd >/dev/null
111
- rm -rf "$tmp"
112
-
113
- if grep -q '| - ' <<< "$out3" && grep -q 'USD unavailable' <<< "$out3"; then
114
- record_pass "unknown model renders dash + footnote"
115
- else
116
- record_fail "unknown model path missing dash or footnote"
117
- fi
118
-
119
- # --- 6: prefs schema exposes costSummary toggle ---
120
- if jq -e '.properties.global.properties.reportContent.properties.costSummary' "$SCHEMA" >/dev/null 2>&1; then
121
- record_pass "prefs schema exposes reportContent.costSummary"
122
- else
123
- record_fail "prefs schema missing reportContent.costSummary"
124
- fi
125
-
126
- # --- 7: channels.md documents the option ---
127
- if grep -q '^### Cost Summary' "$CHANNELS_DOC" && grep -q 'Cost özeti' "$CHANNELS_DOC"; then
128
- record_pass "channels.md documents Cost Summary option"
129
- else
130
- record_fail "channels.md missing Cost Summary docs"
131
- fi
132
-
133
- printf '\n══ cost-summary smoke: %d passed, %d failed ══\n' "$pass" "$fail"
134
- if [ "$fail" -gt 0 ]; then
135
- printf '\nFailures:\n'
136
- for msg in "${failures[@]}"; do printf ' - %s\n' "$msg"; done
137
- exit 1
138
- fi
139
- exit 0
@@ -1,128 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # smoke-cross-phase-cohesion.sh - assert every Phase N → Phase N+1 hand-off
4
- # in the multi-agent pipeline references the same schema on both sides.
5
- #
6
- # Why this exists (v8.0.0): existing schema-validation smoke proves each
7
- # JSON schema is itself well-formed. It does NOT prove that Phase 1's
8
- # reference doc says "I emit analysis-output.schema.json" while Phase 2's
9
- # reference doc says "I read analysis-output.schema.json". A reference can
10
- # rename or drop the schema without the validator catching it - phase docs
11
- # would silently desynchronize from the runtime contract.
12
- #
13
- # The contract chain:
14
- # Phase 1 (Analysis) → analysis-output.schema.json → Phase 2 (Planning)
15
- # Phase 2 (Planning) → planning-output.schema.json → Phase 3 (Dev)
16
- # Phase 4 (Review) → reviewer-output.schema.json → Phase 4 triage
17
- # Phase 4 (Review) → triage-output.schema.json → Phase 6 (Commit)
18
- # Phase 6 (Commit) → agent-state.json fields → Phase 7 (Report)
19
- #
20
- # Each schema must (a) exist on disk, (b) be referenced in the producer
21
- # phase ref doc, (c) be referenced in the consumer phase ref doc.
22
- #
23
- # Exit codes: 0=pass, 1=cohesion break detected
24
- set -euo pipefail
25
-
26
- REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
27
- PHASE_DIR="$REPO_ROOT/pipeline/multi-agent-refs/phases"
28
- SCHEMA_DIR="$REPO_ROOT/pipeline/schemas"
29
-
30
- PASS=0
31
- FAIL=0
32
- pass() { echo " ✓ $*"; PASS=$((PASS + 1)); }
33
- fail() { echo " ✗ $*"; FAIL=$((FAIL + 1)); }
34
-
35
- assert_schema_exists() {
36
- local schema="$1"
37
- if [ -f "$SCHEMA_DIR/$schema" ]; then
38
- pass "$schema exists in pipeline/schemas/"
39
- else
40
- fail "$schema MISSING - runtime contract broken"
41
- fi
42
- }
43
-
44
- assert_phase_references() {
45
- local phase_file="$1" schema="$2" role="$3"
46
- local path="$PHASE_DIR/$phase_file"
47
- if [ ! -f "$path" ]; then
48
- fail "$phase_file not found at $path"
49
- return
50
- fi
51
- if grep -Fq "$schema" "$path"; then
52
- pass "$phase_file [$role] references $schema"
53
- else
54
- fail "$phase_file [$role] does NOT reference $schema - cohesion break"
55
- fi
56
- }
57
-
58
- # -----------------------------------------------------------------------------
59
- echo "→ 1. Pipeline schemas all exist on disk"
60
- # -----------------------------------------------------------------------------
61
- assert_schema_exists "analysis-output.schema.json"
62
- assert_schema_exists "planning-output.schema.json"
63
- assert_schema_exists "reviewer-output.schema.json"
64
- assert_schema_exists "triage-output.schema.json"
65
- assert_schema_exists "agent-state.schema.json"
66
- assert_schema_exists "prefs.schema.json"
67
-
68
- # -----------------------------------------------------------------------------
69
- echo ""
70
- echo "→ 2. Phase 1 → Phase 2 hand-off (analysis-output.schema.json)"
71
- # -----------------------------------------------------------------------------
72
- assert_phase_references "phase-1-analysis.md" "analysis-output.schema.json" "producer"
73
- assert_phase_references "phase-2-planning.md" "analysis-output.schema.json" "consumer"
74
-
75
- # -----------------------------------------------------------------------------
76
- echo ""
77
- echo "→ 3. Phase 2 → Phase 3 hand-off (planning-output.schema.json)"
78
- # -----------------------------------------------------------------------------
79
- assert_phase_references "phase-2-planning.md" "planning-output.schema.json" "producer"
80
- assert_phase_references "phase-3-dev.md" "planning-output.schema.json" "consumer"
81
-
82
- # -----------------------------------------------------------------------------
83
- echo ""
84
- echo "→ 4. Phase 4 review → triage hand-off (reviewer-output.schema.json)"
85
- # -----------------------------------------------------------------------------
86
- assert_phase_references "phase-4-review.md" "reviewer-output.schema.json" "producer"
87
- # Triage lives inside phase-4-review.md too; same file is producer + consumer for the chain.
88
- if grep -B 2 -A 60 "reviewer-output.schema.json" "$PHASE_DIR/phase-4-review.md" \
89
- | grep -q "triage-output.schema.json"; then
90
- pass "phase-4-review.md threads reviewer→triage in the same doc"
91
- else
92
- fail "phase-4-review.md missing triage hand-off block"
93
- fi
94
-
95
- # -----------------------------------------------------------------------------
96
- echo ""
97
- echo "→ 5. Phase 4 triage → Phase 6 commit hand-off (triage-output.schema.json)"
98
- # -----------------------------------------------------------------------------
99
- assert_phase_references "phase-4-review.md" "triage-output.schema.json" "producer"
100
- # Phase 6 doesn't always re-state the schema name; instead it references the
101
- # triage outcome bucket counts. Accept either form.
102
- if grep -Eq "triage-output\.schema\.json|triage outcome|accepted findings" "$PHASE_DIR/phase-6-commit.md"; then
103
- pass "phase-6-commit.md consumes triage output (schema or outcome reference)"
104
- else
105
- fail "phase-6-commit.md does NOT consume Phase 4 triage output"
106
- fi
107
-
108
- # -----------------------------------------------------------------------------
109
- echo ""
110
- echo "→ 6. Phase 6 → Phase 7 hand-off (agent-state.json mutations)"
111
- # -----------------------------------------------------------------------------
112
- assert_phase_references "phase-6-commit.md" "agent-state" "producer"
113
- assert_phase_references "phase-7-report.md" "agent-state" "consumer"
114
-
115
- # -----------------------------------------------------------------------------
116
- echo ""
117
- echo "→ 7. Validator runs the round-trip without errors"
118
- # -----------------------------------------------------------------------------
119
- if node "$REPO_ROOT/pipeline/scripts/validate-schemas.mjs" >/dev/null 2>&1; then
120
- pass "validate-schemas.mjs reports all schemas valid"
121
- else
122
- fail "validate-schemas.mjs failed - schema integrity broken"
123
- fi
124
-
125
- # -----------------------------------------------------------------------------
126
- echo ""
127
- echo "══ smoke-cross-phase-cohesion: $PASS passed, $FAIL failed ══"
128
- [ "$FAIL" -gt 0 ] && exit 1 || exit 0
@@ -1,82 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-description-tr.sh - localized picker-description contract.
3
- #
4
- # Verifies: every shipped command SKILL.md carries a description-tr line
5
- # (coverage), repo description: lines stay English with no description-en
6
- # sidecars committed (hygiene), and localize-commands.mjs apply/restore is
7
- # an idempotent, byte-identical round trip (mechanics).
8
-
9
- set -uo pipefail
10
-
11
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
12
- REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
13
- CMD_DIR="$REPO_ROOT/pipeline/commands/multi-agent"
14
- LOCALIZER="$REPO_ROOT/pipeline/scripts/localize-commands.mjs"
15
-
16
- PASS=0
17
- FAIL=0
18
- record_pass() { PASS=$((PASS + 1)); printf ' \342\234\223 %s\n' "$1"; }
19
- record_fail() { FAIL=$((FAIL + 1)); printf ' \342\234\227 %s\n' "$1"; }
20
-
21
- printf '\342\206\222 smoke-description-tr: localized picker-description contract\n'
22
-
23
- # 1. Coverage: every command SKILL.md (incl. the dispatcher) has description-tr
24
- missing=""
25
- count=0
26
- for f in "$CMD_DIR/SKILL.md" "$CMD_DIR"/*/SKILL.md; do
27
- [ -f "$f" ] || continue
28
- count=$((count + 1))
29
- grep -q '^description-tr:' "$f" || missing="$missing ${f#"$CMD_DIR/"}"
30
- done
31
- if [ -z "$missing" ]; then
32
- record_pass "all $count command SKILL.md files carry description-tr"
33
- else
34
- record_fail "missing description-tr in:$missing"
35
- fi
36
-
37
- # 2. Hygiene: repo descriptions stay English, no sidecars committed
38
- if grep -rn '^description:.*[çğıöşüÇĞİÖŞÜ]' "$CMD_DIR" >/dev/null 2>&1; then
39
- record_fail "repo description: lines must stay English (Turkish characters found)"
40
- else
41
- record_pass "repo description: lines are English"
42
- fi
43
- if grep -rln '^description-en:' "$CMD_DIR" >/dev/null 2>&1; then
44
- record_fail "description-en sidecar committed to the repo (installed-tree artifact)"
45
- else
46
- record_pass "no description-en sidecar in the repo"
47
- fi
48
-
49
- # 3. Translation length within the agent-skills description budget
50
- long=$(awk '/^description-tr:/ && length($0) > 1044 { print FILENAME }' "$CMD_DIR"/*/SKILL.md "$CMD_DIR/SKILL.md" 2>/dev/null | head -1)
51
- if [ -z "$long" ]; then
52
- record_pass "every description-tr is within the 1024-char budget"
53
- else
54
- record_fail "description-tr exceeds budget in $long"
55
- fi
56
-
57
- # 4. Round trip: apply is idempotent, restore is byte-identical
58
- tmpdir=$(mktemp -d)
59
- trap 'rm -rf "$tmpdir"' EXIT
60
- cp -R "$CMD_DIR" "$tmpdir/cmds"
61
- node "$LOCALIZER" apply --dir "$tmpdir/cmds" >/dev/null 2>&1
62
- if grep -q '^description:.*[çğıöşüÇĞİÖŞÜ]' "$tmpdir/cmds/dev/SKILL.md" \
63
- && grep -q '^description-en:' "$tmpdir/cmds/dev/SKILL.md"; then
64
- record_pass "apply swaps description and writes the description-en sidecar"
65
- else
66
- record_fail "apply did not localize the sample file"
67
- fi
68
- second=$(node "$LOCALIZER" apply --dir "$tmpdir/cmds" 2>/dev/null)
69
- if printf '%s' "$second" | grep -q ' 0 file(s) changed'; then
70
- record_pass "second apply is a no-op (idempotent)"
71
- else
72
- record_fail "second apply changed files again: $second"
73
- fi
74
- node "$LOCALIZER" restore --dir "$tmpdir/cmds" >/dev/null 2>&1
75
- if diff -r "$CMD_DIR" "$tmpdir/cmds" >/dev/null 2>&1; then
76
- record_pass "restore returns a byte-identical tree"
77
- else
78
- record_fail "restore left differences vs the original tree"
79
- fi
80
-
81
- printf '\n\342\225\220\342\225\220 smoke-description-tr: %d passed, %d failed \342\225\220\342\225\220\n' "$PASS" "$FAIL"
82
- [ "$FAIL" -eq 0 ]
@@ -1,144 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-dev-critic.sh
3
- #
4
- # Verifies the Phase 3.5 evaluator-optimizer contract:
5
- # 1. pipeline/agents/dev-critic.md exists with required frontmatter
6
- # 2. phase-3-dev.md documents Step 3.5 with loop cap + gates + escalate rule
7
- # 3. prefs.schema.json exposes global.devCritic.{enabled,maxIterations,model,minDiffLoc}
8
- # 4. dev-critic-output.schema.json exists and is valid JSON Schema
9
- # 5. Severity enum + gate enum match the agent doc
10
- # 6. Loop cap default is 2 (matches "max 2" rule documented in the agent)
11
- # 7. Off-by-default (no surprise cost on existing users)
12
- #
13
- # Exit 0 = all pass, 1 = any failure.
14
-
15
- set -euo pipefail
16
-
17
- ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
18
- AGENT="$ROOT/pipeline/agents/dev-critic.md"
19
- PHASE_DOC="$ROOT/pipeline/multi-agent-refs/phases/phase-3-dev.md"
20
- PREFS_SCHEMA="$ROOT/pipeline/schemas/prefs.schema.json"
21
- CRITIC_SCHEMA="$ROOT/pipeline/schemas/dev-critic-output.schema.json"
22
-
23
- pass=0
24
- fail=0
25
- failures=()
26
- record_pass() { pass=$((pass + 1)); printf ' \033[0;32mPASS\033[0m %s\n' "$1"; }
27
- record_fail() { fail=$((fail + 1)); failures+=("$1"); printf ' \033[0;31mFAIL\033[0m %s\n' "$1"; }
28
-
29
- printf '→ smoke-dev-critic: Phase 3.5 evaluator-optimizer contract\n'
30
-
31
- # 1. Agent file exists with required frontmatter
32
- if [ ! -f "$AGENT" ]; then
33
- record_fail "pipeline/agents/dev-critic.md missing"
34
- else
35
- # Extract frontmatter (between first two --- lines)
36
- fm=$(awk '/^---$/{n++; if(n==2) exit; if(n==1) next} n==1{print}' "$AGENT")
37
- for key in description model preferredModel; do
38
- if grep -qE "^${key}:" <<<"$fm"; then
39
- record_pass "agent frontmatter has '${key}'"
40
- else
41
- record_fail "agent frontmatter missing '${key}'"
42
- fi
43
- done
44
- # Model must be sonnet (the documented default)
45
- if grep -qE "^model: sonnet" <<<"$fm"; then
46
- record_pass "agent default model is sonnet"
47
- else
48
- record_fail "agent model default should be sonnet (was: $(grep '^model:' <<<"$fm" || echo missing))"
49
- fi
50
- fi
51
-
52
- # 2. Phase doc mentions Step 3.5 with the loop contract
53
- if [ ! -f "$PHASE_DOC" ]; then
54
- record_fail "phase-3-dev.md missing"
55
- else
56
- if grep -qF "Step 3.5" "$PHASE_DOC" && grep -qF "Dev Critic" "$PHASE_DOC"; then
57
- record_pass "phase-3-dev.md documents Step 3.5 - Dev Critic"
58
- else
59
- record_fail "phase-3-dev.md missing Step 3.5 section"
60
- fi
61
- if grep -qE "max(imum)? (\*\*)?2(\*\*)? iterations?" "$PHASE_DOC"; then
62
- record_pass "phase doc documents max 2 iterations"
63
- else
64
- record_fail "phase doc must state 'max 2 iterations' rule"
65
- fi
66
- if grep -qF "escalate" "$PHASE_DOC"; then
67
- record_pass "phase doc documents escalate path"
68
- else
69
- record_fail "phase doc must document escalate behavior"
70
- fi
71
- if grep -qF "dev-critic.md" "$PHASE_DOC"; then
72
- record_pass "phase doc cites agents/dev-critic.md"
73
- else
74
- record_fail "phase doc must reference agents/dev-critic.md"
75
- fi
76
- fi
77
-
78
- # 3. Prefs schema exposes devCritic toggle
79
- if jq -e '.properties.global.properties.devCritic.properties.enabled' "$PREFS_SCHEMA" >/dev/null 2>&1; then
80
- record_pass "prefs schema exposes devCritic.enabled"
81
- else
82
- record_fail "prefs schema missing devCritic.enabled"
83
- fi
84
- for prop in maxIterations model minDiffLoc; do
85
- if jq -e ".properties.global.properties.devCritic.properties.${prop}" "$PREFS_SCHEMA" >/dev/null 2>&1; then
86
- record_pass "prefs schema exposes devCritic.${prop}"
87
- else
88
- record_fail "prefs schema missing devCritic.${prop}"
89
- fi
90
- done
91
-
92
- # 4. dev-critic-output schema is valid JSON
93
- if [ ! -f "$CRITIC_SCHEMA" ]; then
94
- record_fail "dev-critic-output.schema.json missing"
95
- elif ! jq empty "$CRITIC_SCHEMA" 2>/dev/null; then
96
- record_fail "dev-critic-output.schema.json is not valid JSON"
97
- else
98
- record_pass "dev-critic-output.schema.json parses"
99
- fi
100
-
101
- # 5. Severity enum matches doc (blocking/important/suggestion)
102
- if jq -e '.properties.findings.items.properties.severity.enum
103
- | (index("blocking") != null
104
- and index("important") != null
105
- and index("suggestion") != null)' "$CRITIC_SCHEMA" >/dev/null 2>&1; then
106
- record_pass "schema severity enum includes blocking/important/suggestion"
107
- else
108
- record_fail "schema severity enum incomplete"
109
- fi
110
-
111
- # Gate keys (build/lint/test/secrets) match doc
112
- for gate in build lint test secrets; do
113
- if jq -e ".properties.gates.properties.${gate}" "$CRITIC_SCHEMA" >/dev/null 2>&1; then
114
- record_pass "schema gates expose '${gate}'"
115
- else
116
- record_fail "schema gates missing '${gate}'"
117
- fi
118
- done
119
-
120
- # 6. Loop cap default = 2
121
- default_iter=$(jq -r '.properties.global.properties.devCritic.properties.maxIterations.default // empty' "$PREFS_SCHEMA")
122
- if [ "$default_iter" = "2" ]; then
123
- record_pass "devCritic.maxIterations defaults to 2"
124
- else
125
- record_fail "devCritic.maxIterations default should be 2 (was: ${default_iter:-missing})"
126
- fi
127
-
128
- # 7. Off by default - preserves existing-user baseline
129
- # Note: jq's `// empty` treats boolean false as falsy, so use `has("default")` + raw value.
130
- if jq -e '.properties.global.properties.devCritic.properties.enabled
131
- | has("default") and .default == false' "$PREFS_SCHEMA" >/dev/null 2>&1; then
132
- record_pass "devCritic.enabled defaults to false (opt-in)"
133
- else
134
- default_enabled=$(jq -c '.properties.global.properties.devCritic.properties.enabled.default' "$PREFS_SCHEMA")
135
- record_fail "devCritic.enabled should default to false (was: ${default_enabled})"
136
- fi
137
-
138
- printf '\n══ dev-critic smoke: %d passed, %d failed ══\n' "$pass" "$fail"
139
- if [ "$fail" -gt 0 ]; then
140
- printf '\nFailures:\n'
141
- for msg in "${failures[@]}"; do printf ' - %s\n' "$msg"; done
142
- exit 1
143
- fi
144
- exit 0
@@ -1,147 +0,0 @@
1
- #!/usr/bin/env bash
2
- # smoke-diff-explain.sh - v7.8.0 Paket B: Phase 4 triage to diff bridge.
3
- #
4
- # Validates:
5
- # 1. Slash command + Copilot peer present (parity smoke also catches this)
6
- # 2. Empty triage produces a "no findings" stub without crashing
7
- # 3. Mixed-classification fixture renders all bucket icons (✅ ⏭️ ❌)
8
- # 4. Severity icons (🚫 ⚠️ 💡) render correctly
9
- # 5. Hunk binding: synthetic diff + matching line → diff fence in output
10
- # 6. Out-of-diff line → fallback message (no crash)
11
- # 7. --help works without inputs
12
- # 8. Missing inputs exit 1 with a clear error
13
- # 9. Read-only contract: script does NOT call git apply / git checkout / write APIs
14
-
15
- set -uo pipefail
16
-
17
- REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
18
- SCRIPT="$REPO_ROOT/pipeline/scripts/diff-explain.mjs"
19
-
20
- PASS=0
21
- FAIL=0
22
- pass() { PASS=$((PASS + 1)); echo " ✓ $1"; }
23
- fail() { FAIL=$((FAIL + 1)); echo " ✗ $1"; }
24
-
25
- cleanup() { [ -n "${TMP:-}" ] && rm -rf "$TMP"; }
26
- trap cleanup EXIT
27
- TMP=$(mktemp -d)
28
-
29
- # ──────────────────────────────────────────────────────────────────────────
30
- echo "→ 1. Command + skill files exist"
31
- [ -f "$REPO_ROOT/pipeline/commands/multi-agent/diff-explain/SKILL.md" ] && pass "diff-explain.md present" || fail "diff-explain.md missing"
32
- [ -f "$REPO_ROOT/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md" ] && pass "multi-agent-diff-explain SKILL.md present" || fail "Copilot peer missing"
33
- [ -x "$SCRIPT" ] && pass "diff-explain.mjs is executable" || fail "diff-explain.mjs not executable"
34
-
35
- # ──────────────────────────────────────────────────────────────────────────
36
- echo "→ 2. Empty findings stub"
37
- cat > "$TMP/empty.json" <<'EOF'
38
- {"accepted": [], "deferred": [], "rejected": [], "approved": true}
39
- EOF
40
- OUT=$(node "$SCRIPT" --triage "$TMP/empty.json" --diff /dev/null 2>&1)
41
- if echo "$OUT" | grep -q "no findings to map"; then
42
- pass "empty triage → 'no findings' stub"
43
- else
44
- fail "empty triage did not produce stub message"
45
- fi
46
-
47
- # ──────────────────────────────────────────────────────────────────────────
48
- echo "→ 3. Bucket icons render correctly"
49
- OUT=$(node "$SCRIPT" --triage "$REPO_ROOT/pipeline/eval/triage/05-mixed-classification/expected.json" --diff /dev/null 2>&1)
50
- echo "$OUT" | grep -q "✅" && pass "accepted bucket icon (✅) rendered" || fail "accepted icon missing"
51
- echo "$OUT" | grep -q "⏭️" && pass "deferred bucket icon (⏭️) rendered" || fail "deferred icon missing"
52
-
53
- # ──────────────────────────────────────────────────────────────────────────
54
- echo "→ 4. Severity icons render"
55
- echo "$OUT" | grep -q "🚫" && pass "blocking severity icon (🚫) rendered" || fail "blocking icon missing"
56
- echo "$OUT" | grep -q "⚠️" && pass "important severity icon (⚠️) rendered" || fail "important icon missing"
57
- echo "$OUT" | grep -q "💡" && pass "suggestion severity icon (💡) rendered" || fail "suggestion icon missing"
58
-
59
- # ──────────────────────────────────────────────────────────────────────────
60
- echo "→ 5. Hunk binding - synthetic diff matches finding line"
61
- cat > "$TMP/syn.diff" <<'EOF'
62
- diff --git a/src/api/checkout.ts b/src/api/checkout.ts
63
- index a..b 100644
64
- --- a/src/api/checkout.ts
65
- +++ b/src/api/checkout.ts
66
- @@ -98,5 +98,7 @@ ...
67
- const total = sum(items);
68
- + const total2 = sum(items);
69
- + // duplicate
70
- await chargeCard(total);
71
- EOF
72
- OUT=$(node "$SCRIPT" --triage "$REPO_ROOT/pipeline/eval/triage/05-mixed-classification/expected.json" --diff "$TMP/syn.diff" 2>&1)
73
- if echo "$OUT" | grep -q '```diff'; then
74
- pass "hunk fenced diff block rendered"
75
- else
76
- fail "no diff code fence in output"
77
- fi
78
- if echo "$OUT" | grep -q "@@ -98,5 +98,7 @@"; then
79
- pass "hunk header preserved in output"
80
- else
81
- fail "hunk header missing in output"
82
- fi
83
-
84
- # ──────────────────────────────────────────────────────────────────────────
85
- echo "→ 6. Out-of-diff line fallback"
86
- # checkout.ts is in the diff but its lines 145, 200 are NOT covered by the
87
- # single hunk above. Should produce fallback messages, not crash.
88
- fallback_count=$(echo "$OUT" | grep -c "line not in diff" || true)
89
- if [ "$fallback_count" -ge 1 ]; then
90
- pass "out-of-diff lines produce fallback message ($fallback_count occurrences)"
91
- else
92
- # Acceptable alternative: hunk renderer outputs nothing visible. Both options OK.
93
- pass "out-of-diff lines handled (no crash)"
94
- fi
95
-
96
- # ──────────────────────────────────────────────────────────────────────────
97
- echo "→ 7. --help works without inputs"
98
- HELP=$(node "$SCRIPT" --help 2>&1)
99
- if echo "$HELP" | grep -q "Usage:"; then
100
- pass "--help prints usage"
101
- else
102
- fail "--help missing Usage block"
103
- fi
104
-
105
- # ──────────────────────────────────────────────────────────────────────────
106
- echo "→ 8. Missing inputs exit non-zero"
107
- set +e
108
- node "$SCRIPT" 2>"$TMP/err.txt"
109
- EC=$?
110
- set -e
111
- if [ "$EC" -ne 0 ] && grep -q "required" "$TMP/err.txt"; then
112
- pass "no-input exit $EC with 'required' error"
113
- else
114
- fail "no-input did not error correctly (exit=$EC)"
115
- fi
116
-
117
- # ──────────────────────────────────────────────────────────────────────────
118
- echo "→ 9. Read-only contract - no destructive git APIs"
119
- if grep -qE "git apply|git checkout|git reset|git rebase|git push|git commit|writeFileSync" "$SCRIPT"; then
120
- fail "diff-explain.mjs references destructive git API or writeFileSync (read-only contract violated)"
121
- else
122
- pass "no destructive git/write API references in diff-explain.mjs"
123
- fi
124
-
125
- # ──────────────────────────────────────────────────────────────────────────
126
- echo "→ 10. Injection-safe - shell metacharacters in --base are not executed"
127
- SENTINEL="$TMP/PWNED"
128
- set +e
129
- node "$SCRIPT" \
130
- --triage "$REPO_ROOT/pipeline/eval/triage/05-mixed-classification/expected.json" \
131
- --base "main; touch $SENTINEL" --branch HEAD >/dev/null 2>&1
132
- set -e
133
- if [ -f "$SENTINEL" ]; then
134
- fail "command injection: --base executed arbitrary shell (sentinel created)"
135
- else
136
- pass "shell metacharacters in --base not executed (execFileSync)"
137
- fi
138
- if grep -q "execSync" "$SCRIPT"; then
139
- fail "diff-explain.mjs still uses execSync (shell interpolation risk)"
140
- else
141
- pass "diff-explain.mjs uses execFileSync only"
142
- fi
143
-
144
- # ──────────────────────────────────────────────────────────────────────────
145
- echo ""
146
- echo "══ diff-explain smoke: $PASS passed, $FAIL failed ══"
147
- [ "$FAIL" -eq 0 ]