@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
@@ -19,14 +19,14 @@
19
19
  "required": ["sourcesScanned", "testsScanned", "gapCount", "gapBySeverity"],
20
20
  "properties": {
21
21
  "sourcesScanned": { "type": "integer", "minimum": 0 },
22
- "testsScanned": { "type": "integer", "minimum": 0 },
23
- "gapCount": { "type": "integer", "minimum": 0 },
22
+ "testsScanned": { "type": "integer", "minimum": 0 },
23
+ "gapCount": { "type": "integer", "minimum": 0 },
24
24
  "gapBySeverity": {
25
25
  "type": "object",
26
26
  "additionalProperties": false,
27
27
  "properties": {
28
- "blocking": { "type": "integer", "minimum": 0 },
29
- "important": { "type": "integer", "minimum": 0 },
28
+ "blocking": { "type": "integer", "minimum": 0 },
29
+ "important": { "type": "integer", "minimum": 0 },
30
30
  "suggestion": { "type": "integer", "minimum": 0 }
31
31
  },
32
32
  "required": ["blocking", "important", "suggestion"]
@@ -41,7 +41,7 @@
41
41
  "required": ["sourcePath", "symbol", "kind", "severity", "expectedTestPaths", "hint"],
42
42
  "properties": {
43
43
  "sourcePath": { "type": "string", "minLength": 1 },
44
- "symbol": { "type": "string", "minLength": 1 },
44
+ "symbol": { "type": "string", "minLength": 1 },
45
45
  "kind": {
46
46
  "type": "string",
47
47
  "description": "Pattern id from the rules file (e.g. public_func, composable_fun, named_export)."
@@ -3,14 +3,14 @@
3
3
  "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/token-budget.json",
4
4
  "description": "Per-phase token budget for lazy-loaded pipeline docs. Enforced by smoke-token-budget.sh.",
5
5
  "phases": {
6
- "phase-0-init": { "max_tokens": 12400, "warn_tokens": 10900 },
7
- "phase-1-analysis": { "max_tokens": 3750, "warn_tokens": 3300 },
8
- "phase-2-planning": { "max_tokens": 6500, "warn_tokens": 5750 },
9
- "phase-3-dev": { "max_tokens": 7900, "warn_tokens": 6950 },
10
- "phase-4-review": { "max_tokens": 13250, "warn_tokens": 11650 },
11
- "phase-5-test": { "max_tokens": 2550, "warn_tokens": 2250 },
12
- "phase-6-commit": { "max_tokens": 6150, "warn_tokens": 5400 },
13
- "phase-7-report": { "max_tokens": 5600, "warn_tokens": 4950 }
6
+ "phase-0-init": { "max_tokens": 12400, "warn_tokens": 10900 },
7
+ "phase-1-analysis": { "max_tokens": 3750, "warn_tokens": 3300 },
8
+ "phase-2-planning": { "max_tokens": 6500, "warn_tokens": 5750 },
9
+ "phase-3-dev": { "max_tokens": 7900, "warn_tokens": 6950 },
10
+ "phase-4-review": { "max_tokens": 13250, "warn_tokens": 11650 },
11
+ "phase-5-test": { "max_tokens": 2550, "warn_tokens": 2250 },
12
+ "phase-6-commit": { "max_tokens": 6150, "warn_tokens": 5400 },
13
+ "phase-7-report": { "max_tokens": 5600, "warn_tokens": 4950 }
14
14
  },
15
15
  "total_max_tokens": 51000,
16
16
  "note": "Token estimate = ceil(chars / 4). Per-phase budget rule: warn = current+10% (rounded to nearest 50), max = current+25%. Gives ~6 edit cycles of headroom before warn trips - intentionally quiet under normal maintenance, loud when a phase grows unusually. Only the active phase is loaded (lazy). Recalibrated at v10.0.0 after the validator/consistency/simplifier/lesson gate contracts landed in phases 1-4. Recalibrated again at v10.9.0 after the verify-by-test (Phase 4 Step 3.7), update-check (Phase 0 Step 0.6), immutable-test (Phase 3 GREEN) and redTests re-entry contracts landed - Step 3.7 prose was compressed to a pointer into refs/features/verify-by-test.md before the recalibration. Total bumped 50000 -> 51000 at v12.5.0 after the worktree residue/traversal-prune contract (Phase 0 + Phase 5 heal) and the Reflexion causal-diagnosis contract (Phase 4 lesson memory) landed; the prose was compressed first (161 tokens reclaimed) and every per-phase max still passes - only the aggregate needed room."
@@ -24,7 +24,7 @@
24
24
  "file": { "type": "string" },
25
25
  "line": { "type": ["integer", "null"] },
26
26
  "issue": { "type": "string", "minLength": 1 },
27
- "fix": { "type": ["string", "null"] },
27
+ "fix": { "type": ["string", "null"] },
28
28
  "reason": { "type": ["string", "null"] },
29
29
  "reviewer": { "type": ["string", "null"] },
30
30
  "file_sha": {
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # _smoke-root.sh - resolve the pipeline tree for a smoke that must run in BOTH
4
+ # the repo checkout and an end-user install.
5
+ #
6
+ # Why this exists: the repo and an install have different shapes.
7
+ #
8
+ # repo checkout install (~/.claude or ~/.copilot)
9
+ # ------------------ --------------------------------
10
+ # pipeline/scripts/ scripts/
11
+ # pipeline/schemas/ schemas/
12
+ # pipeline/multi-agent-refs/ multi-agent-refs/
13
+ # pipeline/commands/ commands/
14
+ # package.json (absent)
15
+ #
16
+ # A smoke that hardcodes `REPO_ROOT="$(dirname "$0")/../.."` and then reads
17
+ # `$REPO_ROOT/pipeline/...` resolves to `$HOME/pipeline/...` once installed, so
18
+ # every path check fails. Whoever ran it sees a red report and concludes the
19
+ # install is broken. Source this file instead and read the MA_* variables.
20
+ #
21
+ # Usage (from any script in pipeline/scripts/):
22
+ # . "$(dirname "${BASH_SOURCE[0]}")/_smoke-root.sh"
23
+ # grep -q needle "$MA_REFS/phases/phase-4-review.md"
24
+ #
25
+ # Exports:
26
+ # MA_LAYOUT "repo" | "install"
27
+ # MA_ROOT repo root, or the install root (~/.claude)
28
+ # MA_SCRIPTS directory holding this script
29
+ # MA_SCHEMAS JSON schemas
30
+ # MA_REFS multi-agent-refs
31
+ # MA_COMMANDS slash-command tree
32
+ # MA_SKILLS skills tree
33
+ #
34
+ # Every exported directory is verified to exist; a missing one is left empty so
35
+ # the caller can skip that check rather than report a false failure.
36
+
37
+ MA_SCRIPTS="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
38
+
39
+ # The repo is the only layout with pipeline/ beside package.json. Checking both
40
+ # rules out an install that happens to sit next to an unrelated pipeline/ dir.
41
+ _ma_candidate="$(cd "$MA_SCRIPTS/../.." && pwd)"
42
+ if [ -f "$_ma_candidate/package.json" ] && [ -d "$_ma_candidate/pipeline" ]; then
43
+ MA_LAYOUT="repo"
44
+ MA_ROOT="$_ma_candidate"
45
+ _ma_base="$_ma_candidate/pipeline"
46
+ else
47
+ MA_LAYOUT="install"
48
+ MA_ROOT="$(cd "$MA_SCRIPTS/.." && pwd)"
49
+ _ma_base="$MA_ROOT"
50
+ fi
51
+ unset _ma_candidate
52
+
53
+ _ma_dir() { [ -d "$1" ] && echo "$1" || echo ""; }
54
+
55
+ MA_SCHEMAS="$(_ma_dir "$_ma_base/schemas")"
56
+ MA_REFS="$(_ma_dir "$_ma_base/multi-agent-refs")"
57
+ MA_COMMANDS="$(_ma_dir "$_ma_base/commands")"
58
+ MA_SKILLS="$(_ma_dir "$_ma_base/skills")"
59
+ unset _ma_base
60
+
61
+ export MA_LAYOUT MA_ROOT MA_SCRIPTS MA_SCHEMAS MA_REFS MA_COMMANDS MA_SKILLS
@@ -230,7 +230,9 @@ if (opts.markdown) {
230
230
  const lines = [];
231
231
  lines.push(`# Pipeline Metrics Summary`);
232
232
  lines.push(``);
233
- lines.push(`_Source: \`${summary.source}\` · Events: ${summary.total_events} (${summary.parse_errors} parse errors) · Unique tasks: ${summary.unique_tasks}_`);
233
+ lines.push(
234
+ `_Source: \`${summary.source}\` · Events: ${summary.total_events} (${summary.parse_errors} parse errors) · Unique tasks: ${summary.unique_tasks}_`,
235
+ );
234
236
  lines.push(``);
235
237
  lines.push(`## Reviews`);
236
238
  lines.push(``);
@@ -245,9 +247,13 @@ if (opts.markdown) {
245
247
  lines.push(`| Category | Count | Rate |`);
246
248
  lines.push(`|----------|-------|------|`);
247
249
  lines.push(`| Raw findings | ${summary.triage_totals.raw} | - |`);
248
- lines.push(`| Accepted | ${summary.triage_totals.accepted} | ${summary.triage_totals.accept_rate ?? " - "} |`);
250
+ lines.push(
251
+ `| Accepted | ${summary.triage_totals.accepted} | ${summary.triage_totals.accept_rate ?? " - "} |`,
252
+ );
249
253
  lines.push(`| Deferred | ${summary.triage_totals.deferred} | - |`);
250
- lines.push(`| Rejected | ${summary.triage_totals.rejected} | ${summary.triage_totals.reject_rate ?? " - "} |`);
254
+ lines.push(
255
+ `| Rejected | ${summary.triage_totals.rejected} | ${summary.triage_totals.reject_rate ?? " - "} |`,
256
+ );
251
257
 
252
258
  if (Object.keys(summary.edge_cases).length) {
253
259
  lines.push(``);
@@ -266,14 +272,20 @@ if (opts.markdown) {
266
272
  lines.push(``);
267
273
  lines.push(`| Model | Calls | Duration (ms) | Tokens In | Tokens Out | Cached | Cache % |`);
268
274
  lines.push(`|-------|-------|---------------|-----------|------------|--------|---------|`);
269
- for (const [m, t] of Object.entries(summary.cost_per_model).sort((a, b) => b[1].calls - a[1].calls)) {
275
+ for (const [m, t] of Object.entries(summary.cost_per_model).sort(
276
+ (a, b) => b[1].calls - a[1].calls,
277
+ )) {
270
278
  const pct = t.cache_ratio === null ? " - " : `${Math.round(t.cache_ratio * 100)}%`;
271
- lines.push(`| \`${m}\` | ${t.calls} | ${t.duration_ms} | ${t.tokens_in} | ${t.tokens_out} | ${t.tokens_cached} | ${pct} |`);
279
+ lines.push(
280
+ `| \`${m}\` | ${t.calls} | ${t.duration_ms} | ${t.tokens_in} | ${t.tokens_out} | ${t.tokens_cached} | ${pct} |`,
281
+ );
272
282
  }
273
283
  const oc = summary.cache_reuse;
274
284
  const ocPct = oc.cache_ratio === null ? " - " : `${Math.round(oc.cache_ratio * 100)}%`;
275
285
  lines.push(``);
276
- lines.push(`_Overall prompt-cache reuse: ${oc.tokens_cached.toLocaleString()} cached / ${(oc.tokens_in + oc.tokens_cached).toLocaleString()} total input tokens = **${ocPct}**._`);
286
+ lines.push(
287
+ `_Overall prompt-cache reuse: ${oc.tokens_cached.toLocaleString()} cached / ${(oc.tokens_in + oc.tokens_cached).toLocaleString()} total input tokens = **${ocPct}**._`,
288
+ );
277
289
  }
278
290
  console.log(lines.join("\n"));
279
291
  process.exit(0);
@@ -80,3 +80,28 @@ LINE="{\"ts\":\"${TS}\",\"event\":\"$(json_escape "$EVENT")\",\"service\":\"$(js
80
80
  LINE="${LINE}}"
81
81
 
82
82
  echo "$LINE" >> "$AUDIT_FILE" 2>/dev/null || true
83
+
84
+ # Opportunistic rotation. audit-log-rotate.sh documents a launchd/cron install,
85
+ # but nothing ever told a user to set that up, so an unrotated trail would grow
86
+ # without bound now that credential-store.sh writes an event on every PAT lookup.
87
+ # Self-triggering removes the operator step: check a cheap size threshold and hand
88
+ # off to the real rotator, which is atomic against concurrent appenders (it moves
89
+ # the live inode first). Silent and non-blocking - telemetry never fails a run.
90
+ ROTATE_AT_BYTES="${AUDIT_ROTATE_AT_BYTES:-1048576}"
91
+ _audit_size() {
92
+ case "$(uname -s)" in
93
+ Darwin|*BSD*) stat -f %z "$1" 2>/dev/null || echo 0 ;;
94
+ *) stat -c %s "$1" 2>/dev/null || echo 0 ;;
95
+ esac
96
+ }
97
+ if [ "${AUDIT_SELF_ROTATE:-1}" = "1" ] && [ -f "$AUDIT_FILE" ]; then
98
+ SIZE="$(_audit_size "$AUDIT_FILE")"
99
+ if [ "${SIZE:-0}" -ge "$ROTATE_AT_BYTES" ]; then
100
+ ROTATOR="$(dirname "${BASH_SOURCE[0]:-$0}")/audit-log-rotate.sh"
101
+ # The rotator derives AUDIT_FILE from AUDIT_DIR, so pass the DIRECTORY.
102
+ # Handing it AUDIT_FILE would leave it rotating the default path while a
103
+ # caller-overridden trail kept growing.
104
+ [ -f "$ROTATOR" ] &&
105
+ AUDIT_DIR="$(dirname "$AUDIT_FILE")" bash "$ROTATOR" >/dev/null 2>&1 || true
106
+ fi
107
+ fi
@@ -40,7 +40,11 @@ function* walkSkills(dir) {
40
40
  for (const entry of readdirSync(dir)) {
41
41
  const full = join(dir, entry);
42
42
  let st;
43
- try { st = statSync(full); } catch { continue; }
43
+ try {
44
+ st = statSync(full);
45
+ } catch {
46
+ continue;
47
+ }
44
48
  if (st.isDirectory()) yield* walkSkills(full);
45
49
  else if (entry === "SKILL.md") yield full;
46
50
  }
@@ -56,7 +60,7 @@ function parseFrontmatter(raw) {
56
60
  const m = line.match(/^([\w-]+):\s*(.*)$/);
57
61
  if (!m) continue;
58
62
  let value = m[2].trim();
59
- if (value.startsWith("\"") && value.endsWith("\"")) value = value.slice(1, -1);
63
+ if (value.startsWith('"') && value.endsWith('"')) value = value.slice(1, -1);
60
64
  out[m[1]] = value;
61
65
  }
62
66
  return out;
@@ -10,7 +10,7 @@
10
10
  * publish artifact.
11
11
  *
12
12
  * The authored lifecycle skills (index / reference / workflow / tools) live in the
13
- * plugin repo and are NEVER touched here only the `knowledge/` layer + plugin.json
13
+ * plugin repo and are NEVER touched here - only the `knowledge/` layer + plugin.json
14
14
  * knowledge entries are regenerated.
15
15
  *
16
16
  * Routing uses the per-stack skill patterns (formerly carried by stack-swap.sh). Genuinely cross-stack
@@ -23,37 +23,83 @@
23
23
  * Exit code 0 always (report-only); prints a JSON-ish summary + per-plugin diff.
24
24
  */
25
25
  import {
26
- readdirSync, existsSync, rmSync, cpSync, readFileSync, writeFileSync, mkdirSync, statSync,
27
- } from 'node:fs';
28
- import { join } from 'node:path';
26
+ readdirSync,
27
+ existsSync,
28
+ rmSync,
29
+ cpSync,
30
+ readFileSync,
31
+ writeFileSync,
32
+ mkdirSync,
33
+ statSync,
34
+ } from "node:fs";
35
+ import { join } from "node:path";
29
36
 
30
37
  const args = process.argv.slice(2);
31
- const getArg = (k, d) => { const i = args.indexOf(k); return i >= 0 ? args[i + 1] : d; };
38
+ const getArg = (k, d) => {
39
+ const i = args.indexOf(k);
40
+ return i >= 0 ? args[i + 1] : d;
41
+ };
32
42
  const HOME = process.env.HOME;
33
- const PLUGINS_REPO = getArg('--plugins-repo', join(HOME, 'multi-agent-plugins'));
34
- const PIPE_ROOT = getArg('--pipeline', join(HOME, 'multi-agent-pipeline'));
35
- const EXTERNAL = join(PIPE_ROOT, 'pipeline/skills/shared/external');
36
- const DRY = args.includes('--dry-run');
43
+ const PLUGINS_REPO = getArg("--plugins-repo", join(HOME, "multi-agent-plugins"));
44
+ const PIPE_ROOT = getArg("--pipeline", join(HOME, "multi-agent-pipeline"));
45
+ const EXTERNAL = join(PIPE_ROOT, "pipeline/skills/shared/external");
46
+ const DRY = args.includes("--dry-run");
37
47
 
38
- const COMMON_PLUGIN = 'ai-common-engineering-toolkit';
39
- const COMMON_SKILLS = ['accessibility-compliance-accessibility-audit', 'firebase', 'humanizer', 'council', 'search-first', 'agent-introspection-debugging', 'skill-creator', 'backlog'];
48
+ const COMMON_PLUGIN = "ai-common-engineering-toolkit";
49
+ const COMMON_SKILLS = [
50
+ "accessibility-compliance-accessibility-audit",
51
+ "firebase",
52
+ "humanizer",
53
+ "council",
54
+ "search-first",
55
+ "agent-introspection-debugging",
56
+ "skill-creator",
57
+ "backlog",
58
+ ];
40
59
 
41
60
  // Apple/Xcode-only skills that match no stack pattern → iOS plugin only.
42
61
  const APPLE_ONLY = [
43
- 'avkit', 'cryptokit', 'metrickit-diagnostics', 'pdfkit', 'spm-build-analysis',
44
- 'swiftlint', 'xcode-build-benchmark', 'xcode-build-fixer', 'xcode-build-orchestrator',
45
- 'xcode-compilation-analyzer', 'xcode-project-analyzer',
62
+ "avkit",
63
+ "cryptokit",
64
+ "metrickit-diagnostics",
65
+ "pdfkit",
66
+ "spm-build-analysis",
67
+ "swiftlint",
68
+ "xcode-build-benchmark",
69
+ "xcode-build-fixer",
70
+ "xcode-build-orchestrator",
71
+ "xcode-compilation-analyzer",
72
+ "xcode-project-analyzer",
46
73
  ];
47
74
 
48
75
  // stack → matching pattern (per-stack routing patterns (formerly in stack-swap.sh))
76
+ //
77
+ // A skill lands in every plugin whose pattern it matches, so a bare substring
78
+ // alternative that is also a suffix of another stack's skill name silently ships
79
+ // that skill twice. `architecture` did exactly that: it pulled
80
+ // `android-architecture` and `swift-architecture` into ai-backend-toolkit
81
+ // alongside their correct plugins, so a backend project loading the toolkit got
82
+ // Compose and SwiftUI architecture skills. It is anchored to the exact name now.
83
+ // Keep any new single-word alternative anchored unless it genuinely reads as a
84
+ // substring across stacks.
49
85
  const STACK_PATTERNS = {
50
- 'ai-ios-engineering-toolkit': /(swiftui|swift-|ios-|hig-|apple-|storekit|widgetkit|healthkit|homekit|mapkit|musickit|passkit|pencilkit|realitykit|weatherkit|alarmkit|callkit|cloudkit|coreml|core-|eventkit|energykit|permissionkit|tipkit|shareplay|live-activities|background-processing|app-store|app-clips|app-intents|authentication|contacts-framework|device-integrity|macos-|natural-language|photos-camera|push-notifications|speech-recognition|swiftdata|vision-framework|debugging-instruments|help-skills)/i,
51
- 'ai-android-engineering-toolkit': /(android|compose-|kotlin-|room-database|retrofit-|gradle-|play-store)/i,
52
- 'ai-backend-toolkit': /(fastapi|nodejs|docker|api-pattern|api-security|github-actions|observability|architecture|monorepo|clean-code|debugging-strategies|agentflow|closed-loop|context-compression|python-patterns|database-patterns|rest-api-design|testing-backend|ci-cd-pipelines)/i,
53
- 'ai-frontend-engineering-toolkit': /(react-|nextjs-|typescript-|tailwind-|vue-|web-accessibility|web-performance|css-modern|web-testing|html-semantic)/i,
86
+ "ai-ios-engineering-toolkit":
87
+ /(swiftui|swift-|ios-|hig-|apple-|storekit|widgetkit|healthkit|homekit|mapkit|musickit|passkit|pencilkit|realitykit|weatherkit|alarmkit|callkit|cloudkit|coreml|core-|eventkit|energykit|permissionkit|tipkit|shareplay|live-activities|background-processing|app-store|app-clips|app-intents|authentication|contacts-framework|device-integrity|macos-|natural-language|photos-camera|push-notifications|speech-recognition|swiftdata|vision-framework|debugging-instruments|help-skills)/i,
88
+ "ai-android-engineering-toolkit":
89
+ /(android|compose-|kotlin-|room-database|retrofit-|gradle-|play-store)/i,
90
+ "ai-backend-toolkit":
91
+ /(fastapi|nodejs|docker|api-pattern|api-security|github-actions|observability|^architecture$|monorepo|clean-code|debugging-strategies|agentflow|closed-loop|context-compression|python-patterns|database-patterns|rest-api-design|testing-backend|ci-cd-pipelines)/i,
92
+ "ai-frontend-engineering-toolkit":
93
+ /(react-|nextjs-|typescript-|tailwind-|vue-|web-accessibility|web-performance|css-modern|web-testing|html-semantic)/i,
54
94
  };
55
95
 
56
- const isDir = (p) => { try { return statSync(p).isDirectory(); } catch { return false; } };
96
+ const isDir = (p) => {
97
+ try {
98
+ return statSync(p).isDirectory();
99
+ } catch {
100
+ return false;
101
+ }
102
+ };
57
103
  const listDirs = (p) => (existsSync(p) ? readdirSync(p).filter((n) => isDir(join(p, n))) : []);
58
104
 
59
105
  // --- 1. enumerate authoring source ---------------------------------------
@@ -69,22 +115,67 @@ for (const p of Object.keys(STACK_PATTERNS)) desired[p] = new Set();
69
115
 
70
116
  const unrouted = [];
71
117
  for (const skill of allSkills) {
72
- if (COMMON_SKILLS.includes(skill)) { desired[COMMON_PLUGIN].add(skill); continue; }
73
- if (APPLE_ONLY.includes(skill)) { desired['ai-ios-engineering-toolkit'].add(skill); continue; }
118
+ if (COMMON_SKILLS.includes(skill)) {
119
+ desired[COMMON_PLUGIN].add(skill);
120
+ continue;
121
+ }
122
+ if (APPLE_ONLY.includes(skill)) {
123
+ desired["ai-ios-engineering-toolkit"].add(skill);
124
+ continue;
125
+ }
74
126
  let matched = false;
75
127
  for (const [plugin, re] of Object.entries(STACK_PATTERNS)) {
76
- if (re.test(skill)) { desired[plugin].add(skill); matched = true; }
128
+ if (re.test(skill)) {
129
+ desired[plugin].add(skill);
130
+ matched = true;
131
+ }
77
132
  }
78
133
  if (!matched) unrouted.push(skill);
79
134
  }
80
135
 
136
+ // --- 2b. routing audit ---------------------------------------------------
137
+ // The loop above adds a skill to EVERY plugin whose pattern matches, so a bare
138
+ // substring alternative that also reads as a suffix of another stack's skill
139
+ // name ships that skill into two plugins. `architecture` did that to
140
+ // android-architecture and swift-architecture, which is how ai-backend-toolkit
141
+ // came to carry Compose and SwiftUI guidance.
142
+ //
143
+ // --check-routing runs this audit alone. It reads nothing but the authoring
144
+ // source in this repo, so CI can gate it without a checkout of the plugins repo.
145
+ const multiRouted = [];
146
+ for (const skill of allSkills) {
147
+ if (COMMON_SKILLS.includes(skill) || APPLE_ONLY.includes(skill)) continue;
148
+ const owners = Object.entries(STACK_PATTERNS)
149
+ .filter(([, re]) => re.test(skill))
150
+ .map(([p]) => p);
151
+ if (owners.length > 1) multiRouted.push(`${skill} -> ${owners.join(" + ")}`);
152
+ }
153
+
154
+ if (args.includes("--check-routing")) {
155
+ if (multiRouted.length) {
156
+ console.error(
157
+ `check-routing: ${multiRouted.length} skill(s) routed to more than one stack plugin`,
158
+ );
159
+ for (const m of multiRouted) console.error(` FAIL ${m}`);
160
+ console.error("fix: anchor the offending STACK_PATTERNS alternative to the exact skill name");
161
+ process.exit(1);
162
+ }
163
+ console.log(
164
+ `check-routing: clean (${allSkills.length} skills, ${unrouted.length} unrouted, 0 multi-routed)`,
165
+ );
166
+ process.exit(0);
167
+ }
168
+
81
169
  // --- 3. sync each plugin's knowledge/ + regenerate plugin.json -----------
82
170
  const report = [];
83
171
  for (const [plugin, want] of Object.entries(desired)) {
84
- const pdir = join(PLUGINS_REPO, 'plugins', plugin);
85
- const kdir = join(pdir, 'skills', 'knowledge');
86
- const pjPath = join(pdir, '.claude-plugin', 'plugin.json');
87
- if (!existsSync(pjPath)) { report.push({ plugin, error: 'plugin.json missing' }); continue; }
172
+ const pdir = join(PLUGINS_REPO, "plugins", plugin);
173
+ const kdir = join(pdir, "skills", "knowledge");
174
+ const pjPath = join(pdir, ".claude-plugin", "plugin.json");
175
+ if (!existsSync(pjPath)) {
176
+ report.push({ plugin, error: "plugin.json missing" });
177
+ continue;
178
+ }
88
179
 
89
180
  const have = new Set(listDirs(kdir));
90
181
  const toAdd = [...want].filter((s) => !have.has(s)).sort();
@@ -98,16 +189,16 @@ for (const [plugin, want] of Object.entries(desired)) {
98
189
  }
99
190
 
100
191
  // regenerate plugin.json skills[]: keep non-knowledge entries, rebuild knowledge set
101
- const pj = JSON.parse(readFileSync(pjPath, 'utf8'));
102
- const nonKnowledge = (pj.skills || []).filter((s) => !s.startsWith('./skills/knowledge/'));
192
+ const pj = JSON.parse(readFileSync(pjPath, "utf8"));
193
+ const nonKnowledge = (pj.skills || []).filter((s) => !s.startsWith("./skills/knowledge/"));
103
194
  const finalKnowledge = (DRY ? [...want] : listDirs(kdir)).map((s) => `./skills/knowledge/${s}`);
104
195
  const newSkills = [...new Set([...nonKnowledge, ...finalKnowledge])].sort();
105
196
  const skillsChanged = JSON.stringify(pj.skills) !== JSON.stringify(newSkills);
106
197
 
107
- const oldV = pj.version || '0.1.0';
198
+ const oldV = pj.version || "0.1.0";
108
199
  let newV = oldV;
109
200
  if (changed || skillsChanged) {
110
- const [maj, min, patch] = oldV.split('.').map((n) => parseInt(n, 10) || 0);
201
+ const [maj, min, patch] = oldV.split(".").map((n) => parseInt(n, 10) || 0);
111
202
  newV = `${maj}.${min}.${patch + 1}`;
112
203
  }
113
204
  if (!DRY && (changed || skillsChanged)) {
@@ -115,23 +206,35 @@ for (const [plugin, want] of Object.entries(desired)) {
115
206
  pj.version = newV;
116
207
  writeFileSync(pjPath, `${JSON.stringify(pj, null, 2)}\n`);
117
208
  }
118
- report.push({ plugin, added: toAdd, removed: toRemove, skillCount: newSkills.length, version: oldV === newV ? oldV : `${oldV} → ${newV}`, bumped: oldV !== newV });
209
+ report.push({
210
+ plugin,
211
+ added: toAdd,
212
+ removed: toRemove,
213
+ skillCount: newSkills.length,
214
+ version: oldV === newV ? oldV : `${oldV} → ${newV}`,
215
+ bumped: oldV !== newV,
216
+ });
119
217
  }
120
218
 
121
219
  // --- 4. report ------------------------------------------------------------
122
- console.log(`build-stack-plugins ${DRY ? '(dry-run)' : ''}`);
220
+ console.log(`build-stack-plugins ${DRY ? "(dry-run)" : ""}`);
123
221
  console.log(`source: ${EXTERNAL} (${allSkills.length} skills)`);
124
222
  console.log(`target: ${PLUGINS_REPO}`);
125
223
  for (const r of report) {
126
- if (r.error) { console.log(` ✗ ${r.plugin}: ${r.error}`); continue; }
127
- const flag = r.bumped ? 'BUMPED' : 'unchanged';
224
+ if (r.error) {
225
+ console.log(` ${r.plugin}: ${r.error}`);
226
+ continue;
227
+ }
228
+ const flag = r.bumped ? "BUMPED" : "unchanged";
128
229
  console.log(` ${r.plugin}: skills=${r.skillCount} version=${r.version} [${flag}]`);
129
- if (r.added.length) console.log(` + ${r.added.join(', ')}`);
130
- if (r.removed.length) console.log(` - ${r.removed.join(', ')}`);
230
+ if (r.added.length) console.log(` + ${r.added.join(", ")}`);
231
+ if (r.removed.length) console.log(` - ${r.removed.join(", ")}`);
131
232
  }
132
233
  if (unrouted.length) {
133
- console.log(` ⚠ unrouted (matched no stack, not common/apple-only) NOT copied anywhere:`);
134
- console.log(` ${unrouted.join(', ')}`);
234
+ console.log(` ⚠ unrouted (matched no stack, not common/apple-only) - NOT copied anywhere:`);
235
+ console.log(` ${unrouted.join(", ")}`);
135
236
  }
136
237
  const anyBump = report.some((r) => r.bumped);
137
- console.log(anyBump ? 'result: changes detected (versions bumped)' : 'result: all plugins up to date');
238
+ console.log(
239
+ anyBump ? "result: changes detected (versions bumped)" : "result: all plugins up to date",
240
+ );