@moda-ai/cli 1.55.108 → 1.55.110

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 (46) hide show
  1. package/README.md +3 -3
  2. package/dist/{agent-vvefg4bm.js → agent-5kfdbx36.js} +8 -8
  3. package/dist/{change-impact-5h3k9kg6.js → change-impact-v2vbcphy.js} +5 -5
  4. package/dist/cli-2fv0q9tx.js +141 -0
  5. package/dist/{cli-xxpaq3n8.js → cli-3r578f36.js} +6 -6
  6. package/dist/{cli-13zdcv4w.js → cli-3thzh1mq.js} +1 -1
  7. package/dist/{cli-998n4kz9.js → cli-6df723jn.js} +1 -1
  8. package/dist/{cli-5z2f1w5m.js → cli-6zmc6asf.js} +6 -6
  9. package/dist/{cli-ap7wfbnk.js → cli-7gnw6smk.js} +2 -2
  10. package/dist/{cli-r2dxdhg8.js → cli-84jkd2x7.js} +13 -13
  11. package/dist/{cli-mc3z77bv.js → cli-8qtxp95w.js} +1 -1
  12. package/dist/cli-ahqr7wsp.js +429 -0
  13. package/dist/{cli-qwnkv4jy.js → cli-bgbtrmtr.js} +1 -1
  14. package/dist/{cli-n9ng8mym.js → cli-cp8gv24j.js} +1 -1
  15. package/dist/{cli-eq09n00v.js → cli-ew4pkn5b.js} +6 -6
  16. package/dist/{cli-ekartfps.js → cli-hv4bztsm.js} +1 -1
  17. package/dist/{cli-62e1vy8f.js → cli-m6w66x9d.js} +3 -3
  18. package/dist/{cli-2bhhk2nn.js → cli-mh94f7gp.js} +2 -2
  19. package/dist/{cli-1nd4339b.js → cli-tca7sztv.js} +2 -2
  20. package/dist/cli.js +29 -108
  21. package/dist/{doctor-1hhktzsz.js → doctor-t0b99wnq.js} +7 -7
  22. package/dist/{harness-github-actions-1hq2ed0v.js → harness-github-actions-e4zrcrym.js} +5 -5
  23. package/dist/{harness-7s0w2wc9.js → harness-phdj0eqr.js} +5 -5
  24. package/dist/{index-9adksf01.js → index-65grk0mp.js} +5 -5
  25. package/dist/{index-n1jx9hta.js → index-86wb6vbh.js} +6 -6
  26. package/dist/{index-2g0ft2hm.js → index-zhg2zc3x.js} +13 -13
  27. package/dist/{production-intelligence-8w7an97c.js → production-intelligence-nphep7xw.js} +5 -3
  28. package/dist/{profile-commands-zgq8dja0.js → profile-commands-tz3jykvh.js} +4 -4
  29. package/dist/{prompt-attribution-c1a5pysf.js → prompt-attribution-8ak38a3q.js} +5 -5
  30. package/dist/prompt-source-mcp.js +5 -5
  31. package/dist/{prompts-fdqrbawx.js → prompts-a8zcvc1c.js} +5 -5
  32. package/dist/{provision-d0sxcka1.js → provision-2dzzb0be.js} +5 -5
  33. package/dist/{registry-vxrxw1tj.js → registry-p07epn79.js} +22 -18
  34. package/dist/skills-5atq9sgh.js +17 -0
  35. package/dist/{skills-bundled-7jes6hqx.js → skills-bundled-tcxpw88n.js} +2 -2
  36. package/dist/{sync-gxgpfztm.js → sync-e76vmfty.js} +10 -12
  37. package/package.json +1 -1
  38. package/skills/integration/index.json +2 -2
  39. package/skills/moda-cli/SKILL.md +1 -1
  40. package/skills/moda-cli/references/commands.md +2 -2
  41. package/skills/moda-cli/references/dashboard-parity.md +1 -1
  42. package/skills/moda-cli/references/output-protocol.md +4 -4
  43. package/skills/moda-cli/references/registry.md +1 -3
  44. package/dist/cli-h7hfpmwa.js +0 -1019
  45. package/dist/cli-qm5b1vck.js +0 -220
  46. package/dist/skills-rjbnv8nn.js +0 -23
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  assertFlags
3
- } from "./cli-2bhhk2nn.js";
3
+ } from "./cli-mh94f7gp.js";
4
4
  import {
5
5
  callControlAPI
6
- } from "./cli-n9ng8mym.js";
6
+ } from "./cli-cp8gv24j.js";
7
7
  import {
8
8
  explicitOutputMode,
9
9
  resolveApiKey
10
- } from "./cli-1nd4339b.js";
10
+ } from "./cli-tca7sztv.js";
11
11
  import {
12
12
  CliInputError
13
13
  } from "./cli-k4tqwah4.js";
