@hivehub/rulebook 5.1.2 → 5.1.3
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/continue.md +33 -33
- package/.claude/commands/ralph-config.md +112 -112
- package/.claude/commands/ralph-history.md +110 -110
- package/.claude/commands/ralph-init.md +72 -72
- package/.claude/commands/ralph-pause-resume.md +105 -105
- package/.claude/commands/ralph-run.md +101 -101
- package/.claude/commands/ralph-status.md +76 -76
- 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-learn-capture.md +48 -48
- package/.claude/commands/rulebook-learn-list.md +13 -13
- 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 +4 -0
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +39 -8
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/agent-template-engine.d.ts.map +1 -1
- package/dist/core/agent-template-engine.js +36 -30
- package/dist/core/agent-template-engine.js.map +1 -1
- package/dist/core/complexity-detector.d.ts.map +1 -1
- package/dist/core/complexity-detector.js +109 -29
- package/dist/core/complexity-detector.js.map +1 -1
- package/dist/core/decision-manager.d.ts.map +1 -1
- package/dist/core/decision-manager.js +2 -7
- package/dist/core/decision-manager.js.map +1 -1
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +28 -28
- package/dist/core/generator.js.map +1 -1
- package/dist/core/indexer/background-indexer.d.ts +1 -0
- package/dist/core/indexer/background-indexer.d.ts.map +1 -1
- package/dist/core/indexer/background-indexer.js +107 -19
- package/dist/core/indexer/background-indexer.js.map +1 -1
- package/dist/core/indexer/indexer-types.d.ts +2 -0
- package/dist/core/indexer/indexer-types.d.ts.map +1 -1
- package/dist/core/knowledge-manager.d.ts.map +1 -1
- package/dist/core/knowledge-manager.js +1 -1
- package/dist/core/knowledge-manager.js.map +1 -1
- package/dist/core/learn-manager.d.ts.map +1 -1
- package/dist/core/learn-manager.js +1 -1
- package/dist/core/learn-manager.js.map +1 -1
- package/dist/core/rule-engine.d.ts.map +1 -1
- package/dist/core/rule-engine.js +1 -3
- package/dist/core/rule-engine.js.map +1 -1
- package/dist/core/task-manager.d.ts.map +1 -1
- package/dist/core/task-manager.js +24 -24
- package/dist/core/task-manager.js.map +1 -1
- package/dist/index.js +23 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +18 -6
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/hnsw-index.d.ts.map +1 -1
- package/dist/memory/hnsw-index.js +12 -4
- package/dist/memory/hnsw-index.js.map +1 -1
- package/dist/memory/memory-store.d.ts.map +1 -1
- package/dist/memory/memory-store.js +136 -107
- package/dist/memory/memory-store.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +22 -21
- 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/context-intelligence.md +52 -52
- 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/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/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/OPENCODE.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-learn-capture.md +48 -48
- package/templates/commands/rulebook-learn-list.md +13 -13
- 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/core/AGENTS_LEAN.md +25 -25
- package/templates/core/AGENTS_OVERRIDE.md +16 -16
- package/templates/core/AGENT_AUTOMATION.md +296 -296
- 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/RALPH.md +471 -471
- 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/frameworks/ANGULAR.md +36 -36
- package/templates/frameworks/DJANGO.md +83 -83
- package/templates/frameworks/ELECTRON.md +147 -147
- package/templates/frameworks/FLASK.md +38 -38
- package/templates/frameworks/FLUTTER.md +55 -55
- package/templates/frameworks/JQUERY.md +32 -32
- package/templates/frameworks/LARAVEL.md +38 -38
- package/templates/frameworks/NESTJS.md +43 -43
- package/templates/frameworks/NEXTJS.md +127 -127
- package/templates/frameworks/NUXT.md +40 -40
- package/templates/frameworks/RAILS.md +66 -66
- package/templates/frameworks/REACT.md +38 -38
- package/templates/frameworks/REACT_NATIVE.md +47 -47
- package/templates/frameworks/SPRING.md +39 -39
- package/templates/frameworks/SYMFONY.md +36 -36
- package/templates/frameworks/VUE.md +36 -36
- package/templates/frameworks/ZEND.md +35 -35
- 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/ides/CONTINUE_RULES.md +16 -16
- package/templates/ides/COPILOT.md +37 -37
- package/templates/ides/COPILOT_INSTRUCTIONS.md +23 -23
- package/templates/ides/CURSOR.md +43 -43
- package/templates/ides/GEMINI_RULES.md +17 -17
- package/templates/ides/JETBRAINS_AI.md +35 -35
- package/templates/ides/REPLIT.md +36 -36
- package/templates/ides/TABNINE.md +29 -29
- package/templates/ides/VSCODE.md +40 -40
- package/templates/ides/WINDSURF.md +36 -36
- package/templates/ides/WINDSURF_RULES.md +14 -14
- package/templates/ides/ZED.md +32 -32
- package/templates/ides/cursor-mdc/go.mdc +24 -24
- package/templates/ides/cursor-mdc/python.mdc +24 -24
- package/templates/ides/cursor-mdc/quality.mdc +25 -25
- package/templates/ides/cursor-mdc/ralph.mdc +39 -39
- package/templates/ides/cursor-mdc/rulebook.mdc +38 -38
- package/templates/ides/cursor-mdc/rust.mdc +24 -24
- package/templates/ides/cursor-mdc/typescript.mdc +25 -25
- 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/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 +156 -156
- 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/ralph/ralph-history.bat +4 -4
- package/templates/ralph/ralph-history.sh +5 -5
- package/templates/ralph/ralph-init.bat +5 -5
- package/templates/ralph/ralph-init.sh +5 -5
- package/templates/ralph/ralph-pause.bat +5 -5
- package/templates/ralph/ralph-pause.sh +5 -5
- package/templates/ralph/ralph-run.bat +5 -5
- package/templates/ralph/ralph-run.sh +5 -5
- package/templates/ralph/ralph-status.bat +4 -4
- package/templates/ralph/ralph-status.sh +5 -5
- package/templates/rules/follow-task-sequence.md +36 -36
- package/templates/rules/git-safety.md +29 -29
- package/templates/rules/incremental-tests.md +29 -29
- package/templates/rules/no-deferred.md +31 -31
- package/templates/rules/no-shortcuts.md +30 -30
- package/templates/rules/research-first.md +30 -30
- 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/services/AZURE_BLOB.md +184 -184
- package/templates/services/CASSANDRA.md +239 -239
- package/templates/services/DATADOG.md +26 -26
- package/templates/services/DOCKER.md +124 -124
- package/templates/services/DOCKER_COMPOSE.md +168 -168
- package/templates/services/DYNAMODB.md +308 -308
- package/templates/services/ELASTICSEARCH.md +347 -347
- package/templates/services/GCS.md +178 -178
- package/templates/services/HELM.md +194 -194
- package/templates/services/INFLUXDB.md +265 -265
- package/templates/services/KAFKA.md +341 -341
- package/templates/services/KUBERNETES.md +208 -208
- package/templates/services/MARIADB.md +183 -183
- package/templates/services/MEMCACHED.md +242 -242
- package/templates/services/MINIO.md +201 -201
- package/templates/services/MONGODB.md +268 -268
- package/templates/services/MYSQL.md +358 -358
- package/templates/services/NEO4J.md +247 -247
- package/templates/services/OPENTELEMETRY.md +25 -25
- package/templates/services/ORACLE.md +290 -290
- package/templates/services/PINO.md +24 -24
- package/templates/services/POSTGRESQL.md +326 -326
- package/templates/services/PROMETHEUS.md +33 -33
- package/templates/services/RABBITMQ.md +286 -286
- package/templates/services/REDIS.md +292 -292
- package/templates/services/S3.md +298 -298
- package/templates/services/SENTRY.md +23 -23
- package/templates/services/SQLITE.md +294 -294
- package/templates/services/SQLSERVER.md +294 -294
- package/templates/services/WINSTON.md +30 -30
- 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/cli/opencode/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/dev/accessibility/SKILL.md +17 -17
- 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/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/frameworks/angular/SKILL.md +46 -46
- package/templates/skills/frameworks/django/SKILL.md +93 -93
- package/templates/skills/frameworks/electron/SKILL.md +157 -157
- package/templates/skills/frameworks/flask/SKILL.md +48 -48
- package/templates/skills/frameworks/flutter/SKILL.md +65 -65
- package/templates/skills/frameworks/jquery/SKILL.md +42 -42
- package/templates/skills/frameworks/laravel/SKILL.md +48 -48
- package/templates/skills/frameworks/nestjs/SKILL.md +53 -53
- package/templates/skills/frameworks/nextjs/SKILL.md +137 -137
- package/templates/skills/frameworks/nuxt/SKILL.md +50 -50
- package/templates/skills/frameworks/rails/SKILL.md +76 -76
- package/templates/skills/frameworks/react/SKILL.md +48 -48
- package/templates/skills/frameworks/react-native/SKILL.md +57 -57
- package/templates/skills/frameworks/spring/SKILL.md +49 -49
- package/templates/skills/frameworks/symfony/SKILL.md +46 -46
- package/templates/skills/frameworks/vue/SKILL.md +46 -46
- package/templates/skills/frameworks/zend/SKILL.md +45 -45
- 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/skills/services/azure-blob/SKILL.md +194 -194
- package/templates/skills/services/cassandra/SKILL.md +249 -249
- package/templates/skills/services/dynamodb/SKILL.md +318 -318
- package/templates/skills/services/elasticsearch/SKILL.md +357 -357
- package/templates/skills/services/gcs/SKILL.md +188 -188
- package/templates/skills/services/influxdb/SKILL.md +275 -275
- package/templates/skills/services/kafka/SKILL.md +351 -351
- package/templates/skills/services/mariadb/SKILL.md +193 -193
- package/templates/skills/services/memcached/SKILL.md +252 -252
- package/templates/skills/services/minio/SKILL.md +211 -211
- package/templates/skills/services/mongodb/SKILL.md +278 -278
- package/templates/skills/services/mysql/SKILL.md +368 -368
- package/templates/skills/services/neo4j/SKILL.md +257 -257
- package/templates/skills/services/oracle/SKILL.md +300 -300
- package/templates/skills/services/postgresql/SKILL.md +336 -336
- package/templates/skills/services/rabbitmq/SKILL.md +296 -296
- package/templates/skills/services/redis/SKILL.md +302 -302
- package/templates/skills/services/s3/SKILL.md +308 -308
- package/templates/skills/services/sqlite/SKILL.md +304 -304
- package/templates/skills/services/sqlserver/SKILL.md +304 -304
- package/templates/skills/workflows/ralph/SKILL.md +309 -309
- package/templates/skills/workflows/ralph/install.sh +87 -87
- package/templates/skills/workflows/ralph/manifest.json +158 -158
|
@@ -1,304 +1,304 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: "SQL Server"
|
|
3
|
-
description: "Use SQL Server for enterprise relational data storage with advanced features, high availability, and Windows integration."
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
category: "services"
|
|
6
|
-
author: "Rulebook"
|
|
7
|
-
tags: ["services", "database"]
|
|
8
|
-
dependencies: []
|
|
9
|
-
conflicts: []
|
|
10
|
-
---
|
|
11
|
-
<!-- SQLSERVER:START -->
|
|
12
|
-
# SQL Server Database Instructions
|
|
13
|
-
|
|
14
|
-
**CRITICAL**: Use SQL Server for enterprise relational data storage with advanced features, high availability, and Windows integration.
|
|
15
|
-
|
|
16
|
-
## Core Features
|
|
17
|
-
|
|
18
|
-
### Connection
|
|
19
|
-
```typescript
|
|
20
|
-
// Using mssql (Node.js)
|
|
21
|
-
import sql from 'mssql'
|
|
22
|
-
|
|
23
|
-
const pool = await sql.connect({
|
|
24
|
-
server: process.env.DB_HOST || 'localhost',
|
|
25
|
-
port: parseInt(process.env.DB_PORT || '1433'),
|
|
26
|
-
database: process.env.DB_NAME || 'myapp',
|
|
27
|
-
user: process.env.DB_USER,
|
|
28
|
-
password: process.env.DB_PASSWORD,
|
|
29
|
-
options: {
|
|
30
|
-
encrypt: process.env.NODE_ENV === 'production',
|
|
31
|
-
trustServerCertificate: process.env.NODE_ENV !== 'production',
|
|
32
|
-
enableArithAbort: true,
|
|
33
|
-
connectionTimeout: 30000,
|
|
34
|
-
requestTimeout: 30000,
|
|
35
|
-
},
|
|
36
|
-
pool: {
|
|
37
|
-
max: 10,
|
|
38
|
-
min: 0,
|
|
39
|
-
idleTimeoutMillis: 30000,
|
|
40
|
-
},
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
// Using tedious (lower level)
|
|
44
|
-
import { Connection } from 'tedious'
|
|
45
|
-
|
|
46
|
-
const connection = new Connection({
|
|
47
|
-
server: process.env.DB_HOST || 'localhost',
|
|
48
|
-
authentication: {
|
|
49
|
-
type: 'default',
|
|
50
|
-
options: {
|
|
51
|
-
userName: process.env.DB_USER,
|
|
52
|
-
password: process.env.DB_PASSWORD,
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
options: {
|
|
56
|
-
encrypt: true,
|
|
57
|
-
database: process.env.DB_NAME,
|
|
58
|
-
trustServerCertificate: true,
|
|
59
|
-
},
|
|
60
|
-
})
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Basic Queries
|
|
64
|
-
```typescript
|
|
65
|
-
// SELECT
|
|
66
|
-
const result = await pool.request()
|
|
67
|
-
.input('userId', sql.Int, userId)
|
|
68
|
-
.query('SELECT * FROM Users WHERE Id = @userId')
|
|
69
|
-
const users = result.recordset
|
|
70
|
-
|
|
71
|
-
// INSERT
|
|
72
|
-
const result = await pool.request()
|
|
73
|
-
.input('name', sql.NVarChar, 'John Doe')
|
|
74
|
-
.input('email', sql.NVarChar, 'john@example.com')
|
|
75
|
-
.query('INSERT INTO Users (Name, Email) OUTPUT INSERTED.* VALUES (@name, @email)')
|
|
76
|
-
const newUser = result.recordset[0]
|
|
77
|
-
|
|
78
|
-
// UPDATE
|
|
79
|
-
const result = await pool.request()
|
|
80
|
-
.input('id', sql.Int, userId)
|
|
81
|
-
.input('name', sql.NVarChar, 'Jane Doe')
|
|
82
|
-
.query('UPDATE Users SET Name = @name WHERE Id = @id')
|
|
83
|
-
|
|
84
|
-
// DELETE
|
|
85
|
-
await pool.request()
|
|
86
|
-
.input('id', sql.Int, userId)
|
|
87
|
-
.query('DELETE FROM Users WHERE Id = @id')
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### Transactions
|
|
91
|
-
```typescript
|
|
92
|
-
const transaction = new sql.Transaction(pool)
|
|
93
|
-
|
|
94
|
-
try {
|
|
95
|
-
await transaction.begin()
|
|
96
|
-
|
|
97
|
-
const request = new sql.Request(transaction)
|
|
98
|
-
await request
|
|
99
|
-
.input('userId', sql.Int, userId)
|
|
100
|
-
.input('amount', sql.Decimal(18, 2), 1000)
|
|
101
|
-
.query('INSERT INTO Accounts (UserId, Balance) VALUES (@userId, @amount)')
|
|
102
|
-
|
|
103
|
-
await request
|
|
104
|
-
.input('accountId', sql.Int, accountId)
|
|
105
|
-
.input('amount', sql.Decimal(18, 2), 1000)
|
|
106
|
-
.query('INSERT INTO Transactions (AccountId, Amount) VALUES (@accountId, @amount)')
|
|
107
|
-
|
|
108
|
-
await transaction.commit()
|
|
109
|
-
} catch (error) {
|
|
110
|
-
await transaction.rollback()
|
|
111
|
-
throw error
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### Advanced Features
|
|
116
|
-
```typescript
|
|
117
|
-
// Stored procedures
|
|
118
|
-
const result = await pool.request()
|
|
119
|
-
.input('userId', sql.Int, userId)
|
|
120
|
-
.execute('sp_GetUserDetails')
|
|
121
|
-
|
|
122
|
-
// JSON operations (SQL Server 2016+)
|
|
123
|
-
const result = await pool.request()
|
|
124
|
-
.query(`
|
|
125
|
-
SELECT
|
|
126
|
-
Id,
|
|
127
|
-
Name,
|
|
128
|
-
JSON_VALUE(Metadata, '$.category') AS Category
|
|
129
|
-
FROM Products
|
|
130
|
-
WHERE JSON_VALUE(Metadata, '$.category') = 'electronics'
|
|
131
|
-
`)
|
|
132
|
-
|
|
133
|
-
// Full-text search
|
|
134
|
-
const result = await pool.request()
|
|
135
|
-
.input('searchTerm', sql.NVarChar, 'search term')
|
|
136
|
-
.query(`
|
|
137
|
-
SELECT * FROM Articles
|
|
138
|
-
WHERE CONTAINS(Content, @searchTerm)
|
|
139
|
-
`)
|
|
140
|
-
|
|
141
|
-
// Window functions
|
|
142
|
-
const result = await pool.request()
|
|
143
|
-
.query(`
|
|
144
|
-
SELECT
|
|
145
|
-
Name,
|
|
146
|
-
Salary,
|
|
147
|
-
ROW_NUMBER() OVER (PARTITION BY DepartmentId ORDER BY Salary DESC) AS Rank
|
|
148
|
-
FROM Employees
|
|
149
|
-
`)
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
## Common Patterns
|
|
153
|
-
|
|
154
|
-
### Connection Pooling
|
|
155
|
-
```typescript
|
|
156
|
-
let pool: sql.ConnectionPool | null = null
|
|
157
|
-
|
|
158
|
-
export async function getPool(): Promise<sql.ConnectionPool> {
|
|
159
|
-
if (!pool) {
|
|
160
|
-
pool = await sql.connect({
|
|
161
|
-
// ... config
|
|
162
|
-
})
|
|
163
|
-
|
|
164
|
-
pool.on('error', (err) => {
|
|
165
|
-
console.error('SQL Server pool error', err)
|
|
166
|
-
})
|
|
167
|
-
}
|
|
168
|
-
return pool
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Graceful shutdown
|
|
172
|
-
process.on('SIGINT', async () => {
|
|
173
|
-
if (pool) {
|
|
174
|
-
await pool.close()
|
|
175
|
-
}
|
|
176
|
-
process.exit(0)
|
|
177
|
-
})
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### Parameterized Queries
|
|
181
|
-
```typescript
|
|
182
|
-
// Always use parameters to prevent SQL injection
|
|
183
|
-
// ❌ WRONG
|
|
184
|
-
await pool.request().query(`SELECT * FROM Users WHERE Email = '${email}'`)
|
|
185
|
-
|
|
186
|
-
// ✅ CORRECT
|
|
187
|
-
await pool.request()
|
|
188
|
-
.input('email', sql.NVarChar, email)
|
|
189
|
-
.query('SELECT * FROM Users WHERE Email = @email')
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### Error Handling
|
|
193
|
-
```typescript
|
|
194
|
-
try {
|
|
195
|
-
const result = await pool.request()
|
|
196
|
-
.input('id', sql.Int, userId)
|
|
197
|
-
.query('SELECT * FROM Users WHERE Id = @id')
|
|
198
|
-
|
|
199
|
-
if (result.recordset.length === 0) {
|
|
200
|
-
throw new Error('User not found')
|
|
201
|
-
}
|
|
202
|
-
return result.recordset[0]
|
|
203
|
-
} catch (error: any) {
|
|
204
|
-
if (error.number === 2627) { // Unique constraint violation
|
|
205
|
-
throw new Error('Duplicate entry')
|
|
206
|
-
}
|
|
207
|
-
if (error.number === 547) { // Foreign key constraint violation
|
|
208
|
-
throw new Error('Referenced record does not exist')
|
|
209
|
-
}
|
|
210
|
-
throw error
|
|
211
|
-
}
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
## Best Practices
|
|
215
|
-
|
|
216
|
-
✅ **DO:**
|
|
217
|
-
- Use connection pooling (10-20 connections)
|
|
218
|
-
- Always use parameterized queries (@param)
|
|
219
|
-
- Use transactions for multi-step operations
|
|
220
|
-
- Create indexes on frequently queried columns
|
|
221
|
-
- Use appropriate data types (NVarChar for Unicode)
|
|
222
|
-
- Enable encryption in production
|
|
223
|
-
- Use stored procedures for complex logic
|
|
224
|
-
- Monitor connection pool usage
|
|
225
|
-
- Use appropriate timeout values
|
|
226
|
-
- Implement retry logic for transient errors
|
|
227
|
-
|
|
228
|
-
❌ **DON'T:**
|
|
229
|
-
- Use string concatenation for queries (SQL injection risk)
|
|
230
|
-
- Create too many connections
|
|
231
|
-
- Skip error handling
|
|
232
|
-
- Ignore connection pool limits
|
|
233
|
-
- Use SELECT * in production
|
|
234
|
-
- Skip indexes on foreign keys
|
|
235
|
-
- Hardcode connection strings
|
|
236
|
-
- Skip encryption in production
|
|
237
|
-
- Ignore query performance
|
|
238
|
-
- Use synchronous operations
|
|
239
|
-
|
|
240
|
-
## Configuration
|
|
241
|
-
|
|
242
|
-
### Environment Variables
|
|
243
|
-
```bash
|
|
244
|
-
DB_HOST=localhost
|
|
245
|
-
DB_PORT=1433
|
|
246
|
-
DB_NAME=myapp
|
|
247
|
-
DB_USER=sa
|
|
248
|
-
DB_PASSWORD=securepassword
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
### Docker Compose
|
|
252
|
-
```yaml
|
|
253
|
-
services:
|
|
254
|
-
sqlserver:
|
|
255
|
-
image: mcr.microsoft.com/mssql/server:2022-latest
|
|
256
|
-
ports:
|
|
257
|
-
- "1433:1433"
|
|
258
|
-
environment:
|
|
259
|
-
ACCEPT_EULA: Y
|
|
260
|
-
SA_PASSWORD: securepassword
|
|
261
|
-
MSSQL_PID: Developer
|
|
262
|
-
volumes:
|
|
263
|
-
- sqlserver_data:/var/opt/mssql
|
|
264
|
-
healthcheck:
|
|
265
|
-
test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P securepassword -Q 'SELECT 1' || exit 1"]
|
|
266
|
-
interval: 10s
|
|
267
|
-
timeout: 5s
|
|
268
|
-
retries: 5
|
|
269
|
-
|
|
270
|
-
volumes:
|
|
271
|
-
sqlserver_data:
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
## Integration with Development
|
|
275
|
-
|
|
276
|
-
### Testing
|
|
277
|
-
```typescript
|
|
278
|
-
// Use test database
|
|
279
|
-
const testPool = await sql.connect({
|
|
280
|
-
database: 'myapp_test',
|
|
281
|
-
// ... config
|
|
282
|
-
})
|
|
283
|
-
|
|
284
|
-
// Clean up after tests
|
|
285
|
-
afterEach(async () => {
|
|
286
|
-
await testPool.request().query('DELETE FROM Users')
|
|
287
|
-
await testPool.request().query('DELETE FROM Posts')
|
|
288
|
-
})
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
### Health Checks
|
|
292
|
-
```typescript
|
|
293
|
-
async function checkDatabaseHealth(): Promise<boolean> {
|
|
294
|
-
try {
|
|
295
|
-
const result = await pool.request().query('SELECT 1 AS Health')
|
|
296
|
-
return result.recordset.length > 0
|
|
297
|
-
} catch {
|
|
298
|
-
return false
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
<!-- SQLSERVER:END -->
|
|
304
|
-
|
|
1
|
+
---
|
|
2
|
+
name: "SQL Server"
|
|
3
|
+
description: "Use SQL Server for enterprise relational data storage with advanced features, high availability, and Windows integration."
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
category: "services"
|
|
6
|
+
author: "Rulebook"
|
|
7
|
+
tags: ["services", "database"]
|
|
8
|
+
dependencies: []
|
|
9
|
+
conflicts: []
|
|
10
|
+
---
|
|
11
|
+
<!-- SQLSERVER:START -->
|
|
12
|
+
# SQL Server Database Instructions
|
|
13
|
+
|
|
14
|
+
**CRITICAL**: Use SQL Server for enterprise relational data storage with advanced features, high availability, and Windows integration.
|
|
15
|
+
|
|
16
|
+
## Core Features
|
|
17
|
+
|
|
18
|
+
### Connection
|
|
19
|
+
```typescript
|
|
20
|
+
// Using mssql (Node.js)
|
|
21
|
+
import sql from 'mssql'
|
|
22
|
+
|
|
23
|
+
const pool = await sql.connect({
|
|
24
|
+
server: process.env.DB_HOST || 'localhost',
|
|
25
|
+
port: parseInt(process.env.DB_PORT || '1433'),
|
|
26
|
+
database: process.env.DB_NAME || 'myapp',
|
|
27
|
+
user: process.env.DB_USER,
|
|
28
|
+
password: process.env.DB_PASSWORD,
|
|
29
|
+
options: {
|
|
30
|
+
encrypt: process.env.NODE_ENV === 'production',
|
|
31
|
+
trustServerCertificate: process.env.NODE_ENV !== 'production',
|
|
32
|
+
enableArithAbort: true,
|
|
33
|
+
connectionTimeout: 30000,
|
|
34
|
+
requestTimeout: 30000,
|
|
35
|
+
},
|
|
36
|
+
pool: {
|
|
37
|
+
max: 10,
|
|
38
|
+
min: 0,
|
|
39
|
+
idleTimeoutMillis: 30000,
|
|
40
|
+
},
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
// Using tedious (lower level)
|
|
44
|
+
import { Connection } from 'tedious'
|
|
45
|
+
|
|
46
|
+
const connection = new Connection({
|
|
47
|
+
server: process.env.DB_HOST || 'localhost',
|
|
48
|
+
authentication: {
|
|
49
|
+
type: 'default',
|
|
50
|
+
options: {
|
|
51
|
+
userName: process.env.DB_USER,
|
|
52
|
+
password: process.env.DB_PASSWORD,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
options: {
|
|
56
|
+
encrypt: true,
|
|
57
|
+
database: process.env.DB_NAME,
|
|
58
|
+
trustServerCertificate: true,
|
|
59
|
+
},
|
|
60
|
+
})
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Basic Queries
|
|
64
|
+
```typescript
|
|
65
|
+
// SELECT
|
|
66
|
+
const result = await pool.request()
|
|
67
|
+
.input('userId', sql.Int, userId)
|
|
68
|
+
.query('SELECT * FROM Users WHERE Id = @userId')
|
|
69
|
+
const users = result.recordset
|
|
70
|
+
|
|
71
|
+
// INSERT
|
|
72
|
+
const result = await pool.request()
|
|
73
|
+
.input('name', sql.NVarChar, 'John Doe')
|
|
74
|
+
.input('email', sql.NVarChar, 'john@example.com')
|
|
75
|
+
.query('INSERT INTO Users (Name, Email) OUTPUT INSERTED.* VALUES (@name, @email)')
|
|
76
|
+
const newUser = result.recordset[0]
|
|
77
|
+
|
|
78
|
+
// UPDATE
|
|
79
|
+
const result = await pool.request()
|
|
80
|
+
.input('id', sql.Int, userId)
|
|
81
|
+
.input('name', sql.NVarChar, 'Jane Doe')
|
|
82
|
+
.query('UPDATE Users SET Name = @name WHERE Id = @id')
|
|
83
|
+
|
|
84
|
+
// DELETE
|
|
85
|
+
await pool.request()
|
|
86
|
+
.input('id', sql.Int, userId)
|
|
87
|
+
.query('DELETE FROM Users WHERE Id = @id')
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Transactions
|
|
91
|
+
```typescript
|
|
92
|
+
const transaction = new sql.Transaction(pool)
|
|
93
|
+
|
|
94
|
+
try {
|
|
95
|
+
await transaction.begin()
|
|
96
|
+
|
|
97
|
+
const request = new sql.Request(transaction)
|
|
98
|
+
await request
|
|
99
|
+
.input('userId', sql.Int, userId)
|
|
100
|
+
.input('amount', sql.Decimal(18, 2), 1000)
|
|
101
|
+
.query('INSERT INTO Accounts (UserId, Balance) VALUES (@userId, @amount)')
|
|
102
|
+
|
|
103
|
+
await request
|
|
104
|
+
.input('accountId', sql.Int, accountId)
|
|
105
|
+
.input('amount', sql.Decimal(18, 2), 1000)
|
|
106
|
+
.query('INSERT INTO Transactions (AccountId, Amount) VALUES (@accountId, @amount)')
|
|
107
|
+
|
|
108
|
+
await transaction.commit()
|
|
109
|
+
} catch (error) {
|
|
110
|
+
await transaction.rollback()
|
|
111
|
+
throw error
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Advanced Features
|
|
116
|
+
```typescript
|
|
117
|
+
// Stored procedures
|
|
118
|
+
const result = await pool.request()
|
|
119
|
+
.input('userId', sql.Int, userId)
|
|
120
|
+
.execute('sp_GetUserDetails')
|
|
121
|
+
|
|
122
|
+
// JSON operations (SQL Server 2016+)
|
|
123
|
+
const result = await pool.request()
|
|
124
|
+
.query(`
|
|
125
|
+
SELECT
|
|
126
|
+
Id,
|
|
127
|
+
Name,
|
|
128
|
+
JSON_VALUE(Metadata, '$.category') AS Category
|
|
129
|
+
FROM Products
|
|
130
|
+
WHERE JSON_VALUE(Metadata, '$.category') = 'electronics'
|
|
131
|
+
`)
|
|
132
|
+
|
|
133
|
+
// Full-text search
|
|
134
|
+
const result = await pool.request()
|
|
135
|
+
.input('searchTerm', sql.NVarChar, 'search term')
|
|
136
|
+
.query(`
|
|
137
|
+
SELECT * FROM Articles
|
|
138
|
+
WHERE CONTAINS(Content, @searchTerm)
|
|
139
|
+
`)
|
|
140
|
+
|
|
141
|
+
// Window functions
|
|
142
|
+
const result = await pool.request()
|
|
143
|
+
.query(`
|
|
144
|
+
SELECT
|
|
145
|
+
Name,
|
|
146
|
+
Salary,
|
|
147
|
+
ROW_NUMBER() OVER (PARTITION BY DepartmentId ORDER BY Salary DESC) AS Rank
|
|
148
|
+
FROM Employees
|
|
149
|
+
`)
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Common Patterns
|
|
153
|
+
|
|
154
|
+
### Connection Pooling
|
|
155
|
+
```typescript
|
|
156
|
+
let pool: sql.ConnectionPool | null = null
|
|
157
|
+
|
|
158
|
+
export async function getPool(): Promise<sql.ConnectionPool> {
|
|
159
|
+
if (!pool) {
|
|
160
|
+
pool = await sql.connect({
|
|
161
|
+
// ... config
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
pool.on('error', (err) => {
|
|
165
|
+
console.error('SQL Server pool error', err)
|
|
166
|
+
})
|
|
167
|
+
}
|
|
168
|
+
return pool
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Graceful shutdown
|
|
172
|
+
process.on('SIGINT', async () => {
|
|
173
|
+
if (pool) {
|
|
174
|
+
await pool.close()
|
|
175
|
+
}
|
|
176
|
+
process.exit(0)
|
|
177
|
+
})
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Parameterized Queries
|
|
181
|
+
```typescript
|
|
182
|
+
// Always use parameters to prevent SQL injection
|
|
183
|
+
// ❌ WRONG
|
|
184
|
+
await pool.request().query(`SELECT * FROM Users WHERE Email = '${email}'`)
|
|
185
|
+
|
|
186
|
+
// ✅ CORRECT
|
|
187
|
+
await pool.request()
|
|
188
|
+
.input('email', sql.NVarChar, email)
|
|
189
|
+
.query('SELECT * FROM Users WHERE Email = @email')
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Error Handling
|
|
193
|
+
```typescript
|
|
194
|
+
try {
|
|
195
|
+
const result = await pool.request()
|
|
196
|
+
.input('id', sql.Int, userId)
|
|
197
|
+
.query('SELECT * FROM Users WHERE Id = @id')
|
|
198
|
+
|
|
199
|
+
if (result.recordset.length === 0) {
|
|
200
|
+
throw new Error('User not found')
|
|
201
|
+
}
|
|
202
|
+
return result.recordset[0]
|
|
203
|
+
} catch (error: any) {
|
|
204
|
+
if (error.number === 2627) { // Unique constraint violation
|
|
205
|
+
throw new Error('Duplicate entry')
|
|
206
|
+
}
|
|
207
|
+
if (error.number === 547) { // Foreign key constraint violation
|
|
208
|
+
throw new Error('Referenced record does not exist')
|
|
209
|
+
}
|
|
210
|
+
throw error
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Best Practices
|
|
215
|
+
|
|
216
|
+
✅ **DO:**
|
|
217
|
+
- Use connection pooling (10-20 connections)
|
|
218
|
+
- Always use parameterized queries (@param)
|
|
219
|
+
- Use transactions for multi-step operations
|
|
220
|
+
- Create indexes on frequently queried columns
|
|
221
|
+
- Use appropriate data types (NVarChar for Unicode)
|
|
222
|
+
- Enable encryption in production
|
|
223
|
+
- Use stored procedures for complex logic
|
|
224
|
+
- Monitor connection pool usage
|
|
225
|
+
- Use appropriate timeout values
|
|
226
|
+
- Implement retry logic for transient errors
|
|
227
|
+
|
|
228
|
+
❌ **DON'T:**
|
|
229
|
+
- Use string concatenation for queries (SQL injection risk)
|
|
230
|
+
- Create too many connections
|
|
231
|
+
- Skip error handling
|
|
232
|
+
- Ignore connection pool limits
|
|
233
|
+
- Use SELECT * in production
|
|
234
|
+
- Skip indexes on foreign keys
|
|
235
|
+
- Hardcode connection strings
|
|
236
|
+
- Skip encryption in production
|
|
237
|
+
- Ignore query performance
|
|
238
|
+
- Use synchronous operations
|
|
239
|
+
|
|
240
|
+
## Configuration
|
|
241
|
+
|
|
242
|
+
### Environment Variables
|
|
243
|
+
```bash
|
|
244
|
+
DB_HOST=localhost
|
|
245
|
+
DB_PORT=1433
|
|
246
|
+
DB_NAME=myapp
|
|
247
|
+
DB_USER=sa
|
|
248
|
+
DB_PASSWORD=securepassword
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Docker Compose
|
|
252
|
+
```yaml
|
|
253
|
+
services:
|
|
254
|
+
sqlserver:
|
|
255
|
+
image: mcr.microsoft.com/mssql/server:2022-latest
|
|
256
|
+
ports:
|
|
257
|
+
- "1433:1433"
|
|
258
|
+
environment:
|
|
259
|
+
ACCEPT_EULA: Y
|
|
260
|
+
SA_PASSWORD: securepassword
|
|
261
|
+
MSSQL_PID: Developer
|
|
262
|
+
volumes:
|
|
263
|
+
- sqlserver_data:/var/opt/mssql
|
|
264
|
+
healthcheck:
|
|
265
|
+
test: ["CMD-SHELL", "/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P securepassword -Q 'SELECT 1' || exit 1"]
|
|
266
|
+
interval: 10s
|
|
267
|
+
timeout: 5s
|
|
268
|
+
retries: 5
|
|
269
|
+
|
|
270
|
+
volumes:
|
|
271
|
+
sqlserver_data:
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Integration with Development
|
|
275
|
+
|
|
276
|
+
### Testing
|
|
277
|
+
```typescript
|
|
278
|
+
// Use test database
|
|
279
|
+
const testPool = await sql.connect({
|
|
280
|
+
database: 'myapp_test',
|
|
281
|
+
// ... config
|
|
282
|
+
})
|
|
283
|
+
|
|
284
|
+
// Clean up after tests
|
|
285
|
+
afterEach(async () => {
|
|
286
|
+
await testPool.request().query('DELETE FROM Users')
|
|
287
|
+
await testPool.request().query('DELETE FROM Posts')
|
|
288
|
+
})
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Health Checks
|
|
292
|
+
```typescript
|
|
293
|
+
async function checkDatabaseHealth(): Promise<boolean> {
|
|
294
|
+
try {
|
|
295
|
+
const result = await pool.request().query('SELECT 1 AS Health')
|
|
296
|
+
return result.recordset.length > 0
|
|
297
|
+
} catch {
|
|
298
|
+
return false
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
<!-- SQLSERVER:END -->
|
|
304
|
+
|