@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,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ios-foundation
|
|
3
|
+
description: "Set up and prove an Expo / React Native native iOS workspace from a clean checkout to a manual Login smoke on an owned iOS Simulator: isolated worktree and private caches, Xcode/runtime/CocoaPods preflight, frozen install with `pod install --deployment`, platform-scoped prebuild, an ad-hoc-signed Debug simulator build, a private simulator by exact UDID, Metro on a free port, a disposable PostgreSQL backend with owned cleanup, and the evidence record (setup proof only; feature work reports the smoke result). Use for 'set up iOS', 'build the iOS app', 'run the app on the iOS simulator', 'add iOS to the React Native app', 'prove the iOS build', or when a pod install, xcodebuild, simulator boot, Metro connection or Keychain session fails. NOT for Android (android-foundation), signing, TestFlight or App Store release, 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
|
+
# iOS foundation
|
|
8
|
+
|
|
9
|
+
Take a native Expo / React Native iOS workspace from a fresh checkout to a passing manual
|
|
10
|
+
Login smoke on a simulator this run owns, then record the evidence. Use the repo's existing
|
|
11
|
+
build script, native project, device harness and code-reading helper. This is a development
|
|
12
|
+
foundation: not a signed release, not physical-device QA, and not iOS feature parity.
|
|
13
|
+
|
|
14
|
+
Pick the mode first:
|
|
15
|
+
|
|
16
|
+
- **Setup proof:** a new workspace, a toolchain, Pod, native or harness change, or a broken
|
|
17
|
+
build-to-simulator path. Run every stage and write the [evidence record](#evidence-record).
|
|
18
|
+
- **Feature work:** proving a product change on the simulator in a workspace already set
|
|
19
|
+
up. Follow [Feature work](#feature-work) and report only the smoke result.
|
|
20
|
+
|
|
21
|
+
## Routing
|
|
22
|
+
|
|
23
|
+
| Step | Read |
|
|
24
|
+
| --- | --- |
|
|
25
|
+
| Shell snippets for every stage below | [references/setup.md](references/setup.md) |
|
|
26
|
+
| Proving a product change on the simulator | [Feature work](#feature-work) |
|
|
27
|
+
| A stage failed | [Triage](#triage) |
|
|
28
|
+
| Writing up setup proof | [Evidence record](#evidence-record) |
|
|
29
|
+
|
|
30
|
+
## Rules
|
|
31
|
+
|
|
32
|
+
- Work in a dedicated worktree on a new branch from `origin/main`. Never overwrite or reuse
|
|
33
|
+
another checkout, and never symlink another worktree's `node_modules`, `Pods` or
|
|
34
|
+
DerivedData.
|
|
35
|
+
- Tool shells keep no variables, functions or traps between calls. Write the environment
|
|
36
|
+
to `.cache/ios-env.sh` once and source it at the start of every command. Run the
|
|
37
|
+
disposable database and backend as one long-running command so its cleanup trap holds.
|
|
38
|
+
- Keep every cache private to the worktree under `.cache/`: pnpm store and cache, npm,
|
|
39
|
+
`TMPDIR`, CocoaPods cache and home, DerivedData. Keep them between runs. No routine
|
|
40
|
+
`pod update`, `expo prebuild --clean`, reinstall or DerivedData deletion.
|
|
41
|
+
- Read toolchain versions from the repo: the root `packageManager` and `engines`, the
|
|
42
|
+
Podfile and `Podfile.lock`, the iOS deployment target, and CONTRIBUTING. The repo is the
|
|
43
|
+
source of truth, not this skill.
|
|
44
|
+
- Check that full Xcode is selected, its license is accepted, and a matching iOS Simulator
|
|
45
|
+
**runtime** is installed (`xcrun simctl list runtimes`). The SDK alone may give no
|
|
46
|
+
eligible simulator destination. If the runtime is missing, stop: installing it changes
|
|
47
|
+
shared CoreSimulator state and needs the workstation owner's permission. Never let a
|
|
48
|
+
build download it implicitly.
|
|
49
|
+
- Install with `--frozen-lockfile` and `pod install --deployment`, which refuses Podfile or
|
|
50
|
+
lock changes. Plain `pod install` is only for a reviewed native change that writes a new
|
|
51
|
+
`Podfile.lock`. Open the `.xcworkspace`, not the `.xcodeproj`.
|
|
52
|
+
- Native source is tracked. Regenerate only for a reviewed config or dependency change, and
|
|
53
|
+
only with `expo prebuild --platform ios`. Platformless prebuild can rewrite the Android
|
|
54
|
+
project. Review the diff to the app config, package manifest and `ios/`.
|
|
55
|
+
- Keep the Podfile's reviewed download routing (for example React Native's
|
|
56
|
+
`ENTERPRISE_REPOSITORY`) after prebuild. Keep TLS verification on. Report a failed
|
|
57
|
+
download; never silently change dependency versions or global tool config. An Android
|
|
58
|
+
Maven proxy does not route CocoaPods, Git, React Native prebuilt archives or Apple
|
|
59
|
+
downloads.
|
|
60
|
+
- Build Debug for a generic iOS Simulator destination with **ad-hoc signing**
|
|
61
|
+
(`CODE_SIGN_IDENTITY=-`, `CODE_SIGNING_ALLOWED=YES`) and private DerivedData. Never use
|
|
62
|
+
`CODE_SIGNING_ALLOWED=NO`: SecureStore needs a signing context for Keychain, and an
|
|
63
|
+
unsigned build fails at its first authenticated request.
|
|
64
|
+
- A debug app needs Metro. A successful export or `xcodebuild` does not prove Login works.
|
|
65
|
+
Only the simulator smoke does.
|
|
66
|
+
|
|
67
|
+
## Stages
|
|
68
|
+
|
|
69
|
+
Run them in this order. Stop at the first failure and triage it.
|
|
70
|
+
|
|
71
|
+
1. **Checkout and environment.** Add the worktree and export the private cache paths,
|
|
72
|
+
`CP_CACHE_DIR`, `CP_HOME_DIR` and the DerivedData path. Print `xcode-select -p`,
|
|
73
|
+
`xcodebuild -version`, `xcodebuild -showsdks`, `xcrun simctl list runtimes` and
|
|
74
|
+
`devicetypes`, and the node, pnpm, ruby and pod versions. Check that `pod --version`
|
|
75
|
+
matches the `COCOAPODS:` line in `Podfile.lock`. Read the repo's build script
|
|
76
|
+
and device harness for the names they expect: the scheme, the `.app` output path, the
|
|
77
|
+
bundle identifier, the database variables and the database-name prefix the harness
|
|
78
|
+
accepts.
|
|
79
|
+
2. **Install.** Frozen pnpm install, then `pod install --deployment` in the iOS directory.
|
|
80
|
+
3. **Runtime.** Confirm an installed runtime matches the Xcode SDK. If it does not, stop
|
|
81
|
+
and ask the workstation owner. With permission, `xcodebuild -downloadPlatform iOS`
|
|
82
|
+
(multi-GB). If `simctl list runtimes` still does not show it, import the exported image
|
|
83
|
+
with `xcodebuild -importPlatform <absolute .dmg>`. Never remove a shared runtime.
|
|
84
|
+
4. **Check and build.** Run the app's unit tests, typecheck, any build-script tests,
|
|
85
|
+
`expo export --platform ios` with a placeholder `EXPO_PUBLIC_API_URL`, then the repo's iOS
|
|
86
|
+
build script (or the `xcodebuild` command in the reference) with `-jobs 2`. Keep the log and confirm the `.app` exists.
|
|
87
|
+
5. **Owned simulator.** Pick an installed runtime and a compatible device type, then
|
|
88
|
+
`simctl create` a new simulator and keep the exact returned UDID. Boot it, wait with
|
|
89
|
+
`bootstatus -b`, and install the `.app`. Never use `booted` or pick an existing simulator.
|
|
90
|
+
6. **Disposable backend.** In its own background shell, one command registers cleanup,
|
|
91
|
+
starts `postgres` with `--cidfile` on a random loopback port, waits for `pg_isready`,
|
|
92
|
+
seeds through the repo's device harness with a database named by its accepted prefix,
|
|
93
|
+
writes the connection to `.cache/ios-db-env.sh` for the code helper, and runs the
|
|
94
|
+
backend on its reserved port as a child it `wait`s on. Stopping the command stops the
|
|
95
|
+
backend and removes the container.
|
|
96
|
+
7. **Metro and launch.** Use a free port; never stop another worker's Metro to free 8081.
|
|
97
|
+
In its own background shell, start Metro with `--localhost --port <port>` and
|
|
98
|
+
`EXPO_PUBLIC_API_URL=http://127.0.0.1:<backend-port>`. The simulator shares the Mac's
|
|
99
|
+
loopback, so use `127.0.0.1`, not Android's `10.0.2.2`. Set `RCT_jsLocation` on the owned
|
|
100
|
+
UDID only, then launch the bundle identifier. Do not use `expo run:ios` or the repo's
|
|
101
|
+
interactive `dev:ios` command: they may pick a shared simulator.
|
|
102
|
+
8. **Manual Login smoke.** Send the authentication code to the fixture user's email, read
|
|
103
|
+
the code from the disposable database with the repo's helper, and enter it. Then run
|
|
104
|
+
the checks the repo's foundation journey lists (for example store or organization
|
|
105
|
+
switching without leaked context), sign out, terminate and relaunch (it must stay at
|
|
106
|
+
Login), and restart while signed in (the session must revalidate online). Do not submit
|
|
107
|
+
live payments.
|
|
108
|
+
|
|
109
|
+
## Owned-resource cleanup
|
|
110
|
+
|
|
111
|
+
- Clean up only what this run started: the simulator by its exact UDID
|
|
112
|
+
(`simctl shutdown`, then `simctl delete`), the container by the ID in its CID file, and
|
|
113
|
+
the backend and Metro by stopping their own commands.
|
|
114
|
+
- Never use `simctl erase all`, `simctl shutdown all`, `killall Simulator`, broad `pkill`,
|
|
115
|
+
or `docker system prune`.
|
|
116
|
+
- Give every Docker startup, readiness and cleanup command a 30-second limit. Treat exit
|
|
117
|
+
124 (timeout) as a terminal failure, not as "not ready yet". Retry with a new owned
|
|
118
|
+
container, never an application database.
|
|
119
|
+
- Preserve the stage's original non-zero exit status even when cleanup succeeds.
|
|
120
|
+
- After a `SIGKILL` or a host crash, the trap cannot run. Remove only this run's recorded
|
|
121
|
+
container ID and simulator UDID by hand, and keep the failure logs.
|
|
122
|
+
- Point the database URL only at the disposable loopback container. Never at development,
|
|
123
|
+
production or another worker's database.
|
|
124
|
+
- SecureStore uses the iOS Keychain. Entries can survive uninstall and reinstall with the
|
|
125
|
+
same bundle identifier, so uninstall is not sign-out. Use a newly created simulator for
|
|
126
|
+
clean-state proof.
|
|
127
|
+
- Keep private dependency and build caches. Expo may rewrite `tsconfig.json` or
|
|
128
|
+
`expo-env.d.ts` while it runs; inspect and restore those changes before you commit.
|
|
129
|
+
Never commit the machine-specific `.xcode.env.local` or a loopback mirror URL.
|
|
130
|
+
|
|
131
|
+
## Triage
|
|
132
|
+
|
|
133
|
+
Name the earliest stage that failed:
|
|
134
|
+
|
|
135
|
+
| Stage | Typical signal |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| Prerequisites | Xcode not selected or license not accepted, no runtime matching the SDK |
|
|
138
|
+
| Install | lockfile drift, `pod install --deployment` refuses a Podfile/lock change, Ruby/CocoaPods mismatch |
|
|
139
|
+
| Network | CocoaPods, Git or React Native archive download / TLS errors: fix routing, not code |
|
|
140
|
+
| Export / build | Metro bundling error, `xcodebuild` compile, signing or "no eligible destination" error |
|
|
141
|
+
| Simulator | `simctl create` rejects the runtime/device-type pair, `bootstatus` never completes, install fails |
|
|
142
|
+
| App to Metro | red box, "No script URL provided", wrong `RCT_jsLocation` port |
|
|
143
|
+
| Backend / Login | backend log errors, verification code not found in the database |
|
|
144
|
+
| Keychain / session | session lost or kept unexpectedly: check ad-hoc signing and a fresh simulator |
|
|
145
|
+
| Product assertion | a screen or state mismatch with a screenshot |
|
|
146
|
+
|
|
147
|
+
Preserve the failure evidence. Do not repeatedly Send, Verify or Charge to turn an
|
|
148
|
+
incomplete attempt into a passing screenshot. One passing run does not prove the build is
|
|
149
|
+
reliable.
|
|
150
|
+
|
|
151
|
+
## Feature work
|
|
152
|
+
|
|
153
|
+
- Reuse the workspace's caches, Pods and DerivedData. Rerun a setup stage only when the
|
|
154
|
+
change touches what it proves (toolchain, Pods, native code, harness).
|
|
155
|
+
- Build and run the smoke checks the change affects once per candidate HEAD. Rerun only
|
|
156
|
+
after a correction that affects them, or for a specific unresolved defect or uncertainty
|
|
157
|
+
that could change the delivery decision.
|
|
158
|
+
- Report the source SHA, each smoke check run and its outcome or the failing stage, and the
|
|
159
|
+
cleanup result. Nothing else: no version inventory, screenshots, copied logs or earlier
|
|
160
|
+
attempts.
|
|
161
|
+
- Integrated device acceptance (iPad, VoiceOver, physical devices, signing, a release device
|
|
162
|
+
campaign) runs at the release or campaign gate the spec or repo assigns it. Do not
|
|
163
|
+
recreate it per feature. Record it once, as pending, in its owning issue, never as
|
|
164
|
+
passed.
|
|
165
|
+
|
|
166
|
+
## Evidence record
|
|
167
|
+
|
|
168
|
+
For setup proof only. Record:
|
|
169
|
+
|
|
170
|
+
- Source SHA, host OS and architecture, and the Xcode, iOS SDK, CocoaPods, Ruby, node and
|
|
171
|
+
pnpm versions.
|
|
172
|
+
- The simulator runtime, device type and exact UDID (a run identifier, not a shared
|
|
173
|
+
resource), and the bundle identifier.
|
|
174
|
+
- The exit status of pod install, tests, typecheck, export and the native build.
|
|
175
|
+
- Each manual smoke check and its outcome.
|
|
176
|
+
- The cleanup results: simulator deleted, container removed, backend and Metro stopped.
|
|
177
|
+
- Earlier failed or incomplete attempts. A later pass does not erase them.
|
|
178
|
+
|
|
179
|
+
State what the run does not prove: iPad layout (test an owned iPad simulator as a separate
|
|
180
|
+
run; `supportsTablet` is not proof), accessibility (VoiceOver), physical devices and their
|
|
181
|
+
network/TLS/signing path, auto-lock, payment recovery and browser handoffs, signing,
|
|
182
|
+
TestFlight/App Store, production icons, privacy declarations and export compliance.
|
|
183
|
+
Compilation is not Login evidence. Publish only sanitized evidence: no authentication codes,
|
|
184
|
+
session cookies, verification rows, customer data or raw payment payloads.
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# iOS foundation: shell snippets
|
|
2
|
+
|
|
3
|
+
Replace each `<placeholder>` with the repo's real value. Tool shells do not keep variables,
|
|
4
|
+
functions or traps between calls: step 1 writes `.cache/ios-env.sh`, which also `cd`s into
|
|
5
|
+
the worktree, and every later block starts by sourcing it by absolute path. The backend
|
|
6
|
+
(step 6) and Metro (step 7) each run as one long-running command in its own background shell.
|
|
7
|
+
|
|
8
|
+
## 1. Checkout and environment
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
git fetch origin main
|
|
13
|
+
git worktree add -b <new-branch> ../<repo>-ios-setup origin/main
|
|
14
|
+
cd ../<repo>-ios-setup
|
|
15
|
+
git rev-parse HEAD
|
|
16
|
+
mkdir -p .cache
|
|
17
|
+
{ echo 'set -euo pipefail'; printf 'cd %q\n' "$PWD"; } > .cache/ios-env.sh
|
|
18
|
+
cat >> .cache/ios-env.sh <<'ENV'
|
|
19
|
+
|
|
20
|
+
# Repo-specific names, read from the repo's app config, build script and device harness.
|
|
21
|
+
export APP_FILTER=<native-workspace-package> # pnpm --filter target
|
|
22
|
+
export IOS_DIR=<path/to/ios> # holds the Podfile and .xcworkspace
|
|
23
|
+
export IOS_BUNDLE_ID=<ios-bundle-identifier>
|
|
24
|
+
export IOS_APP_NAME=<Scheme> # the .app the build script produces
|
|
25
|
+
export DB_NAME_PREFIX=<db-prefix-the-harness-accepts> # the harness rejects other names
|
|
26
|
+
export DB_URL_VAR=<harness-admin-url-variable> # e.g. SHARD_ADMIN_URL
|
|
27
|
+
export DB_NAME_VAR=<harness-db-name-variable> # e.g. SHARD_DB_NAME
|
|
28
|
+
|
|
29
|
+
# Private caches.
|
|
30
|
+
export PNPM_CONFIG_STORE_DIR="$PWD/.cache/pnpm-store"
|
|
31
|
+
export PNPM_CONFIG_CACHE_DIR="$PWD/.cache/pnpm"
|
|
32
|
+
export npm_config_cache="$PWD/.cache/npm"
|
|
33
|
+
export TMPDIR="$PWD/.cache/tmp"
|
|
34
|
+
export CP_CACHE_DIR="$PWD/.cache/cocoapods"
|
|
35
|
+
export CP_HOME_DIR="$PWD/.cache/cocoapods-home"
|
|
36
|
+
export IOS_DERIVED_DATA_PATH="$PWD/.cache/ios-derived-data"
|
|
37
|
+
export IOS_APP="$IOS_DERIVED_DATA_PATH/Build/Products/Debug-iphonesimulator/$IOS_APP_NAME.app"
|
|
38
|
+
|
|
39
|
+
# Run identifiers: free ports only; never stop another worker's service to free one.
|
|
40
|
+
export IOS_BACKEND_PORT=<free-port>
|
|
41
|
+
export IOS_METRO_PORT=<free-port>
|
|
42
|
+
ENV
|
|
43
|
+
source .cache/ios-env.sh
|
|
44
|
+
mkdir -p "$TMPDIR" "$npm_config_cache" "$CP_CACHE_DIR" "$CP_HOME_DIR" .cache/logs
|
|
45
|
+
|
|
46
|
+
xcode-select -p
|
|
47
|
+
xcodebuild -version
|
|
48
|
+
xcodebuild -showsdks
|
|
49
|
+
xcrun simctl list runtimes
|
|
50
|
+
xcrun simctl list devicetypes
|
|
51
|
+
node --version; pnpm --version; ruby --version; pod --version
|
|
52
|
+
grep '^COCOAPODS:' "$IOS_DIR/Podfile.lock" # must match pod --version
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`xcode-select -p` must point into `Xcode.app`, not CommandLineTools. The workstation owner
|
|
56
|
+
selects Xcode and accepts its license; do not run `sudo xcodebuild -license` yourself.
|
|
57
|
+
|
|
58
|
+
## 2. Install
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
source <worktree>/.cache/ios-env.sh
|
|
62
|
+
pnpm install --frozen-lockfile
|
|
63
|
+
(cd "$IOS_DIR" && pod install --deployment)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Only for a reviewed native config or dependency change, regenerate iOS alone and review
|
|
67
|
+
the diff before installing pods without `--deployment`:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
source <worktree>/.cache/ios-env.sh
|
|
71
|
+
pnpm --filter "$APP_FILTER" exec expo prebuild \
|
|
72
|
+
--platform ios --no-install --skip-dependency-update react,react-native
|
|
73
|
+
git diff -- <app-config> <app-package.json> "$IOS_DIR"
|
|
74
|
+
(cd "$IOS_DIR" && pod install)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 3. Runtime (only with the workstation owner's permission)
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
source <worktree>/.cache/ios-env.sh
|
|
81
|
+
xcodebuild -downloadPlatform iOS -buildVersion <sdk-version> \
|
|
82
|
+
-architectureVariant arm64 -exportPath "$PWD/.cache/ios-runtimes"
|
|
83
|
+
xcrun simctl list runtimes # must list the runtime as available
|
|
84
|
+
# Only if it is not listed: import the exported image (installs shared CoreSimulator state).
|
|
85
|
+
xcodebuild -importPlatform "$PWD/.cache/ios-runtimes/<exported>.dmg"
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 4. Check and build
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
source <worktree>/.cache/ios-env.sh
|
|
92
|
+
pnpm --filter "$APP_FILTER" test
|
|
93
|
+
pnpm --filter "$APP_FILTER" typecheck
|
|
94
|
+
node --test <path/to/build-script.test.mjs> # if the repo tests its build script
|
|
95
|
+
EXPO_PUBLIC_API_URL=https://app.invalid \
|
|
96
|
+
pnpm --filter "$APP_FILTER" exec expo export --platform ios
|
|
97
|
+
<ios-build-command, e.g. pnpm build:ios> -jobs 2 2>&1 | tee .cache/logs/xcodebuild.log
|
|
98
|
+
test -d "$IOS_APP"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
`app.invalid` is an unreachable origin for bundling only. The repo's build script should run
|
|
102
|
+
`xcodebuild` on the `.xcworkspace` with its scheme, `-configuration Debug`,
|
|
103
|
+
`-sdk iphonesimulator`, `-destination 'generic/platform=iOS Simulator'`, `-derivedDataPath "$IOS_DERIVED_DATA_PATH"`,
|
|
104
|
+
`CODE_SIGN_IDENTITY=-` and `CODE_SIGNING_ALLOWED=YES`. If the repo has no build script,
|
|
105
|
+
run that `xcodebuild` command directly. Pass extra Xcode diagnostic arguments after the
|
|
106
|
+
command; never override the SDK or signing.
|
|
107
|
+
|
|
108
|
+
## 5. Owned simulator
|
|
109
|
+
|
|
110
|
+
Pick the runtime and device type from the `simctl list` output in step 1.
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
source <worktree>/.cache/ios-env.sh
|
|
114
|
+
IOS_RUNTIME=com.apple.CoreSimulator.SimRuntime.iOS-<x-y>
|
|
115
|
+
IOS_DEVICE_TYPE=com.apple.CoreSimulator.SimDeviceType.<iPhone-model>
|
|
116
|
+
IOS_SIMULATOR_UDID="$(xcrun simctl create "<repo>-ios-$(date +%s)" "$IOS_DEVICE_TYPE" "$IOS_RUNTIME")"
|
|
117
|
+
printf 'export IOS_SIMULATOR_UDID=%q\n' "$IOS_SIMULATOR_UDID" >> .cache/ios-env.sh
|
|
118
|
+
xcrun simctl boot "$IOS_SIMULATOR_UDID"
|
|
119
|
+
xcrun simctl bootstatus "$IOS_SIMULATOR_UDID" -b
|
|
120
|
+
open -a Simulator
|
|
121
|
+
xcrun simctl install "$IOS_SIMULATOR_UDID" "$IOS_APP"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## 6. Disposable backend: one command
|
|
125
|
+
|
|
126
|
+
In its own background shell. Cleanup is registered before Docker creates anything, every
|
|
127
|
+
Docker command has a 30-second limit, and stopping the command (TERM or Ctrl-C) stops the
|
|
128
|
+
backend and removes the container. The backend runs as a background child that the shell
|
|
129
|
+
`wait`s on, so a signal runs the trap at once instead of after the backend exits.
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
source <worktree>/.cache/ios-env.sh
|
|
133
|
+
umask 077
|
|
134
|
+
RUN_DIR="$(mktemp -d "$PWD/.cache/tmp/ios-db.XXXXXX")"
|
|
135
|
+
DB_ENV="$PWD/.cache/ios-db-env.sh"
|
|
136
|
+
BACKEND_PID=
|
|
137
|
+
bounded() {
|
|
138
|
+
node --input-type=module -e '
|
|
139
|
+
import { spawnSync } from "node:child_process";
|
|
140
|
+
const [command, ...args] = process.argv.slice(1);
|
|
141
|
+
const result = spawnSync(command, args, { stdio: "inherit", timeout: 30000 });
|
|
142
|
+
if (result.error) console.error(result.error.message);
|
|
143
|
+
process.exit(result.error?.code === "ETIMEDOUT" ? 124 : (result.status ?? 1));
|
|
144
|
+
' -- "$@"
|
|
145
|
+
}
|
|
146
|
+
cleanup() {
|
|
147
|
+
status=$?
|
|
148
|
+
trap - EXIT
|
|
149
|
+
cleanup_status=0
|
|
150
|
+
if test -n "$BACKEND_PID" && kill -TERM "$BACKEND_PID" 2>/dev/null; then
|
|
151
|
+
for _ in 1 2 3 4 5 6 7 8 9 10; do kill -0 "$BACKEND_PID" 2>/dev/null || break; sleep 1; done
|
|
152
|
+
if kill -0 "$BACKEND_PID" 2>/dev/null; then kill -KILL "$BACKEND_PID"; cleanup_status=1; fi
|
|
153
|
+
wait "$BACKEND_PID" 2>/dev/null || true
|
|
154
|
+
fi
|
|
155
|
+
if test -s "$RUN_DIR/postgres.cid"; then
|
|
156
|
+
bounded docker rm --force "$(< "$RUN_DIR/postgres.cid")" || cleanup_status=$?
|
|
157
|
+
fi
|
|
158
|
+
rm -f "$DB_ENV"
|
|
159
|
+
echo "original_stage_exit=$status cleanup_exit=$cleanup_status"
|
|
160
|
+
test "$status" -ne 0 || status=$cleanup_status
|
|
161
|
+
exit "$status"
|
|
162
|
+
}
|
|
163
|
+
trap cleanup EXIT
|
|
164
|
+
trap 'exit 130' INT
|
|
165
|
+
trap 'exit 143' TERM
|
|
166
|
+
bounded docker run --detach --cidfile "$RUN_DIR/postgres.cid" \
|
|
167
|
+
--publish 127.0.0.1::5432 --env POSTGRES_USER=postgres \
|
|
168
|
+
--env POSTGRES_PASSWORD=postgres --env POSTGRES_DB=postgres postgres:<version>
|
|
169
|
+
CID="$(< "$RUN_DIR/postgres.cid")"
|
|
170
|
+
DB_PORT="$(bounded docker port "$CID" 5432/tcp | awk -F: '{print $NF}')"
|
|
171
|
+
ready=
|
|
172
|
+
for _ in $(seq 1 30); do
|
|
173
|
+
if bounded docker exec "$CID" pg_isready -U postgres; then ready=1; break
|
|
174
|
+
else attempt_status=$?; test "$attempt_status" -ne 124 || exit 124; fi
|
|
175
|
+
sleep 1
|
|
176
|
+
done
|
|
177
|
+
test -n "$ready"
|
|
178
|
+
export "$DB_URL_VAR=postgresql://postgres:postgres@127.0.0.1:$DB_PORT/postgres"
|
|
179
|
+
export "$DB_NAME_VAR=${DB_NAME_PREFIX}ios_$(date +%s)"
|
|
180
|
+
export DATABASE_URL="postgresql://postgres:postgres@127.0.0.1:$DB_PORT/${!DB_NAME_VAR}"
|
|
181
|
+
export TEST_DATABASE_URL="$DATABASE_URL"
|
|
182
|
+
printf 'export %s=%q\n' "$DB_URL_VAR" "${!DB_URL_VAR}" "$DB_NAME_VAR" "${!DB_NAME_VAR}" \
|
|
183
|
+
DATABASE_URL "$DATABASE_URL" TEST_DATABASE_URL "$DATABASE_URL" > "$DB_ENV"
|
|
184
|
+
node <path/to/device-harness.mjs> init > "$RUN_DIR/seed.log"
|
|
185
|
+
# Backend env: loopback host, the reserved port, a disposable auth secret, and whatever
|
|
186
|
+
# flag the repo uses to capture verification codes in the database.
|
|
187
|
+
export HOST=127.0.0.1 PORT="$IOS_BACKEND_PORT" NODE_ENV=development
|
|
188
|
+
<backend-env-exports>
|
|
189
|
+
node <path/to/backend-server.js> > .cache/logs/backend.log 2>&1 &
|
|
190
|
+
BACKEND_PID=$!
|
|
191
|
+
wait "$BACKEND_PID"
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Read the fixture user's email from the harness output or its fixture table. Never point
|
|
195
|
+
these variables at development, production or another worker's database.
|
|
196
|
+
|
|
197
|
+
## 7. Metro and launch
|
|
198
|
+
|
|
199
|
+
In its own background shell:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
source <worktree>/.cache/ios-env.sh
|
|
203
|
+
EXPO_PUBLIC_API_URL="http://127.0.0.1:$IOS_BACKEND_PORT" \
|
|
204
|
+
pnpm --filter "$APP_FILTER" exec expo start --localhost --port "$IOS_METRO_PORT" \
|
|
205
|
+
> .cache/logs/metro.log 2>&1
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Then point only the owned simulator at that Metro port and launch:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
source <worktree>/.cache/ios-env.sh
|
|
212
|
+
xcrun simctl spawn "$IOS_SIMULATOR_UDID" defaults write "$IOS_BUNDLE_ID" \
|
|
213
|
+
RCT_jsLocation -string "127.0.0.1:$IOS_METRO_PORT"
|
|
214
|
+
xcrun simctl launch "$IOS_SIMULATOR_UDID" "$IOS_BUNDLE_ID"
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## 8. Login smoke
|
|
218
|
+
|
|
219
|
+
After tapping Send in the app with the fixture user's email, read the code from the
|
|
220
|
+
disposable database with the repo's helper (step 6 wrote its connection to
|
|
221
|
+
`.cache/ios-db-env.sh` and removes it on cleanup):
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
source <worktree>/.cache/ios-env.sh
|
|
225
|
+
source <worktree>/.cache/ios-db-env.sh
|
|
226
|
+
node <path/to/otp-helper.mjs> '<fixture user email>'
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Enter the code in the simulator. Never record or publish codes, cookies, verification rows
|
|
230
|
+
or session material.
|
|
231
|
+
|
|
232
|
+
## 9. Cleanup
|
|
233
|
+
|
|
234
|
+
Stop the backend command (its trap stops the backend and removes the container) and the
|
|
235
|
+
Metro command, then remove only the owned simulator:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
source <worktree>/.cache/ios-env.sh
|
|
239
|
+
xcrun simctl shutdown "$IOS_SIMULATOR_UDID"
|
|
240
|
+
xcrun simctl delete "$IOS_SIMULATOR_UDID"
|
|
241
|
+
lsof -nP -iTCP:"$IOS_BACKEND_PORT" -iTCP:"$IOS_METRO_PORT" -sTCP:LISTEN || echo "ports free"
|
|
242
|
+
git status --short # restore Expo rewrites; never commit .xcode.env.local or a loopback mirror URL
|
|
243
|
+
```
|
|
@@ -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. */ }
|