@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.
- package/README.md +3 -3
- package/dist/{agent-vvefg4bm.js → agent-5kfdbx36.js} +8 -8
- package/dist/{change-impact-5h3k9kg6.js → change-impact-v2vbcphy.js} +5 -5
- package/dist/cli-2fv0q9tx.js +141 -0
- package/dist/{cli-xxpaq3n8.js → cli-3r578f36.js} +6 -6
- package/dist/{cli-13zdcv4w.js → cli-3thzh1mq.js} +1 -1
- package/dist/{cli-998n4kz9.js → cli-6df723jn.js} +1 -1
- package/dist/{cli-5z2f1w5m.js → cli-6zmc6asf.js} +6 -6
- package/dist/{cli-ap7wfbnk.js → cli-7gnw6smk.js} +2 -2
- package/dist/{cli-r2dxdhg8.js → cli-84jkd2x7.js} +13 -13
- package/dist/{cli-mc3z77bv.js → cli-8qtxp95w.js} +1 -1
- package/dist/cli-ahqr7wsp.js +429 -0
- package/dist/{cli-qwnkv4jy.js → cli-bgbtrmtr.js} +1 -1
- package/dist/{cli-n9ng8mym.js → cli-cp8gv24j.js} +1 -1
- package/dist/{cli-eq09n00v.js → cli-ew4pkn5b.js} +6 -6
- package/dist/{cli-ekartfps.js → cli-hv4bztsm.js} +1 -1
- package/dist/{cli-62e1vy8f.js → cli-m6w66x9d.js} +3 -3
- package/dist/{cli-2bhhk2nn.js → cli-mh94f7gp.js} +2 -2
- package/dist/{cli-1nd4339b.js → cli-tca7sztv.js} +2 -2
- package/dist/cli.js +29 -108
- package/dist/{doctor-1hhktzsz.js → doctor-t0b99wnq.js} +7 -7
- package/dist/{harness-github-actions-1hq2ed0v.js → harness-github-actions-e4zrcrym.js} +5 -5
- package/dist/{harness-7s0w2wc9.js → harness-phdj0eqr.js} +5 -5
- package/dist/{index-9adksf01.js → index-65grk0mp.js} +5 -5
- package/dist/{index-n1jx9hta.js → index-86wb6vbh.js} +6 -6
- package/dist/{index-2g0ft2hm.js → index-zhg2zc3x.js} +13 -13
- package/dist/{production-intelligence-8w7an97c.js → production-intelligence-nphep7xw.js} +5 -3
- package/dist/{profile-commands-zgq8dja0.js → profile-commands-tz3jykvh.js} +4 -4
- package/dist/{prompt-attribution-c1a5pysf.js → prompt-attribution-8ak38a3q.js} +5 -5
- package/dist/prompt-source-mcp.js +5 -5
- package/dist/{prompts-fdqrbawx.js → prompts-a8zcvc1c.js} +5 -5
- package/dist/{provision-d0sxcka1.js → provision-2dzzb0be.js} +5 -5
- package/dist/{registry-vxrxw1tj.js → registry-p07epn79.js} +22 -18
- package/dist/skills-5atq9sgh.js +17 -0
- package/dist/{skills-bundled-7jes6hqx.js → skills-bundled-tcxpw88n.js} +2 -2
- package/dist/{sync-gxgpfztm.js → sync-e76vmfty.js} +10 -12
- package/package.json +1 -1
- package/skills/integration/index.json +2 -2
- package/skills/moda-cli/SKILL.md +1 -1
- package/skills/moda-cli/references/commands.md +2 -2
- package/skills/moda-cli/references/dashboard-parity.md +1 -1
- package/skills/moda-cli/references/output-protocol.md +4 -4
- package/skills/moda-cli/references/registry.md +1 -3
- package/dist/cli-h7hfpmwa.js +0 -1019
- package/dist/cli-qm5b1vck.js +0 -220
- package/dist/skills-rjbnv8nn.js +0 -23
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
assertFlags
|
|
3
|
-
} from "./cli-
|
|
3
|
+
} from "./cli-mh94f7gp.js";
|
|
4
4
|
import {
|
|
5
5
|
callControlAPI
|
|
6
|
-
} from "./cli-
|
|
6
|
+
} from "./cli-cp8gv24j.js";
|
|
7
7
|
import {
|
|
8
8
|
explicitOutputMode,
|
|
9
9
|
resolveApiKey
|
|
10
|
-
} from "./cli-
|
|
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" }\`.
|
|
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]
|
|
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.
|
|
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-
|
|
7
|
-
import"./cli-
|
|
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-
|
|
3
|
+
} from "./cli-ahqr7wsp.js";
|
|
4
4
|
import {
|
|
5
5
|
runPromptsCommand
|
|
6
|
-
} from "./cli-
|
|
7
|
-
import"./cli-
|
|
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-
|
|
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-
|
|
19
|
-
import"./cli-
|
|
16
|
+
import"./cli-3thzh1mq.js";
|
|
17
|
+
import"./cli-mh94f7gp.js";
|
|
20
18
|
import"./cli-e0kbye4s.js";
|
|
21
|
-
import"./cli-
|
|
22
|
-
import"./cli-
|
|
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: "
|
|
55
|
-
positionals: ["
|
|
52
|
+
positional: "sync",
|
|
53
|
+
positionals: ["sync", ...rest]
|
|
56
54
|
});
|
|
57
55
|
return { exitCode };
|
|
58
56
|
}
|
package/package.json
CHANGED
package/skills/moda-cli/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: moda-cli
|
|
3
|
-
version: 3.0.
|
|
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`, `--
|
|
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
|
|
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
|
|
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
|
|
225
|
-
|
|
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
|
|
230
|
-
compute it (`skills
|
|
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).
|
|
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
|