@mmerterden/multi-agent-pipeline 20.2.1 → 20.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/CHANGELOG.md +912 -1
  2. package/README.md +104 -81
  3. package/README.tr.md +103 -62
  4. package/docs/FIGMA_PIPELINE.md +35 -35
  5. package/docs/adr/0006-skills-core-external-split.md +1 -1
  6. package/docs/adr/0007-multi-tool-adapter-framework.md +6 -0
  7. package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +7 -0
  8. package/docs/architecture.md +50 -14
  9. package/docs/best-practices.md +1 -1
  10. package/docs/ecosystem.md +56 -32
  11. package/docs/facts.json +10 -10
  12. package/docs/features.md +97 -5
  13. package/docs/recovery-guide.md +7 -14
  14. package/docs/server-readiness.md +31 -24
  15. package/index.js +1 -1
  16. package/install/_common.mjs +3 -5
  17. package/install/_platform-filter.mjs +23 -1
  18. package/install/_unattended-profile.mjs +321 -75
  19. package/install/claude.mjs +51 -10
  20. package/install/codex.mjs +2 -0
  21. package/install/copilot.mjs +2 -0
  22. package/install/index.mjs +30 -17
  23. package/install/templates/claude-hooks.json +16 -5
  24. package/install/templates/copilot-instructions.md +1 -1
  25. package/install/templates/multi-agent-autopilot-awake.plist.template +48 -0
  26. package/install/templates/multi-agent-autopilot.plist.template +12 -5
  27. package/install/unattended-profile-legacy.json +80 -0
  28. package/manifest.json +616 -483
  29. package/package.json +8 -3
  30. package/pipeline/agents/code-reviewer.md +10 -0
  31. package/pipeline/agents/plan-critic.md +98 -0
  32. package/pipeline/agents/security-auditor.md +10 -0
  33. package/pipeline/agents/task-clarifier.md +10 -0
  34. package/pipeline/commands/multi-agent/SKILL.md +2 -2
  35. package/pipeline/commands/multi-agent/analysis/SKILL.md +6 -2
  36. package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +12 -1
  37. package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +4 -0
  38. package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
  39. package/pipeline/commands/multi-agent/autopilot-off/SKILL.md +36 -6
  40. package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +77 -12
  41. package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +29 -8
  42. package/pipeline/commands/multi-agent/build-optimize/SKILL.md +4 -0
  43. package/pipeline/commands/multi-agent/channels/SKILL.md +9 -9
  44. package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +5 -1
  45. package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -0
  46. package/pipeline/commands/multi-agent/design-check/SKILL.md +16 -11
  47. package/pipeline/commands/multi-agent/diff-explain/SKILL.md +4 -0
  48. package/pipeline/commands/multi-agent/doctor/SKILL.md +4 -0
  49. package/pipeline/commands/multi-agent/feedback/SKILL.md +5 -1
  50. package/pipeline/commands/multi-agent/forget/SKILL.md +4 -0
  51. package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +4 -0
  52. package/pipeline/commands/multi-agent/graph/SKILL.md +4 -0
  53. package/pipeline/commands/multi-agent/help/SKILL.md +37 -39
  54. package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +4 -0
  55. package/pipeline/commands/multi-agent/issue/SKILL.md +7 -1
  56. package/pipeline/commands/multi-agent/jira/SKILL.md +7 -1
  57. package/pipeline/commands/multi-agent/kill/SKILL.md +9 -3
  58. package/pipeline/commands/multi-agent/language/SKILL.md +4 -0
  59. package/pipeline/commands/multi-agent/log/SKILL.md +4 -0
  60. package/pipeline/commands/multi-agent/manual-test/SKILL.md +5 -0
  61. package/pipeline/commands/multi-agent/model/SKILL.md +4 -0
  62. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -0
  63. package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +4 -0
  64. package/pipeline/commands/multi-agent/purge/SKILL.md +4 -0
  65. package/pipeline/commands/multi-agent/refactor/SKILL.md +5 -0
  66. package/pipeline/commands/multi-agent/research/SKILL.md +49 -0
  67. package/pipeline/commands/multi-agent/resume/SKILL.md +29 -6
  68. package/pipeline/commands/multi-agent/review/SKILL.md +28 -9
  69. package/pipeline/commands/multi-agent/review-analysis/SKILL.md +5 -1
  70. package/pipeline/commands/multi-agent/review-issue/SKILL.md +4 -0
  71. package/pipeline/commands/multi-agent/review-jira/SKILL.md +4 -0
  72. package/pipeline/commands/multi-agent/route-off/SKILL.md +4 -0
  73. package/pipeline/commands/multi-agent/route-on/SKILL.md +4 -0
  74. package/pipeline/commands/multi-agent/route-status/SKILL.md +4 -0
  75. package/pipeline/commands/multi-agent/routines/SKILL.md +4 -0
  76. package/pipeline/commands/multi-agent/save/SKILL.md +6 -2
  77. package/pipeline/commands/multi-agent/scaffold/SKILL.md +47 -0
  78. package/pipeline/commands/multi-agent/scan/SKILL.md +4 -0
  79. package/pipeline/commands/multi-agent/search/SKILL.md +12 -8
  80. package/pipeline/commands/multi-agent/security-review/SKILL.md +4 -0
  81. package/pipeline/commands/multi-agent/serve/SKILL.md +62 -0
  82. package/pipeline/commands/multi-agent/setup/SKILL.md +27 -36
  83. package/pipeline/commands/multi-agent/stack/SKILL.md +4 -0
  84. package/pipeline/commands/multi-agent/status/SKILL.md +10 -9
  85. package/pipeline/commands/multi-agent/steer/SKILL.md +5 -1
  86. package/pipeline/commands/multi-agent/store-ready/SKILL.md +4 -0
  87. package/pipeline/commands/multi-agent/sync/SKILL.md +13 -13
  88. package/pipeline/commands/multi-agent/test/SKILL.md +4 -0
  89. package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +4 -0
  90. package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +4 -0
  91. package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +4 -0
  92. package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +5 -1
  93. package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +4 -0
  94. package/pipeline/commands/multi-agent/uninstall/SKILL.md +5 -1
  95. package/pipeline/commands/multi-agent/update/SKILL.md +4 -0
  96. package/pipeline/contract/CHANGELOG.md +74 -0
  97. package/pipeline/contract/README.md +126 -0
  98. package/pipeline/contract/build.mjs +427 -0
  99. package/pipeline/contract/fixtures/answer-result.json +11 -0
  100. package/pipeline/contract/fixtures/error-invalid-request.json +8 -0
  101. package/pipeline/contract/fixtures/error-unauthorized.json +5 -0
  102. package/pipeline/contract/fixtures/error-unsigned.json +5 -0
  103. package/pipeline/contract/fixtures/issues-empty.json +18 -0
  104. package/pipeline/contract/fixtures/launch-plan.json +31 -0
  105. package/pipeline/contract/fixtures/runs-awaiting-question.json +70 -0
  106. package/pipeline/contract/fixtures/runs-empty.json +6 -0
  107. package/pipeline/contract/fixtures/runs-failed.json +84 -0
  108. package/pipeline/contract/fixtures/runs-old-schema.json +70 -0
  109. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +101 -0
  110. package/pipeline/contract/fixtures/runs-pr-opened.json +106 -0
  111. package/pipeline/contract/fixtures/runs-running.json +84 -0
  112. package/pipeline/contract/fixtures/worktrees-empty.json +4 -0
  113. package/pipeline/contract/frozen/toolbox.json +107 -0
  114. package/pipeline/contract/manifest.json +263 -0
  115. package/pipeline/contract/types/index.d.ts +343 -0
  116. package/pipeline/lib/_jira-auth.sh +6 -2
  117. package/pipeline/lib/account-resolver.sh +1 -1
  118. package/pipeline/lib/autopilot-state.sh +19 -0
  119. package/pipeline/lib/context-link-extractor.sh +12 -5
  120. package/pipeline/lib/credential-inventory.sh +12 -5
  121. package/pipeline/lib/credential-store.sh +116 -185
  122. package/pipeline/lib/fetch-confluence.sh +44 -3
  123. package/pipeline/lib/fetch-document.sh +3 -4
  124. package/pipeline/lib/fetch-fortify.sh +1 -1
  125. package/pipeline/lib/figma-mcp-refresh.sh +2 -2
  126. package/pipeline/lib/figma-token.sh +5 -1
  127. package/pipeline/lib/issue-fetcher.sh +233 -16
  128. package/pipeline/lib/json-file-lock.mjs +172 -0
  129. package/pipeline/lib/model-dispatch.sh +21 -12
  130. package/pipeline/lib/model-rung.sh +6 -1
  131. package/pipeline/lib/multi-repo-pipeline.sh +1 -1
  132. package/pipeline/lib/outbound-gate.mjs +46 -16
  133. package/pipeline/lib/parse-complaints.sh +14 -7
  134. package/pipeline/lib/plan-todos.sh +3 -3
  135. package/pipeline/lib/post-pr-review.sh +9 -9
  136. package/pipeline/lib/pr-request-location.mjs +85 -0
  137. package/pipeline/lib/regular-file.mjs +153 -0
  138. package/pipeline/lib/repo-hygiene.sh +17 -0
  139. package/pipeline/lib/route-state.sh +5 -1
  140. package/pipeline/lib/run-paths.sh +3 -2
  141. package/pipeline/lib/stack-detect.sh +19 -1
  142. package/pipeline/lib/unattended-profile-check.mjs +178 -0
  143. package/pipeline/lib/unattended-settings-location.mjs +28 -0
  144. package/pipeline/lib/unattended.mjs +76 -0
  145. package/pipeline/lib/unattended.sh +32 -0
  146. package/pipeline/lib/untrusted.mjs +76 -0
  147. package/pipeline/lib/user-facing.mjs +82 -0
  148. package/pipeline/lib/user-facing.sh +58 -0
  149. package/pipeline/multi-agent-refs/_dev-context.md +1 -1
  150. package/pipeline/multi-agent-refs/analysis/evidence.md +4 -0
  151. package/pipeline/multi-agent-refs/analysis/locked.md +2 -2
  152. package/pipeline/multi-agent-refs/analysis/render.md +4 -3
  153. package/pipeline/multi-agent-refs/analysis/resolve.md +3 -1
  154. package/pipeline/multi-agent-refs/analysis/synthesis.md +4 -5
  155. package/pipeline/multi-agent-refs/analysis-template.md +10 -17
  156. package/pipeline/multi-agent-refs/channels/jira.md +1 -1
  157. package/pipeline/multi-agent-refs/component-dispatch.md +3 -3
  158. package/pipeline/multi-agent-refs/conventions-defaults.md +32 -32
  159. package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -17
  160. package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +37 -9
  161. package/pipeline/multi-agent-refs/features/autopilot-operations.md +277 -0
  162. package/pipeline/multi-agent-refs/features/constitution.md +196 -0
  163. package/pipeline/multi-agent-refs/features/doctor.md +6 -3
  164. package/pipeline/multi-agent-refs/features/external-context-injection.md +6 -1
  165. package/pipeline/multi-agent-refs/features/jira-context.md +1 -1
  166. package/pipeline/multi-agent-refs/features/maturity-followup.md +43 -23
  167. package/pipeline/multi-agent-refs/features/model-fallback.md +9 -0
  168. package/pipeline/multi-agent-refs/features/phone-api.md +306 -0
  169. package/pipeline/multi-agent-refs/features/plan-critic.md +159 -0
  170. package/pipeline/multi-agent-refs/features/research.md +150 -0
  171. package/pipeline/multi-agent-refs/features/review-decision.md +185 -0
  172. package/pipeline/multi-agent-refs/features/scaffold.md +160 -0
  173. package/pipeline/multi-agent-refs/features/security-audit.md +6 -2
  174. package/pipeline/multi-agent-refs/features/skill-conformance.md +4 -1
  175. package/pipeline/multi-agent-refs/features/stack-adapters.md +116 -0
  176. package/pipeline/multi-agent-refs/features/unattended-gates.md +316 -0
  177. package/pipeline/multi-agent-refs/features/unattended-security.md +731 -0
  178. package/pipeline/multi-agent-refs/features/url-enrichment.md +2 -2
  179. package/pipeline/multi-agent-refs/features/usage-reporting.md +127 -35
  180. package/pipeline/multi-agent-refs/features/verify-by-test.md +1 -1
  181. package/pipeline/multi-agent-refs/features/visual-evidence.md +7 -7
  182. package/pipeline/multi-agent-refs/keychain.md +6 -11
  183. package/pipeline/multi-agent-refs/payload-contracts.md +2 -2
  184. package/pipeline/multi-agent-refs/phases/log-format.md +2 -3
  185. package/pipeline/multi-agent-refs/phases/modes.md +10 -12
  186. package/pipeline/multi-agent-refs/phases/operations.md +11 -5
  187. package/pipeline/multi-agent-refs/phases/phase-0-init.md +73 -81
  188. package/pipeline/multi-agent-refs/phases/phase-1-plan.md +22 -22
  189. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +42 -66
  190. package/pipeline/multi-agent-refs/phases/phase-3-review.md +45 -79
  191. package/pipeline/multi-agent-refs/phases/phase-4-commit.md +28 -38
  192. package/pipeline/multi-agent-refs/phases/phase-5-report.md +27 -25
  193. package/pipeline/multi-agent-refs/phases.md +1 -1
  194. package/pipeline/multi-agent-refs/picker-contract.md +1 -1
  195. package/pipeline/multi-agent-refs/progress-contract.md +13 -16
  196. package/pipeline/multi-agent-refs/readiness-review.md +1 -1
  197. package/pipeline/multi-agent-refs/research/engine.md +91 -0
  198. package/pipeline/multi-agent-refs/rules.md +6 -4
  199. package/pipeline/multi-agent-refs/setup/repo-discovery.md +2 -2
  200. package/pipeline/multi-agent-refs/tracker-contract.md +2 -2
  201. package/pipeline/multi-agent-refs/unattended-contract.md +68 -16
  202. package/pipeline/rules/figma-pipeline.md +12 -12
  203. package/pipeline/schemas/agent-state.schema.json +480 -18
  204. package/pipeline/schemas/analysis-spec.schema.json +4 -4
  205. package/pipeline/schemas/answer-request.schema.json +24 -0
  206. package/pipeline/schemas/answer-result.schema.json +28 -0
  207. package/pipeline/schemas/autopilot-config.schema.json +111 -13
  208. package/pipeline/schemas/command-parameters.schema.json +99 -0
  209. package/pipeline/schemas/constitution.schema.json +56 -0
  210. package/pipeline/schemas/contract-error.schema.json +52 -0
  211. package/pipeline/schemas/design-check-config.schema.json +5 -1
  212. package/pipeline/schemas/issues.schema.json +61 -0
  213. package/pipeline/schemas/launch-plan.schema.json +46 -0
  214. package/pipeline/schemas/launch-request.schema.json +45 -0
  215. package/pipeline/schemas/launch.json +61 -0
  216. package/pipeline/schemas/launch.schema.json +84 -0
  217. package/pipeline/schemas/phases.json +2 -2
  218. package/pipeline/schemas/phases.schema.json +68 -0
  219. package/pipeline/schemas/phone-devices.schema.json +61 -0
  220. package/pipeline/schemas/phone-signed-request.schema.json +67 -0
  221. package/pipeline/schemas/plan-critique.schema.json +99 -0
  222. package/pipeline/schemas/plan-todos.schema.json +7 -7
  223. package/pipeline/schemas/planning-output.schema.json +5 -0
  224. package/pipeline/schemas/pr-request.schema.json +46 -0
  225. package/pipeline/schemas/prefs.schema.json +79 -8
  226. package/pipeline/schemas/research-output.schema.json +118 -0
  227. package/pipeline/schemas/review-file-exclusions.schema.json +25 -0
  228. package/pipeline/schemas/reviewer-output.schema.json +40 -4
  229. package/pipeline/schemas/run-questions.json +392 -0
  230. package/pipeline/schemas/run-questions.schema.json +118 -0
  231. package/pipeline/schemas/runs-index.schema.json +189 -0
  232. package/pipeline/schemas/scaffold-manifest.schema.json +43 -0
  233. package/pipeline/schemas/secret-patterns.schema.json +28 -0
  234. package/pipeline/schemas/stack-adapters.json +527 -0
  235. package/pipeline/schemas/stack-adapters.schema.json +184 -0
  236. package/pipeline/schemas/token-budget.json +1 -1
  237. package/pipeline/schemas/token-budget.schema.json +26 -0
  238. package/pipeline/schemas/triage-output.schema.json +64 -3
  239. package/pipeline/schemas/unattended-policy.json +139 -0
  240. package/pipeline/schemas/unattended-policy.schema.json +73 -0
  241. package/pipeline/schemas/unattended-profile.json +248 -0
  242. package/pipeline/schemas/unattended-profile.schema.json +198 -0
  243. package/pipeline/schemas/worktrees.schema.json +51 -0
  244. package/pipeline/scripts/README.md +1 -0
  245. package/pipeline/scripts/_autopilot-config.mjs +130 -0
  246. package/pipeline/scripts/_autopilot-ops.mjs +567 -0
  247. package/pipeline/scripts/_autopilot-outcomes.mjs +174 -0
  248. package/pipeline/scripts/_command-contract.mjs +384 -0
  249. package/pipeline/scripts/_cost.mjs +40 -0
  250. package/pipeline/scripts/_notices.mjs +160 -0
  251. package/pipeline/scripts/_phone-auth.mjs +485 -0
  252. package/pipeline/scripts/_pre-existing.mjs +294 -0
  253. package/pipeline/scripts/_redact.mjs +77 -0
  254. package/pipeline/scripts/_run-paths.mjs +4 -2
  255. package/pipeline/scripts/_stack-adapter.mjs +678 -0
  256. package/pipeline/scripts/_stack-routing.mjs +1 -1
  257. package/pipeline/scripts/agent-guard.py +348 -37
  258. package/pipeline/scripts/agent-guard.sh +41 -13
  259. package/pipeline/scripts/analysis-story-tree.mjs +79 -3
  260. package/pipeline/scripts/answer-question.mjs +181 -0
  261. package/pipeline/scripts/audit-log-rotate.sh +1 -4
  262. package/pipeline/scripts/audit-log.sh +4 -4
  263. package/pipeline/scripts/autopilot-arming.mjs +389 -21
  264. package/pipeline/scripts/autopilot-awake.mjs +255 -0
  265. package/pipeline/scripts/autopilot-intake.mjs +137 -36
  266. package/pipeline/scripts/autopilot-menubar.swift +156 -44
  267. package/pipeline/scripts/autopilot-publish.mjs +1625 -0
  268. package/pipeline/scripts/autopilot-runner.mjs +1678 -222
  269. package/pipeline/scripts/autopilot-status.sh +198 -33
  270. package/pipeline/scripts/build-lock.sh +120 -0
  271. package/pipeline/scripts/build-references.mjs +4 -1
  272. package/pipeline/scripts/build-stack-plugins.mjs +59 -22
  273. package/pipeline/scripts/capture-flush.sh +1 -1
  274. package/pipeline/scripts/capture-resume.sh +13 -9
  275. package/pipeline/scripts/check-derived-drift.mjs +52 -11
  276. package/pipeline/scripts/commands.mjs +88 -0
  277. package/pipeline/scripts/constitution.mjs +362 -0
  278. package/pipeline/scripts/contract-server.mjs +776 -0
  279. package/pipeline/scripts/cost-analyze.mjs +89 -39
  280. package/pipeline/scripts/diff-explain.mjs +12 -1
  281. package/pipeline/scripts/doctor.mjs +77 -28
  282. package/pipeline/scripts/evidence-gate.mjs +192 -12
  283. package/pipeline/scripts/feedback-send.mjs +4 -2
  284. package/pipeline/scripts/gate-ledger.mjs +449 -0
  285. package/pipeline/scripts/gc-abandoned.sh +132 -13
  286. package/pipeline/scripts/gen-facts.mjs +31 -15
  287. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  288. package/pipeline/scripts/github-ssh-setup.sh +140 -29
  289. package/pipeline/scripts/graph-mermaid.mjs +4 -1
  290. package/pipeline/scripts/issues.mjs +236 -0
  291. package/pipeline/scripts/jira-attach.sh +6 -2
  292. package/pipeline/scripts/jira-search.sh +4 -3
  293. package/pipeline/scripts/keychain-save.sh +125 -24
  294. package/pipeline/scripts/keychain.py +63 -93
  295. package/pipeline/scripts/launch-request.mjs +747 -0
  296. package/pipeline/scripts/localize-commands.mjs +4 -10
  297. package/pipeline/scripts/log-metric.sh +6 -5
  298. package/pipeline/scripts/maturity-followup.mjs +13 -4
  299. package/pipeline/scripts/memory-save.sh +25 -0
  300. package/pipeline/scripts/migrate-prefs.mjs +4 -3
  301. package/pipeline/scripts/open-questions-gate.mjs +276 -0
  302. package/pipeline/scripts/phase-tracker.sh +41 -27
  303. package/pipeline/scripts/phase0-exit-gate.mjs +22 -4
  304. package/pipeline/scripts/phone-devices.mjs +224 -0
  305. package/pipeline/scripts/plan-coverage-gate.mjs +200 -66
  306. package/pipeline/scripts/plan-critique-gate.mjs +591 -0
  307. package/pipeline/scripts/pr-request.mjs +188 -0
  308. package/pipeline/scripts/pre-commit-check.sh +115 -4
  309. package/pipeline/scripts/probe-evidence-capability.sh +44 -5
  310. package/pipeline/scripts/record-phase.mjs +71 -0
  311. package/pipeline/scripts/render-agent-log-cost.sh +17 -2
  312. package/pipeline/scripts/render-cost-summary.sh +1 -1
  313. package/pipeline/scripts/render-work-summary.sh +1 -1
  314. package/pipeline/scripts/require-supported-version.sh +4 -1
  315. package/pipeline/scripts/research-gate.mjs +704 -0
  316. package/pipeline/scripts/review-decision-gate.mjs +403 -0
  317. package/pipeline/scripts/routine-registry.mjs +5 -2
  318. package/pipeline/scripts/runs-index.mjs +135 -27
  319. package/pipeline/scripts/scaffold-gate.mjs +393 -0
  320. package/pipeline/scripts/skill-conformance.mjs +25 -8
  321. package/pipeline/scripts/skill-siblings.mjs +2 -1
  322. package/pipeline/scripts/smoke-cross-cli-behavior.sh +32 -6
  323. package/pipeline/scripts/smoke-schema-validation.sh +6 -2
  324. package/pipeline/scripts/spec-consistency-gate.mjs +469 -0
  325. package/pipeline/scripts/symbol-existence-gate.mjs +450 -0
  326. package/pipeline/scripts/test-gap-scan.mjs +40 -2
  327. package/pipeline/scripts/test-integrity-gate.mjs +20 -4
  328. package/pipeline/scripts/test-strength.mjs +484 -0
  329. package/pipeline/scripts/test-summary.mjs +651 -0
  330. package/pipeline/scripts/triage-memory.mjs +49 -9
  331. package/pipeline/scripts/unattended_policy.py +2786 -0
  332. package/pipeline/scripts/uninstall.mjs +10 -10
  333. package/pipeline/scripts/update-issue-progress.sh +1 -1
  334. package/pipeline/scripts/usage-identity.mjs +288 -0
  335. package/pipeline/scripts/usage-register.mjs +185 -65
  336. package/pipeline/scripts/usage-report.mjs +230 -66
  337. package/pipeline/scripts/validate-complaint-doc.mjs +28 -10
  338. package/pipeline/scripts/validate-planning.mjs +6 -0
  339. package/pipeline/scripts/verify-citations.mjs +151 -38
  340. package/pipeline/scripts/verify.mjs +58 -18
  341. package/pipeline/scripts/worktree-prepare.sh +126 -0
  342. package/pipeline/scripts/worktrees.mjs +124 -0
  343. package/pipeline/scripts/write-state.mjs +48 -17
  344. package/pipeline/skills/.skill-manifest.json +222 -226
  345. package/pipeline/skills/.skills-index.json +77 -88
  346. package/pipeline/skills/shared/README.md +44 -45
  347. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +3 -2
  348. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +3 -2
  349. package/pipeline/skills/shared/core/multi-agent/SKILL.md +10 -9
  350. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +6 -5
  351. package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +11 -3
  352. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +2 -1
  353. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -3
  354. package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +32 -6
  355. package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +66 -8
  356. package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +27 -9
  357. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +2 -1
  358. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -4
  359. package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +3 -2
  360. package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +2 -1
  361. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +7 -5
  362. package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +2 -1
  363. package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +3 -2
  364. package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +2 -1
  365. package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +2 -1
  366. package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +2 -1
  367. package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +2 -1
  368. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -1
  369. package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -1
  370. package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +3 -2
  371. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -1
  372. package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +7 -4
  373. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -1
  374. package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +2 -1
  375. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +2 -1
  376. package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -1
  377. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +2 -1
  378. package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +2 -1
  379. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +2 -1
  380. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +2 -1
  381. package/pipeline/skills/shared/core/multi-agent-research/SKILL.md +35 -0
  382. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +7 -3
  383. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +7 -5
  384. package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +2 -1
  385. package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +3 -2
  386. package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +2 -1
  387. package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +2 -1
  388. package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +2 -1
  389. package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +2 -1
  390. package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +2 -1
  391. package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +3 -2
  392. package/pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md +30 -0
  393. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -1
  394. package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +4 -3
  395. package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +2 -1
  396. package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +60 -0
  397. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +8 -8
  398. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -1
  399. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +7 -8
  400. package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -1
  401. package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +2 -1
  402. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +10 -10
  403. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +2 -1
  404. package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +2 -1
  405. package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +2 -1
  406. package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +2 -1
  407. package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +2 -1
  408. package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -1
  409. package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +3 -2
  410. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +2 -1
  411. package/pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md +46 -0
  412. package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +9 -3
  413. package/pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md +54 -0
  414. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +9 -11
  415. package/pipeline/skills/shared/external/NOTICE-vibeship-spawner-skills.md +203 -0
  416. package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +10 -3
  417. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +131 -25
  418. package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -3
  419. package/pipeline/skills/shared/external/alarmkit/SKILL.md +2 -1
  420. package/pipeline/skills/shared/external/android-architecture/SKILL.md +85 -76
  421. package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +51 -3
  422. package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +9 -0
  423. package/pipeline/skills/shared/external/android-datastore/SKILL.md +4 -3
  424. package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +4 -3
  425. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +106 -181
  426. package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +147 -0
  427. package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +45 -4
  428. package/pipeline/skills/shared/external/android-performance/SKILL.md +27 -2
  429. package/pipeline/skills/shared/external/android-performance/references/patterns.md +37 -37
  430. package/pipeline/skills/shared/external/api-patterns/SKILL.md +111 -67
  431. package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +128 -0
  432. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +136 -186
  433. package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +140 -0
  434. package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +207 -0
  435. package/pipeline/skills/shared/external/api-security-best-practices/references/operations.md +66 -0
  436. package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +175 -0
  437. package/pipeline/skills/shared/external/app-clips/SKILL.md +2 -0
  438. package/pipeline/skills/shared/external/app-intents/SKILL.md +2 -0
  439. package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +4 -3
  440. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +2 -0
  441. package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -0
  442. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +2 -0
  443. package/pipeline/skills/shared/external/architecture/SKILL.md +106 -39
  444. package/pipeline/skills/shared/external/architecture/references/adr-and-review.md +76 -0
  445. package/pipeline/skills/shared/external/authentication/SKILL.md +2 -0
  446. package/pipeline/skills/shared/external/avkit/SKILL.md +2 -0
  447. package/pipeline/skills/shared/external/background-processing/SKILL.md +2 -1
  448. package/pipeline/skills/shared/external/backlog/SKILL.md +3 -2
  449. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +2 -0
  450. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +1 -1
  451. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +3 -2
  452. package/pipeline/skills/shared/external/clean-code/SKILL.md +192 -90
  453. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +2 -1
  454. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +1 -1
  455. package/pipeline/skills/shared/external/compose-components/SKILL.md +4 -4
  456. package/pipeline/skills/shared/external/compose-navigation/SKILL.md +22 -22
  457. package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +10 -10
  458. package/pipeline/skills/shared/external/compose-testing/SKILL.md +13 -6
  459. package/pipeline/skills/shared/external/compose-testing/references/patterns.md +59 -59
  460. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +2 -0
  461. package/pipeline/skills/shared/external/context-compression/SKILL.md +118 -250
  462. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +2 -0
  463. package/pipeline/skills/shared/external/core-data/SKILL.md +2 -0
  464. package/pipeline/skills/shared/external/core-motion/SKILL.md +2 -0
  465. package/pipeline/skills/shared/external/core-nfc/SKILL.md +2 -0
  466. package/pipeline/skills/shared/external/coreml/SKILL.md +2 -1
  467. package/pipeline/skills/shared/external/council/SKILL.md +2 -1
  468. package/pipeline/skills/shared/external/cryptokit/SKILL.md +2 -0
  469. package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
  470. package/pipeline/skills/shared/external/database-patterns/SKILL.md +3 -2
  471. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +2 -0
  472. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +130 -20
  473. package/pipeline/skills/shared/external/debugging-strategies/references/hard-cases.md +54 -0
  474. package/pipeline/skills/shared/external/device-integrity/SKILL.md +2 -0
  475. package/pipeline/skills/shared/external/docker-expert/SKILL.md +137 -381
  476. package/pipeline/skills/shared/external/docker-expert/references/patterns.md +98 -0
  477. package/pipeline/skills/shared/external/energykit/SKILL.md +2 -1
  478. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +3 -1
  479. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +2 -2
  480. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +116 -185
  481. package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +235 -0
  482. package/pipeline/skills/shared/external/fastapi-pro/references/testing-and-deployment.md +69 -0
  483. package/pipeline/skills/shared/external/firebase/SKILL.md +4 -3
  484. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +151 -293
  485. package/pipeline/skills/shared/external/github-actions-templates/references/patterns.md +96 -0
  486. package/pipeline/skills/shared/external/healthkit/SKILL.md +2 -0
  487. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +69 -72
  488. package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +111 -0
  489. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +77 -86
  490. package/pipeline/skills/shared/external/hig-components-layout/references/containers.md +98 -0
  491. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +150 -78
  492. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +76 -97
  493. package/pipeline/skills/shared/external/hig-components-system/references/surfaces.md +98 -0
  494. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +48 -76
  495. package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +132 -0
  496. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +147 -106
  497. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +61 -77
  498. package/pipeline/skills/shared/external/hig-patterns/references/patterns.md +92 -0
  499. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +147 -77
  500. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +61 -121
  501. package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +108 -0
  502. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +2 -0
  503. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +1 -1
  504. package/pipeline/skills/shared/external/html-semantic/SKILL.md +3 -2
  505. package/pipeline/skills/shared/external/humanizer/SKILL.md +2 -1
  506. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +2 -0
  507. package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +2 -1
  508. package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +14 -2
  509. package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
  510. package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +4 -3
  511. package/pipeline/skills/shared/external/ios-localization/SKILL.md +8 -6
  512. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +2 -2
  513. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +11 -11
  514. package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +2 -1
  515. package/pipeline/skills/shared/external/ios-networking/SKILL.md +2 -0
  516. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +2 -0
  517. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +102 -193
  518. package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +103 -0
  519. package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -2
  520. package/pipeline/skills/shared/external/live-activities/evals/evals.json +2 -2
  521. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +7 -9
  522. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +3 -3
  523. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +2 -2
  524. package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +4 -3
  525. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +5 -3
  526. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +2 -0
  527. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +1 -1
  528. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +2 -0
  529. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +1 -1
  530. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +149 -46
  531. package/pipeline/skills/shared/external/monorepo-architect/references/patterns.md +70 -0
  532. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +2 -0
  533. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +1 -1
  534. package/pipeline/skills/shared/external/natural-language/SKILL.md +2 -0
  535. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +3 -2
  536. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +91 -21
  537. package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +247 -0
  538. package/pipeline/skills/shared/external/nodejs-backend-patterns/references/testing-and-frameworks.md +57 -0
  539. package/pipeline/skills/shared/external/observability-engineer/SKILL.md +155 -232
  540. package/pipeline/skills/shared/external/observability-engineer/references/patterns.md +75 -0
  541. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +2 -0
  542. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +2 -2
  543. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +18 -18
  544. package/pipeline/skills/shared/external/pdfkit/SKILL.md +2 -1
  545. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +2 -0
  546. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +1 -1
  547. package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -0
  548. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +2 -1
  549. package/pipeline/skills/shared/external/push-notifications/SKILL.md +2 -0
  550. package/pipeline/skills/shared/external/python-patterns/SKILL.md +3 -2
  551. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +3 -2
  552. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +2 -2
  553. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +1 -1
  554. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +3 -2
  555. package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +7 -7
  556. package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +69 -69
  557. package/pipeline/skills/shared/external/room-database/references/patterns.md +126 -126
  558. package/pipeline/skills/shared/external/search-first/SKILL.md +2 -1
  559. package/pipeline/skills/shared/external/security-review/SKILL.md +4 -3
  560. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +2 -2
  561. package/pipeline/skills/shared/external/signal-community/SKILL.md +1 -1
  562. package/pipeline/skills/shared/external/skill-creator/SKILL.md +2 -1
  563. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +2 -1
  564. package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +2 -0
  565. package/pipeline/skills/shared/external/storekit/SKILL.md +2 -0
  566. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +2 -0
  567. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +2 -1
  568. package/pipeline/skills/shared/external/swift-charts/SKILL.md +2 -1
  569. package/pipeline/skills/shared/external/swift-codable/SKILL.md +2 -0
  570. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +3 -1
  571. package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +5 -4
  572. package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -1
  573. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +2 -0
  574. package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -1
  575. package/pipeline/skills/shared/external/swift-security/SKILL.md +2 -1
  576. package/pipeline/skills/shared/external/swift-testing/SKILL.md +2 -0
  577. package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -1
  578. package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +10 -0
  579. package/pipeline/skills/shared/external/swiftdata/SKILL.md +2 -0
  580. package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -1
  581. package/pipeline/skills/shared/external/swiftlint/SKILL.md +2 -0
  582. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +2 -0
  583. package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +3 -1
  584. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +2 -0
  585. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +2 -0
  586. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +2 -0
  587. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +2 -0
  588. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +3 -1
  589. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +3 -1
  590. package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +5 -4
  591. package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -1
  592. package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +5 -4
  593. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +2 -0
  594. package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +4 -3
  595. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +2 -0
  596. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
  597. package/pipeline/skills/shared/external/testing-backend/SKILL.md +3 -2
  598. package/pipeline/skills/shared/external/tipkit/SKILL.md +2 -0
  599. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +3 -2
  600. package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -0
  601. package/pipeline/skills/shared/external/vue-composition/SKILL.md +3 -2
  602. package/pipeline/skills/shared/external/weatherkit/SKILL.md +2 -0
  603. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +3 -2
  604. package/pipeline/skills/shared/external/web-performance/SKILL.md +3 -2
  605. package/pipeline/skills/shared/external/web-testing/SKILL.md +3 -2
  606. package/pipeline/skills/shared/external/widgetkit/SKILL.md +2 -0
  607. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +1 -1
  608. package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +2 -0
  609. package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +2 -0
  610. package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +2 -0
  611. package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +2 -0
  612. package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +2 -0
  613. package/pipeline/skills/skills-index.md +40 -41
  614. package/docs/token-budget-history.md +0 -24
  615. package/pipeline/skills/shared/external/agentflow/SKILL.md +0 -199
  616. package/pipeline/skills/shared/external/android-ui-verification/SKILL.md +0 -66
  617. package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +0 -299
  618. package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +0 -255
  619. package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +0 -167
  620. package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +0 -116
  621. package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -216
