@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
@@ -0,0 +1,393 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * scaffold-gate.mjs - a new project is proven green by its own commands, and
4
+ * stays demoable from one story to the next.
5
+ *
6
+ * `/multi-agent:scaffold` calls the enabled toolkit's `<toolkit>:scaffold`
7
+ * skill, which writes a skeleton plus a `.scaffold.json` manifest at its root
8
+ * and runs `git init`. The pipeline then only verifies, with this script:
9
+ *
10
+ * --phase skeleton before the first commit. The directory is a git
11
+ * repository with no commit and no remote, and the stack
12
+ * adapter's build, test and lint commands
13
+ * (schemas/stack-adapters.json, _stack-adapter.mjs) pass.
14
+ * --phase story between stories. Build, test and lint pass, and the
15
+ * manifest's demo command exits 0 with output matching
16
+ * its `expect` pattern. A failure here means the next
17
+ * story does not start.
18
+ *
19
+ * Build and test logs are judged by evidence-gate.mjs with `--stack`, which
20
+ * reads the adapter's markers and, for tests, the counts (test-summary.mjs): a
21
+ * run with no test executed is not a pass. Gradle prints no counts on success,
22
+ * so for an adapter that reads JUnit XML the project's `test-results`
23
+ * directories are summed as well (junitCounts). Lint and demo have no markers, so
24
+ * their exit code and, for the demo, the expected output decide. Every log is
25
+ * kept under `<dir>/.pipeline/scaffold/<phase>-<check>.log`.
26
+ *
27
+ * Manifest (`.scaffold.json`, schemas/scaffold-manifest.schema.json):
28
+ * { version: "1.0.0", toolkit, name, stack: <adapter id>, vars?: {slot: value},
29
+ * demo?: { command, expect } }
30
+ * `vars` fills the adapter's `{slot}`s (an iOS scheme, a simulator name). A
31
+ * `remote` key is refused: the scaffold never creates or names a remote.
32
+ *
33
+ * While the quality gates are active (lib/unattended.mjs) the verdict is
34
+ * recorded as `scaffold/skeleton` or `scaffold/story` through gate-ledger.mjs,
35
+ * beside the `evidence-gate/*` entries evidence-gate.mjs writes itself. The
36
+ * check itself runs in every mode: it is the scaffold flow's own proof.
37
+ *
38
+ * Usage:
39
+ * scaffold-gate.mjs --dir <skeleton> --phase skeleton|story [--story <id>]
40
+ * [--state <agent-state.json>] [--timeout-sec <n>] [--json]
41
+ *
42
+ * Exit: 0 pass · 1 a check failed · 2 usage · 3 manifest missing, unreadable or invalid.
43
+ *
44
+ * @module pipeline/scripts/scaffold-gate
45
+ */
46
+
47
+ import { spawnSync } from "node:child_process";
48
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
49
+ import { join } from "node:path";
50
+ import { fileURLToPath } from "node:url";
51
+
52
+ import { invokedDirectly } from "../lib/invoked-directly.mjs";
53
+ import { AdapterError, commandFor, getAdapter, loadAdapters, UNKNOWN } from "./_stack-adapter.mjs";
54
+ import { gateContext, recordQuietly } from "./gate-ledger.mjs";
55
+ import { summarizeJunit } from "./test-summary.mjs";
56
+
57
+ export const MANIFEST = ".scaffold.json";
58
+ export const PHASES = ["skeleton", "story"];
59
+ const EVIDENCE_GATE = fileURLToPath(new URL("./evidence-gate.mjs", import.meta.url));
60
+ const DEFAULT_TIMEOUT_SEC = 900;
61
+
62
+ /**
63
+ * Every problem with a manifest, as readable strings. Empty = valid.
64
+ *
65
+ * @param {any} m
66
+ * @param {{phase: "skeleton"|"story", doc?: object}} opts
67
+ * @returns {string[]}
68
+ */
69
+ export function validateManifest(m, { phase, doc = loadAdapters() }) {
70
+ const errors = [];
71
+ if (!m || typeof m !== "object" || Array.isArray(m)) return ["manifest must be a JSON object"];
72
+ if (m.version !== "1.0.0") errors.push('version must be "1.0.0"');
73
+ for (const k of ["toolkit", "name", "stack"]) {
74
+ if (typeof m[k] !== "string" || !m[k].trim()) errors.push(`${k} is required`);
75
+ }
76
+ if (typeof m.stack === "string") {
77
+ const a = doc.adapters[m.stack];
78
+ if (!a || m.stack === UNKNOWN || a.applicable === false) {
79
+ errors.push(`stack "${m.stack}" is not an applicable stack adapter`);
80
+ }
81
+ }
82
+ if (m.vars !== undefined) {
83
+ const ok =
84
+ m.vars && typeof m.vars === "object" && !Array.isArray(m.vars)
85
+ ? Object.values(m.vars).every((v) => typeof v === "string")
86
+ : false;
87
+ if (!ok) errors.push("vars must be an object of strings");
88
+ }
89
+ if ("remote" in m) errors.push("remote is not allowed: the scaffold never creates or names one");
90
+ if (m.demo !== undefined) {
91
+ if (typeof m.demo?.command !== "string" || !m.demo.command.trim()) {
92
+ errors.push("demo.command is required");
93
+ }
94
+ if (typeof m.demo?.expect !== "string" || !m.demo.expect)
95
+ errors.push("demo.expect is required");
96
+ else {
97
+ try {
98
+ new RegExp(m.demo.expect);
99
+ } catch {
100
+ errors.push("demo.expect is not a valid regular expression");
101
+ }
102
+ }
103
+ } else if (phase === "story") {
104
+ errors.push("demo is required between stories: the app has to be shown working");
105
+ }
106
+ return errors;
107
+ }
108
+
109
+ let runSeq = 0;
110
+
111
+ /**
112
+ * Values for the adapter's `{slot}`s. `worktreePath` is always the skeleton;
113
+ * `resultBundle` is new per run because xcodebuild refuses to overwrite one;
114
+ * the manifest's `vars` fill the rest and can override neither.
115
+ *
116
+ * @param {string} dir
117
+ * @param {string} phase
118
+ * @param {Record<string, string>} [manifestVars]
119
+ */
120
+ export function commandVars(dir, phase, manifestVars = {}) {
121
+ const stamp = `${Date.now()}-${process.pid}-${++runSeq}`;
122
+ return {
123
+ ...(manifestVars || {}),
124
+ resultBundle: join(dir, ".pipeline", "scaffold", `${phase}-${stamp}.xcresult`),
125
+ worktreePath: dir,
126
+ };
127
+ }
128
+
129
+ const SKIP_DIRS = new Set([
130
+ ".git",
131
+ ".gradle",
132
+ ".pipeline",
133
+ "node_modules",
134
+ ".build",
135
+ ".DerivedData",
136
+ ]);
137
+
138
+ /**
139
+ * Test counts from the JUnit XML under every `test-results` directory of the
140
+ * project, for runners whose log carries no counts on success (Gradle).
141
+ *
142
+ * @param {string} dir
143
+ * @returns {{executed: number, passed: number, failed: number, skipped: number,
144
+ * status: string, dirs: string[]} | null} null when no results were found
145
+ */
146
+ export function junitCounts(dir) {
147
+ const found = [];
148
+ const walk = (d, depth) => {
149
+ if (depth > 4) return;
150
+ let entries;
151
+ try {
152
+ entries = readdirSync(d, { withFileTypes: true });
153
+ } catch {
154
+ return;
155
+ }
156
+ for (const e of entries) {
157
+ if (!e.isDirectory() || SKIP_DIRS.has(e.name)) continue;
158
+ const full = join(d, e.name);
159
+ if (e.name === "test-results") found.push(full);
160
+ else walk(full, depth + 1);
161
+ }
162
+ };
163
+ walk(dir, 0);
164
+ const total = { executed: 0, passed: 0, failed: 0, skipped: 0, dirs: [] };
165
+ for (const d of found) {
166
+ const r = summarizeJunit(d);
167
+ if (r.executed === null) continue;
168
+ total.executed += r.executed;
169
+ total.passed += r.passed;
170
+ total.failed += r.failed;
171
+ total.skipped += r.skipped;
172
+ total.dirs.push(d);
173
+ }
174
+ if (total.dirs.length === 0) return null;
175
+ const status = total.failed > 0 ? "failed" : total.executed === 0 ? "no-tests" : "passed";
176
+ return { ...total, status };
177
+ }
178
+
179
+ function git(dir, ...args) {
180
+ return spawnSync("git", ["-C", dir, ...args], { encoding: "utf8", timeout: 20000 });
181
+ }
182
+
183
+ function run(command, dir, logPath, timeoutSec) {
184
+ const r = spawnSync("bash", ["-c", command], {
185
+ cwd: dir,
186
+ encoding: "utf8",
187
+ timeout: timeoutSec * 1000,
188
+ maxBuffer: 64 * 1024 * 1024,
189
+ });
190
+ const out = `${r.stdout || ""}${r.stderr || ""}`;
191
+ writeFileSync(logPath, `$ ${command}\n${out}`);
192
+ if (r.error?.code === "ETIMEDOUT" || (r.status === null && r.signal)) {
193
+ return { status: null, out, reason: `timed out after ${timeoutSec}s` };
194
+ }
195
+ return { status: r.status, out, reason: r.status === 0 ? "exit 0" : `exit ${r.status}` };
196
+ }
197
+
198
+ function evidence(claim, logPath, stack, statePath) {
199
+ const argv = [EVIDENCE_GATE, "--claim", claim, "--status", "passed"];
200
+ argv.push("--evidence", logPath, "--stack", stack);
201
+ if (statePath) argv.push("--state", statePath);
202
+ const r = spawnSync(process.execPath, argv, { encoding: "utf8", timeout: 60000 });
203
+ let verdict = null;
204
+ try {
205
+ verdict = JSON.parse(r.stdout);
206
+ } catch {
207
+ /* reported below */
208
+ }
209
+ return {
210
+ ok: r.status === 0 && verdict?.ok === true,
211
+ reason: verdict?.reason || `evidence-gate exited ${r.status}: ${(r.stderr || "").trim()}`,
212
+ };
213
+ }
214
+
215
+ /**
216
+ * @param {{dir: string, phase: string, story?: string|null, statePath?: string|null,
217
+ * timeoutSec?: number}} opts
218
+ * @returns {{gate: string, phase: string, story: string|null, verdict: string,
219
+ * checks: {name: string, ok: boolean, reason: string, log?: string}[]}}
220
+ */
221
+ export function verify({ dir, phase, story = null, statePath = null, timeoutSec }) {
222
+ const gate = `scaffold/${phase}`;
223
+ const checks = [];
224
+ const add = (name, ok, reason, log) => checks.push({ name, ok, reason, ...(log ? { log } : {}) });
225
+ const finish = (verdict) => ({ gate, phase, story, verdict, checks });
226
+
227
+ const manifestPath = join(dir, MANIFEST);
228
+ let m;
229
+ try {
230
+ m = JSON.parse(readFileSync(manifestPath, "utf8"));
231
+ } catch (err) {
232
+ add("manifest", false, `cannot read ${MANIFEST}: ${err.message}`);
233
+ return finish("invalid");
234
+ }
235
+ const errors = validateManifest(m, { phase });
236
+ if (errors.length) {
237
+ add("manifest", false, errors.join("; "));
238
+ return finish("invalid");
239
+ }
240
+ add("manifest", true, `${m.toolkit} ${m.name} on the ${m.stack} adapter`);
241
+
242
+ if (git(dir, "rev-parse", "--git-dir").status !== 0) {
243
+ add("git", false, "not a git repository: the scaffold runs git init");
244
+ } else {
245
+ const remotes = git(dir, "remote").stdout.trim().split(/\s+/).filter(Boolean);
246
+ add(
247
+ "no-remote",
248
+ remotes.length === 0,
249
+ remotes.length ? `remote ${remotes.join(", ")} is configured` : "no remote configured",
250
+ );
251
+ if (phase === "skeleton") {
252
+ const head = git(dir, "rev-parse", "--verify", "-q", "HEAD");
253
+ add(
254
+ "first-commit",
255
+ head.status !== 0,
256
+ head.status === 0
257
+ ? `the repository already has ${head.stdout.trim().slice(0, 12)}; the proof comes before the first commit`
258
+ : "no commit yet",
259
+ );
260
+ }
261
+ }
262
+
263
+ const logDir = join(dir, ".pipeline", "scaffold");
264
+ mkdirSync(logDir, { recursive: true });
265
+ const timeout = timeoutSec || DEFAULT_TIMEOUT_SEC;
266
+ const vars = commandVars(dir, phase, m.vars);
267
+
268
+ for (const kind of ["build", "test", "lint"]) {
269
+ const log = join(logDir, `${phase}-${kind}.log`);
270
+ let command;
271
+ try {
272
+ command = commandFor(m.stack, kind, { dir, vars }).command;
273
+ } catch (err) {
274
+ const why = err instanceof AdapterError ? err.message : String(err);
275
+ add(kind, false, `no ${kind} command: ${why}`);
276
+ continue;
277
+ }
278
+ const r = run(command, dir, log, timeout);
279
+ if (kind === "lint") {
280
+ add(kind, r.status === 0, `${command}: ${r.reason}`, log);
281
+ continue;
282
+ }
283
+ if (r.status !== 0) {
284
+ add(kind, false, `${command}: ${r.reason}`, log);
285
+ continue;
286
+ }
287
+ const e = evidence(kind, log, m.stack, statePath);
288
+ if (
289
+ e.ok &&
290
+ kind === "test" &&
291
+ getAdapter(m.stack).testSummary?.parsers?.includes("junit-xml")
292
+ ) {
293
+ const counts = junitCounts(dir);
294
+ if (counts && counts.status !== "passed") {
295
+ add(kind, false, `JUnit XML: ${counts.executed} executed, ${counts.failed} failed`, log);
296
+ continue;
297
+ }
298
+ if (counts) {
299
+ add(kind, true, `${e.reason}; JUnit XML: ${counts.executed} executed, 0 failed`, log);
300
+ continue;
301
+ }
302
+ }
303
+ add(kind, e.ok, e.reason, log);
304
+ }
305
+
306
+ if (m.demo) {
307
+ const log = join(logDir, `${phase}-demo.log`);
308
+ const r = run(m.demo.command, dir, log, timeout);
309
+ const shows = new RegExp(m.demo.expect).test(r.out);
310
+ add(
311
+ "demo",
312
+ r.status === 0 && shows,
313
+ r.status !== 0
314
+ ? `${m.demo.command}: ${r.reason}`
315
+ : shows
316
+ ? `${m.demo.command}: output matches ${m.demo.expect}`
317
+ : `${m.demo.command}: output does not match expect ${m.demo.expect}`,
318
+ log,
319
+ );
320
+ }
321
+
322
+ return finish(checks.every((c) => c.ok) ? "pass" : "fail");
323
+ }
324
+
325
+ // ---------------------------------------------------------------------------
326
+ // CLI
327
+
328
+ function parse(argv) {
329
+ const opts = { json: false };
330
+ const single = new Set(["--dir", "--phase", "--story", "--state", "--timeout-sec"]);
331
+ for (let i = 0; i < argv.length; i++) {
332
+ const a = argv[i];
333
+ if (a === "--json") opts.json = true;
334
+ else if (single.has(a)) {
335
+ const v = argv[++i];
336
+ if (v === undefined) throw new Error(`${a} needs a value`);
337
+ opts[a.slice(2).replace(/-([a-z])/g, (_, c) => c.toUpperCase())] = v;
338
+ } else throw new Error(`unexpected argument ${a}`);
339
+ }
340
+ if (!opts.dir) throw new Error("--dir is required");
341
+ if (!PHASES.includes(opts.phase)) throw new Error(`--phase must be one of ${PHASES.join(", ")}`);
342
+ if (opts.timeoutSec !== undefined && !/^[1-9][0-9]*$/.test(opts.timeoutSec)) {
343
+ throw new Error("--timeout-sec must be a positive integer");
344
+ }
345
+ return opts;
346
+ }
347
+
348
+ async function main(argv) {
349
+ let opts;
350
+ try {
351
+ opts = parse(argv);
352
+ } catch (err) {
353
+ process.stderr.write(`scaffold-gate: ${err.message}\n`);
354
+ return 2;
355
+ }
356
+ if (!existsSync(opts.dir)) {
357
+ process.stderr.write(`scaffold-gate: no directory ${opts.dir}\n`);
358
+ return 3;
359
+ }
360
+ const ctx = gateContext({ statePath: opts.state || null, repo: opts.dir });
361
+ const result = verify({
362
+ dir: opts.dir,
363
+ phase: opts.phase,
364
+ story: opts.story || null,
365
+ statePath: ctx.active ? ctx.statePath : null,
366
+ timeoutSec: opts.timeoutSec ? Number(opts.timeoutSec) : undefined,
367
+ });
368
+ if (ctx.active) {
369
+ await recordQuietly(
370
+ result.gate,
371
+ result.verdict === "pass" ? "pass" : "fail",
372
+ {
373
+ story: result.story,
374
+ failed: result.checks.filter((c) => !c.ok).map(({ name, reason }) => ({ name, reason })),
375
+ },
376
+ { repo: opts.dir, statePath: ctx.statePath },
377
+ );
378
+ }
379
+ if (opts.json) writeFileSync(1, `${JSON.stringify(result, null, 2)}\n`);
380
+ else {
381
+ const lines = [
382
+ `${result.gate}${result.story ? ` ${result.story}` : ""}: ${result.verdict}`,
383
+ ...result.checks.map((c) => ` ${c.ok ? "ok " : "FAIL"} ${c.name}: ${c.reason}`),
384
+ ];
385
+ writeFileSync(result.verdict === "pass" ? 1 : 2, `${lines.join("\n")}\n`);
386
+ }
387
+ if (result.verdict === "pass") return 0;
388
+ return result.verdict === "invalid" ? 3 : 1;
389
+ }
390
+
391
+ if (invokedDirectly(import.meta.url)) {
392
+ main(process.argv.slice(2)).then((code) => process.exit(code));
393
+ }
@@ -19,9 +19,10 @@
19
19
  //
