oh-my-customcodex 0.1.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 +21 -0
- package/README.md +327 -0
- package/dist/cli/index.js +32054 -0
- package/dist/index.js +5469 -0
- package/package.json +89 -0
- package/templates/.claude/agents/arch-documenter.md +38 -0
- package/templates/.claude/agents/arch-speckit-agent.md +66 -0
- package/templates/.claude/agents/be-django-expert.md +47 -0
- package/templates/.claude/agents/be-express-expert.md +31 -0
- package/templates/.claude/agents/be-fastapi-expert.md +45 -0
- package/templates/.claude/agents/be-go-backend-expert.md +45 -0
- package/templates/.claude/agents/be-nestjs-expert.md +29 -0
- package/templates/.claude/agents/be-springboot-expert.md +42 -0
- package/templates/.claude/agents/db-alembic-expert.md +73 -0
- package/templates/.claude/agents/db-postgres-expert.md +38 -0
- package/templates/.claude/agents/db-redis-expert.md +38 -0
- package/templates/.claude/agents/db-supabase-expert.md +37 -0
- package/templates/.claude/agents/de-airflow-expert.md +48 -0
- package/templates/.claude/agents/de-dbt-expert.md +36 -0
- package/templates/.claude/agents/de-kafka-expert.md +83 -0
- package/templates/.claude/agents/de-pipeline-expert.md +34 -0
- package/templates/.claude/agents/de-snowflake-expert.md +38 -0
- package/templates/.claude/agents/de-spark-expert.md +38 -0
- package/templates/.claude/agents/fe-design-expert.md +120 -0
- package/templates/.claude/agents/fe-flutter-agent.md +48 -0
- package/templates/.claude/agents/fe-svelte-agent.md +33 -0
- package/templates/.claude/agents/fe-vercel-agent.md +40 -0
- package/templates/.claude/agents/fe-vuejs-agent.md +34 -0
- package/templates/.claude/agents/infra-aws-expert.md +49 -0
- package/templates/.claude/agents/infra-docker-expert.md +49 -0
- package/templates/.claude/agents/lang-golang-expert.md +46 -0
- package/templates/.claude/agents/lang-java21-expert.md +42 -0
- package/templates/.claude/agents/lang-kotlin-expert.md +45 -0
- package/templates/.claude/agents/lang-python-expert.md +45 -0
- package/templates/.claude/agents/lang-rust-expert.md +45 -0
- package/templates/.claude/agents/lang-typescript-expert.md +45 -0
- package/templates/.claude/agents/mgr-claude-code-bible.md +62 -0
- package/templates/.claude/agents/mgr-creator.md +57 -0
- package/templates/.claude/agents/mgr-gitnerd.md +50 -0
- package/templates/.claude/agents/mgr-sauron.md +163 -0
- package/templates/.claude/agents/mgr-supplier.md +39 -0
- package/templates/.claude/agents/mgr-updater.md +40 -0
- package/templates/.claude/agents/qa-engineer.md +36 -0
- package/templates/.claude/agents/qa-planner.md +78 -0
- package/templates/.claude/agents/qa-writer.md +32 -0
- package/templates/.claude/agents/sec-codeql-expert.md +56 -0
- package/templates/.claude/agents/slack-cli-expert.md +98 -0
- package/templates/.claude/agents/souls/lang-golang-expert.soul.md +21 -0
- package/templates/.claude/agents/sys-memory-keeper.md +123 -0
- package/templates/.claude/agents/sys-naggy.md +76 -0
- package/templates/.claude/agents/tool-bun-expert.md +26 -0
- package/templates/.claude/agents/tool-npm-expert.md +31 -0
- package/templates/.claude/agents/tool-optimizer.md +37 -0
- package/templates/.claude/agents/wiki-curator.md +72 -0
- package/templates/.claude/config/required-plugins.json +30 -0
- package/templates/.claude/contexts/dev.md +20 -0
- package/templates/.claude/contexts/ecomode.md +110 -0
- package/templates/.claude/contexts/index.yaml +41 -0
- package/templates/.claude/contexts/research.md +28 -0
- package/templates/.claude/contexts/review.md +23 -0
- package/templates/.claude/hooks/hooks.json +533 -0
- package/templates/.claude/hooks/scripts/adaptive-harness-scan.sh +45 -0
- package/templates/.claude/hooks/scripts/agent-start-recorder.sh +40 -0
- package/templates/.claude/hooks/scripts/agent-teams-advisor.sh +76 -0
- package/templates/.claude/hooks/scripts/audit-log.sh +64 -0
- package/templates/.claude/hooks/scripts/auto-continue-guard.sh +33 -0
- package/templates/.claude/hooks/scripts/content-hash-validator.sh +75 -0
- package/templates/.claude/hooks/scripts/context-budget-advisor.sh +107 -0
- package/templates/.claude/hooks/scripts/cost-cap-advisor.sh +71 -0
- package/templates/.claude/hooks/scripts/cwd-change-detector.sh +36 -0
- package/templates/.claude/hooks/scripts/eval-core-batch-save.sh +46 -0
- package/templates/.claude/hooks/scripts/feedback-collector.sh +92 -0
- package/templates/.claude/hooks/scripts/file-change-validator.sh +26 -0
- package/templates/.claude/hooks/scripts/git-delegation-guard.sh +57 -0
- package/templates/.claude/hooks/scripts/model-escalation-advisor.sh +106 -0
- package/templates/.claude/hooks/scripts/omcodex-auto-update.sh +4 -0
- package/templates/.claude/hooks/scripts/omcustom-auto-update.sh +177 -0
- package/templates/.claude/hooks/scripts/rtk-intercept.sh +77 -0
- package/templates/.claude/hooks/scripts/rule-deletion-guard.sh +60 -0
- package/templates/.claude/hooks/scripts/schema-validator.sh +106 -0
- package/templates/.claude/hooks/scripts/secret-filter.sh +100 -0
- package/templates/.claude/hooks/scripts/session-autofix-prompt.sh +34 -0
- package/templates/.claude/hooks/scripts/session-autofix.sh +146 -0
- package/templates/.claude/hooks/scripts/session-env-check.sh +254 -0
- package/templates/.claude/hooks/scripts/skill-extractor-analyzer.sh +49 -0
- package/templates/.claude/hooks/scripts/stage-blocker.sh +16 -0
- package/templates/.claude/hooks/scripts/stale-todo-scanner.sh +91 -0
- package/templates/.claude/hooks/scripts/stall-detection-advisor.sh +112 -0
- package/templates/.claude/hooks/scripts/stop-console-audit.sh +46 -0
- package/templates/.claude/hooks/scripts/stuck-detector.sh +199 -0
- package/templates/.claude/hooks/scripts/task-outcome-recorder.sh +119 -0
- package/templates/.claude/hooks/scripts/task-state-precompact.sh +58 -0
- package/templates/.claude/hooks/scripts/user-prompt-preprocessor.sh +32 -0
- package/templates/.claude/hooks/skill-count-reminder.sh +34 -0
- package/templates/.claude/install-hooks.sh +100 -0
- package/templates/.claude/ontology/agents.yaml +546 -0
- package/templates/.claude/ontology/graphs/agent-skill.json +102 -0
- package/templates/.claude/ontology/graphs/full-graph.json +629 -0
- package/templates/.claude/ontology/graphs/routing.json +112 -0
- package/templates/.claude/ontology/graphs/skill-rule.json +78 -0
- package/templates/.claude/ontology/rules.yaml +251 -0
- package/templates/.claude/ontology/schema.yaml +144 -0
- package/templates/.claude/ontology/skills.yaml +575 -0
- package/templates/.claude/rules/MAY-optimization.md +42 -0
- package/templates/.claude/rules/MUST-agent-design.md +340 -0
- package/templates/.claude/rules/MUST-agent-identification.md +77 -0
- package/templates/.claude/rules/MUST-agent-teams.md +293 -0
- package/templates/.claude/rules/MUST-completion-verification.md +112 -0
- package/templates/.claude/rules/MUST-continuous-improvement.md +69 -0
- package/templates/.claude/rules/MUST-enforcement-policy.md +50 -0
- package/templates/.claude/rules/MUST-intent-transparency.md +74 -0
- package/templates/.claude/rules/MUST-language-policy.md +28 -0
- package/templates/.claude/rules/MUST-orchestrator-coordination.md +399 -0
- package/templates/.claude/rules/MUST-parallel-execution.md +184 -0
- package/templates/.claude/rules/MUST-permissions.md +32 -0
- package/templates/.claude/rules/MUST-safety.md +23 -0
- package/templates/.claude/rules/MUST-sync-verification.md +145 -0
- package/templates/.claude/rules/MUST-tool-identification.md +97 -0
- package/templates/.claude/rules/SHOULD-ecomode.md +123 -0
- package/templates/.claude/rules/SHOULD-error-handling.md +33 -0
- package/templates/.claude/rules/SHOULD-hud-statusline.md +51 -0
- package/templates/.claude/rules/SHOULD-interaction.md +77 -0
- package/templates/.claude/rules/SHOULD-memory-integration.md +371 -0
- package/templates/.claude/rules/SHOULD-ontology-rag-routing.md +49 -0
- package/templates/.claude/rules/SHOULD-wiki-sync.md +73 -0
- package/templates/.claude/rules/index.yaml +141 -0
- package/templates/.claude/schemas/tool-inputs.json +62 -0
- package/templates/.claude/skills/action-validator/SKILL.md +89 -0
- package/templates/.claude/skills/adaptive-harness/SKILL.md +335 -0
- package/templates/.claude/skills/adversarial-review/SKILL.md +80 -0
- package/templates/.claude/skills/agora/SKILL.md +194 -0
- package/templates/.claude/skills/airflow-best-practices/SKILL.md +94 -0
- package/templates/.claude/skills/alembic-best-practices/SKILL.md +295 -0
- package/templates/.claude/skills/ambiguity-gate/SKILL.md +94 -0
- package/templates/.claude/skills/analysis/SKILL.md +223 -0
- package/templates/.claude/skills/audit-agents/SKILL.md +118 -0
- package/templates/.claude/skills/aws-best-practices/SKILL.md +281 -0
- package/templates/.claude/skills/claude-code-bible/SKILL.md +93 -0
- package/templates/.claude/skills/claude-code-bible/scripts/fetch-docs.js +244 -0
- package/templates/.claude/skills/claude-native/SKILL.md +215 -0
- package/templates/.claude/skills/codex-exec/SKILL.md +206 -0
- package/templates/.claude/skills/codex-exec/scripts/codex-wrapper.cjs +430 -0
- package/templates/.claude/skills/create-agent/SKILL.md +94 -0
- package/templates/.claude/skills/cve-triage/SKILL.md +91 -0
- package/templates/.claude/skills/dag-orchestration/SKILL.md +201 -0
- package/templates/.claude/skills/dbt-best-practices/SKILL.md +55 -0
- package/templates/.claude/skills/de-lead-routing/SKILL.md +230 -0
- package/templates/.claude/skills/deep-plan/SKILL.md +344 -0
- package/templates/.claude/skills/deep-verify/SKILL.md +111 -0
- package/templates/.claude/skills/dev-lead-routing/SKILL.md +161 -0
- package/templates/.claude/skills/dev-refactor/SKILL.md +234 -0
- package/templates/.claude/skills/dev-review/SKILL.md +172 -0
- package/templates/.claude/skills/django-best-practices/SKILL.md +334 -0
- package/templates/.claude/skills/docker-best-practices/SKILL.md +276 -0
- package/templates/.claude/skills/evaluator-optimizer/SKILL.md +421 -0
- package/templates/.claude/skills/fastapi-best-practices/SKILL.md +271 -0
- package/templates/.claude/skills/fix-refs/SKILL.md +109 -0
- package/templates/.claude/skills/flutter-best-practices/SKILL.md +325 -0
- package/templates/.claude/skills/gemini-exec/SKILL.md +215 -0
- package/templates/.claude/skills/gemini-exec/scripts/gemini-wrapper.cjs +485 -0
- package/templates/.claude/skills/go-backend-best-practices/SKILL.md +135 -0
- package/templates/.claude/skills/go-best-practices/SKILL.md +204 -0
- package/templates/.claude/skills/hada-scout/SKILL.md +92 -0
- package/templates/.claude/skills/harness-eval/SKILL.md +95 -0
- package/templates/.claude/skills/harness-synthesizer/SKILL.md +145 -0
- package/templates/.claude/skills/help/SKILL.md +127 -0
- package/templates/.claude/skills/idea/SKILL.md +88 -0
- package/templates/.claude/skills/impeccable-design/SKILL.md +173 -0
- package/templates/.claude/skills/intent-detection/SKILL.md +293 -0
- package/templates/.claude/skills/intent-detection/patterns/agent-triggers.yaml +438 -0
- package/templates/.claude/skills/java21-best-practices/SKILL.md +190 -0
- package/templates/.claude/skills/jinja2-prompts/SKILL.md +86 -0
- package/templates/.claude/skills/kafka-best-practices/SKILL.md +53 -0
- package/templates/.claude/skills/kotlin-best-practices/SKILL.md +257 -0
- package/templates/.claude/skills/lists/SKILL.md +80 -0
- package/templates/.claude/skills/memory-management/SKILL.md +196 -0
- package/templates/.claude/skills/memory-recall/SKILL.md +172 -0
- package/templates/.claude/skills/memory-save/SKILL.md +128 -0
- package/templates/.claude/skills/model-escalation/SKILL.md +62 -0
- package/templates/.claude/skills/monitoring-setup/SKILL.md +215 -0
- package/templates/.claude/skills/multi-model-verification/SKILL.md +130 -0
- package/templates/.claude/skills/npm-audit/SKILL.md +74 -0
- package/templates/.claude/skills/npm-publish/SKILL.md +65 -0
- package/templates/.claude/skills/npm-version/SKILL.md +104 -0
- package/templates/.claude/skills/omcodex-auto-improve/SKILL.md +136 -0
- package/templates/.claude/skills/omcodex-feedback/SKILL.md +205 -0
- package/templates/.claude/skills/omcodex-improve-report/SKILL.md +65 -0
- package/templates/.claude/skills/omcodex-loop/SKILL.md +45 -0
- package/templates/.claude/skills/omcodex-release-notes/SKILL.md +117 -0
- package/templates/.claude/skills/omcodex-takeover/SKILL.md +115 -0
- package/templates/.claude/skills/omcodex-web/SKILL.md +95 -0
- package/templates/.claude/skills/optimize-analyze/SKILL.md +57 -0
- package/templates/.claude/skills/optimize-bundle/SKILL.md +69 -0
- package/templates/.claude/skills/optimize-report/SKILL.md +76 -0
- package/templates/.claude/skills/peer-messaging/SKILL.md +59 -0
- package/templates/.claude/skills/pipeline/SKILL.md +103 -0
- package/templates/.claude/skills/pipeline-architecture-patterns/SKILL.md +84 -0
- package/templates/.claude/skills/pipeline-guards/SKILL.md +173 -0
- package/templates/.claude/skills/post-release-followup/SKILL.md +134 -0
- package/templates/.claude/skills/postgres-best-practices/SKILL.md +67 -0
- package/templates/.claude/skills/pr-auto-improve/SKILL.md +129 -0
- package/templates/.claude/skills/professor-triage/SKILL.md +321 -0
- package/templates/.claude/skills/python-best-practices/SKILL.md +223 -0
- package/templates/.claude/skills/qa-lead-routing/SKILL.md +104 -0
- package/templates/.claude/skills/react-best-practices/SKILL.md +102 -0
- package/templates/.claude/skills/reasoning-sandwich/SKILL.md +64 -0
- package/templates/.claude/skills/redis-best-practices/SKILL.md +84 -0
- package/templates/.claude/skills/release-plan/SKILL.md +207 -0
- package/templates/.claude/skills/research/SKILL.md +493 -0
- package/templates/.claude/skills/result-aggregation/SKILL.md +165 -0
- package/templates/.claude/skills/rtk-exec/SKILL.md +199 -0
- package/templates/.claude/skills/rtk-exec/scripts/rtk-wrapper.cjs +377 -0
- package/templates/.claude/skills/rust-best-practices/SKILL.md +268 -0
- package/templates/.claude/skills/sauron-watch/SKILL.md +239 -0
- package/templates/.claude/skills/scout/SKILL.md +250 -0
- package/templates/.claude/skills/sdd/SKILL.md +24 -0
- package/templates/.claude/skills/sdd-dev/SKILL.md +257 -0
- package/templates/.claude/skills/sdd-development/SKILL.md +24 -0
- package/templates/.claude/skills/secretary-routing/SKILL.md +132 -0
- package/templates/.claude/skills/skill-extractor/SKILL.md +155 -0
- package/templates/.claude/skills/skills-sh-search/SKILL.md +210 -0
- package/templates/.claude/skills/snowflake-best-practices/SKILL.md +66 -0
- package/templates/.claude/skills/spark-best-practices/SKILL.md +53 -0
- package/templates/.claude/skills/springboot-best-practices/SKILL.md +74 -0
- package/templates/.claude/skills/springboot-best-practices/examples/config-properties-example.java +22 -0
- package/templates/.claude/skills/springboot-best-practices/examples/controller-example.java +28 -0
- package/templates/.claude/skills/springboot-best-practices/examples/controller-test-example.java +33 -0
- package/templates/.claude/skills/springboot-best-practices/examples/entity-example.java +22 -0
- package/templates/.claude/skills/springboot-best-practices/examples/exception-handler-example.java +30 -0
- package/templates/.claude/skills/springboot-best-practices/examples/repository-example.java +17 -0
- package/templates/.claude/skills/springboot-best-practices/examples/repository-test-example.java +23 -0
- package/templates/.claude/skills/springboot-best-practices/examples/security-config-example.java +27 -0
- package/templates/.claude/skills/springboot-best-practices/examples/service-example.java +33 -0
- package/templates/.claude/skills/status/SKILL.md +155 -0
- package/templates/.claude/skills/structured-dev-cycle/SKILL.md +200 -0
- package/templates/.claude/skills/stuck-recovery/SKILL.md +80 -0
- package/templates/.claude/skills/supabase-postgres-best-practices/SKILL.md +100 -0
- package/templates/.claude/skills/systematic-debugging/SKILL.md +288 -0
- package/templates/.claude/skills/systematic-debugging/condition-based-waiting-example.ts +278 -0
- package/templates/.claude/skills/systematic-debugging/condition-based-waiting.md +240 -0
- package/templates/.claude/skills/systematic-debugging/defense-in-depth.md +252 -0
- package/templates/.claude/skills/systematic-debugging/find-polluter.sh +147 -0
- package/templates/.claude/skills/systematic-debugging/root-cause-tracing.md +87 -0
- package/templates/.claude/skills/task-decomposition/SKILL.md +197 -0
- package/templates/.claude/skills/typescript-best-practices/SKILL.md +322 -0
- package/templates/.claude/skills/update-docs/SKILL.md +142 -0
- package/templates/.claude/skills/update-external/SKILL.md +169 -0
- package/templates/.claude/skills/vercel-deploy/SKILL.md +75 -0
- package/templates/.claude/skills/web-design-guidelines/SKILL.md +119 -0
- package/templates/.claude/skills/wiki/SKILL.md +426 -0
- package/templates/.claude/skills/wiki-rag/SKILL.md +154 -0
- package/templates/.claude/skills/worker-reviewer-pipeline/SKILL.md +165 -0
- package/templates/.claude/skills/writing-clearly-and-concisely/SKILL.md +66 -0
- package/templates/.claude/statusline.sh +380 -0
- package/templates/.claude/uninstall-hooks.sh +52 -0
- package/templates/.github/workflows/wiki-sync.yml +132 -0
- package/templates/AGENTS.md.en +255 -0
- package/templates/AGENTS.md.ko +255 -0
- package/templates/CLAUDE.md +263 -0
- package/templates/CLAUDE.md.en +256 -0
- package/templates/CLAUDE.md.ko +256 -0
- package/templates/deprecated-files.json +10 -0
- package/templates/guides/agents-md-quality/README.md +110 -0
- package/templates/guides/airflow/README.md +47 -0
- package/templates/guides/alembic/README.md +438 -0
- package/templates/guides/aws/common-patterns.md +169 -0
- package/templates/guides/aws/index.yaml +26 -0
- package/templates/guides/aws/well-architected.md +143 -0
- package/templates/guides/cc-token-saver/README.md +97 -0
- package/templates/guides/claude-code/01-overview.md +42 -0
- package/templates/guides/claude-code/03-tools.md +107 -0
- package/templates/guides/claude-code/04-agent-skills.md +90 -0
- package/templates/guides/claude-code/05-agent-sdk.md +129 -0
- package/templates/guides/claude-code/06-mcp.md +165 -0
- package/templates/guides/claude-code/07-prompt-engineering.md +100 -0
- package/templates/guides/claude-code/08-testing.md +56 -0
- package/templates/guides/claude-code/09-guardrails.md +78 -0
- package/templates/guides/claude-code/10-monitoring.md +87 -0
- package/templates/guides/claude-code/11-sub-agents.md +159 -0
- package/templates/guides/claude-code/12-workflow-patterns.md +182 -0
- package/templates/guides/claude-code/13-cli-flags.md +151 -0
- package/templates/guides/claude-code/index.yaml +61 -0
- package/templates/guides/dbt/README.md +32 -0
- package/templates/guides/django-best-practices/README.md +476 -0
- package/templates/guides/docker/compose-best-practices.md +284 -0
- package/templates/guides/docker/dockerfile-best-practices.md +262 -0
- package/templates/guides/docker/index.yaml +26 -0
- package/templates/guides/drizzle-orm/README.md +69 -0
- package/templates/guides/elements-of-style/elements-of-style.html +2609 -0
- package/templates/guides/fastapi/best-practices.md +232 -0
- package/templates/guides/fastapi/index.yaml +21 -0
- package/templates/guides/flutter/architecture.md +141 -0
- package/templates/guides/flutter/fundamentals.md +119 -0
- package/templates/guides/flutter/index.yaml +44 -0
- package/templates/guides/flutter/performance.md +119 -0
- package/templates/guides/flutter/security.md +120 -0
- package/templates/guides/flutter/state-management.md +144 -0
- package/templates/guides/flutter/testing.md +155 -0
- package/templates/guides/git-worktree-workflow/README.md +138 -0
- package/templates/guides/go-backend/index.yaml +26 -0
- package/templates/guides/go-backend/project-layout.md +243 -0
- package/templates/guides/go-backend/uber-style.md +212 -0
- package/templates/guides/golang/concurrency.md +282 -0
- package/templates/guides/golang/effective-go.md +309 -0
- package/templates/guides/golang/error-handling.md +250 -0
- package/templates/guides/golang/index.yaml +27 -0
- package/templates/guides/hook-data-flow/README.md +135 -0
- package/templates/guides/iceberg/README.md +49 -0
- package/templates/guides/impeccable-design/color-and-contrast.md +278 -0
- package/templates/guides/impeccable-design/index.yaml +12 -0
- package/templates/guides/impeccable-design/motion-design.md +390 -0
- package/templates/guides/impeccable-design/typography.md +386 -0
- package/templates/guides/impeccable-design/ux-writing.md +400 -0
- package/templates/guides/index.yaml +265 -0
- package/templates/guides/java21/index.yaml +29 -0
- package/templates/guides/java21/java-style-guide.md +248 -0
- package/templates/guides/java21/modern-java21.md +303 -0
- package/templates/guides/kafka/README.md +32 -0
- package/templates/guides/kotlin/coding-conventions.md +247 -0
- package/templates/guides/kotlin/idioms.md +234 -0
- package/templates/guides/kotlin/index.yaml +26 -0
- package/templates/guides/multi-model-routing/README.md +101 -0
- package/templates/guides/multi-provider-exec/README.md +83 -0
- package/templates/guides/postgres/README.md +58 -0
- package/templates/guides/python/index.yaml +26 -0
- package/templates/guides/python/pep8-style-guide.md +202 -0
- package/templates/guides/python/zen-of-python.md +79 -0
- package/templates/guides/redis/README.md +50 -0
- package/templates/guides/rust/error-handling.md +262 -0
- package/templates/guides/rust/index.yaml +26 -0
- package/templates/guides/rust/ownership.md +180 -0
- package/templates/guides/skill-bundle-design/README.md +106 -0
- package/templates/guides/slack-cli/README.md +145 -0
- package/templates/guides/snowflake/README.md +32 -0
- package/templates/guides/spark/README.md +32 -0
- package/templates/guides/springboot/best-practices.md +361 -0
- package/templates/guides/springboot/index.yaml +22 -0
- package/templates/guides/supabase-postgres/README.md +32 -0
- package/templates/guides/supabase-postgres/index.yaml +19 -0
- package/templates/guides/typescript/advanced-types.md +225 -0
- package/templates/guides/typescript/index.yaml +26 -0
- package/templates/guides/typescript/type-system.md +219 -0
- package/templates/guides/web-design/accessibility.md +66 -0
- package/templates/guides/web-design/index.yaml +20 -0
- package/templates/guides/web-design/performance.md +102 -0
- package/templates/guides/web-scraping/README.md +926 -0
- package/templates/guides/web-scraping/index.yaml +19 -0
- package/templates/guides/worktree-lifecycle/README.md +104 -0
- package/templates/index.yaml +18 -0
- package/templates/manifest.json +49 -0
- package/templates/workflows/auto-dev.yaml +46 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# Docker Compose Best Practices
|
|
2
|
+
|
|
3
|
+
> Source: https://docs.docker.com/compose/compose-file/best-practices/
|
|
4
|
+
|
|
5
|
+
## File Structure
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
version: "3.8"
|
|
9
|
+
|
|
10
|
+
services:
|
|
11
|
+
# Application services
|
|
12
|
+
app:
|
|
13
|
+
...
|
|
14
|
+
|
|
15
|
+
# Infrastructure services
|
|
16
|
+
db:
|
|
17
|
+
...
|
|
18
|
+
|
|
19
|
+
volumes:
|
|
20
|
+
# Named volumes
|
|
21
|
+
|
|
22
|
+
networks:
|
|
23
|
+
# Custom networks
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Service Configuration
|
|
27
|
+
|
|
28
|
+
### Build Configuration
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
services:
|
|
32
|
+
app:
|
|
33
|
+
build:
|
|
34
|
+
context: .
|
|
35
|
+
dockerfile: Dockerfile
|
|
36
|
+
target: production
|
|
37
|
+
args:
|
|
38
|
+
- NODE_ENV=production
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Environment Variables
|
|
42
|
+
|
|
43
|
+
```yaml
|
|
44
|
+
services:
|
|
45
|
+
app:
|
|
46
|
+
# From file
|
|
47
|
+
env_file:
|
|
48
|
+
- .env
|
|
49
|
+
- .env.local
|
|
50
|
+
|
|
51
|
+
# Inline
|
|
52
|
+
environment:
|
|
53
|
+
- DATABASE_URL=${DATABASE_URL}
|
|
54
|
+
- NODE_ENV=production
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Dependencies
|
|
58
|
+
|
|
59
|
+
```yaml
|
|
60
|
+
services:
|
|
61
|
+
app:
|
|
62
|
+
depends_on:
|
|
63
|
+
db:
|
|
64
|
+
condition: service_healthy
|
|
65
|
+
redis:
|
|
66
|
+
condition: service_started
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Health Checks
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
services:
|
|
73
|
+
db:
|
|
74
|
+
image: postgres:16
|
|
75
|
+
healthcheck:
|
|
76
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
77
|
+
interval: 10s
|
|
78
|
+
timeout: 5s
|
|
79
|
+
retries: 5
|
|
80
|
+
start_period: 30s
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Resource Limits
|
|
84
|
+
|
|
85
|
+
```yaml
|
|
86
|
+
services:
|
|
87
|
+
app:
|
|
88
|
+
deploy:
|
|
89
|
+
resources:
|
|
90
|
+
limits:
|
|
91
|
+
cpus: "1"
|
|
92
|
+
memory: 512M
|
|
93
|
+
reservations:
|
|
94
|
+
cpus: "0.5"
|
|
95
|
+
memory: 256M
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Volumes
|
|
99
|
+
|
|
100
|
+
### Named Volumes
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
services:
|
|
104
|
+
db:
|
|
105
|
+
volumes:
|
|
106
|
+
- postgres_data:/var/lib/postgresql/data
|
|
107
|
+
|
|
108
|
+
volumes:
|
|
109
|
+
postgres_data:
|
|
110
|
+
driver: local
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Bind Mounts (Development)
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
services:
|
|
117
|
+
app:
|
|
118
|
+
volumes:
|
|
119
|
+
- ./src:/app/src:ro
|
|
120
|
+
- ./config:/app/config:ro
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Networks
|
|
124
|
+
|
|
125
|
+
### Custom Networks
|
|
126
|
+
|
|
127
|
+
```yaml
|
|
128
|
+
services:
|
|
129
|
+
app:
|
|
130
|
+
networks:
|
|
131
|
+
- frontend
|
|
132
|
+
- backend
|
|
133
|
+
|
|
134
|
+
db:
|
|
135
|
+
networks:
|
|
136
|
+
- backend
|
|
137
|
+
|
|
138
|
+
networks:
|
|
139
|
+
frontend:
|
|
140
|
+
backend:
|
|
141
|
+
internal: true
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Multiple Environments
|
|
145
|
+
|
|
146
|
+
### Override Files
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# Base configuration
|
|
150
|
+
docker-compose.yml
|
|
151
|
+
|
|
152
|
+
# Development overrides
|
|
153
|
+
docker-compose.override.yml
|
|
154
|
+
|
|
155
|
+
# Production overrides
|
|
156
|
+
docker-compose.prod.yml
|
|
157
|
+
|
|
158
|
+
# Usage
|
|
159
|
+
docker compose -f docker-compose.yml -f docker-compose.prod.yml up
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Example: Production
|
|
163
|
+
|
|
164
|
+
```yaml
|
|
165
|
+
# docker-compose.prod.yml
|
|
166
|
+
services:
|
|
167
|
+
app:
|
|
168
|
+
build:
|
|
169
|
+
target: production
|
|
170
|
+
restart: always
|
|
171
|
+
deploy:
|
|
172
|
+
replicas: 3
|
|
173
|
+
resources:
|
|
174
|
+
limits:
|
|
175
|
+
cpus: "1"
|
|
176
|
+
memory: 1G
|
|
177
|
+
|
|
178
|
+
db:
|
|
179
|
+
restart: always
|
|
180
|
+
volumes:
|
|
181
|
+
- /mnt/data/postgres:/var/lib/postgresql/data
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Example: Development
|
|
185
|
+
|
|
186
|
+
```yaml
|
|
187
|
+
# docker-compose.override.yml
|
|
188
|
+
services:
|
|
189
|
+
app:
|
|
190
|
+
build:
|
|
191
|
+
target: development
|
|
192
|
+
volumes:
|
|
193
|
+
- ./src:/app/src
|
|
194
|
+
environment:
|
|
195
|
+
- DEBUG=true
|
|
196
|
+
ports:
|
|
197
|
+
- "3000:3000"
|
|
198
|
+
- "9229:9229" # debugger
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Complete Example
|
|
202
|
+
|
|
203
|
+
```yaml
|
|
204
|
+
version: "3.8"
|
|
205
|
+
|
|
206
|
+
services:
|
|
207
|
+
app:
|
|
208
|
+
build:
|
|
209
|
+
context: .
|
|
210
|
+
target: production
|
|
211
|
+
restart: unless-stopped
|
|
212
|
+
environment:
|
|
213
|
+
- DATABASE_URL=postgresql://user:pass@db:5432/myapp
|
|
214
|
+
- REDIS_URL=redis://redis:6379
|
|
215
|
+
ports:
|
|
216
|
+
- "8080:8080"
|
|
217
|
+
depends_on:
|
|
218
|
+
db:
|
|
219
|
+
condition: service_healthy
|
|
220
|
+
redis:
|
|
221
|
+
condition: service_started
|
|
222
|
+
healthcheck:
|
|
223
|
+
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
|
224
|
+
interval: 30s
|
|
225
|
+
timeout: 10s
|
|
226
|
+
retries: 3
|
|
227
|
+
deploy:
|
|
228
|
+
resources:
|
|
229
|
+
limits:
|
|
230
|
+
cpus: "2"
|
|
231
|
+
memory: 1G
|
|
232
|
+
networks:
|
|
233
|
+
- frontend
|
|
234
|
+
- backend
|
|
235
|
+
|
|
236
|
+
db:
|
|
237
|
+
image: postgres:16-alpine
|
|
238
|
+
restart: unless-stopped
|
|
239
|
+
environment:
|
|
240
|
+
- POSTGRES_USER=user
|
|
241
|
+
- POSTGRES_PASSWORD=pass
|
|
242
|
+
- POSTGRES_DB=myapp
|
|
243
|
+
volumes:
|
|
244
|
+
- postgres_data:/var/lib/postgresql/data
|
|
245
|
+
healthcheck:
|
|
246
|
+
test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
|
|
247
|
+
interval: 10s
|
|
248
|
+
timeout: 5s
|
|
249
|
+
retries: 5
|
|
250
|
+
networks:
|
|
251
|
+
- backend
|
|
252
|
+
|
|
253
|
+
redis:
|
|
254
|
+
image: redis:7-alpine
|
|
255
|
+
restart: unless-stopped
|
|
256
|
+
command: redis-server --appendonly yes
|
|
257
|
+
volumes:
|
|
258
|
+
- redis_data:/data
|
|
259
|
+
networks:
|
|
260
|
+
- backend
|
|
261
|
+
|
|
262
|
+
nginx:
|
|
263
|
+
image: nginx:1.25-alpine
|
|
264
|
+
restart: unless-stopped
|
|
265
|
+
ports:
|
|
266
|
+
- "80:80"
|
|
267
|
+
- "443:443"
|
|
268
|
+
volumes:
|
|
269
|
+
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
|
270
|
+
- ./certs:/etc/nginx/certs:ro
|
|
271
|
+
depends_on:
|
|
272
|
+
- app
|
|
273
|
+
networks:
|
|
274
|
+
- frontend
|
|
275
|
+
|
|
276
|
+
volumes:
|
|
277
|
+
postgres_data:
|
|
278
|
+
redis_data:
|
|
279
|
+
|
|
280
|
+
networks:
|
|
281
|
+
frontend:
|
|
282
|
+
backend:
|
|
283
|
+
internal: true
|
|
284
|
+
```
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# Dockerfile Best Practices
|
|
2
|
+
|
|
3
|
+
> Source: https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
|
|
4
|
+
|
|
5
|
+
## General Guidelines
|
|
6
|
+
|
|
7
|
+
### Create Ephemeral Containers
|
|
8
|
+
|
|
9
|
+
Containers should be ephemeral - can be stopped, destroyed, and rebuilt with minimal setup.
|
|
10
|
+
|
|
11
|
+
### Understand Build Context
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Entire directory sent to daemon
|
|
15
|
+
docker build .
|
|
16
|
+
|
|
17
|
+
# Use .dockerignore to exclude files
|
|
18
|
+
# .dockerignore
|
|
19
|
+
.git
|
|
20
|
+
node_modules
|
|
21
|
+
*.md
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Use Multi-Stage Builds
|
|
25
|
+
|
|
26
|
+
```dockerfile
|
|
27
|
+
# Build stage
|
|
28
|
+
FROM golang:1.21 AS builder
|
|
29
|
+
WORKDIR /app
|
|
30
|
+
COPY . .
|
|
31
|
+
RUN go build -o myapp
|
|
32
|
+
|
|
33
|
+
# Runtime stage
|
|
34
|
+
FROM alpine:3.19
|
|
35
|
+
COPY --from=builder /app/myapp /usr/local/bin/
|
|
36
|
+
CMD ["myapp"]
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Dockerfile Instructions
|
|
40
|
+
|
|
41
|
+
### FROM
|
|
42
|
+
|
|
43
|
+
```dockerfile
|
|
44
|
+
# Pin versions
|
|
45
|
+
FROM ubuntu:22.04
|
|
46
|
+
|
|
47
|
+
# Use digest for reproducibility
|
|
48
|
+
FROM node:20@sha256:abc123...
|
|
49
|
+
|
|
50
|
+
# Use official images
|
|
51
|
+
FROM python:3.12-slim
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### RUN
|
|
55
|
+
|
|
56
|
+
```dockerfile
|
|
57
|
+
# Combine commands
|
|
58
|
+
RUN apt-get update && apt-get install -y \
|
|
59
|
+
curl \
|
|
60
|
+
git \
|
|
61
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
62
|
+
|
|
63
|
+
# Use BuildKit cache
|
|
64
|
+
RUN --mount=type=cache,target=/root/.cache/pip \
|
|
65
|
+
pip install -r requirements.txt
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### CMD vs ENTRYPOINT
|
|
69
|
+
|
|
70
|
+
```dockerfile
|
|
71
|
+
# CMD: Default command (can be overridden)
|
|
72
|
+
CMD ["python", "app.py"]
|
|
73
|
+
|
|
74
|
+
# ENTRYPOINT: Fixed command
|
|
75
|
+
ENTRYPOINT ["python"]
|
|
76
|
+
CMD ["app.py"]
|
|
77
|
+
|
|
78
|
+
# Combined
|
|
79
|
+
ENTRYPOINT ["/docker-entrypoint.sh"]
|
|
80
|
+
CMD ["postgres"]
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### COPY vs ADD
|
|
84
|
+
|
|
85
|
+
```dockerfile
|
|
86
|
+
# Prefer COPY (more explicit)
|
|
87
|
+
COPY requirements.txt .
|
|
88
|
+
|
|
89
|
+
# ADD only for tar extraction or URLs
|
|
90
|
+
ADD archive.tar.gz /app/
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### EXPOSE
|
|
94
|
+
|
|
95
|
+
```dockerfile
|
|
96
|
+
# Documentation only
|
|
97
|
+
EXPOSE 8080
|
|
98
|
+
EXPOSE 443/tcp
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### ENV
|
|
102
|
+
|
|
103
|
+
```dockerfile
|
|
104
|
+
ENV APP_HOME=/app \
|
|
105
|
+
PATH=$APP_HOME/bin:$PATH
|
|
106
|
+
|
|
107
|
+
WORKDIR $APP_HOME
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### VOLUME
|
|
111
|
+
|
|
112
|
+
```dockerfile
|
|
113
|
+
# Named mount point
|
|
114
|
+
VOLUME /data
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### USER
|
|
118
|
+
|
|
119
|
+
```dockerfile
|
|
120
|
+
# Create non-root user
|
|
121
|
+
RUN groupadd -r app && useradd -r -g app app
|
|
122
|
+
USER app
|
|
123
|
+
|
|
124
|
+
# Or use existing
|
|
125
|
+
USER nobody
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### WORKDIR
|
|
129
|
+
|
|
130
|
+
```dockerfile
|
|
131
|
+
# Always use absolute paths
|
|
132
|
+
WORKDIR /app
|
|
133
|
+
WORKDIR /app/src
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### HEALTHCHECK
|
|
137
|
+
|
|
138
|
+
```dockerfile
|
|
139
|
+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
140
|
+
CMD curl -f http://localhost/ || exit 1
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Layer Optimization
|
|
144
|
+
|
|
145
|
+
### Order Matters
|
|
146
|
+
|
|
147
|
+
```dockerfile
|
|
148
|
+
# 1. Install dependencies (changes rarely)
|
|
149
|
+
COPY package.json package-lock.json ./
|
|
150
|
+
RUN npm ci
|
|
151
|
+
|
|
152
|
+
# 2. Copy source (changes often)
|
|
153
|
+
COPY . .
|
|
154
|
+
|
|
155
|
+
# 3. Build
|
|
156
|
+
RUN npm run build
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Combine RUN Commands
|
|
160
|
+
|
|
161
|
+
```dockerfile
|
|
162
|
+
# Good: Single layer
|
|
163
|
+
RUN apt-get update && \
|
|
164
|
+
apt-get install -y python3 && \
|
|
165
|
+
rm -rf /var/lib/apt/lists/*
|
|
166
|
+
|
|
167
|
+
# Bad: Multiple layers
|
|
168
|
+
RUN apt-get update
|
|
169
|
+
RUN apt-get install -y python3
|
|
170
|
+
RUN rm -rf /var/lib/apt/lists/*
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Security Best Practices
|
|
174
|
+
|
|
175
|
+
### Don't Run as Root
|
|
176
|
+
|
|
177
|
+
```dockerfile
|
|
178
|
+
FROM node:20
|
|
179
|
+
|
|
180
|
+
RUN groupadd -r nodejs && useradd -r -g nodejs nodejs
|
|
181
|
+
USER nodejs
|
|
182
|
+
|
|
183
|
+
COPY --chown=nodejs:nodejs . .
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Don't Store Secrets
|
|
187
|
+
|
|
188
|
+
```dockerfile
|
|
189
|
+
# Bad: Secret in image
|
|
190
|
+
ENV API_KEY=secret123
|
|
191
|
+
|
|
192
|
+
# Good: Pass at runtime
|
|
193
|
+
# docker run -e API_KEY=secret123 myapp
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Use Official Images
|
|
197
|
+
|
|
198
|
+
```dockerfile
|
|
199
|
+
# Official and verified
|
|
200
|
+
FROM nginx:1.25
|
|
201
|
+
FROM postgres:16
|
|
202
|
+
|
|
203
|
+
# Minimal images
|
|
204
|
+
FROM gcr.io/distroless/static
|
|
205
|
+
FROM alpine:3.19
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Example Dockerfiles
|
|
209
|
+
|
|
210
|
+
### Node.js
|
|
211
|
+
|
|
212
|
+
```dockerfile
|
|
213
|
+
FROM node:20-slim AS builder
|
|
214
|
+
WORKDIR /app
|
|
215
|
+
COPY package*.json ./
|
|
216
|
+
RUN npm ci
|
|
217
|
+
COPY . .
|
|
218
|
+
RUN npm run build
|
|
219
|
+
|
|
220
|
+
FROM node:20-slim
|
|
221
|
+
WORKDIR /app
|
|
222
|
+
COPY --from=builder /app/dist ./dist
|
|
223
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
224
|
+
USER node
|
|
225
|
+
EXPOSE 3000
|
|
226
|
+
CMD ["node", "dist/server.js"]
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Python
|
|
230
|
+
|
|
231
|
+
```dockerfile
|
|
232
|
+
FROM python:3.12-slim AS builder
|
|
233
|
+
WORKDIR /app
|
|
234
|
+
RUN pip install --user pipenv
|
|
235
|
+
COPY Pipfile Pipfile.lock ./
|
|
236
|
+
RUN pipenv install --system --deploy
|
|
237
|
+
|
|
238
|
+
FROM python:3.12-slim
|
|
239
|
+
WORKDIR /app
|
|
240
|
+
COPY --from=builder /root/.local /root/.local
|
|
241
|
+
COPY . .
|
|
242
|
+
ENV PATH=/root/.local/bin:$PATH
|
|
243
|
+
USER nobody
|
|
244
|
+
EXPOSE 8000
|
|
245
|
+
CMD ["gunicorn", "-b", "0.0.0.0:8000", "app:app"]
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Go
|
|
249
|
+
|
|
250
|
+
```dockerfile
|
|
251
|
+
FROM golang:1.21-alpine AS builder
|
|
252
|
+
WORKDIR /app
|
|
253
|
+
COPY go.mod go.sum ./
|
|
254
|
+
RUN go mod download
|
|
255
|
+
COPY . .
|
|
256
|
+
RUN CGO_ENABLED=0 GOOS=linux go build -o /app/server
|
|
257
|
+
|
|
258
|
+
FROM scratch
|
|
259
|
+
COPY --from=builder /app/server /server
|
|
260
|
+
EXPOSE 8080
|
|
261
|
+
ENTRYPOINT ["/server"]
|
|
262
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Docker Guide
|
|
2
|
+
|
|
3
|
+
metadata:
|
|
4
|
+
name: docker
|
|
5
|
+
description: Docker containerization reference documentation
|
|
6
|
+
|
|
7
|
+
source:
|
|
8
|
+
type: external
|
|
9
|
+
origin: docker.com
|
|
10
|
+
urls:
|
|
11
|
+
- https://docs.docker.com/
|
|
12
|
+
- https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
|
|
13
|
+
- https://docs.docker.com/compose/compose-file/best-practices/
|
|
14
|
+
last_fetched: "2026-01-22"
|
|
15
|
+
|
|
16
|
+
documents:
|
|
17
|
+
- name: dockerfile-best-practices
|
|
18
|
+
path: ./dockerfile-best-practices.md
|
|
19
|
+
description: Dockerfile best practices
|
|
20
|
+
|
|
21
|
+
- name: compose-best-practices
|
|
22
|
+
path: ./compose-best-practices.md
|
|
23
|
+
description: Docker Compose best practices
|
|
24
|
+
|
|
25
|
+
used_by:
|
|
26
|
+
- infra-docker-expert
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Drizzle ORM: sql Template Literal Pitfalls
|
|
2
|
+
|
|
3
|
+
## The Bug: Column References in Subqueries
|
|
4
|
+
|
|
5
|
+
When using Drizzle ORM's `sql` template literals, `${table.column}` generates a **bare column name without the table qualifier**. This causes silent semantic errors inside aliased subqueries.
|
|
6
|
+
|
|
7
|
+
### Symptom
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// Code
|
|
11
|
+
sql`SELECT ${agentInvocations.errorSummary} as sub_es
|
|
12
|
+
FROM ${agentInvocations} AS ai2
|
|
13
|
+
WHERE ai2.agent_type = ${agentInvocations.agentType}`
|
|
14
|
+
|
|
15
|
+
// Generated SQL (WRONG)
|
|
16
|
+
SELECT "error_summary" as sub_es
|
|
17
|
+
FROM "agent_invocations" AS ai2
|
|
18
|
+
WHERE ai2.agent_type = "agent_type" -- "agent_type" becomes a literal string, always true!
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`${agentInvocations.agentType}` expands to the **quoted column name** `"agent_type"` — not the value of the column. The `WHERE` clause compares `ai2.agent_type = "agent_type"`, which SQLite treats as a string literal match — always true for rows where `agent_type` equals the string `"agent_type"`.
|
|
22
|
+
|
|
23
|
+
### Why Reviewers Miss It
|
|
24
|
+
|
|
25
|
+
- The code *looks* correct — you see `agentInvocations.agentType` and assume it's a column reference.
|
|
26
|
+
- Drizzle's `${table.column}` syntax works fine in top-level queries where table context is unambiguous.
|
|
27
|
+
- The bug only manifests inside subqueries with table aliases (`AS ai2`) — normal queries pass.
|
|
28
|
+
- No compile-time error; the SQL executes but returns wrong results.
|
|
29
|
+
|
|
30
|
+
## The Fix: Raw SQL for Subquery Internal References
|
|
31
|
+
|
|
32
|
+
Use raw SQL strings for column references *inside* aliased subqueries. Reserve `${table.column}` only for Drizzle's top-level query builder where it resolves correctly.
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// CORRECT: raw SQL column references inside aliased subquery
|
|
36
|
+
sql`SELECT ai2.error_summary as sub_es
|
|
37
|
+
FROM ${agentInvocations} AS ai2
|
|
38
|
+
WHERE ai2.agent_type = ${agentInvocations}.agent_type`
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Note: `${agentInvocations}` (the table object itself) still correctly expands to the table name and is safe to use for the `FROM` clause. Only *column* references inside subqueries must be written as raw SQL.
|
|
42
|
+
|
|
43
|
+
## Decision Table
|
|
44
|
+
|
|
45
|
+
| Context | Pattern | Safe? |
|
|
46
|
+
|---------|---------|-------|
|
|
47
|
+
| Top-level `FROM` clause | `${table}` | ✅ Yes |
|
|
48
|
+
| Top-level `WHERE` with parameterized value | `${value}` | ✅ Yes (auto-parameterized) |
|
|
49
|
+
| Top-level `SELECT` column | `${table.column}` | ✅ Yes |
|
|
50
|
+
| Inside aliased subquery `SELECT` | `${table.column}` | ❌ No — bare column name |
|
|
51
|
+
| Inside aliased subquery `WHERE` comparison | `${table.column}` | ❌ No — string literal, not column ref |
|
|
52
|
+
| Inside aliased subquery (fixed) | `alias.column_name` | ✅ Yes |
|
|
53
|
+
|
|
54
|
+
## Verification
|
|
55
|
+
|
|
56
|
+
Use `.toSQL()` to inspect generated SQL before running:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
const query = sql`SELECT ${agentInvocations.errorSummary} as sub_es
|
|
60
|
+
FROM ${agentInvocations} AS ai2
|
|
61
|
+
WHERE ai2.agent_type = ${agentInvocations.agentType}`
|
|
62
|
+
|
|
63
|
+
console.log(query.toSQL())
|
|
64
|
+
// Reveals the bare column names — catches the bug before runtime
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Key Takeaway
|
|
68
|
+
|
|
69
|
+
> **`${table.column}` in Drizzle's `sql` template generates a bare column identifier, not a qualified reference.** Inside aliased subqueries, this breaks table-qualified comparisons. Always use raw `alias.column_name` strings inside subquery bodies.
|