@1aboveio/skills 0.0.0-stage → 1.0.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.
- package/README.md +30 -2
- package/bin/cli.mjs +14 -0
- package/bin/select-core.mjs +172 -0
- package/package.json +146 -4
- package/skills/app-dev/airflow/LICENSE +3 -0
- package/skills/app-dev/airflow/SKILL.md +199 -0
- package/skills/app-dev/airflow/release-check.mjs +93 -0
- package/skills/app-dev/android-foundation/LICENSE +3 -0
- package/skills/app-dev/android-foundation/SKILL.md +192 -0
- package/skills/app-dev/android-foundation/assets/android-ci-job.yml +217 -0
- package/skills/app-dev/android-foundation/references/ci.md +87 -0
- package/skills/app-dev/android-foundation/references/gotchas.md +221 -0
- package/skills/app-dev/android-foundation/references/setup.md +164 -0
- package/skills/app-dev/android-foundation/release-check.mjs +93 -0
- package/skills/app-dev/android-foundation/scripts/device-run.sh +176 -0
- package/skills/app-dev/android-foundation/scripts/device-run.test.mjs +172 -0
- package/skills/app-dev/app-debug/LICENSE +3 -0
- package/skills/app-dev/app-debug/SKILL.md +110 -0
- package/skills/app-dev/app-debug/references/common-errors.md +128 -0
- package/skills/app-dev/app-debug/release-check.mjs +93 -0
- package/skills/app-dev/better-auth/LICENSE +3 -0
- package/skills/app-dev/better-auth/SKILL.md +598 -0
- package/skills/app-dev/better-auth/references/feishu-api.md +270 -0
- package/skills/app-dev/better-auth/release-check.mjs +93 -0
- package/skills/app-dev/data-catalog/LICENSE +3 -0
- package/skills/app-dev/data-catalog/SKILL.md +204 -0
- package/skills/app-dev/data-catalog/agents/openai.yaml +3 -0
- package/skills/app-dev/data-catalog/references/data-catalog-conventions.md +75 -0
- package/skills/app-dev/data-catalog/references/field-definitions.md +116 -0
- package/skills/app-dev/data-catalog/references/format.md +121 -0
- package/skills/app-dev/data-catalog/release-check.mjs +93 -0
- package/skills/app-dev/data-catalog/scripts/data-catalog.test.mjs +36 -0
- package/skills/app-dev/data-catalog/scripts/data_catalog.py +1392 -0
- package/skills/app-dev/data-catalog/scripts/persist-conventions-core.mjs +117 -0
- package/skills/app-dev/data-catalog/scripts/persist-conventions.mjs +17 -0
- package/skills/app-dev/data-catalog/scripts/test_data_catalog.py +571 -0
- package/skills/app-dev/ios-foundation/LICENSE +3 -0
- package/skills/app-dev/ios-foundation/SKILL.md +184 -0
- package/skills/app-dev/ios-foundation/references/setup.md +243 -0
- package/skills/app-dev/ios-foundation/release-check.mjs +93 -0
- package/skills/app-dev/monorepo/LICENSE +3 -0
- package/skills/app-dev/monorepo/SKILL.md +462 -0
- package/skills/app-dev/monorepo/release-check.mjs +93 -0
- package/skills/app-dev/nextjs-fullstack/LICENSE +3 -0
- package/skills/app-dev/nextjs-fullstack/SKILL.md +211 -0
- package/skills/app-dev/nextjs-fullstack/conventions.md +318 -0
- package/skills/app-dev/nextjs-fullstack/frontend-conventions.md +61 -0
- package/skills/app-dev/nextjs-fullstack/nextjs16.md +287 -0
- package/skills/app-dev/nextjs-fullstack/release-check.mjs +93 -0
- package/skills/app-dev/nextjs-fullstack/server-actions.md +409 -0
- package/skills/app-dev/prisma-setup/LICENSE +3 -0
- package/skills/app-dev/prisma-setup/SKILL.md +181 -0
- package/skills/app-dev/prisma-setup/nextjs.md +258 -0
- package/skills/app-dev/prisma-setup/release-check.mjs +93 -0
- package/skills/app-dev/prisma-setup/turborepo.md +301 -0
- package/skills/app-dev/pyspark/LICENSE +3 -0
- package/skills/app-dev/pyspark/SKILL.md +127 -0
- package/skills/app-dev/pyspark/assets/templates/etl.py +748 -0
- package/skills/app-dev/pyspark/assets/templates/utils/__init__.py +1 -0
- package/skills/app-dev/pyspark/assets/templates/utils/hudi_metadata.py +14 -0
- package/skills/app-dev/pyspark/references/diagnosis-and-profiling.md +169 -0
- package/skills/app-dev/pyspark/references/etl-contract.md +129 -0
- package/skills/app-dev/pyspark/references/production-validation.md +131 -0
- package/skills/app-dev/pyspark/references/reconciliation.md +38 -0
- package/skills/app-dev/pyspark/references/transformation-design.md +190 -0
- package/skills/app-dev/pyspark/references/velocity-feature-calculation.md +193 -0
- package/skills/app-dev/pyspark/release-check.mjs +93 -0
- package/skills/app-dev/pyspark/scripts/spark_eventlog_summary.py +223 -0
- package/skills/app-dev/python-backend/LICENSE +3 -0
- package/skills/app-dev/python-backend/SKILL.md +325 -0
- package/skills/app-dev/python-backend/assets/uv-install.sh +48 -0
- package/skills/app-dev/python-backend/references/uv-installs.md +83 -0
- package/skills/app-dev/python-backend/release-check.mjs +93 -0
- package/skills/app-dev/shadcn/LICENSE +3 -0
- package/skills/app-dev/shadcn/SKILL.md +120 -0
- package/skills/app-dev/shadcn/assets/shadcn-small.png +0 -0
- package/skills/app-dev/shadcn/assets/shadcn.png +0 -0
- package/skills/app-dev/shadcn/cli.md +411 -0
- package/skills/app-dev/shadcn/customization.md +224 -0
- package/skills/app-dev/shadcn/mcp.md +101 -0
- package/skills/app-dev/shadcn/release-check.mjs +93 -0
- package/skills/app-dev/shadcn/rules/base-vs-radix.md +323 -0
- package/skills/app-dev/shadcn/rules/component-selection.md +67 -0
- package/skills/app-dev/shadcn/rules/composition.md +195 -0
- package/skills/app-dev/shadcn/rules/data-table.md +201 -0
- package/skills/app-dev/shadcn/rules/forms.md +255 -0
- package/skills/app-dev/shadcn/rules/icons.md +103 -0
- package/skills/app-dev/shadcn/rules/styling.md +167 -0
- package/skills/app-dev/zod-v4/LICENSE +3 -0
- package/skills/app-dev/zod-v4/SKILL.md +286 -0
- package/skills/app-dev/zod-v4/release-check.mjs +93 -0
- package/skills/cicd/cloud-build/LICENSE +3 -0
- package/skills/cicd/cloud-build/SKILL.md +707 -0
- package/skills/cicd/cloud-build/release-check.mjs +93 -0
- package/skills/cicd/cloud-debug/LICENSE +3 -0
- package/skills/cicd/cloud-debug/SKILL.md +315 -0
- package/skills/cicd/cloud-debug/references/build-failures.md +238 -0
- package/skills/cicd/cloud-debug/references/deploy-failures.md +376 -0
- package/skills/cicd/cloud-debug/references/pipeline-failures.md +378 -0
- package/skills/cicd/cloud-debug/release-check.mjs +93 -0
- package/skills/cicd/cloud-deploy/LICENSE +3 -0
- package/skills/cicd/cloud-deploy/SKILL.md +230 -0
- package/skills/cicd/cloud-deploy/references/config-templates.md +257 -0
- package/skills/cicd/cloud-deploy/release-check.mjs +93 -0
- package/skills/cicd/docker/LICENSE +3 -0
- package/skills/cicd/docker/SKILL.md +151 -0
- package/skills/cicd/docker/release-check.mjs +93 -0
- package/skills/cicd/github-actions/LICENSE +3 -0
- package/skills/cicd/github-actions/SKILL.md +111 -0
- package/skills/cicd/github-actions/references/audit-profile-optimize.md +150 -0
- package/skills/cicd/github-actions/references/ci-case-studies.md +141 -0
- package/skills/cicd/github-actions/references/conditional-ci.md +214 -0
- package/skills/cicd/github-actions/references/debugging.md +13 -0
- package/skills/cicd/github-actions/references/pipeline.md +87 -0
- package/skills/cicd/github-actions/references/post-deploy-and-publishing.md +33 -0
- package/skills/cicd/github-actions/references/runners.md +253 -0
- package/skills/cicd/github-actions/references/security.md +29 -0
- package/skills/cicd/github-actions/references/speed-and-audit.md +115 -0
- package/skills/cicd/github-actions/references/two-pass-reading.md +92 -0
- package/skills/cicd/github-actions/release-check.mjs +93 -0
- package/skills/cicd/github-actions/scripts/ci-run-audit-core.mjs +612 -0
- package/skills/cicd/github-actions/scripts/ci-run-audit.mjs +4 -0
- package/skills/cicd/github-actions/scripts/ci-run-audit.test.mjs +637 -0
- package/skills/cicd/github-flow/LICENSE +3 -0
- package/skills/cicd/github-flow/SKILL.md +123 -0
- package/skills/cicd/github-flow/references/ci-conventions.md +14 -0
- package/skills/cicd/github-flow/release-check.mjs +93 -0
- package/skills/cicd/github-flow/scripts/flow-core.mjs +105 -0
- package/skills/cicd/github-flow/scripts/flow.mjs +81 -0
- package/skills/cicd/github-flow/scripts/flow.test.mjs +114 -0
- package/skills/cicd/github-flow/scripts/persist-conventions-core.mjs +117 -0
- package/skills/cicd/github-flow/scripts/persist-conventions.mjs +49 -0
- package/skills/cicd/github-flow/scripts/persist-conventions.test.mjs +108 -0
- package/skills/cicd/google-cloud/LICENSE +3 -0
- package/skills/cicd/google-cloud/SKILL.md +119 -0
- package/skills/cicd/google-cloud/references/gcs.md +469 -0
- package/skills/cicd/google-cloud/references/iam.md +451 -0
- package/skills/cicd/google-cloud/references/project.md +349 -0
- package/skills/cicd/google-cloud/references/secrets.md +336 -0
- package/skills/cicd/google-cloud/references/vpc.md +312 -0
- package/skills/cicd/google-cloud/release-check.mjs +93 -0
- package/skills/cicd/google-cloud/scripts/create-sa.sh +36 -0
- package/skills/cicd/google-cloud/scripts/gcp-config.sh +31 -0
- package/skills/cicd/google-cloud/scripts/grant-iap.sh +41 -0
- package/skills/cicd/google-cloud/scripts/setup-secrets.sh +48 -0
- package/skills/cicd/mergify/LICENSE +3 -0
- package/skills/cicd/mergify/SKILL.md +102 -0
- package/skills/cicd/mergify/assets/templates/mergify.yml +215 -0
- package/skills/cicd/mergify/assets/templates/ruleset.json +46 -0
- package/skills/cicd/mergify/references/branch-protection.md +282 -0
- package/skills/cicd/mergify/references/configuration.md +274 -0
- package/skills/cicd/mergify/references/diagnosis.md +109 -0
- package/skills/cicd/mergify/references/stacks.md +84 -0
- package/skills/cicd/mergify/references/traps.md +119 -0
- package/skills/cicd/mergify/references/watch-contract.md +274 -0
- package/skills/cicd/mergify/release-check.mjs +93 -0
- package/skills/cicd/mergify/scripts/audit-core.mjs +208 -0
- package/skills/cicd/mergify/scripts/audit.mjs +4 -0
- package/skills/cicd/mergify/scripts/audit.test.mjs +201 -0
- package/skills/cicd/mergify/scripts/entrypoints.test.mjs +106 -0
- package/skills/cicd/mergify/scripts/pr-620-mergify-comments.fixture.json +30 -0
- package/skills/cicd/mergify/scripts/stack-push-core.mjs +258 -0
- package/skills/cicd/mergify/scripts/stack-push.mjs +4 -0
- package/skills/cicd/mergify/scripts/stack-push.test.mjs +233 -0
- package/skills/cicd/mergify/scripts/watch-pr-delivery-core.mjs +1065 -0
- package/skills/cicd/mergify/scripts/watch-pr-delivery.mjs +4 -0
- package/skills/cicd/mergify/scripts/watch-pr-delivery.test.mjs +1826 -0
- package/skills/cicd/podman/LICENSE +3 -0
- package/skills/cicd/podman/SKILL.md +71 -0
- package/skills/cicd/podman/agents/openai.yaml +4 -0
- package/skills/cicd/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
- package/skills/cicd/podman/assets/templates/podman-service-override.conf +3 -0
- package/skills/cicd/podman/references/compose-compatibility.md +70 -0
- package/skills/cicd/podman/references/networking-and-ports.md +74 -0
- package/skills/cicd/podman/references/rootless-services-and-sockets.md +156 -0
- package/skills/cicd/podman/references/troubleshooting.md +98 -0
- package/skills/cicd/podman/release-check.mjs +93 -0
- package/skills/content/article-review/LICENSE +3 -0
- package/skills/content/article-review/SKILL.md +66 -0
- package/skills/content/article-review/references/report-format.md +68 -0
- package/skills/content/article-review/references/template-guide.md +79 -0
- package/skills/content/article-review/references/template-wechat-payments.md +125 -0
- package/skills/content/article-review/release-check.mjs +93 -0
- package/skills/content/article-to-image/LICENSE +3 -0
- package/skills/content/article-to-image/SKILL.md +91 -0
- package/skills/content/article-to-image/references/formats.md +53 -0
- package/skills/content/article-to-image/release-check.mjs +93 -0
- package/skills/content/flowchart-svg/LICENSE +3 -0
- package/skills/content/flowchart-svg/SKILL.md +43 -0
- package/skills/content/flowchart-svg/release-check.mjs +93 -0
- package/skills/content/flowchart-svg/scripts/export_png.sh +8 -0
- package/skills/content/image-gen/LICENSE +3 -0
- package/skills/content/image-gen/SKILL.md +192 -0
- package/skills/content/image-gen/release-check.mjs +93 -0
- package/skills/content/image-gen/scripts/credentials.mjs +217 -0
- package/skills/content/image-gen/scripts/credentials.test.mjs +212 -0
- package/skills/content/image-gen/scripts/generate.mjs +240 -0
- package/skills/content/image-gen/scripts/options.mjs +293 -0
- package/skills/content/image-gen/scripts/options.test.mjs +245 -0
- package/skills/content/mermaid/LICENSE +3 -0
- package/skills/content/mermaid/SKILL.md +635 -0
- package/skills/content/mermaid/release-check.mjs +93 -0
- package/skills/content/wechat-article-writer/LICENSE +3 -0
- package/skills/content/wechat-article-writer/SKILL.md +92 -0
- package/skills/content/wechat-article-writer/references/style-selector.md +133 -0
- package/skills/content/wechat-article-writer/references/writing-rules.md +152 -0
- package/skills/content/wechat-article-writer/release-check.mjs +93 -0
- package/skills/content/wechat-article-writer/templates/wechat-comparison.md +52 -0
- package/skills/content/wechat-article-writer/templates/wechat-howto.md +51 -0
- package/skills/content/wechat-article-writer/templates/wechat-insight.md +50 -0
- package/skills/content/wechat-article-writer/templates/wechat-pitfall.md +52 -0
- package/skills/content/wechat-publisher/LICENSE +3 -0
- package/skills/content/wechat-publisher/SKILL.md +171 -0
- package/skills/content/wechat-publisher/references/api.md +105 -0
- package/skills/content/wechat-publisher/references/layout-rules.md +57 -0
- package/skills/content/wechat-publisher/references/wechat-safe-template.html +86 -0
- package/skills/content/wechat-publisher/release-check.mjs +93 -0
- package/skills/content/wechat-publisher/scripts/md_to_wechat_html.py +194 -0
- package/skills/content/wechat-publisher/scripts/publish.py +239 -0
- package/skills/content/wechat-search/LICENSE +3 -0
- package/skills/content/wechat-search/SKILL.md +211 -0
- package/skills/content/wechat-search/release-check.mjs +93 -0
- package/skills/content/wechat-search/scripts/start-chrome.sh +83 -0
- package/skills/content/xai-search/LICENSE +3 -0
- package/skills/content/xai-search/SKILL.md +79 -0
- package/skills/content/xai-search/release-check.mjs +93 -0
- package/skills/content/xai-search/scripts/xai_search.sh +187 -0
- package/skills/content/xai-search/tests/smoke_test.sh +36 -0
- package/skills/core/distill-writing/LICENSE +3 -0
- package/skills/core/distill-writing/SKILL.md +74 -0
- package/skills/core/distill-writing/references/extraction.md +95 -0
- package/skills/core/distill-writing/references/updating.md +46 -0
- package/skills/core/distill-writing/release-check.mjs +93 -0
- package/skills/core/doc-to-md/LICENSE +3 -0
- package/skills/core/doc-to-md/SKILL.md +78 -0
- package/skills/core/doc-to-md/release-check.mjs +93 -0
- package/skills/core/doc-to-md/scripts/convert.py +157 -0
- package/skills/core/editorial-review/LICENSE +3 -0
- package/skills/core/editorial-review/SKILL.md +79 -0
- package/skills/core/editorial-review/references/checklist.md +94 -0
- package/skills/core/editorial-review/release-check.mjs +93 -0
- package/skills/core/house-style/LICENSE +3 -0
- package/skills/core/house-style/SKILL.md +33 -0
- package/skills/core/house-style/references/defaults.md +66 -0
- package/skills/core/house-style/references/rules.md +267 -0
- package/skills/core/house-style/references/sources.md +27 -0
- package/skills/core/house-style/references/style-en.md +131 -0
- package/skills/core/house-style/references/style-zh.md +141 -0
- package/skills/core/house-style/references/terminology-zh.md +223 -0
- package/skills/core/house-style/release-check.mjs +93 -0
- package/skills/core/house-style/templates/brd.md +103 -0
- package/skills/core/house-style/templates/commercial-proposal.md +93 -0
- package/skills/core/house-style/templates/compliance-policy.md +109 -0
- package/skills/core/house-style/templates/gap-analysis.md +105 -0
- package/skills/core/house-style/templates/general.md +63 -0
- package/skills/core/house-style/templates/integration-guide.md +98 -0
- package/skills/core/house-style/templates/prd.md +81 -0
- package/skills/core/house-style/templates/risk-operations-procedure.md +94 -0
- package/skills/core/house-style/templates/technical-spec.md +96 -0
- package/skills/core/polish-cn/LICENSE +3 -0
- package/skills/core/polish-cn/SKILL.md +102 -0
- package/skills/core/polish-cn/references/brief.md +93 -0
- package/skills/core/polish-cn/references/models.md +76 -0
- package/skills/core/polish-cn/release-check.mjs +93 -0
- package/skills/core/polish-cn/scripts/polish-cn.test.mjs +244 -0
- package/skills/core/polish-cn/scripts/polish_blocks.py +489 -0
- package/skills/core/reg-parser/LICENSE +3 -0
- package/skills/core/reg-parser/SKILL.md +212 -0
- package/skills/core/reg-parser/references/checklist-schema.md +223 -0
- package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.json +1306 -0
- package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.md +469 -0
- package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.json +634 -0
- package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.md +233 -0
- package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.json +2194 -0
- package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.md +771 -0
- package/skills/core/reg-parser/references/checklists/kyc-aml-checklist.md +258 -0
- package/skills/core/reg-parser/references/checklists/visa-vars-checklist.md +1058 -0
- package/skills/core/reg-parser/references/mandates/hk-amlo-cap615.md +389 -0
- package/skills/core/reg-parser/references/mandates/visa-vars.md +205 -0
- package/skills/core/reg-parser/release-check.mjs +93 -0
- package/skills/core/reg-parser/scripts/compare_checklist.py +230 -0
- package/skills/core/reg-parser/scripts/dump_checklist.py +361 -0
- package/skills/core/reg-parser/scripts/preprocess-mandate.sh +187 -0
- package/skills/core/reg-parser/scripts/reg-parser.test.mjs +165 -0
- package/skills/core/reg-parser/scripts/test_quarantine.sh +105 -0
- package/skills/core/reg-parser/scripts/validate_checklist.py +563 -0
- package/skills/core/reg-parser/scripts/validate_mandate.py +273 -0
- package/skills/core/terminology/LICENSE +3 -0
- package/skills/core/terminology/SKILL.md +62 -0
- package/skills/core/terminology/references/format.md +50 -0
- package/skills/core/terminology/references/init.md +32 -0
- package/skills/core/terminology/release-check.mjs +93 -0
- package/skills/core/write-doc/LICENSE +3 -0
- package/skills/core/write-doc/SKILL.md +141 -0
- package/skills/core/write-doc/references/bilingual.md +60 -0
- package/skills/core/write-doc/release-check.mjs +93 -0
- package/skills/engineering/better-review/LICENSE +3 -0
- package/skills/engineering/better-review/SKILL.md +249 -0
- package/skills/engineering/better-review/agents/openai.yaml +9 -0
- package/skills/engineering/better-review/references/domain-hazards.md +53 -0
- package/skills/engineering/better-review/references/passes.md +147 -0
- package/skills/engineering/better-review/references/result.md +151 -0
- package/skills/engineering/better-review/release-check.mjs +93 -0
- package/skills/engineering/better-review/scripts/pr-context.mjs +212 -0
- package/skills/engineering/better-review/scripts/pr-context.test.mjs +168 -0
- package/skills/engineering/better-review/scripts/rereview-scope.mjs +503 -0
- package/skills/engineering/better-review/scripts/rereview-scope.test.mjs +587 -0
- package/skills/engineering/better-review/scripts/scan-diff.mjs +365 -0
- package/skills/engineering/better-review/scripts/scan-diff.test.mjs +414 -0
- package/skills/engineering/better-review/scripts/vendor-sync.test.mjs +96 -0
- package/skills/engineering/e2e-test/LICENSE +3 -0
- package/skills/engineering/e2e-test/SKILL.md +98 -0
- package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +24 -0
- package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-config.md +73 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +144 -0
- package/skills/engineering/e2e-test/references/ci-integration.md +25 -0
- package/skills/engineering/e2e-test/references/ci-playwright-container.md +290 -0
- package/skills/engineering/e2e-test/references/presentation-sweep.md +104 -0
- package/skills/engineering/e2e-test/references/reviewing.md +41 -0
- package/skills/engineering/e2e-test/references/route-manifest.md +51 -0
- package/skills/engineering/e2e-test/release-check.mjs +93 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
- package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
- package/skills/engineering/e2e-test/scripts/presentation-checks.test.mjs +106 -0
- package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
- package/skills/engineering/e2e-test/scripts/presentation-perceivability.test.mjs +117 -0
- package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
- package/skills/engineering/e2e-test/scripts/presentation-reachability.test.mjs +69 -0
- package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
- package/skills/engineering/e2e-test/scripts/presentation-render-health.test.mjs +98 -0
- package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +147 -0
- package/skills/engineering/e2e-test/scripts/presentation-sweep.test.mjs +71 -0
- package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
- package/skills/engineering/e2e-test/scripts/presentation-temporal.test.mjs +59 -0
- package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +82 -0
- package/skills/engineering/e2e-test/scripts/project-route-manifest.test.mjs +76 -0
- package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
- package/skills/engineering/engineering-runtime/LICENSE +3 -0
- package/skills/engineering/engineering-runtime/SKILL.md +11 -0
- package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/engineering-runtime/coherence/workflow.json +597 -0
- package/skills/engineering/engineering-runtime/engineering-runtime.test.mjs +68 -0
- package/skills/engineering/engineering-runtime/release-check.mjs +93 -0
- package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
- package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
- package/skills/engineering/engineering-runtime/scripts/invocation-policy.mjs +187 -0
- package/skills/engineering/engineering-runtime/scripts/invocation-policy.test.mjs +95 -0
- package/skills/engineering/engineering-runtime/scripts/main-module.mjs +79 -0
- package/skills/engineering/engineering-runtime/scripts/main-module.test.mjs +288 -0
- package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
- package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
- package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
- package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
- package/skills/engineering/engineering-runtime/scripts/required-check-plan.test.mjs +96 -0
- package/skills/engineering/engineering-runtime/scripts/review-completion.mjs +56 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +595 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +189 -0
- package/skills/engineering/engineering-runtime/scripts/yaml-mapping.mjs +18 -0
- package/skills/engineering/ensure-coverage/LICENSE +3 -0
- package/skills/engineering/ensure-coverage/SKILL.md +129 -0
- package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +92 -0
- package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +85 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
- package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
- package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +19 -0
- package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
- package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +57 -0
- package/skills/engineering/ensure-coverage/references/depth/test-smells.md +39 -0
- package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +44 -0
- package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +110 -0
- package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +35 -0
- package/skills/engineering/ensure-coverage/references/presentation/axis.md +64 -0
- package/skills/engineering/ensure-coverage/references/process/audit-mode.md +27 -0
- package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
- package/skills/engineering/ensure-coverage/references/process/test-strategy.md +56 -0
- package/skills/engineering/ensure-coverage/release-check.mjs +93 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +67 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +140 -0
- package/skills/engineering/ensure-coverage/scripts/README.md +99 -0
- package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +182 -0
- package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.test.mjs +96 -0
- package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +105 -0
- package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.test.mjs +47 -0
- package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +137 -0
- package/skills/engineering/ensure-coverage/scripts/ci-audit.test.mjs +86 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +674 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-ledger.test.mjs +447 -0
- package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
- package/skills/engineering/ensure-coverage/scripts/design-parity.test.mjs +552 -0
- package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +282 -0
- package/skills/engineering/ensure-coverage/scripts/lint-tests.test.mjs +289 -0
- package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
- package/skills/engineering/ensure-coverage/scripts/mock-policy-config.test.mjs +119 -0
- package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
- package/skills/engineering/golden-path/LICENSE +3 -0
- package/skills/engineering/golden-path/SKILL.md +230 -0
- package/skills/engineering/golden-path/agents/openai.yaml +3 -0
- package/skills/engineering/golden-path/assets/golden-paths.example.json +57 -0
- package/skills/engineering/golden-path/references/contract.md +239 -0
- package/skills/engineering/golden-path/references/migration.md +111 -0
- package/skills/engineering/golden-path/release-check.mjs +93 -0
- package/skills/engineering/golden-path/scripts/golden-path-core.mjs +1779 -0
- package/skills/engineering/golden-path/scripts/golden-path.mjs +6 -0
- package/skills/engineering/golden-path/scripts/golden-path.test.mjs +1457 -0
- package/skills/engineering/harness-runtime/LICENSE +3 -0
- package/skills/engineering/harness-runtime/SKILL.md +19 -0
- package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
- package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
- package/skills/engineering/harness-runtime/contracts.md +15 -0
- package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
- package/skills/engineering/harness-runtime/discover-models.test.mjs +363 -0
- package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
- package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
- package/skills/engineering/harness-runtime/harness-runtime.test.mjs +967 -0
- package/skills/engineering/harness-runtime/index.mjs +767 -0
- package/skills/engineering/harness-runtime/model-catalog-seed.test.mjs +829 -0
- package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
- package/skills/engineering/harness-runtime/model-catalog.test.mjs +366 -0
- package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
- package/skills/engineering/harness-runtime/references/model-catalog-seed.json +408 -0
- package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
- package/skills/engineering/harness-runtime/release-check.mjs +93 -0
- package/skills/engineering/resolve-issues/LICENSE +3 -0
- package/skills/engineering/resolve-issues/SKILL.md +250 -0
- package/skills/engineering/resolve-issues/agents/openai.yaml +9 -0
- package/skills/engineering/resolve-issues/plugin-hooks.json +17 -0
- package/skills/engineering/resolve-issues/references/canary.md +28 -0
- package/skills/engineering/resolve-issues/references/ci.md +105 -0
- package/skills/engineering/resolve-issues/references/done.md +25 -0
- package/skills/engineering/resolve-issues/references/dropbox.md +90 -0
- package/skills/engineering/resolve-issues/references/expire.md +318 -0
- package/skills/engineering/resolve-issues/references/exploration.md +202 -0
- package/skills/engineering/resolve-issues/references/implementation.md +303 -0
- package/skills/engineering/resolve-issues/references/preflight.md +445 -0
- package/skills/engineering/resolve-issues/references/review.md +228 -0
- package/skills/engineering/resolve-issues/references/shared-modules.md +44 -0
- package/skills/engineering/resolve-issues/references/task-plan.md +264 -0
- package/skills/engineering/resolve-issues/release-check.mjs +93 -0
- package/skills/engineering/resolve-issues/scripts/cleanup-runs.mjs +364 -0
- package/skills/engineering/resolve-issues/scripts/cleanup-runs.test.mjs +280 -0
- package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/dropbox.mjs +473 -0
- package/skills/engineering/resolve-issues/scripts/dropbox.test.mjs +346 -0
- package/skills/engineering/resolve-issues/scripts/findings-reuse.mjs +98 -0
- package/skills/engineering/resolve-issues/scripts/findings-reuse.test.mjs +88 -0
- package/skills/engineering/resolve-issues/scripts/github-reviews.mjs +384 -0
- package/skills/engineering/resolve-issues/scripts/github-reviews.test.mjs +264 -0
- package/skills/engineering/resolve-issues/scripts/install-hooks.mjs +135 -0
- package/skills/engineering/resolve-issues/scripts/install-hooks.test.mjs +79 -0
- package/skills/engineering/resolve-issues/scripts/issue-tree.mjs +162 -0
- package/skills/engineering/resolve-issues/scripts/issue-tree.test.mjs +107 -0
- package/skills/engineering/resolve-issues/scripts/manual-invocation.test.mjs +14 -0
- package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/next-actions-capacity.test.mjs +149 -0
- package/skills/engineering/resolve-issues/scripts/next-actions.mjs +856 -0
- package/skills/engineering/resolve-issues/scripts/next-actions.test.mjs +915 -0
- package/skills/engineering/resolve-issues/scripts/plan-sync.mjs +269 -0
- package/skills/engineering/resolve-issues/scripts/plan-sync.test.mjs +156 -0
- package/skills/engineering/resolve-issues/scripts/preflight-models.mjs +736 -0
- package/skills/engineering/resolve-issues/scripts/preflight-models.test.mjs +448 -0
- package/skills/engineering/resolve-issues/scripts/ready-check.mjs +185 -0
- package/skills/engineering/resolve-issues/scripts/ready-check.test.mjs +217 -0
- package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +98 -0
- package/skills/engineering/resolve-issues/scripts/rehydrate.test.mjs +91 -0
- package/skills/engineering/resolve-issues/scripts/review-verdict.mjs +509 -0
- package/skills/engineering/resolve-issues/scripts/review-verdict.test.mjs +1060 -0
- package/skills/engineering/resolve-issues/scripts/size-check.mjs +492 -0
- package/skills/engineering/resolve-issues/scripts/size-check.test.mjs +458 -0
- package/skills/engineering/resolve-release/LICENSE +3 -0
- package/skills/engineering/resolve-release/SKILL.md +215 -0
- package/skills/engineering/resolve-release/agents/openai.yaml +8 -0
- package/skills/engineering/resolve-release/flows/cloud-run-canary.md +13 -0
- package/skills/engineering/resolve-release/flows/cloud-run.md +7 -0
- package/skills/engineering/resolve-release/flows/root-tag-npm.md +13 -0
- package/skills/engineering/resolve-release/flows/workspace-npm.md +22 -0
- package/skills/engineering/resolve-release/references/canary.md +51 -0
- package/skills/engineering/resolve-release/references/candidate.md +41 -0
- package/skills/engineering/resolve-release/references/cut.md +131 -0
- package/skills/engineering/resolve-release/references/dark-launch.md +66 -0
- package/skills/engineering/resolve-release/references/flows.md +150 -0
- package/skills/engineering/resolve-release/references/preflight.md +154 -0
- package/skills/engineering/resolve-release/references/prepared-metadata.md +260 -0
- package/skills/engineering/resolve-release/references/promotion.md +82 -0
- package/skills/engineering/resolve-release/references/publish.md +232 -0
- package/skills/engineering/resolve-release/references/workspace-npm.md +103 -0
- package/skills/engineering/resolve-release/release-check.mjs +93 -0
- package/skills/engineering/resolve-release/scripts/apply.mjs +212 -0
- package/skills/engineering/resolve-release/scripts/apply.test.mjs +99 -0
- package/skills/engineering/resolve-release/scripts/dark-flags.mjs +134 -0
- package/skills/engineering/resolve-release/scripts/dark-flags.test.mjs +100 -0
- package/skills/engineering/resolve-release/scripts/flow.mjs +500 -0
- package/skills/engineering/resolve-release/scripts/flow.test.mjs +340 -0
- package/skills/engineering/resolve-release/scripts/green-head.mjs +231 -0
- package/skills/engineering/resolve-release/scripts/green-head.test.mjs +101 -0
- package/skills/engineering/resolve-release/scripts/npm-version-absence.mjs +138 -0
- package/skills/engineering/resolve-release/scripts/npm-version-absence.test.mjs +426 -0
- package/skills/engineering/resolve-release/scripts/plan-npm.test.mjs +659 -0
- package/skills/engineering/resolve-release/scripts/plan-toml-boundary.test.mjs +317 -0
- package/skills/engineering/resolve-release/scripts/plan-uv.test.mjs +291 -0
- package/skills/engineering/resolve-release/scripts/plan.mjs +806 -0
- package/skills/engineering/resolve-release/scripts/plan.test.mjs +428 -0
- package/skills/engineering/rush-issues/LICENSE +3 -0
- package/skills/engineering/rush-issues/SKILL.md +58 -0
- package/skills/engineering/rush-issues/agents/openai.yaml +8 -0
- package/skills/engineering/rush-issues/rehydrate.mjs +10 -0
- package/skills/engineering/rush-issues/release-check.mjs +93 -0
- package/skills/engineering/rush-release/LICENSE +3 -0
- package/skills/engineering/rush-release/SKILL.md +35 -0
- package/skills/engineering/rush-release/agents/openai.yaml +8 -0
- package/skills/engineering/rush-release/release-check.mjs +93 -0
- package/skills/engineering/test-quality/LICENSE +3 -0
- package/skills/engineering/test-quality/SKILL.md +79 -0
- package/skills/engineering/test-quality/references/audit.md +80 -0
- package/skills/engineering/test-quality/references/lint.md +24 -0
- package/skills/engineering/test-quality/references/principles.md +143 -0
- package/skills/engineering/test-quality/references/testing-conventions.md +9 -0
- package/skills/engineering/test-quality/release-check.mjs +93 -0
- package/skills/engineering/test-quality/scripts/lint-tests.mjs +574 -0
- package/skills/engineering/test-quality/scripts/lint-tests.test.mjs +591 -0
- package/skills/engineering/test-quality/scripts/mock-policy-config.mjs +176 -0
- package/skills/engineering/test-quality/scripts/mock-policy-config.test.mjs +119 -0
- package/skills/engineering/test-quality/scripts/persist-conventions-core.mjs +117 -0
- package/skills/engineering/test-quality/scripts/persist-conventions.mjs +17 -0
- package/skills/engineering/test-quality/scripts/persist-conventions.test.mjs +104 -0
- package/skills/risk-compliance/compliance-audit/LICENSE +3 -0
- package/skills/risk-compliance/compliance-audit/SKILL.md +439 -0
- package/skills/risk-compliance/compliance-audit/references/findings-schema.md +293 -0
- package/skills/risk-compliance/compliance-audit/references/normalization-rules.md +45 -0
- package/skills/risk-compliance/compliance-audit/references/vars-checklist.md +1068 -0
- package/skills/risk-compliance/compliance-audit/references/vars-findings-schema.md +398 -0
- package/skills/risk-compliance/compliance-audit/release-check.mjs +93 -0
- package/skills/risk-compliance/compliance-audit/scripts/compliance-audit.test.mjs +14 -0
- package/skills/risk-compliance/compliance-audit/scripts/export_tracker_xlsx.py +221 -0
- package/skills/risk-compliance/compliance-audit/scripts/reconcile_tracker.py +458 -0
- package/skills/risk-compliance/compliance-audit/scripts/test_export_tracker_xlsx.py +97 -0
- package/skills/risk-compliance/compliance-audit/scripts/test_validate_tracker.py +157 -0
- package/skills/risk-compliance/compliance-audit/scripts/validate_tracker.py +829 -0
- package/skills/risk-compliance/contract-compare/LICENSE +3 -0
- package/skills/risk-compliance/contract-compare/SKILL.md +199 -0
- package/skills/risk-compliance/contract-compare/references/comparison-dimensions.md +209 -0
- package/skills/risk-compliance/contract-compare/release-check.mjs +93 -0
- package/skills/risk-compliance/contract-review/LICENSE +3 -0
- package/skills/risk-compliance/contract-review/SKILL.md +240 -0
- package/skills/risk-compliance/contract-review/references/review-criteria.md +223 -0
- package/skills/risk-compliance/contract-review/release-check.mjs +93 -0
- package/skills/risk-compliance/doc-authenticity/LICENSE +3 -0
- package/skills/risk-compliance/doc-authenticity/SKILL.md +160 -0
- package/skills/risk-compliance/doc-authenticity/agents/openai.yaml +8 -0
- package/skills/risk-compliance/doc-authenticity/manual-invocation.test.mjs +12 -0
- package/skills/risk-compliance/doc-authenticity/references/agreement.md +66 -0
- package/skills/risk-compliance/doc-authenticity/references/bank-statement.md +150 -0
- package/skills/risk-compliance/doc-authenticity/references/forensic-signals.md +157 -0
- package/skills/risk-compliance/doc-authenticity/references/image-signals.md +114 -0
- package/skills/risk-compliance/doc-authenticity/references/invoice.md +66 -0
- package/skills/risk-compliance/doc-authenticity/references/issuer-profiles.md +86 -0
- package/skills/risk-compliance/doc-authenticity/references/verdict-and-report.md +95 -0
- package/skills/risk-compliance/doc-authenticity/references/verdict.schema.json +81 -0
- package/skills/risk-compliance/doc-authenticity/release-check.mjs +93 -0
- package/skills/risk-compliance/doc-authenticity/scripts/image_forensics.py +294 -0
- package/skills/risk-compliance/doc-authenticity/scripts/pdf_forensics.py +401 -0
- package/skills/risk-compliance/doc-authenticity/scripts/validate_codes.py +224 -0
- package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.py +308 -0
- package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.test.mjs +212 -0
- package/skills/risk-compliance/fraud-analysis/LICENSE +3 -0
- package/skills/risk-compliance/fraud-analysis/SKILL.md +114 -0
- package/skills/risk-compliance/fraud-analysis/references/archetypes/authorized-payment-scam.md +41 -0
- package/skills/risk-compliance/fraud-analysis/references/archetypes/first-party-fraud.md +44 -0
- package/skills/risk-compliance/fraud-analysis/references/archetypes/third-party-fraud.md +27 -0
- package/skills/risk-compliance/fraud-analysis/references/contexts/bank-transfer.md +24 -0
- package/skills/risk-compliance/fraud-analysis/references/contexts/card-payment.md +30 -0
- package/skills/risk-compliance/fraud-analysis/references/contexts/payment-collection.md +20 -0
- package/skills/risk-compliance/fraud-analysis/references/contexts/payout.md +20 -0
- package/skills/risk-compliance/fraud-analysis/references/feature-engineering.md +158 -0
- package/skills/risk-compliance/fraud-analysis/references/mechanisms/account-takeover.md +36 -0
- package/skills/risk-compliance/fraud-analysis/references/report-rationale.md +45 -0
- package/skills/risk-compliance/fraud-analysis/references/report-template.md +190 -0
- package/skills/risk-compliance/fraud-analysis/references/review-checklist.md +175 -0
- package/skills/risk-compliance/fraud-analysis/references/taxonomy.md +79 -0
- package/skills/risk-compliance/fraud-analysis/references/terminology.md +108 -0
- package/skills/risk-compliance/fraud-analysis/references/workflow.md +175 -0
- package/skills/risk-compliance/fraud-analysis/release-check.mjs +93 -0
- package/skills/risk-compliance/payment-analysis/LICENSE +3 -0
- package/skills/risk-compliance/payment-analysis/SKILL.md +180 -0
- package/skills/risk-compliance/payment-analysis/references/auth-rate-actions.md +30 -0
- package/skills/risk-compliance/payment-analysis/references/chargebacks.md +208 -0
- package/skills/risk-compliance/payment-analysis/references/chinese-polish.md +51 -0
- package/skills/risk-compliance/payment-analysis/references/event-layers.md +127 -0
- package/skills/risk-compliance/payment-analysis/references/fx.md +59 -0
- package/skills/risk-compliance/payment-analysis/references/journey.md +79 -0
- package/skills/risk-compliance/payment-analysis/references/metrics.md +67 -0
- package/skills/risk-compliance/payment-analysis/references/report-template.md +119 -0
- package/skills/risk-compliance/payment-analysis/references/terminology.md +95 -0
- package/skills/risk-compliance/payment-analysis/references/visualization.md +56 -0
- package/skills/risk-compliance/payment-analysis/release-check.mjs +93 -0
- package/skills/risk-compliance/report-writing/LICENSE +3 -0
- package/skills/risk-compliance/report-writing/SKILL.md +220 -0
- package/skills/risk-compliance/report-writing/references/audit-report-template.md +121 -0
- package/skills/risk-compliance/report-writing/references/external-assessment-template.md +167 -0
- package/skills/risk-compliance/report-writing/references/management-report-template.md +145 -0
- package/skills/risk-compliance/report-writing/references/vars-report-template.md +224 -0
- package/skills/risk-compliance/report-writing/release-check.mjs +93 -0
- package/skills/risk-compliance/similar-domain/LICENSE +3 -0
- package/skills/risk-compliance/similar-domain/SKILL.md +203 -0
- package/skills/risk-compliance/similar-domain/references/entities.md +67 -0
- package/skills/risk-compliance/similar-domain/references/fingerprints.md +134 -0
- package/skills/risk-compliance/similar-domain/references/pivots.md +82 -0
- package/skills/risk-compliance/similar-domain/references/report-template.md +93 -0
- package/skills/risk-compliance/similar-domain/references/scoring.md +130 -0
- package/skills/risk-compliance/similar-domain/references/terminology.md +41 -0
- package/skills/risk-compliance/similar-domain/references/workflow.md +85 -0
- package/skills/risk-compliance/similar-domain/release-check.mjs +93 -0
- package/skills/risk-compliance/tld-detection/LICENSE +3 -0
- package/skills/risk-compliance/tld-detection/SKILL.md +245 -0
- package/skills/risk-compliance/tld-detection/agents/openai.yaml +9 -0
- package/skills/risk-compliance/tld-detection/references/chinese-polish.md +55 -0
- package/skills/risk-compliance/tld-detection/references/clean.md +51 -0
- package/skills/risk-compliance/tld-detection/references/clustering.md +235 -0
- package/skills/risk-compliance/tld-detection/references/decision.md +189 -0
- package/skills/risk-compliance/tld-detection/references/fx-conversion.md +232 -0
- package/skills/risk-compliance/tld-detection/references/report-template.md +272 -0
- package/skills/risk-compliance/tld-detection/references/streams.md +141 -0
- package/skills/risk-compliance/tld-detection/references/terminology.md +95 -0
- package/skills/risk-compliance/tld-detection/references/workflow.md +95 -0
- package/skills/risk-compliance/tld-detection/release-check.mjs +93 -0
- package/skills/risk-compliance/tld-detection/scripts/detect_ladders.py +390 -0
- package/skills/risk-compliance/tld-detection/scripts/detect_ladders.test.mjs +14 -0
- package/skills/risk-compliance/tld-detection/scripts/detect_streams.py +650 -0
- package/skills/risk-compliance/tld-detection/scripts/detect_streams.test.mjs +14 -0
- package/skills/risk-compliance/tld-detection/tests/test_detect_ladders.py +134 -0
- package/skills/risk-compliance/tld-detection/tests/test_detect_streams.py +520 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# Mergify Configuration
|
|
2
|
+
|
|
3
|
+
The settings this skill opinionates, and the checklist that puts them in
|
|
4
|
+
place. Governed by [Rule 1](../SKILL.md#rule-1--fetch-the-docs-before-writing-config):
|
|
5
|
+
fetch the schema before writing any of it, and finish with `validate` **and**
|
|
6
|
+
`simulate`.
|
|
7
|
+
|
|
8
|
+
## The Four Settings
|
|
9
|
+
|
|
10
|
+
### 1. Enqueue — auto on ready + review-PASS, manual otherwise
|
|
11
|
+
|
|
12
|
+
A PR **auto-enqueues** the moment it is ready, a review has passed, and CI is
|
|
13
|
+
green. Short of that it stays held, and a human enqueues it by hand with
|
|
14
|
+
`@mergifyio queue`.
|
|
15
|
+
|
|
16
|
+
**How:** set `merge_protections_settings.auto_merge_conditions` to that AND-list.
|
|
17
|
+
Its *presence* enables conditional auto-merge; the conditions scope *which* PRs.
|
|
18
|
+
The manual path is not a second setting — `@mergifyio queue` queues a PR
|
|
19
|
+
regardless of `auto_merge_conditions`, and `merge_conditions` gate on CI only
|
|
20
|
+
(never review), so a hand-queued PR still merges on green without a review.
|
|
21
|
+
|
|
22
|
+
```yaml
|
|
23
|
+
merge_protections_settings:
|
|
24
|
+
reporting_method: check-runs
|
|
25
|
+
post_comment: true
|
|
26
|
+
# AUTO-enqueue only a ready PR whose review passed; everything else waits for a
|
|
27
|
+
# human `@mergifyio queue`. "review PASS" = ≥1 approval and no open change request.
|
|
28
|
+
# `-draft` belongs HERE (don't auto-queue a draft), but stays OUT of
|
|
29
|
+
# queue_conditions/merge_conditions — see the `-draft` note further down.
|
|
30
|
+
auto_merge_conditions:
|
|
31
|
+
- "-draft"
|
|
32
|
+
- "#approved-reviews-by >= 1"
|
|
33
|
+
- "#changes-requested-reviews-by = 0"
|
|
34
|
+
- *gate
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Why this is the default and not bare-manual: scoping auto-merge to a *passed
|
|
38
|
+
review* keeps the routine case one-click-free **without** letting an unreviewed
|
|
39
|
+
PR ride in — the failure a review gate exists to stop. It also avoids the mirror
|
|
40
|
+
failure: the retired "auto-queue every non-draft PR" form had no review arm, so a
|
|
41
|
+
green-but-unreviewed PR merged and a reviewer requesting changes could lose the
|
|
42
|
+
race to the queue. The review arm is the point; the manual hatch (above) covers
|
|
43
|
+
the "land it without waiting" case.
|
|
44
|
+
|
|
45
|
+
**To go fully manual instead** (queueing the only entry), omit
|
|
46
|
+
`auto_merge_conditions` entirely and say so in a comment — an omitted key reads as
|
|
47
|
+
an oversight and someone will "fix" it back.
|
|
48
|
+
|
|
49
|
+
Do **not** use `merge_protections_settings.auto_merge: true` or
|
|
50
|
+
`queue_rules[].autoqueue: true` — both are deprecated.
|
|
51
|
+
|
|
52
|
+
Developers enqueue by commenting `@mergifyio queue`, or by ticking the checkbox
|
|
53
|
+
Mergify renders in its queue status comment (`merge_queue.queue_controls_comment`,
|
|
54
|
+
default `true`). Mergify acknowledges a command with a 👍 reaction; **no 👍 means
|
|
55
|
+
the command was not processed**, which is a different problem from a PR that
|
|
56
|
+
failed its conditions.
|
|
57
|
+
|
|
58
|
+
### 2 & 3. Batch mode, size 3
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
queue_rules:
|
|
62
|
+
- name: default
|
|
63
|
+
batch_size: 3
|
|
64
|
+
batch_max_wait_time: 10 seconds
|
|
65
|
+
batch_max_failure_resolution_attempts: 10
|
|
66
|
+
merge_queue:
|
|
67
|
+
max_parallel_checks: 3
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**The default this skill ships is `batch_size: 3`** — written explicitly, never
|
|
71
|
+
assumed: an unset `batch_size` silently runs the queue at Mergify's built-in
|
|
72
|
+
default of 1, i.e. no batching, so the key being present is the act that turns
|
|
73
|
+
batching on. With it set, Mergify does not simply test "the next three in the
|
|
74
|
+
queue": priority and
|
|
75
|
+
queue order seed a batch, **stacks always stay together**, and similarity (shared
|
|
76
|
+
scopes, then changed directories, then queue time) fills the remaining slots.
|
|
77
|
+
Related PRs enqueued together reliably ride one batch — that is how the queue
|
|
78
|
+
collects a delivery — while unrelated ones may split, deliberately, so one PR's
|
|
79
|
+
failure cannot drag unrelated work into a bisection. When a batch goes red,
|
|
80
|
+
Mergify **bisects** it — splitting and retesting until it isolates the culprit,
|
|
81
|
+
then dequeuing only that PR. Innocent PRs stay in the queue. `max_parallel_checks`
|
|
82
|
+
caps how many splits run at once, so match it to `batch_size`; more is wasted.
|
|
83
|
+
|
|
84
|
+
`batch_max_wait_time` is the knob that decides how eagerly the queue collects a
|
|
85
|
+
batch, and it is a straight latency tax on a **lone** PR — Mergify waits the full
|
|
86
|
+
window before giving up on company. Where PRs arrive one at a time, keep it at
|
|
87
|
+
seconds, not minutes. Where delivery is bursty — an epic landing a stack, a set
|
|
88
|
+
of related PRs expected together — a longer window (a few minutes) buys the batch
|
|
89
|
+
(N PRs, one CI run) at the cost of a slightly slower lone PR. Set it from how PRs
|
|
90
|
+
actually arrive, not from either extreme.
|
|
91
|
+
|
|
92
|
+
The default is **10 seconds**, not 0. A coordinated enqueue (`stack-push.mjs
|
|
93
|
+
--enqueue`, an epic's units) lands its PRs within seconds, and those were most
|
|
94
|
+
of the batches a two-week audit of seven repos found (27 formed in the wait
|
|
95
|
+
window, 18 behind a running check, 2026-09-27 → 10-10). At 0 the first PR of a
|
|
96
|
+
burst starts alone: with `max_parallel_checks > 1` the rest each start their
|
|
97
|
+
own check (more CI runs), and with `max_parallel_checks: 1` they wait out the
|
|
98
|
+
first PR's whole run before batching (slower). PRs that pile up behind a
|
|
99
|
+
running check still batch at any window.
|
|
100
|
+
|
|
101
|
+
**Two hard requirements:**
|
|
102
|
+
|
|
103
|
+
- GitHub branch protection **"Require branches to be up to date before merging"
|
|
104
|
+
must be DISABLED.** Batches cannot merge with it on — the original PRs are not
|
|
105
|
+
up to date by GitHub's reckoning even though the batch was tested against base.
|
|
106
|
+
This is the single most common reason a batched queue never merges anything.
|
|
107
|
+
- Batching disables **in-place checks**. In-place is only active when all three
|
|
108
|
+
hold: `max_parallel_checks == 1`, every queue has `batch_size == 1`, *and*
|
|
109
|
+
every queue CI is single-step (no extra `merge_conditions` — either empty or
|
|
110
|
+
identical to `queue_conditions`). A second queue-only check in
|
|
111
|
+
`merge_conditions` fails the third condition even at `batch_size 1`. Everything
|
|
112
|
+
downstream of that (below) follows from it.
|
|
113
|
+
|
|
114
|
+
Revisit the size from evidence, not taste: if batches go red often enough that
|
|
115
|
+
bisection is the normal path, the changes are less independent than assumed and
|
|
116
|
+
3 is too wide.
|
|
117
|
+
|
|
118
|
+
### 4. Enforce head (freshness against base)
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
queue_rules:
|
|
122
|
+
- name: default
|
|
123
|
+
update_method: rebase # rebase | merge
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Read this before relying on it.** `update_method` governs how a PR is updated
|
|
127
|
+
with its base branch **when the check is done in place** — and in-place checks
|
|
128
|
+
are off whenever `batch_size > 1`. Under `batch_size: 3` the option is inert.
|
|
129
|
+
|
|
130
|
+
That is not a gap. With batching, Mergify builds a **queue branch** of
|
|
131
|
+
`base + batch` and runs CI there, so what gets tested is always fresh against
|
|
132
|
+
base by construction. The PR's own branch simply is not what gets tested.
|
|
133
|
+
|
|
134
|
+
Keep `update_method: rebase` in the config anyway, so dropping to `batch_size: 1`
|
|
135
|
+
does not silently change behaviour — but comment it, or the next reader will
|
|
136
|
+
believe it is doing work it is not.
|
|
137
|
+
|
|
138
|
+
**If you need the PR branch itself kept fresh** (e.g. contributors run local
|
|
139
|
+
checks against it), that is a separate lever:
|
|
140
|
+
|
|
141
|
+
| Want | Use |
|
|
142
|
+
|------|-----|
|
|
143
|
+
| Fresh tree under test | Nothing — the queue branch already gives you this |
|
|
144
|
+
| Rebase the PR branch, on demand | `@mergifyio update` or `@mergifyio rebase` comment |
|
|
145
|
+
| Rebase the PR branch, automatically | a `pull_request_rules` entry with the `update` or `rebase` action |
|
|
146
|
+
| Fresh head at enqueue time | `#commits-behind = 0` in `queue_conditions` (blocks entry rather than fixing it) |
|
|
147
|
+
|
|
148
|
+
Automatic updating fights the queue — every update retriggers the PR's CI — so
|
|
149
|
+
prefer on-demand unless you have a reason.
|
|
150
|
+
|
|
151
|
+
## The Queue Run Is The Integration Run
|
|
152
|
+
|
|
153
|
+
Rules settled by the 2026-10-10 audit of seven repos (Mergify event log,
|
|
154
|
+
2026-09-27 → 10-10). Each one is a one-liner; the example is the shape to copy.
|
|
155
|
+
|
|
156
|
+
- **Run each heavy check once, in the queue only.** Never copy a queue-only
|
|
157
|
+
check (authenticated E2E, integration, smoke) onto the PR lane to "catch it
|
|
158
|
+
earlier": that runs it twice and lengthens integration. Make it reliable
|
|
159
|
+
instead. Example: identity's `Queue authenticated validation` stays on
|
|
160
|
+
`mergify/merge-queue/**` only; its flakes were fixed in the test, not moved.
|
|
161
|
+
- **Never skip the tests on the queue branch.** A queue lane that reports green
|
|
162
|
+
without testing turns the queue into a slow merge button. Example (kyc, the
|
|
163
|
+
anti-pattern): `if [[ "$HEAD_REF" == mergify/merge-queue/* ]]; then echo
|
|
164
|
+
skip=true` — the queue ran 1.4 min against 10.6 min on PRs, and main CI then
|
|
165
|
+
failed 7 of 16 times.
|
|
166
|
+
- **Do not rerun CI on push to the base branch.** The queue already tested the
|
|
167
|
+
exact tree that lands there, and the `update` rule makes the queue the only
|
|
168
|
+
way in. Drop `push: branches: [main]` from test workflows and drop nightly
|
|
169
|
+
`schedule:` reruns of the gate; keep deploy and post-deploy workflows, which
|
|
170
|
+
do work the queue cannot. Do not build verdict-reuse machinery to make the
|
|
171
|
+
main run cheap — remove the trigger. Example (ai #1687, identity #1222,
|
|
172
|
+
a1 #387): `on: { pull_request: , workflow_dispatch: }`. Keep a `schedule:`
|
|
173
|
+
only for a different job, such as a weekly full-history security scan.
|
|
174
|
+
- **Size `max_parallel_checks` to the runners, not to `batch_size`.** On a
|
|
175
|
+
shared self-hosted pool, one batch can fill the pool; a second speculative
|
|
176
|
+
batch only queues for runners and slows every shard. Example: identity keeps
|
|
177
|
+
`max_parallel_checks: 1` because one batch runs ~10 jobs on ~13 org-wide
|
|
178
|
+
runners and shard waits already reached p90 197 s.
|
|
179
|
+
- **Fix a flaky queue check; retry only as a dated stopgap.** Each flaky
|
|
180
|
+
failure costs a full queue run plus a re-enqueue. `max_checks_retries: 1`
|
|
181
|
+
re-runs a failed batch once before splitting or dequeuing; set it only with a
|
|
182
|
+
comment listing the flakes being fixed and saying to return it to 0. Example:
|
|
183
|
+
fmm-express #1541.
|
|
184
|
+
- **Set no checks timeout.** `checks_timeout` defaults to `auto` (p95 of recent
|
|
185
|
+
queue runs plus a margin). On a busy shared runner pool, a run that is only
|
|
186
|
+
waiting for runners crosses it, and Mergify dequeues and bisects PRs whose
|
|
187
|
+
checks would pass. Set `checks_timeout: null` on every queue rule; a hung job
|
|
188
|
+
is ended by its own `timeout-minutes`. Example (2026-10-10): fmm-express at 35
|
|
189
|
+
min and skyee at auto ~43 min dequeued green PRs while waiting for runners.
|
|
190
|
+
|
|
191
|
+
## Stack-ready
|
|
192
|
+
|
|
193
|
+
**A GitHub-native stack needs only Mergify's ruleset bypass `exempt`
|
|
194
|
+
([branch-protection.md](branch-protection.md)).** GitHub runs a native stack's
|
|
195
|
+
PR CI as if each PR targets the stack base, and Mergify rebases a survivor
|
|
196
|
+
itself after a partial landing, so a `branches: [main]` filter and a squash
|
|
197
|
+
queue both work. Native stacks are the `mergify stack push` default and what
|
|
198
|
+
`resolve-issues` `stack` mode builds (`gh stack link`).
|
|
199
|
+
Example (stack-sandbox, 2026-10-20): a `[main]`-filtered workflow ran on every
|
|
200
|
+
PR of a three-PR native stack, and a squash queue landed it whole, then
|
|
201
|
+
partially with the top PR red.
|
|
202
|
+
|
|
203
|
+
**A `Depends-On` stack (`--no-github-native`, or a push GitHub refused to
|
|
204
|
+
register), or a `resolve-issues` chain, needs three more settings:**
|
|
205
|
+
|
|
206
|
+
- **Run PR CI on every base.** On every workflow behind a required check, use
|
|
207
|
+
`on: { pull_request: }` with no `branches:` filter, or `branches: ["**"]`. A
|
|
208
|
+
filter to the base branch never runs on a PR based on another PR's branch,
|
|
209
|
+
so the stack gets no CI until each parent merges. Example (2026-10-16):
|
|
210
|
+
fmm-express (`test.yml`, `android.yml`) and identity (`ci.yml`) filtered to
|
|
211
|
+
`[main]`.
|
|
212
|
+
- **Merge with commits kept.** `merge_method: merge-batch` with
|
|
213
|
+
`batch_size: 3`, or `merge` at batch size 1. `squash` and `rebase` rewrite
|
|
214
|
+
the commits a child PR is built on, so it conflicts once its parent lands.
|
|
215
|
+
Example: kyc's `default` queue squashed.
|
|
216
|
+
- **Auto-delete head branches** (setup step 8), so `Depends-On` stack survivors retarget.
|
|
217
|
+
|
|
218
|
+
`audit.mjs` reports the first two as notes (`merge-method`, `stacked-pr-ci`),
|
|
219
|
+
never warnings; it reads `.github/workflows` beside the config, or
|
|
220
|
+
`--workflows <dir>`. It cannot tell which workflows run a required check, so it
|
|
221
|
+
notes any base-filtered `pull_request` trigger.
|
|
222
|
+
|
|
223
|
+
## Setup Checklist
|
|
224
|
+
|
|
225
|
+
1. Fetch the schema and the relevant doc pages.
|
|
226
|
+
2. Copy `assets/templates/mergify.yml` → `.mergify.yml`; replace placeholders.
|
|
227
|
+
3. Remove `push: branches: [<base>]` and gate-rerun `schedule:` triggers from test
|
|
228
|
+
workflows ([The Queue Run Is The Integration Run](#the-queue-run-is-the-integration-run)).
|
|
229
|
+
Name the CI roll-up job in the `gate` anchor. It must report on every PR (no workflow
|
|
230
|
+
`paths:`; `github-actions` skill). Path-filtered workflow you can't fix: add the `or`
|
|
231
|
+
exemption and list the workflow file's own path ([traps.md](traps.md)).
|
|
232
|
+
4. `mergify config validate`.
|
|
233
|
+
5. `mergify config simulate <PR-URL>` against a real PR; with an exemption, use a PR
|
|
234
|
+
that hits the exempt path.
|
|
235
|
+
6. **Audit against this skill's default:**
|
|
236
|
+
`node ~/.agents/skills/mergify/scripts/audit.mjs --file .mergify.yml`.
|
|
237
|
+
(Absolute, like the watcher above: you run this from the repo being audited, where a
|
|
238
|
+
CWD-relative `scripts/…` does not resolve.)
|
|
239
|
+
It checks the shape `config validate` can't — [stack-ready](#stack-ready) notes (commits
|
|
240
|
+
kept, CI on stacked PRs, for `Depends-On` stacks), enqueue policy (hybrid vs the retired
|
|
241
|
+
indiscriminate auto-queue), `branch_protection_injection_mode: merge`, the
|
|
242
|
+
define-once/assert-many gate anchor, `-draft` misplaced in queue/merge
|
|
243
|
+
conditions, and batch mode actually on (`batch_size: 3` — this skill's
|
|
244
|
+
default; an unset `batch_size` runs at Mergify's built-in 1, so batching
|
|
245
|
+
silently off is a real state). It **abstains** rather than guess, so a `?` means "check by hand," not
|
|
246
|
+
"fine." `--json` for machine output; exits non-zero on any warn (`--allow-warn` to
|
|
247
|
+
downgrade). Runs on the committed `.mergify.yml`, so it fits a pre-merge check.
|
|
248
|
+
7. Confirm Mergify's app id: `gh api /apps/mergify --jq .id`.
|
|
249
|
+
8. **Enable GitHub "Automatically delete head branches"** before relying on
|
|
250
|
+
stacked PRs in the merge queue:
|
|
251
|
+
`gh api repos/<owner>/<repo> -X PATCH -f delete_branch_on_merge=true`.
|
|
252
|
+
With this off, survivors of a stack dequeue with "could not be retargeted
|
|
253
|
+
onto the queue base branch" after a parent merges — see
|
|
254
|
+
[`traps.md`](traps.md). Confirm: `gh api repos/<owner>/<repo> --jq .delete_branch_on_merge`.
|
|
255
|
+
9. `gh ruleset list` — if a ruleset already covers this branch, fold these rules
|
|
256
|
+
into it (**PUT**) rather than stacking a second one. Overlapping rulesets are
|
|
257
|
+
additive and the most restrictive wins, which is a confusing way to be blocked.
|
|
258
|
+
10. Inventory anything that pushes to the protected branch — the `update` rule
|
|
259
|
+
will block it. Add each as a bypass actor (GitHub Actions = `15368`):
|
|
260
|
+
`grep -rnE 'git push|create-pull-request|github-script' .github/workflows/`
|
|
261
|
+
11. Apply `assets/templates/ruleset.json`. Dry-run with
|
|
262
|
+
`"enforcement": "evaluate"` first if you want to see what it would block —
|
|
263
|
+
read the results from `rule-suites`.
|
|
264
|
+
12. Prove the allowed path **before** the blocked one: enqueue a PR with
|
|
265
|
+
`@mergifyio queue`, confirm the 👍, and watch `mergify queue show <number> -v`
|
|
266
|
+
through to merge. A ruleset strict enough to block humans can also block
|
|
267
|
+
Mergify if a bypass id is wrong, and you would rather learn that while you
|
|
268
|
+
can still merge the fix.
|
|
269
|
+
13. Now prove the blocked path: open a throwaway PR and try to merge it without
|
|
270
|
+
enqueuing, as a non-bypass user. GitHub must refuse, naming the ruleset.
|
|
271
|
+
14. Decide the escape hatches: keep `priority_rules` (jump the line), and either
|
|
272
|
+
keep or delete the `emergency-merge` rule (skips CI, cannot be limited to
|
|
273
|
+
admins). Keep the `OrganizationAdmin` bypass either way — it is the only way
|
|
274
|
+
back in if Mergify has an outage.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Diagnosing A Stuck PR
|
|
2
|
+
|
|
3
|
+
Two tools, two different questions — and when they disagree, the disagreement is
|
|
4
|
+
itself the diagnosis. For watching a PR through to merge (a different job, with
|
|
5
|
+
its own rules) see [`watch-contract.md`](watch-contract.md).
|
|
6
|
+
|
|
7
|
+
## Querying PR and Queue Status
|
|
8
|
+
|
|
9
|
+
### Mergify's own view — why a PR is or isn't moving
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
mergify queue status # all batches + waiting PRs
|
|
13
|
+
mergify queue status --branch main # one branch
|
|
14
|
+
mergify queue status --json # parseable
|
|
15
|
+
mergify queue show <number> # one PR: position, priority, CI state
|
|
16
|
+
mergify queue show <number> -v # + full checks table and conditions tree
|
|
17
|
+
mergify queue show <number> --json
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`queue show` takes the bare PR number: `2399`, never a URL or `#2399`. Outside
|
|
21
|
+
the repo's checkout, add `--repository <owner/repo>` (or `-r`); `--repo` and
|
|
22
|
+
`-R` do not exist.
|
|
23
|
+
Example: `mergify queue show 2399 --repository 1aboveio/agentier --json`.
|
|
24
|
+
|
|
25
|
+
`mergify queue show <number> -v` is the one to reach for. The conditions tree shows
|
|
26
|
+
which conditions are met and **which single one is blocking** — that is the
|
|
27
|
+
answer to "why is this stuck", and nothing else in the toolchain reports it.
|
|
28
|
+
|
|
29
|
+
Queue states worth recognising:
|
|
30
|
+
|
|
31
|
+
| State | Meaning |
|
|
32
|
+
|-------|---------|
|
|
33
|
+
| `waiting_for_batch` | Queued, not yet picked into a batch |
|
|
34
|
+
| `waiting_for_previous_batches` | Blocked on an earlier batch |
|
|
35
|
+
| `preparing` / `running` | Batch is being set up / running CI |
|
|
36
|
+
| `bisecting` | Batch failed; splitting to find the culprit |
|
|
37
|
+
| `failed` | CI failed for this batch |
|
|
38
|
+
| `waiting_for_merge` | CI passed, waiting on GitHub |
|
|
39
|
+
| `waiting_schedule` | Outside the configured merge schedule |
|
|
40
|
+
| `frozen` | Queue is paused |
|
|
41
|
+
|
|
42
|
+
### GitHub's view — the raw checks and merge state
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
gh pr checks <PR> # check-run table, exit 1 if any failed
|
|
46
|
+
gh pr checks <PR> --watch # block until they settle
|
|
47
|
+
gh pr view <PR> --json state,isDraft,mergeable,mergeStateStatus,statusCheckRollup
|
|
48
|
+
gh pr view <PR> --json labels --jq '.labels[].name' # queued / dequeued labels
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Mergify labels a PR `queued` on entry and `dequeued` on removal
|
|
52
|
+
(`merge_queue.queued_label` / `dequeued_label`). These are **lifecycle** signals,
|
|
53
|
+
not a cheap membership check — what they mean depends on what you saw before
|
|
54
|
+
them, which is why reading them is the watcher's job and not a one-off `gh`
|
|
55
|
+
call. See [`watch-contract.md`](watch-contract.md).
|
|
56
|
+
|
|
57
|
+
### Which one to ask
|
|
58
|
+
|
|
59
|
+
Use **both, in this order** — they answer different questions and disagreeing
|
|
60
|
+
answers are themselves the diagnosis:
|
|
61
|
+
|
|
62
|
+
1. `mergify queue show <number> -v` — is it in the queue, and what condition blocks it?
|
|
63
|
+
2. `gh pr checks <PR>` — is the underlying CI actually green?
|
|
64
|
+
|
|
65
|
+
A check that is **green in GitHub but unmet in Mergify** means the condition
|
|
66
|
+
names the wrong check. A check that is **absent** (never created, e.g. filtered
|
|
67
|
+
out by the workflow's `paths:`) reads as permanently unmet — see the trap below.
|
|
68
|
+
|
|
69
|
+
### Pause / resume
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
mergify queue pause --reason "production incident — halting merges"
|
|
73
|
+
mergify queue unpause
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Pausing does not cancel running CI; it stops new merges. The reason is visible
|
|
77
|
+
to everyone in `queue status`. Add `--yes-i-am-sure` in scripts.
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
## Measuring A Slow Queue
|
|
81
|
+
|
|
82
|
+
Measure before tuning. Mergify's event log answers "is the queue slow, and why"
|
|
83
|
+
per repo; `gh pr checks` cannot.
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
curl -s -H "Authorization: Bearer $(gh auth token)" \
|
|
87
|
+
"https://api.mergify.com/v1/repos/<owner>/<repo>/logs?per_page=100&received_from=<ISO date>"
|
|
88
|
+
# follow the `Link: rel="next"` header to page
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Events to use: `action.queue.enter` / `leave` (`metadata.queued_at`,
|
|
92
|
+
`dequeue_code`, `merged`, `pull_request_head_sha`, `unsuccessful_checks`) and
|
|
93
|
+
`action.queue.checks_start` / `checks_end` (`speculative_check_pull_request`:
|
|
94
|
+
`pull_request_numbers`, `checks_started_at`, `checks_ended_at`,
|
|
95
|
+
`checks_conclusion`).
|
|
96
|
+
|
|
97
|
+
Compute, per repo:
|
|
98
|
+
|
|
99
|
+
| Metric | Healthy | Points at |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| First-try merge rate | ≥ 85 % | Below it: queue-only checks failing |
|
|
102
|
+
| `CHECKS_FAILED` later merged with the **same head SHA** | ≈ 0 | Flaky or infra failure — fix the check ([configuration.md](configuration.md#the-queue-run-is-the-integration-run)) |
|
|
103
|
+
| Time in queue minus queue CI duration | ≈ 1 min | More: `batch_max_wait_time` or `max_parallel_checks` waits |
|
|
104
|
+
| Multi-PR batches formed in the wait window vs behind a running check | — | Whether `batch_max_wait_time` is earning its latency |
|
|
105
|
+
|
|
106
|
+
Then read the failing job logs (`gh run view <id> --log-failed`) and group by
|
|
107
|
+
cause: real defect, flaky test, in-repo infra (artifact upload resets, ports,
|
|
108
|
+
caches), or outside the repo (runner host, package mirror). Only the middle two
|
|
109
|
+
are fixed in the repo.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Stacked PRs (`mergify stack`)
|
|
2
|
+
|
|
3
|
+
> Read when: pushing, opening, updating, or enqueuing PRs in a repo with Mergify stack hooks;
|
|
4
|
+
> the pre-push hook says "Use 'mergify stack push'"; a `Change-Id` is missing.
|
|
5
|
+
|
|
6
|
+
## CLI version
|
|
7
|
+
|
|
8
|
+
**Use mergify CLI 2026.10.5 or newer.** `stack-push.mjs` refuses an older one (exit 6). Since
|
|
9
|
+
2026.9.16.1, `stack push` registers a GitHub-native stack by default: GitHub holds the order, and
|
|
10
|
+
PR bodies carry no `Depends-On:`. Mergify's queue lands it only when Mergify's bypass on every
|
|
11
|
+
ruleset protecting the base is `exempt` ([traps.md](traps.md)).
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
mergify --version
|
|
15
|
+
brew upgrade mergify-cli # untrusted-tap refusal: brew trust --formula mergifyio/tap/mergify-cli
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## When a repo uses stacks
|
|
19
|
+
|
|
20
|
+
- **Stack repo:** `.git/hooks/mergify-hooks/` exists (installed by `mergify stack setup`). Every
|
|
21
|
+
commit gets a `Change-Id:` trailer; the pre-push hook refuses plain `git push` on a branch
|
|
22
|
+
with an upstream.
|
|
23
|
+
- **Not a stack repo:** no hooks. Push with `git push` + `gh pr create` (`github-flow`). Never
|
|
24
|
+
use `mergify stack` there, and never wait on a queue the repo has no `.mergify.yml` for.
|
|
25
|
+
|
|
26
|
+
## Workflow
|
|
27
|
+
|
|
28
|
+
1. Start a stack branch that tracks trunk: `mergify stack new <type>/<topic>`.
|
|
29
|
+
2. Commit. **One commit = one PR.** Put `Closes #<n>` in the commit message, not only the PR body.
|
|
30
|
+
3. Push:
|
|
31
|
+
```bash
|
|
32
|
+
node <mergify-skill>/scripts/stack-push.mjs # push, report PR numbers
|
|
33
|
+
node <mergify-skill>/scripts/stack-push.mjs --enqueue # push, then enqueue every stack PR
|
|
34
|
+
node <mergify-skill>/scripts/stack-push.mjs --dry-run # show the plan only
|
|
35
|
+
```
|
|
36
|
+
It refuses a non-stack repo (exit 3), stops on a missing `Change-Id` or empty stack (exit
|
|
37
|
+
4), refuses a CLI older than 2026.10.5 (exit 6), and prints each PR as JSON on stdout. The last stderr line lists the PRs.
|
|
38
|
+
4. Fix after review or CI: amend the commit that PR belongs to, then push again. A new commit
|
|
39
|
+
opens a new PR. New commits cancel a PR's queue request, so push a queued PR with
|
|
40
|
+
`--enqueue`; without it, the script warns which PRs need requeueing.
|
|
41
|
+
- Tip commit: `git commit --amend`.
|
|
42
|
+
- Older commit: commit the fix on top, then `mergify stack squash <fix-sha> into <target-sha>`.
|
|
43
|
+
Squash keeps the target's message and `Change-Id`, so its PR updates in place.
|
|
44
|
+
5. Enqueue the whole stack together (Rule 3), then watch each PR with `watch-pr-delivery.mjs`.
|
|
45
|
+
6. After a lower PR merges: `mergify stack sync`, then push again.
|
|
46
|
+
|
|
47
|
+
## Rules
|
|
48
|
+
|
|
49
|
+
- **Never `git push --no-verify`** to get past the stack hook, and never `stack push --no-verify`.
|
|
50
|
+
- **A multi-commit branch that must be one PR** (an integration branch): ask the user before
|
|
51
|
+
`git branch --unset-upstream` + `git push`. A stack push there opens one PR per commit.
|
|
52
|
+
- **Pass `--trunk origin/main`.** Without it the CLI may resolve trunk from the branch's own
|
|
53
|
+
upstream ("targets itself", "could not determine trunk branch"). The script always passes it.
|
|
54
|
+
- **Keep PR bodies:** push with `--keep-pull-request-title-and-body`, or set it once per repo:
|
|
55
|
+
`git config mergify-cli.stack-keep-pr-title-body true`. Without it every push rewrites the
|
|
56
|
+
title and body from the commit message.
|
|
57
|
+
- **Keep the `Change-Id:` trailer in the last paragraph** of the message. A cherry-pick, a
|
|
58
|
+
`commit-tree`, or a rewritten message can drop it; `git commit --amend --no-edit` re-adds it.
|
|
59
|
+
A changed or missing `Change-Id` closes the old PR and opens a new one.
|
|
60
|
+
- **Find a PR by number from `mergify stack list --json`** (`entries[].pull_number`). Its head
|
|
61
|
+
branch is `stack/<user>/<branch>/<slug>--<id>`; `gh pr view <local-branch>` finds nothing.
|
|
62
|
+
- **Rebase conflict** ("rebase failed — there may be conflicts"): resolve, `git rebase
|
|
63
|
+
--continue`, push again. `--skip-rebase` only to avoid dismissing approvals.
|
|
64
|
+
- **Retarget or dequeue after a parent merges** ("could not be retargeted"): see
|
|
65
|
+
[traps.md](traps.md) (`delete_branch_on_merge`, `--force-rebase`).
|
|
66
|
+
|
|
67
|
+
## Command card
|
|
68
|
+
|
|
69
|
+
| Do | Command |
|
|
70
|
+
|---|---|
|
|
71
|
+
| Push / create / update PRs | `mergify stack push --trunk origin/main --keep-pull-request-title-and-body` |
|
|
72
|
+
| Preview | add `--dry-run` |
|
|
73
|
+
| List commits and PRs | `mergify stack list --trunk origin/main [--json]` |
|
|
74
|
+
| New stack branch | `mergify stack new <name>` |
|
|
75
|
+
| Fold a fix into an older commit | `mergify stack squash <src>... into <target>` |
|
|
76
|
+
| Fold commits into their parent | `mergify stack fixup <commit>...` |
|
|
77
|
+
| Pause a rebase at a commit to amend it | `mergify stack edit <commit>`, amend, `git rebase --continue` |
|
|
78
|
+
| Reword, reorder, drop | `mergify stack reword` / `reorder` / `drop` |
|
|
79
|
+
| Rebase on trunk, drop merged | `mergify stack sync` |
|
|
80
|
+
| Check out a stack from GitHub | `mergify stack checkout <name>` |
|
|
81
|
+
| Install hooks | `mergify stack setup` |
|
|
82
|
+
| CLI version (needs 2026.10.5+) | `mergify --version` |
|
|
83
|
+
|
|
84
|
+
Not commands: `stack status`, `stack submit`, `mergify version`, `--repo` (use `--repository`).
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Traps
|
|
2
|
+
|
|
3
|
+
These are the ones that cost real time. Each has been hit in production.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
**A path-filtered check is *absent*, not failing.** If the workflow has an
|
|
7
|
+
`on.pull_request.paths:` filter, a PR touching none of those paths never creates
|
|
8
|
+
the check — and `check-success = <name>` can never be satisfied. Those PRs sit in
|
|
9
|
+
the queue forever with nothing reporting why. Fix the workflow: drop `paths:` and
|
|
10
|
+
filter inside the job behind one always-reporting `gate` (`github-actions` skill,
|
|
11
|
+
`conditional-ci.md`). If you cannot, write the condition as an `or` with an
|
|
12
|
+
explicit `-files ~=` exemption, and **include the
|
|
13
|
+
workflow file's own path in the exemption** — otherwise a workflow-only PR takes
|
|
14
|
+
the exempt branch and can merge with the gate red, which is precisely the change
|
|
15
|
+
most able to disable the gate.
|
|
16
|
+
|
|
17
|
+
**Never write `success_conditions: [queue-name = default]`** in a
|
|
18
|
+
`merge_protections` rule to force merges through the queue. Merge-protection
|
|
19
|
+
conditions are injected into the queue's **entry** conditions, while the GitHub
|
|
20
|
+
ruleset requires the resulting check **before** entry — entry waits on a check
|
|
21
|
+
that cannot go green until after entry, and the repository deadlocks with every
|
|
22
|
+
PR parked at "Waiting for queue conditions". `branch_protection_injection_mode:
|
|
23
|
+
merge` does **not** prevent this; it governs GitHub-side injection, not Mergify's
|
|
24
|
+
own merge protections. Queue-only merges are a **GitHub ruleset** job, not a
|
|
25
|
+
Mergify-config job — use the `update` rule, as in
|
|
26
|
+
[Enforcing Queue-Only Merges](branch-protection.md#enforcing-queue-only-merges).
|
|
27
|
+
|
|
28
|
+
**A required status check does not make the queue mandatory.** Once it goes
|
|
29
|
+
green, anyone with write access can merge directly and the queue never sees the
|
|
30
|
+
PR. Only the `update` rule stops that.
|
|
31
|
+
|
|
32
|
+
**`update` locks out your own automation.** Enabling it without adding the
|
|
33
|
+
GitHub Actions app (or whatever pushes to the branch) as a bypass actor turns
|
|
34
|
+
every release/version-bump job red. Inventory pushers before you enable it.
|
|
35
|
+
|
|
36
|
+
**Do not make Mergify the sole bypass actor without a break-glass path.** If
|
|
37
|
+
Mergify is the only actor that can write to the branch and Mergify has an
|
|
38
|
+
outage, nobody can merge the fix either. Keep `OrganizationAdmin` bypass.
|
|
39
|
+
|
|
40
|
+
**Define the gate once, assert it three times.** The queue-entry gate, the
|
|
41
|
+
queue-merge gate and the GitHub-required merge protection must be the same YAML
|
|
42
|
+
anchor. Three hand-written copies drift, and the drift shows up as an
|
|
43
|
+
unmergeable PR, not as an error.
|
|
44
|
+
|
|
45
|
+
**`merge_conditions` re-asserting `queue_conditions` is not redundant.** Mergify
|
|
46
|
+
tests the batch merged with its base — a tree that existed when no individual
|
|
47
|
+
PR's CI ran.
|
|
48
|
+
|
|
49
|
+
**`-draft` is deliberately absent** from `queue_conditions` and
|
|
50
|
+
`merge_conditions`. Auto-enqueue skips drafts (`-draft` in `auto_merge_conditions`), and
|
|
51
|
+
a leftover draft condition presents as "queued, no reason given". Know what the
|
|
52
|
+
absence costs before you re-add it or rely on it: GitHub cannot merge a draft PR,
|
|
53
|
+
so a draft that *is* enqueued rides a whole batch CI run and then fails at the
|
|
54
|
+
merge call, taking the batch's innocent PRs through that failure. Marking a
|
|
55
|
+
queued PR as draft no longer dequeues it either — `@mergifyio dequeue` does.
|
|
56
|
+
|
|
57
|
+
**Stop drafts at *creation*, not just at the queue.** The paragraph above is the
|
|
58
|
+
queue side — it does not stop a PR being *born* a draft, and the queue does not
|
|
59
|
+
filter drafts out. So the guard belongs where PRs are opened. `mergify stack`
|
|
60
|
+
opens each PR per its `--draft` flag, falling back to git config
|
|
61
|
+
`mergify-cli.stack-create-as-draft`, which is `false` when unset and only counts
|
|
62
|
+
the literal string `"true"`. The failure mode is therefore a **global**
|
|
63
|
+
`mergify-cli.stack-create-as-draft=true` inherited into every repo, silently
|
|
64
|
+
drafting every agent-opened PR. Pin it off in the repo so no inherited value can
|
|
65
|
+
flip it:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
git config mergify-cli.stack-create-as-draft false
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
An explicit `--draft` on the `mergify stack` invocation still overrides this, so
|
|
72
|
+
also confirm no wrapper or alias passes it. (Deliberate drafting is a separate
|
|
73
|
+
case: `resolve-issues`' integration gate converts per-unit PRs to draft *after*
|
|
74
|
+
opening the combined PR — that is intended and not what this guard is about.)
|
|
75
|
+
|
|
76
|
+
**Under a required Mergify check, set `branch_protection_injection_mode: merge`.**
|
|
77
|
+
The default (`queue`) injects ruleset requirements into entry conditions too, and
|
|
78
|
+
a Mergify check that deliberately fails pre-queue then blocks the enqueue that
|
|
79
|
+
would make it pass.
|
|
80
|
+
|
|
81
|
+
**`Depends-On` stacked PRs dequeue with "could not be retargeted onto the queue base
|
|
82
|
+
branch" when head branches survive merge.** This applies to a `Depends-On` stack
|
|
83
|
+
(`--no-github-native`, or a push that printed `not registered on GitHub`); GitHub
|
|
84
|
+
retargets a native stack's next PR itself, and auto-delete stays on as the guard. This is not a `.mergify.yml`
|
|
85
|
+
`batch_size` / `merge-batch` bug. Mergify *can* land a stack when members are
|
|
86
|
+
queued together (stack-aware base + batching), but after a lower member merges
|
|
87
|
+
GitHub must restack the survivors onto `main`. That retarget happens when the
|
|
88
|
+
merged PR's **head branch is deleted**. If the repository has
|
|
89
|
+
`delete_branch_on_merge: false`, parent stack refs stay on the remote, GitHub
|
|
90
|
+
never moves the next PR's base from `parent-head` → `main`, and Mergify dequeues
|
|
91
|
+
with `base-ref-alignment-timeout` / "stacked on another whose head branch still
|
|
92
|
+
exists after merging" — even while the tip was already in the queue and draft
|
|
93
|
+
batch CI was green. Hit on skyee-ai-risk ADR 0044 stack (#2108 after #2107;
|
|
94
|
+
#2110 after #2108/#2109). Fix the repo setting, not the queue rule:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
gh api repos/<owner>/<repo> -X PATCH -f delete_branch_on_merge=true \
|
|
98
|
+
--jq .delete_branch_on_merge
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Verify with `gh api repos/<owner>/<repo> --jq .delete_branch_on_merge` (must be
|
|
102
|
+
`true`). If a tip is already stuck, `mergify stack push --force-rebase` (or a
|
|
103
|
+
manual base edit onto `main`) unblocks that incident; auto-delete prevents the
|
|
104
|
+
next one. On a `Depends-On` stack (`--no-github-native`), keep the full
|
|
105
|
+
`Depends-On: #N` chain on every member — without it Mergify may not treat the
|
|
106
|
+
chain as a stack and keeps literal bases, which collides with
|
|
107
|
+
`queue_conditions: base = main`. A GitHub-native stack carries no `Depends-On`;
|
|
108
|
+
Mergify reads its order from GitHub. Do not merge unrelated `main` PRs
|
|
109
|
+
through the middle of an open stack unless you expect another rebase cycle.
|
|
110
|
+
For GitHub-native stacks, Mergify's ruleset bypass should be **`exempt`** (not
|
|
111
|
+
only `always`); see [Stacked Pull Requests](https://docs.mergify.com/merge-queue/stacks/).
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
**A queue lane that skips its tests is a merge button, not a queue.** A
|
|
115
|
+
workflow that sets every job to skip on `mergify/merge-queue/*` ("the queue
|
|
116
|
+
reuses the PR's CI") reports green on a tree no CI ran: the PR merged with its
|
|
117
|
+
base. The breakage the queue exists to catch then lands on `main`. Run the
|
|
118
|
+
integration checks on the queue branch; skip only what the queue branch cannot
|
|
119
|
+
change.
|