@hivehub/rulebook 1.2.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/LICENSE +191 -0
- package/README.md +539 -0
- package/dist/agents/claude-code.d.ts +69 -0
- package/dist/agents/claude-code.d.ts.map +1 -0
- package/dist/agents/claude-code.js +180 -0
- package/dist/agents/claude-code.js.map +1 -0
- package/dist/agents/cursor-agent.d.ts +184 -0
- package/dist/agents/cursor-agent.d.ts.map +1 -0
- package/dist/agents/cursor-agent.js +299 -0
- package/dist/agents/cursor-agent.js.map +1 -0
- package/dist/agents/gemini-cli.d.ts +69 -0
- package/dist/agents/gemini-cli.d.ts.map +1 -0
- package/dist/agents/gemini-cli.js +180 -0
- package/dist/agents/gemini-cli.js.map +1 -0
- package/dist/cli/commands.d.ts +57 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +1370 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/docs-prompts.d.ts +3 -0
- package/dist/cli/docs-prompts.d.ts.map +1 -0
- package/dist/cli/docs-prompts.js +45 -0
- package/dist/cli/docs-prompts.js.map +1 -0
- package/dist/cli/prompts.d.ts +6 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +376 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/core/agent-manager.d.ts +89 -0
- package/dist/core/agent-manager.d.ts.map +1 -0
- package/dist/core/agent-manager.js +546 -0
- package/dist/core/agent-manager.js.map +1 -0
- package/dist/core/auto-fixer.d.ts +14 -0
- package/dist/core/auto-fixer.d.ts.map +1 -0
- package/dist/core/auto-fixer.js +207 -0
- package/dist/core/auto-fixer.js.map +1 -0
- package/dist/core/changelog-generator.d.ts +44 -0
- package/dist/core/changelog-generator.d.ts.map +1 -0
- package/dist/core/changelog-generator.js +222 -0
- package/dist/core/changelog-generator.js.map +1 -0
- package/dist/core/cli-bridge.d.ts +113 -0
- package/dist/core/cli-bridge.d.ts.map +1 -0
- package/dist/core/cli-bridge.js +1094 -0
- package/dist/core/cli-bridge.js.map +1 -0
- package/dist/core/config-manager.d.ts +65 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +266 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/coverage-checker.d.ts +14 -0
- package/dist/core/coverage-checker.d.ts.map +1 -0
- package/dist/core/coverage-checker.js +176 -0
- package/dist/core/coverage-checker.js.map +1 -0
- package/dist/core/custom-templates.d.ts +27 -0
- package/dist/core/custom-templates.d.ts.map +1 -0
- package/dist/core/custom-templates.js +122 -0
- package/dist/core/custom-templates.js.map +1 -0
- package/dist/core/dependency-checker.d.ts +21 -0
- package/dist/core/dependency-checker.d.ts.map +1 -0
- package/dist/core/dependency-checker.js +247 -0
- package/dist/core/dependency-checker.js.map +1 -0
- package/dist/core/detector.d.ts +3 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +1443 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/docs-generator.d.ts +9 -0
- package/dist/core/docs-generator.d.ts.map +1 -0
- package/dist/core/docs-generator.js +531 -0
- package/dist/core/docs-generator.js.map +1 -0
- package/dist/core/generator.d.ts +16 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +561 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/gitignore-generator.d.ts +13 -0
- package/dist/core/gitignore-generator.d.ts.map +1 -0
- package/dist/core/gitignore-generator.js +307 -0
- package/dist/core/gitignore-generator.js.map +1 -0
- package/dist/core/health-scorer.d.ts +22 -0
- package/dist/core/health-scorer.d.ts.map +1 -0
- package/dist/core/health-scorer.js +395 -0
- package/dist/core/health-scorer.js.map +1 -0
- package/dist/core/logger.d.ts +116 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +289 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/merger.d.ts +6 -0
- package/dist/core/merger.d.ts.map +1 -0
- package/dist/core/merger.js +131 -0
- package/dist/core/merger.js.map +1 -0
- package/dist/core/migrator.d.ts +19 -0
- package/dist/core/migrator.d.ts.map +1 -0
- package/dist/core/migrator.js +102 -0
- package/dist/core/migrator.js.map +1 -0
- package/dist/core/minimal-scaffolder.d.ts +8 -0
- package/dist/core/minimal-scaffolder.d.ts.map +1 -0
- package/dist/core/minimal-scaffolder.js +51 -0
- package/dist/core/minimal-scaffolder.js.map +1 -0
- package/dist/core/modern-console-new.d.ts +81 -0
- package/dist/core/modern-console-new.d.ts.map +1 -0
- package/dist/core/modern-console-new.js +340 -0
- package/dist/core/modern-console-new.js.map +1 -0
- package/dist/core/modern-console.d.ts +99 -0
- package/dist/core/modern-console.d.ts.map +1 -0
- package/dist/core/modern-console.js +568 -0
- package/dist/core/modern-console.js.map +1 -0
- package/dist/core/openspec-manager.d.ts +133 -0
- package/dist/core/openspec-manager.d.ts.map +1 -0
- package/dist/core/openspec-manager.js +605 -0
- package/dist/core/openspec-manager.js.map +1 -0
- package/dist/core/openspec-migrator.d.ts +27 -0
- package/dist/core/openspec-migrator.d.ts.map +1 -0
- package/dist/core/openspec-migrator.js +255 -0
- package/dist/core/openspec-migrator.js.map +1 -0
- package/dist/core/task-manager.d.ts +65 -0
- package/dist/core/task-manager.d.ts.map +1 -0
- package/dist/core/task-manager.js +318 -0
- package/dist/core/task-manager.js.map +1 -0
- package/dist/core/test-task-manager.d.ts +49 -0
- package/dist/core/test-task-manager.d.ts.map +1 -0
- package/dist/core/test-task-manager.js +121 -0
- package/dist/core/test-task-manager.js.map +1 -0
- package/dist/core/validator.d.ts +21 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +177 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/core/version-bumper.d.ts +19 -0
- package/dist/core/version-bumper.d.ts.map +1 -0
- package/dist/core/version-bumper.js +180 -0
- package/dist/core/version-bumper.js.map +1 -0
- package/dist/core/watcher.d.ts +9 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +22 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/core/workflow-generator.d.ts +10 -0
- package/dist/core/workflow-generator.d.ts.map +1 -0
- package/dist/core/workflow-generator.js +279 -0
- package/dist/core/workflow-generator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/handlers/archive-task.d.ts +17 -0
- package/dist/mcp/handlers/archive-task.d.ts.map +1 -0
- package/dist/mcp/handlers/archive-task.js +36 -0
- package/dist/mcp/handlers/archive-task.js.map +1 -0
- package/dist/mcp/handlers/create-task.d.ts +17 -0
- package/dist/mcp/handlers/create-task.d.ts.map +1 -0
- package/dist/mcp/handlers/create-task.js +56 -0
- package/dist/mcp/handlers/create-task.js.map +1 -0
- package/dist/mcp/handlers/list-tasks.d.ts +22 -0
- package/dist/mcp/handlers/list-tasks.d.ts.map +1 -0
- package/dist/mcp/handlers/list-tasks.js +42 -0
- package/dist/mcp/handlers/list-tasks.js.map +1 -0
- package/dist/mcp/handlers/show-task.d.ts +25 -0
- package/dist/mcp/handlers/show-task.d.ts.map +1 -0
- package/dist/mcp/handlers/show-task.js +43 -0
- package/dist/mcp/handlers/show-task.js.map +1 -0
- package/dist/mcp/handlers/update-task.d.ts +17 -0
- package/dist/mcp/handlers/update-task.d.ts.map +1 -0
- package/dist/mcp/handlers/update-task.js +35 -0
- package/dist/mcp/handlers/update-task.js.map +1 -0
- package/dist/mcp/handlers/validate-task.d.ts +15 -0
- package/dist/mcp/handlers/validate-task.d.ts.map +1 -0
- package/dist/mcp/handlers/validate-task.js +27 -0
- package/dist/mcp/handlers/validate-task.js.map +1 -0
- package/dist/mcp/rulebook-config.d.ts +22 -0
- package/dist/mcp/rulebook-config.d.ts.map +1 -0
- package/dist/mcp/rulebook-config.js +65 -0
- package/dist/mcp/rulebook-config.js.map +1 -0
- package/dist/mcp/rulebook-server.d.ts +4 -0
- package/dist/mcp/rulebook-server.d.ts.map +1 -0
- package/dist/mcp/rulebook-server.js +246 -0
- package/dist/mcp/rulebook-server.js.map +1 -0
- package/dist/types.d.ts +190 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file-system.d.ts +9 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +51 -0
- package/dist/utils/file-system.js.map +1 -0
- package/dist/utils/git-hooks.d.ts +8 -0
- package/dist/utils/git-hooks.d.ts.map +1 -0
- package/dist/utils/git-hooks.js +440 -0
- package/dist/utils/git-hooks.js.map +1 -0
- package/dist/utils/rulesignore.d.ts +9 -0
- package/dist/utils/rulesignore.d.ts.map +1 -0
- package/dist/utils/rulesignore.js +42 -0
- package/dist/utils/rulesignore.js.map +1 -0
- package/package.json +106 -0
- package/templates/cli/AIDER.md +49 -0
- package/templates/cli/AMAZON_Q.md +25 -0
- package/templates/cli/AUGGIE.md +32 -0
- package/templates/cli/CLAUDE.md +32 -0
- package/templates/cli/CLAUDE_CODE.md +35 -0
- package/templates/cli/CLINE.md +32 -0
- package/templates/cli/CODEBUDDY.md +20 -0
- package/templates/cli/CODEIUM.md +20 -0
- package/templates/cli/CODEX.md +21 -0
- package/templates/cli/CONTINUE.md +34 -0
- package/templates/cli/CURSOR_CLI.md +28 -0
- package/templates/cli/FACTORY.md +18 -0
- package/templates/cli/GEMINI.md +35 -0
- package/templates/cli/KILOCODE.md +18 -0
- package/templates/cli/OPENCODE.md +18 -0
- package/templates/cli/_GENERIC_TEMPLATE.md +29 -0
- package/templates/commands/rulebook-task-apply.md +67 -0
- package/templates/commands/rulebook-task-archive.md +70 -0
- package/templates/commands/rulebook-task-create.md +93 -0
- package/templates/commands/rulebook-task-list.md +42 -0
- package/templates/commands/rulebook-task-show.md +52 -0
- package/templates/commands/rulebook-task-validate.md +53 -0
- package/templates/core/AGENT_AUTOMATION.md +184 -0
- package/templates/core/DAG.md +304 -0
- package/templates/core/DOCUMENTATION_RULES.md +37 -0
- package/templates/core/QUALITY_ENFORCEMENT.md +68 -0
- package/templates/core/RULEBOOK.md +1874 -0
- package/templates/frameworks/ANGULAR.md +36 -0
- package/templates/frameworks/DJANGO.md +83 -0
- package/templates/frameworks/ELECTRON.md +147 -0
- package/templates/frameworks/FLASK.md +38 -0
- package/templates/frameworks/FLUTTER.md +55 -0
- package/templates/frameworks/JQUERY.md +32 -0
- package/templates/frameworks/LARAVEL.md +38 -0
- package/templates/frameworks/NESTJS.md +43 -0
- package/templates/frameworks/NEXTJS.md +127 -0
- package/templates/frameworks/NUXT.md +40 -0
- package/templates/frameworks/RAILS.md +66 -0
- package/templates/frameworks/REACT.md +38 -0
- package/templates/frameworks/REACT_NATIVE.md +47 -0
- package/templates/frameworks/SPRING.md +39 -0
- package/templates/frameworks/SYMFONY.md +36 -0
- package/templates/frameworks/VUE.md +36 -0
- package/templates/frameworks/ZEND.md +35 -0
- package/templates/git/CI_CD_PATTERNS.md +661 -0
- package/templates/git/GITHUB_ACTIONS.md +728 -0
- package/templates/git/GITLAB_CI.md +730 -0
- package/templates/git/GIT_WORKFLOW.md +1157 -0
- package/templates/git/SECRETS_MANAGEMENT.md +585 -0
- package/templates/hooks/COMMIT_MSG.md +530 -0
- package/templates/hooks/POST_CHECKOUT.md +546 -0
- package/templates/hooks/PREPARE_COMMIT_MSG.md +619 -0
- package/templates/hooks/PRE_COMMIT.md +414 -0
- package/templates/hooks/PRE_PUSH.md +601 -0
- package/templates/hooks/csharp-pre-commit.sh +23 -0
- package/templates/hooks/csharp-pre-push.sh +23 -0
- package/templates/hooks/dart-pre-commit.sh +30 -0
- package/templates/hooks/dart-pre-push.sh +25 -0
- package/templates/hooks/elixir-pre-commit.sh +32 -0
- package/templates/hooks/elixir-pre-push.sh +31 -0
- package/templates/hooks/erlang-pre-commit.sh +30 -0
- package/templates/hooks/erlang-pre-push.sh +37 -0
- package/templates/hooks/go-pre-commit.sh +40 -0
- package/templates/hooks/go-pre-push.sh +31 -0
- package/templates/hooks/haskell-pre-commit.sh +41 -0
- package/templates/hooks/haskell-pre-push.sh +37 -0
- package/templates/hooks/java-pre-commit.sh +34 -0
- package/templates/hooks/java-pre-push.sh +24 -0
- package/templates/hooks/kotlin-pre-commit.sh +32 -0
- package/templates/hooks/kotlin-pre-push.sh +16 -0
- package/templates/hooks/php-pre-commit.sh +36 -0
- package/templates/hooks/php-pre-push.sh +26 -0
- package/templates/hooks/python-pre-commit.sh +51 -0
- package/templates/hooks/python-pre-push.sh +25 -0
- package/templates/hooks/ruby-pre-commit.sh +33 -0
- package/templates/hooks/ruby-pre-push.sh +32 -0
- package/templates/hooks/rust-pre-commit.sh +30 -0
- package/templates/hooks/rust-pre-push.sh +30 -0
- package/templates/hooks/scala-pre-commit.sh +32 -0
- package/templates/hooks/scala-pre-push.sh +24 -0
- package/templates/hooks/swift-pre-commit.sh +25 -0
- package/templates/hooks/swift-pre-push.sh +23 -0
- package/templates/hooks/typescript-pre-commit.sh +37 -0
- package/templates/hooks/typescript-pre-push.sh +36 -0
- package/templates/ides/COPILOT.md +37 -0
- package/templates/ides/CURSOR.md +43 -0
- package/templates/ides/JETBRAINS_AI.md +35 -0
- package/templates/ides/REPLIT.md +36 -0
- package/templates/ides/TABNINE.md +29 -0
- package/templates/ides/VSCODE.md +40 -0
- package/templates/ides/WINDSURF.md +36 -0
- package/templates/ides/ZED.md +32 -0
- package/templates/languages/ADA.md +58 -0
- package/templates/languages/C.md +333 -0
- package/templates/languages/CPP.md +743 -0
- package/templates/languages/CSHARP.md +417 -0
- package/templates/languages/DART.md +332 -0
- package/templates/languages/ELIXIR.md +454 -0
- package/templates/languages/ERLANG.md +361 -0
- package/templates/languages/GO.md +645 -0
- package/templates/languages/HASKELL.md +177 -0
- package/templates/languages/JAVA.md +607 -0
- package/templates/languages/JAVASCRIPT.md +631 -0
- package/templates/languages/JULIA.md +97 -0
- package/templates/languages/KOTLIN.md +511 -0
- package/templates/languages/LISP.md +100 -0
- package/templates/languages/LUA.md +74 -0
- package/templates/languages/OBJECTIVEC.md +90 -0
- package/templates/languages/PHP.md +416 -0
- package/templates/languages/PYTHON.md +682 -0
- package/templates/languages/R.md +350 -0
- package/templates/languages/RUBY.md +421 -0
- package/templates/languages/RUST.md +477 -0
- package/templates/languages/SAS.md +73 -0
- package/templates/languages/SCALA.md +348 -0
- package/templates/languages/SOLIDITY.md +580 -0
- package/templates/languages/SQL.md +137 -0
- package/templates/languages/SWIFT.md +466 -0
- package/templates/languages/TYPESCRIPT.md +591 -0
- package/templates/languages/ZIG.md +265 -0
- package/templates/modules/ATLASSIAN.md +255 -0
- package/templates/modules/CONTEXT7.md +54 -0
- package/templates/modules/FIGMA.md +267 -0
- package/templates/modules/GITHUB_MCP.md +64 -0
- package/templates/modules/GRAFANA.md +328 -0
- package/templates/modules/NOTION.md +247 -0
- package/templates/modules/PLAYWRIGHT.md +90 -0
- package/templates/modules/RULEBOOK_MCP.md +156 -0
- package/templates/modules/SERENA.md +337 -0
- package/templates/modules/SUPABASE.md +223 -0
- package/templates/modules/SYNAP.md +69 -0
- package/templates/modules/VECTORIZER.md +63 -0
- package/templates/services/AZURE_BLOB.md +184 -0
- package/templates/services/CASSANDRA.md +239 -0
- package/templates/services/DYNAMODB.md +308 -0
- package/templates/services/ELASTICSEARCH.md +347 -0
- package/templates/services/GCS.md +178 -0
- package/templates/services/INFLUXDB.md +265 -0
- package/templates/services/KAFKA.md +341 -0
- package/templates/services/MARIADB.md +183 -0
- package/templates/services/MEMCACHED.md +242 -0
- package/templates/services/MINIO.md +201 -0
- package/templates/services/MONGODB.md +268 -0
- package/templates/services/MYSQL.md +358 -0
- package/templates/services/NEO4J.md +247 -0
- package/templates/services/ORACLE.md +290 -0
- package/templates/services/POSTGRESQL.md +326 -0
- package/templates/services/RABBITMQ.md +286 -0
- package/templates/services/REDIS.md +292 -0
- package/templates/services/S3.md +298 -0
- package/templates/services/SQLITE.md +294 -0
- package/templates/services/SQLSERVER.md +294 -0
- package/templates/workflows/codespell.yml +31 -0
- package/templates/workflows/cpp-lint.yml +47 -0
- package/templates/workflows/cpp-publish.yml +119 -0
- package/templates/workflows/cpp-test.yml +77 -0
- package/templates/workflows/dotnet-lint.yml +29 -0
- package/templates/workflows/dotnet-publish.yml +40 -0
- package/templates/workflows/dotnet-test.yml +41 -0
- package/templates/workflows/elixir-lint.yml +45 -0
- package/templates/workflows/elixir-publish.yml +49 -0
- package/templates/workflows/elixir-test.yml +54 -0
- package/templates/workflows/erlang-lint.yml +47 -0
- package/templates/workflows/erlang-test.yml +62 -0
- package/templates/workflows/go-lint.yml +39 -0
- package/templates/workflows/go-publish.yml +95 -0
- package/templates/workflows/go-test.yml +59 -0
- package/templates/workflows/java-lint.yml +60 -0
- package/templates/workflows/java-publish.yml +120 -0
- package/templates/workflows/java-test.yml +85 -0
- package/templates/workflows/kotlin-lint.yml +34 -0
- package/templates/workflows/kotlin-publish.yml +56 -0
- package/templates/workflows/kotlin-test.yml +48 -0
- package/templates/workflows/php-lint.yml +39 -0
- package/templates/workflows/php-publish.yml +50 -0
- package/templates/workflows/php-test.yml +54 -0
- package/templates/workflows/python-lint.yml +47 -0
- package/templates/workflows/python-publish.yml +91 -0
- package/templates/workflows/python-test.yml +59 -0
- package/templates/workflows/rust-lint.yml +54 -0
- package/templates/workflows/rust-publish.yml +66 -0
- package/templates/workflows/rust-test.yml +75 -0
- package/templates/workflows/solidity-lint.yml +41 -0
- package/templates/workflows/solidity-test.yml +47 -0
- package/templates/workflows/swift-lint.yml +32 -0
- package/templates/workflows/swift-publish.yml +58 -0
- package/templates/workflows/swift-test.yml +44 -0
- package/templates/workflows/typescript-lint.yml +61 -0
- package/templates/workflows/typescript-publish.yml +60 -0
- package/templates/workflows/typescript-test.yml +73 -0
- package/templates/workflows/zig-lint.yml +27 -0
- package/templates/workflows/zig-test.yml +40 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
<!-- ELASTICSEARCH:START -->
|
|
2
|
+
# Elasticsearch Search Instructions
|
|
3
|
+
|
|
4
|
+
**CRITICAL**: Use Elasticsearch for full-text search, log aggregation, and real-time analytics with distributed architecture.
|
|
5
|
+
|
|
6
|
+
## Core Features
|
|
7
|
+
|
|
8
|
+
### Connection
|
|
9
|
+
```typescript
|
|
10
|
+
// Using @elastic/elasticsearch
|
|
11
|
+
import { Client } from '@elastic/elasticsearch'
|
|
12
|
+
|
|
13
|
+
const client = new Client({
|
|
14
|
+
node: process.env.ELASTICSEARCH_URL || 'http://localhost:9200',
|
|
15
|
+
auth: {
|
|
16
|
+
username: process.env.ELASTICSEARCH_USER || 'elastic',
|
|
17
|
+
password: process.env.ELASTICSEARCH_PASSWORD || '',
|
|
18
|
+
},
|
|
19
|
+
maxRetries: 5,
|
|
20
|
+
requestTimeout: 60000,
|
|
21
|
+
sniffOnStart: true,
|
|
22
|
+
sniffInterval: 30000,
|
|
23
|
+
})
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Index Operations
|
|
27
|
+
```typescript
|
|
28
|
+
// Create index
|
|
29
|
+
await client.indices.create({
|
|
30
|
+
index: 'users',
|
|
31
|
+
body: {
|
|
32
|
+
mappings: {
|
|
33
|
+
properties: {
|
|
34
|
+
name: { type: 'text' },
|
|
35
|
+
email: { type: 'keyword' },
|
|
36
|
+
age: { type: 'integer' },
|
|
37
|
+
createdAt: { type: 'date' },
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
settings: {
|
|
41
|
+
number_of_shards: 1,
|
|
42
|
+
number_of_replicas: 1,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
// Delete index
|
|
48
|
+
await client.indices.delete({ index: 'users' })
|
|
49
|
+
|
|
50
|
+
// Check if index exists
|
|
51
|
+
const exists = await client.indices.exists({ index: 'users' })
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Document Operations
|
|
55
|
+
```typescript
|
|
56
|
+
// Index document
|
|
57
|
+
await client.index({
|
|
58
|
+
index: 'users',
|
|
59
|
+
id: '1',
|
|
60
|
+
body: {
|
|
61
|
+
name: 'John Doe',
|
|
62
|
+
email: 'john@example.com',
|
|
63
|
+
age: 30,
|
|
64
|
+
createdAt: new Date(),
|
|
65
|
+
},
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
// Get document
|
|
69
|
+
const result = await client.get({
|
|
70
|
+
index: 'users',
|
|
71
|
+
id: '1',
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
// Update document
|
|
75
|
+
await client.update({
|
|
76
|
+
index: 'users',
|
|
77
|
+
id: '1',
|
|
78
|
+
body: {
|
|
79
|
+
doc: {
|
|
80
|
+
age: 31,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
// Delete document
|
|
86
|
+
await client.delete({
|
|
87
|
+
index: 'users',
|
|
88
|
+
id: '1',
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
// Bulk operations
|
|
92
|
+
await client.bulk({
|
|
93
|
+
body: [
|
|
94
|
+
{ index: { _index: 'users', _id: '1' } },
|
|
95
|
+
{ name: 'User 1', email: 'user1@example.com' },
|
|
96
|
+
{ index: { _index: 'users', _id: '2' } },
|
|
97
|
+
{ name: 'User 2', email: 'user2@example.com' },
|
|
98
|
+
],
|
|
99
|
+
})
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Search Operations
|
|
103
|
+
```typescript
|
|
104
|
+
// Simple search
|
|
105
|
+
const result = await client.search({
|
|
106
|
+
index: 'users',
|
|
107
|
+
body: {
|
|
108
|
+
query: {
|
|
109
|
+
match: {
|
|
110
|
+
name: 'John',
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
// Multi-match search
|
|
117
|
+
const result = await client.search({
|
|
118
|
+
index: 'users',
|
|
119
|
+
body: {
|
|
120
|
+
query: {
|
|
121
|
+
multi_match: {
|
|
122
|
+
query: 'search term',
|
|
123
|
+
fields: ['name^2', 'email'], // name has 2x boost
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
// Bool query (AND/OR/NOT)
|
|
130
|
+
const result = await client.search({
|
|
131
|
+
index: 'users',
|
|
132
|
+
body: {
|
|
133
|
+
query: {
|
|
134
|
+
bool: {
|
|
135
|
+
must: [
|
|
136
|
+
{ match: { name: 'John' } },
|
|
137
|
+
{ range: { age: { gte: 18, lte: 65 } } },
|
|
138
|
+
],
|
|
139
|
+
must_not: [
|
|
140
|
+
{ term: { status: 'inactive' } },
|
|
141
|
+
],
|
|
142
|
+
should: [
|
|
143
|
+
{ match: { tags: 'premium' } },
|
|
144
|
+
],
|
|
145
|
+
minimum_should_match: 1,
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
// Aggregations
|
|
152
|
+
const result = await client.search({
|
|
153
|
+
index: 'users',
|
|
154
|
+
body: {
|
|
155
|
+
aggs: {
|
|
156
|
+
age_groups: {
|
|
157
|
+
range: {
|
|
158
|
+
field: 'age',
|
|
159
|
+
ranges: [
|
|
160
|
+
{ to: 25 },
|
|
161
|
+
{ from: 25, to: 50 },
|
|
162
|
+
{ from: 50 },
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
avg_age: {
|
|
167
|
+
avg: { field: 'age' },
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
})
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Common Patterns
|
|
175
|
+
|
|
176
|
+
### Full-Text Search
|
|
177
|
+
```typescript
|
|
178
|
+
async function searchUsers(query: string, filters?: any) {
|
|
179
|
+
const must: any[] = [
|
|
180
|
+
{
|
|
181
|
+
multi_match: {
|
|
182
|
+
query,
|
|
183
|
+
fields: ['name^2', 'email'],
|
|
184
|
+
fuzziness: 'AUTO',
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
]
|
|
188
|
+
|
|
189
|
+
if (filters) {
|
|
190
|
+
if (filters.age) {
|
|
191
|
+
must.push({ range: { age: filters.age } })
|
|
192
|
+
}
|
|
193
|
+
if (filters.status) {
|
|
194
|
+
must.push({ term: { status: filters.status } })
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
const result = await client.search({
|
|
199
|
+
index: 'users',
|
|
200
|
+
body: {
|
|
201
|
+
query: {
|
|
202
|
+
bool: {
|
|
203
|
+
must,
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
highlight: {
|
|
207
|
+
fields: {
|
|
208
|
+
name: {},
|
|
209
|
+
email: {},
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
})
|
|
214
|
+
|
|
215
|
+
return result.body.hits.hits.map(hit => ({
|
|
216
|
+
...hit._source,
|
|
217
|
+
score: hit._score,
|
|
218
|
+
highlights: hit.highlight,
|
|
219
|
+
}))
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Auto-complete
|
|
224
|
+
```typescript
|
|
225
|
+
// Create index with completion suggester
|
|
226
|
+
await client.indices.create({
|
|
227
|
+
index: 'suggestions',
|
|
228
|
+
body: {
|
|
229
|
+
mappings: {
|
|
230
|
+
properties: {
|
|
231
|
+
name: {
|
|
232
|
+
type: 'text',
|
|
233
|
+
fields: {
|
|
234
|
+
suggest: {
|
|
235
|
+
type: 'completion',
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
// Search with suggestions
|
|
245
|
+
const result = await client.search({
|
|
246
|
+
index: 'suggestions',
|
|
247
|
+
body: {
|
|
248
|
+
suggest: {
|
|
249
|
+
name_suggest: {
|
|
250
|
+
prefix: 'joh',
|
|
251
|
+
completion: {
|
|
252
|
+
field: 'name.suggest',
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
})
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Best Practices
|
|
261
|
+
|
|
262
|
+
✅ **DO:**
|
|
263
|
+
- Use appropriate field types (text vs keyword)
|
|
264
|
+
- Create indexes with proper mappings
|
|
265
|
+
- Use bulk API for multiple operations
|
|
266
|
+
- Implement proper error handling
|
|
267
|
+
- Use aliases for zero-downtime reindexing
|
|
268
|
+
- Monitor cluster health
|
|
269
|
+
- Use appropriate shard and replica counts
|
|
270
|
+
- Implement search result pagination
|
|
271
|
+
- Use filters for exact matches (faster than queries)
|
|
272
|
+
- Enable slow query logging
|
|
273
|
+
|
|
274
|
+
❌ **DON'T:**
|
|
275
|
+
- Store large binary data (use external storage)
|
|
276
|
+
- Use too many shards (1 per 10-50GB)
|
|
277
|
+
- Skip mapping definitions
|
|
278
|
+
- Ignore cluster health
|
|
279
|
+
- Hardcode connection strings
|
|
280
|
+
- Use wildcard queries in production
|
|
281
|
+
- Skip error handling
|
|
282
|
+
- Ignore query performance
|
|
283
|
+
- Store sensitive data without encryption
|
|
284
|
+
- Use default refresh interval for real-time needs
|
|
285
|
+
|
|
286
|
+
## Configuration
|
|
287
|
+
|
|
288
|
+
### Environment Variables
|
|
289
|
+
```bash
|
|
290
|
+
ELASTICSEARCH_URL=http://localhost:9200
|
|
291
|
+
ELASTICSEARCH_USER=elastic
|
|
292
|
+
ELASTICSEARCH_PASSWORD=securepassword
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Docker Compose
|
|
296
|
+
```yaml
|
|
297
|
+
services:
|
|
298
|
+
elasticsearch:
|
|
299
|
+
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
|
|
300
|
+
environment:
|
|
301
|
+
- discovery.type=single-node
|
|
302
|
+
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
|
303
|
+
- xpack.security.enabled=false
|
|
304
|
+
ports:
|
|
305
|
+
- "9200:9200"
|
|
306
|
+
volumes:
|
|
307
|
+
- elasticsearch_data:/usr/share/elasticsearch/data
|
|
308
|
+
healthcheck:
|
|
309
|
+
test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"]
|
|
310
|
+
interval: 30s
|
|
311
|
+
timeout: 10s
|
|
312
|
+
retries: 5
|
|
313
|
+
|
|
314
|
+
volumes:
|
|
315
|
+
elasticsearch_data:
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## Integration with Development
|
|
319
|
+
|
|
320
|
+
### Testing
|
|
321
|
+
```typescript
|
|
322
|
+
// Use test index
|
|
323
|
+
const testIndex = 'test_users'
|
|
324
|
+
|
|
325
|
+
beforeEach(async () => {
|
|
326
|
+
await client.indices.create({ index: testIndex })
|
|
327
|
+
})
|
|
328
|
+
|
|
329
|
+
afterEach(async () => {
|
|
330
|
+
await client.indices.delete({ index: testIndex })
|
|
331
|
+
})
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Health Checks
|
|
335
|
+
```typescript
|
|
336
|
+
async function checkElasticsearchHealth(): Promise<boolean> {
|
|
337
|
+
try {
|
|
338
|
+
const response = await client.cluster.health()
|
|
339
|
+
return response.body.status !== 'red'
|
|
340
|
+
} catch {
|
|
341
|
+
return false
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
<!-- ELASTICSEARCH:END -->
|
|
347
|
+
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
<!-- GCS:START -->
|
|
2
|
+
# Google Cloud Storage Instructions
|
|
3
|
+
|
|
4
|
+
**CRITICAL**: Use Google Cloud Storage for object storage, file uploads, static assets, and backup storage in GCP.
|
|
5
|
+
|
|
6
|
+
## Core Features
|
|
7
|
+
|
|
8
|
+
### Connection
|
|
9
|
+
```typescript
|
|
10
|
+
// Using @google-cloud/storage
|
|
11
|
+
import { Storage } from '@google-cloud/storage'
|
|
12
|
+
|
|
13
|
+
const storage = new Storage({
|
|
14
|
+
projectId: process.env.GCP_PROJECT_ID,
|
|
15
|
+
keyFilename: process.env.GCP_KEY_FILE, // Path to service account key
|
|
16
|
+
// Or use credentials object
|
|
17
|
+
credentials: {
|
|
18
|
+
client_email: process.env.GCP_CLIENT_EMAIL,
|
|
19
|
+
private_key: process.env.GCP_PRIVATE_KEY?.replace(/\\n/g, '\n'),
|
|
20
|
+
},
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
const bucket = storage.bucket(process.env.GCS_BUCKET_NAME || 'my-bucket')
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Basic Operations
|
|
27
|
+
```typescript
|
|
28
|
+
// Upload file
|
|
29
|
+
const file = bucket.file('path/to/file.jpg')
|
|
30
|
+
await file.save(fileBuffer, {
|
|
31
|
+
metadata: {
|
|
32
|
+
contentType: 'image/jpeg',
|
|
33
|
+
metadata: {
|
|
34
|
+
userId: '123',
|
|
35
|
+
originalName: 'photo.jpg',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
// Download file
|
|
41
|
+
const [fileContent] = await file.download()
|
|
42
|
+
|
|
43
|
+
// Delete file
|
|
44
|
+
await file.delete()
|
|
45
|
+
|
|
46
|
+
// List files
|
|
47
|
+
const [files] = await bucket.getFiles({
|
|
48
|
+
prefix: 'uploads/',
|
|
49
|
+
maxResults: 100,
|
|
50
|
+
})
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Advanced Features
|
|
54
|
+
```typescript
|
|
55
|
+
// Generate signed URL
|
|
56
|
+
const [url] = await file.getSignedUrl({
|
|
57
|
+
action: 'read',
|
|
58
|
+
expires: Date.now() + 3600 * 1000, // 1 hour
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
// Generate signed URL for upload
|
|
62
|
+
const [uploadUrl] = await file.getSignedUrl({
|
|
63
|
+
action: 'write',
|
|
64
|
+
expires: Date.now() + 3600 * 1000,
|
|
65
|
+
contentType: 'image/jpeg',
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
// Copy file
|
|
69
|
+
const sourceFile = bucket.file('source/file.jpg')
|
|
70
|
+
const destFile = bucket.file('dest/file.jpg')
|
|
71
|
+
await sourceFile.copy(destFile)
|
|
72
|
+
|
|
73
|
+
// Set metadata
|
|
74
|
+
await file.setMetadata({
|
|
75
|
+
metadata: {
|
|
76
|
+
category: 'profile',
|
|
77
|
+
uploadedBy: 'user-123',
|
|
78
|
+
},
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
// Get metadata
|
|
82
|
+
const [metadata] = await file.getMetadata()
|
|
83
|
+
console.log(metadata.contentType, metadata.size, metadata.metadata)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Common Patterns
|
|
87
|
+
|
|
88
|
+
### File Upload Handler
|
|
89
|
+
```typescript
|
|
90
|
+
async function uploadFile(file: Buffer, filename: string, userId: string) {
|
|
91
|
+
const filePath = `users/${userId}/${Date.now()}-${filename}`
|
|
92
|
+
const file = bucket.file(filePath)
|
|
93
|
+
|
|
94
|
+
await file.save(file, {
|
|
95
|
+
metadata: {
|
|
96
|
+
contentType: getContentType(filename),
|
|
97
|
+
metadata: {
|
|
98
|
+
userId,
|
|
99
|
+
originalName: filename,
|
|
100
|
+
uploadedAt: new Date().toISOString(),
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
await file.makePublic() // Or use signed URLs
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
filePath,
|
|
109
|
+
publicUrl: file.publicUrl(),
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Temporary Access URL
|
|
115
|
+
```typescript
|
|
116
|
+
async function generateTemporaryUrl(filePath: string, expiresInMinutes: number = 60) {
|
|
117
|
+
const file = bucket.file(filePath)
|
|
118
|
+
const [url] = await file.getSignedUrl({
|
|
119
|
+
action: 'read',
|
|
120
|
+
expires: Date.now() + expiresInMinutes * 60 * 1000,
|
|
121
|
+
})
|
|
122
|
+
return url
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Best Practices
|
|
127
|
+
|
|
128
|
+
✅ **DO:**
|
|
129
|
+
- Use appropriate storage classes (Standard, Nearline, Coldline, Archive)
|
|
130
|
+
- Set blob metadata for organization
|
|
131
|
+
- Use signed URLs for temporary access
|
|
132
|
+
- Implement proper error handling
|
|
133
|
+
- Use appropriate content types
|
|
134
|
+
- Enable versioning for important data
|
|
135
|
+
- Monitor storage usage and costs
|
|
136
|
+
- Use lifecycle management policies
|
|
137
|
+
- Implement retry logic
|
|
138
|
+
- Use service account credentials
|
|
139
|
+
|
|
140
|
+
❌ **DON'T:**
|
|
141
|
+
- Store sensitive data without encryption
|
|
142
|
+
- Make files public unnecessarily
|
|
143
|
+
- Hardcode credentials
|
|
144
|
+
- Ignore error handling
|
|
145
|
+
- Skip content-type validation
|
|
146
|
+
- Ignore lifecycle policies
|
|
147
|
+
- Skip access logging
|
|
148
|
+
- Use default permissions
|
|
149
|
+
- Ignore cost optimization
|
|
150
|
+
- Store large files without chunking
|
|
151
|
+
|
|
152
|
+
## Configuration
|
|
153
|
+
|
|
154
|
+
### Environment Variables
|
|
155
|
+
```bash
|
|
156
|
+
GCP_PROJECT_ID=my-project
|
|
157
|
+
GCP_KEY_FILE=/path/to/service-account-key.json
|
|
158
|
+
GCP_CLIENT_EMAIL=service-account@project.iam.gserviceaccount.com
|
|
159
|
+
GCP_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n..."
|
|
160
|
+
GCS_BUCKET_NAME=my-bucket
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Service Account Key
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"type": "service_account",
|
|
167
|
+
"project_id": "my-project",
|
|
168
|
+
"private_key_id": "...",
|
|
169
|
+
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
|
|
170
|
+
"client_email": "service-account@project.iam.gserviceaccount.com",
|
|
171
|
+
"client_id": "...",
|
|
172
|
+
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
|
173
|
+
"token_uri": "https://oauth2.googleapis.com/token"
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
<!-- GCS:END -->
|
|
178
|
+
|