@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
@@ -25,14 +25,34 @@
25
25
  * every one of them invented.
26
26
  * --json Machine-readable report
27
27
  * --quiet Exit code only
28
+ * --state <path> agent-state.json, for the unattended pre-existing check
29
+ * --base <sha> Base commit for that check. Default: state.baseline.sha,
30
+ * else the merge-base of HEAD with state.baseBranch
28
31
  *
29
32
  * Accepted shapes, detected rather than declared, so one script serves both
30
33
  * callers and neither has to say which it is:
31
34
  * - reviewer output `{findings: [{file, line, ...}]}`
32
- * - triage output `{accepted|deferred|rejected: [{file, line, ...}]}`
35
+ * - triage output `{accepted: [{file, line}], deferred|rejected: [{finding: {file, line}}]}`
33
36
  * - analysis spec `{evidence: {repoEvidence: {<repo>: {buckets: ...}}}}`
34
37
  * - markdown every `path/to/file.ext:123` in the prose
35
38
  *
39
+ * While the quality gates are active (lib/unattended.mjs, gatesActive:
40
+ * MULTI_AGENT_UNATTENDED=1 or a run in autopilot mode) the check goes further:
41
+ *
42
+ * - the `finding` inside each deferred / rejected triage item is resolved too;
43
+ * - a citation that carries a `quote` must match: after whitespace is
44
+ * collapsed, the quote is contained in the cited line (a multi-line quote
45
+ * in the lines starting there) and has at least QUOTE_MIN non-space
46
+ * characters, or is the whole line. A line number with no quote only says
47
+ * the line exists; the quote says what the reviewer read on it;
48
+ * - every finding claimed pre-existing is checked against the base commit
49
+ * (_pre-existing.mjs);
50
+ * - the verdict is appended to state.gates[] as `verify-citations`
51
+ * (gate-ledger.mjs), `not-applicable` when there was nothing to check.
52
+ *
53
+ * An attended run resolves `file:line` as it always did: flat findings only,
54
+ * quotes not read.
55
+ *
36
56
  * Exit codes:
37
57
  * 0 - every citation resolved, or there were none to resolve
38
58
  * 1 - at least one citation did not resolve
@@ -43,10 +63,12 @@
43
63
  */
44
64
 
45
65
  import { readFileSync, realpathSync, statSync } from "node:fs";
46
- import { resolve as resolvePath, sep } from "node:path";
66
+ import { dirname, resolve as resolvePath, sep } from "node:path";
47
67
  import { spawnSync } from "node:child_process";
48
68
  import { runMain } from "../lib/fatal.mjs";
49
69
  import { invokedDirectly } from "../lib/invoked-directly.mjs";
70
+ import { checkPreExisting, resolveBase } from "./_pre-existing.mjs";
71
+ import { gateContext, recordQuietly } from "./gate-ledger.mjs";
50
72
 
51
73
  /**
52
74
  * Reject a path before it reaches git.
@@ -145,14 +167,21 @@ export const SOURCE_EXTENSIONS = new Set([
145
167
  /**
146
168
  * Pull `{file, line}` pairs out of whatever was handed over.
147
169
  *
170
+ * `nested` reads the `finding` inside deferred / rejected triage items and
171
+ * `quotes` keeps each citation's `quote`; both are on by default. An attended
172
+ * run turns both off (see main), which keeps its verdicts where they were.
173
+ *
148
174
  * @param {string} raw
149
- * @returns {{file: string, line: number|null, where: string}[]}
175
+ * @param {{nested?: boolean, quotes?: boolean}} [opts]
176
+ * @returns {{file: string, line: number|null, where: string, quote?: string}[]}
150
177
  */
