@openreef/cli 0.1.0 → 0.2.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.
Files changed (62) hide show
  1. package/README.md +14 -7
  2. package/dist/commands/init.d.ts +1 -1
  3. package/dist/commands/init.d.ts.map +1 -1
  4. package/dist/commands/init.js +1 -1
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/install.d.ts +13 -0
  7. package/dist/commands/install.d.ts.map +1 -0
  8. package/dist/commands/install.js +560 -0
  9. package/dist/commands/install.js.map +1 -0
  10. package/dist/commands/list.d.ts +5 -0
  11. package/dist/commands/list.d.ts.map +1 -0
  12. package/dist/commands/list.js +81 -0
  13. package/dist/commands/list.js.map +1 -0
  14. package/dist/commands/status.d.ts +8 -0
  15. package/dist/commands/status.d.ts.map +1 -0
  16. package/dist/commands/status.js +198 -0
  17. package/dist/commands/status.js.map +1 -0
  18. package/dist/commands/uninstall.d.ts +8 -0
  19. package/dist/commands/uninstall.d.ts.map +1 -0
  20. package/dist/commands/uninstall.js +132 -0
  21. package/dist/commands/uninstall.js.map +1 -0
  22. package/dist/core/agents-md-generator.d.ts +3 -0
  23. package/dist/core/agents-md-generator.d.ts.map +1 -0
  24. package/dist/core/agents-md-generator.js +24 -0
  25. package/dist/core/agents-md-generator.js.map +1 -0
  26. package/dist/core/config-patcher.d.ts +32 -0
  27. package/dist/core/config-patcher.d.ts.map +1 -0
  28. package/dist/core/config-patcher.js +147 -0
  29. package/dist/core/config-patcher.js.map +1 -0
  30. package/dist/core/device-identity.d.ts +37 -0
  31. package/dist/core/device-identity.d.ts.map +1 -0
  32. package/dist/core/device-identity.js +135 -0
  33. package/dist/core/device-identity.js.map +1 -0
  34. package/dist/core/gateway-client.d.ts +98 -0
  35. package/dist/core/gateway-client.d.ts.map +1 -0
  36. package/dist/core/gateway-client.js +238 -0
  37. package/dist/core/gateway-client.js.map +1 -0
  38. package/dist/core/openclaw-paths.d.ts +17 -0
  39. package/dist/core/openclaw-paths.d.ts.map +1 -0
  40. package/dist/core/openclaw-paths.js +175 -0
  41. package/dist/core/openclaw-paths.js.map +1 -0
  42. package/dist/core/state-manager.d.ts +7 -0
  43. package/dist/core/state-manager.d.ts.map +1 -0
  44. package/dist/core/state-manager.js +61 -0
  45. package/dist/core/state-manager.js.map +1 -0
  46. package/dist/core/structural-validator.js +4 -4
  47. package/dist/core/structural-validator.js.map +1 -1
  48. package/dist/core/variable-resolver.d.ts +1 -0
  49. package/dist/core/variable-resolver.d.ts.map +1 -1
  50. package/dist/core/variable-resolver.js +21 -10
  51. package/dist/core/variable-resolver.js.map +1 -1
  52. package/dist/index.js +72 -2
  53. package/dist/index.js.map +1 -1
  54. package/dist/types/manifest.d.ts +1 -1
  55. package/dist/types/manifest.d.ts.map +1 -1
  56. package/dist/types/state.d.ts +41 -0
  57. package/dist/types/state.d.ts.map +1 -0
  58. package/dist/types/state.js +2 -0
  59. package/dist/types/state.js.map +1 -0
  60. package/package.json +6 -3
  61. package/schema/reef.schema.json +2 -2
  62. package/template/reef.json +1 -1
