vaulter 1.0.16 → 1.0.18

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.
Files changed (105) hide show
  1. package/README.md +201 -1543
  2. package/dist/cli/commands/audit.js +1 -1
  3. package/dist/cli/commands/audit.js.map +1 -1
  4. package/dist/cli/commands/delete.d.ts +3 -0
  5. package/dist/cli/commands/delete.d.ts.map +1 -1
  6. package/dist/cli/commands/delete.js +28 -16
  7. package/dist/cli/commands/delete.js.map +1 -1
  8. package/dist/cli/commands/export/index.d.ts +39 -0
  9. package/dist/cli/commands/export/index.d.ts.map +1 -0
  10. package/dist/cli/commands/export/index.js +312 -0
  11. package/dist/cli/commands/export/index.js.map +1 -0
  12. package/dist/cli/commands/export.d.ts +2 -0
  13. package/dist/cli/commands/export.d.ts.map +1 -1
  14. package/dist/cli/commands/export.js +7 -2
  15. package/dist/cli/commands/export.js.map +1 -1
  16. package/dist/cli/commands/get.d.ts +3 -0
  17. package/dist/cli/commands/get.d.ts.map +1 -1
  18. package/dist/cli/commands/get.js +33 -7
  19. package/dist/cli/commands/get.js.map +1 -1
  20. package/dist/cli/commands/list.d.ts +2 -0
  21. package/dist/cli/commands/list.d.ts.map +1 -1
  22. package/dist/cli/commands/list.js +118 -33
  23. package/dist/cli/commands/list.js.map +1 -1
  24. package/dist/cli/commands/pull.d.ts +5 -2
  25. package/dist/cli/commands/pull.d.ts.map +1 -1
  26. package/dist/cli/commands/pull.js +70 -23
  27. package/dist/cli/commands/pull.js.map +1 -1
  28. package/dist/cli/commands/push.d.ts +5 -2
  29. package/dist/cli/commands/push.d.ts.map +1 -1
  30. package/dist/cli/commands/push.js +59 -21
  31. package/dist/cli/commands/push.js.map +1 -1
  32. package/dist/cli/commands/rotation.js +22 -0
  33. package/dist/cli/commands/rotation.js.map +1 -1
  34. package/dist/cli/commands/service/index.d.ts +27 -0
  35. package/dist/cli/commands/service/index.d.ts.map +1 -0
  36. package/dist/cli/commands/service/index.js +172 -0
  37. package/dist/cli/commands/service/index.js.map +1 -0
  38. package/dist/cli/commands/set.d.ts +2 -0
  39. package/dist/cli/commands/set.d.ts.map +1 -1
  40. package/dist/cli/commands/set.js +48 -36
  41. package/dist/cli/commands/set.js.map +1 -1
  42. package/dist/cli/commands/sync/index.d.ts +31 -0
  43. package/dist/cli/commands/sync/index.d.ts.map +1 -0
  44. package/dist/cli/commands/sync/index.js +237 -0
  45. package/dist/cli/commands/sync/index.js.map +1 -0
  46. package/dist/cli/commands/var/index.d.ts +31 -0
  47. package/dist/cli/commands/var/index.d.ts.map +1 -0
  48. package/dist/cli/commands/var/index.js +98 -0
  49. package/dist/cli/commands/var/index.js.map +1 -0
  50. package/dist/cli/index.js +181 -125
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/cli/lib/audit-helper.js +1 -1
  53. package/dist/cli/lib/audit-helper.js.map +1 -1
  54. package/dist/cli/lib/colors.d.ts +105 -0
  55. package/dist/cli/lib/colors.d.ts.map +1 -0
  56. package/dist/cli/lib/colors.js +186 -0
  57. package/dist/cli/lib/colors.js.map +1 -0
  58. package/dist/cli/tui/audit-viewer.d.ts +13 -1
  59. package/dist/cli/tui/audit-viewer.d.ts.map +1 -1
  60. package/dist/cli/tui/audit-viewer.js +57 -18
  61. package/dist/cli/tui/audit-viewer.js.map +1 -1
  62. package/dist/cli/tui/dashboard.d.ts +13 -1
  63. package/dist/cli/tui/dashboard.d.ts.map +1 -1
  64. package/dist/cli/tui/dashboard.js +53 -38
  65. package/dist/cli/tui/dashboard.js.map +1 -1
  66. package/dist/cli/tui/key-manager.d.ts +11 -0
  67. package/dist/cli/tui/key-manager.d.ts.map +1 -1
  68. package/dist/cli/tui/key-manager.js +18 -8
  69. package/dist/cli/tui/key-manager.js.map +1 -1
  70. package/dist/cli/tui/launcher.d.ts.map +1 -1
  71. package/dist/cli/tui/launcher.js +24 -24
  72. package/dist/cli/tui/launcher.js.map +1 -1
  73. package/dist/cli/ui.d.ts +17 -0
  74. package/dist/cli/ui.d.ts.map +1 -1
  75. package/dist/cli/ui.js +50 -15
  76. package/dist/cli/ui.js.map +1 -1
  77. package/dist/client.d.ts.map +1 -1
  78. package/dist/client.js +2 -1
  79. package/dist/client.js.map +1 -1
  80. package/dist/lib/audit.d.ts +1 -1
  81. package/dist/lib/audit.d.ts.map +1 -1
  82. package/dist/lib/audit.js +3 -2
  83. package/dist/lib/audit.js.map +1 -1
  84. package/dist/lib/shared.d.ts +77 -0
  85. package/dist/lib/shared.d.ts.map +1 -0
  86. package/dist/lib/shared.js +140 -0
  87. package/dist/lib/shared.js.map +1 -0
  88. package/dist/mcp/prompts.d.ts +2 -0
  89. package/dist/mcp/prompts.d.ts.map +1 -1
  90. package/dist/mcp/prompts.js +316 -0
  91. package/dist/mcp/prompts.js.map +1 -1
  92. package/dist/mcp/resources.d.ts +15 -12
  93. package/dist/mcp/resources.d.ts.map +1 -1
  94. package/dist/mcp/resources.js +285 -510
  95. package/dist/mcp/resources.js.map +1 -1
  96. package/dist/mcp/server.d.ts +5 -5
  97. package/dist/mcp/server.js +5 -5
  98. package/dist/mcp/tools.d.ts +2 -1
  99. package/dist/mcp/tools.d.ts.map +1 -1
  100. package/dist/mcp/tools.js +429 -6
  101. package/dist/mcp/tools.js.map +1 -1
  102. package/dist/types.d.ts +17 -0
  103. package/dist/types.d.ts.map +1 -1
  104. package/dist/types.js.map +1 -1
  105. package/package.json +1 -1
package/README.md CHANGED
@@ -1,1440 +1,265 @@
1
1
  <div align="center">
2
2
 
3
- # 🔐 vaulter
3
+ # vaulter
4
4
 
5
5
  ### Multi-Backend Environment & Secrets Manager
6
6
 