20
20
  // Contract (full spec: multi-agent-refs/features/skill-conformance.md):
21
21
  // 1. Registry discovery is DECLARED, never sniffed by name: a skill opts in with
22
- // `standards-registry: <relative path>` in its SKILL.md frontmatter. The
23
- // pipeline therefore names no stack-specific skill, and a new language's
24
- // registry drops in with zero pipeline change.
22
+ // `standards-registry: <relative path>` in its SKILL.md frontmatter (under
23
+ // `metadata:`, or at the top level). The pipeline therefore names no
24
+ // stack-specific skill, and a new language's registry drops in with zero
25
+ // pipeline change.
25
26
  // 2. Every registry declares its own `scope` (languages / paths). Rules outside
26
27
  // the changed files' languages are DROPPED and counted. Without this an
27
28
  // Objective-C or UIKit diff would collect the whole Swift/SwiftUI rule set,
@@ -307,13 +308,28 @@ function readFrontmatter(path) {
307
308
  const end = text.indexOf("\n---", 3);
308
309
  if (end < 0) return {};
309
310
  const out = {};
311
+ let inMetadata = false;
310
312
  for (const line of text.slice(3, end).split("\n")) {
311
313
  const m = /^([a-zA-Z0-9_-]+):\s*(.*)$/.exec(line);
312
- if (m) out[m[1]] = unquote(m[2].trim());
314
+ if (m) {
315
+ out[m[1]] = unquote(m[2].trim());
316
+ inMetadata = m[1] === "metadata" && m[2].trim() === "";
317
+ if (inMetadata) out.metadata = {};
318
+ continue;
319
+ }
320
+ const nested = inMetadata && /^\s+([a-zA-Z0-9_-]+):\s*(.*)$/.exec(line);
321
+ if (nested) out.metadata[nested[1]] = unquote(nested[2].trim());
313
322
  }
314
323
  return out;
315
324
  }
