@hivehub/rulebook 5.5.1 → 5.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/rulebook-learn-capture.md +41 -48
- package/.claude/commands/rulebook-learn-list.md +13 -13
- package/README.md +332 -394
- package/dist/cli/commands/context-intelligence.d.ts +0 -1
- package/dist/cli/commands/context-intelligence.d.ts.map +1 -1
- package/dist/cli/commands/context-intelligence.js +12 -33
- package/dist/cli/commands/context-intelligence.js.map +1 -1
- package/dist/cli/commands/index.d.ts +4 -7
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +4 -7
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +40 -81
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +0 -1
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +1 -7
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/memory.d.ts +7 -1
- package/dist/cli/commands/memory.d.ts.map +1 -1
- package/dist/cli/commands/memory.js +51 -57
- package/dist/cli/commands/memory.js.map +1 -1
- package/dist/cli/commands/misc.d.ts +1 -15
- package/dist/cli/commands/misc.d.ts.map +1 -1
- package/dist/cli/commands/misc.js +36 -215
- package/dist/cli/commands/misc.js.map +1 -1
- package/dist/cli/commands/plans.d.ts +0 -6
- package/dist/cli/commands/plans.d.ts.map +1 -1
- package/dist/cli/commands/plans.js +9 -77
- package/dist/cli/commands/plans.js.map +1 -1
- package/dist/cli/commands/skills.js +6 -6
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/task.js +4 -4
- package/dist/cli/commands/task.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +122 -52
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/prompts.d.ts.map +1 -1
- package/dist/cli/prompts.js +1 -78
- package/dist/cli/prompts.js.map +1 -1
- package/dist/core/claude/claude-mcp.d.ts +59 -0
- package/dist/core/claude/claude-mcp.d.ts.map +1 -0
- package/dist/core/claude/claude-mcp.js +220 -0
- package/dist/core/claude/claude-mcp.js.map +1 -0
- package/dist/core/claude/claude-md-generator.d.ts +52 -0
- package/dist/core/claude/claude-md-generator.d.ts.map +1 -0
- package/dist/core/claude/claude-md-generator.js +104 -0
- package/dist/core/claude/claude-md-generator.js.map +1 -0
- package/dist/core/claude/claude-settings-manager.d.ts +44 -0
- package/dist/core/claude/claude-settings-manager.d.ts.map +1 -0
- package/dist/core/claude/claude-settings-manager.js +194 -0
- package/dist/core/claude/claude-settings-manager.js.map +1 -0
- package/dist/core/claude-settings-manager.d.ts.map +1 -1
- package/dist/core/claude-settings-manager.js +9 -3
- package/dist/core/claude-settings-manager.js.map +1 -1
- package/dist/core/console/cli-bridge.d.ts +113 -0
- package/dist/core/console/cli-bridge.d.ts.map +1 -0
- package/dist/core/console/cli-bridge.js +1094 -0
- package/dist/core/console/cli-bridge.js.map +1 -0
- package/dist/core/detect/detector.d.ts +35 -0
- package/dist/core/detect/detector.d.ts.map +1 -0
- package/dist/core/detect/detector.js +541 -0
- package/dist/core/detect/detector.js.map +1 -0
- package/dist/core/docs/docs-generator.d.ts +9 -0
- package/dist/core/docs/docs-generator.d.ts.map +1 -0
- package/dist/core/docs/docs-generator.js +531 -0
- package/dist/core/docs/docs-generator.js.map +1 -0
- package/dist/core/docs/mcp-reference-generator.d.ts +13 -0
- package/dist/core/docs/mcp-reference-generator.d.ts.map +1 -0
- package/dist/core/docs/mcp-reference-generator.js +66 -0
- package/dist/core/docs/mcp-reference-generator.js.map +1 -0
- package/dist/core/generators/generator.d.ts +54 -0
- package/dist/core/generators/generator.d.ts.map +1 -0
- package/dist/core/generators/generator.js +1041 -0
- package/dist/core/generators/generator.js.map +1 -0
- package/dist/core/generators/gitignore-generator.d.ts +13 -0
- package/dist/core/generators/gitignore-generator.d.ts.map +1 -0
- package/dist/core/generators/gitignore-generator.js +307 -0
- package/dist/core/generators/gitignore-generator.js.map +1 -0
- package/dist/core/generators/minimal-scaffolder.d.ts +8 -0
- package/dist/core/generators/minimal-scaffolder.d.ts.map +1 -0
- package/dist/core/generators/minimal-scaffolder.js +51 -0
- package/dist/core/generators/minimal-scaffolder.js.map +1 -0
- package/dist/core/generators/rules-generator.d.ts +73 -0
- package/dist/core/generators/rules-generator.d.ts.map +1 -0
- package/dist/core/generators/rules-generator.js +202 -0
- package/dist/core/generators/rules-generator.js.map +1 -0
- package/dist/core/generators/workflow-generator.d.ts +15 -0
- package/dist/core/generators/workflow-generator.d.ts.map +1 -0
- package/dist/core/generators/workflow-generator.js +390 -0
- package/dist/core/generators/workflow-generator.js.map +1 -0
- package/dist/core/ide/multi-tool-generator.d.ts +59 -0
- package/dist/core/ide/multi-tool-generator.d.ts.map +1 -0
- package/dist/core/ide/multi-tool-generator.js +157 -0
- package/dist/core/ide/multi-tool-generator.js.map +1 -0
- package/dist/core/ide/opencode-generator.d.ts +72 -0
- package/dist/core/ide/opencode-generator.d.ts.map +1 -0
- package/dist/core/ide/opencode-generator.js +450 -0
- package/dist/core/ide/opencode-generator.js.map +1 -0
- package/dist/core/merger.d.ts +1 -1
- package/dist/core/merger.d.ts.map +1 -1
- package/dist/core/merger.js +5 -5
- package/dist/core/merger.js.map +1 -1
- package/dist/core/migrator.d.ts +0 -1
- package/dist/core/migrator.d.ts.map +1 -1
- package/dist/core/migrator.js +4 -29
- package/dist/core/migrator.js.map +1 -1
- package/dist/core/quality/coverage-checker.d.ts +14 -0
- package/dist/core/quality/coverage-checker.d.ts.map +1 -0
- package/dist/core/quality/coverage-checker.js +176 -0
- package/dist/core/quality/coverage-checker.js.map +1 -0
- package/dist/core/quality/dependency-checker.d.ts +21 -0
- package/dist/core/quality/dependency-checker.d.ts.map +1 -0
- package/dist/core/quality/dependency-checker.js +247 -0
- package/dist/core/quality/dependency-checker.js.map +1 -0
- package/dist/core/quality/doctor.d.ts +19 -0
- package/dist/core/quality/doctor.d.ts.map +1 -0
- package/dist/core/quality/doctor.js +163 -0
- package/dist/core/quality/doctor.js.map +1 -0
- package/dist/core/quality/validator.d.ts +21 -0
- package/dist/core/quality/validator.d.ts.map +1 -0
- package/dist/core/quality/validator.js +177 -0
- package/dist/core/quality/validator.js.map +1 -0
- package/dist/core/ralph-scripts.d.ts.map +1 -1
- package/dist/core/ralph-scripts.js +7 -6
- package/dist/core/ralph-scripts.js.map +1 -1
- package/dist/core/skills/skills-manager.d.ts +126 -0
- package/dist/core/skills/skills-manager.d.ts.map +1 -0
- package/dist/core/skills/skills-manager.js +630 -0
- package/dist/core/skills/skills-manager.js.map +1 -0
- package/dist/core/state/config-manager.d.ts +86 -0
- package/dist/core/state/config-manager.d.ts.map +1 -0
- package/dist/core/state/config-manager.js +562 -0
- package/dist/core/state/config-manager.js.map +1 -0
- package/dist/core/state/override-manager.d.ts +23 -0
- package/dist/core/state/override-manager.d.ts.map +1 -0
- package/dist/core/state/override-manager.js +82 -0
- package/dist/core/state/override-manager.js.map +1 -0
- package/dist/core/state/state-writer.d.ts +34 -0
- package/dist/core/state/state-writer.d.ts.map +1 -0
- package/dist/core/state/state-writer.js +78 -0
- package/dist/core/state/state-writer.js.map +1 -0
- package/dist/core/state/version-bumper.d.ts +19 -0
- package/dist/core/state/version-bumper.d.ts.map +1 -0
- package/dist/core/state/version-bumper.js +180 -0
- package/dist/core/state/version-bumper.js.map +1 -0
- package/dist/core/tasks/decision-manager.d.ts +25 -0
- package/dist/core/tasks/decision-manager.d.ts.map +1 -0
- package/dist/core/tasks/decision-manager.js +183 -0
- package/dist/core/tasks/decision-manager.js.map +1 -0
- package/dist/core/tasks/knowledge-manager.d.ts +24 -0
- package/dist/core/tasks/knowledge-manager.d.ts.map +1 -0
- package/dist/core/tasks/knowledge-manager.js +173 -0
- package/dist/core/tasks/knowledge-manager.js.map +1 -0
- package/dist/core/tasks/learn-manager.d.ts +27 -0
- package/dist/core/tasks/learn-manager.d.ts.map +1 -0
- package/dist/core/tasks/learn-manager.js +121 -0
- package/dist/core/tasks/learn-manager.js.map +1 -0
- package/dist/core/tasks/plans-manager.d.ts +46 -0
- package/dist/core/tasks/plans-manager.d.ts.map +1 -0
- package/dist/core/tasks/plans-manager.js +158 -0
- package/dist/core/tasks/plans-manager.js.map +1 -0
- package/dist/core/tasks/task-manager.d.ts +127 -0
- package/dist/core/tasks/task-manager.d.ts.map +1 -0
- package/dist/core/tasks/task-manager.js +607 -0
- package/dist/core/tasks/task-manager.js.map +1 -0
- package/dist/core/workspace/project-worker.d.ts +6 -6
- package/dist/core/workspace/project-worker.d.ts.map +1 -1
- package/dist/core/workspace/project-worker.js +6 -6
- package/dist/core/workspace/project-worker.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -176
- package/dist/index.js.map +1 -1
- package/dist/mcp/rulebook-server.d.ts.map +1 -1
- package/dist/mcp/rulebook-server.js +16 -960
- package/dist/mcp/rulebook-server.js.map +1 -1
- package/dist/memory/file-search.d.ts +43 -0
- package/dist/memory/file-search.d.ts.map +1 -0
- package/dist/memory/file-search.js +228 -0
- package/dist/memory/file-search.js.map +1 -0
- package/dist/memory/file-store.d.ts +99 -0
- package/dist/memory/file-store.d.ts.map +1 -0
- package/dist/memory/file-store.js +615 -0
- package/dist/memory/file-store.js.map +1 -0
- package/dist/memory/legacy-migrator.d.ts +27 -0
- package/dist/memory/legacy-migrator.d.ts.map +1 -0
- package/dist/memory/legacy-migrator.js +185 -0
- package/dist/memory/legacy-migrator.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +25 -24
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +97 -140
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/memory-types.d.ts +1 -1
- package/dist/memory/memory-types.d.ts.map +1 -1
- package/dist/types.d.ts +8 -119
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/file-system.d.ts +22 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +31 -0
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/git-hooks.d.ts.map +1 -1
- package/dist/utils/git-hooks.js +3 -2
- package/dist/utils/git-hooks.js.map +1 -1
- package/package.json +2 -6
- package/templates/agents/context-intelligence.md +50 -52
- package/templates/cli/OPENCODE.md +85 -18
- package/templates/commands/rulebook-learn-capture.md +41 -48
- package/templates/commands/rulebook-learn-list.md +13 -13
- package/templates/core/AGENTS_LEAN.md +0 -14
- package/templates/hooks/check-context-and-handoff.sh +74 -76
- package/templates/hooks/enforce-pre-tool.sh +70 -0
- package/templates/hooks/enforce-team-for-background-agents.sh +55 -55
- package/templates/hooks/on-compact-reinject.sh +34 -34
- package/templates/hooks/resume-from-handoff.sh +61 -61
- package/templates/hooks/terse-activate.sh +197 -197
- package/templates/hooks/terse-mode-tracker.sh +190 -187
- package/templates/ides/OPENCODE.md +63 -0
- package/templates/skills/cli/opencode/SKILL.md +82 -28
- package/.claude/commands/ralph-config.md +0 -112
- package/.claude/commands/ralph-history.md +0 -110
- package/.claude/commands/ralph-init.md +0 -72
- package/.claude/commands/ralph-pause-resume.md +0 -105
- package/.claude/commands/ralph-run.md +0 -101
- package/.claude/commands/ralph-status.md +0 -76
- package/templates/core/RALPH.md +0 -471
- package/templates/frameworks/ANGULAR.md +0 -36
- package/templates/frameworks/DJANGO.md +0 -83
- package/templates/frameworks/ELECTRON.md +0 -147
- package/templates/frameworks/FLASK.md +0 -38
- package/templates/frameworks/FLUTTER.md +0 -55
- package/templates/frameworks/JQUERY.md +0 -32
- package/templates/frameworks/LARAVEL.md +0 -38
- package/templates/frameworks/NESTJS.md +0 -43
- package/templates/frameworks/NEXTJS.md +0 -127
- package/templates/frameworks/NUXT.md +0 -40
- package/templates/frameworks/RAILS.md +0 -66
- package/templates/frameworks/REACT.md +0 -38
- package/templates/frameworks/REACT_NATIVE.md +0 -47
- package/templates/frameworks/SPRING.md +0 -39
- package/templates/frameworks/SYMFONY.md +0 -36
- package/templates/frameworks/VUE.md +0 -36
- package/templates/frameworks/ZEND.md +0 -35
- package/templates/hooks/enforce-mcp-for-tasks.sh +0 -31
- package/templates/hooks/enforce-no-deferred.sh +0 -21
- package/templates/hooks/enforce-no-shortcuts.sh +0 -31
- package/templates/ides/COPILOT.md +0 -37
- package/templates/ides/CURSOR.md +0 -43
- package/templates/ides/JETBRAINS_AI.md +0 -35
- package/templates/ides/REPLIT.md +0 -36
- package/templates/ides/TABNINE.md +0 -29
- package/templates/ides/VSCODE.md +0 -40
- package/templates/ides/WINDSURF.md +0 -36
- package/templates/ides/ZED.md +0 -32
- package/templates/ides/cursor-mdc/go.mdc +0 -24
- package/templates/ides/cursor-mdc/python.mdc +0 -24
- package/templates/ides/cursor-mdc/quality.mdc +0 -25
- package/templates/ides/cursor-mdc/ralph.mdc +0 -39
- package/templates/ides/cursor-mdc/rulebook.mdc +0 -38
- package/templates/ides/cursor-mdc/rust.mdc +0 -24
- package/templates/ides/cursor-mdc/typescript.mdc +0 -25
- package/templates/ralph/ralph-history.bat +0 -4
- package/templates/ralph/ralph-history.sh +0 -5
- package/templates/ralph/ralph-init.bat +0 -5
- package/templates/ralph/ralph-init.sh +0 -5
- package/templates/ralph/ralph-pause.bat +0 -5
- package/templates/ralph/ralph-pause.sh +0 -5
- package/templates/ralph/ralph-run.bat +0 -5
- package/templates/ralph/ralph-run.sh +0 -5
- package/templates/ralph/ralph-status.bat +0 -4
- package/templates/ralph/ralph-status.sh +0 -5
- package/templates/services/AZURE_BLOB.md +0 -184
- package/templates/services/CASSANDRA.md +0 -239
- package/templates/services/DATADOG.md +0 -26
- package/templates/services/DOCKER.md +0 -124
- package/templates/services/DOCKER_COMPOSE.md +0 -168
- package/templates/services/DYNAMODB.md +0 -308
- package/templates/services/ELASTICSEARCH.md +0 -347
- package/templates/services/GCS.md +0 -178
- package/templates/services/HELM.md +0 -194
- package/templates/services/INFLUXDB.md +0 -265
- package/templates/services/KAFKA.md +0 -341
- package/templates/services/KUBERNETES.md +0 -208
- package/templates/services/MARIADB.md +0 -183
- package/templates/services/MEMCACHED.md +0 -242
- package/templates/services/MINIO.md +0 -201
- package/templates/services/MONGODB.md +0 -268
- package/templates/services/MYSQL.md +0 -358
- package/templates/services/NEO4J.md +0 -247
- package/templates/services/OPENTELEMETRY.md +0 -25
- package/templates/services/ORACLE.md +0 -290
- package/templates/services/PINO.md +0 -24
- package/templates/services/POSTGRESQL.md +0 -326
- package/templates/services/PROMETHEUS.md +0 -33
- package/templates/services/RABBITMQ.md +0 -286
- package/templates/services/REDIS.md +0 -292
- package/templates/services/S3.md +0 -298
- package/templates/services/SENTRY.md +0 -23
- package/templates/services/SQLITE.md +0 -294
- package/templates/services/SQLSERVER.md +0 -294
- package/templates/services/WINSTON.md +0 -30
- package/templates/skills/frameworks/angular/SKILL.md +0 -46
- package/templates/skills/frameworks/django/SKILL.md +0 -93
- package/templates/skills/frameworks/electron/SKILL.md +0 -157
- package/templates/skills/frameworks/flask/SKILL.md +0 -48
- package/templates/skills/frameworks/flutter/SKILL.md +0 -65
- package/templates/skills/frameworks/jquery/SKILL.md +0 -42
- package/templates/skills/frameworks/laravel/SKILL.md +0 -48
- package/templates/skills/frameworks/nestjs/SKILL.md +0 -53
- package/templates/skills/frameworks/nextjs/SKILL.md +0 -137
- package/templates/skills/frameworks/nuxt/SKILL.md +0 -50
- package/templates/skills/frameworks/rails/SKILL.md +0 -76
- package/templates/skills/frameworks/react/SKILL.md +0 -48
- package/templates/skills/frameworks/react-native/SKILL.md +0 -57
- package/templates/skills/frameworks/spring/SKILL.md +0 -49
- package/templates/skills/frameworks/symfony/SKILL.md +0 -46
- package/templates/skills/frameworks/vue/SKILL.md +0 -46
- package/templates/skills/frameworks/zend/SKILL.md +0 -45
- package/templates/skills/services/azure-blob/SKILL.md +0 -194
- package/templates/skills/services/cassandra/SKILL.md +0 -249
- package/templates/skills/services/dynamodb/SKILL.md +0 -318
- package/templates/skills/services/elasticsearch/SKILL.md +0 -357
- package/templates/skills/services/gcs/SKILL.md +0 -188
- package/templates/skills/services/influxdb/SKILL.md +0 -275
- package/templates/skills/services/kafka/SKILL.md +0 -351
- package/templates/skills/services/mariadb/SKILL.md +0 -193
- package/templates/skills/services/memcached/SKILL.md +0 -252
- package/templates/skills/services/minio/SKILL.md +0 -211
- package/templates/skills/services/mongodb/SKILL.md +0 -278
- package/templates/skills/services/mysql/SKILL.md +0 -368
- package/templates/skills/services/neo4j/SKILL.md +0 -257
- package/templates/skills/services/oracle/SKILL.md +0 -300
- package/templates/skills/services/postgresql/SKILL.md +0 -336
- package/templates/skills/services/rabbitmq/SKILL.md +0 -296
- package/templates/skills/services/redis/SKILL.md +0 -302
- package/templates/skills/services/s3/SKILL.md +0 -308
- package/templates/skills/services/sqlite/SKILL.md +0 -304
- package/templates/skills/services/sqlserver/SKILL.md +0 -304
- package/templates/skills/workflows/ralph/SETUP.md +0 -228
- package/templates/skills/workflows/ralph/SKILL.md +0 -309
- package/templates/skills/workflows/ralph/install.sh +0 -87
- package/templates/skills/workflows/ralph/manifest.json +0 -158
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
<!-- KUBERNETES:START -->
|
|
2
|
-
# Kubernetes Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Follow these Kubernetes best practices for all cluster deployments.
|
|
5
|
-
|
|
6
|
-
## Resource Requirements
|
|
7
|
-
|
|
8
|
-
ALL Deployments MUST define resource requests and limits:
|
|
9
|
-
```yaml
|
|
10
|
-
resources:
|
|
11
|
-
requests:
|
|
12
|
-
memory: "128Mi"
|
|
13
|
-
cpu: "100m"
|
|
14
|
-
limits:
|
|
15
|
-
memory: "512Mi"
|
|
16
|
-
cpu: "500m"
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
Omitting resource limits causes unbounded resource consumption and can destabilize the cluster.
|
|
20
|
-
|
|
21
|
-
## Health Probes
|
|
22
|
-
|
|
23
|
-
ALL Deployments MUST define both readiness and liveness probes:
|
|
24
|
-
```yaml
|
|
25
|
-
readinessProbe:
|
|
26
|
-
httpGet:
|
|
27
|
-
path: /health
|
|
28
|
-
port: 3000
|
|
29
|
-
initialDelaySeconds: 5
|
|
30
|
-
periodSeconds: 10
|
|
31
|
-
failureThreshold: 3
|
|
32
|
-
livenessProbe:
|
|
33
|
-
httpGet:
|
|
34
|
-
path: /health
|
|
35
|
-
port: 3000
|
|
36
|
-
initialDelaySeconds: 15
|
|
37
|
-
periodSeconds: 20
|
|
38
|
-
failureThreshold: 3
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Probe Guidelines
|
|
42
|
-
- **readinessProbe**: Gates traffic to the pod. Use a lightweight endpoint
|
|
43
|
-
- **livenessProbe**: Restarts the pod if unhealthy. Set `initialDelaySeconds` high enough for startup
|
|
44
|
-
- Consider a **startupProbe** for slow-starting applications
|
|
45
|
-
|
|
46
|
-
## Security Context
|
|
47
|
-
|
|
48
|
-
ALL Pods MUST define a security context:
|
|
49
|
-
```yaml
|
|
50
|
-
securityContext:
|
|
51
|
-
runAsNonRoot: true
|
|
52
|
-
runAsUser: 1000
|
|
53
|
-
runAsGroup: 1000
|
|
54
|
-
fsGroup: 1000
|
|
55
|
-
allowPrivilegeEscalation: false
|
|
56
|
-
readOnlyRootFilesystem: true
|
|
57
|
-
capabilities:
|
|
58
|
-
drop:
|
|
59
|
-
- ALL
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### Pod Security Standards
|
|
63
|
-
- Apply `restricted` Pod Security Standard where possible
|
|
64
|
-
- Never run containers as root
|
|
65
|
-
- Drop all Linux capabilities unless explicitly required
|
|
66
|
-
|
|
67
|
-
## Namespace
|
|
68
|
-
|
|
69
|
-
- Use explicit namespaces for all resources (never use `default`)
|
|
70
|
-
- Apply least-privilege RBAC per namespace
|
|
71
|
-
- Use `ResourceQuota` and `LimitRange` per namespace
|
|
72
|
-
|
|
73
|
-
```yaml
|
|
74
|
-
apiVersion: v1
|
|
75
|
-
kind: Namespace
|
|
76
|
-
metadata:
|
|
77
|
-
name: my-app
|
|
78
|
-
labels:
|
|
79
|
-
pod-security.kubernetes.io/enforce: restricted
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Secrets Management
|
|
83
|
-
|
|
84
|
-
- NEVER put secrets in YAML files committed to git
|
|
85
|
-
- Use Kubernetes Secrets or external secret managers:
|
|
86
|
-
- HashiCorp Vault
|
|
87
|
-
- AWS Secrets Manager / SSM Parameter Store
|
|
88
|
-
- Azure Key Vault
|
|
89
|
-
- Google Secret Manager
|
|
90
|
-
- Use `ExternalSecret` CRD or `sealed-secrets` for GitOps workflows
|
|
91
|
-
|
|
92
|
-
```yaml
|
|
93
|
-
apiVersion: v1
|
|
94
|
-
kind: Secret
|
|
95
|
-
metadata:
|
|
96
|
-
name: app-secrets
|
|
97
|
-
namespace: my-app
|
|
98
|
-
type: Opaque
|
|
99
|
-
stringData:
|
|
100
|
-
DATABASE_URL: "postgresql://user:pass@host:5432/db"
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Deployment Pattern
|
|
104
|
-
|
|
105
|
-
```yaml
|
|
106
|
-
apiVersion: apps/v1
|
|
107
|
-
kind: Deployment
|
|
108
|
-
metadata:
|
|
109
|
-
name: my-app
|
|
110
|
-
namespace: my-app
|
|
111
|
-
labels:
|
|
112
|
-
app: my-app
|
|
113
|
-
spec:
|
|
114
|
-
replicas: 3
|
|
115
|
-
selector:
|
|
116
|
-
matchLabels:
|
|
117
|
-
app: my-app
|
|
118
|
-
strategy:
|
|
119
|
-
type: RollingUpdate
|
|
120
|
-
rollingUpdate:
|
|
121
|
-
maxSurge: 1
|
|
122
|
-
maxUnavailable: 0
|
|
123
|
-
template:
|
|
124
|
-
metadata:
|
|
125
|
-
labels:
|
|
126
|
-
app: my-app
|
|
127
|
-
spec:
|
|
128
|
-
securityContext:
|
|
129
|
-
runAsNonRoot: true
|
|
130
|
-
runAsUser: 1000
|
|
131
|
-
containers:
|
|
132
|
-
- name: my-app
|
|
133
|
-
image: my-registry/my-app:1.0.0
|
|
134
|
-
ports:
|
|
135
|
-
- containerPort: 3000
|
|
136
|
-
env:
|
|
137
|
-
- name: NODE_ENV
|
|
138
|
-
value: "production"
|
|
139
|
-
envFrom:
|
|
140
|
-
- secretRef:
|
|
141
|
-
name: app-secrets
|
|
142
|
-
resources:
|
|
143
|
-
requests:
|
|
144
|
-
memory: "128Mi"
|
|
145
|
-
cpu: "100m"
|
|
146
|
-
limits:
|
|
147
|
-
memory: "512Mi"
|
|
148
|
-
cpu: "500m"
|
|
149
|
-
readinessProbe:
|
|
150
|
-
httpGet:
|
|
151
|
-
path: /health
|
|
152
|
-
port: 3000
|
|
153
|
-
initialDelaySeconds: 5
|
|
154
|
-
periodSeconds: 10
|
|
155
|
-
livenessProbe:
|
|
156
|
-
httpGet:
|
|
157
|
-
path: /health
|
|
158
|
-
port: 3000
|
|
159
|
-
initialDelaySeconds: 15
|
|
160
|
-
periodSeconds: 20
|
|
161
|
-
securityContext:
|
|
162
|
-
allowPrivilegeEscalation: false
|
|
163
|
-
readOnlyRootFilesystem: true
|
|
164
|
-
capabilities:
|
|
165
|
-
drop: ["ALL"]
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
## Service Pattern
|
|
169
|
-
|
|
170
|
-
```yaml
|
|
171
|
-
apiVersion: v1
|
|
172
|
-
kind: Service
|
|
173
|
-
metadata:
|
|
174
|
-
name: my-app
|
|
175
|
-
namespace: my-app
|
|
176
|
-
spec:
|
|
177
|
-
selector:
|
|
178
|
-
app: my-app
|
|
179
|
-
ports:
|
|
180
|
-
- port: 80
|
|
181
|
-
targetPort: 3000
|
|
182
|
-
protocol: TCP
|
|
183
|
-
type: ClusterIP
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
## Labels and Annotations
|
|
187
|
-
|
|
188
|
-
Apply consistent labels to all resources:
|
|
189
|
-
```yaml
|
|
190
|
-
metadata:
|
|
191
|
-
labels:
|
|
192
|
-
app.kubernetes.io/name: my-app
|
|
193
|
-
app.kubernetes.io/version: "1.0.0"
|
|
194
|
-
app.kubernetes.io/component: backend
|
|
195
|
-
app.kubernetes.io/managed-by: helm
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
## Best Practices
|
|
199
|
-
|
|
200
|
-
- Use `RollingUpdate` strategy with `maxUnavailable: 0` for zero-downtime deploys
|
|
201
|
-
- Set `PodDisruptionBudget` for high-availability workloads
|
|
202
|
-
- Use `HorizontalPodAutoscaler` for auto-scaling
|
|
203
|
-
- Pin container image tags (never use `latest`)
|
|
204
|
-
- Use `NetworkPolicy` to restrict pod-to-pod communication
|
|
205
|
-
- Store configuration in `ConfigMap`, secrets in `Secret`
|
|
206
|
-
- Use `topologySpreadConstraints` for multi-zone distribution
|
|
207
|
-
|
|
208
|
-
<!-- KUBERNETES:END -->
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
<!-- MARIADB:START -->
|
|
2
|
-
# MariaDB Database Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Use MariaDB for MySQL-compatible relational database with enhanced features, performance improvements, and open-source licensing.
|
|
5
|
-
|
|
6
|
-
## Core Features
|
|
7
|
-
|
|
8
|
-
### Connection
|
|
9
|
-
```typescript
|
|
10
|
-
// Using mysql2 (compatible with MySQL)
|
|
11
|
-
import mysql from 'mysql2/promise'
|
|
12
|
-
|
|
13
|
-
const pool = mysql.createPool({
|
|
14
|
-
host: process.env.DB_HOST || 'localhost',
|
|
15
|
-
port: parseInt(process.env.DB_PORT || '3306'),
|
|
16
|
-
database: process.env.DB_NAME || 'myapp',
|
|
17
|
-
user: process.env.DB_USER,
|
|
18
|
-
password: process.env.DB_PASSWORD,
|
|
19
|
-
waitForConnections: true,
|
|
20
|
-
connectionLimit: 10,
|
|
21
|
-
queueLimit: 0,
|
|
22
|
-
enableKeepAlive: true,
|
|
23
|
-
keepAliveInitialDelay: 0,
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
// Using Prisma
|
|
27
|
-
import { PrismaClient } from '@prisma/client'
|
|
28
|
-
const prisma = new PrismaClient()
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### Basic Queries
|
|
32
|
-
```typescript
|
|
33
|
-
// SELECT
|
|
34
|
-
const [rows] = await pool.execute('SELECT * FROM users WHERE id = ?', [userId])
|
|
35
|
-
const users = rows as User[]
|
|
36
|
-
|
|
37
|
-
// INSERT
|
|
38
|
-
const [result] = await pool.execute(
|
|
39
|
-
'INSERT INTO users (name, email) VALUES (?, ?)',
|
|
40
|
-
['John Doe', 'john@example.com']
|
|
41
|
-
)
|
|
42
|
-
const insertId = (result as any).insertId
|
|
43
|
-
|
|
44
|
-
// UPDATE
|
|
45
|
-
const [result] = await pool.execute(
|
|
46
|
-
'UPDATE users SET name = ? WHERE id = ?',
|
|
47
|
-
['Jane Doe', userId]
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
// DELETE
|
|
51
|
-
await pool.execute('DELETE FROM users WHERE id = ?', [userId])
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Advanced Features
|
|
55
|
-
```typescript
|
|
56
|
-
// JSON operations (MariaDB 10.2.7+)
|
|
57
|
-
const [rows] = await pool.execute(
|
|
58
|
-
"SELECT * FROM products WHERE JSON_EXTRACT(metadata, '$.category') = ?",
|
|
59
|
-
['electronics']
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
// Window functions (MariaDB 10.2+)
|
|
63
|
-
const [rows] = await pool.execute(`
|
|
64
|
-
SELECT
|
|
65
|
-
name,
|
|
66
|
-
salary,
|
|
67
|
-
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) as rank
|
|
68
|
-
FROM employees
|
|
69
|
-
`)
|
|
70
|
-
|
|
71
|
-
// Common Table Expressions (CTE) (MariaDB 10.2+)
|
|
72
|
-
const [rows] = await pool.execute(`
|
|
73
|
-
WITH RECURSIVE cte AS (
|
|
74
|
-
SELECT id, name, parent_id FROM categories WHERE parent_id IS NULL
|
|
75
|
-
UNION ALL
|
|
76
|
-
SELECT c.id, c.name, c.parent_id FROM categories c
|
|
77
|
-
INNER JOIN cte ON c.parent_id = cte.id
|
|
78
|
-
)
|
|
79
|
-
SELECT * FROM cte
|
|
80
|
-
`)
|
|
81
|
-
|
|
82
|
-
// Sequences (MariaDB 10.3+)
|
|
83
|
-
await pool.execute('CREATE SEQUENCE user_id_seq START WITH 1 INCREMENT BY 1')
|
|
84
|
-
const [result] = await pool.execute('SELECT NEXT VALUE FOR user_id_seq')
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Common Patterns
|
|
88
|
-
|
|
89
|
-
### Connection Pooling
|
|
90
|
-
```typescript
|
|
91
|
-
let pool: mysql.Pool | null = null
|
|
92
|
-
|
|
93
|
-
export function getPool(): mysql.Pool {
|
|
94
|
-
if (!pool) {
|
|
95
|
-
pool = mysql.createPool({
|
|
96
|
-
// ... config
|
|
97
|
-
})
|
|
98
|
-
}
|
|
99
|
-
return pool
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Graceful shutdown
|
|
103
|
-
process.on('SIGINT', async () => {
|
|
104
|
-
if (pool) {
|
|
105
|
-
await pool.end()
|
|
106
|
-
}
|
|
107
|
-
process.exit(0)
|
|
108
|
-
})
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Error Handling
|
|
112
|
-
```typescript
|
|
113
|
-
try {
|
|
114
|
-
const [rows] = await pool.execute('SELECT * FROM users WHERE id = ?', [userId])
|
|
115
|
-
if ((rows as any[]).length === 0) {
|
|
116
|
-
throw new Error('User not found')
|
|
117
|
-
}
|
|
118
|
-
return rows[0]
|
|
119
|
-
} catch (error: any) {
|
|
120
|
-
if (error.code === 'ER_DUP_ENTRY') {
|
|
121
|
-
throw new Error('Duplicate entry')
|
|
122
|
-
}
|
|
123
|
-
throw error
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Best Practices
|
|
128
|
-
|
|
129
|
-
✅ **DO:**
|
|
130
|
-
- Use connection pooling (10-20 connections)
|
|
131
|
-
- Always use parameterized queries (?)
|
|
132
|
-
- Use transactions for multi-step operations
|
|
133
|
-
- Create indexes on frequently queried columns
|
|
134
|
-
- Use InnoDB engine (ACID compliance)
|
|
135
|
-
- Set appropriate charset (utf8mb4)
|
|
136
|
-
- Monitor slow query log
|
|
137
|
-
- Use prepared statements
|
|
138
|
-
|
|
139
|
-
❌ **DON'T:**
|
|
140
|
-
- Use string concatenation for queries
|
|
141
|
-
- Create too many connections
|
|
142
|
-
- Skip error handling
|
|
143
|
-
- Use MyISAM engine
|
|
144
|
-
- Hardcode connection strings
|
|
145
|
-
- Ignore query performance
|
|
146
|
-
|
|
147
|
-
## Configuration
|
|
148
|
-
|
|
149
|
-
### Environment Variables
|
|
150
|
-
```bash
|
|
151
|
-
DB_HOST=localhost
|
|
152
|
-
DB_PORT=3306
|
|
153
|
-
DB_NAME=myapp
|
|
154
|
-
DB_USER=myuser
|
|
155
|
-
DB_PASSWORD=securepassword
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### Docker Compose
|
|
159
|
-
```yaml
|
|
160
|
-
services:
|
|
161
|
-
mariadb:
|
|
162
|
-
image: mariadb:11
|
|
163
|
-
environment:
|
|
164
|
-
MYSQL_DATABASE: myapp
|
|
165
|
-
MYSQL_USER: myuser
|
|
166
|
-
MYSQL_PASSWORD: securepassword
|
|
167
|
-
MYSQL_ROOT_PASSWORD: rootpassword
|
|
168
|
-
ports:
|
|
169
|
-
- "3306:3306"
|
|
170
|
-
volumes:
|
|
171
|
-
- mariadb_data:/var/lib/mysql
|
|
172
|
-
healthcheck:
|
|
173
|
-
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
|
174
|
-
interval: 10s
|
|
175
|
-
timeout: 5s
|
|
176
|
-
retries: 5
|
|
177
|
-
|
|
178
|
-
volumes:
|
|
179
|
-
mariadb_data:
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
<!-- MARIADB:END -->
|
|
183
|
-
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
<!-- MEMCACHED:START -->
|
|
2
|
-
# Memcached Cache Instructions
|
|
3
|
-
|
|
4
|
-
**CRITICAL**: Use Memcached for simple, high-performance distributed caching with minimal overhead.
|
|
5
|
-
|
|
6
|
-
## Core Features
|
|
7
|
-
|
|
8
|
-
### Connection
|
|
9
|
-
```typescript
|
|
10
|
-
// Using memcached (Node.js)
|
|
11
|
-
import Memcached from 'memcached'
|
|
12
|
-
|
|
13
|
-
const memcached = new Memcached(process.env.MEMCACHED_SERVERS || 'localhost:11211', {
|
|
14
|
-
maxKeySize: 250,
|
|
15
|
-
maxExpiration: 2592000, // 30 days
|
|
16
|
-
maxValue: 1048576, // 1MB
|
|
17
|
-
poolSize: 10,
|
|
18
|
-
reconnect: true,
|
|
19
|
-
timeout: 5000,
|
|
20
|
-
retries: 3,
|
|
21
|
-
retry: 1000,
|
|
22
|
-
remove: true,
|
|
23
|
-
idle: 5000,
|
|
24
|
-
})
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### Basic Operations
|
|
28
|
-
```typescript
|
|
29
|
-
// Set
|
|
30
|
-
memcached.set('user:1', { name: 'John', email: 'john@example.com' }, 3600, (err) => {
|
|
31
|
-
// Expires in 1 hour
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
// Get
|
|
35
|
-
memcached.get('user:1', (err, data) => {
|
|
36
|
-
console.log(data)
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
// Delete
|
|
40
|
-
memcached.del('user:1', (err) => {
|
|
41
|
-
// Deleted
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
// Replace (only if key exists)
|
|
45
|
-
memcached.replace('user:1', newData, 3600, (err) => {
|
|
46
|
-
// Replaced
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
// Add (only if key doesn't exist)
|
|
50
|
-
memcached.add('user:1', data, 3600, (err) => {
|
|
51
|
-
// Added
|
|
52
|
-
})
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Advanced Operations
|
|
56
|
-
```typescript
|
|
57
|
-
// Multiple gets
|
|
58
|
-
memcached.getMulti(['user:1', 'user:2', 'user:3'], (err, data) => {
|
|
59
|
-
// Returns object with keys as properties
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
// Increment/Decrement
|
|
63
|
-
memcached.incr('counter', 1, (err, value) => {
|
|
64
|
-
// Incremented
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
memcached.decr('counter', 1, (err, value) => {
|
|
68
|
-
// Decremented
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
// Touch (update expiration)
|
|
72
|
-
memcached.touch('user:1', 7200, (err) => {
|
|
73
|
-
// Expiration updated to 2 hours
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
// Stats
|
|
77
|
-
memcached.stats((err, stats) => {
|
|
78
|
-
console.log(stats)
|
|
79
|
-
})
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Common Patterns
|
|
83
|
-
|
|
84
|
-
### Caching with Promises
|
|
85
|
-
```typescript
|
|
86
|
-
function getCached(key: string): Promise<any> {
|
|
87
|
-
return new Promise((resolve, reject) => {
|
|
88
|
-
memcached.get(key, (err, data) => {
|
|
89
|
-
if (err) reject(err)
|
|
90
|
-
else resolve(data)
|
|
91
|
-
})
|
|
92
|
-
})
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function setCached(key: string, value: any, ttl: number): Promise<void> {
|
|
96
|
-
return new Promise((resolve, reject) => {
|
|
97
|
-
memcached.set(key, value, ttl, (err) => {
|
|
98
|
-
if (err) reject(err)
|
|
99
|
-
else resolve()
|
|
100
|
-
})
|
|
101
|
-
})
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Usage
|
|
105
|
-
async function getCachedUser(userId: string) {
|
|
106
|
-
const cached = await getCached(`user:${userId}`)
|
|
107
|
-
if (cached) {
|
|
108
|
-
return cached
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const user = await fetchUserFromDatabase(userId)
|
|
112
|
-
await setCached(`user:${userId}`, user, 3600)
|
|
113
|
-
return user
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### Cache-Aside Pattern
|
|
118
|
-
```typescript
|
|
119
|
-
async function getWithCache(key: string, fetchFn: () => Promise<any>, ttl: number) {
|
|
120
|
-
try {
|
|
121
|
-
const cached = await getCached(key)
|
|
122
|
-
if (cached) {
|
|
123
|
-
return cached
|
|
124
|
-
}
|
|
125
|
-
} catch (err) {
|
|
126
|
-
// Cache miss or error, continue to fetch
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const data = await fetchFn()
|
|
130
|
-
try {
|
|
131
|
-
await setCached(key, data, ttl)
|
|
132
|
-
} catch (err) {
|
|
133
|
-
// Cache set failed, but we have the data
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return data
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Rate Limiting
|
|
141
|
-
```typescript
|
|
142
|
-
async function checkRateLimit(identifier: string, limit: number, window: number): Promise<boolean> {
|
|
143
|
-
const key = `ratelimit:${identifier}`
|
|
144
|
-
|
|
145
|
-
return new Promise((resolve) => {
|
|
146
|
-
memcached.incr(key, 1, (err, value) => {
|
|
147
|
-
if (err || value === false) {
|
|
148
|
-
// Key doesn't exist, create it
|
|
149
|
-
memcached.set(key, 1, window, () => {
|
|
150
|
-
resolve(true)
|
|
151
|
-
})
|
|
152
|
-
} else if (value > limit) {
|
|
153
|
-
resolve(false)
|
|
154
|
-
} else {
|
|
155
|
-
if (value === 1) {
|
|
156
|
-
// First increment, set expiration
|
|
157
|
-
memcached.touch(key, window, () => {})
|
|
158
|
-
}
|
|
159
|
-
resolve(true)
|
|
160
|
-
}
|
|
161
|
-
})
|
|
162
|
-
})
|
|
163
|
-
}
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
## Best Practices
|
|
167
|
-
|
|
168
|
-
✅ **DO:**
|
|
169
|
-
- Use connection pooling
|
|
170
|
-
- Set appropriate TTL for cached data
|
|
171
|
-
- Handle cache misses gracefully
|
|
172
|
-
- Use consistent key naming conventions
|
|
173
|
-
- Monitor cache hit rates
|
|
174
|
-
- Use multiple servers for redundancy
|
|
175
|
-
- Compress large values before storing
|
|
176
|
-
- Implement cache warming strategies
|
|
177
|
-
- Use appropriate data serialization
|
|
178
|
-
- Monitor memory usage
|
|
179
|
-
|
|
180
|
-
❌ **DON'T:**
|
|
181
|
-
- Store large values (> 1MB, use external storage)
|
|
182
|
-
- Use Memcached as primary database
|
|
183
|
-
- Store sensitive data without encryption
|
|
184
|
-
- Skip error handling
|
|
185
|
-
- Ignore connection failures
|
|
186
|
-
- Hardcode server addresses
|
|
187
|
-
- Use blocking operations
|
|
188
|
-
- Store complex nested objects (flatten when possible)
|
|
189
|
-
- Ignore eviction policies
|
|
190
|
-
- Skip monitoring
|
|
191
|
-
|
|
192
|
-
## Configuration
|
|
193
|
-
|
|
194
|
-
### Environment Variables
|
|
195
|
-
```bash
|
|
196
|
-
MEMCACHED_SERVERS=localhost:11211
|
|
197
|
-
MEMCACHED_SERVERS=server1:11211,server2:11211,server3:11211
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### Docker Compose
|
|
201
|
-
```yaml
|
|
202
|
-
services:
|
|
203
|
-
memcached:
|
|
204
|
-
image: memcached:1.6-alpine
|
|
205
|
-
ports:
|
|
206
|
-
- "11211:11211"
|
|
207
|
-
command: ["-m", "64", "-I", "1m"] # 64MB memory, 1MB max item size
|
|
208
|
-
healthcheck:
|
|
209
|
-
test: ["CMD", "nc", "-z", "localhost", "11211"]
|
|
210
|
-
interval: 10s
|
|
211
|
-
timeout: 5s
|
|
212
|
-
retries: 5
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
## Integration with Development
|
|
216
|
-
|
|
217
|
-
### Testing
|
|
218
|
-
```typescript
|
|
219
|
-
// Use test Memcached instance
|
|
220
|
-
const testMemcached = new Memcached('localhost:11212') // Different port
|
|
221
|
-
|
|
222
|
-
// Clean up after tests
|
|
223
|
-
afterEach((done) => {
|
|
224
|
-
testMemcached.flush((err) => {
|
|
225
|
-
done()
|
|
226
|
-
})
|
|
227
|
-
})
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
### Health Checks
|
|
231
|
-
```typescript
|
|
232
|
-
function checkMemcachedHealth(): Promise<boolean> {
|
|
233
|
-
return new Promise((resolve) => {
|
|
234
|
-
memcached.stats((err) => {
|
|
235
|
-
resolve(!err)
|
|
236
|
-
})
|
|
237
|
-
})
|
|
238
|
-
}
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
<!-- MEMCACHED:END -->
|
|
242
|
-
|