@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,395 @@
1
+ #!/usr/bin/env node
2
+ // sandbox-selftest — MECHANIZES references/sandboxed-testing.md. Mutation testing
3
+ // (flip a predicate, delete a bound, revert a guard, then confirm the suite
4
+ // notices) must never run against this skill's live working tree — a corruption
5
+ // you forget to revert ships. (Named incident: during the #387 audit, a mutation
6
+ // test in place left `PRUNE_AFTER_DAYS = 6000` behind in an uncommitted tree; had
7
+ // it survived, catalog pruning would have shipped disabled for ~16 years.)
8
+ //
9
+ // The safe method is a scratch copy — but a bare copy of resolve-issues does not
10
+ // run clean: some tests import `../../review-pr/scripts/...` (a bare copy has no
11
+ // sibling `review-pr` beside it — the flat distribution model installs
12
+ // this skill AS a sibling of review-pr and engineering-runtime, not standalone), and some tests walk up
13
+ // to the repo root that a scratch copy has no parent for. So the recipe is: copy
14
+ // the skill to a temp dir, symlink the sibling skills beside it, run the suites,
15
+ // and confirm the ONLY failures are the KNOWN repo-root-dependent tests — the ones
16
+ // that read files above the copy (a repo-root fixture, or repo-root SKILL.md /
17
+ // CLAUDE.md) and therefore cannot pass in any isolated sandbox.
18
+ //
19
+ // The baseline is NOT a magic count ("total minus one"): the set of repo-root
20
+ // tests grows and shrinks as the suite evolves, so the check is set-based, matched
21
+ // by test name + file. Every non-baseline verdict NAMES which test moved:
22
+ // - a failure OUTSIDE the known set → a real regression;
23
+ // - a known-set test that unexpectedly PASSES → it no longer depends on repo
24
+ // root; the environment changed, and the fix is to remove it from the set.
25
+ //
26
+ // node sandbox-selftest.mjs # sandbox resolve-issues, run, verify
27
+ // node sandbox-selftest.mjs --skill review-pr # a different skill under test
28
+ // node sandbox-selftest.mjs --keep # leave the sandbox on disk for debugging
29
+ // node sandbox-selftest.mjs --help # usage + exit 0
30
+ //
31
+ // NEVER mutates the real skill tree: every file operation lands in an OS temp dir
32
+ // (`mkdtempSync`), the siblings are symlinked read-only-in-intent, and the sandbox
33
+ // is removed on exit unless `--keep`.
34
+ //
35
+ // EXIT CODES:
36
+ // 0 baseline held — exactly the known repo-root-dependent tests failed, nothing else
37
+ // 1 anomaly — a real regression, or a known-set test that moved (named either way)
38
+ // 2 usage error, or setup failure (skill not found, no tests ran)
39
+
40
+ import fs from 'node:fs'
41
+ import os from 'node:os'
42
+ import path from 'node:path'
43
+ import { fileURLToPath } from 'node:url'
44
+ import { execFileSync } from 'node:child_process'
45
+ import { isMainModule } from '../../engineering-runtime/scripts/main-module.mjs'
46
+
47
+ // The sibling skills symlinked beside the copy. `review-pr` is the one actually
48
+ // imported by the suite (`scripts/fix-rounds.mjs` → `../../review-pr/scripts/...`);
49
+ // the rest round out parity with the skills resolve-issues orchestrates
50
+ // (SKILL.md frontmatter `dependencies:`), in case a broader sandbox session
51
+ // touches them too.
52
+ export const SIBLINGS = ['review-pr', 'implement-and-pr', 'ensure-coverage', 'e2e-test', 'smoke']
53
+
54
+ // `engineering-runtime` is a support package and is NOT optional: every CLI script in this family
55
+ // imports `../../engineering-runtime/scripts/main-module.mjs` for its main-guard (#718/#446), so a
56
+ // sandbox without it fails at module load in every suite at once. Listed separately from SIBLINGS
57
+ // because it supplies runtime support rather than an orchestrated user workflow.
58
+ export const SHARED_RUNTIME = 'engineering-runtime'
59
+
60
+ // The tests that CANNOT pass in an isolated sandbox because they resolve paths
61
+ // ABOVE the copy — a repo-root fixture, or repo-root SKILL.md/CLAUDE.md/run-state.md.
62
+ // The baseline is "total minus this set", verified by FILE + a distinctive
63
+ // name fragment (`nameIncludes`), robust to reordering AND to a suffix tweak.
64
+ // Keyed by skill; a skill with no repo-root-dependent tests has an empty set (any
65
+ // failure is then a real regression). Adding/removing a repo-root test here is a
66
+ // one-line diff, and this script flags a member that stops failing so the set
67
+ // can't silently drift out of date (the drift that made "total minus one" wrong —
68
+ // see references/sandboxed-testing.md).
69
+ //
70
+ // The fragments deliberately omit the obsolete `units[].`-prefixed field token that
71
+ // some of these artifact-audit test names carry: this file is a real gate script,
72
+ // and artifact-audit's own delete-safety test asserts NO gate script references
73
+ // that deleted field. A fragment without that token is still distinctive enough to
74
+ // identify the test uniquely without re-introducing a false reader.
75
+ //
76
+ // resolve-issues, as of #406:
77
+ // - run-state-review6: cause 3 — reads ../../../../docs/evidence/809-runtime-smoke.json.
78
+ // - 5 × artifact-audit (#379/#397): cause 4 — walk ../../../.. to read repo-root
79
+ // skills/SKILL.md, CLAUDE.md, run-state.md, and to scan the whole skills/ tree.
80
+ export const KNOWN_FAILING_TESTS = {
81
+ 'resolve-issues': [
82
+ {
83
+ file: 'run-state-review6.test.mjs',
84
+ nameIncludes: 'one public table-driven executor runs every literal 42-cell case',
85
+ },
86
+ { file: 'artifact-audit.test.mjs', nameIncludes: 'has no machine reader anywhere in the real gate scripts' },
87
+ { file: 'artifact-audit.test.mjs', nameIncludes: 'none of the three SKILL.md files mandate' },
88
+ { file: 'artifact-audit.test.mjs', nameIncludes: 'run-state.md no longer documents' },
89
+ { file: 'artifact-audit.test.mjs', nameIncludes: 'resolve-issues SKILL.md instructs only unit statuses the code accepts' },
90
+ { file: 'artifact-audit.test.mjs', nameIncludes: 'CLAUDE.md records which CI machinery is unwired in this repo' },
91
+ ],
92
+ }
93
+
94
+ export function knownFailingFor(skill) {
95
+ return KNOWN_FAILING_TESTS[skill] ?? []
96
+ }
97
+
98
+ // ---- setupSandbox: the copy + symlink layout (pure fs, unit-testable) ----
99
+
100
+ // Copy <repoRoot>/skills/engineering/<skill> into <parentDir>/<skill> as a REAL
101
+ // copy, then symlink each sibling skill beside it (skipping the skill under test
102
+ // itself, so a `--skill review-pr` run does not shadow its own copy) plus the shared
103
+ // runtime package. Returns the copy dir and the symlinks created. Throws (→ exit 2) if the
104
+ // skill is not found, or if engineering-runtime is missing — see SHARED_RUNTIME.
105
+ export function setupSandbox({ repoRoot, skill = 'resolve-issues', parentDir, siblings = SIBLINGS }) {
106
+ const engineeringDir = path.join(repoRoot, 'skills', 'engineering')
107
+ const src = path.join(engineeringDir, skill)
108
+ if (!fs.existsSync(src)) {
109
+ throw new Error(`sandbox-selftest: skill "${skill}" not found at ${src}`)
110
+ }
111
+
112
+ const skillCopyDir = path.join(parentDir, skill)
113
+ // cpSync recursive makes an independent copy — a mutation in the copy never
114
+ // reaches the source. (Symlinks inside the source, if any, are copied as links.)
115
+ fs.cpSync(src, skillCopyDir, { recursive: true })
116
+
117
+ const symlinks = []
118
+ for (const name of siblings) {
119
+ if (name === skill) continue // never symlink a sibling over the copy under test
120
+ const target = path.join(engineeringDir, name)
121
+ if (!fs.existsSync(target)) continue // a missing optional sibling is not fatal
122
+ const link = path.join(parentDir, name)
123
+ fs.symlinkSync(target, link)
124
+ symlinks.push({ name, target, link })
125
+ }
126
+
127
+ // Hard-failed rather than skipped like an optional sibling: without it EVERY suite dies at import
128
+ // and the run reports a meaningless zero.
129
+ const runtimeTarget = path.join(engineeringDir, SHARED_RUNTIME)
130
+ if (!fs.existsSync(runtimeTarget)) {
131
+ throw new Error(`sandbox-selftest: shared ${SHARED_RUNTIME} not found at ${runtimeTarget} — every main-guard imports it`)
132
+ }
133
+ const runtimeLink = path.join(parentDir, SHARED_RUNTIME)
134
+ fs.symlinkSync(runtimeTarget, runtimeLink)
135
+ symlinks.push({ name: SHARED_RUNTIME, target: runtimeTarget, link: runtimeLink })
136
+
137
+ return { skillCopyDir, symlinks }
138
+ }
139
+
140
+ // ---- parseTapSummary: pass/total/failing-test extraction (pure, unit-testable) ----
141
+
142
+ // Parse the tail of `node --test --test-reporter=tap` output into
143
+ // { tests, pass, fail, failingTests }. The summary block is the authoritative
144
+ // count (`# tests N`, `# pass N`, `# fail N`); each failing test is captured as
145
+ // { name, file } — the name from its `not ok N - <name>` line (TAP directive
146
+ // suffixes stripped), the file basename from the `location:` field of its YAML
147
+ // diagnostic block (null if absent). Throws if no summary block is present — a run
148
+ // that produced no counts is a setup failure, not a zero-pass result.
149
+ export function parseTapSummary(output) {
150
+ const num = (label) => {
151
+ const m = output.match(new RegExp(`^# ${label} (\\d+)$`, 'm'))
152
+ return m ? Number(m[1]) : null
153
+ }
154
+ const tests = num('tests')
155
+ const pass = num('pass')
156
+ const fail = num('fail')
157
+ if (tests === null || pass === null || fail === null) {
158
+ throw new Error('sandbox-selftest: no TAP summary (# tests/# pass/# fail) found in `node --test` output')
159
+ }
160
+
161
+ const failingTests = []
162
+ let pending = null
163
+ const flush = () => {
164
+ if (pending) failingTests.push(pending)
165
+ pending = null
166
+ }
167
+ for (const line of output.split('\n')) {
168
+ const nok = /^not ok \d+ - (.+)$/.exec(line)
169
+ if (nok) {
170
+ flush()
171
+ pending = { name: nok[1].replace(/\s+#\s+(TODO|SKIP).*$/i, '').trim(), file: null }
172
+ continue
173
+ }
174
+ if (pending) {
175
+ // location: '/abs/path/to/file.test.mjs:LINE:COL' → take the basename.
176
+ const loc = /^\s*location:\s*'(.+):\d+:\d+'\s*$/.exec(line)
177
+ if (loc) {
178
+ pending.file = path.basename(loc[1])
179
+ flush()
180
+ continue
181
+ }
182
+ if (/^\s*\.\.\.\s*$/.test(line)) flush() // YAML block ended with no location
183
+ }
184
+ }
185
+ flush()
186
+
187
+ return { tests, pass, fail, failingTests }
188
+ }
189
+
190
+ // ---- evaluateBaseline: the set-based verdict (pure, unit-testable) ----
191
+
192
+ // A known member matches a failing test when the failing test's name contains the
193
+ // member's distinctive fragment and the files agree (or the failing test carried
194
+ // no parseable file).
195
+ function matches(known, failing) {
196
+ return failing.name.includes(known.nameIncludes) && (failing.file == null || known.file === failing.file)
197
+ }
198
+
199
+ // Given combined { tests, pass, failingTests } and the skill's knownSet of
200
+ // repo-root-dependent tests, decide whether the sandbox baseline held: the ONLY
201
+ // failures are exactly the known set. Every non-baseline verdict names the
202
+ // offending test. kind ∈ 'baseline' | 'regression' | 'moved' | 'empty'.
203
+ export function evaluateBaseline({ tests, pass, failingTests = [], knownSet = [] }) {
204
+ if (tests === 0) {
205
+ return {
206
+ ok: false,
207
+ kind: 'empty',
208
+ message:
209
+ 'no tests ran in the sandbox — the copy or the suites did not execute. This is a setup failure, not a baseline result.',
210
+ }
211
+ }
212
+
213
+ const unexpected = failingTests.filter((f) => !knownSet.some((k) => matches(k, f)))
214
+ const missing = knownSet.filter((k) => !failingTests.some((f) => matches(k, f)))
215
+
216
+ if (unexpected.length > 0) {
217
+ let message =
218
+ `REGRESSION: ${pass}/${tests} passing, and ${unexpected.length} failure(s) are NOT in the known ` +
219
+ `repo-root-dependent set — a real regression, not a sandbox artifact:\n - ` +
220
+ unexpected.map((f) => `${f.name}${f.file ? ` (${f.file})` : ''}`).join('\n - ')
221
+ if (missing.length > 0) {
222
+ message +=
223
+ `\nAlso, ${missing.length} known-set test(s) unexpectedly PASSED — the known set is also out of date ` +
224
+ `(they no longer depend on repo root; remove them from KNOWN_FAILING_TESTS):\n - ` +
225
+ missing.map((k) => `${k.nameIncludes} (${k.file})`).join('\n - ')
226
+ }
227
+ return { ok: false, kind: 'regression', message }
228
+ }
229
+
230
+ if (missing.length > 0) {
231
+ return {
232
+ ok: false,
233
+ kind: 'moved',
234
+ message:
235
+ `A KNOWN TEST MOVED: ${pass}/${tests} passing, no unexpected failures, but ${missing.length} test(s) ` +
236
+ `that were expected to fail in a sandbox PASSED:\n - ` +
237
+ missing.map((k) => `${k.nameIncludes} (${k.file})`).join('\n - ') +
238
+ `\nThis test no longer depends on repo root — remove it from the known set ` +
239
+ `(KNOWN_FAILING_TESTS in sandbox-selftest.mjs). Until then the baseline can't be trusted.`,
240
+ }
241
+ }
242
+
243
+ return {
244
+ ok: true,
245
+ kind: 'baseline',
246
+ message:
247
+ `baseline held: ${pass}/${tests} passing. Exactly the ${knownSet.length} known repo-root-dependent ` +
248
+ `test(s) failed, nothing else.`,
249
+ }
250
+ }
251
+
252
+ // ---- suite execution (the multi-minute part; not unit-tested) ----
253
+
254
+ // Enumerate the *.test.mjs files under scripts/ and workflows/ of the copy.
255
+ function discoverTestFiles(skillCopyDir) {
256
+ const files = []
257
+ for (const sub of ['scripts', 'workflows']) {
258
+ const dir = path.join(skillCopyDir, sub)
259
+ if (!fs.existsSync(dir)) continue
260
+ for (const f of fs.readdirSync(dir)) {
261
+ if (f.endsWith('.test.mjs')) files.push(path.join(dir, f))
262
+ }
263
+ }
264
+ return files.sort()
265
+ }
266
+
267
+ // Run `node --test --test-reporter=tap <files>` from the copy dir and return the
268
+ // captured stdout (the suite is EXPECTED to exit non-zero: the known repo-root
269
+ // tests fail). cwd is the copy so repo-root-relative walks resolve — and fail —
270
+ // exactly as in a real sandbox.
271
+ function runSuites(skillCopyDir, testFiles) {
272
+ let stdout = ''
273
+ try {
274
+ stdout = execFileSync('node', ['--test', '--test-reporter=tap', ...testFiles], {
275
+ cwd: skillCopyDir,
276
+ encoding: 'utf8',
277
+ maxBuffer: 64 * 1024 * 1024,
278
+ })
279
+ } catch (err) {
280
+ // node --test exits non-zero when any test fails — that is the expected path.
281
+ stdout = err.stdout ?? ''
282
+ }
283
+ return stdout
284
+ }
285
+
286
+ // ---- CLI ----
287
+
288
+ const USAGE = `sandbox-selftest — mechanizes references/sandboxed-testing.md.
289
+
290
+ Copies a skill (default resolve-issues) into an OS temp dir, symlinks the sibling
291
+ skills beside it, runs its scripts/*.test.mjs + workflows/*.test.mjs suites, and
292
+ verifies the ONLY failures are the known repo-root-dependent tests — the ones that
293
+ read files above the copy (a repo-root fixture, or repo-root SKILL.md/CLAUDE.md)
294
+ and so cannot pass in any isolated sandbox. The baseline is the suite TOTAL MINUS
295
+ that named set (not a magic count): a failure outside the set is a real regression,
296
+ and a known-set test that starts passing is flagged so the set stays honest. On
297
+ any mismatch it names which test moved. The real skill tree is never mutated — all
298
+ work happens in the temp dir.
299
+
300
+ Usage:
301
+ node sandbox-selftest.mjs [--skill <name>] [--keep]
302
+ node sandbox-selftest.mjs --help
303
+
304
+ Options:
305
+ --skill <name> skill under test (default: resolve-issues)
306
+ --keep leave the temp sandbox on disk (prints its path) for debugging
307
+ --help, -h print this usage and exit 0
308
+
309
+ Exit codes:
310
+ 0 baseline held: exactly the known repo-root-dependent tests failed, nothing else
311
+ 1 anomaly: a real regression, or a known-set test that moved (named either way)
312
+ 2 usage error, or setup failure (skill not found / no tests ran)`
313
+
314
+ export function parseArgs(argv) {
315
+ const f = { skill: 'resolve-issues' }
316
+ for (let i = 0; i < argv.length; i++) {
317
+ const a = argv[i]
318
+ if (a === '--help' || a === '-h' || a === 'help') f.help = true
319
+ else if (a === '--keep') f.keep = true
320
+ else if (a === '--skill') {
321
+ f.skill = argv[++i]
322
+ if (!f.skill) f.unknown = '--skill (missing value)'
323
+ } else if (a.startsWith('--skill=')) f.skill = a.slice('--skill='.length)
324
+ else f.unknown = a
325
+ }
326
+ return f
327
+ }
328
+
329
+ // repoRoot is four levels up from this script: <root>/skills/engineering/resolve-issues/scripts.
330
+ export function repoRootFromScript(scriptPath) {
331
+ return path.resolve(path.dirname(scriptPath), '..', '..', '..', '..')
332
+ }
333
+
334
+ export function runCli(argv, { scriptPath } = {}) {
335
+ const f = parseArgs(argv)
336
+ if (f.help) {
337
+ console.log(USAGE)
338
+ return 0
339
+ }
340
+ if (f.unknown) {
341
+ console.error(`sandbox-selftest: unknown argument "${f.unknown}"\n\n${USAGE}`)
342
+ return 2
343
+ }
344
+
345
+ const repoRoot = repoRootFromScript(scriptPath ?? fileURLToPath(import.meta.url))
346
+ const parentDir = fs.mkdtempSync(path.join(os.tmpdir(), 'sandbox-selftest-'))
347
+ const cleanup = () => {
348
+ if (f.keep) console.error(`sandbox-selftest: --keep set, sandbox retained at ${parentDir}`)
349
+ else fs.rmSync(parentDir, { recursive: true, force: true })
350
+ }
351
+
352
+ let setup
353
+ try {
354
+ setup = setupSandbox({ repoRoot, skill: f.skill, parentDir })
355
+ } catch (err) {
356
+ console.error(err.message)
357
+ cleanup()
358
+ return 2
359
+ }
360
+
361
+ console.error(`sandbox-selftest: sandbox at ${setup.skillCopyDir}`)
362
+ console.error(`sandbox-selftest: symlinked siblings — ${setup.symlinks.map((s) => s.name).join(', ')}`)
363
+
364
+ const testFiles = discoverTestFiles(setup.skillCopyDir)
365
+ if (testFiles.length === 0) {
366
+ console.error(`sandbox-selftest: no *.test.mjs files found under ${f.skill}/{scripts,workflows}`)
367
+ cleanup()
368
+ return 2
369
+ }
370
+
371
+ const output = runSuites(setup.skillCopyDir, testFiles)
372
+
373
+ let summary
374
+ try {
375
+ summary = parseTapSummary(output)
376
+ } catch (err) {
377
+ console.error(err.message)
378
+ cleanup()
379
+ return 2
380
+ }
381
+
382
+ const verdict = evaluateBaseline({ ...summary, knownSet: knownFailingFor(f.skill) })
383
+ cleanup()
384
+
385
+ if (verdict.ok) {
386
+ console.error(`sandbox-selftest: ✓ ${verdict.message}`)
387
+ return 0
388
+ }
389
+ console.error(`sandbox-selftest: ✗ ${verdict.message}`)
390
+ return verdict.kind === 'empty' ? 2 : 1
391
+ }
392
+
393
+ if (isMainModule(import.meta.url)) {
394
+ process.exit(runCli(process.argv.slice(2), { scriptPath: fileURLToPath(import.meta.url) }))
395
+ }