@@ -0,0 +1,238 @@
1
+ import WebSocket from 'ws';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { loadOrCreateDeviceIdentity, signDevicePayload, publicKeyRawBase64Url, buildDeviceAuthPayload, loadDeviceAuthToken, storeDeviceAuthToken, } from './device-identity.js';
4
+ const PROTOCOL_VERSION = 3;
5
+ const CLIENT_ID = 'cli';
6
+ const CLIENT_MODE = 'cli';
7
+ const ROLE = 'operator';
8
+ const SCOPES = ['operator.admin', 'operator.approvals', 'operator.pairing'];
9
+ /**
10
+ * Resolve Gateway auth credentials from multiple sources.
11
+ * If gatewayUrl is explicitly provided (override), ONLY explicit --gateway-token
12
+ * or --gateway-password satisfy auth — env/config fallbacks are NOT accepted.
13
+ * For local (non-overridden) URLs: explicit CLI → env vars → config file values.
14
+ */
15
+ export function resolveGatewayAuth(opts) {
16
+ // If URL was explicitly overridden, require explicit CLI auth (no env/config fallback)
17
+ if (opts.gatewayUrl) {
18
+ if (!opts.gatewayToken && !opts.gatewayPassword) {
19
+ throw new Error('Gateway URL override requires --gateway-token or --gateway-password.');
20
+ }
21
+ return {
22
+ token: opts.gatewayToken ?? undefined,
23
+ password: opts.gatewayPassword ?? undefined,
24
+ skipStoredAuth: true,
25
+ };
26
+ }
27
+ // Local/default URL: full resolution chain
28
+ const e = opts.env ?? process.env;
29
+ const gw = (opts.config?.gateway ?? {});
30
+ const auth = (gw.auth ?? {});
31
+ const token = opts.gatewayToken ??
32
+ e.OPENCLAW_GATEWAY_TOKEN ??
33
+ auth.token;
34
+ const password = opts.gatewayPassword ??
35
+ e.OPENCLAW_GATEWAY_PASSWORD ??
36
+ auth.password;
37
+ return {
38
+ token: token ?? undefined,
39
+ password: password ?? undefined,
40
+ };
41
+ }
42
+ export class GatewayClient {
43
+ ws = null;
44
+ pending = new Map();
45
+ connected = false;
46
+ options;
47
+ timeoutMs;
48
+ constructor(options) {
49
+ this.options = options;
50
+ this.timeoutMs = options.timeoutMs ?? 15000;
51
+ }
52
+ async connect() {
53
+ const identity = loadOrCreateDeviceIdentity(this.options.env);
54
+ // Load stored device auth token as fallback (only for local URLs)
55
+ const storedAuth = this.options.skipStoredAuth
56
+ ? null
57
+ : loadDeviceAuthToken({
58
+ deviceId: identity.deviceId,
59
+ role: ROLE,
60
+ env: this.options.env,
61
+ });
62
+ return new Promise((resolve, reject) => {
63
+ const ws = new WebSocket(this.options.url);
64
+ this.ws = ws;
65
+ let challengeNonce;
66
+ let connectSent = false;
67
+ let connectTimer;
68
+ const sendConnect = (nonce) => {
69
+ if (connectSent)
70
+ return;
71
+ connectSent = true;
72
+ const signedAt = Date.now();
73
+ const authToken = this.options.token ?? storedAuth?.token ?? undefined;
74
+ const authPayload = buildDeviceAuthPayload({
75
+ deviceId: identity.deviceId,
76
+ clientId: CLIENT_ID,
77
+ clientMode: CLIENT_MODE,
78
+ role: ROLE,
79
+ scopes: SCOPES,
80
+ signedAtMs: signedAt,
81
+ token: authToken ?? null,
82
+ nonce,
83
+ });
84
+ const signature = signDevicePayload(identity.privateKeyPem, authPayload);
85
+ const connectParams = {
86
+ minProtocol: PROTOCOL_VERSION,
87
+ maxProtocol: PROTOCOL_VERSION,
88
+ client: {
89
+ id: CLIENT_ID,
90
+ version: '0.2.0',
91
+ platform: process.platform,
92
+ mode: CLIENT_MODE,
93
+ },
94
+ role: ROLE,
95
+ scopes: SCOPES,
96
+ device: {
97
+ id: identity.deviceId,
98
+ publicKey: publicKeyRawBase64Url(identity.publicKeyPem),
99
+ signature,
100
+ signedAt: signedAt,
101
+ ...(nonce ? { nonce } : {}),
102
+ },
103
+ };
104
+ // Add auth if available
105
+ const auth = {};
106
+ if (authToken)
107
+ auth.token = authToken;
108
+ if (this.options.password)
109
+ auth.password = this.options.password;
110
+ if (Object.keys(auth).length > 0) {
111
+ connectParams.auth = auth;
112
+ }
113
+ const reqId = randomUUID();
114
+ const frame = {
115
+ type: 'req',
116
+ id: reqId,
117
+ method: 'connect',
118
+ params: connectParams,
119
+ };
120
+ ws.send(JSON.stringify(frame));
121
+ // Wait for connect response
122
+ const timer = setTimeout(() => {
123
+ this.pending.delete(reqId);
124
+ reject(new Error('Gateway connect handshake timed out'));
125
+ }, this.timeoutMs);
126
+ this.pending.set(reqId, {
127
+ resolve: (payload) => {
128
+ this.connected = true;
129
+ // Store device token if returned
130
+ const p = payload;
131
+ const authResult = p?.auth;
132
+ if (authResult?.deviceToken) {
133
+ storeDeviceAuthToken({
134
+ deviceId: identity.deviceId,
135
+ role: ROLE,
136
+ token: authResult.deviceToken,
137
+ scopes: SCOPES,
138
+ env: this.options.env,
139
+ });
140
+ }
141
+ resolve();
142
+ },
143
+ reject,
144
+ timer,
145
+ });
146
+ };
147
+ ws.on('open', () => {
148
+ // Queue connect with 750ms delay — allows challenge to arrive first
149
+ connectTimer = setTimeout(() => sendConnect(), 750);
150
+ });
151
+ ws.on('message', (data) => {
152
+ let frame;
153
+ try {
154
+ frame = JSON.parse(data.toString());
155
+ }
156
+ catch {
157
+ return;
158
+ }
159
+ // Handle connect.challenge event
160
+ if (frame.type === 'event' &&
161
+ frame.event === 'connect.challenge') {
162
+ const payload = frame.payload;
163
+ challengeNonce = payload.nonce;
164
+ clearTimeout(connectTimer);
165
+ sendConnect(challengeNonce);
166
+ return;
167
+ }
168
+ // Handle response frames
169
+ if (frame.type === 'res') {
170
+ const id = frame.id;
171
+ const pending = this.pending.get(id);
172
+ if (!pending)
173
+ return;
174
+ clearTimeout(pending.timer);
175
+ this.pending.delete(id);
176
+ if (frame.ok) {
177
+ pending.resolve(frame.payload);
178
+ }
179
+ else {
180
+ const err = frame.error;
181
+ pending.reject(new Error(`Gateway error: ${err?.code ?? 'unknown'} — ${err?.message ?? 'no message'}`));
182
+ }
183
+ }
184
+ });
185
+ ws.on('error', (err) => {
186
+ reject(new Error(`Gateway connection failed: ${err.message}`));
187
+ });
188
+ ws.on('close', () => {
189
+ this.connected = false;
190
+ for (const [id, pending] of this.pending) {
191
+ clearTimeout(pending.timer);
192
+ pending.reject(new Error('Gateway connection closed'));
193
+ this.pending.delete(id);
194
+ }
195
+ });
196
+ });
197
+ }
198
+ async call(method, params) {
199
+ if (!this.ws || !this.connected) {
200
+ throw new Error('Gateway not connected. Call connect() first.');
201
+ }
202
+ const id = randomUUID();
203
+ const frame = { type: 'req', id, method, params: params ?? {} };
204
+ return new Promise((resolve, reject) => {
205
+ const timer = setTimeout(() => {
206
+ this.pending.delete(id);
207
+ reject(new Error(`Gateway call "${method}" timed out`));
208
+ }, this.timeoutMs);
209
+ this.pending.set(id, {
210
+ resolve: resolve,
211
+ reject,
212
+ timer,
213
+ });
214
+ this.ws.send(JSON.stringify(frame));
215
+ });
216
+ }
217
+ close() {
218
+ if (this.ws) {
219
+ this.ws.close();
220
+ this.ws = null;
221
+ this.connected = false;
222
+ }
223
+ }
224
+ async cronAdd(params) {
225
+ return this.call('cron.add', params);
226
+ }
227
+ async cronRemove(id) {
228
+ await this.call('cron.remove', { id });
229
+ }
230
+ async cronUpdate(id, patch) {
231
+ await this.call('cron.update', { id, patch });
232
+ }
233
+ async cronList(options) {
234
+ const result = await this.call('cron.list', options ?? {});
235
+ return result.jobs ?? [];
236
+ }
237
+ }
238
+ //# sourceMappingURL=gateway-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-client.js","sourceRoot":"","sources":["../../src/core/gateway-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare function resolveHomeDir(env?: NodeJS.ProcessEnv): string;
2
+ export declare function resolveStateDir(env?: NodeJS.ProcessEnv): string;
3
+ export declare function resolveConfigPath(env?: NodeJS.ProcessEnv): string;
4
+ export declare function resolveWorkspacePath(agentId: string, env?: NodeJS.ProcessEnv): string;
5
+ export declare function resolveReefStateDir(env?: NodeJS.ProcessEnv): string;
6
+ export declare function resolveGatewayUrl(config?: Record<string, unknown>, env?: NodeJS.ProcessEnv): string;
7
+ export declare function validateAgentId(id: string): {
8
+ valid: boolean;
9
+ normalized: string;
10
+ error?: string;
11
+ };
12
+ export declare function validateAgentIds(slugs: string[], namespace: string): {
13
+ valid: boolean;
14
+ ids: Map<string, string>;
15
+ errors: string[];
16
+ };
17
+ //# sourceMappingURL=openclaw-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-paths.d.ts","sourceRoot":"","sources":["../../src/core/openclaw-paths.ts"],"names":[],"mappings":"AAcA,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAU9D;AAED,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAe/D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAsCjE;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,MAAM,CAER;AAED,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAEnE;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,MAAM,CA4BR;AAyBD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG;IAC3C,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CA4BA;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BhE"}
@@ -0,0 +1,175 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import os from 'node:os';
4
+ import { networkInterfaces } from 'node:os';
5
+ const CONFIG_FILENAMES = [
6
+ 'openclaw.json',
7
+ 'clawdbot.json',
8
+ 'moldbot.json',
9
+ 'moltbot.json',
10
+ ];
11
+ const LEGACY_DIRS = ['.clawdbot', '.moldbot', '.moltbot'];
12
+ export function resolveHomeDir(env) {
13
+ const e = env ?? process.env;
14
+ const raw = e.OPENCLAW_HOME ?? e.HOME ?? e.USERPROFILE;
15
+ if (raw) {
16
+ if (raw.startsWith('~')) {
17
+ return join(os.homedir(), raw.slice(1));
18
+ }
19
+ return raw;
20
+ }
21
+ return os.homedir();
22
+ }
23
+ export function resolveStateDir(env) {
24
+ const e = env ?? process.env;
25
+ const explicit = e.OPENCLAW_STATE_DIR ?? e.CLAWDBOT_STATE_DIR;
26
+ if (explicit)
27
+ return explicit;
28
+ const homeDir = resolveHomeDir(env);
29
+ const primary = join(homeDir, '.openclaw');
30
+ if (existsSync(primary))
31
+ return primary;
32
+ for (const legacy of LEGACY_DIRS) {
33
+ const candidate = join(homeDir, legacy);
34
+ if (existsSync(candidate))
35
+ return candidate;
36
+ }
37
+ return primary;
38
+ }
39
+ export function resolveConfigPath(env) {
40
+ const e = env ?? process.env;
41
+ // 1. Explicit config path env
42
+ const explicitPath = e.OPENCLAW_CONFIG_PATH ?? e.CLAWDBOT_CONFIG_PATH;
43
+ if (explicitPath)
44
+ return explicitPath;
45
+ const stateDir = resolveStateDir(env);
46
+ // 2. Search state dir for first existing config file
47
+ for (const filename of CONFIG_FILENAMES) {
48
+ const candidate = join(stateDir, filename);
49
+ if (existsSync(candidate))
50
+ return candidate;
51
+ }
52
+ // 3. If OPENCLAW_STATE_DIR was explicitly set, return canonical path (skip home search)
53
+ const hasExplicitStateDir = !!(e.OPENCLAW_STATE_DIR ?? e.CLAWDBOT_STATE_DIR);
54
+ if (hasExplicitStateDir) {
55
+ return join(stateDir, 'openclaw.json');
56
+ }
57
+ // 4. Only for default state dir: search across all home directories
58
+ const homeDir = resolveHomeDir(env);
59
+ const homeDirs = [
60
+ join(homeDir, '.openclaw'),
61
+ join(homeDir, '.clawdbot'),
62
+ join(homeDir, '.moldbot'),
63
+ join(homeDir, '.moltbot'),
64
+ ];
65
+ for (const dir of homeDirs) {
66
+ for (const filename of CONFIG_FILENAMES) {
67
+ const candidate = join(dir, filename);
68
+ if (existsSync(candidate))
69
+ return candidate;
70
+ }
71
+ }
72
+ // 5. Ultimate fallback
73
+ return join(stateDir, 'openclaw.json');
74
+ }
75
+ export function resolveWorkspacePath(agentId, env) {
76
+ return join(resolveStateDir(env), `workspace-${agentId}`);
77
+ }
78
+ export function resolveReefStateDir(env) {
79
+ return join(resolveStateDir(env), '.reef');
80
+ }
81
+ export function resolveGatewayUrl(config, env) {
82
+ const e = env ?? process.env;
83
+ const gw = (config?.gateway ?? {});
84
+ const tls = (gw.tls ?? {});
85
+ const bind = gw.bind ?? 'loopback';
86
+ const envPort = e.OPENCLAW_GATEWAY_PORT
87
+ ? parseInt(e.OPENCLAW_GATEWAY_PORT, 10)
88
+ : null;
89
+ const port = gw.port ??
90
+ (envPort !== null && !isNaN(envPort) ? envPort : null) ??
91
+ 18789;
92
+ const scheme = tls.enabled ? 'wss' : 'ws';
93
+ if (bind === 'tailnet') {
94
+ const ip = findIPv4('tailscale');
95
+ // Tailnet uses scheme from TLS config, not hardcoded wss
96
+ if (ip)
97
+ return `${scheme}://${ip}:${port}`;
98
+ }
99
+ if (bind === 'lan') {
100
+ const ip = findLanIPv4();
101
+ if (ip)
102
+ return `${scheme}://${ip}:${port}`;
103
+ }
104
+ return `${scheme}://127.0.0.1:${port}`;
105
+ }
106
+ function findIPv4(interfacePrefix) {
107
+ const ifaces = networkInterfaces();
108
+ for (const [name, addrs] of Object.entries(ifaces)) {
109
+ if (!name.toLowerCase().startsWith(interfacePrefix))
110
+ continue;
111
+ for (const addr of addrs ?? []) {
112
+ if (addr.family === 'IPv4' && !addr.internal)
113
+ return addr.address;
114
+ }
115
+ }
116
+ return null;
117
+ }
118
+ function findLanIPv4() {
119
+ const ifaces = networkInterfaces();
120
+ for (const addrs of Object.values(ifaces)) {
121
+ for (const addr of addrs ?? []) {
122
+ if (addr.family === 'IPv4' && !addr.internal)
123
+ return addr.address;
124
+ }
125
+ }
126
+ return null;
127
+ }
128
+ const AGENT_ID_RE = /^[a-z0-9][a-z0-9_-]{0,63}$/;
129
+ export function validateAgentId(id) {
130
+ const normalized = id.toLowerCase();
131
+ if (normalized.includes('.')) {
132
+ return {
133
+ valid: false,
134
+ normalized,
135
+ error: `Agent ID "${id}" contains dots — OpenClaw collapses dots to dashes. Use dashes instead.`,
136
+ };
137
+ }
138
+ if (normalized.length > 64) {
139
+ return {
140
+ valid: false,
141
+ normalized,
142
+ error: `Agent ID "${id}" exceeds 64 characters (${normalized.length}).`,
143
+ };
144
+ }
145
+ if (!AGENT_ID_RE.test(normalized)) {
146
+ return {
147
+ valid: false,
148
+ normalized,
149
+ error: `Agent ID "${id}" does not match [a-z0-9][a-z0-9_-]{0,63}.`,
150
+ };
151
+ }
152
+ return { valid: true, normalized };
153
+ }
154
+ export function validateAgentIds(slugs, namespace) {
155
+ const ids = new Map();
156
+ const errors = [];
157
+ const seen = new Map();
158
+ for (const slug of slugs) {
159
+ const id = `${namespace}-${slug}`;
160
+ const result = validateAgentId(id);
161
+ if (!result.valid) {
162
+ errors.push(result.error);
163
+ continue;
164
+ }
165
+ const existing = seen.get(result.normalized);
166
+ if (existing) {
167
+ errors.push(`Slugs "${existing}" and "${slug}" produce the same normalized ID "${result.normalized}".`);
168
+ continue;
169
+ }
170
+ seen.set(result.normalized, slug);
171
+ ids.set(slug, result.normalized);
172
+ }
173
+ return { valid: errors.length === 0, ids, errors };
174
+ }
175
+ //# sourceMappingURL=openclaw-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-paths.js","sourceRoot":"","sources":["../../src/core/openclaw-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,gBAAgB,GAAG;IACvB,eAAe;IACf,eAAe;IACf,cAAc;IACd,cAAc;CACf,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAE1D,MAAM,UAAU,cAAc,CAAC,GAAuB;IACpD,MAAM,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC;IACvD,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,MAAM,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAC7B,MAAM,QAAQ,GAAG,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,kBAAkB,CAAC;IAC9D,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAExC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACvD,MAAM,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAE7B,8BAA8B;IAC9B,MAAM,YAAY,GAAG,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC,oBAAoB,CAAC;IACtE,IAAI,YAAY;QAAE,OAAO,YAAY,CAAC;IAEtC,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAEtC,qDAAqD;IACrD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;IAED,wFAAwF;IACxF,MAAM,mBAAmB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC7E,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;IACzC,CAAC;IAED,oEAAoE;IACpE,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG;QACf,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QAC1B,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;QAC1B,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;KAC1B,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACtC,IAAI,UAAU,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,OAAO,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAe,EACf,GAAuB;IAEvB,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,aAAa,OAAO,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAuB;IACzD,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAgC,EAChC,GAAuB;IAEvB,MAAM,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAA4B,CAAC;IAC9D,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAA4B,CAAC;IACtD,MAAM,IAAI,GAAI,EAAE,CAAC,IAAe,IAAI,UAAU,CAAC;IAE/C,MAAM,OAAO,GAAG,CAAC,CAAC,qBAAqB;QACrC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,EAAE,EAAE,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,IAAI,GACP,EAAE,CAAC,IAAe;QACnB,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,KAAK,CAAC;IAER,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;QACjC,yDAAyD;QACzD,IAAI,EAAE;YAAE,OAAO,GAAG,MAAM,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;QACzB,IAAI,EAAE;YAAE,OAAO,GAAG,MAAM,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,OAAO,GAAG,MAAM,gBAAgB,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,eAAuB;IACvC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;YAAE,SAAS;QAC9D,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,WAAW,GAAG,4BAA4B,CAAC;AAEjD,MAAM,UAAU,eAAe,CAAC,EAAU;IAKxC,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAEpC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,UAAU;YACV,KAAK,EAAE,aAAa,EAAE,0EAA0E;SACjG,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC3B,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,UAAU;YACV,KAAK,EAAE,aAAa,EAAE,4BAA4B,UAAU,CAAC,MAAM,IAAI;SACxE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,UAAU;YACV,KAAK,EAAE,aAAa,EAAE,4CAA4C;SACnE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAAe,EACf,SAAiB;IAEjB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CACT,UAAU,QAAQ,UAAU,IAAI,qCAAqC,MAAM,CAAC,UAAU,IAAI,CAC3F,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACrD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { FormationState } from '../types/state.js';
2
+ export declare function loadState(namespace: string, name: string, env?: NodeJS.ProcessEnv): Promise<FormationState | null>;
3
+ export declare function saveState(state: FormationState, env?: NodeJS.ProcessEnv): Promise<void>;
4
+ export declare function deleteState(namespace: string, name: string, env?: NodeJS.ProcessEnv): Promise<void>;
5
+ export declare function listStates(env?: NodeJS.ProcessEnv): Promise<FormationState[]>;
6
+ export declare function computeFileHash(content: Buffer): string;
7
+ //# sourceMappingURL=state-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/core/state-manager.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMxD,wBAAsB,SAAS,CAC7B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAShC;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,EACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,UAAU,CAC9B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GACtB,OAAO,CAAC,cAAc,EAAE,CAAC,CAqB3B;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,61 @@
1
+ import { readFile, writeFile, unlink, readdir, mkdir, } from 'node:fs/promises';
2
+ import { createHash } from 'node:crypto';
3
+ import { join } from 'node:path';
4
+ import { resolveReefStateDir } from './openclaw-paths.js';
5
+ function stateFileName(namespace, name) {
6
+ return `${namespace}--${name}.state.json`;
7
+ }
8
+ export async function loadState(namespace, name, env) {
9
+ const dir = resolveReefStateDir(env);
10
+ const filePath = join(dir, stateFileName(namespace, name));
11
+ try {
12
+ const raw = await readFile(filePath, 'utf-8');
13
+ return JSON.parse(raw);
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ export async function saveState(state, env) {
20
+ const dir = resolveReefStateDir(env);
21
+ await mkdir(dir, { recursive: true });
22
+ const filePath = join(dir, stateFileName(state.namespace, state.name));
23
+ await writeFile(filePath, JSON.stringify(state, null, 2) + '\n', 'utf-8');
24
+ }
25
+ export async function deleteState(namespace, name, env) {
26
+ const dir = resolveReefStateDir(env);
27
+ const filePath = join(dir, stateFileName(namespace, name));
28
+ try {
29
+ await unlink(filePath);
30
+ }
31
+ catch {
32
+ // Already gone
33
+ }
34
+ }
35
+ export async function listStates(env) {
36
+ const dir = resolveReefStateDir(env);
37
+ let entries;
38
+ try {
39
+ entries = await readdir(dir);
40
+ }
41
+ catch {
42
+ return [];
43
+ }
44
+ const states = [];
45
+ for (const entry of entries) {
46
+ if (!entry.endsWith('.state.json'))
47
+ continue;
48
+ try {
49
+ const raw = await readFile(join(dir, entry), 'utf-8');
50
+ states.push(JSON.parse(raw));
51
+ }
52
+ catch {
53
+ // Skip corrupt state files
54
+ }
55
+ }
56
+ return states;
57
+ }
58
+ export function computeFileHash(content) {
59
+ return createHash('sha256').update(content).digest('hex');
60
+ }
61
+ //# sourceMappingURL=state-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../src/core/state-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,SAAS,EACT,MAAM,EACN,OAAO,EACP,KAAK,GACN,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,SAAS,aAAa,CAAC,SAAiB,EAAE,IAAY;IACpD,OAAO,GAAG,SAAS,KAAK,IAAI,aAAa,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAiB,EACjB,IAAY,EACZ,GAAuB;IAEvB,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,KAAqB,EACrB,GAAuB;IAEvB,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,IAAY,EACZ,GAAuB;IAEvB,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAuB;IAEvB,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;YAAE,SAAS;QAC7C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC"}
@@ -91,19 +91,19 @@ export async function validateStructure(manifest, formationDir) {
91
91
  path: 'type',
92
92
  });
93
93
  }
