@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,237 @@
1
+ # Mergify configuration template.
2
+ #
3
+ # Copy to the repository root as `.mergify.yml`, then replace every <PLACEHOLDER>
4
+ # and work through the TODOs. Validate before committing:
5
+ #
6
+ # mergify config validate
7
+ # mergify config simulate https://github.com/<owner>/<repo>/pull/<n>
8
+ #
9
+ # Shape of this template:
10
+ # - enqueue is HYBRID: AUTO on ready + review-PASS, MANUAL (`@mergifyio queue`) otherwise
11
+ # - batch mode, batch_size 3
12
+ # - update_method: rebase (head-freshness intent; see the note on it below)
13
+ # - one CI gate, defined once and asserted in three places
14
+ # - queue-only merges, with the admin escape hatch routed THROUGH Mergify
15
+ #
16
+ # Queue-only merges are half configured here and half in ruleset.json:
17
+ # its `update` rule makes Mergify the only actor that may write to the branch,
18
+ # so the admin escape hatch cannot be "merge it by hand" — it has to be
19
+ # something Mergify performs. That is the `pull_request_rules` block at the end.
20
+
21
+ shared:
22
+ # ---------------------------------------------------------------------------
23
+ # THE GATE. Define your CI requirement exactly ONCE here and reference it by
24
+ # anchor everywhere else, so the queue-entry gate, the queue-merge gate and the
25
+ # GitHub-required merge protection can never drift apart.
26
+ #
27
+ # TODO: replace `<ci-check-name>` with the GitHub check-run / status name.
28
+ #
29
+ # If that check is path-filtered in your workflow (`on.pull_request.paths`), a
30
+ # bare `check-success` is UNSATISFIABLE on a PR that touches none of those
31
+ # paths — the check is not failing, it is *absent*, and the PR sits in the
32
+ # queue forever. Wrap it in an `or` with the exemption, as shown, and list the
33
+ # workflow's own path so a workflow-only PR cannot ride through the gate's
34
+ # blind spot. Keep this list in step with the workflow's `paths:` filter.
35
+ #
36
+ # If your check runs on every PR (no `paths:` filter), delete the `or` and the
37
+ # `and` block and leave just `- check-success = <ci-check-name>`.
38
+ gate: &gate
39
+ or:
40
+ - check-success = <ci-check-name>
41
+ - and:
42
+ - -files ~= ^<gated-path>/
43
+ - -files ~= ^\.github/workflows/<workflow-file>\.yml$
44
+
45
+ # Optional second gate that runs ONLY on the queue's own batch branches
46
+ # (`mergify/merge-queue/…`), never on an ordinary PR — e.g. a repeat-run flake
47
+ # sweep that is only worth paying for once per batch. Same absent-vs-failing
48
+ # trap applies, so it is written the same way.
49
+ #
50
+ # TODO: delete this whole anchor and its use below if you have no batch-only job.
51
+ queue_gate: &queue_gate
52
+ or:
53
+ - check-success = <ci-check-name>-queue
54
+ - and:
55
+ - -files ~= ^<gated-path>/
56
+ - -files ~= ^\.github/workflows/<workflow-file>\.yml$
57
+
58
+ queue_rules:
59
+ - name: default
60
+ # Where GitHub branch-protection / ruleset requirements get injected.
61
+ # queue (default) — injected into BOTH queue-entry and merge conditions
62
+ # merge — injected only while merging
63
+ #
64
+ # Use `merge` when a Mergify-published check is itself REQUIRED by the
65
+ # ruleset: that check deliberately fails before the PR is in the queue, and
66
+ # with the default `queue` mode it would block the very enqueue step that
67
+ # makes it pass.
68
+ branch_protection_injection_mode: merge
69
+
70
+ # ---- Step 1: what a PR must satisfy to ENTER the queue --------------------
71
+ # `-draft` is deliberately ABSENT here, and from merge_conditions below.
72
+ # Enqueue is manual, so draft state is not the hold-back lever — nothing queues
73
+ # a draft by accident, and a draft condition that IS present shows up as a lone
74
+ # unmet condition on a PR nobody expected to be held. Do not add it back
75
+ # without reading the next paragraph.
76
+ #
77
+ # What the absence costs, stated plainly so it is a choice and not a surprise:
78
+ # GitHub cannot merge a draft pull request. A draft that gets enqueued anyway
79
+ # is admitted, rides a full batch CI run, reaches the front and fails at the
80
+ # merge call — taking the batch's innocent PRs through that failure with it.
81
+ # Marking a queued PR as draft also no longer pulls it out of the queue;
82
+ # use `@mergifyio dequeue` for that.
83
+ queue_conditions:
84
+ - base = <main-branch>
85
+ - *gate
86
+
87
+ # ---- Step 2: what must hold to MERGE from the front of the queue ----------
88
+ # Not redundant with step 1: Mergify tests the batch merged WITH its base
89
+ # here — a tree that existed when no individual PR's CI ran.
90
+ merge_conditions:
91
+ - *gate
92
+ - *queue_gate
93
+
94
+ # ---- BATCH MODE ----------------------------------------------------------
95
+ # Test up to 3 PRs as one CI run — this skill's default. The key must be
96
+ # explicit: unset, `batch_size` silently runs at Mergify's built-in default of
97
+ # 1 (no batching), so this line is what turns batching on. Mergify groups a batch by
98
+ # relationship (stacks together, then similar scopes/directories), not raw
99
+ # queue order. A red batch is bisected by Mergify, so innocent PRs are not
100
+ # discarded; only the culprit is dequeued.
101
+ #
102
+ # REQUIRED GitHub setting: "Require branches to be up to date before merging"
103
+ # must be DISABLED on the protected branch. Batches cannot merge with it on.
104
+ batch_size: 3
105
+
106
+ # How long to hold the gate open for a batch to fill. This is a straight
107
+ # latency tax on a LONE PR — Mergify waits the full window before giving up
108
+ # on company. Keep it short where PRs usually arrive one at a time.
109
+ batch_max_wait_time: 30 seconds
110
+
111
+ # Bound on how many times a failing batch may be split to isolate the
112
+ # culprit. Each split is another CI run. With batch_size 3 a single bad PR
113
+ # is normally found in ~2 splits; this only caps the pathological case.
114
+ batch_max_failure_resolution_attempts: 10
115
+
116
+ # ---- HEAD FRESHNESS ------------------------------------------------------
117
+ # `update_method` applies ONLY to in-place checks, and in-place checks are
118
+ # enabled only when max_parallel_checks == 1 AND every queue has
119
+ # batch_size == 1 AND every queue CI is single-step (no extra
120
+ # merge_conditions). With batch_size 3 it is therefore inert today: head
121
+ # freshness comes from the queue branch, which Mergify builds as
122
+ # base + batch and runs CI against.
123
+ #
124
+ # It is kept here deliberately so that dropping to batch_size 1 does not
125
+ # silently change update behaviour. To rebase the PR BRANCH ITSELF while
126
+ # batching, use the `update`/`rebase` action or `@mergifyio update`
127
+ # (see the skill's "Enforce head" section) — not this option.
128
+ update_method: rebase
129
+
130
+ merge_method: merge
131
+
132
+ merge_queue:
133
+ # Parallel speculative checks. Batch splits are tested in parallel during
134
+ # bisection, so a red batch resolves in roughly log time. There is nothing to
135
+ # gain from more parallel checks than a batch can split into.
136
+ max_parallel_checks: 3
137
+
138
+ merge_protections_settings:
139
+ # check-runs is what a GitHub branch ruleset can mark REQUIRED.
140
+ reporting_method: check-runs
141
+ post_comment: true
142
+
143
+ # ENQUEUE: AUTO on ready + review-PASS, MANUAL otherwise. A PR auto-queues the
144
+ # moment it is `-draft` (ready), has >=1 approval with no open change request,
145
+ # and the CI gate is green; short of that it waits for a human `@mergifyio queue`.
146
+ # The manual hatch always works — `@mergifyio queue` ignores these conditions,
147
+ # and `merge_conditions` gate on CI only — so a hand-queued PR merges on green
148
+ # without a review. `-draft` lives HERE, not in queue_conditions/merge_conditions
149
+ # (see the `-draft` note below).
150
+ #
151
+ # Do NOT use the deprecated `auto_merge: true` or `queue_rules[].autoqueue`.
152
+ # For fully MANUAL enqueue instead, delete this block and say so in a comment
153
+ # (an omitted key reads as an oversight and someone will "fix" it back).
154
+ auto_merge_conditions:
155
+ - "-draft"
156
+ - "#approved-reviews-by >= 1"
157
+ - "#changes-requested-reviews-by = 0"
158
+ - *gate
159
+
160
+ merge_protections:
161
+ # Republish the gate as a Mergify check-run so a GitHub ruleset has one stable
162
+ # check name to require — one that is GREEN (not absent) on an exempt PR, so
163
+ # requiring it cannot strand a docs-only PR.
164
+ #
165
+ # NEVER write `success_conditions: [queue-name = default]` here to "force all
166
+ # merges through the queue". Merge-protection conditions are injected into the
167
+ # queue's ENTRY conditions, while the ruleset requires the resulting check
168
+ # BEFORE entry — entry then waits on a check that cannot go green until after
169
+ # entry, and the repository deadlocks. `branch_protection_injection_mode:
170
+ # merge` does not prevent this; it governs GitHub-side injection, not
171
+ # Mergify's own merge_protections. Queue-only merges are enforced by the
172
+ # GitHub ruleset's `update` rule instead — see ruleset.json.
173
+ - name: <ci-check-name> (or exempt) before merge
174
+ description: >-
175
+ The CI gate, asserted as a required merge protection. Green when
176
+ <ci-check-name> succeeded, or when the PR touches no gated path (so the
177
+ job was never created) — never absent, so a ruleset can require it.
178
+ if:
179
+ - base = <main-branch>
180
+ success_conditions:
181
+ - *gate
182
+
183
+ # ---------------------------------------------------------------------------
184
+ # ADMIN ESCAPE HATCHES — both routed through Mergify.
185
+ #
186
+ # With the `update` rule in ruleset.json, Mergify is the only actor allowed to
187
+ # write to the protected branch. So "an admin merges it by hand" is no longer
188
+ # possible, and the escape hatch has to be an action Mergify takes. There are
189
+ # two, and they are NOT interchangeable.
190
+ # ---------------------------------------------------------------------------
191
+
192
+ # ESCAPE HATCH 1 (preferred): jump the line, keep the tests.
193
+ # The PR still enters the queue and still has to pass CI — it just stops waiting
194
+ # behind everything else. This covers the overwhelming majority of "this is
195
+ # urgent" cases and costs nothing in safety, so reach for it first.
196
+ priority_rules:
197
+ - name: urgent — front of the queue
198
+ conditions:
199
+ - label = urgent
200
+ priority: high
201
+
202
+ # ESCAPE HATCH 2 (break glass): skip the queue entirely.
203
+ # Merges immediately, WITHOUT the queue and WITHOUT the batch's CI run. This is
204
+ # the lever that can put a broken commit on the protected branch, so treat the
205
+ # label as the audited artifact: Mergify records the merge, and GitHub records
206
+ # who applied the label.
207
+ #
208
+ # GitHub cannot restrict who applies a label, and Mergify's `sender-permission`
209
+ # attribute only works for COMMANDS (`@mergifyio …`), not label events — so this
210
+ # rule cannot be technically limited to admins. It is a convention backed by an
211
+ # audit trail, not an enforced permission. If that is not good enough for you,
212
+ # delete this rule and let a genuine emergency go through the OrganizationAdmin
213
+ # bypass in ruleset.json instead, which GitHub does enforce and does audit.
214
+ #
215
+ # TODO: delete this whole rule if you would rather have no queue-skip at all.
216
+ pull_request_rules:
217
+ - name: emergency merge — skips the queue, use only when the queue cannot run
218
+ conditions:
219
+ - base = <main-branch>
220
+ - label = emergency-merge
221
+ - -draft
222
+ actions:
223
+ merge:
224
+ method: merge
225
+ comment:
226
+ message: >-
227
+ Merged via the `emergency-merge` label — this bypassed the merge queue
228
+ and its CI run. Please confirm the branch is healthy.
229
+
230
+ # Who may enqueue. Defaults are `sender-permission >= write` for `queue` and
231
+ # `dequeue`; tighten to `admin` if enqueueing should itself be a privileged act.
232
+ #
233
+ # TODO: delete this block to keep the defaults.
234
+ commands_restrictions:
235
+ queue:
236
+ conditions:
237
+ - sender-permission >= write
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "default",
3
+ "target": "branch",
4
+ "enforcement": "active",
5
+ "conditions": {
6
+ "ref_name": {
7
+ "include": ["~DEFAULT_BRANCH"],
8
+ "exclude": []
9
+ }
10
+ },
11
+ "rules": [
12
+ { "type": "deletion" },
13
+ { "type": "non_fast_forward" },
14
+ {
15
+ "type": "update",
16
+ "parameters": {
17
+ "update_allows_fetch_and_merge": true
18
+ }
19
+ },
20
+ {
21
+ "type": "required_status_checks",
22
+ "parameters": {
23
+ "strict_required_status_checks_policy": false,
24
+ "do_not_enforce_on_create": false,
25
+ "required_status_checks": [
26
+ {
27
+ "context": "Mergify Merge Protections",
28
+ "integration_id": 10562
29
+ }
30
+ ]
31
+ }
32
+ }
33
+ ],
34
+ "bypass_actors": [
35
+ {
36
+ "actor_id": 10562,
37
+ "actor_type": "Integration",
38
+ "bypass_mode": "always"
39
+ },
40
+ {
41
+ "actor_id": 1,
42
+ "actor_type": "OrganizationAdmin",
43
+ "bypass_mode": "always"
44
+ }
45
+ ]
46
+ }
@@ -0,0 +1,277 @@
1
+ # Branch Protection: the GitHub ruleset
2
+
3
+ Everything GitHub-side that makes the Mergify queue binding. Read this when
4
+ **setting up or changing branch protection** — not needed to debug a stuck PR.
5
+
6
+ Contents:
7
+
8
+ - [Who enforces what](#who-enforces-what) — the bypass-scope problem, and
9
+ what GitHub enforces vs what Mergify enforces
10
+ - [What the rules do](#what-the-rules-do)
11
+ - [Applying it](#applying-it) · [Dry-run first](#dry-run-first) · [Bypass actors](#bypass-actors)
12
+ - [Enforcing queue-only merges](#enforcing-queue-only-merges) — the `update` rule,
13
+ what it breaks, the admin escape hatch, and how to verify
14
+
15
+ ### Who enforces what
16
+
17
+ One ruleset, and it is worth being exact about what it does and does not do —
18
+ this is the part most likely to be misread.
19
+
20
+ **Bypass is granted per *ruleset*, never per rule.** `bypass_actors` sits on the
21
+ ruleset; individual rules have no bypass field. An actor that bypasses one rule
22
+ bypasses *every* rule in that ruleset.
23
+
24
+ That matters because the `update` rule permits only bypass actors to write to the
25
+ branch, so Mergify **must** be a bypass actor or it cannot merge at all. Which
26
+ means Mergify also bypasses `required_status_checks` in the same ruleset. So the
27
+ division of labour is:
28
+
29
+ | Concern | Enforced by |
30
+ |---|---|
31
+ | Nobody but Mergify writes to the branch | **GitHub** — the `update` rule |
32
+ | A red PR does not merge | **Mergify** — `merge_conditions` in `.mergify.yml` |
33
+ | Branch not deleted or force-pushed | **GitHub** — but admins bypass |
34
+
35
+ CI *is* enforced. Just by Mergify, not by GitHub. That is a real property, not a
36
+ gap: the queue will not merge a PR whose `*gate` is red.
37
+
38
+ **Why not split into two rulesets so GitHub checks Mergify too?** It was
39
+ considered and rejected. You can put `required_status_checks` in a second ruleset
40
+ that Mergify does not bypass — but the check being required is
41
+ `Mergify Merge Protections`, whose pass/fail is computed from `*gate` in
42
+ `.mergify.yml`. Weaken the gate and that check goes green along with it, so the
43
+ second ruleset does not actually verify anything independently. It costs a second
44
+ object to manage and buys almost nothing.
45
+
46
+ If you genuinely want GitHub-side CI enforcement independent of `.mergify.yml`,
47
+ the missing piece is not a second ruleset — it is a CI job that **always reports**
48
+ (no `paths:` filter, or an always-run job that reports success when no gated path
49
+ changed). Require that job directly, in a ruleset Mergify does not bypass. Until
50
+ the job always reports, GitHub cannot require it without stranding path-exempt
51
+ PRs, which is the whole reason the Mergify check exists as an intermediary.
52
+
53
+ ### Then why keep `required_status_checks` at all?
54
+
55
+ With `update` active it gates nobody: non-bypass users cannot write regardless,
56
+ and Mergify and admins bypass. It earns its place as a **backstop** — if the
57
+ `update` rule is ever removed or the ruleset stops targeting the branch, the
58
+ required check immediately becomes load-bearing again and ordinary users are
59
+ still gated. Keep it, but do not mistake it for something that constrains
60
+ Mergify's merges. It does not.
61
+
62
+ ### What the rules do
63
+
64
+ | Rule | Why |
65
+ |------|-----|
66
+ | `deletion` | Nobody deletes the protected branch. |
67
+ | `non_fast_forward` | No force-push. The queue's whole model assumes base history only moves forward. |
68
+ | `required_status_checks` → `Mergify Merge Protections` | The one required check. **Require Mergify's check-run, not the raw CI job** — see below. |
69
+ | `strict_required_status_checks_policy: false` | **Mandatory with `batch_size > 1`.** This is GitHub's "Require branches to be up to date before merging"; batches cannot merge with it on. |
70
+ | `update` | **Only bypass actors may write to the branch.** This is what makes the queue mandatory — see [Enforcing Queue-Only Merges](#enforcing-queue-only-merges). Read that section first; it blocks CI bots too. |
71
+
72
+ **Require the Mergify check, not the CI job.** `integration_id: 10562` is
73
+ Mergify's GitHub App, and pinning it means only Mergify can publish the check —
74
+ another app cannot spoof the context name. The raw CI job is the wrong thing to
75
+ require because it is *absent*, not failing, on a path-exempt PR, and a ruleset
76
+ cannot tell "skipped" from "missing". It would strand exactly those PRs. Mergify's
77
+ check-run carries the same exemption logic and is always produced, so it is
78
+ green-or-red but never missing.
79
+
80
+ Verify Mergify's app id rather than trusting this document:
81
+
82
+ ```bash
83
+ gh api /apps/mergify --jq '{id, slug, name}' # → 10562
84
+ ```
85
+
86
+ ### Applying it
87
+
88
+ `gh ruleset` is **read-only** (`list` / `view` / `check`). Creating and updating
89
+ goes through `gh api`.
90
+
91
+ ```bash
92
+ # Repository-level
93
+ gh api -X POST /repos/<owner>/<repo>/rulesets --input ruleset.json
94
+
95
+ # Update an existing one (find the id with: gh ruleset list)
96
+ gh api -X PUT /repos/<owner>/<repo>/rulesets/<id> --input ruleset.json
97
+ ```
98
+
99
+ Consider applying it once with `"enforcement": "evaluate"` first (see
100
+ [Dry-run first](#dry-run-first)) — the `update` rule is the one most likely to
101
+ block something you forgot about.
102
+
103
+ **Org-level** rulesets cover many repos at once and need one extra condition —
104
+ otherwise the payload is identical:
105
+
106
+ ```bash
107
+ # add to conditions: "repository_name": {"include": ["~ALL"], "exclude": []}
108
+ gh api -X POST /orgs/<org>/rulesets --input ruleset.json
109
+ ```
110
+
111
+ An org-level ruleset **cannot be edited from the repository**, only viewed. If
112
+ `gh ruleset list` shows `source_type: Organization`, take changes to the org.
113
+
114
+ ### Dry-run first
115
+
116
+ Set `"enforcement": "evaluate"` instead of `"active"` to have GitHub record what
117
+ *would* have been blocked without blocking it. Apply, let a few PRs land, then
118
+ read the evaluations:
119
+
120
+ ```bash
121
+ gh api '/repos/<owner>/<repo>/rulesets/rule-suites?per_page=20' \
122
+ --jq '.[] | {actor_name, ref, result, pushed_at}'
123
+ ```
124
+
125
+ `result` is `pass` / `fail` / `bypass`. Flip to `"active"` once it reads the way
126
+ you expect. The template ships as `"active"` deliberately — a template left in
127
+ `evaluate` and forgotten is an unprotected branch that looks protected.
128
+
129
+ ### Bypass actors
130
+
131
+ | `actor_type` | `actor_id` | Note |
132
+ |---|---|---|
133
+ | `Integration` | app id (Mergify = `10562`, GitHub Actions = `15368`) | |
134
+ | `OrganizationAdmin` | `1` | `actor_id` is ignored for this type; `null` also works |
135
+ | `RepositoryRole` | `5` = repository admin | Other role ids are not officially documented — copy them from an existing ruleset |
136
+ | `Team` | team id | |
137
+ | `DeployKey` | `null` | |
138
+
139
+ `bypass_mode` is one of:
140
+
141
+ | Mode | Behaviour |
142
+ |---|---|
143
+ | `always` | Bypasses everywhere, **and writes an audit-log entry** |
144
+ | `pull_request` | May bypass only through a PR (branch rulesets only) |
145
+ | `exempt` | Rules are not evaluated for this actor at all — **no audit entry** |
146
+
147
+ Prefer `always` over `exempt` for anything you want a record of. `exempt` is the
148
+ quieter setting and that is exactly its problem on a break-glass path.
149
+
150
+ Discover ids you don't know by reading a ruleset that already has the actor you
151
+ want:
152
+
153
+ ```bash
154
+ gh api /repos/<owner>/<repo>/rulesets/<id> --jq '.bypass_actors'
155
+ ```
156
+
157
+ Note that `bypass_actors` is only returned if you have write access to the
158
+ ruleset — an empty list may mean "no permission", not "no bypasses".
159
+
160
+ ## Enforcing Queue-Only Merges
161
+
162
+ Requiring a status check does **not** get you this. Once the check goes green,
163
+ anyone with write access can press "Merge pull request" and the queue never sees
164
+ the PR. To make the queue mandatory you need the ruleset's **`update`** rule:
165
+
166
+ ```json
167
+ { "type": "update", "parameters": { "update_allows_fetch_and_merge": true } }
168
+ ```
169
+
170
+ GitHub calls this "Restrict updates": *only users with bypass permission can push
171
+ to matching branches*. A PR merge is a write to the branch, so with `update` on
172
+ the default branch and **only Mergify (plus the admin break-glass) bypassing**,
173
+ Mergify becomes the only thing that routinely puts a commit on `main`. The merge
174
+ button fails for everyone else. That is the enforcement — nothing in
175
+ `.mergify.yml` can do it.
176
+
177
+ `update_allows_fetch_and_merge` covers a fork's branch pulling from its upstream,
178
+ which does not apply to a protected default branch either way; `true` matches
179
+ GitHub's UI default.
180
+
181
+ ### What this breaks, and you must fix
182
+
183
+ `update` blocks **every** non-bypass writer, not just humans clicking merge.
184
+ Before enabling it, inventory anything that pushes to the protected branch and
185
+ add it as a bypass actor, or it silently starts failing:
186
+
187
+ - release automation that commits a version bump or CHANGELOG
188
+ - `actions/github-script` or bots pushing back to `main`
189
+ - tag-and-push release jobs
190
+ - anything using the default `GITHUB_TOKEN` to push
191
+
192
+ ```bash
193
+ # does anything push to the protected branch?
194
+ grep -rnE 'git push|peter-evans/create-pull-request|github-script' .github/workflows/
195
+ ```
196
+
197
+ A GitHub Actions push needs `{"actor_type": "Integration", "actor_id": 15368}`
198
+ (GitHub Actions app) as a bypass actor. Verify with `gh api /apps/github-actions --jq .id`.
199
+
200
+ ### The admin escape hatch, routed through Mergify
201
+
202
+ Once Mergify is the only writer, "an admin merges it by hand" no longer exists.
203
+ The escape hatch has to be something *Mergify* performs. The template ships two,
204
+ and they are not interchangeable:
205
+
206
+ | | Lever | Skips CI? | Enforced? |
207
+ |---|---|---|---|
208
+ | **1. Jump the line** | `priority_rules` + `urgent` label | No — still queued and tested | n/a |
209
+ | **2. Break glass** | `pull_request_rules` merge action + `emergency-merge` label | **Yes** | Convention + audit trail only |
210
+ | **3. Lockout escape** | `OrganizationAdmin` bypass in the ruleset | Yes | Yes, by GitHub |
211
+
212
+ **Reach for (1) first.** Most "this is urgent" is impatience with the queue, not
213
+ a need to skip testing. Priority costs nothing in safety.
214
+
215
+ **(2) cannot be limited to admins**, and you should know that before relying on
216
+ it. GitHub cannot restrict who applies a label, and Mergify's `sender-permission`
217
+ attribute only works for `@mergifyio …` **commands**, not label events. So the
218
+ rule is a convention with an audit trail — GitHub records who applied the label,
219
+ Mergify records and comments on the merge — not an enforced permission. There is
220
+ no `@mergifyio merge` command to gate instead; the command set is `queue`,
221
+ `dequeue`, `requeue`, `rebase`, `refresh`, `update`, `squash`, `backport`, `copy`.
222
+
223
+ **Keep (3).** If Mergify is the only actor allowed to write to `main` and Mergify
224
+ has an outage, the repository is frozen — nobody can merge anything, including
225
+ the fix. `OrganizationAdmin` bypass is the way out. Use `bypass_mode: always`,
226
+ not `exempt`: `always` writes a bypass entry to the audit log, `exempt` skips the
227
+ rules without recording anything. For a break-glass path you want the record.
228
+
229
+ Drop the `OrganizationAdmin` entry only if you consciously accept the lockout
230
+ risk. Do not drop it by accident.
231
+
232
+ You can also tighten who may enqueue at all — `queue` and `dequeue` default to
233
+ `sender-permission >= write`:
234
+
235
+ ```yaml
236
+ commands_restrictions:
237
+ queue:
238
+ conditions:
239
+ - sender-permission >= admin
240
+ ```
241
+
242
+ ### Verify it actually enforces
243
+
244
+ The JSON looking right is not evidence, and the two failure directions need
245
+ separate tests. Prove the **allowed** path first — a ruleset strict enough to
246
+ block humans can also block Mergify if a bypass id is wrong, and you would rather
247
+ discover that before you can no longer merge the fix.
248
+
249
+ ```bash
250
+ gh ruleset list --repo <owner>/<repo> # both rulesets present? whose are they?
251
+ gh ruleset check main # confirm both apply to this branch
252
+
253
+ # 1. the allowed path still works
254
+ # enqueue a PR with `@mergifyio queue`, then:
255
+ mergify queue show <PR> -v # watch it through to merge
256
+
257
+ # 2. the blocked path is blocked
258
+ gh pr create --title "ruleset probe" --body "do not merge"
259
+ gh pr merge <PR> --merge # MUST fail for a non-bypass user
260
+ ```
261
+
262
+ Expect a rejection naming the ruleset. **If it merges anyway**, the usual causes,
263
+ in order: you are a bypass actor yourself (org admins are — test with a non-admin
264
+ account); the ruleset is not targeting the branch (`gh ruleset check main`); or
265
+ `update` was left out of the queue-only ruleset, in which case the required check
266
+ is the only gate and a green check lets anyone merge.
267
+
268
+ Audit what has been landing and by whom:
269
+
270
+ ```bash
271
+ gh api '/repos/<owner>/<repo>/rulesets/rule-suites?per_page=30' \
272
+ --jq '.[] | select(.result != "pass") | {actor_name, result, pushed_at}'
273
+ ```
274
+
275
+ `result: bypass` rows are the escape hatches being used. If they are routine,
276
+ the queue is too slow or too strict — fix that rather than normalising bypass.
277
+