@moda-ai/cli 1.55.102 → 1.55.104

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 (33) hide show
  1. package/README.md +37 -0
  2. package/dist/{agent-wa8tx02f.js → agent-8z1k639g.js} +5 -5
  3. package/dist/{change-impact-3n23nhd8.js → change-impact-tda0d76m.js} +3 -3
  4. package/dist/{cli-abfcqf4p.js → cli-25yzb3wd.js} +3 -3
  5. package/dist/{cli-92zfpz9f.js → cli-2qcedyw0.js} +5 -5
  6. package/dist/{cli-6ga6kmdp.js → cli-37z2f5wa.js} +2 -2
  7. package/dist/{cli-1sdz17sn.js → cli-82fxwm0m.js} +11 -11
  8. package/dist/{cli-9kxz65fe.js → cli-ap7wfbnk.js} +1 -1
  9. package/dist/{cli-gcqpbes6.js → cli-ev54s4wy.js} +4 -4
  10. package/dist/{cli-dxajrq9h.js → cli-n9ng8mym.js} +2 -0
  11. package/dist/{cli-f1sx9dsa.js → cli-n9wt2k8t.js} +1 -1
  12. package/dist/{cli-4t3zznhh.js → cli-pae8jxe9.js} +2 -2
  13. package/dist/cli.js +55 -33
  14. package/dist/{doctor-ec2cqgnv.js → doctor-knvvpcjg.js} +4 -4
  15. package/dist/{harness-jka07f99.js → harness-d92py0t2.js} +3 -3
  16. package/dist/{harness-github-actions-h9b973z0.js → harness-github-actions-1x0bfww6.js} +3 -3
  17. package/dist/{index-0na4ydkc.js → index-2z6m9gq4.js} +3 -3
  18. package/dist/{index-zp7y6mft.js → index-8v6zbm1m.js} +4 -4
  19. package/dist/{index-wdttmhsg.js → index-dmhrtv9c.js} +6 -6
  20. package/dist/{production-intelligence-3fdpsxce.js → production-intelligence-8w7an97c.js} +2 -2
  21. package/dist/{profile-commands-tav5q639.js → profile-commands-zgq8dja0.js} +1 -1
  22. package/dist/{prompt-attribution-armk5gqt.js → prompt-attribution-sftw2s9g.js} +3 -3
  23. package/dist/prompt-source-mcp.js +3 -3
  24. package/dist/{prompts-x3vdeax6.js → prompts-mtptqs7c.js} +3 -3
  25. package/dist/{registry-4mhr7xsd.js → registry-w50mdzsb.js} +2 -2
  26. package/dist/{skills-9c1xvp2s.js → skills-0kkps03j.js} +3 -3
  27. package/dist/{sync-skzdw9fb.js → sync-q5n028df.js} +5 -5
  28. package/package.json +1 -1
  29. package/skills/integration/index.json +2 -2
  30. package/skills/moda-cli/SKILL.md +1 -1
  31. package/skills/moda-cli/references/commands.md +1 -1
  32. package/skills/moda-cli/references/dashboard-parity.md +1 -1
  33. package/skills/moda-cli/references/output-protocol.md +1 -1
package/README.md CHANGED
@@ -512,3 +512,40 @@ with migration guidance. Read problem evidence with `moda problems get <id>
512
512
  --evidence`, make changes in your project, and use `moda prompts status`,
513
513
  `moda prompts diff`, and `moda prompts sync --dry-run` to review prompt versions.
514
514
  The retired names stay out of help and the manifest.
515
+
516
+ ### Server warnings for legacy installations
517
+
518
+ Current buffered API requests send `x-moda-cli-version`; their output is unchanged.
519
+ The Data API can prepend an upgrade line to an existing `warnings` array for an
520
+ unversioned request whose authenticated tenant/key has recently reported an old
521
+ CLI. The line describes an observed install on the key, not the current request.
522
+
523
+ This uses two nullable fields on the existing API-key row, not ClickHouse reads.
524
+ There is no historical backfill: the first new legacy telemetry submission warms
525
+ that key; subsequent reads can show the line, with up to 60 seconds of auth-cache
526
+ delay on other instances. Observations expire after seven days. Current telemetry
527
+ never clears evidence of another old install on the same key. Missing, invalid,
528
+ future or expired observations are unknown and produce no hint. Platform keys
529
+ are excluded. Version-header requests and `x-moda-cli-update-check: 0` suppress
530
+ it. Existing telemetry/update opt-outs are unchanged; old binaries cannot transmit
531
+ new opt-out headers, so a prior observation expires normally if telemetry stops.
532
+ No API keys or tenant content appear in the line or its failure logs.
533
+
534
+ Frozen 1.34.1 forwards this warning through JSON and agent warnings for
535
+ `frustrations`, `emotions`, `search`, `hallucinations`, `problem-impact`,
536
+ `conversations` and `context`. **Overview is best-effort:** its frozen wrapper
537
+ nests the warning under `rawOverview`, does not promote it to envelope warnings,
538
+ and can lose it under the 200 KB agent data limit. Response metrics, useful data
539
+ and status codes are never changed to force delivery.
540
+
541
+ The offline boundary regression asserts that limitation as well as the seven
542
+ positive cases. Build source `aff167ef1f` separately without modifying it, then run:
543
+
544
+ ```bash
545
+ python3 scripts/verify-legacy-upgrade-warning.py \
546
+ --frozen-cli /path/to/frozen/apps/moda-cli/dist/cli.js \
547
+ --current-cli "$PWD/dist/cli.js"
548
+ ```
549
+
550
+ Both builds use temporary local profiles, a loopback-only transport guard and
551
+ telemetry disabled. No customer key, production request or paid evaluation is needed.
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  buildDoctorReport
3
- } from "./cli-abfcqf4p.js";
3
+ } from "./cli-25yzb3wd.js";
4
4
  import"./cli-qwnkv4jy.js";
5
- import"./cli-92zfpz9f.js";
5
+ import"./cli-2qcedyw0.js";
6
6
  import"./cli-mm48br00.js";
7
7
  import"./cli-764m5azg.js";
