@mmerterden/multi-agent-pipeline 20.2.1 → 20.3.1

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 (622) hide show
  1. package/CHANGELOG.md +919 -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 +617 -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/usage-endpoint.mjs +33 -0
  148. package/pipeline/lib/user-facing.mjs +82 -0
  149. package/pipeline/lib/user-facing.sh +58 -0
  150. package/pipeline/multi-agent-refs/_dev-context.md +1 -1
  151. package/pipeline/multi-agent-refs/analysis/evidence.md +4 -0
  152. package/pipeline/multi-agent-refs/analysis/locked.md +2 -2
  153. package/pipeline/multi-agent-refs/analysis/render.md +4 -3
  154. package/pipeline/multi-agent-refs/analysis/resolve.md +3 -1
  155. package/pipeline/multi-agent-refs/analysis/synthesis.md +4 -5
  156. package/pipeline/multi-agent-refs/analysis-template.md +10 -17
  157. package/pipeline/multi-agent-refs/channels/jira.md +1 -1
  158. package/pipeline/multi-agent-refs/component-dispatch.md +3 -3
  159. package/pipeline/multi-agent-refs/conventions-defaults.md +32 -32
  160. package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -17
  161. package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +37 -9
  162. package/pipeline/multi-agent-refs/features/autopilot-operations.md +277 -0
  163. package/pipeline/multi-agent-refs/features/constitution.md +196 -0
  164. package/pipeline/multi-agent-refs/features/doctor.md +6 -3
  165. package/pipeline/multi-agent-refs/features/external-context-injection.md +6 -1
  166. package/pipeline/multi-agent-refs/features/jira-context.md +1 -1
  167. package/pipeline/multi-agent-refs/features/maturity-followup.md +43 -23
  168. package/pipeline/multi-agent-refs/features/model-fallback.md +9 -0
  169. package/pipeline/multi-agent-refs/features/phone-api.md +306 -0
  170. package/pipeline/multi-agent-refs/features/plan-critic.md +159 -0
  171. package/pipeline/multi-agent-refs/features/research.md +150 -0
  172. package/pipeline/multi-agent-refs/features/review-decision.md +185 -0
  173. package/pipeline/multi-agent-refs/features/scaffold.md +160 -0
  174. package/pipeline/multi-agent-refs/features/security-audit.md +6 -2
  175. package/pipeline/multi-agent-refs/features/skill-conformance.md +4 -1
  176. package/pipeline/multi-agent-refs/features/stack-adapters.md +116 -0
  177. package/pipeline/multi-agent-refs/features/unattended-gates.md +316 -0
  178. package/pipeline/multi-agent-refs/features/unattended-security.md +731 -0
  179. package/pipeline/multi-agent-refs/features/url-enrichment.md +2 -2
  180. package/pipeline/multi-agent-refs/features/usage-reporting.md +127 -35
  181. package/pipeline/multi-agent-refs/features/verify-by-test.md +1 -1
  182. package/pipeline/multi-agent-refs/features/visual-evidence.md +7 -7
  183. package/pipeline/multi-agent-refs/keychain.md +6 -11
  184. package/pipeline/multi-agent-refs/payload-contracts.md +2 -2
  185. package/pipeline/multi-agent-refs/phases/log-format.md +2 -3
  186. package/pipeline/multi-agent-refs/phases/modes.md +10 -12
  187. package/pipeline/multi-agent-refs/phases/operations.md +11 -5
  188. package/pipeline/multi-agent-refs/phases/phase-0-init.md +73 -81
  189. package/pipeline/multi-agent-refs/phases/phase-1-plan.md +22 -22
  190. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +42 -66
  191. package/pipeline/multi-agent-refs/phases/phase-3-review.md +45 -79
  192. package/pipeline/multi-agent-refs/phases/phase-4-commit.md +28 -38
  193. package/pipeline/multi-agent-refs/phases/phase-5-report.md +27 -25
  194. package/pipeline/multi-agent-refs/phases.md +1 -1
  195. package/pipeline/multi-agent-refs/picker-contract.md +1 -1
  196. package/pipeline/multi-agent-refs/progress-contract.md +13 -16
  197. package/pipeline/multi-agent-refs/readiness-review.md +1 -1
  198. package/pipeline/multi-agent-refs/research/engine.md +91 -0
  199. package/pipeline/multi-agent-refs/rules.md +6 -4
  200. package/pipeline/multi-agent-refs/setup/repo-discovery.md +2 -2
  201. package/pipeline/multi-agent-refs/tracker-contract.md +2 -2
  202. package/pipeline/multi-agent-refs/unattended-contract.md +68 -16
  203. package/pipeline/rules/figma-pipeline.md +12 -12
  204. package/pipeline/schemas/agent-state.schema.json +480 -18
  205. package/pipeline/schemas/analysis-spec.schema.json +4 -4
  206. package/pipeline/schemas/answer-request.schema.json +24 -0
  207. package/pipeline/schemas/answer-result.schema.json +28 -0
  208. package/pipeline/schemas/autopilot-config.schema.json +111 -13
  209. package/pipeline/schemas/command-parameters.schema.json +99 -0
  210. package/pipeline/schemas/constitution.schema.json +56 -0
  211. package/pipeline/schemas/contract-error.schema.json +52 -0
  212. package/pipeline/schemas/design-check-config.schema.json +5 -1
  213. package/pipeline/schemas/issues.schema.json +61 -0
  214. package/pipeline/schemas/launch-plan.schema.json +46 -0
  215. package/pipeline/schemas/launch-request.schema.json +45 -0
  216. package/pipeline/schemas/launch.json +61 -0
  217. package/pipeline/schemas/launch.schema.json +84 -0
  218. package/pipeline/schemas/phases.json +2 -2
  219. package/pipeline/schemas/phases.schema.json +68 -0
  220. package/pipeline/schemas/phone-devices.schema.json +61 -0
  221. package/pipeline/schemas/phone-signed-request.schema.json +67 -0
  222. package/pipeline/schemas/plan-critique.schema.json +99 -0
  223. package/pipeline/schemas/plan-todos.schema.json +7 -7
  224. package/pipeline/schemas/planning-output.schema.json +5 -0
  225. package/pipeline/schemas/pr-request.schema.json +46 -0
  226. package/pipeline/schemas/prefs.schema.json +79 -8
  227. package/pipeline/schemas/research-output.schema.json +118 -0
  228. package/pipeline/schemas/review-file-exclusions.schema.json +25 -0
  229. package/pipeline/schemas/reviewer-output.schema.json +40 -4
  230. package/pipeline/schemas/run-questions.json +392 -0
  231. package/pipeline/schemas/run-questions.schema.json +118 -0
  232. package/pipeline/schemas/runs-index.schema.json +189 -0
  233. package/pipeline/schemas/scaffold-manifest.schema.json +43 -0
  234. package/pipeline/schemas/secret-patterns.schema.json +28 -0
  235. package/pipeline/schemas/stack-adapters.json +527 -0
  236. package/pipeline/schemas/stack-adapters.schema.json +184 -0
  237. package/pipeline/schemas/token-budget.json +1 -1
  238. package/pipeline/schemas/token-budget.schema.json +26 -0
  239. package/pipeline/schemas/triage-output.schema.json +64 -3
  240. package/pipeline/schemas/unattended-policy.json +139 -0
  241. package/pipeline/schemas/unattended-policy.schema.json +73 -0
  242. package/pipeline/schemas/unattended-profile.json +248 -0
  243. package/pipeline/schemas/unattended-profile.schema.json +198 -0
  244. package/pipeline/schemas/worktrees.schema.json +51 -0
  245. package/pipeline/scripts/README.md +1 -0
  246. package/pipeline/scripts/_autopilot-config.mjs +130 -0
  247. package/pipeline/scripts/_autopilot-ops.mjs +567 -0
  248. package/pipeline/scripts/_autopilot-outcomes.mjs +174 -0
  249. package/pipeline/scripts/_command-contract.mjs +384 -0
  250. package/pipeline/scripts/_cost.mjs +40 -0
  251. package/pipeline/scripts/_notices.mjs +160 -0
  252. package/pipeline/scripts/_phone-auth.mjs +485 -0
  253. package/pipeline/scripts/_pre-existing.mjs +294 -0
  254. package/pipeline/scripts/_redact.mjs +77 -0
  255. package/pipeline/scripts/_run-paths.mjs +4 -2
  256. package/pipeline/scripts/_stack-adapter.mjs +678 -0
  257. package/pipeline/scripts/_stack-routing.mjs +1 -1
  258. package/pipeline/scripts/agent-guard.py +348 -37
  259. package/pipeline/scripts/agent-guard.sh +41 -13
  260. package/pipeline/scripts/analysis-story-tree.mjs +79 -3
  261. package/pipeline/scripts/answer-question.mjs +181 -0
  262. package/pipeline/scripts/audit-log-rotate.sh +1 -4
  263. package/pipeline/scripts/audit-log.sh +4 -4
  264. package/pipeline/scripts/autopilot-arming.mjs +389 -21
  265. package/pipeline/scripts/autopilot-awake.mjs +255 -0
  266. package/pipeline/scripts/autopilot-intake.mjs +137 -36
  267. package/pipeline/scripts/autopilot-menubar.swift +156 -44
  268. package/pipeline/scripts/autopilot-publish.mjs +1625 -0
  269. package/pipeline/scripts/autopilot-runner.mjs +1678 -222
  270. package/pipeline/scripts/autopilot-status.sh +198 -33
  271. package/pipeline/scripts/build-lock.sh +120 -0
  272. package/pipeline/scripts/build-references.mjs +4 -1
  273. package/pipeline/scripts/build-stack-plugins.mjs +59 -22
  274. package/pipeline/scripts/capture-flush.sh +1 -1
  275. package/pipeline/scripts/capture-resume.sh +13 -9
  276. package/pipeline/scripts/check-derived-drift.mjs +52 -11
  277. package/pipeline/scripts/commands.mjs +88 -0
  278. package/pipeline/scripts/constitution.mjs +362 -0
  279. package/pipeline/scripts/contract-server.mjs +776 -0
  280. package/pipeline/scripts/cost-analyze.mjs +89 -39
  281. package/pipeline/scripts/diff-explain.mjs +12 -1
  282. package/pipeline/scripts/doctor.mjs +77 -28
  283. package/pipeline/scripts/evidence-gate.mjs +192 -12
  284. package/pipeline/scripts/feedback-send.mjs +4 -2
  285. package/pipeline/scripts/gate-ledger.mjs +449 -0
  286. package/pipeline/scripts/gc-abandoned.sh +132 -13
  287. package/pipeline/scripts/gen-facts.mjs +31 -15
  288. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  289. package/pipeline/scripts/github-ssh-setup.sh +140 -29
  290. package/pipeline/scripts/graph-mermaid.mjs +4 -1
  291. package/pipeline/scripts/issues.mjs +236 -0
  292. package/pipeline/scripts/jira-attach.sh +6 -2
  293. package/pipeline/scripts/jira-search.sh +4 -3
  294. package/pipeline/scripts/keychain-save.sh +125 -24
  295. package/pipeline/scripts/keychain.py +63 -93
  296. package/pipeline/scripts/launch-request.mjs +747 -0
  297. package/pipeline/scripts/localize-commands.mjs +4 -10
  298. package/pipeline/scripts/log-metric.sh +6 -5
  299. package/pipeline/scripts/maturity-followup.mjs +13 -4
  300. package/pipeline/scripts/memory-save.sh +25 -0
  301. package/pipeline/scripts/migrate-prefs.mjs +4 -3
  302. package/pipeline/scripts/open-questions-gate.mjs +276 -0
  303. package/pipeline/scripts/phase-tracker.sh +41 -27
  304. package/pipeline/scripts/phase0-exit-gate.mjs +22 -4
  305. package/pipeline/scripts/phone-devices.mjs +224 -0
  306. package/pipeline/scripts/plan-coverage-gate.mjs +200 -66
  307. package/pipeline/scripts/plan-critique-gate.mjs +591 -0
  308. package/pipeline/scripts/pr-request.mjs +188 -0
  309. package/pipeline/scripts/pre-commit-check.sh +115 -4
  310. package/pipeline/scripts/probe-evidence-capability.sh +44 -5
  311. package/pipeline/scripts/record-phase.mjs +71 -0
  312. package/pipeline/scripts/render-agent-log-cost.sh +17 -2
  313. package/pipeline/scripts/render-cost-summary.sh +1 -1
  314. package/pipeline/scripts/render-work-summary.sh +1 -1
  315. package/pipeline/scripts/require-supported-version.sh +4 -1
  316. package/pipeline/scripts/research-gate.mjs +704 -0
  317. package/pipeline/scripts/review-decision-gate.mjs +403 -0
  318. package/pipeline/scripts/routine-registry.mjs +5 -2
  319. package/pipeline/scripts/runs-index.mjs +135 -27
  320. package/pipeline/scripts/scaffold-gate.mjs +393 -0
  321. package/pipeline/scripts/skill-conformance.mjs +25 -8
  322. package/pipeline/scripts/skill-siblings.mjs +2 -1
  323. package/pipeline/scripts/smoke-cross-cli-behavior.sh +32 -6
  324. package/pipeline/scripts/smoke-schema-validation.sh +6 -2
  325. package/pipeline/scripts/spec-consistency-gate.mjs +469 -0
  326. package/pipeline/scripts/symbol-existence-gate.mjs +450 -0
  327. package/pipeline/scripts/test-gap-scan.mjs +40 -2
  328. package/pipeline/scripts/test-integrity-gate.mjs +20 -4
  329. package/pipeline/scripts/test-strength.mjs +484 -0
  330. package/pipeline/scripts/test-summary.mjs +651 -0
  331. package/pipeline/scripts/triage-memory.mjs +49 -9
  332. package/pipeline/scripts/unattended_policy.py +2786 -0
  333. package/pipeline/scripts/uninstall.mjs +10 -10
  334. package/pipeline/scripts/update-issue-progress.sh +1 -1
  335. package/pipeline/scripts/usage-identity.mjs +288 -0
  336. package/pipeline/scripts/usage-register.mjs +187 -67
  337. package/pipeline/scripts/usage-report.mjs +232 -67
  338. package/pipeline/scripts/validate-complaint-doc.mjs +28 -10
  339. package/pipeline/scripts/validate-planning.mjs +6 -0
  340. package/pipeline/scripts/verify-citations.mjs +151 -38
  341. package/pipeline/scripts/verify.mjs +58 -18
  342. package/pipeline/scripts/worktree-prepare.sh +126 -0
  343. package/pipeline/scripts/worktrees.mjs +124 -0
  344. package/pipeline/scripts/write-state.mjs +48 -17
  345. package/pipeline/skills/.skill-manifest.json +222 -226
  346. package/pipeline/skills/.skills-index.json +77 -88
  347. package/pipeline/skills/shared/README.md +44 -45
  348. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +3 -2
  349. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +3 -2
  350. package/pipeline/skills/shared/core/multi-agent/SKILL.md +10 -9
  351. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +6 -5
  352. package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +11 -3
  353. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +2 -1
  354. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -3
  355. package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +32 -6
  356. package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +66 -8
  357. package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +27 -9
  358. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +2 -1
  359. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -4
  360. package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +3 -2
  361. package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +2 -1
  362. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +7 -5
  363. package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +2 -1
  364. package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +3 -2
  365. package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +2 -1
  366. package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +2 -1
  367. package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +2 -1
  368. package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +2 -1
  369. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -1
  370. package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -1
  371. package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +3 -2
  372. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -1
  373. package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +7 -4
  374. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -1
  375. package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +2 -1
  376. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +2 -1
  377. package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -1
  378. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +2 -1
  379. package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +2 -1
  380. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +2 -1
  381. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +2 -1
  382. package/pipeline/skills/shared/core/multi-agent-research/SKILL.md +35 -0
  383. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +7 -3
  384. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +7 -5
  385. package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +2 -1
  386. package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +3 -2
  387. package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +2 -1
  388. package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +2 -1
  389. package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +2 -1
  390. package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +2 -1
  391. package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +2 -1
  392. package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +3 -2
  393. package/pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md +30 -0
  394. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -1
  395. package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +4 -3
  396. package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +2 -1
  397. package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +60 -0
  398. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +8 -8
  399. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -1
  400. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +7 -8
  401. package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -1
  402. package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +2 -1
  403. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +10 -10
  404. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +2 -1
  405. package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +2 -1
  406. package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +2 -1
  407. package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +2 -1
  408. package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +2 -1
  409. package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -1
  410. package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +3 -2
  411. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +2 -1
  412. package/pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md +46 -0
  413. package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +9 -3
  414. package/pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md +54 -0
  415. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +9 -11
  416. package/pipeline/skills/shared/external/NOTICE-vibeship-spawner-skills.md +203 -0
  417. package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +10 -3
  418. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +131 -25
  419. package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -3
  420. package/pipeline/skills/shared/external/alarmkit/SKILL.md +2 -1
  421. package/pipeline/skills/shared/external/android-architecture/SKILL.md +85 -76
  422. package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +51 -3
  423. package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +9 -0
  424. package/pipeline/skills/shared/external/android-datastore/SKILL.md +4 -3
  425. package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +4 -3
  426. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +106 -181
  427. package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +147 -0
  428. package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +45 -4
  429. package/pipeline/skills/shared/external/android-performance/SKILL.md +27 -2
  430. package/pipeline/skills/shared/external/android-performance/references/patterns.md +37 -37
  431. package/pipeline/skills/shared/external/api-patterns/SKILL.md +111 -67
  432. package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +128 -0
  433. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +136 -186
  434. package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +140 -0
  435. package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +207 -0
  436. package/pipeline/skills/shared/external/api-security-best-practices/references/operations.md +66 -0
  437. package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +175 -0
  438. package/pipeline/skills/shared/external/app-clips/SKILL.md +2 -0
  439. package/pipeline/skills/shared/external/app-intents/SKILL.md +2 -0
  440. package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +4 -3
  441. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +2 -0
  442. package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -0
  443. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +2 -0
  444. package/pipeline/skills/shared/external/architecture/SKILL.md +106 -39
  445. package/pipeline/skills/shared/external/architecture/references/adr-and-review.md +76 -0
  446. package/pipeline/skills/shared/external/authentication/SKILL.md +2 -0
  447. package/pipeline/skills/shared/external/avkit/SKILL.md +2 -0
  448. package/pipeline/skills/shared/external/background-processing/SKILL.md +2 -1
  449. package/pipeline/skills/shared/external/backlog/SKILL.md +3 -2
  450. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +2 -0
  451. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +1 -1
  452. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +3 -2
  453. package/pipeline/skills/shared/external/clean-code/SKILL.md +192 -90
  454. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +2 -1
  455. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +1 -1
  456. package/pipeline/skills/shared/external/compose-components/SKILL.md +4 -4
  457. package/pipeline/skills/shared/external/compose-navigation/SKILL.md +22 -22
  458. package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +10 -10
  459. package/pipeline/skills/shared/external/compose-testing/SKILL.md +13 -6
  460. package/pipeline/skills/shared/external/compose-testing/references/patterns.md +59 -59
  461. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +2 -0
  462. package/pipeline/skills/shared/external/context-compression/SKILL.md +118 -250
  463. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +2 -0
  464. package/pipeline/skills/shared/external/core-data/SKILL.md +2 -0
  465. package/pipeline/skills/shared/external/core-motion/SKILL.md +2 -0
  466. package/pipeline/skills/shared/external/core-nfc/SKILL.md +2 -0
  467. package/pipeline/skills/shared/external/coreml/SKILL.md +2 -1
  468. package/pipeline/skills/shared/external/council/SKILL.md +2 -1
  469. package/pipeline/skills/shared/external/cryptokit/SKILL.md +2 -0
  470. package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
  471. package/pipeline/skills/shared/external/database-patterns/SKILL.md +3 -2
  472. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +2 -0
  473. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +130 -20
  474. package/pipeline/skills/shared/external/debugging-strategies/references/hard-cases.md +54 -0
  475. package/pipeline/skills/shared/external/device-integrity/SKILL.md +2 -0
  476. package/pipeline/skills/shared/external/docker-expert/SKILL.md +137 -381
  477. package/pipeline/skills/shared/external/docker-expert/references/patterns.md +98 -0
  478. package/pipeline/skills/shared/external/energykit/SKILL.md +2 -1
  479. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +3 -1
  480. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +2 -2
  481. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +116 -185
  482. package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +235 -0
  483. package/pipeline/skills/shared/external/fastapi-pro/references/testing-and-deployment.md +69 -0
  484. package/pipeline/skills/shared/external/firebase/SKILL.md +4 -3
  485. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +151 -293
  486. package/pipeline/skills/shared/external/github-actions-templates/references/patterns.md +96 -0
  487. package/pipeline/skills/shared/external/healthkit/SKILL.md +2 -0
  488. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +69 -72
  489. package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +111 -0
  490. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +77 -86
  491. package/pipeline/skills/shared/external/hig-components-layout/references/containers.md +98 -0
  492. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +150 -78
  493. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +76 -97
  494. package/pipeline/skills/shared/external/hig-components-system/references/surfaces.md +98 -0
  495. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +48 -76
  496. package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +132 -0
  497. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +147 -106
  498. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +61 -77
  499. package/pipeline/skills/shared/external/hig-patterns/references/patterns.md +92 -0
  500. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +147 -77
  501. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +61 -121
  502. package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +108 -0
  503. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +2 -0
  504. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +1 -1
  505. package/pipeline/skills/shared/external/html-semantic/SKILL.md +3 -2
  506. package/pipeline/skills/shared/external/humanizer/SKILL.md +2 -1
  507. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +2 -0
  508. package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +2 -1
  509. package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +14 -2
  510. package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
  511. package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +4 -3
  512. package/pipeline/skills/shared/external/ios-localization/SKILL.md +8 -6
  513. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +2 -2
  514. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +11 -11
  515. package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +2 -1
  516. package/pipeline/skills/shared/external/ios-networking/SKILL.md +2 -0
  517. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +2 -0
  518. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +102 -193
  519. package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +103 -0
  520. package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -2
  521. package/pipeline/skills/shared/external/live-activities/evals/evals.json +2 -2
  522. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +7 -9
  523. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +3 -3
  524. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +2 -2
  525. package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +4 -3
  526. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +5 -3
  527. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +2 -0
  528. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +1 -1
  529. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +2 -0
  530. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +1 -1
  531. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +149 -46
  532. package/pipeline/skills/shared/external/monorepo-architect/references/patterns.md +70 -0
  533. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +2 -0
  534. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +1 -1
  535. package/pipeline/skills/shared/external/natural-language/SKILL.md +2 -0
  536. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +3 -2
  537. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +91 -21
  538. package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +247 -0
  539. package/pipeline/skills/shared/external/nodejs-backend-patterns/references/testing-and-frameworks.md +57 -0
  540. package/pipeline/skills/shared/external/observability-engineer/SKILL.md +155 -232
  541. package/pipeline/skills/shared/external/observability-engineer/references/patterns.md +75 -0
  542. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +2 -0
  543. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +2 -2
  544. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +18 -18
  545. package/pipeline/skills/shared/external/pdfkit/SKILL.md +2 -1
  546. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +2 -0
  547. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +1 -1
  548. package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -0
  549. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +2 -1
  550. package/pipeline/skills/shared/external/push-notifications/SKILL.md +2 -0
  551. package/pipeline/skills/shared/external/python-patterns/SKILL.md +3 -2
  552. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +3 -2
  553. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +2 -2
  554. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +1 -1
  555. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +3 -2
  556. package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +7 -7
  557. package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +69 -69
  558. package/pipeline/skills/shared/external/room-database/references/patterns.md +126 -126
  559. package/pipeline/skills/shared/external/search-first/SKILL.md +2 -1
  560. package/pipeline/skills/shared/external/security-review/SKILL.md +4 -3
  561. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +2 -2
  562. package/pipeline/skills/shared/external/signal-community/SKILL.md +1 -1
  563. package/pipeline/skills/shared/external/skill-creator/SKILL.md +2 -1
  564. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +2 -1
  565. package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +2 -0
  566. package/pipeline/skills/shared/external/storekit/SKILL.md +2 -0
  567. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +2 -0
  568. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +2 -1
  569. package/pipeline/skills/shared/external/swift-charts/SKILL.md +2 -1
  570. package/pipeline/skills/shared/external/swift-codable/SKILL.md +2 -0
  571. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +3 -1
  572. package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +5 -4
  573. package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -1
  574. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +2 -0
  575. package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -1
  576. package/pipeline/skills/shared/external/swift-security/SKILL.md +2 -1
  577. package/pipeline/skills/shared/external/swift-testing/SKILL.md +2 -0
  578. package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -1
  579. package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +10 -0
  580. package/pipeline/skills/shared/external/swiftdata/SKILL.md +2 -0
  581. package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -1
  582. package/pipeline/skills/shared/external/swiftlint/SKILL.md +2 -0
  583. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +2 -0
  584. package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +3 -1
  585. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +2 -0
  586. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +2 -0
  587. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +2 -0
  588. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +2 -0
  589. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +3 -1
  590. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +3 -1
  591. package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +5 -4
  592. package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -1
  593. package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +5 -4
  594. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +2 -0
  595. package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +4 -3
  596. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +2 -0
  597. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
  598. package/pipeline/skills/shared/external/testing-backend/SKILL.md +3 -2
  599. package/pipeline/skills/shared/external/tipkit/SKILL.md +2 -0
  600. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +3 -2
  601. package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -0
  602. package/pipeline/skills/shared/external/vue-composition/SKILL.md +3 -2
  603. package/pipeline/skills/shared/external/weatherkit/SKILL.md +2 -0
  604. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +3 -2
  605. package/pipeline/skills/shared/external/web-performance/SKILL.md +3 -2
  606. package/pipeline/skills/shared/external/web-testing/SKILL.md +3 -2
  607. package/pipeline/skills/shared/external/widgetkit/SKILL.md +2 -0
  608. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +1 -1
  609. package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +2 -0
  610. package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +2 -0
  611. package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +2 -0
  612. package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +2 -0
  613. package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +2 -0
  614. package/pipeline/skills/skills-index.md +40 -41
  615. package/docs/token-budget-history.md +0 -24
  616. package/pipeline/skills/shared/external/agentflow/SKILL.md +0 -199
  617. package/pipeline/skills/shared/external/android-ui-verification/SKILL.md +0 -66
  618. package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +0 -299
  619. package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +0 -255
  620. package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +0 -167
  621. package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +0 -116
  622. package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -216
