@hivehub/rulebook 5.5.1 → 5.7.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/rulebook-learn-capture.md +41 -48
- package/.claude/commands/rulebook-learn-list.md +13 -13
- package/README.md +332 -394
- package/dist/cli/commands/context-intelligence.d.ts +0 -1
- package/dist/cli/commands/context-intelligence.d.ts.map +1 -1
- package/dist/cli/commands/context-intelligence.js +12 -33
- package/dist/cli/commands/context-intelligence.js.map +1 -1
- package/dist/cli/commands/index.d.ts +4 -7
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +4 -7
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +40 -81
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +0 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +1 -7
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/memory.d.ts +7 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +51 -57
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/misc.d.ts +1 -15
- package/dist/cli/commands/misc.d.ts.map +1 -1
- package/dist/cli/commands/misc.js +36 -215
- package/dist/cli/commands/misc.js.map +1 -1
- package/dist/cli/commands/plans.d.ts +0 -6
- package/dist/cli/commands/plans.d.ts.map +1 -1
- package/dist/cli/commands/plans.js +9 -77
- package/dist/cli/commands/plans.js.map +1 -1
- package/dist/cli/commands/skills.js +6 -6
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/task.js +4 -4
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +122 -52
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +1 -78
- package/dist/cli/prompts.js.map +1 -1
- package/dist/core/claude/claude-mcp.d.ts +59 -0
- package/dist/core/claude/claude-mcp.d.ts.map +1 -0
- package/dist/core/claude/claude-mcp.js +220 -0
- package/dist/core/claude/claude-mcp.js.map +1 -0
- package/dist/core/claude/claude-md-generator.d.ts +52 -0
- package/dist/core/claude/claude-md-generator.d.ts.map +1 -0
- package/dist/core/claude/claude-md-generator.js +104 -0
- package/dist/core/claude/claude-md-generator.js.map +1 -0
- package/dist/core/claude/claude-settings-manager.d.ts +44 -0
- package/dist/core/claude/claude-settings-manager.d.ts.map +1 -0
- package/dist/core/claude/claude-settings-manager.js +194 -0
- package/dist/core/claude/claude-settings-manager.js.map +1 -0
- package/dist/core/claude-settings-manager.d.ts.map +1 -1
- package/dist/core/claude-settings-manager.js +9 -3
- package/dist/core/claude-settings-manager.js.map +1 -1
- package/dist/core/console/cli-bridge.d.ts +113 -0
- package/dist/core/console/cli-bridge.d.ts.map +1 -0
- package/dist/core/console/cli-bridge.js +1094 -0
- package/dist/core/console/cli-bridge.js.map +1 -0
- package/dist/core/detect/detector.d.ts +35 -0
- package/dist/core/detect/detector.d.ts.map +1 -0
- package/dist/core/detect/detector.js +541 -0
- package/dist/core/detect/detector.js.map +1 -0
- package/dist/core/docs/docs-generator.d.ts +9 -0
- package/dist/core/docs/docs-generator.d.ts.map +1 -0
- package/dist/core/docs/docs-generator.js +531 -0
- package/dist/core/docs/docs-generator.js.map +1 -0
- package/dist/core/docs/mcp-reference-generator.d.ts +13 -0
- package/dist/core/docs/mcp-reference-generator.d.ts.map +1 -0
- package/dist/core/docs/mcp-reference-generator.js +66 -0
- package/dist/core/docs/mcp-reference-generator.js.map +1 -0
- package/dist/core/generators/generator.d.ts +54 -0
- package/dist/core/generators/generator.d.ts.map +1 -0
- package/dist/core/generators/generator.js +1041 -0
- package/dist/core/generators/generator.js.map +1 -0
- package/dist/core/generators/gitignore-generator.d.ts +13 -0
- package/dist/core/generators/gitignore-generator.d.ts.map +1 -0
- package/dist/core/generators/gitignore-generator.js +307 -0
- package/dist/core/generators/gitignore-generator.js.map +1 -0
- package/dist/core/generators/minimal-scaffolder.d.ts +8 -0
- package/dist/core/generators/minimal-scaffolder.d.ts.map +1 -0
- package/dist/core/generators/minimal-scaffolder.js +51 -0
- package/dist/core/generators/minimal-scaffolder.js.map +1 -0
- package/dist/core/generators/rules-generator.d.ts +73 -0
- package/dist/core/generators/rules-generator.d.ts.map +1 -0
- package/dist/core/generators/rules-generator.js +202 -0
- package/dist/core/generators/rules-generator.js.map +1 -0
- package/dist/core/generators/workflow-generator.d.ts +15 -0
- package/dist/core/generators/workflow-generator.d.ts.map +1 -0
- package/dist/core/generators/workflow-generator.js +390 -0
- package/dist/core/generators/workflow-generator.js.map +1 -0
- package/dist/core/ide/multi-tool-generator.d.ts +59 -0
- package/dist/core/ide/multi-tool-generator.d.ts.map +1 -0
- package/dist/core/ide/multi-tool-generator.js +157 -0
- package/dist/core/ide/multi-tool-generator.js.map +1 -0
- package/dist/core/ide/opencode-generator.d.ts +72 -0
- package/dist/core/ide/opencode-generator.d.ts.map +1 -0
- package/dist/core/ide/opencode-generator.js +450 -0
- package/dist/core/ide/opencode-generator.js.map +1 -0
- package/dist/core/merger.d.ts +1 -1
- package/dist/core/merger.d.ts.map +1 -1
- package/dist/core/merger.js +5 -5
- package/dist/core/merger.js.map +1 -1
- package/dist/core/migrator.d.ts +0 -1
- package/dist/core/migrator.d.ts.map +1 -1
- package/dist/core/migrator.js +4 -29
- package/dist/core/migrator.js.map +1 -1
- package/dist/core/quality/coverage-checker.d.ts +14 -0
- package/dist/core/quality/coverage-checker.d.ts.map +1 -0
- package/dist/core/quality/coverage-checker.js +176 -0
- package/dist/core/quality/coverage-checker.js.map +1 -0
- package/dist/core/quality/dependency-checker.d.ts +21 -0
- package/dist/core/quality/dependency-checker.d.ts.map +1 -0
- package/dist/core/quality/dependency-checker.js +247 -0
- package/dist/core/quality/dependency-checker.js.map +1 -0
- package/dist/core/quality/doctor.d.ts +19 -0
- package/dist/core/quality/doctor.d.ts.map +1 -0
- package/dist/core/quality/doctor.js +163 -0
- package/dist/core/quality/doctor.js.map +1 -0
- package/dist/core/quality/validator.d.ts +21 -0
- package/dist/core/quality/validator.d.ts.map +1 -0
- package/dist/core/quality/validator.js +177 -0
- package/dist/core/quality/validator.js.map +1 -0
- package/dist/core/ralph-scripts.d.ts.map +1 -1
- package/dist/core/ralph-scripts.js +7 -6
- package/dist/core/ralph-scripts.js.map +1 -1
- package/dist/core/skills/skills-manager.d.ts +126 -0
- package/dist/core/skills/skills-manager.d.ts.map +1 -0
- package/dist/core/skills/skills-manager.js +630 -0
- package/dist/core/skills/skills-manager.js.map +1 -0
- package/dist/core/state/config-manager.d.ts +86 -0
- package/dist/core/state/config-manager.d.ts.map +1 -0
- package/dist/core/state/config-manager.js +562 -0
- package/dist/core/state/config-manager.js.map +1 -0
- package/dist/core/state/override-manager.d.ts +23 -0
- package/dist/core/state/override-manager.d.ts.map +1 -0
- package/dist/core/state/override-manager.js +82 -0
- package/dist/core/state/override-manager.js.map +1 -0
- package/dist/core/state/state-writer.d.ts +34 -0
- package/dist/core/state/state-writer.d.ts.map +1 -0
- package/dist/core/state/state-writer.js +78 -0
- package/dist/core/state/state-writer.js.map +1 -0
- package/dist/core/state/version-bumper.d.ts +19 -0
- package/dist/core/state/version-bumper.d.ts.map +1 -0
- package/dist/core/state/version-bumper.js +180 -0
- package/dist/core/state/version-bumper.js.map +1 -0
- package/dist/core/tasks/decision-manager.d.ts +25 -0
- package/dist/core/tasks/decision-manager.d.ts.map +1 -0
- package/dist/core/tasks/decision-manager.js +183 -0
- package/dist/core/tasks/decision-manager.js.map +1 -0
- package/dist/core/tasks/knowledge-manager.d.ts +24 -0
- package/dist/core/tasks/knowledge-manager.d.ts.map +1 -0
- package/dist/core/tasks/knowledge-manager.js +173 -0
- package/dist/core/tasks/knowledge-manager.js.map +1 -0
- package/dist/core/tasks/learn-manager.d.ts +27 -0
- package/dist/core/tasks/learn-manager.d.ts.map +1 -0
- package/dist/core/tasks/learn-manager.js +121 -0
- package/dist/core/tasks/learn-manager.js.map +1 -0
- package/dist/core/tasks/plans-manager.d.ts +46 -0
- package/dist/core/tasks/plans-manager.d.ts.map +1 -0
- package/dist/core/tasks/plans-manager.js +158 -0
- package/dist/core/tasks/plans-manager.js.map +1 -0
- package/dist/core/tasks/task-manager.d.ts +127 -0
- package/dist/core/tasks/task-manager.d.ts.map +1 -0
- package/dist/core/tasks/task-manager.js +607 -0
- package/dist/core/tasks/task-manager.js.map +1 -0
- package/dist/core/workspace/project-worker.d.ts +6 -6
- package/dist/core/workspace/project-worker.d.ts.map +1 -1
- package/dist/core/workspace/project-worker.js +6 -6
- package/dist/core/workspace/project-worker.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -176
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +16 -960
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/file-search.d.ts +43 -0
- package/dist/memory/file-search.d.ts.map +1 -0
- package/dist/memory/file-search.js +228 -0
- package/dist/memory/file-search.js.map +1 -0
- package/dist/memory/file-store.d.ts +99 -0
- package/dist/memory/file-store.d.ts.map +1 -0
- package/dist/memory/file-store.js +615 -0
- package/dist/memory/file-store.js.map +1 -0
- package/dist/memory/legacy-migrator.d.ts +27 -0
- package/dist/memory/legacy-migrator.d.ts.map +1 -0
- package/dist/memory/legacy-migrator.js +185 -0
- package/dist/memory/legacy-migrator.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +25 -24
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +97 -140
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/memory-types.d.ts +1 -1
- package/dist/memory/memory-types.d.ts.map +1 -1
- package/dist/types.d.ts +8 -119
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/file-system.d.ts +22 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +31 -0
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/git-hooks.d.ts.map +1 -1
- package/dist/utils/git-hooks.js +3 -2
- package/dist/utils/git-hooks.js.map +1 -1
- package/package.json +2 -6
- package/templates/agents/context-intelligence.md +50 -52
- package/templates/cli/OPENCODE.md +85 -18
- package/templates/commands/rulebook-learn-capture.md +41 -48
- package/templates/commands/rulebook-learn-list.md +13 -13
- package/templates/core/AGENTS_LEAN.md +0 -14
- package/templates/hooks/check-context-and-handoff.sh +74 -76
- package/templates/hooks/enforce-pre-tool.sh +70 -0
- 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.sh +61 -61
- package/templates/hooks/terse-activate.sh +197 -197
- package/templates/hooks/terse-mode-tracker.sh +190 -187
- package/templates/ides/OPENCODE.md +63 -0
- package/templates/skills/cli/opencode/SKILL.md +82 -28
- package/.claude/commands/ralph-config.md +0 -112
- package/.claude/commands/ralph-history.md +0 -110
- package/.claude/commands/ralph-init.md +0 -72
- package/.claude/commands/ralph-pause-resume.md +0 -105
- package/.claude/commands/ralph-run.md +0 -101
- package/.claude/commands/ralph-status.md +0 -76
- package/templates/core/RALPH.md +0 -471
- package/templates/frameworks/ANGULAR.md +0 -36
- package/templates/frameworks/DJANGO.md +0 -83
- package/templates/frameworks/ELECTRON.md +0 -147
- package/templates/frameworks/FLASK.md +0 -38
- package/templates/frameworks/FLUTTER.md +0 -55
- package/templates/frameworks/JQUERY.md +0 -32
- package/templates/frameworks/LARAVEL.md +0 -38
- package/templates/frameworks/NESTJS.md +0 -43
- package/templates/frameworks/NEXTJS.md +0 -127
- package/templates/frameworks/NUXT.md +0 -40
- package/templates/frameworks/RAILS.md +0 -66
- package/templates/frameworks/REACT.md +0 -38
- package/templates/frameworks/REACT_NATIVE.md +0 -47
- package/templates/frameworks/SPRING.md +0 -39
- package/templates/frameworks/SYMFONY.md +0 -36
- package/templates/frameworks/VUE.md +0 -36
- package/templates/frameworks/ZEND.md +0 -35
- package/templates/hooks/enforce-mcp-for-tasks.sh +0 -31
- package/templates/hooks/enforce-no-deferred.sh +0 -21
- package/templates/hooks/enforce-no-shortcuts.sh +0 -31
- package/templates/ides/COPILOT.md +0 -37
- package/templates/ides/CURSOR.md +0 -43
- package/templates/ides/JETBRAINS_AI.md +0 -35
- package/templates/ides/REPLIT.md +0 -36
- package/templates/ides/TABNINE.md +0 -29
- package/templates/ides/VSCODE.md +0 -40
- package/templates/ides/WINDSURF.md +0 -36
- package/templates/ides/ZED.md +0 -32
- package/templates/ides/cursor-mdc/go.mdc +0 -24
- package/templates/ides/cursor-mdc/python.mdc +0 -24
- package/templates/ides/cursor-mdc/quality.mdc +0 -25
- package/templates/ides/cursor-mdc/ralph.mdc +0 -39
- package/templates/ides/cursor-mdc/rulebook.mdc +0 -38
- package/templates/ides/cursor-mdc/rust.mdc +0 -24
- package/templates/ides/cursor-mdc/typescript.mdc +0 -25
- package/templates/ralph/ralph-history.bat +0 -4
- package/templates/ralph/ralph-history.sh +0 -5
- package/templates/ralph/ralph-init.bat +0 -5
- package/templates/ralph/ralph-init.sh +0 -5
- package/templates/ralph/ralph-pause.bat +0 -5
- package/templates/ralph/ralph-pause.sh +0 -5
- package/templates/ralph/ralph-run.bat +0 -5
- package/templates/ralph/ralph-run.sh +0 -5
- package/templates/ralph/ralph-status.bat +0 -4
- package/templates/ralph/ralph-status.sh +0 -5
- package/templates/services/AZURE_BLOB.md +0 -184
- package/templates/services/CASSANDRA.md +0 -239
- package/templates/services/DATADOG.md +0 -26
- package/templates/services/DOCKER.md +0 -124
- package/templates/services/DOCKER_COMPOSE.md +0 -168
- package/templates/services/DYNAMODB.md +0 -308
- package/templates/services/ELASTICSEARCH.md +0 -347
- package/templates/services/GCS.md +0 -178
- package/templates/services/HELM.md +0 -194
- package/templates/services/INFLUXDB.md +0 -265
- package/templates/services/KAFKA.md +0 -341
- package/templates/services/KUBERNETES.md +0 -208
- package/templates/services/MARIADB.md +0 -183
- package/templates/services/MEMCACHED.md +0 -242
- package/templates/services/MINIO.md +0 -201
- package/templates/services/MONGODB.md +0 -268
- package/templates/services/MYSQL.md +0 -358
- package/templates/services/NEO4J.md +0 -247
- package/templates/services/OPENTELEMETRY.md +0 -25
- package/templates/services/ORACLE.md +0 -290
- package/templates/services/PINO.md +0 -24
- package/templates/services/POSTGRESQL.md +0 -326
- package/templates/services/PROMETHEUS.md +0 -33
- package/templates/services/RABBITMQ.md +0 -286
- package/templates/services/REDIS.md +0 -292
- package/templates/services/S3.md +0 -298
- package/templates/services/SENTRY.md +0 -23
- package/templates/services/SQLITE.md +0 -294
- package/templates/services/SQLSERVER.md +0 -294
- package/templates/services/WINSTON.md +0 -30
- package/templates/skills/frameworks/angular/SKILL.md +0 -46
- package/templates/skills/frameworks/django/SKILL.md +0 -93
- package/templates/skills/frameworks/electron/SKILL.md +0 -157
- package/templates/skills/frameworks/flask/SKILL.md +0 -48
- package/templates/skills/frameworks/flutter/SKILL.md +0 -65
- package/templates/skills/frameworks/jquery/SKILL.md +0 -42
- package/templates/skills/frameworks/laravel/SKILL.md +0 -48
- package/templates/skills/frameworks/nestjs/SKILL.md +0 -53
- package/templates/skills/frameworks/nextjs/SKILL.md +0 -137
- package/templates/skills/frameworks/nuxt/SKILL.md +0 -50
- package/templates/skills/frameworks/rails/SKILL.md +0 -76
- package/templates/skills/frameworks/react/SKILL.md +0 -48
- package/templates/skills/frameworks/react-native/SKILL.md +0 -57
- package/templates/skills/frameworks/spring/SKILL.md +0 -49
- package/templates/skills/frameworks/symfony/SKILL.md +0 -46
- package/templates/skills/frameworks/vue/SKILL.md +0 -46
- package/templates/skills/frameworks/zend/SKILL.md +0 -45
- package/templates/skills/services/azure-blob/SKILL.md +0 -194
- package/templates/skills/services/cassandra/SKILL.md +0 -249
- package/templates/skills/services/dynamodb/SKILL.md +0 -318
- package/templates/skills/services/elasticsearch/SKILL.md +0 -357
- package/templates/skills/services/gcs/SKILL.md +0 -188
- package/templates/skills/services/influxdb/SKILL.md +0 -275
- package/templates/skills/services/kafka/SKILL.md +0 -351
- package/templates/skills/services/mariadb/SKILL.md +0 -193
- package/templates/skills/services/memcached/SKILL.md +0 -252
- package/templates/skills/services/minio/SKILL.md +0 -211
- package/templates/skills/services/mongodb/SKILL.md +0 -278
- package/templates/skills/services/mysql/SKILL.md +0 -368
- package/templates/skills/services/neo4j/SKILL.md +0 -257
- package/templates/skills/services/oracle/SKILL.md +0 -300
- package/templates/skills/services/postgresql/SKILL.md +0 -336
- package/templates/skills/services/rabbitmq/SKILL.md +0 -296
- package/templates/skills/services/redis/SKILL.md +0 -302
- package/templates/skills/services/s3/SKILL.md +0 -308
- package/templates/skills/services/sqlite/SKILL.md +0 -304
- package/templates/skills/services/sqlserver/SKILL.md +0 -304
- package/templates/skills/workflows/ralph/SETUP.md +0 -228
- package/templates/skills/workflows/ralph/SKILL.md +0 -309
- package/templates/skills/workflows/ralph/install.sh +0 -87
- package/templates/skills/workflows/ralph/manifest.json +0 -158
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
<!-- RABBITMQ:START -->
|
|
2
|
-
# RabbitMQ Message Queue Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Use RabbitMQ for reliable message queuing, pub/sub messaging, and task distribution with multiple exchange types.
|
|
5
|
-
|
|
6
|
-
## Core Features
|
|
7
|
-
|
|
8
|
-
### Connection
|
|
9
|
-
```typescript
|
|
10
|
-
// Using amqplib
|
|
11
|
-
import amqp from 'amqplib'
|
|
12
|
-
|
|
13
|
-
const connection = await amqp.connect(process.env.RABBITMQ_URL || 'amqp://localhost:5672')
|
|
14
|
-
const channel = await connection.createChannel()
|
|
15
|
-
|
|
16
|
-
// Connection with options
|
|
17
|
-
const connection = await amqp.connect({
|
|
18
|
-
protocol: 'amqp',
|
|
19
|
-
hostname: process.env.RABBITMQ_HOST || 'localhost',
|
|
20
|
-
port: parseInt(process.env.RABBITMQ_PORT || '5672'),
|
|
21
|
-
username: process.env.RABBITMQ_USER || 'guest',
|
|
22
|
-
password: process.env.RABBITMQ_PASSWORD || 'guest',
|
|
23
|
-
vhost: process.env.RABBITMQ_VHOST || '/',
|
|
24
|
-
})
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### Basic Operations
|
|
28
|
-
```typescript
|
|
29
|
-
// Declare queue
|
|
30
|
-
await channel.assertQueue('tasks', {
|
|
31
|
-
durable: true, // Survive broker restart
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
// Send message
|
|
35
|
-
channel.sendToQueue('tasks', Buffer.from(JSON.stringify({ task: 'process' })), {
|
|
36
|
-
persistent: true, // Survive broker restart
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
// Consume messages
|
|
40
|
-
await channel.consume('tasks', (msg) => {
|
|
41
|
-
if (msg) {
|
|
42
|
-
const content = JSON.parse(msg.content.toString())
|
|
43
|
-
console.log('Received:', content)
|
|
44
|
-
|
|
45
|
-
// Process message
|
|
46
|
-
processTask(content)
|
|
47
|
-
|
|
48
|
-
// Acknowledge
|
|
49
|
-
channel.ack(msg)
|
|
50
|
-
}
|
|
51
|
-
}, {
|
|
52
|
-
noAck: false, // Manual acknowledgment
|
|
53
|
-
})
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Exchange Types
|
|
57
|
-
```typescript
|
|
58
|
-
// Direct exchange
|
|
59
|
-
await channel.assertExchange('logs', 'direct', { durable: true })
|
|
60
|
-
await channel.bindQueue('queue', 'logs', 'error')
|
|
61
|
-
await channel.publish('logs', 'error', Buffer.from('Error message'))
|
|
62
|
-
|
|
63
|
-
// Topic exchange
|
|
64
|
-
await channel.assertExchange('events', 'topic', { durable: true })
|
|
65
|
-
await channel.bindQueue('queue', 'events', 'user.*.created')
|
|
66
|
-
await channel.publish('events', 'user.123.created', Buffer.from(JSON.stringify(data)))
|
|
67
|
-
|
|
68
|
-
// Fanout exchange (broadcast)
|
|
69
|
-
await channel.assertExchange('notifications', 'fanout', { durable: true })
|
|
70
|
-
await channel.bindQueue('queue1', 'notifications', '')
|
|
71
|
-
await channel.bindQueue('queue2', 'notifications', '')
|
|
72
|
-
await channel.publish('notifications', '', Buffer.from('Broadcast message'))
|
|
73
|
-
|
|
74
|
-
// Headers exchange
|
|
75
|
-
await channel.assertExchange('headers_exchange', 'headers', { durable: true })
|
|
76
|
-
await channel.bindQueue('queue', 'headers_exchange', '', {
|
|
77
|
-
'x-match': 'all',
|
|
78
|
-
type: 'notification',
|
|
79
|
-
priority: 'high',
|
|
80
|
-
})
|
|
81
|
-
await channel.publish('headers_exchange', '', Buffer.from('Message'), {
|
|
82
|
-
headers: { type: 'notification', priority: 'high' },
|
|
83
|
-
})
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
## Common Patterns
|
|
87
|
-
|
|
88
|
-
### Work Queue (Task Distribution)
|
|
89
|
-
```typescript
|
|
90
|
-
// Producer
|
|
91
|
-
async function publishTask(task: any) {
|
|
92
|
-
await channel.assertQueue('tasks', { durable: true })
|
|
93
|
-
channel.sendToQueue('tasks', Buffer.from(JSON.stringify(task)), {
|
|
94
|
-
persistent: true,
|
|
95
|
-
})
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Consumer
|
|
99
|
-
async function consumeTasks() {
|
|
100
|
-
await channel.assertQueue('tasks', { durable: true })
|
|
101
|
-
channel.prefetch(1) // Process one message at a time
|
|
102
|
-
|
|
103
|
-
await channel.consume('tasks', async (msg) => {
|
|
104
|
-
if (msg) {
|
|
105
|
-
try {
|
|
106
|
-
const task = JSON.parse(msg.content.toString())
|
|
107
|
-
await processTask(task)
|
|
108
|
-
channel.ack(msg)
|
|
109
|
-
} catch (error) {
|
|
110
|
-
// Reject and requeue
|
|
111
|
-
channel.nack(msg, false, true)
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
})
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### Pub/Sub
|
|
119
|
-
```typescript
|
|
120
|
-
// Publisher
|
|
121
|
-
async function publishEvent(eventType: string, data: any) {
|
|
122
|
-
await channel.assertExchange('events', 'topic', { durable: true })
|
|
123
|
-
channel.publish('events', eventType, Buffer.from(JSON.stringify(data)), {
|
|
124
|
-
persistent: true,
|
|
125
|
-
})
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Subscriber
|
|
129
|
-
async function subscribeToEvents(routingKey: string, handler: (data: any) => void) {
|
|
130
|
-
await channel.assertExchange('events', 'topic', { durable: true })
|
|
131
|
-
const queue = await channel.assertQueue('', { exclusive: true })
|
|
132
|
-
await channel.bindQueue(queue.queue, 'events', routingKey)
|
|
133
|
-
|
|
134
|
-
await channel.consume(queue.queue, (msg) => {
|
|
135
|
-
if (msg) {
|
|
136
|
-
const data = JSON.parse(msg.content.toString())
|
|
137
|
-
handler(data)
|
|
138
|
-
channel.ack(msg)
|
|
139
|
-
}
|
|
140
|
-
})
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### RPC Pattern
|
|
145
|
-
```typescript
|
|
146
|
-
// RPC Server
|
|
147
|
-
async function setupRPCServer() {
|
|
148
|
-
await channel.assertQueue('rpc_queue', { durable: false })
|
|
149
|
-
channel.prefetch(1)
|
|
150
|
-
|
|
151
|
-
await channel.consume('rpc_queue', async (msg) => {
|
|
152
|
-
if (msg) {
|
|
153
|
-
const request = JSON.parse(msg.content.toString())
|
|
154
|
-
const response = await processRequest(request)
|
|
155
|
-
|
|
156
|
-
channel.sendToQueue(
|
|
157
|
-
msg.properties.replyTo,
|
|
158
|
-
Buffer.from(JSON.stringify(response)),
|
|
159
|
-
{
|
|
160
|
-
correlationId: msg.properties.correlationId,
|
|
161
|
-
}
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
channel.ack(msg)
|
|
165
|
-
}
|
|
166
|
-
})
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// RPC Client
|
|
170
|
-
async function rpcCall(request: any): Promise<any> {
|
|
171
|
-
const queue = await channel.assertQueue('', { exclusive: true })
|
|
172
|
-
const correlationId = generateUuid()
|
|
173
|
-
|
|
174
|
-
return new Promise((resolve, reject) => {
|
|
175
|
-
const timeout = setTimeout(() => {
|
|
176
|
-
channel.deleteQueue(queue.queue)
|
|
177
|
-
reject(new Error('RPC timeout'))
|
|
178
|
-
}, 10000)
|
|
179
|
-
|
|
180
|
-
channel.consume(queue.queue, (msg) => {
|
|
181
|
-
if (msg && msg.properties.correlationId === correlationId) {
|
|
182
|
-
clearTimeout(timeout)
|
|
183
|
-
const response = JSON.parse(msg.content.toString())
|
|
184
|
-
channel.deleteQueue(queue.queue)
|
|
185
|
-
resolve(response)
|
|
186
|
-
}
|
|
187
|
-
}, { noAck: true })
|
|
188
|
-
|
|
189
|
-
channel.sendToQueue('rpc_queue', Buffer.from(JSON.stringify(request)), {
|
|
190
|
-
correlationId,
|
|
191
|
-
replyTo: queue.queue,
|
|
192
|
-
})
|
|
193
|
-
})
|
|
194
|
-
}
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
## Best Practices
|
|
198
|
-
|
|
199
|
-
✅ **DO:**
|
|
200
|
-
- Use durable queues and exchanges for important messages
|
|
201
|
-
- Set message persistence for critical messages
|
|
202
|
-
- Use manual acknowledgment (noAck: false)
|
|
203
|
-
- Implement proper error handling
|
|
204
|
-
- Use prefetch to control message distribution
|
|
205
|
-
- Monitor queue lengths
|
|
206
|
-
- Use dead letter exchanges for failed messages
|
|
207
|
-
- Implement connection retry logic
|
|
208
|
-
- Use appropriate exchange types
|
|
209
|
-
- Set message TTL when needed
|
|
210
|
-
|
|
211
|
-
❌ **DON'T:**
|
|
212
|
-
- Skip acknowledgment (lose messages on crash)
|
|
213
|
-
- Use auto-ack for critical messages
|
|
214
|
-
- Ignore connection errors
|
|
215
|
-
- Hardcode connection strings
|
|
216
|
-
- Store large messages (use external storage)
|
|
217
|
-
- Skip error handling
|
|
218
|
-
- Ignore queue monitoring
|
|
219
|
-
- Use non-durable queues for important data
|
|
220
|
-
- Skip message persistence
|
|
221
|
-
- Ignore memory limits
|
|
222
|
-
|
|
223
|
-
## Configuration
|
|
224
|
-
|
|
225
|
-
### Environment Variables
|
|
226
|
-
```bash
|
|
227
|
-
RABBITMQ_URL=amqp://localhost:5672
|
|
228
|
-
RABBITMQ_URL=amqp://user:password@host:5672/vhost
|
|
229
|
-
RABBITMQ_HOST=localhost
|
|
230
|
-
RABBITMQ_PORT=5672
|
|
231
|
-
RABBITMQ_USER=guest
|
|
232
|
-
RABBITMQ_PASSWORD=guest
|
|
233
|
-
RABBITMQ_VHOST=/
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
### Docker Compose
|
|
237
|
-
```yaml
|
|
238
|
-
services:
|
|
239
|
-
rabbitmq:
|
|
240
|
-
image: rabbitmq:3-management-alpine
|
|
241
|
-
ports:
|
|
242
|
-
- "5672:5672" # AMQP
|
|
243
|
-
- "15672:15672" # Management UI
|
|
244
|
-
environment:
|
|
245
|
-
RABBITMQ_DEFAULT_USER: admin
|
|
246
|
-
RABBITMQ_DEFAULT_PASS: securepassword
|
|
247
|
-
volumes:
|
|
248
|
-
- rabbitmq_data:/var/lib/rabbitmq
|
|
249
|
-
healthcheck:
|
|
250
|
-
test: ["CMD", "rabbitmq-diagnostics", "ping"]
|
|
251
|
-
interval: 10s
|
|
252
|
-
timeout: 5s
|
|
253
|
-
retries: 5
|
|
254
|
-
|
|
255
|
-
volumes:
|
|
256
|
-
rabbitmq_data:
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
## Integration with Development
|
|
260
|
-
|
|
261
|
-
### Testing
|
|
262
|
-
```typescript
|
|
263
|
-
// Use test connection
|
|
264
|
-
const testConnection = await amqp.connect('amqp://localhost:5673') // Different port
|
|
265
|
-
|
|
266
|
-
// Clean up after tests
|
|
267
|
-
afterEach(async () => {
|
|
268
|
-
// Delete test queues/exchanges or use separate vhost
|
|
269
|
-
})
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
### Health Checks
|
|
273
|
-
```typescript
|
|
274
|
-
async function checkRabbitMQHealth(): Promise<boolean> {
|
|
275
|
-
try {
|
|
276
|
-
const connection = await amqp.connect(process.env.RABBITMQ_URL)
|
|
277
|
-
await connection.close()
|
|
278
|
-
return true
|
|
279
|
-
} catch {
|
|
280
|
-
return false
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
<!-- RABBITMQ:END -->
|
|
286
|
-
|
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
<!-- REDIS:START -->
|
|
2
|
-
# Redis Cache Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Use Redis for high-performance caching, session storage, pub/sub messaging, and real-time features.
|
|
5
|
-
|
|
6
|
-
## Core Features
|
|
7
|
-
|
|
8
|
-
### Connection
|
|
9
|
-
```typescript
|
|
10
|
-
// Using redis (Node.js)
|
|
11
|
-
import { createClient } from 'redis'
|
|
12
|
-
|
|
13
|
-
const client = createClient({
|
|
14
|
-
url: process.env.REDIS_URL || 'redis://localhost:6379',
|
|
15
|
-
socket: {
|
|
16
|
-
reconnectStrategy: (retries) => {
|
|
17
|
-
if (retries > 10) {
|
|
18
|
-
return new Error('Too many reconnection attempts')
|
|
19
|
-
}
|
|
20
|
-
return Math.min(retries * 100, 3000)
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
await client.connect()
|
|
26
|
-
|
|
27
|
-
// Using ioredis
|
|
28
|
-
import Redis from 'ioredis'
|
|
29
|
-
|
|
30
|
-
const redis = new Redis({
|
|
31
|
-
host: process.env.REDIS_HOST || 'localhost',
|
|
32
|
-
port: parseInt(process.env.REDIS_PORT || '6379'),
|
|
33
|
-
password: process.env.REDIS_PASSWORD,
|
|
34
|
-
retryStrategy: (times) => Math.min(times * 50, 2000),
|
|
35
|
-
maxRetriesPerRequest: 3,
|
|
36
|
-
})
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### Basic Operations
|
|
40
|
-
```typescript
|
|
41
|
-
// String operations
|
|
42
|
-
await client.set('user:1', JSON.stringify({ name: 'John', email: 'john@example.com' }))
|
|
43
|
-
await client.set('user:1', 'value', { EX: 3600 }) // Expire in 1 hour
|
|
44
|
-
const user = await client.get('user:1')
|
|
45
|
-
await client.del('user:1')
|
|
46
|
-
|
|
47
|
-
// Multiple operations
|
|
48
|
-
await client.mSet({
|
|
49
|
-
'key1': 'value1',
|
|
50
|
-
'key2': 'value2',
|
|
51
|
-
})
|
|
52
|
-
const values = await client.mGet(['key1', 'key2'])
|
|
53
|
-
|
|
54
|
-
// Increment/Decrement
|
|
55
|
-
await client.incr('counter')
|
|
56
|
-
await client.incrBy('counter', 5)
|
|
57
|
-
await client.decr('counter')
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Data Structures
|
|
61
|
-
```typescript
|
|
62
|
-
// Lists
|
|
63
|
-
await client.lPush('tasks', 'task1', 'task2')
|
|
64
|
-
await client.rPush('tasks', 'task3')
|
|
65
|
-
const task = await client.lPop('tasks')
|
|
66
|
-
const tasks = await client.lRange('tasks', 0, -1)
|
|
67
|
-
|
|
68
|
-
// Sets
|
|
69
|
-
await client.sAdd('tags', 'javascript', 'typescript', 'nodejs')
|
|
70
|
-
const tags = await client.sMembers('tags')
|
|
71
|
-
const exists = await client.sIsMember('tags', 'javascript')
|
|
72
|
-
await client.sRem('tags', 'javascript')
|
|
73
|
-
|
|
74
|
-
// Sorted Sets
|
|
75
|
-
await client.zAdd('leaderboard', {
|
|
76
|
-
score: 100,
|
|
77
|
-
value: 'player1',
|
|
78
|
-
})
|
|
79
|
-
const topPlayers = await client.zRange('leaderboard', 0, 9, { REV: true })
|
|
80
|
-
|
|
81
|
-
// Hashes
|
|
82
|
-
await client.hSet('user:1', {
|
|
83
|
-
name: 'John',
|
|
84
|
-
email: 'john@example.com',
|
|
85
|
-
age: '30',
|
|
86
|
-
})
|
|
87
|
-
const user = await client.hGetAll('user:1')
|
|
88
|
-
await client.hIncrBy('user:1', 'age', 1)
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### Advanced Features
|
|
92
|
-
```typescript
|
|
93
|
-
// Pub/Sub
|
|
94
|
-
const publisher = client.duplicate()
|
|
95
|
-
await publisher.connect()
|
|
96
|
-
|
|
97
|
-
const subscriber = client.duplicate()
|
|
98
|
-
await subscriber.connect()
|
|
99
|
-
|
|
100
|
-
await subscriber.subscribe('notifications', (message) => {
|
|
101
|
-
console.log('Received:', message)
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
await publisher.publish('notifications', JSON.stringify({ type: 'alert', message: 'Hello' }))
|
|
105
|
-
|
|
106
|
-
// Streams
|
|
107
|
-
await client.xAdd('events', '*', {
|
|
108
|
-
type: 'user_login',
|
|
109
|
-
userId: '123',
|
|
110
|
-
timestamp: Date.now().toString(),
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
const events = await client.xRead({
|
|
114
|
-
key: 'events',
|
|
115
|
-
id: '0',
|
|
116
|
-
}, {
|
|
117
|
-
COUNT: 10,
|
|
118
|
-
BLOCK: 1000,
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
// Transactions
|
|
122
|
-
const multi = client.multi()
|
|
123
|
-
multi.set('key1', 'value1')
|
|
124
|
-
multi.set('key2', 'value2')
|
|
125
|
-
multi.incr('counter')
|
|
126
|
-
await multi.exec()
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Common Patterns
|
|
130
|
-
|
|
131
|
-
### Caching
|
|
132
|
-
```typescript
|
|
133
|
-
async function getCachedUser(userId: string) {
|
|
134
|
-
const cached = await client.get(`user:${userId}`)
|
|
135
|
-
if (cached) {
|
|
136
|
-
return JSON.parse(cached)
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const user = await fetchUserFromDatabase(userId)
|
|
140
|
-
await client.set(`user:${userId}`, JSON.stringify(user), { EX: 3600 })
|
|
141
|
-
return user
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Cache with tags (for invalidation)
|
|
145
|
-
async function cacheWithTags(key: string, value: any, tags: string[], ttl: number) {
|
|
146
|
-
await client.set(key, JSON.stringify(value), { EX: ttl })
|
|
147
|
-
for (const tag of tags) {
|
|
148
|
-
await client.sAdd(`tag:${tag}`, key)
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
async function invalidateByTag(tag: string) {
|
|
153
|
-
const keys = await client.sMembers(`tag:${tag}`)
|
|
154
|
-
if (keys.length > 0) {
|
|
155
|
-
await client.del(...keys)
|
|
156
|
-
}
|
|
157
|
-
await client.del(`tag:${tag}`)
|
|
158
|
-
}
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### Rate Limiting
|
|
162
|
-
```typescript
|
|
163
|
-
async function checkRateLimit(userId: string, limit: number, window: number): Promise<boolean> {
|
|
164
|
-
const key = `ratelimit:${userId}`
|
|
165
|
-
const current = await client.incr(key)
|
|
166
|
-
|
|
167
|
-
if (current === 1) {
|
|
168
|
-
await client.expire(key, window)
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
return current <= limit
|
|
172
|
-
}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### Session Storage
|
|
176
|
-
```typescript
|
|
177
|
-
async function setSession(sessionId: string, data: any, ttl: number) {
|
|
178
|
-
await client.set(`session:${sessionId}`, JSON.stringify(data), { EX: ttl })
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
async function getSession(sessionId: string) {
|
|
182
|
-
const data = await client.get(`session:${sessionId}`)
|
|
183
|
-
return data ? JSON.parse(data) : null
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
async function deleteSession(sessionId: string) {
|
|
187
|
-
await client.del(`session:${sessionId}`)
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
### Distributed Locks
|
|
192
|
-
```typescript
|
|
193
|
-
async function acquireLock(key: string, ttl: number): Promise<boolean> {
|
|
194
|
-
const result = await client.set(key, 'locked', {
|
|
195
|
-
EX: ttl,
|
|
196
|
-
NX: true, // Only set if not exists
|
|
197
|
-
})
|
|
198
|
-
return result === 'OK'
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
async function releaseLock(key: string) {
|
|
202
|
-
await client.del(key)
|
|
203
|
-
}
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
## Best Practices
|
|
207
|
-
|
|
208
|
-
✅ **DO:**
|
|
209
|
-
- Use connection pooling
|
|
210
|
-
- Set appropriate TTL for cached data
|
|
211
|
-
- Use pipelining for multiple operations
|
|
212
|
-
- Use transactions (MULTI/EXEC) for atomic operations
|
|
213
|
-
- Monitor memory usage
|
|
214
|
-
- Use appropriate data structures (hash for objects, set for unique values)
|
|
215
|
-
- Implement cache invalidation strategies
|
|
216
|
-
- Use Redis Cluster for high availability
|
|
217
|
-
- Enable persistence (RDB or AOF) for production
|
|
218
|
-
- Use Redis Sentinel for failover
|
|
219
|
-
|
|
220
|
-
❌ **DON'T:**
|
|
221
|
-
- Store large values (> 100KB, use compression or external storage)
|
|
222
|
-
- Use Redis as primary database (it's a cache)
|
|
223
|
-
- Skip error handling
|
|
224
|
-
- Ignore memory limits
|
|
225
|
-
- Hardcode connection strings
|
|
226
|
-
- Use KEYS command in production (use SCAN instead)
|
|
227
|
-
- Store sensitive data without encryption
|
|
228
|
-
- Skip connection retry logic
|
|
229
|
-
- Ignore eviction policies
|
|
230
|
-
- Use blocking operations without timeouts
|
|
231
|
-
|
|
232
|
-
## Configuration
|
|
233
|
-
|
|
234
|
-
### Environment Variables
|
|
235
|
-
```bash
|
|
236
|
-
REDIS_URL=redis://localhost:6379
|
|
237
|
-
REDIS_URL=redis://:password@host:6379
|
|
238
|
-
REDIS_URL=rediss://host:6380 # SSL
|
|
239
|
-
REDIS_HOST=localhost
|
|
240
|
-
REDIS_PORT=6379
|
|
241
|
-
REDIS_PASSWORD=securepassword
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### Docker Compose
|
|
245
|
-
```yaml
|
|
246
|
-
services:
|
|
247
|
-
redis:
|
|
248
|
-
image: redis:7-alpine
|
|
249
|
-
ports:
|
|
250
|
-
- "6379:6379"
|
|
251
|
-
command: redis-server --requirepass securepassword --appendonly yes
|
|
252
|
-
volumes:
|
|
253
|
-
- redis_data:/data
|
|
254
|
-
healthcheck:
|
|
255
|
-
test: ["CMD", "redis-cli", "ping"]
|
|
256
|
-
interval: 10s
|
|
257
|
-
timeout: 5s
|
|
258
|
-
retries: 5
|
|
259
|
-
|
|
260
|
-
volumes:
|
|
261
|
-
redis_data:
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
## Integration with Development
|
|
265
|
-
|
|
266
|
-
### Testing
|
|
267
|
-
```typescript
|
|
268
|
-
// Use test Redis instance
|
|
269
|
-
const testClient = createClient({
|
|
270
|
-
url: 'redis://localhost:6380', // Different port for tests
|
|
271
|
-
})
|
|
272
|
-
|
|
273
|
-
// Clean up after tests
|
|
274
|
-
afterEach(async () => {
|
|
275
|
-
await testClient.flushDb()
|
|
276
|
-
})
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
### Health Checks
|
|
280
|
-
```typescript
|
|
281
|
-
async function checkRedisHealth(): Promise<boolean> {
|
|
282
|
-
try {
|
|
283
|
-
await client.ping()
|
|
284
|
-
return true
|
|
285
|
-
} catch {
|
|
286
|
-
return false
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
<!-- REDIS:END -->
|
|
292
|
-
|