@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,81 @@
1
+ // Shared Cloud Run traffic capture parser for candidate discovery and hygiene.
2
+
3
+ // Cloud Run omits percent for zero-traffic tagged targets. Absence remains null unless the
4
+ // complete observation proves every omitted target has the only remaining share: zero.
5
+ export function parseTraffic(text) {
6
+ const trimmed = String(text ?? '').trim()
7
+ if (trimmed.startsWith('[') || trimmed.startsWith('{')) {
8
+ let parsed
9
+ try {
10
+ parsed = JSON.parse(trimmed)
11
+ } catch {
12
+ return { error: 'traffic read is not parseable as JSON' }
13
+ }
14
+ // Accept either a bare traffic array or a full service describe whose status.traffic is
15
+ // the array — the JSON recipe pipes either shape without a second jq pass.
16
+ if (parsed && !Array.isArray(parsed) && typeof parsed === 'object') {
17
+ const traffic = parsed.status && parsed.status.traffic
18
+ if (Array.isArray(traffic)) parsed = traffic
19
+ else return { error: 'traffic JSON object has no status.traffic array' }
20
+ }
21
+ if (!Array.isArray(parsed)) return { error: 'traffic JSON is not an array of traffic targets' }
22
+ const rows = parsed.map((r) => ({
23
+ tag: str(r && r.tag),
24
+ url: str(r && r.url),
25
+ revision: str(r && (r.revisionName ?? r.revision)),
26
+ percent: r && Object.hasOwn(r, 'percent') ? explicitPercent(r.percent) : null,
27
+ }))
28
+ return { rows: normalizeTrafficPercents(rows) }
29
+ }
30
+ const rows = trimmed
31
+ .split('\n')
32
+ .map((l) => l.replace(/\r$/, ''))
33
+ .filter((l) => l.trim().length > 0)
34
+ .map((l) => {
35
+ // gcloud separates value() columns with TABs; tolerate a multi-space separator too,
36
+ // which is what a human pasting a terminal capture into a file produces.
37
+ const cells = l.includes('\t') ? l.split('\t') : l.split(/\s{2,}/)
38
+ const [tag, url, revision, percent] = cells
39
+ return { tag: str(tag), url: str(url), revision: str(revision), percent: num(percent) }
40
+ })
41
+ return { rows: normalizeTrafficPercents(rows) }
42
+ }
43
+
44
+ // A conservation proof is valid only when every explicit target is a finite percentage in
45
+ // [0, 100] and those explicit targets already account for the full 100%. The remaining
46
+ // omitted rows must then each be zero; any partial, overfull, negative, or invalid observation
47
+ // remains ambiguous.
48
+ export function normalizeTrafficPercents(rows) {
49
+ if (!Array.isArray(rows) || rows.length === 0) return rows
50
+ const omitted = []
51
+ let explicitSum = 0
52
+ for (let i = 0; i < rows.length; i++) {
53
+ const percent = rows[i].percent
54
+ if (percent === null) {
55
+ omitted.push(i)
56
+ continue
57
+ }
58
+ if (!Number.isFinite(percent) || percent < 0 || percent > 100) return rows
59
+ explicitSum += percent
60
+ }
61
+ if (omitted.length === 0 || explicitSum !== 100) return rows
62
+ const normalized = rows.map((row) => ({ ...row }))
63
+ for (const index of omitted) normalized[index].percent = 0
64
+ return normalized
65
+ }
66
+
67
+ const explicitPercent = (value) => {
68
+ const parsed = num(value)
69
+ return parsed === null ? Number.NaN : parsed
70
+ }
71
+
72
+ export const str = (v) => (typeof v === 'string' ? v.trim() : v === undefined || v === null ? '' : String(v).trim())
73
+ // An ABSENT percent is null, not 0. `Number('')` is 0, so the obvious form reads a column the
74
+ // platform never supplied as the one value that means "no users are reaching this" — absent
75
+ // evidence rendered as the passing answer, which is the failure this whole script exists to stop.
76
+ const num = (v) => {
77
+ const s = str(v)
78
+ if (s.length === 0) return null
79
+ const n = Number(s)
80
+ return Number.isFinite(n) ? n : Number.NaN
81
+ }
@@ -0,0 +1,612 @@
1
+ import crypto from 'node:crypto'
2
+ import fs from 'node:fs'
3
+ import path from 'node:path'
4
+ import { TextDecoder } from 'node:util'
5
+ import { parse, version as acornVersion } from '../vendor/acorn.mjs'
6
+ import { inspectIsolatedAdapter } from './isolated-adapter-evaluator.mjs'
7
+
8
+ // Adapters are deliberately small policy modules. The bound prevents an approved path
9
+ // from becoming an unbounded memory/input surface before JavaScript parsing.
10
+ export const CHECKED_ADAPTER_MAX_BYTES = 256 * 1024
11
+ export const CHECKED_ADAPTER_PARSER = Object.freeze({
12
+ name: 'acorn',
13
+ version: acornVersion,
14
+ })
15
+
16
+ const FORBIDDEN_DEPENDENCY = 'e:adapter-dependency-forbidden'
17
+ const FORBIDDEN_CAPABILITY = 'e:adapter-capability-forbidden'
18
+ export const CHECKED_ADAPTER_ALLOWED_GLOBALS = Object.freeze([
19
+ 'AggregateError', 'Array', 'BigInt', 'Boolean', 'Date', 'Error', 'EvalError',
20
+ 'Infinity', 'JSON', 'Math', 'NaN', 'Number', 'Object', 'RangeError',
21
+ 'ReferenceError', 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError',
22
+ 'console', 'undefined',
23
+ ])
24
+ const ALLOWED_GLOBALS = new Set(CHECKED_ADAPTER_ALLOWED_GLOBALS)
25
+ const FORBIDDEN_PROPERTIES = new Set([
26
+ '__proto__',
27
+ '_linkedBinding',
28
+ '__defineGetter__',
29
+ '__defineSetter__',
30
+ '__lookupGetter__',
31
+ '__lookupSetter__',
32
+ 'AsyncFunction',
33
+ 'AsyncGeneratorFunction',
34
+ 'apply',
35
+ 'bind',
36
+ 'binding',
37
+ 'call',
38
+ 'compile',
39
+ 'compileFunction',
40
+ 'compileStreaming',
41
+ 'constructor',
42
+ 'createRequire',
43
+ 'dlopen',
44
+ 'eval',
45
+ 'Function',
46
+ 'GeneratorFunction',
47
+ 'getBuiltinModule',
48
+ 'getOwnPropertyDescriptor',
49
+ 'getOwnPropertyDescriptors',
50
+ 'getOwnPropertyNames',
51
+ 'getOwnPropertySymbols',
52
+ 'getPrototypeOf',
53
+ 'global',
54
+ 'globalThis',
55
+ 'instantiate',
56
+ 'instantiateStreaming',
57
+ 'module',
58
+ 'Module',
59
+ '_load',
60
+ '_resolveFilename',
61
+ 'register',
62
+ 'registerHooks',
63
+ 'runInContext',
64
+ 'runInNewContext',
65
+ 'runInThisContext',
66
+ 'SourceTextModule',
67
+ 'SyntheticModule',
68
+ 'process',
69
+ 'prototype',
70
+ 'require',
71
+ 'setPrototypeOf',
72
+ 'WebAssembly',
73
+ ])
74
+ const UTF8_DECODER = new TextDecoder('utf-8', { fatal: true })
75
+ const MODULE_CACHE = new Map()
76
+
77
+ export class CheckedAdapterError extends Error {
78
+ constructor(code) {
79
+ super(code)
80
+ this.name = 'CheckedAdapterError'
81
+ this.code = code
82
+ }
83
+ }
84
+
85
+ function fail(code) {
86
+ throw new CheckedAdapterError(code)
87
+ }
88
+
89
+ function contained(root, candidate) {
90
+ const relative = path.relative(root, candidate)
91
+ return relative !== '..'
92
+ && !relative.startsWith(`..${path.sep}`)
93
+ && !path.isAbsolute(relative)
94
+ }
95
+
96
+ function canonical(file, code) {
97
+ try {
98
+ return fs.realpathSync(file)
99
+ } catch {
100
+ fail(code)
101
+ }
102
+ }
103
+
104
+ function stat(file, code) {
105
+ try {
106
+ return fs.statSync(file, { bigint: true })
107
+ } catch {
108
+ fail(code)
109
+ }
110
+ }
111
+
112
+ function sameIdentity(left, right) {
113
+ return left.dev === right.dev
114
+ && left.ino === right.ino
115
+ && left.mode === right.mode
116
+ && left.size === right.size
117
+ && left.mtimeNs === right.mtimeNs
118
+ && left.ctimeNs === right.ctimeNs
119
+ }
120
+
121
+ function notifyFilesystemBoundary(hook, phase) {
122
+ if (hook == null) return
123
+ if (typeof hook !== 'function') fail('e:adapter-loader-seam-invalid')
124
+ hook(Object.freeze({ phase }))
125
+ }
126
+
127
+ function openChecked(file) {
128
+ const noFollow = Number.isInteger(fs.constants.O_NOFOLLOW) ? fs.constants.O_NOFOLLOW : 0
129
+ const nonblock = Number.isInteger(fs.constants.O_NONBLOCK) ? fs.constants.O_NONBLOCK : 0
130
+ try {
131
+ return fs.openSync(file, fs.constants.O_RDONLY | noFollow | nonblock)
132
+ } catch {
133
+ fail('e:adapter-unloadable')
134
+ }
135
+ }
136
+
137
+ function readBounded(fd, expectedSize) {
138
+ const size = Number(expectedSize)
139
+ const bytes = Buffer.alloc(size)
140
+ let offset = 0
141
+ while (offset < size) {
142
+ const count = fs.readSync(fd, bytes, offset, size - offset, offset)
143
+ if (count === 0) fail('e:adapter-changed-during-acquisition')
144
+ offset += count
145
+ }
146
+ const extra = Buffer.alloc(1)
147
+ if (fs.readSync(fd, extra, 0, 1, offset) !== 0) fail('e:adapter-changed-during-acquisition')
148
+ return bytes
149
+ }
150
+
151
+ function acquireSource(repositoryRoot, adapterPath, hook) {
152
+ if (typeof repositoryRoot !== 'string' || repositoryRoot.trim() === '') {
153
+ fail('e:repository-root-unreadable')
154
+ }
155
+ if (typeof adapterPath !== 'string' || adapterPath.trim() === '') fail('e:adapter-undeclared')
156
+ if (path.isAbsolute(adapterPath)) fail('e:adapter-outside-repository')
157
+
158
+ const lexicalRoot = path.resolve(repositoryRoot)
159
+ const lexicalAdapter = path.resolve(lexicalRoot, adapterPath)
160
+ if (!contained(lexicalRoot, lexicalAdapter)) fail('e:adapter-outside-repository')
161
+
162
+ const canonicalRoot = canonical(lexicalRoot, 'e:repository-root-unreadable')
163
+ const canonicalAdapter = canonical(lexicalAdapter, 'e:adapter-unloadable')
164
+ if (!contained(canonicalRoot, canonicalAdapter)) fail('e:adapter-outside-repository')
165
+ if (path.extname(canonicalAdapter) !== '.mjs') fail('e:adapter-not-module')
166
+
167
+ const approved = stat(canonicalAdapter, 'e:adapter-unloadable')
168
+ if (!approved.isFile()) fail('e:adapter-not-regular-file')
169
+ if (approved.size > BigInt(CHECKED_ADAPTER_MAX_BYTES)) fail('e:adapter-too-large')
170
+
171
+ notifyFilesystemBoundary(hook, 'before-open')
172
+ const fd = openChecked(canonicalAdapter)
173
+ let bytes
174
+ let opened
175
+ let acquisitionError
176
+ try {
177
+ opened = fs.fstatSync(fd, { bigint: true })
178
+ if (!opened.isFile()) fail('e:adapter-not-regular-file')
179
+ if (opened.size > BigInt(CHECKED_ADAPTER_MAX_BYTES)) fail('e:adapter-too-large')
180
+ if (!sameIdentity(approved, opened)) fail('e:adapter-replaced-before-open')
181
+ notifyFilesystemBoundary(hook, 'after-open')
182
+ const afterOpenPath = stat(canonicalAdapter, 'e:adapter-replaced-after-open')
183
+ if (!sameIdentity(opened, afterOpenPath)) {
184
+ fail('e:adapter-replaced-after-open')
185
+ }
186
+ notifyFilesystemBoundary(hook, 'before-read')
187
+ bytes = readBounded(fd, opened.size)
188
+ const afterRead = fs.fstatSync(fd, { bigint: true })
189
+ if (!sameIdentity(opened, afterRead)) fail('e:adapter-changed-during-acquisition')
190
+ } catch (error) {
191
+ acquisitionError = error instanceof CheckedAdapterError
192
+ ? error
193
+ : new CheckedAdapterError('e:adapter-unloadable')
194
+ } finally {
195
+ try {
196
+ fs.closeSync(fd)
197
+ } catch {
198
+ if (acquisitionError == null) acquisitionError = new CheckedAdapterError('e:adapter-close-failed')
199
+ }
200
+ }
201
+ if (acquisitionError != null) throw acquisitionError
202
+
203
+ const finalCanonical = canonical(lexicalAdapter, 'e:adapter-replaced-after-open')
204
+ if (finalCanonical !== canonicalAdapter || !contained(canonicalRoot, finalCanonical)) {
205
+ fail('e:adapter-replaced-after-open')
206
+ }
207
+ const finalStat = stat(finalCanonical, 'e:adapter-replaced-after-open')
208
+ if (!sameIdentity(opened, finalStat)) fail('e:adapter-replaced-after-open')
209
+
210
+ return Object.freeze({ bytes, canonicalPath: canonicalAdapter })
211
+ }
212
+
213
+ function decodeStrictUtf8(bytes) {
214
+ try {
215
+ return UTF8_DECODER.decode(bytes)
216
+ } catch {
217
+ fail('e:adapter-invalid-utf8')
218
+ }
219
+ }
220
+
221
+ function children(node) {
222
+ const values = []
223
+ for (const [key, value] of Object.entries(node)) {
224
+ if (key === 'start' || key === 'end' || key === 'loc') continue
225
+ if (Array.isArray(value)) values.push(...value)
226
+ else values.push(value)
227
+ }
228
+ return values.filter((value) => value != null && typeof value === 'object')
229
+ }
230
+
231
+ function staticPropertyName(node) {
232
+ if (node == null) return null
233
+ if (node.type === 'Identifier' || node.type === 'PrivateIdentifier') return node.name
234
+ if (node.type === 'Literal' && (typeof node.value === 'string' || typeof node.value === 'number')) {
235
+ return String(node.value)
236
+ }
237
+ return null
238
+ }
239
+
240
+ function childEntries(node) {
241
+ const entries = []
242
+ for (const [key, value] of Object.entries(node)) {
243
+ if (key === 'start' || key === 'end' || key === 'loc') continue
244
+ if (Array.isArray(value)) {
245
+ for (const child of value) {
246
+ if (child != null && typeof child === 'object') entries.push([key, child])
247
+ }
248
+ } else if (value != null && typeof value === 'object') {
249
+ entries.push([key, value])
250
+ }
251
+ }
252
+ return entries
253
+ }
254
+
255
+ function newScope(parent, varScope = false) {
256
+ const scope = { parent, bindings: new Set(), varScope: null }
257
+ scope.varScope = varScope ? scope : parent?.varScope
258
+ return scope
259
+ }
260
+
261
+ function declarePattern(pattern, scope) {
262
+ if (pattern == null) return
263
+ if (pattern.type === 'Identifier') {
264
+ scope.bindings.add(pattern.name)
265
+ return
266
+ }
267
+ if (pattern.type === 'RestElement') {
268
+ declarePattern(pattern.argument, scope)
269
+ return
270
+ }
271
+ if (pattern.type === 'AssignmentPattern') {
272
+ declarePattern(pattern.left, scope)
273
+ return
274
+ }
275
+ if (pattern.type === 'ArrayPattern') {
276
+ for (const element of pattern.elements) declarePattern(element, scope)
277
+ return
278
+ }
279
+ if (pattern.type === 'ObjectPattern') {
280
+ for (const property of pattern.properties) {
281
+ if (property.type === 'RestElement') declarePattern(property.argument, scope)
282
+ else declarePattern(property.value, scope)
283
+ }
284
+ }
285
+ }
286
+
287
+ function buildScopeModel(ast) {
288
+ const scopeAt = new WeakMap()
289
+ const root = newScope(null, true)
290
+
291
+ function scanPatternExpressions(pattern, scope) {
292
+ if (pattern == null) return
293
+ if (pattern.type === 'AssignmentPattern') {
294
+ scanPatternExpressions(pattern.left, scope)
295
+ scan(pattern.right, scope)
296
+ } else if (pattern.type === 'RestElement') {
297
+ scanPatternExpressions(pattern.argument, scope)
298
+ } else if (pattern.type === 'ArrayPattern') {
299
+ for (const element of pattern.elements) scanPatternExpressions(element, scope)
300
+ } else if (pattern.type === 'ObjectPattern') {
301
+ for (const property of pattern.properties) {
302
+ if (property.type === 'RestElement') scanPatternExpressions(property.argument, scope)
303
+ else {
304
+ if (property.computed) scan(property.key, scope)
305
+ scanPatternExpressions(property.value, scope)
306
+ }
307
+ }
308
+ }
309
+ }
310
+
311
+ function scanFunction(node, outerScope) {
312
+ const parameterScope = newScope(outerScope, true)
313
+ scopeAt.set(node, parameterScope)
314
+ if (node.type !== 'ArrowFunctionExpression') parameterScope.bindings.add('arguments')
315
+ if (node.type === 'FunctionExpression' && node.id != null) parameterScope.bindings.add(node.id.name)
316
+ for (const parameter of node.params) declarePattern(parameter, parameterScope)
317
+ for (const parameter of node.params) scanPatternExpressions(parameter, parameterScope)
318
+ if (node.body.type === 'BlockStatement') {
319
+ const bodyScope = newScope(parameterScope, true)
320
+ scopeAt.set(node.body, bodyScope)
321
+ for (const statement of node.body.body) scan(statement, bodyScope)
322
+ } else {
323
+ scan(node.body, parameterScope)
324
+ }
325
+ }
326
+
327
+ function scanClass(node, outerScope) {
328
+ if (node.type === 'ClassDeclaration' && node.id != null) outerScope.bindings.add(node.id.name)
329
+ if (node.superClass != null) scan(node.superClass, outerScope)
330
+ const scope = newScope(outerScope)
331
+ scopeAt.set(node, scope)
332
+ scopeAt.set(node.body, scope)
333
+ if (node.id != null) scope.bindings.add(node.id.name)
334
+ for (const element of node.body.body) scan(element, scope)
335
+ }
336
+
337
+ function scan(node, scope) {
338
+ if (node == null) return
339
+ scopeAt.set(node, scope)
340
+ if (node.type === 'Program') {
341
+ scopeAt.set(node, root)
342
+ for (const statement of node.body) scan(statement, root)
343
+ return
344
+ }
345
+ if (node.type === 'BlockStatement') {
346
+ const block = newScope(scope)
347
+ scopeAt.set(node, block)
348
+ for (const statement of node.body) scan(statement, block)
349
+ return
350
+ }
351
+ if (node.type === 'StaticBlock') {
352
+ const block = newScope(scope, true)
353
+ scopeAt.set(node, block)
354
+ for (const statement of node.body) scan(statement, block)
355
+ return
356
+ }
357
+ if (node.type === 'FunctionDeclaration') {
358
+ if (node.id != null) scope.bindings.add(node.id.name)
359
+ scanFunction(node, scope)
360
+ return
361
+ }
362
+ if (node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression') {
363
+ scanFunction(node, scope)
364
+ return
365
+ }
366
+ if (node.type === 'VariableDeclaration') {
367
+ for (const declaration of node.declarations) {
368
+ const bindingScope = node.kind === 'var' ? scope.varScope : scope
369
+ declarePattern(declaration.id, bindingScope)
370
+ scanPatternExpressions(declaration.id, scope)
371
+ if (declaration.init != null) scan(declaration.init, scope)
372
+ }
373
+ return
374
+ }
375
+ if (node.type === 'CatchClause') {
376
+ const catchScope = newScope(scope)
377
+ scopeAt.set(node, catchScope)
378
+ declarePattern(node.param, catchScope)
379
+ scanPatternExpressions(node.param, catchScope)
380
+ scopeAt.set(node.body, catchScope)
381
+ for (const statement of node.body.body) scan(statement, catchScope)
382
+ return
383
+ }
384
+ if (node.type === 'ClassDeclaration' || node.type === 'ClassExpression') {
385
+ scanClass(node, scope)
386
+ return
387
+ }
388
+ if (node.type === 'ForStatement' || node.type === 'ForInStatement' || node.type === 'ForOfStatement') {
389
+ const loopScope = newScope(scope)
390
+ scopeAt.set(node, loopScope)
391
+ for (const [, child] of childEntries(node)) scan(child, loopScope)
392
+ return
393
+ }
394
+ if (node.type === 'SwitchStatement') {
395
+ const switchScope = newScope(scope)
396
+ scopeAt.set(node, switchScope)
397
+ scan(node.discriminant, switchScope)
398
+ for (const switchCase of node.cases) scan(switchCase, switchScope)
399
+ return
400
+ }
401
+ for (const [, child] of childEntries(node)) scan(child, scope)
402
+ }
403
+
404
+ scan(ast, root)
405
+ return scopeAt
406
+ }
407
+
408
+ function isBound(scope, name) {
409
+ for (let current = scope; current != null; current = current.parent) {
410
+ if (current.bindings.has(name)) return true
411
+ }
412
+ return false
413
+ }
414
+
415
+ function visitBindingPatternExpressions(pattern, scope, visit) {
416
+ if (pattern == null) return
417
+ if (pattern.type === 'AssignmentPattern') {
418
+ visitBindingPatternExpressions(pattern.left, scope, visit)
419
+ visit(pattern.right, scope)
420
+ } else if (pattern.type === 'RestElement') {
421
+ visitBindingPatternExpressions(pattern.argument, scope, visit)
422
+ } else if (pattern.type === 'ArrayPattern') {
423
+ for (const element of pattern.elements) visitBindingPatternExpressions(element, scope, visit)
424
+ } else if (pattern.type === 'ObjectPattern') {
425
+ for (const property of pattern.properties) {
426
+ if (property.type === 'RestElement') visitBindingPatternExpressions(property.argument, scope, visit)
427
+ else {
428
+ if (property.computed) visit(property.key, scope)
429
+ visitBindingPatternExpressions(property.value, scope, visit)
430
+ }
431
+ }
432
+ }
433
+ }
434
+
435
+ function validateUnresolvedReferences(ast) {
436
+ const scopeAt = buildScopeModel(ast)
437
+
438
+ function validateIdentifier(node, scope) {
439
+ if (isBound(scope, node.name) || ALLOWED_GLOBALS.has(node.name)) return
440
+ fail(FORBIDDEN_CAPABILITY)
441
+ }
442
+
443
+ function visitAssignmentTarget(node, scope) {
444
+ if (node.type === 'Identifier') {
445
+ validateIdentifier(node, scope)
446
+ } else if (node.type === 'MemberExpression') {
447
+ visit(node.object, scope)
448
+ if (node.computed) visit(node.property, scope)
449
+ } else if (node.type === 'RestElement') {
450
+ visitAssignmentTarget(node.argument, scope)
451
+ } else if (node.type === 'AssignmentPattern') {
452
+ visitAssignmentTarget(node.left, scope)
453
+ visit(node.right, scope)
454
+ } else if (node.type === 'ArrayPattern') {
455
+ for (const element of node.elements) if (element != null) visitAssignmentTarget(element, scope)
456
+ } else if (node.type === 'ObjectPattern') {
457
+ for (const property of node.properties) {
458
+ if (property.type === 'RestElement') visitAssignmentTarget(property.argument, scope)
459
+ else {
460
+ if (property.computed) visit(property.key, scope)
461
+ visitAssignmentTarget(property.value, scope)
462
+ }
463
+ }
464
+ }
465
+ }
466
+
467
+ function visitFunction(node) {
468
+ const scope = scopeAt.get(node)
469
+ for (const parameter of node.params) visitBindingPatternExpressions(parameter, scope, visit)
470
+ visit(node.body, scope)
471
+ }
472
+
473
+ function visitClass(node, outerScope) {
474
+ if (node.superClass != null) visit(node.superClass, outerScope)
475
+ visit(node.body, scopeAt.get(node))
476
+ }
477
+
478
+ function visit(node, inheritedScope, parent = null) {
479
+ if (node == null) return
480
+ const scope = scopeAt.get(node) ?? inheritedScope
481
+ if (node.type === 'Identifier') {
482
+ validateIdentifier(node, scope)
483
+ return
484
+ }
485
+ if (node.type === 'VariableDeclaration') {
486
+ for (const declaration of node.declarations) {
487
+ visitBindingPatternExpressions(declaration.id, scope, visit)
488
+ if (declaration.init != null) visit(declaration.init, scope, declaration)
489
+ }
490
+ return
491
+ }
492
+ if (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression'
493
+ || node.type === 'ArrowFunctionExpression') {
494
+ visitFunction(node)
495
+ return
496
+ }
497
+ if (node.type === 'ClassDeclaration' || node.type === 'ClassExpression') {
498
+ visitClass(node, inheritedScope)
499
+ return
500
+ }
501
+ if (node.type === 'CatchClause') {
502
+ visitBindingPatternExpressions(node.param, scope, visit)
503
+ visit(node.body, scope, node)
504
+ return
505
+ }
506
+ if (node.type === 'MemberExpression') {
507
+ visit(node.object, scope, node)
508
+ if (node.computed) visit(node.property, scope, node)
509
+ return
510
+ }
511
+ if (node.type === 'Property') {
512
+ if (node.computed) visit(node.key, scope, node)
513
+ visit(node.value, scope, node)
514
+ return
515
+ }
516
+ if (node.type === 'MethodDefinition' || node.type === 'PropertyDefinition') {
517
+ if (node.computed) visit(node.key, scope, node)
518
+ if (node.value != null) visit(node.value, scope, node)
519
+ return
520
+ }
521
+ if (node.type === 'AssignmentExpression') {
522
+ visitAssignmentTarget(node.left, scope)
523
+ visit(node.right, scope, node)
524
+ return
525
+ }
526
+ if (node.type === 'UpdateExpression') {
527
+ visitAssignmentTarget(node.argument, scope)
528
+ return
529
+ }
530
+ if (node.type === 'LabeledStatement') {
531
+ visit(node.body, scope, node)
532
+ return
533
+ }
534
+ if (node.type === 'BreakStatement' || node.type === 'ContinueStatement'
535
+ || node.type === 'PrivateIdentifier' || node.type === 'MetaProperty') return
536
+ if (node.type === 'ExportSpecifier') {
537
+ visit(node.local, scope, node)
538
+ return
539
+ }
540
+ if (node.type === 'ImportSpecifier' || node.type === 'ImportDefaultSpecifier'
541
+ || node.type === 'ImportNamespaceSpecifier') return
542
+ for (const [, child] of childEntries(node)) visit(child, scope, node)
543
+ }
544
+
545
+ visit(ast, scopeAt.get(ast))
546
+ }
547
+
548
+ function validateCapabilityNode(node, parent) {
549
+ if ((node.type === 'MemberExpression' || node.type === 'Property'
550
+ || node.type === 'MethodDefinition' || node.type === 'PropertyDefinition') && node.computed) {
551
+ fail(FORBIDDEN_CAPABILITY)
552
+ }
553
+ if ((node.type === 'MemberExpression' || node.type === 'Property'
554
+ || node.type === 'MethodDefinition' || node.type === 'PropertyDefinition')
555
+ && FORBIDDEN_PROPERTIES.has(staticPropertyName(node.type === 'MemberExpression' ? node.property : node.key))) {
556
+ fail(FORBIDDEN_CAPABILITY)
557
+ }
558
+ }
559
+
560
+ function validateAdapterPolicy(source) {
561
+ let ast
562
+ try {
563
+ ast = parse(source, { ecmaVersion: 'latest', sourceType: 'module' })
564
+ } catch {
565
+ fail('e:adapter-invalid-syntax')
566
+ }
567
+ const pending = [{ node: ast, parent: null }]
568
+ while (pending.length > 0) {
569
+ const { node, parent } = pending.pop()
570
+ if (node.type === 'ImportDeclaration'
571
+ || node.type === 'ImportExpression'
572
+ || node.type === 'ExportAllDeclaration'
573
+ || (node.type === 'ExportNamedDeclaration' && node.source != null)
574
+ || (node.type === 'MetaProperty' && node.meta?.name === 'import')) {
575
+ fail(FORBIDDEN_DEPENDENCY)
576
+ }
577
+ validateCapabilityNode(node, parent)
578
+ pending.push(...children(node).map((child) => ({ node: child, parent: node })))
579
+ }
580
+ validateUnresolvedReferences(ast)
581
+ }
582
+
583
+ async function executeBytes(bytes, source, contentHash) {
584
+ let cached = MODULE_CACHE.get(contentHash)
585
+ if (cached == null) {
586
+ const boundBytes = Buffer.from(bytes)
587
+ cached = inspectIsolatedAdapter({ source, bytes: boundBytes, contentHash })
588
+ .then(({ module }) => module)
589
+ .catch((error) => {
590
+ MODULE_CACHE.delete(contentHash)
591
+ if (typeof error?.code === 'string' && error.code.startsWith('e:adapter-')) fail(error.code)
592
+ fail('e:adapter-execution-failed')
593
+ })
594
+ MODULE_CACHE.set(contentHash, cached)
595
+ }
596
+ try {
597
+ return await cached
598
+ } catch (error) {
599
+ if (error instanceof CheckedAdapterError) throw error
600
+ fail('e:adapter-execution-failed')
601
+ }
602
+ }
603
+
604
+ export async function loadCheckedAdapter({ repositoryRoot, adapterPath, onFilesystemBoundary } = {}) {
605
+ const acquired = acquireSource(repositoryRoot, adapterPath, onFilesystemBoundary)
606
+ const source = decodeStrictUtf8(acquired.bytes)
607
+ validateAdapterPolicy(source)
608
+ const contentHash = crypto.createHash('sha256').update(acquired.bytes).digest('hex')
609
+ notifyFilesystemBoundary(onFilesystemBoundary, 'after-acquire')
610
+ const module = await executeBytes(acquired.bytes, source, contentHash)
611
+ return Object.freeze({ module, canonicalPath: acquired.canonicalPath, contentHash })
612
+ }