@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
@@ -8,21 +8,33 @@
8
8
  #
9
9
  # (default) a paragraph for a human reading the terminal
10
10
  # --short one line, for autopilot-off and the session hook
11
- # --json status.json, which is what bin/menubar renders
11
+ # --json status.json, which is what bin/menubar renders. Besides the
12
+ # queue it carries the runner's operations: inhibitorHeld,
13
+ # lastGcReport, lastDigest (paths, empty when none),
14
+ # maxParallelAgents (null when unlimited) and
15
+ # awake: {held, display} from the awake agent.
12
16
  # --write compute and write status.json, print nothing
13
17
  # --subjects one line per in-flight item for the native task widget
14
18
  #
15
19
  # `--json` and `--write` produce the SAME bytes. A menu bar fed by a different
16
20
  # code path than the terminal is a second source of truth with a nicer font.
17
21
  #
18
- # Exit: 0 always when it can read the state, 2 on usage. Never non-zero because
19
- # the mode is off - "off" is an answer.
22
+ # Every line a person reads renders in `prefs.global.outputLanguage`, including
23
+ # the ones that travel to the menu bar inside status.json: this script is the
24
+ # only place that wording exists, so the corner of the screen and the terminal
25
+ # cannot say it two ways.
26
+ #
27
+ # Exit: 0 always when it can read the state, 2 on usage, 3 when --json or
28
+ # --write cannot build the envelope (jq missing, or jq rejecting an input;
29
+ # --json still prints a JSON {"error": ...} object, --write leaves the previous
30
+ # status.json in place). Never non-zero because the mode is off - "off" is an
31
+ # answer.
20
32
 
21
33
  set -uo pipefail
22
34
 
23
35
  HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
24
36
  # shellcheck source=/dev/null
25
- . "$HERE/../lib/autopilot-state.sh" 2>/dev/null || . "$HOME/.claude/lib/autopilot-state.sh"
37
+ if [ -f "$HERE/../lib/autopilot-state.sh" ]; then . "$HERE/../lib/autopilot-state.sh"; else . "$HOME/.claude/lib/autopilot-state.sh"; fi
26
38
 
27
39
  MODE="human"
28
40
  case "${1:-}" in
@@ -41,7 +53,105 @@ case "${1:-}" in
41
53
  ;;
42
54
  esac
43
55
 
