@mmerterden/multi-agent-pipeline 20.2.1 → 20.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (622) hide show
  1. package/CHANGELOG.md +919 -1
  2. package/README.md +104 -81
  3. package/README.tr.md +103 -62
  4. package/docs/FIGMA_PIPELINE.md +35 -35
  5. package/docs/adr/0006-skills-core-external-split.md +1 -1
  6. package/docs/adr/0007-multi-tool-adapter-framework.md +6 -0
  7. package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +7 -0
  8. package/docs/architecture.md +50 -14
  9. package/docs/best-practices.md +1 -1
  10. package/docs/ecosystem.md +56 -32
  11. package/docs/facts.json +10 -10
  12. package/docs/features.md +97 -5
  13. package/docs/recovery-guide.md +7 -14
  14. package/docs/server-readiness.md +31 -24
  15. package/index.js +1 -1
  16. package/install/_common.mjs +3 -5
  17. package/install/_platform-filter.mjs +23 -1
  18. package/install/_unattended-profile.mjs +321 -75
  19. package/install/claude.mjs +51 -10
  20. package/install/codex.mjs +2 -0
  21. package/install/copilot.mjs +2 -0
  22. package/install/index.mjs +30 -17
  23. package/install/templates/claude-hooks.json +16 -5
  24. package/install/templates/copilot-instructions.md +1 -1
  25. package/install/templates/multi-agent-autopilot-awake.plist.template +48 -0
  26. package/install/templates/multi-agent-autopilot.plist.template +12 -5
  27. package/install/unattended-profile-legacy.json +80 -0
  28. package/manifest.json +617 -483
  29. package/package.json +8 -3
  30. package/pipeline/agents/code-reviewer.md +10 -0
  31. package/pipeline/agents/plan-critic.md +98 -0
  32. package/pipeline/agents/security-auditor.md +10 -0
  33. package/pipeline/agents/task-clarifier.md +10 -0
  34. package/pipeline/commands/multi-agent/SKILL.md +2 -2
  35. package/pipeline/commands/multi-agent/analysis/SKILL.md +6 -2
  36. package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +12 -1
  37. package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +4 -0
  38. package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
  39. package/pipeline/commands/multi-agent/autopilot-off/SKILL.md +36 -6
  40. package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +77 -12
  41. package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +29 -8
  42. package/pipeline/commands/multi-agent/build-optimize/SKILL.md +4 -0
  43. package/pipeline/commands/multi-agent/channels/SKILL.md +9 -9
  44. package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +5 -1
  45. package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -0
  46. package/pipeline/commands/multi-agent/design-check/SKILL.md +16 -11
  47. package/pipeline/commands/multi-agent/diff-explain/SKILL.md +4 -0
  48. package/pipeline/commands/multi-agent/doctor/SKILL.md +4 -0
  49. package/pipeline/commands/multi-agent/feedback/SKILL.md +5 -1
  50. package/pipeline/commands/multi-agent/forget/SKILL.md +4 -0
  51. package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +4 -0
  52. package/pipeline/commands/multi-agent/graph/SKILL.md +4 -0
  53. package/pipeline/commands/multi-agent/help/SKILL.md +37 -39
  54. package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +4 -0
  55. package/pipeline/commands/multi-agent/issue/SKILL.md +7 -1
  56. package/pipeline/commands/multi-agent/jira/SKILL.md +7 -1
  57. package/pipeline/commands/multi-agent/kill/SKILL.md +9 -3
  58. package/pipeline/commands/multi-agent/language/SKILL.md +4 -0
  59. package/pipeline/commands/multi-agent/log/SKILL.md +4 -0
  60. package/pipeline/commands/multi-agent/manual-test/SKILL.md +5 -0
  61. package/pipeline/commands/multi-agent/model/SKILL.md +4 -0
  62. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -0
  63. package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +4 -0
  64. package/pipeline/commands/multi-agent/purge/SKILL.md +4 -0
  65. package/pipeline/commands/multi-agent/refactor/SKILL.md +5 -0
  66. package/pipeline/commands/multi-agent/research/SKILL.md +49 -0
  67. package/pipeline/commands/multi-agent/resume/SKILL.md +29 -6
  68. package/pipeline/commands/multi-agent/review/SKILL.md +28 -9
  69. package/pipeline/commands/multi-agent/review-analysis/SKILL.md +5 -1
  70. package/pipeline/commands/multi-agent/review-issue/SKILL.md +4 -0
  71. package/pipeline/commands/multi-agent/review-jira/SKILL.md +4 -0
  72. package/pipeline/commands/multi-agent/route-off/SKILL.md +4 -0
  73. package/pipeline/commands/multi-agent/route-on/SKILL.md +4 -0
  74. package/pipeline/commands/multi-agent/route-status/SKILL.md +4 -0
  75. package/pipeline/commands/multi-agent/routines/SKILL.md +4 -0
  76. package/pipeline/commands/multi-agent/save/SKILL.md +6 -2
  77. package/pipeline/commands/multi-agent/scaffold/SKILL.md +47 -0
  78. package/pipeline/commands/multi-agent/scan/SKILL.md +4 -0
  79. package/pipeline/commands/multi-agent/search/SKILL.md +12 -8
  80. package/pipeline/commands/multi-agent/security-review/SKILL.md +4 -0
  81. package/pipeline/commands/multi-agent/serve/SKILL.md +62 -0
  82. package/pipeline/commands/multi-agent/setup/SKILL.md +27 -36
  83. package/pipeline/commands/multi-agent/stack/SKILL.md +4 -0
  84. package/pipeline/commands/multi-agent/status/SKILL.md +10 -9
  85. package/pipeline/commands/multi-agent/steer/SKILL.md +5 -1
  86. package/pipeline/commands/multi-agent/store-ready/SKILL.md +4 -0
  87. package/pipeline/commands/multi-agent/sync/SKILL.md +13 -13
  88. package/pipeline/commands/multi-agent/test/SKILL.md +4 -0
  89. package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +4 -0
  90. package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +4 -0
  91. package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +4 -0
  92. package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +5 -1
  93. package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +4 -0
  94. package/pipeline/commands/multi-agent/uninstall/SKILL.md +5 -1
  95. package/pipeline/commands/multi-agent/update/SKILL.md +4 -0
  96. package/pipeline/contract/CHANGELOG.md +74 -0
  97. package/pipeline/contract/README.md +126 -0
  98. package/pipeline/contract/build.mjs +427 -0
  99. package/pipeline/contract/fixtures/answer-result.json +11 -0
  100. package/pipeline/contract/fixtures/error-invalid-request.json +8 -0
  101. package/pipeline/contract/fixtures/error-unauthorized.json +5 -0
  102. package/pipeline/contract/fixtures/error-unsigned.json +5 -0
  103. package/pipeline/contract/fixtures/issues-empty.json +18 -0
  104. package/pipeline/contract/fixtures/launch-plan.json +31 -0
  105. package/pipeline/contract/fixtures/runs-awaiting-question.json +70 -0
  106. package/pipeline/contract/fixtures/runs-empty.json +6 -0
  107. package/pipeline/contract/fixtures/runs-failed.json +84 -0
  108. package/pipeline/contract/fixtures/runs-old-schema.json +70 -0
  109. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +101 -0
  110. package/pipeline/contract/fixtures/runs-pr-opened.json +106 -0
  111. package/pipeline/contract/fixtures/runs-running.json +84 -0
  112. package/pipeline/contract/fixtures/worktrees-empty.json +4 -0
  113. package/pipeline/contract/frozen/toolbox.json +107 -0
  114. package/pipeline/contract/manifest.json +263 -0
  115. package/pipeline/contract/types/index.d.ts +343 -0
  116. package/pipeline/lib/_jira-auth.sh +6 -2
  117. package/pipeline/lib/account-resolver.sh +1 -1
  118. package/pipeline/lib/autopilot-state.sh +19 -0
  119. package/pipeline/lib/context-link-extractor.sh +12 -5
  120. package/pipeline/lib/credential-inventory.sh +12 -5
  121. package/pipeline/lib/credential-store.sh +116 -185
  122. package/pipeline/lib/fetch-confluence.sh +44 -3
  123. package/pipeline/lib/fetch-document.sh +3 -4
  124. package/pipeline/lib/fetch-fortify.sh +1 -1
  125. package/pipeline/lib/figma-mcp-refresh.sh +2 -2
  126. package/pipeline/lib/figma-token.sh +5 -1
  127. package/pipeline/lib/issue-fetcher.sh +233 -16
  128. package/pipeline/lib/json-file-lock.mjs +172 -0
  129. package/pipeline/lib/model-dispatch.sh +21 -12
  130. package/pipeline/lib/model-rung.sh +6 -1
  131. package/pipeline/lib/multi-repo-pipeline.sh +1 -1
  132. package/pipeline/lib/outbound-gate.mjs +46 -16
  133. package/pipeline/lib/parse-complaints.sh +14 -7
  134. package/pipeline/lib/plan-todos.sh +3 -3
  135. package/pipeline/lib/post-pr-review.sh +9 -9
  136. package/pipeline/lib/pr-request-location.mjs +85 -0
  137. package/pipeline/lib/regular-file.mjs +153 -0
  138. package/pipeline/lib/repo-hygiene.sh +17 -0
  139. package/pipeline/lib/route-state.sh +5 -1
  140. package/pipeline/lib/run-paths.sh +3 -2
  141. package/pipeline/lib/stack-detect.sh +19 -1
  142. package/pipeline/lib/unattended-profile-check.mjs +178 -0
  143. package/pipeline/lib/unattended-settings-location.mjs +28 -0
  144. package/pipeline/lib/unattended.mjs +76 -0
  145. package/pipeline/lib/unattended.sh +32 -0
  146. package/pipeline/lib/untrusted.mjs +76 -0
  147. package/pipeline/lib/usage-endpoint.mjs +33 -0
  148. package/pipeline/lib/user-facing.mjs +82 -0
  149. package/pipeline/lib/user-facing.sh +58 -0
  150. package/pipeline/multi-agent-refs/_dev-context.md +1 -1
  151. package/pipeline/multi-agent-refs/analysis/evidence.md +4 -0
  152. package/pipeline/multi-agent-refs/analysis/locked.md +2 -2
  153. package/pipeline/multi-agent-refs/analysis/render.md +4 -3
  154. package/pipeline/multi-agent-refs/analysis/resolve.md +3 -1
  155. package/pipeline/multi-agent-refs/analysis/synthesis.md +4 -5
  156. package/pipeline/multi-agent-refs/analysis-template.md +10 -17
  157. package/pipeline/multi-agent-refs/channels/jira.md +1 -1
  158. package/pipeline/multi-agent-refs/component-dispatch.md +3 -3
  159. package/pipeline/multi-agent-refs/conventions-defaults.md +32 -32
  160. package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -17
  161. package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +37 -9
  162. package/pipeline/multi-agent-refs/features/autopilot-operations.md +277 -0
  163. package/pipeline/multi-agent-refs/features/constitution.md +196 -0
  164. package/pipeline/multi-agent-refs/features/doctor.md +6 -3
  165. package/pipeline/multi-agent-refs/features/external-context-injection.md +6 -1
  166. package/pipeline/multi-agent-refs/features/jira-context.md +1 -1
  167. package/pipeline/multi-agent-refs/features/maturity-followup.md +43 -23
  168. package/pipeline/multi-agent-refs/features/model-fallback.md +9 -0
  169. package/pipeline/multi-agent-refs/features/phone-api.md +306 -0
  170. package/pipeline/multi-agent-refs/features/plan-critic.md +159 -0
  171. package/pipeline/multi-agent-refs/features/research.md +150 -0
  172. package/pipeline/multi-agent-refs/features/review-decision.md +185 -0
  173. package/pipeline/multi-agent-refs/features/scaffold.md +160 -0
  174. package/pipeline/multi-agent-refs/features/security-audit.md +6 -2
  175. package/pipeline/multi-agent-refs/features/skill-conformance.md +4 -1
  176. package/pipeline/multi-agent-refs/features/stack-adapters.md +116 -0
  177. package/pipeline/multi-agent-refs/features/unattended-gates.md +316 -0
  178. package/pipeline/multi-agent-refs/features/unattended-security.md +731 -0
  179. package/pipeline/multi-agent-refs/features/url-enrichment.md +2 -2
  180. package/pipeline/multi-agent-refs/features/usage-reporting.md +127 -35
  181. package/pipeline/multi-agent-refs/features/verify-by-test.md +1 -1
  182. package/pipeline/multi-agent-refs/features/visual-evidence.md +7 -7
  183. package/pipeline/multi-agent-refs/keychain.md +6 -11
  184. package/pipeline/multi-agent-refs/payload-contracts.md +2 -2
  185. package/pipeline/multi-agent-refs/phases/log-format.md +2 -3
  186. package/pipeline/multi-agent-refs/phases/modes.md +10 -12
  187. package/pipeline/multi-agent-refs/phases/operations.md +11 -5
  188. package/pipeline/multi-agent-refs/phases/phase-0-init.md +73 -81
  189. package/pipeline/multi-agent-refs/phases/phase-1-plan.md +22 -22
  190. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +42 -66
  191. package/pipeline/multi-agent-refs/phases/phase-3-review.md +45 -79
  192. package/pipeline/multi-agent-refs/phases/phase-4-commit.md +28 -38
  193. package/pipeline/multi-agent-refs/phases/phase-5-report.md +27 -25
  194. package/pipeline/multi-agent-refs/phases.md +1 -1
  195. package/pipeline/multi-agent-refs/picker-contract.md +1 -1
  196. package/pipeline/multi-agent-refs/progress-contract.md +13 -16
  197. package/pipeline/multi-agent-refs/readiness-review.md +1 -1
  198. package/pipeline/multi-agent-refs/research/engine.md +91 -0
  199. package/pipeline/multi-agent-refs/rules.md +6 -4
  200. package/pipeline/multi-agent-refs/setup/repo-discovery.md +2 -2
  201. package/pipeline/multi-agent-refs/tracker-contract.md +2 -2
  202. package/pipeline/multi-agent-refs/unattended-contract.md +68 -16
  203. package/pipeline/rules/figma-pipeline.md +12 -12
  204. package/pipeline/schemas/agent-state.schema.json +480 -18
  205. package/pipeline/schemas/analysis-spec.schema.json +4 -4
  206. package/pipeline/schemas/answer-request.schema.json +24 -0
  207. package/pipeline/schemas/answer-result.schema.json +28 -0
  208. package/pipeline/schemas/autopilot-config.schema.json +111 -13
  209. package/pipeline/schemas/command-parameters.schema.json +99 -0
  210. package/pipeline/schemas/constitution.schema.json +56 -0
  211. package/pipeline/schemas/contract-error.schema.json +52 -0
  212. package/pipeline/schemas/design-check-config.schema.json +5 -1
  213. package/pipeline/schemas/issues.schema.json +61 -0
  214. package/pipeline/schemas/launch-plan.schema.json +46 -0
  215. package/pipeline/schemas/launch-request.schema.json +45 -0
  216. package/pipeline/schemas/launch.json +61 -0
  217. package/pipeline/schemas/launch.schema.json +84 -0
  218. package/pipeline/schemas/phases.json +2 -2
  219. package/pipeline/schemas/phases.schema.json +68 -0
  220. package/pipeline/schemas/phone-devices.schema.json +61 -0
  221. package/pipeline/schemas/phone-signed-request.schema.json +67 -0
  222. package/pipeline/schemas/plan-critique.schema.json +99 -0
  223. package/pipeline/schemas/plan-todos.schema.json +7 -7
  224. package/pipeline/schemas/planning-output.schema.json +5 -0
  225. package/pipeline/schemas/pr-request.schema.json +46 -0
  226. package/pipeline/schemas/prefs.schema.json +79 -8
  227. package/pipeline/schemas/research-output.schema.json +118 -0
  228. package/pipeline/schemas/review-file-exclusions.schema.json +25 -0
  229. package/pipeline/schemas/reviewer-output.schema.json +40 -4
  230. package/pipeline/schemas/run-questions.json +392 -0
  231. package/pipeline/schemas/run-questions.schema.json +118 -0
  232. package/pipeline/schemas/runs-index.schema.json +189 -0
  233. package/pipeline/schemas/scaffold-manifest.schema.json +43 -0
  234. package/pipeline/schemas/secret-patterns.schema.json +28 -0
  235. package/pipeline/schemas/stack-adapters.json +527 -0
  236. package/pipeline/schemas/stack-adapters.schema.json +184 -0
  237. package/pipeline/schemas/token-budget.json +1 -1
  238. package/pipeline/schemas/token-budget.schema.json +26 -0
  239. package/pipeline/schemas/triage-output.schema.json +64 -3
  240. package/pipeline/schemas/unattended-policy.json +139 -0
  241. package/pipeline/schemas/unattended-policy.schema.json +73 -0
  242. package/pipeline/schemas/unattended-profile.json +248 -0
  243. package/pipeline/schemas/unattended-profile.schema.json +198 -0
  244. package/pipeline/schemas/worktrees.schema.json +51 -0
  245. package/pipeline/scripts/README.md +1 -0
  246. package/pipeline/scripts/_autopilot-config.mjs +130 -0
  247. package/pipeline/scripts/_autopilot-ops.mjs +567 -0
  248. package/pipeline/scripts/_autopilot-outcomes.mjs +174 -0
  249. package/pipeline/scripts/_command-contract.mjs +384 -0
  250. package/pipeline/scripts/_cost.mjs +40 -0
  251. package/pipeline/scripts/_notices.mjs +160 -0
  252. package/pipeline/scripts/_phone-auth.mjs +485 -0
  253. package/pipeline/scripts/_pre-existing.mjs +294 -0
  254. package/pipeline/scripts/_redact.mjs +77 -0
  255. package/pipeline/scripts/_run-paths.mjs +4 -2
  256. package/pipeline/scripts/_stack-adapter.mjs +678 -0
  257. package/pipeline/scripts/_stack-routing.mjs +1 -1
  258. package/pipeline/scripts/agent-guard.py +348 -37
  259. package/pipeline/scripts/agent-guard.sh +41 -13
  260. package/pipeline/scripts/analysis-story-tree.mjs +79 -3
  261. package/pipeline/scripts/answer-question.mjs +181 -0
  262. package/pipeline/scripts/audit-log-rotate.sh +1 -4
  263. package/pipeline/scripts/audit-log.sh +4 -4
  264. package/pipeline/scripts/autopilot-arming.mjs +389 -21
  265. package/pipeline/scripts/autopilot-awake.mjs +255 -0
  266. package/pipeline/scripts/autopilot-intake.mjs +137 -36
  267. package/pipeline/scripts/autopilot-menubar.swift +156 -44
  268. package/pipeline/scripts/autopilot-publish.mjs +1625 -0
  269. package/pipeline/scripts/autopilot-runner.mjs +1678 -222
  270. package/pipeline/scripts/autopilot-status.sh +198 -33
  271. package/pipeline/scripts/build-lock.sh +120 -0
  272. package/pipeline/scripts/build-references.mjs +4 -1
  273. package/pipeline/scripts/build-stack-plugins.mjs +59 -22
  274. package/pipeline/scripts/capture-flush.sh +1 -1
  275. package/pipeline/scripts/capture-resume.sh +13 -9
  276. package/pipeline/scripts/check-derived-drift.mjs +52 -11
  277. package/pipeline/scripts/commands.mjs +88 -0
  278. package/pipeline/scripts/constitution.mjs +362 -0
  279. package/pipeline/scripts/contract-server.mjs +776 -0
  280. package/pipeline/scripts/cost-analyze.mjs +89 -39
  281. package/pipeline/scripts/diff-explain.mjs +12 -1
  282. package/pipeline/scripts/doctor.mjs +77 -28
  283. package/pipeline/scripts/evidence-gate.mjs +192 -12
  284. package/pipeline/scripts/feedback-send.mjs +4 -2
  285. package/pipeline/scripts/gate-ledger.mjs +449 -0
  286. package/pipeline/scripts/gc-abandoned.sh +132 -13
  287. package/pipeline/scripts/gen-facts.mjs +31 -15
  288. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  289. package/pipeline/scripts/github-ssh-setup.sh +140 -29
  290. package/pipeline/scripts/graph-mermaid.mjs +4 -1
  291. package/pipeline/scripts/issues.mjs +236 -0
  292. package/pipeline/scripts/jira-attach.sh +6 -2
  293. package/pipeline/scripts/jira-search.sh +4 -3
  294. package/pipeline/scripts/keychain-save.sh +125 -24
  295. package/pipeline/scripts/keychain.py +63 -93
  296. package/pipeline/scripts/launch-request.mjs +747 -0
  297. package/pipeline/scripts/localize-commands.mjs +4 -10
  298. package/pipeline/scripts/log-metric.sh +6 -5
  299. package/pipeline/scripts/maturity-followup.mjs +13 -4
  300. package/pipeline/scripts/memory-save.sh +25 -0
  301. package/pipeline/scripts/migrate-prefs.mjs +4 -3
  302. package/pipeline/scripts/open-questions-gate.mjs +276 -0
  303. package/pipeline/scripts/phase-tracker.sh +41 -27
  304. package/pipeline/scripts/phase0-exit-gate.mjs +22 -4
  305. package/pipeline/scripts/phone-devices.mjs +224 -0
  306. package/pipeline/scripts/plan-coverage-gate.mjs +200 -66
  307. package/pipeline/scripts/plan-critique-gate.mjs +591 -0
  308. package/pipeline/scripts/pr-request.mjs +188 -0
  309. package/pipeline/scripts/pre-commit-check.sh +115 -4
  310. package/pipeline/scripts/probe-evidence-capability.sh +44 -5
  311. package/pipeline/scripts/record-phase.mjs +71 -0
  312. package/pipeline/scripts/render-agent-log-cost.sh +17 -2
  313. package/pipeline/scripts/render-cost-summary.sh +1 -1
  314. package/pipeline/scripts/render-work-summary.sh +1 -1
  315. package/pipeline/scripts/require-supported-version.sh +4 -1
  316. package/pipeline/scripts/research-gate.mjs +704 -0
  317. package/pipeline/scripts/review-decision-gate.mjs +403 -0
  318. package/pipeline/scripts/routine-registry.mjs +5 -2
  319. package/pipeline/scripts/runs-index.mjs +135 -27
  320. package/pipeline/scripts/scaffold-gate.mjs +393 -0
  321. package/pipeline/scripts/skill-conformance.mjs +25 -8
  322. package/pipeline/scripts/skill-siblings.mjs +2 -1
  323. package/pipeline/scripts/smoke-cross-cli-behavior.sh +32 -6
  324. package/pipeline/scripts/smoke-schema-validation.sh +6 -2
  325. package/pipeline/scripts/spec-consistency-gate.mjs +469 -0
  326. package/pipeline/scripts/symbol-existence-gate.mjs +450 -0
  327. package/pipeline/scripts/test-gap-scan.mjs +40 -2
  328. package/pipeline/scripts/test-integrity-gate.mjs +20 -4
  329. package/pipeline/scripts/test-strength.mjs +484 -0
  330. package/pipeline/scripts/test-summary.mjs +651 -0
  331. package/pipeline/scripts/triage-memory.mjs +49 -9
  332. package/pipeline/scripts/unattended_policy.py +2786 -0
  333. package/pipeline/scripts/uninstall.mjs +10 -10
  334. package/pipeline/scripts/update-issue-progress.sh +1 -1
  335. package/pipeline/scripts/usage-identity.mjs +288 -0
  336. package/pipeline/scripts/usage-register.mjs +187 -67
  337. package/pipeline/scripts/usage-report.mjs +232 -67
  338. package/pipeline/scripts/validate-complaint-doc.mjs +28 -10
  339. package/pipeline/scripts/validate-planning.mjs +6 -0
  340. package/pipeline/scripts/verify-citations.mjs +151 -38
  341. package/pipeline/scripts/verify.mjs +58 -18
  342. package/pipeline/scripts/worktree-prepare.sh +126 -0
  343. package/pipeline/scripts/worktrees.mjs +124 -0
  344. package/pipeline/scripts/write-state.mjs +48 -17
  345. package/pipeline/skills/.skill-manifest.json +222 -226
  346. package/pipeline/skills/.skills-index.json +77 -88
  347. package/pipeline/skills/shared/README.md +44 -45
  348. package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +3 -2
  349. package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +3 -2
  350. package/pipeline/skills/shared/core/multi-agent/SKILL.md +10 -9
  351. package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +6 -5
  352. package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +11 -3
  353. package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +2 -1
  354. package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -3
  355. package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +32 -6
  356. package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +66 -8
  357. package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +27 -9
  358. package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +2 -1
  359. package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -4
  360. package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +3 -2
  361. package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +2 -1
  362. package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +7 -5
  363. package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +2 -1
  364. package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +3 -2
  365. package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +2 -1
  366. package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +2 -1
  367. package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +2 -1
  368. package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +2 -1
  369. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -1
  370. package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -1
  371. package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +3 -2
  372. package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -1
  373. package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +7 -4
  374. package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -1
  375. package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +2 -1
  376. package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +2 -1
  377. package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -1
  378. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +2 -1
  379. package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +2 -1
  380. package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +2 -1
  381. package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +2 -1
  382. package/pipeline/skills/shared/core/multi-agent-research/SKILL.md +35 -0
  383. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +7 -3
  384. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +7 -5
  385. package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +2 -1
  386. package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +3 -2
  387. package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +2 -1
  388. package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +2 -1
  389. package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +2 -1
  390. package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +2 -1
  391. package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +2 -1
  392. package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +3 -2
  393. package/pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md +30 -0
  394. package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -1
  395. package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +4 -3
  396. package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +2 -1
  397. package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +60 -0
  398. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +8 -8
  399. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -1
  400. package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +7 -8
  401. package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -1
  402. package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +2 -1
  403. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +10 -10
  404. package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +2 -1
  405. package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +2 -1
  406. package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +2 -1
  407. package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +2 -1
  408. package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +2 -1
  409. package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -1
  410. package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +3 -2
  411. package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +2 -1
  412. package/pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md +46 -0
  413. package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +9 -3
  414. package/pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md +54 -0
  415. package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +9 -11
  416. package/pipeline/skills/shared/external/NOTICE-vibeship-spawner-skills.md +203 -0
  417. package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +10 -3
  418. package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +131 -25
  419. package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -3
  420. package/pipeline/skills/shared/external/alarmkit/SKILL.md +2 -1
  421. package/pipeline/skills/shared/external/android-architecture/SKILL.md +85 -76
  422. package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +51 -3
  423. package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +9 -0
  424. package/pipeline/skills/shared/external/android-datastore/SKILL.md +4 -3
  425. package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +4 -3
  426. package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +106 -181
  427. package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +147 -0
  428. package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +45 -4
  429. package/pipeline/skills/shared/external/android-performance/SKILL.md +27 -2
  430. package/pipeline/skills/shared/external/android-performance/references/patterns.md +37 -37
  431. package/pipeline/skills/shared/external/api-patterns/SKILL.md +111 -67
  432. package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +128 -0
  433. package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +136 -186
  434. package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +140 -0
  435. package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +207 -0
  436. package/pipeline/skills/shared/external/api-security-best-practices/references/operations.md +66 -0
  437. package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +175 -0
  438. package/pipeline/skills/shared/external/app-clips/SKILL.md +2 -0
  439. package/pipeline/skills/shared/external/app-intents/SKILL.md +2 -0
  440. package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +4 -3
  441. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +2 -0
  442. package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -0
  443. package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +2 -0
  444. package/pipeline/skills/shared/external/architecture/SKILL.md +106 -39
  445. package/pipeline/skills/shared/external/architecture/references/adr-and-review.md +76 -0
  446. package/pipeline/skills/shared/external/authentication/SKILL.md +2 -0
  447. package/pipeline/skills/shared/external/avkit/SKILL.md +2 -0
  448. package/pipeline/skills/shared/external/background-processing/SKILL.md +2 -1
  449. package/pipeline/skills/shared/external/backlog/SKILL.md +3 -2
  450. package/pipeline/skills/shared/external/callkit-voip/SKILL.md +2 -0
  451. package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +1 -1
  452. package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +3 -2
  453. package/pipeline/skills/shared/external/clean-code/SKILL.md +192 -90
  454. package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +2 -1
  455. package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +1 -1
  456. package/pipeline/skills/shared/external/compose-components/SKILL.md +4 -4
  457. package/pipeline/skills/shared/external/compose-navigation/SKILL.md +22 -22
  458. package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +10 -10
  459. package/pipeline/skills/shared/external/compose-testing/SKILL.md +13 -6
  460. package/pipeline/skills/shared/external/compose-testing/references/patterns.md +59 -59
  461. package/pipeline/skills/shared/external/contacts-framework/SKILL.md +2 -0
  462. package/pipeline/skills/shared/external/context-compression/SKILL.md +118 -250
  463. package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +2 -0
  464. package/pipeline/skills/shared/external/core-data/SKILL.md +2 -0
  465. package/pipeline/skills/shared/external/core-motion/SKILL.md +2 -0
  466. package/pipeline/skills/shared/external/core-nfc/SKILL.md +2 -0
  467. package/pipeline/skills/shared/external/coreml/SKILL.md +2 -1
  468. package/pipeline/skills/shared/external/council/SKILL.md +2 -1
  469. package/pipeline/skills/shared/external/cryptokit/SKILL.md +2 -0
  470. package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
  471. package/pipeline/skills/shared/external/database-patterns/SKILL.md +3 -2
  472. package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +2 -0
  473. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +130 -20
  474. package/pipeline/skills/shared/external/debugging-strategies/references/hard-cases.md +54 -0
  475. package/pipeline/skills/shared/external/device-integrity/SKILL.md +2 -0
  476. package/pipeline/skills/shared/external/docker-expert/SKILL.md +137 -381
  477. package/pipeline/skills/shared/external/docker-expert/references/patterns.md +98 -0
  478. package/pipeline/skills/shared/external/energykit/SKILL.md +2 -1
  479. package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +3 -1
  480. package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +2 -2
  481. package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +116 -185
  482. package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +235 -0
  483. package/pipeline/skills/shared/external/fastapi-pro/references/testing-and-deployment.md +69 -0
  484. package/pipeline/skills/shared/external/firebase/SKILL.md +4 -3
  485. package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +151 -293
  486. package/pipeline/skills/shared/external/github-actions-templates/references/patterns.md +96 -0
  487. package/pipeline/skills/shared/external/healthkit/SKILL.md +2 -0
  488. package/pipeline/skills/shared/external/hig-components-content/SKILL.md +69 -72
  489. package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +111 -0
  490. package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +77 -86
  491. package/pipeline/skills/shared/external/hig-components-layout/references/containers.md +98 -0
  492. package/pipeline/skills/shared/external/hig-components-status/SKILL.md +150 -78
  493. package/pipeline/skills/shared/external/hig-components-system/SKILL.md +76 -97
  494. package/pipeline/skills/shared/external/hig-components-system/references/surfaces.md +98 -0
  495. package/pipeline/skills/shared/external/hig-foundations/SKILL.md +48 -76
  496. package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +132 -0
  497. package/pipeline/skills/shared/external/hig-inputs/SKILL.md +147 -106
  498. package/pipeline/skills/shared/external/hig-patterns/SKILL.md +61 -77
  499. package/pipeline/skills/shared/external/hig-patterns/references/patterns.md +92 -0
  500. package/pipeline/skills/shared/external/hig-platforms/SKILL.md +147 -77
  501. package/pipeline/skills/shared/external/hig-technologies/SKILL.md +61 -121
  502. package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +108 -0
  503. package/pipeline/skills/shared/external/homekit-matter/SKILL.md +2 -0
  504. package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +1 -1
  505. package/pipeline/skills/shared/external/html-semantic/SKILL.md +3 -2
  506. package/pipeline/skills/shared/external/humanizer/SKILL.md +2 -1
  507. package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +2 -0
  508. package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +2 -1
  509. package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +14 -2
  510. package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
  511. package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +4 -3
  512. package/pipeline/skills/shared/external/ios-localization/SKILL.md +8 -6
  513. package/pipeline/skills/shared/external/ios-localization/evals/evals.json +2 -2
  514. package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +11 -11
  515. package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +2 -1
  516. package/pipeline/skills/shared/external/ios-networking/SKILL.md +2 -0
  517. package/pipeline/skills/shared/external/ios-simulator/SKILL.md +2 -0
  518. package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +102 -193
  519. package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +103 -0
  520. package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -2
  521. package/pipeline/skills/shared/external/live-activities/evals/evals.json +2 -2
  522. package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +7 -9
  523. package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +3 -3
  524. package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +2 -2
  525. package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +4 -3
  526. package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +5 -3
  527. package/pipeline/skills/shared/external/mapkit-location/SKILL.md +2 -0
  528. package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +1 -1
  529. package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +2 -0
  530. package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +1 -1
  531. package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +149 -46
  532. package/pipeline/skills/shared/external/monorepo-architect/references/patterns.md +70 -0
  533. package/pipeline/skills/shared/external/musickit-audio/SKILL.md +2 -0
  534. package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +1 -1
  535. package/pipeline/skills/shared/external/natural-language/SKILL.md +2 -0
  536. package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +3 -2
  537. package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +91 -21
  538. package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +247 -0
  539. package/pipeline/skills/shared/external/nodejs-backend-patterns/references/testing-and-frameworks.md +57 -0
  540. package/pipeline/skills/shared/external/observability-engineer/SKILL.md +155 -232
  541. package/pipeline/skills/shared/external/observability-engineer/references/patterns.md +75 -0
  542. package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +2 -0
  543. package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +2 -2
  544. package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +18 -18
  545. package/pipeline/skills/shared/external/pdfkit/SKILL.md +2 -1
  546. package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +2 -0
  547. package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +1 -1
  548. package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -0
  549. package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +2 -1
  550. package/pipeline/skills/shared/external/push-notifications/SKILL.md +2 -0
  551. package/pipeline/skills/shared/external/python-patterns/SKILL.md +3 -2
  552. package/pipeline/skills/shared/external/react-best-practices/SKILL.md +3 -2
  553. package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +2 -2
  554. package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +1 -1
  555. package/pipeline/skills/shared/external/rest-api-design/SKILL.md +3 -2
  556. package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +7 -7
  557. package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +69 -69
  558. package/pipeline/skills/shared/external/room-database/references/patterns.md +126 -126
  559. package/pipeline/skills/shared/external/search-first/SKILL.md +2 -1
  560. package/pipeline/skills/shared/external/security-review/SKILL.md +4 -3
  561. package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +2 -2
  562. package/pipeline/skills/shared/external/signal-community/SKILL.md +1 -1
  563. package/pipeline/skills/shared/external/skill-creator/SKILL.md +2 -1
  564. package/pipeline/skills/shared/external/speech-recognition/SKILL.md +2 -1
  565. package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +2 -0
  566. package/pipeline/skills/shared/external/storekit/SKILL.md +2 -0
  567. package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +2 -0
  568. package/pipeline/skills/shared/external/swift-architecture/SKILL.md +2 -1
  569. package/pipeline/skills/shared/external/swift-charts/SKILL.md +2 -1
  570. package/pipeline/skills/shared/external/swift-codable/SKILL.md +2 -0
  571. package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +3 -1
  572. package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +5 -4
  573. package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -1
  574. package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +2 -0
  575. package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -1
  576. package/pipeline/skills/shared/external/swift-security/SKILL.md +2 -1
  577. package/pipeline/skills/shared/external/swift-testing/SKILL.md +2 -0
  578. package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -1
  579. package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +10 -0
  580. package/pipeline/skills/shared/external/swiftdata/SKILL.md +2 -0
  581. package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -1
  582. package/pipeline/skills/shared/external/swiftlint/SKILL.md +2 -0
  583. package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +2 -0
  584. package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +3 -1
  585. package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +2 -0
  586. package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +2 -0
  587. package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +2 -0
  588. package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +2 -0
  589. package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +3 -1
  590. package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +3 -1
  591. package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +5 -4
  592. package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -1
  593. package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +5 -4
  594. package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +2 -0
  595. package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +4 -3
  596. package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +2 -0
  597. package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
  598. package/pipeline/skills/shared/external/testing-backend/SKILL.md +3 -2
  599. package/pipeline/skills/shared/external/tipkit/SKILL.md +2 -0
  600. package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +3 -2
  601. package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -0
  602. package/pipeline/skills/shared/external/vue-composition/SKILL.md +3 -2
  603. package/pipeline/skills/shared/external/weatherkit/SKILL.md +2 -0
  604. package/pipeline/skills/shared/external/web-accessibility/SKILL.md +3 -2
  605. package/pipeline/skills/shared/external/web-performance/SKILL.md +3 -2
  606. package/pipeline/skills/shared/external/web-testing/SKILL.md +3 -2
  607. package/pipeline/skills/shared/external/widgetkit/SKILL.md +2 -0
  608. package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +1 -1
  609. package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +2 -0
  610. package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +2 -0
  611. package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +2 -0
  612. package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +2 -0
  613. package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +2 -0
  614. package/pipeline/skills/skills-index.md +40 -41
  615. package/docs/token-budget-history.md +0 -24
  616. package/pipeline/skills/shared/external/agentflow/SKILL.md +0 -199
  617. package/pipeline/skills/shared/external/android-ui-verification/SKILL.md +0 -66
  618. package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +0 -299
  619. package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +0 -255
  620. package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +0 -167
  621. package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +0 -116
  622. package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -216
