@hivehub/rulebook 4.1.0 → 4.2.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/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-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 +70 -70
- 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 +137 -1
- package/dist/cli/commands.d.ts +18 -6
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +727 -406
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/claude-mcp.d.ts +4 -2
- package/dist/core/claude-mcp.d.ts.map +1 -1
- package/dist/core/claude-mcp.js +14 -9
- package/dist/core/claude-mcp.js.map +1 -1
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +13 -0
- package/dist/core/generator.js.map +1 -1
- package/dist/core/indexer/background-indexer.d.ts.map +1 -1
- package/dist/core/indexer/background-indexer.js +26 -5
- package/dist/core/indexer/background-indexer.js.map +1 -1
- package/dist/core/indexer/file-parser.d.ts.map +1 -1
- package/dist/core/indexer/file-parser.js +1 -1
- package/dist/core/indexer/file-parser.js.map +1 -1
- package/dist/core/indexer/indexer-types.d.ts.map +1 -1
- package/dist/core/workspace/legacy-migrator.d.ts +29 -0
- package/dist/core/workspace/legacy-migrator.d.ts.map +1 -0
- package/dist/core/workspace/legacy-migrator.js +142 -0
- package/dist/core/workspace/legacy-migrator.js.map +1 -0
- package/dist/core/workspace/project-worker.d.ts +49 -0
- package/dist/core/workspace/project-worker.d.ts.map +1 -0
- package/dist/core/workspace/project-worker.js +108 -0
- package/dist/core/workspace/project-worker.js.map +1 -0
- package/dist/core/workspace/workspace-manager.d.ts +90 -0
- package/dist/core/workspace/workspace-manager.d.ts.map +1 -0
- package/dist/core/workspace/workspace-manager.js +347 -0
- package/dist/core/workspace/workspace-manager.js.map +1 -0
- package/dist/core/workspace/workspace-types.d.ts +37 -0
- package/dist/core/workspace/workspace-types.d.ts.map +1 -0
- package/dist/core/workspace/workspace-types.js +8 -0
- package/dist/core/workspace/workspace-types.js.map +1 -0
- package/dist/index.js +43 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +367 -100
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/memory-manager.js +2 -2
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/memory-search.js.map +1 -1
- package/dist/memory/memory-store.d.ts.map +1 -1
- package/dist/memory/memory-store.js +1 -1
- package/dist/memory/memory-store.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +22 -21
- package/templates/agents/implementer.md +35 -35
- package/templates/agents/researcher.md +34 -34
- package/templates/agents/team-lead.md +34 -34
- package/templates/agents/tester.md +42 -42
- 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-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 +288 -288
- package/templates/core/DAG.md +304 -304
- package/templates/core/DOCUMENTATION_RULES.md +36 -36
- 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 +1935 -1935
- package/templates/core/WORKSPACE.md +69 -0
- 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 +1157 -1157
- 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/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/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,268 +1,268 @@
|
|
|
1
|
-
<!-- MONGODB:START -->
|
|
2
|
-
# MongoDB Database Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Use MongoDB for document-based NoSQL storage with flexible schemas, horizontal scaling, and rich querying.
|
|
5
|
-
|
|
6
|
-
## Core Features
|
|
7
|
-
|
|
8
|
-
### Connection
|
|
9
|
-
```typescript
|
|
10
|
-
// Using mongodb driver
|
|
11
|
-
import { MongoClient } from 'mongodb'
|
|
12
|
-
|
|
13
|
-
const client = new MongoClient(process.env.MONGODB_URI || 'mongodb://localhost:27017', {
|
|
14
|
-
maxPoolSize: 10,
|
|
15
|
-
minPoolSize: 2,
|
|
16
|
-
maxIdleTimeMS: 30000,
|
|
17
|
-
serverSelectionTimeoutMS: 5000,
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
await client.connect()
|
|
21
|
-
const db = client.db(process.env.DB_NAME || 'myapp')
|
|
22
|
-
|
|
23
|
-
// Using Mongoose
|
|
24
|
-
import mongoose from 'mongoose'
|
|
25
|
-
|
|
26
|
-
await mongoose.connect(process.env.MONGODB_URI, {
|
|
27
|
-
maxPoolSize: 10,
|
|
28
|
-
minPoolSize: 2,
|
|
29
|
-
bufferCommands: false,
|
|
30
|
-
bufferMaxEntries: 0,
|
|
31
|
-
})
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### Basic Operations
|
|
35
|
-
```typescript
|
|
36
|
-
// Insert
|
|
37
|
-
const result = await db.collection('users').insertOne({
|
|
38
|
-
name: 'John Doe',
|
|
39
|
-
email: 'john@example.com',
|
|
40
|
-
createdAt: new Date(),
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
// Insert many
|
|
44
|
-
await db.collection('users').insertMany([
|
|
45
|
-
{ name: 'User 1', email: 'user1@example.com' },
|
|
46
|
-
{ name: 'User 2', email: 'user2@example.com' },
|
|
47
|
-
])
|
|
48
|
-
|
|
49
|
-
// Find
|
|
50
|
-
const user = await db.collection('users').findOne({ email: 'john@example.com' })
|
|
51
|
-
const users = await db.collection('users').find({ active: true }).toArray()
|
|
52
|
-
|
|
53
|
-
// Update
|
|
54
|
-
await db.collection('users').updateOne(
|
|
55
|
-
{ email: 'john@example.com' },
|
|
56
|
-
{ $set: { name: 'Jane Doe', updatedAt: new Date() } }
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
// Update many
|
|
60
|
-
await db.collection('users').updateMany(
|
|
61
|
-
{ active: false },
|
|
62
|
-
{ $set: { status: 'inactive' } }
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
// Delete
|
|
66
|
-
await db.collection('users').deleteOne({ email: 'john@example.com' })
|
|
67
|
-
await db.collection('users').deleteMany({ active: false })
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Advanced Queries
|
|
71
|
-
```typescript
|
|
72
|
-
// Aggregation pipeline
|
|
73
|
-
const result = await db.collection('orders').aggregate([
|
|
74
|
-
{ $match: { status: 'completed' } },
|
|
75
|
-
{ $group: { _id: '$userId', total: { $sum: '$amount' } } },
|
|
76
|
-
{ $sort: { total: -1 } },
|
|
77
|
-
{ $limit: 10 },
|
|
78
|
-
]).toArray()
|
|
79
|
-
|
|
80
|
-
// Text search
|
|
81
|
-
await db.collection('articles').createIndex({ title: 'text', content: 'text' })
|
|
82
|
-
const results = await db.collection('articles').find({
|
|
83
|
-
$text: { $search: 'search term' },
|
|
84
|
-
}).toArray()
|
|
85
|
-
|
|
86
|
-
// Geospatial queries
|
|
87
|
-
await db.collection('locations').createIndex({ location: '2dsphere' })
|
|
88
|
-
const nearby = await db.collection('locations').find({
|
|
89
|
-
location: {
|
|
90
|
-
$near: {
|
|
91
|
-
$geometry: { type: 'Point', coordinates: [longitude, latitude] },
|
|
92
|
-
$maxDistance: 1000, // meters
|
|
93
|
-
},
|
|
94
|
-
},
|
|
95
|
-
}).toArray()
|
|
96
|
-
|
|
97
|
-
// Array operations
|
|
98
|
-
await db.collection('users').find({
|
|
99
|
-
tags: { $in: ['javascript', 'typescript'] },
|
|
100
|
-
})
|
|
101
|
-
await db.collection('users').updateOne(
|
|
102
|
-
{ email: 'john@example.com' },
|
|
103
|
-
{ $push: { tags: 'new-tag' } }
|
|
104
|
-
)
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Common Patterns
|
|
108
|
-
|
|
109
|
-
### Mongoose Schemas
|
|
110
|
-
```typescript
|
|
111
|
-
import mongoose, { Schema } from 'mongoose'
|
|
112
|
-
|
|
113
|
-
const userSchema = new Schema({
|
|
114
|
-
name: { type: String, required: true },
|
|
115
|
-
email: { type: String, required: true, unique: true, index: true },
|
|
116
|
-
age: { type: Number, min: 0, max: 120 },
|
|
117
|
-
tags: [String],
|
|
118
|
-
metadata: { type: Schema.Types.Mixed },
|
|
119
|
-
createdAt: { type: Date, default: Date.now },
|
|
120
|
-
updatedAt: { type: Date, default: Date.now },
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
userSchema.pre('save', function(next) {
|
|
124
|
-
this.updatedAt = new Date()
|
|
125
|
-
next()
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
const User = mongoose.model('User', userSchema)
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### Transactions
|
|
132
|
-
```typescript
|
|
133
|
-
const session = client.startSession()
|
|
134
|
-
try {
|
|
135
|
-
await session.withTransaction(async () => {
|
|
136
|
-
await db.collection('accounts').updateOne(
|
|
137
|
-
{ userId: userId },
|
|
138
|
-
{ $inc: { balance: -100 } },
|
|
139
|
-
{ session }
|
|
140
|
-
)
|
|
141
|
-
|
|
142
|
-
await db.collection('transactions').insertOne(
|
|
143
|
-
{ userId, amount: -100, type: 'debit' },
|
|
144
|
-
{ session }
|
|
145
|
-
)
|
|
146
|
-
})
|
|
147
|
-
} finally {
|
|
148
|
-
await session.endSession()
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### Indexing
|
|
153
|
-
```typescript
|
|
154
|
-
// Create indexes
|
|
155
|
-
await db.collection('users').createIndex({ email: 1 }, { unique: true })
|
|
156
|
-
await db.collection('users').createIndex({ name: 1, email: 1 })
|
|
157
|
-
await db.collection('users').createIndex({ createdAt: -1 })
|
|
158
|
-
|
|
159
|
-
// Compound index
|
|
160
|
-
await db.collection('posts').createIndex({ authorId: 1, createdAt: -1 })
|
|
161
|
-
|
|
162
|
-
// TTL index (auto-delete after time)
|
|
163
|
-
await db.collection('sessions').createIndex(
|
|
164
|
-
{ createdAt: 1 },
|
|
165
|
-
{ expireAfterSeconds: 3600 }
|
|
166
|
-
)
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
## Best Practices
|
|
170
|
-
|
|
171
|
-
✅ **DO:**
|
|
172
|
-
- Use connection pooling (10-20 connections)
|
|
173
|
-
- Create indexes on frequently queried fields
|
|
174
|
-
- Use transactions for multi-document operations
|
|
175
|
-
- Use $set for updates (don't replace entire documents)
|
|
176
|
-
- Use projection to limit returned fields
|
|
177
|
-
- Use aggregation pipeline for complex queries
|
|
178
|
-
- Enable replica sets for production
|
|
179
|
-
- Use sharding for large datasets
|
|
180
|
-
- Monitor slow queries
|
|
181
|
-
- Use appropriate data types (ObjectId, Date, etc.)
|
|
182
|
-
|
|
183
|
-
❌ **DON'T:**
|
|
184
|
-
- Store large binary data (use GridFS)
|
|
185
|
-
- Create too many indexes (affects write performance)
|
|
186
|
-
- Use $where (slow, use aggregation instead)
|
|
187
|
-
- Skip error handling
|
|
188
|
-
- Hardcode connection strings
|
|
189
|
-
- Ignore connection pool limits
|
|
190
|
-
- Use nested arrays deeply (limit to 2-3 levels)
|
|
191
|
-
- Skip validation
|
|
192
|
-
- Ignore query performance
|
|
193
|
-
- Store sensitive data without encryption
|
|
194
|
-
|
|
195
|
-
## Configuration
|
|
196
|
-
|
|
197
|
-
### Environment Variables
|
|
198
|
-
```bash
|
|
199
|
-
MONGODB_URI=mongodb://localhost:27017/myapp
|
|
200
|
-
MONGODB_URI=mongodb://user:password@host:27017/database?authSource=admin
|
|
201
|
-
MONGODB_URI=mongodb+srv://user:password@cluster.mongodb.net/database
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
### Docker Compose
|
|
205
|
-
```yaml
|
|
206
|
-
services:
|
|
207
|
-
mongodb:
|
|
208
|
-
image: mongo:7
|
|
209
|
-
ports:
|
|
210
|
-
- "27017:27017"
|
|
211
|
-
environment:
|
|
212
|
-
MONGO_INITDB_ROOT_USERNAME: admin
|
|
213
|
-
MONGO_INITDB_ROOT_PASSWORD: securepassword
|
|
214
|
-
MONGO_INITDB_DATABASE: myapp
|
|
215
|
-
volumes:
|
|
216
|
-
- mongodb_data:/data/db
|
|
217
|
-
healthcheck:
|
|
218
|
-
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
|
|
219
|
-
interval: 10s
|
|
220
|
-
timeout: 5s
|
|
221
|
-
retries: 5
|
|
222
|
-
|
|
223
|
-
volumes:
|
|
224
|
-
mongodb_data:
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
## Integration with Development
|
|
228
|
-
|
|
229
|
-
### Testing
|
|
230
|
-
```typescript
|
|
231
|
-
// Use test database
|
|
232
|
-
const testClient = new MongoClient('mongodb://localhost:27017/test_db')
|
|
233
|
-
await testClient.connect()
|
|
234
|
-
const testDb = testClient.db('test_db')
|
|
235
|
-
|
|
236
|
-
// Clean up after tests
|
|
237
|
-
afterEach(async () => {
|
|
238
|
-
await testDb.collection('users').deleteMany({})
|
|
239
|
-
await testDb.collection('posts').deleteMany({})
|
|
240
|
-
})
|
|
241
|
-
|
|
242
|
-
// Use transactions for test isolation
|
|
243
|
-
beforeEach(async () => {
|
|
244
|
-
const session = testClient.startSession()
|
|
245
|
-
session.startTransaction()
|
|
246
|
-
// Store session for rollback
|
|
247
|
-
})
|
|
248
|
-
|
|
249
|
-
afterEach(async () => {
|
|
250
|
-
await session.abortTransaction()
|
|
251
|
-
await session.endSession()
|
|
252
|
-
})
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
### Health Checks
|
|
256
|
-
```typescript
|
|
257
|
-
async function checkDatabaseHealth(): Promise<boolean> {
|
|
258
|
-
try {
|
|
259
|
-
await client.db('admin').command({ ping: 1 })
|
|
260
|
-
return true
|
|
261
|
-
} catch {
|
|
262
|
-
return false
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
<!-- MONGODB:END -->
|
|
268
|
-
|
|
1
|
+
<!-- MONGODB:START -->
|
|
2
|
+
# MongoDB Database Instructions
|
|
3
|
+
|
|
4
|
+
**CRITICAL**: Use MongoDB for document-based NoSQL storage with flexible schemas, horizontal scaling, and rich querying.
|
|
5
|
+
|
|
6
|
+
## Core Features
|
|
7
|
+
|
|
8
|
+
### Connection
|
|
9
|
+
```typescript
|
|
10
|
+
// Using mongodb driver
|
|
11
|
+
import { MongoClient } from 'mongodb'
|
|
12
|
+
|
|
13
|
+
const client = new MongoClient(process.env.MONGODB_URI || 'mongodb://localhost:27017', {
|
|
14
|
+
maxPoolSize: 10,
|
|
15
|
+
minPoolSize: 2,
|
|
16
|
+
maxIdleTimeMS: 30000,
|
|
17
|
+
serverSelectionTimeoutMS: 5000,
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
await client.connect()
|
|
21
|
+
const db = client.db(process.env.DB_NAME || 'myapp')
|
|
22
|
+
|
|
23
|
+
// Using Mongoose
|
|
24
|
+
import mongoose from 'mongoose'
|
|
25
|
+
|
|
26
|
+
await mongoose.connect(process.env.MONGODB_URI, {
|
|
27
|
+
maxPoolSize: 10,
|
|
28
|
+
minPoolSize: 2,
|
|
29
|
+
bufferCommands: false,
|
|
30
|
+
bufferMaxEntries: 0,
|
|
31
|
+
})
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Basic Operations
|
|
35
|
+
```typescript
|
|
36
|
+
// Insert
|
|
37
|
+
const result = await db.collection('users').insertOne({
|
|
38
|
+
name: 'John Doe',
|
|
39
|
+
email: 'john@example.com',
|
|
40
|
+
createdAt: new Date(),
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
// Insert many
|
|
44
|
+
await db.collection('users').insertMany([
|
|
45
|
+
{ name: 'User 1', email: 'user1@example.com' },
|
|
46
|
+
{ name: 'User 2', email: 'user2@example.com' },
|
|
47
|
+
])
|
|
48
|
+
|
|
49
|
+
// Find
|
|
50
|
+
const user = await db.collection('users').findOne({ email: 'john@example.com' })
|
|
51
|
+
const users = await db.collection('users').find({ active: true }).toArray()
|
|
52
|
+
|
|
53
|
+
// Update
|
|
54
|
+
await db.collection('users').updateOne(
|
|
55
|
+
{ email: 'john@example.com' },
|
|
56
|
+
{ $set: { name: 'Jane Doe', updatedAt: new Date() } }
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
// Update many
|
|
60
|
+
await db.collection('users').updateMany(
|
|
61
|
+
{ active: false },
|
|
62
|
+
{ $set: { status: 'inactive' } }
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
// Delete
|
|
66
|
+
await db.collection('users').deleteOne({ email: 'john@example.com' })
|
|
67
|
+
await db.collection('users').deleteMany({ active: false })
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Advanced Queries
|
|
71
|
+
```typescript
|
|
72
|
+
// Aggregation pipeline
|
|
73
|
+
const result = await db.collection('orders').aggregate([
|
|
74
|
+
{ $match: { status: 'completed' } },
|
|
75
|
+
{ $group: { _id: '$userId', total: { $sum: '$amount' } } },
|
|
76
|
+
{ $sort: { total: -1 } },
|
|
77
|
+
{ $limit: 10 },
|
|
78
|
+
]).toArray()
|
|
79
|
+
|
|
80
|
+
// Text search
|
|
81
|
+
await db.collection('articles').createIndex({ title: 'text', content: 'text' })
|
|
82
|
+
const results = await db.collection('articles').find({
|
|
83
|
+
$text: { $search: 'search term' },
|
|
84
|
+
}).toArray()
|
|
85
|
+
|
|
86
|
+
// Geospatial queries
|
|
87
|
+
await db.collection('locations').createIndex({ location: '2dsphere' })
|
|
88
|
+
const nearby = await db.collection('locations').find({
|
|
89
|
+
location: {
|
|
90
|
+
$near: {
|
|
91
|
+
$geometry: { type: 'Point', coordinates: [longitude, latitude] },
|
|
92
|
+
$maxDistance: 1000, // meters
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
}).toArray()
|
|
96
|
+
|
|
97
|
+
// Array operations
|
|
98
|
+
await db.collection('users').find({
|
|
99
|
+
tags: { $in: ['javascript', 'typescript'] },
|
|
100
|
+
})
|
|
101
|
+
await db.collection('users').updateOne(
|
|
102
|
+
{ email: 'john@example.com' },
|
|
103
|
+
{ $push: { tags: 'new-tag' } }
|
|
104
|
+
)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Common Patterns
|
|
108
|
+
|
|
109
|
+
### Mongoose Schemas
|
|
110
|
+
```typescript
|
|
111
|
+
import mongoose, { Schema } from 'mongoose'
|
|
112
|
+
|
|
113
|
+
const userSchema = new Schema({
|
|
114
|
+
name: { type: String, required: true },
|
|
115
|
+
email: { type: String, required: true, unique: true, index: true },
|
|
116
|
+
age: { type: Number, min: 0, max: 120 },
|
|
117
|
+
tags: [String],
|
|
118
|
+
metadata: { type: Schema.Types.Mixed },
|
|
119
|
+
createdAt: { type: Date, default: Date.now },
|
|
120
|
+
updatedAt: { type: Date, default: Date.now },
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
userSchema.pre('save', function(next) {
|
|
124
|
+
this.updatedAt = new Date()
|
|
125
|
+
next()
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
const User = mongoose.model('User', userSchema)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Transactions
|
|
132
|
+
```typescript
|
|
133
|
+
const session = client.startSession()
|
|
134
|
+
try {
|
|
135
|
+
await session.withTransaction(async () => {
|
|
136
|
+
await db.collection('accounts').updateOne(
|
|
137
|
+
{ userId: userId },
|
|
138
|
+
{ $inc: { balance: -100 } },
|
|
139
|
+
{ session }
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
await db.collection('transactions').insertOne(
|
|
143
|
+
{ userId, amount: -100, type: 'debit' },
|
|
144
|
+
{ session }
|
|
145
|
+
)
|
|
146
|
+
})
|
|
147
|
+
} finally {
|
|
148
|
+
await session.endSession()
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Indexing
|
|
153
|
+
```typescript
|
|
154
|
+
// Create indexes
|
|
155
|
+
await db.collection('users').createIndex({ email: 1 }, { unique: true })
|
|
156
|
+
await db.collection('users').createIndex({ name: 1, email: 1 })
|
|
157
|
+
await db.collection('users').createIndex({ createdAt: -1 })
|
|
158
|
+
|
|
159
|
+
// Compound index
|
|
160
|
+
await db.collection('posts').createIndex({ authorId: 1, createdAt: -1 })
|
|
161
|
+
|
|
162
|
+
// TTL index (auto-delete after time)
|
|
163
|
+
await db.collection('sessions').createIndex(
|
|
164
|
+
{ createdAt: 1 },
|
|
165
|
+
{ expireAfterSeconds: 3600 }
|
|
166
|
+
)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Best Practices
|
|
170
|
+
|
|
171
|
+
✅ **DO:**
|
|
172
|
+
- Use connection pooling (10-20 connections)
|
|
173
|
+
- Create indexes on frequently queried fields
|
|
174
|
+
- Use transactions for multi-document operations
|
|
175
|
+
- Use $set for updates (don't replace entire documents)
|
|
176
|
+
- Use projection to limit returned fields
|
|
177
|
+
- Use aggregation pipeline for complex queries
|
|
178
|
+
- Enable replica sets for production
|
|
179
|
+
- Use sharding for large datasets
|
|
180
|
+
- Monitor slow queries
|
|
181
|
+
- Use appropriate data types (ObjectId, Date, etc.)
|
|
182
|
+
|
|
183
|
+
❌ **DON'T:**
|
|
184
|
+
- Store large binary data (use GridFS)
|
|
185
|
+
- Create too many indexes (affects write performance)
|
|
186
|
+
- Use $where (slow, use aggregation instead)
|
|
187
|
+
- Skip error handling
|
|
188
|
+
- Hardcode connection strings
|
|
189
|
+
- Ignore connection pool limits
|
|
190
|
+
- Use nested arrays deeply (limit to 2-3 levels)
|
|
191
|
+
- Skip validation
|
|
192
|
+
- Ignore query performance
|
|
193
|
+
- Store sensitive data without encryption
|
|
194
|
+
|
|
195
|
+
## Configuration
|
|
196
|
+
|
|
197
|
+
### Environment Variables
|
|
198
|
+
```bash
|
|
199
|
+
MONGODB_URI=mongodb://localhost:27017/myapp
|
|
200
|
+
MONGODB_URI=mongodb://user:password@host:27017/database?authSource=admin
|
|
201
|
+
MONGODB_URI=mongodb+srv://user:password@cluster.mongodb.net/database
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Docker Compose
|
|
205
|
+
```yaml
|
|
206
|
+
services:
|
|
207
|
+
mongodb:
|
|
208
|
+
image: mongo:7
|
|
209
|
+
ports:
|
|
210
|
+
- "27017:27017"
|
|
211
|
+
environment:
|
|
212
|
+
MONGO_INITDB_ROOT_USERNAME: admin
|
|
213
|
+
MONGO_INITDB_ROOT_PASSWORD: securepassword
|
|
214
|
+
MONGO_INITDB_DATABASE: myapp
|
|
215
|
+
volumes:
|
|
216
|
+
- mongodb_data:/data/db
|
|
217
|
+
healthcheck:
|
|
218
|
+
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
|
|
219
|
+
interval: 10s
|
|
220
|
+
timeout: 5s
|
|
221
|
+
retries: 5
|
|
222
|
+
|
|
223
|
+
volumes:
|
|
224
|
+
mongodb_data:
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Integration with Development
|
|
228
|
+
|
|
229
|
+
### Testing
|
|
230
|
+
```typescript
|
|
231
|
+
// Use test database
|
|
232
|
+
const testClient = new MongoClient('mongodb://localhost:27017/test_db')
|
|
233
|
+
await testClient.connect()
|
|
234
|
+
const testDb = testClient.db('test_db')
|
|
235
|
+
|
|
236
|
+
// Clean up after tests
|
|
237
|
+
afterEach(async () => {
|
|
238
|
+
await testDb.collection('users').deleteMany({})
|
|
239
|
+
await testDb.collection('posts').deleteMany({})
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
// Use transactions for test isolation
|
|
243
|
+
beforeEach(async () => {
|
|
244
|
+
const session = testClient.startSession()
|
|
245
|
+
session.startTransaction()
|
|
246
|
+
// Store session for rollback
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
afterEach(async () => {
|
|
250
|
+
await session.abortTransaction()
|
|
251
|
+
await session.endSession()
|
|
252
|
+
})
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Health Checks
|
|
256
|
+
```typescript
|
|
257
|
+
async function checkDatabaseHealth(): Promise<boolean> {
|
|
258
|
+
try {
|
|
259
|
+
await client.db('admin').command({ ping: 1 })
|
|
260
|
+
return true
|
|
261
|
+
} catch {
|
|
262
|
+
return false
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
<!-- MONGODB:END -->
|
|
268
|
+
|