@1aboveio/skills 0.0.0-stage → 1.0.1
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 +207 -0
- package/skills/app-dev/data-catalog/agents/openai.yaml +3 -0
- package/skills/app-dev/data-catalog/references/data-catalog-conventions.md +76 -0
- package/skills/app-dev/data-catalog/references/field-definitions.md +123 -0
- package/skills/app-dev/data-catalog/references/format.md +130 -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 +1435 -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 +603 -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,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,203 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: similar-domain
|
|
3
|
+
description: >
|
|
4
|
+
Explicit-only. The domains, mirrors, and operating entities related to one
|
|
5
|
+
or more seed domains: platform-tenancy test, operator-level fingerprints
|
|
6
|
+
(analytics, tenant and payment account IDs, support-email domains,
|
|
7
|
+
templates, DNS, mail, certificates, registration), reverse pivots, scored
|
|
8
|
+
links, an entity chain, and a watchlist for the operator's next domains.
|
|
9
|
+
Not transaction data (tld-detection) or fraud rules (fraud-analysis).
|
|
10
|
+
disable-model-invocation: true
|
|
11
|
+
release-version: 0.38.0
|
|
12
|
+
---
|
|
13
|
+
**Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
|
|
14
|
+
# Similar Domain
|
|
15
|
+
|
|
16
|
+
Start from a seed domain and find every other domain that the same people run.
|
|
17
|
+
A cluster is defined by **shared operator-level fingerprints**: accounts,
|
|
18
|
+
code, and registrations that one operator controls. Shared branding,
|
|
19
|
+
shared industry, and infrastructure that a CDN or hosted platform hands to
|
|
20
|
+
all its customers do not define one. Corporate records (operator, licence,
|
|
21
|
+
affiliate program) confirm and name the cluster; they do not create it on
|
|
22
|
+
their own.
|
|
23
|
+
|
|
24
|
+
The method is a loop: read fingerprints off a domain, ask "who else has this?"
|
|
25
|
+
for each fingerprint, score what comes back, and feed every new domain back
|
|
26
|
+
into the loop.
|
|
27
|
+
|
|
28
|
+
**Produce:** a scored cluster with an evidence matrix, the entity chain behind
|
|
29
|
+
it, and a ≤3-sentence verdict, under `reports/similar-domain/`.
|
|
30
|
+
**Do not produce:** an ownership claim with no corporate evidence, a cluster
|
|
31
|
+
built from one weak signal, or a list of every site on the same CDN or
|
|
32
|
+
hosted platform.
|
|
33
|
+
|
|
34
|
+
Paths under `references/` are relative to this skill.
|
|
35
|
+
|
|
36
|
+
## Workflow
|
|
37
|
+
|
|
38
|
+
Follow these steps in order. Detail:
|
|
39
|
+
[references/workflow.md](references/workflow.md).
|
|
40
|
+
|
|
41
|
+
| Step | Do | Gate |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| 0 Pre-flight | Seeds, question, jurisdiction, access limits | Stop if there is no resolvable domain; note geo-blocks and challenge pages |
|
|
44
|
+
| 1 Fingerprint | Decide platform tenancy; record every non-brand identifier on each domain; check split delivery when the site is reached through ads | Every fingerprint has a source and a timestamp; local resolver artefacts are flagged; each fingerprint is tagged operator-level or platform-level |
|
|
45
|
+
| 2 Pivot | Reverse-search each fingerprint for other domains | Each pivot is logged with source class and hit count; high-noise pivots are filtered by a second fingerprint |
|
|
46
|
+
| 3 Expand names | Enumerate mirror and numbering variants of every brand found | Candidates are only kept if they share a fingerprint from step 1 |
|
|
47
|
+
| 4 Entity | Operator, company record and officers, licence, address, affiliate program, terms page | Each entity fact cites a page; conflicting operator names are kept, not resolved by guess; registered-agent addresses are noise |
|
|
48
|
+
| 5 Score | Weight every link; label each domain | Labels follow the rules in scoring.md; platform-level signals never lift a label above Possible, however many there are |
|
|
49
|
+
| 6 Loop | Send every new Confirmed or Probable domain back to step 1 | Every pass has rows in the pivot log; stop when a full pass adds no new domain, or report the cluster open |
|
|
50
|
+
| 7 Report | Verdict, cluster table, evidence matrix, entity chain, outliers, watchlist, pivot log | ≤3-sentence verdict; no ownership wording without an entity citation; watchlist names the fingerprints that will catch the next domain |
|
|
51
|
+
|
|
52
|
+
### 0 — Pre-flight
|
|
53
|
+
|
|
54
|
+
Record the seed domains, what the user actually wants to know (same
|
|
55
|
+
operator? mirrors? merchant background?), and any jurisdiction or time limits.
|
|
56
|
+
Note what you cannot see: geo-blocks, bot challenges, private WHOIS. A blocked
|
|
57
|
+
site still yields a block page, DNS, certificates, and history, so blocking is
|
|
58
|
+
a finding, not a dead end. Grain and limits:
|
|
59
|
+
[workflow.md](references/workflow.md).
|
|
60
|
+
|
|
61
|
+
### 1 — Fingerprint
|
|
62
|
+
|
|
63
|
+
[references/fingerprints.md](references/fingerprints.md). First decide
|
|
64
|
+
whether the domain is a tenant on a hosted platform (storefront builder,
|
|
65
|
+
website builder, white-label casino or broker platform). On a tenant, the
|
|
66
|
+
hosting address, template, asset hosts, certificate, and bundled registrar
|
|
67
|
+
come from the platform and link every customer it has; only the
|
|
68
|
+
operator's own accounts inside the platform identify the operator.
|
|
69
|
+
|
|
70
|
+
Then collect everything about the domain that is not the brand name:
|
|
71
|
+
registration facts, DNS and mail records, certificate history, analytics
|
|
72
|
+
and pixel IDs, tenant and payment account IDs, the block-page or
|
|
73
|
+
error-page template, support-address domain, hard-coded partner hosts,
|
|
74
|
+
and naming scheme. Record each with where it came from and tag it
|
|
75
|
+
operator-level or platform-level. When the site is reached through ads or
|
|
76
|
+
short links, request it as several visitors and compare; a hidden page is
|
|
77
|
+
a new seed. Fingerprint the seed fully before pivoting; a half-collected
|
|
78
|
+
profile makes later pivots look independent when they are not.
|
|
79
|
+
|
|
80
|
+
### 2 — Pivot
|
|
81
|
+
|
|
82
|
+
[references/pivots.md](references/pivots.md). For each fingerprint, query the
|
|
83
|
+
source class that can answer "who else has this": page-source indexes for
|
|
84
|
+
analytics IDs and templates, passive DNS for nameservers and mail records,
|
|
85
|
+
certificate transparency for subdomains and naming schemes, reverse WHOIS for
|
|
86
|
+
registration batches. Ordinary web search does not index page source; do not
|
|
87
|
+
treat an empty web-search result as a negative. Filter noisy pivots
|
|
88
|
+
(shared CDN nameservers, common mail includes) by requiring a second
|
|
89
|
+
fingerprint before a hit becomes a candidate.
|
|
90
|
+
|
|
91
|
+
### 3 — Expand names
|
|
92
|
+
|
|
93
|
+
Brands that rotate mirrors follow a scheme: numbered suffixes, hyphenated
|
|
94
|
+
digits, double-dash prefixes, country TLDs. Enumerate the scheme for every
|
|
95
|
+
brand found and keep only the variants that share a step-1 fingerprint.
|
|
96
|
+
A name match alone is a candidate, never a member.
|
|
97
|
+
|
|
98
|
+
### 4 — Entity
|
|
99
|
+
|
|
100
|
+
[references/entities.md](references/entities.md). Once a brand name exists,
|
|
101
|
+
collect the legal entity, its company-register record and officers, any
|
|
102
|
+
licence number, address, and affiliate program from the site's own terms
|
|
103
|
+
page, the company register, regulator enforcement notices, and review
|
|
104
|
+
aggregators, then reverse each of
|
|
105
|
+
those: officers appear on other companies, licence registers list every
|
|
106
|
+
domain under one licence, affiliate programs list every brand they pay
|
|
107
|
+
for, entity names appear in other sites' terms pages. Registered-agent and
|
|
108
|
+
company-secretary addresses are shared by hundreds of companies; they link
|
|
109
|
+
nothing. Keep conflicting operator names side by side with dates; operators
|
|
110
|
+
migrate and the conflict is often the history.
|
|
111
|
+
|
|
112
|
+
### 5 — Score
|
|
113
|
+
|
|
114
|
+
[references/scoring.md](references/scoring.md). Weight each link by how hard
|
|
115
|
+
it is to share by accident. One analytics account or one custom template is
|
|
116
|
+
very strong; one registrar or one CDN nameserver pair is medium. Two signals
|
|
117
|
+
from the same vendor account count once. On platform tenants, a shared IP,
|
|
118
|
+
theme, and bundled registrar are one platform-level signal, not three.
|
|
119
|
+
Label each domain Confirmed, Probable, Possible, or Unrelated, and keep the
|
|
120
|
+
reasoning visible in the evidence matrix.
|
|
121
|
+
|
|
122
|
+
### 6 — Loop
|
|
123
|
+
|
|
124
|
+
Every Confirmed or Probable domain becomes a new seed and goes through steps 1
|
|
125
|
+
to 5. Possible domains are parked with the fingerprint that would promote them.
|
|
126
|
+
New fingerprints found on new members (a new support-email domain, a new
|
|
127
|
+
company, a new account ID) get pivoted in the same pass. Stop when a
|
|
128
|
+
complete pass finds nothing new, or when the user's question is answered
|
|
129
|
+
and further expansion would only add mirrors; otherwise the cluster is
|
|
130
|
+
open and the report lists the unrun pivots.
|
|
131
|
+
|
|
132
|
+
### 7 — Report
|
|
133
|
+
|
|
134
|
+
[references/report-template.md](references/report-template.md). Terms:
|
|
135
|
+
[references/terminology.md](references/terminology.md).
|
|
136
|
+
|
|
137
|
+
```text
|
|
138
|
+
reports/similar-domain/<seed>_cluster.md
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Lead with the verdict, then the cluster table sorted Confirmed → Probable →
|
|
142
|
+
Possible, the evidence matrix (domain × fingerprint), the entity chain with
|
|
143
|
+
dates, outliers that were checked and rejected, the watchlist of
|
|
144
|
+
fingerprints that will catch the operator's next domain, coverage caveats,
|
|
145
|
+
and the pivot log. Grep banned strings after writing.
|
|
146
|
+
|
|
147
|
+
## Progress
|
|
148
|
+
|
|
149
|
+
Track a task plan. One item is `in_progress` at a time.
|
|
150
|
+
|
|
151
|
+
1. Pass pre-flight
|
|
152
|
+
2. Decide platform tenancy and fingerprint every seed
|
|
153
|
+
3. Run and log pivots
|
|
154
|
+
4. Expand naming schemes
|
|
155
|
+
5. Collect entity chain
|
|
156
|
+
6. Score and label
|
|
157
|
+
7. Loop until no new domain
|
|
158
|
+
8. Write report with watchlist and proofread
|
|
159
|
+
|
|
160
|
+
## Boundary
|
|
161
|
+
|
|
162
|
+
| Need | Skill |
|
|
163
|
+
|---|---|
|
|
164
|
+
| Related domains, mirrors, sister sites, who runs a website, merchant-site background | `similar-domain` |
|
|
165
|
+
| Anything inside a transaction file: upstream streams behind a descriptor, wallet currency, preset menus, frozen-rate batches, retail constants, currency-amount ladders | `tld-detection` (`scripts/detect_streams.py`, then the ladder run) |
|
|
166
|
+
| Supervised fraud labels, holdout precision/recall, rule packages | `fraud-analysis` |
|
|
167
|
+
| Volume, journey, auth rate, decline mix | `payment-analysis` |
|
|
168
|
+
|
|
169
|
+
A domain cluster from this skill can feed a merchant-risk decision; it is not
|
|
170
|
+
itself a fraud finding. When the user also has authorization data for the
|
|
171
|
+
merchant, hand that part to `tld-detection`: this skill stops at the websites,
|
|
172
|
+
mirrors and operators.
|
|
173
|
+
|
|
174
|
+
## Reference index
|
|
175
|
+
|
|
176
|
+
| Need | Read |
|
|
177
|
+
|---|---|
|
|
178
|
+
| Inputs, limits, order that must not move | [workflow.md](references/workflow.md) |
|
|
179
|
+
| Platform tenancy test, what to collect per domain and why it identifies an operator, split-delivery check | [fingerprints.md](references/fingerprints.md) |
|
|
180
|
+
| Which source class answers each "who else" question, and the traps | [pivots.md](references/pivots.md) |
|
|
181
|
+
| Operator, company register and officers, licence, affiliate, terms-page pivots | [entities.md](references/entities.md) |
|
|
182
|
+
| Link weights, independence, labels, registration batches, shared IDs on many brands, indirect links, worked example | [scoring.md](references/scoring.md) |
|
|
183
|
+
| Report chapters | [report-template.md](references/report-template.md) |
|
|
184
|
+
| Language and banned strings | [terminology.md](references/terminology.md) |
|
|
185
|
+
|
|
186
|
+
## Sanity check
|
|
187
|
+
|
|
188
|
+
- [ ] Seeds, question, and access limits are stated; blocked sites are still fingerprinted
|
|
189
|
+
- [ ] Platform tenancy is decided for every hosting address, and the test is in the pivot log
|
|
190
|
+
- [ ] Every fingerprint has a source and a timestamp; local resolver artefacts are excluded
|
|
191
|
+
- [ ] No label above Possible rests on platform-level signals (shared platform IP, theme, asset host, bundled registrar)
|
|
192
|
+
- [ ] Ad-reached sites were requested as several visitors; the identities tried are listed
|
|
193
|
+
- [ ] Every pivot is logged with source class, query, and hit count, including empty ones
|
|
194
|
+
- [ ] Noisy pivots (CDN nameservers, common mail includes) never add a domain on their own
|
|
195
|
+
- [ ] Name-scheme candidates are kept only when they share a fingerprint
|
|
196
|
+
- [ ] Entity facts cite the page they came from; conflicting operator names are dated, not merged
|
|
197
|
+
- [ ] Every shared address counted as a link was searched first and is not a secretary or registered-agent address
|
|
198
|
+
- [ ] Two signals from one vendor account are counted once
|
|
199
|
+
- [ ] Every cluster member has a label and the matrix shows why
|
|
200
|
+
- [ ] Loop ran until a full pass added nothing, or the stop reason is stated; every pass has pivot-log rows
|
|
201
|
+
- [ ] Watchlist lists each durable operator-level fingerprint and where to watch it
|
|
202
|
+
- [ ] Verdict is ≤3 sentences; no "owned by" without an entity citation
|
|
203
|
+
- [ ] Outliers checked and rejected are listed with the reason
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Entities
|
|
2
|
+
|
|
3
|
+
Step 4 names and dates the cluster. It runs after at least one brand name
|
|
4
|
+
is known and after the technical links exist; it explains the cluster, it
|
|
5
|
+
does not replace the evidence.
|
|
6
|
+
|
|
7
|
+
## What to collect per brand
|
|
8
|
+
|
|
9
|
+
| Fact | Where it usually is |
|
|
10
|
+
|---|---|
|
|
11
|
+
| Legal operator name and company number | Site footer, terms and conditions, "about" page, review aggregators |
|
|
12
|
+
| Company record: incorporation date, officers, secretary or registered agent | Company register of the stated jurisdiction |
|
|
13
|
+
| Licence authority and number (regulated sites only) | Footer seal, validator link, regulator register |
|
|
14
|
+
| Regulator enforcement notices and blocked-site lists | Regulators of the markets the site serves; they often name the operator for the exact domain, including mirrors |
|
|
15
|
+
| Registered address | Terms page, company register, regulator register |
|
|
16
|
+
| Launch year and relaunches | Review aggregators, archives, certificate history |
|
|
17
|
+
| Affiliate program | Footer "Affiliates" link, affiliate directories |
|
|
18
|
+
| Platform vendor | Footer, script hosts, review sites |
|
|
19
|
+
| Previous operators | Older reviews, forum threads, archive snapshots |
|
|
20
|
+
| Complaint patterns | Review aggregators, complaint forums |
|
|
21
|
+
|
|
22
|
+
Record each fact with its page and the date the page was written or
|
|
23
|
+
captured. Review aggregators disagree with each other because operators
|
|
24
|
+
migrate; keep every version with its date rather than picking one.
|
|
25
|
+
|
|
26
|
+
## Entity pivots
|
|
27
|
+
|
|
28
|
+
| Have | Reverse into | Yields |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| Operator name | Aggregator "owner" pages, licence register, web search of terms-page text | Brand list under that operator |
|
|
31
|
+
| Licence number | Regulator register | Every licensed domain, including ones with no technical link yet |
|
|
32
|
+
| Affiliate program | Affiliate directories and forums | Brands marketed together |
|
|
33
|
+
| Address | Web search, company register | Other entities at the address. Before counting a shared address, search it and log how many unrelated companies use it; a secretary or registered-agent address links nothing |
|
|
34
|
+
| Domain or brand name | Regulator enforcement notices and blocked-site lists | The operator named for that exact domain, dated |
|
|
35
|
+
| Officers | Company register | Other companies the same people run; nominee directors are noise |
|
|
36
|
+
| Platform vendor | Vendor's client list, review sites | Vendor-level neighbours; filter, do not add |
|
|
37
|
+
| Previous operator | Same as operator name | The migration path (for example Curaçao entity → transitional entity → Anjouan entity) |
|
|
38
|
+
|
|
39
|
+
## Migration patterns worth expecting
|
|
40
|
+
|
|
41
|
+
Offshore operators reorganise often. Common shapes:
|
|
42
|
+
|
|
43
|
+
- **Entity swap, same platform** — the brand keeps its template and
|
|
44
|
+
tokens; only the footer entity and licence change. Technical evidence
|
|
45
|
+
stays continuous; corporate evidence shows a break.
|
|
46
|
+
- **Brand acquisition** — an old, once-reputable domain is bought and
|
|
47
|
+
relaunched on a new operator's platform. Registration date is old;
|
|
48
|
+
everything else matches the new cluster. Weight the technical evidence.
|
|
49
|
+
- **Mirror farms** — numbered or hyphenated domains registered in batches,
|
|
50
|
+
each redirecting or serving the parent brand. They inherit every
|
|
51
|
+
fingerprint and are usually Confirmed on the first pass.
|
|
52
|
+
- **Platform tenants** — several unrelated operators on one hosted
|
|
53
|
+
platform (white-label casino, storefront builder, website builder)
|
|
54
|
+
share its address, theme, and often its registrar, but not
|
|
55
|
+
operator-level fingerprints. This is the main source of false clusters;
|
|
56
|
+
the tenancy test is in [fingerprints.md](fingerprints.md).
|
|
57
|
+
- **Shell rotation** — one operator puts each batch of sites under a new
|
|
58
|
+
company, often formed through the same secretary. The company names
|
|
59
|
+
differ; the operator-level fingerprints and the officers do not.
|
|
60
|
+
|
|
61
|
+
## Adding a domain from entity evidence alone
|
|
62
|
+
|
|
63
|
+
Allowed only when the source is authoritative for domain membership: a
|
|
64
|
+
regulator's licence register, or the operator's own terms page listing its
|
|
65
|
+
domains. Label such domains Probable until a technical fingerprint
|
|
66
|
+
confirms them. Aggregator sister-site lists are hypotheses to test, not
|
|
67
|
+
grounds for membership.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Fingerprints
|
|
2
|
+
|
|
3
|
+
What to record for each domain, and why each item identifies the people
|
|
4
|
+
behind it rather than the industry it sits in. Record the value, the source
|
|
5
|
+
you read it from, and the time. Categories are ordered by how much they
|
|
6
|
+
usually pay off. The examples cover several kinds of site (online shops,
|
|
7
|
+
casinos, brokers, content sites); use the rows that fit the seed.
|
|
8
|
+
|
|
9
|
+
## Platform tenancy (decide first)
|
|
10
|
+
|
|
11
|
+
Many sites are tenants on a hosted platform: a storefront or website
|
|
12
|
+
builder, a white-label casino or broker platform, a blog host, or a
|
|
13
|
+
vendor that builds and hosts sites for many clients behind a CDN. The
|
|
14
|
+
platform serves every customer from the same addresses, with the same
|
|
15
|
+
theme skeleton, asset hosts, cookies, and often a bundled registrar. Those
|
|
16
|
+
values link the platform's customers, not one operator.
|
|
17
|
+
|
|
18
|
+
Test every hosting address before scoring anything on it:
|
|
19
|
+
|
|
20
|
+
| Test | Tenant if |
|
|
21
|
+
|---|---|
|
|
22
|
+
| Request the address with a made-up host name | It answers with a branded "store not found" or platform page instead of a connection error or a bare default page |
|
|
23
|
+
| Reverse-IP or passive-DNS neighbour count | Many names in unrelated niches or unrelated brands share it |
|
|
24
|
+
| Page source and cookies | Platform asset hosts, platform session cookies, and URL routes that recur unchanged on the platform's other stores |
|
|
25
|
+
| CNAME or nameserver target | Points at the platform's own hostname |
|
|
26
|
+
| Registrar | The platform's domain-reseller registrar, the same for most of its customers; judge this from stores outside the suspect set, not from the suspect's IP neighbours |
|
|
27
|
+
| Account IDs on sites outside the suspect set | Other sites of the same vendor or hosting carry the same analytics or tag ID, so the vendor inserts it |
|
|
28
|
+
|
|
29
|
+
If the domain is a tenant, tag these as **platform-level**: hosting
|
|
30
|
+
address and ASN, theme and template skeleton, platform asset hosts and
|
|
31
|
+
cookies, the platform's certificates, and the bundled registrar. Then
|
|
32
|
+
look for **operator-level** values inside the platform: the tenant or
|
|
33
|
+
store ID, payment account IDs, analytics and pixel IDs, a support-email
|
|
34
|
+
domain the operator registered, custom code, and uploaded asset hashes.
|
|
35
|
+
Record the tenancy test and its result in the pivot log.
|
|
36
|
+
|
|
37
|
+
## Page and tag fingerprints (strongest)
|
|
38
|
+
|
|
39
|
+
These live inside the served HTML. They are set once by whoever configures
|
|
40
|
+
the site and copied across every site that person manages.
|
|
41
|
+
|
|
42
|
+
| Fingerprint | Why it identifies an operator |
|
|
43
|
+
|---|---|
|
|
44
|
+
| Analytics tokens (Cloudflare Web Analytics, Google Analytics / GTM container, Matomo, Yandex) | One account per operator; sharing it across brands is deliberate |
|
|
45
|
+
| Ad and tracking pixels (Meta, TikTok, Snap, affiliate-network pixels) | Tied to a paying advertiser account |
|
|
46
|
+
| Error-monitoring and session-replay keys (Sentry, Hotjar, Clarity, Smartlook) | Per-project keys from one engineering team |
|
|
47
|
+
| Tenant, store, or seller ID inside a hosted platform (in page config, API calls, upload paths) | One platform account; operator-level even when everything around it is platform-level |
|
|
48
|
+
| Payment account IDs: payment-processor publishable keys, wallet or PayPal merchant and client IDs, a checkout endpoint carrying an account | The account that receives the money; operators change domains far more often than payment accounts |
|
|
49
|
+
| Support-email domain the operator registered (`service@<company-domain>`, not `support@<brand>`) | A domain bought for the business; several brands pointing at it are one operator |
|
|
50
|
+
| Block-page or error-page template: HTML skeleton, CSS reset, odd literal values (a specific outline colour, a min-width), font stack | A shared codebase; brands change the logo and palette, not the skeleton |
|
|
51
|
+
| Support-address pattern (`support@<brand>`) and the domain it points at | A mirror's support address names the parent brand |
|
|
52
|
+
| Hard-coded partner hosts: CDN paths, API hosts, game or payment providers, chat widgets | Platform vendor and integration account |
|
|
53
|
+
| Favicon and logo asset hashes | Reused assets across mirrors |
|
|
54
|
+
| JavaScript bundle names and hashes | Same build pipeline |
|
|
55
|
+
| Cookie names and consent-banner vendor IDs | Same front-end stack |
|
|
56
|
+
|
|
57
|
+
Distinguish **operator-level** identifiers (analytics account, custom
|
|
58
|
+
template, tenant ID, payment account) from **vendor-level** ones (a game
|
|
59
|
+
provider, a chat widget, a hosted platform's theme). Vendor-level
|
|
60
|
+
identifiers narrow the field but are shared across many unrelated
|
|
61
|
+
operators. On a platform tenant, the template row is vendor-level unless
|
|
62
|
+
it carries custom literals the platform's other customers lack.
|
|
63
|
+
|
|
64
|
+
## Mail fingerprints (strong)
|
|
65
|
+
|
|
66
|
+
| Fingerprint | Why |
|
|
67
|
+
|---|---|
|
|
68
|
+
| Exact SPF string, including the order of includes | The combination of mail vendors is chosen per operator; a byte-identical string across brands is rarely coincidence |
|
|
69
|
+
| DKIM selectors | Per-sending-account |
|
|
70
|
+
| MX target (Google, Microsoft 365, Zoho, self-hosted) | Splits clusters: an operator rarely runs two mail platforms |
|
|
71
|
+
| Verification TXT records (Microsoft tenant ID, vendor verifications) | Tenant IDs identify one organisation; Google site-verification tokens are per-domain and do not pivot |
|
|
72
|
+
| Mail-related subdomains from certificates (`mailer.`, `click.`, `email.updates.`) | Marketing-mail vendor and its account |
|
|
73
|
+
|
|
74
|
+
## Registration fingerprints (medium to strong)
|
|
75
|
+
|
|
76
|
+
| Fingerprint | Why |
|
|
77
|
+
|---|---|
|
|
78
|
+
| Registrar plus privacy-proxy service | Operators keep one registrar account per portfolio |
|
|
79
|
+
| Creation and last-updated timestamps | Same-hour timestamps across domains mean one batch action |
|
|
80
|
+
| Status-lock set (the exact combination of prohibited flags) | Set by registrar account defaults |
|
|
81
|
+
| Registrant fields when not private (organisation, country, state) | Direct |
|
|
82
|
+
| Expiry alignment | Renewed together |
|
|
83
|
+
|
|
84
|
+
## DNS and hosting fingerprints (medium)
|
|
85
|
+
|
|
86
|
+
| Fingerprint | Why |
|
|
87
|
+
|---|---|
|
|
88
|
+
| Nameserver pair | CDN providers assign pairs per account, but reuse pairs across many accounts; strong only combined with something else |
|
|
89
|
+
| Hosting address and ASN when not behind a CDN | Direct only for a dedicated origin; shared hosting is common and a platform ingress links every tenant |
|
|
90
|
+
| CNAME targets for `www`, `api`, `cdn`, `m` | Names the platform vendor and sometimes the tenant |
|
|
91
|
+
| Subdomain naming from certificate transparency | Platform-specific patterns (`api.`, `cl.`, `evolutiongaming.`) and mirror schemes (`dd20--brand`) |
|
|
92
|
+
| Wildcard certificate issuer and issuance cadence | Same automation |
|
|
93
|
+
|
|
94
|
+
## Brand and naming fingerprints (candidate generators, not evidence)
|
|
95
|
+
|
|
96
|
+
| Fingerprint | Use |
|
|
97
|
+
|---|---|
|
|
98
|
+
| Name stem and numbering scheme (`brand3`, `brand-9884`, `xx00--brand`) | Enumerate variants in step 3 |
|
|
99
|
+
| Licence seal number and validator link (regulated sites: gambling, brokers, payments) | Pivot into the licence register in step 4 |
|
|
100
|
+
| Legal entity, company number, address, and licence text on the terms page | Entity pivot in step 4 |
|
|
101
|
+
| Affiliate program name | Brand-list pivot in step 4 |
|
|
102
|
+
| Platform named in the footer or source (sportsbook platform, storefront builder) | Vendor-level filter |
|
|
103
|
+
|
|
104
|
+
## Behaviour fingerprints (supporting)
|
|
105
|
+
|
|
106
|
+
| Fingerprint | Use |
|
|
107
|
+
|---|---|
|
|
108
|
+
| Geo-block behaviour: which countries, what status code, challenge or branded page | Same edge configuration |
|
|
109
|
+
| Redirect chain (`www` to apex, mirror to parent, country path) | Reveals the parent brand |
|
|
110
|
+
| Response headers beyond the CDN defaults | Same origin stack |
|
|
111
|
+
|
|
112
|
+
## Split-delivery check (sites reached through ads or short links)
|
|
113
|
+
|
|
114
|
+
Cloaking shows reviewers and crawlers one page and real visitors another.
|
|
115
|
+
The hidden page is often on another domain, and that domain is a new
|
|
116
|
+
seed. Request the landing URL and one deeper page (product or checkout)
|
|
117
|
+
as several visitors, strip session tokens and timestamps, and compare:
|
|
118
|
+
|
|
119
|
+
| Vary | Values to try |
|
|
120
|
+
|---|---|
|
|
121
|
+
| Device | Desktop browser, mobile browser |
|
|
122
|
+
| Crawler | Search crawler, ad-platform or social crawler, empty user agent |
|
|
123
|
+
| Arrival | No referrer, search referrer, social referrer, an ad-click parameter (`gclid`, `fbclid`, `ttclid`) on the URL |
|
|
124
|
+
| Location | The analyst's location and the target market, when an exit there is available |
|
|
125
|
+
|
|
126
|
+
Record the identities tried. "No split observed" covers only those
|
|
127
|
+
identities; untried ones go in coverage caveats.
|
|
128
|
+
|
|
129
|
+
## Recording rule
|
|
130
|
+
|
|
131
|
+
Every fingerprint row carries: domain, category, value, level
|
|
132
|
+
(operator or platform), source (page, DNS, certificate log, WHOIS,
|
|
133
|
+
archive, company register, review site), and observed-at time.
|
|
134
|
+
A fingerprint without a source cannot be re-checked and cannot be scored.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Pivots
|
|
2
|
+
|
|
3
|
+
A pivot turns a fingerprint into the question "which other domains have
|
|
4
|
+
this value?" and sends it to a source class that can answer. This file
|
|
5
|
+
says which source class fits which fingerprint, what a hit means, and where
|
|
6
|
+
the false positives come from. It does not prescribe tools or commands.
|
|
7
|
+
|
|
8
|
+
## Source classes
|
|
9
|
+
|
|
10
|
+
| Source class | Answers | Examples of the class |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| Page-source index | Which pages contain this string (token, CSS literal, hostname) | Code-search engines for HTML, URL scanners with body search, internet-scan datasets with HTTP bodies |
|
|
13
|
+
| Passive DNS | Which domains have or had this nameserver, MX, TXT, CNAME, or address | Commercial passive-DNS services, historical DNS archives |
|
|
14
|
+
| Certificate transparency | Which names appear on certificates, and when | Public CT log search |
|
|
15
|
+
| Reverse WHOIS | Which domains share registrant fields, registrar, or timestamps | Reverse-WHOIS services, registrar-side history |
|
|
16
|
+
| Web archive | What the site served before it was blocked or rebranded | Public web archives, cached copies |
|
|
17
|
+
| Review aggregators | Operator, licence, launch year, affiliate program, complaints | Casino / merchant review directories, complaint forums |
|
|
18
|
+
| Licence register | Every domain licensed under one number or entity | Regulator's public register |
|
|
19
|
+
| Regulator enforcement record | The operator named for a domain the regulator acted on | Warnings, blocked-site lists, enforcement notices |
|
|
20
|
+
| Company register | Incorporation date, officers, secretary or registered agent, other companies of the same officers | National or state company registries and their mirrors |
|
|
21
|
+
| Affiliate directory | Every brand an affiliate program pays for | Affiliate-program brand lists, affiliate forums |
|
|
22
|
+
| Ordinary web search | Brand reviews, news, forum threads | General search — note it does not index page source |
|
|
23
|
+
|
|
24
|
+
## Fingerprint to pivot map
|
|
25
|
+
|
|
26
|
+
| Fingerprint | Pivot to | Hit means | Trap |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| Analytics or pixel token | Page-source index | Same account configured both sites | A token can be scraped and pasted by an affiliate site; check the hit is the brand's own domain, not a review page |
|
|
29
|
+
| Block-page template literal | Page-source index | Same codebase | Framework defaults produce the same reset; pick a literal that is not in any public template |
|
|
30
|
+
| Support-address pattern | Page-source index, web search | Mirror names its parent | None significant |
|
|
31
|
+
| Support-email domain the operator registered | Page-source index, web search; then fingerprint that domain itself (registration, MX, site) | Brands run from one mailbox domain | A webmail or platform-issued domain links nothing |
|
|
32
|
+
| Tenant, store, or seller ID | Page-source index | Same platform account | Confirm the value is per-tenant: it must differ across the platform's unrelated stores |
|
|
33
|
+
| Payment account ID | Page-source index, archives | Same receiving account | Platform-wide keys (one key for every tenant) are vendor-level; confirm a different tenant shows a different value |
|
|
34
|
+
| Exact SPF string | Passive DNS | Same mail-vendor set | Single common includes (a lone Google or Microsoft include) match millions of domains; pivot on the full string |
|
|
35
|
+
| Microsoft tenant or vendor verification TXT | Passive DNS | Same organisation tenant | Google site-verification tokens are per domain; they do not pivot |
|
|
36
|
+
| Nameserver pair | Passive DNS | Same CDN account, probably | CDN pairs are reused across accounts; always require a second fingerprint |
|
|
37
|
+
| Hosting address / ASN | Passive DNS, internet-scan dataset | Same origin, only if the address is dedicated | Shared hosting; CDN fronting hides the origin; a platform ingress returns every tenant of the platform, so run the tenancy test first |
|
|
38
|
+
| CNAME target | Passive DNS | Same platform tenant | Vendor-level unless the target embeds a tenant name |
|
|
39
|
+
| Subdomain naming scheme | Certificate transparency | Same platform or mirror generator | Scheme may belong to the platform vendor, shared by its unrelated tenants |
|
|
40
|
+
| Registrar + proxy + timestamp | Reverse WHOIS | Same registration batch | Popular registrar-proxy combinations are common; timestamps within minutes are the real signal |
|
|
41
|
+
| Brand name stem | Certificate transparency, web search | Candidate mirror | A name match is a candidate only; confirm with a fingerprint |
|
|
42
|
+
| Licence number | Licence register | Every domain under the licence | Registers lag; a delisted domain is history, not a false link |
|
|
43
|
+
| Legal entity or address | Web search, page-source index (terms pages), company register | Same operator on paper | Corporate-service and registered-agent addresses are shared by hundreds of unrelated companies |
|
|
44
|
+
| Company officers (directors, shareholders when public) | Company register | Other companies the same people run, then their sites | Nominee directors serve many unrelated companies |
|
|
45
|
+
| Affiliate program | Affiliate directory | Same marketing arm | Some programs serve several operators |
|
|
46
|
+
|
|
47
|
+
## Running a pivot
|
|
48
|
+
|
|
49
|
+
1. State the fingerprint, the source class, and the exact query.
|
|
50
|
+
2. Record the hit count, even if zero. Zero from a source that cannot see
|
|
51
|
+
the fingerprint (web search for a token) is "not observable", not
|
|
52
|
+
"absent".
|
|
53
|
+
3. For each hit, note which fingerprint produced it. A domain reached by
|
|
54
|
+
two independent pivots is already close to Confirmed.
|
|
55
|
+
4. Filter high-noise pivots (nameserver pair, registrar, single mail
|
|
56
|
+
include) by intersecting with the set of hits from a strong pivot before
|
|
57
|
+
any of them becomes a candidate.
|
|
58
|
+
5. Prefer pivots whose hit count is small. A pivot returning thousands of
|
|
59
|
+
domains is not evidence until narrowed.
|
|
60
|
+
6. Tag each log row with its loop pass. A pass that added members but has
|
|
61
|
+
no rows pivoting their new fingerprints is not finished.
|
|
62
|
+
7. When a source is blocked (bot challenge, login, timeout), try another
|
|
63
|
+
source of the same class before logging the pivot "not observable",
|
|
64
|
+
and log each source tried.
|
|
65
|
+
8. When an authoritative page (regulator notice, register entry) can be
|
|
66
|
+
read only through a search snippet, an archive copy, or a third-party
|
|
67
|
+
quote, cite it as such. It can name the entity in the entity chain,
|
|
68
|
+
but it does not count as an authoritative listing for scoring until
|
|
69
|
+
the page itself is read.
|
|
70
|
+
|
|
71
|
+
## Blocked-site pivots
|
|
72
|
+
|
|
73
|
+
When the live site is unreachable:
|
|
74
|
+
|
|
75
|
+
- Pivot on the block page itself (template, token, support address).
|
|
76
|
+
- Use certificate history for subdomains and mirror schemes.
|
|
77
|
+
- Use web archives for the pre-block or pre-rebrand HTML, which usually
|
|
78
|
+
still carries the same tokens.
|
|
79
|
+
- Use mirrors that are reachable from the analyst's location; they share
|
|
80
|
+
the parent's fingerprints by design.
|
|
81
|
+
- Use review aggregators for the entity chain; they visited the site from
|
|
82
|
+
an allowed location.
|