@@ -1,33 +1,41 @@
1
1
  /**
2
2
  * usage-report.mjs - optional, opt-in per-run operational reporting.
3
3
  *
4
- * Off by default; a no-op unless prefs.global.usageLog.enabled is true and a
5
- * token resolves. Emits one compact run record keyed by run id (`taskId`),
6
- * upserted per phase, fire-and-forget - never throws, never delays a run.
4
+ * Off by default; a no-op unless prefs.global.usageLog.enabled is true, a
5
+ * token resolves, and a logged-in GitHub account can read the pipeline
6
+ * repository (usage-identity.mjs). Emits one compact run record keyed by run
7
+ * id (`taskId`), upserted at every phase transition and at completion, halt
8
+ * and park, fire-and-forget - never throws, never delays a run.
7
9
  * Only coarse run metadata is included; never prompts, code, diffs, token
8
- * values, or absolute paths.
10
+ * values, or absolute paths. The task title and the PR URL are sent only when
11
+ * usageLog.includeTitle / usageLog.includePrUrl are true.
9
12
  *
10
13
  * Enable + configure via prefs.global.usageLog:
11
14
  * { "enabled": true,
12
15
  * "endpoint": "https://mmerterden.com/api/usage/ingest",
13
16
  * "token": "<shared ingest token>" } // token may instead come from
14
17
  * // env MULTI_AGENT_USAGE_TOKEN
15
- * Nothing is sent when enabled is not true or no token resolves.
18
+ * Nothing is sent when enabled is not true, no token resolves, or no account
19
+ * has access (one line on stderr says which).
16
20
  *
17
21
  * Usage:
18
- * node usage-report.mjs --state /path/to/agent-state.json
19
- * node usage-report.mjs --task-id PROJ-123 # resolves the state path
22
+ * node usage-report.mjs --state /path/to/agent-state.json [--event <kind>]
23
+ * node usage-report.mjs --task-id PROJ-123 [--phase N] [--event <kind>]
24
+ *
25
+ * --event phase | completed | halted | parked (default: derived from state)
20
26
  *
21
27
  * @module pipeline/scripts/usage-report
22
28
  */