7
- **One CLI to manage all your environment variables.**
8
-
9
7
  [![npm version](https://img.shields.io/npm/v/vaulter.svg?style=flat-square&color=F5A623)](https://www.npmjs.com/package/vaulter)
10
8
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178C6?style=flat-square&logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
11
9
  [![Node.js](https://img.shields.io/badge/Node.js-22+-339933?style=flat-square&logo=node.js&logoColor=white)](https://nodejs.org/)
12
10
  [![MCP](https://img.shields.io/badge/MCP-Claude_AI-7C3AED?style=flat-square&logo=anthropic&logoColor=white)](https://modelcontextprotocol.io/)
13
- [![License](https://img.shields.io/npm/l/vaulter.svg?style=flat-square&color=007AFF)](https://github.com/forattini-dev/vaulter/blob/main/LICENSE)
14
-
15
- Store secrets anywhere: AWS S3, MinIO, R2, Spaces, B2, or local filesystem.
16
- <br>
17
- AES-256-GCM encryption. RSA/EC hybrid encryption. Native K8s, Helm & Terraform integration.
18
-
19
- [Quick Start](#quick-start) · [Security](#security) · [CI/CD](#cicd) · [Commands](#commands)
20
-
21
- </div>
22
-
23
- ---
24
-
25
- ## Installation
26
-
27
- ```bash
28
- # One-liner (recommended)
29
- curl -fsSL https://raw.githubusercontent.com/forattini-dev/vaulter/main/install.sh | sh
30
-
31
- # Or via npm/pnpm
32
- npm install -g vaulter
33
- pnpm add -g vaulter
34
- ```
35
-
36
- ## Quick Start
37
-
38
- ```bash
39
- # Initialize project
40
- vaulter init
41
-
42
- # Set secrets (encrypted, synced to backend)
43
- vaulter set DATABASE_URL="postgres://localhost/mydb" -e dev
44
-
45
- # Export to shell
46
- eval $(vaulter export -e dev)
47
-
48
- # Deploy to Kubernetes
49
- vaulter k8s:secret -e prd | kubectl apply -f -
50
- ```
51
-
52
- ---
53
-
54
- ## Table of Contents
55
-
56
- - [Why Vaulter?](#why-vaulter)
57
- - [Security](#security)
58
- - [Daily Use](#daily-use)
59
- - [Audit & Compliance](#audit--compliance)
60
- - [Secret Rotation](#secret-rotation)
61
- - [CI/CD](#cicd)
62
- - [Configuration](#configuration)
63
- - [Integrations](#integrations)
64
- - [Monorepo Support](#monorepo-support)
65
- - [API Usage](#api-usage)
66
- - [MCP Server](#mcp-server)
67
-
68
- ---
69
-
70
- ## Why Vaulter?
71
-
72
- ### The Problem
73
-
74
- Environment variables and secrets are scattered across `.env` files, CI/CD settings, cloud consoles, and team Slack messages. This creates:
75
-
76
- - **Security gaps**: Secrets in plaintext files, git history, or shared docs
77
- - **Sync issues**: "Works on my machine" because `.env` files differ
78
- - **Deploy friction**: Manual copy-paste between environments
79
- - **Audit blindness**: No idea who changed what, when
80
-
81
- ### The Solution
82
-
83
- Vaulter centralizes all environment variables in encrypted storage (S3-compatible) while maintaining the simplicity of `.env` files:
84
-
85
- | Traditional | With Vaulter |
86
- |:------------|:-------------|
87
- | Secrets in plaintext `.env` | Encrypted at rest (AES-256-GCM) |
88
- | Manual sync between devs | `vaulter pull` / `vaulter push` |
89
- | Copy-paste to CI/CD | `eval $(vaulter export -e prd)` |
90
- | No audit trail | Full history via S3 versioning |
91
- | Different files per machine | Single source of truth |
92
-
93
- ### Why Trust Vaulter?
94
-
95
- 1. **Open source**: All code is auditable
96
- 2. **No lock-in**: Your data lives in YOUR storage (S3, MinIO, R2, filesystem)
97
- 3. **Standard encryption**: AES-256-GCM, the same used by AWS, Google, and banks
98
- 4. **Zero external dependencies**: No SaaS, no API keys, no third-party services
99
- 5. **Offline capable**: Works with local filesystem backend
100
-
101
- ---
102
-
103
- ## Security
104
-
105
- ### Encryption Model
106
-
107
- Every secret is encrypted **before** leaving your machine using **AES-256-GCM**:
108
-
109
- ```
110
- ┌─────────────────────────────────────────────────────────────┐
111
- │ Your Machine │
112
- │ │
113
- │ .env file ──► vaulter encrypt ──► encrypted blob ──► S3 │
114
- │ (AES-256-GCM) (unreadable) │
115
- │ │
116
- │ S3 ──► encrypted blob ──► vaulter decrypt ──► .env file │
117
- │ (unreadable) (AES-256-GCM) │
118
- └─────────────────────────────────────────────────────────────┘
119
- ```
120
-
121
- **What this means:**
122
- - The backend (S3, MinIO, etc.) only sees encrypted data
123
- - Even with S3 access, secrets are unreadable without the key
124
- - Each value is encrypted individually (field-level encryption)
125
- - Authenticated encryption prevents tampering (GCM mode)
126
-
127
- ### Key Management
128
-
129
- Vaulter stores keys in `~/.vaulter/` directory (outside project) for security:
130
-
131
- ```
132
- ~/.vaulter/
133
- ├── projects/
134
- │ └── <project-name>/
135
- │ └── keys/
136
- │ ├── master # Private key (mode 600)
137
- │ └── master.pub # Public key (mode 644)
138
- └── global/
139
- └── keys/ # Shared across all projects
140
- ├── shared
141
- └── shared.pub
142
- ```
143
-
144
- #### Key Commands
145
-
146
- ```bash
147
- # Generate keys
148
- vaulter key generate --name master # Symmetric key
149
- vaulter key generate --name master --asymmetric # RSA-4096 key pair
150
- vaulter key generate --name master --asym --alg ec-p256 # EC P-256 key pair
151
- vaulter key generate --name shared --global # Global key (all projects)
152
-
153
- # List and show keys
154
- vaulter key list # List all keys (project + global)
155
- vaulter key show --name master # Show key details
156
-
157
- # Export/import for deployment
158
- vaulter key export --name master -o keys.enc # Export encrypted bundle
159
- vaulter key import -f keys.enc # Import on another machine
160
-
161
- # Set VAULTER_EXPORT_PASSPHRASE to encrypt the bundle with custom passphrase
162
- ```
163
-
164
- #### Configuration with key_name
165
-
166
- The simplest way to use keys is via `key_name` resolution:
167
-
168
- ```yaml
169
- # .vaulter/config.yaml
170
- encryption:
171
- mode: asymmetric
172
- asymmetric:
173
- algorithm: rsa-4096
174
- key_name: master # → ~/.vaulter/projects/<project>/keys/master[.pub]
175
- # Or for global key:
176
- # key_name: global:master # → ~/.vaulter/global/keys/master[.pub]
177
- ```
178
-
179
- #### Legacy Key Sources (still supported)
180
-
181
- You can also specify explicit key sources:
182
-
183
- ```yaml
184
- encryption:
185
- key_source:
186
- - env: VAULTER_KEY # 1. Environment variable (CI/CD)
187
- - file: .vaulter/.key # 2. Local file (development)
188
- - s3: s3://keys/vaulter.key # 3. Remote S3 (shared teams)
189
- ```
190
-
191
- ##### Option 1: Environment Variable (Recommended for CI/CD)
192
-
193
- ```bash
194
- # Generate a key
195
- vaulter key generate --name master
196
-
197
- # Set in CI/CD secrets from the generated key
198
- export VAULTER_KEY=$(cat ~/.vaulter/projects/myproject/keys/master)
199
- ```
200
-
201
- **Pros**: Key never in project directory, rotates easily via CI/CD secret rotation
202
- **Use case**: GitHub Actions, GitLab CI, Jenkins
203
-
204
- ##### Option 2: key_name Resolution (Recommended for Development)
205
-
206
- ```yaml
207
- encryption:
208
- mode: asymmetric
209
- asymmetric:
210
- key_name: master # Auto-resolves to ~/.vaulter/projects/<project>/keys/
211
- ```
212
-
213
- **Pros**: Simple, keys stored securely outside project
214
- **Use case**: Local development, team workflows
215
-
216
- ##### Option 3: Remote S3 (Team Shared)
217
-
218
- ```yaml
219
- encryption:
220
- key_source:
221
- - s3: s3://company-keys/vaulter/project.key?region=us-east-1
222
- ```
223
-
224
- **Pros**: Centralized key management, IAM-controlled access
225
- **Use case**: Teams, multiple developers needing same key
226
-
227
- ### Asymmetric Key Encryption (RSA/EC)
228
-
229
- For enhanced security with separate encrypt/decrypt permissions, Vaulter supports hybrid encryption using RSA or Elliptic Curve key pairs.
230
-
231
- #### How It Works
232
-
233
- ```
234
- ┌────────────────────────────────────────────────────────────────┐
235
- │ Hybrid Encryption │
236
- │ │
237
- │ Your secret ──► AES-256-GCM ──► Encrypted data │
238
- │ │ │
239
- │ │ (random AES key) │
240
- │ ▼ │
241
- │ Public key ──► RSA/EC encrypt ──► Encrypted AES key │
242
- │ │
243
- │ Stored: { encrypted_key + encrypted_data + metadata } │
244
- │ │
245
- │ Decryption requires: Private key + Encrypted blob │
246
- └────────────────────────────────────────────────────────────────┘
247
- ```
248
-
249
- **Benefits:**
250
- - **Separation of duties**: Public key can only encrypt, private key can decrypt
251
- - **CI/CD security**: Give CI/CD only the public key - it can write but not read secrets
252
- - **Production isolation**: Only production has the private key for decryption
253
-
254
- #### Generate Key Pair
255
-
256
- ```bash
257
- # RSA 4096-bit (default, most compatible)
258
- vaulter key generate --name master --asymmetric
259
-
260
- # RSA 2048-bit (faster, less secure)
261
- vaulter key generate --name master --asym --algorithm rsa-2048
262
-
263
- # Elliptic Curve P-256 (modern, fast)
264
- vaulter key generate --name master --asym --alg ec-p256
265
-
266
- # Elliptic Curve P-384 (stronger EC)
267
- vaulter key generate --name master --asym --alg ec-p384
268
-
269
- # Global key (shared across all projects)
270
- vaulter key generate --name shared --global --asymmetric
271
- ```
272
-
273
- Output:
274
- ```
275
- ✓ Generated rsa-4096 key pair: master
276
- Private: ~/.vaulter/projects/my-project/keys/master (mode 600 - keep secret!)
277
- Public: ~/.vaulter/projects/my-project/keys/master.pub (mode 644)
278
-
279
- To use these keys in config.yaml:
280
- encryption:
281
- mode: asymmetric
282
- asymmetric:
283
- algorithm: rsa-4096
284
- key_name: master
285
- ```
286
-
287
- #### Configuration
288
-
289
- ```yaml
290
- # .vaulter/config.yaml
291
- encryption:
292
- mode: asymmetric # Enable asymmetric mode
293
- asymmetric:
294
- algorithm: rsa-4096 # or rsa-2048, ec-p256, ec-p384
295
- key_name: master # Uses ~/.vaulter/projects/<project>/keys/master[.pub]
296
- # Or for global keys:
297
- # key_name: global:master # Uses ~/.vaulter/global/keys/master[.pub]
298
-
299
- # Alternative: explicit key sources (for CI/CD or custom paths)
300
- # encryption:
301
- # mode: asymmetric
302
- # asymmetric:
303
- # algorithm: rsa-4096
304
- # public_key:
305
- # - file: /path/to/master.pub
306
- # - env: VAULTER_PUBLIC_KEY
307
- # private_key:
308
- # - file: /path/to/master
309
- # - env: VAULTER_PRIVATE_KEY
310
- ```
311
-
312
- #### Supported Algorithms
313
-
314
- | Algorithm | Key Size | Performance | Use Case |
315
- |:----------|:---------|:------------|:---------|
316
- | `rsa-4096` | 4096 bits | Slower | Maximum security, wide compatibility |
317
- | `rsa-2048` | 2048 bits | Medium | Good balance, legacy systems |
318
- | `ec-p256` | 256 bits | Fast | Modern systems, smaller keys |
319
- | `ec-p384` | 384 bits | Medium | Higher security EC |
320
-
321
- #### Use Case: Secure CI/CD Pipeline
322
-
323
- ```
324
- ┌─────────────────────────────────────────────────────────────┐
325
- │ Development │
326
- │ Developers have BOTH keys → can read and write secrets │
327
- │ vaulter set API_KEY="..." -e dev │
328
- └──────────────────────────┬──────────────────────────────────┘
329
-
330
-
331
- ┌─────────────────────────────────────────────────────────────┐
332
- │ CI/CD (GitHub Actions, Jenkins, etc.) │
333
- │ Only PUBLIC key → can write NEW secrets, cannot read │
334
- │ Useful for automated secret rotation scripts │
335
- │ │
336
- │ env: │
337
- │ VAULTER_PUBLIC_KEY: ${{ secrets.VAULTER_PUBLIC_KEY }} │
338
- └──────────────────────────┬──────────────────────────────────┘
339
-
340
-
341
- ┌─────────────────────────────────────────────────────────────┐
342
- │ Production │
343
- │ Only PRIVATE key → can read secrets at runtime │
344
- │ │
345
- │ env: │
346
- │ VAULTER_PRIVATE_KEY: ${{ secrets.VAULTER_PRIVATE_KEY }} │
347
- │ │
348
- │ # Application reads secrets at startup │
349
- │ eval $(vaulter export -e prd) │
350
- └─────────────────────────────────────────────────────────────┘
351
- ```
352
-
353
- #### Environment Variables
354
-
355
- | Variable | Purpose |
356
- |:---------|:--------|
357
- | `VAULTER_PUBLIC_KEY` | Public key PEM content (for encryption) |
358
- | `VAULTER_PRIVATE_KEY` | Private key PEM content (for decryption) |
359
-
360
- ### Advanced Security Configurations
361
-
362
- #### AWS KMS Integration (Planned)
363
-
364
- For enterprises requiring HSM-backed keys:
365
-
366
- ```yaml
367
- encryption:
368
- kms:
369
- key_id: arn:aws:kms:us-east-1:123456789:key/abc-123
370
- # Key never leaves AWS KMS
371
- # Envelope encryption: KMS encrypts the data key
372
- ```
373
-
374
- **How it works:**
375
- 1. Vaulter generates a data encryption key (DEK)
376
- 2. DEK encrypts your secrets locally
377
- 3. AWS KMS encrypts the DEK (envelope encryption)
378
- 4. Only encrypted DEK + encrypted secrets are stored
379
- 5. Decryption requires both KMS access AND S3 access
380
-
381
- ### Threat Model
382
-
383
- | Threat | Protection |
384
- |:-------|:-----------|
385
- | S3 bucket breach | Data encrypted, key required |
386
- | Key file leaked | Rotate key, re-encrypt |
387
- | Man-in-middle | TLS + authenticated encryption |
388
- | Malicious insider | Audit logs via S3 versioning |
389
- | Accidental git commit | Secrets encrypted in .env |
390
-
391
- ### Security Best Practices
392
-
393
- ```bash
394
- # ✅ DO
395
- vaulter key generate # Random 256-bit key
396
- echo ".vaulter/.key" >> .gitignore # Never commit keys
397
- export VAULTER_KEY="${{ secrets.KEY }}" # CI/CD secrets
398
-
399
- # ❌ DON'T
400
- echo "password123" > .vaulter/.key # Weak key
401
- git add .vaulter/.key # Exposed key
402
- vaulter set KEY=val --key "hardcoded" # Key in command history
403
- ```
404
-
405
- ---
406
-
407
- ## Daily Use
408
-
409
- ### Workflow Overview
410
-
411
- ```bash
412
- # Morning: sync with team's changes
413
- vaulter pull -e dev
414
-
415
- # During development: add new variable
416
- vaulter set NEW_API_KEY="sk-xxx" -e dev
417
-
418
- # End of day: push changes
419
- vaulter push -e dev
420
-
421
- # Deploy: export to production
422
- vaulter k8s:secret -e prd | kubectl apply -f -
423
- ```
424
-
425
- ### Commands Reference
426
-
427
- #### Core Commands
428
-
429
- | Command | Description | Example |
430
- |:--------|:------------|:--------|
431
- | `init` | Initialize project | `vaulter init` |
432
- | `get <key>` | Get a variable | `vaulter get DATABASE_URL -e prd` |
433
- | `set KEY=val` | Set secrets (batch) | `vaulter set A=1 B=2 -e prd` |
434
- | `set KEY::val` | Set configs (plain) | `vaulter set PORT::3000 -e dev` |
435
- | `delete <key>` | Delete a variable | `vaulter delete OLD_KEY -e dev` |
436
- | `list` | List all variables | `vaulter list -e prd` |
437
- | `list --all-envs` | List across all envs | `vaulter list --all-envs` |
438
- | `export` | Export for shell | `eval $(vaulter export -e dev)` |
439
-
440
- #### Sync Commands
441
-
442
- | Command | Description | Example |
443
- |:--------|:------------|:--------|
444
- | `sync` | Merge local and backend | `vaulter sync -e dev` |
445
- | `pull` | Download from backend | `vaulter pull -e prd` |
446
- | `push` | Upload to backend | `vaulter push -e dev` |
447
-
448
- #### Integration Commands
449
-
450
- | Command | Description | Example |
451
- |:--------|:------------|:--------|
452
- | `k8s:secret` | Kubernetes Secret | `vaulter k8s:secret -e prd` |
453
- | `k8s:configmap` | Kubernetes ConfigMap | `vaulter k8s:configmap -e prd` |
454
- | `helm:values` | Helm values.yaml | `vaulter helm:values -e prd` |
455
- | `tf:vars` | Terraform .tfvars | `vaulter tf:vars -e prd` |
456
- | `scan` | Scan monorepo | `vaulter scan` |
457
-
458
- #### Audit Commands
459
-
460
- | Command | Description | Example |
461
- |:--------|:------------|:--------|
462
- | `audit list` | List audit entries | `vaulter audit list -e prd` |
463
- | `audit show` | Show entry details | `vaulter audit show <id>` |
464
- | `audit stats` | Show statistics | `vaulter audit stats -e prd` |
465
- | `audit cleanup` | Delete old entries | `vaulter audit cleanup --retention 30` |
466
-
467
- #### Rotation Commands
468
-
469
- | Command | Description | Example |
470
- |:--------|:------------|:--------|
471
- | `rotation list` | Show rotation status | `vaulter rotation list -e prd` |
472
- | `rotation run` | Run rotation check | `vaulter rotation run -e prd --clear` |
473
-
474
- ### Set Command Syntax
475
-
476
- ```bash
477
- # Secrets (encrypted, synced to backend)
478
- vaulter set KEY=value # Single secret
479
- vaulter set A=1 B=2 C=3 -e dev # Batch secrets
480
- vaulter set KEY:=123 # Typed (number/boolean)
481
-
482
- # Configs (plain text in split mode)
483
- vaulter set PORT::3000 HOST::localhost # Configs
484
- ```
485
-
486
- | Separator | Type | Backend Sync | Encrypted |
487
- |:----------|:-----|:-------------|:----------|
488
- | `=` | Secret | ✓ | ✓ |
489
- | `:=` | Secret (typed) | ✓ | ✓ |
490
- | `::` | Config | Split: ✗ / Unified: ✓ | ✓ |
491
-
492
- ### Global Options
493
-
494
- ```
495
- -p, --project <name> Project name
496
- -s, --service <name> Service name (monorepos)
497
- -e, --env <env> Environment name (as defined in config)
498
- -b, --backend <url> Backend URL override
499
- -k, --key <path|value> Encryption key
500
- -f, --file <path> Input file path
501
- -o, --output <path> Output file path
502
- -n, --namespace <name> Kubernetes namespace
503
- --format <fmt> Output format (shell/json/yaml/env/tfvars/docker-args)
504
- -v, --verbose Verbose output (shows values)
505
- --dry-run Preview without applying
506
- --json JSON output
507
- --force Skip confirmations
508
- --all Apply to all services in monorepo
509
- ```
510
-
511
- ### Flexible Environment Names
512
-
513
- Vaulter lets you define your own environment names. Use whatever convention fits your workflow:
514
-
515
- ```yaml
516
- # Short names (default)
517
- environments: [dev, stg, prd]
518
-
519
- # Full names
520
- environments: [development, staging, production]
521
-
522
- # Custom names
523
- environments: [local, homolog, qa, uat, prod]
524
-
525
- # Brazilian pattern
526
- environments: [dev, homolog, prd]
527
- ```
528
-
529
- All commands use `-e` with your custom names:
530
-
531
- ```bash
532
- vaulter list -e homolog
533
- vaulter pull -e development
534
- vaulter k8s:secret -e uat | kubectl apply -f -
535
- ```
536
-
537
- ---
538
-
539
- ## Audit & Compliance
540
-
541
- Vaulter includes built-in audit logging to track every change to your secrets. Essential for compliance (SOC2, HIPAA, PCI-DSS) and debugging "who changed what, when".
542
-
543
- ### Why Audit?
544
-
545
- ```
546
- ┌─────────────────────────────────────────────────────────────────┐
547
- │ Without Audit Logging │
548
- │ │
549
- │ Developer: "Who deleted the API_KEY in production?" │
550
- │ Team: 🤷 "No idea, check git blame? It's not in the repo..." │
551
- │ │
552
- └─────────────────────────────────────────────────────────────────┘
553
-
554
- ┌─────────────────────────────────────────────────────────────────┐
555
- │ With Vaulter Audit │
556
- │ │
557
- │ $ vaulter audit list -e prd --pattern "API_KEY" │
558
- │ │
559
- │ TIMESTAMP USER OP KEY ENV SRC │
560
- │ 2025-01-15 14:32:01 john delete API_KEY prd cli │
561
- │ 2025-01-10 09:15:22 jane set API_KEY prd sync │
562
- │ 2025-01-05 11:00:00 deploy set API_KEY prd ci │
563
- │ │
564
- └─────────────────────────────────────────────────────────────────┘
565
- ```
566
-
567
- ### Configuration
568
-
569
- ```yaml
570
- # .vaulter/config.yaml
571
- audit:
572
- enabled: true # Enable audit logging (default: true)
573
- retention_days: 90 # Auto-cleanup entries older than N days
574
- user_source: env # User detection: 'env' (from USER/USERNAME) or custom
575
- ```
576
-
577
- | Option | Default | Description |
578
- |:-------|:--------|:------------|
579
- | `enabled` | `true` | Enable/disable audit logging |
580
- | `retention_days` | `90` | Auto-cleanup old entries |
581
- | `user_source` | `'env'` | How to detect current user |
582
-
583
- ### Commands
584
-
585
- #### List Audit Entries
586
-
587
- ```bash
588
- # List recent entries (default: 50)
589
- vaulter audit list -e prd
590
-
591
- # Filter by user
592
- vaulter audit list -e prd --user john
593
-
594
- # Filter by operation
595
- vaulter audit list -e prd --operation delete
596
-
597
- # Filter by key pattern (supports wildcards)
598
- vaulter audit list -e prd --pattern "DATABASE_*"
599
-
600
- # Filter by date range
601
- vaulter audit list -e prd --since "2025-01-01" --until "2025-01-15"
602
-
603
- # Filter by source (cli, mcp, api, loader)
604
- vaulter audit list -e prd --source cli
605
-
606
- # Show all environments
607
- vaulter audit list --all-envs
608
-
609
- # JSON output for scripting
610
- vaulter audit list -e prd --json
611
-
612
- # Combine filters
613
- vaulter audit list -e prd --user deploy --operation set --limit 100
614
- ```
615
-
616
- **Output:**
617
- ```
618
- TIMESTAMP USER OP KEY ENV SRC
619
- 2025-01-15 14:32:01 john delete API_KEY prd cli
620
- 2025-01-15 14:30:00 jane set DATABASE_URL prd cli
621
- 2025-01-15 10:00:00 claude set JWT_SECRET prd mcp
622
- 2025-01-14 16:45:22 jane sync * prd cli
623
-
624
- Showing 4 entries
625
- ```
626
-
627
- #### Show Entry Details
628
-
629
- ```bash
630
- # Get full details of a specific entry
631
- vaulter audit show <entry-id>
632
- ```
633
-
634
- **Output:**
635
- ```
636
- ID: abc123def456
637
- Timestamp: 2025-01-15 14:32:01
638
- User: john
639
- Operation: delete
640
- Key: API_KEY
641
- Project: my-project
642
- Environment: prd
643
- Source: cli
644
- Previous: sk-1234****5678
645
- Metadata: {"reason": "rotating key"}
646
- ```
647
-
648
- #### Audit Statistics
649
-
650
- ```bash
651
- # View summary statistics
652
- vaulter audit stats -e prd
653
- ```
654
-
655
- **Output:**
656
- ```
657
- Audit Statistics for my-project/prd
658
- ════════════════════════════════════════
659
- Total entries: 1,247
660
- Date range: 2024-10-15 09:00:00 to 2025-01-15 14:32:01
661
-
662
- By Operation:
663
- set 892
664
- delete 124
665
- sync 156
666
- push 75
667
-
668
- By User:
669
- jane 456
670
- john 321
671
- github-ci 470
672
-
673
- By Source:
674
- cli 645
675
- mcp 470
676
- api 132
677
- ```
678
-
679
- #### Cleanup Old Entries
680
-
681
- ```bash
682
- # Cleanup entries older than retention_days (from config)
683
- vaulter audit cleanup
684
-
685
- # Override retention period
686
- vaulter audit cleanup --retention 30
687
-
688
- # Dry-run to see what would be deleted
689
- vaulter audit cleanup --retention 30 --dry-run
690
- ```
691
-
692
- ### Automatic Audit Logging
693
-
694
- Audit entries are created automatically for all write operations:
695
-
696
- | Operation | Logged Info |
697
- |:----------|:------------|
698
- | `set` | Key, previous value (masked), new value (masked) |
699
- | `delete` | Key, previous value (masked) |
700
- | `sync` | Keys added, updated, deleted |
701
- | `push` | Keys added, updated, deleted |
702
- | `deleteAll` | All deleted keys |
703
-
704
- ### Sources
705
-
706
- The `source` field indicates where the operation originated:
707
-
708
- | Source | Description |
709
- |:-------|:------------|
710
- | `cli` | Manual CLI command |
711
- | `mcp` | MCP server (AI assistant) |
712
- | `api` | Programmatic API usage |
713
- | `loader` | Auto-load from `vaulter/load` |
714
-
715
- ### Compliance Tips
716
-
717
- ```bash
718
- # Export audit log for compliance review
719
- vaulter audit list --all-envs --json > audit-report-$(date +%Y%m).json
720
-
721
- # Monitor production changes
722
- vaulter audit list -e prd --since "$(date -d 'yesterday' +%Y-%m-%d)"
723
-
724
- # Alert on deletions
725
- vaulter audit list -e prd --operation delete --json | jq '.entries | length'
726
- ```
727
-
728
- ---
729
-
730
- ## Secret Rotation
731
-
732
- Regular secret rotation is a security best practice. Vaulter tracks rotation schedules and helps you identify secrets that need attention.
733
-
734
- ### Why Rotate?
735
-
736
- - **Limit exposure**: If a key is compromised, damage is time-limited
737
- - **Compliance**: Many standards require periodic rotation (PCI-DSS: 90 days)
738
- - **Access control**: Rotated keys invalidate old access
739
- - **Audit trail**: Clear history of when credentials changed
740
-
741
- ### How It Works
742
-
743
- ```
744
- ┌─────────────────────────────────────────────────────────────────┐
745
- │ Rotation Workflow │
746
- │ │
747
- │ 1. vaulter rotation list → See what needs rotation │
748
- │ │
749
- │ KEY ENV LAST ROTATED ROTATE AFTER STATUS │
750
- │ DATABASE_URL prd 45 days ago 90 days ✓ OK │
751
- │ API_KEY prd 120 days ago 90 days ⚠ OVERDUE │
752
- │ JWT_SECRET prd never 90 days ⚠ OVERDUE │
753
- │ │
754
- │ 2. Manually rotate the credential in the external service │
755
- │ │
756
- │ 3. vaulter set API_KEY="new-value" -e prd │
757
- │ → Automatically updates rotatedAt timestamp │
758
- │ │
759
- │ 4. vaulter rotation run -e prd --overdue │
760
- │ → CI/CD gate: fails if secrets are overdue │
761
- │ │
762
- └─────────────────────────────────────────────────────────────────┘
763
- ```
764
-
765
- ### Configuration
766
-
767
- ```yaml
768
- # .vaulter/config.yaml
769
- encryption:
770
- rotation:
771
- enabled: true # Enable rotation tracking
772
- interval_days: 90 # Default rotation interval
773
- patterns: # Keys that should be rotated
774
- - "*_KEY"
775
- - "*_SECRET"
776
- - "*_TOKEN"
777
- - "*_PASSWORD"
778
- - "DATABASE_URL"
779
- - "REDIS_URL"
780
- ```
781
-
782
- | Option | Default | Description |
783
- |:-------|:--------|:------------|
784
- | `enabled` | `true` | Enable rotation tracking |
785
- | `interval_days` | `90` | Default rotation period |
786
- | `patterns` | `["*_KEY", "*_SECRET", ...]` | Keys to track (glob patterns) |
787
-
788
- ### Commands
789
-
790
- #### Check Rotation Status
791
-
792
- ```bash
793
- # Check which secrets need rotation
794
- vaulter rotation check -e prd
795
-
796
- # Check all environments
797
- vaulter rotation check --all-envs
798
-
799
- # Custom threshold (default: 90 days)
800
- vaulter rotation check -e prd --days 30
801
-
802
- # JSON output
803
- vaulter rotation check -e prd --json
804
- ```
805
-
806
- **Output:**
807
- ```
808
- Rotation check for my-project/prd
809
- Default rotation interval: 90 days
810
-
811
- ⚠️ Secrets needing rotation (2):
812
- • API_KEY - 120 days old
813
- • JWT_SECRET - never rotated
814
-
815
- Summary: 2 need rotation, 2 up to date
816
- ```
817
-
818
- #### List Rotation Policies
819
-
820
- ```bash
821
- # List secrets with rotation policies
822
- vaulter rotation list -e prd
823
-
824
- # Check all environments
825
- vaulter rotation list --all-envs
826
-
827
- # Verbose output with dates
828
- vaulter rotation list -e prd -v
829
- ```
830
-
831
- **Output:**
832
- ```
833
- Secrets with rotation policies (3):
834
-
835
- • DATABASE_URL - due in 45 days
836
- • API_KEY - ⚠️ OVERDUE
837
- • REDIS_URL - due in 34 days
838
- ```
839
-
840
- #### Set Rotation Policy
841
-
842
- ```bash
843
- # Set rotation policy for a secret
844
- vaulter rotation set API_KEY --interval 90d -e prd
845
-
846
- # Clear rotation policy
847
- vaulter rotation set API_KEY --clear -e prd
848
-
849
- # Set with different intervals
850
- vaulter rotation set JWT_SECRET --interval 30d -e prd
851
- vaulter rotation set DATABASE_URL --interval 6m -e prd
852
- ```
853
-
854
- **Supported intervals:** `Nd` (days), `Nw` (weeks), `Nm` (months), `Ny` (years)
855
-
856
- #### Run Rotation Workflow (CI/CD)
857
-
858
- ```bash
859
- # CI/CD gate - exits with code 1 if secrets are overdue
860
- vaulter rotation run -e prd
861
-
862
- # Only check overdue secrets
863
- vaulter rotation run -e prd --overdue
864
-
865
- # Filter by pattern
866
- vaulter rotation run -e prd --pattern "*_KEY"
867
-
868
- # Custom threshold
869
- vaulter rotation run -e prd --days 30
870
-
871
- # Don't fail even if overdue (for reports)
872
- vaulter rotation run -e prd --fail=false
873
-
874
- # JSON output for scripting
875
- vaulter rotation run -e prd --json
876
- ```
877
-
878
- **Output:**
879
- ```
880
- Rotation workflow: my-project
881
-
882
- ⚠️ Secrets requiring rotation (2):
883
- • API_KEY - 32 days overdue (matched: *_KEY)
884
- • JWT_SECRET - 120 days overdue
885
-
886
- To rotate a secret:
887
- vaulter set <KEY> "<new-value>" -e prd
888
-
889
- The rotatedAt timestamp will be updated automatically.
890
-
891
- Summary: 2 overdue, 2 up to date
892
- ```
893
-
894
- #### Automatic rotatedAt Update
895
-
896
- When you set a new value, Vaulter automatically tracks when it was last changed:
897
-
898
- ```bash
899
- # Set new value (automatically updates rotatedAt)
900
- vaulter set API_KEY="sk-new-rotated-key" -e prd
901
-
902
- # Verify rotation was tracked
903
- vaulter rotation check -e prd
904
- ```
905
-
906
- **Output:**
907
- ```
908
- Rotation check for my-project/prd
909
-
910
- ✓ Secrets up to date (1):
911
- • API_KEY - 0 days old
912
11
 
913
- Summary: 0 need rotation, 1 up to date
914
- ```
12
+ Store secrets anywhere: AWS S3, MinIO, R2, Spaces, B2, or local filesystem.
13
+ <br>
14
+ AES-256-GCM encryption. Native K8s, Helm & Terraform integration.
915
15
 
916
- ### Rotation Metadata
16
+ </div>
917
17
 
918
- Each secret tracks rotation metadata:
18
+ ---
919
19
 
920
- | Field | Description |
921
- |:------|:------------|
922
- | `rotatedAt` | ISO timestamp of last rotation |
923
- | `rotateAfter` | ISO timestamp when rotation is due |
20
+ ## Installation
924
21
 
925
- View with:
926
22
  ```bash
927
- vaulter get API_KEY -e prd --json | jq '.metadata'
23
+ curl -fsSL https://raw.githubusercontent.com/forattini-dev/vaulter/main/install.sh | sh
24
+ # or: npm install -g vaulter
928
25
  ```
929
26
 
930
- ### CI/CD Integration
931
-
932
- ```yaml
933
- # GitHub Actions - Weekly rotation check
934
- name: Secret Rotation Check
935
- on:
936
- schedule:
937
- - cron: '0 9 * * 1' # Every Monday at 9am
938
-
939
- jobs:
940
- check-rotation:
941
- runs-on: ubuntu-latest
942
- steps:
943
- - uses: actions/checkout@v4
27
+ ## Quick Start
944
28
 
945
- - name: Check for overdue secrets
946
- env:
947
- VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
948
- run: |
949
- # rotation run exits with code 1 if any secrets are overdue
950
- npx vaulter rotation run -e prd --overdue || {
951
- echo "::warning::Some secrets are overdue for rotation!"
952
- exit 1
953
- }
954
- echo "✓ All secrets are within rotation policy"
955
-
956
- # Optional: Filter by pattern for specific checks
957
- - name: Check API keys specifically
958
- run: |
959
- npx vaulter rotation run -e prd --pattern "*_KEY" --overdue
29
+ ```bash
30
+ vaulter init # Initialize project
31
+ vaulter key generate --name master # Generate encryption key
32
+ vaulter var set DATABASE_URL="postgres://..." -e dev # Set secret
33
+ vaulter var set PORT::3000 -e dev # Set config (plain)
34
+ eval $(vaulter export shell -e dev) # Export to shell
960
35
  ```
961
36
 
962
- ### Compliance Matrix
963
-
964
- | Standard | Requirement | Vaulter Config |
965
- |:---------|:------------|:---------------|
966
- | PCI-DSS | 90 days | `interval_days: 90` |
967
- | SOC2 | Regular rotation | `interval_days: 90` |
968
- | HIPAA | Periodic | `interval_days: 180` |
969
- | Internal | Custom | `interval_days: N` |
970
-
971
37
  ---
972
38
 
973
- ## CI/CD
974
-
975
- ### GitHub Actions (Quick Start)
976
-
977
- ```yaml
978
- name: Deploy
979
- on:
980
- push:
981
- branches: [main]
982
-
983
- jobs:
984
- deploy:
985
- runs-on: ubuntu-latest
986
- steps:
987
- - uses: actions/checkout@v4
988
-
989
- - name: Deploy secrets to Kubernetes
990
- env:
991
- VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
992
- AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
993
- AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
994
- run: |
995
- npx vaulter k8s:secret -e prd | kubectl apply -f -
996
- ```
997
-
998
- ### GitHub Actions (Complete Example)
999
-
1000
- ```yaml
1001
- name: Deploy to Kubernetes
1002
- on:
1003
- push:
1004
- branches: [main, develop]
1005
- workflow_dispatch:
1006
- inputs:
1007
- environment:
1008
- description: 'Target environment'
1009
- required: true
1010
- default: 'dev'
1011
- type: choice
1012
- options: [dev, stg, prd]
1013
-
1014
- env:
1015
- VAULTER_VERSION: '1.0.1'
1016
-
1017
- jobs:
1018
- deploy:
1019
- runs-on: ubuntu-latest
1020
- environment: ${{ github.event.inputs.environment || (github.ref == 'refs/heads/main' && 'prd') || 'dev' }}
1021
-
1022
- steps:
1023
- - uses: actions/checkout@v4
1024
-
1025
- - name: Setup Node.js
1026
- uses: actions/setup-node@v4
1027
- with:
1028
- node-version: '22'
1029
- cache: 'npm'
1030
-
1031
- - name: Install Vaulter
1032
- run: npm install -g vaulter@${{ env.VAULTER_VERSION }}
1033
-
1034
- - name: Configure kubectl
1035
- uses: azure/k8s-set-context@v4
1036
- with:
1037
- kubeconfig: ${{ secrets.KUBECONFIG }}
1038
-
1039
- - name: Deploy Secrets
1040
- env:
1041
- VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
1042
- AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
1043
- AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
1044
- run: |
1045
- ENV=${{ github.event.inputs.environment || (github.ref == 'refs/heads/main' && 'prd') || 'dev' }}
1046
-
1047
- # Deploy K8s Secret
1048
- vaulter k8s:secret -e $ENV -n my-namespace | kubectl apply -f -
1049
-
1050
- # Deploy ConfigMap (non-sensitive config)
1051
- vaulter k8s:configmap -e $ENV -n my-namespace | kubectl apply -f -
1052
-
1053
- # Verify deployment
1054
- kubectl get secret,configmap -n my-namespace
1055
-
1056
- - name: Restart Deployment
1057
- run: |
1058
- kubectl rollout restart deployment/my-app -n my-namespace
1059
- kubectl rollout status deployment/my-app -n my-namespace --timeout=120s
1060
- ```
1061
-
1062
- ### GitHub Actions (Monorepo with Services)
1063
-
1064
- ```yaml
1065
- name: Deploy Service
1066
- on:
1067
- push:
1068
- branches: [main]
1069
- paths:
1070
- - 'apps/svc-*/**'
1071
-
1072
- jobs:
1073
- detect-changes:
1074
- runs-on: ubuntu-latest
1075
- outputs:
1076
- services: ${{ steps.changes.outputs.services }}
1077
- steps:
1078
- - uses: actions/checkout@v4
1079
- - id: changes
1080
- run: |
1081
- # Detect which services changed
1082
- SERVICES=$(git diff --name-only HEAD~1 | grep '^apps/svc-' | cut -d'/' -f2 | sort -u | jq -R -s -c 'split("\n")[:-1]')
1083
- echo "services=$SERVICES" >> $GITHUB_OUTPUT
1084
-
1085
- deploy:
1086
- needs: detect-changes
1087
- runs-on: ubuntu-latest
1088
- strategy:
1089
- matrix:
1090
- service: ${{ fromJson(needs.detect-changes.outputs.services) }}
1091
- steps:
1092
- - uses: actions/checkout@v4
1093
-
1094
- - name: Deploy ${{ matrix.service }}
1095
- env:
1096
- VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
1097
- run: |
1098
- # Deploy secrets for specific service
1099
- vaulter k8s:secret -e prd -s ${{ matrix.service }} | kubectl apply -f -
1100
- ```
1101
-
1102
- ### GitHub Actions (Using Binary for Speed)
1103
-
1104
- ```yaml
1105
- name: Deploy (Fast)
1106
- on: [push]
1107
-
1108
- jobs:
1109
- deploy:
1110
- runs-on: ubuntu-latest
1111
- steps:
1112
- - uses: actions/checkout@v4
1113
-
1114
- - name: Download Vaulter Binary
1115
- run: |
1116
- curl -sL https://github.com/forattini-dev/vaulter/releases/latest/download/vaulter-linux -o vaulter
1117
- chmod +x vaulter
1118
- sudo mv vaulter /usr/local/bin/
39
+ ## Why Vaulter?
1119
40
 
1120
- - name: Deploy
1121
- env:
1122
- VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
1123
- run: |
1124
- vaulter k8s:secret -e prd | kubectl apply -f -
1125
- ```
41
+ | Problem | Solution |
42
+ |:--------|:---------|
43
+ | Secrets in plaintext `.env` | Encrypted at rest (AES-256-GCM) |
44
+ | Manual sync between devs | `vaulter sync pull` / `vaulter sync push` |
45
+ | Copy-paste to CI/CD | `eval $(vaulter export shell -e prd)` |
46
+ | No audit trail | Full history via audit log |
47
+ | Different files per machine | Single source of truth |
1126
48
 
1127
- ### GitHub Actions (Matrix Deploy)
49
+ **Zero lock-in**: Your data lives in YOUR storage (S3, MinIO, R2, filesystem).
1128
50
 
1129
- ```yaml
1130
- name: Deploy All Environments
1131
- on:
1132
- workflow_dispatch:
1133
- inputs:
1134
- environment:
1135
- type: choice
1136
- options: [dev, stg, prd]
51
+ ---
1137
52
 
1138
- jobs:
1139
- deploy:
1140
- runs-on: ubuntu-latest
1141
- environment: ${{ inputs.environment }}
1142
- steps:
1143
- - uses: actions/checkout@v4
53
+ ## Commands
1144
54
 
1145
- - name: Deploy secrets
1146
- env:
1147
- VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
1148
- run: |
1149
- npx vaulter k8s:secret -e ${{ inputs.environment }} | kubectl apply -f -
55
+ ### Setup
1150
56
 
1151
- - name: Deploy configmaps
1152
- run: |
1153
- npx vaulter k8s:configmap -e ${{ inputs.environment }} | kubectl apply -f -
1154
- ```
57
+ | Command | Description |
58
+ |:--------|:------------|
59
+ | `init` | Initialize project config |
60
+ | `init --split` | Initialize with split mode (configs/secrets dirs) |
61
+
62
+ ### Variables (`var`)
63
+
64
+ | Command | Description |
65
+ |:--------|:------------|
66
+ | `var get <key> -e <env>` | Get a variable |
67
+ | `var set KEY=val -e <env>` | Set secret (encrypted) |
68
+ | `var set KEY::val -e <env>` | Set config (plain text) |
69
+ | `var set KEY:=123 -e <env>` | Set typed secret (number/boolean) |
70
+ | `var delete <key> -e <env>` | Delete a variable |
71
+ | `var list -e <env>` | List all variables |
72
+
73
+ **Set syntax**: `=` encrypted secret · `::` plain config · `:=` typed secret
74
+
75
+ ### Sync
76
+
77
+ | Command | Description |
78
+ |:--------|:------------|
79
+ | `sync merge -e <env>` | Bidirectional merge (default) |
80
+ | `sync pull -e <env>` | Download from backend |
81
+ | `sync pull --prune -e <env>` | Download, delete local-only vars |
82
+ | `sync push -e <env>` | Upload to backend |
83
+ | `sync push --prune -e <env>` | Upload, delete remote-only vars |
84
+ | `sync diff -e <env>` | Show differences without changes |
85
+
86
+ ### Export
87
+
88
+ | Command | Description |
89
+ |:--------|:------------|
90
+ | `export shell -e <env>` | Export for shell `eval $(...)` |
91
+ | `export k8s-secret -e <env>` | Generate Kubernetes Secret |
92
+ | `export k8s-configmap -e <env>` | Generate Kubernetes ConfigMap |
93
+ | `export helm -e <env>` | Generate Helm values.yaml |
94
+ | `export terraform -e <env>` | Generate Terraform .tfvars |
95
+ | `export docker -e <env>` | Docker env-file format |
96
+ | `export vercel -e <env>` | Vercel environment JSON |
97
+ | `export github-actions -e <env>` | GitHub Actions secrets |
98
+
99
+ ### Services (monorepo)
100
+
101
+ | Command | Description |
102
+ |:--------|:------------|
103
+ | `service list` | List discovered services |
104
+ | `service init` | Add service to config |
105
+
106
+ ### Audit & Rotation
107
+
108
+ | Command | Description |
109
+ |:--------|:------------|
110
+ | `audit list -e <env>` | List audit entries |
111
+ | `audit stats -e <env>` | Show statistics |
112
+ | `rotation list -e <env>` | Check rotation status |
113
+ | `rotation run -e <env>` | CI/CD gate for overdue secrets |
1155
114
 
1156
- ### GitLab CI
115
+ ### Key Management
1157
116
 
1158
- ```yaml
1159
- stages:
1160
- - deploy
1161
-
1162
- deploy-secrets:
1163
- stage: deploy
1164
- image: node:22-alpine
1165
- script:
1166
- - npx vaulter k8s:secret -e ${CI_ENVIRONMENT_NAME} | kubectl apply -f -
1167
- environment:
1168
- name: $CI_COMMIT_REF_NAME
1169
- rules:
1170
- - if: $CI_COMMIT_BRANCH == "main"
1171
- variables:
1172
- CI_ENVIRONMENT_NAME: prd
1173
- - if: $CI_COMMIT_BRANCH == "develop"
1174
- variables:
1175
- CI_ENVIRONMENT_NAME: dev
1176
- ```
117
+ | Command | Description |
118
+ |:--------|:------------|
119
+ | `key generate --name <n>` | Generate symmetric key |
120
+ | `key generate --name <n> --asymmetric` | Generate RSA/EC key pair |
121
+ | `key list` | List all keys |
122
+ | `key export --name <n>` | Export encrypted bundle |
1177
123
 
1178
- ### Jenkins Pipeline
124
+ > Run `vaulter --help` or `vaulter <command> --help` for all options.
1179
125
 
1180
- ```groovy
1181
- pipeline {
1182
- agent any
126
+ ---
1183
127
 
1184
- environment {
1185
- VAULTER_KEY = credentials('vaulter-key')
1186
- AWS_ACCESS_KEY_ID = credentials('aws-access-key')
1187
- AWS_SECRET_ACCESS_KEY = credentials('aws-secret-key')
1188
- }
128
+ ## Security
1189
129
 
1190
- stages {
1191
- stage('Deploy Secrets') {
1192
- steps {
1193
- sh 'npx vaulter k8s:secret -e prd | kubectl apply -f -'
1194
- }
1195
- }
1196
- }
1197
- }
1198
- ```
130
+ Every secret is encrypted **before** leaving your machine using **AES-256-GCM**.
1199
131
 
1200
- ### Docker Integration
132
+ ### Symmetric (Default)
1201
133
 
1202
134
  ```bash
1203
- # Recommended: Use --env-file for production (handles all values safely)
1204
- vaulter export -e prd --format=env > .env.prd
1205
- docker run --env-file .env.prd myapp
1206
-
1207
- # For simple values only: command substitution (no spaces/newlines in values)
1208
- docker run $(vaulter export -e prd --format=docker-args) myapp
135
+ vaulter key generate --name master
1209
136
  ```
1210
137
 
1211
- > **Note**: The `docker-args` format outputs `-e "KEY=VALUE"` flags. Due to shell word-splitting,
1212
- > values containing spaces or special characters won't work correctly with `$(...)` substitution.
1213
- > Use `--env-file` for complex values or production deployments.
1214
-
1215
- For `docker build` with build args, use shell format:
1216
-
1217
- ```bash
1218
- # Export to shell and use in build
1219
- eval $(vaulter export -e prd)
1220
- docker build \
1221
- --build-arg DATABASE_URL="$DATABASE_URL" \
1222
- --build-arg API_KEY="$API_KEY" \
1223
- -t myapp .
1224
- ```
138
+ ### Asymmetric (RSA/EC)
1225
139
 
1226
- ### Terraform Integration
140
+ For CI/CD separation: public key encrypts, private key decrypts.
1227
141
 
1228
142
  ```bash
1229
- # Generate tfvars
1230
- vaulter tf:vars -e prd > secrets.auto.tfvars
1231
-
1232
- # Or inline
1233
- terraform plan -var-file=<(vaulter tf:vars -e prd)
143
+ vaulter key generate --name master --asymmetric # RSA-4096
144
+ vaulter key generate --name master --asym --alg ec-p256 # EC P-256
1234
145
  ```
1235
146
 
1236
- ### Helm Integration
1237
-
1238
- ```bash
1239
- # Upgrade with secrets as values
1240
- vaulter helm:values -e prd | helm upgrade myapp ./chart -f -
1241
-
1242
- # Or save to file
1243
- vaulter helm:values -e prd > values.secrets.yaml
1244
- helm upgrade myapp ./chart -f values.yaml -f values.secrets.yaml
147
+ ```yaml
148
+ # .vaulter/config.yaml
149
+ encryption:
150
+ mode: asymmetric
151
+ asymmetric:
152
+ algorithm: rsa-4096
153
+ key_name: master # ~/.vaulter/projects/<project>/keys/master[.pub]
1245
154
  ```
1246
155
 
1247
- ### Shell Aliases (Development)
1248
-
1249
- ```bash
1250
- # Add to ~/.bashrc or ~/.zshrc
1251
- alias vdev='eval $(vaulter export -e dev)'
1252
- alias vstg='eval $(vaulter export -e stg)'
1253
- alias vprd='eval $(vaulter export -e prd)'
1254
-
1255
- # Usage
1256
- vdev npm run dev
1257
- vstg npm run test:integration
1258
- ```
156
+ **CI/CD**: Give CI only the public key (can write, can't read). Production gets the private key.
1259
157
 
1260
158
  ---
1261
159
 
1262
160
  ## Configuration
1263
161
 
1264
- ### Basic Config
1265
-
1266
162
  ```yaml
1267
163
  # .vaulter/config.yaml
1268
164
  version: "1"
1269
-
1270
165
  project: my-project
1271
- service: api # optional, for monorepos
1272
166
 
1273
167
  backend:
1274
168
  url: s3://bucket/envs?region=us-east-1
1275
- # Or multiple with fallback
1276
- urls:
1277
- - s3://bucket/envs?region=us-east-1
1278
- - file:///home/user/.vaulter-store
1279
169
 
1280
170
  encryption:
1281
171
  key_source:
1282
172
  - env: VAULTER_KEY
1283
173
  - file: .vaulter/.key
1284
- # Secret rotation settings
1285
174
  rotation:
1286
175
  enabled: true
1287
176
  interval_days: 90
1288
- patterns:
1289
- - "*_KEY"
1290
- - "*_SECRET"
1291
- - "*_TOKEN"
177
+ patterns: ["*_KEY", "*_SECRET", "*_TOKEN"]
178
+
179
+ environments: [dev, stg, prd]
180
+ default_environment: dev
1292
181
 
1293
- # Audit logging
1294
182
  audit:
1295
183
  enabled: true
1296
184
  retention_days: 90
1297
-
1298
- environments:
1299
- - dev
1300
- - stg
1301
- - prd
1302
-
1303
- default_environment: dev
1304
- ```
1305
-
1306
- ### Directory Modes
1307
-
1308
- #### Unified Mode (Default)
1309
-
1310
- ```
1311
- my-project/
1312
- ├── .vaulter/
1313
- │ ├── config.yaml
1314
- │ └── environments/
1315
- │ ├── dev.env
1316
- │ ├── stg.env
1317
- │ └── prd.env
1318
- ```
1319
-
1320
- #### Split Mode
1321
-
1322
- Separates configs (committable) from secrets (gitignored):
1323
-
1324
- ```
1325
- my-project/
1326
- ├── .vaulter/config.yaml
1327
- └── deploy/
1328
- ├── configs/ # ✅ Committable (PORT, HOST, LOG_LEVEL)
1329
- │ ├── dev.env
1330
- │ └── prd.env
1331
- └── secrets/ # ❌ Gitignored (DATABASE_URL, API_KEY)
1332
- ├── dev.env
1333
- └── prd.env
1334
- ```
1335
-
1336
- ```yaml
1337
- directories:
1338
- mode: split
1339
- configs: deploy/configs
1340
- secrets: deploy/secrets
1341
185
  ```
1342
186
 
1343
- Initialize with: `vaulter init --split`
1344
-
1345
187
  ### Backend URLs
1346
188
 
1347
- | Provider | URL Format |
1348
- |:---------|:-----------|
189
+ | Provider | URL |
190
+ |:---------|:----|
1349
191
  | AWS S3 | `s3://bucket/path?region=us-east-1` |
1350
- | AWS S3 + Profile | `s3://bucket/path?profile=myprofile` |
1351
192
  | MinIO | `http://KEY:SECRET@localhost:9000/bucket` |
1352
193
  | Cloudflare R2 | `https://KEY:SECRET@ACCOUNT.r2.cloudflarestorage.com/bucket` |
1353
- | DigitalOcean Spaces | `https://KEY:SECRET@nyc3.digitaloceanspaces.com/bucket` |
1354
- | Backblaze B2 | `https://KEY:SECRET@s3.us-west-002.backblazeb2.com/bucket` |
194
+ | DigitalOcean | `https://KEY:SECRET@nyc3.digitaloceanspaces.com/bucket` |
1355
195
  | FileSystem | `file:///path/to/storage` |
1356
- | Memory | `memory://bucket-name` |
1357
-
1358
- ---
1359
196
 
1360
- ## Integrations
197
+ ### Split Mode
1361
198
 
1362
- ### Kubernetes
199
+ Separate configs (committable) from secrets (gitignored):
1363
200
 
1364
201
  ```bash
1365
- # Deploy Secret
1366
- vaulter k8s:secret -e prd -n my-namespace | kubectl apply -f -
202
+ vaulter init --split
203
+ ```
1367
204
 
1368
- # Deploy ConfigMap
1369
- vaulter k8s:configmap -e prd | kubectl apply -f -
205
+ ```
206
+ deploy/
207
+ ├── configs/ # Committable (PORT, HOST)
208
+ └── secrets/ # Gitignored (DATABASE_URL, API_KEY)
1370
209
  ```
1371
210
 
1372
- Note: Custom secret/configmap names are configured in `.vaulter/config.yaml`:
211
+ ---
1373
212
 
1374
- ```yaml
1375
- integrations:
1376
- kubernetes:
1377
- secret_name: my-app-secrets
1378
- configmap_name: my-app-config
1379
- ```
213
+ ## CI/CD
1380
214
 
1381
- ### Helm
215
+ ### GitHub Actions
1382
216
 
1383
- ```bash
1384
- # Pass as values
1385
- vaulter helm:values -e prd | helm upgrade myapp ./chart -f -
217
+ ```yaml
218
+ name: Deploy
219
+ on:
220
+ push:
221
+ branches: [main]
1386
222
 
1387
- # Save to file
1388
- vaulter helm:values -e prd > values.secrets.yaml
223
+ jobs:
224
+ deploy:
225
+ runs-on: ubuntu-latest
226
+ steps:
227
+ - uses: actions/checkout@v4
228
+ - name: Deploy secrets
229
+ env:
230
+ VAULTER_KEY: ${{ secrets.VAULTER_KEY }}
231
+ AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
232
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
233
+ run: npx vaulter export k8s-secret -e prd | kubectl apply -f -
1389
234
  ```
1390
235
 
1391
- ### Terraform
236
+ ### Other Platforms
1392
237
 
1393
238
  ```bash
1394
- # Generate tfvars
1395
- vaulter tf:vars -e prd > terraform.tfvars
239
+ # GitLab CI
240
+ npx vaulter export k8s-secret -e ${CI_ENVIRONMENT_NAME} | kubectl apply -f -
241
+
242
+ # Docker
243
+ vaulter export docker -e prd > .env.prd && docker run --env-file .env.prd myapp
1396
244
 
1397
- # Generate JSON
1398
- vaulter tf:json -e prd > terraform.tfvars.json
245
+ # Terraform
246
+ vaulter export terraform -e prd > secrets.auto.tfvars
247
+
248
+ # Helm
249
+ vaulter export helm -e prd | helm upgrade myapp ./chart -f -
1399
250
  ```
1400
251
 
1401
252
  ---
1402
253
 
1403
254
  ## Monorepo Support
1404
255
 
1405
- Vaulter auto-detects all major monorepo tools:
1406
-
1407
- | Tool | Detection File | Workspace Config |
1408
- |:-----|:---------------|:-----------------|
1409
- | NX | `nx.json` | `workspaceLayout` |
1410
- | Turborepo | `turbo.json` | Uses pnpm/yarn workspaces |
1411
- | Lerna | `lerna.json` | `packages` array |
1412
- | pnpm | `pnpm-workspace.yaml` | `packages` array |
1413
- | Yarn | `package.json` | `workspaces` field |
1414
- | Rush | `rush.json` | `projects[].projectFolder` |
1415
-
1416
- ### Scan Command
1417
-
1418
- ```bash
1419
- # Discover all packages
1420
- vaulter scan
1421
-
1422
- # Output:
1423
- # Monorepo: NX
1424
- # Found 17 package(s):
1425
- # ✓ Initialized: 3
1426
- # ○ Not initialized: 14
1427
- # 📄 With .env files: 11
1428
- ```
1429
-
1430
- ### Batch Operations
256
+ Auto-detects NX, Turborepo, Lerna, pnpm, Yarn workspaces, Rush.
1431
257
 
1432
258
  ```bash
1433
- # Sync all services
1434
- vaulter sync -e dev --all
1435
-
1436
- # Sync specific services
1437
- vaulter sync -e dev -s api,worker
259
+ vaulter service list # List discovered services
260
+ vaulter sync push -e dev -s api # Push specific service
261
+ vaulter sync push -e dev --shared # Push shared variables
262
+ vaulter export shell -e dev --shared # Export shared variables
1438
263
  ```
1439
264
 
1440
265
  ---
@@ -1444,254 +269,89 @@ vaulter sync -e dev -s api,worker
1444
269
  ```typescript
1445
270
  import { VaulterClient, loadConfig } from 'vaulter'
1446
271
 
1447
- const config = loadConfig()
1448
- const client = new VaulterClient({ config })
1449
-
272
+ const client = new VaulterClient({ config: loadConfig() })
1450
273
  await client.connect()
1451
274
 
1452
- // CRUD operations
1453
- const value = await client.get('DATABASE_URL', 'my-project', 'prd')
1454
275
  await client.set({ key: 'API_KEY', value: 'sk-xxx', project: 'my-project', environment: 'prd' })
276
+ const value = await client.get('API_KEY', 'my-project', 'prd')
1455
277
  const vars = await client.list({ project: 'my-project', environment: 'prd' })
1456
278
 
1457
279
  await client.disconnect()
1458
280
  ```
1459
281
 
1460
- ### Dotenv Compatible
282
+ ### Auto-load (dotenv compatible)
1461
283
 
1462
284
  ```typescript
1463
- // Auto-load .env into process.env
1464
- import 'vaulter/load'
1465
-
1466
- // Or with options
1467
- import { loader } from 'vaulter'
1468
- loader({ path: '.env.local', override: true })
285
+ import 'vaulter/load' // Auto-loads .env into process.env
1469
286
  ```
1470
287
 
1471
288
  ---
1472
289
 
1473
290
  ## MCP Server
1474
291
 
1475
- Vaulter includes a **Model Context Protocol (MCP)** server for AI assistant integration.
1476
-
1477
- ### Setup
292
+ Claude AI integration via Model Context Protocol.
1478
293
 
1479
294
  ```bash
1480
- # Start server
1481
295
  vaulter mcp
1482
-
1483
- # Test with MCP Inspector
1484
- npx @anthropic-ai/mcp-inspector vaulter mcp
1485
296
  ```
1486
297
 
1487
- ### Claude Desktop Config
298
+ ### Claude Desktop
1488
299
 
1489
300
  ```json
1490
301
  {
1491
302
  "mcpServers": {
1492
303
  "vaulter": {
1493
304
  "command": "vaulter",
1494
- "args": ["mcp"]
305
+ "args": ["mcp", "--cwd", "/path/to/project"]
1495
306
  }
1496
307
  }
1497
308
  }
1498
309
  ```
1499
310
 
1500
- ### MCP Configuration
1501
-
1502
- The MCP server uses a priority chain to resolve defaults:
1503
-
1504
- 1. **Tool arguments** (explicit in each call)
1505
- 2. **Project config** (`.vaulter/config.yaml`)
1506
- 3. **Project MCP config** (`.vaulter/config.yaml` → `mcp:` section)
1507
- 4. **Global MCP config** (`~/.vaulter/config.yaml` → `mcp:` section)
1508
- 5. **Hardcoded defaults**
1509
-
1510
- #### Project MCP Defaults
1511
-
1512
- Add an `mcp:` section to your project's `.vaulter/config.yaml`:
1513
-
1514
- ```yaml
1515
- # .vaulter/config.yaml
1516
- version: "1"
1517
- project: my-project
1518
-
1519
- backend:
1520
- url: s3://bucket/envs?region=us-east-1
1521
-
1522
- # MCP defaults (used when MCP server runs in this project)
1523
- mcp:
1524
- default_backend: s3://bucket/envs?region=us-east-1
1525
- default_project: my-project
1526
- default_environment: dev
1527
- default_key: master # Key name for encryption
1528
- ```
1529
-
1530
- #### Global MCP Defaults
1531
-
1532
- For MCP clients that don't support `cwd`, create `~/.vaulter/config.yaml`:
1533
-
1534
- ```yaml
1535
- # ~/.vaulter/config.yaml
1536
- mcp:
1537
- default_backend: s3://bucket/envs?region=us-east-1
1538
- default_project: my-project
1539
- default_environment: dev
1540
- default_key: master
1541
- ```
1542
-
1543
- #### Working Directory
311
+ ### Tools
1544
312
 
1545
- MCP clients need to know which project to use. Options:
313
+ | Category | Tools |
314
+ |:---------|:------|
315
+ | **Variables** | `var_get`, `var_set`, `var_delete`, `var_list` |
316
+ | **Sync** | `sync_push`, `sync_pull`, `sync_merge`, `sync_diff` |
317
+ | **Export** | `export_shell`, `export_k8s_secret`, `export_k8s_configmap`, `export_helm`, `export_terraform` |
318
+ | **Discovery** | `compare`, `search`, `services`, `init` |
319
+ | **Keys** | `key_generate`, `key_list`, `key_show`, `key_export`, `key_import` |
320
+ | **Audit** | `audit_list`, `audit_stats` |
321
+ | **Rotation** | `rotation_list`, `rotation_run` |
1546
322
 
1547
- ```json
1548
- {
1549
- "mcpServers": {
1550
- "vaulter": {
1551
- "command": "vaulter",
1552
- "args": ["mcp", "--cwd", "/path/to/project"]
1553
- }
1554
- }
1555
- }
1556
- ```
323
+ ### Resources (4)
1557
324
 
1558
- Or use the `VAULTER_CWD` environment variable:
325
+ Static data views (no input required). For actions with parameters, use tools.
1559
326
 
1560
- ```json
1561
- {
1562
- "mcpServers": {
1563
- "vaulter": {
1564
- "command": "vaulter",
1565
- "args": ["mcp"],
1566
- "env": {
1567
- "VAULTER_CWD": "/path/to/project"
1568
- }
1569
- }
1570
- }
1571
- }
1572
- ```
327
+ | URI | Description |
328
+ |:----|:------------|
329
+ | `vaulter://instructions` | **Read first!** How vaulter stores data |
330
+ | `vaulter://mcp-config` | MCP settings sources |
331
+ | `vaulter://config` | Project configuration (YAML) |
332
+ | `vaulter://services` | Monorepo services list |
1573
333
 
1574
- ### Debugging MCP Configuration
334
+ ---
1575
335
 
1576
- With multiple config levels (project, global, CLI), it can be confusing to know WHERE each setting comes from. Use the `vaulter://mcp-config` resource to see exactly which config file provided each value:
336
+ ## TUI (Terminal Interface)
1577
337
 
1578
338
  ```bash
1579
- # In MCP client, read the resource:
1580
- vaulter://mcp-config
1581
- ```
1582
-
1583
- **Example output:**
1584
- ```json
1585
- {
1586
- "summary": "MCP Configuration Sources - shows WHERE each setting was loaded from",
1587
- "settings": {
1588
- "backend": {
1589
- "value": "s3://my-bucket/envs",
1590
- "source": "project",
1591
- "sourceDescription": "Project config (.vaulter/config.yaml)"
1592
- },
1593
- "project": {
1594
- "value": "my-project",
1595
- "source": "project.mcp",
1596
- "sourceDescription": "Project MCP defaults (.vaulter/config.yaml → mcp section)"
1597
- },
1598
- "environment": {
1599
- "value": "dev",
1600
- "source": "global.mcp",
1601
- "sourceDescription": "Global MCP defaults (~/.vaulter/config.yaml → mcp section)"
1602
- }
1603
- },
1604
- "configFiles": {
1605
- "projectConfig": "/home/user/project/.vaulter/config.yaml",
1606
- "globalConfig": "/home/user/.vaulter/config.yaml"
1607
- }
1608
- }
339
+ vaulter tui # Menu
340
+ vaulter tui dashboard # Secrets dashboard
341
+ vaulter tui audit # Audit log viewer
342
+ vaulter tui keys # Key manager
1609
343
  ```
1610
344
 
1611
- **Config Sources:**
1612
-
1613
- | Source | Description |
1614
- |:-------|:------------|
1615
- | `cli` | CLI flag (`--backend`, `--project`, etc.) |
1616
- | `project` | Project config (`.vaulter/config.yaml`) |
1617
- | `project.mcp` | Project MCP defaults (`.vaulter/config.yaml` → `mcp:` section) |
1618
- | `global.mcp` | Global MCP defaults (`~/.vaulter/config.yaml` → `mcp:` section) |
1619
- | `default` | Built-in default value |
345
+ ### Shortcuts
1620
346
 
1621
- **Verbose Startup:**
1622
-
1623
- For CLI debugging, use the `--verbose` flag to see config sources on startup:
1624
-
1625
- ```bash
1626
- vaulter mcp --verbose
1627
- ```
347
+ **Global**: `q` quit · `ESC` back · `↑↓` navigate
1628
348
 
1629
- ### Available Tools (22)
1630
-
1631
- #### Core Operations
1632
-
1633
- | Tool | Description |
1634
- |:-----|:------------|
1635
- | `vaulter_get` | Get a variable |
1636
- | `vaulter_set` | Set a variable |
1637
- | `vaulter_delete` | Delete a variable |
1638
- | `vaulter_list` | List variables |
1639
- | `vaulter_export` | Export in various formats (shell, env, json, yaml, tfvars, docker-args) |
1640
- | `vaulter_sync` | Bidirectional sync |
1641
- | `vaulter_pull` | Download from backend |
1642
- | `vaulter_push` | Upload to backend |
1643
-
1644
- #### Discovery & Analysis
1645
-
1646
- | Tool | Description |
1647
- |:-----|:------------|
1648
- | `vaulter_compare` | Compare environments |
1649
- | `vaulter_search` | Search by pattern |
1650
- | `vaulter_scan` | Scan monorepo |
1651
- | `vaulter_services` | List services |
1652
- | `vaulter_init` | Initialize project |
1653
-
1654
- #### Integrations
1655
-
1656
- | Tool | Description |
1657
- |:-----|:------------|
1658
- | `vaulter_k8s_secret` | Generate K8s Secret |
1659
- | `vaulter_k8s_configmap` | Generate K8s ConfigMap |
1660
- | `vaulter_helm_values` | Generate Helm values.yaml |
1661
- | `vaulter_tf_vars` | Generate Terraform .tfvars |
1662
-
1663
- #### Key Management
1664
-
1665
- | Tool | Description |
1666
- |:-----|:------------|
1667
- | `vaulter_key_generate` | Generate encryption key (symmetric or asymmetric) |
1668
- | `vaulter_key_list` | List all keys (project + global) |
1669
- | `vaulter_key_show` | Show key details |
1670
- | `vaulter_key_export` | Export key to encrypted bundle |
1671
- | `vaulter_key_import` | Import key from encrypted bundle |
1672
-
1673
- ### Resources (10)
1674
-
1675
- | URI Pattern | Description |
1676
- |:------------|:------------|
1677
- | `vaulter://instructions` | ⚠️ **CRITICAL**: How vaulter stores data (read first!) |
1678
- | `vaulter://mcp-config` | 🔍 Shows WHERE each MCP setting comes from |
1679
- | `vaulter://config` | Project configuration |
1680
- | `vaulter://services` | Monorepo services |
1681
- | `vaulter://keys` | List all encryption keys |
1682
- | `vaulter://keys/<name>` | Specific key details |
1683
- | `vaulter://keys/global/<name>` | Global key details |
1684
- | `vaulter://project/env` | Environment variables |
1685
- | `vaulter://project/env/service` | Service-specific vars |
1686
- | `vaulter://compare/env1/env2` | Environment diff
1687
-
1688
- ### Prompts (5)
1689
-
1690
- - `setup_project` — Initialize a new project
1691
- - `migrate_dotenv` — Migrate existing .env
1692
- - `deploy_secrets` — Deploy to Kubernetes
1693
- - `compare_environments` — Compare two environments
1694
- - `security_audit` — Audit for security issues
349
+ | Screen | Shortcuts |
350
+ |:-------|:----------|
351
+ | Menu | `1` `2` `3` quick access to screens |
352
+ | Dashboard | `r` refresh · `v` toggle values · `e` cycle env |
353
+ | Audit | `o` filter op · `s` filter source · `/` search · `c` clear |
354
+ | Keys | `r` refresh · `c` toggle config |
1695
355
 
1696
356
  ---
1697
357
 
@@ -1701,10 +361,8 @@ Download from [Releases](https://github.com/forattini-dev/vaulter/releases):
1701
361
 
1702
362
  | Platform | Binary |
1703
363
  |:---------|:-------|
1704
- | Linux x64 | `vaulter-linux-x64` |
1705
- | Linux ARM64 | `vaulter-linux-arm64` |
1706
- | macOS x64 | `vaulter-macos-x64` |
1707
- | macOS ARM64 | `vaulter-macos-arm64` |
364
+ | Linux x64/ARM64 | `vaulter-linux-x64`, `vaulter-linux-arm64` |
365
+ | macOS x64/ARM64 | `vaulter-macos-x64`, `vaulter-macos-arm64` |
1708
366
  | Windows x64 | `vaulter-win-x64.exe` |
1709
367
 
1710
368
  ---