@hivehub/rulebook 4.2.2 → 4.3.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/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 +8 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +4 -4
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/claude-mcp.d.ts +8 -1
- package/dist/core/claude-mcp.d.ts.map +1 -1
- package/dist/core/claude-mcp.js +32 -1
- package/dist/core/claude-mcp.js.map +1 -1
- package/dist/core/generator.d.ts +13 -0
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/core/generator.js +283 -28
- package/dist/core/generator.js.map +1 -1
- package/dist/core/workspace/workspace-manager.d.ts.map +1 -1
- package/dist/core/workspace/workspace-manager.js +2 -6
- package/dist/core/workspace/workspace-manager.js.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +5 -4
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/package.json +21 -22
- package/templates/agents/accessibility-reviewer.md +43 -0
- package/templates/agents/api-designer.md +42 -0
- package/templates/agents/architect.md +51 -0
- package/templates/agents/build-engineer.md +36 -0
- package/templates/agents/code-reviewer.md +47 -0
- package/templates/agents/database-architect.md +41 -0
- package/templates/agents/devops-engineer.md +42 -0
- package/templates/agents/docs-writer.md +38 -0
- package/templates/agents/i18n-engineer.md +42 -0
- package/templates/agents/implementer.md +38 -35
- package/templates/agents/migration-engineer.md +42 -0
- package/templates/agents/performance-engineer.md +49 -0
- package/templates/agents/refactoring-agent.md +41 -0
- package/templates/agents/researcher.md +38 -34
- package/templates/agents/security-reviewer.md +40 -0
- package/templates/agents/team-lead.md +37 -34
- package/templates/agents/tester.md +45 -42
- package/templates/agents/ux-reviewer.md +43 -0
- 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/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/dev/accessibility/SKILL.md +17 -0
- package/templates/skills/dev/api-design/SKILL.md +15 -0
- package/templates/skills/dev/architect/SKILL.md +17 -0
- package/templates/skills/dev/build-fix/SKILL.md +17 -0
- package/templates/skills/dev/db-design/SKILL.md +15 -0
- package/templates/skills/dev/debug/SKILL.md +16 -0
- package/templates/skills/dev/deploy/SKILL.md +17 -0
- package/templates/skills/dev/docs/SKILL.md +17 -0
- package/templates/skills/dev/migrate/SKILL.md +15 -0
- package/templates/skills/dev/perf/SKILL.md +17 -0
- package/templates/skills/dev/refactor/SKILL.md +17 -0
- package/templates/skills/dev/research/SKILL.md +14 -0
- package/templates/skills/dev/review/SKILL.md +18 -0
- package/templates/skills/dev/security-audit/SKILL.md +17 -0
- 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,247 +1,247 @@
|
|
|
1
|
-
<!-- NEO4J:START -->
|
|
2
|
-
# Neo4j Graph Database Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Use Neo4j for graph data modeling, relationship traversal, and complex connected data queries.
|
|
5
|
-
|
|
6
|
-
## Core Features
|
|
7
|
-
|
|
8
|
-
### Connection
|
|
9
|
-
```typescript
|
|
10
|
-
// Using neo4j-driver
|
|
11
|
-
import neo4j from 'neo4j-driver'
|
|
12
|
-
|
|
13
|
-
const driver = neo4j.driver(
|
|
14
|
-
process.env.NEO4J_URI || 'bolt://localhost:7687',
|
|
15
|
-
neo4j.auth.basic(
|
|
16
|
-
process.env.NEO4J_USER || 'neo4j',
|
|
17
|
-
process.env.NEO4J_PASSWORD || 'password'
|
|
18
|
-
),
|
|
19
|
-
{
|
|
20
|
-
maxConnectionLifetime: 3 * 60 * 60 * 1000, // 3 hours
|
|
21
|
-
maxConnectionPoolSize: 50,
|
|
22
|
-
connectionAcquisitionTimeout: 2 * 60 * 1000, // 2 minutes
|
|
23
|
-
}
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
const session = driver.session()
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
### Basic Operations
|
|
30
|
-
```typescript
|
|
31
|
-
// Create node
|
|
32
|
-
const result = await session.run(
|
|
33
|
-
'CREATE (u:User {id: $id, name: $name, email: $email}) RETURN u',
|
|
34
|
-
{ id: '1', name: 'John Doe', email: 'john@example.com' }
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
// Create relationship
|
|
38
|
-
await session.run(
|
|
39
|
-
'MATCH (u:User {id: $userId}), (p:Post {id: $postId}) CREATE (u)-[:CREATED]->(p)',
|
|
40
|
-
{ userId: '1', postId: '1' }
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
// Find nodes
|
|
44
|
-
const result = await session.run(
|
|
45
|
-
'MATCH (u:User {email: $email}) RETURN u',
|
|
46
|
-
{ email: 'john@example.com' }
|
|
47
|
-
)
|
|
48
|
-
const user = result.records[0]?.get('u')
|
|
49
|
-
|
|
50
|
-
// Update node
|
|
51
|
-
await session.run(
|
|
52
|
-
'MATCH (u:User {id: $id}) SET u.name = $name, u.updatedAt = $updatedAt',
|
|
53
|
-
{ id: '1', name: 'Jane Doe', updatedAt: new Date().toISOString() }
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
// Delete node and relationships
|
|
57
|
-
await session.run(
|
|
58
|
-
'MATCH (u:User {id: $id}) DETACH DELETE u',
|
|
59
|
-
{ id: '1' }
|
|
60
|
-
)
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### Advanced Queries
|
|
64
|
-
```typescript
|
|
65
|
-
// Find relationships
|
|
66
|
-
const result = await session.run(`
|
|
67
|
-
MATCH (u:User)-[r:FOLLOWS]->(f:User)
|
|
68
|
-
WHERE u.id = $userId
|
|
69
|
-
RETURN f, r.createdAt
|
|
70
|
-
ORDER BY r.createdAt DESC
|
|
71
|
-
LIMIT 10
|
|
72
|
-
`, { userId: '1' })
|
|
73
|
-
|
|
74
|
-
// Shortest path
|
|
75
|
-
const result = await session.run(`
|
|
76
|
-
MATCH path = shortestPath(
|
|
77
|
-
(start:User {id: $startId})-[*]-(end:User {id: $endId})
|
|
78
|
-
)
|
|
79
|
-
RETURN path, length(path) as distance
|
|
80
|
-
`, { startId: '1', endId: '2' })
|
|
81
|
-
|
|
82
|
-
// Pattern matching
|
|
83
|
-
const result = await session.run(`
|
|
84
|
-
MATCH (u:User)-[:CREATED]->(p:Post)-[:TAGGED_WITH]->(t:Tag)
|
|
85
|
-
WHERE t.name = $tagName
|
|
86
|
-
RETURN u, count(p) as postCount
|
|
87
|
-
ORDER BY postCount DESC
|
|
88
|
-
`, { tagName: 'javascript' })
|
|
89
|
-
|
|
90
|
-
// Aggregations
|
|
91
|
-
const result = await session.run(`
|
|
92
|
-
MATCH (u:User)-[:FOLLOWS]->(f:User)
|
|
93
|
-
RETURN u.id, count(f) as followerCount
|
|
94
|
-
ORDER BY followerCount DESC
|
|
95
|
-
LIMIT 10
|
|
96
|
-
`)
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## Common Patterns
|
|
100
|
-
|
|
101
|
-
### User Recommendations
|
|
102
|
-
```typescript
|
|
103
|
-
async function getRecommendedUsers(userId: string) {
|
|
104
|
-
const result = await session.run(`
|
|
105
|
-
MATCH (u:User {id: $userId})-[:FOLLOWS]->(f:User)-[:FOLLOWS]->(recommended:User)
|
|
106
|
-
WHERE NOT (u)-[:FOLLOWS]->(recommended) AND u <> recommended
|
|
107
|
-
RETURN recommended, count(recommended) as mutualFollowers
|
|
108
|
-
ORDER BY mutualFollowers DESC
|
|
109
|
-
LIMIT 10
|
|
110
|
-
`, { userId })
|
|
111
|
-
|
|
112
|
-
return result.records.map(record => ({
|
|
113
|
-
user: record.get('recommended').properties,
|
|
114
|
-
score: record.get('mutualFollowers').toNumber(),
|
|
115
|
-
}))
|
|
116
|
-
}
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Graph Traversal
|
|
120
|
-
```typescript
|
|
121
|
-
async function findConnections(userId: string, depth: number) {
|
|
122
|
-
const result = await session.run(`
|
|
123
|
-
MATCH path = (start:User {id: $userId})-[*1..${depth}]-(connected:User)
|
|
124
|
-
RETURN connected, length(path) as distance
|
|
125
|
-
ORDER BY distance
|
|
126
|
-
`, { userId })
|
|
127
|
-
|
|
128
|
-
return result.records.map(record => ({
|
|
129
|
-
user: record.get('connected').properties,
|
|
130
|
-
distance: record.get('distance').toNumber(),
|
|
131
|
-
}))
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
### Transaction
|
|
136
|
-
```typescript
|
|
137
|
-
const session = driver.session()
|
|
138
|
-
const tx = session.beginTransaction()
|
|
139
|
-
|
|
140
|
-
try {
|
|
141
|
-
await tx.run('CREATE (u:User {id: $id, name: $name})', { id: '1', name: 'John' })
|
|
142
|
-
await tx.run('CREATE (p:Post {id: $id, title: $title})', { id: '1', title: 'Post 1' })
|
|
143
|
-
await tx.run(
|
|
144
|
-
'MATCH (u:User {id: $userId}), (p:Post {id: $postId}) CREATE (u)-[:CREATED]->(p)',
|
|
145
|
-
{ userId: '1', postId: '1' }
|
|
146
|
-
)
|
|
147
|
-
await tx.commit()
|
|
148
|
-
} catch (error) {
|
|
149
|
-
await tx.rollback()
|
|
150
|
-
throw error
|
|
151
|
-
} finally {
|
|
152
|
-
await session.close()
|
|
153
|
-
}
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
## Best Practices
|
|
157
|
-
|
|
158
|
-
✅ **DO:**
|
|
159
|
-
- Use parameterized queries ($param)
|
|
160
|
-
- Create indexes on frequently queried properties
|
|
161
|
-
- Use appropriate relationship types
|
|
162
|
-
- Batch operations when possible
|
|
163
|
-
- Close sessions after use
|
|
164
|
-
- Use transactions for multi-step operations
|
|
165
|
-
- Monitor query performance
|
|
166
|
-
- Use appropriate data types
|
|
167
|
-
- Implement connection pooling
|
|
168
|
-
- Use labels effectively
|
|
169
|
-
|
|
170
|
-
❌ **DON'T:**
|
|
171
|
-
- Use string concatenation for queries (injection risk)
|
|
172
|
-
- Create too many relationships per node
|
|
173
|
-
- Skip error handling
|
|
174
|
-
- Ignore query performance
|
|
175
|
-
- Hardcode connection strings
|
|
176
|
-
- Store large properties (use external storage)
|
|
177
|
-
- Skip indexes on lookup properties
|
|
178
|
-
- Ignore transaction boundaries
|
|
179
|
-
- Use synchronous operations
|
|
180
|
-
- Store sensitive data without encryption
|
|
181
|
-
|
|
182
|
-
## Configuration
|
|
183
|
-
|
|
184
|
-
### Environment Variables
|
|
185
|
-
```bash
|
|
186
|
-
NEO4J_URI=bolt://localhost:7687
|
|
187
|
-
NEO4J_URI=neo4j+s://cluster.example.com:7687 # SSL
|
|
188
|
-
NEO4J_USER=neo4j
|
|
189
|
-
NEO4J_PASSWORD=securepassword
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
### Docker Compose
|
|
193
|
-
```yaml
|
|
194
|
-
services:
|
|
195
|
-
neo4j:
|
|
196
|
-
image: neo4j:5
|
|
197
|
-
ports:
|
|
198
|
-
- "7474:7474" # HTTP
|
|
199
|
-
- "7687:7687" # Bolt
|
|
200
|
-
environment:
|
|
201
|
-
NEO4J_AUTH: neo4j/securepassword
|
|
202
|
-
NEO4J_PLUGINS: '["apoc"]'
|
|
203
|
-
volumes:
|
|
204
|
-
- neo4j_data:/data
|
|
205
|
-
- neo4j_logs:/logs
|
|
206
|
-
healthcheck:
|
|
207
|
-
test: ["CMD", "cypher-shell", "-u", "neo4j", "-p", "securepassword", "RETURN 1"]
|
|
208
|
-
interval: 10s
|
|
209
|
-
timeout: 5s
|
|
210
|
-
retries: 5
|
|
211
|
-
|
|
212
|
-
volumes:
|
|
213
|
-
neo4j_data:
|
|
214
|
-
neo4j_logs:
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
## Integration with Development
|
|
218
|
-
|
|
219
|
-
### Testing
|
|
220
|
-
```typescript
|
|
221
|
-
// Use test database
|
|
222
|
-
const testDriver = neo4j.driver('bolt://localhost:7688', neo4j.auth.basic('neo4j', 'test'))
|
|
223
|
-
|
|
224
|
-
// Clean up after tests
|
|
225
|
-
afterEach(async () => {
|
|
226
|
-
const session = testDriver.session()
|
|
227
|
-
await session.run('MATCH (n) DETACH DELETE n')
|
|
228
|
-
await session.close()
|
|
229
|
-
})
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### Health Checks
|
|
233
|
-
```typescript
|
|
234
|
-
async function checkNeo4jHealth(): Promise<boolean> {
|
|
235
|
-
try {
|
|
236
|
-
const session = driver.session()
|
|
237
|
-
const result = await session.run('RETURN 1 as health')
|
|
238
|
-
await session.close()
|
|
239
|
-
return result.records.length > 0
|
|
240
|
-
} catch {
|
|
241
|
-
return false
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
<!-- NEO4J:END -->
|
|
247
|
-
|
|
1
|
+
<!-- NEO4J:START -->
|
|
2
|
+
# Neo4j Graph Database Instructions
|
|
3
|
+
|
|
4
|
+
**CRITICAL**: Use Neo4j for graph data modeling, relationship traversal, and complex connected data queries.
|
|
5
|
+
|
|
6
|
+
## Core Features
|
|
7
|
+
|
|
8
|
+
### Connection
|
|
9
|
+
```typescript
|
|
10
|
+
// Using neo4j-driver
|
|
11
|
+
import neo4j from 'neo4j-driver'
|
|
12
|
+
|
|
13
|
+
const driver = neo4j.driver(
|
|
14
|
+
process.env.NEO4J_URI || 'bolt://localhost:7687',
|
|
15
|
+
neo4j.auth.basic(
|
|
16
|
+
process.env.NEO4J_USER || 'neo4j',
|
|
17
|
+
process.env.NEO4J_PASSWORD || 'password'
|
|
18
|
+
),
|
|
19
|
+
{
|
|
20
|
+
maxConnectionLifetime: 3 * 60 * 60 * 1000, // 3 hours
|
|
21
|
+
maxConnectionPoolSize: 50,
|
|
22
|
+
connectionAcquisitionTimeout: 2 * 60 * 1000, // 2 minutes
|
|
23
|
+
}
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
const session = driver.session()
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Basic Operations
|
|
30
|
+
```typescript
|
|
31
|
+
// Create node
|
|
32
|
+
const result = await session.run(
|
|
33
|
+
'CREATE (u:User {id: $id, name: $name, email: $email}) RETURN u',
|
|
34
|
+
{ id: '1', name: 'John Doe', email: 'john@example.com' }
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
// Create relationship
|
|
38
|
+
await session.run(
|
|
39
|
+
'MATCH (u:User {id: $userId}), (p:Post {id: $postId}) CREATE (u)-[:CREATED]->(p)',
|
|
40
|
+
{ userId: '1', postId: '1' }
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
// Find nodes
|
|
44
|
+
const result = await session.run(
|
|
45
|
+
'MATCH (u:User {email: $email}) RETURN u',
|
|
46
|
+
{ email: 'john@example.com' }
|
|
47
|
+
)
|
|
48
|
+
const user = result.records[0]?.get('u')
|
|
49
|
+
|
|
50
|
+
// Update node
|
|
51
|
+
await session.run(
|
|
52
|
+
'MATCH (u:User {id: $id}) SET u.name = $name, u.updatedAt = $updatedAt',
|
|
53
|
+
{ id: '1', name: 'Jane Doe', updatedAt: new Date().toISOString() }
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
// Delete node and relationships
|
|
57
|
+
await session.run(
|
|
58
|
+
'MATCH (u:User {id: $id}) DETACH DELETE u',
|
|
59
|
+
{ id: '1' }
|
|
60
|
+
)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Advanced Queries
|
|
64
|
+
```typescript
|
|
65
|
+
// Find relationships
|
|
66
|
+
const result = await session.run(`
|
|
67
|
+
MATCH (u:User)-[r:FOLLOWS]->(f:User)
|
|
68
|
+
WHERE u.id = $userId
|
|
69
|
+
RETURN f, r.createdAt
|
|
70
|
+
ORDER BY r.createdAt DESC
|
|
71
|
+
LIMIT 10
|
|
72
|
+
`, { userId: '1' })
|
|
73
|
+
|
|
74
|
+
// Shortest path
|
|
75
|
+
const result = await session.run(`
|
|
76
|
+
MATCH path = shortestPath(
|
|
77
|
+
(start:User {id: $startId})-[*]-(end:User {id: $endId})
|
|
78
|
+
)
|
|
79
|
+
RETURN path, length(path) as distance
|
|
80
|
+
`, { startId: '1', endId: '2' })
|
|
81
|
+
|
|
82
|
+
// Pattern matching
|
|
83
|
+
const result = await session.run(`
|
|
84
|
+
MATCH (u:User)-[:CREATED]->(p:Post)-[:TAGGED_WITH]->(t:Tag)
|
|
85
|
+
WHERE t.name = $tagName
|
|
86
|
+
RETURN u, count(p) as postCount
|
|
87
|
+
ORDER BY postCount DESC
|
|
88
|
+
`, { tagName: 'javascript' })
|
|
89
|
+
|
|
90
|
+
// Aggregations
|
|
91
|
+
const result = await session.run(`
|
|
92
|
+
MATCH (u:User)-[:FOLLOWS]->(f:User)
|
|
93
|
+
RETURN u.id, count(f) as followerCount
|
|
94
|
+
ORDER BY followerCount DESC
|
|
95
|
+
LIMIT 10
|
|
96
|
+
`)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Common Patterns
|
|
100
|
+
|
|
101
|
+
### User Recommendations
|
|
102
|
+
```typescript
|
|
103
|
+
async function getRecommendedUsers(userId: string) {
|
|
104
|
+
const result = await session.run(`
|
|
105
|
+
MATCH (u:User {id: $userId})-[:FOLLOWS]->(f:User)-[:FOLLOWS]->(recommended:User)
|
|
106
|
+
WHERE NOT (u)-[:FOLLOWS]->(recommended) AND u <> recommended
|
|
107
|
+
RETURN recommended, count(recommended) as mutualFollowers
|
|
108
|
+
ORDER BY mutualFollowers DESC
|
|
109
|
+
LIMIT 10
|
|
110
|
+
`, { userId })
|
|
111
|
+
|
|
112
|
+
return result.records.map(record => ({
|
|
113
|
+
user: record.get('recommended').properties,
|
|
114
|
+
score: record.get('mutualFollowers').toNumber(),
|
|
115
|
+
}))
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Graph Traversal
|
|
120
|
+
```typescript
|
|
121
|
+
async function findConnections(userId: string, depth: number) {
|
|
122
|
+
const result = await session.run(`
|
|
123
|
+
MATCH path = (start:User {id: $userId})-[*1..${depth}]-(connected:User)
|
|
124
|
+
RETURN connected, length(path) as distance
|
|
125
|
+
ORDER BY distance
|
|
126
|
+
`, { userId })
|
|
127
|
+
|
|
128
|
+
return result.records.map(record => ({
|
|
129
|
+
user: record.get('connected').properties,
|
|
130
|
+
distance: record.get('distance').toNumber(),
|
|
131
|
+
}))
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Transaction
|
|
136
|
+
```typescript
|
|
137
|
+
const session = driver.session()
|
|
138
|
+
const tx = session.beginTransaction()
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
await tx.run('CREATE (u:User {id: $id, name: $name})', { id: '1', name: 'John' })
|
|
142
|
+
await tx.run('CREATE (p:Post {id: $id, title: $title})', { id: '1', title: 'Post 1' })
|
|
143
|
+
await tx.run(
|
|
144
|
+
'MATCH (u:User {id: $userId}), (p:Post {id: $postId}) CREATE (u)-[:CREATED]->(p)',
|
|
145
|
+
{ userId: '1', postId: '1' }
|
|
146
|
+
)
|
|
147
|
+
await tx.commit()
|
|
148
|
+
} catch (error) {
|
|
149
|
+
await tx.rollback()
|
|
150
|
+
throw error
|
|
151
|
+
} finally {
|
|
152
|
+
await session.close()
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Best Practices
|
|
157
|
+
|
|
158
|
+
✅ **DO:**
|
|
159
|
+
- Use parameterized queries ($param)
|
|
160
|
+
- Create indexes on frequently queried properties
|
|
161
|
+
- Use appropriate relationship types
|
|
162
|
+
- Batch operations when possible
|
|
163
|
+
- Close sessions after use
|
|
164
|
+
- Use transactions for multi-step operations
|
|
165
|
+
- Monitor query performance
|
|
166
|
+
- Use appropriate data types
|
|
167
|
+
- Implement connection pooling
|
|
168
|
+
- Use labels effectively
|
|
169
|
+
|
|
170
|
+
❌ **DON'T:**
|
|
171
|
+
- Use string concatenation for queries (injection risk)
|
|
172
|
+
- Create too many relationships per node
|
|
173
|
+
- Skip error handling
|
|
174
|
+
- Ignore query performance
|
|
175
|
+
- Hardcode connection strings
|
|
176
|
+
- Store large properties (use external storage)
|
|
177
|
+
- Skip indexes on lookup properties
|
|
178
|
+
- Ignore transaction boundaries
|
|
179
|
+
- Use synchronous operations
|
|
180
|
+
- Store sensitive data without encryption
|
|
181
|
+
|
|
182
|
+
## Configuration
|
|
183
|
+
|
|
184
|
+
### Environment Variables
|
|
185
|
+
```bash
|
|
186
|
+
NEO4J_URI=bolt://localhost:7687
|
|
187
|
+
NEO4J_URI=neo4j+s://cluster.example.com:7687 # SSL
|
|
188
|
+
NEO4J_USER=neo4j
|
|
189
|
+
NEO4J_PASSWORD=securepassword
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Docker Compose
|
|
193
|
+
```yaml
|
|
194
|
+
services:
|
|
195
|
+
neo4j:
|
|
196
|
+
image: neo4j:5
|
|
197
|
+
ports:
|
|
198
|
+
- "7474:7474" # HTTP
|
|
199
|
+
- "7687:7687" # Bolt
|
|
200
|
+
environment:
|
|
201
|
+
NEO4J_AUTH: neo4j/securepassword
|
|
202
|
+
NEO4J_PLUGINS: '["apoc"]'
|
|
203
|
+
volumes:
|
|
204
|
+
- neo4j_data:/data
|
|
205
|
+
- neo4j_logs:/logs
|
|
206
|
+
healthcheck:
|
|
207
|
+
test: ["CMD", "cypher-shell", "-u", "neo4j", "-p", "securepassword", "RETURN 1"]
|
|
208
|
+
interval: 10s
|
|
209
|
+
timeout: 5s
|
|
210
|
+
retries: 5
|
|
211
|
+
|
|
212
|
+
volumes:
|
|
213
|
+
neo4j_data:
|
|
214
|
+
neo4j_logs:
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## Integration with Development
|
|
218
|
+
|
|
219
|
+
### Testing
|
|
220
|
+
```typescript
|
|
221
|
+
// Use test database
|
|
222
|
+
const testDriver = neo4j.driver('bolt://localhost:7688', neo4j.auth.basic('neo4j', 'test'))
|
|
223
|
+
|
|
224
|
+
// Clean up after tests
|
|
225
|
+
afterEach(async () => {
|
|
226
|
+
const session = testDriver.session()
|
|
227
|
+
await session.run('MATCH (n) DETACH DELETE n')
|
|
228
|
+
await session.close()
|
|
229
|
+
})
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Health Checks
|
|
233
|
+
```typescript
|
|
234
|
+
async function checkNeo4jHealth(): Promise<boolean> {
|
|
235
|
+
try {
|
|
236
|
+
const session = driver.session()
|
|
237
|
+
const result = await session.run('RETURN 1 as health')
|
|
238
|
+
await session.close()
|
|
239
|
+
return result.records.length > 0
|
|
240
|
+
} catch {
|
|
241
|
+
return false
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
<!-- NEO4J:END -->
|
|
247
|
+
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
<!-- OPENTELEMETRY:START -->
|
|
2
|
-
# OpenTelemetry — Distributed Tracing
|
|
3
|
-
|
|
4
|
-
## Initialization
|
|
5
|
-
- Initialize OTel SDK BEFORE application code (use `--require` flag or top-level import)
|
|
6
|
-
- Configure exporter based on environment (OTLP, Jaeger, console for dev)
|
|
7
|
-
- Set `serviceName` from environment: `process.env.OTEL_SERVICE_NAME`
|
|
8
|
-
|
|
9
|
-
## Instrumentation
|
|
10
|
-
- Use auto-instrumentation packages for common libraries (HTTP, Express, pg)
|
|
11
|
-
- Create manual spans for business logic operations:
|
|
12
|
-
```typescript
|
|
13
|
-
const tracer = trace.getTracer('service-name');
|
|
14
|
-
const span = tracer.startSpan('operation.name');
|
|
15
|
-
try { ... } finally { span.end(); }
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Context Propagation
|
|
19
|
-
- Always propagate context across service boundaries using W3C Trace Context headers
|
|
20
|
-
- Use `context.with()` for async operations to preserve trace context
|
|
21
|
-
|
|
22
|
-
## Metrics
|
|
23
|
-
- Use `@opentelemetry/sdk-metrics` for custom metrics
|
|
24
|
-
- Follow naming conventions: `<namespace>.<metric_type>.<name>` (e.g., `http.server.request_count`)
|
|
25
|
-
<!-- OPENTELEMETRY:END -->
|
|
1
|
+
<!-- OPENTELEMETRY:START -->
|
|
2
|
+
# OpenTelemetry — Distributed Tracing
|
|
3
|
+
|
|
4
|
+
## Initialization
|
|
5
|
+
- Initialize OTel SDK BEFORE application code (use `--require` flag or top-level import)
|
|
6
|
+
- Configure exporter based on environment (OTLP, Jaeger, console for dev)
|
|
7
|
+
- Set `serviceName` from environment: `process.env.OTEL_SERVICE_NAME`
|
|
8
|
+
|
|
9
|
+
## Instrumentation
|
|
10
|
+
- Use auto-instrumentation packages for common libraries (HTTP, Express, pg)
|
|
11
|
+
- Create manual spans for business logic operations:
|
|
12
|
+
```typescript
|
|
13
|
+
const tracer = trace.getTracer('service-name');
|
|
14
|
+
const span = tracer.startSpan('operation.name');
|
|
15
|
+
try { ... } finally { span.end(); }
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Context Propagation
|
|
19
|
+
- Always propagate context across service boundaries using W3C Trace Context headers
|
|
20
|
+
- Use `context.with()` for async operations to preserve trace context
|
|
21
|
+
|
|
22
|
+
## Metrics
|
|
23
|
+
- Use `@opentelemetry/sdk-metrics` for custom metrics
|
|
24
|
+
- Follow naming conventions: `<namespace>.<metric_type>.<name>` (e.g., `http.server.request_count`)
|
|
25
|
+
<!-- OPENTELEMETRY:END -->
|