@@ -24,6 +24,11 @@
24
24
  set -uo pipefail
25
25
 
26
26
  PREFS="${MULTI_AGENT_PREFS:-$HOME/.claude/multi-agent-preferences.json}"
27
+
28
+ _MA_MR_HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
29
+ # shellcheck source=/dev/null
30
+ if [ -f "$_MA_MR_HERE/user-facing.sh" ]; then . "$_MA_MR_HERE/user-facing.sh"; else . "$HOME/.claude/lib/user-facing.sh"; fi
31
+
27
32
  ACTION="${1:-report}"
28
33
 
29
34
  case "$ACTION" in
@@ -43,7 +48,7 @@ if ! command -v jq >/dev/null 2>&1; then
43
48
  fi
44
49
 
45
50
  if [ ! -f "$PREFS" ]; then
46
- echo "model-rung: preferences not found at $PREFS - run /multi-agent:setup first" >&2
51
+ echo "model-rung: preferences not found at $PREFS - run $(ma_command setup) first" >&2
47
52
  exit 3
48
53
  fi
49
54
 
@@ -334,7 +334,7 @@ for r in (state.get("readonlySiblings") or []) + extras:
334
334
  })
335
335
  agent_state["siblings"] = siblings
336
336
 
337
- logs_dir = os.path.expanduser(os.path.join("~/.claude/logs/multi-agent", primary["name"], state["taskId"]))
337
+ logs_dir = os.path.join(os.environ.get("LOGS_ROOT") or os.path.expanduser("~/.claude/logs/multi-agent"), primary["name"], state["taskId"])
338
338
  os.makedirs(logs_dir, exist_ok=True)
