@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,280 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawnSync } from 'node:child_process';
4
+ import { readFileSync, statSync } from 'node:fs';
5
+ import { emitKeypressEvents } from 'node:readline';
6
+ import { dirname, join, resolve } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+
9
+ import { isMainModule } from '../../engineering/engineering-runtime/scripts/main-module.mjs';
10
+
11
+ // The coordinator is one command rendered into two transports: the private checkout and the
12
+ // unpacked @1aboveio/skills package. Both defaults below are anchored on this file's own location,
13
+ // so neither the private repository root nor the process working directory is ever assumed. A
14
+ // caller that lays the payload out differently injects both paths instead (see runCli's flags).
15
+ const SCRIPT_DIR = dirname(fileURLToPath(import.meta.url));
16
+ const DISTRIBUTION_DIR = resolve(SCRIPT_DIR, '..');
17
+ const DEFAULT_RECIPES_PATH = join(DISTRIBUTION_DIR, 'generated', 'recipes.json');
18
+ const DEFAULT_LOCAL_ROOT = resolve(DISTRIBUTION_DIR, '../..');
19
+ const NATIVE_ADD_SOURCE = /^(npx skills@\S+ add )(\S+)(?= )/;
20
+ // Which generated command form to execute, most specific first. The private-checkout render emits the
21
+ // Git transports (`https`/`ssh`); the public-npm render emits a single `local` command because the
22
+ // first-party payload ships inside the package and is never fetched. The enum is not overloaded to
23
+ // carry the channel — a `local` command means a local path source, which is what it is.
24
+ const COMMAND_TRANSPORTS = ['local', 'https'];
25
+ // Groups that exist only as an implementation dependency of the selectable ones. Exported because it
26
+ // is the single source of truth for the rule that spans every public-facing surface: a support group
27
+ // is never presented as something a user picks. The picker, `list`, the plan and the generated
28
+ // package README all derive their answer from here rather than each re-listing the ids.
29
+ export const SUPPORT_GROUPS = new Set(['harness-runtime']);
30
+ const ACTIONS = new Set(['install', 'update']);
31
+
32
+ export const selectorTerminalControl = Object.freeze({
33
+ enter: '\x1b[?1049h\x1b[?25l',
34
+ redraw: '\x1b[2J\x1b[H',
35
+ exit: '\x1b[?25h\x1b[?1049l',
36
+ });
37
+
38
+ export function resolveBundleTransport({ recipesPath, localRoot } = {}) {
39
+ return {
40
+ recipesPath: recipesPath ? resolve(recipesPath) : DEFAULT_RECIPES_PATH,
41
+ localRoot: localRoot ? resolve(localRoot) : DEFAULT_LOCAL_ROOT,
42
+ };
43
+ }
44
+
45
+ function readRecipes(recipesPath) {
46
+ let contents;
47
+ try {
48
+ contents = readFileSync(recipesPath, 'utf8');
49
+ } catch {
50
+ throw new Error(`Bundle recipes not found: ${recipesPath}`);
51
+ }
52
+ return JSON.parse(contents);
53
+ }
54
+
55
+ function assertLocalRoot(localRoot) {
56
+ if (!statSync(localRoot, { throwIfNoEntry: false })?.isDirectory()) {
57
+ throw new Error(`Bundle local source root is not a directory: ${localRoot}`);
58
+ }
59
+ return localRoot;
60
+ }
61
+
62
+ export function bundleCatalog(transport = {}) {
63
+ return readRecipes(resolveBundleTransport(transport).recipesPath).groups
64
+ .filter((group) => !SUPPORT_GROUPS.has(group.id))
65
+ .map((group) => ({
66
+ id: group.id,
67
+ displayName: group.displayName,
68
+ members: group.install.steps.flatMap((step) => step.members),
69
+ }));
70
+ }
71
+
72
+ function shellArgument(value) {
73
+ return `'${value.replaceAll("'", String.raw`'\''`)}'`;
74
+ }
75
+
76
+ // Point the recipe's native `add` step at the local first-party payload, whatever source the
77
+ // generated recipe declares. Matching the native step rather than the private repository name is
78
+ // what makes one planning implementation serve both transports: a public recipe that never mentions
79
+ // the private repository relocates the same way, and no reachable path can leave a private fetch in
80
+ // the plan. (This file ships inside the public package, so it must not name that repository either.)
81
+ function localFirstPartyCommand(command, localRoot, groupId) {
82
+ if (!NATIVE_ADD_SOURCE.test(command)) {
83
+ throw new Error(`Bundle ${groupId} source first-party has no native add step to relocate: ${command}`);
84
+ }
85
+ return command.replace(NATIVE_ADD_SOURCE, (_match, prefix) => `${prefix}${shellArgument(localRoot)}`);
86
+ }
87
+
88
+ export function planBundleCommands(action, groupIds, { yes = false, ...transport } = {}) {
89
+ if (!ACTIONS.has(action)) throw new Error(`Unsupported bundle action: ${action}`);
90
+ const { recipesPath, localRoot } = resolveBundleTransport(transport);
91
+ const recipes = readRecipes(recipesPath);
92
+ assertLocalRoot(localRoot);
93
+ const groups = new Map(recipes.groups.map((group) => [group.id, group]));
94
+ const commands = [];
95
+ const seen = new Set();
96
+
97
+ for (const groupId of groupIds) {
98
+ const group = groups.get(groupId);
99
+ if (!group || SUPPORT_GROUPS.has(groupId)) throw new Error(`Unknown bundle: ${groupId}`);
100
+ for (const step of group[action].steps) {
101
+ const generated = COMMAND_TRANSPORTS
102
+ .map((transport) => step.commands.find((candidate) => candidate.transport === transport))
103
+ .find(Boolean);
104
+ if (!generated) throw new Error(`Bundle ${groupId} has no supported command for source ${step.sourceId}`);
105
+ let command = step.sourceId === 'first-party'
106
+ ? localFirstPartyCommand(generated.command, localRoot, groupId)
107
+ : generated.command;
108
+ if (yes) command += ' --yes';
109
+ if (seen.has(command)) continue;
110
+ seen.add(command);
111
+ commands.push({
112
+ groupId,
113
+ groupName: group.displayName,
114
+ sourceId: step.sourceId,
115
+ command,
116
+ cwd: localRoot,
117
+ failureMessage: step.onFailure.message,
118
+ });
119
+ }
120
+ }
121
+ return commands;
122
+ }
123
+
124
+ export function runBundleCommands(commands, {
125
+ execute = (command, cwd) => spawnSync('/bin/bash', ['-lc', command], { cwd, stdio: 'inherit' }),
126
+ stdout = process.stdout,
127
+ stderr = process.stderr,
128
+ } = {}) {
129
+ for (const planned of commands) {
130
+ stdout.write(`\nInstalling ${planned.groupName} (${planned.sourceId})...\n`);
131
+ const result = execute(planned.command, planned.cwd);
132
+ if (result.status !== 0) {
133
+ stderr.write(`${planned.failureMessage}\n`);
134
+ return Number.isInteger(result.status) ? result.status : 1;
135
+ }
136
+ }
137
+ return 0;
138
+ }
139
+
140
+ function usage() {
141
+ return `Usage:
142
+ node skills/distribution/scripts/bundles.mjs list [--recipes <path>]
143
+ node skills/distribution/scripts/bundles.mjs <install|update> [--group <id> ... | --all] [--dry-run] [--yes] [--recipes <path>] [--local-root <path>]
144
+ `;
145
+ }
146
+
147
+ function parseArgs(args) {
148
+ const [action = 'install', ...options] = args;
149
+ const parsed = { action, groupIds: [], all: false, dryRun: false, yes: false };
150
+ for (let index = 0; index < options.length; index += 1) {
151
+ const option = options[index];
152
+ if (option === '--group') {
153
+ const value = options[index + 1];
154
+ if (!value) throw new Error('--group requires a bundle id');
155
+ parsed.groupIds.push(...value.split(',').map((id) => id.trim()).filter(Boolean));
156
+ index += 1;
157
+ } else if (option === '--recipes' || option === '--local-root') {
158
+ const value = options[index + 1];
159
+ if (!value) throw new Error(`${option} requires a path`);
160
+ parsed[option === '--recipes' ? 'recipesPath' : 'localRoot'] = value;
161
+ index += 1;
162
+ } else if (option === '--all') parsed.all = true;
163
+ else if (option === '--dry-run') parsed.dryRun = true;
164
+ else if (option === '--yes') parsed.yes = true;
165
+ else throw new Error(`Unknown option: ${option}`);
166
+ }
167
+ if (parsed.all && parsed.groupIds.length > 0) throw new Error('Use either --all or --group, not both');
168
+ return parsed;
169
+ }
170
+
171
+ function printCatalog(stdout = process.stdout, catalog = bundleCatalog()) {
172
+ for (const bundle of catalog) {
173
+ stdout.write(`${bundle.displayName} (${bundle.id})\n`);
174
+ }
175
+ }
176
+
177
+ export function updateSelection(state, key, itemCount) {
178
+ const selected = new Set(state.selected);
179
+ if (key === 'up') return { cursor: (state.cursor - 1 + itemCount) % itemCount, selected };
180
+ if (key === 'down') return { cursor: (state.cursor + 1) % itemCount, selected };
181
+ if (key === 'space') {
182
+ if (selected.has(state.cursor)) selected.delete(state.cursor);
183
+ else selected.add(state.cursor);
184
+ }
185
+ return { cursor: state.cursor, selected };
186
+ }
187
+
188
+ export function renderSelector(catalog, state) {
189
+ const rows = catalog.map((bundle, index) => {
190
+ const pointer = index === state.cursor ? '>' : ' ';
191
+ const mark = state.selected.has(index) ? '[x]' : '[ ]';
192
+ const count = bundle.members.length;
193
+ return `${pointer} ${mark} ${bundle.displayName} ${count} skill${count === 1 ? '' : 's'}`;
194
+ });
195
+ const focused = catalog[state.cursor];
196
+ return [
197
+ 'Select skill bundles',
198
+ ...rows,
199
+ '',
200
+ `Includes: ${focused.members.join(', ')}`,
201
+ '',
202
+ 'up/down move space select enter confirm',
203
+ ].join('\n');
204
+ }
205
+
206
+ async function promptForGroups(catalog, { stdin = process.stdin, stdout = process.stdout } = {}) {
207
+ if (!stdin.isTTY || !stdout.isTTY) {
208
+ throw new Error('Choose bundles with --group <id> or --all when no interactive terminal is available');
209
+ }
210
+ emitKeypressEvents(stdin);
211
+ stdin.setRawMode(true);
212
+ stdin.resume();
213
+ let state = { cursor: 0, selected: new Set() };
214
+
215
+ const draw = () => {
216
+ stdout.write(`${selectorTerminalControl.redraw}${renderSelector(catalog, state)}\n`);
217
+ };
218
+ stdout.write(selectorTerminalControl.enter);
219
+ draw();
220
+
221
+ return new Promise((resolveSelection, rejectSelection) => {
222
+ const finish = (error) => {
223
+ stdin.off('keypress', onKeypress);
224
+ stdin.setRawMode(false);
225
+ stdin.pause();
226
+ stdout.write(selectorTerminalControl.exit);
227
+ if (error) rejectSelection(error);
228
+ else resolveSelection([...state.selected]
229
+ .sort((left, right) => left - right)
230
+ .map((index) => catalog[index].id));
231
+ };
232
+ const onKeypress = (_input, key = {}) => {
233
+ if (key.ctrl && key.name === 'c') return finish(new Error('Bundle selection cancelled'));
234
+ if (key.name === 'return' || key.name === 'enter') return finish();
235
+ const name = key.name === 'space' ? 'space' : key.name;
236
+ if (!['up', 'down', 'space'].includes(name)) return undefined;
237
+ state = updateSelection(state, name, catalog.length);
238
+ draw();
239
+ return undefined;
240
+ };
241
+ stdin.on('keypress', onKeypress);
242
+ });
243
+ }
244
+
245
+ export async function runCli(args) {
246
+ try {
247
+ const parsed = parseArgs(args);
248
+ const transport = { recipesPath: parsed.recipesPath, localRoot: parsed.localRoot };
249
+ if (parsed.action === 'list') {
250
+ printCatalog(process.stdout, bundleCatalog(transport));
251
+ return 0;
252
+ }
253
+ if (!ACTIONS.has(parsed.action)) {
254
+ process.stderr.write(usage());
255
+ return 2;
256
+ }
257
+ const catalog = bundleCatalog(transport);
258
+ const groupIds = parsed.all
259
+ ? catalog.map((bundle) => bundle.id)
260
+ : parsed.groupIds.length > 0
261
+ ? parsed.groupIds
262
+ : await promptForGroups(catalog);
263
+ if (groupIds.length === 0) throw new Error('Select at least one bundle');
264
+ const commands = planBundleCommands(parsed.action, groupIds, { ...transport, yes: parsed.yes });
265
+ if (parsed.dryRun) {
266
+ for (const planned of commands) {
267
+ process.stdout.write(`\n${planned.groupName} / ${planned.sourceId}\n${planned.command}\n`);
268
+ }
269
+ return 0;
270
+ }
271
+ return runBundleCommands(commands);
272
+ } catch (error) {
273
+ process.stderr.write(`${error.message}\n`);
274
+ return 2;
275
+ }
276
+ }
277
+
278
+ if (isMainModule(import.meta.url)) {
279
+ process.exitCode = await runCli(process.argv.slice(2));
280
+ }
@@ -0,0 +1,80 @@
1
+ // The one ESM main-module guard every skill script in this repo uses.
2
+ //
3
+ // Not a style preference — the hand-written versions of this three-line check had two opposite
4
+ // silent failure modes in production, and both shipped:
5
+ //
6
+ // #718 `import.meta.url === pathToFileURL(process.argv[1]).href`
7
+ // Node resolves `import.meta.url` to the REAL path; `argv[1]` keeps whatever the caller
8
+ // typed. A skills install is a symlink farm (`~/.claude/skills/<skill>` → the checkout),
9
+ // so through the install path the two never match: the CLI does not run and node exits 0.
10
+ // `coverage-ledger.mjs` shipped this and recorded a false pass in the wild
11
+ // (a consumer product repo: epic #352, unit #379, PR #384) on a gate whose only job is to
12
+ // say no. Fails OPEN, invisibly — "passed" and "never ran" are byte-identical evidence.
13
+ //
14
+ // #446 `fs.realpathSync(process.argv[1]) === …`, unguarded.
15
+ // `node -` sets `argv[1]` to the literal string `"-"` — truthy, so the usual
16
+ // `process.argv[1] &&` prefix does not save it — and realpath throws ENOENT at MODULE
17
+ // LOAD, before a line of the module's own code runs. The module cannot be imported by
18
+ // anything that does not launch it as a file. Fails CLOSED, at load.
19
+ //
20
+ // So the contract has exactly two obligations, one per failure mode:
21
+ // 1. realpath BOTH sides before comparing, so a symlinked invocation is still the main module;
22
+ // 2. degrade to `false` — "not the main module" — for anything that does not resolve, never throw.
23
+ //
24
+ // WHY IT IS SHARED RATHER THAN COPIED. PR #278 fixed twelve copies of failure mode #718 by hand and
25
+ // mechanized nothing. Five weeks later `mergify/scripts/audit.mjs` was written with the pre-#278
26
+ // form, and `coverage-ledger.mjs` survived the whole pass because it spelled the same bug a third
27
+ // way that #278's grep did not match. One module plus `main-guard-hygiene.test.mjs` is what stops
28
+ // the next copy: there is now no second place for this logic to drift to, and adding one fails CI.
29
+ //
30
+ // WHERE IT LIVES, AND WHY HERE. Native Skills CLI installation flattens selected packages into
31
+ // sibling directories under `~/.agents/skills`, while this repository nests them under
32
+ // `skills/engineering`. A Workflow consumer at `<skill>/scripts` therefore imports
33
+ // `../../engineering-runtime/scripts/main-module.mjs`: the same specifier reaches this package in
34
+ // both layouts. Claude Code launches through a per-skill symlink into the canonical store; node's
35
+ // realpath-aware module resolution and this predicate preserve that path as well.
36
+ //
37
+ // `engineering-runtime` owns the helper as an installable support package rather than a user
38
+ // capability. `resolve-issues/scripts/sandbox-selftest.mjs` reconstructs the same sibling layout and
39
+ // links this package beside the skill under test. Every consumer imports this package directly.
40
+ import fs from 'node:fs';
41
+ import { fileURLToPath } from 'node:url';
42
+
43
+ /**
44
+ * Is the module identified by `importMetaUrl` the script node was launched with?
45
+ *
46
+ * Symlink-transparent, and total: any input that does not resolve to a real file answers `false`
47
+ * instead of throwing, so importing a CLI module is always safe.
48
+ *
49
+ * @param {string} importMetaUrl the caller's own `import.meta.url`
50
+ * @returns {boolean}
51
+ */
52
+ export function isMainModule(importMetaUrl) {
53
+ const entry = process.argv[1];
54
+ if (typeof entry !== 'string' || entry === '') return false; // imported, or an embedding harness
55
+
56
+ let entryPath;
57
+ try {
58
+ entryPath = fs.realpathSync(entry);
59
+ } catch {
60
+ return false; // #446: `node -` gives "-"; some harnesses give a path that is not on disk
61
+ }
62
+
63
+ let selfPath;
64
+ try {
65
+ selfPath = fileURLToPath(importMetaUrl);
66
+ } catch {
67
+ return false; // a data:/http: module has no path to compare, so it is never the launched script
68
+ }
69
+ try {
70
+ // #718: the launched side is resolved above, so this side must be too. Under Node's default
71
+ // resolution `import.meta.url` is already real and this is a no-op; under `--preserve-symlinks`
72
+ // it is the half that makes the comparison hold.
73
+ selfPath = fs.realpathSync(selfPath);
74
+ } catch {
75
+ // The module is executing, so it existed a moment ago. Compare what we have rather than
76
+ // claiming "not main" — a vanished file should not silently disable a running CLI.
77
+ }
78
+
79
+ return entryPath === selfPath;
80
+ }
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: airflow-dag-develop
3
+ description: Airflow DAG architecture and conventions. Read when designing, creating, or debugging DAGs — covers CLI validation, environment-based scheduling, and pytest integrity tests.
4
+ user-invocable: true
5
+ ---
6
+
7
+ # Airflow DAG Development Patterns
8
+
9
+ ## 1. Quick DAG Validation with Airflow CLI
10
+
11
+ Use these commands for fast feedback during development:
12
+
13
+ ```bash
14
+ # List import errors (fastest check - catches syntax and import issues)
15
+ airflow dags list-import-errors
16
+
17
+ # Full lint check (comprehensive - catches best practice violations)
18
+ airflow dags lint
19
+ ```
20
+
21
+ **When to use:**
22
+ - `list-import-errors`: During active development for quick syntax/import validation
23
+ - `lint`: Before commits to catch style and best practice issues
24
+
25
+ ## 2. Environment-Based Schedule Override
26
+
27
+ Disable schedules in local development to prevent accidental runs:
28
+
29
+ ```python
30
+ import os
31
+ from datetime import datetime
32
+ from airflow import DAG
33
+
34
+ def get_schedule(production_schedule: str) -> str | None:
35
+ """Return None for local dev, actual schedule for deployed environments.
36
+
37
+ Set AIRFLOW_ENV=local in .env for local development.
38
+ Cloud Run deployments set AIRFLOW_ENV=dev|staging|prod.
39
+ """
40
+ env = os.getenv("AIRFLOW_ENV", "local")
41
+ if env == "local":
42
+ return None
43
+ return production_schedule
44
+ ```
45
+
46
+ **Usage in DAG:**
47
+ ```python
48
+ with DAG(
49
+ dag_id="my_dag",
50
+ schedule=get_schedule("0 4 * * *"), # Daily 4 AM in prod, None locally
51
+ start_date=datetime(2024, 1, 1),
52
+ catchup=False,
53
+ ) as dag:
54
+ ...
55
+ ```
56
+
57
+ **Environment setup:**
58
+ - **Local:** Add `AIRFLOW_ENV=local` to `.env`
59
+ - **Cloud Run:** Set via cloudbuild.yaml substitutions (`_AIRFLOW_ENV: dev|staging|prod`)
60
+
61
+ ## 3. Pytest DAG Integrity Tests
62
+
63
+ Standard pytest patterns for validating DAG quality:
64
+
65
+ ```python
66
+ # tests/test_dag_integrity.py
67
+ import pytest
68
+ from airflow.models import DagBag
69
+
70
+ @pytest.fixture(scope="session")
71
+ def dagbag():
72
+ return DagBag(dag_folder="dags/", include_examples=False)
73
+
74
+ def test_no_import_errors(dagbag):
75
+ """Verify all DAGs load without import errors."""
76
+ assert not dagbag.import_errors, f"DAG import errors: {dagbag.import_errors}"
77
+
78
+ def test_dags_have_tags(dagbag):
79
+ """Verify all DAGs have at least one tag for organization."""
80
+ for dag_id, dag in dagbag.dags.items():
81
+ assert dag.tags, f"DAG {dag_id} has no tags"
82
+
83
+ def test_dags_have_owner(dagbag):
84
+ """Verify all DAGs have an owner in default_args."""
85
+ for dag_id, dag in dagbag.dags.items():
86
+ assert dag.default_args.get("owner"), f"DAG {dag_id} missing owner"
87
+
88
+ def test_no_cycles(dagbag):
89
+ """Verify DAGs don't have circular dependencies."""
90
+ for dag_id, dag in dagbag.dags.items():
91
+ # DagBag already validates this, but explicit test for clarity
92
+ assert dag.topo_sort(), f"DAG {dag_id} has cycles"
93
+ ```
94
+
95
+ **Run tests:**
96
+ ```bash
97
+ # Run all DAG tests
98
+ pytest tests/test_dag_integrity.py -v
99
+
100
+ # Run specific test
101
+ pytest tests/test_dag_integrity.py::test_no_import_errors -v
102
+ ```
103
+
104
+ ## Quick Reference
105
+
106
+ | Task | Command |
107
+ |------|---------|
108
+ | Check import errors | `airflow dags list-import-errors` |
109
+ | Lint DAGs | `airflow dags lint` |
110
+ | Run integrity tests | `pytest tests/test_dag_integrity.py -v` |
111
+ | Trigger manual run | `airflow dags trigger <dag_id>` |
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,109 @@
1
+ ---
2
+ name: app-debug
3
+ description: "Diagnose runtime failures in deployed Cloud Run services — 5xx/422 errors, tracebacks, Next.js SSR/hydration or Server Action failures, DB/Secret Manager connection errors, cold-start timeouts, container OOM. NOT for build or deploy failures (cloud-debug)."
4
+ ---
5
+
6
+ # App Debug
7
+
8
+ ---
9
+
10
+ ## Step 1: Gather Context
11
+
12
+ Collect before touching logs:
13
+
14
+ - **Service name** — which service? (`a1-engine`, `a1-portal`, `a1-admin`, `a1-engine-query`, `a1-forex`)
15
+ - **Environment** — `dev` or `prod`
16
+ - **Error description** — what is the symptom? (HTTP status, error message, UI behavior)
17
+ - **Timestamp** — when did it start? (approximate is fine)
18
+ - **Recent deploy?** — did a new revision go out recently?
19
+
20
+ Full service names follow the pattern: `{service}-{env}` (e.g. `a1-engine-dev`, `a1-portal-prod`).
21
+
22
+ ---
23
+
24
+ ## Step 2: Fetch Log Tail
25
+
26
+ **Always start with errors only.** Broaden only if errors return nothing useful.
27
+
28
+ ### Errors-only (start here)
29
+
30
+ ```bash
31
+ gcloud logging read \
32
+ 'resource.type="cloud_run_revision" AND resource.labels.service_name="a1-engine-dev" AND severity>=ERROR' \
33
+ --project cosmic-heaven-479306-v5 \
34
+ --limit 20 \
35
+ --format="value(timestamp,textPayload)"
36
+ ```
37
+
38
+ Replace `a1-engine-dev` with the target service name.
39
+
40
+ ### Broader log tail (if errors-only is empty)
41
+
42
+ ```bash
43
+ gcloud run services logs read a1-engine-dev \
44
+ --region us-central1 \
45
+ --project cosmic-heaven-479306-v5 \
46
+ --limit 50
47
+ ```
48
+
49
+ ### Check current revision and env vars
50
+
51
+ ```bash
52
+ gcloud run services describe a1-engine-dev \
53
+ --region us-central1 \
54
+ --project cosmic-heaven-479306-v5 \
55
+ --format="yaml(spec.template.spec.containers[0].env, spec.template.spec.containers[0].resources, status.latestReadyRevisionName)"
56
+ ```
57
+
58
+ ### Check secret versions (if secret errors suspected)
59
+
60
+ ```bash
61
+ gcloud secrets versions list database-url-a1-dev \
62
+ --project cosmic-heaven-479306-v5
63
+ ```
64
+
65
+ ---
66
+
67
+ ## Step 3: Classify the Error
68
+
69
+ Map what you found in logs to one error class:
70
+
71
+ - **App Error** — Python traceback, unhandled exception, 500 from FastAPI, Next.js render crash
72
+ - **DB Error** — connection refused, auth failure, Tortoise config error, Cloud SQL proxy issue
73
+ - **Secret Error** — permission denied on Secret Manager, secret not found, wrong version
74
+ - **Config Error** — missing env var, wrong PORT, wrong Cloud SQL instance name, bad DB URL format
75
+ - **Resource Error** — OOM kill, DEADLINE_EXCEEDED, cold start timeout, container exit code 137
76
+
77
+ ---
78
+
79
+ ## Step 4: Form Hypotheses
80
+
81
+ Read `references/common-errors.md` now. Match the log output against the known patterns to confirm your hypothesis before proceeding.
82
+
83
+ Then pick the top 3 causes ranked by probability based on what the logs actually show. Example:
84
+
85
+ 1. **(Most likely)** Wrong secret version for `database-url-a1-dev` — password mismatch after DB rotation
86
+ 2. Cloud SQL proxy not receiving connections — `CLOUD_SQL_INSTANCE` env var missing or wrong format
87
+ 3. Cold start OOM — memory limit too low, service hitting 256Mi default under load
88
+
89
+ Do not list more than 3.
90
+
91
+ ---
92
+
93
+ ## Step 5: Targeted Fix
94
+
95
+ For each hypothesis, apply the verify + resolve steps from `references/common-errors.md`.
96
+
97
+ If the error class is **App Error** (Python traceback, Next.js render crash, unhandled exception):
98
+ - Check the first line of the traceback — unhandled import errors appear here at startup
99
+ - Look for `ConfigurationError` or `OperationalError` near the top — indicates Tortoise/DB init failure during lifespan startup
100
+ - If traceback points to a specific route handler file — it's a runtime exception, not a startup issue
101
+ - Route to Cory (backend tracebacks) or Suzzy (Next.js/frontend) with the exact traceback and file location
102
+
103
+ For all other error classes (DB, Secret, Config, Resource): follow the matching pattern in `references/common-errors.md` for the exact `gcloud` commands to verify and resolve.
104
+
105
+ ---
106
+
107
+ ## Reference
108
+
109
+ `references/common-errors.md` — full catalogue of known error patterns, symptoms, causes, and fix commands for this stack. Read it in Step 4; refer back in Step 5.