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,334 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: django-best-practices
|
|
3
|
+
description: Django patterns for production-ready Python web applications
|
|
4
|
+
scope: core
|
|
5
|
+
user-invocable: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Apply Django patterns for building production-ready, secure, and maintainable Python web applications.
|
|
11
|
+
|
|
12
|
+
## Rules
|
|
13
|
+
|
|
14
|
+
### 1. Project Structure
|
|
15
|
+
|
|
16
|
+
```yaml
|
|
17
|
+
structure:
|
|
18
|
+
settings_split: true
|
|
19
|
+
layout: "config/{settings/{base,development,production}.py,urls.py,wsgi.py} + apps/{core/,users/,<feature>/} + templates/ + static/ + requirements/{base,development,production}.txt"
|
|
20
|
+
|
|
21
|
+
app_module_contents:
|
|
22
|
+
models.py: Database models
|
|
23
|
+
views.py: Request handlers
|
|
24
|
+
urls.py: URL patterns (with app_name)
|
|
25
|
+
serializers.py: DRF serializers (if API)
|
|
26
|
+
forms.py: Django forms
|
|
27
|
+
admin.py: Admin customization
|
|
28
|
+
services.py: Business logic layer
|
|
29
|
+
managers.py: Custom model managers
|
|
30
|
+
signals.py: Django signals (use sparingly)
|
|
31
|
+
tests/: Test suite (mirror app structure)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Reference: guides/django-best-practices/README.md
|
|
35
|
+
|
|
36
|
+
### 2. Models Best Practices
|
|
37
|
+
|
|
38
|
+
```yaml
|
|
39
|
+
custom_user_model:
|
|
40
|
+
rule: ALWAYS create a custom User model, even if identical to default
|
|
41
|
+
location: apps/users/models.py
|
|
42
|
+
reason: Impossible to swap default User model mid-project
|
|
43
|
+
pattern: "Extend AbstractUser, set AUTH_USER_MODEL in settings"
|
|
44
|
+
|
|
45
|
+
primary_key:
|
|
46
|
+
default: BigAutoField
|
|
47
|
+
settings: DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
|
48
|
+
|
|
49
|
+
model_meta:
|
|
50
|
+
required:
|
|
51
|
+
- __str__: human-readable representation
|
|
52
|
+
- Meta.ordering: consistent default ordering
|
|
53
|
+
- Meta.verbose_name: singular display name
|
|
54
|
+
- Meta.verbose_name_plural: plural display name
|
|
55
|
+
|
|
56
|
+
query_optimization:
|
|
57
|
+
foreign_key: select_related() # Single SQL JOIN
|
|
58
|
+
many_to_many: prefetch_related() # Separate query + Python join
|
|
59
|
+
partial_fields: only() / defer() # Load subset of fields
|
|
60
|
+
aggregations: F() and Q() objects for complex expressions
|
|
61
|
+
bulk_ops:
|
|
62
|
+
create: bulk_create(objs, batch_size=1000)
|
|
63
|
+
update: bulk_update(objs, fields, batch_size=1000)
|
|
64
|
+
|
|
65
|
+
indexing:
|
|
66
|
+
- Frequently filtered fields: db_index=True
|
|
67
|
+
- Frequently ordered fields: Meta.ordering fields
|
|
68
|
+
- Multi-column: Meta.indexes with models.Index
|
|
69
|
+
- Unique together: Meta.unique_together or UniqueConstraint
|
|
70
|
+
|
|
71
|
+
constraints:
|
|
72
|
+
use: Meta.constraints for database-level enforcement
|
|
73
|
+
types: "UniqueConstraint, CheckConstraint"
|
|
74
|
+
|
|
75
|
+
soft_delete:
|
|
76
|
+
pattern: is_active = models.BooleanField(default=True)
|
|
77
|
+
manager: Override default manager to filter is_active=True
|
|
78
|
+
|
|
79
|
+
custom_managers:
|
|
80
|
+
rule: Use managers for reusable querysets
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Reference: guides/django-best-practices/README.md
|
|
84
|
+
|
|
85
|
+
### 3. Views Best Practices
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
cbv_vs_fbv:
|
|
89
|
+
cbv: Standard CRUD, predictable patterns (ListView, DetailView, etc.)
|
|
90
|
+
fbv: Complex custom logic, non-standard workflows
|
|
91
|
+
|
|
92
|
+
thin_views:
|
|
93
|
+
rule: Keep views thin — delegate business logic to services/models
|
|
94
|
+
|
|
95
|
+
shortcuts:
|
|
96
|
+
- get_object_or_404(Model, pk=pk): Returns 404 instead of 500
|
|
97
|
+
- get_list_or_404(Model, **kwargs): 404 if empty list
|
|
98
|
+
|
|
99
|
+
mixins:
|
|
100
|
+
authentication: LoginRequiredMixin
|
|
101
|
+
permissions: PermissionRequiredMixin
|
|
102
|
+
user_pass: UserPassesTestMixin
|
|
103
|
+
|
|
104
|
+
status_codes:
|
|
105
|
+
200: OK (default for success)
|
|
106
|
+
201: Created (after successful creation)
|
|
107
|
+
302: Redirect (after POST success — PRG pattern)
|
|
108
|
+
400: Bad Request (validation error)
|
|
109
|
+
403: Forbidden (permission denied)
|
|
110
|
+
404: Not Found
|
|
111
|
+
405: Method Not Allowed
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 4. URL Patterns
|
|
115
|
+
|
|
116
|
+
```yaml
|
|
117
|
+
namespacing:
|
|
118
|
+
app_name: Required in every app's urls.py
|
|
119
|
+
usage: "reverse('app_name:url_name') or {% url 'app_name:url_name' %}"
|
|
120
|
+
|
|
121
|
+
syntax:
|
|
122
|
+
prefer: path() over re_path() for clarity
|
|
123
|
+
use_re_path: Only for complex regex patterns
|
|
124
|
+
|
|
125
|
+
naming:
|
|
126
|
+
rule: Name ALL URL patterns
|
|
127
|
+
convention: "{resource}-{action} (e.g., article-list, article-detail)"
|
|
128
|
+
|
|
129
|
+
inclusion:
|
|
130
|
+
root_urls: Use include() for app-level URLs
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Reference: guides/django-best-practices/README.md
|
|
134
|
+
|
|
135
|
+
### 5. Forms & Validation
|
|
136
|
+
|
|
137
|
+
```yaml
|
|
138
|
+
model_forms:
|
|
139
|
+
rule: Use ModelForm when form maps to a model
|
|
140
|
+
fields: "Explicitly list fields (never use fields = '__all__')"
|
|
141
|
+
|
|
142
|
+
validation:
|
|
143
|
+
field_level: clean_<field>() method
|
|
144
|
+
cross_field: clean() method
|
|
145
|
+
built_in: Use Django validators (MaxValueValidator, RegexValidator, etc.)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Reference: guides/django-best-practices/README.md
|
|
149
|
+
|
|
150
|
+
### 6. Security
|
|
151
|
+
|
|
152
|
+
```yaml
|
|
153
|
+
environment:
|
|
154
|
+
SECRET_KEY: Never hardcode — read from environment variable
|
|
155
|
+
DEBUG: False in production (MUST)
|
|
156
|
+
ALLOWED_HOSTS: Explicitly set in production (MUST)
|
|
157
|
+
|
|
158
|
+
https:
|
|
159
|
+
SECURE_SSL_REDIRECT: true
|
|
160
|
+
SESSION_COOKIE_SECURE: true
|
|
161
|
+
CSRF_COOKIE_SECURE: true
|
|
162
|
+
SECURE_HSTS_SECONDS: 3600 # Start small, increase to 31536000
|
|
163
|
+
SECURE_HSTS_INCLUDE_SUBDOMAINS: true
|
|
164
|
+
|
|
165
|
+
clickjacking:
|
|
166
|
+
X_FRAME_OPTIONS: DENY
|
|
167
|
+
|
|
168
|
+
content_type:
|
|
169
|
+
SECURE_CONTENT_TYPE_NOSNIFF: true
|
|
170
|
+
|
|
171
|
+
csrf:
|
|
172
|
+
rule: Enabled by default via CsrfViewMiddleware — do NOT disable
|
|
173
|
+
|
|
174
|
+
sql_injection:
|
|
175
|
+
rule: Use ORM, avoid raw SQL; if needed, use parameterized queries
|
|
176
|
+
|
|
177
|
+
xss:
|
|
178
|
+
rule: Templates auto-escape by default — never use |safe with user content
|
|
179
|
+
|
|
180
|
+
deployment_check:
|
|
181
|
+
command: python manage.py check --deploy
|
|
182
|
+
run: Before every production deployment
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### 7. Testing
|
|
186
|
+
|
|
187
|
+
```yaml
|
|
188
|
+
framework:
|
|
189
|
+
preferred: pytest-django (over unittest)
|
|
190
|
+
config: pytest.ini or pyproject.toml with [tool.pytest.ini_options]
|
|
191
|
+
|
|
192
|
+
test_classes:
|
|
193
|
+
database: TestCase (wraps each test in transaction)
|
|
194
|
+
no_database: SimpleTestCase (faster)
|
|
195
|
+
live_server: LiveServerTestCase (for Selenium)
|
|
196
|
+
|
|
197
|
+
test_data:
|
|
198
|
+
preferred: factory_boy or model_bakery
|
|
199
|
+
avoid: fixtures (hard to maintain, slow)
|
|
200
|
+
|
|
201
|
+
request_testing:
|
|
202
|
+
Client: Full request/response cycle (preferred for views)
|
|
203
|
+
RequestFactory: Faster, no middleware (for unit testing views)
|
|
204
|
+
|
|
205
|
+
settings_override:
|
|
206
|
+
decorator: '@override_settings(...)'
|
|
207
|
+
|
|
208
|
+
coverage:
|
|
209
|
+
target: 80%+
|
|
210
|
+
exclude: migrations, admin, settings
|
|
211
|
+
|
|
212
|
+
structure:
|
|
213
|
+
mirror_app: tests/test_models.py, tests/test_views.py, tests/test_forms.py
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Reference: guides/django-best-practices/README.md
|
|
217
|
+
|
|
218
|
+
### 8. Performance
|
|
219
|
+
|
|
220
|
+
```yaml
|
|
221
|
+
n_plus_1_prevention:
|
|
222
|
+
check: Use django-debug-toolbar in development
|
|
223
|
+
fix_fk: select_related('author', 'category')
|
|
224
|
+
fix_m2m: prefetch_related('tags', 'comments')
|
|
225
|
+
complex: Prefetch object with custom queryset
|
|
226
|
+
|
|
227
|
+
partial_loading:
|
|
228
|
+
only: "only('id', 'title', 'created_at') — Load only these fields"
|
|
229
|
+
defer: "defer('body', 'metadata') — Load all except these"
|
|
230
|
+
values: "values('id', 'title') — Returns dicts (no ORM overhead)"
|
|
231
|
+
values_list: "values_list('id', flat=True) — Returns flat list"
|
|
232
|
+
|
|
233
|
+
caching:
|
|
234
|
+
backend: Redis (preferred), Memcached
|
|
235
|
+
view_cache: "'@cache_page(60 * 15)' decorator"
|
|
236
|
+
template_cache: "'{% cache 500 sidebar %}' template tag"
|
|
237
|
+
low_level: cache.get/set/delete for fine-grained control
|
|
238
|
+
|
|
239
|
+
pagination:
|
|
240
|
+
list_views: Always paginate large querysets
|
|
241
|
+
page_size: Set reasonable default (20-50 items)
|
|
242
|
+
drf: PageNumberPagination or CursorPagination
|
|
243
|
+
|
|
244
|
+
bulk_operations:
|
|
245
|
+
create: "bulk_create(articles, batch_size=1000)"
|
|
246
|
+
update: "bulk_update(articles, ['status'], batch_size=1000)"
|
|
247
|
+
avoid: Loops calling .save() on many objects
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### 9. Django REST Framework (DRF)
|
|
251
|
+
|
|
252
|
+
```yaml
|
|
253
|
+
serializers:
|
|
254
|
+
standard_crud: ModelSerializer
|
|
255
|
+
read_only: Use SerializerMethodField for computed values
|
|
256
|
+
write_validation: validate_<field>() and validate() methods
|
|
257
|
+
|
|
258
|
+
viewsets:
|
|
259
|
+
standard: ModelViewSet for full CRUD
|
|
260
|
+
custom: ViewSet with explicit action methods
|
|
261
|
+
routers: DefaultRouter or SimpleRouter for URL generation
|
|
262
|
+
|
|
263
|
+
authentication:
|
|
264
|
+
jwt: djangorestframework-simplejwt (recommended)
|
|
265
|
+
token: DRF built-in TokenAuthentication
|
|
266
|
+
session: SessionAuthentication (for browser clients)
|
|
267
|
+
|
|
268
|
+
permissions:
|
|
269
|
+
global: DEFAULT_PERMISSION_CLASSES in settings
|
|
270
|
+
per_view: permission_classes attribute on ViewSet
|
|
271
|
+
object_level: has_object_permission() in custom permission class
|
|
272
|
+
|
|
273
|
+
versioning:
|
|
274
|
+
method: NamespaceVersioning or URLPathVersioning
|
|
275
|
+
|
|
276
|
+
throttling:
|
|
277
|
+
anonymous: AnonRateThrottle
|
|
278
|
+
authenticated: UserRateThrottle
|
|
279
|
+
custom: Extend BaseThrottle
|
|
280
|
+
|
|
281
|
+
pagination:
|
|
282
|
+
global: DEFAULT_PAGINATION_CLASS in settings
|
|
283
|
+
types: PageNumberPagination (simple), CursorPagination (large datasets)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Reference: guides/django-best-practices/README.md
|
|
287
|
+
|
|
288
|
+
### 10. Deployment
|
|
289
|
+
|
|
290
|
+
```yaml
|
|
291
|
+
wsgi_asgi:
|
|
292
|
+
wsgi: gunicorn (4 workers per CPU core)
|
|
293
|
+
asgi: uvicorn with gunicorn workers (for async/WebSocket)
|
|
294
|
+
|
|
295
|
+
static_files:
|
|
296
|
+
development: Django's staticfiles
|
|
297
|
+
production: whitenoise middleware OR CDN (S3 + CloudFront)
|
|
298
|
+
command: python manage.py collectstatic --noinput
|
|
299
|
+
|
|
300
|
+
database:
|
|
301
|
+
development: SQLite (acceptable)
|
|
302
|
+
production: PostgreSQL (MUST — never SQLite in production)
|
|
303
|
+
connection_pooling: Use pgBouncer or django-db-connection-pool
|
|
304
|
+
|
|
305
|
+
migrations:
|
|
306
|
+
deploy: Run as part of CI/CD pipeline before server restart
|
|
307
|
+
zero_downtime: Use additive migrations (add nullable columns, backfill, then add constraint)
|
|
308
|
+
|
|
309
|
+
logging:
|
|
310
|
+
config: LOGGING dict in settings
|
|
311
|
+
handler: File handler in production, console in development
|
|
312
|
+
level: WARNING in production, DEBUG in development
|
|
313
|
+
|
|
314
|
+
environment_variables:
|
|
315
|
+
tool: python-decouple or django-environ
|
|
316
|
+
never: Hardcode secrets in settings files
|
|
317
|
+
|
|
318
|
+
health_check:
|
|
319
|
+
endpoint: /health/ returning 200 OK
|
|
320
|
+
checks: Database connection, cache connection, disk space
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## Application
|
|
324
|
+
|
|
325
|
+
When writing Django code:
|
|
326
|
+
|
|
327
|
+
1. **Always** create a custom User model before any other models
|
|
328
|
+
2. **Always** split settings into base/development/production
|
|
329
|
+
3. **Prefer** CBVs for standard CRUD, FBVs for custom logic
|
|
330
|
+
4. **Use** select_related/prefetch_related to prevent N+1 queries
|
|
331
|
+
5. **Apply** the security checklist for every production deployment
|
|
332
|
+
6. **Test** with pytest-django and factory_boy
|
|
333
|
+
7. **Never** use `fields = '__all__'` in ModelForms or ModelSerializer
|
|
334
|
+
8. **Run** `python manage.py check --deploy` before shipping
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: docker-best-practices
|
|
3
|
+
description: Docker patterns for optimized containerization
|
|
4
|
+
scope: core
|
|
5
|
+
user-invocable: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Apply Docker patterns for building optimized and secure container images.
|
|
11
|
+
|
|
12
|
+
## Rules
|
|
13
|
+
|
|
14
|
+
### 1. Layer Optimization
|
|
15
|
+
|
|
16
|
+
```yaml
|
|
17
|
+
principles:
|
|
18
|
+
- Combine related RUN commands
|
|
19
|
+
- Sort multi-line arguments alphabetically
|
|
20
|
+
- Clean up in same layer
|
|
21
|
+
|
|
22
|
+
patterns: |
|
|
23
|
+
# GOOD: Single layer, clean cache
|
|
24
|
+
RUN apt-get update && apt-get install -y \
|
|
25
|
+
curl \
|
|
26
|
+
git \
|
|
27
|
+
vim \
|
|
28
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
29
|
+
|
|
30
|
+
# BAD: Multiple layers, cache remains
|
|
31
|
+
RUN apt-get update
|
|
32
|
+
RUN apt-get install -y curl
|
|
33
|
+
RUN apt-get install -y git
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 2. Multi-Stage Builds
|
|
37
|
+
|
|
38
|
+
```yaml
|
|
39
|
+
purpose:
|
|
40
|
+
- Reduce final image size
|
|
41
|
+
- Separate build and runtime dependencies
|
|
42
|
+
- Security (no build tools in production)
|
|
43
|
+
|
|
44
|
+
pattern: |
|
|
45
|
+
# Build stage
|
|
46
|
+
FROM golang:1.21 AS builder
|
|
47
|
+
WORKDIR /app
|
|
48
|
+
COPY go.mod go.sum ./
|
|
49
|
+
RUN go mod download
|
|
50
|
+
COPY . .
|
|
51
|
+
RUN CGO_ENABLED=0 go build -o /app/server ./cmd/server
|
|
52
|
+
|
|
53
|
+
# Runtime stage
|
|
54
|
+
FROM gcr.io/distroless/static:nonroot
|
|
55
|
+
COPY --from=builder /app/server /server
|
|
56
|
+
USER nonroot:nonroot
|
|
57
|
+
ENTRYPOINT ["/server"]
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 3. Security
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
principles:
|
|
64
|
+
- Run as non-root user
|
|
65
|
+
- Pin base image versions
|
|
66
|
+
- Use minimal base images
|
|
67
|
+
- Don't store secrets in images
|
|
68
|
+
|
|
69
|
+
patterns: |
|
|
70
|
+
# Pin version with digest
|
|
71
|
+
FROM node:20-slim@sha256:abc123...
|
|
72
|
+
|
|
73
|
+
# Create non-root user
|
|
74
|
+
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
|
|
75
|
+
USER appuser
|
|
76
|
+
|
|
77
|
+
# Use secrets mount (BuildKit)
|
|
78
|
+
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc \
|
|
79
|
+
npm install
|
|
80
|
+
|
|
81
|
+
# .dockerignore for secrets
|
|
82
|
+
# .env
|
|
83
|
+
# *.pem
|
|
84
|
+
# credentials.json
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 4. Image Size Reduction
|
|
88
|
+
|
|
89
|
+
```yaml
|
|
90
|
+
strategies:
|
|
91
|
+
- Use slim/alpine base images
|
|
92
|
+
- Remove build dependencies
|
|
93
|
+
- Use .dockerignore
|
|
94
|
+
- Multi-stage builds
|
|
95
|
+
|
|
96
|
+
minimal_bases:
|
|
97
|
+
distroless: "gcr.io/distroless/static"
|
|
98
|
+
alpine: "alpine:3.19"
|
|
99
|
+
slim: "debian:12-slim"
|
|
100
|
+
|
|
101
|
+
patterns: |
|
|
102
|
+
# Alpine for size
|
|
103
|
+
FROM python:3.12-alpine
|
|
104
|
+
RUN apk add --no-cache gcc musl-dev
|
|
105
|
+
|
|
106
|
+
# Distroless for security
|
|
107
|
+
FROM gcr.io/distroless/python3
|
|
108
|
+
COPY --from=builder /app /app
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 5. Cache Optimization
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
principles:
|
|
115
|
+
- Order from least to most frequently changing
|
|
116
|
+
- Copy dependency files first
|
|
117
|
+
- Use BuildKit cache mounts
|
|
118
|
+
|
|
119
|
+
patterns: |
|
|
120
|
+
# Copy dependency files first
|
|
121
|
+
COPY package.json package-lock.json ./
|
|
122
|
+
RUN npm ci
|
|
123
|
+
|
|
124
|
+
# Then copy source (changes frequently)
|
|
125
|
+
COPY . .
|
|
126
|
+
RUN npm run build
|
|
127
|
+
|
|
128
|
+
# BuildKit cache mount
|
|
129
|
+
RUN --mount=type=cache,target=/root/.cache/pip \
|
|
130
|
+
pip install -r requirements.txt
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 6. ENTRYPOINT vs CMD
|
|
134
|
+
|
|
135
|
+
```yaml
|
|
136
|
+
entrypoint:
|
|
137
|
+
purpose: Main executable
|
|
138
|
+
form: exec form ["executable"]
|
|
139
|
+
|
|
140
|
+
cmd:
|
|
141
|
+
purpose: Default arguments
|
|
142
|
+
form: exec form ["arg1", "arg2"]
|
|
143
|
+
|
|
144
|
+
patterns: |
|
|
145
|
+
# Fixed command with variable args
|
|
146
|
+
ENTRYPOINT ["python", "app.py"]
|
|
147
|
+
CMD ["--port", "8080"]
|
|
148
|
+
|
|
149
|
+
# docker run myapp --port 3000
|
|
150
|
+
# Executes: python app.py --port 3000
|
|
151
|
+
|
|
152
|
+
# Flexible command
|
|
153
|
+
CMD ["python", "app.py"]
|
|
154
|
+
|
|
155
|
+
# docker run myapp bash
|
|
156
|
+
# Executes: bash
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 7. Health Checks
|
|
160
|
+
|
|
161
|
+
```yaml
|
|
162
|
+
purpose: Container health monitoring
|
|
163
|
+
interval: how often to check
|
|
164
|
+
timeout: max time for check
|
|
165
|
+
retries: failures before unhealthy
|
|
166
|
+
|
|
167
|
+
pattern: |
|
|
168
|
+
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
|
|
169
|
+
CMD curl -f http://localhost:8080/health || exit 1
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 8. Docker Compose
|
|
173
|
+
|
|
174
|
+
```yaml
|
|
175
|
+
best_practices:
|
|
176
|
+
- Use named volumes
|
|
177
|
+
- Define networks explicitly
|
|
178
|
+
- Use environment files
|
|
179
|
+
- Set resource limits
|
|
180
|
+
|
|
181
|
+
pattern: |
|
|
182
|
+
version: "3.8"
|
|
183
|
+
|
|
184
|
+
services:
|
|
185
|
+
app:
|
|
186
|
+
build:
|
|
187
|
+
context: .
|
|
188
|
+
target: production
|
|
189
|
+
environment:
|
|
190
|
+
- DATABASE_URL
|
|
191
|
+
env_file:
|
|
192
|
+
- .env
|
|
193
|
+
ports:
|
|
194
|
+
- "8080:8080"
|
|
195
|
+
depends_on:
|
|
196
|
+
db:
|
|
197
|
+
condition: service_healthy
|
|
198
|
+
deploy:
|
|
199
|
+
resources:
|
|
200
|
+
limits:
|
|
201
|
+
cpus: "1"
|
|
202
|
+
memory: 512M
|
|
203
|
+
networks:
|
|
204
|
+
- backend
|
|
205
|
+
|
|
206
|
+
db:
|
|
207
|
+
image: postgres:16-alpine
|
|
208
|
+
volumes:
|
|
209
|
+
- postgres_data:/var/lib/postgresql/data
|
|
210
|
+
healthcheck:
|
|
211
|
+
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
212
|
+
interval: 10s
|
|
213
|
+
timeout: 5s
|
|
214
|
+
retries: 5
|
|
215
|
+
networks:
|
|
216
|
+
- backend
|
|
217
|
+
|
|
218
|
+
volumes:
|
|
219
|
+
postgres_data:
|
|
220
|
+
|
|
221
|
+
networks:
|
|
222
|
+
backend:
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### 9. Common Patterns by Language
|
|
226
|
+
|
|
227
|
+
```yaml
|
|
228
|
+
nodejs: |
|
|
229
|
+
FROM node:20-slim AS builder
|
|
230
|
+
WORKDIR /app
|
|
231
|
+
COPY package*.json ./
|
|
232
|
+
RUN npm ci --only=production
|
|
233
|
+
|
|
234
|
+
FROM gcr.io/distroless/nodejs20
|
|
235
|
+
WORKDIR /app
|
|
236
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
237
|
+
COPY . .
|
|
238
|
+
CMD ["server.js"]
|
|
239
|
+
|
|
240
|
+
python: |
|
|
241
|
+
FROM python:3.12-slim AS builder
|
|
242
|
+
WORKDIR /app
|
|
243
|
+
RUN pip install --user -r requirements.txt
|
|
244
|
+
|
|
245
|
+
FROM python:3.12-slim
|
|
246
|
+
WORKDIR /app
|
|
247
|
+
COPY --from=builder /root/.local /root/.local
|
|
248
|
+
COPY . .
|
|
249
|
+
ENV PATH=/root/.local/bin:$PATH
|
|
250
|
+
CMD ["python", "app.py"]
|
|
251
|
+
|
|
252
|
+
go: |
|
|
253
|
+
FROM golang:1.21 AS builder
|
|
254
|
+
WORKDIR /app
|
|
255
|
+
COPY go.* ./
|
|
256
|
+
RUN go mod download
|
|
257
|
+
COPY . .
|
|
258
|
+
RUN CGO_ENABLED=0 go build -o /server
|
|
259
|
+
|
|
260
|
+
FROM scratch
|
|
261
|
+
COPY --from=builder /server /server
|
|
262
|
+
ENTRYPOINT ["/server"]
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Application
|
|
266
|
+
|
|
267
|
+
When writing Dockerfiles:
|
|
268
|
+
|
|
269
|
+
1. **Always** use multi-stage builds
|
|
270
|
+
2. **Always** run as non-root user
|
|
271
|
+
3. **Always** pin base image versions
|
|
272
|
+
4. **Prefer** minimal base images
|
|
273
|
+
5. **Order** layers for cache efficiency
|
|
274
|
+
6. **Clean** package caches in same layer
|
|
275
|
+
7. **Use** .dockerignore
|
|
276
|
+
8. **Add** health checks
|