339
339
  out_path = os.path.join(logs_dir, "agent-state.json")
340
340
  tmp_path = out_path + ".tmp"
@@ -9,24 +9,27 @@
9
9
  * error messages and file excerpts, any of which can contain a token that was
10
10
  * on the machine a second earlier.
11
11
  *
12
- * SCOPE, and the part the plan for this got wrong: corporate names are NOT
13
- * checked here. A Jira comment on a corporate ticket legitimately contains the
14
- * corporate project key, the repo name and the hostname - refusing those would
15
- * make the gate fire on every correct publish, and a gate that cries wolf is
16
- * turned off. Repo genericity and run-output hygiene are different jobs with
17
- * different lists, and only the second one ships.
12
+ * SCOPE: credentials and run-environment leaks, not corporate names. A Jira
13
+ * comment on a corporate ticket legitimately contains the project key, the
14
+ * repo name and the hostname; refusing those would make the gate fire on every
15
+ * correct publish. Repo genericity is smoke-personal-data.sh's job, with a
16
+ * different list.
18
17
  *
19
- * WIRED INTO, and the honest limit: the three SHELL publishers -
20
- * lib/jira-publish.sh (which is also how `channels` posts to Jira),
21
- * lib/post-pr-review.sh (per-finding comments and the request-changes body),
22
- * and scripts/update-issue-progress.sh. That is every publish this repo makes
23
- * from a script.
18
+ * SURFACES (exported below, each with the file that enforces it): the PR body
19
+ * an unattended run hands the runner (scripts/pr-request.mjs, which refuses to
20
+ * write pr-request.json and whose `validate` the runner re-runs), the PR text
21
+ * and the post-PR reports the autopilot runner publishes
22
+ * (scripts/autopilot-publish.mjs), Jira comments
23
+ * and descriptions (lib/jira-publish.sh, also the path `channels` posts
24
+ * through), Jira issue creation (lib/analysis-jira-write.sh), Confluence pages
25
+ * (lib/md2confluence-v3.py, the only create/update path), PR reviews
26
+ * (lib/post-pr-review.sh) and GitHub issue progress comments
27
+ * (scripts/update-issue-progress.sh).
24
28
  *