23
29
 
24
30
  import { readFileSync, existsSync, readdirSync, appendFileSync } from "fs";
31
+ import { canonicalEndpoint } from "../lib/usage-endpoint.mjs";
25
32
  import { homedir, platform } from "os";
26
33
  import { dirname, join } from "path";
27
34
  import { fileURLToPath, pathToFileURL } from "url";
28
35
  import { execFileSync } from "child_process";
29
36
  import { createHash } from "crypto";
30
37
  import { costUsd } from "./_cost.mjs";
38
+ import { defaultPrefsPath, resolveReportingLogin } from "./usage-identity.mjs";
31
39
 
32
40
  const __dirname = dirname(fileURLToPath(import.meta.url));
33
41
  const ENDPOINT_DEFAULT = "https://mmerterden.com/api/usage/ingest";
@@ -47,13 +55,21 @@ function hostFile(...parts) {
47
55
  }
48
56
 
49
57
  function parseArgs(argv) {
50
- const out = { state: null, taskId: null, phase: null, status: null, dryRun: false };
58
+ const out = {
59
+ state: null,
60
+ taskId: null,
61
+ phase: null,
62
+ status: null,
63
+ event: null,
64
+ dryRun: false,
65
+ };
51
66
  for (let i = 0; i < argv.length; i += 1) {
52
67
  const a = argv[i];
53
68
  if (a === "--state") out.state = argv[++i];
54
69
  else if (a === "--task-id") out.taskId = argv[++i];
55
70
  else if (a === "--phase") out.phase = argv[++i];
56
71
  else if (a === "--status") out.status = argv[++i];
72
+ else if (a === "--event") out.event = argv[++i];
57
73
  else if (a === "--dry-run") out.dryRun = true;
58
74
  }
59
75
  return out;
@@ -68,9 +84,7 @@ function readJson(path) {
68
84
  }
69
85
 
70
86
  function resolveGlobalPrefs() {
71
- const path =
72
- process.env.MULTI_AGENT_PREFS || join(homedir(), ".claude", "multi-agent-preferences.json");
73
- return readJson(path)?.global ?? {};
87
+ return readJson(defaultPrefsPath())?.global ?? {};
74
88
  }
75
89
 
76
90
  function resolvePrefs() {
@@ -269,16 +283,61 @@ function inputType(state) {
269
283
  return "free-text";
270
284
  }
271
285
 
272
- // The command that was actually invoked (`/multi-agent:analysis`, `:review`,
273
- // ...). This used to return `state.mode`, so every row read "full" or "local"
274
- // and the one question the panel exists to answer - which command did people
275
- // run - had no answer in the data. `mode` still ships separately as `m`.
276
- function commandOf(state) {
277
- const c = state.command;
278
- if (typeof c === "string" && c.trim()) return c.trim().slice(0, 60);
279
- if (state.mode) return state.mode;
280
- if (state.localMode) return "local";
281
- return "full";
286
+ // The mode set is read from phases.json, which ships next to this script in
287
+ // every install tree (<root>/schemas/phases.json). A mode that file does not
288
+ // declare is reported as "unknown", so a state written by an older version
289
+ // cannot put a mode name on the panel that the pipeline no longer has.
290
+ function allowedModes() {
291
+ const candidates = [
292
+ join(__dirname, "..", "schemas", "phases.json"),
293
+ hostFile("schemas", "phases.json"),
294
+ ];
295
+ for (const p of candidates) {
296
+ const modes = p ? readJson(p)?.modes : null;
297
+ if (modes && typeof modes === "object" && !Array.isArray(modes)) return modes;
298
+ }
299
+ return {};
300
+ }
301
+
302
+ export function modeNames() {
303
+ return Object.keys(allowedModes());
304
+ }
305
+
306
+ function commandName(state) {
307
+ const c = typeof state.command === "string" ? state.command.trim() : "";
308
+ const m = c.match(/^\/multi-agent:([a-z0-9-]+)$/);
309
+ return m ? m[1] : null;
310
+ }
311
+
312
+ /**
313
+ * The run's mode, always one of phases.json's modes or "unknown". Order: the
314
+ * invoked command when it names a mode, an explicit state.mode, the autopilot
315
+ * flag (the mode phases.json marks autopilot: true), then "full", which is
316
+ * what an absent mode means in agent-state.schema.json.
317
+ */
318
+ export function modeOf(state, modes = allowedModes()) {
319
+ const names = Object.keys(modes);
320
+ const has = (n) => typeof n === "string" && names.includes(n);
321
+ const cmd = commandName(state);
322
+ if (has(cmd)) return cmd;
323
+ if (typeof state.mode === "string" && state.mode.trim()) {
324
+ return has(state.mode.trim()) ? state.mode.trim() : "unknown";
325
+ }
326
+ if (state.autopilot === true) {
327
+ const ap = names.find((n) => modes[n]?.autopilot === true);
328
+ if (ap) return ap;
329
+ }
330
+ return has("full") ? "full" : "unknown";
331
+ }
332
+
333
+ // The command that was invoked, when the state names one that still ships
334
+ // (`<root>/commands/multi-agent/<name>/`); otherwise the run's mode.
335
+ function commandOf(state, mode) {
336
+ const name = commandName(state);
337
+ if (name && existsSync(join(__dirname, "..", "commands", "multi-agent", name))) {
338
+ return `/multi-agent:${name}`;
339
+ }
340
+ return mode;
282
341
  }
283
342
 
284
343
  // A repository name is the user's, not ours. It put a corporate project into
@@ -322,6 +381,7 @@ function trackerSummary(state) {
322
381
  models: [],
323
382
  startedAt: null,
324
383
  endedAt: null,
384
+ current: null,
325
385
  };
326
386
  const path = resolveTracker(state);
327
387
  if (!path) return empty;
@@ -365,6 +425,11 @@ function trackerSummary(state) {
365
425
  });
366
426
  }
367
427
  phs.sort((a, b) => Number(a.p) - Number(b.p));
428
+ const numeric = phs.filter((p) => typeof p.p === "number");
429
+ const running = numeric.filter((p) => p.st === "in_progress");
430
+ const reached = numeric.filter((p) => ["completed", "failed"].includes(p.st));
431
+ const pick = running.length ? running : reached;
432
+ const current = pick.length ? pick[pick.length - 1].p : null;
368
433
 
369
434
  const total = tin + tout + tcache;
370
435
  // Price each phase at its OWN model's rate, matching phase-tracker.sh; a run
@@ -400,12 +465,14 @@ function trackerSummary(state) {
400
465
  models: Array.from(models).slice(0, 10),
401
466
  startedAt,
402
467
  endedAt,
468
+ current,
403
469
  };
404
470
  }
