container-superposition 0.1.1
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/README.md +843 -0
- package/dist/scripts/init.d.ts +3 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +1190 -0
- package/dist/scripts/init.js.map +1 -0
- package/dist/scripts/migrate-to-manifests.d.ts +12 -0
- package/dist/scripts/migrate-to-manifests.d.ts.map +1 -0
- package/dist/scripts/migrate-to-manifests.js +230 -0
- package/dist/scripts/migrate-to-manifests.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +6 -0
- package/dist/tool/questionnaire/composer.d.ts.map +1 -0
- package/dist/tool/questionnaire/composer.js +1232 -0
- package/dist/tool/questionnaire/composer.js.map +1 -0
- package/dist/tool/readme/markdown-parser.d.ts +30 -0
- package/dist/tool/readme/markdown-parser.d.ts.map +1 -0
- package/dist/tool/readme/markdown-parser.js +139 -0
- package/dist/tool/readme/markdown-parser.js.map +1 -0
- package/dist/tool/readme/readme-generator.d.ts +9 -0
- package/dist/tool/readme/readme-generator.d.ts.map +1 -0
- package/dist/tool/readme/readme-generator.js +422 -0
- package/dist/tool/readme/readme-generator.js.map +1 -0
- package/dist/tool/schema/custom-loader.d.ts +17 -0
- package/dist/tool/schema/custom-loader.d.ts.map +1 -0
- package/dist/tool/schema/custom-loader.js +149 -0
- package/dist/tool/schema/custom-loader.js.map +1 -0
- package/dist/tool/schema/overlay-loader.d.ts +47 -0
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -0
- package/dist/tool/schema/overlay-loader.js +252 -0
- package/dist/tool/schema/overlay-loader.js.map +1 -0
- package/dist/tool/schema/types.d.ts +212 -0
- package/dist/tool/schema/types.d.ts.map +1 -0
- package/dist/tool/schema/types.js +5 -0
- package/dist/tool/schema/types.js.map +1 -0
- package/docs/README.md +308 -0
- package/docs/architecture.md +233 -0
- package/docs/creating-overlays.md +549 -0
- package/docs/custom-patches.md +540 -0
- package/docs/dependencies.md +279 -0
- package/docs/examples/custom-patches-example.md +85 -0
- package/docs/examples.md +576 -0
- package/docs/messaging-comparison.md +265 -0
- package/docs/messaging-quick-start.md +385 -0
- package/docs/observability-workflow.md +537 -0
- package/docs/overlay-manifest-refactoring.md +214 -0
- package/docs/overlay-metadata-archive.md +54 -0
- package/docs/overlays.md +523 -0
- package/docs/presets-architecture.md +498 -0
- package/docs/presets.md +366 -0
- package/docs/publishing.md +476 -0
- package/docs/quick-reference.md +326 -0
- package/docs/ux.md +170 -0
- package/features/README.md +85 -0
- package/features/cross-distro-packages/README.md +146 -0
- package/features/cross-distro-packages/devcontainer-feature.json +20 -0
- package/features/cross-distro-packages/install.sh +58 -0
- package/features/local-secrets-manager/devcontainer-feature.json +18 -0
- package/features/local-secrets-manager/install.sh +127 -0
- package/features/project-scaffolder/devcontainer-feature.json +24 -0
- package/features/project-scaffolder/install.sh +100 -0
- package/features/team-conventions/devcontainer-feature.json +24 -0
- package/features/team-conventions/install.sh +93 -0
- package/overlays/.registry/README.md +14 -0
- package/overlays/.registry/base-images.yml +26 -0
- package/overlays/.registry/base-templates.yml +7 -0
- package/overlays/README.md +155 -0
- package/overlays/alertmanager/.env.example +5 -0
- package/overlays/alertmanager/README.md +465 -0
- package/overlays/alertmanager/alert-rules.yml +56 -0
- package/overlays/alertmanager/alertmanager.yml +42 -0
- package/overlays/alertmanager/devcontainer.patch.json +12 -0
- package/overlays/alertmanager/docker-compose.yml +20 -0
- package/overlays/alertmanager/overlay.yml +17 -0
- package/overlays/alertmanager/setup.sh +53 -0
- package/overlays/alertmanager/verify.sh +31 -0
- package/overlays/aws-cli/README.md +473 -0
- package/overlays/aws-cli/devcontainer.patch.json +13 -0
- package/overlays/aws-cli/overlay.yml +13 -0
- package/overlays/azure-cli/README.md +551 -0
- package/overlays/azure-cli/devcontainer.patch.json +8 -0
- package/overlays/azure-cli/overlay.yml +13 -0
- package/overlays/bun/README.md +312 -0
- package/overlays/bun/devcontainer.patch.json +41 -0
- package/overlays/bun/overlay.yml +16 -0
- package/overlays/bun/setup.sh +79 -0
- package/overlays/bun/verify.sh +30 -0
- package/overlays/codex/README.md +128 -0
- package/overlays/codex/devcontainer.patch.json +3 -0
- package/overlays/codex/overlay.yml +14 -0
- package/overlays/codex/setup.sh +24 -0
- package/overlays/codex/verify.sh +30 -0
- package/overlays/commitlint/README.md +333 -0
- package/overlays/commitlint/devcontainer.patch.json +8 -0
- package/overlays/commitlint/overlay.yml +16 -0
- package/overlays/commitlint/setup.sh +234 -0
- package/overlays/direnv/README.md +504 -0
- package/overlays/direnv/devcontainer.patch.json +6 -0
- package/overlays/direnv/overlay.yml +13 -0
- package/overlays/direnv/setup.sh +139 -0
- package/overlays/docker-in-docker/README.md +534 -0
- package/overlays/docker-in-docker/devcontainer.patch.json +10 -0
- package/overlays/docker-in-docker/overlay.yml +13 -0
- package/overlays/docker-sock/README.md +256 -0
- package/overlays/docker-sock/devcontainer.patch.json +9 -0
- package/overlays/docker-sock/docker-compose.yml +8 -0
- package/overlays/docker-sock/overlay.yml +13 -0
- package/overlays/dotnet/README.md +147 -0
- package/overlays/dotnet/devcontainer.patch.json +51 -0
- package/overlays/dotnet/global-tools.txt +24 -0
- package/overlays/dotnet/overlay.yml +13 -0
- package/overlays/dotnet/setup.sh +51 -0
- package/overlays/dotnet/verify.sh +26 -0
- package/overlays/gcloud/README.md +269 -0
- package/overlays/gcloud/devcontainer.patch.json +14 -0
- package/overlays/gcloud/overlay.yml +14 -0
- package/overlays/gcloud/verify.sh +52 -0
- package/overlays/git-helpers/README.md +168 -0
- package/overlays/git-helpers/devcontainer.patch.json +33 -0
- package/overlays/git-helpers/overlay.yml +15 -0
- package/overlays/git-helpers/setup.sh +91 -0
- package/overlays/go/README.md +293 -0
- package/overlays/go/devcontainer.patch.json +43 -0
- package/overlays/go/overlay.yml +15 -0
- package/overlays/go/setup.sh +33 -0
- package/overlays/go/verify.sh +40 -0
- package/overlays/grafana/.env.example +9 -0
- package/overlays/grafana/README.md +462 -0
- package/overlays/grafana/dashboard-provider.yml +11 -0
- package/overlays/grafana/dashboards/observability-overview.json +263 -0
- package/overlays/grafana/devcontainer.patch.json +12 -0
- package/overlays/grafana/docker-compose.yml +27 -0
- package/overlays/grafana/grafana-datasources.yml +57 -0
- package/overlays/grafana/overlay.yml +21 -0
- package/overlays/grafana/verify.sh +34 -0
- package/overlays/jaeger/.env.example +7 -0
- package/overlays/jaeger/README.md +867 -0
- package/overlays/jaeger/devcontainer.patch.json +12 -0
- package/overlays/jaeger/docker-compose.yml +17 -0
- package/overlays/jaeger/overlay.yml +19 -0
- package/overlays/java/README.md +267 -0
- package/overlays/java/devcontainer.patch.json +44 -0
- package/overlays/java/overlay.yml +16 -0
- package/overlays/java/setup.sh +41 -0
- package/overlays/java/verify.sh +42 -0
- package/overlays/just/README.md +443 -0
- package/overlays/just/devcontainer.patch.json +3 -0
- package/overlays/just/overlay.yml +13 -0
- package/overlays/just/setup.sh +182 -0
- package/overlays/kubectl-helm/README.md +660 -0
- package/overlays/kubectl-helm/devcontainer.patch.json +10 -0
- package/overlays/kubectl-helm/overlay.yml +13 -0
- package/overlays/loki/.env.example +5 -0
- package/overlays/loki/README.md +1156 -0
- package/overlays/loki/devcontainer.patch.json +12 -0
- package/overlays/loki/docker-compose.yml +18 -0
- package/overlays/loki/loki-config.yaml +45 -0
- package/overlays/loki/overlay.yml +17 -0
- package/overlays/minio/.env.example +9 -0
- package/overlays/minio/README.md +639 -0
- package/overlays/minio/devcontainer.patch.json +30 -0
- package/overlays/minio/docker-compose.yml +28 -0
- package/overlays/minio/overlay.yml +18 -0
- package/overlays/minio/setup.sh +61 -0
- package/overlays/minio/verify.sh +64 -0
- package/overlays/mkdocs/README.md +309 -0
- package/overlays/mkdocs/devcontainer.patch.json +24 -0
- package/overlays/mkdocs/overlay.yml +15 -0
- package/overlays/modern-cli-tools/README.md +556 -0
- package/overlays/modern-cli-tools/devcontainer.patch.json +3 -0
- package/overlays/modern-cli-tools/overlay.yml +13 -0
- package/overlays/modern-cli-tools/setup.sh +153 -0
- package/overlays/mongodb/.env.example +9 -0
- package/overlays/mongodb/README.md +481 -0
- package/overlays/mongodb/devcontainer.patch.json +32 -0
- package/overlays/mongodb/docker-compose.yml +44 -0
- package/overlays/mongodb/overlay.yml +17 -0
- package/overlays/mongodb/verify.sh +48 -0
- package/overlays/mysql/.env.example +11 -0
- package/overlays/mysql/README.md +542 -0
- package/overlays/mysql/devcontainer.patch.json +34 -0
- package/overlays/mysql/docker-compose.yml +55 -0
- package/overlays/mysql/overlay.yml +16 -0
- package/overlays/mysql/verify.sh +48 -0
- package/overlays/nats/.env.example +5 -0
- package/overlays/nats/README.md +762 -0
- package/overlays/nats/devcontainer.patch.json +24 -0
- package/overlays/nats/docker-compose.yml +31 -0
- package/overlays/nats/overlay.yml +18 -0
- package/overlays/nats/verify.sh +50 -0
- package/overlays/ngrok/README.md +503 -0
- package/overlays/ngrok/devcontainer.patch.json +3 -0
- package/overlays/ngrok/overlay.yml +14 -0
- package/overlays/ngrok/setup.sh +125 -0
- package/overlays/nodejs/README.md +192 -0
- package/overlays/nodejs/devcontainer.patch.json +49 -0
- package/overlays/nodejs/global-packages.txt +16 -0
- package/overlays/nodejs/overlay.yml +14 -0
- package/overlays/nodejs/setup.sh +46 -0
- package/overlays/nodejs/verify.sh +32 -0
- package/overlays/otel-collector/.env.example +9 -0
- package/overlays/otel-collector/README.md +1257 -0
- package/overlays/otel-collector/devcontainer.patch.json +28 -0
- package/overlays/otel-collector/docker-compose.yml +22 -0
- package/overlays/otel-collector/otel-collector-config.yaml +68 -0
- package/overlays/otel-collector/overlay.yml +21 -0
- package/overlays/otel-collector/setup.sh +49 -0
- package/overlays/otel-demo-nodejs/.env.example +2 -0
- package/overlays/otel-demo-nodejs/Dockerfile-otel-demo-nodejs +17 -0
- package/overlays/otel-demo-nodejs/README.md +409 -0
- package/overlays/otel-demo-nodejs/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-nodejs/docker-compose.yml +19 -0
- package/overlays/otel-demo-nodejs/overlay.yml +23 -0
- package/overlays/otel-demo-nodejs/package-otel-demo-nodejs.json +20 -0
- package/overlays/otel-demo-nodejs/server-otel-demo-nodejs.js +259 -0
- package/overlays/otel-demo-nodejs/tracing-otel-demo-nodejs.js +57 -0
- package/overlays/otel-demo-nodejs/verify.sh +31 -0
- package/overlays/otel-demo-python/.env.example +2 -0
- package/overlays/otel-demo-python/Dockerfile-otel-demo-python +16 -0
- package/overlays/otel-demo-python/README.md +82 -0
- package/overlays/otel-demo-python/app-otel-demo-python.py +208 -0
- package/overlays/otel-demo-python/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-python/docker-compose.yml +19 -0
- package/overlays/otel-demo-python/overlay.yml +23 -0
- package/overlays/otel-demo-python/requirements-otel-demo-python.txt +4 -0
- package/overlays/otel-demo-python/verify.sh +31 -0
- package/overlays/playwright/README.md +629 -0
- package/overlays/playwright/devcontainer.patch.json +9 -0
- package/overlays/playwright/overlay.yml +13 -0
- package/overlays/postgres/.env.example +6 -0
- package/overlays/postgres/README.md +602 -0
- package/overlays/postgres/devcontainer.patch.json +21 -0
- package/overlays/postgres/docker-compose.yml +22 -0
- package/overlays/postgres/overlay.yml +15 -0
- package/overlays/postgres/verify.sh +45 -0
- package/overlays/powershell/README.md +314 -0
- package/overlays/powershell/devcontainer.patch.json +22 -0
- package/overlays/powershell/overlay.yml +13 -0
- package/overlays/powershell/setup.sh +29 -0
- package/overlays/powershell/verify.sh +38 -0
- package/overlays/pre-commit/README.md +263 -0
- package/overlays/pre-commit/devcontainer.patch.json +9 -0
- package/overlays/pre-commit/overlay.yml +16 -0
- package/overlays/pre-commit/setup.sh +129 -0
- package/overlays/presets/docs-site.yml +118 -0
- package/overlays/presets/fullstack.yml +181 -0
- package/overlays/presets/microservice.yml +118 -0
- package/overlays/presets/web-api.yml +109 -0
- package/overlays/prometheus/.env.example +5 -0
- package/overlays/prometheus/README.md +1246 -0
- package/overlays/prometheus/devcontainer.patch.json +12 -0
- package/overlays/prometheus/docker-compose.yml +22 -0
- package/overlays/prometheus/overlay.yml +17 -0
- package/overlays/prometheus/prometheus.yml +12 -0
- package/overlays/prometheus/verify.sh +34 -0
- package/overlays/promtail/.env.example +2 -0
- package/overlays/promtail/README.md +357 -0
- package/overlays/promtail/devcontainer.patch.json +5 -0
- package/overlays/promtail/docker-compose.yml +16 -0
- package/overlays/promtail/overlay.yml +17 -0
- package/overlays/promtail/promtail-config.yaml +60 -0
- package/overlays/promtail/verify.sh +31 -0
- package/overlays/pulumi/README.md +472 -0
- package/overlays/pulumi/devcontainer.patch.json +13 -0
- package/overlays/pulumi/overlay.yml +14 -0
- package/overlays/pulumi/verify.sh +31 -0
- package/overlays/python/README.md +919 -0
- package/overlays/python/devcontainer.patch.json +41 -0
- package/overlays/python/overlay.yml +12 -0
- package/overlays/python/requirements-overlay.txt +13 -0
- package/overlays/python/setup.sh +47 -0
- package/overlays/python/verify.sh +32 -0
- package/overlays/rabbitmq/.env.example +7 -0
- package/overlays/rabbitmq/README.md +680 -0
- package/overlays/rabbitmq/devcontainer.patch.json +28 -0
- package/overlays/rabbitmq/docker-compose.yml +30 -0
- package/overlays/rabbitmq/overlay.yml +18 -0
- package/overlays/rabbitmq/verify.sh +41 -0
- package/overlays/redis/.env.example +4 -0
- package/overlays/redis/README.md +776 -0
- package/overlays/redis/devcontainer.patch.json +21 -0
- package/overlays/redis/docker-compose.yml +21 -0
- package/overlays/redis/overlay.yml +15 -0
- package/overlays/redis/verify.sh +41 -0
- package/overlays/redpanda/.env.example +10 -0
- package/overlays/redpanda/README.md +703 -0
- package/overlays/redpanda/devcontainer.patch.json +37 -0
- package/overlays/redpanda/docker-compose.yml +67 -0
- package/overlays/redpanda/overlay.yml +21 -0
- package/overlays/redpanda/verify.sh +48 -0
- package/overlays/rust/README.md +299 -0
- package/overlays/rust/devcontainer.patch.json +39 -0
- package/overlays/rust/overlay.yml +15 -0
- package/overlays/rust/setup.sh +36 -0
- package/overlays/rust/verify.sh +51 -0
- package/overlays/sqlite/README.md +584 -0
- package/overlays/sqlite/devcontainer.patch.json +14 -0
- package/overlays/sqlite/overlay.yml +15 -0
- package/overlays/sqlite/setup.sh +27 -0
- package/overlays/sqlite/verify.sh +43 -0
- package/overlays/sqlserver/.env.example +6 -0
- package/overlays/sqlserver/README.md +592 -0
- package/overlays/sqlserver/devcontainer.patch.json +22 -0
- package/overlays/sqlserver/docker-compose.yml +32 -0
- package/overlays/sqlserver/overlay.yml +17 -0
- package/overlays/sqlserver/verify.sh +30 -0
- package/overlays/tempo/.env.example +5 -0
- package/overlays/tempo/README.md +273 -0
- package/overlays/tempo/devcontainer.patch.json +12 -0
- package/overlays/tempo/docker-compose.yml +20 -0
- package/overlays/tempo/overlay.yml +20 -0
- package/overlays/tempo/tempo-config.yaml +32 -0
- package/overlays/tempo/verify.sh +31 -0
- package/overlays/terraform/README.md +389 -0
- package/overlays/terraform/devcontainer.patch.json +15 -0
- package/overlays/terraform/overlay.yml +14 -0
- package/overlays/terraform/verify.sh +63 -0
- package/package.json +74 -0
- package/templates/README.md +285 -0
- package/templates/compose/.devcontainer/devcontainer.json +46 -0
- package/templates/compose/.devcontainer/docker-compose.yml +12 -0
- package/templates/compose/README.md +20 -0
- package/templates/plain/.devcontainer/devcontainer.json +35 -0
- package/templates/plain/README.md +21 -0
- package/tool/README.md +281 -0
- package/tool/schema/base-images.schema.json +43 -0
- package/tool/schema/base-templates.schema.json +34 -0
- package/tool/schema/config.schema.json +71 -0
- package/tool/schema/overlay-manifest.schema.json +86 -0
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
# direnv Overlay
|
|
2
|
+
|
|
3
|
+
Automatic environment variable management for project-specific configurations.
|
|
4
|
+
|
|
5
|
+
**⚠️ Security Note:** The sample `.envrc` file is automatically allowed during setup for convenience in the devcontainer environment. `.envrc` files can execute arbitrary code, so always review the contents before using in production or with untrusted repositories. Run `direnv deny` to disable if needed.
|
|
6
|
+
|
|
7
|
+
## What's Included
|
|
8
|
+
|
|
9
|
+
- **direnv** - Per-directory environment variable loader
|
|
10
|
+
- **Shell integration** - Auto-hook for bash/zsh
|
|
11
|
+
- **Sample .envrc** - Ready-to-use configuration
|
|
12
|
+
- **Sample .env.example** - Environment variable template
|
|
13
|
+
|
|
14
|
+
## What is direnv?
|
|
15
|
+
|
|
16
|
+
direnv automatically loads/unloads environment variables when you enter/leave a directory. Perfect for:
|
|
17
|
+
|
|
18
|
+
- Project-specific configurations
|
|
19
|
+
- API keys and secrets
|
|
20
|
+
- Database URLs
|
|
21
|
+
- Feature flags
|
|
22
|
+
- Development vs. production settings
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
1. **Edit .envrc** in your project root:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
export DATABASE_URL="postgresql://localhost:5432/mydb"
|
|
30
|
+
export API_KEY="dev-key-123"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
2. **Allow the configuration**:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
direnv allow
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
3. **Variables are automatically loaded** when you `cd` into the directory:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
cd /workspace
|
|
43
|
+
# direnv: loading .envrc
|
|
44
|
+
# ✓ Environment loaded
|
|
45
|
+
|
|
46
|
+
echo $DATABASE_URL
|
|
47
|
+
# postgresql://localhost:5432/mydb
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
4. **Variables are unloaded** when you leave:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
cd /tmp
|
|
54
|
+
# direnv: unloading
|
|
55
|
+
|
|
56
|
+
echo $DATABASE_URL
|
|
57
|
+
# (empty)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## .envrc Syntax
|
|
61
|
+
|
|
62
|
+
### Basic Variables
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
export PROJECT_NAME="my-project"
|
|
66
|
+
export NODE_ENV="development"
|
|
67
|
+
export DEBUG="true"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Load .env File
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# Load .env if it exists
|
|
74
|
+
dotenv_if_exists .env
|
|
75
|
+
|
|
76
|
+
# Load multiple files
|
|
77
|
+
dotenv_if_exists .env
|
|
78
|
+
dotenv_if_exists .env.local
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Modify PATH
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# Add directories to PATH
|
|
85
|
+
PATH_add ./bin
|
|
86
|
+
PATH_add ./node_modules/.bin
|
|
87
|
+
PATH_add /usr/local/custom/bin
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Conditional Logic
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# Environment-specific variables
|
|
94
|
+
if [ "$USER" = "alice" ]; then
|
|
95
|
+
export LOG_LEVEL="debug"
|
|
96
|
+
else
|
|
97
|
+
export LOG_LEVEL="info"
|
|
98
|
+
fi
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Load Programming Language Versions
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Node.js (requires nvm)
|
|
105
|
+
use node 20.11.0
|
|
106
|
+
|
|
107
|
+
# Python (creates/activates venv)
|
|
108
|
+
layout python python3.12
|
|
109
|
+
|
|
110
|
+
# Ruby (requires rbenv/rvm)
|
|
111
|
+
use ruby 3.3.0
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Source Other Files
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
# Load shared configuration
|
|
118
|
+
source_env ../shared/.envrc
|
|
119
|
+
|
|
120
|
+
# Load if exists
|
|
121
|
+
source_env_if_exists ./config/local.envrc
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Functions and Helpers
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# Log messages
|
|
128
|
+
log_status "Environment loaded"
|
|
129
|
+
log_error "Something went wrong"
|
|
130
|
+
|
|
131
|
+
# Watch files for changes
|
|
132
|
+
watch_file config/settings.yml
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Common Patterns
|
|
136
|
+
|
|
137
|
+
### Node.js Project
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# .envrc
|
|
141
|
+
use node 20
|
|
142
|
+
|
|
143
|
+
PATH_add ./node_modules/.bin
|
|
144
|
+
export NODE_ENV=development
|
|
145
|
+
export PORT=3000
|
|
146
|
+
|
|
147
|
+
dotenv_if_exists .env
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Python Project
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# .envrc
|
|
154
|
+
layout python python3.12
|
|
155
|
+
|
|
156
|
+
export PYTHONPATH="$PWD/src"
|
|
157
|
+
export FLASK_ENV=development
|
|
158
|
+
export DATABASE_URL="sqlite:///dev.db"
|
|
159
|
+
|
|
160
|
+
dotenv_if_exists .env
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Go Project
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# .envrc
|
|
167
|
+
export GOPATH="$PWD/.go"
|
|
168
|
+
export GOBIN="$PWD/bin"
|
|
169
|
+
|
|
170
|
+
PATH_add ./bin
|
|
171
|
+
PATH_add "$GOPATH/bin"
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Multi-Service Project
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# .envrc
|
|
178
|
+
export COMPOSE_PROJECT_NAME="myapp"
|
|
179
|
+
|
|
180
|
+
# Service URLs
|
|
181
|
+
export API_URL="http://localhost:3000"
|
|
182
|
+
export WEB_URL="http://localhost:8080"
|
|
183
|
+
export DB_URL="postgresql://localhost:5432/mydb"
|
|
184
|
+
|
|
185
|
+
# Load environment-specific config
|
|
186
|
+
dotenv_if_exists .env.${NODE_ENV:-development}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Monorepo
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
# Root .envrc
|
|
193
|
+
export WORKSPACE_ROOT="$PWD"
|
|
194
|
+
export NODE_ENV=development
|
|
195
|
+
|
|
196
|
+
# Shared variables
|
|
197
|
+
export DATABASE_URL="postgresql://localhost:5432/shared"
|
|
198
|
+
|
|
199
|
+
# Child directories can extend:
|
|
200
|
+
# source_env_if_exists $WORKSPACE_ROOT/.envrc
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## Advanced Features
|
|
204
|
+
|
|
205
|
+
### Private .envrc
|
|
206
|
+
|
|
207
|
+
For personal/local configurations:
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# .envrc
|
|
211
|
+
dotenv_if_exists .env
|
|
212
|
+
|
|
213
|
+
# Load personal settings (gitignored)
|
|
214
|
+
source_env_if_exists .envrc.local
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Create `.envrc.local` (add to `.gitignore`):
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
export PERSONAL_API_KEY="my-secret-key"
|
|
221
|
+
export DEBUG_MODE="true"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Watch Files
|
|
225
|
+
|
|
226
|
+
Reload when files change:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# .envrc
|
|
230
|
+
watch_file config/database.yml
|
|
231
|
+
watch_file .env.local
|
|
232
|
+
|
|
233
|
+
# Parse and export YAML/JSON
|
|
234
|
+
export DATABASE_HOST=$(yq .host config/database.yml)
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Lazy Loading
|
|
238
|
+
|
|
239
|
+
Defer expensive operations:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# Only load when variable is accessed
|
|
243
|
+
export_function() {
|
|
244
|
+
export EXPENSIVE_VALUE=$(some-slow-command)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
# Or use lazy loading helper
|
|
248
|
+
has nvm && use node
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Layout Functions
|
|
252
|
+
|
|
253
|
+
Built-in helpers for common setups:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# Python virtualenv
|
|
257
|
+
layout python python3.12
|
|
258
|
+
|
|
259
|
+
# Anaconda
|
|
260
|
+
layout anaconda myenv
|
|
261
|
+
|
|
262
|
+
# Node.js
|
|
263
|
+
layout node
|
|
264
|
+
|
|
265
|
+
# Go workspace
|
|
266
|
+
layout go
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Custom Functions
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
# Define reusable function
|
|
273
|
+
setup_aws() {
|
|
274
|
+
export AWS_PROFILE="dev"
|
|
275
|
+
export AWS_REGION="us-west-2"
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
setup_aws
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Security Best Practices
|
|
282
|
+
|
|
283
|
+
### Never Commit Secrets
|
|
284
|
+
|
|
285
|
+
**.envrc** - Commit to version control (no secrets):
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
# Safe to commit
|
|
289
|
+
export PROJECT_NAME="myapp"
|
|
290
|
+
export NODE_ENV="development"
|
|
291
|
+
|
|
292
|
+
# Load secrets from gitignored file
|
|
293
|
+
dotenv_if_exists .env
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**.env** - Do NOT commit (add to `.gitignore`):
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
# Secrets - never commit
|
|
300
|
+
API_KEY="sk_live_abc123"
|
|
301
|
+
DATABASE_PASSWORD="super-secret"
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Use .env.example
|
|
305
|
+
|
|
306
|
+
Provide template without secrets:
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
# .env.example (committed)
|
|
310
|
+
API_KEY=your-api-key-here
|
|
311
|
+
DATABASE_PASSWORD=your-password-here
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Users copy and fill in:
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
cp .env.example .env
|
|
318
|
+
# Edit .env with real values
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Validate .envrc Changes
|
|
322
|
+
|
|
323
|
+
direnv requires explicit permission:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# After editing .envrc
|
|
327
|
+
direnv allow .
|
|
328
|
+
|
|
329
|
+
# Deny if suspicious
|
|
330
|
+
direnv deny .
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Separate Environments
|
|
334
|
+
|
|
335
|
+
```bash
|
|
336
|
+
# .envrc
|
|
337
|
+
case "${ENVIRONMENT:-dev}" in
|
|
338
|
+
production)
|
|
339
|
+
dotenv_if_exists .env.production
|
|
340
|
+
;;
|
|
341
|
+
staging)
|
|
342
|
+
dotenv_if_exists .env.staging
|
|
343
|
+
;;
|
|
344
|
+
*)
|
|
345
|
+
dotenv_if_exists .env.development
|
|
346
|
+
;;
|
|
347
|
+
esac
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
## Commands
|
|
351
|
+
|
|
352
|
+
### Allow/Deny
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
direnv allow # Allow .envrc in current dir
|
|
356
|
+
direnv allow /path # Allow specific .envrc
|
|
357
|
+
direnv deny # Deny .envrc in current dir
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Status
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
direnv status # Show configuration status
|
|
364
|
+
direnv reload # Force reload environment
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### Debugging
|
|
368
|
+
|
|
369
|
+
```bash
|
|
370
|
+
direnv exec . env # Show all exported variables
|
|
371
|
+
direnv exec . bash # Start shell with environment
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## Troubleshooting
|
|
375
|
+
|
|
376
|
+
### .envrc Not Loading
|
|
377
|
+
|
|
378
|
+
1. Check if direnv is hooked:
|
|
379
|
+
|
|
380
|
+
```bash
|
|
381
|
+
echo $DIRENV_DIR
|
|
382
|
+
# Should show current directory
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
2. Reload shell configuration:
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
source ~/.bashrc
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
3. Allow .envrc explicitly:
|
|
392
|
+
```bash
|
|
393
|
+
direnv allow
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Variables Not Exported
|
|
397
|
+
|
|
398
|
+
Ensure you use `export`:
|
|
399
|
+
|
|
400
|
+
```bash
|
|
401
|
+
# ✗ Won't work outside .envrc
|
|
402
|
+
MY_VAR="value"
|
|
403
|
+
|
|
404
|
+
# ✓ Correctly exported
|
|
405
|
+
export MY_VAR="value"
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Performance Issues
|
|
409
|
+
|
|
410
|
+
Disable logging:
|
|
411
|
+
|
|
412
|
+
```bash
|
|
413
|
+
# In .envrc or environment
|
|
414
|
+
export DIRENV_LOG_FORMAT=""
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Cache expensive operations:
|
|
418
|
+
|
|
419
|
+
```bash
|
|
420
|
+
# .envrc
|
|
421
|
+
CACHE_FILE=".direnv/cache"
|
|
422
|
+
if [ ! -f "$CACHE_FILE" ]; then
|
|
423
|
+
echo "Computing expensive value..."
|
|
424
|
+
expensive-command > "$CACHE_FILE"
|
|
425
|
+
fi
|
|
426
|
+
export VALUE=$(cat "$CACHE_FILE")
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### Conflicts with Other Tools
|
|
430
|
+
|
|
431
|
+
Load direnv last in shell config:
|
|
432
|
+
|
|
433
|
+
```bash
|
|
434
|
+
# .bashrc
|
|
435
|
+
eval "$(rbenv init -)"
|
|
436
|
+
eval "$(nvm use)"
|
|
437
|
+
eval "$(direnv hook bash)" # Last
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
## Integration
|
|
441
|
+
|
|
442
|
+
### VS Code
|
|
443
|
+
|
|
444
|
+
Settings are automatically loaded. Reload window if needed:
|
|
445
|
+
|
|
446
|
+
- `Cmd/Ctrl + Shift + P` → "Developer: Reload Window"
|
|
447
|
+
|
|
448
|
+
### Git
|
|
449
|
+
|
|
450
|
+
Prevent committing secrets:
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
# .gitignore
|
|
454
|
+
.env
|
|
455
|
+
.env.local
|
|
456
|
+
.envrc.local
|
|
457
|
+
.direnv/
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### Docker Compose
|
|
461
|
+
|
|
462
|
+
```bash
|
|
463
|
+
# .envrc
|
|
464
|
+
export COMPOSE_PROJECT_NAME="${PROJECT_NAME}"
|
|
465
|
+
dotenv_if_exists .env
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
Variables are available to `docker-compose.yml`:
|
|
469
|
+
|
|
470
|
+
```yaml
|
|
471
|
+
services:
|
|
472
|
+
app:
|
|
473
|
+
environment:
|
|
474
|
+
- DATABASE_URL=${DATABASE_URL}
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
### CI/CD
|
|
478
|
+
|
|
479
|
+
Set variables in CI instead of loading .envrc:
|
|
480
|
+
|
|
481
|
+
```yaml
|
|
482
|
+
# .github/workflows/test.yml
|
|
483
|
+
env:
|
|
484
|
+
NODE_ENV: test
|
|
485
|
+
DATABASE_URL: postgresql://localhost/test
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
## Best Practices
|
|
489
|
+
|
|
490
|
+
1. **Commit .envrc** - Share project configuration
|
|
491
|
+
2. **Gitignore .env** - Keep secrets local
|
|
492
|
+
3. **Use .env.example** - Document required variables
|
|
493
|
+
4. **Validate on allow** - Review changes before allowing
|
|
494
|
+
5. **Keep it simple** - Complex logic belongs in scripts
|
|
495
|
+
6. **Use dotenv** - Separate code from configuration
|
|
496
|
+
7. **Namespace variables** - Prefix project-specific vars
|
|
497
|
+
8. **Document purpose** - Comment each variable
|
|
498
|
+
|
|
499
|
+
## Additional Resources
|
|
500
|
+
|
|
501
|
+
- [direnv Documentation](https://direnv.net/)
|
|
502
|
+
- [direnv Wiki](https://github.com/direnv/direnv/wiki)
|
|
503
|
+
- [Common Patterns](https://github.com/direnv/direnv/wiki/Python)
|
|
504
|
+
- [Security Guide](https://github.com/direnv/direnv/wiki/Security)
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# direnv setup script
|
|
3
|
+
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
echo "🔐 Setting up direnv..."
|
|
7
|
+
|
|
8
|
+
# Install direnv from package manager
|
|
9
|
+
sudo apt-get update -qq
|
|
10
|
+
sudo apt-get install -y direnv
|
|
11
|
+
|
|
12
|
+
# Verify installation
|
|
13
|
+
if command -v direnv &> /dev/null; then
|
|
14
|
+
echo "✓ direnv installed: $(direnv version)"
|
|
15
|
+
else
|
|
16
|
+
echo "✗ direnv installation failed"
|
|
17
|
+
exit 1
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
# Add direnv hook to bash profile
|
|
21
|
+
if [ -f "$HOME/.bashrc" ]; then
|
|
22
|
+
if ! grep -q "direnv hook bash" "$HOME/.bashrc"; then
|
|
23
|
+
echo 'eval "$(direnv hook bash)"' >> "$HOME/.bashrc"
|
|
24
|
+
echo "✓ direnv hook added to .bashrc"
|
|
25
|
+
fi
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# Add direnv hook to zsh profile if zsh is installed
|
|
29
|
+
if command -v zsh &> /dev/null && [ -f "$HOME/.zshrc" ]; then
|
|
30
|
+
if ! grep -q "direnv hook zsh" "$HOME/.zshrc"; then
|
|
31
|
+
echo 'eval "$(direnv hook zsh)"' >> "$HOME/.zshrc"
|
|
32
|
+
echo "✓ direnv hook added to .zshrc"
|
|
33
|
+
fi
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# Create sample .envrc if it doesn't exist
|
|
37
|
+
if [ ! -f .envrc ]; then
|
|
38
|
+
cat > .envrc << 'EOF'
|
|
39
|
+
# .envrc - Directory-specific environment variables
|
|
40
|
+
# Run `direnv allow` to activate this file
|
|
41
|
+
|
|
42
|
+
# Load .env file if it exists
|
|
43
|
+
dotenv_if_exists .env
|
|
44
|
+
|
|
45
|
+
# Example: Set project-specific variables
|
|
46
|
+
export PROJECT_NAME="my-project"
|
|
47
|
+
export ENVIRONMENT="development"
|
|
48
|
+
|
|
49
|
+
# Example: Add local bin to PATH
|
|
50
|
+
PATH_add ./bin
|
|
51
|
+
PATH_add ./scripts
|
|
52
|
+
|
|
53
|
+
# Example: Set Node.js version (requires nvm)
|
|
54
|
+
# use node 20
|
|
55
|
+
|
|
56
|
+
# Example: Activate Python virtual environment
|
|
57
|
+
# layout python python3.12
|
|
58
|
+
|
|
59
|
+
# Example: Load secrets from file
|
|
60
|
+
# dotenv_if_exists .env.local
|
|
61
|
+
|
|
62
|
+
# Example: Set database URL
|
|
63
|
+
# export DATABASE_URL="postgresql://localhost:5432/mydb"
|
|
64
|
+
|
|
65
|
+
# Example: Set API endpoints
|
|
66
|
+
# export API_BASE_URL="http://localhost:3000"
|
|
67
|
+
|
|
68
|
+
# Example: Configure logging
|
|
69
|
+
# export LOG_LEVEL="debug"
|
|
70
|
+
|
|
71
|
+
# Log message when environment is loaded
|
|
72
|
+
log_status "✓ Environment loaded for $PROJECT_NAME"
|
|
73
|
+
EOF
|
|
74
|
+
echo "✓ Sample .envrc created"
|
|
75
|
+
|
|
76
|
+
# Note: Auto-allowing .envrc in devcontainer context
|
|
77
|
+
# WARNING: .envrc can execute arbitrary code. Review before allowing in production.
|
|
78
|
+
echo "⚠️ Auto-allowing .envrc for devcontainer (review contents before use)"
|
|
79
|
+
direnv allow .envrc 2>/dev/null || true
|
|
80
|
+
echo "✓ .envrc pre-allowed (run 'direnv deny' to disable)"
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# Create sample .env file if it doesn't exist
|
|
84
|
+
if [ ! -f .env ] && [ ! -f .env.example ]; then
|
|
85
|
+
cat > .env.example << 'EOF'
|
|
86
|
+
# .env.example - Example environment variables
|
|
87
|
+
# Copy to .env and customize for your local environment
|
|
88
|
+
|
|
89
|
+
# Application settings
|
|
90
|
+
NODE_ENV=development
|
|
91
|
+
PORT=3000
|
|
92
|
+
|
|
93
|
+
# Database
|
|
94
|
+
DATABASE_URL=postgresql://localhost:5432/mydb
|
|
95
|
+
DATABASE_POOL_SIZE=10
|
|
96
|
+
|
|
97
|
+
# Authentication
|
|
98
|
+
JWT_SECRET=change-me-in-production
|
|
99
|
+
SESSION_SECRET=change-me-too
|
|
100
|
+
|
|
101
|
+
# API Keys (never commit real keys)
|
|
102
|
+
API_KEY=your-api-key-here
|
|
103
|
+
THIRD_PARTY_API_KEY=another-key
|
|
104
|
+
|
|
105
|
+
# Feature Flags
|
|
106
|
+
ENABLE_BETA_FEATURES=false
|
|
107
|
+
ENABLE_DEBUG_MODE=true
|
|
108
|
+
|
|
109
|
+
# External Services
|
|
110
|
+
REDIS_URL=redis://localhost:6379
|
|
111
|
+
ELASTICSEARCH_URL=http://localhost:9200
|
|
112
|
+
|
|
113
|
+
# Logging
|
|
114
|
+
LOG_LEVEL=info
|
|
115
|
+
LOG_FORMAT=json
|
|
116
|
+
EOF
|
|
117
|
+
echo "✓ Sample .env.example created"
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
# Create .gitignore entries for environment files
|
|
121
|
+
if [ -f .gitignore ]; then
|
|
122
|
+
if ! grep -q ".envrc" .gitignore; then
|
|
123
|
+
echo "" >> .gitignore
|
|
124
|
+
echo "# Direnv" >> .gitignore
|
|
125
|
+
echo ".envrc.local" >> .gitignore
|
|
126
|
+
echo ".env" >> .gitignore
|
|
127
|
+
echo ".env.local" >> .gitignore
|
|
128
|
+
echo "✓ Added direnv entries to .gitignore"
|
|
129
|
+
fi
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
echo "✓ direnv setup complete"
|
|
133
|
+
echo ""
|
|
134
|
+
echo "💡 Usage:"
|
|
135
|
+
echo " - Edit .envrc to set environment variables"
|
|
136
|
+
echo " - Run 'direnv allow' to activate changes"
|
|
137
|
+
echo " - Variables are automatically loaded when entering directory"
|
|
138
|
+
echo " - Use 'direnv deny' to disable"
|
|
139
|
+
echo " - Check status: 'direnv status'"
|