25
- * It is NOT every publish. `channels` also writes a Confluence page and a PR
26
- * description, and those are composed and posted by the agent following the
27
- * skill rather than by a script, so nothing in shell can intercept them. A
28
- * gate that claimed four paths while covering three would be worse than one
29
- * that covers three and says so.
29
+ * The limit: an attended run's agent can still compose text and post it with a
30
+ * raw `gh` or `curl` call that no script intercepts. An unattended run cannot:
31
+ * agent-guard blocks every such call under MULTI_AGENT_UNATTENDED=1, so there
32
+ * the runner, publishing from pr-request.json, is the only path out.
30
33
  *
31
34
  * WHAT IT NEVER DOES: print the thing it found. A gate that echoes the secret
32
35
  * into a terminal, a log and a CI transcript has moved it somewhere new.
@@ -117,6 +120,33 @@ export const RULES = [
117
120
  },
118
121
  ];
119
122
 
123
+ /**
124
+ * Where published text is scanned. `enforcedBy` is the repo-relative file that
125
+ * calls the gate before anything is sent; `call` is what that file must contain.
126
+ * test/outbound-gate.test.mjs reads each file and holds it to this list.
127
+ */
128
+ export const SURFACES = [
129
+ { id: "pr-request-body", enforcedBy: "pipeline/scripts/pr-request.mjs", call: /\bscan\(/ },
130
+ {
131
+ id: "runner-publish",
132
+ enforcedBy: "pipeline/scripts/autopilot-publish.mjs",
133
+ call: /\bscan\(/,
134
+ },
135
+ { id: "jira-comment", enforcedBy: "pipeline/lib/jira-publish.sh", call: /ma_outbound_gate "/ },
136
+ { id: "jira-issue", enforcedBy: "pipeline/lib/analysis-jira-write.sh", call: /outbound_gate/ },
137
+ {
138
+ id: "confluence-page",
139
+ enforcedBy: "pipeline/lib/md2confluence-v3.py",
140
+ call: /outbound_gate\(md_text\)/,
141
+ },
142
+ { id: "pr-review", enforcedBy: "pipeline/lib/post-pr-review.sh", call: /outbound_gate/ },
143
+ {
144
+ id: "issue-progress-comment",
145
+ enforcedBy: "pipeline/scripts/update-issue-progress.sh",
146
+ call: /outbound_gate/,
147
+ },
148
+ ];
149
+
120
150
  /**
121
151
  * @param {string} text
122
152
  * @returns {{rule: string, certain: boolean, line: number}[]}
@@ -34,7 +34,8 @@
34
34
  # 13-19 digit card-like runs -> [REDACTED:card]
35
35
  # 11 digit national-id-like numbers -> [REDACTED:national-id]
36
36
  # 9+ digit phone-like runs -> [REDACTED:phone]
37
- # 6-char PNR-like tokens (A-Z0-9 mix)-> [REDACTED:pnr]
37
+ # 6-char reservation/order reference codes (A-Z0-9 mix, or 6 letters
38
+ # right after a reference-code label) -> [REDACTED:reference]
38
39
  #
39
40
  # Output (stdout, single JSON object):
40
41
  # {
@@ -147,18 +148,24 @@ def extract_ids(text):
147
148
 
148
149
  # Order matters: card (13-19 digits, separators allowed) before national-id
149
150
  # (exactly 11) before phone (9+); a 16-digit card must not survive as a
150
- # "phone". PNR-like runs last so redacted placeholders are not re-matched.
151
+ # "phone". Reference codes last so redacted placeholders are not re-matched.
152
+ REFERENCE_LABELS = (
153
+ r"reference (?:code|number|no)|ref (?:code|no)"
154
+ r"|(?:booking|reservation|order|confirmation) (?:code|number|no|ref|reference)"
155
+ r"|rezervasyon (?:kodu|no)|sipari[s\u015f] (?:kodu|no)|pnr"
156
+ )
157
+
151
158
  REDACTIONS = [
152
159
  (re.compile(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"), "[REDACTED:email]"),
153
160
  (re.compile(r"\b\d(?:[ -]?\d){12,18}\b"), "[REDACTED:card]"),
154
161
  (re.compile(r"\b\d{11}\b"), "[REDACTED:national-id]"),
155
162
  (re.compile(r"(?<![\w.-])\+?\d(?:[ ()-]?\d){8,14}\b"), "[REDACTED:phone]"),
156
- (re.compile(r"\b(?=[A-Z0-9]{6}\b)(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{6}\b"), "[REDACTED:pnr]"),
157
- # All-letter PNRs exist too, but a bare 6-letter uppercase word is far too
158
- # common to redact blind - only take one that follows a PNR-ish keyword.
163
+ (re.compile(r"\b(?=[A-Z0-9]{6}\b)(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{6}\b"), "[REDACTED:reference]"),
164
+ # An all-letter code is only taken after a reference-code label: a bare
165
+ # 6-letter uppercase word is far too common to redact blind.
159
166
  (
160
- re.compile(r"\b(?P<kw>pnr|rezervasyon kodu|booking (?:ref|reference|code))(?P<sep>[^A-Za-z0-9\n]{0,3})[A-Z]{6}\b", re.IGNORECASE),
161
- lambda m: m.group("kw") + m.group("sep") + "[REDACTED:pnr]",
167
+ re.compile(r"\b(?P<kw>" + REFERENCE_LABELS + r")(?P<sep>[^A-Za-z0-9\n]{0,3})[A-Z]{6}\b", re.IGNORECASE),
168
+ lambda m: m.group("kw") + m.group("sep") + "[REDACTED:reference]",
162
169
  ),
163
170
  ]
164
171
 
@@ -6,8 +6,8 @@
6
6
  # step-by-step as Phase 3 works through it.
7
7
  #
8
8
  # State lives in `agent-state.json` under `.plan.todos[]` per
9
- # pipeline/schemas/plan-todos.schema.json. Phase 2 (Planning) emits the
10
- # initial plan; Phase 3 (Dev) iterates step-by-step; Phase 4 (Review)
9
+ # pipeline/schemas/plan-todos.schema.json. Phase 1 (Plan) emits the
10
+ # initial plan; Phase 2 (Dev) iterates step-by-step; Phase 3 (Review)
11
11
  # inspects completion; Phase 5 (Report) renders the rollup.
12
12
  #
13
13
  # Subcommands:
@@ -52,7 +52,7 @@ ma_require_jq "read or write the plan" || exit 3
52
52
  # (nested <root>/<project>/<id>/ and flat <root>/<id>/) and every id spelling.
53
53
  _MA_RP_HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
54
54
  # shellcheck source=/dev/null
55
- . "$_MA_RP_HERE/run-paths.sh" 2>/dev/null || . "$HOME/.claude/lib/run-paths.sh"
55
+ if [ -f "$_MA_RP_HERE/run-paths.sh" ]; then . "$_MA_RP_HERE/run-paths.sh"; else . "$HOME/.claude/lib/run-paths.sh"; fi
56
56
 
57
57
 
58
58
  CMD="${1:-}"
@@ -90,7 +90,9 @@ ma_outbound_gate_text() {
90
90
  # (nested <root>/<project>/<id>/ and flat <root>/<id>/) and every id spelling.
91
91
  _MA_RP_HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
92
92
  # shellcheck source=/dev/null
93
- . "$_MA_RP_HERE/run-paths.sh" 2>/dev/null || . "$HOME/.claude/lib/run-paths.sh"
93
+ if [ -f "$_MA_RP_HERE/run-paths.sh" ]; then . "$_MA_RP_HERE/run-paths.sh"; else . "$HOME/.claude/lib/run-paths.sh"; fi
94
+ # shellcheck source=/dev/null
95
+ if [ -f "$_MA_RP_HERE/user-facing.sh" ]; then . "$_MA_RP_HERE/user-facing.sh"; else . "$HOME/.claude/lib/user-facing.sh"; fi
94
96
 
95
97
 
96
98
  # Basic-auth via a curl config fed through process substitution so the
@@ -119,12 +121,11 @@ if [ -z "$AGENT_STATE" ]; then
119
121
  fi
120
122
 
121
123
  if ! jq -e '.review' "$AGENT_STATE" >/dev/null; then
122
- echo "post-pr-review: agent-state has no .review field - run /multi-agent:review first" >&2
124
+ echo "post-pr-review: agent-state has no .review field - run $(ma_command review) first" >&2
123
125
  exit 2
124
126
  fi
125
127
 
126
- OUT_LANG=$(jq -r '.global.outputLanguage // "en"' "$HOME/.claude/multi-agent-preferences.json" 2>/dev/null || echo "en")
127
- case "$OUT_LANG" in tr|en) ;; *) OUT_LANG=en ;; esac
128
+ OUT_LANG=$(ma_output_lang)
128
129
 
129
130
  PROVIDER=$(jq -r '.review.input.provider // empty' "$AGENT_STATE")
130
131
  PR_NUM=$(jq -r '.review.input.prNumber // empty' "$AGENT_STATE")
@@ -162,9 +163,9 @@ echo "post-pr-review: decision=$DECISION (blocking=$ACCEPTED_BLOCKING, important
162
163
  # when the suggested fix wording changes slightly between iterations.
163
164
  finding_fingerprint() {
164
165
  local path="$1" line="$2" issue="$3"
165
- # sha256sum (coreutils) or shasum (perl), whichever this platform has. A bare
166
- # `shasum` produced an empty fingerprint on slim Linux images, which made every
167
- # finding look new and re-posted the whole review on each iteration.
166
+ # sha256sum (coreutils) or shasum (perl), whichever this machine has. An empty
167
+ # fingerprint would make every finding look new and re-post the whole review on
168
+ # each iteration.
168
169
  if command -v sha256sum >/dev/null 2>&1; then
169
170
  printf '%s|%s|%s' "$path" "$line" "$issue" | sha256sum | cut -c1-16
170
171
  else
@@ -379,8 +380,7 @@ post_bitbucket_server() {
379
380
  return 4
380
381
  fi
381
382
 
382
- # Resolve via the cross-platform credential helper (macOS Keychain / Windows
383
- # Credential Manager / Linux libsecret) - sourced lazily so this script keeps
383
+ # Resolve via the credential helper (macOS Keychain) - sourced lazily so this script keeps
384
384
  # working when run from either ~/.claude/lib or ~/.copilot/lib.
385
385
  # shellcheck disable=SC1090
386
386
  # Existence check before sourcing: `. <missing>` aborts the shell under `set -e`,
@@ -0,0 +1,85 @@
1
+ /**
2
+ * pr-request-location.mjs - where an unattended run leaves its PR request,
3
+ * and where the runner records what it decided about it.
4
+ *
5
+ * Under MULTI_AGENT_UNATTENDED=1 a run does not push and does not open a PR.
6
+ * Phase 4 writes one file instead, through scripts/pr-request.mjs, and the
7
+ * autopilot runner is the only process that pushes the branch and creates the
8
+ * PR, after it has verified that file. Both sides import this module so they
9
+ * cannot disagree on the path.
10
+ *
11
+ * <run root>/pr-requests/<session id>.json the run writes it
12
+ * <autopilot root>/pr-requests/<session id>.verdict.json the runner writes it
13
+ *
14
+ * The run root is MA_UNATTENDED_RUN_ROOT, else ~/.multi-agent-unattended: the
15
+ * one directory outside the worktree the unattended profile's OS sandbox lets
16
+ * a run write, since Claude Code keeps every command out of ~/.claude. The
17
+ * autopilot root is MA_AUTOPILOT_ROOT, else ~/.claude/autopilot, the same root
18
+ * the runner and launch-request.mjs use, and a run cannot write there. The
19
+ * session id is the one the runner generated and passed as
20
+ * MULTI_AGENT_SESSION_ID.
21
+ *
22
+ * Everything under the autopilot root, and every other session's request, is
23
+ * a protected path for an unattended run (scripts/unattended_policy.py). The
24
+ * Python twin of these paths lives there, and test/pr-request.test.mjs holds
25
+ * the two to the same answer.
26
+ *
27
+ * @module pipeline/lib/pr-request-location
28
+ */
29
+
30
+ import { homedir } from "node:os";
31
+ import { join } from "node:path";
32
+
33
+ export const PR_REQUESTS_SUBDIR = "pr-requests";
34
+ export const UNATTENDED_RUN_DIR = ".multi-agent-unattended";
35
+ export const PR_REQUEST_FILE_SUFFIX = ".json";
36
+ export const PR_VERDICT_FILE_SUFFIX = ".verdict.json";
37
+ export const SESSION_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
38
+
39
+ /** @param {Record<string,string|undefined>} [env] */
40
+ export function autopilotRoot(env = process.env) {
41
+ return env.MA_AUTOPILOT_ROOT || join(env.HOME || homedir(), ".claude", "autopilot");
42
+ }
43
+
44
+ /**
45
+ * Where an unattended run writes what the runner reads back: its logs and its
46
+ * PR request.
47
+ *
48
+ * @param {Record<string,string|undefined>} [env]
49
+ */
50
+ export function unattendedRunRoot(env = process.env) {
51
+ return env.MA_UNATTENDED_RUN_ROOT || join(env.HOME || homedir(), UNATTENDED_RUN_DIR);
52
+ }
53
+
54
+ /** @param {Record<string,string|undefined>} [env] */
55
+ export function runRequestsDir(env = process.env) {
56
+ return join(unattendedRunRoot(env), PR_REQUESTS_SUBDIR);
57
+ }
58
+
59
+ /** The log root an unattended run writes its state under. */
60
+ export function unattendedLogsRoot(env = process.env) {
61
+ return join(unattendedRunRoot(env), "logs");
62
+ }
63
+
64
+ /** @param {Record<string,string|undefined>} [env] */
65
+ export function prRequestsDir(env = process.env) {
66
+ return join(autopilotRoot(env), PR_REQUESTS_SUBDIR);
67
+ }
68
+
69
+ /**
70
+ * @param {string} sessionId
71
+ * @param {Record<string,string|undefined>} [env]
72
+ */
73
+ export function prRequestPath(sessionId, env = process.env) {
74
+ if (!SESSION_ID_RE.test(String(sessionId || ""))) throw new Error("session id is not a UUID");
75
+ return join(runRequestsDir(env), `${sessionId}${PR_REQUEST_FILE_SUFFIX}`);
76
+ }
77
+
78
+ /**
79
+ * @param {string} sessionId
80
+ * @param {Record<string,string|undefined>} [env]
81
+ */
82
+ export function prVerdictPath(sessionId, env = process.env) {
83
+ if (!SESSION_ID_RE.test(String(sessionId || ""))) throw new Error("session id is not a UUID");
84
+ return join(prRequestsDir(env), `${sessionId}${PR_VERDICT_FILE_SUFFIX}`);
85
+ }
@@ -0,0 +1,153 @@
1
+ /**
2
+ * regular-file.mjs - read a file an agent could have written, without letting
3
+ * it choose what the read does.
4
+ *
5
+ * A synchronous read of a path an unattended run controls is a lever on the
6
+ * process doing the reading. A FIFO under that name blocks the read forever, a
7
+ * character device never ends, a symlink points anywhere, and a large file is
8
+ * read into memory whole. The autopilot runner and its publish step read such
9
+ * paths on the one thread that supervises every run, so a single planted FIFO
10
+ * would stop the queue.
11
+ *
12
+ * readRegularFile opens the resolved path non-blocking and without following a
13
+ * final symlink, checks the open descriptor (not the name) is a regular file
14
+ * no larger than the cap, and reads at most the cap. `within` restricts the
15
+ * resolved path to one of the given directories.
16
+ *
17
+ * O_NOFOLLOW covers only the last path component, so a directory swapped for a
18
+ * symlink between resolving and opening would still be followed. After the
19
+ * open, the descriptor's device and inode are compared with a fresh lstat of
20
+ * the resolved path; a mismatch means the name no longer points at what was
21
+ * opened, and the read is refused. A swap that is made and undone entirely
22
+ * between the open and that lstat is not seen; Node exposes no portable way to
23
+ * ask the kernel for a descriptor's path.
24
+ *
25
+ * @module pipeline/lib/regular-file
26
+ */
27
+
28
+ import {
29
+ closeSync,
30
+ constants,
31
+ fstatSync,
32
+ lstatSync,
33
+ openSync,
34
+ readSync,
35
+ realpathSync,
36
+ } from "node:fs";
37
+ import { sep } from "node:path";
38
+
39
+ export const DEFAULT_MAX_BYTES = 16 * 1024 * 1024;
40
+
41
+ export class RegularFileError extends Error {
42
+ /**
43
+ * @param {"missing"|"not-regular"|"outside"|"too-large"|"unreadable"} code
44
+ * @param {string} message
45
+ */
46
+ constructor(code, message) {
47
+ super(message);
48
+ this.name = "RegularFileError";
49
+ this.code = code;
50
+ }
51
+ }
52
+
53
+ function realOr(p) {
54
+ try {
55
+ return realpathSync(p);
56
+ } catch {
57
+ return p;
58
+ }
59
+ }
60
+
61
+ function inside(path, dir) {
62
+ const d = dir.endsWith(sep) ? dir : dir + sep;
63
+ return path === dir || path.startsWith(d);
64
+ }
65
+
66
+ /**
67
+ * Throws unless `fd` is the same file the path names right now, reached
68
+ * without a symlink at its last component.
69
+ *
70
+ * @param {number} fd
71
+ * @param {string} path
72
+ */
73
+ export function assertOpenedIsPath(fd, path) {
74
+ let now;
75
+ try {
76
+ now = lstatSync(path);
77
+ } catch (err) {
78
+ throw new RegularFileError("unreadable", `${path}: ${err.code || err.message}`);
79
+ }
80
+ const opened = fstatSync(fd);
81
+ if (now.isSymbolicLink() || now.dev !== opened.dev || now.ino !== opened.ino) {
82
+ throw new RegularFileError("unreadable", `${path} changed while it was being opened`);
83
+ }
84
+ }
85
+
86
+ /**
87
+ * The file's text, or a RegularFileError naming why it was refused.
88
+ *
89
+ * @param {string} path
90
+ * @param {{maxBytes?: number, within?: string[]|null}} [opts]
91
+ * @returns {string}
92
+ */
93
+ export function readRegularFile(path, { maxBytes = DEFAULT_MAX_BYTES, within = null } = {}) {
94
+ let real;
95
+ try {
96
+ real = realpathSync(path);
97
+ } catch (err) {
98
+ throw new RegularFileError(
99
+ err.code === "ENOENT" ? "missing" : "unreadable",
100
+ `${path}: ${err.code || err.message}`,
101
+ );
102
+ }
103
+ if (Array.isArray(within) && !within.filter(Boolean).some((d) => inside(real, realOr(d)))) {
104
+ throw new RegularFileError("outside", `${path} resolves outside the directories it may be in`);
105
+ }
106
+ let fd;
107
+ try {
108
+ fd = openSync(
109
+ real,
110
+ constants.O_RDONLY | (constants.O_NONBLOCK ?? 0) | (constants.O_NOFOLLOW ?? 0),
111
+ );
112
+ } catch (err) {
113
+ throw new RegularFileError("unreadable", `${path}: ${err.code || err.message}`);
114
+ }
115
+ try {
116
+ assertOpenedIsPath(fd, real);
117
+ const st = fstatSync(fd);
118
+ if (!st.isFile()) throw new RegularFileError("not-regular", `${path} is not a regular file`);
119
+ if (st.size > maxBytes) {
120
+ throw new RegularFileError("too-large", `${path} is larger than ${maxBytes} bytes`);
121
+ }
122
+ const buf = Buffer.alloc(Math.min(st.size, maxBytes) + 1);
123
+ let n = 0;
124
+ for (;;) {
125
+ const got = readSync(fd, buf, n, buf.length - n, null);
126
+ if (got === 0) break;
127
+ n += got;
128
+ if (n > maxBytes) {
129
+ throw new RegularFileError("too-large", `${path} is larger than ${maxBytes} bytes`);
130
+ }
131
+ if (n === buf.length) break;
132
+ }
133
+ return buf.subarray(0, n).toString("utf8");
134
+ } finally {
135
+ closeSync(fd);
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Parsed JSON from a regular file, or `fallback` for anything that is not one,
141
+ * is too large, or does not parse.
142
+ *
143
+ * @param {string} path
144
+ * @param {*} [fallback]
145
+ * @param {{maxBytes?: number, within?: string[]|null}} [opts]
146
+ */
147
+ export function readRegularJson(path, fallback = null, opts = {}) {
148
+ try {
149
+ return JSON.parse(readRegularFile(path, opts));
150
+ } catch {
151
+ return fallback;
152
+ }
153
+ }
@@ -22,6 +22,10 @@
22
22
  # ma_hygiene_prune_empty <repo-root> rmdir the artefact parents when
23
23
  # their last child is gone.
24
24
  #
25
+ # Run as a command, the same four take the repo root as an argument:
26
+ # bash repo-hygiene.sh ensure|release|gitignore|prune <repo-root>
27
+ # so a phase doc calls one simple command instead of sourcing the library.
28
+ #
25
29
  # Every function is best-effort: a read-only or non-git directory is not an
26
30
  # error, because refusing to run a pipeline over a repo we cannot tidy is worse
27
31
  # than leaving it untidy. Callers do not check the return value.
@@ -167,3 +171,16 @@ ma_hygiene_prune_empty() {
167
171
  fi
168
172
  return 0
169
173
  }
174
+
175
+ if [ "${BASH_SOURCE[0]:-$0}" = "$0" ]; then
176
+ case "${1:-}" in
177
+ ensure) ma_hygiene_ensure_exclusions "${2:-}" ;;
178
+ release) ma_hygiene_release_exclusions "${2:-}" ;;
179
+ gitignore) ma_hygiene_local_gitignore "${2:-}" ;;
180
+ prune) ma_hygiene_prune_empty "${2:-}" ;;
181
+ *)
182
+ echo "usage: repo-hygiene.sh ensure|release|gitignore|prune <repo-root>" >&2
183
+ exit 2
184
+ ;;
185
+ esac
186
+ fi
@@ -24,6 +24,10 @@ set -uo pipefail
24
24
 