8
8
  import {
@@ -17,9 +17,9 @@ import {
17
17
  validateHarnessReport
18
18
  } from "./cli-krm4w2v9.js";
19
19
  import"./cli-13zdcv4w.js";
20
- import"./cli-6ga6kmdp.js";
20
+ import"./cli-37z2f5wa.js";
21
21
  import"./cli-e0kbye4s.js";
22
- import"./cli-dxajrq9h.js";
22
+ import"./cli-n9ng8mym.js";
23
23
  import {
24
24
  resolveApiKey,
25
25
  resolveIngestUrl,
@@ -96,7 +96,7 @@ async function buildAgentContext(context) {
96
96
  const graph = readHarnessGraphIfPresent(context.cwd);
97
97
  const reportState = readHarnessReportState(context.cwd);
98
98
  const syncState = readHarnessSyncState(context.cwd);
99
- const harness = graph ? await import("./harness-jka07f99.js") : undefined;
99
+ const harness = graph ? await import("./harness-d92py0t2.js") : undefined;
100
100
  const topFindings = doctor.checks.filter((check) => check.status === "fail" || check.status === "warning").slice(0, 12).map(checkToFinding);
101
101
  const evidenceRefs = [
102
102
  ...doctor.checks.map(checkToEvidenceRef),
@@ -11,16 +11,16 @@ import {
11
11
  resolvedSymbol,
12
12
  returnExpressions,
13
13
  valueDeclaration
14
- } from "./cli-1sdz17sn.js";
14
+ } from "./cli-82fxwm0m.js";
15
15
  import"./cli-k0vxtzxb.js";
16
16
  import"./cli-97fnztpy.js";
17
17
  import {
18
18
  detectBoundRuntimeClasses
19
19
  } from "./cli-krm4w2v9.js";
20
20
  import"./cli-13zdcv4w.js";
21
- import"./cli-6ga6kmdp.js";
21
+ import"./cli-37z2f5wa.js";
22
22
  import"./cli-e0kbye4s.js";
23
- import"./cli-dxajrq9h.js";
23
+ import"./cli-n9ng8mym.js";
24
24
  import"./cli-1nd4339b.js";
25
25
  import"./cli-k4tqwah4.js";
26
26
  import {
@@ -4,7 +4,7 @@ import {
4
4
  } from "./cli-qwnkv4jy.js";
5
5
  import {
6
6
  inspectPromptManifest
7
- } from "./cli-92zfpz9f.js";
7
+ } from "./cli-2qcedyw0.js";
8
8
  import {
9
9
  readHarnessSyncState,
10
10
  renderDoctorHuman,
@@ -12,7 +12,7 @@ import {
12
12
  } from "./cli-k0vxtzxb.js";
13
13
  import {
14
14
  callDataAPI
15
- } from "./cli-dxajrq9h.js";
15
+ } from "./cli-n9ng8mym.js";
16
16
  import {
17
17
  describeModaBaseUrl,
18
18
  ensureSecretFilePermissions,
@@ -395,7 +395,7 @@ async function harnessCurrentCheck(cwd, manifestPath, manifestExists, tenantId)
395
395
  };
396
396
  }
397
397
  try {
398
- const { scanHarness } = await import("./harness-jka07f99.js");
398
+ const { scanHarness } = await import("./harness-d92py0t2.js");
399
399
  const current = scanHarness({
400
400
  rootDir: cwd,
401
401
  scannerVersion: "doctor",
@@ -11,10 +11,10 @@ import {
11
11
  import {
12
12
  assertFlags,
13
13
  assertPositionals
14
- } from "./cli-6ga6kmdp.js";
14
+ } from "./cli-37z2f5wa.js";
15
15
  import {
16
16
  callControlAPI
17
- } from "./cli-dxajrq9h.js";
17
+ } from "./cli-n9ng8mym.js";
18
18
  import {
19
19
  CliInputError
20
20
  } from "./cli-k4tqwah4.js";
@@ -270,7 +270,7 @@ async function runPromptSyncExclusive(flags, profileOptions, options) {
270
270
  const analyzedDefinitions = new Map;
271
271
  if (flags["no-analyze"] !== "true") {
272
272
  options.onProgress?.("Analyzing prompt sources before sync.");
273
- const { analyzeHarnessPrompts } = await import("./harness-jka07f99.js");
273
+ const { analyzeHarnessPrompts } = await import("./harness-d92py0t2.js");
274
274
  const result = await analyzeHarnessPrompts({
275
275
  rootDir: process.cwd(),
276
276
  existing: established.flatMap((prompt) => prompt.sourceDefinition ? [prompt.sourceDefinition.source] : []),
@@ -298,7 +298,7 @@ async function runPromptSyncExclusive(flags, profileOptions, options) {
298
298
  const mergedSources = mergePromptSources(manifest.sources, extraSources);
299
299
  const manifestUpdate = stableJson(mergedSources) === stableJson(mergePromptSources(manifest.sources, [])) ? undefined : $stringify({ version: 2, prompt_paths: manifest.promptPaths, sources: mergedSources });
300
300
  const prompts = await discoverPrompts(extraSources);
301
- const { checkPromptAttribution } = await import("./prompt-attribution-armk5gqt.js");
301
+ const { checkPromptAttribution } = await import("./prompt-attribution-sftw2s9g.js");
302
302
  const attribution = checkPromptAttribution(process.cwd(), prompts.map((prompt) => prompt.key));
303
303
  const brokenAttribution = attribution.references.filter((reference) => reference.status === "missing");
304
304
  if (brokenAttribution.length) {
@@ -604,7 +604,7 @@ async function migratePromptManifest(options = {}) {
604
604
  let addedSources = [];
605
605
  let pendingSources = [];
606
606
  if (options.discover) {
607
- const { analyzeHarnessPrompts } = await import("./harness-jka07f99.js");
607
+ const { analyzeHarnessPrompts } = await import("./harness-d92py0t2.js");
608
608
  const result = await analyzeHarnessPrompts({
609
609
  rootDir: root,
610
610
  existing: manifest.sources,
@@ -2,7 +2,7 @@ import {
2
2
  ApiError,
3
3
  callControlAPI,
4
4
  callDataAPI
5
- } from "./cli-dxajrq9h.js";
5
+ } from "./cli-n9ng8mym.js";
6
6
  import {
7
7
  continuationCommand,
8
8
  embeddedTenantIdFromApiKey,
@@ -429,7 +429,7 @@ var TOOL_CATALOG_SORTS = ["calls", "failure_rate", "failures", "traces", "last_s
429
429
  var TOOL_EFFECT_DIRECTIONS = ["read", "write", "send", "spawn", "compute", "unknown"];
430
430
  var ToolCatalogSchema = z.object({
431
431
  days_back: daysBackFlag(7),
432
- sort: z.enum(TOOL_CATALOG_SORTS).default("calls").optional().describe("Sort order, descending (failures = failed calls, traces = traces that called the tool)"),
432
+ sort: z.enum(TOOL_CATALOG_SORTS).default("calls").optional().describe("Sort descending: failures = recorded failed receipts (failed_calls), not classified failure events. For classified failure_count ranking use moda detections tools. traces = traces that called the tool"),
433
433
  search: z.string().min(1).max(200).optional().describe("Only tools whose name contains this text"),
434
434
  direction: z.enum(TOOL_EFFECT_DIRECTIONS).optional().describe("Only tools with this effect direction"),
435
435
  limit: z.number().int().min(1).max(200).default(25).optional().describe("Maximum tools to return"),
@@ -44,11 +44,11 @@ import {
44
44
  assertFlags,
45
45
  assertPositionals,
46
46
  requireTenant
47
- } from "./cli-6ga6kmdp.js";
47
+ } from "./cli-37z2f5wa.js";
48
48
  import {
49
49
  ApiError,
50
50
  callControlAPI
51
- } from "./cli-dxajrq9h.js";
51
+ } from "./cli-n9ng8mym.js";
52
52
  import {
53
53
  EXIT_DEGRADED,
54
54
  embeddedTenantIdFromApiKey,
@@ -21010,7 +21010,7 @@ async function runHarnessCommand(context) {
21010
21010
  throw new CliInputError(`'moda harness ${subcommand}' has no dry-run mode, so nothing was sent.`, `Remove --dry-run to run it for real. Harness commands with a real dry-run: ${[...HARNESS_DRY_RUN_SUBCOMMANDS].join(", ")}.`);
21011
21011
  }
21012
21012
  if (subcommand === "skeleton" || subcommand === "skeleton-diff") {
21013
- const { runSkeletonCommand } = await import("./cli-gcqpbes6.js");
21013
+ const { runSkeletonCommand } = await import("./cli-ev54s4wy.js");
21014
21014
  return runSkeletonCommand(context);
21015
21015
  }
21016
21016
  if (subcommand === "register")
@@ -21022,7 +21022,7 @@ async function runHarnessCommand(context) {
21022
21022
  assertPositionals("harness impact", context.positionals, 1, "moda harness impact --from=<commit> --to=<commit>");
21023
21023
  if (!context.flags.from)
21024
21024
  throw new CliInputError("harness impact requires --from=<old-commit>.");
21025
- const { localChangeImpact, readRecordedImpactCalls } = await import("./change-impact-3n23nhd8.js");
21025
+ const { localChangeImpact, readRecordedImpactCalls } = await import("./change-impact-tda0d76m.js");
21026
21026
  const result = localChangeImpact({
21027
21027
  checkout: resolve10(context.cwd, context.flags.path ?? "."),
21028
21028
  from: context.flags.from,
@@ -21294,7 +21294,7 @@ async function runHarnessCommand(context) {
21294
21294
  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.");
21295
21295
  }
21296
21296
  if (context.flags["github-actions"] === "true") {
21297
- const { runGithubActionsAnalyze } = await import("./harness-github-actions-h9b973z0.js");
21297
+ const { runGithubActionsAnalyze } = await import("./harness-github-actions-1x0bfww6.js");
21298
21298
  const result = await runGithubActionsAnalyze(rootDir, {
21299
21299
  writeReport: (report2) => {
21300
21300
  const normalized = normalizeHarnessReport(report2);
@@ -21445,8 +21445,8 @@ async function runHarnessCommand(context) {
21445
21445
  }
21446
21446
  const { artifacts, unknowns, canonicalAgentIdentities } = deterministicGraphItems(rootDir, promote === "all" ? undefined : promote);
21447
21447
  tagComponentStatus({ runtimeAgents: [], artifacts }, rootDir);
21448
- const { extractHarnessWithContext: extractHarnessWithContext2 } = await import("./index-0na4ydkc.js");
21449
- const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-zp7y6mft.js");
21448
+ const { extractHarnessWithContext: extractHarnessWithContext2 } = await import("./index-2z6m9gq4.js");
21449
+ const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-8v6zbm1m.js");
21450
21450
  let components = { runtimeAgents: [], artifacts: [], warnings: [] };
21451
21451
  if (promote === "all" || promote === "topology" || promote === "tools") {
21452
21452
  const { result, ctx } = extractHarnessWithContext2(rootDir);
@@ -21518,8 +21518,8 @@ async function runHarnessCommand(context) {
21518
21518
  }
21519
21519
  case "extract": {
21520
21520
  writeHumanProgress(context, "Harness extract: tracing model call sites (no LLM, no network)...");
21521
- const { extractHarnessWithContext: extractHarnessWithContext2, serializeExtractResult } = await import("./index-0na4ydkc.js");
21522
- const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-zp7y6mft.js");
21521
+ const { extractHarnessWithContext: extractHarnessWithContext2, serializeExtractResult } = await import("./index-2z6m9gq4.js");
21522
+ const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-8v6zbm1m.js");
21523
21523
  const { result, ctx } = extractHarnessWithContext2(rootDir, { fresh: true });
21524
21524
  const items = deterministicGraphItems(rootDir);
21525
21525
  const artifacts = items.artifacts;
@@ -22426,8 +22426,8 @@ var CONCERN_PROMOTED_ARTIFACT_TYPES = {
22426
22426
  evals: new Set(["model_config", "eval"])
22427
22427
  };
22428
22428
  async function deterministicFloorGraph(rootDir, options = {}) {
22429
- const { extractHarnessWithContext: extractHarnessWithContext2 } = await import("./index-0na4ydkc.js");
22430
- const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-zp7y6mft.js");
22429
+ const { extractHarnessWithContext: extractHarnessWithContext2 } = await import("./index-2z6m9gq4.js");
22430
+ const { enumerateHarnessComponents, mergeEnumeratedComponents } = await import("./index-8v6zbm1m.js");
22431
22431
  const { result, ctx } = extractHarnessWithContext2(rootDir);
22432
22432
  const items = deterministicGraphItems(rootDir);
22433
22433
  const components = mergeEnumeratedComponents(items.artifacts, enumerateHarnessComponents(result, ctx));
@@ -3,7 +3,7 @@ import {
3
3
  } from "./cli-e0kbye4s.js";
4
4
  import {
5
5
  callDataAPI
6
- } from "./cli-dxajrq9h.js";
6
+ } from "./cli-n9ng8mym.js";
7
7
  import {
8
8
  shellArg
9
9
  } from "./cli-1nd4339b.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  enumerateToolCatalog,
3
3
  enumerateWorkflows
4
- } from "./cli-f1sx9dsa.js";
4
+ } from "./cli-n9wt2k8t.js";
5
5
  import {
6
6
  require_out
7
7
  } from "./cli-764m5azg.js";
@@ -34,7 +34,7 @@ import {
34
34
  unwrap,
35
35
  valueDeclaration,
36
36
  visit
37
- } from "./cli-1sdz17sn.js";
37
+ } from "./cli-82fxwm0m.js";
38
38
  import"./cli-k0vxtzxb.js";
39
39
  import"./cli-97fnztpy.js";
40
40
  import {
@@ -42,9 +42,9 @@ import {
42
42
  isTestWorkerConfig
43
43
  } from "./cli-krm4w2v9.js";
44
44
  import"./cli-13zdcv4w.js";
45
- import"./cli-6ga6kmdp.js";
45
+ import"./cli-37z2f5wa.js";
46
46
  import"./cli-e0kbye4s.js";
47
- import"./cli-dxajrq9h.js";
47
+ import"./cli-n9ng8mym.js";
48
48
  import {
49
49
  EXIT_DEGRADED,
50
50
  VERSION
@@ -1,4 +1,5 @@
1
1
  import {
2
+ VERSION,
2
3
  apiKeyHeaders,
3
4
  recordApiRequest,
4
5
  resolveApiKey,
@@ -134,6 +135,7 @@ async function callModaAPI(url, options, profileOptions = {}, requestOptions = {
134
135
  headers: {
135
136
  ...apiKeyHeaders(resolveApiKey(profileOptions) ?? "", profileOptions, url),
136
137
  "Content-Type": "application/json",
138
+ "x-moda-cli-version": VERSION,
137
139
  ...options.headers ?? {},
138
140
  ...connectionClose ? { Connection: "close" } : {}
139
141
  },
@@ -21,7 +21,7 @@ import {
21
21
  valueDeclaration,
22
22
  visit,
23
23
  workspacePackages
24
- } from "./cli-1sdz17sn.js";
24
+ } from "./cli-82fxwm0m.js";
25
25
  import {
26
26
  require_typescript
27
27
  } from "./cli-r0pkdy83.js";
@@ -18,10 +18,10 @@ import {
18
18
  assertFlags,
19
19
  assertPositionals,
20
20
  writeDryRun
21
- } from "./cli-6ga6kmdp.js";
21
+ } from "./cli-37z2f5wa.js";
22
22
  import {
23
23
  callControlAPI
24
- } from "./cli-dxajrq9h.js";
24
+ } from "./cli-n9ng8mym.js";
25
25
  import {
26
26
  recordApiRequest,
27
27
  resolveApiKey,
package/dist/cli.js CHANGED
@@ -26,7 +26,7 @@ import {
26
26
  withSummaryCompare,
27
27
  withToolFailureAnchors,
28
28
  withoutDetectionWindows
29
- } from "./cli-9kxz65fe.js";
29
+ } from "./cli-ap7wfbnk.js";
30
30
  import {
31
31
  createCommandContext
32
32
  } from "./cli-13zdcv4w.js";
@@ -78,7 +78,7 @@ import {
78
78
  unknownSignalsSubcommandError,
79
79
  usageLine,
80
80
  writeDryRun
81
- } from "./cli-6ga6kmdp.js";
81
+ } from "./cli-37z2f5wa.js";
82
82
  import {
83
83
  envOptOutSet,
84
84
  envSwitchedOff,
@@ -89,7 +89,7 @@ import {
89
89
  import {
90
90
  ApiError,
91
91
  callDataAPI
92
- } from "./cli-dxajrq9h.js";
92
+ } from "./cli-n9ng8mym.js";
93
93
  import {
94
94
  AGENT_ERROR_CODES,
95
95
  EXIT_AUTH_REQUIRED,
@@ -1319,7 +1319,7 @@ var CANONICAL_LEAVES = [
1319
1319
  path: "detections tools",
1320
1320
  args: "[<tool_name>]",
1321
1321
  routes: ["tool-failures", "tool-failure-detail"],
1322
- summary: "Tool failure leaderboard, or one tool's failure examples",
1322
+ summary: "Classified failure events (failure_count): which tool fails most, or its failure examples. For recorded failed receipts, use moda tools list|get",
1323
1323
  examples: ["moda detections tools --days-back=14", "moda detections tools <tool_name> --limit=3"]
1324
1324
  },
1325
1325
  {
@@ -1328,7 +1328,7 @@ var CANONICAL_LEAVES = [
1328
1328
  path: "tools list",
1329
1329
  args: "",
1330
1330
  handler: "tool-catalog",
1331
- summary: "Every tool called in the window: calls, failed calls, success rate, effect direction, last seen",
1331
+ summary: "Recorded tool receipts: calls, failed_calls, receipt success rate. For classified failure-event ranking (failure_count), use moda detections tools",
1332
1332
  examples: ["moda tools list --days-back=7", "moda tools list --sort=failure_rate --limit=10", "moda tools list --search=calendar --direction=write"]
1333
1333
  },
1334
1334
  {
@@ -1337,7 +1337,7 @@ var CANONICAL_LEAVES = [
1337
1337
  path: "tools get",
1338
1338
  args: "<tool_name>",
1339
1339
  handler: "tool-catalog-detail",
1340
- summary: "One tool: calls, recorded schema and payload fields, usage over time, top failure categories",
1340
+ summary: "One tool: recorded receipt calls/failed_calls, schema and usage; failure_detections/categories count classified events. For classified failure ranking (failure_count), use moda detections tools",
1341
1341
  examples: ["moda tools get <tool_name>", "moda tools get <tool_name> --days-back=30 --full"]
1342
1342
  },
1343
1343
  {
@@ -1432,7 +1432,7 @@ var CANONICAL_LEAVES = [
1432
1432
  args: "",
1433
1433
  handler: "skills",
1434
1434
  handlerSubcommand: "sync",
1435
- summary: "Upload locally authored .claude/skills/**/SKILL.md files to Moda (download: skills pull)",
1435
+ summary: "Upload locally authored .claude/skills/**/SKILL.md files to Moda",
1436
1436
  examples: ["moda skills push --dry-run", "moda skills push"]
1437
1437
  }
1438
1438
  ];
@@ -1994,6 +1994,7 @@ var SIGNALS_SUBCOMMAND_HELP = [
1994
1994
  var SKILLS_SUBCOMMAND_HELP = [
1995
1995
  {
1996
1996
  name: "gen",
1997
+ hidden: true,
1997
1998
  description: "Generate skills from production traces (paid: clustering + LLM distillation; no dry-run)",
1998
1999
  usage: "moda skills gen [--source=all|sdk] [--max-sessions=N] [--lookback-hours=N] [--max-traces=N] [--start-at=ISO] [--end-at=ISO] [--wait]",
1999
2000
  flags: [
@@ -2013,12 +2014,14 @@ var SKILLS_SUBCOMMAND_HELP = [
2013
2014
  },
2014
2015
  {
2015
2016
  name: "status",
2017
+ hidden: true,
2016
2018
  description: "Show a skill generation run (default: the latest) and its events",
2017
2019
  usage: "moda skills status [<run_id>] [--run-id=<id>]",
2018
2020
  examples: ["moda skills status", "moda skills status <run_id>"]
2019
2021
  },
2020
2022
  {
2021
2023
  name: "pull",
2024
+ hidden: true,
2022
2025
  description: "Write generated skills into the detected coding agents' skill directories",
2023
2026
  usage: "moda skills pull [--status=approved|proposed|all]",
2024
2027
  flags: [{ name: "--status=approved|proposed|all", description: "Which skills to pull (default approved)." }],
@@ -2056,6 +2059,7 @@ var SKILLS_SUBCOMMAND_HELP = [
2056
2059
  },
2057
2060
  {
2058
2061
  name: "proposals",
2062
+ hidden: true,
2059
2063
  description: "List skill improvement proposals (read-only)",
2060
2064
  usage: "moda skills proposals list [--status=ready_for_pr|all] [--generation-run-id=<id>]",
2061
2065
  flags: [
@@ -2067,6 +2071,7 @@ var SKILLS_SUBCOMMAND_HELP = [
2067
2071
  },
2068
2072
  {
2069
2073
  name: "proposal",
2074
+ hidden: true,
2070
2075
  description: "Apply a skill proposal: write its SKILL.md locally and acknowledge it on the server",
2071
2076
  usage: "moda skills proposal apply <proposal_id>",
2072
2077
  flags: [TENANT_ID],
@@ -2099,6 +2104,7 @@ var PROMPTS_REGISTRY_SUBCOMMAND_HELP = [
2099
2104
  },
2100
2105
  {
2101
2106
  name: "proposals",
2107
+ hidden: true,
2102
2108
  description: "List revision proposals for a prompt (read-only)",
2103
2109
  usage: "moda prompts proposals <key_or_id>",
2104
2110
  examples: ["moda prompts proposals support.triage"]
@@ -2111,6 +2117,7 @@ var PROMPTS_REGISTRY_SUBCOMMAND_HELP = [
2111
2117
  },
2112
2118
  {
2113
2119
  name: "decide",
2120
+ hidden: true,
2114
2121
  description: "Merge, reject, or reopen a prompt revision proposal",
2115
2122
  usage: "moda prompts decide <key_or_id> <proposal_id> --action=merge|reject|reopen [--dry-run]",
2116
2123
  flags: [
@@ -2945,6 +2952,21 @@ function deprecatedFormsOf(name) {
2945
2952
  return visibleLegacyNames().filter((entry) => entry.legacy.startsWith(`${name} `)).map((entry) => ({ form: `moda ${entry.legacy}`, use: entry.use }));
2946
2953
  }
2947
2954
  function treeFields(name, commands) {
2955
+ if (name === "prompts" || name === "skills") {
2956
+ return { subcommands: (commands.find((command) => command.name === name)?.subcommands ?? []).filter((subcommand) => !subcommand.hidden).map((subcommand) => {
2957
+ const leaf = leavesOf(name).find((leaf2) => leaf2.verb === subcommand.name);
2958
+ return leaf ? leafManifestFields(leaf, commands) : {
2959
+ name: subcommand.name,
2960
+ path: `moda ${name} ${subcommand.name}`,
2961
+ runs: [name],
2962
+ mutability: ["list", "show", "usage", "status", "diff"].includes(subcommand.name) ? "read" : "write",
2963
+ summary: subcommand.description,
2964
+ usage: subcommand.usage,
2965
+ flags: subcommand.flags?.map(documentedFlag),
2966
+ examples: subcommand.examples
2967
+ };
2968
+ }) };
2969
+ }
2948
2970
  if (!CANONICAL_NOUNS.includes(name) || name === "review")
2949
2971
  return {};
2950
2972
  return { subcommands: leavesOf(name).map((leaf) => leafManifestFields(leaf, commands)) };
@@ -3066,40 +3088,40 @@ function leafManifestFields(leaf, commands) {
3066
3088
  import { fileURLToPath } from "url";
3067
3089
  import { realpathSync } from "fs";
3068
3090
  async function runPromptsCommand(...args) {
3069
- return (await import("./prompts-x3vdeax6.js")).runPromptsCommand(...args);
3091
+ return (await import("./prompts-mtptqs7c.js")).runPromptsCommand(...args);
3070
3092
  }
3071
3093
  async function runSkillsCommand(...args) {
3072
- return (await import("./skills-9c1xvp2s.js")).runSkillsCommand(...args);
3094
+ return (await import("./skills-0kkps03j.js")).runSkillsCommand(...args);
3073
3095
  }
3074
3096
  async function runHarnessCommand(...args) {
3075
- return (await import("./harness-jka07f99.js")).runHarnessCommand(...args);
3097
+ return (await import("./harness-d92py0t2.js")).runHarnessCommand(...args);
3076
3098
  }
3077
3099
  async function runSyncCommand(...args) {
3078
- return (await import("./sync-skzdw9fb.js")).runSyncCommand(...args);
3100
+ return (await import("./sync-q5n028df.js")).runSyncCommand(...args);
3079
3101
  }
3080
3102
  async function runRegistryCommand(...args) {
3081
- return (await import("./registry-4mhr7xsd.js")).runRegistryCommand(...args);
3103
+ return (await import("./registry-w50mdzsb.js")).runRegistryCommand(...args);
3082
3104
  }
3083
3105
  async function runDoctorCommand(...args) {
3084
- return (await import("./doctor-ec2cqgnv.js")).runDoctorCommand(...args);
3106
+ return (await import("./doctor-knvvpcjg.js")).runDoctorCommand(...args);
3085
3107
  }
3086
3108
  async function runStatusCommand(...args) {
3087
- return (await import("./doctor-ec2cqgnv.js")).runStatusCommand(...args);
3109
+ return (await import("./doctor-knvvpcjg.js")).runStatusCommand(...args);
3088
3110
  }
3089
3111
  async function runAuthCommand(...args) {
3090
- return (await import("./profile-commands-tav5q639.js")).runAuthCommand(...args);
3112
+ return (await import("./profile-commands-zgq8dja0.js")).runAuthCommand(...args);
3091
3113
  }
3092
3114
  async function runConfigCommand(...args) {
3093
- return (await import("./profile-commands-tav5q639.js")).runConfigCommand(...args);
3115
+ return (await import("./profile-commands-zgq8dja0.js")).runConfigCommand(...args);
3094
3116
  }
3095
3117
  async function runProfilesCommand(...args) {
3096
- return (await import("./profile-commands-tav5q639.js")).runProfilesCommand(...args);
3118
+ return (await import("./profile-commands-zgq8dja0.js")).runProfilesCommand(...args);
3097
3119
  }
3098
3120
  async function runAgentCommand(...args) {
3099
- return (await import("./agent-wa8tx02f.js")).runAgentCommand(...args);
3121
+ return (await import("./agent-8z1k639g.js")).runAgentCommand(...args);
3100
3122
  }
3101
3123
  async function runProductionCommand(...args) {
3102
- return (await import("./production-intelligence-3fdpsxce.js")).runProductionCommand(...args);
3124
+ return (await import("./production-intelligence-8w7an97c.js")).runProductionCommand(...args);
3103
3125
  }
3104
3126
  function parseArgs(argv) {
3105
3127
  const args = argv.slice(2);
@@ -3414,7 +3436,7 @@ Setup:
3414
3436
  Groups with their own subcommands (run 'moda <group> --help'):
3415
3437
  harness Analyze, scan, validate, approve, sync and register the agent harness
3416
3438
  prompts Code-first prompt versions: init, status, sync, promote, list, show
3417
- skills Generate skills; pull (download), push (upload), install
3439
+ skills Read, push, and install skills
3418
3440
  sync Sync the harness graph and prompts to Moda Cloud
3419
3441
  registry Push prompts, skills, tools and agent wiring from one JSON manifest
3420
3442
 
@@ -3467,10 +3489,11 @@ function printCommandHelp(definition) {
3467
3489
  ${" ".repeat(width)} ${flag.description}` : ` ${flag.name.padEnd(width)} ${flag.description}`);
3468
3490
  }
3469
3491
  }
3470
- if (definition.subcommands && definition.subcommands.length > 0) {
3492
+ const visibleSubcommands = definition.subcommands?.filter((entry) => !entry.hidden) ?? [];
3493
+ if (visibleSubcommands.length > 0) {
3471
3494
  lines.push("", "Subcommands:");
3472
- const width = Math.max(...definition.subcommands.map((entry) => entry.name.length));
3473
- for (const entry of definition.subcommands) {
3495
+ const width = Math.max(...visibleSubcommands.map((entry) => entry.name.length));
3496
+ for (const entry of visibleSubcommands) {
3474
3497
  lines.push(` ${entry.name.padEnd(width)} ${entry.description}`);
3475
3498
  }
3476
3499
  lines.push("", `Run 'moda ${definition.name} <subcommand> --help' for that subcommand's flags.`);
@@ -3740,6 +3763,8 @@ async function attachWindows(rows, windowSize, budgetBytes) {
3740
3763
  }
3741
3764
  var TOOL_FAILURE_DETAIL_DEFAULT_LIMIT = 5;
3742
3765
  var TOOL_FAILURE_AGENT_SUBTYPES = 20;
3766
+ var TOOL_RECEIPT_METRIC_NOTE = "calls and failed_calls count recorded tool receipts; failure_rate_pct and success_rate_pct use those receipts. --sort=failures ranks failed_calls, not classified failure events. To answer which tool fails most by classified failure events, use `moda detections tools` (failure_count). In tool detail, failure_detections and failure_categories use classified failure events; these counts can differ.";
3767
+ var CLASSIFIED_TOOL_FAILURE_METRIC_NOTE = "failure_count and failure categories count classified tool failure events. Use `moda detections tools` to answer which tool fails most by classified failures. For recorded receipt calls, failed_calls and receipt failure rates, use `moda tools list` or `moda tools get <tool_name>`; the counts can differ.";
3743
3768
  var TOOL_FAILURE_CATALOG_LINKS = 3;
3744
3769
  var TOOL_CATALOG_DEFAULT_LIMIT = 25;
3745
3770
  async function printWithOptionalWindows(enriched, listKey, includeWindow, windowSize, output, warnings, finalize, nextCommands = [], summary) {
@@ -5916,7 +5941,7 @@ async function runCommand(command, positional, flags, positionals = positional ?
5916
5941
  callDataAPI(`/tool-failures${queryString}`),
5917
5942
  params.compare === true ? loadFamilyCompare("tool-failures", params) : Promise.resolve(undefined)
5918
5943
  ]);
5919
- const data = withSummaryCompare(listed, compare);
5944
+ const data = { ...asRecord(withSummaryCompare(listed, compare)), metric_note: CLASSIFIED_TOOL_FAILURE_METRIC_NOTE };
5920
5945
  const daysBack = params.days_back ?? 7;
5921
5946
  const failing = (Array.isArray(asRecord(data)?.tools) ? asRecord(data).tools : []).map((row) => asString(asRecord(row)?.tool_name)).filter((name) => Boolean(name)).slice(0, TOOL_FAILURE_CATALOG_LINKS);
5922
5947
  const nextCommands = failing.flatMap((name, index) => [
@@ -5937,7 +5962,7 @@ async function runCommand(command, positional, flags, positionals = positional ?
5937
5962
  query.set("search", params.search);
5938
5963
  if (params.direction)
5939
5964
  query.set("direction", params.direction);
5940
- const data = asRecord(await callDataAPI(`/tools?${query.toString()}`)) ?? {};
5965
+ const data = { ...asRecord(await callDataAPI(`/tools?${query.toString()}`)), metric_note: TOOL_RECEIPT_METRIC_NOTE };
5941
5966
  const pagination = asRecord(data.pagination);
5942
5967
  const tools = Array.isArray(data.tools) ? data.tools.map((row) => asRecord(row)).filter((row) => row !== null) : [];
5943
5968
  const listFlags = [
@@ -5985,7 +6010,7 @@ async function runCommand(command, positional, flags, positionals = positional ?
5985
6010
  throw error;
5986
6011
  throw new CliNotFoundError("tool", params.tool_name, `Tool "${params.tool_name}" has no recorded calls in the last ${daysBack} day(s): the name may be mistyped, or the tool was not called in this window.`, `moda tools list --search=${shellArg(params.tool_name)} --days-back=${daysBack}`);
5987
6012
  }
5988
- const { data, shortened } = shapeToolCatalogDetail(raw, { daysBack, shorten: agentMode && params.full !== true });
6013
+ const { data, shortened } = shapeToolCatalogDetail({ ...raw, metric_note: TOOL_RECEIPT_METRIC_NOTE }, { daysBack, shorten: agentMode && params.full !== true });
5989
6014
  const warnings = [];
5990
6015
  if (shortened > 0) {
5991
6016
  warnings.push(`Agent output capped ${shortened} list(s) or value(s): at most 20 observed fields with 3 common values each, 5 recent calls, and 200 characters per input or sample error (the *_total fields give the full counts). Add --full for everything. The registered schema is never cut.`);
@@ -6039,7 +6064,7 @@ async function runCommand(command, positional, flags, positionals = positional ?
6039
6064
  if (dropConversation)
6040
6065
  query.set("include_context", "0");
6041
6066
  const queryString = query.toString() ? `?${query.toString()}` : "";
6042
- const data = await callDataAPI(`/tool-failures/${encodeURIComponent(params.tool_name)}${queryString}`);
6067
+ const data = { ...asRecord(await callDataAPI(`/tool-failures/${encodeURIComponent(params.tool_name)}${queryString}`)), metric_note: CLASSIFIED_TOOL_FAILURE_METRIC_NOTE };
6043
6068
  const tfRecord = asRecord(data) ?? {};
6044
6069
  const subtypeCount = Array.isArray(tfRecord.subtypes) ? tfRecord.subtypes.length : 0;
6045
6070
  const exampleCount = Array.isArray(tfRecord.examples) ? tfRecord.examples.length : 0;
@@ -6860,7 +6885,7 @@ var commandRegistry = createCommandRegistry([
6860
6885
  resetApiRequestCountBeforeRun: true,
6861
6886
  telemetry: "result-and-error",
6862
6887
  handler: async (context) => {
6863
- const { runInit } = await import("./index-wdttmhsg.js");
6888
+ const { runInit } = await import("./index-dmhrtv9c.js");
6864
6889
  if (context.outputMode === "agent-stream") {
6865
6890
  context.output.writeEvent({
6866
6891
  event: "started",
@@ -7802,11 +7827,8 @@ var commandRegistry = createCommandRegistry([
7802
7827
  }),
7803
7828
  {
7804
7829
  name: "skills",
7805
- description: "Generate, pull (download), push (upload), and install Moda skills",
7830
+ description: "Read registered skills, upload locally authored skills, and install guides",
7806
7831
  examples: [
7807
- "moda skills gen",
7808
- "moda skills status",
7809
- "moda skills pull",
7810
7832
  "moda skills push",
7811
7833
  "moda skills install moda-cli",
7812
7834
  "moda skills install --list",
@@ -7814,7 +7836,7 @@ var commandRegistry = createCommandRegistry([
7814
7836
  ],
7815
7837
  subcommands: SKILLS_SUBCOMMAND_HELP,
7816
7838
  auth: "api-key",
7817
- authNote: "install is local; gen, status, pull, push, list, show, policy, and proposals need the API key.",
7839
+ authNote: "install is local; push, list, show, and policy need the API key.",
7818
7840
  outputModes: ["human", "json", "agent"],
7819
7841
  mutability: "write",
7820
7842
  validateConfigBeforeRun: false,
@@ -3,16 +3,16 @@ import {
3
3
  promptsDiscoveredCheck,
4
4
  runDoctorCommand,
5
5
  runStatusCommand
6
- } from "./cli-abfcqf4p.js";
6
+ } from "./cli-25yzb3wd.js";
7
7
  import"./cli-qwnkv4jy.js";
8
- import"./cli-92zfpz9f.js";
8
+ import"./cli-2qcedyw0.js";
9
9
  import"./cli-mm48br00.js";
10
10
  import"./cli-764m5azg.js";
11
11
  import"./cli-k0vxtzxb.js";
12
12
  import"./cli-13zdcv4w.js";
13
- import"./cli-6ga6kmdp.js";
13
+ import"./cli-37z2f5wa.js";
14
14
  import"./cli-e0kbye4s.js";
15
- import"./cli-dxajrq9h.js";
15
+ import"./cli-n9ng8mym.js";
16
16
  import"./cli-1nd4339b.js";
17
17
  import"./cli-k4tqwah4.js";
18
18
  import"./cli-9kfxkxmk.js";
@@ -48,16 +48,16 @@ import {
48
48
  writeHarnessAnalyzeResult,
49
49
  writeHarnessArtifacts,
50
50
  writeHumanProgress
51
- } from "./cli-1sdz17sn.js";
51
+ } from "./cli-82fxwm0m.js";
52
52
  import"./cli-k0vxtzxb.js";
53
53
  import"./cli-97fnztpy.js";
54
54
  import {
55
55
  HARNESS_ANALYZE_CONCERNS
56
56
  } from "./cli-krm4w2v9.js";
57
57
  import"./cli-13zdcv4w.js";
58
- import"./cli-6ga6kmdp.js";
58
+ import"./cli-37z2f5wa.js";
59
59
  import"./cli-e0kbye4s.js";
60
- import"./cli-dxajrq9h.js";
60
+ import"./cli-n9ng8mym.js";
61
61
  import"./cli-1nd4339b.js";
62
62
  import"./cli-k4tqwah4.js";
63
63
  import"./cli-r0pkdy83.js";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  buildSourceSnapshot
3
- } from "./cli-1sdz17sn.js";
3
+ } from "./cli-82fxwm0m.js";
4
4
  import"./cli-k0vxtzxb.js";
5
5
  import"./cli-97fnztpy.js";
6
6
  import"./cli-krm4w2v9.js";
7
7
  import"./cli-13zdcv4w.js";
8
- import"./cli-6ga6kmdp.js";
8
+ import"./cli-37z2f5wa.js";
9
9
  import"./cli-e0kbye4s.js";
10
- import"./cli-dxajrq9h.js";
10
+ import"./cli-n9ng8mym.js";
11
11
  import {
12
12
  recordApiRequest
13
13
  } from "./cli-1nd4339b.js";
@@ -20,14 +20,14 @@ import {
20
20
  serializeExtractResult,
21
21
  toolNamesOf,
22
22
  valueChildren
23
- } from "./cli-1sdz17sn.js";
23
+ } from "./cli-82fxwm0m.js";
24
24
  import"./cli-k0vxtzxb.js";
25
25
  import"./cli-97fnztpy.js";
26
26
  import"./cli-krm4w2v9.js";
27
27
  import"./cli-13zdcv4w.js";
28
- import"./cli-6ga6kmdp.js";
28
+ import"./cli-37z2f5wa.js";
29
29
  import"./cli-e0kbye4s.js";
30
- import"./cli-dxajrq9h.js";
30
+ import"./cli-n9ng8mym.js";
31
31
  import"./cli-1nd4339b.js";
32
32
  import"./cli-k4tqwah4.js";
33
33
  import"./cli-r0pkdy83.js";
@@ -3,18 +3,18 @@ import {
3
3
  enumerateToolCatalog,
4
4
  enumerateWorkflows,
5
5
  mergeEnumeratedComponents
6
- } from "./cli-f1sx9dsa.js";
6
+ } from "./cli-n9wt2k8t.js";
7
7
  import {
8
8
  createAgentScopeResolver,
9
9
  enumerateAgents
10
- } from "./cli-1sdz17sn.js";
10
+ } from "./cli-82fxwm0m.js";
11
11
  import"./cli-k0vxtzxb.js";
12
12
  import"./cli-97fnztpy.js";
13
13
  import"./cli-krm4w2v9.js";
14
14
  import"./cli-13zdcv4w.js";
15
- import"./cli-6ga6kmdp.js";
15
+ import"./cli-37z2f5wa.js";
16
16
  import"./cli-e0kbye4s.js";
17
- import"./cli-dxajrq9h.js";
17
+ import"./cli-n9ng8mym.js";
18
18
  import"./cli-1nd4339b.js";
19
19
  import"./cli-k4tqwah4.js";
20
20
  import"./cli-r0pkdy83.js";
@@ -4,11 +4,11 @@ import {
4
4
  import {
5
5
  agentsMdProblem,
6
6
  runSkillSync
7
- } from "./cli-4t3zznhh.js";
7
+ } from "./cli-pae8jxe9.js";
8
8
  import"./cli-998n4kz9.js";
9
9
  import {
10
10
  buildDoctorReport
11
- } from "./cli-abfcqf4p.js";
11
+ } from "./cli-25yzb3wd.js";
12
12
  import {
13
13
  ConnectCodeError,
14
14
  connectWithCode,
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  initPrompts,
21
21
  runPromptSync
22
- } from "./cli-92zfpz9f.js";
22
+ } from "./cli-2qcedyw0.js";
23
23
  import {
24
24
  bundledSkillsDir,
25
25
  installIntegrationSkill,
@@ -47,7 +47,7 @@ import {
47
47
  runCodingAgent,
48
48
  runHarnessCommand,
49
49
  startRemoteAnalyze
50
- } from "./cli-1sdz17sn.js";
50
+ } from "./cli-82fxwm0m.js";
51
51
  import {
52
52
  canonicalText,
53
53
  renderInitBanner,
@@ -63,9 +63,9 @@ import"./cli-krm4w2v9.js";
63
63
  import {
64
64
  createCommandContext
65
65
  } from "./cli-13zdcv4w.js";
66
- import"./cli-6ga6kmdp.js";
66
+ import"./cli-37z2f5wa.js";
67
67
  import"./cli-e0kbye4s.js";
68
- import"./cli-dxajrq9h.js";
68
+ import"./cli-n9ng8mym.js";
69
69
  import {
70
70
  VERSION,
71
71
  recordApiRequest,
@@ -10,7 +10,7 @@ import {
10
10
  overviewTrendsQuery,
11
11
  renderTrendsHuman,
12
12
  trendsSummaryText
13
- } from "./cli-9kxz65fe.js";
13
+ } from "./cli-ap7wfbnk.js";
14
14
  import {
15
15
  renderMarkdownForTerminal,
16
16
  shouldColorTerminalOutput,
@@ -21,7 +21,7 @@ import"./cli-e0kbye4s.js";
21
21
  import {
22
22
  callControlAPI,
23
23
  callDataAPI
24
- } from "./cli-dxajrq9h.js";
24
+ } from "./cli-n9ng8mym.js";
25
25
  import {
26
26
  EXIT_DEGRADED,
27
27
  EXIT_OK,
@@ -13,7 +13,7 @@ import {
13
13
  } from "./cli-qwnkv4jy.js";
14
14
  import {
15
15
  ApiError
16
- } from "./cli-dxajrq9h.js";
16
+ } from "./cli-n9ng8mym.js";
17
17
  import {
18
18
  DEFAULT_INGEST_URL,
19
19
  EXIT_AUTH_REQUIRED,
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  inventoryFiles,
3
3
  safePromptEvidencePath
4
- } from "./cli-1sdz17sn.js";
4
+ } from "./cli-82fxwm0m.js";
5
5
  import"./cli-k0vxtzxb.js";
6
6
  import"./cli-97fnztpy.js";
7
7
  import"./cli-krm4w2v9.js";
8
8
  import"./cli-13zdcv4w.js";
9
- import"./cli-6ga6kmdp.js";
9
+ import"./cli-37z2f5wa.js";
10
10
  import"./cli-e0kbye4s.js";
11
- import"./cli-dxajrq9h.js";
11
+ import"./cli-n9ng8mym.js";
12
12
  import"./cli-1nd4339b.js";
13
13
  import"./cli-k4tqwah4.js";
14
14
  import {
@@ -3,14 +3,14 @@ import {
3
3
  checkPromptMapping,
4
4
  discoverHarnessPromptSources,
5
5
  safePromptEvidencePath
6
- } from "./cli-1sdz17sn.js";
6
+ } from "./cli-82fxwm0m.js";
7
7
  import"./cli-k0vxtzxb.js";
8
8
  import"./cli-97fnztpy.js";
9
9
  import"./cli-krm4w2v9.js";
10
10
  import"./cli-13zdcv4w.js";
11
- import"./cli-6ga6kmdp.js";
11
+ import"./cli-37z2f5wa.js";
12
12
  import"./cli-e0kbye4s.js";
13
- import"./cli-dxajrq9h.js";
13
+ import"./cli-n9ng8mym.js";
14
14
  import"./cli-1nd4339b.js";
15
15
  import"./cli-k4tqwah4.js";
16
16
  import {
@@ -9,15 +9,15 @@ import {
9
9
  runPromptSync,
10
10
  runPromptsCommand,
11
11
  writePromptSyncProgress
12
- } from "./cli-92zfpz9f.js";
12
+ } from "./cli-2qcedyw0.js";
13
13
  import {
14
14
  promptSourceHashPayload
15
15
  } from "./cli-mm48br00.js";
16
16
  import"./cli-764m5azg.js";
17
17
  import"./cli-13zdcv4w.js";
18
- import"./cli-6ga6kmdp.js";
18
+ import"./cli-37z2f5wa.js";
19
19
  import"./cli-e0kbye4s.js";
20
- import"./cli-dxajrq9h.js";
20
+ import"./cli-n9ng8mym.js";
21
21
  import"./cli-1nd4339b.js";
22
22
  import"./cli-k4tqwah4.js";
23
23
  import"./cli-9kfxkxmk.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  assertFlags
3
- } from "./cli-6ga6kmdp.js";
3
+ } from "./cli-37z2f5wa.js";
4
4
  import {
5
5
  callControlAPI
6
- } from "./cli-dxajrq9h.js";
6
+ } from "./cli-n9ng8mym.js";
7
7
  import {
8
8
  explicitOutputMode,
9
9
  resolveApiKey
@@ -3,14 +3,14 @@ import {
3
3
  pullSkills,
4
4
  runSkillSync,
5
5
  runSkillsCommand
6
- } from "./cli-4t3zznhh.js";
6
+ } from "./cli-pae8jxe9.js";
7
7
  import"./cli-qm5b1vck.js";
8
8
  import"./cli-rjav0vj1.js";
9
9
  import"./cli-hcwdz9sd.js";
10
10
  import"./cli-13zdcv4w.js";
11
- import"./cli-6ga6kmdp.js";
11
+ import"./cli-37z2f5wa.js";
12
12
  import"./cli-e0kbye4s.js";
13
- import"./cli-dxajrq9h.js";
13
+ import"./cli-n9ng8mym.js";
14
14
  import"./cli-1nd4339b.js";
15
15
  import"./cli-k4tqwah4.js";
16
16
  import"./cli-0semcakc.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  runSkillsCommand
3
- } from "./cli-4t3zznhh.js";
3
+ } from "./cli-pae8jxe9.js";
4
4
  import {
5
5
  runPromptsCommand
6
- } from "./cli-92zfpz9f.js";
6
+ } from "./cli-2qcedyw0.js";
7
7
  import"./cli-qm5b1vck.js";
8
8
  import"./cli-rjav0vj1.js";
9
9
  import"./cli-hcwdz9sd.js";
@@ -11,14 +11,14 @@ import"./cli-mm48br00.js";
11
11
  import"./cli-764m5azg.js";
12
12
  import {
13
13
  runHarnessCommand
14
- } from "./cli-1sdz17sn.js";
14
+ } from "./cli-82fxwm0m.js";
15
15
  import"./cli-k0vxtzxb.js";
16
16
  import"./cli-97fnztpy.js";
17
17
  import"./cli-krm4w2v9.js";
18
18
  import"./cli-13zdcv4w.js";
19
- import"./cli-6ga6kmdp.js";
19
+ import"./cli-37z2f5wa.js";
20
20
  import"./cli-e0kbye4s.js";
21
- import"./cli-dxajrq9h.js";
21
+ import"./cli-n9ng8mym.js";
22
22
  import"./cli-1nd4339b.js";
23
23
  import {
24
24
  CliInputError
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moda-ai/cli",
3
- "version": "1.55.102",
3
+ "version": "1.55.104",
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-28T12:10:54.503Z",
4
- "cli_version": "1.55.102",
3
+ "bundled_at": "2026-10-29T01:20:38.056Z",
4
+ "cli_version": "1.55.104",
5
5
  "skills": [
6
6
  {
7
7
  "id": "integration-cloudflare-think",
@@ -136,7 +136,7 @@ moda detections list --family=frustration --limit=5 --json \
136
136
  | while read id idx; do moda traces get "$id" --msg-index="$idx" --window=2; done
137
137
  ```
138
138
 
139
- Which tool fails most, and an example:
139
+ Which tool fails most: rank **classified failure events** with `moda detections tools` (`failure_count`), then read an example. `moda tools list --sort=failures` ranks **recorded failed receipts** (`failed_calls`); it answers a different question and can give a different ranking. `tools list|get` calls and receipt success/failure rates are for usage, not the classified failure leaderboard:
140
140
 
141
141
  ```bash
142
142
  moda detections tools --json | jq '.tools[] | {tool: .tool_name, failures: .failure_count}'
@@ -62,7 +62,7 @@ Loaded on demand from the moda-cli skill. This table can lag the CLI: `moda <com
62
62
  | `--cohort=<ref>` | Scope `problems list`, `traces list`, `detections list` (emotion/frustration/hallucination per trace, laziness, custom_signal hits), `detections tools` and `clusters` to one cohort (`builtin:<key>` or a saved id from `moda cohorts list`). The summary names the cohort; a warning means the server did not confirm the scope |
63
63
  | `moda problems reopen <pid>` | Reopen a Problem marked fixed |
64
64
  | `moda signals <create\|update\|activate\|pause\|delete\|examples\|refine\|revise\|proposals\|accept\|reject\|search\|preview>` | Manage custom signals (writes take `--dry-run`; LLM-backed ones are rate-limited per key) |
65
- | `moda prompts list\|show\|proposals\|usage\|decide` | Read the prompt registry; merge/reject proposals |
65
+ | `moda prompts list\|show\|usage` | Read registered prompt versions and usage |
66
66
  | `moda skills list\|show\|policy` / `moda harness list\|show\|versions\|diff` | Skill library and synced harnesses |
67
67
 
68
68
  `moda traces search` flags: `--mode=keyword|semantic|hybrid` (default `hybrid`),
@@ -29,7 +29,7 @@ Writes listed here accept `--dry-run`: it validates the call, prints the exact r
29
29
  | Custom signals: edit, lifecycle | `moda signals update <id> …`, `moda signals activate\|pause\|delete <id>` (delete: drafts only; archiving is dashboard-only) |
30
30
  | Custom signals: review & tune | `moda signals examples <id> add\|update\|remove --conversation-id=…`, `refine <id> --request="…"`, `revise <id> --conversation-ids=…`, `proposals <id>`, `accept\|reject <id> <proposal_id>` |
31
31
  | Custom signals: find matches | `moda signals search <id>`, `search-status <id> <search_id>`, `search-stop <id> <search_id>`, `preview --file=detector.json` |
32
- | Prompts registry | `moda prompts list [--label --search]`, `show <key>`, `proposals <key>`, `usage <key>`, `decide <key> <proposal_id> --action=merge\|reject\|reopen` |
32
+ | Prompts registry | `moda prompts list [--label --search]`, `show <key>`, `usage <key>` |
33
33
  | Skills library | `moda skills list`, `show <key>`, `policy <key> --live\|--local` |
34
34
  | Harness pages | `moda harness list`, `show <id>`, `versions <id>`, `diff <id> --from=… --to=…` |
35
35
 
@@ -225,7 +225,7 @@ Treat an answer as degraded if **any** of these hold:
225
225
  and `skills policy` validate fully, send nothing, and return
226
226
  `data.planned` (method, endpoint, body) plus a `next_commands` entry
227
227
  that runs the write for real (`requires_approval: true`).
228
- - `registry push`, `harness sync|delete|register`, `prompts sync|decide`
228
+ - `registry push`, `harness sync|delete|register`, `prompts sync`
229
229
  and `skills sync` return their own preview. Some ask the server to
230
230
  compute it (`skills sync --dry-run` sends the local skills marked
231
231
  `dryRun: true`), but none of them applies a change.