44
- command -v jq >/dev/null 2>&1 || { echo "autopilot-status: jq is required"; exit 0; }
56
+ # A decoder reads stdout, so under --json even this failure is JSON, and the exit
57
+ # code says the envelope is not a status.
58
+ if ! command -v jq >/dev/null 2>&1; then
59
+ case "$MODE" in
60
+ json) printf '%s\n' '{"error":"jq-required","message":"autopilot-status: jq is required"}'; exit 3 ;;
61
+ write) echo "autopilot-status: jq is required" >&2; exit 3 ;;
62
+ *) echo "autopilot-status: jq is required"; exit 0 ;;
63
+ esac
64
+ fi
65
+
66
+ # The same resolver every other shipped script reads, so a run whose preferences
67
+ # are pointed at a fixture renders this surface and the arming verdict inside it
68
+ # from one file. The codes are the schema's, lowercase and exact.
69
+ OUT_LANG=$(ma_output_lang 2>/dev/null || echo en)
70
+ case "$OUT_LANG" in tr | en) ;; *) OUT_LANG=en ;; esac
71
+
72
+ # One table, both languages on the same line, so a wording change cannot land on
73
+ # one of them. English is the default and the fallback for a language the table
74
+ # does not carry.
75
+ msg() { # $1 = key, $2.. = printf arguments
76
+ local key="$1" en='' tr='' fmt=''
77
+ shift
78
+ case "$key" in
79
+ power-ac)
80
+ en='plugged in, sleep is held while a run is in flight'
81
+ tr='prizde, bir koşu sürerken uyku engelleniyor' ;;
82
+ power-battery)
83
+ en='on battery, sleep is free - it continues when you plug in'
84
+ tr='bataryada, uyku serbest - prize takınca devam eder' ;;
85
+ awake-held)
86
+ en='kept awake while autopilot is on - system sleep held on AC, idle sleep on battery too'
87
+ tr='autopilot açıkken uyanık tutuluyor - prizde sistem uykusu, bataryada da boşta uyku engelleniyor' ;;
88
+ awake-held-display)
89
+ en='kept awake while autopilot is on, display included'
90
+ tr='autopilot açıkken ekran dahil uyanık tutuluyor' ;;
91
+ orphaned)
92
+ en='the config is on but launchd holds no job - re-arm with %s'
93
+ tr='config açık ama launchd bir iş tutmuyor - %s ile yeniden kur' ;;
94
+ phase-word)
95
+ en='Phase'
96
+ tr='Faz' ;;
97
+ awaiting-subject)
98
+ en='waiting for an answer'
99
+ tr='cevap bekliyor' ;;
100
+ short-off)
101
+ en='autopilot: off (%s repos selected)'
102
+ tr='autopilot: kapalı (%s repo seçili)' ;;
103
+ short-absent)
104
+ en='autopilot: not set up'
105
+ tr='autopilot: kurulu değil' ;;
106
+ short-on)
107
+ en='autopilot: on · %s running, %s queued, %s awaiting an answer · %s'
108
+ tr='autopilot: açık · %s koşuyor, %s sırada, %s cevap bekliyor · %s' ;;
109
+ human-absent)
110
+ en='autopilot: not set up on this machine.'
111
+ tr='autopilot: bu makinede kurulu değil.' ;;
112
+ human-turn-on)
113
+ en=' To turn it on: %s'
114
+ tr=' Açmak için: %s' ;;
115
+ human-on)
116
+ en='autopilot: ON · %s repos · %s slots (this machine holds %s) · scanning every %ss'
117
+ tr='autopilot: AÇIK · %s repo · %s slot (bu makine %s kaldırır) · her %ssn tarıyor' ;;
118
+ human-off)
119
+ en='autopilot: OFF · %s repos selected, nothing scheduled'
120
+ tr='autopilot: KAPALI · %s repo seçili, zamanlama yok' ;;
121
+ heading-running)
122
+ en='Running (%s):'
123
+ tr='Koşuyor (%s):' ;;
124
+ heading-queued)
125
+ en='Queued (%s):'
126
+ tr='Sırada (%s):' ;;
127
+ heading-awaiting)
128
+ en='Waiting for an answer (%s) - the open questions are posted, and it continues once they are answered:'
129
+ tr='Cevap bekliyor (%s) - açık soruları yorumladık, cevap gelince devam edecek:' ;;
130
+ queue-empty)
131
+ en='Nothing queued.'
132
+ tr='Sırada iş yok.' ;;
133
+ queue-empty-hint)
134
+ en=' To give it an item: add the label to a GitHub issue, or to a Jira item assigned to you.'
135
+ tr=' Bir madde alması için: GitHub issue veya sana atanmış Jira maddesine label ekle.' ;;
136
+ blocked)
137
+ en='Not taking new items: %s'
138
+ tr='Yeni madde alınmıyor: %s' ;;
139
+ spend)
140
+ en='Last 24 hours: $%s / $%s'
141
+ tr='Son 24 saat: $%s / $%s' ;;
142
+ heading-reports)
143
+ en='Last 24 hours (%s PRs):'
144
+ tr='Son 24 saat (%s PR):' ;;
145
+ *)
146
+ printf 'autopilot-status: no message for %s\n' "$key" >&2
147
+ return 1 ;;
148
+ esac
149
+ # English is the fallback per key, not only per language: a key whose Turkish
150
+ # half is absent renders its English one rather than a bare newline.
151
+ if [ "$OUT_LANG" = tr ] && [ -n "$tr" ]; then fmt="$tr"; else fmt="$en"; fi
152
+ # shellcheck disable=SC2059
153
+ printf "$fmt\n" "$@"
154
+ }
45
155
 
46
156
  ON=false; ma_ap_is_on && ON=true
47
157
  CONFIGURED=false; ma_ap_is_configured && CONFIGURED=true
@@ -81,40 +191,95 @@ if [ -f "$(ma_ap_root)/attempted.jsonl" ]; then
81
191
  | sort_by(-.finishedAt) | .[0:10]' "$(ma_ap_root)/attempted.jsonl" 2>/dev/null || echo '[]')
82
192
  fi
83
193
  TODAY_N=$(printf '%s' "$REPORTS" | jq 'length' 2>/dev/null || echo 0)
