@mmerterden/multi-agent-pipeline 20.2.1 → 20.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/CHANGELOG.md +912 -1
  2. package/README.md +104 -81
  3. package/README.tr.md +103 -62
  4. package/docs/FIGMA_PIPELINE.md +35 -35
  5. package/docs/adr/0006-skills-core-external-split.md +1 -1
  6. package/docs/adr/0007-multi-tool-adapter-framework.md +6 -0
  7. package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +7 -0
  8. package/docs/architecture.md +50 -14
  9. package/docs/best-practices.md +1 -1
  10. package/docs/ecosystem.md +56 -32
  11. package/docs/facts.json +10 -10
  12. package/docs/features.md +97 -5
  13. package/docs/recovery-guide.md +7 -14
  14. package/docs/server-readiness.md +31 -24
  15. package/index.js +1 -1
  16. package/install/_common.mjs +3 -5
  17. package/install/_platform-filter.mjs +23 -1
  18. package/install/_unattended-profile.mjs +321 -75
  19. package/install/claude.mjs +51 -10
  20. package/install/codex.mjs +2 -0
  21. package/install/copilot.mjs +2 -0
  22. package/install/index.mjs +30 -17
  23. package/install/templates/claude-hooks.json +16 -5
  24. package/install/templates/copilot-instructions.md +1 -1
  25. package/install/templates/multi-agent-autopilot-awake.plist.template +48 -0
  26. package/install/templates/multi-agent-autopilot.plist.template +12 -5
  27. package/install/unattended-profile-legacy.json +80 -0
  28. package/manifest.json +616 -483
  29. package/package.json +8 -3
  30. package/pipeline/agents/code-reviewer.md +10 -0
  31. package/pipeline/agents/plan-critic.md +98 -0
  32. package/pipeline/agents/security-auditor.md +10 -0
  33. package/pipeline/agents/task-clarifier.md +10 -0
  34. package/pipeline/commands/multi-agent/SKILL.md +2 -2
  35. package/pipeline/commands/multi-agent/analysis/SKILL.md +6 -2
  36. package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +12 -1
  37. package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +4 -0
  38. package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
  39. package/pipeline/commands/multi-agent/autopilot-off/SKILL.md +36 -6
  40. package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +77 -12
  41. package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +29 -8
  42. package/pipeline/commands/multi-agent/build-optimize/SKILL.md +4 -0
  43. package/pipeline/commands/multi-agent/channels/SKILL.md +9 -9
  44. package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +5 -1
  45. package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -0
  46. package/pipeline/commands/multi-agent/design-check/SKILL.md +16 -11
  47. package/pipeline/commands/multi-agent/diff-explain/SKILL.md +4 -0
  48. package/pipeline/commands/multi-agent/doctor/SKILL.md +4 -0
  49. package/pipeline/commands/multi-agent/feedback/SKILL.md +5 -1
  50. package/pipeline/commands/multi-agent/forget/SKILL.md +4 -0
  51. package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +4 -0
  52. package/pipeline/commands/multi-agent/graph/SKILL.md +4 -0
  53. package/pipeline/commands/multi-agent/help/SKILL.md +37 -39
  54. package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +4 -0
  55. package/pipeline/commands/multi-agent/issue/SKILL.md +7 -1
  56. package/pipeline/commands/multi-agent/jira/SKILL.md +7 -1
  57. package/pipeline/commands/multi-agent/kill/SKILL.md +9 -3
  58. package/pipeline/commands/multi-agent/language/SKILL.md +4 -0
  59. package/pipeline/commands/multi-agent/log/SKILL.md +4 -0
  60. package/pipeline/commands/multi-agent/manual-test/SKILL.md +5 -0
  61. package/pipeline/commands/multi-agent/model/SKILL.md +4 -0
  62. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -0
  63. package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +4 -0
  64. package/pipeline/commands/multi-agent/purge/SKILL.md +4 -0
  65. package/pipeline/commands/multi-agent/refactor/SKILL.md +5 -0
  66. package/pipeline/commands/multi-agent/research/SKILL.md +49 -0
  67. package/pipeline/commands/multi-agent/resume/SKILL.md +29 -6
  68. package/pipeline/commands/multi-agent/review/SKILL.md +28 -9
  69. package/pipeline/commands/multi-agent/review-analysis/SKILL.md +5 -1
  70. package/pipeline/commands/multi-agent/review-issue/SKILL.md +4 -0
  71. package/pipeline/commands/multi-agent/review-jira/SKILL.md +4 -0
  72. package/pipeline/commands/multi-agent/route-off/SKILL.md +4 -0
  73. package/pipeline/commands/multi-agent/route-on/SKILL.md +4 -0
  74. package/pipeline/commands/multi-agent/route-status/SKILL.md +4 -0
  75. package/pipeline/commands/multi-agent/routines/SKILL.md +4 -0
  76. package/pipeline/commands/multi-agent/save/SKILL.md +6 -2
  77. package/pipeline/commands/multi-agent/scaffold/SKILL.md +47 -0
  78. package/pipeline/commands/multi-agent/scan/SKILL.md +4 -0
  79. package/pipeline/commands/multi-agent/search/SKILL.md +12 -8
  80. package/pipeline/commands/multi-agent/security-review/SKILL.md +4 -0
  81. package/pipeline/commands/multi-agent/serve/SKILL.md +62 -0
  82. package/pipeline/commands/multi-agent/setup/SKILL.md +27 -36
  83. package/pipeline/commands/multi-agent/stack/SKILL.md +4 -0
  84. package/pipeline/commands/multi-agent/status/SKILL.md +10 -9
  85. package/pipeline/commands/multi-agent/steer/SKILL.md +5 -1
  86. package/pipeline/commands/multi-agent/store-ready/SKILL.md +4 -0
  87. package/pipeline/commands/multi-agent/sync/SKILL.md +13 -13
  88. package/pipeline/commands/multi-agent/test/SKILL.md +4 -0
  89. package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +4 -0
  90. package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +4 -0
  91. package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +4 -0
  92. package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +5 -1
  93. package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +4 -0
  94. package/pipeline/commands/multi-agent/uninstall/SKILL.md +5 -1
  95. package/pipeline/commands/multi-agent/update/SKILL.md +4 -0
  96. package/pipeline/contract/CHANGELOG.md +74 -0
  97. package/pipeline/contract/README.md +126 -0
  98. package/pipeline/contract/build.mjs +427 -0
  99. package/pipeline/contract/fixtures/answer-result.json +11 -0
  100. package/pipeline/contract/fixtures/error-invalid-request.json +8 -0
  101. package/pipeline/contract/fixtures/error-unauthorized.json +5 -0
  102. package/pipeline/contract/fixtures/error-unsigned.json +5 -0
  103. package/pipeline/contract/fixtures/issues-empty.json +18 -0
  104. package/pipeline/contract/fixtures/launch-plan.json +31 -0
  105. package/pipeline/contract/fixtures/runs-awaiting-question.json +70 -0
  106. package/pipeline/contract/fixtures/runs-empty.json +6 -0
  107. package/pipeline/contract/fixtures/runs-failed.json +84 -0
  108. package/pipeline/contract/fixtures/runs-old-schema.json +70 -0
  109. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +101 -0
  110. package/pipeline/contract/fixtures/runs-pr-opened.json +106 -0
  111. package/pipeline/contract/fixtures/runs-running.json +84 -0
  112. package/pipeline/contract/fixtures/worktrees-empty.json +4 -0
  113. package/pipeline/contract/frozen/toolbox.json +107 -0
  114. package/pipeline/contract/manifest.json +263 -0
  115. package/pipeline/contract/types/index.d.ts +343 -0
  116. package/pipeline/lib/_jira-auth.sh +6 -2
  117. package/pipeline/lib/account-resolver.sh +1 -1
  118. package/pipeline/lib/autopilot-state.sh +19 -0
  119. package/pipeline/lib/context-link-extractor.sh +12 -5
  120. package/pipeline/lib/credential-inventory.sh +12 -5
  121. package/pipeline/lib/credential-store.sh +116 -185
  122. package/pipeline/lib/fetch-confluence.sh +44 -3
  123. package/pipeline/lib/fetch-document.sh +3 -4
  124. package/pipeline/lib/fetch-fortify.sh +1 -1
  125. package/pipeline/lib/figma-mcp-refresh.sh +2 -2
  126. package/pipeline/lib/figma-token.sh +5 -1
  127. package/pipeline/lib/issue-fetcher.sh +233 -16
  128. package/pipeline/lib/json-file-lock.mjs +172 -0
  129. package/pipeline/lib/model-dispatch.sh +21 -12
  130. package/pipeline/lib/model-rung.sh +6 -1
  131. package/pipeline/lib/multi-repo-pipeline.sh +1 -1
  132. package/pipeline/lib/outbound-gate.mjs +46 -16
  133. package/pipeline/lib/parse-complaints.sh +14 -7
  134. package/pipeline/lib/plan-todos.sh +3 -3
  135. package/pipeline/lib/post-pr-review.sh +9 -9
  136. package/pipeline/lib/pr-request-location.mjs +85 -0
  137. package/pipeline/lib/regular-file.mjs +153 -0
  138. package/pipeline/lib/repo-hygiene.sh +17 -0
  139. package/pipeline/lib/route-state.sh +5 -1
  140. package/pipeline/lib/run-paths.sh +3 -2
  141. package/pipeline/lib/stack-detect.sh +19 -1
  142. package/pipeline/lib/unattended-profile-check.mjs +178 -0
  143. package/pipeline/lib/unattended-settings-location.mjs +28 -0
  144. package/pipeline/lib/unattended.mjs +76 -0
  145. package/pipeline/lib/unattended.sh +32 -0
  146. package/pipeline/lib/untrusted.mjs +76 -0
  147. package/pipeline/lib/user-facing.mjs +82 -0
  148. package/pipeline/lib/user-facing.sh +58 -0
  149. package/pipeline/multi-agent-refs/_dev-context.md +1 -1
  150. package/pipeline/multi-agent-refs/analysis/evidence.md +4 -0
  151. package/pipeline/multi-agent-refs/analysis/locked.md +2 -2
  152. package/pipeline/multi-agent-refs/analysis/render.md +4 -3
  153. package/pipeline/multi-agent-refs/analysis/resolve.md +3 -1
  154. package/pipeline/multi-agent-refs/analysis/synthesis.md +4 -5
  155. package/pipeline/multi-agent-refs/analysis-template.md +10 -17
  156. package/pipeline/multi-agent-refs/channels/jira.md +1 -1
  157. package/pipeline/multi-agent-refs/component-dispatch.md +3 -3
  158. package/pipeline/multi-agent-refs/conventions-defaults.md +32 -32
  159. package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -17
  160. package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +37 -9
  161. package/pipeline/multi-agent-refs/features/autopilot-operations.md +277 -0
  162. package/pipeline/multi-agent-refs/features/constitution.md +196 -0
  163. package/pipeline/multi-agent-refs/features/doctor.md +6 -3
  164. package/pipeline/multi-agent-refs/features/external-context-injection.md +6 -1
  165. package/pipeline/multi-agent-refs/features/jira-context.md +1 -1
  166. package/pipeline/multi-agent-refs/features/maturity-followup.md +43 -23
  167. package/pipeline/multi-agent-refs/features/model-fallback.md +9 -0
  168. package/pipeline/multi-agent-refs/features/phone-api.md +306 -0
  169. package/pipeline/multi-agent-refs/features/plan-critic.md +159 -0
  170. package/pipeline/multi-agent-refs/features/research.md +150 -0
  171. package/pipeline/multi-agent-refs/features/review-decision.md +185 -0
  172. package/pipeline/multi-agent-refs/features/scaffold.md +160 -0
  173. package/pipeline/multi-agent-refs/features/security-audit.md +6 -2
  174. package/pipeline/multi-agent-refs/features/skill-conformance.md +4 -1
  175. package/pipeline/multi-agent-refs/features/stack-adapters.md +116 -0
  176. package/pipeline/multi-agent-refs/features/unattended-gates.md +316 -0
  177. package/pipeline/multi-agent-refs/features/unattended-security.md +731 -0
  178. package/pipeline/multi-agent-refs/features/url-enrichment.md +2 -2
  179. package/pipeline/multi-agent-refs/features/usage-reporting.md +127 -35
  180. package/pipeline/multi-agent-refs/features/verify-by-test.md +1 -1
  181. package/pipeline/multi-agent-refs/features/visual-evidence.md +7 -7
  182. package/pipeline/multi-agent-refs/keychain.md +6 -11
  183. package/pipeline/multi-agent-refs/payload-contracts.md +2 -2
  184. package/pipeline/multi-agent-refs/phases/log-format.md +2 -3
  185. package/pipeline/multi-agent-refs/phases/modes.md +10 -12
  186. package/pipeline/multi-agent-refs/phases/operations.md +11 -5
  187. package/pipeline/multi-agent-refs/phases/phase-0-init.md +73 -81
  188. package/pipeline/multi-agent-refs/phases/phase-1-plan.md +22 -22
  189. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +42 -66
  190. package/pipeline/multi-agent-refs/phases/phase-3-review.md +45 -79
  191. package/pipeline/multi-agent-refs/phases/phase-4-commit.md +28 -38
  192. package/pipeline/multi-agent-refs/phases/phase-5-report.md +27 -25
  193. package/pipeline/multi-agent-refs/phases.md +1 -1
  194. package/pipeline/multi-agent-refs/picker-contract.md +1 -1
  195. package/pipeline/multi-agent-refs/progress-contract.md +13 -16
  196. package/pipeline/multi-agent-refs/readiness-review.md +1 -1
  197. package/pipeline/multi-agent-refs/research/engine.md +91 -0
  198. package/pipeline/multi-agent-refs/rules.md +6 -4
  199. package/pipeline/multi-agent-refs/setup/repo-discovery.md +2 -2
  200. package/pipeline/multi-agent-refs/tracker-contract.md +2 -2
  201. package/pipeline/multi-agent-refs/unattended-contract.md +68 -16
  202. package/pipeline/rules/figma-pipeline.md +12 -12
  203. package/pipeline/schemas/agent-state.schema.json +480 -18
  204. package/pipeline/schemas/analysis-spec.schema.json +4 -4
  205. package/pipeline/schemas/answer-request.schema.json +24 -0
  206. package/pipeline/schemas/answer-result.schema.json +28 -0
  207. package/pipeline/schemas/autopilot-config.schema.json +111 -13
  208. package/pipeline/schemas/command-parameters.schema.json +99 -0
  209. package/pipeline/schemas/constitution.schema.json +56 -0
  210. package/pipeline/schemas/contract-error.schema.json +52 -0
  211. package/pipeline/schemas/design-check-config.schema.json +5 -1
  212. package/pipeline/schemas/issues.schema.json +61 -0
  213. package/pipeline/schemas/launch-plan.schema.json +46 -0
  214. package/pipeline/schemas/launch-request.schema.json +45 -0
  215. package/pipeline/schemas/launch.json +61 -0
  216. package/pipeline/schemas/launch.schema.json +84 -0
  217. package/pipeline/schemas/phases.json +2 -2
  218. package/pipeline/schemas/phases.schema.json +68 -0
  219. package/pipeline/schemas/phone-devices.schema.json +61 -0
  220. package/pipeline/schemas/phone-signed-request.schema.json +67 -0
  221. package/pipeline/schemas/plan-critique.schema.json +99 -0
  222. package/pipeline/schemas/plan-todos.schema.json +7 -7
  223. package/pipeline/schemas/planning-output.schema.json +5 -0
  224. package/pipeline/schemas/pr-request.schema.json +46 -0
  225. package/pipeline/schemas/prefs.schema.json +79 -8
  226. package/pipeline/schemas/research-output.schema.json +118 -0
  227. package/pipeline/schemas/review-file-exclusions.schema.json +25 -0
  228. package/pipeline/schemas/reviewer-output.schema.json +40 -4
  229. package/pipeline/schemas/run-questions.json +392 -0
  230. package/pipeline/schemas/run-questions.schema.json +118 -0
  231. package/pipeline/schemas/runs-index.schema.json +189 -0
  232. package/pipeline/schemas/scaffold-manifest.schema.json +43 -0
  233. package/pipeline/schemas/secret-patterns.schema.json +28 -0
  234. package/pipeline/schemas/stack-adapters.json +527 -0
  235. package/pipeline/schemas/stack-adapters.schema.json +184 -0
  236. package/pipeline/schemas/token-budget.json +1 -1
  237. package/pipeline/schemas/token-budget.schema.json +26 -0
  238. package/pipeline/schemas/triage-output.schema.json +64 -3
  239. package/pipeline/schemas/unattended-policy.json +139 -0
  240. package/pipeline/schemas/unattended-policy.schema.json +73 -0
  241. package/pipeline/schemas/unattended-profile.json +248 -0
  242. package/pipeline/schemas/unattended-profile.schema.json +198 -0
  243. package/pipeline/schemas/worktrees.schema.json +51 -0
  244. package/pipeline/scripts/README.md +1 -0
  245. package/pipeline/scripts/_autopilot-config.mjs +130 -0
  246. package/pipeline/scripts/_autopilot-ops.mjs +567 -0
  247. package/pipeline/scripts/_autopilot-outcomes.mjs +174 -0
  248. package/pipeline/scripts/_command-contract.mjs +384 -0
  249. package/pipeline/scripts/_cost.mjs +40 -0
  250. package/pipeline/scripts/_notices.mjs +160 -0
  251. package/pipeline/scripts/_phone-auth.mjs +485 -0
  252. package/pipeline/scripts/_pre-existing.mjs +294 -0
  253. package/pipeline/scripts/_redact.mjs +77 -0
  254. package/pipeline/scripts/_run-paths.mjs +4 -2
  255. package/pipeline/scripts/_stack-adapter.mjs +678 -0
  256. package/pipeline/scripts/_stack-routing.mjs +1 -1
  257. package/pipeline/scripts/agent-guard.py +348 -37
  258. package/pipeline/scripts/agent-guard.sh +41 -13
  259. package/pipeline/scripts/analysis-story-tree.mjs +79 -3
  260. package/pipeline/scripts/answer-question.mjs +181 -0
  261. package/pipeline/scripts/audit-log-rotate.sh +1 -4
  262. package/pipeline/scripts/audit-log.sh +4 -4
  263. package/pipeline/scripts/autopilot-arming.mjs +389 -21
  264. package/pipeline/scripts/autopilot-awake.mjs +255 -0
  265. package/pipeline/scripts/autopilot-intake.mjs +137 -36
  266. package/pipeline/scripts/autopilot-menubar.swift +156 -44
  267. package/pipeline/scripts/autopilot-publish.mjs +1625 -0
  268. package/pipeline/scripts/autopilot-runner.mjs +1678 -222
  269. package/pipeline/scripts/autopilot-status.sh +198 -33
  270. package/pipeline/scripts/build-lock.sh +120 -0
  271. package/pipeline/scripts/build-references.mjs +4 -1
  272. package/pipeline/scripts/build-stack-plugins.mjs +59 -22
  273. package/pipeline/scripts/capture-flush.sh +1 -1
  274. package/pipeline/scripts/capture-resume.sh +13 -9
  275. package/pipeline/scripts/check-derived-drift.mjs +52 -11
  276. package/pipeline/scripts/commands.mjs +88 -0
  277. package/pipeline/scripts/constitution.mjs +362 -0
  278. package/pipeline/scripts/contract-server.mjs +776 -0
  279. package/pipeline/scripts/cost-analyze.mjs +89 -39
  280. package/pipeline/scripts/diff-explain.mjs +12 -1
  281. package/pipeline/scripts/doctor.mjs +77 -28
  282. package/pipeline/scripts/evidence-gate.mjs +192 -12
  283. package/pipeline/scripts/feedback-send.mjs +4 -2
  284. package/pipeline/scripts/gate-ledger.mjs +449 -0
  285. package/pipeline/scripts/gc-abandoned.sh +132 -13
  286. package/pipeline/scripts/gen-facts.mjs +31 -15
  287. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  288. package/pipeline/scripts/github-ssh-setup.sh +140 -29
  289. package/pipeline/scripts/graph-mermaid.mjs +4 -1
  290. package/pipeline/scripts/issues.mjs +236 -0
  291. package/pipeline/scripts/jira-attach.sh +6 -2
  292. package/pipeline/scripts/jira-search.sh +4 -3
  293. package/pipeline/scripts/keychain-save.sh +125 -24
  294. package/pipeline/scripts/keychain.py +63 -93
  295. package/pipeline/scripts/launch-request.mjs +747 -0
  296. package/pipeline/scripts/localize-commands.mjs +4 -10
  297. package/pipeline/scripts/log-metric.sh +6 -5
  298. package/pipeline/scripts/maturity-followup.mjs +13 -4
  299. package/pipeline/scripts/memory-save.sh +25 -0
  300. package/pipeline/scripts/migrate-prefs.mjs +4 -3
  301. package/pipeline/scripts/open-questions-gate.mjs +276 -0
  302. package/pipeline/scripts/phase-tracker.sh +41 -27
  303. package/pipeline/scripts/phase0-exit-gate.mjs +22 -4
  304. package/pipeline/scripts/phone-devices.mjs +224 -0
  305. package/pipeline/scripts/plan-coverage-gate.mjs +200 -66
  306. package/pipeline/scripts/plan-critique-gate.mjs +591 -0
  307. package/pipeline/scripts/pr-request.mjs +188 -0
  308. package/pipeline/scripts/pre-commit-check.sh +115 -4
  309. package/pipeline/scripts/probe-evidence-capability.sh +44 -5
  310. package/pipeline/scripts/record-phase.mjs +71 -0
  311. package/pipeline/scripts/render-agent-log-cost.sh +17 -2
  312. package/pipeline/scripts/render-cost-summary.sh +1 -1
  313. package/pipeline/scripts/render-work-summary.sh +1 -1
  314. package/pipeline/scripts/require-supported-version.sh +4 -1
  315. package/pipeline/scripts/research-gate.mjs +704 -0
  316. package/pipeline/scripts/review-decision-gate.mjs +403 -0
  317. package/pipeline/scripts/routine-registry.mjs +5 -2
  318. package/pipeline/scripts/runs-index.mjs +135 -27
  319. package/pipeline/scripts/scaffold-gate.mjs +393 -0
  320. package/pipeline/scripts/skill-conformance.mjs +25 -8
  321. package/pipeline/scripts/skill-siblings.mjs +2 -1
  322. package/pipeline/scripts/smoke-cross-cli-behavior.sh +32 -6
  323. package/pipeline/scripts/smoke-schema-validation.sh +6 -2
  324. package/pipeline/scripts/spec-consistency-gate.mjs +469 -0
  325. package/pipeline/scripts/symbol-existence-gate.mjs +450 -0
  326. package/pipeline/scripts/test-gap-scan.mjs +40 -2
  327. package/pipeline/scripts/test-integrity-gate.mjs +20 -4
  328. package/pipeline/scripts/test-strength.mjs +484 -0
  329. package/pipeline/scripts/test-summary.mjs +651 -0
  330. package/pipeline/scripts/triage-memory.mjs +49 -9
  331. package/pipeline/scripts/unattended_policy.py +2786 -0
  332. package/pipeline/scripts/uninstall.mjs +10 -10
  333. package/pipeline/scripts/update-issue-progress.sh +1 -1
  334. package/pipeline/scripts/usage-identity.mjs +288 -0
  335. package/pipeline/scripts/usage-register.mjs +185 -65
  336. package/pipeline/scripts/usage-report.mjs +230 -66
  337. package/pipeline/scripts/validate-complaint-doc.mjs +28 -10
  338. package/pipeline/scripts/validate-planning.mjs +6 -0
  339. package/pipeline/scripts/verify-citations.mjs +151 -38
  340. package/pipeline/scripts/verify.mjs +58 -18
  341. package/pipeline/scripts/worktree-prepare.sh +126 -0
  342. package/pipeline/scripts/worktrees.mjs +124 -0
  343. package/pipeline/scripts/write-state.mjs +48 -17
  344. package/pipeline/skills/.skill-manifest.json +222 -226
  345. package/pipeline/skills/.skills-index.json +77 -88
  346. package/pipeline/skills/shared/README.md +44 -45
  347. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +3 -2
  348. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +3 -2
  349. package/pipeline/skills/shared/core/multi-agent/SKILL.md +10 -9
  350. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +6 -5
  351. package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +11 -3
  352. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +2 -1
  353. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -3
  354. package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +32 -6
  355. package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +66 -8
  356. package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +27 -9
  357. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +2 -1
  358. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -4
  359. package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +3 -2
  360. package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +2 -1
  361. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +7 -5
  362. package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +2 -1
  363. package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +3 -2
  364. package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +2 -1
  365. package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +2 -1
  366. package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +2 -1
  367. package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +2 -1
  368. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -1
  369. package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -1
  370. package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +3 -2
  371. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -1
  372. package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +7 -4
  373. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -1
  374. package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +2 -1
  375. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +2 -1
  376. package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -1
  377. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +2 -1
  378. package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +2 -1
  379. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +2 -1
  380. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +2 -1
  381. package/pipeline/skills/shared/core/multi-agent-research/SKILL.md +35 -0
  382. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +7 -3
  383. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +7 -5
  384. package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +2 -1
  385. package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +3 -2
  386. package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +2 -1
  387. package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +2 -1
  388. package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +2 -1
  389. package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +2 -1
  390. package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +2 -1
  391. package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +3 -2
  392. package/pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md +30 -0
  393. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -1
  394. package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +4 -3
  395. package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +2 -1
  396. package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +60 -0
  397. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +8 -8
  398. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -1
  399. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +7 -8
  400. package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -1
  401. package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +2 -1
  402. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +10 -10
  403. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +2 -1
  404. package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +2 -1
  405. package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +2 -1
  406. package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +2 -1
  407. package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +2 -1
  408. package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -1
  409. package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +3 -2
  410. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +2 -1
  411. package/pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md +46 -0
  412. package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +9 -3
  413. package/pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md +54 -0
  414. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +9 -11
  415. package/pipeline/skills/shared/external/NOTICE-vibeship-spawner-skills.md +203 -0
  416. package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +10 -3
  417. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +131 -25
  418. package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -3
  419. package/pipeline/skills/shared/external/alarmkit/SKILL.md +2 -1
  420. package/pipeline/skills/shared/external/android-architecture/SKILL.md +85 -76
  421. package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +51 -3
  422. package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +9 -0
  423. package/pipeline/skills/shared/external/android-datastore/SKILL.md +4 -3
  424. package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +4 -3
  425. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +106 -181
  426. package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +147 -0
  427. package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +45 -4
  428. package/pipeline/skills/shared/external/android-performance/SKILL.md +27 -2
  429. package/pipeline/skills/shared/external/android-performance/references/patterns.md +37 -37
  430. package/pipeline/skills/shared/external/api-patterns/SKILL.md +111 -67
  431. package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +128 -0
  432. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +136 -186
  433. package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +140 -0
  434. package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +207 -0
  435. package/pipeline/skills/shared/external/api-security-best-practices/references/operations.md +66 -0
  436. package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +175 -0
  437. package/pipeline/skills/shared/external/app-clips/SKILL.md +2 -0
  438. package/pipeline/skills/shared/external/app-intents/SKILL.md +2 -0
  439. package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +4 -3
  440. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +2 -0
  441. package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -0
  442. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +2 -0
  443. package/pipeline/skills/shared/external/architecture/SKILL.md +106 -39
  444. package/pipeline/skills/shared/external/architecture/references/adr-and-review.md +76 -0
  445. package/pipeline/skills/shared/external/authentication/SKILL.md +2 -0
  446. package/pipeline/skills/shared/external/avkit/SKILL.md +2 -0
  447. package/pipeline/skills/shared/external/background-processing/SKILL.md +2 -1
  448. package/pipeline/skills/shared/external/backlog/SKILL.md +3 -2
  449. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +2 -0
  450. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +1 -1
  451. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +3 -2
  452. package/pipeline/skills/shared/external/clean-code/SKILL.md +192 -90
  453. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +2 -1
  454. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +1 -1
  455. package/pipeline/skills/shared/external/compose-components/SKILL.md +4 -4
  456. package/pipeline/skills/shared/external/compose-navigation/SKILL.md +22 -22
  457. package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +10 -10
  458. package/pipeline/skills/shared/external/compose-testing/SKILL.md +13 -6
  459. package/pipeline/skills/shared/external/compose-testing/references/patterns.md +59 -59
  460. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +2 -0
  461. package/pipeline/skills/shared/external/context-compression/SKILL.md +118 -250
  462. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +2 -0
  463. package/pipeline/skills/shared/external/core-data/SKILL.md +2 -0
  464. package/pipeline/skills/shared/external/core-motion/SKILL.md +2 -0
  465. package/pipeline/skills/shared/external/core-nfc/SKILL.md +2 -0
  466. package/pipeline/skills/shared/external/coreml/SKILL.md +2 -1
  467. package/pipeline/skills/shared/external/council/SKILL.md +2 -1
  468. package/pipeline/skills/shared/external/cryptokit/SKILL.md +2 -0
  469. package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
  470. package/pipeline/skills/shared/external/database-patterns/SKILL.md +3 -2
  471. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +2 -0
  472. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +130 -20
  473. package/pipeline/skills/shared/external/debugging-strategies/references/hard-cases.md +54 -0
  474. package/pipeline/skills/shared/external/device-integrity/SKILL.md +2 -0
  475. package/pipeline/skills/shared/external/docker-expert/SKILL.md +137 -381
  476. package/pipeline/skills/shared/external/docker-expert/references/patterns.md +98 -0
  477. package/pipeline/skills/shared/external/energykit/SKILL.md +2 -1
  478. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +3 -1
  479. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +2 -2
  480. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +116 -185
  481. package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +235 -0
  482. package/pipeline/skills/shared/external/fastapi-pro/references/testing-and-deployment.md +69 -0
  483. package/pipeline/skills/shared/external/firebase/SKILL.md +4 -3
  484. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +151 -293
  485. package/pipeline/skills/shared/external/github-actions-templates/references/patterns.md +96 -0
  486. package/pipeline/skills/shared/external/healthkit/SKILL.md +2 -0
  487. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +69 -72
  488. package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +111 -0
  489. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +77 -86
  490. package/pipeline/skills/shared/external/hig-components-layout/references/containers.md +98 -0
  491. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +150 -78
  492. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +76 -97
  493. package/pipeline/skills/shared/external/hig-components-system/references/surfaces.md +98 -0
  494. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +48 -76
  495. package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +132 -0
  496. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +147 -106
  497. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +61 -77
  498. package/pipeline/skills/shared/external/hig-patterns/references/patterns.md +92 -0
  499. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +147 -77
  500. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +61 -121
  501. package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +108 -0
  502. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +2 -0
  503. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +1 -1
  504. package/pipeline/skills/shared/external/html-semantic/SKILL.md +3 -2
  505. package/pipeline/skills/shared/external/humanizer/SKILL.md +2 -1
  506. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +2 -0
  507. package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +2 -1
  508. package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +14 -2
  509. package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
  510. package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +4 -3
  511. package/pipeline/skills/shared/external/ios-localization/SKILL.md +8 -6
  512. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +2 -2
  513. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +11 -11
  514. package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +2 -1
  515. package/pipeline/skills/shared/external/ios-networking/SKILL.md +2 -0
  516. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +2 -0
  517. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +102 -193
  518. package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +103 -0
  519. package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -2
  520. package/pipeline/skills/shared/external/live-activities/evals/evals.json +2 -2
  521. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +7 -9
  522. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +3 -3
  523. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +2 -2
  524. package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +4 -3
  525. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +5 -3
  526. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +2 -0
  527. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +1 -1
  528. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +2 -0
  529. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +1 -1
  530. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +149 -46
  531. package/pipeline/skills/shared/external/monorepo-architect/references/patterns.md +70 -0
  532. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +2 -0
  533. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +1 -1
  534. package/pipeline/skills/shared/external/natural-language/SKILL.md +2 -0
  535. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +3 -2
  536. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +91 -21
  537. package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +247 -0
  538. package/pipeline/skills/shared/external/nodejs-backend-patterns/references/testing-and-frameworks.md +57 -0
  539. package/pipeline/skills/shared/external/observability-engineer/SKILL.md +155 -232
  540. package/pipeline/skills/shared/external/observability-engineer/references/patterns.md +75 -0
  541. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +2 -0
  542. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +2 -2
  543. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +18 -18
  544. package/pipeline/skills/shared/external/pdfkit/SKILL.md +2 -1
  545. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +2 -0
  546. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +1 -1
  547. package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -0
  548. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +2 -1
  549. package/pipeline/skills/shared/external/push-notifications/SKILL.md +2 -0
  550. package/pipeline/skills/shared/external/python-patterns/SKILL.md +3 -2
  551. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +3 -2
  552. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +2 -2
  553. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +1 -1
  554. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +3 -2
  555. package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +7 -7
  556. package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +69 -69
  557. package/pipeline/skills/shared/external/room-database/references/patterns.md +126 -126
  558. package/pipeline/skills/shared/external/search-first/SKILL.md +2 -1
  559. package/pipeline/skills/shared/external/security-review/SKILL.md +4 -3
  560. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +2 -2
  561. package/pipeline/skills/shared/external/signal-community/SKILL.md +1 -1
  562. package/pipeline/skills/shared/external/skill-creator/SKILL.md +2 -1
  563. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +2 -1
  564. package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +2 -0
  565. package/pipeline/skills/shared/external/storekit/SKILL.md +2 -0
  566. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +2 -0
  567. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +2 -1
  568. package/pipeline/skills/shared/external/swift-charts/SKILL.md +2 -1
  569. package/pipeline/skills/shared/external/swift-codable/SKILL.md +2 -0
  570. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +3 -1
  571. package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +5 -4
  572. package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -1
  573. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +2 -0
  574. package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -1
  575. package/pipeline/skills/shared/external/swift-security/SKILL.md +2 -1
  576. package/pipeline/skills/shared/external/swift-testing/SKILL.md +2 -0
  577. package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -1
  578. package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +10 -0
  579. package/pipeline/skills/shared/external/swiftdata/SKILL.md +2 -0
  580. package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -1
  581. package/pipeline/skills/shared/external/swiftlint/SKILL.md +2 -0
  582. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +2 -0
  583. package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +3 -1
  584. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +2 -0
  585. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +2 -0
  586. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +2 -0
  587. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +2 -0
  588. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +3 -1
  589. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +3 -1
  590. package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +5 -4
  591. package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -1
  592. package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +5 -4
  593. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +2 -0
  594. package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +4 -3
  595. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +2 -0
  596. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
  597. package/pipeline/skills/shared/external/testing-backend/SKILL.md +3 -2
  598. package/pipeline/skills/shared/external/tipkit/SKILL.md +2 -0
  599. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +3 -2
  600. package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -0
  601. package/pipeline/skills/shared/external/vue-composition/SKILL.md +3 -2
  602. package/pipeline/skills/shared/external/weatherkit/SKILL.md +2 -0
  603. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +3 -2
  604. package/pipeline/skills/shared/external/web-performance/SKILL.md +3 -2
  605. package/pipeline/skills/shared/external/web-testing/SKILL.md +3 -2
  606. package/pipeline/skills/shared/external/widgetkit/SKILL.md +2 -0
  607. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +1 -1
  608. package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +2 -0
  609. package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +2 -0
  610. package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +2 -0
  611. package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +2 -0
  612. package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +2 -0
  613. package/pipeline/skills/skills-index.md +40 -41
  614. package/docs/token-budget-history.md +0 -24
  615. package/pipeline/skills/shared/external/agentflow/SKILL.md +0 -199
  616. package/pipeline/skills/shared/external/android-ui-verification/SKILL.md +0 -66
  617. package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +0 -299
  618. package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +0 -255
  619. package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +0 -167
  620. package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +0 -116
  621. package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -216
