@1aboveio/skills 0.10.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/LICENSE +3 -0
- package/README.md +90 -0
- package/bin/1aboveio-skills.mjs +18 -0
- package/package.json +28 -0
- package/runtime/skills/distribution/generated/recipes.json +1189 -0
- package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
- package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
- package/skills/backend/airflow-dag-develop/LICENSE +3 -0
- package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
- package/skills/backend/app-debug/LICENSE +3 -0
- package/skills/backend/app-debug/SKILL.md +109 -0
- package/skills/backend/app-debug/references/common-errors.md +128 -0
- package/skills/backend/python-backend/LICENSE +3 -0
- package/skills/backend/python-backend/SKILL.md +326 -0
- package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
- package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
- package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
- package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
- package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
- package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
- package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
- package/skills/cicd-pipeline/docker/LICENSE +3 -0
- package/skills/cicd-pipeline/docker/SKILL.md +126 -0
- package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
- package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
- package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
- package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
- package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
- package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
- package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
- package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
- package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
- package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
- package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
- package/skills/cicd-pipeline/mergify/LICENSE +3 -0
- package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
- package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
- package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
- package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
- package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
- package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
- package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
- package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
- package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
- package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
- package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
- package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
- package/skills/cicd-pipeline/podman/LICENSE +3 -0
- package/skills/cicd-pipeline/podman/SKILL.md +70 -0
- package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
- package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
- package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
- package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
- package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
- package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
- package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
- package/skills/engineering/e2e-test/LICENSE +3 -0
- package/skills/engineering/e2e-test/SKILL.md +156 -0
- package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
- package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
- package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
- package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
- package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
- package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
- package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
- package/skills/engineering/e2e-test/references/debugging.md +36 -0
- package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
- package/skills/engineering/e2e-test/references/reviewing.md +39 -0
- package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
- package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
- package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
- package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
- package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
- package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
- package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
- package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
- package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
- package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
- package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -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 +10 -0
- package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -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/main-module.mjs +80 -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/workflow-coherence.mjs +576 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
- package/skills/engineering/ensure-coverage/LICENSE +3 -0
- package/skills/engineering/ensure-coverage/SKILL.md +136 -0
- package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
- package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
- package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -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 +25 -0
- package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
- package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
- package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
- package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
- package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
- package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
- package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
- package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
- package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
- package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
- package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
- package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
- package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
- package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
- package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
- package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
- package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
- package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
- package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
- package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
- package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
- package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
- package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
- package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
- package/skills/engineering/harness-runtime/LICENSE +3 -0
- package/skills/engineering/harness-runtime/SKILL.md +18 -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/fixtures/native-question-schemas.json +33 -0
- package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
- package/skills/engineering/harness-runtime/index.mjs +767 -0
- package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
- package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
- package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
- package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
- package/skills/engineering/implement-and-pr/LICENSE +3 -0
- package/skills/engineering/implement-and-pr/SKILL.md +176 -0
- package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
- package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
- package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
- package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
- package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
- package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
- package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
- package/skills/engineering/resolve-issues/LICENSE +3 -0
- package/skills/engineering/resolve-issues/SKILL.md +167 -0
- package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
- package/skills/engineering/resolve-issues/references/breaker.md +82 -0
- package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
- package/skills/engineering/resolve-issues/references/delivery.md +108 -0
- package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
- package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
- package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
- package/skills/engineering/resolve-issues/references/finalization.md +68 -0
- package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
- package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
- package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
- package/skills/engineering/resolve-issues/references/intake.md +86 -0
- package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
- package/skills/engineering/resolve-issues/references/interference.md +87 -0
- package/skills/engineering/resolve-issues/references/loop.md +134 -0
- package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
- package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
- package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
- package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
- package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
- package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
- package/skills/engineering/resolve-issues/references/run-state.md +288 -0
- package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
- package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
- package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
- package/skills/engineering/resolve-issues/references/why.md +653 -0
- package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
- package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
- package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
- package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
- package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
- package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
- package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
- package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
- package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
- package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
- package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
- package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
- package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
- package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
- package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
- package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
- package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
- package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
- package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
- package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
- package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
- package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
- package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
- package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
- package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
- package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
- package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
- package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
- package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
- package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
- package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
- package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
- package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
- package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
- package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
- package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
- package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
- package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
- package/skills/engineering/resolve-release/LICENSE +3 -0
- package/skills/engineering/resolve-release/SKILL.md +112 -0
- package/skills/engineering/resolve-release/references/assembly.md +137 -0
- package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
- package/skills/engineering/resolve-release/references/candidate.md +167 -0
- package/skills/engineering/resolve-release/references/exposure.md +178 -0
- package/skills/engineering/resolve-release/references/handoff.md +24 -0
- package/skills/engineering/resolve-release/references/postmortem.md +230 -0
- package/skills/engineering/resolve-release/references/preflight.md +207 -0
- package/skills/engineering/resolve-release/references/principles.md +94 -0
- package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
- package/skills/engineering/resolve-release/references/related-skills.md +12 -0
- package/skills/engineering/resolve-release/references/routing.md +149 -0
- package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
- package/skills/engineering/resolve-release/references/versioning.md +202 -0
- package/skills/engineering/resolve-release/references/why.md +53 -0
- package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
- package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
- package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
- package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
- package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
- package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
- package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
- package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
- package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
- package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
- package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
- package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
- package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
- package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
- package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
- package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
- package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
- package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
- package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
- package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
- package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
- package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
- package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
- package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
- package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
- package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
- package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
- package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
- package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
- package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
- package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
- package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/README.md +60 -0
- package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
- package/skills/engineering/review-pr/LICENSE +3 -0
- package/skills/engineering/review-pr/SKILL.md +123 -0
- package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
- package/skills/engineering/review-pr/references/code-correctness.md +5 -0
- package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
- package/skills/engineering/review-pr/references/coordination.md +18 -0
- package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
- package/skills/engineering/review-pr/references/finding-themes.md +7 -0
- package/skills/engineering/review-pr/references/github-posting.md +98 -0
- package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
- package/skills/engineering/review-pr/references/incremental-output.md +16 -0
- package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
- package/skills/engineering/review-pr/references/output-format.md +99 -0
- package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
- package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
- package/skills/engineering/review-pr/references/re-review.md +18 -0
- package/skills/engineering/review-pr/references/review-method.md +199 -0
- package/skills/engineering/review-pr/references/review-mode.md +30 -0
- package/skills/engineering/review-pr/references/review-posture.md +53 -0
- package/skills/engineering/review-pr/references/round1-depth.md +62 -0
- package/skills/engineering/review-pr/references/scripts.md +17 -0
- package/skills/engineering/review-pr/references/workflow.md +16 -0
- package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
- package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
- package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
- package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
- package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
- package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
- package/skills/engineering/smoke/LICENSE +3 -0
- package/skills/engineering/smoke/SKILL.md +131 -0
- package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
- package/skills/engineering/smoke/references/manifest.md +192 -0
- package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
- package/skills/fullstack/better-auth/LICENSE +3 -0
- package/skills/fullstack/better-auth/SKILL.md +601 -0
- package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
- package/skills/fullstack/monorepo/LICENSE +3 -0
- package/skills/fullstack/monorepo/SKILL.md +465 -0
- package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
- package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
- package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
- package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
- package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
- package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
- package/skills/fullstack/prisma-setup/LICENSE +3 -0
- package/skills/fullstack/prisma-setup/SKILL.md +180 -0
- package/skills/fullstack/prisma-setup/nextjs.md +258 -0
- package/skills/fullstack/prisma-setup/turborepo.md +301 -0
- package/skills/fullstack/shadcn/LICENSE +3 -0
- package/skills/fullstack/shadcn/SKILL.md +119 -0
- package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
- package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
- package/skills/fullstack/shadcn/cli.md +411 -0
- package/skills/fullstack/shadcn/customization.md +224 -0
- package/skills/fullstack/shadcn/evals/evals.json +90 -0
- package/skills/fullstack/shadcn/mcp.md +101 -0
- package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
- package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
- package/skills/fullstack/shadcn/rules/composition.md +195 -0
- package/skills/fullstack/shadcn/rules/data-table.md +201 -0
- package/skills/fullstack/shadcn/rules/forms.md +255 -0
- package/skills/fullstack/shadcn/rules/icons.md +103 -0
- package/skills/fullstack/shadcn/rules/styling.md +167 -0
- package/skills/fullstack/zod-v4/LICENSE +3 -0
- package/skills/fullstack/zod-v4/SKILL.md +287 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Common Runtime Errors — 1Above Stack
|
|
2
|
+
|
|
3
|
+
Known error patterns for `a1-*` services on Cloud Run. Format: symptom → likely cause → fix.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Database Errors
|
|
8
|
+
|
|
9
|
+
### `FATAL: password authentication failed for user "..."`
|
|
10
|
+
- **Cause:** Secret `database-url-a1-{env}` is pinned to an old version after DB password rotation, or a new secret version was added but the service wasn't redeployed.
|
|
11
|
+
- **Fix:** Add new secret version with updated DB URL, then redeploy the service. Verify the revision picks up `latest` version.
|
|
12
|
+
|
|
13
|
+
### `sqlalchemy.exc.OperationalError: could not connect to server: No such file or directory`
|
|
14
|
+
- **Cause:** Cloud SQL Unix socket not mounted. `CLOUD_SQL_INSTANCE` env var is missing, wrong format, or Cloud SQL connection not added to the service.
|
|
15
|
+
- **Fix:** Redeploy with `--add-cloudsql-instances cosmic-heaven-479306-v5:us-central1:ai-dev` and ensure `CLOUD_SQL_INSTANCE=cosmic-heaven-479306-v5:us-central1:ai-dev` is set.
|
|
16
|
+
|
|
17
|
+
### `sqlalchemy.exc.OperationalError: could not connect to server: Connection refused`
|
|
18
|
+
- **Cause:** TCP connection attempted instead of Unix socket, or Cloud SQL proxy not reachable. Often occurs when DB URL uses `localhost` or `127.0.0.1` instead of the socket path.
|
|
19
|
+
- **Fix:** DB URL for Cloud SQL on Cloud Run must use the Unix socket format: `postgresql+asyncpg://user:pass@/dbname?host=/cloudsql/PROJECT:REGION:INSTANCE`
|
|
20
|
+
|
|
21
|
+
### `tortoise.exceptions.ConfigurationError: DB URL not defined or wrong format`
|
|
22
|
+
- **Cause:** Tortoise ORM initialized before the `DATABASE_URL` env var is resolved, or URL scheme is incompatible (`postgresql://` vs `postgres://` vs `asyncpg://`).
|
|
23
|
+
- **Fix:** Ensure Tortoise uses `asyncpg` scheme (`postgresql+asyncpg://` or `asyncpg://`). Confirm `DATABASE_URL` is present in the revision env vars. Check `Tortoise.init()` is awaited inside the app lifespan, not at module import time.
|
|
24
|
+
|
|
25
|
+
### `asyncpg.exceptions.TooManyConnectionsError`
|
|
26
|
+
- **Cause:** Connection pool exhausted. Multiple cold starts creating new pools simultaneously, or pool size too large for Cloud SQL's max connection limit.
|
|
27
|
+
- **Fix:** Set `maxsize` on the connection pool (e.g. `maxsize=5`). Consider Cloud SQL connection pooling via PgBouncer or reduce min-instances if connection churn is the issue.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Secret Manager Errors
|
|
32
|
+
|
|
33
|
+
### `google.api_core.exceptions.PermissionDenied: Secret Manager API ... caller does not have permission`
|
|
34
|
+
- **Cause:** Cloud Run service account missing `roles/secretmanager.secretAccessor` on the project or specific secret.
|
|
35
|
+
- **Fix:**
|
|
36
|
+
```bash
|
|
37
|
+
gcloud projects add-iam-policy-binding cosmic-heaven-479306-v5 \
|
|
38
|
+
--member="serviceAccount:SA_EMAIL" \
|
|
39
|
+
--role="roles/secretmanager.secretAccessor"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### `google.api_core.exceptions.NotFound: Secret ... not found`
|
|
43
|
+
- **Cause:** Secret name typo, wrong env suffix (`-dev` vs `-prod`), or secret was deleted.
|
|
44
|
+
- **Fix:** List secrets to confirm correct name: `gcloud secrets list --project cosmic-heaven-479306-v5 --filter="name~a1"`. Check env var that specifies the secret name.
|
|
45
|
+
|
|
46
|
+
### `Secret Manager API has not been used in project ... before`
|
|
47
|
+
- **Cause:** Secret Manager API not enabled on the project (unlikely for existing project; more likely a wrong project ID).
|
|
48
|
+
- **Fix:** Verify `--project cosmic-heaven-479306-v5` is correct. Enable if needed: `gcloud services enable secretmanager.googleapis.com --project cosmic-heaven-479306-v5`
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Container / Config Errors
|
|
53
|
+
|
|
54
|
+
### `Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable.`
|
|
55
|
+
- **Cause (most common):** Application crash on startup — missing required env var, failed DB connection during init, or unhandled import error.
|
|
56
|
+
- **Cause (port mismatch):** App binding to hardcoded port instead of reading `$PORT`.
|
|
57
|
+
- **Fix:** Check startup logs immediately after this message. If port: ensure FastAPI runs on port `8000`, Next.js portal on `3000`, admin on `3001`. Confirm app reads `PORT` env var or matches Cloud Run's configured port.
|
|
58
|
+
|
|
59
|
+
### `Revision failed, container listening on wrong port`
|
|
60
|
+
- **Cause:** Cloud Run sends traffic to port 8000 (or configured port) but container is binding to a different port.
|
|
61
|
+
- **Fix:** Update service port: `gcloud run services update SERVICE --port 8000 --region us-central1 --project cosmic-heaven-479306-v5`. Or fix the app to bind to `int(os.environ.get("PORT", 8000))`.
|
|
62
|
+
|
|
63
|
+
### `Error: Cannot find module '...'` or `ModuleNotFoundError`
|
|
64
|
+
- **Cause:** Dependency not installed in Docker image, or wrong base image used.
|
|
65
|
+
- **Fix:** Rebuild and push a new image. Check `requirements.txt` / `pyproject.toml` / `package.json` includes the missing dep. This is a deploy-time issue — route to Cory or Suzzy + Watt.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Resource / Performance Errors
|
|
70
|
+
|
|
71
|
+
### `DEADLINE_EXCEEDED` on first request after idle
|
|
72
|
+
- **Cause:** `min-instances=0` (default) causes cold start. Heavy initialization (DB connection pool, model loading, etc.) exceeds Cloud Run's request timeout.
|
|
73
|
+
- **Fix (fast):** Set `min-instances=1` to keep one warm instance:
|
|
74
|
+
```bash
|
|
75
|
+
gcloud run services update SERVICE-ENV \
|
|
76
|
+
--min-instances 1 \
|
|
77
|
+
--region us-central1 \
|
|
78
|
+
--project cosmic-heaven-479306-v5
|
|
79
|
+
```
|
|
80
|
+
- **Fix (proper):** Reduce startup work — lazy-load heavy resources, move initialization out of module scope.
|
|
81
|
+
|
|
82
|
+
### Exit code `137` / `OOMKilled`
|
|
83
|
+
- **Cause:** Container exceeded memory limit (default 256Mi on Cloud Run).
|
|
84
|
+
- **Fix:** Increase memory: `gcloud run services update SERVICE-ENV --memory 1Gi --region us-central1 --project cosmic-heaven-479306-v5`. If memory keeps growing, investigate for memory leaks.
|
|
85
|
+
|
|
86
|
+
### `Request timeout` / `upstream request timeout`
|
|
87
|
+
- **Cause:** Request processing exceeds Cloud Run's request timeout (default 300s). Common in heavy data processing or slow DB queries.
|
|
88
|
+
- **Fix:** Increase timeout: `gcloud run services update SERVICE-ENV --timeout 600 --region us-central1 --project cosmic-heaven-479306-v5`. Or break long work into async tasks.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Next.js / Frontend Errors
|
|
93
|
+
|
|
94
|
+
### `Error: Dynamic server usage: headers`
|
|
95
|
+
- **Cause:** Using `headers()`, `cookies()`, or other dynamic APIs inside a component or route that Next.js attempted to statically render at build time.
|
|
96
|
+
- **Fix:** Add `export const dynamic = 'force-dynamic'` at the top of the page/route file. Or move the dynamic call inside a Server Component that is not statically cached.
|
|
97
|
+
|
|
98
|
+
### `Hydration failed because the initial UI does not match what was rendered on the server`
|
|
99
|
+
- **Cause:** Server-rendered HTML differs from what React renders on the client. Common sources: `Date()`, `Math.random()`, `typeof window`, `localStorage` in render logic.
|
|
100
|
+
- **Fix:** Wrap client-only code in `useEffect`. Use `suppressHydrationWarning` only as last resort. For timestamps: format server-side and pass as prop, or use a stable seed.
|
|
101
|
+
|
|
102
|
+
### `Error: ECONNREFUSED 127.0.0.1:PORT` (Next.js Server Component or Server Action)
|
|
103
|
+
- **Cause:** Server Component or Server Action making an HTTP call to an internal service using `localhost` or a hardcoded URL that isn't reachable from the Next.js container.
|
|
104
|
+
- **Fix:** Use the Cloud Run service URL (not localhost). Set the backend URL via env var (e.g. `BACKEND_URL=https://a1-engine-dev-xxx-uc.a.run.app`). Confirm the env var is present in the revision.
|
|
105
|
+
|
|
106
|
+
### `TypeError: Failed to fetch` / `fetch failed` in Server Action
|
|
107
|
+
- **Cause:** Network call from Server Action failing. Could be DNS, wrong URL, or the target service is down.
|
|
108
|
+
- **Fix:** Log the full URL being fetched. Check target service is running: `gcloud run services describe TARGET --region us-central1 --project cosmic-heaven-479306-v5`. Confirm VPC/egress config if services are VPC-internal.
|
|
109
|
+
|
|
110
|
+
### `Error: cookies() was called outside a request scope`
|
|
111
|
+
- **Cause:** `cookies()` called at module top level or in a static context.
|
|
112
|
+
- **Fix:** Move the call inside the request handler function body, not at module scope.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## FastAPI Errors
|
|
117
|
+
|
|
118
|
+
### HTTP 422 Unprocessable Entity
|
|
119
|
+
- **Cause:** Request body or query params don't match the Pydantic schema. Often a client bug, but can also be a schema mismatch after an API change.
|
|
120
|
+
- **Fix:** Check the response body for `detail` — it includes the exact field and validation error. Confirm client is sending the correct payload shape.
|
|
121
|
+
|
|
122
|
+
### HTTP 500 with `RuntimeError: no running event loop`
|
|
123
|
+
- **Cause:** Async code called from a sync context, or Tortoise ORM used before `Tortoise.init()` is awaited.
|
|
124
|
+
- **Fix:** Ensure all DB operations happen inside `async def` functions. Confirm the lifespan handler initializes Tortoise before the app accepts requests.
|
|
125
|
+
|
|
126
|
+
### `fastapi.exceptions.HTTPException: 401 / 403`
|
|
127
|
+
- **Cause:** Auth middleware rejecting requests. JWT expired, wrong secret used to verify, or `auth-secret` mismatch between portal and engine.
|
|
128
|
+
- **Fix:** Check `auth-secret` secret is the same version across both services. Verify token expiry and issuer config.
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: python-backend
|
|
3
|
+
description: Python backend conventions — architecture, design decisions, and implementation patterns. Read when designing or reviewing features involving FastAPI, Tortoise-ORM, Pydantic Settings, loguru, or uv dependency management.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Python Backend Conventions
|
|
7
|
+
|
|
8
|
+
**Stack:** Python 3.12 | FastAPI | Tortoise-ORM | Aerich | Pydantic v2 | loguru | uv | pytest
|
|
9
|
+
|
|
10
|
+
## Critical Rule
|
|
11
|
+
|
|
12
|
+
Use **uv** for all environment, dependency, and tool commands. No raw `pip`, `poetry`, `pipenv`, or manual `venv`.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Tooling & Commands
|
|
17
|
+
|
|
18
|
+
### Dependencies
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# Runtime deps
|
|
22
|
+
uv add fastapi tortoise-orm aerich pydantic pydantic-settings loguru
|
|
23
|
+
|
|
24
|
+
# Dev deps
|
|
25
|
+
uv add --dev pytest ruff mypy
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Running Commands
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
uv run uvicorn app.main:app --reload # Start app
|
|
32
|
+
uv run pytest # Run tests
|
|
33
|
+
uv run ruff check . # Lint
|
|
34
|
+
uv run mypy app # Type check
|
|
35
|
+
uv run aerich migrate # Run migrations
|
|
36
|
+
uv run aerich upgrade # Apply migrations
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Architecture
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
app/
|
|
45
|
+
├── api/ # API Layer - routes, endpoints
|
|
46
|
+
├── services/ # Service Layer - business logic
|
|
47
|
+
├── dal/ # Data Access Layer - Tortoise queries
|
|
48
|
+
├── models/ # Tortoise ORM models
|
|
49
|
+
├── schemas/ # Pydantic schemas
|
|
50
|
+
└── core/ # Infrastructure
|
|
51
|
+
├── config.py # Pydantic Settings
|
|
52
|
+
├── logging.py # loguru configuration
|
|
53
|
+
├── tortoise.py # DB init/close
|
|
54
|
+
├── errors.py # Domain exceptions
|
|
55
|
+
└── security.py # Auth utilities
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Export Rule
|
|
59
|
+
|
|
60
|
+
All modules in `core`, `dal`, `services`, `schemas`, `api` must define `__all__`.
|
|
61
|
+
All packages (`__init__.py`) re-export the public API using `__all__`.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Config Management
|
|
66
|
+
|
|
67
|
+
Location: `app/core/config.py`
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
from __future__ import annotations
|
|
71
|
+
|
|
72
|
+
from functools import lru_cache
|
|
73
|
+
from typing import Literal
|
|
74
|
+
|
|
75
|
+
from pydantic import AnyUrl
|
|
76
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
77
|
+
|
|
78
|
+
__all__ = ["Settings", "get_settings"]
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class Settings(BaseSettings):
|
|
82
|
+
model_config = SettingsConfigDict(
|
|
83
|
+
env_file=".env",
|
|
84
|
+
env_file_encoding="utf-8",
|
|
85
|
+
extra="ignore",
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
ENV: Literal["local", "dev", "staging", "prod"] = "local"
|
|
89
|
+
DATABASE_URL: AnyUrl
|
|
90
|
+
LOG_LEVEL: str = "INFO"
|
|
91
|
+
APP_NAME: str = "Backend"
|
|
92
|
+
API_V1_PREFIX: str = "/api/v1"
|
|
93
|
+
JWT_SECRET_KEY: str
|
|
94
|
+
JWT_ALGORITHM: str = "HS256"
|
|
95
|
+
ACCESS_TOKEN_EXPIRE_MINUTES: int = 60
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
@lru_cache(maxsize=1)
|
|
99
|
+
def get_settings() -> Settings:
|
|
100
|
+
"""Global, cached settings accessor."""
|
|
101
|
+
return Settings()
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Rule:** Never create new `Settings()` manually; always use `get_settings()`.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Logging
|
|
109
|
+
|
|
110
|
+
Location: `app/core/logging.py`
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
from __future__ import annotations
|
|
114
|
+
|
|
115
|
+
import sys
|
|
116
|
+
from loguru import logger
|
|
117
|
+
|
|
118
|
+
from app.core.config import get_settings
|
|
119
|
+
|
|
120
|
+
__all__ = ["logger", "configure_logging"]
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def configure_logging() -> None:
|
|
124
|
+
"""Configure global loguru logger. Call once at app startup."""
|
|
125
|
+
settings = get_settings()
|
|
126
|
+
|
|
127
|
+
logger.remove()
|
|
128
|
+
logger.add(
|
|
129
|
+
sys.stderr,
|
|
130
|
+
level=settings.LOG_LEVEL,
|
|
131
|
+
enqueue=True,
|
|
132
|
+
backtrace=False,
|
|
133
|
+
diagnose=False,
|
|
134
|
+
serialize=settings.ENV in ("staging", "prod"),
|
|
135
|
+
)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Rule:** Import `logger` from `app.core.logging` (not `loguru` directly).
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Tortoise-ORM & Aerich
|
|
143
|
+
|
|
144
|
+
Location: `app/core/tortoise.py`
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
from __future__ import annotations
|
|
148
|
+
|
|
149
|
+
from tortoise import Tortoise
|
|
150
|
+
|
|
151
|
+
from app.core.config import get_settings
|
|
152
|
+
|
|
153
|
+
__all__ = ["TORTOISE_ORM", "init_db", "close_db"]
|
|
154
|
+
|
|
155
|
+
settings = get_settings()
|
|
156
|
+
|
|
157
|
+
TORTOISE_ORM = {
|
|
158
|
+
"connections": {
|
|
159
|
+
"default": str(settings.DATABASE_URL),
|
|
160
|
+
},
|
|
161
|
+
"apps": {
|
|
162
|
+
"models": {
|
|
163
|
+
"models": ["app.models.user", "app.models.order", "aerich.models"],
|
|
164
|
+
"default_connection": "default",
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
async def init_db() -> None:
|
|
171
|
+
await Tortoise.init(config=TORTOISE_ORM)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
async def close_db() -> None:
|
|
175
|
+
await Tortoise.close_connections()
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Data Access Layer (DAL)
|
|
181
|
+
|
|
182
|
+
Location: `app/dal/**`
|
|
183
|
+
|
|
184
|
+
- Functional style, Tortoise only
|
|
185
|
+
- No FastAPI, no Pydantic, no auth, no logging
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
# app/dal/order_dal.py
|
|
189
|
+
from __future__ import annotations
|
|
190
|
+
|
|
191
|
+
from tortoise.transactions import in_transaction
|
|
192
|
+
from app.models.order import Order, OrderItem
|
|
193
|
+
|
|
194
|
+
__all__ = ["get_user_orders_with_items", "create_order_with_items"]
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
async def get_user_orders_with_items(
|
|
198
|
+
user_id: int,
|
|
199
|
+
limit: int = 20,
|
|
200
|
+
offset: int = 0,
|
|
201
|
+
) -> list[Order]:
|
|
202
|
+
return await (
|
|
203
|
+
Order
|
|
204
|
+
.filter(user_id=user_id)
|
|
205
|
+
.prefetch_related("items")
|
|
206
|
+
.order_by("-created_at")
|
|
207
|
+
.offset(offset)
|
|
208
|
+
.limit(limit)
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
async def create_order_with_items(
|
|
213
|
+
user_id: int,
|
|
214
|
+
items: list[dict],
|
|
215
|
+
) -> Order:
|
|
216
|
+
async with in_transaction() as conn:
|
|
217
|
+
order = await Order.using_db(conn).create(user_id=user_id)
|
|
218
|
+
for item in items:
|
|
219
|
+
await OrderItem.using_db(conn).create(order=order, **item)
|
|
220
|
+
return order
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Complexity Rule
|
|
224
|
+
|
|
225
|
+
- **Simple / one-off** queries: Direct Tortoise in services
|
|
226
|
+
- **Complex / reused / transactional**: DAL functions
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Service Layer
|
|
231
|
+
|
|
232
|
+
Location: `app/services/**`
|
|
233
|
+
|
|
234
|
+
- Center of business logic
|
|
235
|
+
- Uses DAL for complex queries
|
|
236
|
+
- Raises domain exceptions from `app/core/errors.py`
|
|
237
|
+
- Uses `logger` for business-level events
|
|
238
|
+
|
|
239
|
+
```python
|
|
240
|
+
# app/services/order_service.py
|
|
241
|
+
from __future__ import annotations
|
|
242
|
+
|
|
243
|
+
from app.schemas.order import OrderCreate, OrderRead
|
|
244
|
+
from app.models.order import Order
|
|
245
|
+
from app.dal import get_user_orders_with_items, create_order_with_items
|
|
246
|
+
from app.core.errors import OrderNotFoundError, PermissionDeniedError
|
|
247
|
+
from app.core.logging import logger
|
|
248
|
+
|
|
249
|
+
__all__ = ["list_my_orders", "get_order_detail", "create_order"]
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
async def list_my_orders(
|
|
253
|
+
user_id: int,
|
|
254
|
+
limit: int = 20,
|
|
255
|
+
offset: int = 0,
|
|
256
|
+
) -> list[OrderRead]:
|
|
257
|
+
orders = await get_user_orders_with_items(user_id, limit, offset)
|
|
258
|
+
logger.info("Listed orders", user_id=user_id, count=len(orders))
|
|
259
|
+
return [OrderRead.model_validate(o) for o in orders]
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## API Layer
|
|
265
|
+
|
|
266
|
+
Location: `app/api/**`
|
|
267
|
+
|
|
268
|
+
- Uses `APIRouter`, `Depends`, `HTTPException`, `status`
|
|
269
|
+
- Converts domain exceptions to HTTP status codes
|
|
270
|
+
|
|
271
|
+
```python
|
|
272
|
+
# app/api/v1/orders.py
|
|
273
|
+
from __future__ import annotations
|
|
274
|
+
|
|
275
|
+
from fastapi import APIRouter, Depends, HTTPException, status
|
|
276
|
+
from app.schemas.order import OrderCreate, OrderRead
|
|
277
|
+
from app.services import list_my_orders, create_order, get_order_detail
|
|
278
|
+
from app.core.errors import OrderNotFoundError, PermissionDeniedError
|
|
279
|
+
from app.api.deps import get_current_user
|
|
280
|
+
from app.core.logging import logger
|
|
281
|
+
|
|
282
|
+
__all__ = ["router"]
|
|
283
|
+
|
|
284
|
+
router = APIRouter(prefix="/orders", tags=["orders"])
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
@router.get("/", response_model=list[OrderRead])
|
|
288
|
+
async def list_orders(current_user=Depends(get_current_user)) -> list[OrderRead]:
|
|
289
|
+
return await list_my_orders(user_id=current_user.id)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
@router.get("/{order_id}", response_model=OrderRead)
|
|
293
|
+
async def get_order(
|
|
294
|
+
order_id: int,
|
|
295
|
+
current_user=Depends(get_current_user),
|
|
296
|
+
) -> OrderRead:
|
|
297
|
+
try:
|
|
298
|
+
return await get_order_detail(current_user.id, order_id)
|
|
299
|
+
except OrderNotFoundError as e:
|
|
300
|
+
raise HTTPException(status_code=404, detail=str(e))
|
|
301
|
+
except PermissionDeniedError as e:
|
|
302
|
+
raise HTTPException(status_code=403, detail=str(e))
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Do / Don't
|
|
308
|
+
|
|
309
|
+
### Do
|
|
310
|
+
|
|
311
|
+
- Use **uv** for env, deps, and all Python tooling
|
|
312
|
+
- Use **Pydantic Settings** with `get_settings()` for config
|
|
313
|
+
- Use **loguru** via `app.core.logging.logger`
|
|
314
|
+
- Keep API -> Service -> DAL separation
|
|
315
|
+
- Use DAL for complex/reused DB logic
|
|
316
|
+
- Use `__all__` and package `__init__.py` for explicit exports
|
|
317
|
+
- Use pytest for all tests
|
|
318
|
+
|
|
319
|
+
### Don't
|
|
320
|
+
|
|
321
|
+
- Don't use raw `pip`, `venv`, or `pytest` outside `uv run`
|
|
322
|
+
- Don't import `loguru.logger` directly
|
|
323
|
+
- Don't instantiate `Settings()` directly
|
|
324
|
+
- Don't call Tortoise from API routes
|
|
325
|
+
- Don't let DAL log or handle business logic
|
|
326
|
+
- Don't raise `HTTPException` outside the API layer
|