@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,239 @@
|
|
|
1
|
+
# The golden-path contract (`golden-paths.json`, version 3)
|
|
2
|
+
|
|
3
|
+
One JSON file per app, next to its `package.json`. The engine validates it, selects
|
|
4
|
+
from it, drives it, and renders `GOLDEN_PATHS.md` and the workflow from it.
|
|
5
|
+
Example: [../assets/golden-paths.example.json](../assets/golden-paths.example.json).
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"version": 3,
|
|
10
|
+
"profiles": { "pr-local": { "gate": "pull-request", "environment": "local", "endpoint": "local", "mutationPolicy": "isolated-writes" } },
|
|
11
|
+
"setup": { "boot": "pnpm start", "baseUrl": "http://127.0.0.1:3000", "journeys": "e2e/journeys" },
|
|
12
|
+
"ci": { "queue": "mergify", "packageManager": "pnpm" },
|
|
13
|
+
"paths": [ { "id": "health", "title": "The app is serving", "surface": "api", "start": "GET /api/health", "expect": { "status": 200 }, "observable": "200 ok", "profiles": ["pr-local"] } ]
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Any value that starts with `TODO` fails validation, so a scaffold or a migration
|
|
18
|
+
never generates a workflow before a person fills it in.
|
|
19
|
+
|
|
20
|
+
## What earns a path
|
|
21
|
+
|
|
22
|
+
A path belongs only if **its failure alone would block a release**. Common shapes:
|
|
23
|
+
get in (sign in, sign up), the core action the product exists for (checkout, publish,
|
|
24
|
+
submit a case), it's up (health), and anything touching money or irreversible state.
|
|
25
|
+
There is no target count; if the list grows toward dozens, the rest belongs in
|
|
26
|
+
`e2e-test`'s journey suite. Candidates come from the critical E2E journeys, the
|
|
27
|
+
state changes of the core entities, ADRs that name a load-bearing flow, and
|
|
28
|
+
`suggest` over the surface inventory, in that order. A person promotes them.
|
|
29
|
+
|
|
30
|
+
## `paths[]`
|
|
31
|
+
|
|
32
|
+
| Field | Required | Meaning |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `id` | yes | Lowercase slug, unique; results are keyed by it |
|
|
35
|
+
| `title` | yes | One line on what the user achieves, under 80 characters; the view shows it |
|
|
36
|
+
| `surface` | yes | `browser`, `api`, or `cli` |
|
|
37
|
+
| `journey` | browser | The `@covers` id of the spec tagged `@golden-path` that drives it. The spec owns the steps and assertions |
|
|
38
|
+
| `config` | browser, optional | A Playwright config file for this path, when it needs one other than the default; paths sharing a config run in one invocation |
|
|
39
|
+
| `start` | api | One request to the target, `"GET /api/health"`. Use `request` for anything more. A path that must call another service is a cli path (`curl ...`), since api paths never leave the target's origin |
|
|
40
|
+
| `request` | api, optional | `{ "method", "path", "headers"?, "body"? }`, sent to the target. When both are set, `run` sends `request` and the view shows it |
|
|
41
|
+
| `command` | cli | Shell command, run in the app directory |
|
|
42
|
+
| `expect` | api/cli, recommended | Machine check. api: `status` (number or list; default any 2xx; redirects are not followed), `bodyIncludes` (string or list), `json` (an object the response must contain), `jsonNonEmpty` (dotted paths that must hold a non-empty value, like `keys`), `headers` (`{ "Content-Type": "text/markdown" }`: each value must include the text). cli: `exitCode` (default 0), `stdoutIncludes` (stdout only, not stderr). A check `expect` cannot state belongs in a repo test, or a cli path that runs one |
|
|
43
|
+
| `observable` | api/cli | The fact that proves it worked, for people; under 300 characters |
|
|
44
|
+
| `intent` | no | Extra note for a browser path; documentation only |
|
|
45
|
+
| `documentation` | no | Human-readable localized journey description; see [documentation](#documentation). It does not replace the executable fields or tagged spec |
|
|
46
|
+
| `nonWriting` | no | For a `POST`/`PUT`/`PATCH`/`DELETE` path with `mutates: false` in a dev or prod profile: why the server cannot write, such as a probe that must be refused (`"the candidate answers 404 before parsing"`). Without it `validate` rejects the path |
|
|
47
|
+
| `mutates` | no | Boolean. `true` when the path writes data that would outlive the run in a shared environment (dev or prod). A path that writes only the run's throwaway local store, like a migration against the per-run database, can stay `false` if it is declared in local profiles only |
|
|
48
|
+
| `tenant` | when `mutates` | Synthetic tenant, `e2e-` prefixed, listed in `setup.tenants`. A label for selection and cleanup: `run` sends nothing for it, so put the tenant in `request.headers` or `request.body` the way the app expects |
|
|
49
|
+
| `cleanup` | when `mutates` | How its writes are removed |
|
|
50
|
+
| `profiles` | yes | The profiles this path must pass in |
|
|
51
|
+
|
|
52
|
+
Other keys are kept and ignored, so a repo can carry its own annotations. Keys
|
|
53
|
+
starting with `_` (top level or on a path) are never read at all: park a path that
|
|
54
|
+
has no driver yet under `_pendingPaths` instead of deleting it.
|
|
55
|
+
|
|
56
|
+
## `documentation`
|
|
57
|
+
|
|
58
|
+
Optional on a path. Keep the executable contract unchanged: `id`, `journey`,
|
|
59
|
+
`expect`, profiles, mutation rules, and spec tags retain their existing meanings
|
|
60
|
+
and requirements. Documentation describes what the existing spec proves; it does
|
|
61
|
+
not supply instructions to `run`.
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"reference": "GP-IDENTITY-LOGIN",
|
|
66
|
+
"title": { "en": "Sign in", "zh": "登录" },
|
|
67
|
+
"group": { "en": "Identity", "zh": "身份", "order": 10 },
|
|
68
|
+
"precondition": { "en": "A returning user is signed out", "zh": "已有用户尚未登录" },
|
|
69
|
+
"summary": {
|
|
70
|
+
"route": { "en": "Sign in → Dashboard", "zh": "登录 → 仪表盘" },
|
|
71
|
+
"outcome": { "en": "The user's dashboard is visible", "zh": "用户的仪表盘可见" }
|
|
72
|
+
},
|
|
73
|
+
"steps": [
|
|
74
|
+
{
|
|
75
|
+
"action": { "en": "Submit valid credentials", "zh": "提交有效凭据" },
|
|
76
|
+
"expected": { "en": "The dashboard opens for this user", "zh": "打开该用户的仪表盘" }
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
| Field | Meaning |
|
|
83
|
+
|---|---|
|
|
84
|
+
| `reference` | Optional explicit stable human reference, matching `GP-[A-Z0-9]+(?:-[A-Z0-9]+)*`, unique across all paths, including services. For example `GP-IDENTITY-LOGIN`. Never derive it from list position, category, or title; preserve it through insertion, reorder, regrouping, and display-title changes |
|
|
85
|
+
| `title` | Optional `{ "en", "zh"? }`; overrides the display title, not the executable `id`. Absent: use the path's existing title |
|
|
86
|
+
| `group` | Optional `{ "en", "zh"?, "order"? }` for browser journey grouping; `order` is a nonnegative integer when present. Service checks remain a separate appendix |
|
|
87
|
+
| `precondition` | Optional `{ "en", "zh"? }` describing the starting state |
|
|
88
|
+
| `summary` | Optional object with both `route` and `outcome`, each `{ "en", "zh"? }`. Use `→` between route stops. When Chinese is supplied, pair the Chinese route and outcome |
|
|
89
|
+
| `steps` | Nonempty list of `{ "action": { "en", "zh"? }, "expected": { "en", "zh"? } }`. Preserve the full original actions and expectations, not only the summary |
|
|
90
|
+
|
|
91
|
+
Each localized value needs nonempty English and, when present, nonempty Chinese.
|
|
92
|
+
Keep bilingual copy paired: when the title, precondition, or steps supply Chinese,
|
|
93
|
+
provide Chinese for every step's action and expected result. `validate` rejects
|
|
94
|
+
malformed documentation and malformed or duplicate references.
|
|
95
|
+
|
|
96
|
+
`id` remains the executable identity used by selection, results, and spec tags;
|
|
97
|
+
`reference` is only the stable human label. In the documented view, headings are
|
|
98
|
+
`### GP-IDENTITY-LOGIN: Sign in`. Contents entries show
|
|
99
|
+
`GP-IDENTITY-LOGIN: Sign in / 登录` and link to `#golden-path-sign-in`.
|
|
100
|
+
Anchors always remain `#golden-path-${id}`. Without `reference`, both the heading
|
|
101
|
+
and Contents use the existing path `id`, never a positional `GP-01` number.
|
|
102
|
+
|
|
103
|
+
The generated view groups browser journeys separately from a service-check
|
|
104
|
+
appendix. English/Chinese titles and copy appear together. A path with `summary`
|
|
105
|
+
shows its route and outcome outside a closed
|
|
106
|
+
`<details><summary>Full steps / 完整步骤</summary>` containing the precondition,
|
|
107
|
+
full original steps, and executable verification. English-only copy uses
|
|
108
|
+
`Full steps`. A path without `summary` stays expanded. Documentation text is
|
|
109
|
+
HTML- and Markdown-escaped so literal markup cannot change the Contents target,
|
|
110
|
+
formatting, or disclosure state. Malformed documentation (including duplicate
|
|
111
|
+
references) blocks rendering with field-level diagnostics; fix it before running
|
|
112
|
+
`init --write` or `render --write`. An entirely
|
|
113
|
+
undocumented contract retains the legacy path table; adding documentation does
|
|
114
|
+
not require converting every other path.
|
|
115
|
+
|
|
116
|
+
## `profiles`
|
|
117
|
+
|
|
118
|
+
A profile names one gate. Selection is a pure function of the profile name and the
|
|
119
|
+
contract, so `run` and `verdict` always agree on the set.
|
|
120
|
+
|
|
121
|
+
| Name | gate | environment / endpoint | mutationPolicy | Run by |
|
|
122
|
+
|---|---|---|---|---|
|
|
123
|
+
| `pr-local` | `pull-request` | local / local | `isolated-writes` | generated workflow, on PRs |
|
|
124
|
+
| `queue-local` | `merge-queue` | local / local | `isolated-writes` | generated workflow, in the queue |
|
|
125
|
+
| `dev-active` | `trunk-integration` | dev / active | `synthetic-tenant` | the dev deploy pipeline |
|
|
126
|
+
| `prod-preview` | `pre-promotion` | prod / preview (0% traffic) | `read-only` | the release lane, before promotion |
|
|
127
|
+
| `prod-active` | `post-promotion` | prod / active | `read-only` | the release lane, after promotion |
|
|
128
|
+
|
|
129
|
+
- Each gate fixes its environment and endpoint; other pairings fail.
|
|
130
|
+
- Production is `read-only`: every `mutates: true` path is skipped, tenant or not.
|
|
131
|
+
`synthetic-tenant` runs a writing path only with a tenant. `isolated-writes` is
|
|
132
|
+
local only.
|
|
133
|
+
- These five names are reserved: other lanes select them by name, so each must keep
|
|
134
|
+
its gate. Drop the ones an app does not use; add your own names for other needs.
|
|
135
|
+
- Optional per profile: `prerequisites` (strings), `evidencePolicy` (string), and
|
|
136
|
+
`forbidEnv` (variable names `run` refuses to see set, such as a test-login secret
|
|
137
|
+
on a production run).
|
|
138
|
+
- `run` binds targets: a `local` profile drives only `localhost`, `127.0.0.1`, or
|
|
139
|
+
`[::1]`; any other profile drives only `https://`.
|
|
140
|
+
- A deploy lane that must not write even in dev declares its own profile, for
|
|
141
|
+
example `"dev-readonly": { "gate": "trunk-integration", "environment": "dev",
|
|
142
|
+
"endpoint": "active", "mutationPolicy": "synthetic-tenant", ... }` declared only
|
|
143
|
+
on read-only paths; there is no `--read-only` flag.
|
|
144
|
+
|
|
145
|
+
A profile that selects nothing yields EMPTY, never ALIVE.
|
|
146
|
+
|
|
147
|
+
`--surfaces api,cli` narrows `plan`, `run`, and `verdict` to some surfaces, for a
|
|
148
|
+
deploy step whose runner has no browser. `run` records the narrowing; `verdict`
|
|
149
|
+
uses it and refuses a different one. A narrowed ALIVE covers only those surfaces;
|
|
150
|
+
the deploy lane that skips browser paths owes them elsewhere. `--paths id,id` does
|
|
151
|
+
the same for a list of path ids, so a sharded job runs and judges its own share.
|
|
152
|
+
|
|
153
|
+
## `setup`
|
|
154
|
+
|
|
155
|
+
Everything a run needs before it can drive a path. The workflow is generated from it.
|
|
156
|
+
|
|
157
|
+
| Field | Meaning |
|
|
158
|
+
|---|---|
|
|
159
|
+
| `boot` | **Required.** One shell command that starts the app and keeps running |
|
|
160
|
+
| `baseUrl` | Where the booted app listens; default `http://127.0.0.1:3000` |
|
|
161
|
+
| `healthPath` | Path the workflow waits on before driving; default: the first GET api path that looks like a health check, else `/` |
|
|
162
|
+
| `install` | Dependency install; default from the package manager (`pnpm install --frozen-lockfile`, `npm ci`, `yarn install --immutable`), or a plain install when `ci.cache` is `false` |
|
|
163
|
+
| `build` | Build step before boot |
|
|
164
|
+
| `seed` | Migrations and seed data |
|
|
165
|
+
| `journeys` | Directory of the tagged browser specs, relative to the app |
|
|
166
|
+
| `database` | `{ "engine": "postgres", "version"?: "17", "urlEnv"?: "DATABASE_URL" }`: a throwaway Postgres on tmpfs per run |
|
|
167
|
+
| `env` | Literal, non-secret values for the local build: `{ "E2E_AUTH_BYPASS": "1" }`. Applied to local profiles and the workflow only; a deployed target keeps the runner's own environment |
|
|
168
|
+
| `secrets.generate` | Names given a random masked value per run (auth secrets, test-route secrets) |
|
|
169
|
+
| `secrets.fromCi` | Names read from the repository's CI secrets |
|
|
170
|
+
| `browser` | `{ "command"?: "pnpm exec playwright test", "install"?: "pnpm exec playwright install --with-deps chromium" }`. The command may be a wrapper script (for example one that runs Playwright in a container); the JSON report is written to `golden-path-playwright.json` in the app directory, so mount the app. `run` passes the spec files, `--reporter=list,json`, and `BASE_URL` / `PLAYWRIGHT_BASE_URL` set to the target. The repo's Playwright config must use that URL and reuse the running app: a `webServer` block needs `reuseExistingServer: true` in CI (or an env such as `PLAYWRIGHT_REUSE_EXISTING_SERVER` in `setup.env` that the config reads), or it starts a second server |
|
|
171
|
+
| `attestation` | `{ "path": "/api/version", "field": "sha" }` (a dotted field like `build.sha` works): lets `run --expect-sha` refuse a target serving another commit. Both shas need 7+ hex characters |
|
|
172
|
+
| `authBypass`, `fixtures` | Notes for people: where the test login and fixtures live |
|
|
173
|
+
| `tenants` | Every synthetic tenant a path uses, `e2e-` prefixed |
|
|
174
|
+
|
|
175
|
+
## `ci`
|
|
176
|
+
|
|
177
|
+
| Field | Meaning |
|
|
178
|
+
|---|---|
|
|
179
|
+
| `enabled` | `false` to generate no workflow |
|
|
180
|
+
| `queue` | `mergify` (runs `queue-local` on `mergify/merge-queue/**` pushes), `github` (`merge_group`), or `none` |
|
|
181
|
+
| `packageManager` | `pnpm`, `npm`, or `yarn`; detected at init |
|
|
182
|
+
| `node` | Node version; default `22` |
|
|
183
|
+
| `runner` | `runs-on` label; default `ubuntu-latest`. The job assumes a GitHub-hosted-like runner: Docker for the Postgres `services` container and sudo for `playwright install --with-deps`. When the repo's runner breaks any of that (no Docker, no sudo, Playwright only in a container, sharded lanes), set `ci.enabled` to `false`, keep the repo's own job, and call `run` and `verdict` from it |
|
|
184
|
+
| `timeoutMinutes` | Job timeout; default 20 |
|
|
185
|
+
| `lockfile` | Repo-relative lockfile path, set by init when a monorepo app shares the workspace-root lockfile |
|
|
186
|
+
| `cache` | `false` when the app has no lockfile: no dependency cache and a plain install. Init sets it; `validate` warns when a lockfile is needed and missing |
|
|
187
|
+
|
|
188
|
+
Values that land in the workflow must be plain: `baseUrl` and paths are URL
|
|
189
|
+
characters only, env and secret names are `A-Z0-9_`, `runner` is one line of labels,
|
|
190
|
+
and the names the workflow sets itself (`GOLDEN_PATH_PROFILE`, `BASE_URL`, the
|
|
191
|
+
database URL) cannot be declared. Commands (`boot`, `install`, `build`, `seed`,
|
|
192
|
+
`browser`) are shell commands by design.
|
|
193
|
+
|
|
194
|
+
An app in a monorepo gets its own `golden-paths-<app>.yml` and its own blocks in the
|
|
195
|
+
repo-root `README.md` and `AGENTS.md`, linking to its app-local `GOLDEN_PATHS.md`,
|
|
196
|
+
so several apps never overwrite each other. Init creates a missing README and
|
|
197
|
+
preserves content outside the generated blocks. Setting `ci.enabled` to `false`
|
|
198
|
+
and running `init --write` removes the generated workflow (only a file carrying the
|
|
199
|
+
generated header).
|
|
200
|
+
|
|
201
|
+
The workflow runs `pr-local` on pull requests and `queue-local` in the queue when
|
|
202
|
+
those profiles exist. Its steps: checkout, Node, `check` (generated files current),
|
|
203
|
+
per-run secrets, install, browsers, build, seed, boot, `wait` on the health path,
|
|
204
|
+
`run`, `verdict` (the step that passes or fails the job), and on failure an upload
|
|
205
|
+
of the server log, results, verdict, and Playwright report.
|
|
206
|
+
|
|
207
|
+
## Results and verdict files
|
|
208
|
+
|
|
209
|
+
`golden-path-results.json` is written by `run` as `{ profile, target, observedAt,
|
|
210
|
+
results }`, where `results` is a list of `{ id, status, evidence?, note? }` and
|
|
211
|
+
`status` is `pass`, `fail`, `blocked`, or `cannot-run`. `verdict` refuses an envelope
|
|
212
|
+
from another profile or target. A bare list (results driven by hand) is accepted. A
|
|
213
|
+
selected path with no result is `missing`.
|
|
214
|
+
|
|
215
|
+
`golden-path-verdict.json` adds `verdict` (ALIVE, DEAD, CANNOT-RUN, EMPTY; any
|
|
216
|
+
`fail` is DEAD), `ok`, the per-path `rows`, `broken`, `profile`, `target`,
|
|
217
|
+
`noMutations` (true under a read-only profile), `engine`, `observedAt` (from the run),
|
|
218
|
+
and `generatedAt` (when the verdict was computed). Release lanes must check
|
|
219
|
+
`profile`, `target`, and the age of `observedAt` against their own release policy
|
|
220
|
+
before trusting a verdict. Run the selected profile against the intended candidate
|
|
221
|
+
when fresh evidence is required. Recomputing `verdict` updates `generatedAt`, not
|
|
222
|
+
`observedAt`: it does not rerun a journey, refresh evidence, or prove a new build.
|
|
223
|
+
|
|
224
|
+
## Spec tags
|
|
225
|
+
|
|
226
|
+
```ts
|
|
227
|
+
// @golden-path
|
|
228
|
+
// @covers sign-in
|
|
229
|
+
test('a returning user signs in and lands on the dashboard', async ({ page }) => { ... })
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
`validate` fails both ways: a browser path whose `journey` no tagged spec covers,
|
|
233
|
+
and a tagged spec no path references. It also fails a tagged spec that covers more
|
|
234
|
+
than one journey, because `run` executes whole files. The legacy `@smoke` tag is
|
|
235
|
+
still read.
|
|
236
|
+
|
|
237
|
+
`e2e-test` also tags specs with `@covers <surface-id>` (a route like `/cases/[id]`,
|
|
238
|
+
or a prefixed id like `api:GET /cases`). Those stay: golden-path reads only ids that
|
|
239
|
+
neither start with `/` nor carry a `kind:` prefix, so both tags live in one spec.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Audit and migrate
|
|
2
|
+
|
|
3
|
+
Move a repo from a `smoke.manifest.json`, `@smoke` tags, or its own smoke scripts to
|
|
4
|
+
the golden-path contract and engine. Run everything from the repository root with
|
|
5
|
+
this skill's engine: `node <skill-base-dir>/scripts/golden-path.mjs`.
|
|
6
|
+
|
|
7
|
+
## 1. Audit
|
|
8
|
+
|
|
9
|
+
`audit` reads the tree and prints one line per finding; it exits 1 while anything
|
|
10
|
+
is left to migrate.
|
|
11
|
+
|
|
12
|
+
| Finding | Meaning | Action |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| `legacy` | A `smoke.manifest.json` | `audit --write` converts it |
|
|
15
|
+
| `drift` | It declares `pr-local`, but no workflow running smoke triggers on `pull_request` | The generated workflow runs it |
|
|
16
|
+
| `engine` | A script that reads the smoke manifest or computes a verdict, or an older engine copy | Read it for repo-only features (step 4), then delete it |
|
|
17
|
+
| `workflow` (PR or queue) | A job that runs smoke on pull requests or the merge queue | Replace it with the generated workflow; moving a required check is a merge-rule change, ask first |
|
|
18
|
+
| `workflow` (deploy) | A smoke step after a deploy, on a schedule, or in `cloudbuild.yaml` | Keep the step; call `run` then `verdict` with the deployed profile, `--target`, and `--surfaces` when that runner has no browser |
|
|
19
|
+
| `workflow` (validate only) | A step that only validates the old manifest | Switch it to `validate`, or drop it: the generated workflow runs `check` |
|
|
20
|
+
| `workflow` (manual) | A `workflow_dispatch`-only job | Repoint it or leave it |
|
|
21
|
+
| `tags` | Specs tagged `@smoke` | Still read. Retag to `@golden-path` only after the old scripts that read `@smoke` are gone |
|
|
22
|
+
|
|
23
|
+
Audit judges a CI file by its commands and triggers, not by comments. Treat its
|
|
24
|
+
lines as leads: confirm each before deleting anything.
|
|
25
|
+
|
|
26
|
+
`audit --json` prints the same as data.
|
|
27
|
+
|
|
28
|
+
## 2. Convert
|
|
29
|
+
|
|
30
|
+
`audit --write` converts each legacy manifest into `golden-paths.json` in the same
|
|
31
|
+
directory, then runs init there: engine copy, `GOLDEN_PATHS.md`, repo-root `README.md`
|
|
32
|
+
and `AGENTS.md` pointers, and `.gitignore` entries. The old manifest stays unless you pass
|
|
33
|
+
`--remove-legacy`; remove it once no workflow or script reads it.
|
|
34
|
+
|
|
35
|
+
What the conversion does:
|
|
36
|
+
|
|
37
|
+
- sets `version: 3`; keeps `profiles`, adding the standard five when there were none
|
|
38
|
+
- strips the `@smoke` prefix from `journey`
|
|
39
|
+
- moves the legacy `setup.env` name list into `setup.secrets.fromCi`
|
|
40
|
+
- sets `ci.queue` from `.mergify.yml`, and `ci.packageManager` from the lockfile
|
|
41
|
+
- collects every path `tenant` into `setup.tenants`
|
|
42
|
+
- keeps unknown keys (for example `evidenceClass`) untouched
|
|
43
|
+
|
|
44
|
+
## 3. Finish by hand
|
|
45
|
+
|
|
46
|
+
The conversion prints "needs a person" lines and leaves `TODO:` placeholders, which
|
|
47
|
+
fail `validate`, so no workflow is generated until each is resolved:
|
|
48
|
+
|
|
49
|
+
- **`setup.boot`:** older manifests often hold prose. Write the one command that
|
|
50
|
+
starts the app.
|
|
51
|
+
- **`title`:** taken from the first sentence of `intent` or `observable`, or from the
|
|
52
|
+
spec's test name when the spec holds one test, if it fits under 80 characters;
|
|
53
|
+
otherwise a placeholder with the longer text as a hint.
|
|
54
|
+
- **`cleanup`:** required for each path that writes data. A path that writes only
|
|
55
|
+
the run's throwaway local database and runs in local profiles only can be
|
|
56
|
+
`mutates: false` instead ([contract.md](contract.md#paths)); a path that writes in
|
|
57
|
+
dev needs a tenant and a real cleanup.
|
|
58
|
+
- **Paths that call another service** (a remote API, a data service): api paths
|
|
59
|
+
never leave the target's origin, so make them cli paths that call the service
|
|
60
|
+
(`curl ...` or the repo's existing script).
|
|
61
|
+
- **A spec that needs its own Playwright config:** set `config` on that path.
|
|
62
|
+
- **A spec that covers two journeys:** split it, one journey per file.
|
|
63
|
+
- **`observable` over 300 characters:** keep the proof, and move setup, seeding, and
|
|
64
|
+
cleanup detail into the spec or `setup`.
|
|
65
|
+
- **An api `start` with several requests:** split it into separate paths, or set
|
|
66
|
+
`request` for the one that proves the flow.
|
|
67
|
+
- **`expect`:** add it to every api and cli path; without it a run checks only for a
|
|
68
|
+
2xx response or exit 0.
|
|
69
|
+
- **`setup`:** add `install`, `build`, `seed`, `database`, `env`, and
|
|
70
|
+
`secrets.generate` for what a local run needs; the workflow is built from them.
|
|
71
|
+
Sort `secrets.fromCi` into real CI secrets, per-run generated secrets, and literal
|
|
72
|
+
`env` values. Make the Playwright config reuse the running app
|
|
73
|
+
([contract.md](contract.md#setup)).
|
|
74
|
+
- **Runner and triggers:** the generated job assumes a GitHub-hosted runner and runs
|
|
75
|
+
`pr-local` on pull requests. If the repo ran smoke only in the queue on purpose,
|
|
76
|
+
drop `pr-local`; if it needs a self-hosted runner without Docker, keep its own job
|
|
77
|
+
and call `run` and `verdict` from it.
|
|
78
|
+
|
|
79
|
+
Then `validate`, and `init --write` to generate the workflow.
|
|
80
|
+
|
|
81
|
+
Before deleting anything, grep the repo, its tests included, for the old names:
|
|
82
|
+
`smoke.manifest.json`, the `smoke:*` package scripts, and Cloud Build step ids. Repo
|
|
83
|
+
tests often pin them.
|
|
84
|
+
|
|
85
|
+
## 4. Retire the old setup
|
|
86
|
+
|
|
87
|
+
<!-- skill-script-path: consumer-copy -->
|
|
88
|
+
|
|
89
|
+
- **Forked engines.** List what the repo's script does that the engine does not,
|
|
90
|
+
and decide per feature: express it in the contract, keep a small repo script
|
|
91
|
+
around `run`/`verdict`, or drop it. Delete the fork once nothing calls it.
|
|
92
|
+
- **Hand-built PR and queue jobs.** Delete them once the generated workflow runs.
|
|
93
|
+
Moving a required check to the new job name is a merge-rule change: ask first.
|
|
94
|
+
- **Deploy-time steps.** Replace their smoke call with:
|
|
95
|
+
```bash
|
|
96
|
+
node scripts/golden-paths/golden-path.mjs run --profile dev-active --target "$URL" --expect-sha "$SHA"
|
|
97
|
+
node scripts/golden-paths/golden-path.mjs verdict --profile dev-active --target "$URL"
|
|
98
|
+
```
|
|
99
|
+
- **Duplicate spec lists.** A `package.json` script or CI matrix that lists the
|
|
100
|
+
smoke specs by hand is replaced by `run`, which finds specs by tag.
|
|
101
|
+
- **Committed run output.** Delete run output committed by accident (results and
|
|
102
|
+
verdict files beside the app); keep historical evidence a doc links to. Init adds
|
|
103
|
+
the run output to `.gitignore`.
|
|
104
|
+
- **Safety guards in the old engine.** Map them: loopback-only local runs and
|
|
105
|
+
https-only deployed runs are built in; credential refusal is a profile's
|
|
106
|
+
`forbidEnv`; a read-only deploy lane is its own profile
|
|
107
|
+
([contract.md](contract.md#profiles)). Anything else stays in a small repo script
|
|
108
|
+
around `run` and `verdict`.
|
|
109
|
+
|
|
110
|
+
Deliver the migration as one change: contract, engine, generated files, and the
|
|
111
|
+
retired pieces.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { dirname, join } from 'node:path';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
|
|
8
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
9
|
+
const WEEK_MS = 7 * DAY_MS;
|
|
10
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
|
|
12
|
+
function readJson(path, fallback = {}) {
|
|
13
|
+
try { return JSON.parse(readFileSync(path, 'utf8')); } catch { return fallback; }
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function frontmatterValue(text, key) {
|
|
17
|
+
const frontmatter = /^---\n([\s\S]*?)\n---/.exec(text)?.[1] ?? '';
|
|
18
|
+
const match = new RegExp('^' + key + ':\\s*([^\\n]+)$', 'm').exec(frontmatter);
|
|
19
|
+
return match?.[1].trim().replace(/^['"]|['"]$/g, '') ?? null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function repositoryOf(source) {
|
|
23
|
+
const value = String(source ?? '').trim();
|
|
24
|
+
const match = /^(?:git@github\.com:|https:\/\/github\.com\/)?([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+?)(?:\.git)?$/.exec(value);
|
|
25
|
+
return match?.[1] ?? null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function stableVersion(value) {
|
|
29
|
+
const match = /^v?(\d+)\.(\d+)\.(\d+)$/.exec(String(value ?? '').trim());
|
|
30
|
+
return match ? match.slice(1).map(Number) : null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function newer(left, right) {
|
|
34
|
+
for (let index = 0; index < 3; index += 1) {
|
|
35
|
+
if (left[index] !== right[index]) return left[index] > right[index];
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function writeCache(path, value) {
|
|
41
|
+
try {
|
|
42
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
43
|
+
writeFileSync(path, JSON.stringify(value));
|
|
44
|
+
} catch { /* A read-only cache must not block skill use. */ }
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function main(now = Date.now()) {
|
|
48
|
+
if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
|
|
49
|
+
const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
|
|
50
|
+
const name = frontmatterValue(skill, 'name');
|
|
51
|
+
const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
|
|
52
|
+
if (!name || !localVersion) return;
|
|
53
|
+
|
|
54
|
+
const lock = readJson(join(process.env.HOME || homedir(), '.agents', '.skill-lock.json'));
|
|
55
|
+
const entry = lock.skills?.[name];
|
|
56
|
+
const repository = repositoryOf(entry?.sourceUrl || entry?.source);
|
|
57
|
+
if (!repository) return;
|
|
58
|
+
|
|
59
|
+
const cacheRoot = process.env.XDG_CACHE_HOME || join(process.env.HOME || homedir(), '.cache');
|
|
60
|
+
const cachePath = join(cacheRoot, '1aboveio-skills', 'release-check.json');
|
|
61
|
+
const all = readJson(cachePath);
|
|
62
|
+
const cache = all[repository] && typeof all[repository] === 'object' ? all[repository] : {};
|
|
63
|
+
|
|
64
|
+
if (!cache.lastCheck || now - cache.lastCheck >= DAY_MS) {
|
|
65
|
+
const result = spawnSync('gh', ['api', 'repos/' + repository + '/releases/latest', '--jq', '.tag_name'], {
|
|
66
|
+
encoding: 'utf8',
|
|
67
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
68
|
+
timeout: 1500,
|
|
69
|
+
});
|
|
70
|
+
cache.lastCheck = now;
|
|
71
|
+
if (result.status === 0 && stableVersion(result.stdout)) cache.latestTag = result.stdout.trim();
|
|
72
|
+
else delete cache.latestTag;
|
|
73
|
+
all[repository] = cache;
|
|
74
|
+
writeCache(cachePath, all);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const latestVersion = stableVersion(cache.latestTag);
|
|
78
|
+
if (!latestVersion || !newer(latestVersion, localVersion)) return;
|
|
79
|
+
if (cache.notifiedTag === cache.latestTag && cache.notifiedAt && now - cache.notifiedAt < WEEK_MS) return;
|
|
80
|
+
|
|
81
|
+
cache.notifiedTag = cache.latestTag;
|
|
82
|
+
cache.notifiedAt = now;
|
|
83
|
+
all[repository] = cache;
|
|
84
|
+
writeCache(cachePath, all);
|
|
85
|
+
const command = `npx skills@1.5.23 add '${repository}#${cache.latestTag}' --global --agent universal claude-code --skill ${name} --yes`;
|
|
86
|
+
process.stdout.write(
|
|
87
|
+
`UPDATE_AVAILABLE: A newer 1AboveIO skills release (${cache.latestTag}) is available; this skill is `
|
|
88
|
+
+ `v${localVersion.join('.')}. Ask once whether to refresh ${name}. On approval run \`${command}\`. `
|
|
89
|
+
+ 'The refreshed instructions apply next session. Either way, continue the current task and do not ask again this session.\n',
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
try { main(); } catch { /* Update checks are advisory and always fail silent. */ }
|