@@ -0,0 +1,248 @@
1
+ {
2
+ "$comment": "The permission posture `install --unattended` writes into ~/.claude/multi-agent-unattended.settings.json (never ~/.claude/settings.json, so attended sessions keep their own posture), one reason per entry, and the rule doctor's unattended-permissions check and the autopilot runner's launch precondition apply (lib/unattended-profile-check.mjs). The OS sandbox block is the boundary for Bash and everything it starts; the Edit and Read deny rules cover the file tools the sandbox does not; agent-guard.sh under MULTI_AGENT_UNATTENDED=1 is a second layer over both (multi-agent-refs/features/unattended-security.md). Keys checked against the Claude Code settings reference: permissions.defaultMode, permissions.allow, permissions.deny, env, sandbox.enabled, sandbox.failIfUnavailable, sandbox.allowUnsandboxedCommands, sandbox.autoAllowBashIfSandboxed, sandbox.enableWeakerNetworkIsolation, sandbox.filesystem.allowWrite, sandbox.filesystem.denyWrite, sandbox.filesystem.denyRead, sandbox.network.allowedDomains, sandbox.network.strictAllowlist, sandbox.network.allowLocalBinding, sandbox.network.allowMachLookup.",
3
+ "defaultMode": {
4
+ "value": "dontAsk",
5
+ "why": "a call that would prompt is denied instead of waiting for a person who is not there"
6
+ },
7
+ "wideAllows": [
8
+ {
9
+ "rule": "Bash",
10
+ "why": "a bare Bash allow in ~/.claude/settings.json lets every command through; permission lists merge across files, so it would apply to an unattended run too. Reported, never removed: that file is the attended posture"
11
+ },
12
+ {
13
+ "rule": "Bash(*)",
14
+ "why": "Bash(*) is a whole-Bash allow, the same as bare Bash; reported, never removed"
15
+ },
16
+ {
17
+ "rule": "Bash(:*)",
18
+ "why": "Bash(:*) is a whole-Bash allow, the same as bare Bash; reported, never removed"
19
+ },
20
+ {
21
+ "rule": "Bash(**)",
22
+ "why": "Bash(**) is a whole-Bash allow, the same as bare Bash; reported, never removed"
23
+ }
24
+ ],
25
+ "allow": [
26
+ ["Read", "reading the repo it was pointed at"],
27
+ ["Glob", "finding files by pattern"],
28
+ ["Grep", "searching file content"],
29
+ [
30
+ "Edit",
31
+ "Phase 2 changes files; protected paths and manifests are denied below and by agent-guard"
32
+ ],
33
+ ["Write", "new files and every artefact a phase leaves behind; same limits as Edit"],
34
+ ["NotebookEdit", "notebooks in the repo; same limits as Edit"],
35
+ ["Agent", "Phase 1 and Phase 3 dispatch subagents"],
36
+ ["Skill", "the phase specs are skills"],
37
+ ["WebFetch", "issue and ticket bodies referenced by URL (reads only)"],
38
+ ["TaskCreate", "the phase tracker's task list"],
39
+ ["TaskUpdate", "the same"],
40
+ ["TaskList", "the same"],
41
+ ["TaskGet", "the same"],
42
+ [
43
+ "mcp__multi-agent-toolkit__*",
44
+ "simulator, build and design tools; research tools are denied below"
45
+ ],
46
+ ["Bash(git *)", "status, diff, add, commit, log; pushes are denied below and by agent-guard"],
47
+ [
48
+ "Bash(gh *)",
49
+ "reads of issues and PRs; every write is blocked by agent-guard when unattended"
50
+ ],
51
+ ["Bash(bash *)", "the pipeline's own scripts under ~/.claude/scripts and ~/.claude/lib"],
52
+ ["Bash(node *)", "the pipeline's own .mjs scripts and the repo's node tooling"],
53
+ ["Bash(python3 *)", "the pipeline's Python helpers"],
54
+ ["Bash(jq *)", "state and payload reads"],
55
+ ["Bash(npm run *)", "the repo's own build and test scripts"],
56
+ ["Bash(npm test *)", "the same"],
57
+ ["Bash(npm ci *)", "restore from the committed lockfile"],
58
+ [
59
+ "Bash(npx *)",
60
+ "binaries already in the repo's node_modules; npx --yes is blocked by agent-guard"
61
+ ],
62
+ ["Bash(xcodebuild *)", "iOS build and test"],
63
+ ["Bash(xcrun simctl *)", "simulator control"],
64
+ ["Bash(xcrun xcresulttool *)", "reading test result bundles"],
65
+ ["Bash(xcrun xctrace *)", "performance traces"],
66
+ ["Bash(xcrun --find *)", "toolchain lookups"],
67
+ ["Bash(swift *)", "SwiftPM build and test"],
68
+ ["Bash(./gradlew *)", "Android build and test"],
69
+ [
70
+ "Bash(pod install *)",
71
+ "restore from the committed Podfile.lock; blocked by agent-guard once the Podfile changed"
72
+ ],
73
+ ["Bash(pytest *)", "Python tests"],
74
+ ["Bash(go test *)", "Go tests"],
75
+ ["Bash(go build *)", "Go builds"],
76
+ ["Bash(cargo test *)", "Rust tests"],
77
+ ["Bash(cargo build *)", "Rust builds"],
78
+ ["Bash(make *)", "repos whose entry point is a Makefile"],
79
+ ["Bash(ls *)", "listing"],
80
+ ["Bash(cat *)", "reading"],
81
+ ["Bash(head *)", "reading"],
82
+ ["Bash(tail *)", "reading"],
83
+ ["Bash(wc *)", "counting"],
84
+ ["Bash(find *)", "finding"],
85
+ ["Bash(grep *)", "searching"],
86
+ ["Bash(rg *)", "searching"],
87
+ ["Bash(sed *)", "text filtering; in-place edits of protected paths are blocked by agent-guard"],
88
+ ["Bash(awk *)", "text filtering"],
89
+ ["Bash(sort *)", "text filtering"],
90
+ ["Bash(diff *)", "comparing"],
91
+ ["Bash(mkdir *)", "creating directories"],
92
+ ["Bash(cp *)", "copying; protected destinations are blocked by agent-guard"],
93
+ ["Bash(mv *)", "moving; protected destinations are blocked by agent-guard"],
94
+ ["Bash(echo *)", "output"],
95
+ ["Bash(printf *)", "output"],
96
+ ["Bash(date *)", "timestamps"],
97
+ ["Bash(cd *)", "changing directory inside the worktree"]
98
+ ],
99
+ "deny": [
100
+ ["Bash(gh pr merge *)", "merging is a person's decision"],
101
+ ["Bash(git push *)", "the runner pushes, after it verified pr-request.json"],
102
+ ["Bash(git push)", "the same, with no arguments"],
103
+ ["Read(~/.ssh/**)", "SSH keys"],
104
+ ["Read(~/.aws/**)", "cloud credentials"],
105
+ ["Read(~/.gnupg/**)", "signing keys"],
106
+ ["Read(~/Library/Keychains/**)", "the Keychain database files"],
107
+ ["Read(~/.netrc)", "plaintext host credentials"],
108
+ ["Read(~/.git-credentials)", "plaintext git credentials"],
109
+ ["Read(~/.docker/config.json)", "registry credentials"],
110
+ [
111
+ "Edit(~/.claude/**)",
112
+ "the installed pipeline, its settings, this profile and the runner's files; a run writes its logs and its PR request under the unattended run directory instead"
113
+ ],
114
+ ["Edit(~/.copilot/**)", "the Copilot CLI twin of the installed pipeline"],
115
+ ["Edit(~/.codex/**)", "the Codex twin of the installed pipeline"],
116
+ ["Edit(~/.claude.json)", "Claude Code's own state and MCP server list"],
117
+ ["Edit(~/Library/LaunchAgents/**)", "per-user launchd jobs run as the operator"],
118
+ ["Edit(~/.zshrc)", "shell startup file"],
119
+ ["Edit(~/.zshenv)", "shell startup file"],
120
+ ["Edit(~/.zprofile)", "shell startup file"],
121
+ ["Edit(~/.zlogin)", "shell startup file"],
122
+ ["Edit(~/.zlogout)", "shell startup file"],
123
+ ["Edit(~/.bashrc)", "shell startup file"],
124
+ ["Edit(~/.bash_profile)", "shell startup file"],
125
+ ["Edit(~/.bash_login)", "shell startup file"],
126
+ ["Edit(~/.profile)", "shell startup file"],
127
+ ["Edit(~/.ssh/**)", "SSH keys and their config"],
128
+ ["Edit(~/.gnupg/**)", "signing keys and their config"],
129
+ ["Edit(~/.config/gh/**)", "the GitHub CLI's hosts and config"],
130
+ ["Edit(~/.config/git/**)", "the XDG git config"],
131
+ ["Edit(~/.gitconfig)", "the user's git config"],
132
+ ["Edit(~/.npmrc)", "npm registry and token configuration"],
133
+ ["Edit(~/.netrc)", "plaintext host credentials"],
134
+ ["Edit(~/.git-credentials)", "plaintext git credentials"],
135
+ ["Edit(~/.gradle/init.d/**)", "Gradle init scripts run in every build"],
136
+ ["Edit(~/.lldbinit)", "commands lldb runs at start"],
137
+ ["Edit(~/.curlrc)", "options curl applies to every request"],
138
+ ["Edit(.git/hooks/**)", "hooks run on the next git command"],
139
+ ["Edit(.git/config)", "the repository's git config"],
140
+ ["Edit(**/.github/workflows/**)", "CI definitions run with the repo's secrets"],
141
+ ["mcp__multi-agent-toolkit__research_*", "research tools send the query to an outside service"]
142
+ ],
143
+ "env": [
144
+ [
145
+ "MCP_TOOLKIT_URL_POLICY",
146
+ "strict",
147
+ "web_goto and web_crawl refuse loopback, link-local and metadata addresses"
148
+ ],
149
+ [
150
+ "MCP_TOOLKIT_INDEX_DENY",
151
+ "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains",
152
+ "context_index never indexes, and context_get never returns, credential directories"
153
+ ]
154
+ ],
155
+ "sandbox": {
156
+ "$comment": "Always written. On macOS the sandbox is Seatbelt. failIfUnavailable makes a missing sandbox a refusal to start; allowUnsandboxedCommands false removes the unsandboxed retry; autoAllowBashIfSandboxed false keeps the allow list above in force for sandboxed commands; no excludedCommands, so every command runs sandboxed. Writes are limited to the working directory, the session temp directory and allowWrite; ~/.claude is also protected by Claude Code itself. In-repo paths are denied through the Edit deny rules above, which Claude Code adds to denyWrite: a relative denyWrite entry in a --settings file does not resolve to the repository. enableWeakerNetworkIsolation lets Go tools such as gh reach the macOS trust service to verify TLS; network egress stays limited to allowedDomains. allowMachLookup lets xcrun simctl reach the simulator service.",
157
+ "enabled": true,
158
+ "failIfUnavailable": true,
159
+ "allowUnsandboxedCommands": false,
160
+ "autoAllowBashIfSandboxed": false,
161
+ "enableWeakerNetworkIsolation": true,
162
+ "filesystem": {
163
+ "allowWrite": [
164
+ "~/.multi-agent-unattended",
165
+ "~/.npm",
166
+ "~/Library/Caches/Yarn",
167
+ "~/.gradle",
168
+ "~/.m2/repository",
169
+ "~/.cargo/registry",
170
+ "~/.cargo/git",
171
+ "~/go/pkg/mod",
172
+ "~/Library/Caches/go-build",
173
+ "~/Library/Caches/pip",
174
+ "~/Library/Caches/CocoaPods",
175
+ "~/Library/Caches/org.swift.swiftpm",
176
+ "~/Library/Caches/com.apple.dt.Xcode",
177
+ "~/Library/Developer/Xcode/DerivedData"
178
+ ],
179
+ "denyWrite": [
180
+ "~/.claude",
181
+ "~/.copilot",
182
+ "~/.codex",
183
+ "~/.claude.json",
184
+ "~/Library/LaunchAgents",
185
+ "~/.zshrc",
186
+ "~/.zshenv",
187
+ "~/.zprofile",
188
+ "~/.zlogin",
189
+ "~/.zlogout",
190
+ "~/.bashrc",
191
+ "~/.bash_profile",
192
+ "~/.bash_login",
193
+ "~/.profile",
194
+ "~/.ssh",
195
+ "~/.gnupg",
196
+ "~/.config/gh",
197
+ "~/.config/git",
198
+ "~/.gitconfig",
199
+ "~/.npmrc",
200
+ "~/.netrc",
201
+ "~/.git-credentials",
202
+ "~/.gradle/init.d",
203
+ "~/.gradle/gradle.properties",
204
+ "~/.lldbinit",
205
+ "~/.curlrc"
206
+ ],
207
+ "denyRead": [
208
+ "~/.ssh",
209
+ "~/.aws",
210
+ "~/.gnupg",
211
+ "~/Library/Keychains",
212
+ "~/.netrc",
213
+ "~/.git-credentials",
214
+ "~/.docker/config.json"
215
+ ]
216
+ },
217
+ "network": {
218
+ "strictAllowlist": true,
219
+ "allowLocalBinding": true,
220
+ "allowMachLookup": ["com.apple.coresimulator.*"],
221
+ "allowedDomains": [
222
+ "github.com",
223
+ "api.github.com",
224
+ "codeload.github.com",
225
+ "objects.githubusercontent.com",
226
+ "raw.githubusercontent.com",
227
+ "registry.npmjs.org",
228
+ "registry.yarnpkg.com",
229
+ "pypi.org",
230
+ "files.pythonhosted.org",
231
+ "repo.maven.apache.org",
232
+ "repo1.maven.org",
233
+ "dl.google.com",
234
+ "maven.google.com",
235
+ "plugins.gradle.org",
236
+ "plugins-artifacts.gradle.org",
237
+ "services.gradle.org",
238
+ "downloads.gradle.org",
239
+ "cdn.cocoapods.org",
240
+ "proxy.golang.org",
241
+ "sum.golang.org",
242
+ "index.crates.io",
243
+ "static.crates.io",
244
+ "rubygems.org"
245
+ ]
246
+ }
247
+ }
248
+ }
@@ -0,0 +1,198 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/unattended-profile.schema.json",
4
+ "title": "Unattended settings profile",
5
+ "description": "The permission profile the installer writes for unattended runs: the default mode, the allow and deny rules, the toolkit environment and the optional sandbox, each rule with the reason it exists.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["defaultMode", "wideAllows", "allow", "deny", "env", "sandbox"],
9
+ "$defs": {
10
+ "ruleWithReason": {
11
+ "type": "array",
12
+ "prefixItems": [
13
+ {
14
+ "type": "string",
15
+ "minLength": 1
16
+ },
17
+ {
18
+ "type": "string",
19
+ "minLength": 1
20
+ }
21
+ ],
22
+ "minItems": 2,
23
+ "maxItems": 2
24
+ }
25
+ },
26
+ "properties": {
27
+ "$comment": {
28
+ "type": "string"
29
+ },
30
+ "defaultMode": {
31
+ "type": "object",
32
+ "additionalProperties": false,
33
+ "required": ["value", "why"],
34
+ "properties": {
35
+ "value": {
36
+ "type": "string"
37
+ },
38
+ "why": {
39
+ "type": "string"
40
+ }
41
+ }
42
+ },
43
+ "wideAllows": {
44
+ "type": "array",
45
+ "description": "Allow rules in the attended settings that would let every call through; reported, never removed.",
46
+ "items": {
47
+ "type": "object",
48
+ "additionalProperties": false,
49
+ "required": ["rule", "why"],
50
+ "properties": {
51
+ "rule": {
52
+ "type": "string"
53
+ },
54
+ "why": {
55
+ "type": "string"
56
+ }
57
+ }
58
+ }
59
+ },
60
+ "allow": {
61
+ "type": "array",
62
+ "items": {
63
+ "$ref": "#/$defs/ruleWithReason"
64
+ }
65
+ },
66
+ "deny": {
67
+ "type": "array",
68
+ "items": {
69
+ "$ref": "#/$defs/ruleWithReason"
70
+ }
71
+ },
72
+ "env": {
73
+ "type": "array",
74
+ "description": "[name, value, reason] for each variable the unattended child receives.",
75
+ "items": {
76
+ "type": "array",
77
+ "prefixItems": [
78
+ {
79
+ "type": "string",
80
+ "pattern": "^[A-Z][A-Z0-9_]*$"
81
+ },
82
+ {
83
+ "type": "string"
84
+ },
85
+ {
86
+ "type": "string",
87
+ "minLength": 1
88
+ }
89
+ ],
90
+ "minItems": 3,
91
+ "maxItems": 3
92
+ }
93
+ },
94
+ "sandbox": {
95
+ "type": "object",
96
+ "additionalProperties": false,
97
+ "required": ["enabled"],
98
+ "properties": {
99
+ "$comment": {
100
+ "type": "string"
101
+ },
102
+ "enabled": {
103
+ "type": "boolean"
104
+ },
105
+ "failIfUnavailable": {
106
+ "type": "boolean"
107
+ },
108
+ "allowUnsandboxedCommands": {
109
+ "type": "boolean"
110
+ },
111
+ "network": {
112
+ "type": "object",
113
+ "additionalProperties": false,
114
+ "properties": {
115
+ "allowedDomains": {
116
+ "type": "array",
117
+ "items": {
118
+ "type": "string"
119
+ }
120
+ },
121
+ "deniedDomains": {
122
+ "type": "array",
123
+ "items": {
124
+ "type": "string"
125
+ }
126
+ },
127
+ "strictAllowlist": {
128
+ "type": "boolean"
129
+ },
130
+ "allowManagedDomainsOnly": {
131
+ "type": "boolean"
132
+ },
133
+ "allowLocalBinding": {
134
+ "type": "boolean"
135
+ },
136
+ "allowMachLookup": {
137
+ "type": "array",
138
+ "items": {
139
+ "type": "string"
140
+ }
141
+ }
142
+ }
143
+ },
144
+ "filesystem": {
145
+ "type": "object",
146
+ "additionalProperties": false,
147
+ "properties": {
148
+ "denyRead": {
149
+ "type": "array",
150
+ "items": {
151
+ "type": "string"
152
+ }
153
+ },
154
+ "allowWrite": {
155
+ "type": "array",
156
+ "items": {
157
+ "type": "string"
158
+ }
159
+ },
160
+ "denyWrite": {
161
+ "type": "array",
162
+ "items": {
163
+ "type": "string"
164
+ }
165
+ },
166
+ "allowRead": {
167
+ "type": "array",
168
+ "items": {
169
+ "type": "string"
170
+ }
171
+ },
172
+ "disabled": {
173
+ "type": "boolean"
174
+ }
175
+ }
176
+ },
177
+ "autoAllowBashIfSandboxed": {
178
+ "type": "boolean"
179
+ },
180
+ "enableWeakerNetworkIsolation": {
181
+ "type": "boolean"
182
+ },
183
+ "allowAppleEvents": {
184
+ "type": "boolean"
185
+ },
186
+ "enableWeakerNestedSandbox": {
187
+ "type": "boolean"
188
+ },
189
+ "excludedCommands": {
190
+ "type": "array",
191
+ "items": {
192
+ "type": "string"
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/worktrees.schema.json",
4
+ "title": "Run worktrees",
5
+ "description": "What `worktrees.mjs --json` prints: one entry per run that owns a worktree, with its size when --measure was passed. --redact removes every x-sensitivity local field.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion", "worktrees"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "worktrees": {
16
+ "type": "array",
17
+ "x-sensitivity": "none",
18
+ "items": {
19
+ "type": "object",
20
+ "additionalProperties": false,
21
+ "required": ["taskId", "exists", "sizeBytes", "measuredAt"],
22
+ "properties": {
23
+ "taskId": { "type": "string", "minLength": 1, "x-sensitivity": "none" },
24
+ "project": { "type": ["string", "null"], "x-sensitivity": "none" },
25
+ "worktreePath": {
26
+ "type": "string",
27
+ "x-sensitivity": "local",
28
+ "description": "Absolute path on this machine."
29
+ },
30
+ "exists": {
31
+ "type": "boolean",
32
+ "x-sensitivity": "none",
33
+ "description": "The directory is on disk. false: removed by Phase 4 or by hand, and the run still names it."
34
+ },
35
+ "sizeBytes": {
36
+ "type": ["integer", "null"],
37
+ "minimum": 0,
38
+ "x-sensitivity": "none",
39
+ "description": "Disk usage from du -sk. null unless --measure ran and the directory exists."
40
+ },
41
+ "measuredAt": {
42
+ "type": ["string", "null"],
43
+ "format": "date-time",
44
+ "x-sensitivity": "none",
45
+ "description": "When sizeBytes was taken; null when it was not."
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }
@@ -55,6 +55,7 @@ Validate contracts. Each emits `══ <name> smoke: N passed, M failed ══`
55
55
  - `smoke-multi-repo-integration.sh` - v5.6.0 integration build + learn-once registry (20 assertions)
56
56
  - `smoke-multi-repo-worktree.sh` - serial worktree creation with atomicity rollback
57
57
  - `smoke-prefs-language.sh` - `prefs.global.promptLanguage` contract
58
+ - `smoke-terminal-language.sh` - every terminal surface renders in `prefs.global.outputLanguage`, English as the fallback
58
59
  - `smoke-progress-contract.sh` - progress-line quiet/normal/verbose
59
60
  - `smoke-search.sh` - `/multi-agent:search` log search + smart ranking
60
61
  - `smoke-subagent-validators.sh` - Phase 1/2 validator schemas
@@ -0,0 +1,130 @@
1
+ /**
2
+ * _autopilot-config.mjs - ~/.claude/autopilot/config.json, checked against
3
+ * autopilot-config.schema.json at the moment it is loaded.
4
+ *
5
+ * Every reader turns the numbers in this file into ceilings: the spend ceiling,
6
+ * the attempt ceiling, the research-round ceiling, the slot count. `Number("$25")`
7
+ * is NaN, and every comparison with NaN is false, so a typo would read as "no
8
+ * ceiling at all". The readers therefore ask here first and treat any problem
9
+ * as a stop with the problem as its reason.
10
+ *
11
+ * The package ships without dependencies, so this is a small validator for the
12
+ * keywords the schema uses: type, const, enum, minimum, maximum, pattern,
13
+ * required, properties, additionalProperties, items and uniqueItems. `format`,
14
+ * `default` and the annotations are not assertions and are not checked.
15
+ *
16
+ * @module pipeline/scripts/_autopilot-config
17
+ */
18
+
19
+ import { readFileSync } from "node:fs";
20
+ import { join } from "node:path";
21
+
22
+ const SCHEMA_PATH = join(import.meta.dirname, "..", "schemas", "autopilot-config.schema.json");
23
+
24
+ let cached = null;
25
+ function schema() {
26
+ if (!cached) cached = JSON.parse(readFileSync(SCHEMA_PATH, "utf-8"));
27
+ return cached;
28
+ }
29
+
30
+ function typeOf(v) {
31
+ if (v === null) return "null";
32
+ if (Array.isArray(v)) return "array";
33
+ if (typeof v === "number") return Number.isInteger(v) ? "integer" : "number";
34
+ return typeof v;
35
+ }
36
+
37
+ function typeMatches(v, t) {
38
+ const actual = typeOf(v);
39
+ if (t === "number") return actual === "number" || actual === "integer";
40
+ return actual === t;
41
+ }
42
+
43
+ function check(node, v, path, out) {
44
+ if (!node || typeof node !== "object") return;
45
+ const where = path || "config";
46
+ if (node.type !== undefined) {
47
+ const types = [node.type].flat();
48
+ if (!types.some((t) => typeMatches(v, t))) {
49
+ out.push(`${where} must be ${types.join(" or ")}, got ${JSON.stringify(v)}`);
50
+ return;
51
+ }
52
+ }
53
+ if ("const" in node && v !== node.const) {
54
+ out.push(`${where} must be ${JSON.stringify(node.const)}, got ${JSON.stringify(v)}`);
55
+ }
56
+ if (Array.isArray(node.enum) && !node.enum.includes(v)) {
57
+ out.push(`${where} must be one of ${node.enum.join(", ")}, got ${JSON.stringify(v)}`);
58
+ }
59
+ if (typeof v === "number") {
60
+ if (typeof node.minimum === "number" && v < node.minimum) {
61
+ out.push(`${where} must be >= ${node.minimum}, got ${v}`);
62
+ }
63
+ if (typeof node.maximum === "number" && v > node.maximum) {
64
+ out.push(`${where} must be <= ${node.maximum}, got ${v}`);
65
+ }
66
+ }
67
+ if (typeof v === "string") {
68
+ if (typeof node.minLength === "number" && v.length < node.minLength) {
69
+ out.push(
70
+ `${where} must be at least ${node.minLength} character(s), got ${JSON.stringify(v)}`,
71
+ );
72
+ }
73
+ if (typeof node.maxLength === "number" && v.length > node.maxLength) {
74
+ out.push(`${where} must be at most ${node.maxLength} character(s), got ${JSON.stringify(v)}`);
75
+ }
76
+ if (typeof node.pattern === "string" && !new RegExp(node.pattern).test(v)) {
77
+ out.push(`${where} must match ${node.pattern}, got ${JSON.stringify(v)}`);
78
+ }
79
+ }
80
+ if (Array.isArray(v)) {
81
+ if (node.items) v.forEach((x, i) => check(node.items, x, `${where}[${i}]`, out));
82
+ if (node.uniqueItems && new Set(v.map((x) => JSON.stringify(x))).size !== v.length) {
83
+ out.push(`${where} must not repeat an item`);
84
+ }
85
+ }
86
+ if (typeOf(v) === "object") {
87
+ for (const key of node.required || []) {
88
+ if (!(key in v)) out.push(`${where}.${key} is required`);
89
+ }
90
+ const props = node.properties || {};
91
+ for (const [key, value] of Object.entries(v)) {
92
+ const sub = `${path ? path + "." : ""}${key}`;
93
+ if (key in props) check(props[key], value, sub, out);
94
+ else if (node.additionalProperties === false) out.push(`${sub} is not a known key`);
95
+ }
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Every way `config` breaks the schema, as one readable line each. Empty means
101
+ * valid.
102
+ *
103
+ * @param {unknown} config
104
+ * @returns {string[]}
105
+ */
106
+ export function configProblems(config) {
107
+ let doc;
108
+ try {
109
+ doc = schema();
110
+ } catch (e) {
111
+ return [`autopilot-config.schema.json cannot be read (${e?.message || e})`];
112
+ }
113
+ const out = [];
114
+ check(doc, config, "", out);
115
+ return out;
116
+ }
117
+
118
+ /**
119
+ * One sentence for a refusal, or null when the config is valid.
120
+ *
121
+ * @param {unknown} config
122
+ * @returns {string|null}
123
+ */
124
+ export function configRefusal(config) {
125
+ const problems = configProblems(config);
126
+ if (!problems.length) return null;
127
+ const shown = problems.slice(0, 3).join("; ");
128
+ const more = problems.length > 3 ? ` (+${problems.length - 3} more)` : "";
129
+ return `autopilot config.json is invalid: ${shown}${more}`;
130
+ }