151
- export function extract(raw) {
178
+ export function extract(raw, { nested = true, quotes = true } = {}) {
152
179
  const out = [];
153
- const push = (file, line, where) => {
180
+ const push = (file, line, where, quote) => {
154
181
  if (typeof file === "string" && file.trim()) {
155
- out.push({ file: file.trim(), line: Number.isFinite(line) ? line : null, where });
182
+ const c = { file: file.trim(), line: Number.isFinite(line) ? line : null, where };
183
+ if (quotes && typeof quote === "string" && quote.trim()) c.quote = quote;
184
+ out.push(c);
156
185
  }
157
186
  };
158
187
 
@@ -164,9 +193,13 @@ export function extract(raw) {
164
193
  }
165
194
 
166
195
  if (doc && typeof doc === "object") {
196
+ // Deferred and rejected triage items wrap the reviewer's finding as
197
+ // `{finding, reason}`; accepted items and reviewer findings are flat.
167
198
  for (const key of ["findings", "accepted", "deferred", "rejected"]) {
168
- for (const [i, f] of (doc[key] || []).entries()) {
169
- if (f && typeof f === "object") push(f.file, Number(f.line), `${key}[${i}]`);
199
+ for (const [i, item] of (Array.isArray(doc[key]) ? doc[key] : []).entries()) {
200
+ if (!item || typeof item !== "object") continue;
201
+ const f = nested && item.finding && typeof item.finding === "object" ? item.finding : item;
202
+ push(f.file, Number(f.line), `${key}[${i}]`, f.quote);
170
203
  }
171
204
  }
172
205
  const repoEvidence = doc?.evidence?.repoEvidence || doc?.analysisSpec?.evidence?.repoEvidence;
@@ -229,7 +262,7 @@ export function extract(raw) {
229
262
  * @param {string} repo
230
263
  * @param {string|null} rev
231
264
  * @param {{file: string, line: number|null}} c
232
- * @param {Map<string, number|null>} lineCache
265
+ * @param {Map<string, string[]|null>} lineCache
233
266
  * @returns {string|null} the reason it failed, or null
234
267
  */
235
268
  export function resolveOne(repo, rev, c, lineCache) {
@@ -240,22 +273,53 @@ export function resolveOne(repo, rev, c, lineCache) {
240
273
  lineCache.set(c.file, rev === null ? worktreeLines(repo, c.file) : revLines(repo, rev, c.file));
241
274
  }
242
275
 
243
- const lines = lineCache.get(c.file);
276
+ const content = lineCache.get(c.file);
244
277
  const at = rev === null ? "in the working tree" : `at ${rev.slice(0, 12)}`;
245
- if (lines === null) return `no such file ${at}`;
278
+ if (content === null) return `no such file ${at}`;
279
+ const lines = content.length;
246
280
  if (c.line === null) return null;
247
281
  if (c.line < 1) return `line ${c.line} is not a line number`;
248
282
  if (c.line > lines) return `line ${c.line} is past the end of the file (${lines} lines)`;
283
+ if (c.quote !== undefined && !quoteMatches(content, c.line, c.quote)) {
284
+ return `quote does not match line ${c.line} ${at}`;
285
+ }
249
286
  return null;
250
287
  }
251
288
 
289
+ const collapse = (s) => String(s).replace(/\s+/g, " ").trim();
290
+
291
+ /**
292
+ * Shortest quote that says what the line holds. A shorter one resolves only
293
+ * when it is the whole cited line: "e" is on most lines of any file.
294
+ */
295
+ export const QUOTE_MIN = 8;
296
+
297
+ /**
298
+ * True when the quote, whitespace collapsed, is inside the cited line - or,
299
+ * for a quote spanning N lines, inside lines line..line+N-1 joined - and has
300
+ * at least QUOTE_MIN non-space characters or is that whole text.
301
+ *
302
+ * @param {string[]} content the file's lines
303
+ * @param {number} line 1-based
304
+ * @param {string} quote
305
+ * @returns {boolean}
306
+ */
307
+ export function quoteMatches(content, line, quote) {
308
+ const span = String(quote).trim().split("\n").length;
309
+ const window = collapse(content.slice(line - 1, line - 1 + span).join("\n"));
310
+ const want = collapse(quote);
311
+ if (want === "") return true;
312
+ if (want.replace(/\s/g, "").length < QUOTE_MIN) return window === want;
313
+ return window.includes(want);
314
+ }
315
+
252
316
  /**
253
- * Line count of a blob at a commit, or null when the path is not a file there.
317
+ * Lines of a blob at a commit, or null when the path is not a file there.
254
318
  *
255
319
  * @param {string} repo
256
320
  * @param {string} rev
257
321
  * @param {string} file
258
- * @returns {number|null}
322
+ * @returns {string[]|null}
259
323
  */
260
324
  function revLines(repo, rev, file) {
261
325
  const t = spawnSync("git", ["-C", repo, "cat-file", "-t", `${rev}:${file}`], {
@@ -266,11 +330,11 @@ function revLines(repo, rev, file) {
266
330
  encoding: "utf-8",
267
331
  maxBuffer: 64 * 1024 * 1024,
268
332
  });
269
- return countLines(show.status === 0 ? show.stdout : "");
333
+ return splitLines(show.status === 0 ? show.stdout : "");
270
334
  }
271
335
 
272
336
  /**
273
- * Line count in the checkout, or null when there is no such file.
337
+ * Lines in the checkout, or null when there is no such file.
274
338
  *
275
339
  * `unsafePath` cannot see a symlink: `docs/out -> /etc` is a relative path with
276
340
  * no `..` in it, and git never followed it because git reads blobs rather than
@@ -279,7 +343,7 @@ function revLines(repo, rev, file) {
279
343
  *
280
344
  * @param {string} repo
281
345
  * @param {string} file
282
- * @returns {number|null}
346
+ * @returns {string[]|null}
283
347
  */
284
348
  function worktreeLines(repo, file) {
285
349
  let real;
@@ -293,29 +357,31 @@ function worktreeLines(repo, file) {
293
357
  if (real !== root && !real.startsWith(root + sep)) return null;
294
358
  try {
295
359
  if (!statSync(real).isFile()) return null;
296
- return countLines(readFileSync(real, "utf-8"));
360
+ return splitLines(readFileSync(real, "utf-8"));
297
361
  } catch {
298
362
  return null;
299
363
  }
300
364
  }
301
365
 
302
366
  /**
303
- * A file with no trailing newline still has its last line.
367
+ * A file's lines. A file with no trailing newline still has its last line.
304
368
  *
305
369
  * @param {string} text
306
- * @returns {number}
370
+ * @returns {string[]}
307
371
  */
308
- function countLines(text) {
309
- if (text.length === 0) return 0;
310
- return text.split("\n").length - (text.endsWith("\n") ? 1 : 0);
372
+ function splitLines(text) {
373
+ if (text.length === 0) return [];
374
+ const lines = text.split("\n");
375
+ if (text.endsWith("\n")) lines.pop();
376
+ return lines;
311
377
  }
312
378
 
313
379
  /**
314
380
  * @param {object} params
315
381
  * @returns {{checked: number, unresolved: object[], rev: string}}
316
382
  */
317
- export function verify({ raw, repo, rev }) {
318
- const citations = extract(raw);
383
+ export function verify({ raw, repo, rev, gated = true }) {
384
+ const citations = extract(raw, { nested: gated, quotes: gated });
319
385
  const lineCache = new Map();
320
386
  const unresolved = [];
321
387
  for (const c of citations) {
@@ -325,7 +391,7 @@ export function verify({ raw, repo, rev }) {
325
391
  return { checked: citations.length, unresolved, rev };
326
392
  }
327
393
 
328
- const VALUE_FLAGS = new Set(["--repo", "--rev"]);
394
+ const VALUE_FLAGS = new Set(["--repo", "--rev", "--state", "--base"]);
329
395
 
330
396
  /**
331
397
  * One pass, positionally. `argv.indexOf(a)` finds the FIRST occurrence of a
@@ -333,30 +399,27 @@ const VALUE_FLAGS = new Set(["--repo", "--rev"]);
333
399
  * target; walking the list is both simpler and correct.
334
400
  *
335
401
  * @param {string[]} argv
336
- * @returns {{target: string|null, repo: string|null, rev: string|null}}
402
+ * @returns {{target: string|null, repo: string|null, rev: string|null, state: string|null, base: string|null}}
337
403
  */
338
404
  export function parseArgs(argv) {
339
- let target = null;
340
- let repo = null;
341
- let rev = null;
405
+ const v = { target: null, repo: null, rev: null, state: null, base: null };
342
406
  for (let i = 0; i < argv.length; i++) {
343
407
  const a = argv[i];
344
408
  if (VALUE_FLAGS.has(a)) {
345
- const v = argv[i + 1];
346
- if (v !== undefined && !v.startsWith("--")) {
347
- if (a === "--repo") repo = v;
348
- else rev = v;
409
+ const next = argv[i + 1];
410
+ if (next !== undefined && !next.startsWith("--")) {
411
+ v[a.slice(2)] = next;
349
412
  i++;
350
413
  }
351
414
  continue;
352
415
  }
353
416
  if (a.startsWith("--")) continue;
354
- if (target === null) target = a;
417
+ if (v.target === null) v.target = a;
355
418
  }
356
- return { target, repo, rev };
419
+ return v;
357
420
  }
358
421
 
359
- function main() {
422
+ async function main() {
360
423
  const argv = process.argv.slice(2);
361
424
  const parsed = parseArgs(argv);
362
425
  const target = parsed.target;
@@ -400,9 +463,51 @@ function main() {
400
463
  sha = head.stdout.trim();
401
464
  }
402
465
 
403
- const report = verify({ raw, repo, rev: sha });
466
+ const ctx = gateContext({ statePath: parsed.state, repo });
467
+ const report = verify({ raw, repo, rev: sha, gated: ctx.active });
404
468
  const where = sha === null ? "in the working tree" : `at ${sha.slice(0, 12)}`;
405
469
 
470
+ if (ctx.active) {
471
+ let doc;
472
+ try {
473
+ doc = JSON.parse(raw);
474
+ } catch {
475
+ doc = null;
476
+ }
477
+ if (parsed.state && ctx.state === null) {
478
+ console.error(`verify-citations: cannot read ${parsed.state}`);
479
+ process.exit(2);
480
+ }
481
+ if (doc && typeof doc === "object") {
482
+ const base = resolveBase(repo, ctx.state, parsed.base);
483
+ report.preExisting = checkPreExisting({
484
+ doc,
485
+ repo,
486
+ rev: sha,
487
+ state: ctx.state,
488
+ base,
489
+ stateDir: ctx.statePath ? dirname(ctx.statePath) : null,
490
+ });
491
+ }
492
+ }
493
+ const preRejected = report.preExisting?.rejected.length ?? 0;
494
+ const failed = report.unresolved.length > 0 || preRejected > 0;
495
+ if (ctx.active) {
496
+ const nothing = report.checked === 0 && (report.preExisting?.claims ?? 0) === 0;
497
+ await recordQuietly(
498
+ "verify-citations",
499
+ failed ? "fail" : nothing ? "not-applicable" : "pass",
500
+ {
501
+ input: target === "-" ? "stdin" : target,
502
+ checked: report.checked,
503
+ unresolved: report.unresolved.length,
504
+ preExistingClaims: report.preExisting?.claims ?? 0,
505
+ preExistingRejected: preRejected,
506
+ },
507
+ { repo, statePath: ctx.statePath },
508
+ );
509
+ }
510
+
406
511
  if (json) {
407
512
  console.log(JSON.stringify(report, null, 2));
408
513
  } else if (!quiet) {
@@ -420,9 +525,17 @@ function main() {
420
525
  // is the moment someone is deciding what to do about it.
421
526
  console.log(" Re-search and correct the citation; never drop the line number to pass.");
422
527
  }
528
+ if (preRejected > 0) {
529
+ console.log(
530
+ `verify-citations: ${preRejected} pre-existing claim(s) not backed by the base commit:`,
531
+ );
532
+ for (const r of report.preExisting.rejected) {
533
+ console.log(` ${r.where}: ${r.file}${r.line ? `:${r.line}` : ""} - ${r.reason}`);
534
+ }
535
+ }
423
536
  }
424
537
 
425
- process.exit(report.unresolved.length === 0 ? 0 : 1);
538
+ process.exit(failed ? 1 : 0);
426
539
  }
427
540
 
428
541
  if (invokedDirectly(import.meta.url)) {
@@ -43,8 +43,54 @@ import { homedir } from "node:os";
43
43
  import { dirname, join, relative } from "node:path";
44
44
  import { fileURLToPath, pathToFileURL } from "node:url";
45
45
  import { runMain } from "../lib/fatal.mjs";
46
+ import { messages, outputLanguage } from "../lib/user-facing.mjs";
46
47
 
47
48
  const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
49
+
50
+ // The human report renders in `prefs.global.outputLanguage`; `--json` is
51
+ // untouched, because that half is parsed rather than read. Both languages sit
52
+ // on one key so a wording change cannot land on only one of them.
53
+ const REPORT = {
54
+ en: {
55
+ pkg: (version, commit, files, signature) =>
56
+ `package: ${version} (${commit}) - ${files} files, signature: ${signature}`,
57
+ unknownCommit: "commit unknown",
58
+ pkgClean: " every file is as published",
59
+ changed: (f) => ` ! changed: ${f}`,
60
+ missing: (f) => ` ! missing: ${f}`,
61
+ more: (n) => ` ... and ${n} more files`,
62
+ installAbsent: (reason) => `install: ${reason}`,
63
+ installHeader: (trees, files) => `install: ~/.claude - ${trees} trees, ${files} files compared`,
64
+ presenceOnly: " (presence only: descriptions are translated at install time)",
65
+ treeDrift: (tree, changed, missing, how) =>
66
+ ` ${tree}: ${changed} differ, ${missing} missing${how}`,
67
+ neverWritten: (f) => ` ? ${f} (never written)`,
68
+ installClean: " byte for byte with the source",
69
+ otherHosts: (hosts) =>
70
+ ` ${hosts} installed - their paths are rewritten at install time, so no byte comparison was made`,
71
+ },
72
+ tr: {
73
+ pkg: (version, commit, files, signature) =>
74
+ `paket: ${version} (${commit}) - ${files} dosya, imza: ${signature}`,
75
+ unknownCommit: "commit bilinmiyor",
76
+ pkgClean: " butun dosyalar yayinlandigi gibi",
77
+ changed: (f) => ` ! degismis: ${f}`,
78
+ missing: (f) => ` ! eksik: ${f}`,
79
+ more: (n) => ` ... ve ${n} dosya daha`,
80
+ installAbsent: (reason) => `kurulum: ${reason}`,
81
+ installHeader: (trees, files) =>
82
+ `kurulum: ~/.claude - ${trees} agac, ${files} dosya karsilastirildi`,
83
+ presenceOnly: " (yalnizca varlik: aciklamalar kurulumda cevriliyor)",
84
+ treeDrift: (tree, changed, missing, how) =>
85
+ ` ${tree}: ${changed} farkli, ${missing} eksik${how}`,
86
+ neverWritten: (f) => ` ? ${f} (hic yazilmamis)`,
87
+ installClean: " kaynakla birebir ayni",
88
+ otherHosts: (hosts) =>
89
+ ` ${hosts} kurulu - yollari kurulumda yeniden yazildigi icin bayt karsilastirmasi yapilmadi`,
90
+ },
91
+ };
92
+
93
+ const say = messages(REPORT, outputLanguage());
48
94
  const MANIFEST = join(ROOT, "manifest.json");
49
95
 
50
96
  const argv = process.argv.slice(2);
@@ -255,44 +301,38 @@ async function main() {
255
301
  } else {
256
302
  if (pkg) {
257
303
  process.stdout.write(
258
- `paket: ${pkg.version} (${pkg.commit?.slice(0, 12) ?? "commit bilinmiyor"}) - ${pkg.fileCount} dosya, imza: ${pkg.signature}\n`,
304
+ `${say.pkg(pkg.version, pkg.commit?.slice(0, 12) ?? say.unknownCommit, pkg.fileCount, pkg.signature)}\n`,
259
305
  );
260
- if (!pkg.changed.length && !pkg.missing.length)
261
- process.stdout.write(" butun dosyalar yayinlandigi gibi\n");
306
+ if (!pkg.changed.length && !pkg.missing.length) process.stdout.write(`${say.pkgClean}\n`);
262
307
  const SHOWN = 20;
263
- for (const f of pkg.changed.slice(0, SHOWN)) process.stdout.write(` ! degismis: ${f}\n`);
264
- for (const f of pkg.missing.slice(0, SHOWN)) process.stdout.write(` ! eksik: ${f}\n`);
308
+ for (const f of pkg.changed.slice(0, SHOWN)) process.stdout.write(`${say.changed(f)}\n`);
309
+ for (const f of pkg.missing.slice(0, SHOWN)) process.stdout.write(`${say.missing(f)}\n`);
265
310
  // Counted per list against what was actually PRINTED. Subtracting a flat
266
311
  // 40 from the combined total spent a budget the lists had not used: with
267
312
  // 25 changed and 0 missing it printed 20, hid 5, and said nothing - a
268
313
  // tampered install under-reported by up to twenty files with no sign.
269
314
  const hidden =
270
315
  Math.max(0, pkg.changed.length - SHOWN) + Math.max(0, pkg.missing.length - SHOWN);
271
- if (hidden > 0) process.stdout.write(` ... ve ${hidden} dosya daha\n`);
316
+ if (hidden > 0) process.stdout.write(`${say.more(hidden)}\n`);
272
317
  }
273
318
  if (inst) {
274
- if (!inst.present) process.stdout.write(`kurulum: ${inst.reason}\n`);
319
+ if (!inst.present) process.stdout.write(`${say.installAbsent(inst.reason)}\n`);
275
320
  else {
276
321
  const total = inst.trees.reduce((a, t) => a + t.files, 0);
277
- process.stdout.write(
278
- `kurulum: ~/.claude - ${inst.trees.length} agac, ${total} dosya karsilastirildi\n`,
279
- );
322
+ process.stdout.write(`${say.installHeader(inst.trees.length, total)}\n`);
280
323
  for (const t of inst.trees) {
281
324
  if (!t.changed.length && !t.missing.length) continue;
282
- const how =
283
- t.mode === "presence" ? " (yalnizca varlik: aciklamalar kurulumda cevriliyor)" : "";
325
+ const how = t.mode === "presence" ? say.presenceOnly : "";
284
326
  process.stdout.write(
285
- ` ${t.tree}: ${t.changed.length} farkli, ${t.missing.length} eksik${how}\n`,
327
+ `${say.treeDrift(t.tree, t.changed.length, t.missing.length, how)}\n`,
286
328
  );
287
329
  for (const f of [...t.changed.slice(0, 5)]) process.stdout.write(` ! ${f}\n`);
288
330
  for (const f of [...t.missing.slice(0, 5)])
289
- process.stdout.write(` ? ${f} (hic yazilmamis)\n`);
331
+ process.stdout.write(`${say.neverWritten(f)}\n`);
290
332
  }
291
- if (inst.ok) process.stdout.write(" kaynakla birebir ayni\n");
333
+ if (inst.ok) process.stdout.write(`${say.installClean}\n`);
292
334
  if (inst.otherHosts.length)
293
- process.stdout.write(
294
- ` ${inst.otherHosts.join(", ")} kurulu - yollari kurulumda yeniden yazildigi icin bayt karsilastirmasi yapilmadi\n`,
295
- );
335
+ process.stdout.write(`${say.otherHosts(inst.otherHosts.join(", "))}\n`);
296
336
  }
297
337
  }
298
338
  }
@@ -0,0 +1,126 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # worktree-prepare.sh - create (or re-enter) one task worktree, healed and
4
+ # excluded. Phase 0 Step 6b calls it once per repo; worktree-finalize.sh is its
5
+ # counterpart at the other end of the run.
6
+ #
7
+ # In order, for one repo:
8
+ # 1. heal stale admin state: a stale lock on the path is cleared and
9
+ # `worktree prune` drops entries whose directory is gone. A run killed
10
+ # mid-add leaves one behind, and the retry then fails with "already exists".
11
+ # 2. the residue guard: lib/repo-hygiene.sh keeps .worktrees/, .pipeline/ and
12
+ # the loose logs out of the index through the clone-local exclude file.
13
+ # 3. a path still registered and readable after the heal is entered and
14
+ # fast-forwarded, not re-added; paths are compared physically, so a path
15
+ # named through a symlink still matches its registration. Otherwise the
16
+ # worktree is added on <branch> when that branch already exists (a
17
+ # re-entered task keeps its commits), else `worktree add -b <branch>
18
+ # origin/<base>`.
19
+ # 4. the identity, when given, is set on the worktree.
20
+ #
21
+ # One simple command per repo, so an unattended run can take this step under
22
+ # the guard, which refuses shell control flow.
23
+ #
24
+ # Usage:
25
+ # worktree-prepare.sh --project <repo-root> --path <worktree> --branch <name>
26
+ # --base <base-branch> [--name <git user.name>]
27
+ # [--email <git user.email>]
28
+ #
29
+ # Output (stdout, JSON): {project, worktreePath, branch, baseBranch,
30
+ # action: created|reused|failed, pulled: true|false|null, error}
31
+ #
32
+ # Exit: 0 ready, 1 the add failed (nothing was created; the caller runs its
33
+ # rollback / collision flow), 2 usage.
34
+ set -uo pipefail
35
+
36
+ HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
37
+ PROJECT=""; WT=""; BRANCH=""; BASE=""; NAME=""; EMAIL=""
38
+
39
+ usage() {
40
+ echo "usage: worktree-prepare.sh --project <repo-root> --path <worktree> --branch <name> --base <base-branch> [--name <n>] [--email <e>]" >&2
41
+ exit 2
42
+ }
43
+
44
+ while [ "$#" -gt 0 ]; do
45
+ case "$1" in
46
+ --project) [ "$#" -ge 2 ] || usage; PROJECT="$2"; shift 2 ;;
47
+ --path) [ "$#" -ge 2 ] || usage; WT="$2"; shift 2 ;;
48
+ --branch) [ "$#" -ge 2 ] || usage; BRANCH="$2"; shift 2 ;;
49
+ --base) [ "$#" -ge 2 ] || usage; BASE="$2"; shift 2 ;;
50
+ --name) [ "$#" -ge 2 ] || usage; NAME="$2"; shift 2 ;;
51
+ --email) [ "$#" -ge 2 ] || usage; EMAIL="$2"; shift 2 ;;
52
+ *) usage ;;
53
+ esac
54
+ done
55
+ [ -n "$PROJECT" ] && [ -n "$WT" ] && [ -n "$BRANCH" ] && [ -n "$BASE" ] || usage
56
+ command -v jq >/dev/null 2>&1 || { echo "worktree-prepare: jq is required" >&2; exit 2; }
57
+ git -C "$PROJECT" rev-parse --git-dir >/dev/null 2>&1 || {
58
+ echo "worktree-prepare: not a git repository: $PROJECT" >&2
59
+ exit 2
60
+ }
61
+
62
+ report() { # $1 action, $2 pulled (true|false|null), $3 error
63
+ jq -n --arg project "$PROJECT" --arg wt "$WT" --arg branch "$BRANCH" --arg base "$BASE" \
64
+ --arg action "$1" --argjson pulled "$2" --arg error "$3" \
65
+ '{project: $project, worktreePath: $wt, branch: $branch, baseBranch: $base,
66
+ action: $action, pulled: $pulled, error: (if $error == "" then null else $error end)}'
67
+ }
68
+
69
+ # Physical path of $1, for comparing paths that may go through a symlink.
70
+ # A path that does not exist yet resolves through its nearest existing parent.
71
+ canonical() {
72
+ local p="${1%/}" tail=""
73
+ [ -n "$p" ] || p="/"
74
+ while [ ! -d "$p" ]; do
75
+ tail="/$(basename "$p")$tail"
76
+ p=$(dirname "$p")
77
+ done
78
+ printf '%s%s\n' "$(cd -P "$p" 2>/dev/null && pwd -P)" "$tail"
79
+ }
80
+
81
+ registered() {
82
+ local want line
83
+ want=$(canonical "$WT")
84
+ while IFS= read -r line; do
85
+ case "$line" in
86
+ "worktree "*) [ "$(canonical "${line#worktree }")" = "$want" ] && return 0 ;;
87
+ esac
88
+ done < <(git -C "$PROJECT" worktree list --porcelain 2>/dev/null)
89
+ return 1
90
+ }
91
+
92
+ # Unlock before pruning: prune skips a locked entry, so a lock left by a killed
93
+ # add would otherwise keep a missing directory registered.
94
+ if registered; then
95
+ git -C "$PROJECT" worktree unlock "$WT" 2>/dev/null || true
96
+ fi
97
+ git -C "$PROJECT" worktree prune 2>/dev/null || true
98
+
99
+ HYGIENE="$HERE/../lib/repo-hygiene.sh"
100
+ [ -f "$HYGIENE" ] && bash "$HYGIENE" ensure "$PROJECT"
101
+
102
+ set_identity() {
103
+ [ -n "$NAME" ] && git -C "$WT" config user.name "$NAME"
104
+ [ -n "$EMAIL" ] && git -C "$WT" config user.email "$EMAIL"
105
+ return 0
106
+ }
107
+
108
+ if registered && git -C "$WT" rev-parse --git-dir >/dev/null 2>&1; then
109
+ pulled=false
110
+ git -C "$WT" pull --ff-only -q >/dev/null 2>&1 && pulled=true
111
+ set_identity
112
+ report reused "$pulled" ""
113
+ exit 0
114
+ fi
115
+
116
+ if git -C "$PROJECT" show-ref --verify --quiet "refs/heads/$BRANCH"; then
117
+ add_args=("$WT" "$BRANCH")
118
+ else
119
+ add_args=("$WT" -b "$BRANCH" "origin/$BASE")
120
+ fi
121
+ if ! err=$(git -C "$PROJECT" worktree add -q "${add_args[@]}" 2>&1); then
122
+ report failed null "$err"
123
+ exit 1
124
+ fi
125
+ set_identity
126
+ report created null ""