@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
@@ -26,10 +26,10 @@
26
26
  // 2 - usage / arg error
27
27
  // 3 - root directory missing / not a repo
28
28
 
29
- import { promises as fs } from 'node:fs';
30
- import { existsSync, statSync } from 'node:fs';
31
- import path from 'node:path';
32
- import process from 'node:process';
29
+ import { promises as fs } from "node:fs";
30
+ import { existsSync, statSync } from "node:fs";
31
+ import path from "node:path";
32
+ import process from "node:process";
33
33
 
34
34
  // ---- CLI args --------------------------------------------------------------
35
35
 
@@ -38,25 +38,25 @@ function parseArgs(argv) {
38
38
  root: process.cwd(),
39
39
  budget: 2000,
40
40
  top: 25,
41
- format: 'md',
41
+ format: "md",
42
42
  include: null,
43
43
  exclude: null,
44
44
  verbose: false,
45
45
  };
46
46
  for (let i = 2; i < argv.length; i++) {
47
47
  const a = argv[i];
48
- if (a === '--root') args.root = path.resolve(argv[++i]);
49
- else if (a === '--budget') args.budget = parseInt(argv[++i], 10);
50
- else if (a === '--top') args.top = parseInt(argv[++i], 10);
51
- else if (a === '--format') args.format = argv[++i];
52
- else if (a === '--include') args.include = argv[++i].split(',').filter(Boolean);
53
- else if (a === '--exclude') args.exclude = argv[++i].split(',').filter(Boolean);
54
- else if (a === '--verbose' || a === '-v') args.verbose = true;
55
- else if (a === '--help' || a === '-h') {
48
+ if (a === "--root") args.root = path.resolve(argv[++i]);
49
+ else if (a === "--budget") args.budget = parseInt(argv[++i], 10);
50
+ else if (a === "--top") args.top = parseInt(argv[++i], 10);
51
+ else if (a === "--format") args.format = argv[++i];
52
+ else if (a === "--include") args.include = argv[++i].split(",").filter(Boolean);
53
+ else if (a === "--exclude") args.exclude = argv[++i].split(",").filter(Boolean);
54
+ else if (a === "--verbose" || a === "-v") args.verbose = true;
55
+ else if (a === "--help" || a === "-h") {
56
56
  console.log(
57
- 'usage: repo-map.mjs [--root DIR] [--budget TOKENS] [--top N]\n' +
58
- ' [--format md|json] [--include GLOB,...]\n' +
59
- ' [--exclude GLOB,...] [--verbose]'
57
+ "usage: repo-map.mjs [--root DIR] [--budget TOKENS] [--top N]\n" +
58
+ " [--format md|json] [--include GLOB,...]\n" +
59
+ " [--exclude GLOB,...] [--verbose]",
60
60
  );
61
61
  process.exit(0);
62
62
  } else {
@@ -64,16 +64,16 @@ function parseArgs(argv) {
64
64
  process.exit(2);
65
65
  }
66
66
  }
67
- if (!['md', 'json'].includes(args.format)) {
67
+ if (!["md", "json"].includes(args.format)) {
68
68
  console.error(`repo-map: --format must be md or json (got "${args.format}")`);
69
69
  process.exit(2);
70
70
  }
71
71
  if (!Number.isFinite(args.budget) || args.budget < 100) {
72
- console.error('repo-map: --budget must be an integer >= 100');
72
+ console.error("repo-map: --budget must be an integer >= 100");
73
73
  process.exit(2);
74
74
  }
75
75
  if (!Number.isFinite(args.top) || args.top < 1) {
76
- console.error('repo-map: --top must be >= 1');
76
+ console.error("repo-map: --top must be >= 1");
77
77
  process.exit(2);
78
78
  }
79
79
  return args;
@@ -82,24 +82,38 @@ function parseArgs(argv) {
82
82
  // ---- File walking ----------------------------------------------------------
83
83
 
84
84
  const DEFAULT_IGNORE = new Set([
85
- '.git', '.worktrees', 'node_modules', 'Pods', '.build', 'DerivedData', '.next',
86
- 'dist', 'build', '__pycache__', '.venv', 'venv', '.cache',
87
- '.gradle', '.idea', '.vscode', 'target',
85
+ ".git",
86
+ ".worktrees",
87
+ "node_modules",
88
+ "Pods",
89
+ ".build",
90
+ "DerivedData",
91
+ ".next",
92
+ "dist",
93
+ "build",
94
+ "__pycache__",
95
+ ".venv",
96
+ "venv",
97
+ ".cache",
98
+ ".gradle",
99
+ ".idea",
100
+ ".vscode",
101
+ "target",
88
102
  ]);
89
103
 
90
104
  const LANG_EXT = {
91
- '.swift': 'swift',
92
- '.kt': 'kotlin',
93
- '.kts': 'kotlin',
94
- '.ts': 'ts',
95
- '.tsx': 'ts',
96
- '.js': 'js',
97
- '.mjs': 'js',
98
- '.cjs': 'js',
99
- '.jsx': 'js',
100
- '.py': 'python',
101
- '.sh': 'bash',
102
- '.bash': 'bash',
105
+ ".swift": "swift",
106
+ ".kt": "kotlin",
107
+ ".kts": "kotlin",
108
+ ".ts": "ts",
109
+ ".tsx": "ts",
110
+ ".js": "js",
111
+ ".mjs": "js",
112
+ ".cjs": "js",
113
+ ".jsx": "js",
114
+ ".py": "python",
115
+ ".sh": "bash",
116
+ ".bash": "bash",
103
117
  };
104
118
 
105
119
  async function walk(root, args) {
@@ -112,7 +126,7 @@ async function walk(root, args) {
112
126
  return;
113
127
  }
114
128
  for (const e of entries) {
115
- if (e.name.startsWith('.') && DEFAULT_IGNORE.has(e.name)) continue;
129
+ if (e.name.startsWith(".") && DEFAULT_IGNORE.has(e.name)) continue;
116
130
  if (DEFAULT_IGNORE.has(e.name)) continue;
117
131
  const full = path.join(dir, e.name);
118
132
  if (e.isDirectory()) {
@@ -151,8 +165,8 @@ const EXTRACTORS = {
151
165
  while ((m = re.exec(src))) {
152
166
  const kind = m[1];
153
167
  const name = m[2];
154
- const rest = (m[3] || '').trim();
155
- const signature = `${kind} ${name}${rest ? ' ' + rest : ''}`.trim();
168
+ const rest = (m[3] || "").trim();
169
+ const signature = `${kind} ${name}${rest ? " " + rest : ""}`.trim();
156
170
  out.push({ kind, name, signature: truncateSig(signature) });
157
171
  }
158
172
  return out;
@@ -165,8 +179,8 @@ const EXTRACTORS = {
165
179
  while ((m = re.exec(src))) {
166
180
  const kind = m[1];
167
181
  const name = m[2];
168
- const rest = (m[3] || '').trim();
169
- const signature = `${kind} ${name}${rest ? ' ' + rest : ''}`.trim();
182
+ const rest = (m[3] || "").trim();
183
+ const signature = `${kind} ${name}${rest ? " " + rest : ""}`.trim();
170
184
  out.push({ kind, name, signature: truncateSig(signature) });
171
185
  }
172
186
  return out;
@@ -179,8 +193,8 @@ const EXTRACTORS = {
179
193
  while ((m = re.exec(src))) {
180
194
  const kind = m[1];
181
195
  const name = m[2];
182
- const rest = (m[3] || '').trim();
183
- const signature = `export ${kind} ${name}${rest ? ' ' + rest : ''}`.trim();
196
+ const rest = (m[3] || "").trim();
197
+ const signature = `export ${kind} ${name}${rest ? " " + rest : ""}`.trim();
184
198
  out.push({ kind, name, signature: truncateSig(signature) });
185
199
  }
186
200
  return out;
@@ -188,13 +202,12 @@ const EXTRACTORS = {
188
202
  js: (src) => EXTRACTORS.ts(src),
189
203
  python: (src) => {
190
204
  const out = [];
191
- const re =
192
- /^(?:\s{0,4})(?:async\s+)?(class|def)\s+([A-Za-z_][A-Za-z0-9_]*)(\([^)]*\))?/gm;
205
+ const re = /^(?:\s{0,4})(?:async\s+)?(class|def)\s+([A-Za-z_][A-Za-z0-9_]*)(\([^)]*\))?/gm;
193
206
  let m;
194
207
  while ((m = re.exec(src))) {
195
208
  const kind = m[1];
196
209
  const name = m[2];
197
- const rest = (m[3] || '').trim();
210
+ const rest = (m[3] || "").trim();
198
211
  const signature = `${kind} ${name}${rest}`.trim();
199
212
  out.push({ kind, name, signature: truncateSig(signature) });
200
213
  }
@@ -207,15 +220,15 @@ const EXTRACTORS = {
207
220
  let m;
208
221
  while ((m = re.exec(src))) {
209
222
  const name = m[1];
210
- out.push({ kind: 'fn', name, signature: `${name}()` });
223
+ out.push({ kind: "fn", name, signature: `${name}()` });
211
224
  }
212
225
  return out;
213
226
  },
214
227
  };
215
228
 
216
229
  function truncateSig(s, max = 100) {
217
- s = s.replace(/\s+/g, ' ').trim();
218
- return s.length > max ? s.slice(0, max - 1) + '...' : s;
230
+ s = s.replace(/\s+/g, " ").trim();
231
+ return s.length > max ? s.slice(0, max - 1) + "..." : s;
219
232
  }
220
233
 
221
234
  // ---- Pipeline --------------------------------------------------------------
@@ -228,8 +241,8 @@ async function buildMap(args) {
228
241
  const files = await walk(args.root, args);
229
242
  if (args.verbose) console.error(`repo-map: scanned ${files.length} source files`);
230
243
  if (files.length === 0) {
231
- if (args.format === 'json') console.log('[]');
232
- else console.log('');
244
+ if (args.format === "json") console.log("[]");
245
+ else console.log("");
233
246
  return;
234
247
  }
235
248
 
@@ -239,7 +252,7 @@ async function buildMap(args) {
239
252
  for (const f of files) {
240
253
  let src;
241
254
  try {
242
- src = await fs.readFile(f.abs, 'utf8');
255
+ src = await fs.readFile(f.abs, "utf8");
243
256
  } catch {
244
257
  continue;
245
258
  }
@@ -266,16 +279,49 @@ async function buildMap(args) {
266
279
 
267
280
  // Hard stop-list for sub-3-char + universally-shared shell helpers.
268
281
  const STOP_IDENTIFIERS = new Set([
269
- 'init', 'main', 'run', 'start', 'stop', 'pass', 'fail', 'warn', 'need',
270
- 'check', 'log', 'set', 'get', 'add', 'new', 'fix', 'has', 'is', 'on',
271
- 'self', 'this', 'next', 'prev', 'data', 'item', 'name', 'type', 'value',
272
- 'count', 'list', 'map', 'each', 'reduce', 'true', 'false', 'null', 'undefined',
282
+ "init",
283
+ "main",
284
+ "run",
285
+ "start",
286
+ "stop",
287
+ "pass",
288
+ "fail",
289
+ "warn",
290
+ "need",
291
+ "check",
292
+ "log",
293
+ "set",
294
+ "get",
295
+ "add",
296
+ "new",
297
+ "fix",
298
+ "has",
299
+ "is",
300
+ "on",
301
+ "self",
302
+ "this",
303
+ "next",
304
+ "prev",
305
+ "data",
306
+ "item",
307
+ "name",
308
+ "type",
309
+ "value",
310
+ "count",
311
+ "list",
312
+ "map",
313
+ "each",
314
+ "reduce",
315
+ "true",
316
+ "false",
317
+ "null",
318
+ "undefined",
273
319
  ]);
274
320
 
275
321
  for (const f of files) {
276
322
  let src;
277
323
  try {
278
- src = await fs.readFile(f.abs, 'utf8');
324
+ src = await fs.readFile(f.abs, "utf8");
279
325
  } catch {
280
326
  continue;
281
327
  }
@@ -283,7 +329,7 @@ async function buildMap(args) {
283
329
  if (name.length < 3) continue;
284
330
  if (STOP_IDENTIFIERS.has(name.toLowerCase())) continue;
285
331
  if (owners.size === 1 && owners.has(f.path)) continue;
286
- const re = new RegExp(`\\b${escapeRe(name)}\\b`, 'g');
332
+ const re = new RegExp(`\\b${escapeRe(name)}\\b`, "g");
287
333
  const matches = src.match(re);
288
334
  if (!matches) continue;
289
335
  // TF-IDF: credit per occurrence is divided by the number of owners.
@@ -313,7 +359,7 @@ async function buildMap(args) {
313
359
  ranks.sort((a, b) => b.score - a.score);
314
360
  const top = ranks.slice(0, args.top);
315
361
 
316
- if (args.format === 'json') {
362
+ if (args.format === "json") {
317
363
  const obj = top.map((r) => ({
318
364
  path: r.path,
319
365
  lang: r.lang,
@@ -329,7 +375,7 @@ async function buildMap(args) {
329
375
  const charBudget = args.budget * 4;
330
376
  const header = `# Repo Map (top ${args.top}, budget ${args.budget} tokens)\n`;
331
377
  let used = header.length;
332
- let out = header + '\n';
378
+ let out = header + "\n";
333
379
  let printed = 0;
334
380
 
335
381
  for (const r of top) {
@@ -338,16 +384,16 @@ async function buildMap(args) {
338
384
  const block =
339
385
  `## ${r.path} [rank ${r.normScore.toFixed(3)}, in_refs ${r.ins}]\n` +
340
386
  (filteredDecls.length === 0
341
- ? '_no top-level declarations extracted_\n'
342
- : filteredDecls.map((d) => `- ${d.signature}`).join('\n') + '\n') +
343
- '\n';
387
+ ? "_no top-level declarations extracted_\n"
388
+ : filteredDecls.map((d) => `- ${d.signature}`).join("\n") + "\n") +
389
+ "\n";
344
390
  if (used + block.length > charBudget && printed > 0) break;
345
391
  out += block;
346
392
  used += block.length;
347
393
  printed += 1;
348
394
  }
349
395
  if (printed === 0) {
350
- out += '_no files extracted within budget_\n';
396
+ out += "_no files extracted within budget_\n";
351
397
  } else if (printed < top.length) {
352
398
  out += `_truncated to ${printed} files (token budget)_\n`;
353
399
  }
@@ -355,13 +401,13 @@ async function buildMap(args) {
355
401
  }
356
402
 
357
403
  function escapeRe(s) {
358
- return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
404
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
359
405
  }
360
406
 
361
407
  // ---- Main ------------------------------------------------------------------
362
408
 
363
409
  const args = parseArgs(process.argv);
364
410
  buildMap(args).catch((err) => {
365
- console.error('repo-map: fatal - ', err.message);
411
+ console.error("repo-map: fatal - ", err.message);
366
412
  process.exit(1);
367
413
  });
@@ -63,7 +63,13 @@ function main() {
63
63
  try {
64
64
  report = JSON.parse(readInput());
65
65
  } catch {
66
- emit({ scope: "full", reason: "no-risk-data-fail-safe", churn: null, maxScore: null, blockers: [] });
66
+ emit({
67
+ scope: "full",
68
+ reason: "no-risk-data-fail-safe",
69
+ churn: null,
70
+ maxScore: null,
71
+ blockers: [],
72
+ });
67
73
  return;
68
74
  }
69
75
 
@@ -25,14 +25,7 @@
25
25
  //
26
26
  // Exit: 0 ok, 1 error (validation / collision / not-found), 64 usage.
27
27
 
28
- import {
29
- existsSync,
30
- readFileSync,
31
- writeFileSync,
32
- mkdirSync,
33
- rmSync,
34
- renameSync,
35
- } from "node:fs";
28
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, renameSync } from "node:fs";
36
29
  import { join, dirname } from "node:path";
37
30
 
38
31
  const NAME_RE = /^[a-z0-9][a-z0-9-]*$/;
@@ -200,7 +193,9 @@ function cmdRemove(home, name) {
200
193
  prefs.global.routines = routines;
201
194
  writePrefs(home, prefs);
202
195
  }
203
- console.log(`routine-registry: removed "${name}" (clears from autocomplete on next session reload)`);
196
+ console.log(
197
+ `routine-registry: removed "${name}" (clears from autocomplete on next session reload)`,
198
+ );
204
199
  }
205
200
 
206
201
  function main() {
@@ -120,7 +120,9 @@ function loadCostTable() {
120
120
  const path = flags["cost-table"] || join(__dirname, "cost-table.json");
121
121
  const tbl = loadJson(path);
122
122
  if (!tbl?.prices) {
123
- process.stderr.write(`run-aggregator: cost table missing or malformed at ${path}, costs will be 0\n`);
123
+ process.stderr.write(
124
+ `run-aggregator: cost table missing or malformed at ${path}, costs will be 0\n`,
125
+ );
124
126
  return { prices: {} };
125
127
  }
126
128
  return tbl;
@@ -211,8 +213,8 @@ for (const phase of tracker.phases || []) {
211
213
  phase.status === "completed"
212
214
  ? "phase.complete"
213
215
  : phase.status === "failed"
214
- ? "phase.failed"
215
- : "phase.transition";
216
+ ? "phase.failed"
217
+ : "phase.transition";
216
218
  events.push({
217
219
  kind: eventKind,
218
220
  ts: phase.completed_at,
@@ -262,7 +264,9 @@ const lastTs =
262
264
  .filter((e) => e.kind.startsWith("phase.complete") || e.kind === "phase.failed")
263
265
  .map((e) => e.ts)
264
266
  .sort()
265
- .pop() || tracker.started_at || "";
267
+ .pop() ||
268
+ tracker.started_at ||
269
+ "";
266
270
 
267
271
  events.push({
268
272
  kind: "run.end",
@@ -286,7 +290,9 @@ const summary = {
286
290
  };
287
291
 
288
292
  // ─────────────────────────────────────────────────────────────────────────
289
- const outLines = (flags["summary-only"] ? [summary] : [...events, summary]).map((e) => JSON.stringify(e));
293
+ const outLines = (flags["summary-only"] ? [summary] : [...events, summary]).map((e) =>
294
+ JSON.stringify(e),
295
+ );
290
296
  const outContent = outLines.join("\n") + "\n";
291
297
 
292
298
  if (flags.stdout) {
@@ -48,7 +48,9 @@ try {
48
48
  }
49
49
 
50
50
  let state;
51
- try { state = JSON.parse(raw); } catch (e) {
51
+ try {
52
+ state = JSON.parse(raw);
53
+ } catch (e) {
52
54
  console.error(`run-metrics: bad JSON: ${e.message}`);
53
55
  process.exit(2);
54
56
  }
@@ -58,7 +60,7 @@ try { state = JSON.parse(raw); } catch (e) {
58
60
  const iterations = Array.isArray(state.reviewIterations)
59
61
  ? state.reviewIterations.filter((it) => it && typeof it === "object")
60
62
  : [];
61
- const lastTriage = iterations.length ? (iterations[iterations.length - 1].triage || {}) : {};
63
+ const lastTriage = iterations.length ? iterations[iterations.length - 1].triage || {} : {};
62
64
 
63
65
  const accepted = Array.isArray(lastTriage.accepted) ? lastTriage.accepted : [];
64
66
  const deferred = Array.isArray(lastTriage.deferred) ? lastTriage.deferred : [];
@@ -78,18 +80,21 @@ let rawFindings = 0;
78
80
  let acceptedAll = 0;
79
81
  let classifiedAll = 0;
80
82
  for (const it of iterations) {
81
- for (const r of (Array.isArray(it.reviewers) ? it.reviewers : [])) {
83
+ for (const r of Array.isArray(it.reviewers) ? it.reviewers : []) {
82
84
  rawFindings += Array.isArray(r?.findings) ? r.findings.length : 0;
83
85
  }
84
86
  const t = it.triage || {};
85
87
  acceptedAll += Array.isArray(t.accepted) ? t.accepted.length : 0;
86
- classifiedAll += (Array.isArray(t.accepted) ? t.accepted.length : 0)
87
- + (Array.isArray(t.deferred) ? t.deferred.length : 0)
88
- + (Array.isArray(t.rejected) ? t.rejected.length : 0);
88
+ classifiedAll +=
89
+ (Array.isArray(t.accepted) ? t.accepted.length : 0) +
90
+ (Array.isArray(t.deferred) ? t.deferred.length : 0) +
91
+ (Array.isArray(t.rejected) ? t.rejected.length : 0);
89
92
  }
90
93
 
91
94
  // Build outcome across repos (multi-repo aware).
92
- const projects = Array.isArray(state.projects) ? state.projects.filter((p) => p && typeof p === "object") : [];
95
+ const projects = Array.isArray(state.projects)
96
+ ? state.projects.filter((p) => p && typeof p === "object")
97
+ : [];
93
98
  let buildPassed = null;
94
99
  if (projects.length) {
95
100
  buildPassed = projects.every((p) => {
@@ -100,7 +105,7 @@ if (projects.length) {
100
105
  });
101
106
  } else if (state.buildStatus !== undefined) {
102
107
  const b = state.buildStatus;
103
- buildPassed = typeof b === "string" ? b === "passed" : (b && b.ok === true);
108
+ buildPassed = typeof b === "string" ? b === "passed" : b && b.ok === true;
104
109
  }
105
110
 
106
111
  const metrics = {
@@ -190,22 +190,36 @@ fi
190
190
  # (the orchestrator dispatches per the doc), so lock the CONTRACT here against
191
191
  # drift across the phase doc, the schema, and the consensus block.
192
192
  echo "→ reviewer-count contract (Claude=2, Copilot=3)"
193
- REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
194
- P4="$REPO_ROOT/pipeline/multi-agent-refs/phases/phase-4-review.md"
195
- REVSCHEMA="$REPO_ROOT/pipeline/schemas/reviewer-output.schema.json"
196
- TRSCHEMA="$REPO_ROOT/pipeline/schemas/triage-output.schema.json"
197
- if grep -qiE "Claude Code (dispatches|=|:) ?2|2-model" "$P4" && grep -qiE "Copilot CLI (dispatches|=|:) ?3|3-model" "$P4"; then
193
+ # `/multi-agent:update` runs this smoke on the user's machine, where the tree is
194
+ # ~/.claude/{schemas,multi-agent-refs} and NOT <root>/pipeline/*. Resolving the
195
+ # root by hand here reported three phantom failures in an install, which reads as
196
+ # a broken installation. _smoke-root.sh handles both layouts.
197
+ # shellcheck source=pipeline/scripts/_smoke-root.sh
198
+ . "$(dirname "${BASH_SOURCE[0]}")/_smoke-root.sh"
199
+ P4="${MA_REFS:+$MA_REFS/phases/phase-4-review.md}"
200
+ REVSCHEMA="${MA_SCHEMAS:+$MA_SCHEMAS/reviewer-output.schema.json}"
201
+ TRSCHEMA="${MA_SCHEMAS:+$MA_SCHEMAS/triage-output.schema.json}"
202
+
203
+ if [ -z "$P4" ] || [ ! -f "$P4" ]; then
204
+ echo " ↷ SKIP: phase-4-review.md not present in this $MA_LAYOUT layout"
205
+ elif grep -qiE "Claude Code (dispatches|=|:) ?2|2-model" "$P4" && grep -qiE "Copilot CLI (dispatches|=|:) ?3|3-model" "$P4"; then
198
206
  pass "phase-4-review declares Claude=2 / Copilot=3 reviewers"
199
207
  else
200
208
  fail "phase-4-review does not declare the CLI-aware reviewer count"
201
209
  fi
202
- if grep -qi "Copilot CLI" "$REVSCHEMA" && grep -qi "Claude" "$REVSCHEMA"; then
210
+
211
+ if [ -z "$REVSCHEMA" ] || [ ! -f "$REVSCHEMA" ]; then
212
+ echo " ↷ SKIP: reviewer-output.schema.json not present in this $MA_LAYOUT layout"
213
+ elif grep -qi "Copilot CLI" "$REVSCHEMA" && grep -qi "Claude" "$REVSCHEMA"; then
203
214
  pass "reviewer-output schema notes the CLI-aware reviewer set"
204
215
  else
205
216
  fail "reviewer-output schema missing the CLI-aware note"
206
217
  fi
218
+
207
219
  # consensus.reviewerCount must accommodate both 2 and 3 (min 1, no max < 3)
208
- if grep -q '"reviewerCount"' "$TRSCHEMA" && grep -qi "Claude Code = 2, Copilot CLI = 3" "$TRSCHEMA"; then
220
+ if [ -z "$TRSCHEMA" ] || [ ! -f "$TRSCHEMA" ]; then
221
+ echo " ↷ SKIP: triage-output.schema.json not present in this $MA_LAYOUT layout"
222
+ elif grep -q '"reviewerCount"' "$TRSCHEMA" && grep -qi "Claude Code = 2, Copilot CLI = 3" "$TRSCHEMA"; then
209
223
  pass "triage consensus.reviewerCount documents 2 (Claude) and 3 (Copilot)"
210
224
  else
211
225
  fail "triage consensus.reviewerCount does not document the 2/3 split"
@@ -90,11 +90,20 @@ function git(args) {
90
90
 
91
91
  function resolveBase() {
92
92
  if (BASE) return BASE;
93
- for (const ref of ["origin/main", "main", "origin/master", "master", "develop", "origin/develop"]) {
93
+ for (const ref of [
94
+ "origin/main",
95
+ "main",
96
+ "origin/master",
97
+ "master",
98
+ "develop",
99
+ "origin/develop",
100
+ ]) {
94
101
  try {
95
102
  execFileSync("git", ["-C", ROOT, "rev-parse", "--verify", ref], { stdio: "ignore" });
96
103
  return ref;
97
- } catch { /* continue */ }
104
+ } catch {
105
+ /* continue */
106
+ }
98
107
  }
99
108
  throw new Error("no base ref found");
100
109
  }
@@ -133,9 +142,15 @@ function isExcluded(path) {
133
142
  }
134
143
 
135
144
  function isTestPath(path) {
136
- if (Array.isArray(rules.testPathSuffixes) && rules.testPathSuffixes.some((s) => path.endsWith(s))) return true;
137
- if (Array.isArray(rules.testPathPrefixes) && rules.testPathPrefixes.some((p) => basename(path).startsWith(p))) return true;
138
- if (Array.isArray(rules.testPathContains) && rules.testPathContains.some((c) => path.includes(c))) return true;
145
+ if (Array.isArray(rules.testPathSuffixes) && rules.testPathSuffixes.some((s) => path.endsWith(s)))
146
+ return true;
147
+ if (
148
+ Array.isArray(rules.testPathPrefixes) &&
149
+ rules.testPathPrefixes.some((p) => basename(path).startsWith(p))
150
+ )
151
+ return true;
152
+ if (Array.isArray(rules.testPathContains) && rules.testPathContains.some((c) => path.includes(c)))
153
+ return true;
139
154
  return false;
140
155
  }
141
156
 
@@ -227,8 +242,11 @@ function scanTreeForTests() {
227
242
  if (!SCAN_TREE) return hits;
228
243
  const visit = (dir) => {
229
244
  let entries;
230
- try { entries = readdirSync(dir, { withFileTypes: true }); }
231
- catch { return; }
245
+ try {
246
+ entries = readdirSync(dir, { withFileTypes: true });
247
+ } catch {
248
+ return;
249
+ }
232
250
  for (const ent of entries) {
233
251
  const full = join(dir, ent.name);
234
252
  const rel = full.replace(ROOT + "/", "");
@@ -238,7 +256,11 @@ function scanTreeForTests() {
238
256
  visit(full);
239
257
  } else if (ent.isFile() && isTestPath(rel)) {
240
258
  let body;
241
- try { body = readFileSync(full, "utf8"); } catch { continue; }
259
+ try {
260
+ body = readFileSync(full, "utf8");
261
+ } catch {
262
+ continue;
263
+ }
242
264
  // crude symbol mention: any Identifier-ish token. Cap body size.
243
265
  const slice = body.slice(0, 400_000);
244
266
  const tokens = slice.match(/[A-Za-z_][A-Za-z0-9_]{2,}/g) || [];
@@ -258,7 +280,14 @@ function severityFor(symbol, kind) {
258
280
  // Public API additions without tests are important; pure boolean exports
259
281
  // (e.g. const FLAG = true) tend to be suggestion-tier.
260
282
  if (kind === "objc_export" || kind === "interface" || kind === "public_proto") return "important";
261
- if (kind.startsWith("public_") || kind === "open_class" || kind === "open_fun" || kind === "named_export" || kind === "default_export") return "suggestion";
283
+ if (
284
+ kind.startsWith("public_") ||
285
+ kind === "open_class" ||
286
+ kind === "open_fun" ||
287
+ kind === "named_export" ||
288
+ kind === "default_export"
289
+ )
290
+ return "suggestion";
262
291
  if (kind === "view_struct" || kind === "config_struct") return "important";
263
292
  if (kind === "composable_fun") return "important";
264
293
  if (kind === "top_def" || kind === "top_class" || kind === "async_def") return "suggestion";
@@ -272,7 +301,10 @@ function symbolMentionedInTest(diffText, symbol) {
272
301
  let inTestFile = false;
273
302
  for (const line of lines) {
274
303
  const fm = line.match(/^diff --git a\/(.+?) b\/(.+)$/);
275
- if (fm) { inTestFile = isTestPath(fm[2]); continue; }
304
+ if (fm) {
305
+ inTestFile = isTestPath(fm[2]);
306
+ continue;
307
+ }
276
308
  if (!inTestFile) continue;
277
309
  if (!line.startsWith("+")) continue;
278
310
  if (re.test(line)) return true;
@@ -327,8 +359,8 @@ function main() {
327
359
  testsScanned: tests.length,
328
360
  gapCount: gaps.length,
329
361
  gapBySeverity: {
330
- blocking: gaps.filter((g) => g.severity === "blocking").length,
331
- important: gaps.filter((g) => g.severity === "important").length,
362
+ blocking: gaps.filter((g) => g.severity === "blocking").length,
363
+ important: gaps.filter((g) => g.severity === "important").length,
332
364
  suggestion: gaps.filter((g) => g.severity === "suggestion").length,
333
365
  },
334
366
  };
@@ -76,7 +76,11 @@ function main() {
76
76
  }
77
77
 
78
78
  process.stdout.write(
79
- JSON.stringify({ schemaVersion: "1.0.0", count: findings.length, findings }, null, PRETTY ? 2 : 0),
79
+ JSON.stringify(
80
+ { schemaVersion: "1.0.0", count: findings.length, findings },
81
+ null,
82
+ PRETTY ? 2 : 0,
83
+ ),
80
84
  );
81
85
  }
82
86