@hivehub/rulebook 5.4.1 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/analysis.md +35 -35
- 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 +394 -393
- package/dist/core/generator.d.ts +1 -1
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +1 -0
- package/dist/core/generator.js.map +1 -1
- package/dist/hooks/terse-activate.d.ts +59 -0
- package/dist/hooks/terse-activate.d.ts.map +1 -0
- package/dist/hooks/terse-activate.js +149 -0
- package/dist/hooks/terse-activate.js.map +1 -0
- package/dist/hooks/terse-config.d.ts +51 -0
- package/dist/hooks/terse-config.d.ts.map +1 -0
- package/dist/hooks/terse-config.js +130 -0
- package/dist/hooks/terse-config.js.map +1 -0
- package/dist/hooks/terse-mode-tracker.d.ts +78 -0
- package/dist/hooks/terse-mode-tracker.d.ts.map +1 -0
- package/dist/hooks/terse-mode-tracker.js +213 -0
- package/dist/hooks/terse-mode-tracker.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/mcp/rulebook-server.js +0 -0
- package/package.json +21 -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/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/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_LEAN.md +9 -0
- package/templates/core/AGENTS_OVERRIDE.md +16 -16
- package/templates/core/AGENT_AUTOMATION.md +296 -296
- package/templates/core/CLAUDE_MD_v2.md +80 -71
- 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/hooks/check-context-and-handoff.ps1 +58 -58
- package/templates/hooks/check-context-and-handoff.sh +76 -76
- package/templates/hooks/enforce-team-for-background-agents.ps1 +63 -63
- package/templates/hooks/enforce-team-for-background-agents.sh +55 -55
- package/templates/hooks/on-compact-reinject.sh +34 -34
- package/templates/hooks/resume-from-handoff.ps1 +40 -40
- package/templates/hooks/resume-from-handoff.sh +61 -61
- package/templates/hooks/terse-activate.ps1 +143 -143
- package/templates/hooks/terse-activate.sh +197 -197
- package/templates/hooks/terse-mode-tracker.ps1 +153 -153
- package/templates/hooks/terse-mode-tracker.sh +187 -187
- 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 +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/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/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/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/karpathy-guidelines/SKILL.md +93 -0
- 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/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: "SQLite"
|
|
3
|
-
description: "Use SQLite for embedded databases, local storage, development, and small-scale applications with zero configuration."
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
category: "services"
|
|
6
|
-
author: "Rulebook"
|
|
7
|
-
tags: ["services", "database"]
|
|
8
|
-
dependencies: []
|
|
9
|
-
conflicts: []
|
|
10
|
-
---
|
|
11
|
-
<!-- SQLITE:START -->
|
|
12
|
-
# SQLite Database Instructions
|
|
13
|
-
|
|
14
|
-
**CRITICAL**: Use SQLite for embedded databases, local storage, development, and small-scale applications with zero configuration.
|
|
15
|
-
|
|
16
|
-
## Core Features
|
|
17
|
-
|
|
18
|
-
### Connection
|
|
19
|
-
```typescript
|
|
20
|
-
// Using better-sqlite3 (synchronous, faster)
|
|
21
|
-
import Database from 'better-sqlite3'
|
|
22
|
-
|
|
23
|
-
const db = new Database(process.env.DB_PATH || './database.db', {
|
|
24
|
-
verbose: process.env.NODE_ENV === 'development' ? console.log : undefined,
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
// Using sqlite3 (asynchronous)
|
|
28
|
-
import sqlite3 from 'sqlite3'
|
|
29
|
-
|
|
30
|
-
const db = new sqlite3.Database(process.env.DB_PATH || './database.db', (err) => {
|
|
31
|
-
if (err) {
|
|
32
|
-
console.error('Error opening database', err)
|
|
33
|
-
}
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
// Using better-sqlite3 with WAL mode (recommended)
|
|
37
|
-
const db = new Database('./database.db')
|
|
38
|
-
db.pragma('journal_mode = WAL') // Write-Ahead Logging
|
|
39
|
-
db.pragma('foreign_keys = ON') // Enable foreign keys
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Basic Queries
|
|
43
|
-
```typescript
|
|
44
|
-
// Using better-sqlite3 (synchronous)
|
|
45
|
-
// SELECT
|
|
46
|
-
const stmt = db.prepare('SELECT * FROM users WHERE id = ?')
|
|
47
|
-
const user = stmt.get(userId)
|
|
48
|
-
|
|
49
|
-
// INSERT
|
|
50
|
-
const insert = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)')
|
|
51
|
-
const info = insert.run('John Doe', 'john@example.com')
|
|
52
|
-
const newId = info.lastInsertRowid
|
|
53
|
-
|
|
54
|
-
// UPDATE
|
|
55
|
-
const update = db.prepare('UPDATE users SET name = ? WHERE id = ?')
|
|
56
|
-
update.run('Jane Doe', userId)
|
|
57
|
-
|
|
58
|
-
// DELETE
|
|
59
|
-
const del = db.prepare('DELETE FROM users WHERE id = ?')
|
|
60
|
-
del.run(userId)
|
|
61
|
-
|
|
62
|
-
// Using sqlite3 (asynchronous)
|
|
63
|
-
db.get('SELECT * FROM users WHERE id = ?', [userId], (err, row) => {
|
|
64
|
-
if (err) throw err
|
|
65
|
-
console.log(row)
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
db.run('INSERT INTO users (name, email) VALUES (?, ?)', ['John Doe', 'john@example.com'], function(err) {
|
|
69
|
-
if (err) throw err
|
|
70
|
-
console.log('Inserted with ID:', this.lastID)
|
|
71
|
-
})
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Transactions
|
|
75
|
-
```typescript
|
|
76
|
-
// Using better-sqlite3
|
|
77
|
-
const insertUser = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)')
|
|
78
|
-
const insertPost = db.prepare('INSERT INTO posts (user_id, title) VALUES (?, ?)')
|
|
79
|
-
|
|
80
|
-
const insertUserAndPost = db.transaction((userName, userEmail, postTitle) => {
|
|
81
|
-
const userInfo = insertUser.run(userName, userEmail)
|
|
82
|
-
const userId = userInfo.lastInsertRowid
|
|
83
|
-
insertPost.run(userId, postTitle)
|
|
84
|
-
return userId
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
const userId = insertUserAndPost('John Doe', 'john@example.com', 'First Post')
|
|
88
|
-
|
|
89
|
-
// Using sqlite3
|
|
90
|
-
db.serialize(() => {
|
|
91
|
-
db.run('BEGIN TRANSACTION')
|
|
92
|
-
db.run('INSERT INTO users (name, email) VALUES (?, ?)', ['John', 'john@example.com'], function(err) {
|
|
93
|
-
if (err) {
|
|
94
|
-
db.run('ROLLBACK')
|
|
95
|
-
throw err
|
|
96
|
-
}
|
|
97
|
-
const userId = this.lastID
|
|
98
|
-
db.run('INSERT INTO posts (user_id, title) VALUES (?, ?)', [userId, 'Post'], (err) => {
|
|
99
|
-
if (err) {
|
|
100
|
-
db.run('ROLLBACK')
|
|
101
|
-
throw err
|
|
102
|
-
}
|
|
103
|
-
db.run('COMMIT')
|
|
104
|
-
})
|
|
105
|
-
})
|
|
106
|
-
})
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
### Advanced Features
|
|
110
|
-
```typescript
|
|
111
|
-
// JSON operations (SQLite 3.38+)
|
|
112
|
-
const result = db.prepare(`
|
|
113
|
-
SELECT
|
|
114
|
-
id,
|
|
115
|
-
name,
|
|
116
|
-
json_extract(metadata, '$.category') AS category
|
|
117
|
-
FROM products
|
|
118
|
-
WHERE json_extract(metadata, '$.category') = ?
|
|
119
|
-
`).get('electronics')
|
|
120
|
-
|
|
121
|
-
// Full-text search (FTS5)
|
|
122
|
-
db.exec(`
|
|
123
|
-
CREATE VIRTUAL TABLE articles_fts USING fts5(
|
|
124
|
-
title,
|
|
125
|
-
content,
|
|
126
|
-
content_rowid=id
|
|
127
|
-
)
|
|
128
|
-
`)
|
|
129
|
-
|
|
130
|
-
const results = db.prepare(`
|
|
131
|
-
SELECT * FROM articles_fts
|
|
132
|
-
WHERE articles_fts MATCH ?
|
|
133
|
-
`).all('search term')
|
|
134
|
-
|
|
135
|
-
// Window functions (SQLite 3.25+)
|
|
136
|
-
const result = db.prepare(`
|
|
137
|
-
SELECT
|
|
138
|
-
name,
|
|
139
|
-
salary,
|
|
140
|
-
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
|
|
141
|
-
FROM employees
|
|
142
|
-
`).all()
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
## Common Patterns
|
|
146
|
-
|
|
147
|
-
### Prepared Statements
|
|
148
|
-
```typescript
|
|
149
|
-
// Reuse prepared statements for better performance
|
|
150
|
-
const getUserById = db.prepare('SELECT * FROM users WHERE id = ?')
|
|
151
|
-
const getUserByEmail = db.prepare('SELECT * FROM users WHERE email = ?')
|
|
152
|
-
|
|
153
|
-
// Use in functions
|
|
154
|
-
function getUser(id: number) {
|
|
155
|
-
return getUserById.get(id)
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function findUserByEmail(email: string) {
|
|
159
|
-
return getUserByEmail.get(email)
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### Batch Operations
|
|
164
|
-
```typescript
|
|
165
|
-
// Insert multiple rows efficiently
|
|
166
|
-
const insert = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)')
|
|
167
|
-
const insertMany = db.transaction((users) => {
|
|
168
|
-
for (const user of users) {
|
|
169
|
-
insert.run(user.name, user.email)
|
|
170
|
-
}
|
|
171
|
-
})
|
|
172
|
-
|
|
173
|
-
insertMany([
|
|
174
|
-
{ name: 'User 1', email: 'user1@example.com' },
|
|
175
|
-
{ name: 'User 2', email: 'user2@example.com' },
|
|
176
|
-
])
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### Migrations
|
|
180
|
-
```typescript
|
|
181
|
-
// Simple migration system
|
|
182
|
-
const migrations = [
|
|
183
|
-
`CREATE TABLE IF NOT EXISTS users (
|
|
184
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
185
|
-
name TEXT NOT NULL,
|
|
186
|
-
email TEXT UNIQUE NOT NULL,
|
|
187
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
188
|
-
)`,
|
|
189
|
-
`CREATE TABLE IF NOT EXISTS posts (
|
|
190
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
191
|
-
user_id INTEGER NOT NULL,
|
|
192
|
-
title TEXT NOT NULL,
|
|
193
|
-
content TEXT,
|
|
194
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
195
|
-
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
196
|
-
)`,
|
|
197
|
-
]
|
|
198
|
-
|
|
199
|
-
db.exec('BEGIN TRANSACTION')
|
|
200
|
-
try {
|
|
201
|
-
for (const migration of migrations) {
|
|
202
|
-
db.exec(migration)
|
|
203
|
-
}
|
|
204
|
-
db.exec('COMMIT')
|
|
205
|
-
} catch (error) {
|
|
206
|
-
db.exec('ROLLBACK')
|
|
207
|
-
throw error
|
|
208
|
-
}
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
## Best Practices
|
|
212
|
-
|
|
213
|
-
✅ **DO:**
|
|
214
|
-
- Use WAL mode for better concurrency
|
|
215
|
-
- Enable foreign keys
|
|
216
|
-
- Use prepared statements
|
|
217
|
-
- Use transactions for multiple operations
|
|
218
|
-
- Create indexes on frequently queried columns
|
|
219
|
-
- Use appropriate data types (TEXT, INTEGER, REAL, BLOB)
|
|
220
|
-
- Backup database regularly
|
|
221
|
-
- Use connection pooling (better-sqlite3 handles this)
|
|
222
|
-
- Monitor database size
|
|
223
|
-
- Use VACUUM periodically
|
|
224
|
-
|
|
225
|
-
❌ **DON'T:**
|
|
226
|
-
- Use for high-concurrency write scenarios
|
|
227
|
-
- Store large binary data (use external storage)
|
|
228
|
-
- Skip error handling
|
|
229
|
-
- Use string concatenation for queries
|
|
230
|
-
- Ignore database size limits
|
|
231
|
-
- Skip indexes on foreign keys
|
|
232
|
-
- Hardcode database paths
|
|
233
|
-
- Ignore transaction boundaries
|
|
234
|
-
- Use synchronous operations in async contexts (better-sqlite3 is fine)
|
|
235
|
-
- Skip backups
|
|
236
|
-
|
|
237
|
-
## Configuration
|
|
238
|
-
|
|
239
|
-
### Environment Variables
|
|
240
|
-
```bash
|
|
241
|
-
DB_PATH=./database.db
|
|
242
|
-
DB_PATH=/var/lib/myapp/database.db
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
### Initialization
|
|
246
|
-
```typescript
|
|
247
|
-
// Initialize database with schema
|
|
248
|
-
const db = new Database('./database.db')
|
|
249
|
-
|
|
250
|
-
db.pragma('journal_mode = WAL')
|
|
251
|
-
db.pragma('foreign_keys = ON')
|
|
252
|
-
db.pragma('synchronous = NORMAL')
|
|
253
|
-
db.pragma('cache_size = 10000')
|
|
254
|
-
db.pragma('temp_store = MEMORY')
|
|
255
|
-
|
|
256
|
-
// Create tables
|
|
257
|
-
db.exec(`
|
|
258
|
-
CREATE TABLE IF NOT EXISTS users (
|
|
259
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
260
|
-
name TEXT NOT NULL,
|
|
261
|
-
email TEXT UNIQUE NOT NULL,
|
|
262
|
-
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
263
|
-
)
|
|
264
|
-
|
|
265
|
-
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)
|
|
266
|
-
`)
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
## Integration with Development
|
|
270
|
-
|
|
271
|
-
### Testing
|
|
272
|
-
```typescript
|
|
273
|
-
// Use in-memory database for tests
|
|
274
|
-
const testDb = new Database(':memory:')
|
|
275
|
-
|
|
276
|
-
// Or use separate test database
|
|
277
|
-
const testDb = new Database('./test.db')
|
|
278
|
-
|
|
279
|
-
// Clean up after tests
|
|
280
|
-
afterEach(() => {
|
|
281
|
-
testDb.exec('DELETE FROM users')
|
|
282
|
-
testDb.exec('DELETE FROM posts')
|
|
283
|
-
})
|
|
284
|
-
|
|
285
|
-
afterAll(() => {
|
|
286
|
-
testDb.close()
|
|
287
|
-
// Optionally delete test database file
|
|
288
|
-
})
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
### Health Checks
|
|
292
|
-
```typescript
|
|
293
|
-
function checkDatabaseHealth(): boolean {
|
|
294
|
-
try {
|
|
295
|
-
db.prepare('SELECT 1').get()
|
|
296
|
-
return true
|
|
297
|
-
} catch {
|
|
298
|
-
return false
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
<!-- SQLITE:END -->
|
|
304
|
-
|
|
1
|
+
---
|
|
2
|
+
name: "SQLite"
|
|
3
|
+
description: "Use SQLite for embedded databases, local storage, development, and small-scale applications with zero configuration."
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
category: "services"
|
|
6
|
+
author: "Rulebook"
|
|
7
|
+
tags: ["services", "database"]
|
|
8
|
+
dependencies: []
|
|
9
|
+
conflicts: []
|
|
10
|
+
---
|
|
11
|
+
<!-- SQLITE:START -->
|
|
12
|
+
# SQLite Database Instructions
|
|
13
|
+
|
|
14
|
+
**CRITICAL**: Use SQLite for embedded databases, local storage, development, and small-scale applications with zero configuration.
|
|
15
|
+
|
|
16
|
+
## Core Features
|
|
17
|
+
|
|
18
|
+
### Connection
|
|
19
|
+
```typescript
|
|
20
|
+
// Using better-sqlite3 (synchronous, faster)
|
|
21
|
+
import Database from 'better-sqlite3'
|
|
22
|
+
|
|
23
|
+
const db = new Database(process.env.DB_PATH || './database.db', {
|
|
24
|
+
verbose: process.env.NODE_ENV === 'development' ? console.log : undefined,
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
// Using sqlite3 (asynchronous)
|
|
28
|
+
import sqlite3 from 'sqlite3'
|
|
29
|
+
|
|
30
|
+
const db = new sqlite3.Database(process.env.DB_PATH || './database.db', (err) => {
|
|
31
|
+
if (err) {
|
|
32
|
+
console.error('Error opening database', err)
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
// Using better-sqlite3 with WAL mode (recommended)
|
|
37
|
+
const db = new Database('./database.db')
|
|
38
|
+
db.pragma('journal_mode = WAL') // Write-Ahead Logging
|
|
39
|
+
db.pragma('foreign_keys = ON') // Enable foreign keys
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Basic Queries
|
|
43
|
+
```typescript
|
|
44
|
+
// Using better-sqlite3 (synchronous)
|
|
45
|
+
// SELECT
|
|
46
|
+
const stmt = db.prepare('SELECT * FROM users WHERE id = ?')
|
|
47
|
+
const user = stmt.get(userId)
|
|
48
|
+
|
|
49
|
+
// INSERT
|
|
50
|
+
const insert = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)')
|
|
51
|
+
const info = insert.run('John Doe', 'john@example.com')
|
|
52
|
+
const newId = info.lastInsertRowid
|
|
53
|
+
|
|
54
|
+
// UPDATE
|
|
55
|
+
const update = db.prepare('UPDATE users SET name = ? WHERE id = ?')
|
|
56
|
+
update.run('Jane Doe', userId)
|
|
57
|
+
|
|
58
|
+
// DELETE
|
|
59
|
+
const del = db.prepare('DELETE FROM users WHERE id = ?')
|
|
60
|
+
del.run(userId)
|
|
61
|
+
|
|
62
|
+
// Using sqlite3 (asynchronous)
|
|
63
|
+
db.get('SELECT * FROM users WHERE id = ?', [userId], (err, row) => {
|
|
64
|
+
if (err) throw err
|
|
65
|
+
console.log(row)
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
db.run('INSERT INTO users (name, email) VALUES (?, ?)', ['John Doe', 'john@example.com'], function(err) {
|
|
69
|
+
if (err) throw err
|
|
70
|
+
console.log('Inserted with ID:', this.lastID)
|
|
71
|
+
})
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Transactions
|
|
75
|
+
```typescript
|
|
76
|
+
// Using better-sqlite3
|
|
77
|
+
const insertUser = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)')
|
|
78
|
+
const insertPost = db.prepare('INSERT INTO posts (user_id, title) VALUES (?, ?)')
|
|
79
|
+
|
|
80
|
+
const insertUserAndPost = db.transaction((userName, userEmail, postTitle) => {
|
|
81
|
+
const userInfo = insertUser.run(userName, userEmail)
|
|
82
|
+
const userId = userInfo.lastInsertRowid
|
|
83
|
+
insertPost.run(userId, postTitle)
|
|
84
|
+
return userId
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
const userId = insertUserAndPost('John Doe', 'john@example.com', 'First Post')
|
|
88
|
+
|
|
89
|
+
// Using sqlite3
|
|
90
|
+
db.serialize(() => {
|
|
91
|
+
db.run('BEGIN TRANSACTION')
|
|
92
|
+
db.run('INSERT INTO users (name, email) VALUES (?, ?)', ['John', 'john@example.com'], function(err) {
|
|
93
|
+
if (err) {
|
|
94
|
+
db.run('ROLLBACK')
|
|
95
|
+
throw err
|
|
96
|
+
}
|
|
97
|
+
const userId = this.lastID
|
|
98
|
+
db.run('INSERT INTO posts (user_id, title) VALUES (?, ?)', [userId, 'Post'], (err) => {
|
|
99
|
+
if (err) {
|
|
100
|
+
db.run('ROLLBACK')
|
|
101
|
+
throw err
|
|
102
|
+
}
|
|
103
|
+
db.run('COMMIT')
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Advanced Features
|
|
110
|
+
```typescript
|
|
111
|
+
// JSON operations (SQLite 3.38+)
|
|
112
|
+
const result = db.prepare(`
|
|
113
|
+
SELECT
|
|
114
|
+
id,
|
|
115
|
+
name,
|
|
116
|
+
json_extract(metadata, '$.category') AS category
|
|
117
|
+
FROM products
|
|
118
|
+
WHERE json_extract(metadata, '$.category') = ?
|
|
119
|
+
`).get('electronics')
|
|
120
|
+
|
|
121
|
+
// Full-text search (FTS5)
|
|
122
|
+
db.exec(`
|
|
123
|
+
CREATE VIRTUAL TABLE articles_fts USING fts5(
|
|
124
|
+
title,
|
|
125
|
+
content,
|
|
126
|
+
content_rowid=id
|
|
127
|
+
)
|
|
128
|
+
`)
|
|
129
|
+
|
|
130
|
+
const results = db.prepare(`
|
|
131
|
+
SELECT * FROM articles_fts
|
|
132
|
+
WHERE articles_fts MATCH ?
|
|
133
|
+
`).all('search term')
|
|
134
|
+
|
|
135
|
+
// Window functions (SQLite 3.25+)
|
|
136
|
+
const result = db.prepare(`
|
|
137
|
+
SELECT
|
|
138
|
+
name,
|
|
139
|
+
salary,
|
|
140
|
+
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank
|
|
141
|
+
FROM employees
|
|
142
|
+
`).all()
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Common Patterns
|
|
146
|
+
|
|
147
|
+
### Prepared Statements
|
|
148
|
+
```typescript
|
|
149
|
+
// Reuse prepared statements for better performance
|
|
150
|
+
const getUserById = db.prepare('SELECT * FROM users WHERE id = ?')
|
|
151
|
+
const getUserByEmail = db.prepare('SELECT * FROM users WHERE email = ?')
|
|
152
|
+
|
|
153
|
+
// Use in functions
|
|
154
|
+
function getUser(id: number) {
|
|
155
|
+
return getUserById.get(id)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function findUserByEmail(email: string) {
|
|
159
|
+
return getUserByEmail.get(email)
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Batch Operations
|
|
164
|
+
```typescript
|
|
165
|
+
// Insert multiple rows efficiently
|
|
166
|
+
const insert = db.prepare('INSERT INTO users (name, email) VALUES (?, ?)')
|
|
167
|
+
const insertMany = db.transaction((users) => {
|
|
168
|
+
for (const user of users) {
|
|
169
|
+
insert.run(user.name, user.email)
|
|
170
|
+
}
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
insertMany([
|
|
174
|
+
{ name: 'User 1', email: 'user1@example.com' },
|
|
175
|
+
{ name: 'User 2', email: 'user2@example.com' },
|
|
176
|
+
])
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Migrations
|
|
180
|
+
```typescript
|
|
181
|
+
// Simple migration system
|
|
182
|
+
const migrations = [
|
|
183
|
+
`CREATE TABLE IF NOT EXISTS users (
|
|
184
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
185
|
+
name TEXT NOT NULL,
|
|
186
|
+
email TEXT UNIQUE NOT NULL,
|
|
187
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
188
|
+
)`,
|
|
189
|
+
`CREATE TABLE IF NOT EXISTS posts (
|
|
190
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
191
|
+
user_id INTEGER NOT NULL,
|
|
192
|
+
title TEXT NOT NULL,
|
|
193
|
+
content TEXT,
|
|
194
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
195
|
+
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
196
|
+
)`,
|
|
197
|
+
]
|
|
198
|
+
|
|
199
|
+
db.exec('BEGIN TRANSACTION')
|
|
200
|
+
try {
|
|
201
|
+
for (const migration of migrations) {
|
|
202
|
+
db.exec(migration)
|
|
203
|
+
}
|
|
204
|
+
db.exec('COMMIT')
|
|
205
|
+
} catch (error) {
|
|
206
|
+
db.exec('ROLLBACK')
|
|
207
|
+
throw error
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Best Practices
|
|
212
|
+
|
|
213
|
+
✅ **DO:**
|
|
214
|
+
- Use WAL mode for better concurrency
|
|
215
|
+
- Enable foreign keys
|
|
216
|
+
- Use prepared statements
|
|
217
|
+
- Use transactions for multiple operations
|
|
218
|
+
- Create indexes on frequently queried columns
|
|
219
|
+
- Use appropriate data types (TEXT, INTEGER, REAL, BLOB)
|
|
220
|
+
- Backup database regularly
|
|
221
|
+
- Use connection pooling (better-sqlite3 handles this)
|
|
222
|
+
- Monitor database size
|
|
223
|
+
- Use VACUUM periodically
|
|
224
|
+
|
|
225
|
+
❌ **DON'T:**
|
|
226
|
+
- Use for high-concurrency write scenarios
|
|
227
|
+
- Store large binary data (use external storage)
|
|
228
|
+
- Skip error handling
|
|
229
|
+
- Use string concatenation for queries
|
|
230
|
+
- Ignore database size limits
|
|
231
|
+
- Skip indexes on foreign keys
|
|
232
|
+
- Hardcode database paths
|
|
233
|
+
- Ignore transaction boundaries
|
|
234
|
+
- Use synchronous operations in async contexts (better-sqlite3 is fine)
|
|
235
|
+
- Skip backups
|
|
236
|
+
|
|
237
|
+
## Configuration
|
|
238
|
+
|
|
239
|
+
### Environment Variables
|
|
240
|
+
```bash
|
|
241
|
+
DB_PATH=./database.db
|
|
242
|
+
DB_PATH=/var/lib/myapp/database.db
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Initialization
|
|
246
|
+
```typescript
|
|
247
|
+
// Initialize database with schema
|
|
248
|
+
const db = new Database('./database.db')
|
|
249
|
+
|
|
250
|
+
db.pragma('journal_mode = WAL')
|
|
251
|
+
db.pragma('foreign_keys = ON')
|
|
252
|
+
db.pragma('synchronous = NORMAL')
|
|
253
|
+
db.pragma('cache_size = 10000')
|
|
254
|
+
db.pragma('temp_store = MEMORY')
|
|
255
|
+
|
|
256
|
+
// Create tables
|
|
257
|
+
db.exec(`
|
|
258
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
259
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
260
|
+
name TEXT NOT NULL,
|
|
261
|
+
email TEXT UNIQUE NOT NULL,
|
|
262
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)
|
|
266
|
+
`)
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Integration with Development
|
|
270
|
+
|
|
271
|
+
### Testing
|
|
272
|
+
```typescript
|
|
273
|
+
// Use in-memory database for tests
|
|
274
|
+
const testDb = new Database(':memory:')
|
|
275
|
+
|
|
276
|
+
// Or use separate test database
|
|
277
|
+
const testDb = new Database('./test.db')
|
|
278
|
+
|
|
279
|
+
// Clean up after tests
|
|
280
|
+
afterEach(() => {
|
|
281
|
+
testDb.exec('DELETE FROM users')
|
|
282
|
+
testDb.exec('DELETE FROM posts')
|
|
283
|
+
})
|
|
284
|
+
|
|
285
|
+
afterAll(() => {
|
|
286
|
+
testDb.close()
|
|
287
|
+
// Optionally delete test database file
|
|
288
|
+
})
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Health Checks
|
|
292
|
+
```typescript
|
|
293
|
+
function checkDatabaseHealth(): boolean {
|
|
294
|
+
try {
|
|
295
|
+
db.prepare('SELECT 1').get()
|
|
296
|
+
return true
|
|
297
|
+
} catch {
|
|
298
|
+
return false
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
<!-- SQLITE:END -->
|
|
304
|
+
|