@moda-ai/cli 1.55.30 → 1.55.32

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 CHANGED
@@ -143,7 +143,9 @@ Flag aliases: `moda context --message-index=N` = `--msg-index=N`, and
143
143
  `moda users --limit=N` = `--page-size=N`. Each command rejects a flag it does
144
144
  not take, and time windows differ by command: `--days-back=N` (a whole number,
145
145
  1-90) on the overview, Problem and detection commands, `--time-range` on
146
- `traces`, `search` and `clusters`. Boolean flags accept `true`/`false`, `1`/`0`,
146
+ `traces`, `search` and `clusters`. The other window spelling is rewritten when
147
+ it names the same span (`--days-back=7` is `--time-range=7d`, `--time-range=30d`
148
+ is `--days-back=30`); one with no exact match fails. Boolean flags accept `true`/`false`, `1`/`0`,
147
149
  `yes`/`no` and `on`/`off`.
148
150
 
149
151
  Prompt management:
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  buildDoctorReport
3
- } from "./cli-2eqh3150.js";
3
+ } from "./cli-a03st7e3.js";
4
4
  import"./cli-9bgnvth2.js";
5
- import"./cli-6ycf2aj5.js";
5
+ import"./cli-zgj5bakm.js";
6
6
  import"./cli-mm48br00.js";