@@ -61,11 +61,79 @@ import { dirname, join } from "node:path";
61
61
  import { fileURLToPath } from "node:url";
62
62
  import { costUsd } from "./_cost.mjs";
63
63
  import { runMain } from "../lib/fatal.mjs";
64
+ import { messages, outputLanguage } from "../lib/user-facing.mjs";
64
65
 
65
66
  const HERE = dirname(fileURLToPath(import.meta.url));
66
67
  const STORE = process.env.COST_SNAPSHOT_STORE || join(homedir(), ".claude", "state", "cost");
67
68
  const TRANSCRIPT_ROOT = process.env.COST_TRANSCRIPT_ROOT || join(homedir(), ".claude", "projects");
68
69
 
70
+ // The report is read by whoever ran it, so it renders in
71
+ // `prefs.global.outputLanguage`. Both languages sit on one key so a wording
72
+ // change cannot land on only one of them, and `--json` is untouched: that half
73
+ // is parsed, not read.
74
+ const REPORT = {
75
+ en: {
76
+ rate: (days, total, observedDays, perDay) =>
77
+ `last ${days} days: ${total} (${observedDays} days carry records) - ${perDay} a day`,
78
+ horizon: (d7, d30, d90) => ` 7 days ${d7} - 30 days ${d30} - 90 days ${d90}`,
79
+ noCeiling:
80
+ " no exhaustion date: --monthly-usd was not given and this machine declares no monthly ceiling",
81
+ noSpend: " nothing spent, so there is nothing to exhaust",
82
+ exhausts: (ceiling, days) =>
83
+ ` the ${ceiling} monthly ceiling runs out in ${days} days at this rate`,
84
+ unpriced: (n, models) =>
85
+ ` ${n} records could not be priced (${models}) - they are outside the total`,
86
+ noModelField: "no model field",
87
+ listPrice: " (estimated at list price, not what a subscription paid)",
88
+ family: (n, by, median, basis, threshold) =>
89
+ `${n} ${by} - median ${median} - scale ${basis} - threshold z>=${threshold}`,
90
+ inFamily: " nothing out of family",
91
+ moreFlagged: (n, by) => ` ... and ${n} more ${by} above the threshold`,
92
+ burn: (day, spend, priorDays, priorPerDay) =>
93
+ `${day}: ${spend} - the preceding ${priorDays} days averaged ${priorPerDay} a day`,
94
+ noPrior: " nothing spent in the preceding window, so there is no ratio",
95
+ ratio: (ratio, past, factor) =>
96
+ ` ${ratio}x ${past ? `- past the ${factor}x threshold` : "- within the normal range"}`,
97
+ saved: (path, days, total, perDay) =>
98
+ `saved: ${path}\n last ${days} days ${total} - ${perDay} a day`,
99
+ empty: " (empty)",
100
+ snapshot: (at, total, days) => ` ${at} ${total} / ${days} days`,
101
+ perDayDiff: (from, to, delta) => ` a day ${from} -> ${to} (${delta})`,
102
+ windowsDiffer: (a, b) =>
103
+ ` ! different windows (${a} / ${b} days) - the daily rate compares, the total does not`,
104
+ },
105
+ tr: {
106
+ rate: (days, total, observedDays, perDay) =>
107
+ `son ${days} gun: ${total} (${observedDays} gunde kayit var) - gunluk ${perDay}`,
108
+ horizon: (d7, d30, d90) => ` 7 gun ${d7} - 30 gun ${d30} - 90 gun ${d90}`,
109
+ noCeiling:
110
+ " butce tukenme tarihi yok: --monthly-usd verilmedi, bu makinede aylik tavan tanimli degil",
111
+ noSpend: " harcama yok, tukenme hesaplanamaz",
112
+ exhausts: (ceiling, days) => ` ${ceiling} aylik tavan bu hizda ${days} gunde biter`,
113
+ unpriced: (n, models) => ` ${n} kayit fiyatlanamadi (${models}) - toplamin disinda`,
114
+ noModelField: "model alani yok",
115
+ listPrice: " (liste fiyatindan tahmin, abonelikte odenen tutar degil)",
116
+ family: (n, by, median, basis, threshold) =>
117
+ `${n} ${by} - medyan ${median} - olcek ${basis} - esik z>=${threshold}`,
118
+ inFamily: " aile disinda kayit yok",
119
+ moreFlagged: (n, by) => ` ... ve ${n} ${by} daha esigin uzerinde`,
120
+ burn: (day, spend, priorDays, priorPerDay) =>
121
+ `${day}: ${spend} - onceki ${priorDays} gun gunluk ortalama ${priorPerDay}`,
122
+ noPrior: " onceki pencerede harcama yok, oran hesaplanamaz",
123
+ ratio: (ratio, past, factor) =>
124
+ ` ${ratio}x ${past ? `- esik ${factor}x asildi` : "- normal aralik"}`,
125
+ saved: (path, days, total, perDay) =>
126
+ `kaydedildi: ${path}\n son ${days} gun ${total} - gunluk ${perDay}`,
127
+ empty: " (bos)",
128
+ snapshot: (at, total, days) => ` ${at} ${total} / ${days} gun`,
129
+ perDayDiff: (from, to, delta) => ` gunluk ${from} -> ${to} (${delta})`,
130
+ windowsDiffer: (a, b) =>
131
+ ` ! pencereler farkli (${a} / ${b} gun) - gunluk oran karsilastirilabilir, toplam degil`,
132
+ },
133
+ };
134
+
135
+ const say = messages(REPORT, outputLanguage());
136
+
69
137
  function die(msg) {
70
138
  process.stderr.write(`cost-analyze: ${msg}\n`);
71
139
  process.exit(2);
@@ -336,27 +404,21 @@ async function cmdProjection(json) {
336
404
  );
337
405
  } else {
338
406
  process.stdout.write(
339
- `son ${days} gun: ${usd(total)} (${observedDays} gunde kayit var) - gunluk ${usd(perDay)}\n` +
340
- ` 7 gun ${usd(proj[7])} - 30 gun ${usd(proj[30])} - 90 gun ${usd(proj[90])}\n`,
407
+ `${say.rate(days, usd(total), observedDays, usd(perDay))}\n` +
408
+ `${say.horizon(usd(proj[7]), usd(proj[30]), usd(proj[90]))}\n`,
341
409
  );
342
- if (monthly === null)
343
- process.stdout.write(
344
- " butce tukenme tarihi yok: --monthly-usd verilmedi, bu makinede aylik tavan tanimli degil\n",
345
- );
346
- else if (exhaustDays === null) process.stdout.write(" harcama yok, tukenme hesaplanamaz\n");
347
- else
348
- process.stdout.write(
349
- ` ${usd(monthly)} aylik tavan bu hizda ${exhaustDays.toFixed(1)} gunde biter\n`,
350
- );
410
+ if (monthly === null) process.stdout.write(`${say.noCeiling}\n`);
411
+ else if (exhaustDays === null) process.stdout.write(`${say.noSpend}\n`);
412
+ else process.stdout.write(`${say.exhausts(usd(monthly), exhaustDays.toFixed(1))}\n`);
351
413
  if (s.unpriced)
352
414
  process.stdout.write(
353
- ` ${s.unpriced} kayit fiyatlanamadi (${s.unpricedModels.join(", ") || "model alani yok"}) - toplamin disinda\n`,
415
+ `${say.unpriced(s.unpriced, s.unpricedModels.join(", ") || say.noModelField)}\n`,
354
416
  );
355
417
  // Said every time, not in a footnote somebody reads once: on a subscription
356
418
  // this figure is what the same tokens would have COST at list price, not
357
419
  // what was paid. It is the right number for comparing days to each other
358
420
  // and the wrong number to put in an invoice.
359
- process.stdout.write(" (liste fiyatindan tahmin - abonelikte odenen tutar degil)\n");
421
+ process.stdout.write(`${say.listPrice}\n`);
360
422
  }