94
- if (manifest.type === 'team' && (agentCount < 2 || agentCount > 5)) {
94
+ if (manifest.type === 'shoal' && (agentCount < 2 || agentCount > 5)) {
95
95
  issues.push({
96
96
  severity: 'warning',
97
97
  code: 'TYPE_COUNT_MISMATCH',
98
- message: `Formation type is "team" but has ${agentCount} agent(s) (expected 2-5)`,
98
+ message: `Formation type is "shoal" but has ${agentCount} agent(s) (expected 2-5)`,
99
99
  path: 'type',
100
100
  });
101
101
  }
102
- if (manifest.type === 'swarm' && agentCount < 6) {
102
+ if (manifest.type === 'school' && agentCount < 6) {
103
103
  issues.push({
104
104
  severity: 'warning',
105
105
  code: 'TYPE_COUNT_MISMATCH',
106
- message: `Formation type is "swarm" but has ${agentCount} agent(s) (expected 6+)`,
106
+ message: `Formation type is "school" but has ${agentCount} agent(s) (expected 6+)`,
107
107
  path: 'type',
108
108
  });
109
109
  }
@@ -1 +1 @@
1
- {"version":3,"file":"structural-validator.js","sourceRoot":"","sources":["../../src/core/structural-validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"structural-validator.js","sourceRoot":"","sources":["../../src/core/structural-validator.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export interface ResolveOptions {
3
3
  cliOverrides?: Record<string, string>;
4
4
  envFilePath?: string;
5
5
  interactive?: boolean;
6
+ noEnv?: boolean;
6
7
  }
7
8
  export interface ResolveResult {
8
9
  resolved: Record<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"variable-resolver.d.ts","sourceRoot":"","sources":["../../src/core/variable-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EACnC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA+BxB"}
1
+ {"version":3,"file":"variable-resolver.d.ts","sourceRoot":"","sources":["../../src/core/variable-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EACnC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAyCxB"}
@@ -4,15 +4,17 @@ import { parse as parseDotenv } from 'dotenv';
4
4
  export async function resolveVariables(variables, formationDir, options = {}) {
5
5
  const resolved = {};
6
6
  const missing = [];
7
- // Load .env file if present
7
+ // Load .env file if present (skip with --no-env)
8
8
  let envFileVars = {};
9
- const envPath = options.envFilePath ?? join(formationDir, '.env');
10
- try {
11
- const envContent = await readFile(envPath, 'utf-8');
12
- envFileVars = parseDotenv(Buffer.from(envContent));
13
- }
14
- catch {
15
- // .env file not found — that's fine
9
+ if (!options.noEnv) {
10
+ const envPath = options.envFilePath ?? join(formationDir, '.env');
11
+ try {
12
+ const envContent = await readFile(envPath, 'utf-8');
13
+ envFileVars = parseDotenv(Buffer.from(envContent));
14
+ }
15
+ catch {
16
+ // .env file not found — that's fine
17
+ }
16
18
  }
17
19
  for (const [name, config] of Object.entries(variables)) {
18
20
  // Precedence: CLI > .env > env > defaults
@@ -29,8 +31,17 @@ export async function resolveVariables(variables, formationDir, options = {}) {
29
31
  resolved[name] = String(config.default);
30
32
  }
31
33
  else if (config.required) {
32
- // Interactive prompting would go here for `reef install`
33
- missing.push(name);
34
+ if (options.interactive) {
35
+ const { input, password } = await import('@inquirer/prompts');
36
+ const promptFn = config.sensitive ? password : input;
37
+ const answer = await promptFn({
38
+ message: `${name}${config.description ? ` (${config.description})` : ''}:`,
39
+ });
40
+ resolved[name] = answer;
41
+ }
42
+ else {
43
+ missing.push(name);
44
+ }
34
45
  }
35
46
  }
36
47
  return { resolved, missing };