@@ -474,8 +474,7 @@ Write \`.moda/registry.json\` with \`"schema": "moda_registry.v2"\`:
474
474
  reuse those keys.
475
475
  - \`tools[]\`: \`{ schema: { name, description, parameters } }\`, exactly as
476
476
  sent to the model.
477
- - \`skills[]\`: \`{ key, file: "path/to/SKILL.md" }\`. Set \`"live": true\` only
478
- if I ask.
477
+ - \`skills[]\`: \`{ key, file: "path/to/SKILL.md" }\`.
479
478
  - \`agents[]\`: \`{ key, name, entry, prompt, model: { id, provider,
480
479
  temperature, maxTokens, topP, reasoningEffort }, tools, skills, handoffs,
481
480
  subagents, context, maxToolRoundsPerTurn, responseSchema, match: {
@@ -724,6 +723,7 @@ async function runRegistryCommand(context) {
724
723
  return writeTemplate(context);
725
724
  case "validate": {
726
725
  const registry = loadRegistry(context);
726
+ warnIgnoredLive(context, registry);
727
727
  printWarnings(context, registry.warnings);
728
728
  context.output.writeData({
729
729
  schema: registry.schema,
@@ -769,7 +769,7 @@ async function runRegistryCommand(context) {
769
769
  return { exitCode: 0 };
770
770
  }
771
771
  default:
772
- throw new CliInputError(`Unknown registry command '${subcommand}'.`, "Usage: moda registry template|validate|push|status|coverage|log|show|prompt [--file=.moda/registry.json] [--dry-run] [--live]");
772
+ throw new CliInputError(`Unknown registry command '${subcommand}'.`, "Usage: moda registry template|validate|push|status|coverage|log|show|prompt [--file=.moda/registry.json] [--dry-run]");
773
773
  }
774
774
  }
775
775
  function writeTemplate(context) {
@@ -798,6 +798,7 @@ async function pushRegistry(context) {
798
798
  if (message === "true")
799
799
  throw new CliInputError("Missing text for --message.", 'Usage: moda registry push --message="Add billing agent"');
800
800
  const registry = loadRegistry(context);
801
+ warnIgnoredLive(context, registry);
801
802
  const profileOptions = { profile: context.profile, env: context.env };
802
803
  const hasKey = Boolean(resolveApiKey(profileOptions));
803
804
  if (!hasKey && !context.dryRun) {
@@ -905,6 +906,15 @@ async function readRegistry(context, endpoint) {
905
906
  context.output.writeData(await callControlAPI(endpoint, { method: "GET" }, profileOptions));
906
907
  return { exitCode: 0 };
907
908
  }
909
+ function warnIgnoredLive(context, registry) {
910
+ const sources = [
911
+ ...registry.usesLive ? [displayPath(context, registry.manifestPath)] : [],
912
+ ...context.flags.live !== undefined ? ["your command"] : []
913
+ ];
914
+ if (sources.length === 0 || context.quiet)
915
+ return;
916
+ console.error(`Deprecated: 'live' no longer has any effect and will be removed; drop it from ${sources.join(" and ")}.`);
917
+ }
908
918
  function printWarnings(context, warnings) {
909
919
  if (context.outputMode !== "human" || context.quiet)
910
920
  return;
@@ -917,7 +927,7 @@ function describeActions(response) {
917
927
  for (const item of synced) {
918
928
  if (!isRecord2(item))
919
929
  continue;
920
- const action = typeof item.action === "string" ? `${item.action}${typeof item.reason === "string" ? ` (${item.reason})` : ""}` : item.changed === false ? "unchanged" : item.policyChanged === true && item.changed === true ? "changed (live setting)" : item.changed === true ? "changed" : "synced";
930
+ const action = typeof item.action === "string" ? `${item.action}${typeof item.reason === "string" ? ` (${item.reason})` : ""}` : item.changed === false ? "unchanged" : item.changed === true ? "changed" : "synced";
921
931
  counts.set(action, (counts.get(action) ?? 0) + 1);
922
932
  }
923
933
  return counts.size > 0 ? ` — ${[...counts].map(([action, count]) => `${count} ${action}`).join(", ")}` : "";
@@ -937,11 +947,7 @@ function loadRegistry(context) {
937
947
  } catch (error) {
938
948
  throw new CliInputError(`Registry manifest is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