25
25
  PREFS="${MULTI_AGENT_PREFS:-$HOME/.claude/multi-agent-preferences.json}"
26
26
 
27
+ _MA_RS_HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
28
+ # shellcheck source=/dev/null
29
+ if [ -f "$_MA_RS_HERE/user-facing.sh" ]; then . "$_MA_RS_HERE/user-facing.sh"; else . "$HOME/.claude/lib/user-facing.sh"; fi
30
+
27
31
  # The scope values this accepts, spelled once. `host-session` is NOT here and
28
32
  # must never be added: it would mean rewriting the host's base URL, which routes
29
33
  # the user's whole session - work that has nothing to do with this pipeline
@@ -38,7 +42,7 @@ die() { echo "route-state: $1" >&2; exit "${2:-3}"; }
38
42
  # come back empty, `route-status` would report disabled, and a user with rules
39
43
  # armed would be told there are none.
40
44
  command -v jq >/dev/null 2>&1 || die "jq not found - cannot read or write preferences (install: brew install jq)"
41
- [ -f "$PREFS" ] || die "preferences not found at $PREFS - run /multi-agent:setup first"
45
+ [ -f "$PREFS" ] || die "preferences not found at $PREFS - run $(ma_command setup) first"
42
46
  jq -e . "$PREFS" >/dev/null 2>&1 || die "$PREFS is not valid JSON - refusing to write over it"