361
423
  if (finding) process.exitCode = 10;
362
424
  }
@@ -407,18 +469,15 @@ async function cmdAnomaly(json) {
407
469
  )}\n`,
408
470
  );
409
471
  } else {
410
- process.stdout.write(
411
- `${rows.length} ${by} - medyan ${usd(med)} - olcek ${basis} - esik z>=${threshold}\n`,
412
- );
413
- if (!flagged.length) process.stdout.write(" aile disinda kayit yok\n");
472
+ process.stdout.write(`${say.family(rows.length, by, usd(med), basis, threshold)}\n`);
473
+ if (!flagged.length) process.stdout.write(`${say.inFamily}\n`);
414
474
  // Ten lines, then a count. Session spend is heavy-tailed - the median
415
475
  // session is a few cents of question-answering and a real run is three
416
476
  // orders of magnitude above it - so `--by session` legitimately flags
417
477
  // dozens, and forty lines of flags is a list nobody finishes reading.
418
478
  for (const r of flagged.slice(0, 10))
419
479
  process.stdout.write(` ! ${r.key} ${usd(r.usd)} z=${r.z.toFixed(1)}\n`);
420
- if (flagged.length > 10)
421
- process.stdout.write(` ... ve ${flagged.length - 10} ${by} daha esigin uzerinde\n`);
480
+ if (flagged.length > 10) process.stdout.write(`${say.moreFlagged(flagged.length - 10, by)}\n`);
422
481
  }
423
482
  if (flagged.length) process.exitCode = 10;
424
483
  }
@@ -467,13 +526,10 @@ async function cmdBurn(json) {
467
526
  );
468
527
  } else {
469
528
  process.stdout.write(
470
- `${today[0]}: ${usd(today[1])} - onceki ${priorRows.length} gun gunluk ortalama ${usd(priorPerDay)}\n`,
529
+ `${say.burn(today[0], usd(today[1]), priorRows.length, usd(priorPerDay))}\n`,
471
530
  );
472
- if (ratio === null) process.stdout.write(" onceki pencerede harcama yok, oran hesaplanamaz\n");
473
- else
474
- process.stdout.write(
475
- ` ${ratio.toFixed(1)}x ${finding ? `- esik ${factor}x asildi` : "- normal aralik"}\n`,
476
- );
531
+ if (ratio === null) process.stdout.write(`${say.noPrior}\n`);
532
+ else process.stdout.write(`${say.ratio(ratio.toFixed(1), finding, factor)}\n`);
477
533
  }
478
534
  if (finding) process.exitCode = 10;
479
535
  }
@@ -506,10 +562,7 @@ async function cmdSave(json) {
506
562
  const path = join(STORE, `${snap.savedAt.replace(/[:.]/g, "-")}.json`);
507
563
  writeFileSync(path, `${JSON.stringify(snap, null, 2)}\n`);
508
564
  if (json) process.stdout.write(`${JSON.stringify({ saved: path, ...snap }, null, 2)}\n`);
509
- else
510
- process.stdout.write(
511
- `kaydedildi: ${path}\n son ${days} gun ${usd(snap.totalUsd)} - gunluk ${usd(snap.perDayUsd)}\n`,
512
- );
565
+ else process.stdout.write(`${say.saved(path, days, usd(snap.totalUsd), usd(snap.perDayUsd))}\n`);
513
566
  }
514
567
 
515
568
  function cmdList(json) {
@@ -518,10 +571,10 @@ function cmdList(json) {
518
571
  process.stdout.write(`${JSON.stringify({ store: STORE, snapshots: files }, null, 2)}\n`);
519
572
  else {
520
573
  process.stdout.write(`${STORE}\n`);
521
- if (!files.length) process.stdout.write(" (bos)\n");
574
+ if (!files.length) process.stdout.write(`${say.empty}\n`);
522
575
  for (const f of files) {
523
576
  const d = JSON.parse(readFileSync(f, "utf-8"));
524
- process.stdout.write(` ${d.savedAt} ${usd(d.totalUsd)} / ${d.windowDays} gun\n`);
577
+ process.stdout.write(`${say.snapshot(d.savedAt, usd(d.totalUsd), d.windowDays)}\n`);
525
578
  }
526
579
  }
527
580
  }
@@ -563,15 +616,12 @@ function cmdDiff(json) {
563
616
  );
564
617
  } else {
565
618
  process.stdout.write(`${A.savedAt} -> ${B.savedAt}\n`);
566
- process.stdout.write(
567
- ` gunluk ${usd(A.perDayUsd)} -> ${usd(B.perDayUsd)} (${delta >= 0 ? "+" : ""}${delta.toFixed(2)}${
568
- pct === null ? "" : `, ${pct >= 0 ? "+" : ""}${pct.toFixed(0)}%`
569
- })\n`,
570
- );
619
+ const shift = `${delta >= 0 ? "+" : ""}${delta.toFixed(2)}${
620
+ pct === null ? "" : `, ${pct >= 0 ? "+" : ""}${pct.toFixed(0)}%`
621
+ }`;
622
+ process.stdout.write(`${say.perDayDiff(usd(A.perDayUsd), usd(B.perDayUsd), shift)}\n`);
571
623
  if (A.windowDays !== B.windowDays)
572
- process.stdout.write(
573
- ` ! pencereler farkli (${A.windowDays} / ${B.windowDays} gun) - gunluk oran karsilastirilabilir, toplam degil\n`,
574
- );
624
+ process.stdout.write(`${say.windowsDiffer(A.windowDays, B.windowDays)}\n`);
575
625
  }
576
626
  }
577
627
 
@@ -79,6 +79,17 @@ function resolveStateByTaskId(id) {
79
79
  return found;
80
80
  }
81
81
 
82
+ // Phase 3 Step 3 persists triage per review round, so the newest round that
83
+ // has finished triage is the one the diff reflects. A round still in progress
84
+ // carries no triage yet and is skipped.
85
+ function latestIterationTriage(state) {
86
+ const rounds = Array.isArray(state?.reviewIterations) ? state.reviewIterations : [];
87
+ for (let i = rounds.length - 1; i >= 0; i--) {
88
+ if (rounds[i]?.triage) return rounds[i].triage;
89
+ }
90
+ return null;
91
+ }
92
+
82
93
  function loadTriage() {
83
94
  if (flags.triage) {
84
95
  if (!existsSync(flags.triage)) die(`triage file not found: ${flags.triage}`);
@@ -89,7 +100,7 @@ function loadTriage() {
89
100
  if (statePath) {
90
101
  if (!existsSync(statePath)) die(`state file not found: ${statePath}`);
91
102
  const state = JSON.parse(readFileSync(statePath, "utf-8"));
92
- const triage = state?.phases?.["4"]?.triage ?? state?.triage;
103
+ const triage = latestIterationTriage(state) ?? state?.phases?.["4"]?.triage ?? state?.triage;
93
104
  if (!triage) die(`no triage block found in ${statePath}`);
94
105
  return triage;
95
106
  }
@@ -54,6 +54,9 @@ import { homedir } from "node:os";
54
54
  import { execFileSync } from "node:child_process";
55
55
  import { fileURLToPath, pathToFileURL } from "node:url";
56
56
  import { runMain } from "../lib/fatal.mjs";
57
+ import { hostCommand } from "../lib/user-facing.mjs";
58
+ import { UNATTENDED_SETTINGS_FILE } from "../lib/unattended-settings-location.mjs";
59
+ import { prefsHosts, profileGaps } from "../lib/unattended-profile-check.mjs";
57
60
 
58
61
  const HERE = dirname(fileURLToPath(import.meta.url));
59
62
  const HOME = homedir();
@@ -234,7 +237,7 @@ function checkInstallVersion() {
234
237
  "install-version",
235
238
  "WARN",
236
239
  `installed ${installed}, this checkout is ${pkg.version}`,
237
- "run /multi-agent:update",
240
+ `run ${hostCommand("update", HERE)}`,
238
241
  );
239
242
  return;
240
243
  }
@@ -305,7 +308,7 @@ function checkScriptSurface() {
305
308
  "script-surface",
306
309
  "BLOCK",
307
310
  `${missing.length} script(s) a command calls are not installed: ${missing.slice(0, 3).join(", ")}`,
308
- "run /multi-agent:update",
311
+ `run ${hostCommand("update", HERE)}`,
309
312
  missing,
310
313
  );
311
314
  return;
@@ -330,7 +333,7 @@ function checkSkillSiblings() {
330
333
  "skill-siblings",
331
334
  "WARN",
332
335
  `the sibling audit did not complete: ${String(e.message).split("\n")[0]}`,
333
- "run /multi-agent:sync",
336
+ `run ${hostCommand("sync", HERE)}`,
334
337
  );
335
338
  return;
336
339
  }
@@ -342,7 +345,12 @@ function checkSkillSiblings() {
342
345
  }
343
346
  })();
344
347
  if (!j) {
345
- report("skill-siblings", "WARN", "the sibling audit returned no JSON", "run /multi-agent:sync");
348
+ report(
349
+ "skill-siblings",
350
+ "WARN",
351
+ "the sibling audit returned no JSON",
352
+ `run ${hostCommand("sync", HERE)}`,
353
+ );
346
354
  return;
347
355
  }
348
356
  // A local-only wrapper is authored for this machine and deliberately excluded
@@ -365,7 +373,7 @@ function checkSkillSiblings() {
365
373
  "skill-siblings",
366
374
  "WARN",
367
375
  `${unsynced} of ${j.commands - localOnly.size} synced command(s) are missing from at least one installed host`,
368
- "run /multi-agent:sync",
376
+ `run ${hostCommand("sync", HERE)}`,
369
377
  );
370
378
  return;
371
379
  }
@@ -394,7 +402,7 @@ function checkStateWritable() {
394
402
  function checkPrefsValid() {
395
403
  const prefs = join(CLAUDE, "multi-agent-preferences.json");
396
404
  if (!existsSync(prefs)) {
397
- report("prefs-valid", "WARN", "no preferences file yet", "run /multi-agent:setup");
405
+ report("prefs-valid", "WARN", "no preferences file yet", `run ${hostCommand("setup", HERE)}`);
398
406
  return;
399
407
  }
400
408
  const j = readJson(prefs);
@@ -403,12 +411,17 @@ function checkPrefsValid() {
403
411
  "prefs-valid",
404
412
  "BLOCK",
405
413
  "multi-agent-preferences.json does not parse",
406
- "run /multi-agent:setup",
414
+ `run ${hostCommand("setup", HERE)}`,
407
415
  );
408
416
  return;
409
417
  }
410
418
  if (typeof j.global !== "object" || j.global === null) {
411
- report("prefs-valid", "BLOCK", "preferences carry no global block", "run /multi-agent:setup");
419
+ report(
420
+ "prefs-valid",
421
+ "BLOCK",
422
+ "preferences carry no global block",
423
+ `run ${hostCommand("setup", HERE)}`,
424
+ );
412
425
  return;
413
426
  }
414
427
  ok("prefs-valid");
@@ -430,7 +443,7 @@ function checkIdentity() {
430
443
  "identity",
431
444
  "WARN",
432
445
  "no git identity recorded, so a run stops at the commit phase",
433
- "run /multi-agent:setup",
446
+ `run ${hostCommand("setup", HERE)}`,
434
447
  );
435
448
  }
436
449
 
@@ -496,14 +509,14 @@ function checkCredentials(inv) {
496
509
  "credential-mapping",
497
510
  "WARN",
498
511
  `${malformed.length} mapped credential(s) are malformed: ${malformed.map((c) => c.logical).join(", ")}`,
499
- "run /multi-agent:setup",
512
+ `run ${hostCommand("setup", HERE)}`,
500
513
  );
501
514
  } else if (unmapped.length) {
502
515
  report(
503
516
  "credential-mapping",
504
517
  "INFO",
505
518
  `${unmapped.length} optional capabilit${unmapped.length === 1 ? "y is" : "ies are"} not enabled: ${unmapped.map((c) => c.logical).join(", ")}`,
506
- `map ${unmapped.map((c) => c.logical).join(", ")} with /multi-agent:setup`,
519
+ `map ${unmapped.map((c) => c.logical).join(", ")} with ${hostCommand("setup", HERE)}`,
507
520
  );
508
521
  } else {
509
522
  ok("credential-mapping");
@@ -528,7 +541,7 @@ function checkCredentials(inv) {
528
541
  "credential-liveness",
529
542
  "WARN",
530
543
  `${rejected.length} credential(s) were refused: ${rejected.map(([k, w]) => `${k} (${w})`).join(", ")}`,
531
- "run /multi-agent:setup",
544
+ `run ${hostCommand("setup", HERE)}`,
532
545
  );
533
546
  return;
534
547
  }
@@ -827,7 +840,7 @@ function checkWorktreeResidue() {
827
840
  "worktree-residue",
828
841
  "WARN",
829
842
  `${entries.length} worktree(s) left under ${wt}${size}; runs that stopped before Phase 4 are never collected`,
830
- "run /multi-agent:garbage-collect, or /multi-agent:kill for a task you know is dead",
843
+ `run ${hostCommand("garbage-collect", HERE)}, or ${hostCommand("kill", HERE)} for a task you know is dead`,
831
844
  );
832
845
  return;
833
846
  }
@@ -863,32 +876,68 @@ function checkServerProfile(resolved) {
863
876
  "unattended-contract",
864
877
  "WARN",
865
878
  "unattended-contract.md is not installed, so nothing here documents what an unattended run resolves",
866
- "run /multi-agent:update to refresh the reference tree",
879
+ `run ${hostCommand("update", HERE)} to refresh the reference tree`,
867
880
  );
868
881
  }
869
882
 
870
883
  // 2. The permission posture. autopilot spawns `claude --permission-prompts
