@hivehub/rulebook 5.5.2 → 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/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/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/package.json +1 -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 +8 -10
- package/templates/hooks/enforce-pre-tool.sh +70 -0
- package/templates/hooks/terse-mode-tracker.sh +146 -143
- 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,347 +0,0 @@
|
|
|
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
|
-
|
|
@@ -1,178 +0,0 @@
|
|
|
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
|
-
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
<!-- HELM:START -->
|
|
2
|
-
# Helm Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Follow these Helm best practices for Kubernetes package management.
|
|
5
|
-
|
|
6
|
-
## Chart Structure
|
|
7
|
-
|
|
8
|
-
```
|
|
9
|
-
charts/<name>/
|
|
10
|
-
├── Chart.yaml # Chart metadata (required)
|
|
11
|
-
├── values.yaml # Default values (required)
|
|
12
|
-
├── templates/ # Kubernetes manifests
|
|
13
|
-
│ ├── deployment.yaml
|
|
14
|
-
│ ├── service.yaml
|
|
15
|
-
│ ├── ingress.yaml
|
|
16
|
-
│ ├── configmap.yaml
|
|
17
|
-
│ ├── secret.yaml
|
|
18
|
-
│ ├── hpa.yaml
|
|
19
|
-
│ ├── _helpers.tpl # Template helpers
|
|
20
|
-
│ ├── NOTES.txt # Post-install notes
|
|
21
|
-
│ └── tests/
|
|
22
|
-
│ └── test-connection.yaml
|
|
23
|
-
├── charts/ # Chart dependencies
|
|
24
|
-
└── .helmignore # Files to exclude from packaging
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Chart.yaml Requirements
|
|
28
|
-
|
|
29
|
-
```yaml
|
|
30
|
-
apiVersion: v2
|
|
31
|
-
name: my-app
|
|
32
|
-
description: A Helm chart for my application
|
|
33
|
-
type: application
|
|
34
|
-
version: 1.0.0 # Chart version (bump on every change)
|
|
35
|
-
appVersion: "1.0.0" # Application version (keep in sync)
|
|
36
|
-
maintainers:
|
|
37
|
-
- name: team-name
|
|
38
|
-
email: team@example.com
|
|
39
|
-
dependencies:
|
|
40
|
-
- name: postgresql
|
|
41
|
-
version: "12.x.x"
|
|
42
|
-
repository: "https://charts.bitnami.com/bitnami"
|
|
43
|
-
condition: postgresql.enabled
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## values.yaml Requirements
|
|
47
|
-
|
|
48
|
-
- Document every value with a comment
|
|
49
|
-
- Set sensible production defaults
|
|
50
|
-
- Never hardcode image tags
|
|
51
|
-
|
|
52
|
-
```yaml
|
|
53
|
-
# -- Number of replicas
|
|
54
|
-
replicaCount: 3
|
|
55
|
-
|
|
56
|
-
image:
|
|
57
|
-
# -- Container image repository
|
|
58
|
-
repository: my-registry/my-app
|
|
59
|
-
# -- Image pull policy
|
|
60
|
-
pullPolicy: IfNotPresent
|
|
61
|
-
# -- Image tag (defaults to chart appVersion)
|
|
62
|
-
tag: ""
|
|
63
|
-
|
|
64
|
-
# -- Resource requests and limits
|
|
65
|
-
resources:
|
|
66
|
-
requests:
|
|
67
|
-
memory: "128Mi"
|
|
68
|
-
cpu: "100m"
|
|
69
|
-
limits:
|
|
70
|
-
memory: "512Mi"
|
|
71
|
-
cpu: "500m"
|
|
72
|
-
|
|
73
|
-
# -- Enable/disable autoscaling
|
|
74
|
-
autoscaling:
|
|
75
|
-
enabled: true
|
|
76
|
-
minReplicas: 2
|
|
77
|
-
maxReplicas: 10
|
|
78
|
-
targetCPUUtilizationPercentage: 80
|
|
79
|
-
|
|
80
|
-
# -- Service configuration
|
|
81
|
-
service:
|
|
82
|
-
type: ClusterIP
|
|
83
|
-
port: 80
|
|
84
|
-
|
|
85
|
-
# -- Ingress configuration
|
|
86
|
-
ingress:
|
|
87
|
-
enabled: false
|
|
88
|
-
className: ""
|
|
89
|
-
annotations: {}
|
|
90
|
-
hosts:
|
|
91
|
-
- host: my-app.example.com
|
|
92
|
-
paths:
|
|
93
|
-
- path: /
|
|
94
|
-
pathType: ImplementationSpecific
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## Template Best Practices
|
|
98
|
-
|
|
99
|
-
### _helpers.tpl
|
|
100
|
-
Define reusable template fragments:
|
|
101
|
-
```yaml
|
|
102
|
-
{{- define "chart.fullname" -}}
|
|
103
|
-
{{- if .Values.fullnameOverride }}
|
|
104
|
-
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
|
105
|
-
{{- else }}
|
|
106
|
-
{{- $name := default .Chart.Name .Values.nameOverride }}
|
|
107
|
-
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
|
108
|
-
{{- end }}
|
|
109
|
-
{{- end }}
|
|
110
|
-
|
|
111
|
-
{{- define "chart.labels" -}}
|
|
112
|
-
helm.sh/chart: {{ include "chart.chart" . }}
|
|
113
|
-
app.kubernetes.io/name: {{ include "chart.name" . }}
|
|
114
|
-
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
115
|
-
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
|
116
|
-
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
|
117
|
-
{{- end }}
|
|
118
|
-
|
|
119
|
-
{{- define "chart.selectorLabels" -}}
|
|
120
|
-
app.kubernetes.io/name: {{ include "chart.name" . }}
|
|
121
|
-
app.kubernetes.io/instance: {{ .Release.Name }}
|
|
122
|
-
{{- end }}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Template Patterns
|
|
126
|
-
- Use `{{ include "chart.fullname" . }}` for consistent naming
|
|
127
|
-
- Always add labels: `{{ include "chart.labels" . | nindent 4 }}`
|
|
128
|
-
- Use `{{ .Values.x | default "fallback" }}` for optional values
|
|
129
|
-
- Use `{{- with .Values.x }}` blocks for conditional sections
|
|
130
|
-
- Quote all string values: `{{ .Values.image.tag | quote }}`
|
|
131
|
-
|
|
132
|
-
## Versioning
|
|
133
|
-
|
|
134
|
-
- Bump `Chart.yaml` version on every change (semver: MAJOR.MINOR.PATCH)
|
|
135
|
-
- Keep `appVersion` in sync with the application version
|
|
136
|
-
- Use `helm dependency update` after changing dependencies
|
|
137
|
-
- Tag releases in version control matching chart version
|
|
138
|
-
|
|
139
|
-
## Linting and Validation
|
|
140
|
-
|
|
141
|
-
Run these checks before every commit:
|
|
142
|
-
```bash
|
|
143
|
-
# Lint the chart
|
|
144
|
-
helm lint charts/my-app/
|
|
145
|
-
|
|
146
|
-
# Render templates locally
|
|
147
|
-
helm template my-release charts/my-app/ --values values-dev.yaml
|
|
148
|
-
|
|
149
|
-
# Validate rendered templates
|
|
150
|
-
helm template my-release charts/my-app/ | kubeval --strict
|
|
151
|
-
|
|
152
|
-
# Dry-run against cluster
|
|
153
|
-
helm install my-release charts/my-app/ --dry-run --debug
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
## Common Patterns
|
|
157
|
-
|
|
158
|
-
### Environment-Specific Values
|
|
159
|
-
```bash
|
|
160
|
-
# Development
|
|
161
|
-
helm install my-app charts/my-app/ -f values-dev.yaml
|
|
162
|
-
|
|
163
|
-
# Staging
|
|
164
|
-
helm install my-app charts/my-app/ -f values-staging.yaml
|
|
165
|
-
|
|
166
|
-
# Production
|
|
167
|
-
helm install my-app charts/my-app/ -f values-prod.yaml
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### Secrets Management
|
|
171
|
-
```yaml
|
|
172
|
-
# Use external-secrets or sealed-secrets
|
|
173
|
-
# Never store plaintext secrets in values.yaml
|
|
174
|
-
externalSecrets:
|
|
175
|
-
enabled: true
|
|
176
|
-
secretStore: aws-secrets-manager
|
|
177
|
-
data:
|
|
178
|
-
- secretKey: DATABASE_URL
|
|
179
|
-
remoteRef:
|
|
180
|
-
key: /myapp/database-url
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
## Best Practices
|
|
184
|
-
|
|
185
|
-
- Use `helm create` to scaffold new charts with best-practice defaults
|
|
186
|
-
- Include chart tests in `templates/tests/`
|
|
187
|
-
- Document all values in `values.yaml` with comments
|
|
188
|
-
- Use `.helmignore` to exclude development files from chart packages
|
|
189
|
-
- Pin dependency versions (avoid `*` or floating ranges)
|
|
190
|
-
- Use `helm diff` plugin to preview changes before upgrading
|
|
191
|
-
- Store charts in a Helm repository (ChartMuseum, Harbor, OCI registry)
|
|
192
|
-
- Run `helm lint` in CI/CD pipeline
|
|
193
|
-
|
|
194
|
-
<!-- HELM:END -->
|