939
949
  }
940
- return resolveRegistry(parsed, {
941
- manifestPath,
942
- cwd: context.cwd,
943
- forceLive: context.flags.live === "true"
944
- });
950
+ return resolveRegistry(parsed, { manifestPath, cwd: context.cwd });
945
951
  }
946
952
  var PROMPT_FIELDS = {
947
953
  key: "string",
@@ -1084,16 +1090,12 @@ function resolveRegistry(input, options) {
1084
1090
  } else if (Buffer.byteLength(skillMd, "utf8") > MAX_SKILL_BYTES) {
1085
1091
  errors.push(`${label}: skill content exceeds ${MAX_SKILL_BYTES} bytes`);
1086
1092
  }
1087
- if (skill.live !== undefined && typeof skill.live !== "boolean")
1088
- errors.push(`${label}.live must be a boolean`);
1089
- const live = options.forceLive || skill.live === true;
1090
1093
  return {
1091
1094
  key: skill.key,
1092
1095
  ...skill.name !== undefined ? { name: skill.name } : {},
1093
1096
  ...skill.description !== undefined ? { description: skill.description } : {},
1094
1097
  skillMd: skillMd ?? "",
1095
- ...sourcePath !== undefined ? { sourcePath } : {},
1096
- ...live ? { surfacePolicy: "include" } : skill.live === false ? { surfacePolicy: "local_only" } : {}
1098
+ ...sourcePath !== undefined ? { sourcePath } : {}
1097
1099
  };
1098
1100
  });
1099
1101
  const toolNames = new Set;
@@ -1140,6 +1142,7 @@ function resolveRegistry(input, options) {
1140
1142
  promptKeys.add(prompt.key);
1141
1143
  }
1142
1144
  }
1145
+ const usesLive = Array.isArray(input.skills) && input.skills.some((raw) => isRecord2(raw) && raw.live !== undefined);
1143
1146
  const skillKeys = new Set;