405
471
 
406
472
  function deriveErrors(state, failedPhases) {
407
473
  const errs = new Set();
408
- if (state.haltReason) errs.add(String(state.haltReason));
474
+ const halt = reasonCode(state, "halted");
475
+ if (halt) errs.add(halt);
409
476
  for (const id of failedPhases ?? []) errs.add(`phase-${id}-failed`);
410
477
  const s = String(state.status || "").toLowerCase();
411
478
  if (s === "failed") errs.add("run-failed");
@@ -431,17 +498,108 @@ function runId(state) {
431
498
  return base == null ? null : String(base);
432
499
  }
433
500
 
434
- function eventTimestamp(state, spend) {
435
- if (state.finishedAt) return state.finishedAt;
436
- if (isTerminalStatus(state) && spend?.endedAt) return spend.endedAt;
437
- return state.updatedAt || new Date().toISOString();
501
+ export const EVENT_KINDS = ["phase", "completed", "halted", "parked"];
502
+
503
+ /**
504
+ * The run status the panel shows, from the event that triggered the report or,
505
+ * without one, from the state file. Values: completed, halted, parked, failed,
506
+ * in_progress. A parked run is waiting on a person (awaiting_input, or a
507
+ * waitingFor step); a halted one stopped on an error and is resumable.
508
+ */
509
+ function runStatus(state, event) {
510
+ if (event === "completed") return "completed";
511
+ if (event === "halted") return "halted";
512
+ if (event === "parked") return "parked";
513
+ const s = String(state.status || "").toLowerCase();
514
+ if (s === "failed" && !state.haltReason) return "failed";
515
+ if (state.haltReason || s === "paused" || s === "halted" || s === "failed") return "halted";
516
+ if (s === "awaiting_input" || state.waitingFor) return "parked";
517
+ if (s === "complete" || s === "completed") return "completed";
518
+ return "in_progress";
519
+ }
520
+
521
+ function codeOf(raw, max = 60) {
522
+ if (typeof raw !== "string") return null;
523
+ const c = raw
524
+ .trim()
525
+ .toLowerCase()
526
+ .replace(/[^a-z0-9:_-]+/g, "-")
527
+ .replace(/-+/g, "-")
528
+ .replace(/^-|-$/g, "")
529
+ .slice(0, max);
530
+ return c || null;
438
531
  }
439
532
 
440
- const TERMINAL_STATUSES = ["complete", "completed", "failed", "paused", "halted", "error"];
533
+ const ABSOLUTE_PATH = /(?:~|\/(?:Users|home|var|private|tmp|opt|etc|Volumes))\/\S*|[A-Za-z]:\\\S*/g;
441
534
 
442
- function isTerminalStatus(state) {
443
- if (state.haltReason) return true;
444
- return TERMINAL_STATUSES.includes(String(state.status || "").toLowerCase());
535
+ /**
536
+ * A short machine-readable reason: the halt cause as `<phase>:<cause>` or the
537
+ * step a parked run waits at. Paths are removed before the text is reduced to
538
+ * [a-z0-9:_-], so a cause that quoted a file cannot carry a home directory.
539
+ */
540
+ function reasonCode(state, status) {
541
+ if (status === "halted" || status === "failed") {
542
+ const hr =
543
+ typeof state.haltReason === "string" ? state.haltReason.replace(ABSOLUTE_PATH, " ") : "";
544
+ if (!hr.trim()) return status === "failed" ? "run-failed" : null;
545
+ const m = hr.match(/^\s*(\d+)\s*:(.*)$/);
546
+ if (m) {
547
+ const cause = codeOf(m[2], 40);
548
+ return cause ? `${m[1]}:${cause}` : m[1];
549
+ }
550
+ return codeOf(hr, 48);
551
+ }
552
+ if (status === "parked") {
553
+ return codeOf(state.waitingFor) || codeOf(state.status) || "awaiting-input";
554
+ }
555
+ return null;
556
+ }
557
+
558
+ /** Opt-in: a one-line task title with paths, markup and code spans removed. */
559
+ export function titleSummary(state, prefs) {
560
+ if (prefs?.includeTitle !== true) return null;
561
+ const candidates = [
562
+ state.title,
563
+ state.jiraSummary,
564
+ state.jiraTitle,
565
+ state.jira?.summary,
566
+ state.issue?.title,
567
+ state.issue?.summary,
568
+ state.githubIssue?.title,
569
+ ];
570
+ const raw = candidates.find((c) => typeof c === "string" && c.trim());
571
+ if (!raw) return null;
572
+ const clean = raw
573
+ .replace(/`[^`]*`/g, " ")
574
+ .replace(ABSOLUTE_PATH, " ")
575
+ .replace(/[<>{}[\]`]/g, " ")
576
+ .replace(/\s+/g, " ")
577
+ .trim();
578
+ if (!clean) return null;
579
+ return clean.length > 80 ? `${clean.slice(0, 79)}...` : clean;
580
+ }
581
+
582
+ /** Opt-in: the PR URL, https only. */
583
+ export function prUrlOf(state, prefs) {
584
+ if (prefs?.includePrUrl !== true) return null;
585
+ const url = typeof state.pr === "string" ? state.pr : state.pr?.url;
586
+ if (typeof url !== "string") return null;
587
+ try {
588
+ const u = new URL(url.trim());
589
+ return u.protocol === "https:" ? u.href.slice(0, 200) : null;
590
+ } catch {
591
+ return null;
592
+ }
593
+ }
594
+
595
+ function hasPr(state) {
596
+ if (typeof state.pr === "string") return Boolean(state.pr.trim());
597
+ return Boolean(state.pr && (state.pr.url || state.pr.number));
598
+ }
599
+
600
+ function eventTimestamp(state, status) {
601
+ if (status === "completed" && state.finishedAt) return state.finishedAt;
602
+ return new Date().toISOString();
445
603
  }
446
604
 
447
605
  function appendErrorLedger(event) {
@@ -464,49 +622,46 @@ function appendErrorLedger(event) {
464
622
  }
465
623
  }
466
624
 
467
- // Telemetry identity is the GitHub ACCOUNT NAME, never the git identity.name
468
- // (which can carry a full corporate title / brand text). Order: the username
469
- // stored on the run's identity (the gh login, from prefs identities), then the
470
- // active gh account's login resolved live, then null. The corporate `name` is
471
- // deliberately not a fallback.
472
- function resolveGithubLogin() {
473
- try {
474
- const out = execFileSync("gh", ["api", "user", "--jq", ".login"], {
475
- encoding: "utf-8",
476
- timeout: 3000,
477
- stdio: ["ignore", "pipe", "ignore"],
478
- }).trim();
479
- if (out) return out;
480
- } catch {
481
- /* gh absent or not authenticated - stay silent */
482
- }
483
- return null;
625
+ // Telemetry identity is the GitHub account that can read the pipeline
626
+ // repository (usage-identity.mjs), never the git identity.name and never the
627
+ // account gh merely has active. The server replaces it with the login pinned to
628
+ // the ingest token, so this value is informational.
629
+ function resolveUser(opts = {}) {
630
+ return resolveReportingLogin(opts).login;
484
631
  }
485
632
 
486
- function resolveUser(state) {
487
- const fromIdentity = state.identity?.username;
488
- if (typeof fromIdentity === "string" && fromIdentity.trim()) return fromIdentity.trim();
489
- return resolveGithubLogin();
490
- }
491
-
492
- function buildEvent(state) {
633
+ function buildEvent(state, { event = null, login = null } = {}) {
493
634
  const spend = trackerSummary(state);
494
635
  const ctx = deriveContext(state);
636
+ const prefs = resolvePrefs();
637
+ const st = runStatus(state, event);
638
+ const rc = reasonCode(state, st);
639
+ const mode = modeOf(state);
640
+ const phase =
641
+ typeof state.currentPhase === "number" && !Number.isNaN(state.currentPhase)
642
+ ? state.currentPhase
643
+ : null;
495
644
  return {
496
645
  id: runId(state),
497
- t: eventTimestamp(state, spend),
498
- u: resolveUser(state),
499
- c: commandOf(state),
500
- m: state.mode || null,
646
+ ev: EVENT_KINDS.includes(event) ? event : null,
647
+ t: eventTimestamp(state, st),
648
+ t0: state.startedAt || spend.startedAt || null,
649
+ u: login,
650
+ c: commandOf(state, mode),
651
+ m: mode,
652
+ tt: codeOf(state.taskType, 30),
501
653
  ap: Boolean(state.autopilot),
502
654
  lo: Boolean(state.localMode),
503
655
  in: inputType(state),
504
656
  rp: projectDigest(state.project),
505
- ph: typeof state.currentPhase === "number" ? state.currentPhase : null,
506
- st: state.status || null,
507
- hr: state.haltReason || null,
657
+ ph: state._phaseOverride ?? spend.current ?? phase,
658
+ st,
659
+ hr: st === "halted" || st === "failed" ? rc : null,
660
+ rc,
508
661
  ri: Array.isArray(state.reviewIterations) ? state.reviewIterations.length : 0,
509
- pr: Boolean(state.pr && (state.pr.url || state.pr.number)),
662
+ pr: hasPr(state),
663
+ pru: prUrlOf(state, prefs),
664
+ ti: titleSummary(state, prefs),
510
665
  du: durationSec(state, spend),
511
666
  tk: spend.tk,
512
667
  cost: spend.cost,
@@ -536,6 +691,7 @@ async function post(endpoint, token, event) {
536
691
  "X-Usage-Token": token,
537
692
  },
538
693
  body: JSON.stringify(event),
694
+ redirect: "error",
539
695
  signal: ctrl.signal,
540
696
  });
541
697
  } catch {
@@ -566,7 +722,7 @@ async function main() {
566
722
  const args = parseArgs(process.argv.slice(2));
567
723
  if (process.env.MULTI_AGENT_SMOKE && !args.dryRun) return;
568
724
  const prefs = resolvePrefs();
569
- const endpoint = prefs.endpoint || ENDPOINT_DEFAULT;
725
+ const endpoint = canonicalEndpoint(prefs.endpoint || ENDPOINT_DEFAULT);
570
726
 
571
727
  // Gate BEFORE touching the keychain: optOut is a hard block, and reading the
572
728
  // secret for a disabled feature is both wasteful and can raise a macOS
@@ -589,22 +745,29 @@ async function main() {
589
745
 
590
746
  if (args.phase != null) {
591
747
  const n = Number(args.phase);
592
- state.currentPhase = Number.isNaN(n) ? args.phase : n;
748
+ if (!Number.isNaN(n)) state._phaseOverride = n;
593
749
  }
594
750
  if (args.status) state.status = args.status;
751
+ const kind = EVENT_KINDS.includes(args.event) ? args.event : null;
752
+
753
+ const who = resolveReportingLogin();
754
+ if (!who.login) {
755
+ process.stderr.write(`usage-report: not sent - ${who.reason}\n`);
756
+ if (!args.dryRun) return;
757
+ }
595
758
 
596
- const event = buildEvent(state);
759
+ const event = buildEvent(state, { event: kind, login: who.login });
597
760
 
598
761
  if (args.dryRun) {
599
762
  process.stdout.write(JSON.stringify(event, null, 2) + "\n");
600
763
  return;
601
764
  }
602
765
 
603
- if (isTerminalStatus(state)) appendErrorLedger(event);
766
+ if (event.st !== "in_progress") appendErrorLedger(event);
604
767
  await post(endpoint, token, event);
605
768
  }
606
769
 
607
- // Windows-safe entry-point check: compare file URLs, never string-split a path.
770
+ // Entry-point check: compare file URLs, never string-split a path.
608
771
  const invokedDirectly = process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href;
609
772
  if (invokedDirectly) {
610
773
  // Exit 0 stays: usage telemetry must never be the reason a run fails, and a
@@ -629,4 +792,6 @@ export {
629
792
  trackerSummary,
630
793
  buildEvent,
631
794
  resolveUser,
795
+ runStatus,
796
+ reasonCode,
632
797
  };
@@ -29,8 +29,8 @@
29
29
  // section-sign / curly quotes anywhere.
30
30
  // - Redaction leak scan: an email address or a 13-19 digit card-like run is
31
31
  // an ERROR; a bare 11-digit run is a WARN (could be a numeric trx id); a
32
- // PNR-shaped token (6-char uppercase letter+digit mix, or 6 uppercase
33
- // letters right after a "PNR" keyword) is a WARN.
32
+ // reservation/order reference code (6-char uppercase letter+digit mix, or
33
+ // 6 uppercase letters right after a reference-code label) is a WARN.
34
34
  //
35
35
  // Usage:
36
36
  // node validate-complaint-doc.mjs complaints/complaints-20260810.md
@@ -79,12 +79,30 @@ const BANNED_PUNCT = [
79
79
  const EMAIL_RE = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/;
80
80
  const CARD_RE = /\b\d(?:[ -]?\d){12,18}\b/;
81
81
  const NATIONAL_ID_RE = /\b\d{11}\b/;
82
- // Same shape parse-complaints.sh redacts (6-char uppercase alnum with at least
83
- // one letter AND one digit), so a leak the parser should have caught fails
84
- // loudly here too. All-letter PNRs are only flaggable with context: a bare
85
- // 6-letter word is far too common, so those warn only right after "PNR".
86
- const PNR_MIXED_RE = /\b(?=[A-Z0-9]{6}\b)(?=[A-Z0-9]*\d)(?=\d*[A-Z])[A-Z0-9]{6}\b/;
87
- const PNR_CONTEXT_RE = /\bPNR\b[^A-Za-z0-9\n]{0,3}[A-Z]{6}\b/;
82
+ // Same shapes parse-complaints.sh redacts (6-char uppercase alnum with at
83
+ // least one letter AND one digit), so a leak the parser should have caught
84
+ // fails loudly here too. An all-letter code is only flaggable with context: a
85
+ // bare 6-letter word is far too common, so it warns only right after a
86
+ // reference-code label (matched case-insensitively, as the parser does).
87
+ const REF_CODE_MIXED_RE = /\b(?=[A-Z0-9]{6}\b)(?=[A-Z0-9]*\d)(?=\d*[A-Z])[A-Z0-9]{6}\b/;
88
+ const REF_CODE_LABELLED_RE = new RegExp(
89
+ "(?<![\\p{L}\\p{N}])(?:" +
90
+ [
91
+ "reference (?:code|number|no)",
92
+ "ref (?:code|no)",
93
+ "(?:booking|reservation|order|confirmation) (?:code|number|no|ref|reference)",
94
+ "rezervasyon (?:kodu|no)",
95
+ "sipari[s\u015f] (?:kodu|no)",
96
+ "pnr",
97
+ ].join("|") +
98
+ ")[^A-Za-z0-9\\n]{0,3}([A-Za-z]{6})(?![\\p{L}\\p{N}])",
99
+ "giu",
100
+ );
101
+
102
+ function hasReferenceCode(line) {
103
+ if (REF_CODE_MIXED_RE.test(line)) return true;
104
+ return [...line.matchAll(REF_CODE_LABELLED_RE)].some((m) => /^[A-Z]{6}$/.test(m[1]));
105
+ }
88
106
 
89
107
  function readInput() {
90
108
  const args = process.argv.slice(2).filter((a) => a !== "--strict");
@@ -240,9 +258,9 @@ function main() {
240
258
  `possible redaction leak: bare 11-digit run at line ${i + 1} (national-id-like; ignore if it is a numeric trx id)`,
241
259
  );
242
260
  }
243
- if (PNR_MIXED_RE.test(bodyLines[i]) || PNR_CONTEXT_RE.test(bodyLines[i])) {
261
+ if (hasReferenceCode(bodyLines[i])) {
244
262
  warns.push(
245
- `possible redaction leak: PNR-shaped token at line ${i + 1} (parse-complaints.sh should have redacted it)`,
263
+ `possible redaction leak: reference-code-shaped token at line ${i + 1} (parse-complaints.sh should have redacted it)`,
246
264
  );
247
265
  }
248
266
  }
@@ -108,6 +108,12 @@ async function main() {
108
108
  if (t.acceptanceCriteria !== undefined && !Array.isArray(t.acceptanceCriteria)) {
109
109
  errors.push(`tasks[${i}].acceptanceCriteria: must be array if present`);
110
110
  }
111
+ if (
112
+ t.requirements !== undefined &&
113
+ !(Array.isArray(t.requirements) && t.requirements.every((r) => typeof r === "string"))
114
+ ) {
115
+ errors.push(`tasks[${i}].requirements: must be an array of requirement ids if present`);
116
+ }
111
117
  });
112
118
 
113
119
  // Validate dependsOn edges point to real ids and don't cycle