194
+
195
+ # The operations the runner owns. The inhibitor is held when the pid its
196
+ # record names is alive; a record left by a runner that died is not a held lock.
197
+ AP_ROOT=$(ma_ap_root)
198
+ INHIBITOR_HELD=false
199
+ INH_PID=$(jq -r '.pid // empty' "$AP_ROOT/inhibitor.json" 2>/dev/null || true)
200
+ case "$INH_PID" in
201
+ "" | *[!0-9]*) ;;
202
+ *) kill -0 "$INH_PID" 2>/dev/null && INHIBITOR_HELD=true ;;
203
+ esac
204
+ latest_daily() { # $1 = prefix; the newest <prefix><date>.json, or empty
205
+ local f last=""
206
+ for f in "$AP_ROOT/$1"*.json; do [ -f "$f" ] && last="$f"; done
207
+ printf '%s' "$last"
208
+ }
209
+ LAST_GC=$(latest_daily gc-report-)
210
+ LAST_DIGEST=$(latest_daily digest-)
211
+ # The awake agent: the launchd job that holds sleep off for as long as the mode
212
+ # is on, read by the same script that installs and removes it.
213
+ AWAKE='{"held":false,"display":false}'
214
+ AWAKE_SCRIPT=$(ma_ap_asset scripts/autopilot-awake.mjs 2>/dev/null || true)
215
+ if [ -n "$AWAKE_SCRIPT" ]; then
216
+ AWAKE_OUT=$(node "$AWAKE_SCRIPT" status --json 2>/dev/null || true)
217
+ if printf '%s' "$AWAKE_OUT" | jq -e '(.held|type=="boolean") and (.display|type=="boolean")' >/dev/null 2>&1; then
218
+ AWAKE=$(printf '%s' "$AWAKE_OUT" | jq -c '{held, display}')
219
+ fi
220
+ fi
221
+ AWAKE_HELD=$(printf '%s' "$AWAKE" | jq -r '.held')
222
+ AWAKE_DISPLAY=$(printf '%s' "$AWAKE" | jq -r '.display')
223
+ MAX_PAR=$(ma_ap_cfg '.maxParallelAgents' null 2>/dev/null || echo null)
224
+ case "$MAX_PAR" in "" | *[!0-9]*) MAX_PAR=null ;; esac
84
225
  TODAY_USD=$(printf '%s' "$QUEUE" | jq -r '.todayUsd // 0' 2>/dev/null || echo 0)
85
226
 
86
227
  NOTE=""
87
228
  if [ "$ON" = true ]; then
88
- if [ "$POWER" = "ac" ]; then NOTE="prizde, uyku engelleniyor"; else NOTE="bataryada, uyku serbest - prize takınca devam eder"; fi
229
+ if [ "$AWAKE_HELD" = true ] && [ "$AWAKE_DISPLAY" = true ]; then NOTE=$(msg awake-held-display)
230
+ elif [ "$AWAKE_HELD" = true ]; then NOTE=$(msg awake-held)
231
+ elif [ "$POWER" = "ac" ]; then NOTE=$(msg power-ac)
232
+ else NOTE=$(msg power-battery); fi
89
233
  fi
90
234
  if ma_ap_is_orphaned; then
91
- NOTE="config açık ama launchd'de iş yok - /multi-agent:autopilot-on ile yeniden kur"
235
+ NOTE=$(msg orphaned "$(ma_ap_command autopilot-on)")
92
236
  fi
93
237
 
238
+ STOP_COMMAND=$(ma_ap_command autopilot-off)
239
+
94
240
  build_json() {
95
241
  jq -nc \
96
242
  --argjson on "$ON" --argjson slots "$SLOTS" \
97
243
  --argjson running "$RUNNING" --argjson queued "$QUEUED" --argjson awaiting "$AWAITING" \
98
244
  --argjson reports "$REPORTS" --argjson todayCount "$TODAY_N" --argjson todayUsd "$TODAY_USD" \
99
- --arg power "$POWER" --arg note "$NOTE" \
245
+ --arg power "$POWER" --arg note "$NOTE" --arg stopCommand "$STOP_COMMAND" \
100
246
  --arg emptyReason "$EMPTY_REASON" --arg blockedReason "$BLOCKED" \
101
247
  --argjson interval "$INTERVAL" --argjson spendUsd "${SPEND:-0}" \
102
248
  --argjson ceilingUsd "${CEILING_USD:-0}" \
103
249
  --argjson lastTickAt "${LAST_TICK:-null}" \
250
+ --argjson inhibitorHeld "$INHIBITOR_HELD" --arg lastGcReport "$LAST_GC" \
251
+ --arg lastDigest "$LAST_DIGEST" --argjson maxParallelAgents "$MAX_PAR" \
252
+ --argjson awake "$AWAKE" \
104
253
  '{on:$on, slots:$slots, running:$running, queued:$queued, awaiting:$awaiting,
105
254
  reports:$reports, todayCount:$todayCount, todayUsd:$todayUsd,
106
- lastTickAt:$lastTickAt, power:$power, note:$note,
255
+ lastTickAt:$lastTickAt, power:$power, note:$note, stopCommand:$stopCommand,
107
256
  scanIntervalSeconds:$interval, emptyReason:$emptyReason,
108
- blockedReason:$blockedReason, spendUsd:$spendUsd, ceilingUsd:$ceilingUsd}'
257
+ blockedReason:$blockedReason, spendUsd:$spendUsd, ceilingUsd:$ceilingUsd,
258
+ inhibitorHeld:$inhibitorHeld, lastGcReport:$lastGcReport, lastDigest:$lastDigest,
259
+ maxParallelAgents:$maxParallelAgents, awake:$awake}'
109
260
  }