1144
1147
  for (const skill of skills) {
1145
1148
  if (skill && nonEmptyString(skill.key)) {
@@ -1161,7 +1164,8 @@ function resolveRegistry(input, options) {
1161
1164
  skills: skills.filter(isDefined),
1162
1165
  tools: tools.filter(isDefined),
1163
1166
  ...harness ? { harness } : {},
1164
- warnings
1167
+ warnings,
1168
+ usesLive
1165
1169
  };
1166
1170
  if (resolved.prompts.length + resolved.skills.length + resolved.tools.length === 0 && !harness) {
1167
1171
  throw new CliInputError("Registry manifest has no prompts, skills, tools, or agents to push.");
@@ -0,0 +1,17 @@
1
+ import {
2
+ runSkillSync,
3
+ runSkillsCommand
4
+ } from "./cli-ahqr7wsp.js";
5
+ import"./cli-2fv0q9tx.js";
6
+ import"./cli-3thzh1mq.js";
7
+ import"./cli-mh94f7gp.js";
8
+ import"./cli-e0kbye4s.js";
9
+ import"./cli-cp8gv24j.js";
10
+ import"./cli-tca7sztv.js";
11
+ import"./cli-k4tqwah4.js";
12
+ import"./cli-0semcakc.js";
13
+ import"./cli-0v6na3yp.js";
14
+ export {
15
+ runSkillsCommand,
16
+ runSkillSync
17
+ };
@@ -3,8 +3,8 @@ import {
3
3
  installIntegrationSkill,
4
4
  readBundledIndex,
5
5
  readBundledSkillMd
6
- } from "./cli-mc3z77bv.js";
7
- import"./cli-qm5b1vck.js";
6
+ } from "./cli-8qtxp95w.js";
7
+ import"./cli-2fv0q9tx.js";
8
8
  import"./cli-rjav0vj1.js";
9
9
  import"./cli-hcwdz9sd.js";
10
10
  import"./cli-0v6na3yp.js";
@@ -1,25 +1,23 @@
1
1
  import {
2
2
  runSkillsCommand
3
- } from "./cli-h7hfpmwa.js";
3
+ } from "./cli-ahqr7wsp.js";
4
4
  import {
5
5
  runPromptsCommand
6
- } from "./cli-xxpaq3n8.js";
7
- import"./cli-qm5b1vck.js";
8
- import"./cli-rjav0vj1.js";
9
- import"./cli-hcwdz9sd.js";
6
+ } from "./cli-3r578f36.js";
7
+ import"./cli-2fv0q9tx.js";
10
8
  import"./cli-mm48br00.js";
11
9
  import"./cli-764m5azg.js";
12
10
  import {
13
11
  runHarnessCommand
14
- } from "./cli-r2dxdhg8.js";
12
+ } from "./cli-84jkd2x7.js";
15
13
  import"./cli-rpyepjwb.js";
16
14
  import"./cli-97fnztpy.js";
17
15
  import"./cli-krm4w2v9.js";
18
- import"./cli-13zdcv4w.js";
19
- import"./cli-2bhhk2nn.js";
16
+ import"./cli-3thzh1mq.js";
17
+ import"./cli-mh94f7gp.js";
20
18
  import"./cli-e0kbye4s.js";
21
- import"./cli-n9ng8mym.js";
22
- import"./cli-1nd4339b.js";
19
+ import"./cli-cp8gv24j.js";
20
+ import"./cli-tca7sztv.js";
23
21
  import {
24
22
  CliInputError
25
23
  } from "./cli-k4tqwah4.js";