316
325
 
326
+ // The host frontmatter schema has no `standards-registry` key, so a skill that
327
+ // ships to a plugin carries it under `metadata:`. The top-level spelling is
328
+ // still read for skills written before that move.
329
+ function declaredRegistry(fm) {
330
+ return fm.metadata?.["standards-registry"] || fm["standards-registry"] || "";
331
+ }
332
+
317
333
  // ---------------------------------------------------------------------------
318
334
  // Language classification from file extension.
319
335
  //
@@ -644,7 +660,8 @@ function discoverRegistries(roots) {
644
660
  for (const skillDir of findSkillDirs(root, 0, [])) {
645
661
  const skillFile = join(skillDir, "SKILL.md");
646
662
  const fm = readFrontmatter(skillFile);
647
- if (!fm["standards-registry"]) continue;
663
+ const declared = declaredRegistry(fm);
664
+ if (!declared) continue;
648
665
  const name = fm.name ?? basename(skillDir);
649
666
  if (seen.has(name)) continue;
650
667
  // `standards-registry` is author-controlled frontmatter, and resolve()
@@ -654,18 +671,18 @@ function discoverRegistries(roots) {
654
671
  // would be extracted into the manifest and injected into every reviewer
655
672
  // prompt via the shared ${CRITERIA} block. Contain it to the skill's own
656
673
  // directory; a declaration that escapes is recorded, not followed.
657
- const rulesPath = resolve(skillDir, fm["standards-registry"]);
674
+ const rulesPath = resolve(skillDir, declared);
658
675
  const skillRoot = resolve(skillDir) + sep;
659
676
  if (!rulesPath.startsWith(skillRoot)) {
660
677
  escaped.push({
661
678
  name,
662
679
  path: rulesPath,
663
- reason: `standards-registry escapes the skill directory (declared: ${fm["standards-registry"]})`,
680
+ reason: `standards-registry escapes the skill directory (declared: ${declared})`,
664
681
  });
665
682
  continue;
666
683
  }
667
684
  seen.add(name);
668
- out.push({ name, skillFile, rulesPath, declared: fm["standards-registry"] });
685
+ out.push({ name, skillFile, rulesPath, declared });
669
686
  }
670
687
  }
671
688
  return { registries: out.sort((a, b) => a.name.localeCompare(b.name)), escaped };
@@ -42,6 +42,7 @@ import { existsSync, readdirSync, statSync } from "node:fs";
42
42
  import { basename, dirname, join, resolve } from "node:path";
43
43
  import { homedir } from "node:os";
44
44
  import { fileURLToPath } from "node:url";
45
+ import { hostCommand } from "../lib/user-facing.mjs";
45
46
 
46
47
  const HERE = dirname(fileURLToPath(import.meta.url));
47
48
  const HOME = homedir();
@@ -190,7 +191,7 @@ if (AUDIT) {
190
191
  const unsynced = rows.filter((r) => r.missingInstalled.length > 0).length;
191
192
  if (unsynced > 0) {
192
193
  process.stdout.write(
193
- ` ${unsynced} command(s) not present in every installed tree (run /multi-agent:sync)\n`,
194
+ ` ${unsynced} command(s) not present in every installed tree (run ${hostCommand("sync", HERE)})\n`,
194
195
  );
195
196
  }
196
197
  }
@@ -12,17 +12,43 @@
12
12
  # 5. Canonical project-name vocabulary in user-facing docs
13
13
  #
14
14
  # Must pass before any `sync` run that touches shared commands.
15
+ #
16
+ # Which tree it checks:
17
+ # - CROSS_CLI_HOME set: the install under that home.
18
+ # - run from a git checkout of the pipeline: that checkout, installed into a
19
+ # temporary home first, so the verdict is about this tree and never about
20
+ # whatever version happens to be installed on the machine.
21
+ # - otherwise (the release tarball `/multi-agent:update` runs it from): the
22
+ # install under $HOME.
15
23
 
16
24
  set -uo pipefail
17
25
 
18
- CLAUDE_CMDS="$HOME/.claude/commands/multi-agent"
19
- COPILOT_SKILLS="$HOME/.copilot/skills"
20
-
21
26
  PASS=0
22
27
  FAIL=0
23
28
  pass() { PASS=$((PASS + 1)); echo " ✓ $1"; }
24
29
  fail() { FAIL=$((FAIL + 1)); echo " ✗ $1"; }
25
30
 
31
+ CHECKOUT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
32
+ INSTALL_HOME=""
33
+ if [ -z "${CROSS_CLI_HOME:-}" ] && [ -e "$CHECKOUT/.git" ] && [ -f "$CHECKOUT/install.js" ]; then
34
+ INSTALL_HOME=$(mktemp -d "${TMPDIR:-/tmp}/cross-cli-home.XXXXXX")
35
+ trap 'rm -rf "$INSTALL_HOME"' EXIT
36
+ if HOME="$INSTALL_HOME" MULTI_AGENT_SKIP_MCP_REGISTER=1 \
37
+ node "$CHECKOUT/install.js" --claude --copilot >"$INSTALL_HOME/install.log" 2>&1; then
38
+ pass "installed this checkout into a temporary home"
39
+ else
40
+ fail "install of this checkout failed: $(tail -3 "$INSTALL_HOME/install.log" | tr '\n' ' ')"
41
+ echo ""
42
+ echo "══ cross-cli-behavior: aborted (setup invalid) ══"
43
+ exit 2
44
+ fi
45
+ CROSS_CLI_HOME="$INSTALL_HOME"
46
+ fi
47
+ H="${CROSS_CLI_HOME:-$HOME}"
48
+
49
+ CLAUDE_CMDS="$H/.claude/commands/multi-agent"
50
+ COPILOT_SKILLS="$H/.copilot/skills"
51
+
26
52
  # ──────────────────────────────────────────────────────────────────────────
27
53
  echo "→ 1. Command-set identity (Claude vs Copilot)"
28
54
  if [ ! -d "$CLAUDE_CMDS" ]; then
@@ -137,7 +163,7 @@ done
137
163
  # ──────────────────────────────────────────────────────────────────────────
138
164
  echo ""
139
165
  echo "→ 6. Contract doc exists (required source of truth)"
140
- CONTRACT="$HOME/.claude/multi-agent-refs/cross-cli-contract.md"
166
+ CONTRACT="$H/.claude/multi-agent-refs/cross-cli-contract.md"
141
167
  if [ -f "$CONTRACT" ]; then
142
168
  SIZE=$(wc -l < "$CONTRACT" | tr -d ' ')
143
169
  if [ "$SIZE" -ge 100 ]; then
@@ -157,8 +183,8 @@ echo ""
157
183
  # The pipeline therefore has no figma tree to deploy or parity-check here.
158
184
  echo "→ 7. Agent personas deployed to both CLIs"
159
185
 
160
- CLAUDE_AGENTS="$HOME/.claude/agents"
161
- COPILOT_AGENTS="$HOME/.copilot/agents"
186
+ CLAUDE_AGENTS="$H/.claude/agents"
187
+ COPILOT_AGENTS="$H/.copilot/agents"
162
188
  AGENT_FILES=()
163
189
  if [ -d "$CLAUDE_AGENTS" ]; then
164
190
  for f in "$CLAUDE_AGENTS"/*.md; do
@@ -13,13 +13,17 @@ FAIL=0
13
13
  pass() { PASS=$((PASS + 1)); echo " ✓ $1"; }
14
14
  fail() { FAIL=$((FAIL + 1)); echo " ✗ $1"; }
15
15
 
16
- SCHEMAS_DIR="$HOME/.claude/schemas"
16
+ SMOKE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
17
+ # The schemas beside this script are the ones under test. The installed copy is
18
+ # only a fallback for a smoke run from an installed tree: validating it from a
19
+ # checkout would grade whatever version was last installed, not the change.
20
+ SCHEMAS_DIR="$SMOKE_DIR/../schemas"
21
+ [ -f "$SCHEMAS_DIR/prefs.schema.json" ] || SCHEMAS_DIR="$HOME/.claude/schemas"
17
22
  PREFS_SCHEMA="$SCHEMAS_DIR/prefs.schema.json"
18
23
  STATE_SCHEMA="$SCHEMAS_DIR/agent-state.schema.json"
19
24
  # Repo checkout first (derived from this script's location), then the
20
25
  # maintainer's legacy layout. The template ships only in the repo - when the
21
26
  # smoke runs from an installed tree with no checkout, the check is skipped.
22
- SMOKE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
23
27
  TEMPLATE="$SMOKE_DIR/../preferences-template.json"
24
28
  [ -f "$TEMPLATE" ] || TEMPLATE="$HOME/multi-agent-pipeline/pipeline/preferences-template.json"
25
29
  LIVE_PREFS="$HOME/.claude/multi-agent-preferences.json"