everything-gemini 1.8.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/CONTRIBUTING.md +5 -0
- package/README.md +17 -8
- package/agents/platform-engineer.md +33 -0
- package/bin/everything-gemini +272 -18
- package/docs/architecture/progressive-disclosure.md +3 -3
- package/docs/index.html +14 -5
- package/examples/python-sdk/README.md +4 -0
- package/examples/python-sdk/platform_provisioning_pipeline.py +193 -0
- package/mcp/README.md +1 -0
- package/mcp/mcp_config.example.json +4 -0
- package/package.json +1 -1
- package/scripts/validate.sh +1 -1
- package/skills/cloudflare-r2-object-storage/SKILL.md +143 -0
- package/skills/distributed-rate-limiting/SKILL.md +138 -0
- package/skills/milvus-vector-clustering/SKILL.md +134 -0
- package/skills/vault-secrets-management/SKILL.md +129 -0
- package/templates/full-power/mcp_config.json +4 -0
- package/tests/cli.test.js +75 -11
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vault-secrets-management
|
|
3
|
+
description: >-
|
|
4
|
+
Architects and automates HashiCorp Vault secrets management, AppRole machine authentication, dynamic ephemeral database credentials, and PKI mTLS certificate rotation.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# HashiCorp Vault Secrets Management & Ephemeral Credentials
|
|
8
|
+
|
|
9
|
+
This skill guides the design, automation, and operational patterns for HashiCorp Vault enterprise secrets orchestration, dynamic credential generation, and PKI certificate authority workflows.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## ⚡ Secret Engine Capabilities Matrix
|
|
14
|
+
|
|
15
|
+
| Secret Engine | Purpose | Lifecycle Behavior |
|
|
16
|
+
| :--- | :--- | :--- |
|
|
17
|
+
| **`kv-v2`** | Static credentials & API keys | Versioned key-value store with soft delete and rollback. |
|
|
18
|
+
| **`database`** | Ephemeral DB access (Postgres, MySQL) | Generates short-lived user credentials and revokes upon lease expiry. |
|
|
19
|
+
| **`pki`** | Internal mTLS & TLS certificates | Acts as CA/sub-CA; dynamically issues certificates in milliseconds. |
|
|
20
|
+
| **`transit`** | Cryptography as a service | Encrypts/decrypts data without exposing raw encryption keys. |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 🔐 AppRole Machine Authentication Workflow
|
|
25
|
+
|
|
26
|
+
Applications authenticate using decoupled `role_id` and short-lived `secret_id`:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# 1. Enable AppRole auth method
|
|
30
|
+
vault auth enable approle
|
|
31
|
+
|
|
32
|
+
# 2. Configure service role with strict CIDR and token policies
|
|
33
|
+
vault write auth/approle/role/api-service \
|
|
34
|
+
secret_id_ttl=60m \
|
|
35
|
+
token_ttl=30m \
|
|
36
|
+
token_max_ttl=4h \
|
|
37
|
+
secret_id_num_uses=10 \
|
|
38
|
+
token_policies="api-service-policy" \
|
|
39
|
+
bind_secret_id=true
|
|
40
|
+
|
|
41
|
+
# 3. Retrieve Role ID (stored in deployment manifest)
|
|
42
|
+
vault read auth/approle/role/api-service/role-id
|
|
43
|
+
|
|
44
|
+
# 4. Generate Secret ID (delivered securely via CI/CD or orchestrator)
|
|
45
|
+
vault write -f auth/approle/role/api-service/secret-id
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Node.js / Python authentication client:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import axios from 'axios';
|
|
52
|
+
|
|
53
|
+
export async function loginWithAppRole(vaultAddr: string, roleId: string, secretId: string) {
|
|
54
|
+
const response = await axios.post(`${vaultAddr}/v1/auth/approle/login`, {
|
|
55
|
+
role_id: roleId,
|
|
56
|
+
secret_id: secretId,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const clientToken = response.data.auth.client_token;
|
|
60
|
+
const leaseDuration = response.data.auth.lease_duration;
|
|
61
|
+
return { clientToken, leaseDuration };
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## ⏳ Dynamic Ephemeral Database Credentials
|
|
68
|
+
|
|
69
|
+
Configure Vault to create temporary, unique PostgreSQL roles for each application instance:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# 1. Mount database engine
|
|
73
|
+
vault secrets enable database
|
|
74
|
+
|
|
75
|
+
# 2. Configure connection to PostgreSQL
|
|
76
|
+
vault write database/config/production-postgres \
|
|
77
|
+
plugin_name=postgresql-database-plugin \
|
|
78
|
+
allowed_roles="readwrite-service" \
|
|
79
|
+
connection_url="postgresql://{{username}}:{{password}}@postgres:5432/production?sslmode=verify-full" \
|
|
80
|
+
username="vaultadmin" \
|
|
81
|
+
password="supersecretadminpassword"
|
|
82
|
+
|
|
83
|
+
# 3. Define role template with automated role creation SQL
|
|
84
|
+
vault write database/roles/readwrite-service \
|
|
85
|
+
db_name=production-postgres \
|
|
86
|
+
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
|
|
87
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
|
|
88
|
+
default_ttl="1h" \
|
|
89
|
+
max_ttl="24h"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Application requests credentials on demand:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
vault read database/creds/readwrite-service
|
|
96
|
+
# Returns: username: v-approle-readwrite-abc123, password: xyz..., lease_id: database/creds/readwrite-service/xyz...
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 📜 PKI Dynamic mTLS Certificate Issuance
|
|
102
|
+
|
|
103
|
+
Automate TLS certificate issuance without manual CSR handling:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Mount PKI engine and configure Root/Intermediate CA
|
|
107
|
+
vault secrets enable pki
|
|
108
|
+
vault secrets tune -max-lease-ttl=87600h pki
|
|
109
|
+
|
|
110
|
+
# Configure role for cluster services
|
|
111
|
+
vault write pki/roles/internal-mesh \
|
|
112
|
+
allowed_domains="internal.cluster.local" \
|
|
113
|
+
allow_subdomains=true \
|
|
114
|
+
max_ttl="72h"
|
|
115
|
+
|
|
116
|
+
# Generate certificate on demand
|
|
117
|
+
vault write pki/issue/internal-mesh \
|
|
118
|
+
common_name="billing-service.internal.cluster.local" \
|
|
119
|
+
ttl="24h"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 📋 Architectural Rules & Best Practices
|
|
125
|
+
|
|
126
|
+
1. **Never Hardcode Secrets**: Eliminate long-lived static DB passwords; adopt dynamic ephemeral database roles with short TTLs (< 2 hours).
|
|
127
|
+
2. **Strict Secret ID Binding**: Bind AppRole `secret_id` to expected subnet CIDRs (`secret_id_bound_cidrs`) to stop credential theft across VPCs.
|
|
128
|
+
3. **Lease Renewal & Heartbeats**: Background workers must periodically renew active leases (`vault write sys/leases/renew lease_id=...`) before expiry.
|
|
129
|
+
4. **Audit Logging**: Enable Vault audit devices (`vault audit enable file file_path=/var/log/vault/audit.log`) with hashed payload sanitization.
|
package/tests/cli.test.js
CHANGED
|
@@ -90,9 +90,9 @@ it('should benchmark ecosystem components and output valid JSON with --json', ()
|
|
|
90
90
|
const res = runCli('benchmark --json');
|
|
91
91
|
assert.strictEqual(res.status, 0);
|
|
92
92
|
const data = JSON.parse(res.stdout);
|
|
93
|
-
assert.strictEqual(data.totalComponents,
|
|
94
|
-
assert.strictEqual(data.progressiveSkillsCount,
|
|
95
|
-
assert.strictEqual(data.scopedAgentsCount,
|
|
93
|
+
assert.strictEqual(data.totalComponents, 75);
|
|
94
|
+
assert.strictEqual(data.progressiveSkillsCount, 56);
|
|
95
|
+
assert.strictEqual(data.scopedAgentsCount, 12);
|
|
96
96
|
assert.strictEqual(data.lifecycleHooksCount, 7);
|
|
97
97
|
assert(data.totalRunbookTokens > 15000, 'Expected >15,000 runbook tokens');
|
|
98
98
|
assert(data.estimatedTokensSavedPerTurn > 8000, 'Expected significant token savings');
|
|
@@ -316,7 +316,7 @@ try {
|
|
|
316
316
|
const dryRes = runCli(`bundle --output "${bundleTarget}" --dry-run`);
|
|
317
317
|
assert.strictEqual(dryRes.status, 0);
|
|
318
318
|
assert.match(dryRes.stdout, /DRY RUN MODE ACTIVATED/);
|
|
319
|
-
assert.match(dryRes.stdout, /Skills to bundle:
|
|
319
|
+
assert.match(dryRes.stdout, /Skills to bundle: 56/);
|
|
320
320
|
assert.strictEqual(fs.existsSync(bundleTarget), false, 'Dry run should not create destination directory');
|
|
321
321
|
|
|
322
322
|
// JSON Dry-run mode
|
|
@@ -324,7 +324,7 @@ try {
|
|
|
324
324
|
assert.strictEqual(jsonRes.status, 0);
|
|
325
325
|
const dryData = JSON.parse(jsonRes.stdout);
|
|
326
326
|
assert.strictEqual(dryData.dryRun, true);
|
|
327
|
-
assert.strictEqual(dryData.manifest.components.totalCount,
|
|
327
|
+
assert.strictEqual(dryData.manifest.components.totalCount, 75);
|
|
328
328
|
|
|
329
329
|
// Live mode
|
|
330
330
|
const liveRes = runCli(`bundle --output "${bundleTarget}"`);
|
|
@@ -332,8 +332,49 @@ try {
|
|
|
332
332
|
assert.match(liveRes.stdout, /Offline Distribution Bundle Created/);
|
|
333
333
|
assert.strictEqual(fs.existsSync(path.join(bundleTarget, 'bundle-manifest.json')), true);
|
|
334
334
|
assert.strictEqual(fs.existsSync(path.join(bundleTarget, 'offline-install.sh')), true);
|
|
335
|
-
assert.strictEqual(fs.existsSync(path.join(bundleTarget, 'skills', '
|
|
336
|
-
assert.strictEqual(fs.existsSync(path.join(bundleTarget, 'agents', '
|
|
335
|
+
assert.strictEqual(fs.existsSync(path.join(bundleTarget, 'skills', 'milvus-vector-clustering')), true);
|
|
336
|
+
assert.strictEqual(fs.existsSync(path.join(bundleTarget, 'agents', 'platform-engineer.md')), true);
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
// Scaffold Command
|
|
340
|
+
it('should scaffold skill, agent, and hook in dry-run and live modes', () => {
|
|
341
|
+
const scaffoldWorkspace = path.join(tempWorkspace, 'scaffold-ws');
|
|
342
|
+
|
|
343
|
+
// Skill Dry-run
|
|
344
|
+
const drySkill = runCli(`scaffold skill demo-test-skill --workspace "${scaffoldWorkspace}" --dry-run --json`);
|
|
345
|
+
assert.strictEqual(drySkill.status, 0);
|
|
346
|
+
const drySkillData = JSON.parse(drySkill.stdout);
|
|
347
|
+
assert.strictEqual(drySkillData.isDryRun, true);
|
|
348
|
+
assert.strictEqual(drySkillData.type, 'skill');
|
|
349
|
+
|
|
350
|
+
// Live Agent Scaffold
|
|
351
|
+
const liveAgent = runCli(`scaffold agent demo-qa-agent --workspace "${scaffoldWorkspace}"`);
|
|
352
|
+
assert.strictEqual(liveAgent.status, 0);
|
|
353
|
+
assert.match(liveAgent.stdout, /Created subagent profile/);
|
|
354
|
+
assert.strictEqual(fs.existsSync(path.join(scaffoldWorkspace, 'agents', 'demo-qa-agent.md')), true);
|
|
355
|
+
|
|
356
|
+
// Live Hook Scaffold
|
|
357
|
+
const liveHook = runCli(`scaffold hook demo-safety --workspace "${scaffoldWorkspace}"`);
|
|
358
|
+
assert.strictEqual(liveHook.status, 0);
|
|
359
|
+
assert.match(liveHook.stdout, /Created lifecycle hook/);
|
|
360
|
+
assert.strictEqual(fs.existsSync(path.join(scaffoldWorkspace, 'hooks', 'demo-safety', 'hooks.json')), true);
|
|
361
|
+
assert.strictEqual(fs.existsSync(path.join(scaffoldWorkspace, 'hooks', 'demo-safety', 'scripts', 'demo-safety-gate.sh')), true);
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
// Sync Command
|
|
365
|
+
it('should synchronize workspace with sync command in dry-run and live modes', () => {
|
|
366
|
+
// Dry-run
|
|
367
|
+
const drySync = runCli(`sync --workspace "${tempWorkspace}" --dry-run`);
|
|
368
|
+
assert.strictEqual(drySync.status, 0);
|
|
369
|
+
assert.match(drySync.stdout, /DRY RUN MODE ACTIVATED/);
|
|
370
|
+
assert.match(drySync.stdout, /Synchronizing Workspace with Catalog/);
|
|
371
|
+
|
|
372
|
+
// JSON Dry-run
|
|
373
|
+
const jsonSync = runCli(`sync --workspace "${tempWorkspace}" --dry-run --json`);
|
|
374
|
+
assert.strictEqual(jsonSync.status, 0);
|
|
375
|
+
const syncData = JSON.parse(jsonSync.stdout);
|
|
376
|
+
assert.strictEqual(syncData.isDryRun, true);
|
|
377
|
+
assert.strictEqual(syncData.success, true);
|
|
337
378
|
});
|
|
338
379
|
|
|
339
380
|
// Info for incident-responder and v1.8.0 skills
|
|
@@ -359,14 +400,37 @@ try {
|
|
|
359
400
|
assert.match(resLite.stdout, /LiteLLM/);
|
|
360
401
|
});
|
|
361
402
|
|
|
403
|
+
// Info for platform-engineer and v1.9.0 skills
|
|
404
|
+
it('should display info for platform-engineer subagent and v1.9.0 skills', () => {
|
|
405
|
+
const resPlat = runCli('info platform-engineer');
|
|
406
|
+
assert.strictEqual(resPlat.status, 0);
|
|
407
|
+
assert.match(resPlat.stdout, /Platform Engineer/);
|
|
408
|
+
|
|
409
|
+
const resMilvus = runCli('info milvus-vector-clustering');
|
|
410
|
+
assert.strictEqual(resMilvus.status, 0);
|
|
411
|
+
assert.match(resMilvus.stdout, /Milvus/);
|
|
412
|
+
|
|
413
|
+
const resR2 = runCli('info cloudflare-r2-object-storage');
|
|
414
|
+
assert.strictEqual(resR2.status, 0);
|
|
415
|
+
assert.match(resR2.stdout, /Cloudflare R2/);
|
|
416
|
+
|
|
417
|
+
const resVault = runCli('info vault-secrets-management');
|
|
418
|
+
assert.strictEqual(resVault.status, 0);
|
|
419
|
+
assert.match(resVault.stdout, /Vault/);
|
|
420
|
+
|
|
421
|
+
const resRate = runCli('info distributed-rate-limiting');
|
|
422
|
+
assert.strictEqual(resRate.status, 0);
|
|
423
|
+
assert.match(resRate.stdout, /Distributed Rate Limiting/);
|
|
424
|
+
});
|
|
425
|
+
|
|
362
426
|
// Benchmark Components Verification
|
|
363
|
-
it('should report
|
|
427
|
+
it('should report 75 components, 56 skills, and 12 subagents in benchmark --json', () => {
|
|
364
428
|
const res = runCli('benchmark --json');
|
|
365
429
|
assert.strictEqual(res.status, 0);
|
|
366
430
|
const data = JSON.parse(res.stdout);
|
|
367
|
-
assert.strictEqual(data.totalComponents,
|
|
368
|
-
assert.strictEqual(data.progressiveSkillsCount,
|
|
369
|
-
assert.strictEqual(data.scopedAgentsCount,
|
|
431
|
+
assert.strictEqual(data.totalComponents, 75, 'Total components should be 75');
|
|
432
|
+
assert.strictEqual(data.progressiveSkillsCount, 56, 'Progressive skills should be 56');
|
|
433
|
+
assert.strictEqual(data.scopedAgentsCount, 12, 'Scoped agents should be 12');
|
|
370
434
|
assert.strictEqual(data.lifecycleHooksCount, 7, 'Lifecycle hooks should be 7');
|
|
371
435
|
});
|
|
372
436
|
|