110
261
 
262
+ # The envelope, or nothing when jq could not build a JSON object from the inputs
263
+ # (a config value of the wrong type, for one). status.json is only ever replaced
264
+ # by a complete envelope, so the menu bar keeps its last good answer.
265
+ ENVELOPE=$(build_json 2>/dev/null) || ENVELOPE=""
266
+ printf '%s' "$ENVELOPE" | jq -e 'type == "object"' >/dev/null 2>&1 || ENVELOPE=""
267
+
111
268
  case "$MODE" in
112
269
  json)
113
- build_json
270
+ if [ -z "$ENVELOPE" ]; then
271
+ printf '%s\n' '{"error":"envelope-failed","message":"autopilot-status: could not build the status envelope"}'
272
+ exit 3
273
+ fi
274
+ printf '%s\n' "$ENVELOPE"
114
275
  exit 0
115
276
  ;;
116
277
  write)
117
- build_json | ma_ap_write status.json
278
+ if [ -z "$ENVELOPE" ]; then
279
+ echo "autopilot-status: could not build the status envelope; status.json left unchanged" >&2
280
+ exit 3
281
+ fi
282
+ printf '%s\n' "$ENVELOPE" | ma_ap_write status.json || exit 3
118
283
  exit 0
119
284
  ;;
120
285
  esac
@@ -125,8 +290,8 @@ esac
125
290
  # that never turned this on, `ma_ap_write` would create ~/.claude/autopilot/ and
126
291
  # quietly break the guarantee that a clean install writes nothing. Caught by
127
292
  # running this file on this machine, which then had the directory.
128
- if [ "$CONFIGURED" = true ]; then
129
- build_json | ma_ap_write status.json 2>/dev/null || true
293
+ if [ "$CONFIGURED" = true ] && [ -n "$ENVELOPE" ]; then
294
+ printf '%s\n' "$ENVELOPE" | ma_ap_write status.json 2>/dev/null || true
130
295
  fi
131
296
 
132
297
  NR=$(printf '%s' "$RUNNING" | jq 'length')
@@ -136,78 +301,78 @@ NA=$(printf '%s' "$AWAITING" | jq 'length')
136
301
  if [ "$MODE" = "subjects" ]; then
137
302
  # One line per item, with the numbers INSIDE the string: the widget takes
138
303
  # exactly one string per row, so anything the reader needs has to travel in it.
139
- printf '%s' "$RUNNING" | jq -r '.[] |
140
- "\(.id) · \(.depth // "full" | ascii_upcase[0:1] + .[1:]) · Faz \(.phase // "?")\(if .phaseTotal then "/\(.phaseTotal)" else "" end) \(.phaseName // "") · \(.stack // "")"'
141
- printf '%s' "$AWAITING" | jq -r '.[] | "\(.id) · cevap bekliyor"'
304
+ printf '%s' "$RUNNING" | jq -r --arg phase "$(msg phase-word)" '.[] |
305
+ "\(.id) · \($phase) \(.phase // "?")\(if .phaseTotal then "/\(.phaseTotal)" else "" end) \(.phaseName // "") · \(.stack // "")"'
306
+ printf '%s' "$AWAITING" | jq -r --arg awaiting "$(msg awaiting-subject)" '.[] | "\(.id) · \($awaiting)"'
142
307
  exit 0
143
308
  fi
144
309
 
145
310
  if [ "$MODE" = "short" ]; then
146
311
  if [ "$ON" != true ]; then
147
312
  if [ "$CONFIGURED" = true ]; then
148
- echo "autopilot: kapalı ($(ma_ap_cfg '.repos | length' 0) repo seçili)"
313
+ msg short-off "$(ma_ap_cfg '.repos | length' 0)"
149
314
  else
150
- echo "autopilot: kurulu değil"
315
+ msg short-absent
151
316
  fi
152
317
  exit 0
153
318
  fi
154
- echo "autopilot: açık · $NR koşuyor, $NQ sırada, $NA cevap bekliyor · $NOTE"
319
+ msg short-on "$NR" "$NQ" "$NA" "$NOTE"
155
320
  exit 0
156
321
  fi
157
322
 
158
323
  # --- human -------------------------------------------------------------------
159
324
  if [ "$CONFIGURED" != true ]; then
160
- echo "autopilot: bu makinede kurulu değil."
161
- echo " Açmak için: /multi-agent:autopilot-on"
325
+ msg human-absent
326
+ msg human-turn-on "$(ma_ap_command autopilot-on)"
162
327
  exit 0
