@1aboveio/skills 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/LICENSE +3 -0
  2. package/README.md +90 -0
  3. package/bin/1aboveio-skills.mjs +18 -0
  4. package/package.json +28 -0
  5. package/runtime/skills/distribution/generated/recipes.json +1189 -0
  6. package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
  7. package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  8. package/skills/backend/airflow-dag-develop/LICENSE +3 -0
  9. package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
  10. package/skills/backend/app-debug/LICENSE +3 -0
  11. package/skills/backend/app-debug/SKILL.md +109 -0
  12. package/skills/backend/app-debug/references/common-errors.md +128 -0
  13. package/skills/backend/python-backend/LICENSE +3 -0
  14. package/skills/backend/python-backend/SKILL.md +326 -0
  15. package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
  16. package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
  17. package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
  18. package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
  19. package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
  20. package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
  21. package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
  22. package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
  23. package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
  24. package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
  25. package/skills/cicd-pipeline/docker/LICENSE +3 -0
  26. package/skills/cicd-pipeline/docker/SKILL.md +126 -0
  27. package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
  28. package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
  29. package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
  30. package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
  31. package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
  32. package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
  33. package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
  34. package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
  35. package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
  36. package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
  37. package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
  38. package/skills/cicd-pipeline/mergify/LICENSE +3 -0
  39. package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
  40. package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
  41. package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
  42. package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
  43. package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
  44. package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
  45. package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
  46. package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
  47. package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
  48. package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
  49. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
  50. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
  51. package/skills/cicd-pipeline/podman/LICENSE +3 -0
  52. package/skills/cicd-pipeline/podman/SKILL.md +70 -0
  53. package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
  54. package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
  55. package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
  56. package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
  57. package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
  58. package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
  59. package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
  60. package/skills/engineering/e2e-test/LICENSE +3 -0
  61. package/skills/engineering/e2e-test/SKILL.md +156 -0
  62. package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
  63. package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
  64. package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
  65. package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
  66. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
  67. package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
  68. package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
  69. package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
  70. package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
  71. package/skills/engineering/e2e-test/references/debugging.md +36 -0
  72. package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
  73. package/skills/engineering/e2e-test/references/reviewing.md +39 -0
  74. package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
  75. package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
  76. package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
  77. package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
  78. package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
  79. package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
  80. package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
  81. package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
  82. package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
  83. package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
  84. package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
  85. package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
  86. package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -0
  87. package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
  88. package/skills/engineering/engineering-runtime/LICENSE +3 -0
  89. package/skills/engineering/engineering-runtime/SKILL.md +10 -0
  90. package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
  91. package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -0
  92. package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
  93. package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
  94. package/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  95. package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
  96. package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
  97. package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
  98. package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
  99. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +576 -0
  100. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
  101. package/skills/engineering/ensure-coverage/LICENSE +3 -0
  102. package/skills/engineering/ensure-coverage/SKILL.md +136 -0
  103. package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
  104. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
  105. package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -0
  106. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
  107. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
  108. package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
  109. package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +25 -0
  110. package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
  111. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
  112. package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
  113. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
  114. package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
  115. package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
  116. package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
  117. package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
  118. package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
  119. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
  120. package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
  121. package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
  122. package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
  123. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
  124. package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
  125. package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
  126. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
  127. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
  128. package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
  129. package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
  130. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
  131. package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
  132. package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
  133. package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
  134. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
  135. package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
  136. package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
  137. package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
  138. package/skills/engineering/harness-runtime/LICENSE +3 -0
  139. package/skills/engineering/harness-runtime/SKILL.md +18 -0
  140. package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
  141. package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
  142. package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
  143. package/skills/engineering/harness-runtime/contracts.md +15 -0
  144. package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
  145. package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
  146. package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
  147. package/skills/engineering/harness-runtime/index.mjs +767 -0
  148. package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
  149. package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
  150. package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
  151. package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
  152. package/skills/engineering/implement-and-pr/LICENSE +3 -0
  153. package/skills/engineering/implement-and-pr/SKILL.md +176 -0
  154. package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
  155. package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
  156. package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
  157. package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
  158. package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
  159. package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
  160. package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
  161. package/skills/engineering/resolve-issues/LICENSE +3 -0
  162. package/skills/engineering/resolve-issues/SKILL.md +167 -0
  163. package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
  164. package/skills/engineering/resolve-issues/references/breaker.md +82 -0
  165. package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
  166. package/skills/engineering/resolve-issues/references/delivery.md +108 -0
  167. package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
  168. package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
  169. package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
  170. package/skills/engineering/resolve-issues/references/finalization.md +68 -0
  171. package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
  172. package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
  173. package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
  174. package/skills/engineering/resolve-issues/references/intake.md +86 -0
  175. package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
  176. package/skills/engineering/resolve-issues/references/interference.md +87 -0
  177. package/skills/engineering/resolve-issues/references/loop.md +134 -0
  178. package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
  179. package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
  180. package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
  181. package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
  182. package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
  183. package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
  184. package/skills/engineering/resolve-issues/references/run-state.md +288 -0
  185. package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
  186. package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
  187. package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
  188. package/skills/engineering/resolve-issues/references/why.md +653 -0
  189. package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
  190. package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
  191. package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
  192. package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
  193. package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
  194. package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
  195. package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
  196. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
  197. package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
  198. package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
  199. package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
  200. package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
  201. package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
  202. package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
  203. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
  204. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
  205. package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
  206. package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
  207. package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
  208. package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
  209. package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
  210. package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
  211. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
  212. package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
  213. package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
  214. package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
  215. package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
  216. package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
  217. package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
  218. package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
  219. package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
  220. package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
  221. package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
  222. package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
  223. package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
  224. package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
  225. package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
  226. package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
  227. package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
  228. package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
  229. package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
  230. package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
  231. package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
  232. package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
  233. package/skills/engineering/resolve-release/LICENSE +3 -0
  234. package/skills/engineering/resolve-release/SKILL.md +112 -0
  235. package/skills/engineering/resolve-release/references/assembly.md +137 -0
  236. package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
  237. package/skills/engineering/resolve-release/references/candidate.md +167 -0
  238. package/skills/engineering/resolve-release/references/exposure.md +178 -0
  239. package/skills/engineering/resolve-release/references/handoff.md +24 -0
  240. package/skills/engineering/resolve-release/references/postmortem.md +230 -0
  241. package/skills/engineering/resolve-release/references/preflight.md +207 -0
  242. package/skills/engineering/resolve-release/references/principles.md +94 -0
  243. package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
  244. package/skills/engineering/resolve-release/references/related-skills.md +12 -0
  245. package/skills/engineering/resolve-release/references/routing.md +149 -0
  246. package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
  247. package/skills/engineering/resolve-release/references/versioning.md +202 -0
  248. package/skills/engineering/resolve-release/references/why.md +53 -0
  249. package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
  250. package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
  251. package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
  252. package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
  253. package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
  254. package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
  255. package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
  256. package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
  257. package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
  258. package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
  259. package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
  260. package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
  261. package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
  262. package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
  263. package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
  264. package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
  265. package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
  266. package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
  267. package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
  268. package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
  269. package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
  270. package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
  271. package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
  272. package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
  273. package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
  274. package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
  275. package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
  276. package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
  277. package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
  278. package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
  279. package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
  280. package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
  281. package/skills/engineering/resolve-release/vendor/README.md +60 -0
  282. package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
  283. package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
  284. package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
  285. package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
  286. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
  287. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
  288. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
  289. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
  290. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
  291. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
  292. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
  293. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
  294. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
  295. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
  296. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
  297. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
  298. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
  299. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
  300. package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
  301. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
  302. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
  303. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
  304. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
  305. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
  306. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
  307. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
  308. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
  309. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
  310. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
  311. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
  312. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
  313. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
  314. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
  315. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
  316. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
  317. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
  318. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
  319. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
  320. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
  321. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
  322. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
  323. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
  324. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
  325. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
  326. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
  327. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
  328. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
  329. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
  330. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
  331. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
  332. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
  333. package/skills/engineering/review-pr/LICENSE +3 -0
  334. package/skills/engineering/review-pr/SKILL.md +123 -0
  335. package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
  336. package/skills/engineering/review-pr/references/code-correctness.md +5 -0
  337. package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
  338. package/skills/engineering/review-pr/references/coordination.md +18 -0
  339. package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
  340. package/skills/engineering/review-pr/references/finding-themes.md +7 -0
  341. package/skills/engineering/review-pr/references/github-posting.md +98 -0
  342. package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
  343. package/skills/engineering/review-pr/references/incremental-output.md +16 -0
  344. package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
  345. package/skills/engineering/review-pr/references/output-format.md +99 -0
  346. package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
  347. package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
  348. package/skills/engineering/review-pr/references/re-review.md +18 -0
  349. package/skills/engineering/review-pr/references/review-method.md +199 -0
  350. package/skills/engineering/review-pr/references/review-mode.md +30 -0
  351. package/skills/engineering/review-pr/references/review-posture.md +53 -0
  352. package/skills/engineering/review-pr/references/round1-depth.md +62 -0
  353. package/skills/engineering/review-pr/references/scripts.md +17 -0
  354. package/skills/engineering/review-pr/references/workflow.md +16 -0
  355. package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
  356. package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
  357. package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
  358. package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
  359. package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
  360. package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
  361. package/skills/engineering/smoke/LICENSE +3 -0
  362. package/skills/engineering/smoke/SKILL.md +131 -0
  363. package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
  364. package/skills/engineering/smoke/references/manifest.md +192 -0
  365. package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
  366. package/skills/fullstack/better-auth/LICENSE +3 -0
  367. package/skills/fullstack/better-auth/SKILL.md +601 -0
  368. package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
  369. package/skills/fullstack/monorepo/LICENSE +3 -0
  370. package/skills/fullstack/monorepo/SKILL.md +465 -0
  371. package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
  372. package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
  373. package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
  374. package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
  375. package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
  376. package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
  377. package/skills/fullstack/prisma-setup/LICENSE +3 -0
  378. package/skills/fullstack/prisma-setup/SKILL.md +180 -0
  379. package/skills/fullstack/prisma-setup/nextjs.md +258 -0
  380. package/skills/fullstack/prisma-setup/turborepo.md +301 -0
  381. package/skills/fullstack/shadcn/LICENSE +3 -0
  382. package/skills/fullstack/shadcn/SKILL.md +119 -0
  383. package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
  384. package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
  385. package/skills/fullstack/shadcn/cli.md +411 -0
  386. package/skills/fullstack/shadcn/customization.md +224 -0
  387. package/skills/fullstack/shadcn/evals/evals.json +90 -0
  388. package/skills/fullstack/shadcn/mcp.md +101 -0
  389. package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
  390. package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
  391. package/skills/fullstack/shadcn/rules/composition.md +195 -0
  392. package/skills/fullstack/shadcn/rules/data-table.md +201 -0
  393. package/skills/fullstack/shadcn/rules/forms.md +255 -0
  394. package/skills/fullstack/shadcn/rules/icons.md +103 -0
  395. package/skills/fullstack/shadcn/rules/styling.md +167 -0
  396. package/skills/fullstack/zod-v4/LICENSE +3 -0
  397. package/skills/fullstack/zod-v4/SKILL.md +287 -0