@@ -51,8 +49,8 @@ async function runSyncCommand(context) {
51
49
  const exitCode = await runSkillsCommand({
52
50
  ...context,
53
51
  command: "skills",
54
- positional: "pull",
55
- positionals: ["pull", ...rest]
52
+ positional: "sync",
53
+ positionals: ["sync", ...rest]
56
54
  });
57
55
  return { exitCode };
58
56
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moda-ai/cli",
3
- "version": "1.55.108",
3
+ "version": "1.55.110",
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-11-01T02:23:39.826Z",
4
- "cli_version": "1.55.108",
3
+ "bundled_at": "2026-11-01T10:40:50.077Z",
4
+ "cli_version": "1.55.110",
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.11
3
+ version: 3.0.12
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, harness registry push, 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
 
@@ -55,7 +55,7 @@ Loaded on demand from the moda-cli skill. This table can lag the CLI: `moda <com
55
55
  | `moda prompts diff` | Read-only: only prompts changed/new/deleted since last sync (hash-level, not a text diff) |
56
56
  | `moda prompts sync` | Upload changed prompt versions and update lockfile |
57
57
  | `moda prompts promote <key>` | Move a remote prompt label |
58
- | `moda registry template\|validate\|push\|status\|coverage\|log\|show\|prompt` | Register prompts, skills, tools, and agent wiring from one agent-written manifest (`--file`, `--dry-run`, `--live`, `--message`, `--days`); every push is a commit in the Registry history; no repo scan |
58
+ | `moda registry template\|validate\|push\|status\|coverage\|log\|show\|prompt` | Register prompts, skills, tools, and agent wiring from one agent-written manifest (`--file`, `--dry-run`, `--message`, `--days`); every push is a commit in the Registry history; no repo scan |
59
59
  | `moda users` / `moda user <id>` | End users with health/activity (`--page-size=N`, alias `--limit=N`; `--page=N`; `--cohort=builtin:<key>\|<saved id>`); one user's profile |
60
60
  | `moda cohorts list\|get\|fields\|preview\|compare` | User cohorts (built-in and saved): refs and definitions, the definition fields, a member count and sample for an unsaved definition (`--file`/`--definition`), two cohorts side by side (`--days=7\|30\|90`) |
61
61
  | `moda cohorts create\|update` | Write: save a cohort (`--name`, `--file`/`--definition`, `--description`, `--pinned`, `--color`) or edit a saved one (`<cohort_id>`, same flags plus `--note`); both take `--dry-run` |
@@ -63,7 +63,7 @@ Loaded on demand from the moda-cli skill. This table can lag the CLI: `moda <com
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
65
  | `moda prompts list\|show\|usage` | Read registered prompt versions and usage |
66
- | `moda skills list\|show\|policy` / `moda harness list\|show\|versions\|diff` | Skill library and synced harnesses |
66
+ | `moda skills list\|show` / `moda harness list\|show\|versions\|diff` | Registered skills and synced harnesses |
67
67
 
68
68
  `moda traces search` flags: `--mode=keyword|semantic|hybrid` (default `hybrid`),
69
69
  `--user-id`, `--time-range=<range>`, `--limit=N` (1–100, default 20).
@@ -30,7 +30,7 @@ Writes listed here accept `--dry-run`: it validates the call, prints the exact r
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
32
  | Prompts registry | `moda prompts list [--label --search]`, `show <key>`, `usage <key>` |
33
- | Skills library | `moda skills list`, `show <key>`, `policy <key> --live\|--local` |
33
+ | Skills | `moda skills list`, `show <key>` |
34
34
  | Harness pages | `moda harness list`, `show <id>`, `versions <id>`, `diff <id> --from=… --to=…` |
35
35
 
36
36
  Not available to API keys on purpose (a human does these in the dashboard):
@@ -221,13 +221,13 @@ Treat an answer as degraded if **any** of these hold:
221
221
  refund not processed` searches "refund not processed" (same for `ask` and
222
222
  `feedback`).
223
223
  - **Writes take `--dry-run`** (`prompts promote` excepted).
224
- - `problems feedback|reopen|link`, `review`, `feedback`, `signals` writes
225
- and `skills policy` validate fully, send nothing, and return
224
+ - `problems feedback|reopen|link`, `review`, `feedback` and `signals`
225
+ writes 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
228
  - `registry push`, `harness sync|delete|register`, `prompts sync`
229
- and `skills sync` return their own preview. Some ask the server to
230
- compute it (`skills sync --dry-run` sends the local skills marked
229
+ and `skills push` return their own preview. Some ask the server to
230
+ compute it (`skills push --dry-run` sends the local skills marked
231
231
  `dryRun: true`), but none of them applies a change.
232
232
  - A read refuses `--dry-run` **before anything is sent**, so a "preview"
233
233
  can't perform a real write.
@@ -73,9 +73,7 @@ tools still works; every section optional, ≤500 entries in prompts, skills, an
73
73
  rendered example. Re-pushing the same text is a no-op; changed text adds a
74
74
  new version.
75
75
  - **Skills:** `key` (letters, digits, `_`, `-`) plus `skillMd` or `file` (full
76
- SKILL.md). Pushed skills are *local* by default. Set `"live": true`, or pass
77
- `--live`, to include them in the served skill surface. Leaving `live` out
78
- never demotes a skill that is already live.
76
+ SKILL.md). Optional `name`, `description`, `sourcePath`.
79
77
  - **Tools:** an OpenAI function `schema` (a wrapped
80
78
  `{"type":"function","function":{...}}` is accepted), plus optional
81
79
  `isActive`. Copy names and parameter schemas exactly as the agent registers