163
328
  fi
164
329
 
165
330
  NREPOS=$(ma_ap_cfg '.repos | length' 0)
166
331
  if [ "$ON" = true ]; then
167
- echo "autopilot: AÇIK · $NREPOS repo · $SLOTS slot (bu makine $CEILING kaldırır) · her ${INTERVAL}sn tarıyor"
332
+ msg human-on "$NREPOS" "$SLOTS" "$CEILING" "$INTERVAL"
168
333
  else
169
- echo "autopilot: KAPALI · $NREPOS repo seçili, zamanlama yok"
170
- echo " Açmak için: /multi-agent:autopilot-on"
334
+ msg human-off "$NREPOS"
335
+ msg human-turn-on "$(ma_ap_command autopilot-on)"
171
336
  fi
172
337
  [ -n "$NOTE" ] && echo " $NOTE"
173
338
 
174
339
  echo
175
340
  if [ "$NR" -gt 0 ]; then
176
- echo "Koşuyor ($NR):"
341
+ msg heading-running "$NR"
177
342
  printf '%s' "$RUNNING" | jq -r '.[] | " \(.id) · \(.phaseName // .phase // "?") · \(.stack // "")"'
178
343
  fi
179
344
  if [ "$NQ" -gt 0 ]; then
180
- echo "Sırada ($NQ):"
345
+ msg heading-queued "$NQ"
181
346
  printf '%s' "$QUEUED" | jq -r '.[0:8][] | " \(.id)"'
182
347
  fi
183
348
  if [ "$NA" -gt 0 ]; then
184
- echo "Cevap bekliyor ($NA) - açık soruları yorumladık, cevap gelince devam edecek:"
349
+ msg heading-awaiting "$NA"
185
350
  printf '%s' "$AWAITING" | jq -r '.[] | " \(.id)"'
186
351
  fi
187
352
  if [ "$NR" -eq 0 ] && [ "$NQ" -eq 0 ] && [ "$NA" -eq 0 ]; then
188
- echo "Sırada iş yok."
353
+ msg queue-empty
189
354
  # The single most common "why is nothing happening" answer, and it is not a
190
355
  # fault: no item carries the label yet. When intake recorded a more specific
191
356
  # reason, that one is truer and goes first.
192
357
  if [ -n "$EMPTY_REASON" ]; then
193
358
  echo " $EMPTY_REASON"
194
359
  fi
195
- echo " Bir madde almasi icin: GitHub issue'ya ya da sana atanmis Jira maddesine label ekle."
360
+ msg queue-empty-hint
196
361
  fi
197
362
 
198
363
  # The queue refusing to take work is not the same as having none, and reading
199
364
  # one as the other is the whole reason this line exists separately.
200
365
  if [ -n "$BLOCKED" ]; then
201
366
  echo
202
- echo "Yeni madde alınmıyor: $BLOCKED"
367
+ msg blocked "$BLOCKED"
203
368
  fi
204
369
  if [ "$CEILING_USD" != "0" ]; then
205
- echo "Son 24 saat: \$$SPEND / \$$CEILING_USD"
370
+ msg spend "$SPEND" "$CEILING_USD"
206
371
  fi
207
372
 
208
373
  if [ "$TODAY_N" -gt 0 ]; then
209
374
  echo
210
- echo "Son 24 saat ($TODAY_N PR):"
375
+ msg heading-reports "$TODAY_N"
211
376
  printf '%s' "$REPORTS" | jq -r '.[0:6][] | " \(.id) · \(.url)"'
212
377
  fi
