@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,522 @@
1
+ #!/usr/bin/env node
2
+
3
+ import crypto from 'node:crypto'
4
+ import fs from 'node:fs'
5
+ import path from 'node:path'
6
+ import { CheckedAdapterError, loadCheckedAdapter } from './checked-adapter-loader.mjs'
7
+ import { isMainModule } from '../../engineering-runtime/scripts/main-module.mjs'
8
+
9
+ export const ADAPTER_EXPORT = 'DURABLE_PROCESSING_ADAPTER'
10
+ export const ADAPTER_SCHEMA_VERSION = 1
11
+ export const RECEIPT_SCHEMA = 'resolve-release/durable-processing-receipt@1'
12
+ export const PAUSE_ORDER = Object.freeze(['database-admission', 'worker-scheduling'])
13
+ export const RESUME_ORDER = Object.freeze([...PAUSE_ORDER].reverse())
14
+
15
+ const CLI_WRITER = Object.freeze({ id: 'resolve-release/durable-processing' })
16
+
17
+ const USAGE = `durable-processing.mjs - drive a repository-declared durable-processing adapter
18
+
19
+ Usage:
20
+ durable-processing.mjs preflight --declaration <release.json>
21
+ durable-processing.mjs status --declaration <release.json> [options]
22
+ durable-processing.mjs pause --declaration <release.json> [options]
23
+ durable-processing.mjs quiescence --declaration <release.json> [options]
24
+ durable-processing.mjs resume --declaration <release.json> [options]
25
+ durable-processing.mjs down --declaration <release.json> [options]
26
+ durable-processing.mjs up --declaration <release.json> [options]
27
+ durable-processing.mjs unwind-pre-shift --declaration <release.json> [options]
28
+
29
+ The declaration must decide durableProcessing.present as true or false. A true
30
+ declaration names an ES module exporting DURABLE_PROCESSING_ADAPTER. The adapter
31
+ contains typed data and an execute(request) function; declarations contain no shell
32
+ commands, credentials, timestamps, or platform-specific snippets. The adapter is a
33
+ dependency-free strict-UTF-8 .mjs file no larger than 256 KiB. Execution receives
34
+ only the declared config and isolated snapshot-backed readTextFile/writeTextFile operations;
35
+ validated final write intents commit in the host only after receipt validation. The host stages
36
+ same-directory final and original files, validates every target identity immediately before the
37
+ first deterministic replacement, and restores replaced targets in reverse if a later operation
38
+ fails. Rollback failure is reported as ambiguous with affected targets. This recoverable
39
+ transaction cannot provide cross-file kernel atomicity or guaranteed recovery from process crash
40
+ or power loss during the replacement window.`
41
+
42
+ const isObject = (value) => value != null && typeof value === 'object' && !Array.isArray(value)
43
+ const nonEmptyString = (value) => typeof value === 'string' && value.trim() !== ''
44
+ const safeGeneration = (value) => Number.isSafeInteger(value) && value >= 0
45
+ const isoTimestamp = (value) => nonEmptyString(value) && Number.isFinite(Date.parse(value))
46
+ const exactArray = (actual, expected) => Array.isArray(actual)
47
+ && actual.length === expected.length
48
+ && actual.every((value, index) => value === expected[index])
49
+
50
+ function written(state, fields = {}) {
51
+ return {
52
+ schema: RECEIPT_SCHEMA,
53
+ state,
54
+ ...fields,
55
+ writer: CLI_WRITER,
56
+ writtenAt: new Date().toISOString(),
57
+ }
58
+ }
59
+
60
+ function refused(...failed) {
61
+ return written('refused', { failed: [...new Set(failed)] })
62
+ }
63
+
64
+ function readJson(file, failedId) {
65
+ try {
66
+ const value = JSON.parse(fs.readFileSync(file, 'utf8'))
67
+ return { value }
68
+ } catch (error) {
69
+ return { error: refused(failedId), cause: error }
70
+ }
71
+ }
72
+
73
+ function validateAdapter(adapter) {
74
+ const failed = []
75
+ if (!isObject(adapter) || adapter.schemaVersion !== ADAPTER_SCHEMA_VERSION) {
76
+ failed.push('e:invalid-adapter-schema-version')
77
+ }
78
+ if (!nonEmptyString(adapter?.writerId)) failed.push('e:invalid-writer-id')
79
+ if (!exactArray(adapter?.pauseOrder, PAUSE_ORDER)) failed.push('e:invalid-pause-order')
80
+ if (!exactArray(adapter?.resumeOrder, RESUME_ORDER)) failed.push('e:resume-not-exact-reverse')
81
+ const quiescence = adapter?.quiescence
82
+ if (
83
+ !isObject(quiescence)
84
+ || !nonEmptyString(quiescence.component)
85
+ || !nonEmptyString(quiescence.blockerField)
86
+ || typeof quiescence.readyValue !== 'number'
87
+ || !Number.isSafeInteger(quiescence.timeoutMs)
88
+ || quiescence.timeoutMs <= 0
89
+ ) failed.push('e:invalid-quiescence')
90
+ if (adapter?.evidenceSchema !== RECEIPT_SCHEMA) failed.push('e:invalid-evidence-schema')
91
+ if (typeof adapter?.execute !== 'function') failed.push('e:adapter-not-executable')
92
+ return failed
93
+ }
94
+
95
+ export async function loadDeclaration(file, { onFilesystemBoundary } = {}) {
96
+ const read = readJson(file, 'e:declaration-unreadable')
97
+ if (read.error) return read
98
+ const declaration = read.value
99
+ if (!isObject(declaration) || declaration.schemaVersion !== 1) {
100
+ return { error: refused('e:invalid-declaration-schema') }
101
+ }
102
+ if (!nonEmptyString(declaration.repositoryRoot)) {
103
+ return { error: refused('e:repository-root-undeclared') }
104
+ }
105
+ const durable = declaration.durableProcessing
106
+ if (!isObject(durable) || typeof durable.present !== 'boolean') {
107
+ return { error: refused('e:durable-processing-undecided') }
108
+ }
109
+ if (durable.config != null && !isObject(durable.config)) {
110
+ return { error: refused('e:adapter-config-invalid') }
111
+ }
112
+ if (durable.present === false) return { declaration, durable }
113
+ if (!nonEmptyString(durable.adapter)) return { error: refused('e:adapter-undeclared') }
114
+
115
+ const declarationDir = path.dirname(path.resolve(file))
116
+ const repositoryRoot = path.isAbsolute(declaration.repositoryRoot)
117
+ ? path.resolve(declaration.repositoryRoot)
118
+ : path.resolve(declarationDir, declaration.repositoryRoot)
119
+ let loaded
120
+ try {
121
+ loaded = await loadCheckedAdapter({
122
+ repositoryRoot,
123
+ adapterPath: durable.adapter,
124
+ onFilesystemBoundary,
125
+ })
126
+ } catch (error) {
127
+ const code = error instanceof CheckedAdapterError ? error.code : 'e:adapter-unloadable'
128
+ return { error: refused(code) }
129
+ }
130
+ const adapter = loaded.module[ADAPTER_EXPORT]
131
+ const failed = validateAdapter(adapter)
132
+ if (failed.length) return { error: refused(...failed) }
133
+ return { declaration, durable, adapter, adapterPath: loaded.canonicalPath }
134
+ }
135
+
136
+ export async function preflight(file) {
137
+ const loaded = await loadDeclaration(file)
138
+ if (loaded.error) return loaded.error
139
+ if (loaded.durable.present === false) return written('ready', { present: false })
140
+ const { adapter, adapterPath } = loaded
141
+ return written('ready', {
142
+ present: true,
143
+ adapter: adapterPath,
144
+ adapterSchemaVersion: adapter.schemaVersion,
145
+ pauseOrder: [...adapter.pauseOrder],
146
+ resumeOrder: [...adapter.resumeOrder],
147
+ quiescence: { ...adapter.quiescence },
148
+ evidenceSchema: adapter.evidenceSchema,
149
+ adapterWriter: { id: adapter.writerId },
150
+ })
151
+ }
152
+
153
+ export function normalizePlatformOutput(output) {
154
+ if (!isObject(output)) return { error: 'e:platform-output-malformed' }
155
+ const hasPayload = Object.hasOwn(output, 'payload')
156
+ const hasText = Object.hasOwn(output, 'text')
157
+ if (hasPayload === hasText) return { error: 'e:platform-output-ambiguous' }
158
+ if (hasPayload) {
159
+ if (!isObject(output.payload)) return { error: 'e:platform-output-malformed' }
160
+ return { receipt: output.payload }
161
+ }
162
+ if (!nonEmptyString(output.text)) return { error: 'e:platform-output-malformed' }
163
+ try {
164
+ const receipt = JSON.parse(output.text)
165
+ return isObject(receipt) ? { receipt } : { error: 'e:platform-output-malformed' }
166
+ } catch {
167
+ return { error: 'e:platform-output-malformed' }
168
+ }
169
+ }
170
+
171
+ export function validateReceipt(receipt, request, writerId) {
172
+ const required = [
173
+ 'schema', 'state', 'operation', 'component', 'requestId', 'writer', 'writtenAt',
174
+ 'generation', 'fence', 'observed',
175
+ ]
176
+ if (!isObject(receipt) || required.some((field) => receipt[field] == null)) {
177
+ return ['e:receipt-partial']
178
+ }
179
+ const failed = []
180
+ if (receipt.schema !== RECEIPT_SCHEMA) failed.push('e:receipt-schema-mismatch')
181
+ if (!['observed', 'applied', 'refused'].includes(receipt.state)) failed.push('e:receipt-state-invalid')
182
+ if (receipt.operation !== request.operation) failed.push('e:receipt-operation-mismatch')
183
+ if (receipt.component !== request.component) failed.push('e:receipt-component-mismatch')
184
+ if (receipt.requestId !== request.requestId) failed.push('e:receipt-request-mismatch')
185
+ if (!isObject(receipt.writer) || receipt.writer.id !== writerId) failed.push('e:receipt-writer-mismatch')
186
+ if (!isoTimestamp(receipt.writtenAt)) failed.push('e:receipt-timestamp-invalid')
187
+ if (!safeGeneration(receipt.generation)) failed.push('e:receipt-generation-invalid')
188
+ if (!nonEmptyString(receipt.fence)) failed.push('e:receipt-fence-invalid')
189
+ if (!isObject(receipt.observed)) failed.push('e:receipt-observation-invalid')
190
+ if (receipt.state === 'refused' && (
191
+ !Array.isArray(receipt.failed) || receipt.failed.length === 0 || receipt.failed.some((id) => !nonEmptyString(id))
192
+ )) failed.push('e:receipt-partial')
193
+ if (receipt.state !== 'refused') {
194
+ if (['pause', 'resume'].includes(request.operation) && receipt.state !== 'applied') {
195
+ failed.push('e:receipt-effect-unproven')
196
+ }
197
+ if (request.operation === 'pause' && receipt.observed?.paused !== true) failed.push('e:receipt-effect-unproven')
198
+ if (request.operation === 'resume' && receipt.observed?.resumed !== true) failed.push('e:receipt-effect-unproven')
199
+ if (['status', 'quiescence'].includes(request.operation) && receipt.state !== 'observed') {
200
+ failed.push('e:receipt-observation-unproven')
201
+ }
202
+ if (request.operation === 'quiescence'
203
+ && (!Number.isSafeInteger(receipt.observed?.blockers) || receipt.observed.blockers < 0)) {
204
+ failed.push('e:receipt-observation-incomplete')
205
+ }
206
+ if (request.operation === 'status' && (
207
+ typeof receipt.observed?.admissionPaused !== 'boolean'
208
+ || typeof receipt.observed?.schedulingPaused !== 'boolean'
209
+ || !Number.isSafeInteger(receipt.observed?.blockers)
210
+ || receipt.observed.blockers < 0
211
+ || !isObject(receipt.observed?.traffic)
212
+ )) failed.push('e:receipt-observation-incomplete')
213
+ }
214
+ return failed
215
+ }
216
+
217
+ export async function executeOperation(file, operation, options) {
218
+ const loaded = await loadDeclaration(file)
219
+ if (loaded.error) return loaded.error
220
+ if (loaded.durable.present === false) return refused('e:durable-processing-not-present')
221
+ const request = Object.freeze({
222
+ schemaVersion: 1,
223
+ operation,
224
+ component: options.component,
225
+ requestId: options.requestId ?? crypto.randomUUID(),
226
+ expectedGeneration: options.generation,
227
+ expectedFence: options.fence,
228
+ servingRevision: options.servingRevision,
229
+ })
230
+ if (!nonEmptyString(request.component) || !nonEmptyString(request.requestId)) {
231
+ return refused('e:request-invalid')
232
+ }
233
+ let isolated
234
+ try {
235
+ isolated = await loaded.adapter.execute(
236
+ request,
237
+ Object.freeze({ ...(loaded.durable.config ?? {}) }),
238
+ )
239
+ } catch (error) {
240
+ const code = typeof error?.code === 'string' && error.code.startsWith('e:adapter-')
241
+ ? error.code
242
+ : 'e:adapter-execution-failed'
243
+ return refused(code)
244
+ }
245
+ if (!isObject(isolated) || !Object.hasOwn(isolated, 'output')
246
+ || typeof isolated.commit !== 'function') {
247
+ return refused('e:adapter-execution-failed')
248
+ }
249
+ const normalized = normalizePlatformOutput(isolated.output)
250
+ if (normalized.error) return refused(normalized.error)
251
+ const failed = validateReceipt(normalized.receipt, request, loaded.adapter.writerId)
252
+ if (failed.length) return refused(...failed)
253
+ try {
254
+ isolated.commit()
255
+ } catch (error) {
256
+ const code = typeof error?.code === 'string' && error.code.startsWith('e:adapter-')
257
+ ? error.code
258
+ : 'e:adapter-file-changed'
259
+ if (error?.ambiguousEffects === true || error?.committedEffects === true) {
260
+ return written('refused', {
261
+ failed: [code],
262
+ effects: error.ambiguousEffects === true ? 'ambiguous' : 'committed',
263
+ affectedTargets: Array.isArray(error.affectedTargets) ? [...error.affectedTargets] : [],
264
+ })
265
+ }
266
+ return refused(code)
267
+ }
268
+ return normalized.receipt
269
+ }
270
+
271
+ function sequenceReceipt(state, fields) {
272
+ return written(state, fields)
273
+ }
274
+
275
+ function isSuccess(receipt) {
276
+ return receipt.state === 'observed' || receipt.state === 'applied'
277
+ }
278
+
279
+ function identityFrom(receipt) {
280
+ return { generation: receipt.generation, fence: receipt.fence }
281
+ }
282
+
283
+ async function status(file) {
284
+ return executeOperation(file, 'status', { component: 'durable-state' })
285
+ }
286
+
287
+ export async function down(file, options) {
288
+ const release = readJson(options.releaseState, 'e:release-state-unreadable')
289
+ if (release.error) return release.error
290
+ if (release.value?.skill !== 'resolve-release' || release.value?.step !== 'expose') {
291
+ return refused('e:expose-step-not-recorded')
292
+ }
293
+ const initial = await status(file)
294
+ if (!isSuccess(initial)) return initial
295
+ const receipts = []
296
+ let identity = identityFrom(initial)
297
+ for (const component of PAUSE_ORDER) {
298
+ const receipt = await executeOperation(file, 'pause', { component, ...identity })
299
+ receipts.push(receipt)
300
+ if (!isSuccess(receipt)) return sequenceReceipt('blocked', {
301
+ failed: receipt.failed,
302
+ pausedAt: receipts.find((item) => isSuccess(item))?.writtenAt,
303
+ pauseOrder: [...PAUSE_ORDER],
304
+ receipts,
305
+ proof: receipt,
306
+ })
307
+ identity = identityFrom(receipt)
308
+ }
309
+ const loaded = await loadDeclaration(file)
310
+ if (loaded.error) return loaded.error
311
+ const deadline = Date.now() + loaded.adapter.quiescence.timeoutMs
312
+ let proof
313
+ do {
314
+ proof = await executeOperation(file, 'quiescence', {
315
+ component: 'durable-state',
316
+ ...identity,
317
+ })
318
+ receipts.push(proof)
319
+ if (!isSuccess(proof)) return sequenceReceipt('blocked', {
320
+ failed: proof.failed,
321
+ pausedAt: receipts[0]?.writtenAt,
322
+ pauseOrder: [...PAUSE_ORDER],
323
+ receipts,
324
+ })
325
+ if (proof.observed.blockers === 0) break
326
+ if (Date.now() < deadline) await new Promise((resolve) => setTimeout(resolve, 25))
327
+ } while (Date.now() < deadline)
328
+ if (proof.observed.blockers !== 0) {
329
+ return sequenceReceipt('blocked', {
330
+ failed: ['e:quiescence-timeout'],
331
+ pausedAt: receipts[0]?.writtenAt,
332
+ pauseOrder: [...PAUSE_ORDER],
333
+ receipts,
334
+ proof,
335
+ })
336
+ }
337
+ return sequenceReceipt('ready-to-shift', {
338
+ pausedAt: receipts[0]?.writtenAt,
339
+ pauseOrder: [...PAUSE_ORDER],
340
+ receipts,
341
+ proof,
342
+ shiftFence: identityFrom(proof),
343
+ })
344
+ }
345
+
346
+ function trafficMatches(traffic, expected) {
347
+ return isObject(traffic)
348
+ && traffic.incumbentRevision === expected.incumbentRevision
349
+ && traffic.incumbentPercent === expected.incumbentPercent
350
+ && traffic.candidateRevision === expected.candidateRevision
351
+ && traffic.candidatePercent === expected.candidatePercent
352
+ }
353
+
354
+ async function resumeSequence(file, options, initialStatus) {
355
+ const receipts = [initialStatus]
356
+ let identity = identityFrom(initialStatus)
357
+ if (
358
+ !safeGeneration(options.generation)
359
+ || !nonEmptyString(options.fence)
360
+ || options.generation !== identity.generation
361
+ || options.fence !== identity.fence
362
+ ) {
363
+ return sequenceReceipt('ambiguous', {
364
+ failed: ['e:serving-generation-mismatch'],
365
+ receipts,
366
+ })
367
+ }
368
+ for (const component of RESUME_ORDER) {
369
+ const receipt = await executeOperation(file, 'resume', {
370
+ component,
371
+ ...identity,
372
+ servingRevision: options.servingRevision,
373
+ })
374
+ receipts.push(receipt)
375
+ if (!isSuccess(receipt)) {
376
+ return sequenceReceipt('ambiguous', { failed: receipt.failed, receipts })
377
+ }
378
+ identity = identityFrom(receipt)
379
+ }
380
+ const confirmation = await status(file)
381
+ receipts.push(confirmation)
382
+ if (
383
+ !isSuccess(confirmation)
384
+ || confirmation.observed.schedulingPaused !== false
385
+ || confirmation.observed.admissionPaused !== false
386
+ ) {
387
+ return sequenceReceipt('ambiguous', {
388
+ failed: ['e:processing-restoration-ambiguous'],
389
+ receipts,
390
+ })
391
+ }
392
+ return sequenceReceipt('restored', {
393
+ resumedAt: receipts.find((receipt) => receipt.operation === 'resume')?.writtenAt,
394
+ resumeOrder: [...RESUME_ORDER],
395
+ receipts,
396
+ servingRevisionAtResume: options.servingRevision,
397
+ restorationFence: identityFrom(confirmation),
398
+ })
399
+ }
400
+
401
+ export async function up(file, options) {
402
+ const observed = await status(file)
403
+ if (!isSuccess(observed)) return observed
404
+ const traffic = observed.observed.traffic
405
+ const identitiesDeclared = nonEmptyString(options.incumbentRevision)
406
+ && nonEmptyString(options.candidateRevision)
407
+ && options.incumbentRevision !== options.candidateRevision
408
+ const namedCandidateServes = options.servingRevision === options.candidateRevision
409
+ && trafficMatches(traffic, {
410
+ incumbentRevision: options.incumbentRevision,
411
+ incumbentPercent: 0,
412
+ candidateRevision: options.candidateRevision,
413
+ candidatePercent: 100,
414
+ })
415
+ const namedIncumbentServes = options.servingRevision === options.incumbentRevision
416
+ && trafficMatches(traffic, {
417
+ incumbentRevision: options.incumbentRevision,
418
+ incumbentPercent: 100,
419
+ candidateRevision: options.candidateRevision,
420
+ candidatePercent: 0,
421
+ })
422
+ if (!identitiesDeclared || (!namedCandidateServes && !namedIncumbentServes)) {
423
+ return sequenceReceipt('ambiguous', {
424
+ failed: ['e:serving-revision-unproven'],
425
+ trafficProof: traffic,
426
+ receipts: [observed],
427
+ })
428
+ }
429
+ const resumed = await resumeSequence(file, options, observed)
430
+ return resumed.state === 'restored'
431
+ ? {
432
+ ...resumed,
433
+ trafficProof: traffic,
434
+ incumbentRevision: options.incumbentRevision,
435
+ candidateRevision: options.candidateRevision,
436
+ }
437
+ : resumed
438
+ }
439
+
440
+ export async function unwindPreShift(file, options) {
441
+ const observed = await status(file)
442
+ if (!isSuccess(observed)) return observed
443
+ const trafficProof = observed.observed.traffic
444
+ const expected = {
445
+ incumbentRevision: options.incumbentRevision,
446
+ incumbentPercent: 100,
447
+ candidateRevision: options.candidateRevision,
448
+ candidatePercent: 0,
449
+ }
450
+ if (!trafficMatches(trafficProof, expected)) {
451
+ return sequenceReceipt('ambiguous', {
452
+ failed: ['e:traffic-split-ambiguous'],
453
+ trafficProof,
454
+ receipts: [observed],
455
+ })
456
+ }
457
+ const resumed = await resumeSequence(file, {
458
+ ...options,
459
+ servingRevision: options.incumbentRevision,
460
+ }, observed)
461
+ if (resumed.state !== 'restored') return resumed
462
+ return { ...resumed, state: 'unwound', trafficProof }
463
+ }
464
+
465
+ function parseArgs(argv) {
466
+ const positional = []
467
+ const options = {}
468
+ const unknown = []
469
+ for (let index = 0; index < argv.length; index++) {
470
+ const value = argv[index]
471
+ if (value === '--help' || value === '-h') options.help = true
472
+ else if (value === '--declaration') options.declaration = argv[++index]
473
+ else if (value === '--component') options.component = argv[++index]
474
+ else if (value === '--generation') options.generation = Number(argv[++index])
475
+ else if (value === '--fence') options.fence = argv[++index]
476
+ else if (value === '--serving-revision') options.servingRevision = argv[++index]
477
+ else if (value === '--request-id') options.requestId = argv[++index]
478
+ else if (value === '--release-state') options.releaseState = argv[++index]
479
+ else if (value === '--incumbent-revision') options.incumbentRevision = argv[++index]
480
+ else if (value === '--candidate-revision') options.candidateRevision = argv[++index]
481
+ else if (value.startsWith('--')) unknown.push(value)
482
+ else positional.push(value)
483
+ }
484
+ return { positional, options, unknown }
485
+ }
486
+
487
+ export async function main(argv) {
488
+ const { positional, options, unknown } = parseArgs(argv)
489
+ if (options.help || positional[0] === 'help') {
490
+ console.log(USAGE)
491
+ return 0
492
+ }
493
+ if (unknown.length) {
494
+ console.log(JSON.stringify(refused('e:unknown-option')))
495
+ return 2
496
+ }
497
+ if (!nonEmptyString(options.declaration)) {
498
+ console.log(JSON.stringify(refused('e:declaration-required')))
499
+ return 2
500
+ }
501
+ const command = positional[0]
502
+ const operations = ['status', 'pause', 'quiescence', 'resume']
503
+ const sequences = ['down', 'up', 'unwind-pre-shift']
504
+ if (command !== 'preflight' && !operations.includes(command) && !sequences.includes(command)) {
505
+ console.log(JSON.stringify(refused('e:unknown-command')))
506
+ return 2
507
+ }
508
+ let receipt
509
+ if (command === 'preflight') receipt = await preflight(options.declaration)
510
+ else if (operations.includes(command)) receipt = await executeOperation(options.declaration, command, options)
511
+ else if (command === 'down') receipt = await down(options.declaration, options)
512
+ else if (command === 'up') receipt = await up(options.declaration, options)
513
+ else receipt = await unwindPreShift(options.declaration, options)
514
+ console.log(JSON.stringify(receipt))
515
+ return ['ready', 'observed', 'applied', 'ready-to-shift', 'restored', 'unwound'].includes(receipt.state)
516
+ ? 0
517
+ : 1
518
+ }
519
+
520
+ if (isMainModule(import.meta.url)) {
521
+ main(process.argv.slice(2)).then((code) => { process.exitCode = code })
522
+ }