@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,270 @@
|
|
|
1
|
+
# Feishu OAuth API Reference
|
|
2
|
+
|
|
3
|
+
Load this file when implementing Feishu OAuth or troubleshooting auth issues.
|
|
4
|
+
|
|
5
|
+
## OAuth Flow Endpoints
|
|
6
|
+
|
|
7
|
+
### Authorization
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
GET https://accounts.feishu.cn/open-apis/authen/v1/authorize
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
| Parameter | Required | Description |
|
|
14
|
+
|-----------|----------|-------------|
|
|
15
|
+
| `client_id` | Yes | Feishu App ID (`cli_xxx`) |
|
|
16
|
+
| `redirect_uri` | Yes | Must match registered URI exactly |
|
|
17
|
+
| `response_type` | Yes | Always `code` |
|
|
18
|
+
| `state` | Yes | CSRF token (managed by Better Auth) |
|
|
19
|
+
| `scope` | No | Space-separated scopes |
|
|
20
|
+
|
|
21
|
+
### Token Exchange
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
POST https://open.feishu.cn/open-apis/authen/v2/oauth/token
|
|
25
|
+
Content-Type: application/json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Request body:**
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"grant_type": "authorization_code",
|
|
32
|
+
"code": "<auth_code>",
|
|
33
|
+
"client_id": "cli_xxx",
|
|
34
|
+
"client_secret": "xxx"
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Response:**
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"access_token": "u-xxxxxxxx",
|
|
42
|
+
"token_type": "Bearer",
|
|
43
|
+
"expires_in": 7200,
|
|
44
|
+
"refresh_token": "ur-xxxxxxxx",
|
|
45
|
+
"refresh_expires_in": 2592000
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
> Note: v2 token endpoint returns flat JSON (no `data` wrapper). v1 used `data` wrapper.
|
|
50
|
+
|
|
51
|
+
### User Info
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
GET https://open.feishu.cn/open-apis/authen/v1/user_info
|
|
55
|
+
Authorization: Bearer <access_token>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Response:**
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"code": 0,
|
|
62
|
+
"msg": "success",
|
|
63
|
+
"data": {
|
|
64
|
+
"open_id": "ou_xxxxxxxxxxxxxxxxxxxxxxxx",
|
|
65
|
+
"union_id": "on_xxxxxxxxxxxxxxxxxxxxxxxx",
|
|
66
|
+
"name": "张三",
|
|
67
|
+
"en_name": "John Zhang",
|
|
68
|
+
"email": "john@company.com",
|
|
69
|
+
"avatar_url": "https://internal-api-lark-file.feishu.cn/...",
|
|
70
|
+
"tenant_key": "xxxxxxxx",
|
|
71
|
+
"employee_no": ""
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
> ⚠️ User data is nested under `data` — must unwrap once. Do NOT double-unwrap.
|
|
77
|
+
|
|
78
|
+
### 1. Authorization (redirect user)
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
GET https://accounts.feishu.cn/open-apis/authen/v1/authorize
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
| Parameter | Required | Description |
|
|
85
|
+
|-----------|----------|-------------|
|
|
86
|
+
| `client_id` | Yes | Feishu App ID (`cli_xxx`) |
|
|
87
|
+
| `redirect_uri` | Yes | Must match registered URI exactly |
|
|
88
|
+
| `response_type` | Yes | Always `code` |
|
|
89
|
+
| `state` | Yes | CSRF token (managed by Better Auth) |
|
|
90
|
+
| `scope` | No | Space-separated scopes |
|
|
91
|
+
|
|
92
|
+
### 2. Token Exchange
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
POST https://open.feishu.cn/open-apis/authen/v2/oauth/token
|
|
96
|
+
Content-Type: application/json
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Request body:**
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"grant_type": "authorization_code",
|
|
103
|
+
"code": "<auth_code>",
|
|
104
|
+
"client_id": "cli_xxx",
|
|
105
|
+
"client_secret": "xxx"
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Response:**
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"access_token": "u-xxxxxxxx",
|
|
113
|
+
"token_type": "Bearer",
|
|
114
|
+
"expires_in": 7200,
|
|
115
|
+
"refresh_token": "ur-xxxxxxxx",
|
|
116
|
+
"refresh_expires_in": 2592000
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
> Note: v2 token endpoint returns flat JSON (no `data` wrapper). v1 used `data` wrapper.
|
|
121
|
+
|
|
122
|
+
### 3. User Info
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
GET https://open.feishu.cn/open-apis/authen/v1/user_info
|
|
126
|
+
Authorization: Bearer <access_token>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Response:**
|
|
130
|
+
```json
|
|
131
|
+
{
|
|
132
|
+
"code": 0,
|
|
133
|
+
"msg": "success",
|
|
134
|
+
"data": {
|
|
135
|
+
"open_id": "ou_xxxxxxxxxxxxxxxxxxxxxxxx",
|
|
136
|
+
"union_id": "on_xxxxxxxxxxxxxxxxxxxxxxxx",
|
|
137
|
+
"name": "张三",
|
|
138
|
+
"en_name": "John Zhang",
|
|
139
|
+
"email": "john@company.com",
|
|
140
|
+
"avatar_url": "https://internal-api-lark-file.feishu.cn/...",
|
|
141
|
+
"tenant_key": "xxxxxxxx",
|
|
142
|
+
"employee_no": ""
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
> ⚠️ User data is nested under `data` — must unwrap once. Do NOT double-unwrap.
|
|
148
|
+
|
|
149
|
+
## User Info Fields
|
|
150
|
+
|
|
151
|
+
| Field | Type | Notes |
|
|
152
|
+
|-------|------|-------|
|
|
153
|
+
| `open_id` | string | Unique per user per app — changes if app changes |
|
|
154
|
+
| `union_id` | string | Unique per user across same developer's apps |
|
|
155
|
+
| `name` | string | Display name (often Chinese) |
|
|
156
|
+
| `en_name` | string | English name (may be empty) |
|
|
157
|
+
| `email` | string | **Empty string if scope not approved** (not null, not omitted) |
|
|
158
|
+
| `avatar_url` | string | Profile picture |
|
|
159
|
+
| `tenant_key` | string | Organization identifier |
|
|
160
|
+
| `employee_no` | string | Employee number (if configured) |
|
|
161
|
+
|
|
162
|
+
## Scopes & Permissions
|
|
163
|
+
|
|
164
|
+
| Scope | Level | Admin Approval |
|
|
165
|
+
|-------|-------|----------------|
|
|
166
|
+
| (none — basic profile) | Basic | Auto |
|
|
167
|
+
| `contact:user.email:readonly` | Advanced (高级权限) | **Required** |
|
|
168
|
+
| `contact:user.phone:readonly` | Advanced | **Required** |
|
|
169
|
+
| `contact:user.employee_id:readonly` | Advanced | **Required** |
|
|
170
|
+
|
|
171
|
+
### Activating Advanced Permissions
|
|
172
|
+
|
|
173
|
+
1. Open app in [Feishu Dev Console](https://open.feishu.cn/app)
|
|
174
|
+
2. Permissions → find the scope → **Enable**
|
|
175
|
+
3. App Release → **Create Version** → **Submit for Review**
|
|
176
|
+
4. Admin approves in Admin Console
|
|
177
|
+
5. Permission status changes to **Active**
|
|
178
|
+
|
|
179
|
+
Until approved: the field returns empty string `""`.
|
|
180
|
+
|
|
181
|
+
## Error Codes
|
|
182
|
+
|
|
183
|
+
| Code | Meaning | Fix |
|
|
184
|
+
|------|---------|-----|
|
|
185
|
+
| 0 | Success | — |
|
|
186
|
+
| 10003 | Invalid app_id | Check credentials |
|
|
187
|
+
| 10012 | App not released | Publish a version |
|
|
188
|
+
| 10014 | Scope not approved | Request admin approval |
|
|
189
|
+
| 20028 | Invalid code / expired | Code was reused or expired (10 min TTL) |
|
|
190
|
+
| 20029 | Redirect URI mismatch | Add exact URL in Feishu app settings |
|
|
191
|
+
|
|
192
|
+
## Prisma Schema
|
|
193
|
+
|
|
194
|
+
Better Auth with genericOAuth requires these models:
|
|
195
|
+
|
|
196
|
+
```prisma
|
|
197
|
+
model User {
|
|
198
|
+
id String @id @default(cuid())
|
|
199
|
+
name String?
|
|
200
|
+
email String? @unique
|
|
201
|
+
emailVerified Boolean @default(false) @map("email_verified")
|
|
202
|
+
image String?
|
|
203
|
+
createdAt DateTime @default(now()) @map("created_at")
|
|
204
|
+
updatedAt DateTime @updatedAt @map("updated_at")
|
|
205
|
+
sessions Session[]
|
|
206
|
+
accounts Account[]
|
|
207
|
+
@@map("users")
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
model Session {
|
|
211
|
+
id String @id @default(cuid())
|
|
212
|
+
expiresAt DateTime @map("expires_at")
|
|
213
|
+
token String @unique @default(cuid())
|
|
214
|
+
ipAddress String? @map("ip_address")
|
|
215
|
+
userAgent String? @map("user_agent")
|
|
216
|
+
userId String @map("user_id")
|
|
217
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
218
|
+
createdAt DateTime @default(now()) @map("created_at")
|
|
219
|
+
updatedAt DateTime @updatedAt @map("updated_at")
|
|
220
|
+
@@map("sessions")
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
model Account {
|
|
224
|
+
id String @id @default(cuid())
|
|
225
|
+
userId String @map("user_id")
|
|
226
|
+
accountId String @map("account_id")
|
|
227
|
+
providerId String @map("provider_id")
|
|
228
|
+
accessToken String? @map("access_token")
|
|
229
|
+
refreshToken String? @map("refresh_token")
|
|
230
|
+
idToken String? @map("id_token")
|
|
231
|
+
accessTokenExpiresAt DateTime? @map("access_token_expires_at")
|
|
232
|
+
refreshTokenExpiresAt DateTime? @map("refresh_token_expires_at")
|
|
233
|
+
scope String?
|
|
234
|
+
password String?
|
|
235
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
236
|
+
createdAt DateTime @default(now()) @map("created_at")
|
|
237
|
+
updatedAt DateTime @updatedAt @map("updated_at")
|
|
238
|
+
@@unique([providerId, accountId])
|
|
239
|
+
@@map("accounts")
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Required by genericOAuth plugin for CSRF state
|
|
243
|
+
model Verification {
|
|
244
|
+
id String @id @default(cuid())
|
|
245
|
+
identifier String
|
|
246
|
+
value String
|
|
247
|
+
expiresAt DateTime @map("expires_at")
|
|
248
|
+
createdAt DateTime @default(now()) @map("created_at")
|
|
249
|
+
updatedAt DateTime @updatedAt @map("updated_at")
|
|
250
|
+
@@map("verification")
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Schema Gotchas
|
|
255
|
+
|
|
256
|
+
- **`emailVerified` must be `Boolean`**, not `DateTime` — Better Auth writes `true`/`false`, not timestamps
|
|
257
|
+
- **Account columns need `At` suffix** — `accessTokenExpiresAt` / `refreshTokenExpiresAt` (Prisma adapter uses camelCase field names)
|
|
258
|
+
- **`@map()` for snake_case columns** — Prisma field names are camelCase; use `@map` for DB column names
|
|
259
|
+
- **`verification` table is mandatory** — genericOAuth stores OAuth state here; missing table = 500 on sign-in
|
|
260
|
+
|
|
261
|
+
## International (Lark) vs China (Feishu)
|
|
262
|
+
|
|
263
|
+
| | China | International |
|
|
264
|
+
|---|-------|---------------|
|
|
265
|
+
| Base domain | `feishu.cn` | `larksuite.com` |
|
|
266
|
+
| Auth URL | `accounts.feishu.cn` | `accounts.larksuite.com` |
|
|
267
|
+
| API URL | `open.feishu.cn` | `open.larksuite.com` |
|
|
268
|
+
| Dev Console | `open.feishu.cn/app` | `open.larksuite.com/app` |
|
|
269
|
+
|
|
270
|
+
Use `FEISHU_BASE_URL` env var to switch between them.
|
|
@@ -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,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: data-catalog
|
|
3
|
+
description: "Column definitions for warehouse tables, written inside the Spark/PySpark or SQL script that builds each table (CATALOG_TABLE / CATALOG_FIELDS, or a `-- @field` comment block), with a generated markdown catalog in docs/catalog/ and a CI check that fails a PR whose catalog is stale. Use when writing or changing a table script that adds, renames, removes, or changes the meaning of an output column or feature; when asked what a warehouse column or feature means; to set a repo up ('init the data catalog', 'generate the data dictionary', '字段字典', 'add catalog CI'); or to audit existing SQL or Spark scripts for undocumented columns. NOT for implementing or tuning the Spark job itself (pyspark), DAG wiring (airflow), or general workflow YAML (github-actions)."
|
|
4
|
+
release-version: 0.36.0
|
|
5
|
+
---
|
|
6
|
+
**Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
|
|
7
|
+
# Data catalog
|
|
8
|
+
|
|
9
|
+
Every output column of a warehouse table gets its definition written next to the
|
|
10
|
+
code that computes it. A script turns those definitions into `docs/catalog/*.md`,
|
|
11
|
+
and CI fails a pull request when the pages and the scripts disagree.
|
|
12
|
+
|
|
13
|
+
## First use in a repo
|
|
14
|
+
|
|
15
|
+
In a git repo with no `data-catalog.json`, set the repo up **before** the task you
|
|
16
|
+
were asked to do, whatever it is: an audit, a new column, or a question. Setting up
|
|
17
|
+
puts the engine, the CI check, and the conventions in the repo itself, so agents
|
|
18
|
+
and people without this skill follow them from then on.
|
|
19
|
+
|
|
20
|
+
1. `python3 <skill-base-dir>/scripts/data_catalog.py audit '<globs>'` to find the
|
|
21
|
+
table scripts; choose `--scripts` globs that cover them and nothing else.
|
|
22
|
+
2. Pick `--languages` from the repo's existing docs (Chinese docs: `zh,en`;
|
|
23
|
+
otherwise `en`). Run `init` with them and `--write` ([Init](#init)).
|
|
24
|
+
3. `node <skill-base-dir>/scripts/persist-conventions.mjs --repo-root <repo> --write`
|
|
25
|
+
writes the `## Data catalog conventions` section of `CONTRIBUTING.md` and points
|
|
26
|
+
`AGENTS.md` at it.
|
|
27
|
+
4. Then do the task. In the reply, list what setup added, and say the Data catalog
|
|
28
|
+
check runs on PRs but is not required.
|
|
29
|
+
|
|
30
|
+
Skip setup outside a git repo, or when the user says not to change the repo.
|
|
31
|
+
Never document tables during setup unless the task asks for it.
|
|
32
|
+
|
|
33
|
+
## Find your task
|
|
34
|
+
|
|
35
|
+
| Task | Do |
|
|
36
|
+
|---|---|
|
|
37
|
+
| Writing or changing a table script | [While coding](#while-coding), then [references/field-definitions.md](references/field-definitions.md) |
|
|
38
|
+
| "What does column X mean?" | Read `docs/catalog/<table>.md`; with no page, read the script's `CATALOG_FIELDS`, then its SQL |
|
|
39
|
+
| The repo has no `data-catalog.json` | [First use in a repo](#first-use-in-a-repo) |
|
|
40
|
+
| Find scripts with missing or weak definitions | [Audit](#audit) |
|
|
41
|
+
| Document an existing table | [Backfill one table](#backfill-one-table) |
|
|
42
|
+
| CI says the catalog is stale | `python3 <engine> generate`, commit the pages |
|
|
43
|
+
| Before committing a table-script change, or reviewing one | `python3 <engine> drift` (`--base origin/main` for a whole branch) |
|
|
44
|
+
| `Field`/`Table` arguments, the SQL block, config keys, exit codes | [references/format.md](references/format.md) |
|
|
45
|
+
|
|
46
|
+
`<engine>` is `scripts/data-catalog/data_catalog.py` in the repo, or
|
|
47
|
+
`<skill-base-dir>/scripts/data_catalog.py` before the repo has a copy. When
|
|
48
|
+
`python3 <engine> version` differs from the skill's copy, refresh with
|
|
49
|
+
`init --write`.
|
|
50
|
+
|
|
51
|
+
## The files
|
|
52
|
+
|
|
53
|
+
| File | Owner | Edit it? |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| `CATALOG_TABLE` / `CATALOG_FIELDS` in each `.py` table script | the definitions | yes |
|
|
56
|
+
| `-- @table` / `-- @field` block at the top of each `.sql` table script | the definitions | yes |
|
|
57
|
+
| `data-catalog.json` | which scripts, languages, output dir | yes, then rerun `init --write` |
|
|
58
|
+
| `docs/catalog/*.md` | generated pages | never |
|
|
59
|
+
| `catalog_fields.py` (path in `fieldsModule`) | generated `Field`/`Table` types | never |
|
|
60
|
+
| `scripts/data-catalog/data_catalog.py` | engine copied from this skill | never; refresh with init |
|
|
61
|
+
| `.github/workflows/data-catalog.yml` | generated CI check | never; rerun init |
|
|
62
|
+
| `CONTRIBUTING.md` section between `conventions:data-catalog` markers | the conventions, for agents without this skill | never; rerun `persist-conventions.mjs --write`; the rest is yours |
|
|
63
|
+
| `AGENTS.md` `## Contributing` pointer | points at `CONTRIBUTING.md` | written once by `persist-conventions.mjs` |
|
|
64
|
+
|
|
65
|
+
## Rules
|
|
66
|
+
|
|
67
|
+
1. **Define a column in the same change that creates or changes it.**
|
|
68
|
+
Example: adding `refund_cnt_30d` to the SELECT means adding its `Field` in the
|
|
69
|
+
same commit, then running `generate`.
|
|
70
|
+
2. **Each row says only what is particular to its column, in business words.**
|
|
71
|
+
Shared filters, window anchor and currency go once in the table notes; the row
|
|
72
|
+
gives what one value measures, its unit, and 0/null meaning; `source` gives
|
|
73
|
+
lineage in one line. Follow the eleven principles in
|
|
74
|
+
[references/field-definitions.md](references/field-definitions.md).
|
|
75
|
+
Example: not `"Posted COLLECTION_IN rows where cust_type <> 'TEST', [dt-30d, dt), count distinct payer_bank via dim.forex join"`
|
|
76
|
+
but `"Number of different paying banks in the last 30 days. It is 0 if there were no collections."`
|
|
77
|
+
3. **Write what the code does, read from the code.** Take the source table, filters,
|
|
78
|
+
and window from the SQL you read. When the code and the intended meaning
|
|
79
|
+
disagree, ask; never document the intent as fact.
|
|
80
|
+
Example: the SQL filters `status = 'POSTED'`, so the source says "posted
|
|
81
|
+
collections", even if the ticket said "all collections".
|
|
82
|
+
4. **Edit the script, never a generated page.** `generate --check` fails while they
|
|
83
|
+
disagree, and when an output column has no definition: the contract tuple or, in
|
|
84
|
+
SQL, the SELECT writing the table, is checked against the `Field`s or `-- @field`s
|
|
85
|
+
([references/format.md](references/format.md#what-ci-checks-against-the-code)).
|
|
86
|
+
Example: to fix a typo on a page, fix the `Field` text and run `generate`.
|
|
87
|
+
5. **Derive the column contract only after every column has a `Field`.**
|
|
88
|
+
`PUBLISHED_COLUMNS = tuple(f.name for f in CATALOG_FIELDS)` publishes exactly the
|
|
89
|
+
documented columns, in `Field` order. Before switching, compare the derived tuple
|
|
90
|
+
with the old one: same names, same order.
|
|
91
|
+
Example: a 169-column table with 154 Fields would silently stop writing 15
|
|
92
|
+
columns. Keep the literal tuple; `generate` names the 15 until they are written.
|
|
93
|
+
6. **Metadata is plain literals.** The engine reads the file without running it:
|
|
94
|
+
strings, implicit concatenation, `+`, module-level string constants, and
|
|
95
|
+
`*OTHER_FIELDS` from the same module. No f-strings, calls, or imported lists.
|
|
96
|
+
Example: share key columns with `KEYS = (Field(...),)` and `(*KEYS, Field(...))`
|
|
97
|
+
in the same file.
|
|
98
|
+
7. **Audit reports; it never edits.** Fix one table per change, in the script that
|
|
99
|
+
builds the table, not its backfill or migration twins.
|
|
100
|
+
8. **Adding the workflow adds a check, not a required one.** Make it required in
|
|
101
|
+
the merge rules only when the user asks.
|
|
102
|
+
Example: after `init --write`, report "the Data catalog check now runs on PRs
|
|
103
|
+
that touch table scripts; it is not required".
|
|
104
|
+
|
|
105
|
+
## While coding
|
|
106
|
+
|
|
107
|
+
1. Before changing a table script, read its page in `docs/catalog/`.
|
|
108
|
+
2. Change the SQL or DataFrame code.
|
|
109
|
+
3. Add, edit, or remove the matching `Field`. Write it with
|
|
110
|
+
[references/field-definitions.md](references/field-definitions.md).
|
|
111
|
+
4. Run `python3 <engine> generate` and the repo's schema or contract tests.
|
|
112
|
+
5. Run `python3 <engine> drift`. It lists columns whose code changed while their
|
|
113
|
+
definition did not, and filter or join changes with no definition touched. CI
|
|
114
|
+
only checks that every column has a definition; `drift` is the check that the
|
|
115
|
+
definitions still match the code. Update each listed definition, or say in the
|
|
116
|
+
PR why it still holds.
|
|
117
|
+
6. Commit the script and the regenerated pages together.
|
|
118
|
+
|
|
119
|
+
Example: changing `WHERE status = 'POSTED'` to `status IN ('POSTED', 'SETTLED')`
|
|
120
|
+
passes CI, and `drift` reports "filters, joins or CTEs changed; no definition
|
|
121
|
+
changed" until the affected sources say "posted or settled".
|
|
122
|
+
|
|
123
|
+
A renamed column is a new `Field` and a removed one. Say in the new definition what
|
|
124
|
+
it replaced when consumers must migrate.
|
|
125
|
+
|
|
126
|
+
## Init
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
python3 <skill-base-dir>/scripts/data_catalog.py init \
|
|
130
|
+
--scripts 'dags/**/dwd_*.py' --scripts 'sql/**/*.sql' \
|
|
131
|
+
--exclude '**/*_legacy.py' --languages zh,en # dry run: prints the plan
|
|
132
|
+
python3 <skill-base-dir>/scripts/data_catalog.py init ... --write
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Scope `--scripts` to warehouse table scripts. A broad `**/*.sql` also picks up app
|
|
136
|
+
database migrations. `init` writes the config, the engine copy, `catalog_fields.py`
|
|
137
|
+
beside the scripts, the workflow, and the first catalog. Rerunning is safe, and edits
|
|
138
|
+
to `data-catalog.json` take effect on the next `init --write`. After a skill update,
|
|
139
|
+
rerun both `init --write` and `persist-conventions.mjs --write` so the repo's copies
|
|
140
|
+
match.
|
|
141
|
+
|
|
142
|
+
The scripts import `from catalog_fields import Field, Table` at run time, so the
|
|
143
|
+
module must ship with them like any sibling module (for example `--py-files` on
|
|
144
|
+
`spark-submit`). Check that before merging.
|
|
145
|
+
|
|
146
|
+
## Audit
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
python3 <engine> audit # scripts from data-catalog.json
|
|
150
|
+
python3 <engine> audit 'dags/**/*.py' '**/*.sql' # before init
|
|
151
|
+
python3 <engine> audit --json # for a worklist
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
The audit finds the table each script writes: `TARGET_TABLE`-style constants,
|
|
155
|
+
`dst_db`/`dst_tbl`-style attributes, `saveAsTable`/`insertInto`, Hudi
|
|
156
|
+
`hoodie.table.name`, and `INSERT`/`CREATE TABLE AS`/`MERGE` in SQL text. It reads
|
|
157
|
+
output columns from a contract tuple (`PUBLISHED_COLUMNS`) or from the outermost
|
|
158
|
+
SELECT. A repo with its own naming adds `--table-name NAME`/`--schema-name NAME`,
|
|
159
|
+
or `tableNames`/`schemaNames` in the config.
|
|
160
|
+
|
|
161
|
+
| Finding | Means | Fix |
|
|
162
|
+
|---|---|---|
|
|
163
|
+
| `no-catalog` | writes a table, carries no metadata | [Backfill](#backfill-one-table) in the builder script |
|
|
164
|
+
| `undocumented` | output columns without a `Field` | write them |
|
|
165
|
+
| `not-in-output` | `Field`s the SELECT no longer produces | remove or rename them |
|
|
166
|
+
| `table-mismatch` | metadata names a table the script does not write | fix the name |
|
|
167
|
+
| `contract-not-derived` | contract is a literal list next to complete metadata | derive it (rule 5) |
|
|
168
|
+
| `relative-definition` | "same as above" text | write the row in full (rule 2) |
|
|
169
|
+
| `repeated-text` | most rows share a phrase | move the shared fact to the table notes |
|
|
170
|
+
| `code-in-description` | table names, operators or SQL functions in the meaning text | move lineage to `source` |
|
|
171
|
+
| `long-definition` | over 30 words or 60 Chinese characters | cut to the column's own meaning |
|
|
172
|
+
| `thin-definition` | text or source only restates the column name | say what it measures and where it comes from |
|
|
173
|
+
| `columns-unknown` | DataFrame code the audit cannot read | compare the `Field`s with `DESCRIBE <table>` by hand |
|
|
174
|
+
| `invalid-metadata` | the engine cannot read the metadata | the message names the line |
|
|
175
|
+
|
|
176
|
+
Report the summary line and the findings for the tables in scope. Never claim a
|
|
177
|
+
script is clean when its columns were `unknown`.
|
|
178
|
+
|
|
179
|
+
## Backfill one table
|
|
180
|
+
|
|
181
|
+
1. Pick the script that builds the table from the audit. Its backfill, migrate, and
|
|
182
|
+
isolated twins share the definitions and need none of their own.
|
|
183
|
+
2. Read the SQL or DataFrame code for every output column. Reuse an existing
|
|
184
|
+
hand-written dictionary as a draft, and check every row against the code.
|
|
185
|
+
3. Add `CATALOG_TABLE` and `CATALOG_FIELDS` in contract order. Keep the literal
|
|
186
|
+
contract while you write.
|
|
187
|
+
4. Run `generate` until it passes, then derive the contract and run the repo's
|
|
188
|
+
schema tests (rule 5).
|
|
189
|
+
5. Rerun the audit for that script, and fix `relative-definition` and
|
|
190
|
+
`thin-definition` findings.
|
|
191
|
+
6. Commit the script and pages together. Replace the old hand-written dictionary
|
|
192
|
+
with a link to the generated page.
|
|
193
|
+
|
|
194
|
+
Uncertain rows: write what the code shows and list the open questions in the PR
|
|
195
|
+
description for the user. Never leave a placeholder `Field`; `generate` refuses
|
|
196
|
+
empty text.
|
|
197
|
+
|
|
198
|
+
## Done when
|
|
199
|
+
|
|
200
|
+
- `python3 <engine> generate --check` exits 0.
|
|
201
|
+
- `python3 <engine> drift` exits 0, or you said in the PR why each listed definition
|
|
202
|
+
still holds.
|
|
203
|
+
- `python3 <engine> audit` has no findings for the tables you touched, or you
|
|
204
|
+
reported the ones left and why.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
## Data catalog conventions
|
|
2
|
+
<!-- skill-script-path: consumer-copy -->
|
|
3
|
+
|
|
4
|
+
Every output column of a warehouse table is defined in the script that builds the
|
|
5
|
+
table. `docs/catalog/` is generated from those definitions; never edit it by hand.
|
|
6
|
+
`data-catalog.json` lists the table scripts and the languages each definition carries.
|
|
7
|
+
|
|
8
|
+
**Where definitions live**
|
|
9
|
+
|
|
10
|
+
- Python: `CATALOG_TABLE = Table("schema.table", grain=..., <language>=...)` and
|
|
11
|
+
`CATALOG_FIELDS = (Field("column", <language>=..., source=..., window=..., unit=...), ...)`,
|
|
12
|
+
imported `from catalog_fields import Field, Table`. Use plain string literals.
|
|
13
|
+
- SQL: a comment block above the first statement: `-- @table schema.table`, then one
|
|
14
|
+
`-- @field column` per column, each followed by `-- key: value` lines
|
|
15
|
+
(`en:`, `zh:`, `source:`, `window:`, `unit:`).
|
|
16
|
+
- Backfill and migration scripts that write the same table carry no definitions of
|
|
17
|
+
their own.
|
|
18
|
+
|
|
19
|
+
**When you change a table script**
|
|
20
|
+
|
|
21
|
+
1. Read the table's page in `docs/catalog/` first.
|
|
22
|
+
2. Add, change, or remove the column's definition in the same change as the code.
|
|
23
|
+
3. Run `python3 scripts/data-catalog/data_catalog.py generate`, and commit the script
|
|
24
|
+
and the regenerated pages together.
|
|
25
|
+
4. Run `python3 scripts/data-catalog/data_catalog.py drift`. It lists columns whose
|
|
26
|
+
code changed while their definition did not. Update each, or say in the PR why
|
|
27
|
+
it still holds.
|
|
28
|
+
|
|
29
|
+
**How to write a definition**
|
|
30
|
+
|
|
31
|
+
1. Say each fact once, at the widest level where it is true. Filters, the window
|
|
32
|
+
anchor, currency, time zone, terms many columns use ("personal", "platform") and
|
|
33
|
+
list cleaning rules go in the table's `grain` or `notes`; a row says only what
|
|
34
|
+
differs for that column.
|
|
35
|
+
2. The description is meaning in business words: what one value measures, its unit
|
|
36
|
+
and form (a ratio says 0–1 or percent; a time says date or timestamp and its
|
|
37
|
+
time zone), and what 0 or null means when not obvious. No table names, joins, operators or
|
|
38
|
+
SQL functions there.
|
|
39
|
+
3. Lead with the measure in one sentence: "Number of …", "Total …", "近 30 天…笔数".
|
|
40
|
+
Aim for 20 English words or 40 Chinese characters.
|
|
41
|
+
4. `source` is lineage in one line: upstream `table.column`, the aggregation, and only
|
|
42
|
+
the filters this column adds. Example: "count distinct dwd.transaction.payer_bank".
|
|
43
|
+
Never copy the SQL into prose.
|
|
44
|
+
5. Keep caveats that change how the value is used ("names compared as exact text");
|
|
45
|
+
leave out mechanics that don't.
|
|
46
|
+
6. The exact interval goes in `window` and the unit code in `unit`; the text says
|
|
47
|
+
"last 7 days" and "USD".
|
|
48
|
+
7. Every language says the same thing, written naturally in that language.
|
|
49
|
+
8. Write sentences, not shorthand: keep the words that carry the logic (若…则, 当…时,
|
|
50
|
+
if, when, because). "若窗口内无收款,则为 0", not "无收款为 0"; "It is 0 if there were no
|
|
51
|
+
collections.", not "0 when none".
|
|
52
|
+
9. Never restate the column name or write "same as above".
|
|
53
|
+
10. Cover every case: what the column holds for each kind of row, including when it
|
|
54
|
+
is empty; list an enumerated column's values; say so if it is always empty today.
|
|
55
|
+
11. Write related columns as a set: a count and its amount, a value and its missing
|
|
56
|
+
flag, a legacy column and its replacement use the same scope and wording, and any
|
|
57
|
+
difference is stated in both rows.
|
|
58
|
+
|
|
59
|
+
Example row: `Field("payer_bank_cnt_30d", en="Number of different paying banks in the
|
|
60
|
+
last 30 days. It is 0 if there were no collections.", zh="近 30 天不同付款银行数;若无收款,则为 0。", source="count
|
|
61
|
+
distinct dwd.transaction.payer_bank", window="[dt-30d, dt)", unit="count")`
|
|
62
|
+
|
|
63
|
+
**Contracts and CI**
|
|
64
|
+
|
|
65
|
+
- A column contract (`PUBLISHED_COLUMNS`) is derived as
|
|
66
|
+
`tuple(f.name for f in CATALOG_FIELDS)` only once every column has a `Field`.
|
|
67
|
+
Before switching, check that the names and their order are unchanged.
|
|
68
|
+
- The `Data catalog` workflow runs `generate --check` on PRs. It fails when a page is
|
|
69
|
+
stale, or when an output column has no definition. The column list comes from the
|
|
70
|
+
contract tuple or, in SQL, from the SELECT that writes the table. `drift` is not
|
|
71
|
+
run in CI.
|
|
72
|
+
- `python3 scripts/data-catalog/data_catalog.py audit` lists scripts whose tables lack
|
|
73
|
+
definitions, and rows that break the writing rules (`repeated-text`,
|
|
74
|
+
`code-in-description`, `long-definition`, `thin-definition`, `relative-definition`).
|
|
75
|
+
It reports and never edits.
|