@pleri/olam-cli 0.1.160 → 0.1.162
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 +11 -0
- package/dist/agent-stream/agent-sdk-to-chunks.js +20 -2
- package/dist/commands/bootstrap.d.ts +15 -0
- package/dist/commands/bootstrap.d.ts.map +1 -1
- package/dist/commands/bootstrap.js +58 -5
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/flywheel/migrate-overlays.d.ts +1 -0
- package/dist/commands/flywheel/migrate-overlays.d.ts.map +1 -1
- package/dist/commands/flywheel/migrate-overlays.js +29 -3
- package/dist/commands/flywheel/migrate-overlays.js.map +1 -1
- package/dist/commands/skills-source.d.ts.map +1 -1
- package/dist/commands/skills-source.js +57 -2
- package/dist/commands/skills-source.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +14 -0
- package/dist/commands/skills.js.map +1 -1
- package/dist/image-digests.json +7 -7
- package/dist/index.js +2424 -1781
- package/dist/lib/bootstrap-kubernetes.d.ts +42 -0
- package/dist/lib/bootstrap-kubernetes.d.ts.map +1 -0
- package/dist/lib/bootstrap-kubernetes.js +367 -0
- package/dist/lib/bootstrap-kubernetes.js.map +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +6 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/mcp-server.js +568 -368
- package/hermes-bundle/version.json +1 -1
- package/host-cp/k8s/manifests/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/auth-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/kg-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/mcp-auth-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/memory-service/50-deployment.yaml +1 -1
- package/host-cp/observability/grafana-port-forward.sh +283 -0
- package/host-cp/observability/kyverno-cardinality-mutate.sh +462 -0
- package/host-cp/observability/loki-ingest.sh +253 -0
- package/host-cp/observability/prom-no-double-grafana.sh +311 -0
- package/host-cp/peripheral-services/helm-values/grafana-values.yaml +159 -0
- package/host-cp/peripheral-services/helm-values/kube-prom-stack-values.yaml +229 -0
- package/host-cp/peripheral-services/helm-values/kyverno-values.yaml +85 -0
- package/host-cp/peripheral-services/helm-values/loki-values.yaml +166 -0
- package/host-cp/peripheral-services/helm-values/promtail-staging.yaml +92 -0
- package/host-cp/peripheral-services/helm-values/promtail-values.yaml +102 -0
- package/host-cp/peripheral-services/helm-values/traefik-values.yaml +73 -0
- package/host-cp/peripheral-services/manifests/20-namespace.yaml +6 -0
- package/host-cp/peripheral-services/manifests/24-deploy-kg-service.yaml +245 -0
- package/host-cp/peripheral-services/manifests/30-traefik-ingressroute-host-cp.yaml +22 -0
- package/host-cp/peripheral-services/manifests/40-traefik-ingressroute-kg.yaml +29 -0
- package/host-cp/peripheral-services/manifests/50-traefik-ingressroute-agent-memory.yaml +29 -0
- package/host-cp/peripheral-services/manifests/60-networkpolicy-ingress.yaml +80 -0
- package/host-cp/peripheral-services/manifests/65-networkpolicy-loki-prom-deny.yaml +67 -0
- package/host-cp/peripheral-services/manifests/80-grafana-dashboard-configmap.yaml +1349 -0
- package/host-cp/peripheral-services/manifests/90-prom-alert-cardinality.yaml +50 -0
- package/host-cp/peripheral-services/manifests/91-servicemonitor-host-cp.yaml +70 -0
- package/host-cp/peripheral-services/manifests/92-servicemonitor-kg-service.yaml +70 -0
- package/host-cp/peripheral-services/manifests/93-servicemonitor-memory-service.yaml +87 -0
- package/host-cp/peripheral-services/manifests/95-prom-recording-rules.yaml +108 -0
- package/host-cp/peripheral-services/manifests/96-kyverno-cardinality-mutate.yaml +195 -0
- package/host-cp/src/plan-chat-service.mjs +147 -1
- package/package.json +1 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bootstrap-kubernetes.ts — k3s mode of `olam bootstrap`.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the legacy `scripts/dogfood/up.sh` reference flow into a CLI
|
|
5
|
+
* routine so external operators with only the published `@pleri/olam-cli`
|
|
6
|
+
* tarball (no access to the private `pleri/olam` repo) can bring up an
|
|
7
|
+
* end-to-end olam-on-k3s stack with one command.
|
|
8
|
+
*
|
|
9
|
+
* Steps (idempotent):
|
|
10
|
+
* 0. Preflight — detect required tools (k3d, kubectl, helm, jq, curl,
|
|
11
|
+
* openssl, gh, docker). With --auto-install on macOS, run `brew
|
|
12
|
+
* install` for missing brew-formulae.
|
|
13
|
+
* 1. Secrets — generate `~/.olam/{auth-secret,kg-bearer-token,
|
|
14
|
+
* auth-db-secret,mcp-auth-jwt-secret,memory-bearer-secret}` if absent.
|
|
15
|
+
* 2. Colima (macOS only) — ensure running; chmod /var/run/docker.sock
|
|
16
|
+
* inside the VM (virtiofs mitigation).
|
|
17
|
+
* 3. k3d cluster — create `<cluster>` with the gh-config bind. Skipped
|
|
18
|
+
* if cluster already exists.
|
|
19
|
+
* 4. Observability — chain bundled scripts in `<install>/host-cp/
|
|
20
|
+
* observability/` to install Loki + Promtail + Grafana +
|
|
21
|
+
* kube-prometheus-stack + Kyverno admission policy.
|
|
22
|
+
* 5. Delegate to `olam upgrade -y` — that flow handles namespace + RBAC
|
|
23
|
+
* + secrets + ghcr-pull + host-side docker-socket-proxy +
|
|
24
|
+
* manifest apply + rollout + verify.
|
|
25
|
+
*
|
|
26
|
+
* Note: `olam upgrade` already ships the 8-step k8s flow in
|
|
27
|
+
* `upgrade-kubernetes.ts` (Phase 1b C2 + Phase 2 C/D). This module is
|
|
28
|
+
* the prereq + cluster-create + observability wrapper around it.
|
|
29
|
+
*/
|
|
30
|
+
export declare const DEFAULT_K3S_CLUSTER = "olam-host";
|
|
31
|
+
export interface BootstrapKubernetesOptions {
|
|
32
|
+
readonly cluster: string;
|
|
33
|
+
readonly autoInstall: boolean;
|
|
34
|
+
readonly skipObservability: boolean;
|
|
35
|
+
readonly skipClusterCreate: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface BootstrapKubernetesResult {
|
|
38
|
+
readonly exitCode: number;
|
|
39
|
+
readonly summary: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function runBootstrapKubernetes(rawOpts: Partial<BootstrapKubernetesOptions>): Promise<BootstrapKubernetesResult>;
|
|
42
|
+
//# sourceMappingURL=bootstrap-kubernetes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-kubernetes.d.ts","sourceRoot":"","sources":["../../src/lib/bootstrap-kubernetes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAcH,eAAO,MAAM,mBAAmB,cAAc,CAAC;AA4B/C,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAkTD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC,CA6BpC"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bootstrap-kubernetes.ts — k3s mode of `olam bootstrap`.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the legacy `scripts/dogfood/up.sh` reference flow into a CLI
|
|
5
|
+
* routine so external operators with only the published `@pleri/olam-cli`
|
|
6
|
+
* tarball (no access to the private `pleri/olam` repo) can bring up an
|
|
7
|
+
* end-to-end olam-on-k3s stack with one command.
|
|
8
|
+
*
|
|
9
|
+
* Steps (idempotent):
|
|
10
|
+
* 0. Preflight — detect required tools (k3d, kubectl, helm, jq, curl,
|
|
11
|
+
* openssl, gh, docker). With --auto-install on macOS, run `brew
|
|
12
|
+
* install` for missing brew-formulae.
|
|
13
|
+
* 1. Secrets — generate `~/.olam/{auth-secret,kg-bearer-token,
|
|
14
|
+
* auth-db-secret,mcp-auth-jwt-secret,memory-bearer-secret}` if absent.
|
|
15
|
+
* 2. Colima (macOS only) — ensure running; chmod /var/run/docker.sock
|
|
16
|
+
* inside the VM (virtiofs mitigation).
|
|
17
|
+
* 3. k3d cluster — create `<cluster>` with the gh-config bind. Skipped
|
|
18
|
+
* if cluster already exists.
|
|
19
|
+
* 4. Observability — chain bundled scripts in `<install>/host-cp/
|
|
20
|
+
* observability/` to install Loki + Promtail + Grafana +
|
|
21
|
+
* kube-prometheus-stack + Kyverno admission policy.
|
|
22
|
+
* 5. Delegate to `olam upgrade -y` — that flow handles namespace + RBAC
|
|
23
|
+
* + secrets + ghcr-pull + host-side docker-socket-proxy +
|
|
24
|
+
* manifest apply + rollout + verify.
|
|
25
|
+
*
|
|
26
|
+
* Note: `olam upgrade` already ships the 8-step k8s flow in
|
|
27
|
+
* `upgrade-kubernetes.ts` (Phase 1b C2 + Phase 2 C/D). This module is
|
|
28
|
+
* the prereq + cluster-create + observability wrapper around it.
|
|
29
|
+
*/
|
|
30
|
+
import { spawnSync } from 'node:child_process';
|
|
31
|
+
import { existsSync, mkdirSync, writeFileSync, chmodSync } from 'node:fs';
|
|
32
|
+
import { join } from 'node:path';
|
|
33
|
+
import { homedir, platform } from 'node:os';
|
|
34
|
+
import { randomBytes } from 'node:crypto';
|
|
35
|
+
import pc from 'picocolors';
|
|
36
|
+
import { printError, printSuccess, printInfo, printWarning, printHeader } from '../output.js';
|
|
37
|
+
import { installRoot } from '../install-root.js';
|
|
38
|
+
import { resolveK8sAssetsRoot } from './k8s-bootstrap.js';
|
|
39
|
+
const OLAM_HOME = join(homedir(), '.olam');
|
|
40
|
+
export const DEFAULT_K3S_CLUSTER = 'olam-host';
|
|
41
|
+
const REQUIRED_TOOLS = [
|
|
42
|
+
{ name: 'k3d', brew: 'k3d' },
|
|
43
|
+
{ name: 'kubectl', brew: 'kubectl' },
|
|
44
|
+
{ name: 'helm', brew: 'helm' },
|
|
45
|
+
{ name: 'jq', brew: 'jq' },
|
|
46
|
+
{ name: 'curl', hint: 'expected on macOS by default; `apt install curl` on linux' },
|
|
47
|
+
{ name: 'openssl', hint: 'expected on macOS by default; `apt install openssl` on linux' },
|
|
48
|
+
{ name: 'gh', brew: 'gh', hint: 'after install: `gh auth login`' },
|
|
49
|
+
{ name: 'docker', hint: 'Docker Desktop, or colima on macOS' },
|
|
50
|
+
];
|
|
51
|
+
const SECRET_FILES = [
|
|
52
|
+
'auth-secret',
|
|
53
|
+
'kg-bearer-token',
|
|
54
|
+
'auth-db-secret',
|
|
55
|
+
'mcp-auth-jwt-secret',
|
|
56
|
+
'memory-bearer-secret',
|
|
57
|
+
];
|
|
58
|
+
const OBSERVABILITY_SCRIPTS = [
|
|
59
|
+
'loki-ingest.sh',
|
|
60
|
+
'grafana-port-forward.sh',
|
|
61
|
+
'prom-no-double-grafana.sh',
|
|
62
|
+
'kyverno-cardinality-mutate.sh',
|
|
63
|
+
];
|
|
64
|
+
/** Wraps `command -v <tool>` returning true when the binary is on PATH. */
|
|
65
|
+
function hasTool(tool) {
|
|
66
|
+
const result = spawnSync('command', ['-v', tool], { shell: true, stdio: 'pipe' });
|
|
67
|
+
return result.status === 0;
|
|
68
|
+
}
|
|
69
|
+
function detectMissingTools() {
|
|
70
|
+
return REQUIRED_TOOLS.filter((tool) => !hasTool(tool.name));
|
|
71
|
+
}
|
|
72
|
+
function runOrFail(cmd, args, description) {
|
|
73
|
+
const result = spawnSync(cmd, args, { stdio: 'inherit' });
|
|
74
|
+
if (result.status !== 0) {
|
|
75
|
+
printError(`${description} failed (exit ${result.status ?? 'signal'})`);
|
|
76
|
+
process.exit(result.status ?? 1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function runCapture(cmd, args) {
|
|
80
|
+
const result = spawnSync(cmd, args, { encoding: 'utf8' });
|
|
81
|
+
return {
|
|
82
|
+
ok: result.status === 0,
|
|
83
|
+
stdout: result.stdout ?? '',
|
|
84
|
+
stderr: result.stderr ?? '',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function step(label) {
|
|
88
|
+
process.stdout.write('\n' + pc.bold(pc.cyan(`==> ${label}`)) + '\n');
|
|
89
|
+
}
|
|
90
|
+
function preflight(opts) {
|
|
91
|
+
step('0/6 — preflight (tool detection)');
|
|
92
|
+
const missing = detectMissingTools();
|
|
93
|
+
if (missing.length === 0) {
|
|
94
|
+
printSuccess('all required tools present');
|
|
95
|
+
}
|
|
96
|
+
else if (opts.autoInstall && platform() === 'darwin') {
|
|
97
|
+
const brewable = missing.filter((t) => t.brew);
|
|
98
|
+
if (brewable.length > 0) {
|
|
99
|
+
printInfo('auto-install', `${brewable.length} brew formula(s): ${brewable.map((t) => t.brew).join(', ')}`);
|
|
100
|
+
runOrFail('brew', ['install', ...brewable.map((t) => t.brew)], 'brew install');
|
|
101
|
+
}
|
|
102
|
+
const stillMissing = detectMissingTools();
|
|
103
|
+
if (stillMissing.length > 0) {
|
|
104
|
+
printError('tools still missing after auto-install:');
|
|
105
|
+
for (const t of stillMissing) {
|
|
106
|
+
process.stderr.write(` - ${t.name}${t.hint ? ` — ${t.hint}` : ''}\n`);
|
|
107
|
+
}
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
printSuccess('all required tools present after auto-install');
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
printError(`${missing.length} required tool(s) missing:`);
|
|
114
|
+
for (const t of missing) {
|
|
115
|
+
const hint = t.brew ? `brew install ${t.brew}` : t.hint ?? '(install manually)';
|
|
116
|
+
process.stderr.write(` - ${pc.bold(t.name)}: ${hint}\n`);
|
|
117
|
+
}
|
|
118
|
+
process.stderr.write('\nRe-run with --auto-install on macOS to install brew-formulae automatically.\n');
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
// gh auth
|
|
122
|
+
if (!runCapture('gh', ['auth', 'status']).ok) {
|
|
123
|
+
printError('gh is not authenticated — run: gh auth login');
|
|
124
|
+
process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
printSuccess('gh authenticated');
|
|
127
|
+
// docker reachability
|
|
128
|
+
if (!runCapture('docker', ['info']).ok) {
|
|
129
|
+
printError('docker daemon unreachable — start Docker Desktop or colima');
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
printSuccess('docker daemon reachable');
|
|
133
|
+
}
|
|
134
|
+
function ensureSecrets() {
|
|
135
|
+
step('1/6 — operator secrets');
|
|
136
|
+
mkdirSync(OLAM_HOME, { recursive: true });
|
|
137
|
+
for (const name of SECRET_FILES) {
|
|
138
|
+
const path = join(OLAM_HOME, name);
|
|
139
|
+
if (existsSync(path)) {
|
|
140
|
+
printInfo('skip', `~/.olam/${name} already exists`);
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const hex = randomBytes(32).toString('hex');
|
|
144
|
+
writeFileSync(path, hex + '\n', { encoding: 'utf8', mode: 0o600 });
|
|
145
|
+
chmodSync(path, 0o600);
|
|
146
|
+
printSuccess(`generated ~/.olam/${name}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function ensureColima() {
|
|
150
|
+
if (platform() !== 'darwin')
|
|
151
|
+
return;
|
|
152
|
+
step('2/6 — colima (macOS)');
|
|
153
|
+
if (!runCapture('colima', ['status']).ok) {
|
|
154
|
+
printWarning('colima not running — starting');
|
|
155
|
+
runOrFail('colima', ['start', '--cpu', '4', '--memory', '8', '--vm-type=vz', '--mount-type=virtiofs'], 'colima start');
|
|
156
|
+
}
|
|
157
|
+
printSuccess('colima running');
|
|
158
|
+
// virtiofs blocks chmod of docker.sock from the macOS side. Idempotent + non-fatal.
|
|
159
|
+
const chmod = runCapture('colima', ['ssh', '--', 'sudo', 'chmod', '666', '/var/run/docker.sock']);
|
|
160
|
+
if (chmod.ok) {
|
|
161
|
+
printSuccess('docker.sock chmod applied inside colima VM');
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
printWarning('colima ssh chmod failed — k3d cluster create may still succeed');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function ensureCluster(opts) {
|
|
168
|
+
if (opts.skipClusterCreate) {
|
|
169
|
+
step('3/6 — cluster (skipped via --skip-cluster-create)');
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
step(`3/6 — k3d cluster create (${opts.cluster})`);
|
|
173
|
+
if (runCapture('k3d', ['cluster', 'list', opts.cluster]).ok) {
|
|
174
|
+
printInfo('cluster', `'${opts.cluster}' already exists`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const ghConfigBind = `${homedir()}/.config/gh:/host/.config/gh`;
|
|
178
|
+
runOrFail('k3d', ['cluster', 'create', opts.cluster, '--volume', ghConfigBind, '--wait', '--timeout', '90s'], `k3d cluster create ${opts.cluster}`);
|
|
179
|
+
if (!runCapture('kubectl', ['cluster-info']).ok) {
|
|
180
|
+
printError('kubectl cannot reach the cluster — check kubeconfig context');
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
printSuccess(`cluster ready (${runCapture('kubectl', ['config', 'current-context']).stdout.trim()})`);
|
|
184
|
+
}
|
|
185
|
+
/** Resolve the bundled observability scripts dir. */
|
|
186
|
+
function resolveObservabilityScriptsDir() {
|
|
187
|
+
// Install-mode: bundle-host-cp.mjs copies scripts/e2e/*.sh to
|
|
188
|
+
// <install-root>/host-cp/observability/.
|
|
189
|
+
const installed = join(installRoot(), 'host-cp', 'observability');
|
|
190
|
+
if (existsSync(installed))
|
|
191
|
+
return installed;
|
|
192
|
+
// Dev-mode fallback: resolve via the k8s assets root + walk up to repo
|
|
193
|
+
// root then into scripts/e2e/. Works when running against the monorepo.
|
|
194
|
+
const k8sRoot = resolveK8sAssetsRoot();
|
|
195
|
+
if (k8sRoot) {
|
|
196
|
+
const dev = join(k8sRoot, '..', '..', '..', 'scripts', 'e2e');
|
|
197
|
+
if (existsSync(dev))
|
|
198
|
+
return dev;
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Resolve the bundled peripheral-services dir (helm-values + manifests).
|
|
204
|
+
* Returns null when neither install-mode nor dev-mode layout matches.
|
|
205
|
+
*/
|
|
206
|
+
function resolvePeripheralServicesDir() {
|
|
207
|
+
// Install-mode: bundle-host-cp.mjs copies packages/peripheral-services/
|
|
208
|
+
// {helm-values,manifests} to <install-root>/host-cp/peripheral-services/.
|
|
209
|
+
const installed = join(installRoot(), 'host-cp', 'peripheral-services');
|
|
210
|
+
if (existsSync(installed))
|
|
211
|
+
return installed;
|
|
212
|
+
// Dev-mode fallback: walk up from k8s assets root to packages/peripheral-services.
|
|
213
|
+
const k8sRoot = resolveK8sAssetsRoot();
|
|
214
|
+
if (k8sRoot) {
|
|
215
|
+
const dev = join(k8sRoot, '..', '..', 'peripheral-services');
|
|
216
|
+
if (existsSync(dev))
|
|
217
|
+
return dev;
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Resolve OLAM_BUNDLE_ROOT — the dir the observability scripts read to find
|
|
223
|
+
* `peripheral-services/{helm-values,manifests}/...`. In install-mode this is
|
|
224
|
+
* `<install>/host-cp`; in dev-mode it's the monorepo's `packages/` dir.
|
|
225
|
+
*/
|
|
226
|
+
function resolveBundleRoot() {
|
|
227
|
+
const installed = join(installRoot(), 'host-cp');
|
|
228
|
+
if (existsSync(join(installed, 'peripheral-services')))
|
|
229
|
+
return installed;
|
|
230
|
+
const k8sRoot = resolveK8sAssetsRoot();
|
|
231
|
+
if (k8sRoot) {
|
|
232
|
+
const dev = join(k8sRoot, '..', '..');
|
|
233
|
+
if (existsSync(join(dev, 'peripheral-services')))
|
|
234
|
+
return dev;
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
function installObservability(opts) {
|
|
239
|
+
if (opts.skipObservability) {
|
|
240
|
+
step('4/6 — observability (skipped via --skip-observability)');
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
step('4/6 — observability stack (Loki + Promtail + Grafana + Prometheus + Kyverno)');
|
|
244
|
+
const observabilityDir = resolveObservabilityScriptsDir();
|
|
245
|
+
if (!observabilityDir) {
|
|
246
|
+
printWarning('bundled observability scripts not found — skipping');
|
|
247
|
+
printWarning(' (expected in published CLI installs; missing only in dev tarballs without bundling)');
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
// Export OLAM_BUNDLE_ROOT so the scripts resolve helm-values/manifests from
|
|
251
|
+
// the published tarball instead of `git rev-parse` (which fails outside the
|
|
252
|
+
// monorepo). resolveBundleRoot returns null only in degenerate dev contexts;
|
|
253
|
+
// the scripts handle absence by falling back to git.
|
|
254
|
+
const bundleRoot = resolveBundleRoot();
|
|
255
|
+
const scriptEnv = { ...process.env };
|
|
256
|
+
if (bundleRoot) {
|
|
257
|
+
scriptEnv.OLAM_BUNDLE_ROOT = bundleRoot;
|
|
258
|
+
}
|
|
259
|
+
for (const script of OBSERVABILITY_SCRIPTS) {
|
|
260
|
+
const path = join(observabilityDir, script);
|
|
261
|
+
if (!existsSync(path)) {
|
|
262
|
+
printWarning(`observability script missing: ${script} — skipping`);
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
265
|
+
printInfo('run', script);
|
|
266
|
+
const result = spawnSync('bash', [path], { stdio: 'inherit', env: scriptEnv });
|
|
267
|
+
if (result.status !== 0) {
|
|
268
|
+
// loki-ingest's 10s scrub-wait is known to flake on cold-start; the
|
|
269
|
+
// underlying Loki/Promtail install almost always succeeded.
|
|
270
|
+
if (script === 'loki-ingest.sh') {
|
|
271
|
+
printWarning('loki-ingest non-zero — likely Promtail scrub-wait flake; continuing');
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
printError(`${script} failed — observability stack not ready`);
|
|
275
|
+
process.exit(1);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
printSuccess(`${script} passed`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Step 5: Apply the peripheral-services manifest tree (IngressRoutes,
|
|
285
|
+
* NetworkPolicies, ServiceMonitors, recording rules, Grafana dashboard
|
|
286
|
+
* ConfigMaps, Kyverno ClusterPolicy). These are NOT covered by `olam
|
|
287
|
+
* upgrade`'s host-cp manifest apply — without this step, the observability
|
|
288
|
+
* stack runs but has no scrape targets and no dashboards.
|
|
289
|
+
*/
|
|
290
|
+
function applyPeripheralServicesManifests() {
|
|
291
|
+
step('5/6 — peripheral-services manifests (IngressRoutes + ServiceMonitors + recording rules + dashboards + Kyverno)');
|
|
292
|
+
const dir = resolvePeripheralServicesDir();
|
|
293
|
+
if (!dir) {
|
|
294
|
+
printWarning('bundled peripheral-services manifests not found — skipping');
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const manifestsDir = join(dir, 'manifests');
|
|
298
|
+
if (!existsSync(manifestsDir)) {
|
|
299
|
+
printWarning(`peripheral-services/manifests not found at ${manifestsDir} — skipping`);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
printInfo('apply', manifestsDir);
|
|
303
|
+
const result = spawnSync('kubectl', ['apply', '-f', manifestsDir], { stdio: 'inherit' });
|
|
304
|
+
if (result.status !== 0) {
|
|
305
|
+
printError('kubectl apply failed — peripheral-services manifests not applied');
|
|
306
|
+
process.exit(result.status ?? 1);
|
|
307
|
+
}
|
|
308
|
+
printSuccess('peripheral-services manifests applied');
|
|
309
|
+
}
|
|
310
|
+
function delegateToUpgrade() {
|
|
311
|
+
step('6/6 — apply host-cp + peripherals + rollout (olam upgrade)');
|
|
312
|
+
// Re-invoke `olam upgrade -y` via the same process binary. The upgrade
|
|
313
|
+
// flow's 8-step k8s path (upgrade-kubernetes.ts) handles namespace +
|
|
314
|
+
// RBAC + Secrets + ghcr-pull + host-side docker-socket-proxy + manifest
|
|
315
|
+
// apply + rollout status + port-forward + /health verify + audit log.
|
|
316
|
+
const olamBin = process.argv[1] ?? 'olam';
|
|
317
|
+
const result = spawnSync(process.execPath, [olamBin, 'upgrade', '-y'], { stdio: 'inherit' });
|
|
318
|
+
if (result.status !== 0) {
|
|
319
|
+
printError('olam upgrade failed — see output above');
|
|
320
|
+
process.exit(result.status ?? 1);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function summary(opts) {
|
|
324
|
+
step('done');
|
|
325
|
+
process.stdout.write(`
|
|
326
|
+
Cluster: ${opts.cluster}
|
|
327
|
+
Next steps:
|
|
328
|
+
olam doctor # verify the stack
|
|
329
|
+
olam services status # peripherals 1/1
|
|
330
|
+
kubectl get pods -n olam
|
|
331
|
+
|
|
332
|
+
Grafana:
|
|
333
|
+
kubectl port-forward -n monitoring svc/olam-grafana 3000:80
|
|
334
|
+
open http://localhost:3000
|
|
335
|
+
# admin password:
|
|
336
|
+
kubectl get secret olam-grafana-admin -n monitoring \\
|
|
337
|
+
-o jsonpath='{.data.admin-password}' | base64 -d
|
|
338
|
+
`);
|
|
339
|
+
}
|
|
340
|
+
export async function runBootstrapKubernetes(rawOpts) {
|
|
341
|
+
// Default auto-install ON for macOS. The wizard contract is "fresh
|
|
342
|
+
// machine → working cluster in one command", which requires installing
|
|
343
|
+
// missing brew formulae without operator intervention. Linux operators
|
|
344
|
+
// see a per-tool install hint (apt/dnf auto-install is queued as a
|
|
345
|
+
// follow-up). Pass --no-auto-install or set autoInstall=false to
|
|
346
|
+
// restore the earlier opt-in behaviour.
|
|
347
|
+
const defaultAutoInstall = platform() === 'darwin';
|
|
348
|
+
const opts = {
|
|
349
|
+
cluster: rawOpts.cluster ?? DEFAULT_K3S_CLUSTER,
|
|
350
|
+
autoInstall: rawOpts.autoInstall ?? defaultAutoInstall,
|
|
351
|
+
skipObservability: rawOpts.skipObservability ?? false,
|
|
352
|
+
skipClusterCreate: rawOpts.skipClusterCreate ?? false,
|
|
353
|
+
};
|
|
354
|
+
printHeader('olam setup — k3s mode');
|
|
355
|
+
printInfo('mode', 'one-command bring-up of olam peripherals + observability on a local k3d cluster');
|
|
356
|
+
preflight(opts);
|
|
357
|
+
ensureSecrets();
|
|
358
|
+
ensureColima();
|
|
359
|
+
ensureCluster(opts);
|
|
360
|
+
installObservability(opts);
|
|
361
|
+
applyPeripheralServicesManifests();
|
|
362
|
+
delegateToUpgrade();
|
|
363
|
+
summary(opts);
|
|
364
|
+
printSuccess('setup complete');
|
|
365
|
+
return { exitCode: 0, summary: `setup complete on cluster ${opts.cluster}` };
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=bootstrap-kubernetes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap-kubernetes.js","sourceRoot":"","sources":["../../src/lib/bootstrap-kubernetes.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAcH,eAAO,MAAM,SAAS,QAA2B,CAAC;AAClD,eAAO,MAAM,cAAc,QAA2B,CAAC;AACvD,eAAO,MAAM,gBAAgB,QAAiC,CAAC;AAE/D,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG;IACvB,eAAe,EAAE,CAAC,CAAC;IACnB,IAAI,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAcH,eAAO,MAAM,SAAS,QAA2B,CAAC;AAClD,eAAO,MAAM,cAAc,QAA2B,CAAC;AACvD,eAAO,MAAM,gBAAgB,QAAiC,CAAC;AAE/D,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAEjD,MAAM,MAAM,UAAU,GAAG;IACvB,eAAe,EAAE,CAAC,CAAC;IACnB,IAAI,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AA+DF;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CACxB,IAAI,GAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAC3B,GACL,UAAU,CAsCZ;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;CAAE,EAC/C,IAAI,GAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CAC3B,GACL,UAAU,CAaZ"}
|
package/dist/lib/config.js
CHANGED
|
@@ -27,7 +27,12 @@ import { randomUUID } from 'node:crypto';
|
|
|
27
27
|
export const OLAM_HOME = join(homedir(), '.olam');
|
|
28
28
|
export const OLAM_STATE_DIR = join(OLAM_HOME, 'state');
|
|
29
29
|
export const OLAM_CONFIG_PATH = join(OLAM_HOME, 'config.json');
|
|
30
|
-
|
|
30
|
+
// k3s mode is the canonical olam substrate as of feat/cli-bootstrap-k3s-default
|
|
31
|
+
// (2026-05-22). Fresh installs default to `kubernetes`; existing installs whose
|
|
32
|
+
// ~/.olam/config.json explicitly carries `host.substrate: 'compose'` keep their
|
|
33
|
+
// current behaviour (compose mode remains supported but is no longer the
|
|
34
|
+
// default). To pin compose on a fresh install: `olam config set host.substrate compose`.
|
|
35
|
+
const DEFAULT_SUBSTRATE = 'kubernetes';
|
|
31
36
|
function makeDefaultConfig() {
|
|
32
37
|
return {
|
|
33
38
|
'config.schema': 1,
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAU/D,MAAM,iBAAiB,GAAc,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|