@moda-ai/cli 1.55.9 → 1.55.11

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 (32) hide show
  1. package/dist/agent-n0ch2j90.js +459 -0
  2. package/dist/cli-11fevr8y.js +811 -0
  3. package/dist/{cli-mx9r1689.js → cli-429zt7g4.js} +1 -65
  4. package/dist/cli-4qe6n8am.js +345 -0
  5. package/dist/cli-97fnztpy.js +140 -0
  6. package/dist/{cli-sjc132j8.js → cli-fq7kk77e.js} +18 -1733
  7. package/dist/cli-fwec3m42.js +946 -0
  8. package/dist/cli-g7ferymy.js +496 -0
  9. package/dist/cli-k5qqj2bp.js +70 -0
  10. package/dist/cli-m16taf4z.js +30 -0
  11. package/dist/{cli-4af3thx7.js → cli-m857n028.js} +195 -976
  12. package/dist/{cli-fhfdnvh4.js → cli-n9gexgma.js} +2 -2
  13. package/dist/{cli-tw8jj190.js → cli-t4jjhn3g.js} +5 -7
  14. package/dist/cli-tmqd1f0m.js +159 -0
  15. package/dist/cli.js +1410 -7193
  16. package/dist/doctor-spvy2zb3.js +23 -0
  17. package/dist/fix-ax6bbg37.js +1444 -0
  18. package/dist/{harness-github-actions-73a08nct.js → harness-github-actions-mtksqp3c.js} +7 -2
  19. package/dist/{harness-yshh2pgj.js → harness-jbqpbp6n.js} +7 -2
  20. package/dist/{index-f3k9jgrt.js → index-2d0q94sv.js} +35 -36
  21. package/dist/production-intelligence-1tf98n79.js +1802 -0
  22. package/dist/profile-commands-f6599bcx.js +481 -0
  23. package/dist/prompt-source-mcp.js +8 -3
  24. package/dist/prompts-y3xd9heh.js +40 -0
  25. package/dist/{provision-parsn3xg.js → provision-cjpsswa9.js} +7 -5
  26. package/dist/registry-1dvxsekd.js +1201 -0
  27. package/dist/skills-1k0hbkaf.js +19 -0
  28. package/dist/sync-by81xqk4.js +54 -0
  29. package/package.json +6 -7
  30. package/skills/integration/index.json +2 -2
  31. package/skills/moda-cli/SKILL.md +2 -2
  32. package/hooks/moda-snapshot.sh +0 -41