@@ -0,0 +1,503 @@
1
+ // Build a bounded, content-free evidence packet for an independent review of a
2
+ // combined release. The packet contains paths and hunk coordinates, never patch
3
+ // lines, so a large release does not consume the reviewer's context before the
4
+ // targeted inspection starts.
5
+
6
+ import fs from 'node:fs'
7
+ import path from 'node:path'
8
+ import { execFileSync } from 'node:child_process'
9
+ import { isMainModule } from '../../engineering-runtime/scripts/main-module.mjs'
10
+
11
+ export const PACKET_VERSION = 2
12
+ export const DEFAULT_MAX_BYTES = 64 * 1024
13
+
14
+ const RISK_GROUPS = [
15
+ { id: 'auth', pattern: /(^|\/)(auth|authn|authz|oauth|session|token|identity|iam|policy)(\/|[._-]|$)/i },
16
+ { id: 'money', pattern: /(^|\/)(billing|money|payment|pricing|price|tax|invoice|refund)(\/|[._-]|$)/i },
17
+ { id: 'tenancy', pattern: /(^|\/)(tenant|tenancy|organization|organisation|org-scope|workspace)(\/|[._-]|$)/i },
18
+ { id: 'migration', pattern: /(^|\/)(migrations?|schema|ddl)(\/|[._-]|$)|\.(sql|prisma)$/i },
19
+ ]
20
+
21
+ function git(args, cwd) {
22
+ return execFileSync('git', args, { cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, stdio: ['ignore', 'pipe', 'pipe'] }).trim()
23
+ }
24
+
25
+ function exactSha(rev, cwd) {
26
+ return git(['rev-parse', '--verify', `${rev}^{commit}`], cwd)
27
+ }
28
+
29
+ function exactRevisionSha(revision, label, cwd) {
30
+ try {
31
+ return exactSha(revision, cwd)
32
+ } catch {
33
+ throw new Error(`${label} does not resolve to an exact commit`)
34
+ }
35
+ }
36
+
37
+ function exactRefSha(ref, label, cwd) {
38
+ try {
39
+ git(['check-ref-format', ref], cwd)
40
+ return git(['show-ref', '--verify', '--hash', ref], cwd)
41
+ } catch {
42
+ throw new Error(`${label} does not resolve as an exact ref`)
43
+ }
44
+ }
45
+
46
+ function pinnedSha(value, label, cwd) {
47
+ if (!/^[0-9a-f]{40}$/.test(value || '')) throw new Error(`${label} must be a full 40-character lowercase commit SHA`)
48
+ let resolved
49
+ try {
50
+ resolved = exactSha(value, cwd)
51
+ } catch {
52
+ throw new Error(`${label} ${value} does not resolve to a commit in this repository`)
53
+ }
54
+ if (resolved !== value) throw new Error(`${label} ${value} does not resolve exactly`)
55
+ return resolved
56
+ }
57
+
58
+ function repositoryIdentity(remoteUrl) {
59
+ let host
60
+ let repoPath
61
+ try {
62
+ const parsed = new URL(remoteUrl)
63
+ host = parsed.hostname.toLowerCase()
64
+ repoPath = parsed.pathname
65
+ } catch {
66
+ const scp = /^(?:[^@]+@)?([^:]+):(.+)$/.exec(remoteUrl || '')
67
+ if (!scp) throw new Error('target remote URL has no recognizable repository identity')
68
+ host = scp[1].toLowerCase()
69
+ repoPath = scp[2]
70
+ }
71
+ repoPath = repoPath.replace(/^\/+|\/+$/g, '').replace(/\.git$/, '')
72
+ if (!/^[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)+$/.test(repoPath) || repoPath.split('/').includes('..')) {
73
+ throw new Error('target remote URL has no safe repository path')
74
+ }
75
+ return `${host}/${repoPath}`
76
+ }
77
+
78
+ function authoritativeTarget({ targetRef, targetHeadRev, targetRepository, head, suppliedBase, cwd }) {
79
+ const match = `${targetRef || ''}`.match(/^refs\/remotes\/([^/]+)\/(.+)$/)
80
+ if (!match) throw new Error('target ref must be a fully qualified remote-tracking ref (refs/remotes/<remote>/<branch>)')
81
+ if (match[2] === 'HEAD') throw new Error('target ref must identify an explicit remote branch, not symbolic HEAD')
82
+ const [, remote] = match
83
+ let configuredUrl
84
+ try {
85
+ configuredUrl = git(['remote', 'get-url', '--', remote], cwd)
86
+ } catch {
87
+ throw new Error('target ref remote is not configured in this repository')
88
+ }
89
+ if (repositoryIdentity(configuredUrl) !== targetRepository) throw new Error('target repository mismatch for configured target remote')
90
+
91
+ const refHead = exactRefSha(targetRef, 'target ref', cwd)
92
+ const targetHead = pinnedSha(targetHeadRev, 'target head', cwd)
93
+ if (refHead !== targetHead) throw new Error(`target ref drifted from pinned target head ${targetHead}; resolved ${refHead}`)
94
+
95
+ let actualBase
96
+ try {
97
+ actualBase = git(['merge-base', targetHead, head], cwd)
98
+ } catch {
99
+ throw new Error(`authoritative target and exact head ${head} have no merge-base in this repository`)
100
+ }
101
+ if (actualBase !== suppliedBase) {
102
+ throw new Error(`supplied base ${suppliedBase} does not equal authoritative merge-base ${actualBase} of pinned target and head ${head}`)
103
+ }
104
+ return { targetRef, targetHead, targetRepository }
105
+ }
106
+
107
+ function safeRepoPath(value) {
108
+ if (typeof value !== 'string' || !value || path.isAbsolute(value)) return false
109
+ const parts = value.replaceAll('\\', '/').split('/')
110
+ return !parts.includes('..') && !parts.includes('.') && !parts.includes('') && !value.includes('\0')
111
+ }
112
+
113
+ function parseNameStatusZ(raw) {
114
+ const fields = raw.split('\0')
115
+ if (fields.at(-1) === '') fields.pop()
116
+ const entries = []
117
+ for (let i = 0; i < fields.length;) {
118
+ const status = fields[i++]
119
+ if (!/^[ACDMRTUXB][0-9]*$/.test(status || '')) throw new Error(`unparseable name-status record ${JSON.stringify(status)}`)
120
+ if (status.startsWith('R') || status.startsWith('C')) {
121
+ const oldPath = fields[i++]
122
+ const newPath = fields[i++]
123
+ if (!safeRepoPath(oldPath) || !safeRepoPath(newPath)) throw new Error('unsafe changed path in rename/copy record')
124
+ entries.push({ status, oldPath, newPath })
125
+ } else {
126
+ const changedPath = fields[i++]
127
+ if (!safeRepoPath(changedPath)) throw new Error('unsafe changed path in name-status record')
128
+ entries.push({ status, path: changedPath })
129
+ }
130
+ }
131
+ return entries
132
+ }
133
+
134
+ function pathSides(entry) {
135
+ if (entry.oldPath) return [
136
+ { path: entry.oldPath, side: 'preimage', status: entry.status },
137
+ { path: entry.newPath, side: 'postimage', status: entry.status },
138
+ ]
139
+ return [{ path: entry.path, side: entry.status.startsWith('D') ? 'preimage' : 'postimage', status: entry.status }]
140
+ }
141
+
142
+ function riskIds(changedPath) {
143
+ const ids = RISK_GROUPS.filter((group) => group.pattern.test(changedPath)).map((group) => group.id)
144
+ return ids.length ? ids : []
145
+ }
146
+
147
+ function hunkLocators(base, head, changedPath, side, cwd) {
148
+ const output = git(['diff', '--no-color', '--no-ext-diff', '--no-renames', '--unified=0', `${base}..${head}`, '--', changedPath], cwd)
149
+ const hunks = []
150
+ for (const line of output.split(/\r?\n/)) {
151
+ const match = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/.exec(line)
152
+ if (match) {
153
+ hunks.push({
154
+ oldStart: Number(match[1]), oldLines: Number(match[2] ?? 1),
155
+ newStart: Number(match[3]), newLines: Number(match[4] ?? 1),
156
+ })
157
+ }
158
+ }
159
+ if (hunks.length) return hunks
160
+ const revision = side === 'preimage' ? base : head
161
+ try {
162
+ const lines = git(['show', `${revision}:${changedPath}`], cwd).split(/\r?\n/).length
163
+ return side === 'preimage'
164
+ ? [{ oldStart: 1, oldLines: lines, newStart: 0, newLines: 0 }]
165
+ : [{ oldStart: 0, oldLines: 0, newStart: 1, newLines: lines }]
166
+ } catch { return [] }
167
+ }
168
+
169
+ function validateLocator(locator) {
170
+ if (typeof locator !== 'string' || !locator.trim()) return false
171
+ const value = locator.trim()
172
+ if (/^https:\/\/[^\s]+$/.test(value) || /^#\d+$/.test(value) || /^`[^`]+`$/.test(value)) return true
173
+ if (!/^([^:\s]+\.[A-Za-z][\w-]{0,9})(?::\d+(?:-\d+)?)?$/.test(value)) return false
174
+ return safeRepoPath(value.split(':')[0])
175
+ }
176
+
177
+ function readJsonFile(relative, cwd, label) {
178
+ if (!safeRepoPath(relative)) throw new Error(`${label} path must be a repository-relative file without traversal`)
179
+ let root
180
+ let resolved
181
+ try {
182
+ root = fs.realpathSync(cwd)
183
+ resolved = fs.realpathSync(path.resolve(root, relative))
184
+ } catch {
185
+ throw new Error(`${label} file is unavailable`)
186
+ }
187
+ if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) throw new Error(`${label} path escapes the repository`)
188
+ try {
189
+ return JSON.parse(fs.readFileSync(resolved, 'utf8'))
190
+ } catch {
191
+ throw new Error(`${label} file must contain valid JSON`)
192
+ }
193
+ }
194
+
195
+ function relevantEvidence(input, base, head, cwd) {
196
+ if (!input || input.headSha !== head || !Array.isArray(input.pullRequests)) {
197
+ throw new Error(`evidence headSha must match exact head ${head}`)
198
+ }
199
+ const output = []
200
+ for (const pr of input.pullRequests) {
201
+ if (pr.headSha === base) continue
202
+ let inRange = false
203
+ try {
204
+ inRange = exactSha(pr.headSha, cwd) === pr.headSha
205
+ git(['merge-base', '--is-ancestor', base, pr.headSha], cwd)
206
+ git(['merge-base', '--is-ancestor', pr.headSha, head], cwd)
207
+ } catch {
208
+ inRange = false
209
+ }
210
+ if (!inRange) throw new Error(`PR #${pr.number ?? '?'} evidence headSha is outside the exact range`)
211
+ if (!Number.isInteger(pr.number) || !/^https:\/\/[^\s]+$/.test(pr.url || '') || !Array.isArray(pr.evidence)) {
212
+ throw new Error('malformed per-PR evidence record')
213
+ }
214
+ for (const item of pr.evidence) {
215
+ if (!item || typeof item.kind !== 'string' || typeof item.status !== 'string' || !validateLocator(item.locator)) {
216
+ throw new Error(`unsafe evidence locator for PR #${pr.number}`)
217
+ }
218
+ }
219
+ output.push({
220
+ number: pr.number,
221
+ url: pr.url,
222
+ headSha: pr.headSha,
223
+ })
224
+ }
225
+ return output.sort((a, b) => a.number - b.number)
226
+ }
227
+
228
+ function validateCi(input, head) {
229
+ if (!input || input.headSha !== head) throw new Error(`CI headSha does not match exact head ${head}`)
230
+ if (!Array.isArray(input.jobs)) throw new Error('CI jobs must be an array')
231
+ if (input.jobs.some((job) => !job || typeof job.name !== 'string' || typeof job.status !== 'string')) throw new Error('each CI job requires string name and status fields')
232
+ return { headSha: input.headSha, jobs: input.jobs.map((job) => ({ name: job.name, status: job.status, ...(typeof job.url === 'string' && /^https:\/\/[^\s]+$/.test(job.url) ? { url: job.url } : {}) })) }
233
+ }
234
+
235
+ function packetBytes(packet) {
236
+ return Buffer.byteLength(`${JSON.stringify(packet, null, 2)}\n`)
237
+ }
238
+
239
+ function syncOutputBytes(packet) {
240
+ let previousBytes = -1
241
+ while (packet.truncation.outputBytes !== previousBytes) {
242
+ previousBytes = packet.truncation.outputBytes
243
+ packet.truncation.outputBytes = packetBytes(packet)
244
+ }
245
+ return packet.truncation.outputBytes
246
+ }
247
+
248
+ export function collectPacket({ baseRev, headRev, headRef, targetRef, targetHeadRev, targetRepository, evidence, ci, maxBytes, cwd = process.cwd() }) {
249
+ const base = pinnedSha(baseRev, 'base', cwd)
250
+ const head = pinnedSha(headRev, 'head', cwd)
251
+ const target = authoritativeTarget({ targetRef, targetHeadRev, targetRepository, head, suppliedBase: base, cwd })
252
+ if (headRef && exactRevisionSha(headRef, 'head ref', cwd) !== head) throw new Error(`head ref drifted from requested head ${head}`)
253
+
254
+ const rawNameStatus = execFileSync('git', ['diff', '--name-status', '-z', '-M', '-C', '--find-copies-harder', `${base}..${head}`], {
255
+ cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024,
256
+ })
257
+ const nameStatus = parseNameStatusZ(rawNameStatus)
258
+ const highRisk = new Map(RISK_GROUPS.map((group) => [group.id, []]))
259
+ const highRiskEntryIndexes = new Set()
260
+ nameStatus.forEach((entry, index) => {
261
+ for (const side of pathSides(entry)) {
262
+ for (const id of riskIds(side.path)) {
263
+ highRiskEntryIndexes.add(index)
264
+ highRisk.get(id).push({ ...side, hunks: hunkLocators(base, head, side.path, side.side, cwd) })
265
+ }
266
+ }
267
+ })
268
+
269
+ const packet = {
270
+ version: PACKET_VERSION,
271
+ range: {
272
+ base,
273
+ head,
274
+ expression: `${base}..${head}`,
275
+ targetRef: target.targetRef,
276
+ targetHead: target.targetHead,
277
+ targetRepository: target.targetRepository,
278
+ },
279
+ diff: {
280
+ stat: git(['diff', '--shortstat', `${base}..${head}`], cwd),
281
+ nameStatus: [...nameStatus],
282
+ },
283
+ highRiskGroups: [...highRisk.entries()].filter(([, paths]) => paths.length).map(([id, paths]) => ({ id, paths })),
284
+ pullRequests: relevantEvidence(evidence, base, head, cwd),
285
+ ci: validateCi(ci, head),
286
+ reviewInstructions: [
287
+ 'Inspect every high-risk path through the targeted hunk coordinates before sampling ordinary paths.',
288
+ 'Check cross-PR interaction at shared modules, changed-and-consumed contracts, migrations, and ordering boundaries.',
289
+ 'Return one bounded complete verdict covering every high-risk group and every relevant PR; do not request or reproduce a full patch dump.',
290
+ ],
291
+ truncation: {
292
+ maxBytes,
293
+ totalChangedFiles: nameStatus.length,
294
+ includedNameStatus: nameStatus.length,
295
+ omittedNameStatus: 0,
296
+ omittedHighRiskPaths: 0,
297
+ },
298
+ }
299
+
300
+ packet.truncation.outputBytes = 0
301
+ if (syncOutputBytes(packet) > maxBytes) {
302
+ for (let index = packet.diff.nameStatus.length - 1; index >= 0 && syncOutputBytes(packet) > maxBytes; index--) {
303
+ if (highRiskEntryIndexes.has(index)) continue
304
+ packet.diff.nameStatus.splice(index, 1)
305
+ packet.truncation.omittedNameStatus++
306
+ packet.truncation.includedNameStatus--
307
+ }
308
+ }
309
+ if (syncOutputBytes(packet) > maxBytes) {
310
+ throw new Error(`required metadata exceeds byte bound ${maxBytes}; omittedHighRiskPaths=0, omittedNameStatus=${packet.truncation.omittedNameStatus}`)
311
+ }
312
+ authoritativeTarget({ ...target, targetHeadRev: target.targetHead, head, suppliedBase: base, cwd })
313
+ if (headRef && exactRevisionSha(headRef, 'head ref', cwd) !== head) throw new Error(`head ref drifted from requested head ${head}`)
314
+ return packet
315
+ }
316
+
317
+ const FULL_SHA = /^[0-9a-f]{40}$/
318
+ const SAFE_HOST = /^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/
319
+ const SAFE_REPOSITORY_SEGMENT = /^[A-Za-z0-9._-]+$/
320
+ const MAX_PACKET_BYTES = 16 * 1024 * 1024
321
+
322
+ function displayArgument(value) {
323
+ return JSON.stringify(`${value}`)
324
+ }
325
+
326
+ function safeExactRef(value, prefixes) {
327
+ const prefix = prefixes.find((candidate) => value.startsWith(candidate))
328
+ if (!prefix) return false
329
+ const remainder = value.slice(prefix.length)
330
+ const parts = remainder.split('/')
331
+ return remainder !== '@'
332
+ && !value.includes('..')
333
+ && !value.includes('@{')
334
+ && !value.endsWith('.')
335
+ && !/[\x00-\x20\x7f~^:?*\[\\]/.test(value)
336
+ && parts.every((part) => part && !part.startsWith('.') && !part.endsWith('.lock'))
337
+ }
338
+
339
+ function typedValue(option, value) {
340
+ const fail = (contract) => { throw new Error(`--${option.name} must ${contract}`) }
341
+ if (option.type === 'sha') {
342
+ if (!FULL_SHA.test(value)) fail('be a full 40-character lowercase commit SHA')
343
+ return value
344
+ }
345
+ if (option.type === 'target-ref') {
346
+ if (!safeExactRef(value, ['refs/remotes/'])) fail('be a fully-qualified non-symbolic remote-tracking branch ref')
347
+ const parts = value.slice('refs/remotes/'.length).split('/')
348
+ if (parts.length < 2 || parts.at(-1) === 'HEAD') fail('be a fully-qualified non-symbolic remote-tracking branch ref')
349
+ return value
350
+ }
351
+ if (option.type === 'head-ref') {
352
+ if (FULL_SHA.test(value)) return value
353
+ if (!safeExactRef(value, ['refs/heads/', 'refs/tags/', 'refs/remotes/'])) {
354
+ fail('be a full lowercase SHA or fully-qualified exact refs/heads, refs/tags, or non-symbolic refs/remotes revision')
355
+ }
356
+ if (value.startsWith('refs/remotes/') && value.endsWith('/HEAD')) {
357
+ fail('be a full lowercase SHA or fully-qualified exact refs/heads, refs/tags, or non-symbolic refs/remotes revision')
358
+ }
359
+ return value
360
+ }
361
+ if (option.type === 'repository') {
362
+ const [host, ...repoParts] = value.split('/')
363
+ if (!SAFE_HOST.test(host) || repoParts.length < 2 || repoParts.some((part) => !SAFE_REPOSITORY_SEGMENT.test(part) || part === '.' || part === '..') || /[\x00-\x20\x7f]/.test(value)) {
364
+ fail('be a safe lowercase-host/owner/repository identity')
365
+ }
366
+ return value
367
+ }
368
+ if (option.type === 'repo-path') {
369
+ if (!safeRepoPath(value) || /^[A-Za-z]:[\\/]/.test(value) || /[\x00-\x1f\x7f]/.test(value)) {
370
+ fail('be a repository-relative file path without absolute, traversal, dot, empty, or control segments')
371
+ }
372
+ return value
373
+ }
374
+ if (option.type === 'bytes') {
375
+ if (!/^[1-9][0-9]*$/.test(value)) fail('be a decimal integer from 1 through 16777216')
376
+ const parsed = Number(value)
377
+ if (!Number.isSafeInteger(parsed) || parsed > MAX_PACKET_BYTES) fail('be a decimal integer from 1 through 16777216')
378
+ return parsed
379
+ }
380
+ throw new Error(`internal schema error for --${option.name}`)
381
+ }
382
+
383
+ const COLLECT_OPTIONS = Object.freeze([
384
+ { name: 'base', required: true, metavar: 'sha', type: 'sha', note: 'full lowercase exact commit SHA' },
385
+ { name: 'head', required: true, metavar: 'sha', type: 'sha', note: 'full lowercase exact commit SHA' },
386
+ { name: 'head-ref', required: false, metavar: 'exact-ref-or-sha', type: 'head-ref', note: 'omitting --head-ref disables named-head drift detection; exact head/target/CI/merge-base checks remain' },
387
+ { name: 'target-ref', required: true, metavar: 'refs/remotes/remote/branch', type: 'target-ref', note: 'fully-qualified explicit remote-tracking branch' },
388
+ { name: 'target-head', required: true, metavar: 'sha', type: 'sha', note: 'full lowercase exact commit SHA' },
389
+ { name: 'target-repository', required: true, metavar: 'host/owner/repo', type: 'repository', note: 'normalized safe repository identity' },
390
+ { name: 'evidence', required: true, metavar: 'file', type: 'repo-path', dashValueWithEquals: true, note: "--evidence=<file> is required for a value beginning '-'" },
391
+ { name: 'ci', required: true, metavar: 'file', type: 'repo-path', dashValueWithEquals: true, note: "--ci=<file> is required for a value beginning '-'" },
392
+ { name: 'max-bytes', required: false, metavar: '1..16777216', type: 'bytes', defaultValue: DEFAULT_MAX_BYTES, note: 'bounded decimal integer' },
393
+ ])
394
+
395
+ const COMMAND_SCHEMA = Object.freeze({
396
+ collect: Object.freeze({
397
+ description: 'Emits bounded exact-range JSON metadata for an independent combined-release review.',
398
+ options: COLLECT_OPTIONS,
399
+ }),
400
+ })
401
+
402
+ function usage() {
403
+ const command = COMMAND_SCHEMA.collect
404
+ const synopsis = command.options.map((option) => {
405
+ const token = `--${option.name} <${option.metavar}>`
406
+ return option.required ? token : `[${token}]`
407
+ }).join(' ')
408
+ const rows = command.options.map((option) => {
409
+ const requirement = option.required ? 'required' : `optional; default ${option.defaultValue ?? 'none'}`
410
+ return ` --${option.name} <${option.metavar}> ${requirement}; accepts --${option.name}=<value>; ${option.note}`
411
+ })
412
+ return [
413
+ `review-packet collect ${synopsis}`,
414
+ '',
415
+ command.description,
416
+ ...rows,
417
+ 'When --head-ref is present it must be an exact fully-qualified ref or full lowercase SHA; omitting --head-ref disables named-head drift detection while exact head, target, CI, and merge-base checks remain.',
418
+ 'The packet includes stat/name-status, targeted high-risk hunk coordinates, relevant PR evidence, and exact-head CI. It never emits patch lines.',
419
+ ].join('\n')
420
+ }
421
+
422
+ function optionToken(arg) {
423
+ if (arg === '--') throw new Error('empty option name "--"')
424
+ if (!arg.startsWith('--')) {
425
+ if (arg.startsWith('-') || /^[\u2010-\u2015\u2212]/u.test(arg)) throw new Error('malformed option syntax')
426
+ throw new Error('unexpected positional argument')
427
+ }
428
+ const equals = arg.indexOf('=')
429
+ const name = arg.slice(2, equals === -1 ? undefined : equals)
430
+ if (!/^[a-z][a-z0-9-]*$/.test(name)) throw new Error('malformed option name')
431
+ return { name, inline: equals !== -1, value: equals === -1 ? undefined : arg.slice(equals + 1) }
432
+ }
433
+
434
+ function parseArgs(argv) {
435
+ const [commandName, ...rest] = argv
436
+ const command = COMMAND_SCHEMA[commandName]
437
+ if (!command) throw new Error('unsupported command (expected "collect")')
438
+ const byName = new Map(command.options.map((option) => [option.name, option]))
439
+ const raw = new Map()
440
+
441
+ for (let index = 0; index < rest.length; index++) {
442
+ const token = optionToken(rest[index])
443
+ const option = byName.get(token.name)
444
+ if (!option) throw new Error(`unknown option for command ${displayArgument(commandName)}`)
445
+ if (raw.has(option.name)) throw new Error(`--${option.name} may be supplied only once`)
446
+ let value = token.value
447
+ if (!token.inline) {
448
+ value = rest[index + 1]
449
+ if (typeof value !== 'string' || value === '' || value.startsWith('-')) {
450
+ if (option.dashValueWithEquals && typeof value === 'string' && value.startsWith('-') && !value.startsWith('--')) {
451
+ throw new Error(`--${option.name} requires --${option.name}=<value> for a value beginning '-'`)
452
+ }
453
+ throw new Error(`--${option.name} requires a value`)
454
+ }
455
+ index++
456
+ } else if (value === '') {
457
+ throw new Error(`--${option.name} requires a non-empty value`)
458
+ }
459
+ raw.set(option.name, value)
460
+ }
461
+
462
+ const options = {}
463
+ for (const option of command.options) {
464
+ if (!raw.has(option.name)) {
465
+ if (option.required) throw new Error(`--${option.name} is required`)
466
+ if (option.defaultValue !== undefined) options[option.name] = option.defaultValue
467
+ continue
468
+ }
469
+ options[option.name] = typedValue(option, raw.get(option.name))
470
+ }
471
+ return { command: commandName, options }
472
+ }
473
+
474
+ const USAGE = usage()
475
+
476
+ export function main(argv, cwd = process.cwd()) {
477
+ try {
478
+ if (argv.length === 1 && ['--help', '-h', 'help'].includes(argv[0])) {
479
+ console.log(USAGE)
480
+ return 0
481
+ }
482
+ const { command, options } = parseArgs(argv)
483
+ const packet = collectPacket({
484
+ baseRev: options.base,
485
+ headRev: options.head,
486
+ headRef: options['head-ref'],
487
+ targetRef: options['target-ref'],
488
+ targetHeadRev: options['target-head'],
489
+ targetRepository: options['target-repository'],
490
+ evidence: readJsonFile(options.evidence, cwd, 'evidence'),
491
+ ci: readJsonFile(options.ci, cwd, 'CI'),
492
+ maxBytes: options['max-bytes'],
493
+ cwd,
494
+ })
495
+ console.log(JSON.stringify(packet, null, 2))
496
+ return 0
497
+ } catch (error) {
498
+ console.error(`review-packet: ${error.message}`)
499
+ return 1
500
+ }
501
+ }
502
+
503
+ if (isMainModule(import.meta.url)) process.exit(main(process.argv.slice(2)))