@hivehub/rulebook 5.7.0 → 5.8.1
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/.claude/commands/analysis.md +35 -35
- package/.claude/commands/continue.md +33 -33
- package/.claude/commands/rulebook-decision-create.md +55 -55
- package/.claude/commands/rulebook-decision-list.md +15 -15
- package/.claude/commands/rulebook-knowledge-add.md +41 -41
- package/.claude/commands/rulebook-knowledge-list.md +15 -15
- package/.claude/commands/rulebook-memory-save.md +48 -48
- package/.claude/commands/rulebook-memory-search.md +47 -47
- package/.claude/commands/rulebook-task-apply.md +67 -67
- package/.claude/commands/rulebook-task-archive.md +94 -94
- package/.claude/commands/rulebook-task-create.md +93 -93
- package/.claude/commands/rulebook-task-list.md +42 -42
- package/.claude/commands/rulebook-task-show.md +52 -52
- package/.claude/commands/rulebook-task-validate.md +53 -53
- package/.claude-plugin/marketplace.json +28 -28
- package/.claude-plugin/plugin.json +8 -8
- package/README.md +86 -0
- package/dist/cli/commands/claude.d.ts +17 -0
- package/dist/cli/commands/claude.d.ts.map +1 -0
- package/dist/cli/commands/claude.js +56 -0
- package/dist/cli/commands/claude.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +18 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +6 -1
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/prompts.d.ts +13 -0
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +106 -0
- package/dist/cli/prompts.js.map +1 -1
- package/dist/core/claude/claude-mcp.d.ts +10 -1
- package/dist/core/claude/claude-mcp.d.ts.map +1 -1
- package/dist/core/claude/claude-mcp.js +48 -2
- package/dist/core/claude/claude-mcp.js.map +1 -1
- package/dist/core/claude/claude-settings-manager.d.ts +12 -0
- package/dist/core/claude/claude-settings-manager.d.ts.map +1 -1
- package/dist/core/claude/claude-settings-manager.js +59 -3
- package/dist/core/claude/claude-settings-manager.js.map +1 -1
- package/dist/core/detect/detector.d.ts +8 -1
- package/dist/core/detect/detector.d.ts.map +1 -1
- package/dist/core/detect/detector.js +225 -0
- package/dist/core/detect/detector.js.map +1 -1
- package/dist/core/detect/library-registry.d.ts +40 -0
- package/dist/core/detect/library-registry.d.ts.map +1 -0
- package/dist/core/detect/library-registry.js +239 -0
- package/dist/core/detect/library-registry.js.map +1 -0
- package/dist/core/generators/generator.d.ts +2 -1
- package/dist/core/generators/generator.d.ts.map +1 -1
- package/dist/core/generators/generator.js +38 -1
- package/dist/core/generators/generator.js.map +1 -1
- package/dist/core/generators/rules-generator.d.ts +1 -5
- package/dist/core/generators/rules-generator.d.ts.map +1 -1
- package/dist/core/generators/rules-generator.js +40 -1
- package/dist/core/generators/rules-generator.js.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.js +0 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +23 -22
- package/templates/agents/accessibility-reviewer.md +43 -43
- package/templates/agents/api-designer.md +42 -42
- package/templates/agents/architect.md +51 -51
- package/templates/agents/build-engineer.md +36 -36
- package/templates/agents/code-reviewer.md +47 -47
- package/templates/agents/compiler/codegen-debugger.md +34 -34
- package/templates/agents/compiler/stdlib-engineer.md +28 -28
- package/templates/agents/compiler/test-coverage-guardian.md +31 -31
- package/templates/agents/database-architect.md +41 -41
- package/templates/agents/devops-engineer.md +42 -42
- package/templates/agents/docs-writer.md +38 -38
- package/templates/agents/game-engine/cpp-core-expert.md +35 -35
- package/templates/agents/game-engine/render-engineer.md +22 -22
- package/templates/agents/game-engine/shader-engineer.md +38 -38
- package/templates/agents/game-engine/systems-integration.md +43 -43
- package/templates/agents/generic/code-reviewer.md +41 -41
- package/templates/agents/generic/docs-writer.md +25 -25
- package/templates/agents/generic/project-manager.md +36 -36
- package/templates/agents/generic/researcher.md +34 -34
- package/templates/agents/generic/test-engineer.md +41 -41
- package/templates/agents/i18n-engineer.md +42 -42
- package/templates/agents/implementer.md +42 -42
- package/templates/agents/migration-engineer.md +42 -42
- package/templates/agents/mobile/platform-specialist.md +22 -22
- package/templates/agents/mobile/ui-engineer.md +22 -22
- package/templates/agents/performance-engineer.md +49 -49
- package/templates/agents/project-manager.md +217 -0
- package/templates/agents/quality-gatekeeper.md +208 -0
- package/templates/agents/refactoring-agent.md +41 -41
- package/templates/agents/researcher.md +38 -38
- package/templates/agents/security-reviewer.md +40 -40
- package/templates/agents/team-lead.md +37 -37
- package/templates/agents/tester.md +48 -48
- package/templates/agents/ux-reviewer.md +43 -43
- package/templates/agents/web-app/api-designer.md +22 -22
- package/templates/agents/web-app/backend-engineer.md +30 -30
- package/templates/agents/web-app/database-engineer.md +22 -22
- package/templates/agents/web-app/frontend-engineer.md +29 -29
- package/templates/agents/web-app/security-reviewer.md +32 -32
- package/templates/ci/rulebook-review.yml +26 -26
- package/templates/claude-workflows/bugfix.js +94 -0
- package/templates/claude-workflows/feature-pipeline.js +88 -0
- package/templates/claude-workflows/release-gate.js +64 -0
- package/templates/claude-workflows/review-fanout.js +125 -0
- package/templates/claude-workflows/rulebook-driver.js +382 -0
- package/templates/claude-workflows/spec-author.js +133 -0
- package/templates/cli/AIDER.md +49 -49
- package/templates/cli/AMAZON_Q.md +25 -25
- package/templates/cli/AUGGIE.md +32 -32
- package/templates/cli/CLAUDE.md +117 -117
- package/templates/cli/CLINE.md +99 -99
- package/templates/cli/CODEBUDDY.md +20 -20
- package/templates/cli/CODEIUM.md +20 -20
- package/templates/cli/CODEX.md +21 -21
- package/templates/cli/CONTINUE.md +34 -34
- package/templates/cli/CURSOR_CLI.md +62 -62
- package/templates/cli/FACTORY.md +18 -18
- package/templates/cli/GEMINI.md +35 -35
- package/templates/cli/KILOCODE.md +18 -18
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -29
- package/templates/commands/rulebook-decision-create.md +55 -55
- package/templates/commands/rulebook-decision-list.md +15 -15
- package/templates/commands/rulebook-knowledge-add.md +41 -41
- package/templates/commands/rulebook-knowledge-list.md +15 -15
- package/templates/commands/rulebook-memory-save.md +48 -48
- package/templates/commands/rulebook-memory-search.md +47 -47
- package/templates/commands/rulebook-task-apply.md +67 -67
- package/templates/commands/rulebook-task-archive.md +94 -94
- package/templates/commands/rulebook-task-create.md +93 -93
- package/templates/commands/rulebook-task-list.md +42 -42
- package/templates/commands/rulebook-task-show.md +52 -52
- package/templates/commands/rulebook-task-validate.md +53 -53
- package/templates/compact-context/_default.md +23 -23
- package/templates/compact-context/cpp.md +26 -26
- package/templates/compact-context/go.md +26 -26
- package/templates/compact-context/python.md +26 -26
- package/templates/compact-context/rust.md +28 -28
- package/templates/compact-context/typescript.md +29 -29
- package/templates/core/AGENTS_OVERRIDE.md +16 -16
- package/templates/core/AGENT_AUTOMATION.md +296 -296
- package/templates/core/CLAUDE_MD_v2.md +90 -90
- package/templates/core/DAG.md +304 -304
- package/templates/core/DECISIONS.md +38 -38
- package/templates/core/DOCUMENTATION_RULES.md +36 -36
- package/templates/core/KNOWLEDGE.md +49 -49
- package/templates/core/MULTI_AGENT.md +74 -74
- package/templates/core/PLANS.md +28 -28
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -68
- package/templates/core/RULEBOOK.md +1947 -1947
- package/templates/core/TIER1_PROHIBITIONS.md +154 -154
- package/templates/core/TOKEN_OPTIMIZATION.md +49 -49
- package/templates/git/CI_CD_PATTERNS.md +661 -661
- package/templates/git/GITHUB_ACTIONS.md +728 -728
- package/templates/git/GITLAB_CI.md +730 -730
- package/templates/git/GIT_WORKFLOW.md +1192 -1192
- package/templates/git/SECRETS_MANAGEMENT.md +585 -585
- package/templates/hooks/COMMIT_MSG.md +530 -530
- package/templates/hooks/POST_CHECKOUT.md +546 -546
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -619
- package/templates/hooks/PRE_COMMIT.md +414 -414
- package/templates/hooks/PRE_PUSH.md +601 -601
- package/templates/hooks/check-context-and-handoff.sh +16 -6
- package/templates/hooks/update-check.ps1 +84 -0
- package/templates/hooks/update-check.sh +103 -0
- package/templates/ides/CONTINUE_RULES.md +16 -16
- package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
- package/templates/ides/GEMINI_RULES.md +17 -17
- package/templates/ides/WINDSURF_RULES.md +14 -14
- package/templates/languages/C.md +333 -333
- package/templates/languages/CPP.md +743 -743
- package/templates/languages/CSHARP.md +417 -417
- package/templates/languages/ELIXIR.md +454 -454
- package/templates/languages/ERLANG.md +361 -361
- package/templates/languages/GO.md +645 -645
- package/templates/languages/HASKELL.md +177 -177
- package/templates/languages/JAVA.md +607 -607
- package/templates/languages/JAVASCRIPT.md +631 -631
- package/templates/languages/JULIA.md +97 -97
- package/templates/languages/KOTLIN.md +511 -511
- package/templates/languages/LISP.md +100 -100
- package/templates/languages/LUA.md +74 -74
- package/templates/languages/OBJECTIVEC.md +90 -90
- package/templates/languages/PHP.md +416 -416
- package/templates/languages/PYTHON.md +682 -682
- package/templates/languages/RUBY.md +421 -421
- package/templates/languages/RUST.md +477 -477
- package/templates/languages/SAS.md +73 -73
- package/templates/languages/SCALA.md +348 -348
- package/templates/languages/SOLIDITY.md +580 -580
- package/templates/languages/SQL.md +137 -137
- package/templates/languages/SWIFT.md +466 -466
- package/templates/languages/TYPESCRIPT.md +591 -591
- package/templates/languages/ZIG.md +265 -265
- package/templates/libraries/go/ECHO.md +18 -0
- package/templates/libraries/go/GIN.md +18 -0
- package/templates/libraries/go/GORM.md +18 -0
- package/templates/libraries/python/DJANGO.md +18 -0
- package/templates/libraries/python/FASTAPI.md +18 -0
- package/templates/libraries/python/FLASK.md +17 -0
- package/templates/libraries/python/PYDANTIC.md +17 -0
- package/templates/libraries/python/PYTEST.md +17 -0
- package/templates/libraries/python/SQLALCHEMY.md +17 -0
- package/templates/libraries/rust/ACTIX.md +17 -0
- package/templates/libraries/rust/AXUM.md +18 -0
- package/templates/libraries/rust/SERDE.md +16 -0
- package/templates/libraries/rust/SQLX.md +17 -0
- package/templates/libraries/rust/TOKIO.md +16 -0
- package/templates/libraries/typescript/ANGULAR.md +17 -0
- package/templates/libraries/typescript/DRIZZLE.md +16 -0
- package/templates/libraries/typescript/EXPRESS.md +17 -0
- package/templates/libraries/typescript/HEROUI.md +16 -0
- package/templates/libraries/typescript/JEST.md +17 -0
- package/templates/libraries/typescript/NESTJS.md +17 -0
- package/templates/libraries/typescript/NEXT.md +18 -0
- package/templates/libraries/typescript/PRISMA.md +16 -0
- package/templates/libraries/typescript/RADIX.md +16 -0
- package/templates/libraries/typescript/REACT.md +18 -0
- package/templates/libraries/typescript/SHADCN.md +16 -0
- package/templates/libraries/typescript/SVELTE.md +16 -0
- package/templates/libraries/typescript/TAILWIND.md +16 -0
- package/templates/libraries/typescript/TRPC.md +16 -0
- package/templates/libraries/typescript/VITEST.md +17 -0
- package/templates/libraries/typescript/VUE.md +17 -0
- package/templates/libraries/typescript/ZOD.md +17 -0
- package/templates/modules/ATLASSIAN.md +255 -255
- package/templates/modules/CONTEXT7.md +54 -54
- package/templates/modules/FIGMA.md +267 -267
- package/templates/modules/GITHUB_MCP.md +64 -64
- package/templates/modules/GRAFANA.md +328 -328
- package/templates/modules/MEMORY.md +126 -126
- package/templates/modules/NOTION.md +247 -247
- package/templates/modules/PLAYWRIGHT.md +90 -90
- package/templates/modules/RULEBOOK_MCP.md +208 -208
- package/templates/modules/SERENA.md +337 -337
- package/templates/modules/SUPABASE.md +223 -223
- package/templates/modules/SYNAP.md +69 -69
- package/templates/modules/VECTORIZER.md +63 -63
- package/templates/modules/sequential-thinking.md +42 -42
- package/templates/rules/consult-analysis-before-implementing.md +23 -23
- package/templates/rules/cpp.md +46 -46
- package/templates/rules/csharp.md +44 -44
- package/templates/rules/diagnostic-first.md +39 -39
- package/templates/rules/fail-twice-escalate.md +46 -46
- package/templates/rules/follow-task-sequence.md +36 -36
- package/templates/rules/git-safety.md +29 -29
- package/templates/rules/go.md +40 -40
- package/templates/rules/incremental-implementation.md +56 -56
- package/templates/rules/incremental-tests.md +29 -29
- package/templates/rules/java.md +43 -43
- package/templates/rules/javascript.md +39 -39
- package/templates/rules/knowledge-base-usage.md +41 -41
- package/templates/rules/multi-agent-teams.md +75 -75
- package/templates/rules/no-deferred.md +31 -31
- package/templates/rules/no-shortcuts.md +30 -30
- package/templates/rules/python.md +43 -43
- package/templates/rules/research-first.md +30 -30
- package/templates/rules/respect-handoff-trigger.md +41 -41
- package/templates/rules/rust.md +40 -40
- package/templates/rules/sequential-editing.md +21 -21
- package/templates/rules/session-workflow.md +24 -24
- package/templates/rules/task-decomposition.md +32 -32
- package/templates/rules/typescript.md +40 -40
- package/templates/skills/cli/aider/SKILL.md +59 -59
- package/templates/skills/cli/amazon-q/SKILL.md +35 -35
- package/templates/skills/cli/auggie/SKILL.md +42 -42
- package/templates/skills/cli/claude/SKILL.md +42 -42
- package/templates/skills/cli/cline/SKILL.md +42 -42
- package/templates/skills/cli/codebuddy/SKILL.md +30 -30
- package/templates/skills/cli/codeium/SKILL.md +30 -30
- package/templates/skills/cli/codex/SKILL.md +31 -31
- package/templates/skills/cli/continue/SKILL.md +44 -44
- package/templates/skills/cli/cursor-cli/SKILL.md +38 -38
- package/templates/skills/cli/factory/SKILL.md +28 -28
- package/templates/skills/cli/gemini/SKILL.md +45 -45
- package/templates/skills/cli/kilocode/SKILL.md +28 -28
- package/templates/skills/core/agent-automation/SKILL.md +194 -194
- package/templates/skills/core/dag/SKILL.md +314 -314
- package/templates/skills/core/documentation-rules/SKILL.md +46 -46
- package/templates/skills/core/quality-enforcement/SKILL.md +78 -78
- package/templates/skills/core/rulebook/SKILL.md +176 -176
- package/templates/skills/core/rulebook-terse/SKILL.md +116 -116
- package/templates/skills/core/rulebook-terse-commit/SKILL.md +96 -96
- package/templates/skills/core/rulebook-terse-review/SKILL.md +112 -112
- package/templates/skills/dev/accessibility/SKILL.md +17 -17
- package/templates/skills/dev/analysis/SKILL.md +19 -19
- package/templates/skills/dev/api-design/SKILL.md +15 -15
- package/templates/skills/dev/architect/SKILL.md +17 -17
- package/templates/skills/dev/build-fix/SKILL.md +17 -17
- package/templates/skills/dev/db-design/SKILL.md +15 -15
- package/templates/skills/dev/debug/SKILL.md +16 -16
- package/templates/skills/dev/deploy/SKILL.md +17 -17
- package/templates/skills/dev/docs/SKILL.md +17 -17
- package/templates/skills/dev/handoff/SKILL.md +27 -27
- package/templates/skills/dev/migrate/SKILL.md +15 -15
- package/templates/skills/dev/perf/SKILL.md +17 -17
- package/templates/skills/dev/refactor/SKILL.md +17 -17
- package/templates/skills/dev/research/SKILL.md +14 -14
- package/templates/skills/dev/review/SKILL.md +18 -18
- package/templates/skills/dev/security-audit/SKILL.md +17 -17
- package/templates/skills/dev/spec/SKILL.md +65 -0
- package/templates/skills/ides/copilot/SKILL.md +47 -47
- package/templates/skills/ides/cursor/SKILL.md +53 -53
- package/templates/skills/ides/jetbrains-ai/SKILL.md +45 -45
- package/templates/skills/ides/replit/SKILL.md +46 -46
- package/templates/skills/ides/tabnine/SKILL.md +39 -39
- package/templates/skills/ides/vscode/SKILL.md +50 -50
- package/templates/skills/ides/windsurf/SKILL.md +46 -46
- package/templates/skills/ides/zed/SKILL.md +42 -42
- package/templates/skills/languages/c/SKILL.md +343 -343
- package/templates/skills/languages/cpp/SKILL.md +753 -753
- package/templates/skills/languages/csharp/SKILL.md +427 -427
- package/templates/skills/languages/elixir/SKILL.md +464 -464
- package/templates/skills/languages/erlang/SKILL.md +371 -371
- package/templates/skills/languages/go/SKILL.md +655 -655
- package/templates/skills/languages/haskell/SKILL.md +187 -187
- package/templates/skills/languages/java/SKILL.md +617 -617
- package/templates/skills/languages/javascript/SKILL.md +641 -641
- package/templates/skills/languages/julia/SKILL.md +107 -107
- package/templates/skills/languages/kotlin/SKILL.md +521 -521
- package/templates/skills/languages/lisp/SKILL.md +110 -110
- package/templates/skills/languages/lua/SKILL.md +84 -84
- package/templates/skills/languages/objectivec/SKILL.md +100 -100
- package/templates/skills/languages/php/SKILL.md +426 -426
- package/templates/skills/languages/python/SKILL.md +692 -692
- package/templates/skills/languages/ruby/SKILL.md +431 -431
- package/templates/skills/languages/rust/SKILL.md +487 -487
- package/templates/skills/languages/sas/SKILL.md +83 -83
- package/templates/skills/languages/scala/SKILL.md +358 -358
- package/templates/skills/languages/solidity/SKILL.md +590 -590
- package/templates/skills/languages/sql/SKILL.md +147 -147
- package/templates/skills/languages/swift/SKILL.md +476 -476
- package/templates/skills/languages/typescript/SKILL.md +302 -302
- package/templates/skills/languages/zig/SKILL.md +275 -275
- package/templates/skills/modules/atlassian/SKILL.md +265 -265
- package/templates/skills/modules/context7/SKILL.md +64 -64
- package/templates/skills/modules/figma/SKILL.md +277 -277
- package/templates/skills/modules/github-mcp/SKILL.md +74 -74
- package/templates/skills/modules/grafana/SKILL.md +338 -338
- package/templates/skills/modules/memory/SKILL.md +73 -73
- package/templates/skills/modules/notion/SKILL.md +257 -257
- package/templates/skills/modules/playwright/SKILL.md +100 -100
- package/templates/skills/modules/rulebook-mcp/SKILL.md +166 -166
- package/templates/skills/modules/serena/SKILL.md +347 -347
- package/templates/skills/modules/supabase/SKILL.md +233 -233
- package/templates/skills/modules/synap/SKILL.md +79 -79
- package/templates/skills/modules/vectorizer/SKILL.md +73 -73
- package/templates/workflows/typescript-test.yml +9 -3
- package/dist/agents/ralph-parser.d.ts +0 -91
- package/dist/agents/ralph-parser.d.ts.map +0 -1
- package/dist/agents/ralph-parser.js +0 -415
- package/dist/agents/ralph-parser.js.map +0 -1
- package/dist/cli/commands/analysis.d.ts +0 -8
- package/dist/cli/commands/analysis.d.ts.map +0 -1
- package/dist/cli/commands/analysis.js +0 -78
- package/dist/cli/commands/analysis.js.map +0 -1
- package/dist/cli/commands/compress.d.ts +0 -18
- package/dist/cli/commands/compress.d.ts.map +0 -1
- package/dist/cli/commands/compress.js +0 -100
- package/dist/cli/commands/compress.js.map +0 -1
- package/dist/cli/commands/ralph.d.ts +0 -45
- package/dist/cli/commands/ralph.d.ts.map +0 -1
- package/dist/cli/commands/ralph.js +0 -694
- package/dist/cli/commands/ralph.js.map +0 -1
- package/dist/cli/docs-prompts.d.ts +0 -3
- package/dist/cli/docs-prompts.d.ts.map +0 -1
- package/dist/cli/docs-prompts.js +0 -45
- package/dist/cli/docs-prompts.js.map +0 -1
- package/dist/core/agent-manager.d.ts +0 -69
- package/dist/core/agent-manager.d.ts.map +0 -1
- package/dist/core/agent-manager.js +0 -476
- package/dist/core/agent-manager.js.map +0 -1
- package/dist/core/agent-template-engine.d.ts +0 -51
- package/dist/core/agent-template-engine.d.ts.map +0 -1
- package/dist/core/agent-template-engine.js +0 -291
- package/dist/core/agent-template-engine.js.map +0 -1
- package/dist/core/analysis-manager.d.ts +0 -56
- package/dist/core/analysis-manager.d.ts.map +0 -1
- package/dist/core/analysis-manager.js +0 -218
- package/dist/core/analysis-manager.js.map +0 -1
- package/dist/core/auto-fixer.d.ts +0 -14
- package/dist/core/auto-fixer.d.ts.map +0 -1
- package/dist/core/auto-fixer.js +0 -207
- package/dist/core/auto-fixer.js.map +0 -1
- package/dist/core/changelog-generator.d.ts +0 -44
- package/dist/core/changelog-generator.d.ts.map +0 -1
- package/dist/core/changelog-generator.js +0 -222
- package/dist/core/changelog-generator.js.map +0 -1
- package/dist/core/claude-mcp.d.ts +0 -59
- package/dist/core/claude-mcp.d.ts.map +0 -1
- package/dist/core/claude-mcp.js +0 -220
- package/dist/core/claude-mcp.js.map +0 -1
- package/dist/core/claude-md-generator.d.ts +0 -52
- package/dist/core/claude-md-generator.d.ts.map +0 -1
- package/dist/core/claude-md-generator.js +0 -104
- package/dist/core/claude-md-generator.js.map +0 -1
- package/dist/core/claude-settings-manager.d.ts +0 -44
- package/dist/core/claude-settings-manager.d.ts.map +0 -1
- package/dist/core/claude-settings-manager.js +0 -191
- package/dist/core/claude-settings-manager.js.map +0 -1
- package/dist/core/cli-bridge.d.ts +0 -113
- package/dist/core/cli-bridge.d.ts.map +0 -1
- package/dist/core/cli-bridge.js +0 -1094
- package/dist/core/cli-bridge.js.map +0 -1
- package/dist/core/compact-context-manager.d.ts +0 -34
- package/dist/core/compact-context-manager.d.ts.map +0 -1
- package/dist/core/compact-context-manager.js +0 -60
- package/dist/core/compact-context-manager.js.map +0 -1
- package/dist/core/complexity-detector.d.ts +0 -36
- package/dist/core/complexity-detector.d.ts.map +0 -1
- package/dist/core/complexity-detector.js +0 -334
- package/dist/core/complexity-detector.js.map +0 -1
- package/dist/core/compress/compressor.d.ts +0 -60
- package/dist/core/compress/compressor.d.ts.map +0 -1
- package/dist/core/compress/compressor.js +0 -232
- package/dist/core/compress/compressor.js.map +0 -1
- package/dist/core/compress/discover.d.ts +0 -19
- package/dist/core/compress/discover.d.ts.map +0 -1
- package/dist/core/compress/discover.js +0 -100
- package/dist/core/compress/discover.js.map +0 -1
- package/dist/core/compress/validator.d.ts +0 -47
- package/dist/core/compress/validator.d.ts.map +0 -1
- package/dist/core/compress/validator.js +0 -131
- package/dist/core/compress/validator.js.map +0 -1
- package/dist/core/config-manager.d.ts +0 -86
- package/dist/core/config-manager.d.ts.map +0 -1
- package/dist/core/config-manager.js +0 -621
- package/dist/core/config-manager.js.map +0 -1
- package/dist/core/coverage-checker.d.ts +0 -14
- package/dist/core/coverage-checker.d.ts.map +0 -1
- package/dist/core/coverage-checker.js +0 -176
- package/dist/core/coverage-checker.js.map +0 -1
- package/dist/core/cursor-mdc-generator.d.ts +0 -30
- package/dist/core/cursor-mdc-generator.d.ts.map +0 -1
- package/dist/core/cursor-mdc-generator.js +0 -98
- package/dist/core/cursor-mdc-generator.js.map +0 -1
- package/dist/core/decision-manager.d.ts +0 -25
- package/dist/core/decision-manager.d.ts.map +0 -1
- package/dist/core/decision-manager.js +0 -183
- package/dist/core/decision-manager.js.map +0 -1
- package/dist/core/dependency-checker.d.ts +0 -21
- package/dist/core/dependency-checker.d.ts.map +0 -1
- package/dist/core/dependency-checker.js +0 -247
- package/dist/core/dependency-checker.js.map +0 -1
- package/dist/core/detector.d.ts +0 -27
- package/dist/core/detector.d.ts.map +0 -1
- package/dist/core/detector.js +0 -1763
- package/dist/core/detector.js.map +0 -1
- package/dist/core/docs-generator.d.ts +0 -9
- package/dist/core/docs-generator.d.ts.map +0 -1
- package/dist/core/docs-generator.js +0 -531
- package/dist/core/docs-generator.js.map +0 -1
- package/dist/core/doctor.d.ts +0 -19
- package/dist/core/doctor.d.ts.map +0 -1
- package/dist/core/doctor.js +0 -229
- package/dist/core/doctor.js.map +0 -1
- package/dist/core/generator.d.ts +0 -56
- package/dist/core/generator.d.ts.map +0 -1
- package/dist/core/generator.js +0 -1193
- package/dist/core/generator.js.map +0 -1
- package/dist/core/github-issues-importer.d.ts +0 -82
- package/dist/core/github-issues-importer.d.ts.map +0 -1
- package/dist/core/github-issues-importer.js +0 -161
- package/dist/core/github-issues-importer.js.map +0 -1
- package/dist/core/gitignore-generator.d.ts +0 -13
- package/dist/core/gitignore-generator.d.ts.map +0 -1
- package/dist/core/gitignore-generator.js +0 -307
- package/dist/core/gitignore-generator.js.map +0 -1
- package/dist/core/health-scorer.d.ts +0 -61
- package/dist/core/health-scorer.d.ts.map +0 -1
- package/dist/core/health-scorer.js +0 -638
- package/dist/core/health-scorer.js.map +0 -1
- package/dist/core/iteration-tracker.d.ts +0 -85
- package/dist/core/iteration-tracker.d.ts.map +0 -1
- package/dist/core/iteration-tracker.js +0 -295
- package/dist/core/iteration-tracker.js.map +0 -1
- package/dist/core/knowledge-manager.d.ts +0 -24
- package/dist/core/knowledge-manager.d.ts.map +0 -1
- package/dist/core/knowledge-manager.js +0 -173
- package/dist/core/knowledge-manager.js.map +0 -1
- package/dist/core/learn-manager.d.ts +0 -29
- package/dist/core/learn-manager.d.ts.map +0 -1
- package/dist/core/learn-manager.js +0 -159
- package/dist/core/learn-manager.js.map +0 -1
- package/dist/core/mcp-reference-generator.d.ts +0 -13
- package/dist/core/mcp-reference-generator.d.ts.map +0 -1
- package/dist/core/mcp-reference-generator.js +0 -66
- package/dist/core/mcp-reference-generator.js.map +0 -1
- package/dist/core/minimal-scaffolder.d.ts +0 -8
- package/dist/core/minimal-scaffolder.d.ts.map +0 -1
- package/dist/core/minimal-scaffolder.js +0 -51
- package/dist/core/minimal-scaffolder.js.map +0 -1
- package/dist/core/modern-console.d.ts +0 -98
- package/dist/core/modern-console.d.ts.map +0 -1
- package/dist/core/modern-console.js +0 -556
- package/dist/core/modern-console.js.map +0 -1
- package/dist/core/multi-tool-generator.d.ts +0 -59
- package/dist/core/multi-tool-generator.d.ts.map +0 -1
- package/dist/core/multi-tool-generator.js +0 -157
- package/dist/core/multi-tool-generator.js.map +0 -1
- package/dist/core/override-manager.d.ts +0 -23
- package/dist/core/override-manager.d.ts.map +0 -1
- package/dist/core/override-manager.js +0 -82
- package/dist/core/override-manager.js.map +0 -1
- package/dist/core/plans-manager.d.ts +0 -46
- package/dist/core/plans-manager.d.ts.map +0 -1
- package/dist/core/plans-manager.js +0 -158
- package/dist/core/plans-manager.js.map +0 -1
- package/dist/core/prd-generator.d.ts +0 -48
- package/dist/core/prd-generator.d.ts.map +0 -1
- package/dist/core/prd-generator.js +0 -233
- package/dist/core/prd-generator.js.map +0 -1
- package/dist/core/ralph-manager.d.ts +0 -163
- package/dist/core/ralph-manager.d.ts.map +0 -1
- package/dist/core/ralph-manager.js +0 -555
- package/dist/core/ralph-manager.js.map +0 -1
- package/dist/core/ralph-parallel.d.ts +0 -55
- package/dist/core/ralph-parallel.d.ts.map +0 -1
- package/dist/core/ralph-parallel.js +0 -201
- package/dist/core/ralph-parallel.js.map +0 -1
- package/dist/core/ralph-plan-checkpoint.d.ts +0 -58
- package/dist/core/ralph-plan-checkpoint.d.ts.map +0 -1
- package/dist/core/ralph-plan-checkpoint.js +0 -154
- package/dist/core/ralph-plan-checkpoint.js.map +0 -1
- package/dist/core/ralph-scripts.d.ts +0 -12
- package/dist/core/ralph-scripts.d.ts.map +0 -1
- package/dist/core/ralph-scripts.js +0 -50
- package/dist/core/ralph-scripts.js.map +0 -1
- package/dist/core/review-manager.d.ts +0 -74
- package/dist/core/review-manager.d.ts.map +0 -1
- package/dist/core/review-manager.js +0 -371
- package/dist/core/review-manager.js.map +0 -1
- package/dist/core/rules-generator.d.ts +0 -73
- package/dist/core/rules-generator.d.ts.map +0 -1
- package/dist/core/rules-generator.js +0 -202
- package/dist/core/rules-generator.js.map +0 -1
- package/dist/core/skills-manager.d.ts +0 -126
- package/dist/core/skills-manager.d.ts.map +0 -1
- package/dist/core/skills-manager.js +0 -654
- package/dist/core/skills-manager.js.map +0 -1
- package/dist/core/state-writer.d.ts +0 -35
- package/dist/core/state-writer.d.ts.map +0 -1
- package/dist/core/state-writer.js +0 -81
- package/dist/core/state-writer.js.map +0 -1
- package/dist/core/task-manager.d.ts +0 -127
- package/dist/core/task-manager.d.ts.map +0 -1
- package/dist/core/task-manager.js +0 -607
- package/dist/core/task-manager.js.map +0 -1
- package/dist/core/telemetry.d.ts +0 -29
- package/dist/core/telemetry.d.ts.map +0 -1
- package/dist/core/telemetry.js +0 -57
- package/dist/core/telemetry.js.map +0 -1
- package/dist/core/validator.d.ts +0 -21
- package/dist/core/validator.d.ts.map +0 -1
- package/dist/core/validator.js +0 -177
- package/dist/core/validator.js.map +0 -1
- package/dist/core/version-bumper.d.ts +0 -19
- package/dist/core/version-bumper.d.ts.map +0 -1
- package/dist/core/version-bumper.js +0 -180
- package/dist/core/version-bumper.js.map +0 -1
- package/dist/core/watcher.d.ts +0 -9
- package/dist/core/watcher.d.ts.map +0 -1
- package/dist/core/watcher.js +0 -22
- package/dist/core/watcher.js.map +0 -1
- package/dist/core/workflow-generator.d.ts +0 -15
- package/dist/core/workflow-generator.d.ts.map +0 -1
- package/dist/core/workflow-generator.js +0 -391
- package/dist/core/workflow-generator.js.map +0 -1
- package/dist/hooks/terse-activate.d.ts +0 -59
- package/dist/hooks/terse-activate.d.ts.map +0 -1
- package/dist/hooks/terse-activate.js +0 -149
- package/dist/hooks/terse-activate.js.map +0 -1
- package/dist/hooks/terse-config.d.ts +0 -51
- package/dist/hooks/terse-config.d.ts.map +0 -1
- package/dist/hooks/terse-config.js +0 -130
- package/dist/hooks/terse-config.js.map +0 -1
- package/dist/hooks/terse-mode-tracker.d.ts +0 -78
- package/dist/hooks/terse-mode-tracker.d.ts.map +0 -1
- package/dist/hooks/terse-mode-tracker.js +0 -213
- package/dist/hooks/terse-mode-tracker.js.map +0 -1
- package/dist/memory/hnsw-index.d.ts +0 -68
- package/dist/memory/hnsw-index.d.ts.map +0 -1
- package/dist/memory/hnsw-index.js +0 -544
- package/dist/memory/hnsw-index.js.map +0 -1
- package/dist/memory/memory-cache.d.ts +0 -33
- package/dist/memory/memory-cache.d.ts.map +0 -1
- package/dist/memory/memory-cache.js +0 -85
- package/dist/memory/memory-cache.js.map +0 -1
- package/dist/memory/memory-search.d.ts +0 -42
- package/dist/memory/memory-search.d.ts.map +0 -1
- package/dist/memory/memory-search.js +0 -180
- package/dist/memory/memory-search.js.map +0 -1
- package/dist/memory/memory-store.d.ts +0 -84
- package/dist/memory/memory-store.d.ts.map +0 -1
- package/dist/memory/memory-store.js +0 -566
- package/dist/memory/memory-store.js.map +0 -1
- package/dist/memory/memory-vectorizer.d.ts +0 -29
- package/dist/memory/memory-vectorizer.d.ts.map +0 -1
- package/dist/memory/memory-vectorizer.js +0 -199
- package/dist/memory/memory-vectorizer.js.map +0 -1
|
@@ -1,265 +1,265 @@
|
|
|
1
|
-
<!-- ZIG:START -->
|
|
2
|
-
# Zig Project Rules
|
|
3
|
-
|
|
4
|
-
## Agent Automation Commands
|
|
5
|
-
|
|
6
|
-
**CRITICAL**: Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow).
|
|
7
|
-
|
|
8
|
-
```bash
|
|
9
|
-
# Complete quality check sequence:
|
|
10
|
-
zig fmt --check . # Format check
|
|
11
|
-
zig build # Build verification
|
|
12
|
-
zig build test # All tests (100% pass)
|
|
13
|
-
|
|
14
|
-
# No standard security audit tool for Zig yet
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Zig Configuration
|
|
18
|
-
|
|
19
|
-
**CRITICAL**: Use Zig 0.11+ with strict compilation and comprehensive testing.
|
|
20
|
-
|
|
21
|
-
- **Version**: Zig 0.11+
|
|
22
|
-
- **Recommended**: Zig 0.13+
|
|
23
|
-
- **Build System**: zig build (built-in)
|
|
24
|
-
- **Testing**: zig test (built-in)
|
|
25
|
-
- **Formatter**: zig fmt (built-in)
|
|
26
|
-
|
|
27
|
-
### build.zig Requirements
|
|
28
|
-
|
|
29
|
-
```zig
|
|
30
|
-
const std = @import("std");
|
|
31
|
-
|
|
32
|
-
pub fn build(b: *std.Build) void {
|
|
33
|
-
const target = b.standardTargetOptions(.{});
|
|
34
|
-
const optimize = b.standardOptimizeOption(.{});
|
|
35
|
-
|
|
36
|
-
// Library
|
|
37
|
-
const lib = b.addStaticLibrary(.{
|
|
38
|
-
.name = "your-lib",
|
|
39
|
-
.root_source_file = .{ .path = "src/main.zig" },
|
|
40
|
-
.target = target,
|
|
41
|
-
.optimize = optimize,
|
|
42
|
-
});
|
|
43
|
-
b.installArtifact(lib);
|
|
44
|
-
|
|
45
|
-
// Executable
|
|
46
|
-
const exe = b.addExecutable(.{
|
|
47
|
-
.name = "your-app",
|
|
48
|
-
.root_source_file = .{ .path = "src/main.zig" },
|
|
49
|
-
.target = target,
|
|
50
|
-
.optimize = optimize,
|
|
51
|
-
});
|
|
52
|
-
b.installArtifact(exe);
|
|
53
|
-
|
|
54
|
-
// Tests
|
|
55
|
-
const main_tests = b.addTest(.{
|
|
56
|
-
.root_source_file = .{ .path = "src/main.zig" },
|
|
57
|
-
.target = target,
|
|
58
|
-
.optimize = optimize,
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
const run_main_tests = b.addRunArtifact(main_tests);
|
|
62
|
-
const test_step = b.step("test", "Run library tests");
|
|
63
|
-
test_step.dependOn(&run_main_tests.step);
|
|
64
|
-
|
|
65
|
-
// Run command
|
|
66
|
-
const run_cmd = b.addRunArtifact(exe);
|
|
67
|
-
run_cmd.step.dependOn(b.getInstallStep());
|
|
68
|
-
if (b.args) |args| {
|
|
69
|
-
run_cmd.addArgs(args);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const run_step = b.step("run", "Run the app");
|
|
73
|
-
run_step.dependOn(&run_cmd.step);
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Code Quality Standards
|
|
78
|
-
|
|
79
|
-
### Mandatory Quality Checks
|
|
80
|
-
|
|
81
|
-
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
82
|
-
|
|
83
|
-
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
87
|
-
|
|
88
|
-
# 1. Format check (matches workflow)
|
|
89
|
-
zig fmt --check src/ tests/
|
|
90
|
-
|
|
91
|
-
# 2. Build (MUST pass - matches workflow)
|
|
92
|
-
zig build -Doptimize=ReleaseFast
|
|
93
|
-
|
|
94
|
-
# 3. Build with all optimizations (matches workflow)
|
|
95
|
-
zig build -Doptimize=ReleaseSmall
|
|
96
|
-
zig build -Doptimize=ReleaseSafe
|
|
97
|
-
|
|
98
|
-
# 4. Run all tests (MUST pass 100% - matches workflow)
|
|
99
|
-
zig build test
|
|
100
|
-
|
|
101
|
-
# 5. Test with different targets (matches workflow)
|
|
102
|
-
zig build test -Dtarget=x86_64-linux
|
|
103
|
-
zig build test -Dtarget=x86_64-windows
|
|
104
|
-
zig build test -Dtarget=aarch64-macos
|
|
105
|
-
|
|
106
|
-
# 6. Check for memory leaks (matches workflow)
|
|
107
|
-
zig build test -Doptimize=Debug --summary all
|
|
108
|
-
|
|
109
|
-
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
113
|
-
|
|
114
|
-
**Why This Matters:**
|
|
115
|
-
- Running different commands locally than in CI causes build failures
|
|
116
|
-
- Zig's compile-time guarantees only work if all checks pass
|
|
117
|
-
- Example: Using `zig fmt src/` locally but `zig fmt --check src/` in CI = failure
|
|
118
|
-
- Example: Only testing Debug builds locally = Release builds fail in CI
|
|
119
|
-
- Example: Not testing cross-compilation = deployment fails on target platform
|
|
120
|
-
|
|
121
|
-
### Testing
|
|
122
|
-
|
|
123
|
-
- **Framework**: Built-in `zig test`
|
|
124
|
-
- **Location**: Tests can be inline or in `/tests`
|
|
125
|
-
- **Coverage**: Comprehensive test coverage required
|
|
126
|
-
- **Memory**: No leaks allowed (valgrind clean)
|
|
127
|
-
|
|
128
|
-
Example test structure:
|
|
129
|
-
```zig
|
|
130
|
-
const std = @import("std");
|
|
131
|
-
const testing = std.testing;
|
|
132
|
-
const DataProcessor = @import("processor.zig").DataProcessor;
|
|
133
|
-
|
|
134
|
-
test "DataProcessor: basic functionality" {
|
|
135
|
-
var processor = DataProcessor.init(0.5);
|
|
136
|
-
defer processor.deinit();
|
|
137
|
-
|
|
138
|
-
const input = [_]i32{ 1, 2, 3, 4, 5 };
|
|
139
|
-
const result = try processor.process(&input);
|
|
140
|
-
defer testing.allocator.free(result);
|
|
141
|
-
|
|
142
|
-
try testing.expect(result.len > 0);
|
|
143
|
-
try testing.expectEqual(@as(usize, 3), result.len);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
test "DataProcessor: handles empty input" {
|
|
147
|
-
var processor = DataProcessor.init(0.5);
|
|
148
|
-
defer processor.deinit();
|
|
149
|
-
|
|
150
|
-
const input = [_]i32{};
|
|
151
|
-
const result = try processor.process(&input);
|
|
152
|
-
defer testing.allocator.free(result);
|
|
153
|
-
|
|
154
|
-
try testing.expectEqual(@as(usize, 0), result.len);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
test "DataProcessor: memory management" {
|
|
158
|
-
// Test that all allocations are freed
|
|
159
|
-
const allocator = testing.allocator;
|
|
160
|
-
|
|
161
|
-
var processor = try DataProcessor.initWithAllocator(allocator, 0.5);
|
|
162
|
-
defer processor.deinit();
|
|
163
|
-
|
|
164
|
-
const input = try allocator.alloc(i32, 1000);
|
|
165
|
-
defer allocator.free(input);
|
|
166
|
-
|
|
167
|
-
for (input, 0..) |*item, i| {
|
|
168
|
-
item.* = @intCast(i);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const result = try processor.process(input);
|
|
172
|
-
defer allocator.free(result);
|
|
173
|
-
|
|
174
|
-
// If we reach here without leaks, test passes
|
|
175
|
-
try testing.expect(result.len > 0);
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
## Memory Safety
|
|
180
|
-
|
|
181
|
-
**CRITICAL**: Zig provides compile-time safety - use it!
|
|
182
|
-
|
|
183
|
-
```zig
|
|
184
|
-
// ✅ GOOD: Safe memory management
|
|
185
|
-
const std = @import("std");
|
|
186
|
-
|
|
187
|
-
pub fn processData(allocator: std.mem.Allocator, input: []const i32) ![]i32 {
|
|
188
|
-
var result = std.ArrayList(i32).init(allocator);
|
|
189
|
-
defer result.deinit(); // Always cleanup!
|
|
190
|
-
|
|
191
|
-
for (input) |value| {
|
|
192
|
-
if (value > 0) {
|
|
193
|
-
try result.append(value * 2);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
return result.toOwnedSlice();
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Usage with proper cleanup
|
|
201
|
-
pub fn main() !void {
|
|
202
|
-
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
203
|
-
defer _ = gpa.deinit();
|
|
204
|
-
|
|
205
|
-
const allocator = gpa.allocator();
|
|
206
|
-
|
|
207
|
-
const input = [_]i32{ 1, 2, 3, 4, 5 };
|
|
208
|
-
const result = try processData(allocator, &input);
|
|
209
|
-
defer allocator.free(result); // Free returned memory!
|
|
210
|
-
|
|
211
|
-
for (result) |value| {
|
|
212
|
-
std.debug.print("{}\n", .{value});
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// ❌ BAD: Memory leaks
|
|
217
|
-
pub fn processDataLeaky(allocator: std.mem.Allocator) ![]i32 {
|
|
218
|
-
var result = std.ArrayList(i32).init(allocator);
|
|
219
|
-
// Missing defer result.deinit()!
|
|
220
|
-
|
|
221
|
-
try result.append(42);
|
|
222
|
-
return result.toOwnedSlice(); // Leaks ArrayList memory!
|
|
223
|
-
}
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
## Best Practices
|
|
227
|
-
|
|
228
|
-
### DO's ✅
|
|
229
|
-
|
|
230
|
-
- **USE** defer for cleanup
|
|
231
|
-
- **CHECK** all error returns
|
|
232
|
-
- **VALIDATE** all inputs
|
|
233
|
-
- **TEST** with different allocators
|
|
234
|
-
- **USE** comptime for compile-time computations
|
|
235
|
-
- **PREFER** stack allocation when possible
|
|
236
|
-
- **USE** tagged unions for variants
|
|
237
|
-
- **CROSS-COMPILE** to verify portability
|
|
238
|
-
|
|
239
|
-
### DON'Ts ❌
|
|
240
|
-
|
|
241
|
-
- **NEVER** ignore error returns
|
|
242
|
-
- **NEVER** use undefined behavior
|
|
243
|
-
- **NEVER** leak memory
|
|
244
|
-
- **NEVER** use @ptrCast without validation
|
|
245
|
-
- **NEVER** assume platform specifics
|
|
246
|
-
- **NEVER** skip cross-compilation tests
|
|
247
|
-
- **NEVER** use global mutable state
|
|
248
|
-
|
|
249
|
-
## CI/CD Requirements
|
|
250
|
-
|
|
251
|
-
Must include GitHub Actions workflows:
|
|
252
|
-
|
|
253
|
-
1. **Testing** (`zig-test.yml`):
|
|
254
|
-
- Test on Linux, Windows, macOS
|
|
255
|
-
- Test with Debug, ReleaseSafe, ReleaseFast, ReleaseSmall
|
|
256
|
-
- Cross-compilation tests
|
|
257
|
-
- Memory leak detection
|
|
258
|
-
|
|
259
|
-
2. **Linting** (`zig-lint.yml`):
|
|
260
|
-
- zig fmt --check
|
|
261
|
-
- Build verification
|
|
262
|
-
- All optimize modes
|
|
263
|
-
|
|
264
|
-
<!-- ZIG:END -->
|
|
265
|
-
|
|
1
|
+
<!-- ZIG:START -->
|
|
2
|
+
# Zig Project Rules
|
|
3
|
+
|
|
4
|
+
## Agent Automation Commands
|
|
5
|
+
|
|
6
|
+
**CRITICAL**: Execute these commands after EVERY implementation (see AGENT_AUTOMATION module for full workflow).
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# Complete quality check sequence:
|
|
10
|
+
zig fmt --check . # Format check
|
|
11
|
+
zig build # Build verification
|
|
12
|
+
zig build test # All tests (100% pass)
|
|
13
|
+
|
|
14
|
+
# No standard security audit tool for Zig yet
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Zig Configuration
|
|
18
|
+
|
|
19
|
+
**CRITICAL**: Use Zig 0.11+ with strict compilation and comprehensive testing.
|
|
20
|
+
|
|
21
|
+
- **Version**: Zig 0.11+
|
|
22
|
+
- **Recommended**: Zig 0.13+
|
|
23
|
+
- **Build System**: zig build (built-in)
|
|
24
|
+
- **Testing**: zig test (built-in)
|
|
25
|
+
- **Formatter**: zig fmt (built-in)
|
|
26
|
+
|
|
27
|
+
### build.zig Requirements
|
|
28
|
+
|
|
29
|
+
```zig
|
|
30
|
+
const std = @import("std");
|
|
31
|
+
|
|
32
|
+
pub fn build(b: *std.Build) void {
|
|
33
|
+
const target = b.standardTargetOptions(.{});
|
|
34
|
+
const optimize = b.standardOptimizeOption(.{});
|
|
35
|
+
|
|
36
|
+
// Library
|
|
37
|
+
const lib = b.addStaticLibrary(.{
|
|
38
|
+
.name = "your-lib",
|
|
39
|
+
.root_source_file = .{ .path = "src/main.zig" },
|
|
40
|
+
.target = target,
|
|
41
|
+
.optimize = optimize,
|
|
42
|
+
});
|
|
43
|
+
b.installArtifact(lib);
|
|
44
|
+
|
|
45
|
+
// Executable
|
|
46
|
+
const exe = b.addExecutable(.{
|
|
47
|
+
.name = "your-app",
|
|
48
|
+
.root_source_file = .{ .path = "src/main.zig" },
|
|
49
|
+
.target = target,
|
|
50
|
+
.optimize = optimize,
|
|
51
|
+
});
|
|
52
|
+
b.installArtifact(exe);
|
|
53
|
+
|
|
54
|
+
// Tests
|
|
55
|
+
const main_tests = b.addTest(.{
|
|
56
|
+
.root_source_file = .{ .path = "src/main.zig" },
|
|
57
|
+
.target = target,
|
|
58
|
+
.optimize = optimize,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const run_main_tests = b.addRunArtifact(main_tests);
|
|
62
|
+
const test_step = b.step("test", "Run library tests");
|
|
63
|
+
test_step.dependOn(&run_main_tests.step);
|
|
64
|
+
|
|
65
|
+
// Run command
|
|
66
|
+
const run_cmd = b.addRunArtifact(exe);
|
|
67
|
+
run_cmd.step.dependOn(b.getInstallStep());
|
|
68
|
+
if (b.args) |args| {
|
|
69
|
+
run_cmd.addArgs(args);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const run_step = b.step("run", "Run the app");
|
|
73
|
+
run_step.dependOn(&run_cmd.step);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Code Quality Standards
|
|
78
|
+
|
|
79
|
+
### Mandatory Quality Checks
|
|
80
|
+
|
|
81
|
+
**CRITICAL**: After implementing ANY feature, you MUST run these commands in order.
|
|
82
|
+
|
|
83
|
+
**IMPORTANT**: These commands MUST match your GitHub Actions workflows to prevent CI/CD failures!
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# Pre-Commit Checklist (MUST match .github/workflows/*.yml)
|
|
87
|
+
|
|
88
|
+
# 1. Format check (matches workflow)
|
|
89
|
+
zig fmt --check src/ tests/
|
|
90
|
+
|
|
91
|
+
# 2. Build (MUST pass - matches workflow)
|
|
92
|
+
zig build -Doptimize=ReleaseFast
|
|
93
|
+
|
|
94
|
+
# 3. Build with all optimizations (matches workflow)
|
|
95
|
+
zig build -Doptimize=ReleaseSmall
|
|
96
|
+
zig build -Doptimize=ReleaseSafe
|
|
97
|
+
|
|
98
|
+
# 4. Run all tests (MUST pass 100% - matches workflow)
|
|
99
|
+
zig build test
|
|
100
|
+
|
|
101
|
+
# 5. Test with different targets (matches workflow)
|
|
102
|
+
zig build test -Dtarget=x86_64-linux
|
|
103
|
+
zig build test -Dtarget=x86_64-windows
|
|
104
|
+
zig build test -Dtarget=aarch64-macos
|
|
105
|
+
|
|
106
|
+
# 6. Check for memory leaks (matches workflow)
|
|
107
|
+
zig build test -Doptimize=Debug --summary all
|
|
108
|
+
|
|
109
|
+
# If ANY fails: ❌ DO NOT COMMIT - Fix first!
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**If ANY of these fail, you MUST fix the issues before committing.**
|
|
113
|
+
|
|
114
|
+
**Why This Matters:**
|
|
115
|
+
- Running different commands locally than in CI causes build failures
|
|
116
|
+
- Zig's compile-time guarantees only work if all checks pass
|
|
117
|
+
- Example: Using `zig fmt src/` locally but `zig fmt --check src/` in CI = failure
|
|
118
|
+
- Example: Only testing Debug builds locally = Release builds fail in CI
|
|
119
|
+
- Example: Not testing cross-compilation = deployment fails on target platform
|
|
120
|
+
|
|
121
|
+
### Testing
|
|
122
|
+
|
|
123
|
+
- **Framework**: Built-in `zig test`
|
|
124
|
+
- **Location**: Tests can be inline or in `/tests`
|
|
125
|
+
- **Coverage**: Comprehensive test coverage required
|
|
126
|
+
- **Memory**: No leaks allowed (valgrind clean)
|
|
127
|
+
|
|
128
|
+
Example test structure:
|
|
129
|
+
```zig
|
|
130
|
+
const std = @import("std");
|
|
131
|
+
const testing = std.testing;
|
|
132
|
+
const DataProcessor = @import("processor.zig").DataProcessor;
|
|
133
|
+
|
|
134
|
+
test "DataProcessor: basic functionality" {
|
|
135
|
+
var processor = DataProcessor.init(0.5);
|
|
136
|
+
defer processor.deinit();
|
|
137
|
+
|
|
138
|
+
const input = [_]i32{ 1, 2, 3, 4, 5 };
|
|
139
|
+
const result = try processor.process(&input);
|
|
140
|
+
defer testing.allocator.free(result);
|
|
141
|
+
|
|
142
|
+
try testing.expect(result.len > 0);
|
|
143
|
+
try testing.expectEqual(@as(usize, 3), result.len);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
test "DataProcessor: handles empty input" {
|
|
147
|
+
var processor = DataProcessor.init(0.5);
|
|
148
|
+
defer processor.deinit();
|
|
149
|
+
|
|
150
|
+
const input = [_]i32{};
|
|
151
|
+
const result = try processor.process(&input);
|
|
152
|
+
defer testing.allocator.free(result);
|
|
153
|
+
|
|
154
|
+
try testing.expectEqual(@as(usize, 0), result.len);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
test "DataProcessor: memory management" {
|
|
158
|
+
// Test that all allocations are freed
|
|
159
|
+
const allocator = testing.allocator;
|
|
160
|
+
|
|
161
|
+
var processor = try DataProcessor.initWithAllocator(allocator, 0.5);
|
|
162
|
+
defer processor.deinit();
|
|
163
|
+
|
|
164
|
+
const input = try allocator.alloc(i32, 1000);
|
|
165
|
+
defer allocator.free(input);
|
|
166
|
+
|
|
167
|
+
for (input, 0..) |*item, i| {
|
|
168
|
+
item.* = @intCast(i);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const result = try processor.process(input);
|
|
172
|
+
defer allocator.free(result);
|
|
173
|
+
|
|
174
|
+
// If we reach here without leaks, test passes
|
|
175
|
+
try testing.expect(result.len > 0);
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Memory Safety
|
|
180
|
+
|
|
181
|
+
**CRITICAL**: Zig provides compile-time safety - use it!
|
|
182
|
+
|
|
183
|
+
```zig
|
|
184
|
+
// ✅ GOOD: Safe memory management
|
|
185
|
+
const std = @import("std");
|
|
186
|
+
|
|
187
|
+
pub fn processData(allocator: std.mem.Allocator, input: []const i32) ![]i32 {
|
|
188
|
+
var result = std.ArrayList(i32).init(allocator);
|
|
189
|
+
defer result.deinit(); // Always cleanup!
|
|
190
|
+
|
|
191
|
+
for (input) |value| {
|
|
192
|
+
if (value > 0) {
|
|
193
|
+
try result.append(value * 2);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return result.toOwnedSlice();
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Usage with proper cleanup
|
|
201
|
+
pub fn main() !void {
|
|
202
|
+
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
|
203
|
+
defer _ = gpa.deinit();
|
|
204
|
+
|
|
205
|
+
const allocator = gpa.allocator();
|
|
206
|
+
|
|
207
|
+
const input = [_]i32{ 1, 2, 3, 4, 5 };
|
|
208
|
+
const result = try processData(allocator, &input);
|
|
209
|
+
defer allocator.free(result); // Free returned memory!
|
|
210
|
+
|
|
211
|
+
for (result) |value| {
|
|
212
|
+
std.debug.print("{}\n", .{value});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ❌ BAD: Memory leaks
|
|
217
|
+
pub fn processDataLeaky(allocator: std.mem.Allocator) ![]i32 {
|
|
218
|
+
var result = std.ArrayList(i32).init(allocator);
|
|
219
|
+
// Missing defer result.deinit()!
|
|
220
|
+
|
|
221
|
+
try result.append(42);
|
|
222
|
+
return result.toOwnedSlice(); // Leaks ArrayList memory!
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Best Practices
|
|
227
|
+
|
|
228
|
+
### DO's ✅
|
|
229
|
+
|
|
230
|
+
- **USE** defer for cleanup
|
|
231
|
+
- **CHECK** all error returns
|
|
232
|
+
- **VALIDATE** all inputs
|
|
233
|
+
- **TEST** with different allocators
|
|
234
|
+
- **USE** comptime for compile-time computations
|
|
235
|
+
- **PREFER** stack allocation when possible
|
|
236
|
+
- **USE** tagged unions for variants
|
|
237
|
+
- **CROSS-COMPILE** to verify portability
|
|
238
|
+
|
|
239
|
+
### DON'Ts ❌
|
|
240
|
+
|
|
241
|
+
- **NEVER** ignore error returns
|
|
242
|
+
- **NEVER** use undefined behavior
|
|
243
|
+
- **NEVER** leak memory
|
|
244
|
+
- **NEVER** use @ptrCast without validation
|
|
245
|
+
- **NEVER** assume platform specifics
|
|
246
|
+
- **NEVER** skip cross-compilation tests
|
|
247
|
+
- **NEVER** use global mutable state
|
|
248
|
+
|
|
249
|
+
## CI/CD Requirements
|
|
250
|
+
|
|
251
|
+
Must include GitHub Actions workflows:
|
|
252
|
+
|
|
253
|
+
1. **Testing** (`zig-test.yml`):
|
|
254
|
+
- Test on Linux, Windows, macOS
|
|
255
|
+
- Test with Debug, ReleaseSafe, ReleaseFast, ReleaseSmall
|
|
256
|
+
- Cross-compilation tests
|
|
257
|
+
- Memory leak detection
|
|
258
|
+
|
|
259
|
+
2. **Linting** (`zig-lint.yml`):
|
|
260
|
+
- zig fmt --check
|
|
261
|
+
- Build verification
|
|
262
|
+
- All optimize modes
|
|
263
|
+
|
|
264
|
+
<!-- ZIG:END -->
|
|
265
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!-- ECHO:START -->
|
|
2
|
+
# Echo Rules
|
|
3
|
+
|
|
4
|
+
## Conventions
|
|
5
|
+
- Create the server with `echo.New()` and configure `e.HideBanner = true` in production to suppress startup noise.
|
|
6
|
+
- Register middleware with `e.Use()` globally; use `g.Use()` on route groups for middleware scoped to a subset of routes.
|
|
7
|
+
- Bind and validate in one step with `c.Bind(&dto)` (calls the registered validator) or `c.Validate(&dto)` explicitly after a manual decode.
|
|
8
|
+
- Implement `echo.HTTPErrorHandler` on the `Echo` instance to centralise error response formatting across all handlers.
|
|
9
|
+
- Return errors from handlers rather than writing responses directly; Echo's error handler will translate `*echo.HTTPError` and custom error types for you.
|
|
10
|
+
- Use `echo.WrapHandler` or `echo.WrapMiddleware` when integrating `net/http`-compatible handlers from third-party packages.
|
|
11
|
+
- Set `e.Debug = true` only in development — it exposes stack traces in HTTP responses.
|
|
12
|
+
|
|
13
|
+
## Avoid
|
|
14
|
+
- Do not ignore the error returned by `e.Start()` or `e.StartTLS()` — wrap it in a `log.Fatal` or structured logger call.
|
|
15
|
+
- Do not use `context.Context` from the standard library where `echo.Context` is available; mixing them leads to redundant value lookups.
|
|
16
|
+
- Avoid defining route handlers as anonymous functions inline for anything beyond trivial cases — named functions improve stack traces and testability.
|
|
17
|
+
- Do not bind request bodies in middleware; bind only inside the handler where the expected schema is known.
|
|
18
|
+
<!-- ECHO:END -->
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!-- GIN:START -->
|
|
2
|
+
# Gin Rules
|
|
3
|
+
|
|
4
|
+
## Conventions
|
|
5
|
+
- Use `gin.New()` instead of `gin.Default()` in production to control which middleware is loaded; add `gin.Logger()` and `gin.Recovery()` explicitly.
|
|
6
|
+
- Group related routes with `r.Group("/prefix")` and attach middleware at the group level rather than the global router.
|
|
7
|
+
- Bind request payloads with `c.ShouldBindJSON(&dto)` (returns error) rather than `c.BindJSON` (aborts on error) so you control the error response format.
|
|
8
|
+
- Return structured errors via `c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})` — never write raw text responses for API handlers.
|
|
9
|
+
- Use `c.Set` / `c.Get` for passing values through middleware; define typed keys to avoid runtime panics from untyped interface assertions.
|
|
10
|
+
- Register custom validators on `binding.Validator` once at startup; do not repeat validation logic inside handlers.
|
|
11
|
+
- In tests, use `httptest.NewRecorder()` with `gin.SetMode(gin.TestMode)` to avoid debug output noise.
|
|
12
|
+
|
|
13
|
+
## Avoid
|
|
14
|
+
- Do not store mutable state in handler closures — Gin handlers run concurrently; use the context or dependency-injected services instead.
|
|
15
|
+
- Do not call `c.Abort()` without also writing a response — the client will hang waiting for a body.
|
|
16
|
+
- Avoid `gin.Default()` in production; it silently adds a logger that writes to stdout and a recovery middleware you may not have configured.
|
|
17
|
+
- Do not mix `c.BindJSON` and `c.ShouldBindJSON` in the same codebase — pick one convention and document it.
|
|
18
|
+
<!-- GIN:END -->
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!-- GORM:START -->
|
|
2
|
+
# GORM Rules
|
|
3
|
+
|
|
4
|
+
## Conventions
|
|
5
|
+
- Always check `result.Error` after every GORM call; use `errors.Is(result.Error, gorm.ErrRecordNotFound)` to distinguish not-found from other errors.
|
|
6
|
+
- Open the database connection once at application startup and inject `*gorm.DB` via dependency injection — never open connections per request.
|
|
7
|
+
- Use `db.WithContext(ctx)` on every query so timeouts and cancellations from the request lifecycle propagate to the database driver.
|
|
8
|
+
- Prefer `db.Model(&User{}).Where(...).Updates(map[string]interface{}{...})` for partial updates — struct-based `Updates` silently skips zero values.
|
|
9
|
+
- Define associations explicitly with struct tags (`gorm:"foreignKey:UserID"`) and load them deliberately with `Preload` — avoid relying on auto-preload behaviour.
|
|
10
|
+
- Run `db.AutoMigrate(&Model{})` only in development or dedicated migration tooling; in production use versioned SQL migration files (e.g., golang-migrate).
|
|
11
|
+
- Use `db.Transaction(func(tx *gorm.DB) error { ... })` for multi-statement operations to ensure atomicity.
|
|
12
|
+
|
|
13
|
+
## Avoid
|
|
14
|
+
- Do not use `db.First` without a `WHERE` clause — it silently returns the row with the lowest primary key, which is almost never correct.
|
|
15
|
+
- Do not pass a pointer to a slice directly to `db.Find` without a `WHERE`; without conditions it performs a full table scan.
|
|
16
|
+
- Avoid using `gorm.Model` in API response structs — it exposes `DeletedAt` and internal timestamps to callers; use a separate DTO.
|
|
17
|
+
- Do not share a single `*gorm.DB` instance that has scopes or conditions already applied across goroutines — clone it with `db.Session(&gorm.Session{})` first.
|
|
18
|
+
<!-- GORM:END -->
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!-- DJANGO:START -->
|
|
2
|
+
# Django Rules
|
|
3
|
+
|
|
4
|
+
## Conventions
|
|
5
|
+
- Use class-based views (`View`, `ListView`, `DetailView`) for CRUD; function-based views only for simple one-off endpoints.
|
|
6
|
+
- Define URL patterns in each app's `urls.py` and include them in the root `urls.py` via `include()`.
|
|
7
|
+
- Use Django ORM querysets lazily; chain `.filter()`, `.exclude()`, `.select_related()`, `.prefetch_related()` before evaluation.
|
|
8
|
+
- Keep business logic in model methods or service modules (`services.py`), not in views or templates.
|
|
9
|
+
- Use `django.contrib.auth` for authentication; extend `AbstractBaseUser` or `AbstractUser` rather than a separate profile model when you need custom fields.
|
|
10
|
+
- Run migrations with `makemigrations` + `migrate`; never edit migration files by hand except to squash.
|
|
11
|
+
- Use `settings.py` split (`base.py` / `production.py` / `local.py`) and `django-environ` or `python-decouple` for secrets.
|
|
12
|
+
|
|
13
|
+
## Avoid
|
|
14
|
+
- Putting raw SQL in views — use the ORM or `Manager` custom querysets.
|
|
15
|
+
- Importing settings directly in models; use `django.conf.settings` at call time, not module level.
|
|
16
|
+
- Mutating `request.session` outside of view/middleware layers.
|
|
17
|
+
- Using `null=True` on string-based fields (`CharField`, `TextField`) — use `blank=True` with an empty string default instead.
|
|
18
|
+
<!-- DJANGO:END -->
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!-- FASTAPI:START -->
|
|
2
|
+
# FastAPI Rules
|
|
3
|
+
|
|
4
|
+
## Conventions
|
|
5
|
+
- Declare request bodies and responses as Pydantic models; use `response_model=` on every route to enforce output shape.
|
|
6
|
+
- Use `Depends()` for dependency injection (database sessions, auth, config); keep dependencies composable and testable.
|
|
7
|
+
- Organize routes in `APIRouter` instances per domain, then `app.include_router()` in `main.py` with a prefix and tags.
|
|
8
|
+
- Use `async def` for I/O-bound endpoints; use `def` (sync) only for CPU-bound work that does not block the event loop.
|
|
9
|
+
- Return explicit HTTP status codes via `status_code=` on the decorator or raise `HTTPException(status_code=..., detail=...)`.
|
|
10
|
+
- Use `lifespan` context manager (FastAPI 0.93+) instead of deprecated `@app.on_event("startup"/"shutdown")`.
|
|
11
|
+
- Enable `response_model_exclude_unset=True` on endpoints that do partial updates to avoid sending default values.
|
|
12
|
+
|
|
13
|
+
## Avoid
|
|
14
|
+
- Putting database calls directly in route functions — delegate to a repository or service layer.
|
|
15
|
+
- Sharing a single `requests.Session` or sync client across async routes; use `httpx.AsyncClient` with `async with`.
|
|
16
|
+
- Raising bare Python exceptions; always raise `HTTPException` or a custom handler registered via `app.exception_handler`.
|
|
17
|
+
- Ignoring `openapi_extra` for non-standard response codes — document all 4xx/5xx you actually raise.
|
|
18
|
+
<!-- FASTAPI:END -->
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- FLASK:START -->
|
|
2
|
+
# Flask Rules
|
|
3
|
+
|
|
4
|
+
## Conventions
|
|
5
|
+
- Use the Application Factory pattern (`create_app()`) to enable multiple app instances and clean testing.
|
|
6
|
+
- Register routes via `Blueprint`s grouped by feature; import and register them in `create_app()`.
|
|
7
|
+
- Use `flask.g` for request-scoped resources (e.g., DB connections); tear them down with `@app.teardown_appcontext`.
|
|
8
|
+
- Access configuration from `app.config` populated via `app.config.from_object()` or environment variables; never hard-code secrets.
|
|
9
|
+
- Use `flask.abort(status_code)` or return `(response, status_code)` tuples for error responses; register error handlers with `@app.errorhandler`.
|
|
10
|
+
- Prefer `flask.current_app` and `flask.request` proxy objects inside request context rather than passing `app` around.
|
|
11
|
+
|
|
12
|
+
## Avoid
|
|
13
|
+
- Creating the `Flask` app at module level in large projects — it prevents testing with different configs.
|
|
14
|
+
- Using mutable default arguments in view functions or blueprint registration.
|
|
15
|
+
- Storing request-scoped state in module-level globals instead of `flask.g`.
|
|
16
|
+
- Mixing `jsonify()` and raw `dict` returns inconsistently — pick one style per project.
|
|
17
|
+
<!-- FLASK:END -->
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- PYDANTIC:START -->
|
|
2
|
+
# Pydantic Rules
|
|
3
|
+
|
|
4
|
+
## Conventions
|
|
5
|
+
- Use Pydantic v2 (`BaseModel` from `pydantic`); annotate all fields with explicit Python types — avoid `Any` except at genuine boundaries.
|
|
6
|
+
- Use `model_validator(mode="before")` for cross-field normalization and `field_validator` for single-field constraints.
|
|
7
|
+
- Define `model_config = ConfigDict(...)` on the class instead of an inner `class Config` (v2 style).
|
|
8
|
+
- Use `model.model_dump(exclude_unset=True)` for partial updates so unset fields are not sent downstream.
|
|
9
|
+
- Prefer `Annotated[T, Field(...)]` for reusable constraints (min/max length, regex, ge/le) over bare `Field()` inside the model.
|
|
10
|
+
- Use `RootModel[T]` for typed list/dict wrappers instead of wrapping a single field named `__root__`.
|
|
11
|
+
|
|
12
|
+
## Avoid
|
|
13
|
+
- Using `dict(model)` — use `model.model_dump()` to respect aliases and serialization settings.
|
|
14
|
+
- Mutating model instances after creation unless `model_config = ConfigDict(frozen=False)` is intentional.
|
|
15
|
+
- Relying on implicit coercion for strict domains (IDs, enums) — use `model_config = ConfigDict(strict=True)` or `StrictInt`/`StrictStr`.
|
|
16
|
+
- Mixing v1 (`@validator`, inner `Config`) and v2 APIs in the same model.
|
|
17
|
+
<!-- PYDANTIC:END -->
|