@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,139 @@
|
|
|
1
|
+
# Output Template, Writing Rules & Validation (process)
|
|
2
|
+
|
|
3
|
+
> Read when: producing the criteria/audit document (create mode), or running the final self-check before saving.
|
|
4
|
+
|
|
5
|
+
## Lead with the verdict
|
|
6
|
+
|
|
7
|
+
An **audit deliverable opens with the verdict**, not buries it under tables. Put a one-line `## Verdict: Ship / No-ship` (with the one-sentence reason) as the **first section**, before the Surface Census and the detailed assessment, which then *justify* it below. (Create-mode criteria docs lead with Source/Scope — there's no verdict yet.)
|
|
8
|
+
|
|
9
|
+
**A no-ship is a number, not a vibe.** The verdict carries the counts that make it no-ship: uncovered surfaces, orphan surfaces, ledger warnings, skipped tests, over-mock findings. If a finding has a count, the count goes in the summary; "it doesn't block CI yet" is never a license to omit it.
|
|
10
|
+
|
|
11
|
+
## Writing Rules
|
|
12
|
+
|
|
13
|
+
- Make each AC independently testable.
|
|
14
|
+
- Prefer observable outcomes over internal implementation details.
|
|
15
|
+
- Include negative cases and misuse paths, not only happy paths.
|
|
16
|
+
- For async/pub-sub/orchestrator systems, require correlation IDs and final durable state assertions.
|
|
17
|
+
- For idempotent APIs, require duplicate request tests and concurrent request tests when money/state transitions are involved.
|
|
18
|
+
- For security-sensitive flows, require authorization tests for cross-tenant/cross-merchant access.
|
|
19
|
+
- For provider integrations, use fake adapters in integration tests and real providers only in staging smoke tests.
|
|
20
|
+
- Avoid vague criteria like “works correctly,” “fast,” or “secure”; replace them with measurable expectations.
|
|
21
|
+
|
|
22
|
+
## Output Template
|
|
23
|
+
|
|
24
|
+
Use this structure unless the user asks for another format:
|
|
25
|
+
|
|
26
|
+
```markdown
|
|
27
|
+
# Test Criteria: <feature/task name>
|
|
28
|
+
|
|
29
|
+
## Source
|
|
30
|
+
- Input: <PRD/design document/spec/bug brief/GitHub issue/code audit source name or link>
|
|
31
|
+
- Version/date: <if available>
|
|
32
|
+
- Author/owner: <if available>
|
|
33
|
+
|
|
34
|
+
## Scope
|
|
35
|
+
- In scope: <behaviors covered>
|
|
36
|
+
- Out of scope: <behaviors intentionally excluded>
|
|
37
|
+
- Assumptions: <behavior inferred from issue/context/sibling flows because source is incomplete>
|
|
38
|
+
- Blockers: <product/access/env decisions that prevent precise criteria>
|
|
39
|
+
- Design source: <the prototype ref:path / mockup / layout-fixing doc this unit is built from, pinned at a commit — or `none`>
|
|
40
|
+
|
|
41
|
+
> **"Out of scope" excludes behaviors, never the axis the unit is about.** A unit that cites a **Design source** owes `presentation:fidelity` ([../presentation/axis.md](../presentation/axis.md)); listing that evidence as a non-goal declares the point of the work out of scope (named incident: fmm-express #521). A unit with no design source simply says `none`.
|
|
42
|
+
|
|
43
|
+
## Acceptance Criteria
|
|
44
|
+
- AC1: <actor/system does ... under condition ... with expected observable result>
|
|
45
|
+
- AC2: <...>
|
|
46
|
+
|
|
47
|
+
## Critical User/System Journeys
|
|
48
|
+
- J1: <actor/role starts from ... does ... and reaches ... with expected side effects>
|
|
49
|
+
- J2: <...>
|
|
50
|
+
|
|
51
|
+
## Test Matrix
|
|
52
|
+
| Scenario | AC/Journey | Test Level | Mock/Fake Policy | Setup/Input | Assertions | Proving Test |
|
|
53
|
+
|---|---|---|---|---|---|---|
|
|
54
|
+
| Happy path | AC1 / J1 | Integration/API | Real DB + fake external provider | ... | ... | test name |
|
|
55
|
+
| Invalid input | AC2 | Unit + API | Mock provider only to assert it is not called | ... | ... | test name |
|
|
56
|
+
|
|
57
|
+
## Mock And Integration Policy
|
|
58
|
+
- Mock acceptable: <pure decision logic, provider failures, asserting side effect is not called>
|
|
59
|
+
- Integration required: <DB transactions, idempotency, concurrency, event/outbox, auth/tenant isolation, schema compatibility>
|
|
60
|
+
- External dependency strategy: <fake provider adapter, emulator, test container, staging smoke test>
|
|
61
|
+
- Mock-only exceptions: <AC/scenario + justification + reviewer approval; mocking a first-party internal seam is never an approvable exception — [../depth/mock-policy.md](../depth/mock-policy.md)>
|
|
62
|
+
|
|
63
|
+
## Required Automated Tests
|
|
64
|
+
- Unit: <specific logic and edge cases>
|
|
65
|
+
- Integration: <DB/broker/provider fakes/state transitions>
|
|
66
|
+
- Contract/API: <request/response/schema guarantees>
|
|
67
|
+
- API E2E: <endpoint behavior with state/side-effect assertions, if needed>
|
|
68
|
+
- UI E2E: <page route render-health/functional browser behavior, if needed>
|
|
69
|
+
- Journey E2E: <cross-page/core business flow with real APIs where practical, if needed>
|
|
70
|
+
|
|
71
|
+
## Coverage Mapping
|
|
72
|
+
| Requirement/Journey | ACs | Test Case/File | Status |
|
|
73
|
+
|---|---|---|---|
|
|
74
|
+
| <REQ-1 / J1> | AC1, AC2 | <path::test_name> | Required |
|
|
75
|
+
|
|
76
|
+
## Surface Census (Audit Mode Only — every surface, not just the gaps)
|
|
77
|
+
One row per inventoried surface so completeness is provable by construction: gaps = every row not `Covered`/`Excluded`. If the inventory can't be fully enumerated, say so and mark the rest `BLOCKED` — do not quietly scope to what was easy to see.
|
|
78
|
+
| Surface | kind/class | Required level | Status | Proving test (or — ) |
|
|
79
|
+
|---|---|---|---|---|
|
|
80
|
+
| /settings/team | route/mutation | browser-journey + presentation | Over-mocked | e2e/team.spec.ts (intercepts own API) |
|
|
81
|
+
| /settings/team/members | route/mutation | browser-journey + presentation | Missing | — (orphan, no test) |
|
|
82
|
+
| /api/team/invite | api/mutation | api + integration | Partial | tests/api/invite.test.ts |
|
|
83
|
+
| ... (every remaining surface) | ... | ... | ... | ... |
|
|
84
|
+
|
|
85
|
+
## Existing Coverage Assessment (Audit Mode Only)
|
|
86
|
+
- Production-readiness verdict: <Ship / No-ship>, with the specific user scenarios likely to generate bug reports in the first week and the evidence that would raise confidence. **State the driving counts** (uncovered/orphan surfaces, ledger warnings, skips, over-mock findings) — a no-ship names its numbers, including advisory-scan counts; it does not hide them behind "partial."
|
|
87
|
+
- Current coverage status: <Covered / Partial / Missing / Wrong Level / Over-mocked / Unverified / BLOCKED>
|
|
88
|
+
- Existing tests reviewed: <actual paths/test names/cases/assertions inspected; do not list docs-only claims as reviewed tests>
|
|
89
|
+
- Code paths reviewed: <paths/modules>
|
|
90
|
+
- Route/endpoint discovery: <method/command/source used, discovered count, manifest count, missing/stale/uncovered entries>
|
|
91
|
+
- Route reachability: <Reachable / Redirected / Guarded / Blocked / Unknown per relevant route, with layout/middleware/guard evidence>
|
|
92
|
+
- E2E journeys identified: <journey list or Not applicable>
|
|
93
|
+
- E2E journey coverage: <journey -> API/UI/Journey E2E evidence/status>
|
|
94
|
+
- Prior coverage docs/reports checked: <None or list; state which claims were verified against test code>
|
|
95
|
+
- Coverage gaps: <missing scenarios, weak assertions, over-mocking, wrong level, uncovered journeys, unverified claims, or None>
|
|
96
|
+
- Follow-up test criteria items: <specific tests to add/update, with AC/journey mapping>
|
|
97
|
+
|
|
98
|
+
## Test Skipping
|
|
99
|
+
- Skipped tests: <None or list with allowed category, evidence/blocker link, and replacement verification>
|
|
100
|
+
|
|
101
|
+
## Behavior-First Validation
|
|
102
|
+
- ACs describe externally observable behavior, not private functions.
|
|
103
|
+
- Test matrix scenarios validate outcomes, durable state, contracts, side effects, permissions, and failure behavior.
|
|
104
|
+
- Unit tests are scoped to public behavior, pure decision logic, or stable public contracts.
|
|
105
|
+
- Mock-only coverage does not bypass the core behavior under test.
|
|
106
|
+
- Existing coverage claims were verified against actual test code, not trusted from prior docs/reports.
|
|
107
|
+
- Route discovery and reachability analysis were performed before E2E audit, if applicable.
|
|
108
|
+
- Production-readiness verdict is stated as an explicit ship/no-ship call with named first-week bug-report scenarios, not a vibe.
|
|
109
|
+
- Status: PASS / FAIL / BLOCKED
|
|
110
|
+
- Required revisions before approval: <None or list>
|
|
111
|
+
|
|
112
|
+
## Reviewer Checklist
|
|
113
|
+
- Obligation impact stated: which obligations/surfaces this change touches, their `requirementRefs`, and the test that proves each.
|
|
114
|
+
- No `Orphan surface` introduced: every changed/new surface is referenced by at least one requirement and has a Coverage Ledger row.
|
|
115
|
+
- Every changed/new page with a write form has a mutation-form journey test that fills the real UI and asserts the backend accepts the submission; split-contract forms (fields and validator from different sources) are not signed off on seam tests alone.
|
|
116
|
+
- Every AC maps to an automated test or approved exception.
|
|
117
|
+
- Tests assert behavior/state, not implementation details only.
|
|
118
|
+
- No tests skipped/weakened to make CI pass; every (inherited) skip has an allowed category, evidence/blocker link, and replacement verification.
|
|
119
|
+
- Substitutes appear only at external trust boundaries; no internal seam (DB, service layer, internal endpoint, event bus) is mocked. Fakes/stubs keep failure-path/edge cases fast and deterministic and never call a live third party in CI; mocks/fakes don't bypass the core behavior.
|
|
120
|
+
- Mock-only coverage is rejected for stateful workflow, money movement, auth, idempotency, concurrency, event/outbox, or orchestrator recovery unless explicitly approved; money movement, auth, and idempotency can never be mock-only even with approval. Mocking a first-party internal seam is never approvable ([the mock policy](../depth/mock-policy.md)).
|
|
121
|
+
- Failure, retry, duplicate, permission, and concurrency cases are covered where relevant.
|
|
122
|
+
- Each proving test ran green (exit 0). No logs, screenshots, traces, or read-backs attached on top.
|
|
123
|
+
|
|
124
|
+
## Blocking Decisions (need a human answer to finalize the criteria)
|
|
125
|
+
Each entry is a product/scope decision you could NOT make yourself — phrase it so the reader knows exactly what to decide and why it matters. These are distinct from follow-up actions (which are just work to schedule); a blocking decision changes the criteria/verdict depending on the answer.
|
|
126
|
+
- Decision: <the choice to make> · Why it blocks: <which AC/scope/verdict is undetermined until this is answered> · If A → <consequence for the criteria/tests> · If B → <consequence>. Default if no answer: <the assumption you'll proceed on, marked `Assumption`>.
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Behavior-First Validation (the gate before saving)
|
|
130
|
+
|
|
131
|
+
After drafting, validate and revise before saving. Mark `BLOCKED` only when the source lacks enough information/access to define observable behavior. Reject criteria or audit claims that rely on:
|
|
132
|
+
|
|
133
|
+
- ACs phrased as calls to specific internal functions, or test matrices organized around implementation modules instead of user/system scenarios.
|
|
134
|
+
- Mock-heavy plans that never exercise state changes, API contracts, permissions, events, or side effects; or substitutes standing in for internal seams (DB, service layer, internal endpoints, event bus) instead of external trust boundaries.
|
|
135
|
+
- Requirement coverage mapped only to private-method/unit tests when integration, contract, or E2E is required.
|
|
136
|
+
- Coverage classified `Covered` from prior docs/PR summaries/audit reports/issue comments/CI/agent claims without inspecting actual test code/assertions.
|
|
137
|
+
- E2E audits that skipped deterministic route/endpoint discovery or reachability analysis.
|
|
138
|
+
- Audits driven only test-outward (mock census, existing-test mapping) without requirement-inward reconciliation, so `Orphan surface` gaps stay invisible.
|
|
139
|
+
- Reachable pages with write forms treated as covered by route/API/validator tests, without a mutation-form journey that fills the rendered UI and asserts the backend accepts the submission (split-contract form gap).
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Test Strategy (process)
|
|
2
|
+
|
|
3
|
+
> Read when: choosing the required test level for an AC, classifying E2E type, or deciding whether a skip is allowed.
|
|
4
|
+
|
|
5
|
+
## Test Level Selection
|
|
6
|
+
|
|
7
|
+
Classify each AC before writing the matrix:
|
|
8
|
+
|
|
9
|
+
- Logic AC: unit test is acceptable for pure decision logic or stable public contracts.
|
|
10
|
+
- Boundary AC: contract/API test is required for request/response, validation, schema, compatibility, and error contracts.
|
|
11
|
+
- Stateful workflow AC: integration test is required for DB writes, transactions, state transitions, idempotency, and recovery.
|
|
12
|
+
- Async/pub-sub/orchestrator AC: integration test is required with real state store plus broker emulator or fake event adapter; assert final durable state and emitted events.
|
|
13
|
+
- Critical money/security AC: integration, API E2E, or Journey E2E is required; mock-only coverage is never acceptable here, even with approval.
|
|
14
|
+
- Browser/UI AC: UI E2E is required for page behavior, navigation, user-visible errors, forms, and role-dependent visibility.
|
|
15
|
+
- Cross-page/core business journey: Journey E2E is required with real APIs where practical; do not mock internal endpoints unless explicitly approved.
|
|
16
|
+
|
|
17
|
+
## E2E Coverage Rules
|
|
18
|
+
|
|
19
|
+
When E2E is required, classify it explicitly and apply the `e2e-test` skill:
|
|
20
|
+
|
|
21
|
+
- API E2E: endpoint behavior with real app; assert HTTP contract, auth/permissions, durable state, and side effects.
|
|
22
|
+
- UI E2E: page/route behavior; assert loading, navigation, forms, user-visible behavior, auth, and error states.
|
|
23
|
+
- Journey E2E: cross-page or core business flow; assert final outcome and side effects through real APIs where practical.
|
|
24
|
+
|
|
25
|
+
## Golden-path smoke selection
|
|
26
|
+
|
|
27
|
+
Smoke is not a separate browser-test level. A browser smoke path is a **curated E2E smoke journey**: it uses the same real-app/Playwright discipline as E2E, but only for the handful of journeys whose failure alone means "do not ship." Keep the classification separate:
|
|
28
|
+
|
|
29
|
+
- **E2E obligation** — required by risk and surface behavior; broad functional/journey coverage belongs to the main/nightly lane.
|
|
30
|
+
- **Smoke membership** — release-critical selection from those obligations; small enough to run per-PR and reduced to ALIVE/DEAD by the `golden-path` skill.
|
|
31
|
+
|
|
32
|
+
You can use the generated surface inventory to suggest candidates (mutation routes, auth/payments-looking routes, health endpoints), but do not let code discovery decide the golden-path manifest. Product/release judgment must promote candidates into `golden-paths.json` and write concrete observables.
|
|
33
|
+
|
|
34
|
+
For audit mode:
|
|
35
|
+
|
|
36
|
+
- Run deterministic route/endpoint discovery before coverage judgment.
|
|
37
|
+
- Include discovery method, discovered count, manifest count, missing/stale/uncovered entries, and changed-route coverage status.
|
|
38
|
+
- Build the user journey inventory before mapping tests; route render-health tests do not prove a business journey unless they exercise the full flow and assert final outcomes.
|
|
39
|
+
- Decompose every reachable dashboard/settings page into its mutation-form journeys (e.g. "operator creates a GitHub connector account"). For each, require UI/Journey E2E proof that the form renders every backend-required field and that submitting it produces a payload the backend accepts plus the expected durable state change. Reject backend-validator, schema-source, and API-forwarding tests as a substitute — they are proxy wiring for a split-contract form.
|
|
40
|
+
|
|
41
|
+
## Test Skipping Policy (no-skip)
|
|
42
|
+
|
|
43
|
+
The committed suite contains **only tests that run and assert**. A test is never disabled to get past a missing precondition or a failure — no `test.skip()` / `xit` / `describe.skip`, no conditional skip whose condition always holds in CI, no *disguised* skip (`if (!data) return` or any guard that no-ops the body while reporting **passed**). **The agent has no discretion to skip**: there is a non-skip answer for every case, and a disabled/guarded test doesn't even clear the gate — the ledger grades it not-covered and the render sweep reports `blocked`, never `pass`.
|
|
44
|
+
|
|
45
|
+
The only allowed forms are the two below that keep the test running somewhere (a platform skip CI runs elsewhere, a strict `xfail` pinned to an open issue) — the same rule as `test-quality` principle 4. "Skip when it's outside your control" is the exact rationalization that ships false coverage. Map each case to a mechanism that keeps the **signal** or an honest **`Unverified`**:
|
|
46
|
+
|
|
47
|
+
- **Missing state** (data, session, migration, flag, a specific entity status) → **seed it**; constructing it is the test's *arrange* step, not a blocker. The line is "can the agent create this state?", not "is it present now?"
|
|
48
|
+
- **Third-party dependency** → **sandbox at the boundary** (sandbox + test keys; fake only the external adapter).
|
|
49
|
+
- **Un-sandboxable external or a genuine flake** → **quarantine lane**: a non-blocking job that still *runs and reports* the test, surface graded `Unverified`, with a dated exit. Run + report + don't-block ≠ stop running.
|
|
50
|
+
- **Only valid on a specific platform/capability** → **route it** (matrix/tag), or a conditional skip (`skipif(sys.platform == 'win32')`, an optional dependency) **as long as CI runs the test where the condition is false**; selection ≠ skip.
|
|
51
|
+
- **Known bug with an open issue** → a **strict** `xfail` pinned to that issue: it still runs, and it goes red the moment the bug is fixed, so it cannot rot.
|
|
52
|
+
- **Behavior not built yet** → land the test *with* the behavior (TDD red→green) or don't merge it yet.
|
|
53
|
+
- **Obsolete / wrong test** → **delete it**, don't skip.
|
|
54
|
+
- **Cannot run in any environment we control** → it isn't an automated test → a documented **manual-check**, tracked.
|
|
55
|
+
|
|
56
|
+
**Annotation is not authorization:** a `TODO`/issue link doesn't make a skip acceptable — it's a confession the work was deferred (`TODO: re-enable when we seed …` means it was seedable). **Inherited** skips are pre-existing (a note, not a blocker under diff discipline), but no PR may *add* one. The `@quarantine` tag and lane wiring: `e2e-test/references/ci-integration.md`.
|
|
@@ -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. */ }
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "coverage-config.schema.json",
|
|
4
|
+
"title": "coverage.config.json",
|
|
5
|
+
"description": "Per-project config for ensure-coverage tooling, placed at the repo root. The mockPolicy block declares TOPOLOGY for the default-on, zero-tolerance mock-internal-seam lint rule (references/depth/mock-policy.md) \u2014 it tunes what counts as first-party; it does not enable/disable the gate.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": true,
|
|
8
|
+
"properties": {
|
|
9
|
+
"mockPolicy": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"description": "Declares topology for lint-tests' mock-internal-seam rule via the externals-allowlist inversion: flag a mock of first-party code, exempt declared externals. The rule is default-on and cannot be disabled here.",
|
|
12
|
+
"additionalProperties": false,
|
|
13
|
+
"properties": {
|
|
14
|
+
"enabled": {
|
|
15
|
+
"type": "boolean",
|
|
16
|
+
"default": true,
|
|
17
|
+
"description": "Inert / retained for compatibility. The mock-internal-seam gate is ZERO-TOLERANCE and default-on; setting this false does NOT disable it. Config declares topology, not on/off."
|
|
18
|
+
},
|
|
19
|
+
"firstPartyAliasPrefixes": {
|
|
20
|
+
"type": "array",
|
|
21
|
+
"items": {
|
|
22
|
+
"type": "string"
|
|
23
|
+
},
|
|
24
|
+
"default": [
|
|
25
|
+
"@/",
|
|
26
|
+
"~/"
|
|
27
|
+
],
|
|
28
|
+
"description": "Import-specifier prefixes denoting first-party app source; a mock of one of these is treated as an internal seam."
|
|
29
|
+
},
|
|
30
|
+
"firstPartyPackages": {
|
|
31
|
+
"type": "array",
|
|
32
|
+
"items": {
|
|
33
|
+
"type": "string"
|
|
34
|
+
},
|
|
35
|
+
"default": [],
|
|
36
|
+
"description": "Bare package names \u2014 exact or scope prefix (e.g. \"@acme/\") \u2014 that are actually first-party workspace packages, so mocking them is an internal seam."
|
|
37
|
+
},
|
|
38
|
+
"externals": {
|
|
39
|
+
"type": "array",
|
|
40
|
+
"items": {
|
|
41
|
+
"type": "string"
|
|
42
|
+
},
|
|
43
|
+
"default": [],
|
|
44
|
+
"description": "Regex sources for specifiers that are legitimately external and therefore exempt (overrides first-party detection). Bare npm packages and node: builtins are already external by default; use this only for a first-party-looking specifier that is actually external/generated."
|
|
45
|
+
},
|
|
46
|
+
"testUtilHints": {
|
|
47
|
+
"type": "array",
|
|
48
|
+
"items": {
|
|
49
|
+
"type": "string"
|
|
50
|
+
},
|
|
51
|
+
"description": "Path segments that mark a relative import as a test util / fixture / mock rather than a production seam (e.g. __mocks__, fixtures, helpers)."
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"requirementGlobs": {
|
|
56
|
+
"type": "object",
|
|
57
|
+
"description": "Enables the acceptance gate. Maps a requirement source name to the directory holding its documents, e.g. {\"adr\": \"docs/adr\", \"prd\": \"docs/prd\"}. Every document there whose text matches acceptedMarker must own <coverageDir>/<source>/<id>-*.coverage.{yml,json} with `criteria` or a tracked gap, unless the document says \"no runtime behavior\". Unset means the gate is skipped and validate says so.",
|
|
58
|
+
"additionalProperties": {
|
|
59
|
+
"type": "string"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"acceptedMarker": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"description": "Case-insensitive regex that marks a requirement document as accepted. Default matches `status: accepted` and `**Status:** accepted`."
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://example.com/ensure-coverage/coverage-file.schema.json",
|
|
4
|
+
"title": "Per-requirement coverage file",
|
|
5
|
+
"description": "Curated, hand-authored, one per requirement document at docs/tests/<source>/<id>-<slug>.coverage.(yml|json). Declares ownership and intent only. It MUST NOT carry coverage status \u2014 status is computed by the aggregator so files for a shared surface cannot diverge.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"surfaces"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"criteria": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "Path to this requirement's test criteria doc, e.g. docs/tests/adr/0008-org-model-allowlist.criteria.md"
|
|
15
|
+
},
|
|
16
|
+
"surfaces": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"description": "Map of surface id (route/api/table/event id, matching the inventory) to its required coverage. May be empty for an accepted requirement with no runtime behavior.",
|
|
19
|
+
"additionalProperties": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"additionalProperties": false,
|
|
22
|
+
"description": "Deviation/ownership record for one surface. A surface needs NO entry here to be enforced \u2014 the Surface Baseline Contract auto-applies a floor from the inventory's (kind, class). An entry exists only to RAISE the floor, mark sensitive, exclude, attest, or attach ownership.",
|
|
23
|
+
"properties": {
|
|
24
|
+
"requiredLevels": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"description": "Raise the floor above baseline. Strictest required test levels for this surface (unioned with the auto-computed baseline; cannot lower it). Functional tokens: render-health, unit, integration, api, pg-api, browser-journey, journey, ui-e2e, e2e, no-secret-assertion. (`render-health` is a minimal browser reachability/render floor, used as the residual for the `static` exclusion category; it is the breadth-floor sibling of the presentation spine `presentation:render-health` and of e2e-test's Tier-1. The old token `smoke` is kept as a back-compat alias for `render-health`.) Presentation-axis tokens (proven against a real rendered page, never DOM-only): presentation:render-health (the spine \u2014 page renders without pageerror/console.error/error boundary/5xx), presentation:spatial, presentation:perceivability, presentation:reachability, presentation:temporal. Every browser route auto-carries the full presentation floor via the Surface Baseline Contract. These tokens are GRADED by the ledger; the e2e-test presentation sweep is the runner that emits per-(route,level) results (see ensure-coverage references/presentation/runner-contract.md).",
|
|
27
|
+
"items": {
|
|
28
|
+
"type": "string"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"sensitive": {
|
|
32
|
+
"type": "boolean",
|
|
33
|
+
"description": "Human-declared escalation for credential/admin/settings surfaces. Adds a contract + auth/tenant-isolation obligation on top of the mechanical floor. May only raise the bar, never lower it."
|
|
34
|
+
},
|
|
35
|
+
"verified": {
|
|
36
|
+
"type": "boolean",
|
|
37
|
+
"description": "Marks that the resolved tests were read and genuinely prove the behavior (assertions inspected; no evidence required unless the user asks). Promotes a statically-adequate surface from `Unverified` to `Covered`. A self-declared @level alone never reaches `Covered`."
|
|
38
|
+
},
|
|
39
|
+
"excludeCells": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"description": "Gated removal of feature-derived escalation CELLS (e.g. `presentation:perceivability@dark`). Map of cell-qualified level -> { category, reason }. Only `@`-qualified cells may be excluded; the base mechanical floor can never be removed. Each removal is surfaced in the census.",
|
|
42
|
+
"additionalProperties": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"additionalProperties": false,
|
|
45
|
+
"required": [
|
|
46
|
+
"category",
|
|
47
|
+
"reason"
|
|
48
|
+
],
|
|
49
|
+
"properties": {
|
|
50
|
+
"category": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"description": "Why this cell is out of scope (e.g. deprecated, seed)."
|
|
53
|
+
},
|
|
54
|
+
"reason": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"description": "Human-readable justification (printed in the census)."
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"exclude": {
|
|
62
|
+
"type": [
|
|
63
|
+
"object",
|
|
64
|
+
"null"
|
|
65
|
+
],
|
|
66
|
+
"additionalProperties": false,
|
|
67
|
+
"description": "Mark the surface out of scope. PERMITTED ONLY when the adapter's reachability/class signals agree it cannot hurt a user \u2014 a reachable mutation route or a mutation API can never be excluded. Surfaced in a visible exclusion census.",
|
|
68
|
+
"required": [
|
|
69
|
+
"category",
|
|
70
|
+
"reason"
|
|
71
|
+
],
|
|
72
|
+
"properties": {
|
|
73
|
+
"category": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"enum": [
|
|
76
|
+
"seed",
|
|
77
|
+
"static",
|
|
78
|
+
"deprecated",
|
|
79
|
+
"internal"
|
|
80
|
+
],
|
|
81
|
+
"description": "Why this surface is out of scope."
|
|
82
|
+
},
|
|
83
|
+
"reason": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"description": "Human-readable justification (printed in the census)."
|
|
86
|
+
},
|
|
87
|
+
"gapIssue": {
|
|
88
|
+
"type": [
|
|
89
|
+
"string",
|
|
90
|
+
"null"
|
|
91
|
+
],
|
|
92
|
+
"description": "Optional tracker link for the exclusion or a follow-up."
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"uiOnly": {
|
|
97
|
+
"type": "boolean",
|
|
98
|
+
"description": "True if this surface is only reachable/asserted via UI."
|
|
99
|
+
},
|
|
100
|
+
"owner": {
|
|
101
|
+
"type": [
|
|
102
|
+
"string",
|
|
103
|
+
"null"
|
|
104
|
+
],
|
|
105
|
+
"description": "Optional feature-card ownership: team or person responsible for this surface."
|
|
106
|
+
},
|
|
107
|
+
"purpose": {
|
|
108
|
+
"type": [
|
|
109
|
+
"string",
|
|
110
|
+
"null"
|
|
111
|
+
],
|
|
112
|
+
"description": "Optional feature-card field: what this surface is for."
|
|
113
|
+
},
|
|
114
|
+
"userVisibleContract": {
|
|
115
|
+
"type": [
|
|
116
|
+
"string",
|
|
117
|
+
"null"
|
|
118
|
+
],
|
|
119
|
+
"description": "Optional feature-card field: the user-visible contract this surface must uphold."
|
|
120
|
+
},
|
|
121
|
+
"gapIssue": {
|
|
122
|
+
"type": [
|
|
123
|
+
"string",
|
|
124
|
+
"null"
|
|
125
|
+
],
|
|
126
|
+
"description": "Optional tracker link for a known, accepted coverage gap."
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"gapIssue": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"description": "Tracked issue for a known coverage gap on an accepted requirement (e.g. \"#412\"). Satisfies the acceptance gate in place of `criteria` while the gap is open."
|
|
134
|
+
},
|
|
135
|
+
"gapDoc": {
|
|
136
|
+
"type": "string",
|
|
137
|
+
"description": "Path to a gap-audit document that records why this accepted requirement is not yet proven. Alternative to `gapIssue`."
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# ensure-coverage scripts
|
|
2
|
+
|
|
3
|
+
The mechanized half of the skill: each script decides one thing the doctrine in
|
|
4
|
+
[`../SKILL.md`](../SKILL.md) says must be proven. This file is the CLI reference. The
|
|
5
|
+
*what* lives in `SKILL.md` and `references/`; the *why* of each rule is cited there.
|
|
6
|
+
|
|
7
|
+
**Resolution.** Every script is under this skill's own directory, not the target
|
|
8
|
+
repo. Set `SKILL_DIR` to the directory you read `SKILL.md` from and run
|
|
9
|
+
`node "$SKILL_DIR/scripts/<name>.mjs"`. Never resolve against your CWD, and never
|
|
10
|
+
locate a script with `find` over `$HOME`; if `SKILL_DIR` is unknown, stop and ask.
|
|
11
|
+
Consumers write the path as `<ensure-coverage>/scripts/<name>.mjs`.
|
|
12
|
+
|
|
13
|
+
Every script has a `*.test.mjs` sibling; `ci.yml` runs them all.
|
|
14
|
+
|
|
15
|
+
## `coverage-ledger.mjs aggregate|validate|report`
|
|
16
|
+
|
|
17
|
+
The breadth accounting gate. Reconciles the generated surface inventory
|
|
18
|
+
(`docs/tests/_generated/surface-inventory.json`, per
|
|
19
|
+
[`inventory-contract.md`](../references/breadth/inventory-contract.md)) against the
|
|
20
|
+
curated `*.coverage.yml` files and the `@covers` / `@level` annotations in tests, and
|
|
21
|
+
computes every surface's status. Full mechanics:
|
|
22
|
+
[`coverage-ledger.md`](../references/breadth/coverage-ledger.md).
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
node "$SKILL_DIR/scripts/coverage-ledger.mjs" aggregate # build coverage-index.json + coverage-metrics.json
|
|
26
|
+
node "$SKILL_DIR/scripts/coverage-ledger.mjs" validate [--config f] [--strict] [--warn-only] # exit 1 on errors
|
|
27
|
+
node "$SKILL_DIR/scripts/coverage-ledger.mjs" report # markdown index + ADR matrix view
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- `validate` fails on an unmet baseline floor (`Missing` / `Over-mocked` / `Wrong Level`), an `Unverified` only when `unverifiedBlocks: true` (default `false`: a warning), a rejected exclusion, a `Stale link`, or an `Unrealized requirement`. `Orphan surface` and `Dead surface` warn.
|
|
31
|
+
- `aggregate` also writes `coverage-metrics.json` with the **over-mock rate** (`overMocked / tested`, split behavior vs presentation). The *count* is the zero-tolerance gate; the *rate* is a trend signal for reviewers and dashboards, never a second gate.
|
|
32
|
+
- **Acceptance gate.** Set `requirementGlobs` in `coverage.config.json` (e.g. `{ "adr": "docs/adr" }`) and `validate` also checks every accepted requirement document there: it must own `<coverageDir>/<source>/<id>-*.coverage.{yml,json}` that links a `criteria` doc or names a tracked gap (`gapIssue` / `gapDoc`), unless the document says it has "no runtime behavior". `acceptedMarker` overrides the default accepted-status regex. Unset, the gate is skipped and the output says so.
|
|
33
|
+
- Exit 2 means no surface inventory was found (gate not wired here); hooks treat that as degraded, not failed.
|
|
34
|
+
- Surface discovery is repo-specific. A reference Next.js App Router adapter ships at `scripts/adapters/nextjs-inventory.mjs <appDir> --check` (`--check` fails when the committed inventory is stale).
|
|
35
|
+
|
|
36
|
+
## `lint-tests.mjs --diff <base> [--rules a,b]`
|
|
37
|
+
|
|
38
|
+
Static test-lint gate engine. Deterministic, near-zero false positives, blocks on what a diff **adds**. Without `--diff` it scans the whole tree.
|
|
39
|
+
|
|
40
|
+
| rule | blocks on |
|
|
41
|
+
|---|---|
|
|
42
|
+
| `no-skip` | an added declared `test.skip('name', …)` / `.only` / `xit` / `.todo` / `describe.skip` (conditional skips and `xfail` are test-quality's `conditional-skip` lead) |
|
|
43
|
+
| `no-fixed-timeout` | an added `waitForTimeout` / numeric `cy.wait` / `sleep` |
|
|
44
|
+
| `no-empty-test` | an empty test body |
|
|
45
|
+
| `no-swallowed-assertion` | an assertion whose rejection is eaten by a chained `.catch(...)` |
|
|
46
|
+
| `mock-internal-seam` | a `vi.mock` / `jest.mock` / `vitest.mock` whose target is first-party code |
|
|
47
|
+
|
|
48
|
+
`mock-internal-seam` is default-on and zero-tolerance: no `@mock-ok` waiver, no grandfathering. In audit mode run it **whole-tree** (`--rules mock-internal-seam`, no `--diff`) and count every hit in the verdict. A believed false positive is fixed by declaring the repo's topology, never by waiving:
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
// coverage.config.json at the repo root — declares what counts as first-party
|
|
52
|
+
{ "mockPolicy": {
|
|
53
|
+
"firstPartyAliasPrefixes": ["@/", "~/"],
|
|
54
|
+
"firstPartyPackages": ["@acme/"],
|
|
55
|
+
"externals": ["^@/generated/"] } }
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
A conventional `@/`-aliased repo needs no config. `mock-policy-config.mjs` is the resolver `lint-tests` uses; the field reference is `schemas/coverage-config.schema.json` and a ready-to-copy example is `references/depth/coverage.config.example.json`. Only the front end (finding a mock call and its target) is language-specific; a new stack is a one-function adapter feeding the same classifier, and until one exists the rule degrades to a review lead, not a false block.
|
|
59
|
+
|
|
60
|
+
The judgment remainder (does a real-boundary sibling exist, is the assertion meaningful) stays a reviewer judgment.
|
|
61
|
+
|
|
62
|
+
## `design-parity.mjs scaffold|probe|validate`
|
|
63
|
+
|
|
64
|
+
The `presentation:fidelity` gate for a unit built from a cited design source
|
|
65
|
+
([`axis.md`](../references/presentation/axis.md) → `presentation:fidelity`).
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
node "$SKILL_DIR/scripts/design-parity.mjs" scaffold # manifest skeleton from the doctrine-fixed catalog
|
|
69
|
+
node "$SKILL_DIR/scripts/design-parity.mjs" probe <manifest> --viewport <px> # emits the JS that measures the built page
|
|
70
|
+
node "$SKILL_DIR/scripts/design-parity.mjs" validate <manifest> --observed <results.json> [--diff <base>]
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- `scaffold` pre-fills the rows a hand-written list forgets: page measure, container plane, per-viewport type scale, box, coupled rhythm, and a relational `primary > secondary` row. A row may be rejected with a written reason, never silently omitted.
|
|
74
|
+
- `validate` blocks on a `TODO` row, a rejection with no reason, a `from:` citation that does not resolve in the pinned source, a missing catalog row for a declared role, or any measured divergence. With `--diff` it also blocks a changed `expected` under an unmoved `source.sha` (rewriting the target to match the page); declare a genuine re-read with `rebase: <reason>`.
|
|
75
|
+
- Without `--observed` it announces the **reduced form** on stderr: manifest complete and citations resolve, nothing about conformance.
|
|
76
|
+
- Not a differ (cross-stack comparison is judgment) and not a pixel baseline (every `expected` is read off the *source*, not captured from the implementation).
|
|
77
|
+
|
|
78
|
+
## `check-quarantine-expiry.mjs`
|
|
79
|
+
|
|
80
|
+
The auto-resurface gate. A `@quarantine(until=…)` exit is non-blocking until its date, then expires and re-blocks, so the quarantine lane cannot decay into a permanent skip.
|
|
81
|
+
|
|
82
|
+
## `ci-audit.mjs --files <ci configs> [--adoption] [--json] [--allow-warn]`
|
|
83
|
+
|
|
84
|
+
Opt-in: run only when the user asks to audit CI. It checks the skill's sole supported CI gate, curated golden-path smoke, and reports `present` / `warn-only` / `absent`. It deliberately ignores ledger validation, inventory freshness, presentation sweeps, broad E2E, test lint, over-mock scans, design parity, and quarantine expiry. Contract: [`ci-contract.md`](../references/enforcement/ci-contract.md).
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
node "$SKILL_DIR/scripts/ci-audit.mjs" --files .github/workflows/ci.yml,cloudbuild.gates.yaml
|
|
88
|
+
node "$SKILL_DIR/scripts/ci-audit.mjs" --adoption --files <ci files> # issue body on stdout; exit 1 when wiring is needed
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
`--adoption` turns missing or weakened smoke wiring into a focused issue body.
|
|
92
|
+
|
|
93
|
+
## `mock-policy-config.mjs`
|
|
94
|
+
|
|
95
|
+
Library, not a CLI: resolves `coverage.config.json` → `mockPolicy` into the first-party/external topology `mock-internal-seam` classifies against. Defaults in `DEFAULT_MOCK_POLICY`.
|
|
96
|
+
|
|
97
|
+
## CI boundary
|
|
98
|
+
|
|
99
|
+
The analyzers above support audits and review; this skill does not recommend them as CI gates. Curated golden-path smoke is the only CI gate in [`ci-contract.md`](../references/enforcement/ci-contract.md).
|