@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,150 @@
|
|
|
1
|
+
# Release flows
|
|
2
|
+
|
|
3
|
+
> Read when: choosing a predefined flow, the target repository has `.release/flow.md`, a run was invoked with `--flow` or `--save-flow`, or a flow failed validation.
|
|
4
|
+
|
|
5
|
+
A release flow records how a repository varies the release, so a run follows it
|
|
6
|
+
without rediscovering or re-asking it. It fills slots of the fixed skeleton in
|
|
7
|
+
[../SKILL.md](../SKILL.md). It cannot add, remove, or reorder stages, relax a
|
|
8
|
+
run invariant, or change either skill's manual-only invocation.
|
|
9
|
+
|
|
10
|
+
## Predefined flows (shipped with this skill)
|
|
11
|
+
|
|
12
|
+
The skill ships templates in `flows/`. List them with:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
node <skillsRoot>/resolve-release/scripts/flow.mjs list
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
| Flow | For |
|
|
19
|
+
|---|---|
|
|
20
|
+
| `root-tag-npm` | one repository version, published by pushing `vX.Y.Z` |
|
|
21
|
+
| `workspace-npm` | independently versioned npm workspaces, package-scoped dispatch publisher |
|
|
22
|
+
| `cloud-run` | Cloud Run candidate at 0%, validated, shifted to 100% in one step |
|
|
23
|
+
| `cloud-run-canary` | Cloud Run candidate at 0%, validated, exposed through canary steps (10%, 50%; 15-minute holds) |
|
|
24
|
+
|
|
25
|
+
A predefined flow carries only what is true for every repository of its kind.
|
|
26
|
+
Repository facts — publisher workflow names, package names, the canary health
|
|
27
|
+
check — come from the project.
|
|
28
|
+
|
|
29
|
+
## Which flow a run uses
|
|
30
|
+
|
|
31
|
+
1. **The project's `.release/flow.md`**, when present. It usually starts from a
|
|
32
|
+
predefined flow with `extends: <name>` and adds only its own slots and steps.
|
|
33
|
+
2. Otherwise **`--flow <name>`** at invocation: that predefined flow as is.
|
|
34
|
+
3. Otherwise **no flow**: preflight detection alone, exactly as before flows
|
|
35
|
+
existed. A predefined flow is never picked by guessing.
|
|
36
|
+
|
|
37
|
+
`--flow` with a project flow present is a hand-back: the project flow wins, and
|
|
38
|
+
choosing a different base is an edit to its `extends`. Both modes accept
|
|
39
|
+
`--flow`.
|
|
40
|
+
|
|
41
|
+
## File format
|
|
42
|
+
|
|
43
|
+
YAML frontmatter of **settings**, then optional `##` sections of **steps**.
|
|
44
|
+
Text before the first `##` is free prose. Validate the effective flow with:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
node <skillsRoot>/resolve-release/scripts/flow.mjs validate [--flow <name>] --json
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Validation rejects unknown settings, unknown sections, skeleton or invocation
|
|
51
|
+
keys (`trunk`, `releaseBranch`, `stages`, `skip`, `confirm`,
|
|
52
|
+
`disable-model-invocation`, …), an unknown `extends`, a predefined flow that
|
|
53
|
+
extends another, and inconsistent values in the merged flow. An invalid flow is
|
|
54
|
+
a hand-back; never run against it.
|
|
55
|
+
|
|
56
|
+
## Settings (slots)
|
|
57
|
+
|
|
58
|
+
| Setting | Values | Fills |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| `extends` | a predefined flow name (project flows only) | the base this flow starts from |
|
|
61
|
+
| `description` | text | what the flow is for |
|
|
62
|
+
| `route` | `root-tag` · `workspace-npm` · `cloud-run` | the release type preflight must find |
|
|
63
|
+
| `publisher` | mapping of scalars, e.g. `workflow`, `input`, `ownsTags` | the publisher and its inputs |
|
|
64
|
+
| `packages` | `exclude: [...]`, `publishLast: [...]` (workspace-npm only) | package set and dispatch order |
|
|
65
|
+
| `changelog` | `root` · `package-scoped` | heading format |
|
|
66
|
+
| `registry` | `https://…` | `--registry` for every npm command |
|
|
67
|
+
| `ask` | list of `{ id, question, options?, default? }` | extra preflight choices |
|
|
68
|
+
| `exposure` | `full` · `canary` · `n/a` | default exposure (`n/a`: no traffic to split) |
|
|
69
|
+
| `canary` | `{ steps: [10, 50], holdMinutes: 15, healthCheck: <cmd> }` | canary plan (cloud-run only) |
|
|
70
|
+
| `dark` | `on` · `off` · `n/a` | default dark launch |
|
|
71
|
+
| `flagRegistry` | repository path | flag registry for dark launch |
|
|
72
|
+
| `required` | `[canary]`, `[dark]` | choices the shortcut must not override |
|
|
73
|
+
|
|
74
|
+
When a project extends a predefined flow, its settings override the base;
|
|
75
|
+
`publisher`, `packages`, and `canary` merge key by key; `ask` items merge by
|
|
76
|
+
`id`. A slot pins a fact the run would otherwise infer; the pinned value is
|
|
77
|
+
still verified against the tree and provider. A flow that names a publisher the
|
|
78
|
+
repository does not have is a refusal, not an override.
|
|
79
|
+
|
|
80
|
+
## Steps
|
|
81
|
+
|
|
82
|
+
Sections, each a list of `- ` steps (repository commands or checks, in order).
|
|
83
|
+
With `extends`, the base flow's steps at a point run first, then the project's.
|
|
84
|
+
|
|
85
|
+
| Section | Runs | A failure is |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `before-cut` | before the cut commit | a hand-back, nothing changed remotely |
|
|
88
|
+
| `after-merge` | after the merged `main` SHA is verified | a hand-back, nothing published or exposed |
|
|
89
|
+
| `before-exposure` | before the first traffic shift | pre-exposure: production untouched |
|
|
90
|
+
| `after-publish` | after each artifact's registry proof | a hand-back naming what already shipped |
|
|
91
|
+
| `after-live` | after live verification, before the final tag | a failed live check: automatic rollback |
|
|
92
|
+
| `hand-back-if` | conditions, checked at preflight and before each outward action | a stop before that action |
|
|
93
|
+
|
|
94
|
+
Run only commands the repository documents; a step never authorizes an action
|
|
95
|
+
the skeleton does not already contain (no extra deploys, tag moves, or flag
|
|
96
|
+
flips).
|
|
97
|
+
|
|
98
|
+
## Choices and precedence
|
|
99
|
+
|
|
100
|
+
Invocation option > flow > preflight answer. Full mode asks only what is still
|
|
101
|
+
unresolved, plus every `ask:` item not answered by the invocation. Shortcut
|
|
102
|
+
mode (`/rush-release`) asks nothing: exposure `full`, dark `off`, each `ask:`
|
|
103
|
+
item takes its `default`; `required` canary/dark, or an `ask:` item with no
|
|
104
|
+
default, is a refusal that points to `/resolve-release`.
|
|
105
|
+
|
|
106
|
+
## Identity
|
|
107
|
+
|
|
108
|
+
Record the effective flow's `sha256` (it covers the predefined base and the
|
|
109
|
+
project file) in the plan and receipt. On resume, a different hash invalidates
|
|
110
|
+
the receipt: a run never continues under a flow it did not show — including one
|
|
111
|
+
whose base changed in a skills update.
|
|
112
|
+
|
|
113
|
+
## Saving a flow
|
|
114
|
+
|
|
115
|
+
`--save-flow` (full mode) writes the **project** file: `extends` for the base in
|
|
116
|
+
use, the project's own slots and steps, and this run's exposure, canary, dark,
|
|
117
|
+
and flag-registry choices. Base slots and steps stay in the skill; per-release
|
|
118
|
+
`ask:` answers are not saved:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
node <skillsRoot>/resolve-release/scripts/flow.mjs resolve --mode full --json … > /tmp/release-choices.json
|
|
122
|
+
node <skillsRoot>/resolve-release/scripts/flow.mjs render [--flow <name>] < /tmp/release-choices.json > .release/flow.md
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Write it only after the release finishes, on its own branch from the new
|
|
126
|
+
`main`, and open a separate PR. It is never part of the metadata cut.
|
|
127
|
+
|
|
128
|
+
## Example: extending `workspace-npm`
|
|
129
|
+
|
|
130
|
+
```markdown
|
|
131
|
+
---
|
|
132
|
+
extends: workspace-npm
|
|
133
|
+
publisher: { workflow: publish.yml, input: package, ownsTags: true }
|
|
134
|
+
packages:
|
|
135
|
+
exclude: [pi-better-read-aloud, navigator, sandbox-core]
|
|
136
|
+
publishLast: [pi-better-harness]
|
|
137
|
+
ask:
|
|
138
|
+
- id: bundle-bump
|
|
139
|
+
question: Should pi-better-harness bundle the new component versions?
|
|
140
|
+
options: [yes, no]
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## after-publish
|
|
144
|
+
- `pi install npm:<pkg>` succeeds
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The base supplies the route, package-scoped changelog, registry, verify and
|
|
148
|
+
pack dry-run steps, the `npm view` proof, and the first-publish hand-back. With
|
|
149
|
+
this flow, `/rush-release` refuses (the `bundle-bump` question has no default)
|
|
150
|
+
and `/resolve-release` asks it once at preflight.
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# Preflight
|
|
2
|
+
|
|
3
|
+
> Read when: starting a run; loading the release flow, detecting trunk, publisher, deployment mode, and the files that carry the version, then resolving the release choices.
|
|
4
|
+
|
|
5
|
+
Preflight outputs trunk `main`, publishers, deployment mode, release commands,
|
|
6
|
+
the files that carry the version, the release flow, and the resolved choices. It
|
|
7
|
+
does not pick the SHA, bump the version, or push. Resolve **facts** from
|
|
8
|
+
repository and provider state without asking the human to confirm any of them.
|
|
9
|
+
A non-choice that cannot be inferred takes its deterministic default in
|
|
10
|
+
[cut.md](cut.md), or the value the user stated at invocation; never a preflight
|
|
11
|
+
question. Only the **choices** in section 5 are ever asked, and only in full mode.
|
|
12
|
+
|
|
13
|
+
## 0. Release flow
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
node <skillsRoot>/resolve-release/scripts/flow.mjs validate [--flow <name>] --json
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The effective flow is the project's `.release/flow.md` (merged with the
|
|
20
|
+
predefined flow it `extends`), else the predefined flow named by `--flow`.
|
|
21
|
+
Neither is normal: continue with detection alone, and never pick a predefined
|
|
22
|
+
flow by guessing. An invalid flow
|
|
23
|
+
is a hand-back naming each error; never run a release against a flow that
|
|
24
|
+
failed validation or guess what it meant. A valid flow's slots pin what the
|
|
25
|
+
sections below would otherwise infer, and are still verified against the
|
|
26
|
+
repository: a `route` or `publisher` the tree does not support is a refusal.
|
|
27
|
+
Record its `sha256`. Details: [flows.md](flows.md).
|
|
28
|
+
|
|
29
|
+
## 1. Trunk
|
|
30
|
+
|
|
31
|
+
Fetch `origin/main` and all remote tags. Verify the release trunk is `main` from those fetched refs
|
|
32
|
+
(`origin/main` exists). A repo whose production branch is `master` or `release`
|
|
33
|
+
is not this workflow.
|
|
34
|
+
|
|
35
|
+
## 2. Publisher
|
|
36
|
+
|
|
37
|
+
Detect how a tag becomes a shipped artifact. Prefer what the human named;
|
|
38
|
+
otherwise look at the tree:
|
|
39
|
+
|
|
40
|
+
Before treating a root `package.json` as the release identity, inspect its
|
|
41
|
+
`private` and `workspaces` fields, the workspaces' versions and exact bundle
|
|
42
|
+
pins, and the publish workflow's parsed triggers and package inputs. If the
|
|
43
|
+
root is private, packages are independently versioned, and a package-scoped
|
|
44
|
+
`workflow_dispatch` publishes them from their manifests, select the
|
|
45
|
+
**workspace npm** route in [workspace-npm.md](workspace-npm.md). A dispatcher
|
|
46
|
+
is not a tag-triggered publisher: do not infer one from the presence of npm or
|
|
47
|
+
`publishConfig`. If the package input, publish order, or tag ownership is
|
|
48
|
+
unclear, stop rather than cut a private root tag. This route handles its own
|
|
49
|
+
candidate, versions, plan record, cut, merge, and publish gates.
|
|
50
|
+
|
|
51
|
+
| Signal | Publisher |
|
|
52
|
+
|---|---|
|
|
53
|
+
| Cloud Build production trigger matching only `v*-rc.*`, whose prod path emits immutable candidate coordinates after `--no-traffic` | `cloudbuild`, mode `cloud-run-staged` |
|
|
54
|
+
| public root `package.json` with a tag/release-triggered publish workflow, `publishConfig`, or an explicit root npm release | `npm` |
|
|
55
|
+
| both | watch both |
|
|
56
|
+
| neither, and the human did not name one | refuse — nothing to watch |
|
|
57
|
+
|
|
58
|
+
Cloud Build presence alone is not a staged contract. For `cloud-run-staged`,
|
|
59
|
+
verify from repository policy and live trigger configuration:
|
|
60
|
+
|
|
61
|
+
- the production trigger matches RC tags and excludes the final `vX.Y.Z` tag;
|
|
62
|
+
- each affected service deploys an immutable revision with `--no-traffic` and
|
|
63
|
+
publishes one receipt binding RC tag, merged SHA, revision, image digest, and
|
|
64
|
+
candidate URL;
|
|
65
|
+
- `golden-paths.json` defines read-only `prod-preview` and `prod-active`
|
|
66
|
+
profiles with at least one eligible path;
|
|
67
|
+
- exact inspect, traffic-shift, rollback, and candidate-delete commands are
|
|
68
|
+
documented, including service dependency order;
|
|
69
|
+
- any durable processing affected by a shift has exact pause, quiescence,
|
|
70
|
+
resume, and restoration checks;
|
|
71
|
+
- for canary exposure only: an exact command that splits traffic between the
|
|
72
|
+
candidate and the incumbent by percentage, and a read-only health check to
|
|
73
|
+
judge each hold ([canary.md](canary.md)).
|
|
74
|
+
|
|
75
|
+
Refuse staged release when any applicable item is absent; never improvise
|
|
76
|
+
production commands. Record `publisher` as `cloudbuild`, `npm`, or `both` and
|
|
77
|
+
`deploymentMode` as `artifact-only` or `cloud-run-staged`. If a GitHub Actions
|
|
78
|
+
workflow publishes on `release: published` rather than on tag push, note that
|
|
79
|
+
`gh release create` is required at publish time.
|
|
80
|
+
|
|
81
|
+
## 3. Version files
|
|
82
|
+
|
|
83
|
+
The root identity list below applies only to root-tag and staged Cloud Run
|
|
84
|
+
releases. Workspace npm uses the selected package manifests, exact bundle pins,
|
|
85
|
+
lockfile, and repository changelog as described in [workspace-npm.md](workspace-npm.md).
|
|
86
|
+
|
|
87
|
+
First check for `skills/distribution/manifest.json` with an exact `releaseVersion`
|
|
88
|
+
and `skills/distribution/scripts/distribution.mjs`. That manifest is the repository
|
|
89
|
+
release identity when present; record it and use the distribution-aware cut in
|
|
90
|
+
`apply.mjs`. It takes precedence over a private root `package.json` with no version.
|
|
91
|
+
|
|
92
|
+
Otherwise, list identity files present at the repo root (and only those):
|
|
93
|
+
|
|
94
|
+
- `package.json` (and `package-lock.json` when it exists)
|
|
95
|
+
- `pyproject.toml`
|
|
96
|
+
- `VERSION`
|
|
97
|
+
|
|
98
|
+
Do not bump other nested workspace packages unless the human names them. The cut
|
|
99
|
+
must stay metadata-only. A distribution-aware cut may also update trusted runtime
|
|
100
|
+
identity constants, test fixtures that pin that identity, and deterministic generated
|
|
101
|
+
policy/inventory artifacts; those are version metadata, not product behavior.
|
|
102
|
+
|
|
103
|
+
## 4. Baseline
|
|
104
|
+
|
|
105
|
+
Read the current version from those files when present. List annotated/lightweight
|
|
106
|
+
release tags matching `vMAJOR.MINOR.PATCH` with no prerelease. The highest such
|
|
107
|
+
tag is the changelog baseline. A prerelease (`v1.2.0-rc.1`) is not a baseline.
|
|
108
|
+
|
|
109
|
+
## Prepared-metadata reuse
|
|
110
|
+
|
|
111
|
+
Only an explicit human keep-version/reuse instruction selects this route; a
|
|
112
|
+
failed RC or an input file does not. Record the instruction and the supplied
|
|
113
|
+
`prepared-release-metadata/v1` RC provenance, or v2's explicit `pre-tag` /
|
|
114
|
+
`cloudRunRC` provenance. A v2 `pre-tag` input requires artifact-only root npm
|
|
115
|
+
publishing, no private/workspace root, and separately verified stopped-before-
|
|
116
|
+
tagging/publication evidence. Record the exact effective registry from the
|
|
117
|
+
existing flow or publisher configuration; if it cannot be established, stop
|
|
118
|
+
rather than guessing or reading credential payloads. Keep the new CI-green
|
|
119
|
+
target separate
|
|
120
|
+
from historical cut/merge identities. No reuse-specific provider verification
|
|
121
|
+
is delegated to local git: the cut stage must establish the mandatory fresh
|
|
122
|
+
PR, main, CI and reviewed-notes bindings in
|
|
123
|
+
[prepared-metadata.md](prepared-metadata.md). Neither this input nor a previous
|
|
124
|
+
attempt grants execution permission. Existing publisher and flow gates apply.
|
|
125
|
+
|
|
126
|
+
## 5. Choices
|
|
127
|
+
|
|
128
|
+
Detect the repository hints first: canary support (the Cloud Run contract
|
|
129
|
+
declares percentage-split commands, hold, and a health check) and a flag
|
|
130
|
+
registry. Then resolve:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
node <skillsRoot>/resolve-release/scripts/flow.mjs resolve --mode <full|shortcut> [--flow <name>] --json \
|
|
134
|
+
[--exposure …] [--canary-steps …] [--hold-minutes …] [--dark …] \
|
|
135
|
+
[--health-check <repo-declared cmd>] [--flag-registry <path>] \
|
|
136
|
+
[--repo-canary] [--repo-flag-registry] [--answer <id>=<value>]…
|
|
137
|
+
# exit 0 resolved · 4 questions pending · 3 refused · 1 invalid flow
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
- **Shortcut mode** (`/rush-release`) asks nothing: exposure `full`, dark `off`,
|
|
141
|
+
flow questions answered by their defaults. Exit 3 is a hand-back that points
|
|
142
|
+
to `/resolve-release`.
|
|
143
|
+
- **Full mode** (`/resolve-release`): exit 4 returns `questions`, each with its
|
|
144
|
+
options and a suggested default. Ask them together, once, as choices; rerun
|
|
145
|
+
with `--answer` until exit 0. Canary steps and hold are asked only after
|
|
146
|
+
canary is chosen. Exit 3 is a hand-back with the refusals.
|
|
147
|
+
|
|
148
|
+
Precedence is invocation option > release flow > answer. Canary needs the
|
|
149
|
+
repository-declared health check and split commands; dark launch needs a flag
|
|
150
|
+
registry — without them the choice is refused, not improvised. Record the
|
|
151
|
+
resolved `choices` and `sources` in the plan and receipt.
|
|
152
|
+
|
|
153
|
+
Preflight succeeds when trunk, publisher, version files, baseline, flow, and
|
|
154
|
+
choices are recorded. Proceed to [candidate.md](candidate.md).
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# Reuse prepared metadata
|
|
2
|
+
|
|
3
|
+
> Read when: the human explicitly chose to keep an unused final version after a failed RC or a Node/npm attempt stopped before tagging/publication, and approved reusing its already-merged metadata. This is a branch of the existing cut stage, not a release executor or a resume of the failed attempt.
|
|
4
|
+
|
|
5
|
+
Do not infer consent from a failed RC, a file, a flow default, or a prior receipt.
|
|
6
|
+
Without explicit human approval for reuse, follow the normal create-and-deliver
|
|
7
|
+
cut. This capability does not authorize release execution when the task only
|
|
8
|
+
asked to implement or plan it.
|
|
9
|
+
|
|
10
|
+
## Input
|
|
11
|
+
|
|
12
|
+
After preflight and candidate selection, supply this JSON to
|
|
13
|
+
`plan.mjs --sha <full frozen new target SHA> --prepared-metadata <file> --json`
|
|
14
|
+
(add `--cloud-run` for the staged route). The API equivalent is
|
|
15
|
+
`planRelease({ sha, preparedMetadata, ... })`. No version override is added.
|
|
16
|
+
|
|
17
|
+
V1 retains the existing strict RC provenance below. For a genuine Node/npm
|
|
18
|
+
attempt without an RC, use the explicit v2 `pre-tag` variant described next;
|
|
19
|
+
do not fabricate an RC identity.
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"schema": "prepared-release-metadata/v1",
|
|
24
|
+
"repository": "owner/repo",
|
|
25
|
+
"version": "0.7.0",
|
|
26
|
+
"metadataPr": 123,
|
|
27
|
+
"cutSha": "1111111111111111111111111111111111111111",
|
|
28
|
+
"mergeSha": "2222222222222222222222222222222222222222",
|
|
29
|
+
"previousAttempt": {
|
|
30
|
+
"receiptId": "failed-attempt-1",
|
|
31
|
+
"receiptSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
32
|
+
"candidateTag": "v0.7.0-rc.1",
|
|
33
|
+
"candidateSha": "2222222222222222222222222222222222222222"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
All fields are required; unknown fields refuse. `metadataPr` is a positive PR
|
|
39
|
+
number in `repository`. SHAs are full lowercase 40-hex commit identities;
|
|
40
|
+
`receiptSha256` is a lowercase 64-hex historical digest supplied with the
|
|
41
|
+
previous attempt's provenance, not a path to load. `receiptId` is a safe opaque
|
|
42
|
+
identifier (1-128 ASCII letters, digits, dots, underscores or hyphens, beginning
|
|
43
|
+
with a letter or digit). `version` is canonical `x.y.z`. The previous RC must
|
|
44
|
+
be for that version and its source must equal the historical `mergeSha`.
|
|
45
|
+
|
|
46
|
+
The new `--sha` is the release source, not the historical cut or merge. Select
|
|
47
|
+
it through the existing exact-tree CI-green main candidate gate. New code and
|
|
48
|
+
reviewed changelog corrections may have landed since the old metadata merge.
|
|
49
|
+
Never pass an arbitrary unreviewed SHA just because it descends from that merge.
|
|
50
|
+
|
|
51
|
+
## Node/npm Before Tagging
|
|
52
|
+
|
|
53
|
+
For a publishable root npm package whose prior attempt stopped before final
|
|
54
|
+
tagging or publication, use this v2 input without `--cloud-run`:
|
|
55
|
+
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"schema": "prepared-release-metadata/v2",
|
|
59
|
+
"repository": "owner/node-package",
|
|
60
|
+
"version": "1.3.0",
|
|
61
|
+
"metadataPr": 42,
|
|
62
|
+
"cutSha": "1111111111111111111111111111111111111111",
|
|
63
|
+
"mergeSha": "2222222222222222222222222222222222222222",
|
|
64
|
+
"previousAttempt": {
|
|
65
|
+
"kind": "pre-tag",
|
|
66
|
+
"receiptId": "stopped-before-tagging-1",
|
|
67
|
+
"receiptSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
68
|
+
"sourceSha": "3333333333333333333333333333333333333333"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
V2 has exactly two previous-attempt variants. `pre-tag` requires only `kind`,
|
|
74
|
+
`receiptId`, `receiptSha256`, and `sourceSha`. `cloudRunRC` requires only `kind`,
|
|
75
|
+
`receiptId`, `receiptSha256`, `candidateTag`, and `candidateSha`, with the same RC
|
|
76
|
+
binding and ordinal rules as v1. Missing, null, mixed, or unknown fields refuse.
|
|
77
|
+
V1 remains backward compatible; its RC fields are not made optional.
|
|
78
|
+
|
|
79
|
+
The pre-tag planner resolves the previous full source commit and proves
|
|
80
|
+
`metadata.mergeSha -> previousAttempt.sourceSha -> plan.sha` ancestry; equality
|
|
81
|
+
is allowed. It returns `candidateTag: null` and a named npm artifact, not a
|
|
82
|
+
synthetic RC. Preflight must independently prove artifact-only, root-tag npm
|
|
83
|
+
publishing and the previous failed/canceled attempt's pre-publication state.
|
|
84
|
+
The input's claim alone proves neither failure nor absence of publication.
|
|
85
|
+
|
|
86
|
+
Require a publishable root `package.json`, not a private or workspace root.
|
|
87
|
+
Bind its package name across the original cut, previous source, and new target.
|
|
88
|
+
When present, `package-lock.json` must use integer format 2 or 3, with top-level
|
|
89
|
+
and `packages[""]` name/version identities matching that root. The supported
|
|
90
|
+
identity-file set remains unchanged. Original-cut scripts, dependency edges,
|
|
91
|
+
resolved versions, integrity values and other non-version metadata cannot
|
|
92
|
+
change; later reviewed code and dependency fixes remain eligible. Node-only
|
|
93
|
+
inspection must not require Python. It requires Node 22+ with JSON parser
|
|
94
|
+
numeric-source support: strict UTF-8 blobs are compared through fully tagged
|
|
95
|
+
JSON trees that retain original numeric tokens before JavaScript rounding.
|
|
96
|
+
Equivalent ordinary decimal/exponent spellings compare exactly, while underflow
|
|
97
|
+
and rounded-fraction changes cannot disappear. Signed zero remains distinct;
|
|
98
|
+
nonzero tokens with explicit exponents outside the safe-integer range require
|
|
99
|
+
identical numeric source text. Nonfinite values and unsafe integer Numbers
|
|
100
|
+
refuse. Input and package/lock versions use canonical safe-integer semantic
|
|
101
|
+
version components, matching the npm gate. Independently versioned workspaces
|
|
102
|
+
remain on their existing dispatcher route, not this capability.
|
|
103
|
+
|
|
104
|
+
An existing final tag blocks a new-source attempt even if the npm version is
|
|
105
|
+
absent or the tag points at the historical source. An npm publish failure after
|
|
106
|
+
final tagging is not a pre-tag attempt; preserve the tag and use the existing
|
|
107
|
+
failure/resume policy rather than retagging or claiming this route can recover it.
|
|
108
|
+
|
|
109
|
+
The planner makes no npm or credential calls. Before final tagging, the publish
|
|
110
|
+
stage must separately establish registry-version absence using the bounded
|
|
111
|
+
[read-only npm gate](publish.md#node-pre-tag-registry-gate). Registry and Git
|
|
112
|
+
observations do not reserve names or authorize publication.
|
|
113
|
+
|
|
114
|
+
## Planner checks and limits
|
|
115
|
+
|
|
116
|
+
The planner is read-only, apart from its stdout. It proves from real git objects:
|
|
117
|
+
|
|
118
|
+
- the declared GitHub `origin` identity matches `repository` (canonical HTTPS,
|
|
119
|
+
SCP-style SSH or `ssh://git@github.com/` URL);
|
|
120
|
+
- the original single-parent cut changes only root version identities and
|
|
121
|
+
`CHANGELOG.md`, with no package scripts, dependency, lock dependency or other
|
|
122
|
+
non-version edits hidden in identity files;
|
|
123
|
+
- the cut is an ancestor of its merge and their whole trees are equal;
|
|
124
|
+
- that merge is an ancestor of the new frozen target;
|
|
125
|
+
- the supported root identity file set is unchanged and every version agrees
|
|
126
|
+
at the historical cut and new target, including the lock's top-level version,
|
|
127
|
+
`packages[""].version` when present, and package/lock name identity; for Python,
|
|
128
|
+
the actual project name and exactly one matching uv editable or virtual root
|
|
129
|
+
at `.` with the requested version;
|
|
130
|
+
- there is one nonempty dated release section for that version at both sources;
|
|
131
|
+
- a successful fresh `git ls-remote --tags origin` inspection proves the exact
|
|
132
|
+
final tag absent. Remote, local and historical RC ordinals all count as spent.
|
|
133
|
+
For staged releases, a second exact-ref inspection proves both final and
|
|
134
|
+
proposed RC tags absent. Errors, timeouts and ambiguous output block.
|
|
135
|
+
|
|
136
|
+
Supported identity files are root `package.json`, `package-lock.json`, `VERSION`,
|
|
137
|
+
static `[project]` / `[tool.poetry]` versions in `pyproject.toml`, and a root
|
|
138
|
+
`uv.lock` (lock format version 1) belonging to that Python project. TOML is parsed
|
|
139
|
+
structurally, including project name and uv package source; adding a lock filename
|
|
140
|
+
to the metadata paths alone is not proof. The uv root must have the exact project
|
|
141
|
+
name and exactly `source = { editable = "." }` or `source = { virtual = "." }`.
|
|
142
|
+
Missing, duplicate, foreign, mixed, extra-key or non-root sources refuse at the
|
|
143
|
+
parent, cut and target. Both representations prove the same root identity;
|
|
144
|
+
accepting a virtual root does not grant execution authority or change context
|
|
145
|
+
policy. The historical parent may have a stale root version (for example, project
|
|
146
|
+
`0.6.2` with lock root `0.4.0` repaired to `0.7.0` at the cut). Only that identified
|
|
147
|
+
root's version is excluded from the historical lock comparison: every other
|
|
148
|
+
package, dependency edge, requirement, source, hash and lock field must remain
|
|
149
|
+
structurally unchanged, including the root source. Switching between editable
|
|
150
|
+
and virtual across the historical cut refuses even though each shape is valid
|
|
151
|
+
individually. Cut and target root versions must equal the requested
|
|
152
|
+
version. The target must retain the historical prepared project name and exact
|
|
153
|
+
root source mode; a coordinated rename or editable/virtual switch is not part of
|
|
154
|
+
this reuse capability. Reviewed dependency changes after the historical cut are allowed;
|
|
155
|
+
they do not exempt the target from root identity validation.
|
|
156
|
+
|
|
157
|
+
Python metadata reuse requires `python3` 3.11+ with standard-library `tomllib`
|
|
158
|
+
on `PATH`. Prepared TOML blobs are acquired from Git as raw bytes with a
|
|
159
|
+
five-second timeout and an 8 MiB output limit, then decoded as strict UTF-8 before
|
|
160
|
+
TOML parsing. Invalid octets refuse rather than becoming replacement characters.
|
|
161
|
+
The planner starts only fixed parser code with `-I -S`, passes raw bytes through
|
|
162
|
+
stdin, and bounds each parse to five seconds and 8 MiB of input/output.
|
|
163
|
+
Metadata-only comparison uses a type-tagged tree for every scalar and container;
|
|
164
|
+
integer-to-float changes cannot disappear through JSON serialization, while
|
|
165
|
+
unchanged finite floats remain valid. The uv lock format must be integer `1`, not
|
|
166
|
+
float `1.0`. Missing Python/tomllib, malformed TOML, process errors, non-JSON TOML
|
|
167
|
+
values, nonfinite numbers, integers outside the lossless JSON range and exceeded
|
|
168
|
+
bounds all refuse with sanitized acquisition/parser errors. No Python is invoked
|
|
169
|
+
for npm-only reuse, and normal create-cut planning and application are unchanged.
|
|
170
|
+
|
|
171
|
+
Identity files must be regular non-executable files. Workspace npm is not this route.
|
|
172
|
+
Distribution-aware cuts (`skills/distribution/manifest.json`) have a wider
|
|
173
|
+
generated metadata surface and refuse reuse until a dedicated verifier exists;
|
|
174
|
+
normal distribution cuts are unchanged. `--dark-flags` refuses in reuse mode:
|
|
175
|
+
notes must already be reviewed in the target, not generated on this path.
|
|
176
|
+
|
|
177
|
+
The planner does **not** prove GitHub PR state, approval, required checks, CI,
|
|
178
|
+
remote main membership, publisher configuration, old receipt authenticity, or
|
|
179
|
+
execution authorization. A successful local plan is not permission to tag.
|
|
180
|
+
Tag absence is an observation, not a reservation; re-inspect immediately before
|
|
181
|
+
any tag creation. Do not delete or move an old RC even when it failed.
|
|
182
|
+
|
|
183
|
+
## Mandatory Cut-Stage Verification
|
|
184
|
+
|
|
185
|
+
The existing cut stage chooses exactly one route: create and deliver new metadata,
|
|
186
|
+
or verify already-prepared metadata. For `metadata.mode: reuse-prepared`, do all
|
|
187
|
+
of the following before publication, and record the named stage output:
|
|
188
|
+
|
|
189
|
+
1. `preparedMetadataApproval`: record the human's explicit keep-version/reuse
|
|
190
|
+
instruction and the exact repository, version, new target SHA and plan it
|
|
191
|
+
covers. Metadata input and `previousAttempt` are provenance, not authorization.
|
|
192
|
+
2. `historicalMetadataVerification`: use fresh provider evidence in the canonical
|
|
193
|
+
repository to prove `metadataPr` merged into main, its head equals `cutSha`,
|
|
194
|
+
its merge identity equals `mergeSha`, and it passed the repository's required
|
|
195
|
+
review/delivery policy. Record provider coordinates and observation time.
|
|
196
|
+
3. `releaseSourceVerification`: fetch main and use the existing candidate/CI
|
|
197
|
+
gate for the exact new `plan.sha`. Record remote main SHA, ancestry result,
|
|
198
|
+
required CI/queue run identities, tree/proof binding and freshness. Never
|
|
199
|
+
substitute green evidence from the old cut, failed RC or another target.
|
|
200
|
+
4. `preparedNotesVerification`: independently extract the version section from
|
|
201
|
+
the exact reviewed new target and compare it with `plan.changelogMarkdown`
|
|
202
|
+
and `metadata.preparedSectionSha256`. The canonical section is the heading
|
|
203
|
+
through just before the next `## [..]` heading, with trailing whitespace
|
|
204
|
+
removed and one final LF. Verify review/delivery evidence covers that target's
|
|
205
|
+
notes, including corrections since the old cut. Record the review coordinates,
|
|
206
|
+
target SHA and digest. `originalSectionSha256` is historical provenance only;
|
|
207
|
+
it is intentionally separate, not an equality claim for updated notes.
|
|
208
|
+
5. `previousAttemptVerification`: establish the named prior attempt's terminal
|
|
209
|
+
failed/canceled state and matching repository, source, version and receipt
|
|
210
|
+
identity/digest from retained or provider evidence. For v2 `pre-tag`, require
|
|
211
|
+
proof it stopped before final tagging/publication; do not invent an RC or
|
|
212
|
+
treat an input claim as evidence. Do not reopen or consume the old receipt.
|
|
213
|
+
6. `preparedCutVerification`: rerun the read-only planner checks against the
|
|
214
|
+
same frozen input and match source, identities, notes digests and tags to the
|
|
215
|
+
recorded plan (ignore only the newly generated receipt ID and inspection
|
|
216
|
+
time). Record exact-ref remote absence evidence and time. Any drift blocks;
|
|
217
|
+
never quietly choose a new target, version or note body.
|
|
218
|
+
|
|
219
|
+
If evidence cannot establish these facts, hand back the missing gate. Do not
|
|
220
|
+
create an empty metadata PR, run `apply.mjs`, run `before-cut` mutation steps,
|
|
221
|
+
create a branch/commit, or rewrite changelog/version files in the reuse route.
|
|
222
|
+
The current reviewed target already contains the prepared metadata.
|
|
223
|
+
|
|
224
|
+
## Fresh Receipt and Publish Convergence
|
|
225
|
+
|
|
226
|
+
The planner supplies a fresh `receiptId` for every reuse plan. The stage writes
|
|
227
|
+
an exclusively created, distinct receipt at
|
|
228
|
+
`.git/<invoked-skill>-<receiptId>-authorization.json`; never overwrite the fixed
|
|
229
|
+
legacy path or another receipt. Bind the complete new plan and its SHA-256,
|
|
230
|
+
`releaseSourceSha` (= `plan.sha`), all stage outputs above, historical cut/merge/PR,
|
|
231
|
+
`previousAttempt.receiptId` and `previousAttempt.receiptSha256`, both notes
|
|
232
|
+
digests, tags, choices, flow hash, invocation authorization, expiry and separate
|
|
233
|
+
permissions. A new plan is not a retry/reset of the old receipt.
|
|
234
|
+
|
|
235
|
+
Do not read, mutate, reset, copy permissions from, or grant authority through the
|
|
236
|
+
old receipt. Start only this invocation's applicable publish/promotion permissions
|
|
237
|
+
at `pending-conditions`. Omit metadata branch/commit/write/PR-delivery permissions.
|
|
238
|
+
On resume use this new receipt's exact path and plan, with the existing
|
|
239
|
+
executable/consumed checks. Do not fall back to the old fixed receipt path.
|
|
240
|
+
|
|
241
|
+
Once these checks pass, output `metadataVerification: verified-prepared`,
|
|
242
|
+
`releaseSourceSha: <new target>`, `receiptPath` and the evidence bindings. For the
|
|
243
|
+
existing publish/promotion procedures, bind their operational `<mergedSha>` to
|
|
244
|
+
this verified **new target**. Keep `metadata.mergeSha` as historical provenance;
|
|
245
|
+
never overwrite it or tag it. Skip publish section 1 (new metadata PR) and the
|
|
246
|
+
new-cut tree equality comparison in section 2: historical cut/merge equality
|
|
247
|
+
was already verified, and later reviewed product fixes intentionally change the
|
|
248
|
+
new target's tree. All remaining exact-source CI, main ancestry, tag absence,
|
|
249
|
+
publisher, candidate, preview, traffic and live verification gates still apply.
|
|
250
|
+
Run `after-merge` flow validation on the verified source as usual. For v2
|
|
251
|
+
`pre-tag`, also bind the named npm artifact and explicit effective registry into
|
|
252
|
+
the new receipt. The final-tag permission requires a fresh registry-absence
|
|
253
|
+
observation from the existing publish stage as well as fresh remote tag absence.
|
|
254
|
+
The read-only npm probe itself never grants or consumes a permission.
|
|
255
|
+
|
|
256
|
+
Both cut routes now converge on the same existing publish and promotion stages.
|
|
257
|
+
For Cloud Run, the next unused RC builds from the new target; after the exact
|
|
258
|
+
candidate serves 100% and passes live verification, the still-unused final tag
|
|
259
|
+
names that same source. Neither historical provenance nor this planner may
|
|
260
|
+
reuse an old candidate, relax a golden path, or trigger any effect by itself.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Cloud Run staged promotion
|
|
2
|
+
|
|
3
|
+
> Read when: a Cloud Run candidate is built at 0% and must be validated, shifted to 100%, verified live, or rolled back.
|
|
4
|
+
|
|
5
|
+
Promote one immutable candidate from 0% to 100% under the invocation's
|
|
6
|
+
authorization, as recorded in the plan receipt. Load `golden-path` for both validation
|
|
7
|
+
profiles and the applicable platform skill for repository-declared Cloud Run
|
|
8
|
+
commands. Do not restore the archived `resolve-release` state machine or
|
|
9
|
+
introduce a confirmation.
|
|
10
|
+
|
|
11
|
+
## 1. Bind the candidate
|
|
12
|
+
|
|
13
|
+
After the RC-tag build reports `SUCCESS`, read its durable candidate receipt.
|
|
14
|
+
For every affected service, independently verify from one fresh Cloud Run
|
|
15
|
+
snapshot that:
|
|
16
|
+
|
|
17
|
+
- receipt RC tag and source SHA equal the approved plan and `<mergedSha>`;
|
|
18
|
+
- the named immutable revision runs the receipt's image digest;
|
|
19
|
+
- the candidate URL resolves to that revision;
|
|
20
|
+
- the candidate has exactly 0% traffic and the recorded incumbent exactly 100%;
|
|
21
|
+
- no second release or unknown traffic-bearing revision is in flight.
|
|
22
|
+
|
|
23
|
+
Missing, duplicate, stale, or contradictory identity is a pre-exposure failure.
|
|
24
|
+
Delete the candidate by immutable revision only when the preflight contract
|
|
25
|
+
declared that deletion safe; otherwise leave it at 0% and hand back. Never move
|
|
26
|
+
the RC tag.
|
|
27
|
+
|
|
28
|
+
## 2. Validate at 0%
|
|
29
|
+
|
|
30
|
+
Run the repository's smoke workflow against the exact candidate URL with
|
|
31
|
+
`--profile prod-preview`. Accept only a non-empty `ALIVE` verdict whose stamped
|
|
32
|
+
target is that URL, profile is `prod-preview`, and `noMutations` is `true`.
|
|
33
|
+
Record its `generatedAt`. A failed or unavailable gate leaves production on the
|
|
34
|
+
incumbent and does not consume the final tag.
|
|
35
|
+
|
|
36
|
+
## 3. Recheck and shift
|
|
37
|
+
|
|
38
|
+
Immediately before exposure, re-read candidate identity and traffic. Require
|
|
39
|
+
the candidate still at 0%, incumbent still at 100%, and the ALIVE verdict still
|
|
40
|
+
within the plan's declared freshness window. If durable processing is affected,
|
|
41
|
+
run the preflight-declared pause order and prove quiescence before traffic moves.
|
|
42
|
+
|
|
43
|
+
Run the release flow's `before-exposure` steps; a failure there is still
|
|
44
|
+
pre-exposure. With exposure `canary`, the shift below is replaced by the
|
|
45
|
+
stepped sequence in [canary.md](canary.md), which ends at this same 100% state.
|
|
46
|
+
|
|
47
|
+
Shift all affected services to the candidate in the declared dependency order.
|
|
48
|
+
After each command, read traffic back. If a later service cannot shift, restore
|
|
49
|
+
already-shifted services in reverse order before doing anything else. The
|
|
50
|
+
invocation already authorized this conditional shift and restoration.
|
|
51
|
+
Record traffic-shift and rollback permissions separately. Before either action,
|
|
52
|
+
match its candidate revision/digest, target, profile, gate, and mutation set.
|
|
53
|
+
|
|
54
|
+
## 4. Verify live
|
|
55
|
+
|
|
56
|
+
From fresh control-plane and service observations, require for every service:
|
|
57
|
+
|
|
58
|
+
- the exact candidate revision holds 100% and the incumbent 0%;
|
|
59
|
+
- serving source SHA and image digest equal the candidate receipt;
|
|
60
|
+
- the live URL passes a non-empty, read-only `prod-active` smoke as `ALIVE`;
|
|
61
|
+
- with dark launch on, every planned dark flag reads off in production
|
|
62
|
+
([dark-launch.md](dark-launch.md)). A flag found on is a failed live check.
|
|
63
|
+
|
|
64
|
+
Resume durable processing only against the verified serving candidate, then
|
|
65
|
+
prove scheduling/admission and any required publication advancement are healthy.
|
|
66
|
+
Run the release flow's `after-live` steps; a failure there is a failed live
|
|
67
|
+
check. Only this state permits the final release tag.
|
|
68
|
+
|
|
69
|
+
## 5. Failure routing
|
|
70
|
+
|
|
71
|
+
- **Before any traffic moved:** production is untouched. Delete or retain the
|
|
72
|
+
0% candidate according to the recorded policy and hand back.
|
|
73
|
+
- **After a known failed shift or live check:** automatically restore every
|
|
74
|
+
service to its recorded incumbent in reverse dependency order, restore
|
|
75
|
+
durable processing against that incumbent, and verify incumbent 100%,
|
|
76
|
+
candidate 0%, and `prod-active` ALIVE before hand-back.
|
|
77
|
+
- **Ambiguous traffic, identity, or processing state:** stop all writes and hand
|
|
78
|
+
back the last known-good evidence for operator recovery. Never guess, retry a
|
|
79
|
+
shift, delete a revision, or claim rollback succeeded.
|
|
80
|
+
|
|
81
|
+
The final tag remains unused on every failure path. An RC tag is immutable and
|
|
82
|
+
remains as attempt evidence.
|