7
7
  import {
8
8
  readHarnessSyncState
@@ -94,7 +94,7 @@ async function buildAgentContext(context) {
94
94
  const graph = readHarnessGraphIfPresent(context.cwd);
95
95
  const reportState = readHarnessReportState(context.cwd);
96
96
  const syncState = readHarnessSyncState(context.cwd);
97
- const harness = graph ? await import("./harness-8rbsmg8y.js") : undefined;
97
+ const harness = graph ? await import("./harness-6vwehf47.js") : undefined;
98
98
  const topFindings = doctor.checks.filter((check) => check.status === "fail" || check.status === "warning").slice(0, 12).map(checkToFinding);
99
99
  const evidenceRefs = [
100
100
  ...doctor.checks.map(checkToEvidenceRef),
@@ -4,7 +4,7 @@ import {
4
4
  } from "./cli-9bgnvth2.js";
5
5
  import {
6
6
  inspectPromptManifest
7
- } from "./cli-6ycf2aj5.js";
7
+ } from "./cli-zgj5bakm.js";
8
8
  import {
9
9
  readHarnessSyncState,
10
10
  renderDoctorHuman,
@@ -376,7 +376,7 @@ async function harnessCurrentCheck(cwd, manifestPath, manifestExists, tenantId)
376
376
  };
377
377
  }
378
378
  try {
379
- const { scanHarness } = await import("./harness-8rbsmg8y.js");
379
+ const { scanHarness } = await import("./harness-6vwehf47.js");
380
380
  const current = scanHarness({
381
381
  rootDir: cwd,
382
382
  scannerVersion: "doctor",
@@ -9,7 +9,7 @@ import {
9
9
  parsePromptFileForAb,
10
10
  readPromptLock,
11
11
  runPromptSync
12
- } from "./cli-6ycf2aj5.js";
12
+ } from "./cli-zgj5bakm.js";
13
13
  import {
14
14
  UUID_RE
15
15
  } from "./cli-n2hng3gv.js";
@@ -14048,7 +14048,7 @@ async function runHarnessCommand(context) {
14048
14048
  throw new CliInputError("Focused remote prompt analysis is not supported yet.", "Use local --analyst=claude|codex|cursor|local-scan, or drop --concern for a full remote report.");
14049
14049
  }
14050
14050
  if (context.flags["github-actions"] === "true") {
14051
- const { runGithubActionsAnalyze } = await import("./harness-github-actions-jwfvzf5x.js");
14051
+ const { runGithubActionsAnalyze } = await import("./harness-github-actions-6gdrpn4m.js");
14052
14052
  const result = await runGithubActionsAnalyze(rootDir, {
14053
14053
  writeReport: (report2) => {
14054
14054
  const normalized = normalizeHarnessReport(report2);
@@ -5725,9 +5725,9 @@ async function runPromptsCommand(input, legacyFlags, legacyProfileOptions) {
5725
5725
  await promotePrompt(positionals, flags, profileOptions, context);
5726
5726
  break;
5727
5727
  case "ab":
5728
- return (await import("./prompts-ab-98pqf06s.js")).runPromptAb(flags, profileOptions, context);
5728
+ return (await import("./prompts-ab-qed3ra5e.js")).runPromptAb(flags, profileOptions, context);
5729
5729
  case "propose":
5730
- await (await import("./prompts-propose-md1k1ax8.js")).runPromptPropose(positionals, flags, profileOptions, context);
5730
+ await (await import("./prompts-propose-y5r68pcw.js")).runPromptPropose(positionals, flags, profileOptions, context);
5731
5731
  break;
5732
5732
  case "list":
5733
5733
  case "show":
@@ -5830,7 +5830,7 @@ async function runPromptSyncExclusive(flags, profileOptions, options) {
5830
5830
  const analyzedDefinitions = new Map;
5831
5831
  if (flags["no-analyze"] !== "true") {
5832
5832
  options.onProgress?.("Analyzing prompt sources before sync.");
5833
- const { analyzeHarnessPrompts } = await import("./harness-8rbsmg8y.js");
5833
+ const { analyzeHarnessPrompts } = await import("./harness-6vwehf47.js");
5834
5834
  const result = await analyzeHarnessPrompts({
5835
5835
  rootDir: process.cwd(),
5836
5836
  existing: established.flatMap((prompt) => prompt.sourceDefinition ? [prompt.sourceDefinition.source] : []),
@@ -5858,7 +5858,7 @@ async function runPromptSyncExclusive(flags, profileOptions, options) {
5858
5858
  const mergedSources = mergePromptSources(manifest.sources, extraSources);
5859
5859
  const manifestUpdate = stableJson(mergedSources) === stableJson(mergePromptSources(manifest.sources, [])) ? undefined : $stringify({ version: 2, prompt_paths: manifest.promptPaths, sources: mergedSources });
5860
5860
  const prompts = await discoverPrompts(extraSources);
5861
- const { checkPromptAttribution } = await import("./prompt-attribution-gypvn8z9.js");
5861
+ const { checkPromptAttribution } = await import("./prompt-attribution-t0eq8gn8.js");
5862
5862
  const attribution = checkPromptAttribution(process.cwd(), prompts.map((prompt) => prompt.key));
5863
5863
  const brokenAttribution = attribution.references.filter((reference) => reference.status === "missing");
5864
5864
  if (brokenAttribution.length) {
@@ -6164,7 +6164,7 @@ async function migratePromptManifest(options = {}) {
6164
6164
  let addedSources = [];
6165
6165
  let pendingSources = [];
6166
6166
  if (options.discover) {
6167
- const { analyzeHarnessPrompts } = await import("./harness-8rbsmg8y.js");
6167
+ const { analyzeHarnessPrompts } = await import("./harness-6vwehf47.js");
6168
6168
  const result = await analyzeHarnessPrompts({
6169
6169
  rootDir: root,
6170
6170
  existing: manifest.sources,
package/dist/cli.js CHANGED
@@ -2959,7 +2959,7 @@ function leafManifestFields(leaf, commands) {
2959
2959
  import { fileURLToPath } from "url";
2960
2960
  import { realpathSync } from "fs";
2961
2961
  async function runPromptsCommand(...args) {
2962
- return (await import("./prompts-3qr24vd6.js")).runPromptsCommand(...args);
2962
+ return (await import("./prompts-kswdk3ft.js")).runPromptsCommand(...args);
2963
2963
  }
2964
2964
  async function runSkillsCommand(...args) {
2965
2965
  return (await import("./skills-j8865009.js")).runSkillsCommand(...args);
@@ -2971,19 +2971,19 @@ async function runFixesCommand(...args) {
2971
2971
  return (await import("./fix-w5z02wt4.js")).runFixesCommand(...args);
2972
2972
  }
2973
2973
  async function runHarnessCommand(...args) {
2974
- return (await import("./harness-8rbsmg8y.js")).runHarnessCommand(...args);
2974
+ return (await import("./harness-6vwehf47.js")).runHarnessCommand(...args);
2975
2975
  }
2976
2976
  async function runSyncCommand(...args) {
2977
- return (await import("./sync-q9raqnk4.js")).runSyncCommand(...args);
2977
+ return (await import("./sync-5e8t28t7.js")).runSyncCommand(...args);
2978
2978
  }
2979
2979
  async function runRegistryCommand(...args) {
2980
2980
  return (await import("./registry-ctnn8e26.js")).runRegistryCommand(...args);
2981
2981
  }
2982
2982
  async function runDoctorCommand(...args) {
2983
- return (await import("./doctor-2hd9rq68.js")).runDoctorCommand(...args);
2983
+ return (await import("./doctor-hnzte896.js")).runDoctorCommand(...args);
2984
2984
  }
2985
2985
  async function runStatusCommand(...args) {
2986
- return (await import("./doctor-2hd9rq68.js")).runStatusCommand(...args);
2986
+ return (await import("./doctor-hnzte896.js")).runStatusCommand(...args);
2987
2987
  }
2988
2988
  async function runAuthCommand(...args) {
2989
2989
  return (await import("./profile-commands-h8evz9x0.js")).runAuthCommand(...args);
@@ -2995,10 +2995,10 @@ async function runProfilesCommand(...args) {
2995
2995
  return (await import("./profile-commands-h8evz9x0.js")).runProfilesCommand(...args);
2996
2996
  }
2997
2997
  async function runAgentCommand(...args) {
2998
- return (await import("./agent-wjkgt137.js")).runAgentCommand(...args);
2998
+ return (await import("./agent-e4k17rzy.js")).runAgentCommand(...args);
2999
2999
  }
3000
3000
  async function runProductionCommand(...args) {
3001
- return (await import("./production-intelligence-wvsgjxth.js")).runProductionCommand(...args);
3001
+ return (await import("./production-intelligence-7wb1djy2.js")).runProductionCommand(...args);
3002
3002
  }
3003
3003
  function parseArgs(argv) {
3004
3004
  const args = argv.slice(2);
@@ -6143,7 +6143,7 @@ var commandRegistry = createCommandRegistry([
6143
6143
  resetApiRequestCountBeforeRun: true,
6144
6144
  telemetry: "result-and-error",
6145
6145
  handler: async (context) => {
6146
- const { runInit } = await import("./index-ecsjv99z.js");
6146
+ const { runInit } = await import("./index-6atgddwt.js");
6147
6147
  if (context.outputMode === "agent-stream") {
6148
6148
  context.output.writeEvent({
6149
6149
  event: "started",
@@ -7352,6 +7352,56 @@ function assertRoutedFlags(route, flags) {
7352
7352
  const args = Object.fromEntries(Object.keys(flags).filter((flag) => !aliases.has(flag.replace(/_/g, "-"))).map((flag) => [flag.replace(/-/g, "_"), true]));
7353
7353
  parseCommandFlags(shape.passthrough(), args, route.label, route.flagAliases ? { flagAliases: route.flagAliases } : {});
7354
7354
  }
7355
+ var DAYS_TO_TIME_RANGE = { 1: "24h", 3: "3d", 7: "7d", 30: "30d", 90: "90d" };
7356
+ function timeRangeAsDays(value) {
7357
+ if (value === "24h")
7358
+ return 1;
7359
+ const match = /^(\d+)d$/.exec(value.trim());
7360
+ const days = match ? Number(match[1]) : NaN;
7361
+ return Number.isInteger(days) && days >= 1 && days <= 90 ? days : undefined;
7362
+ }
7363
+ function daysBackAcceptsAll(handler) {
7364
+ return specsOf(handler).some((spec) => {
7365
+ return schemaShape(spec.schema).days_back?.safeParse("all").success === true;
7366
+ });
7367
+ }
7368
+ function foldWindowFlag(handler, route, ...targets) {
7369
+ const flags = targets[0];
7370
+ const accepted = new Set([
7371
+ ...specsOf(handler).flatMap((spec) => specFlagNames(spec)),
7372
+ ...route?.allowedFlags ?? []
7373
+ ]);
7374
+ const takesDays = accepted.has("days-back");
7375
+ const takesRange = accepted.has("time-range");
7376
+ if (takesDays === takesRange)
7377
+ return;
7378
+ const [from, to] = takesRange ? ["days-back", "time-range"] : ["time-range", "days-back"];
7379
+ const raw = flags[from];
7380
+ if (raw === undefined || raw === "true" || raw.trim() === "")
7381
+ return;
7382
+ const shown = canonicalCommandText(`moda ${route?.leaf.path ?? handler}`);
7383
+ if (flags[to] !== undefined) {
7384
+ throw new CliInputError(`Pass one time window: --${to} or --${from}, not both.`, `'${shown}' takes --${to}. See '${shown} --help'.`, `conflicting_window:${from}`, { field: `--${from}`, suggestedCommands: [`${shown} --help`] });
7385
+ }
7386
+ let value;
7387
+ if (takesRange) {
7388
+ value = /^\d+$/.test(raw.trim()) ? DAYS_TO_TIME_RANGE[Number(raw.trim())] : undefined;
7389
+ } else if (raw.trim() === "all" && daysBackAcceptsAll(handler)) {
7390
+ value = "all";
7391
+ } else {
7392
+ const days = timeRangeAsDays(raw);
7393
+ value = days === undefined ? undefined : String(days);
7394
+ }
7395
+ if (value === undefined) {
7396
+ const allowed = takesRange ? Object.values(DAYS_TO_TIME_RANGE).map((range) => `--time-range=${range}`) : ["--days-back=N (1-90)"];
7397
+ throw new CliInputError(`--${from}=${raw} has no exact --${to} equivalent for '${shown}', so nothing was run.`, takesRange ? `'${shown}' takes --time-range=1h|24h|3d|7d|30d|90d|all; --days-back maps only to 1, 3, 7, 30 or 90 days.` : `'${shown}' takes --days-back=N (1-90); --time-range maps only to 24h or a whole number of days up to 90d.`, `unknown_flag:${from}`, { field: `--${from}`, allowed, suggestedCommands: [`${shown} --help`] });
7398
+ }
7399
+ for (const target of new Set(targets)) {
7400
+ delete target[from];
7401
+ target[to] = value;
7402
+ }
7403
+ return from;
7404
+ }
7355
7405
  var EMPTY_VALUE_ALLOWED = {
7356
7406
  context: new Set(["msg-index", "message-index"])
7357
7407
  };
@@ -7416,6 +7466,8 @@ async function dispatchParsedCommandInner(typedParsed, startedAt) {
7416
7466
  canonicalizeFlagKeys(flags, typedParsed.bareFlags);
7417
7467
  const switchError = normalizeBooleanFlags(flags);
7418
7468
  const typedFlags = stripUpdateCheckFlag(stripTelemetryFlag(flags));
7469
+ const reportedFlags = { ...typedFlags };
7470
+ let foldedWindowFlag;
7419
7471
  const telemetryDisabled = isTelemetryDisabled(flags);
7420
7472
  if (telemetryDisabled)
7421
7473
  discardSpoolOnEnvOptOut();
@@ -7506,7 +7558,7 @@ async function dispatchParsedCommandInner(typedParsed, startedAt) {
7506
7558
  apiKey: input.apiKey ?? resolveApiKey({ profile: telemetryProfile }),
7507
7559
  profile: telemetryProfile,
7508
7560
  command: identity2?.command ?? handlerTelemetry,
7509
- flags: typedFlags,
7561
+ flags: reportedFlags,
7510
7562
  status: input.status,
7511
7563
  ...input.error !== undefined ? { errorType: classifyCliError(input.error), validationReason: cliValidationReason(input.error) } : {},
7512
7564
  exitCode: input.exitCode,
@@ -7514,7 +7566,7 @@ async function dispatchParsedCommandInner(typedParsed, startedAt) {
7514
7566
  apiRequestCount: input.apiRequestCount,
7515
7567
  adoption,
7516
7568
  ...identity2?.legacyAlias ? { legacyAlias: identity2.legacyAlias } : {},
7517
- acceptedFlags: telemetryAcceptedFlags(definition2, route),
7569
+ acceptedFlags: new Set([...telemetryAcceptedFlags(definition2, route), ...foldedWindowFlag ? [foldedWindowFlag] : []]),
7518
7570
  knownFlags: telemetryKnownFlags()
7519
7571
  });
7520
7572
  };
@@ -7556,6 +7608,7 @@ async function dispatchParsedCommandInner(typedParsed, startedAt) {
7556
7608
  if (switchError)
7557
7609
  return failEarly(switchError, definition, identity);
7558
7610
  try {
7611
+ foldedWindowFlag = foldWindowFlag(route?.handler ?? definition.name, route, typedFlags, commandFlags);
7559
7612
  if (route)
7560
7613
  assertRoutedFlags(route, typedFlags);
7561
7614
  assertFlagValues(definition.name, parsed.positionals, typedFlags, typedParsed.bareFlags, route);
@@ -3,9 +3,9 @@ import {
3
3
  promptsDiscoveredCheck,
4
4
  runDoctorCommand,
5
5
  runStatusCommand
6
- } from "./cli-2eqh3150.js";
6
+ } from "./cli-a03st7e3.js";
7
7
  import"./cli-9bgnvth2.js";
8
- import"./cli-6ycf2aj5.js";
8
+ import"./cli-zgj5bakm.js";
9
9
  import"./cli-mm48br00.js";
10
10
  import"./cli-xq45etg1.js";
11
11
  import"./cli-dr6x0zv7.js";
@@ -40,10 +40,8 @@ import {
40
40
  writeHarnessAnalyzeResult,
41
41
  writeHarnessArtifacts,
42
42
  writeHumanProgress
43
- } from "./cli-37r94bmk.js";
44
- import {
45
- readHarnessSyncState
46
- } from "./cli-xq45etg1.js";
43
+ } from "./cli-x9cwat4a.js";
44
+ import"./cli-xq45etg1.js";
47
45
  import"./cli-97fnztpy.js";
48
46
  import {
49
47
  HARNESS_ANALYZE_CONCERNS
@@ -76,7 +74,6 @@ export {
76
74
  renderExternalHarnessAnalystPrompt,
77
75
  renderAnalystSeedLines,
78
76
  renderAnalystCandidateLines,
79
- readHarnessSyncState,
80
77
  promptNameFromPath,
81
78
  numericEnvAllowZero,
82
79
  numericEnv,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildSourceSnapshot
3
- } from "./cli-37r94bmk.js";
3
+ } from "./cli-x9cwat4a.js";
4
4
  import"./cli-xq45etg1.js";
5
5
  import"./cli-97fnztpy.js";
6
6
  import"./cli-cesds766.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  buildDoctorReport
3
- } from "./cli-2eqh3150.js";
3
+ } from "./cli-a03st7e3.js";
4
4
  import {
5
5
  selectTenantAndCreateKey
6
6
  } from "./cli-9bgk5jeh.js";
@@ -29,7 +29,7 @@ import {
29
29
  import {
30
30
  initPrompts,
31
31
  runPromptSync
32
- } from "./cli-6ycf2aj5.js";
32
+ } from "./cli-zgj5bakm.js";
33
33
  import"./cli-mm48br00.js";
34
34
  import {
35
35
  codingAgentDisplayName,
@@ -43,7 +43,7 @@ import {
43
43
  runCodingAgent,
44
44
  runHarnessCommand,
45
45
  startRemoteAnalyze
46
- } from "./cli-37r94bmk.js";
46
+ } from "./cli-x9cwat4a.js";
47
47
  import {
48
48
  canonicalText,
49
49
  renderInitBanner,
@@ -42,7 +42,6 @@ import { join } from "node:path";
42
42
  // src/ask-stream.ts
43
43
  class AskStreamError extends Error {
44
44
  elapsedMs;
45
- toolEvents;
46
45
  accepted;
47
46
  constructor(message) {
48
47
  super(message);
@@ -169,7 +168,6 @@ class AskStreamCollector {
169
168
  terminal = false;
170
169
  lastPhase;
171
170
  toolNames = new Map;
172
- toolEvents = 0;
173
171
  events = 0;
174
172
  constructor(onProgress = () => {}) {
175
173
  this.onProgress = onProgress;
@@ -201,7 +199,6 @@ class AskStreamCollector {
201
199
  break;
202
200
  }
203
201
  case "tool_start": {
204
- this.toolEvents += 1;
205
202
  const tool = event.tool;
206
203
  const id = typeof tool?.id === "string" ? tool.id : "";
207
204
  const name = stripAnsi(typeof tool?.tool === "string" ? tool.tool : "tool");
@@ -212,7 +209,6 @@ class AskStreamCollector {
212
209
  break;
213
210
  }
214
211
  case "tool_end": {
215
- this.toolEvents += 1;
216
212
  const id = typeof event.id === "string" ? event.id : "";
217
213
  const name = this.toolNames.get(id) ?? "tool";
218
214
  this.onProgress(`• ${name} — ${toolEndDetail(event)}`);
@@ -250,9 +246,6 @@ class AskStreamCollector {
250
246
  get eventCount() {
251
247
  return this.events;
252
248
  }
253
- get toolEventCount() {
254
- return this.toolEvents;
255
- }
256
249
  finish() {
257
250
  if (!this.terminal) {
258
251
  throw new AskStreamError("stream ended before a terminal done/error event");
@@ -392,8 +385,6 @@ async function streamAsk(options) {
392
385
  if (error instanceof AskStreamError) {
393
386
  if (error.elapsedMs === undefined)
394
387
  error.elapsedMs = Date.now() - startedAt;
395
- if (error.toolEvents === undefined)
396
- error.toolEvents = collector.toolEventCount;
397
388
  if (error.accepted === undefined)
398
389
  error.accepted = accepted || collector.eventCount > 0;
399
390
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  inventoryFiles,
3
3
  safePromptEvidencePath
4
- } from "./cli-37r94bmk.js";
4
+ } from "./cli-x9cwat4a.js";
5
5
  import"./cli-xq45etg1.js";
6
6
  import"./cli-97fnztpy.js";
7
7
  import"./cli-cesds766.js";
@@ -3,7 +3,7 @@ import {
3
3
  checkPromptMapping,
4
4
  discoverHarnessPromptSources,
5
5
  safePromptEvidencePath
6
- } from "./cli-37r94bmk.js";
6
+ } from "./cli-x9cwat4a.js";
7
7
  import"./cli-xq45etg1.js";
8
8
  import"./cli-97fnztpy.js";
9
9
  import"./cli-cesds766.js";
@@ -23,13 +23,9 @@ import {
23
23
  runPromptAb,
24
24
  selectProblemCases,
25
25
  waitLabel
26
- } from "./cli-5b4tz5vj.js";
27
- import {
28
- DEFAULT_POLL_INTERVAL_MS,
29
- DEFAULT_WAIT_TIMEOUT_MS,
30
- fetchLatestRun
31
- } from "./cli-yz8xcpyk.js";
32
- import"./cli-6ycf2aj5.js";
26
+ } from "./cli-n1d52cww.js";
27
+ import"./cli-yz8xcpyk.js";
28
+ import"./cli-zgj5bakm.js";
33
29
  import"./cli-mm48br00.js";
34
30
  import"./cli-dr6x0zv7.js";
35
31
  import"./cli-n2hng3gv.js";
@@ -51,7 +47,6 @@ export {
51
47
  formatVerdict,
52
48
  fetchReplaySetCases,
53
49
  fetchProblemCases,
54
- fetchLatestRun,
55
50
  enqueueAndPollComparison,
56
51
  describeProblemCases,
57
52
  describePlayouts,
@@ -64,7 +59,5 @@ export {
64
59
  PLAYOUT_CONFIRM_THRESHOLD,
65
60
  MAX_REPLAY_TRACES,
66
61
  MAX_AUTO_GENERATE_CASES,
67
- DEFAULT_WAIT_TIMEOUT_MS,
68
- DEFAULT_PROBLEM_MAX_CASES,
69
- DEFAULT_POLL_INTERVAL_MS
62
+ DEFAULT_PROBLEM_MAX_CASES
70
63
  };
@@ -11,7 +11,7 @@ import {
11
11
  runPromptSync,
12
12
  runPromptsCommand,
13
13
  writePromptSyncProgress
14
- } from "./cli-6ycf2aj5.js";
14
+ } from "./cli-zgj5bakm.js";
15
15
  import {
16
16
  promptSourceHashPayload
17
17
  } from "./cli-mm48br00.js";
@@ -7,9 +7,9 @@ import {
7
7
  formatVerdict,
8
8
  rerunWithYes,
9
9
  resolvePromptArmSpec
10
- } from "./cli-5b4tz5vj.js";
10
+ } from "./cli-n1d52cww.js";
11
11
  import"./cli-yz8xcpyk.js";
12
- import"./cli-6ycf2aj5.js";
12
+ import"./cli-zgj5bakm.js";
13
13
  import"./cli-mm48br00.js";
14
14
  import"./cli-dr6x0zv7.js";
15
15
  import"./cli-n2hng3gv.js";
@@ -4,11 +4,11 @@ import {
4
4
  import"./cli-8dtnwp9r.js";
5
5
  import {
6
6
  runPromptsCommand
7
- } from "./cli-6ycf2aj5.js";
7
+ } from "./cli-zgj5bakm.js";
8
8
  import"./cli-mm48br00.js";
9
9
  import {
10
10
  runHarnessCommand
11
- } from "./cli-37r94bmk.js";
11
+ } from "./cli-x9cwat4a.js";
12
12
  import"./cli-xq45etg1.js";
13
13
  import"./cli-97fnztpy.js";
14
14
  import"./cli-cesds766.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moda-ai/cli",
3
- "version": "1.55.30",
3
+ "version": "1.55.32",
4
4
  "description": "CLI for Moda: production monitoring and evals for AI agents.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": "moda.skill_index.v1",
3
- "bundled_at": "2026-10-16T22:40:38.104Z",
4
- "cli_version": "1.55.30",
3
+ "bundled_at": "2026-10-17T02:32:13.042Z",
4
+ "cli_version": "1.55.32",
5
5
  "skills": [
6
6
  {
7
7
  "id": "integration-cloudflare-think",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: moda-cli
3
- version: 3.0.0
3
+ version: 3.0.1
4
4
  description: Investigate a production AI agent with the Moda CLI (`moda`) - find where something happened in real traces (traces search, then traces get), check agent health, rank what to fix (investigate, problems), and dig into tool failures, user frustration, and hallucinations. Also prompt registry sync/promote, replays, custom signals, and false-positive marking. Use when the user mentions Moda, production traces or conversations of their agent, agent failures, or asks what to fix.
5
5
  ---
6
6
 
@@ -74,7 +74,9 @@ Details: `references/output-protocol.md`.
74
74
 
75
75
  Time windows differ by command: `--days-back=N` (1-90) on overview,
76
76
  investigate, problems, and detection commands; `--time-range=1h|24h|3d|7d|30d|90d|all`
77
- on search, traces, and clusters. `moda <noun> <verb> --help` shows which.
77
+ on search, traces, and clusters. The other spelling works when it names the
78
+ same span (`--days-back=7` is `--time-range=7d`); anything else fails and
79
+ names the closest values. `moda <noun> <verb> --help` shows which.
78
80
 
79
81
  ## Fixing a Problem
80
82
 
@@ -237,8 +237,12 @@ Treat an answer as degraded if **any** of these hold:
237
237
 
238
238
  #### Time-window flags by command
239
239
 
240
- A command rejects the window flag it doesn't take, and out-of-range values
241
- fail instead of being clamped.
240
+ A command takes one window flag. The other spelling is rewritten when it names
241
+ the same span: `--days-back=1|3|7|30|90` is `--time-range=24h|3d|7d|30d|90d`,
242
+ and `--time-range=24h` or `Nd` (up to 90d) is `--days-back`. A value with no
243
+ exact match (`--days-back=14` on `traces search`, `--time-range=all` or `1h`
244
+ on a detection command) fails, as does passing both. Out-of-range values fail
245
+ instead of being clamped.
242
246
 
243
247
  | Flag | Commands | Allowed values | Default |
244
248
  | --- | --- | --- | --- |