@@ -0,0 +1,481 @@
1
+ import {
2
+ authFetch,
3
+ clearAuthSession,
4
+ isAuthSessionValid,
5
+ loadAuthSession,
6
+ login,
7
+ revokeCliSessionToken
8
+ } from "./cli-t4jjhn3g.js";
9
+ import {
10
+ apiKeyHeaders
11
+ } from "./cli-m16taf4z.js";
12
+ import {
13
+ CliInputError,
14
+ DEFAULT_INGEST_URL,
15
+ EXIT_AUTH_REQUIRED,
16
+ EXIT_DEGRADED,
17
+ EXIT_OK,
18
+ PROD_BASE_URL,
19
+ clearStoredApiKeyCredentials,
20
+ describeBaseUrlSource,
21
+ embeddedTenantIdFromApiKey,
22
+ ensureSecretFilePermissions,
23
+ getActiveProfile,
24
+ getModaPaths,
25
+ loadProfileConfig,
26
+ recordApiRequest,
27
+ resolveApiKey,
28
+ resolveApiKeyFromActiveProfile,
29
+ resolveApiTenantId,
30
+ resolveIngestUrl,
31
+ resolveModaBaseUrl,
32
+ resolveSecretReference,
33
+ saveCliConfig,
34
+ secretFilePathFromRef,
35
+ setActiveProfile,
36
+ upsertProfile
37
+ } from "./cli-429zt7g4.js";
38
+ import"./cli-0v6na3yp.js";
39
+
40
+ // src/api-key-auth.ts
41
+ var PROBE_TIMEOUT_MS = 1e4;
42
+ function resolveApiKeyCredential(options = {}) {
43
+ const key = resolveApiKey(options);
44
+ if (!key)
45
+ return;
46
+ const env = options.env ?? process.env;
47
+ const source = env.MODA_API_KEY === key ? "env" : resolveApiKeyFromActiveProfile(options) === key ? "profile" : "config";
48
+ return { key, source, tenantId: embeddedTenantIdFromApiKey(key) };
49
+ }
50
+ function redactApiKey(key) {
51
+ if (key.length <= 12)
52
+ return "<redacted>";
53
+ return `${key.slice(0, 8)}...${key.slice(-4)}`;
54
+ }
55
+ async function probeApiKey(key, options = {}) {
56
+ let response;
57
+ try {
58
+ recordApiRequest();
59
+ response = await fetch(`${resolveModaBaseUrl(options)}/api/v1/data/overview`, {
60
+ method: "GET",
61
+ headers: apiKeyHeaders(key, options),
62
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS)
63
+ });
64
+ } catch (error) {
65
+ const reason = error instanceof Error ? error.message : String(error);
66
+ return { outcome: "unreachable", reason };
67
+ }
68
+ if (response.status === 401 || response.status === 403) {
69
+ return { outcome: "rejected", status: response.status };
70
+ }
71
+ if (response.status !== 200) {
72
+ return { outcome: "unreachable", reason: `HTTP ${response.status}` };
73
+ }
74
+ try {
75
+ await response.json();
76
+ } catch {
77
+ return { outcome: "unreachable", reason: "non-JSON response from the Data API" };
78
+ }
79
+ return { outcome: "live" };
80
+ }
81
+
82
+ // src/profile-commands.ts
83
+ var ONLINE_PROBE_TIMEOUT_MS = 5000;
84
+ function subcommand(context) {
85
+ return context.positionals[0];
86
+ }
87
+ function unknownSubcommandError(parent, attempted, valid) {
88
+ const message = attempted ? `Unknown ${parent} subcommand '${attempted}'. Valid subcommands: ${valid.join(", ")}.` : `A ${parent} subcommand is required. Valid subcommands: ${valid.join(", ")}.`;
89
+ return new CliInputError(message, `Usage: moda ${parent} <${valid.join("|")}>`);
90
+ }
91
+ function requirePositional(context, index, usage) {
92
+ const value = context.positionals[index];
93
+ if (!value)
94
+ throw new CliInputError("Missing required argument.", usage);
95
+ return value;
96
+ }
97
+ function flag(context, name) {
98
+ const value = context.flags[name];
99
+ return value && value !== "true" ? value : undefined;
100
+ }
101
+ function boolFlag(context, name) {
102
+ return context.flags[name] === "true";
103
+ }
104
+ function normalizeEnvironment(value) {
105
+ if (value === "local" || value === "dev" || value === "staging" || value === "prod") {
106
+ return value;
107
+ }
108
+ return "prod";
109
+ }
110
+ function defaultBaseUrl(environment) {
111
+ if (environment === "local")
112
+ return "http://localhost:3000";
113
+ if (environment === "staging")
114
+ return "https://staging.moda.dev";
115
+ return PROD_BASE_URL;
116
+ }
117
+ function defaultIngestUrl(environment) {
118
+ if (environment === "local")
119
+ return "http://localhost:8787";
120
+ return DEFAULT_INGEST_URL;
121
+ }
122
+ function redactSecret(value) {
123
+ if (!value)
124
+ return;
125
+ if (value.length <= 12)
126
+ return "<redacted>";
127
+ return `${value.slice(0, 8)}...${value.slice(-4)}`;
128
+ }
129
+ function serializeProfile(profile, activeProfile) {
130
+ return {
131
+ name: profile.name,
132
+ active: profile.name === activeProfile,
133
+ environment: profile.environment,
134
+ base_url: profile.base_url,
135
+ ingest_url: profile.ingest_url,
136
+ tenant_id: profile.tenant_id,
137
+ workspace_id: profile.workspace_id,
138
+ api_key_ref: profile.api_key_ref,
139
+ auth_token_ref: profile.auth_token_ref
140
+ };
141
+ }
142
+ async function readStdin() {
143
+ const chunks = [];
144
+ for await (const chunk of process.stdin)
145
+ chunks.push(Buffer.from(chunk));
146
+ return Buffer.concat(chunks).toString("utf8").trim();
147
+ }
148
+ async function apiKeyLoginCandidate(context) {
149
+ if (boolFlag(context, "api-key-stdin")) {
150
+ const piped = await readStdin();
151
+ if (piped)
152
+ return { key: piped, fromArgv: false };
153
+ throw new CliInputError("No API key received on stdin.", 'Pipe the key in, e.g. `printf %s "$KEY" | moda auth login --api-key-stdin`.');
154
+ }
155
+ const inline = flag(context, "api-key");
156
+ if (inline)
157
+ return { key: inline, fromArgv: true };
158
+ const env = context.env ?? process.env;
159
+ if (env.MODA_API_KEY)
160
+ return { key: env.MODA_API_KEY, fromArgv: false };
161
+ return;
162
+ }
163
+ async function loginWithApiKey(context, candidate) {
164
+ const { key } = candidate;
165
+ if (candidate.fromArgv) {
166
+ console.error('Warning: passing the key as --api-key=<key> exposes it in this process\'s command line and your shell history. Prefer MODA_API_KEY, or `printf %s "$KEY" | moda auth login --api-key-stdin`.');
167
+ }
168
+ const authOptions = { profile: context.profile, env: context.env };
169
+ const probe = await probeApiKey(key, authOptions);
170
+ if (probe.outcome === "rejected") {
171
+ throw new CliInputError(`API key rejected by the Moda API (HTTP ${probe.status}).`, 'The key is revoked, malformed, or belongs to another environment. Mint a new one with "moda provision --tenant-id=<org-id>", or check MODA_BASE_URL points at the right environment.');
172
+ }
173
+ if (probe.outcome === "unreachable") {
174
+ throw new CliInputError(`Could not validate the API key: ${probe.reason}.`, "The key was not saved. Check network access to the Moda API and retry; the key itself may still be valid.");
175
+ }
176
+ const tenantId = embeddedTenantIdFromApiKey(key);
177
+ saveCliConfig({ api_key: key, ...tenantId ? { tenant_id: tenantId } : {} }, authOptions);
178
+ const envKey = (context.env ?? process.env).MODA_API_KEY;
179
+ const shadowedByEnv = Boolean(envKey && envKey !== key);
180
+ if (shadowedByEnv) {
181
+ console.error(`Warning: MODA_API_KEY is set to a different key (${redactApiKey(envKey)}) and takes precedence over the key just saved. Later commands will use the environment key. Unset MODA_API_KEY to use the saved credential.`);
182
+ }
183
+ context.output.writeData({
184
+ status: "authenticated",
185
+ method: "api_key",
186
+ profile: context.profile ?? context.env?.MODA_PROFILE ?? process.env.MODA_PROFILE ?? null,
187
+ apiKeyCredential: { masked: redactApiKey(key) },
188
+ tenant_id: tenantId ?? null,
189
+ persisted: true,
190
+ shadowed_by_env: shadowedByEnv,
191
+ effective_credential: shadowedByEnv ? "env" : "saved"
192
+ }, shadowedByEnv ? { status: "degraded" } : undefined);
193
+ return { exitCode: shadowedByEnv ? EXIT_DEGRADED : EXIT_OK };
194
+ }
195
+ async function runAuthCommand(context) {
196
+ switch (subcommand(context)) {
197
+ case "login": {
198
+ const wantsApiKey = "api-key" in context.flags || boolFlag(context, "api-key-stdin");
199
+ const nonInteractive = boolFlag(context, "non-interactive");
200
+ const candidate = wantsApiKey || nonInteractive ? await apiKeyLoginCandidate(context) : undefined;
201
+ if (candidate)
202
+ return loginWithApiKey(context, candidate);
203
+ if (wantsApiKey || nonInteractive) {
204
+ throw new CliInputError("No API key available for non-interactive login.", 'Set MODA_API_KEY, pipe the key with "moda auth login --api-key-stdin", or pass "moda auth login --api-key=<key>" (exposes it in argv). Mint a key with "moda provision --tenant-id=<org-id>" (needs an existing browser session), or run "moda init".');
205
+ }
206
+ const screen = flag(context, "screen") === "signup" ? "signup" : "login";
207
+ await login(screen, { profile: context.profile, env: context.env });
208
+ context.output.writeData({
209
+ status: "authenticated",
210
+ method: "browser",
211
+ profile: context.profile ?? process.env.MODA_PROFILE ?? null
212
+ });
213
+ return { exitCode: 0 };
214
+ }
215
+ case "logout": {
216
+ await revokeCliSessionToken({ profile: context.profile, env: context.env });
217
+ clearAuthSession({ profile: context.profile, env: context.env });
218
+ const apiKeyCleared = clearStoredApiKeyCredentials({
219
+ profile: context.profile,
220
+ env: context.env
221
+ });
222
+ if (context.env.MODA_API_KEY) {
223
+ console.error("Note: MODA_API_KEY is set in the environment and still takes precedence. Unset it to fully sign out.");
224
+ }
225
+ context.output.writeData({
226
+ status: "logged_out",
227
+ profile: context.profile ?? process.env.MODA_PROFILE ?? null,
228
+ api_key_cleared: apiKeyCleared
229
+ });
230
+ return { exitCode: 0 };
231
+ }
232
+ case "whoami": {
233
+ const session = loadAuthSession({ profile: context.profile, env: context.env });
234
+ if (!session) {
235
+ const credential = resolveApiKeyCredential({
236
+ profile: context.profile,
237
+ env: context.env
238
+ });
239
+ if (credential) {
240
+ const probe = await probeApiKey(credential.key, {
241
+ profile: context.profile,
242
+ env: context.env
243
+ });
244
+ if (probe.outcome === "rejected") {
245
+ throw new CliInputError(`API key rejected by the Moda API (HTTP ${probe.status}).`, 'The key is revoked or belongs to another environment. Mint a new one with "moda provision --tenant-id=<org-id>", or run "moda auth login".');
246
+ }
247
+ context.output.writeData({
248
+ profile: context.profile ?? process.env.MODA_PROFILE ?? null,
249
+ credential: "api_key",
250
+ apiKeyCredential: {
251
+ source: credential.source,
252
+ masked: redactApiKey(credential.key),
253
+ verified: probe.outcome === "live"
254
+ },
255
+ tenant_id: credential.tenantId ?? null,
256
+ session: null,
257
+ context: null
258
+ }, probe.outcome === "live" ? undefined : { status: "degraded" });
259
+ return { exitCode: probe.outcome === "live" ? EXIT_OK : EXIT_DEGRADED };
260
+ }
261
+ throw new CliInputError("Not authenticated.", 'Non-interactive: set MODA_API_KEY, or run "moda auth login --api-key=<key>". Interactive: run "moda auth login" or "moda init".');
262
+ }
263
+ const response = await authFetch("/api/cli/context", {}, { profile: context.profile, env: context.env });
264
+ if (!response.ok) {
265
+ const body = await response.text();
266
+ throw new Error(`Failed to fetch auth context (${response.status}): ${body}`);
267
+ }
268
+ const data = await response.json();
269
+ context.output.writeData({
270
+ profile: context.profile ?? process.env.MODA_PROFILE ?? null,
271
+ session: {
272
+ expires_at: session.expires_at,
273
+ token_type: session.token_type ?? "bearer"
274
+ },
275
+ context: data
276
+ });
277
+ return { exitCode: 0 };
278
+ }
279
+ case "status": {
280
+ const authOptions = { profile: context.profile, env: context.env };
281
+ const session = loadAuthSession({ ...authOptions, includeExpired: true });
282
+ const loggedIn = isAuthSessionValid(session);
283
+ const credential = resolveApiKeyCredential(authOptions);
284
+ const data = {
285
+ loggedIn,
286
+ authenticated: loggedIn || Boolean(credential),
287
+ apiKeyCredential: credential ? {
288
+ present: true,
289
+ source: credential.source,
290
+ masked: redactApiKey(credential.key),
291
+ tenantId: credential.tenantId ?? null,
292
+ verified: null
293
+ } : { present: false },
294
+ profile: context.profile ?? context.env.MODA_PROFILE ?? session?.profile ?? null,
295
+ expiresAt: session ? new Date(session.expires_at * 1000).toISOString() : null
296
+ };
297
+ if (session?.user_email) {
298
+ data.user = { email: session.user_email };
299
+ }
300
+ if (boolFlag(context, "online")) {
301
+ let online = { reachable: false };
302
+ try {
303
+ const response = await authFetch("/api/cli/context", { signal: AbortSignal.timeout(ONLINE_PROBE_TIMEOUT_MS) }, authOptions);
304
+ online = { reachable: true, ok: response.ok };
305
+ if (response.ok) {
306
+ const body = await response.json();
307
+ if (Array.isArray(body.tenants)) {
308
+ online.tenantCount = body.tenants.length;
309
+ }
310
+ }
311
+ } catch {}
312
+ data.online = online;
313
+ if (credential && data.apiKeyCredential.present) {
314
+ const probe = await probeApiKey(credential.key, authOptions);
315
+ data.apiKeyCredential.verified = probe.outcome === "live";
316
+ if (probe.outcome === "rejected") {
317
+ data.authenticated = loggedIn;
318
+ }
319
+ }
320
+ }
321
+ context.output.writeData(data);
322
+ return { exitCode: data.authenticated ? EXIT_OK : EXIT_AUTH_REQUIRED };
323
+ }
324
+ case "token": {
325
+ const session = loadAuthSession({ profile: context.profile, env: context.env });
326
+ if (!session) {
327
+ if (context.flags.json === "true") {
328
+ process.stdout.write(`${JSON.stringify({ error: "not_authenticated" })}
329
+ `);
330
+ } else {
331
+ console.error('Not authenticated. Run "moda auth login".');
332
+ }
333
+ return { exitCode: EXIT_AUTH_REQUIRED };
334
+ }
335
+ process.stdout.write(`${session.access_token}
336
+ `);
337
+ return { exitCode: EXIT_OK };
338
+ }
339
+ case "api-key": {
340
+ const credential = resolveApiKeyCredential({ profile: context.profile, env: context.env });
341
+ if (!credential) {
342
+ if (context.flags.json === "true") {
343
+ process.stdout.write(`${JSON.stringify({ error: "no_api_key" })}
344
+ `);
345
+ } else {
346
+ console.error('No API key saved. Run "moda init" (or "moda auth login --api-key-stdin").');
347
+ }
348
+ return { exitCode: EXIT_AUTH_REQUIRED };
349
+ }
350
+ process.stdout.write(`${credential.key}
351
+ `);
352
+ return { exitCode: EXIT_OK };
353
+ }
354
+ default:
355
+ throw unknownSubcommandError("auth", subcommand(context), ["api-key", "login", "logout", "status", "token", "whoami"]);
356
+ }
357
+ }
358
+ async function runProfilesCommand(context) {
359
+ switch (subcommand(context)) {
360
+ case "list": {
361
+ const config = loadProfileConfig({ env: context.env });
362
+ const { name: effective, source } = effectiveProfile(context, config.active_profile);
363
+ const missing = !config.profiles[effective];
364
+ context.output.writeData({
365
+ active_profile: effective,
366
+ active_profile_source: source,
367
+ default_profile: config.active_profile,
368
+ profiles: Object.values(config.profiles).map((profile) => serializeProfile(profile, effective)),
369
+ migrations: config.migrations
370
+ }, missing ? { warnings: [`The active profile '${effective}' (from ${source}) does not exist. Create it with \`moda profiles create ${effective}\` or select an existing profile.`] } : undefined);
371
+ return { exitCode: 0 };
372
+ }
373
+ case "use": {
374
+ const name = requirePositional(context, 1, "Usage: moda profiles use <name>");
375
+ const config = setActiveProfile(name, { env: context.env });
376
+ context.output.writeData({
377
+ active_profile: config.active_profile,
378
+ profile: serializeProfile(config.profiles[name], config.active_profile)
379
+ });
380
+ return { exitCode: 0 };
381
+ }
382
+ case "create": {
383
+ const name = requirePositional(context, 1, "Usage: moda profiles create <name>");
384
+ const environment = normalizeEnvironment(flag(context, "environment") ?? name);
385
+ const profile = {
386
+ name,
387
+ environment,
388
+ base_url: flag(context, "base-url") ?? defaultBaseUrl(environment),
389
+ ingest_url: flag(context, "ingest-url") ?? defaultIngestUrl(environment),
390
+ tenant_id: flag(context, "tenant-id"),
391
+ workspace_id: flag(context, "workspace-id"),
392
+ api_key_ref: flag(context, "api-key-ref"),
393
+ metadata: {
394
+ created_at: new Date().toISOString(),
395
+ source: "profiles.create"
396
+ }
397
+ };
398
+ const config = upsertProfile(profile, { env: context.env });
399
+ const next = boolFlag(context, "use") ? setActiveProfile(name, { env: context.env }) : config;
400
+ context.output.writeData({
401
+ active_profile: next.active_profile,
402
+ profile: serializeProfile(next.profiles[name], next.active_profile)
403
+ });
404
+ return { exitCode: 0 };
405
+ }
406
+ case "doctor": {
407
+ const requested = context.positionals[1];
408
+ const config = loadProfileConfig({ env: context.env });
409
+ const activeName = requested ?? context.profile ?? config.active_profile;
410
+ const profile = config.profiles[activeName];
411
+ if (!profile)
412
+ throw new CliInputError(`Moda profile '${activeName}' does not exist.`);
413
+ const secretPath = profile.api_key_ref ? secretFilePathFromRef(profile.api_key_ref) : undefined;
414
+ const permission = secretPath ? ensureSecretFilePermissions(secretPath) : undefined;
415
+ context.output.writeData({
416
+ profile: serializeProfile(profile, config.active_profile),
417
+ checks: [
418
+ { id: "profile_exists", status: "pass" },
419
+ {
420
+ id: "api_key_available",
421
+ status: resolveSecretReference(profile.api_key_ref) ? "pass" : "warning"
422
+ },
423
+ {
424
+ id: "tenant_selected",
425
+ status: profile.tenant_id ? "pass" : "warning"
426
+ },
427
+ ...permission ? [{
428
+ id: "secret_file_permissions",
429
+ status: permission.secure ? "pass" : "fail",
430
+ details: permission
431
+ }] : []
432
+ ]
433
+ });
434
+ return { exitCode: 0 };
435
+ }
436
+ default:
437
+ throw unknownSubcommandError("profiles", subcommand(context), ["list", "use", "create", "doctor"]);
438
+ }
439
+ }
440
+ function effectiveProfile(context, storedDefault) {
441
+ const envProfile = context.env.MODA_PROFILE?.trim();
442
+ if (context.profile)
443
+ return { name: context.profile, source: "flag" };
444
+ if (envProfile)
445
+ return { name: envProfile, source: "env:MODA_PROFILE" };
446
+ return { name: storedDefault, source: "config" };
447
+ }
448
+ async function runConfigCommand(context) {
449
+ if (subcommand(context) !== "show") {
450
+ throw unknownSubcommandError("config", subcommand(context), ["show"]);
451
+ }
452
+ const config = loadProfileConfig({ env: context.env });
453
+ const profile = getActiveProfile({ profile: context.profile, env: context.env });
454
+ const options = { profile: profile.name, env: context.env };
455
+ const envProfile = context.env.MODA_PROFILE?.trim();
456
+ const apiKey = resolveApiKey(options);
457
+ const baseUrl = resolveModaBaseUrl(options);
458
+ context.output.writeData({
459
+ moda_dir: getModaPaths({ env: context.env }).dir,
460
+ active_profile: profile.name,
461
+ active_profile_source: context.profile ? "flag" : envProfile ? "env:MODA_PROFILE" : "config",
462
+ default_profile: config.active_profile,
463
+ profile: serializeProfile(profile, profile.name),
464
+ resolved: {
465
+ api_key: redactSecret(apiKey),
466
+ api_key_source: context.env.MODA_API_KEY ? "env:MODA_API_KEY" : profile.api_key_ref === "legacy:config.api_key" && apiKey ? "legacy_config" : resolveApiKeyFromActiveProfile(options) ? "profile" : apiKey ? "legacy_config" : "none",
467
+ base_url: baseUrl,
468
+ base_url_source: describeBaseUrlSource(options),
469
+ ingest_url: resolveIngestUrl(options),
470
+ tenant_id: resolveApiTenantId(options),
471
+ workspace_id: profile.workspace_id
472
+ },
473
+ migrations: config.migrations
474
+ });
475
+ return { exitCode: 0 };
476
+ }
477
+ export {
478
+ runProfilesCommand,
479
+ runConfigCommand,
480
+ runAuthCommand
481
+ };
@@ -5,8 +5,13 @@ import {
5
5
  inspectCodeSelectors,
6
6
  inspectPythonSelectors,
7
7
  safePromptEvidencePath
8
- } from "./cli-4af3thx7.js";
9
- import"./cli-mx9r1689.js";
8
+ } from "./cli-m857n028.js";
9
+ import"./cli-97fnztpy.js";
10
+ import"./cli-k5qqj2bp.js";
11
+ import"./cli-g7ferymy.js";
12
+ import"./cli-tmqd1f0m.js";
13
+ import"./cli-m16taf4z.js";
14
+ import"./cli-429zt7g4.js";
10
15
  import {
11
16
  __commonJS,
12
17
  __toESM
@@ -9258,7 +9263,7 @@ class StdioServerTransport {
9258
9263
  }
9259
9264
 
9260
9265
  // src/prompt-analyst-tools.ts
9261
- import { relative, resolve } from "node:path";
9266
+ import { resolve } from "node:path";
9262
9267
  function safeRoot(rootDir) {
9263
9268
  const root = resolve(rootDir);
9264
9269
  return root;
@@ -0,0 +1,40 @@
1
+ import {
2
+ assertReplayablePrompt,
3
+ discoverPrompts,
4
+ importHarnessPromptSources,
5
+ initPrompts,
6
+ inspectPromptManifest,
7
+ migratePromptManifest,
8
+ parsePromptFileForAb,
9
+ promptManifestWarnings,
10
+ readPromptLock,
11
+ runPromptSync,
12
+ runPromptsCommand,
13
+ writePromptSyncProgress
14
+ } from "./cli-fq7kk77e.js";
15
+ import {
16
+ promptSourceHashPayload
17
+ } from "./cli-mm48br00.js";
18
+ import"./cli-m857n028.js";
19
+ import"./cli-97fnztpy.js";
20
+ import"./cli-k5qqj2bp.js";
21
+ import"./cli-g7ferymy.js";
22
+ import"./cli-tmqd1f0m.js";
23
+ import"./cli-m16taf4z.js";
24
+ import"./cli-429zt7g4.js";
25
+ import"./cli-0v6na3yp.js";
26
+ export {
27
+ writePromptSyncProgress,
28
+ runPromptsCommand,
29
+ runPromptSync,
30
+ readPromptLock,
31
+ promptSourceHashPayload,
32
+ promptManifestWarnings,
33
+ parsePromptFileForAb,
34
+ migratePromptManifest,
35
+ inspectPromptManifest,
36
+ initPrompts,
37
+ importHarnessPromptSources,
38
+ discoverPrompts,
39
+ assertReplayablePrompt
40
+ };
@@ -1,15 +1,17 @@
1
1
  import {
2
2
  selectTenantAndCreateKey
3
- } from "./cli-fhfdnvh4.js";
3
+ } from "./cli-n9gexgma.js";
4
4
  import {
5
5
  loadAuthSession
6
- } from "./cli-tw8jj190.js";
6
+ } from "./cli-t4jjhn3g.js";
7
+ import {
8
+ stringOption
9
+ } from "./cli-k5qqj2bp.js";
7
10
  import {
8
11
  CliAuthError,
9
12
  resolveIngestUrl,
10
- resolveModaBaseUrl,
11
- stringOption
12
- } from "./cli-mx9r1689.js";
13
+ resolveModaBaseUrl
14
+ } from "./cli-429zt7g4.js";
13
15
  import"./cli-0v6na3yp.js";
14
16
 
15
17
  // src/provision.ts