43
47
 
44
48
  ACTION="${1:-status}"; shift 2>/dev/null || true
@@ -58,14 +58,15 @@ ma_is_run_dir() {
58
58
 
59
59
  ma_is_reserved() {
60
60
  case "$1" in
61
- review-watch | jira-backups | shadow-git | _analysis-jira | prompts) return 0 ;;
61
+ review-watch | jira-backups | shadow-git | _analysis-jira | prompts | contract-server) return 0 ;;
62
62
  esac
63
63
  return 1
64
64
  }
65
65
 
66
66
  # Newest mtime across a run directory's markers, as epoch seconds. GNU-first
67
67
  # `stat -c` ordering is required: `stat -f` is a valid GNU flag
68
- # (--file-system) that SUCCEEDS, so BSD-first would silently win on Linux.
68
+ # (--file-system) that SUCCEEDS, so BSD-first would silently win whenever GNU
69
+ # coreutils is first on PATH (Homebrew gnubin).
69
70
  ma_run_mtime() {
70
71
  local d="$1" m t newest=0 b
71
72
  for b in "$d" "$d/$MA_ARTIFACTS_SUBDIR"; do
@@ -181,6 +181,24 @@ EOF
181
181
  return 0
182
182
  }
183
183
 
184
+ # JSON string escaping without jq, which this file does not otherwise need.
185
+ # "why" can quote a caller-supplied path, so every character JSON reserves is
186
+ # escaped: backslash and quote, then any control character as \uXXXX.
187
+ _ma_json_str() {
188
+ local s="$1" out="" c i
189
+ s="${s//\\/\\\\}"
190
+ s="${s//\"/\\\"}"
191
+ if [[ "$s" == *[[:cntrl:]]* ]]; then
192
+ for ((i = 0; i < ${#s}; i++)); do
193
+ c="${s:i:1}"
194
+ [[ "$c" == [[:cntrl:]] ]] && printf -v c '\\u%04x' "'$c"
195
+ out+="$c"
196
+ done
197
+ s="$out"
198
+ fi
199
+ printf '"%s"' "$s"
200
+ }
201
+
184
202
  if [ "${BASH_SOURCE[0]:-$0}" = "$0" ]; then
185
203
  _json=0
186
204
  case "${1:-}" in --json)
@@ -192,7 +210,7 @@ if [ "${BASH_SOURCE[0]:-$0}" = "$0" ]; then
192
210
  if [ "$_json" -eq 1 ]; then
193
211
  _arr=""
194
212
  for _s in $MA_STACKS; do _arr="${_arr:+$_arr,}\"$_s\""; done
195
- printf '{"stacks":[%s],"why":"%s"}\n' "$_arr" "$MA_STACK_WHY"
213
+ printf '{"stacks":[%s],"why":%s}\n' "$_arr" "$(_ma_json_str "$MA_STACK_WHY")"
196
214
  else
197
215
  printf 'MA_STACKS=%s\n' "$(printf '%q' "$MA_STACKS")"
198
216
  printf 'MA_STACK_WHY=%s\n' "$(printf '%q' "$MA_STACK_WHY")"