213
378
  exit 0
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # build-lock.sh - the build queue: one xcodebuild or Gradle build at a time
4
+ # across every worktree on this machine.
5
+ #
6
+ # DerivedData, simulators and the Gradle daemon contend across parallel
7
+ # worktrees, so every ios/android build and test call sits between
8
+ # `acquire` and `release`. The lock is a directory, because `mkdir` is atomic.
9
+ # `owner` inside it names the task holding it on its first line and, when
10
+ # MA_BUILD_LOCK_PID is set, the process that holds it (`pid=<n>`). The owner
11
+ # file is written to a temporary name and renamed into place, so a reader sees
12
+ # either no owner or a complete one.
13
+ #
14
+ # A waiter takes the lock over only when its holder is gone: the recorded
15
+ # owner process no longer exists, the owner file is older than the stale limit,
16
+ # or there is no owner file and the lock directory is older than the grace
17
+ # window (the holder crashed between `mkdir` and writing its owner).
18
+ #
19
+ # Two separate calls, so the build itself stays a command the caller runs (and
20
+ # the unattended guard judges) on its own:
21
+ # bash build-lock.sh acquire <task-id>
22
+ # xcodebuild ... 2>&1 | tail -5
23
+ # bash build-lock.sh release <task-id>
24
+ # `release` removes the lock only when <task-id> matches its owner.
25
+ #
26
+ # Environment: MA_BUILD_LOCK (default /tmp/claude-xcodebuild.lock),
27
+ # MA_BUILD_LOCK_STALE_SEC (default 900), MA_BUILD_LOCK_POLL_SEC (default 5),
28
+ # MA_BUILD_LOCK_GRACE_SEC (default 5), MA_BUILD_LOCK_PID (owner process, optional).
29
+ #
30
+ # Exit: 0 acquired or released, 1 release refused (lock held by another task),
31
+ # 2 usage.
32
+ set -uo pipefail
33
+
34
+ BUILD_LOCK="${MA_BUILD_LOCK:-/tmp/claude-xcodebuild.lock}"
35
+ STALE_SEC="${MA_BUILD_LOCK_STALE_SEC:-900}"
36
+ POLL_SEC="${MA_BUILD_LOCK_POLL_SEC:-5}"
37
+ GRACE_SEC="${MA_BUILD_LOCK_GRACE_SEC:-5}"
38
+
39
+ # GNU first: `stat -f` is a valid GNU flag (file-system status) that succeeds
40
+ # with the wrong answer, so BSD-first would silently win on Linux.
41
+ mtime() {
42
+ stat -c "%Y" "$1" 2>/dev/null || stat -f "%m" "$1" 2>/dev/null || echo 0
43
+ }
44
+
45
+ owner_task() {
46
+ head -n 1 "$BUILD_LOCK/owner" 2>/dev/null
47
+ }
48
+
49
+ owner_pid() {
50
+ sed -n 's/^pid=\([0-9][0-9]*\)$/\1/p' "$BUILD_LOCK/owner" 2>/dev/null | head -n 1
51
+ }
52
+
53
+ # Prints the reason the current lock may be taken over, or nothing.
54
+ takeover_reason() {
55
+ local now pid age
56
+ now=$(date +%s)
57
+ if [ ! -f "$BUILD_LOCK/owner" ]; then
58
+ age=$((now - $(mtime "$BUILD_LOCK")))
59
+ [ -d "$BUILD_LOCK" ] && [ "$age" -gt "$GRACE_SEC" ] && echo "no owner after ${age}s"
60
+ return 0
61
+ fi
62
+ pid=$(owner_pid)
63
+ if [ -n "$pid" ] && ! kill -0 "$pid" 2>/dev/null; then
64
+ echo "owner process $pid is gone"
65
+ return 0
66
+ fi
67
+ age=$((now - $(mtime "$BUILD_LOCK/owner")))
68
+ [ "$age" -gt "$STALE_SEC" ] && echo "stale (${age}s)"
69
+ return 0
70
+ }
71
+
72
+ write_owner() {
73
+ local tmp="$BUILD_LOCK/.owner.$$"
74
+ {
75
+ printf '%s\n' "$1"
76
+ if [ -n "${MA_BUILD_LOCK_PID:-}" ]; then printf 'pid=%s\n' "$MA_BUILD_LOCK_PID"; fi
77
+ } >"$tmp" && mv -f "$tmp" "$BUILD_LOCK/owner"
78
+ }
79
+
80
+ case "${1:-}" in
81
+ acquire)
82
+ task="${2:-unknown}"
83
+ while ! mkdir "$BUILD_LOCK" 2>/dev/null; do
84
+ judged=$(cat "$BUILD_LOCK/owner" 2>/dev/null || echo "")
85
+ reason=$(takeover_reason)
86
+ if [ -n "$reason" ]; then
87
+ current=$(cat "$BUILD_LOCK/owner" 2>/dev/null || echo "")
88
+ if [ "$current" = "$judged" ]; then
89
+ echo "Taking over the build lock: $reason"
90
+ trash="$BUILD_LOCK.stale.$$"
91
+ mv "$BUILD_LOCK" "$trash" 2>/dev/null && rm -rf "$trash"
92
+ fi
93
+ continue
94
+ fi
95
+ owner=$(owner_task)
96
+ age=$(($(date +%s) - $(mtime "$BUILD_LOCK/owner")))
97
+ echo "Build queue: waiting (${owner:-unknown}, ${age}s)"
98
+ sleep "$POLL_SEC"
99
+ done
100
+ write_owner "$task"
101
+ ;;
102
+ release)
103
+ task="${2:-}"
104
+ if [ -z "$task" ]; then
105
+ echo "usage: build-lock.sh release <task-id>" >&2
106
+ exit 2
107
+ fi
108
+ [ -d "$BUILD_LOCK" ] || exit 0
109
+ owner=$(owner_task)
110
+ if [ "$owner" != "$task" ]; then
111
+ echo "build lock is held by ${owner:-an unknown owner}, not $task; left in place" >&2
112
+ exit 1
113
+ fi
114
+ rm -rf "$BUILD_LOCK"
115
+ ;;
116
+ *)
117
+ echo "usage: build-lock.sh acquire <task-id> | release <task-id>" >&2
118
+ exit 2
119
+ ;;
120
+ esac
@@ -23,6 +23,7 @@
23
23
 
