@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,50 @@
|
|
|
1
|
+
# WeChat article: 观察型(行业洞察 + 深度观点)
|
|
2
|
+
|
|
3
|
+
## Use when
|
|
4
|
+
|
|
5
|
+
作者看到了一个读者还没注意到的趋势、现象或政策影响,想告诉读者它意味着什么。目标是建立行业权威和长期读者,不卖课、不硬推产品。
|
|
6
|
+
|
|
7
|
+
- 作者有一手踩坑经历和解决步骤 → **wechat-pitfall**。
|
|
8
|
+
- 话题是两个选项的取舍 → **wechat-comparison**。
|
|
9
|
+
|
|
10
|
+
## Tone
|
|
11
|
+
|
|
12
|
+
可以用「我们」增加权威感;立场明确,但承认局限,不过度自信。B2B 读者接受稍长的文章(1200–1500 字)。
|
|
13
|
+
|
|
14
|
+
## Inputs
|
|
15
|
+
|
|
16
|
+
- 观察到的现象或数据点,以及出处。Material: ask once。没有出处的数据不写。
|
|
17
|
+
- 作者的判断和预测。判断可以是观点,但要标明前提。
|
|
18
|
+
- 读者的身份,用来落到「对你意味着什么」。
|
|
19
|
+
- 品牌和 CTA:来自 WRITING.md。
|
|
20
|
+
|
|
21
|
+
## Reasoning
|
|
22
|
+
|
|
23
|
+
「我看到了一个别人没注意到的趋势,告诉你它意味着什么」:
|
|
24
|
+
|
|
25
|
+
1. 用一个具体现象或数据点开头,让读者觉得「我也注意到了」。
|
|
26
|
+
2. 从 2–3 个视角拆解:现象(1–2 句)→ 背后的原因 → 影响谁。不堆新闻,要给分析。
|
|
27
|
+
3. 明确表态「我们认为……」,给出预测,并写出判断成立的前提和可能推翻它的条件。
|
|
28
|
+
4. 落到读者的实际操作:「如果你是 X,现在应该关注 Y,可以先做 Z」。
|
|
29
|
+
|
|
30
|
+
## Sections
|
|
31
|
+
|
|
32
|
+
Omit Optional sections that add nothing. Do not pad with empty headings.
|
|
33
|
+
|
|
34
|
+
1. **标题** (Required): 观察 + 为什么 / 背后 / 意味着什么。示例:「越来越多跨境商家在换支付网关——背后发生了什么?」。
|
|
35
|
+
2. **开头(约 200 字)** (Required): 一个具体现象或有出处的数据点。
|
|
36
|
+
3. **现象拆解** (Required): 2–3 个视角,每个:现象 → 原因 → 影响谁。
|
|
37
|
+
4. **我们的判断** (Required): 立场、预测、前提和不确定性。
|
|
38
|
+
5. **对读者的意义** (Required): 按读者身份给出现在该做的事。
|
|
39
|
+
6. **结尾** (Required): 金句表达判断或态度;CTA 按 WRITING.md,默认邀请留言讨论。
|
|
40
|
+
|
|
41
|
+
## Done when
|
|
42
|
+
|
|
43
|
+
- 开头的现象或数据有出处?
|
|
44
|
+
- 每个视角都有分析,而不只是新闻罗列?
|
|
45
|
+
- 判断明确,并写出了前提?
|
|
46
|
+
- 读者知道自己接下来该关注或做什么?
|
|
47
|
+
|
|
48
|
+
## Sources
|
|
49
|
+
|
|
50
|
+
Rewritten from this skill's former `references/style-insight.md` into the template contract; improve per account with `distill-writing`.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# WeChat article: 踩坑型(真人踩坑 + 工具化输出)
|
|
2
|
+
|
|
3
|
+
## Use when
|
|
4
|
+
|
|
5
|
+
读者在同一个痛点上普遍焦虑,作者或客户真实踩过这个坑,并且问题有可操作的解决路径。读者读完要能避开这个坑,并拿走一份可执行的清单。
|
|
6
|
+
|
|
7
|
+
- 没有真实经历、只有观点 → **wechat-insight**。
|
|
8
|
+
- 只需要照着做的步骤,不需要讲踩坑过程 → **wechat-howto**。
|
|
9
|
+
- 坑的本质是两个概念搞混 → **wechat-comparison**。
|
|
10
|
+
|
|
11
|
+
## Tone
|
|
12
|
+
|
|
13
|
+
开头可以有情绪(B2B 克制:「压力很大」,不是「心态崩了」),分析部分回归理性,方案部分务实。
|
|
14
|
+
|
|
15
|
+
## Inputs
|
|
16
|
+
|
|
17
|
+
- 踩坑经历本身:谁、遇到什么、排查了多久、最后发现什么。Material: ask once。没有真实经历就换风格,不编故事。
|
|
18
|
+
- 原因背后的案例和数据。只用作者提供的;没有就写定性描述,不写「我们拆了 50 个案例」这类数字。
|
|
19
|
+
- 解决步骤和工具。缺失的步骤标记 `【待确认:…】`,不补造。
|
|
20
|
+
- 品牌和 CTA:来自 WRITING.md;没有则用中性 CTA(留言、关注)。
|
|
21
|
+
|
|
22
|
+
## Reasoning
|
|
23
|
+
|
|
24
|
+
「我的痛苦 → 你的解决方案」:
|
|
25
|
+
|
|
26
|
+
1. 用第一人称讲清楚遇到的问题和情绪点,让读者觉得「这说的就是我」。
|
|
27
|
+
2. 拆出 3 个核心原因,每个先一句话结论,再解释,再说明为什么容易被忽略。
|
|
28
|
+
3. 把经验转成按顺序的解决步骤,分情况给方案。
|
|
29
|
+
4. 收敛成一份可勾选的清单,最后用一句金句点出踩坑的本质。
|
|
30
|
+
|
|
31
|
+
## Sections
|
|
32
|
+
|
|
33
|
+
Omit Optional sections that add nothing. Do not pad with empty headings.
|
|
34
|
+
|
|
35
|
+
1. **标题** (Required): 踩坑 + 数字 + 顿悟感;数字必须来自素材。示例:「选错支付网关,我们损失了 3 个月——问题出在这里」。
|
|
36
|
+
2. **开头(约 200 字)** (Required): 第一人称叙事、情绪点、建立可信度。不要从定义或背景开始。
|
|
37
|
+
3. **原因分析** (Required): 3 个原因,每个约 200 字:结论句 → 解释 + 来源中的案例或数据 → 为什么被忽略。
|
|
38
|
+
4. **解决方案** (Required): 按顺序的具体步骤,附工具、方法或代码;多方案时分情况。
|
|
39
|
+
5. **CheckList** (Required): 5–8 条,`- [ ] 检查/确认/避免 …`。
|
|
40
|
+
6. **结尾金句 + CTA** (Required): 一句总结踩坑本质的金句;CTA 按 WRITING.md。
|
|
41
|
+
|
|
42
|
+
## Done when
|
|
43
|
+
|
|
44
|
+
- 开头 200 字里有第一人称经历,而不是定义或背景?
|
|
45
|
+
- 每个原因都以一句结论开头?
|
|
46
|
+
- 每个数字和案例都来自作者素材?
|
|
47
|
+
- 解决步骤能照着做,清单能直接勾选?
|
|
48
|
+
- 结尾是金句加 CTA?
|
|
49
|
+
|
|
50
|
+
## Sources
|
|
51
|
+
|
|
52
|
+
Rewritten from this skill's former `references/style-pitfall.md` into the template contract; improve per account with `distill-writing`.
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wechat-publisher
|
|
3
|
+
description: "Publish articles to a WeChat Official Account (公众号) via API: push Markdown to the draft box (or auto-publish with --publish), convert Markdown to WeChat HTML, upload images to the media library. Requires AppID + AppSecret + whitelisted server IP on a 认证订阅号/服务号. Consumes wechat-article-writer's Markdown."
|
|
4
|
+
release-version: 0.36.0
|
|
5
|
+
---
|
|
6
|
+
**Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
|
|
7
|
+
# WeChat Publisher (公众号发布)
|
|
8
|
+
|
|
9
|
+
Publish articles to WeChat Official Account via the official API.
|
|
10
|
+
|
|
11
|
+
**Full API reference:** `references/api.md` — read when debugging errors or needing endpoint details.
|
|
12
|
+
|
|
13
|
+
**WeChat-safe layout reference:** `references/wechat-safe-template.html` — read when drafting or fixing article HTML that must survive WeChat rendering.
|
|
14
|
+
|
|
15
|
+
## Prerequisites (check before starting)
|
|
16
|
+
|
|
17
|
+
1. **AppID + AppSecret** — from WeChat MP Admin → 开发 → 基本配置
|
|
18
|
+
2. **IP Whitelist** — server's IPv4 must be added in the same page
|
|
19
|
+
3. **Account type** — must be 认证订阅号 or 认证服务号 (personal accounts lost API access in 2025-07)
|
|
20
|
+
4. **Cover image** — JPEG/PNG, ≤64KB (WeChat `thumb` type limit)
|
|
21
|
+
|
|
22
|
+
Get AppID/AppSecret from `~/.openclaw/openclaw.json` → `channels.weixin` if already configured.
|
|
23
|
+
|
|
24
|
+
## Standard Workflow
|
|
25
|
+
|
|
26
|
+
## WeChat-safe HTML rules (important)
|
|
27
|
+
|
|
28
|
+
When generating or polishing article HTML for WeChat, treat WeChat as a constrained renderer, not a normal browser.
|
|
29
|
+
|
|
30
|
+
Use these rules for layout-sensitive areas:
|
|
31
|
+
|
|
32
|
+
- Prefer a **small tag set**: `div`, `img`, `h1/h2/h3`, `pre/code`, and a small amount of `br`
|
|
33
|
+
- Avoid relying on native paragraph and list rendering for precise spacing
|
|
34
|
+
- Do **not** use `ul/li` when spacing matters, WeChat often reflows list items with extra gap
|
|
35
|
+
- Do **not** use multiple `p` blocks inside styled cards for step lists, WeChat often re-renders them as loose paragraphs
|
|
36
|
+
- For **steps**, prefer one `div` with manual line breaks:
|
|
37
|
+
- `第一步...<br>第二步...`
|
|
38
|
+
- For **bullet lists**, prefer manual bullets in a plain block:
|
|
39
|
+
- `• 要点 A<br>• 要点 B`
|
|
40
|
+
- For **screenshots**, do not place white screenshots directly on page background
|
|
41
|
+
- Wrap screenshots in an outer container with white background, padding, light gray border, and rounded corners
|
|
42
|
+
- Example wrapper pattern:
|
|
43
|
+
|
|
44
|
+
```html
|
|
45
|
+
<div style="margin:10px 0;padding:6px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;line-height:0;">
|
|
46
|
+
<img src="..." style="width:100%;height:auto;border-radius:8px;display:block;">
|
|
47
|
+
</div>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- For WeChat article body HTML, omit the visible in-body title if the WeChat draft title is already set separately
|
|
51
|
+
- Keep structure shallow, avoid unnecessary nested wrappers
|
|
52
|
+
- After push, if spacing still looks too loose in the WeChat editor, the final fallback is:
|
|
53
|
+
- select all
|
|
54
|
+
- set **段后距 = 0** inside WeChat editor
|
|
55
|
+
|
|
56
|
+
These rules are more reliable than micro-tuning margin values like `margin-bottom: 6px -> 4px`.
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
### Step 1 — Convert Markdown to HTML (if input is .md)
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
python3 {skillDir}/scripts/md_to_wechat_html.py article.md --output article.html
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
If the article already contains inline-styled HTML, skip this step.
|
|
66
|
+
|
|
67
|
+
### Step 1.5 — Normalize HTML for WeChat editor behavior
|
|
68
|
+
|
|
69
|
+
When the issue is not visual spacing but a **caret-only blank line in the WeChat editor**, treat it as a **block-boundary problem**, not a copywriting problem.
|
|
70
|
+
|
|
71
|
+
Default rule:
|
|
72
|
+
|
|
73
|
+
- Use **flat `<div>` blocks for body paragraphs**.
|
|
74
|
+
- Treat `<p>` as an **anti-pattern** for WeChat publishing in this skill.
|
|
75
|
+
|
|
76
|
+
Why this rule exists:
|
|
77
|
+
|
|
78
|
+
- In real Agentier testing, multiple versions with `p` still produced a phantom blank editable block before an emphasized sentence.
|
|
79
|
+
- Switching the whole article body to **pure `div` blocks** fixed the issue immediately.
|
|
80
|
+
- Practical conclusion: WeChat may treat `p` boundaries as separate editable paragraph units even when CSS spacing looks correct.
|
|
81
|
+
|
|
82
|
+
Operating principle:
|
|
83
|
+
|
|
84
|
+
- Default to **editor stability over semantic HTML richness**.
|
|
85
|
+
- If WeChat editor behavior and semantic markup conflict, prefer the structure that renders and edits reliably in WeChat.
|
|
86
|
+
|
|
87
|
+
Use these rules:
|
|
88
|
+
|
|
89
|
+
- Keep the body **one level deep**. Do not nest block elements inside other block elements.
|
|
90
|
+
- Use one natural paragraph per `<div>`.
|
|
91
|
+
- For emphasis, use `<div><strong>...</strong></div>`.
|
|
92
|
+
- Remove empty nodes between blocks: no empty `<p>`, no placeholder ` `, no repeated `<br>`, no zero-width filler characters.
|
|
93
|
+
- Minify inter-block whitespace before publish when debugging editor quirks.
|
|
94
|
+
|
|
95
|
+
Recommended safe structure:
|
|
96
|
+
|
|
97
|
+
```html
|
|
98
|
+
<div>正文段 1</div><div>正文段 2</div><div><strong>强调句</strong></div><div>正文段 3</div>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Anti-patterns to avoid:
|
|
102
|
+
|
|
103
|
+
- `<p>` for body paragraphs
|
|
104
|
+
- `blockquote`
|
|
105
|
+
- `ul` / `li`
|
|
106
|
+
- nested `div` / `section` wrappers
|
|
107
|
+
- empty paragraph tags
|
|
108
|
+
- mixed paragraph systems (`p` + `div` in the same article body)
|
|
109
|
+
|
|
110
|
+
### Step 2 — Publish to Draft Box
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
python3 {skillDir}/scripts/publish.py \
|
|
114
|
+
--appid <APPID> \
|
|
115
|
+
--appsecret <APPSECRET> \
|
|
116
|
+
--title "文章标题" \
|
|
117
|
+
--html article.html \
|
|
118
|
+
--thumb-image cover.jpg \
|
|
119
|
+
--author "作者名" \
|
|
120
|
+
--digest "摘要(最多120字)"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Output: `{ "ok": true, "draft_media_id": "xxx" }`
|
|
124
|
+
|
|
125
|
+
The article now appears in the draft box. Open **微信公众号助手 App** on mobile → 草稿箱 → review → publish.
|
|
126
|
+
|
|
127
|
+
### Step 3 (optional) — Auto-publish Live
|
|
128
|
+
|
|
129
|
+
Add `--publish` flag to push live immediately (skips manual review):
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
python3 {skillDir}/scripts/publish.py ... --publish
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Output: `{ "ok": true, "draft_media_id": "xxx", "publish_id": "yyy", "publish_status": {"status": "success"} }`
|
|
136
|
+
|
|
137
|
+
⚠️ Only use `--publish` when Jonas explicitly approves skipping manual review.
|
|
138
|
+
|
|
139
|
+
## Inline Image Handling
|
|
140
|
+
|
|
141
|
+
If the article HTML contains local image paths (`<img src="./images/foo.png">`), upload them first:
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
# Quick one-liner to get the WeChat CDN URL for an image
|
|
145
|
+
import subprocess, json
|
|
146
|
+
result = subprocess.run([
|
|
147
|
+
"python3", "-c",
|
|
148
|
+
"""
|
|
149
|
+
import requests, sys
|
|
150
|
+
token = sys.argv[1]
|
|
151
|
+
with open(sys.argv[2], 'rb') as f:
|
|
152
|
+
r = requests.post(f'https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token={token}', files={'media': f})
|
|
153
|
+
print(r.json()['url'])
|
|
154
|
+
""",
|
|
155
|
+
"<token>", "image.jpg"
|
|
156
|
+
], capture_output=True, text=True)
|
|
157
|
+
print(result.stdout.strip())
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Then replace `src="./images/foo.png"` with the returned CDN URL in the HTML.
|
|
161
|
+
|
|
162
|
+
## Error Quick-Reference
|
|
163
|
+
|
|
164
|
+
| Error | Fix |
|
|
165
|
+
|-------|-----|
|
|
166
|
+
| `40164` IP not in whitelist | Add server IP in WeChat MP Admin |
|
|
167
|
+
| `48001` API not authorized | Account not certified or permission missing |
|
|
168
|
+
| `40007` invalid media_id | Cover image upload failed — retry upload |
|
|
169
|
+
| `45009` rate limit | Wait for next day or reset quota in MP Admin |
|
|
170
|
+
|
|
171
|
+
Full error codes: `references/api.md`
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# WeChat Official Account API Reference
|
|
2
|
+
|
|
3
|
+
## Authentication
|
|
4
|
+
|
|
5
|
+
**Get access_token** (valid 2 hours; cached in `/tmp/wechat_access_token.json`)
|
|
6
|
+
```
|
|
7
|
+
GET https://api.weixin.qq.com/cgi-bin/token
|
|
8
|
+
?grant_type=client_credential&appid=APPID&secret=APPSECRET
|
|
9
|
+
→ { "access_token": "...", "expires_in": 7200 }
|
|
10
|
+
```
|
|
11
|
+
Daily limit: 2000 calls. Always cache; never call per-request.
|
|
12
|
+
|
|
13
|
+
**IP Whitelist** — The calling server's IP must be added in:
|
|
14
|
+
WeChat MP Admin → 开发 → 基本配置 → IP白名单
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Content Publishing Flow
|
|
19
|
+
|
|
20
|
+
### Step 1: Upload cover image (permanent material)
|
|
21
|
+
```
|
|
22
|
+
POST https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=TOKEN&type=thumb
|
|
23
|
+
multipart/form-data: media=<file>
|
|
24
|
+
→ { "media_id": "...", "url": "..." }
|
|
25
|
+
```
|
|
26
|
+
- Cover image: JPEG/PNG, **≤64 KB** for `thumb` type
|
|
27
|
+
- Returns `media_id` for use in draft creation
|
|
28
|
+
|
|
29
|
+
### Step 2: Upload inline images (article body)
|
|
30
|
+
```
|
|
31
|
+
POST https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=TOKEN
|
|
32
|
+
multipart/form-data: media=<file>
|
|
33
|
+
→ { "url": "https://mmbiz.qpic.cn/..." }
|
|
34
|
+
```
|
|
35
|
+
- Any images in the article HTML body must be replaced with these CDN URLs
|
|
36
|
+
- External image URLs will NOT render inside WeChat
|
|
37
|
+
|
|
38
|
+
### Step 3: Create draft
|
|
39
|
+
```
|
|
40
|
+
POST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=TOKEN
|
|
41
|
+
{
|
|
42
|
+
"articles": [{
|
|
43
|
+
"title": "文章标题",
|
|
44
|
+
"author": "作者名",
|
|
45
|
+
"digest": "摘要(≤120字)",
|
|
46
|
+
"content": "<p>HTML正文</p>",
|
|
47
|
+
"thumb_media_id": "<from step 1>",
|
|
48
|
+
"need_open_comment": 0,
|
|
49
|
+
"only_fans_can_comment": 0
|
|
50
|
+
}]
|
|
51
|
+
}
|
|
52
|
+
→ { "media_id": "draft_media_id" }
|
|
53
|
+
```
|
|
54
|
+
Daily limit: 1000 drafts
|
|
55
|
+
|
|
56
|
+
### Step 4 (optional): Publish draft live
|
|
57
|
+
```
|
|
58
|
+
POST https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token=TOKEN
|
|
59
|
+
{ "media_id": "draft_media_id" }
|
|
60
|
+
→ { "errcode": 0, "publish_id": "123456" }
|
|
61
|
+
```
|
|
62
|
+
Daily limit: 100 publishes
|
|
63
|
+
|
|
64
|
+
### Step 5 (optional): Poll publish status
|
|
65
|
+
```
|
|
66
|
+
POST https://api.weixin.qq.com/cgi-bin/freepublish/get?access_token=TOKEN
|
|
67
|
+
{ "publish_id": "123456" }
|
|
68
|
+
→ { "publish_status": 0, "article_id": "..." }
|
|
69
|
+
```
|
|
70
|
+
`publish_status`: 0=成功, 1=发布中, 2=失败, 4=已删除
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Account Type Requirements
|
|
75
|
+
|
|
76
|
+
| Feature | 个人未认证订阅号 | 认证订阅号 | 认证服务号 |
|
|
77
|
+
|---------|--------------|----------|----------|
|
|
78
|
+
| 草稿箱/发布 API | ❌ (2025-07 回收) | ✅ | ✅ |
|
|
79
|
+
| 群发接口 | ❌ | ✅ | ✅ |
|
|
80
|
+
| 模板消息 | ❌ | ❌ | ✅ |
|
|
81
|
+
| 网页授权/支付 | ❌ | ❌ | ✅ |
|
|
82
|
+
|
|
83
|
+
**Minimum requirement: 认证订阅号 (企业/组织主体)**
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## HTML Content Requirements
|
|
88
|
+
|
|
89
|
+
- All CSS must be **inline** — no `<style>` tags, no external CSS
|
|
90
|
+
- No `<html>`, `<head>`, `<body>` wrapper (WeChat provides it)
|
|
91
|
+
- Images: must be WeChat CDN URLs (upload first via `uploadimg`)
|
|
92
|
+
- Font size: 14–16px recommended for mobile
|
|
93
|
+
- Line height: 1.6–1.8 for readability
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Common Error Codes
|
|
98
|
+
|
|
99
|
+
| errcode | Meaning | Fix |
|
|
100
|
+
|---------|---------|-----|
|
|
101
|
+
| 40001 | invalid access_token | Refresh token |
|
|
102
|
+
| 40164 | IP not in whitelist | Add server IP to whitelist |
|
|
103
|
+
| 45009 | API rate limit exceeded | Wait or reset quota |
|
|
104
|
+
| 48001 | API not authorized | Account not certified or lacks permission |
|
|
105
|
+
| 40007 | invalid media_id | Re-upload the media |
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# WeChat-safe layout rules
|
|
2
|
+
|
|
3
|
+
Use this reference when article HTML must survive WeChat draft/editor rendering.
|
|
4
|
+
|
|
5
|
+
## Core rule
|
|
6
|
+
|
|
7
|
+
Treat WeChat as a constrained renderer, not a normal browser.
|
|
8
|
+
|
|
9
|
+
## Team rules
|
|
10
|
+
|
|
11
|
+
1. Prefer a small tag set
|
|
12
|
+
- `div`
|
|
13
|
+
- `img`
|
|
14
|
+
- `h1/h2/h3`
|
|
15
|
+
- `pre/code`
|
|
16
|
+
- a small amount of `br`
|
|
17
|
+
|
|
18
|
+
2. Do not rely on native list or paragraph spacing when layout matters
|
|
19
|
+
- avoid `ul/li`
|
|
20
|
+
- avoid multiple `p` blocks inside styled cards
|
|
21
|
+
|
|
22
|
+
3. Build steps as one block
|
|
23
|
+
- use one `div`
|
|
24
|
+
- separate lines with `<br>`
|
|
25
|
+
|
|
26
|
+
4. Build bullets manually
|
|
27
|
+
- use `•` in a plain `div`
|
|
28
|
+
- do not use native list markup for spacing-sensitive sections
|
|
29
|
+
|
|
30
|
+
5. Always wrap white screenshots
|
|
31
|
+
- white background
|
|
32
|
+
- padding
|
|
33
|
+
- light gray border
|
|
34
|
+
- rounded corners
|
|
35
|
+
|
|
36
|
+
6. Keep body HTML title-free
|
|
37
|
+
- the WeChat draft title is configured separately
|
|
38
|
+
- do not repeat the article title inside body HTML
|
|
39
|
+
|
|
40
|
+
7. Keep section hierarchy readable
|
|
41
|
+
- section headings need visible top spacing
|
|
42
|
+
- subsection headings also need top spacing, but less than sections
|
|
43
|
+
|
|
44
|
+
8. Use WeChat editor as final fallback
|
|
45
|
+
- if the draft still looks too loose, select all and set `段后距 = 0`
|
|
46
|
+
|
|
47
|
+
## Most common failure patterns
|
|
48
|
+
|
|
49
|
+
- margin micro-tweaks that do not survive WeChat rendering
|
|
50
|
+
- `ul/li` producing unexpected extra space
|
|
51
|
+
- card blocks made of many child paragraphs/divs becoming loose after push
|
|
52
|
+
- white screenshots visually disappearing into page background
|
|
53
|
+
|
|
54
|
+
## Recommended reference files
|
|
55
|
+
|
|
56
|
+
- `wechat-safe-template.html` for reusable HTML skeleton
|
|
57
|
+
- `api.md` for publishing/debugging details
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<section style="max-width:720px;margin:0 auto;padding:0;color:#2c2c2c;line-height:1.75;font-size:16px;">
|
|
2
|
+
<!-- Intro: do not repeat the article title here, WeChat draft title is set separately -->
|
|
3
|
+
<div style="margin:0 0 10px;">开头导语第一段,直接讲清楚这篇文章要解决什么问题。</div>
|
|
4
|
+
<div style="margin:0 0 12px;">开头导语第二段,补充使用场景、适合谁读,以及读完后能得到什么。</div>
|
|
5
|
+
|
|
6
|
+
<!-- Screenshot wrapper: use for white UI screenshots -->
|
|
7
|
+
<div style="margin:10px 0;padding:6px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;line-height:0;">
|
|
8
|
+
<img src="https://example.com/hero.png" alt="示意图" style="width:100%;height:auto;border-radius:8px;display:block;">
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
<!-- Section -->
|
|
12
|
+
<h2 style="font-size:22px;line-height:1.45;margin:40px 0 12px;padding-left:10px;border-left:4px solid #07c160;color:#111;">开始前先确认</h2>
|
|
13
|
+
<div style="background:#f7faf7;border-radius:10px;padding:12px 14px;margin:0 0 10px;">
|
|
14
|
+
<strong>1.</strong> 前提条件 A<br>
|
|
15
|
+
<strong>2.</strong> 前提条件 B
|
|
16
|
+
</div>
|
|
17
|
+
<div style="margin:0 0 12px;">补一句解释,告诉读者顺序或范围。</div>
|
|
18
|
+
|
|
19
|
+
<!-- Section + subsection spacing -->
|
|
20
|
+
<h2 style="font-size:22px;line-height:1.45;margin:40px 0 12px;padding-left:10px;border-left:4px solid #07c160;color:#111;">安装与配置</h2>
|
|
21
|
+
<h3 style="font-size:18px;margin:24px 0 10px;color:#111;">1)先完成基础环境</h3>
|
|
22
|
+
<div style="margin:0 0 8px;">这里放一行解释性正文。</div>
|
|
23
|
+
<pre style="background:#f6f6f6;border-radius:10px;padding:12px 14px;overflow:auto;font-size:14px;line-height:1.6;margin:0 0 10px;"><code>command --help</code></pre>
|
|
24
|
+
<div style="margin:0 0 12px;">这里放一行解释性补充。</div>
|
|
25
|
+
|
|
26
|
+
<h3 style="font-size:18px;margin:24px 0 10px;color:#111;">2)再完成工具安装</h3>
|
|
27
|
+
<div style="margin:0 0 8px;">这里放安装说明。</div>
|
|
28
|
+
|
|
29
|
+
<!-- Steps: use one block + br, not multiple p/div children inside a card -->
|
|
30
|
+
<h2 style="font-size:22px;line-height:1.45;margin:40px 0 12px;padding-left:10px;border-left:4px solid #07c160;color:#111;">第一次上手</h2>
|
|
31
|
+
<div style="background:#fafafa;border-radius:10px;padding:12px 14px;margin:0 0 10px;">
|
|
32
|
+
<strong>第一步:</strong>做动作 A<br>
|
|
33
|
+
<strong>第二步:</strong>做动作 B<br>
|
|
34
|
+
<strong>第三步:</strong>做动作 C<br>
|
|
35
|
+
<strong>第四步:</strong>完成一个最小任务
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<!-- Side-by-side phone screenshots if proportions match -->
|
|
39
|
+
<div style="display:flex;gap:12px;align-items:flex-start;justify-content:center;margin:10px 0;">
|
|
40
|
+
<div style="flex:0 0 48%;max-width:48%;padding:6px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;line-height:0;box-sizing:border-box;">
|
|
41
|
+
<img src="https://example.com/phone-1.png" alt="手机截图 1" style="width:100%;height:auto;border-radius:8px;display:block;">
|
|
42
|
+
</div>
|
|
43
|
+
<div style="flex:0 0 48%;max-width:48%;padding:6px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;line-height:0;box-sizing:border-box;">
|
|
44
|
+
<img src="https://example.com/phone-2.png" alt="手机截图 2" style="width:100%;height:auto;border-radius:8px;display:block;">
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<!-- Bullets: use manual bullets, not ul/li -->
|
|
49
|
+
<div style="margin:0 0 8px;">完成后,你就可以:</div>
|
|
50
|
+
<div style="margin:0 0 10px;line-height:1.8;">
|
|
51
|
+
• 做事情 A<br>
|
|
52
|
+
• 做事情 B<br>
|
|
53
|
+
• 做事情 C
|
|
54
|
+
</div>
|
|
55
|
+
|
|
56
|
+
<h3 style="font-size:18px;margin:24px 0 10px;color:#111;">第一次建议跑这类任务</h3>
|
|
57
|
+
<div style="margin:0 0 10px;line-height:1.8;">
|
|
58
|
+
• 先让它总结项目是做什么的<br>
|
|
59
|
+
• 先让它找最值得看的几个文件<br>
|
|
60
|
+
• 先让它运行测试并回报结果
|
|
61
|
+
</div>
|
|
62
|
+
|
|
63
|
+
<!-- Single centered screenshot -->
|
|
64
|
+
<h2 style="font-size:22px;line-height:1.45;margin:40px 0 12px;padding-left:10px;border-left:4px solid #07c160;color:#111;">在手机上继续跟进</h2>
|
|
65
|
+
<div style="margin:0 0 8px;">当任务已经跑起来后,你可以在手机上继续跟进:</div>
|
|
66
|
+
<div style="margin:0 0 10px;line-height:1.8;">
|
|
67
|
+
• 查看进度<br>
|
|
68
|
+
• 补一句要求<br>
|
|
69
|
+
• 决定下一步
|
|
70
|
+
</div>
|
|
71
|
+
<div style="margin:10px 0;padding:6px;background:#fff;border:1px solid #e5e7eb;border-radius:12px;line-height:0;max-width:432px;margin-left:auto;margin-right:auto;">
|
|
72
|
+
<img src="https://example.com/mobile-task.png" alt="手机端截图" style="width:100%;height:auto;border-radius:8px;display:block;">
|
|
73
|
+
</div>
|
|
74
|
+
<div style="margin:6px 0 10px;text-align:center;color:#666;font-size:14px;">这里放一句简短图注。</div>
|
|
75
|
+
|
|
76
|
+
<!-- Closing card -->
|
|
77
|
+
<h2 style="font-size:22px;line-height:1.45;margin:40px 0 12px;padding-left:10px;border-left:4px solid #07c160;color:#111;">最后提醒</h2>
|
|
78
|
+
<div style="background:#fff8f0;border-radius:10px;padding:12px 14px;margin:0 0 10px;">
|
|
79
|
+
<strong>提醒一:</strong>一句提醒<br>
|
|
80
|
+
<strong>提醒二:</strong>一句提醒<br>
|
|
81
|
+
<strong>提醒三:</strong>一句提醒
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div style="margin:0 0 8px;"><strong>最后一句总结。</strong></div>
|
|
85
|
+
<div style="margin:0;">最后一句行动引导。</div>
|
|
86
|
+
</section>
|
|
@@ -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. */ }
|