871
884
  // none`, but the tools it then calls still have to be allowed somewhere,
872
885
  // and on a fresh machine they are not - the run stops at the first
873
- // prompt with nobody to answer it.
874
- const settings = join(root, "settings.json");
875
- let allow = [];
876
- try {
877
- allow = JSON.parse(readFileSync(settings, "utf-8"))?.permissions?.allow ?? [];
878
- } catch {
879
- allow = [];
886
+ // prompt with nobody to answer it. The rule is schemas/unattended-profile.json,
887
+ // the same file `install --unattended` writes from, and the posture lives
888
+ // in multi-agent-unattended.settings.json, the file the runner passes with
889
+ // `claude --settings`: dontAsk, Edit and Write allowed, every deny rule
890
+ // present. Permission lists merge across settings files, so a whole-Bash
891
+ // allow in settings.json undoes the narrow list and is a gap too.
892
+ const settings = join(root, UNATTENDED_SETTINGS_FILE);
893
+ const readDoc = (f) => {
894
+ try {
895
+ return JSON.parse(readFileSync(f, "utf-8")) ?? {};
896
+ } catch {
897
+ return {};
898
+ }
899
+ };
900
+ const doc = readDoc(settings);
901
+ const perms = doc.permissions ?? {};
902
+ const attendedAllow = (() => {
903
+ const a = readDoc(join(root, "settings.json")).permissions?.allow;
904
+ return (Array.isArray(a) ? a : []).map(String);
905
+ })();
906
+ const allow = (Array.isArray(perms.allow) ? perms.allow : []).map(String);
907
+ const deny = (Array.isArray(perms.deny) ? perms.deny : []).map(String);
908
+ let profile = null;
909
+ for (const p of [
910
+ join(root, "schemas", "unattended-profile.json"),
911
+ join(HERE, "..", "schemas", "unattended-profile.json"),
912
+ ]) {
913
+ try {
914
+ profile = JSON.parse(readFileSync(p, "utf-8"));
915
+ break;
916
+ } catch {
917
+ /* next candidate */
918
+ }
919
+ }
920
+ const gaps = [];
921
+ for (const t of ["Edit", "Write"]) if (!allow.includes(t)) gaps.push(`${t} is not allowed`);
922
+ if (!allow.some((a) => a.startsWith("Bash("))) gaps.push("no Bash rule is allowed");
923
+ if (profile) {
924
+ for (const { rule } of profile.wideAllows)
925
+ if (attendedAllow.includes(rule))
926
+ gaps.push(`a bare ${rule} allow in settings.json makes the narrow list meaningless`);
927
+ const found = profileGaps(doc, profile, { extraHosts: prefsHosts(dirname(root)) });
928
+ gaps.push(...found.permissions, ...found.sandbox);
929
+ } else {
930
+ gaps.push("schemas/unattended-profile.json is not installed, so the posture cannot be checked");
880
931
  }
881
- const needed = ["Bash", "Edit", "Write"];
882
- const missing = needed.filter((t) => !allow.some((a) => String(a).startsWith(t)));
883
- if (!missing.length) {
932
+ if (!gaps.length) {
884
933
  ok("unattended-permissions");
885
934
  } else {
886
935
  report(
887
936
  "unattended-permissions",
888
937
  "WARN",
889
- `permissions.allow does not cover ${missing.join(", ")}; an unattended run stops at the first prompt`,
890
- "run /multi-agent:setup, or add them to permissions.allow in settings.json",
891
- { settings, allow },
938
+ `the unattended permission posture is incomplete: ${gaps.join("; ")}`,
939
+ "run `npx --@mmerterden:registry=https://registry.npmjs.org @mmerterden/multi-agent-pipeline install --unattended` (it prints the profile before writing it)",
940
+ { settings, allow, deny },
892
941
  );
893
942
  }
894
943
 
@@ -911,7 +960,7 @@ function checkServerProfile(resolved) {
911
960
  "scheduler",
912
961
  "WARN",
913
962
  "no multi-agent launchd agent is loaded, so nothing starts a queued run on its own",
914
- "run /multi-agent:autopilot to install the agent, or schedule the runner yourself",
963
+ `run ${hostCommand("autopilot", HERE)} to install the agent, or schedule the runner yourself`,
915
964
  );
916
965
  }
917
966