24
24
  import { readFileSync } from "node:fs";
25
25
  import { runMain } from "../lib/fatal.mjs";
26
+ import { outputLanguage } from "../lib/user-facing.mjs";
26
27
 
27
28
  const HEADERS = {
28
29
  tr: ["Tür", "Kaynak", "URL / Yol", "Sürüm / Ref", "Rol", "Erişim", "Notlar"],
@@ -352,7 +353,9 @@ function main() {
352
353
  return;
353
354
  }
354
355
 
355
- const lang = argOf(argv, "--lang") ?? spec.language ?? "tr";
356
+ // The table is part of an analysis document a person reads, so the language
357
+ // is the run's own when the state records one and the preference otherwise.
358
+ const lang = argOf(argv, "--lang") ?? spec.language ?? outputLanguage();
356
359
  if (!HEADERS[lang]) {
357
360
  process.stderr.write(`ERROR: unknown language "${lang}"; expected tr or en\n`);
358
361
  process.exitCode = 2;
@@ -18,10 +18,17 @@
18
18
  * ai-analyst-toolkit (neither is copied into each stack plugin). Apple/
19
19
  * Xcode-only vendored skills that match no stack pattern belong to iOS only.
20
20
  *
21
+ * A vendored skill ships beside its upstream's NOTICE-*.md. Before anything is
22
+ * written, every NOTICE's `## Skills (N)` list is checked against the skills'
23
+ * `metadata.source` lines (_notices.mjs); a vendored skill no NOTICE lists stops
24
+ * the build, so an unattributed copy is never published.
25
+ *
21
26
  * Usage:
22
27
  * node build-stack-plugins.mjs [--plugins-repo <path>] [--pipeline <path>] [--dry-run]
28
+ * node build-stack-plugins.mjs --check-routing | --check-notices
23
29
  *
24
- * Exit code 0 always (report-only); prints a JSON-ish summary + per-plugin diff.
30
+ * Exit code 0 on a build, 1 when the attribution check fails or a --check-* mode
31
+ * finds a problem; prints a JSON-ish summary + per-plugin diff.
25
32
  */
26
33
  import {
27
34
  readdirSync,
@@ -58,11 +65,10 @@ const getArg = (k, d) => {
58
65
  }
59
66
  return v;
60
67
  };
61
- // HOME is unset on Windows (USERPROFILE is the variable); fall back so join()
62
- // gets a string instead of throwing a raw TypeError before any diagnostic.
63
- const HOME = process.env.HOME || process.env.USERPROFILE;
68
+ // Checked up front so join() never throws a raw TypeError before any diagnostic.
69
+ const HOME = process.env.HOME;
64
70
  if (!HOME) {
65
- console.error("ERROR: neither HOME nor USERPROFILE is set; cannot resolve default paths.");
71
+ console.error("ERROR: HOME is not set; cannot resolve default paths.");
66
72
  process.exit(2);
67
73
  }
68
74
  const PLUGINS_REPO = getArg("--plugins-repo", join(HOME, "multi-agent-plugins"));
@@ -85,6 +91,7 @@ import {
85
91
  STACK_ONLY,
86
92
  STACK_PATTERNS,
87
93
  } from "./_stack-routing.mjs";
94
+ import { NOTICE_FILE, noticeProblems, readNotices } from "./_notices.mjs";
88
95
 
89
96
  const isDir = (p) => {
90
97
  try {
@@ -209,7 +216,24 @@ if (args.includes("--check-routing")) {
209
216
  process.exit(0);
210
217
  }
211
218
 
219
+ // --- 2c. attribution audit ----------------------------------------------
220
+ const attribution = noticeProblems(EXTERNAL);
221
+ if (attribution.length) {
222
+ console.error(`check-notices: ${attribution.length} attribution problem(s); nothing was written`);
223
+ for (const a of attribution) console.error(` FAIL ${a}`);
224
+ console.error(
225
+ 'fix: list each vendored skill in its NOTICE-*.md "## Skills (N)" section, with a matching metadata.source',
226
+ );
227
+ process.exit(1);
228
+ }
229
+ if (args.includes("--check-notices")) {
230
+ console.log(`check-notices: clean (${readNotices(EXTERNAL).length} NOTICE files)`);
231
+ process.exit(0);
232
+ }
233
+
212
234
  // --- 3. sync each plugin's knowledge/ + regenerate plugin.json -----------
235
+ // A NOTICE covers exactly the skills its `## Skills (N)` section lists.
236
+ const noticeFiles = readNotices(EXTERNAL);
213
237
  const report = [];
214
238
  for (const [plugin, want] of Object.entries(desired)) {
215
239
  const pdir = join(PLUGINS_REPO, "plugins", plugin);
@@ -226,23 +250,12 @@ for (const [plugin, want] of Object.entries(desired)) {
226
250
  const setChanged = toAdd.length > 0 || toRemove.length > 0;
227
251
 
228
252
  // Compare EVERY wanted skill against the source, not just the newly added
229
- // ones, and replace (rm + copy) rather than overlay.
230
- //
231
- // This used to copy only on a set change, which quietly broke the single-source
232
- // claim: editing a skill in shared/external left the plugin serving the old text
233
- // forever, because the set had not changed. Found by editing a promoted skill and
234
- // seeing the plugin copy stay stale while the generator reported "all plugins up
235
- // to date".
236
- //
237
- // The rm-before-copy matters too: cpSync overlays and never deletes, so a file
238
- // REMOVED inside a still-wanted skill survived in every plugin copy forever -
239
- // and because the overlay kept the orphan on both sides of the fingerprint
240
- // comparison, the version was not bumped either.
241
- // Detect content drift in BOTH modes so --dry-run (the pre-flight for a
242
- // destructive run) reports the same "would change" verdict a real run acts on.
243
- // Previously contentChanged was computed only inside `if (!DRY)`, so dry-run
244
- // was blind to a file edit that did not change set membership - exactly the
245
- // case the fingerprint machinery was added to catch.
253
+ // ones: an edit inside a skill changes no set membership, and the plugin has to
254
+ // serve the edited text all the same. Replace (rm + copy) rather than overlay,
255
+ // because cpSync never deletes, so a file removed from a still-wanted skill
256
+ // would survive in the plugin copy and sit on both sides of the fingerprint.
257
+ // Drift is detected in BOTH modes so --dry-run, the pre-flight for a
258
+ // destructive run, reports the verdict a real run acts on.
246
259
  if (!DRY && !existsSync(kdir)) mkdirSync(kdir, { recursive: true });
247
260
  let contentChanged = false;
248
261
  for (const s of want) {
@@ -258,6 +271,30 @@ for (const [plugin, want] of Object.entries(desired)) {
258
271
  if (!DRY) {
259
272
  for (const s of toRemove) rmSync(join(kdir, s), { recursive: true, force: true });
260
273
  }
274
+
275
+ // A vendored skill ships with its upstream's notice. A plugin carries every
276
+ // NOTICE that lists one of its skills and none that lists none of them.
277
+ for (const notice of noticeFiles) {
278
+ const to = join(kdir, notice.file);
279
+ const needed = [...want].some((sk) => notice.skills.has(sk));
280
+ const present = existsSync(to);
281
+ if (needed) {
282
+ if (present && readFileSync(to).equals(notice.bytes)) continue;
283
+ contentChanged = true;
284
+ if (!DRY) writeFileSync(to, notice.bytes);
285
+ } else if (present) {
286
+ contentChanged = true;
287
+ if (!DRY) rmSync(to, { force: true });
288
+ }
289
+ }
290
+ // A notice whose source file was deleted is in no list above, so it is found
291
+ // by what the plugin holds rather than by what the source names.
292
+ const sourceNotices = new Set(noticeFiles.map((n) => n.file));
293
+ for (const file of existsSync(kdir) ? readdirSync(kdir) : []) {
294
+ if (!NOTICE_FILE.test(file) || sourceNotices.has(file)) continue;
295
+ contentChanged = true;
296
+ if (!DRY) rmSync(join(kdir, file), { force: true });
297
+ }
261
298
  const changed = setChanged || contentChanged;
262
299
 
263
300
  // regenerate plugin.json skills[]: keep non-knowledge entries, rebuild knowledge set
@@ -62,7 +62,7 @@ while [ "$#" -gt 0 ]; do
62
62
  esac
63
63
  done
64
64
 
65
- LOGS="$HOME/.claude/logs/multi-agent"
65
+ LOGS="${LOGS_ROOT:-$HOME/.claude/logs/multi-agent}"
66
66
  SCRIPTS="$HOME/.claude/scripts"
67
67
  [ -d "$SCRIPTS" ] || SCRIPTS="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)"
68
68