@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 +3 -1
- package/dist/{agent-wjkgt137.js → agent-e4k17rzy.js} +3 -3
- package/dist/{cli-2eqh3150.js → cli-a03st7e3.js} +2 -2
- package/dist/{cli-5b4tz5vj.js → cli-n1d52cww.js} +1 -1
- package/dist/{cli-37r94bmk.js → cli-x9cwat4a.js} +1 -1
- package/dist/{cli-6ycf2aj5.js → cli-zgj5bakm.js} +5 -5
- package/dist/cli.js +63 -10
- package/dist/{doctor-2hd9rq68.js → doctor-hnzte896.js} +2 -2
- package/dist/{harness-8rbsmg8y.js → harness-6vwehf47.js} +2 -5
- package/dist/{harness-github-actions-jwfvzf5x.js → harness-github-actions-6gdrpn4m.js} +1 -1
- package/dist/{index-ecsjv99z.js → index-6atgddwt.js} +3 -3
- package/dist/{production-intelligence-wvsgjxth.js → production-intelligence-7wb1djy2.js} +0 -9
- package/dist/{prompt-attribution-gypvn8z9.js → prompt-attribution-t0eq8gn8.js} +1 -1
- package/dist/prompt-source-mcp.js +1 -1
- package/dist/{prompts-ab-98pqf06s.js → prompts-ab-qed3ra5e.js} +4 -11
- package/dist/{prompts-3qr24vd6.js → prompts-kswdk3ft.js} +1 -1
- package/dist/{prompts-propose-md1k1ax8.js → prompts-propose-y5r68pcw.js} +2 -2
- package/dist/{sync-q9raqnk4.js → sync-5e8t28t7.js} +2 -2
- package/package.json +1 -1
- package/skills/integration/index.json +2 -2
- package/skills/moda-cli/SKILL.md +4 -2
- package/skills/moda-cli/references/output-protocol.md +6 -2
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`.
|
|
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-
|
|
3
|
+
} from "./cli-a03st7e3.js";
|
|
4
4
|
import"./cli-9bgnvth2.js";
|
|
5
|
-
import"./cli-
|
|
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-
|
|
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-
|
|
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-
|
|
379
|
+
const { scanHarness } = await import("./harness-6vwehf47.js");
|
|
380
380
|
const current = scanHarness({
|
|
381
381
|
rootDir: cwd,
|
|
382
382
|
scannerVersion: "doctor",
|
|
@@ -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-
|
|
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-
|
|
5728
|
+
return (await import("./prompts-ab-qed3ra5e.js")).runPromptAb(flags, profileOptions, context);
|
|
5729
5729
|
case "propose":
|
|
5730
|
-
await (await import("./prompts-propose-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
2974
|
+
return (await import("./harness-6vwehf47.js")).runHarnessCommand(...args);
|
|
2975
2975
|
}
|
|
2976
2976
|
async function runSyncCommand(...args) {
|
|
2977
|
-
return (await import("./sync-
|
|
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-
|
|
2983
|
+
return (await import("./doctor-hnzte896.js")).runDoctorCommand(...args);
|
|
2984
2984
|
}
|
|
2985
2985
|
async function runStatusCommand(...args) {
|
|
2986
|
-
return (await import("./doctor-
|
|
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-
|
|
2998
|
+
return (await import("./agent-e4k17rzy.js")).runAgentCommand(...args);
|
|
2999
2999
|
}
|
|
3000
3000
|
async function runProductionCommand(...args) {
|
|
3001
|
-
return (await import("./production-intelligence-
|
|
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-
|
|
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:
|
|
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-
|
|
6
|
+
} from "./cli-a03st7e3.js";
|
|
7
7
|
import"./cli-9bgnvth2.js";
|
|
8
|
-
import"./cli-
|
|
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-
|
|
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
|
buildDoctorReport
|
|
3
|
-
} from "./cli-
|
|
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-
|
|
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-
|
|
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
|
}
|
|
@@ -23,13 +23,9 @@ import {
|
|
|
23
23
|
runPromptAb,
|
|
24
24
|
selectProblemCases,
|
|
25
25
|
waitLabel
|
|
26
|
-
} from "./cli-
|
|
27
|
-
import
|
|
28
|
-
|
|
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
|
-
|
|
68
|
-
DEFAULT_PROBLEM_MAX_CASES,
|
|
69
|
-
DEFAULT_POLL_INTERVAL_MS
|
|
62
|
+
DEFAULT_PROBLEM_MAX_CASES
|
|
70
63
|
};
|
|
@@ -7,9 +7,9 @@ import {
|
|
|
7
7
|
formatVerdict,
|
|
8
8
|
rerunWithYes,
|
|
9
9
|
resolvePromptArmSpec
|
|
10
|
-
} from "./cli-
|
|
10
|
+
} from "./cli-n1d52cww.js";
|
|
11
11
|
import"./cli-yz8xcpyk.js";
|
|
12
|
-
import"./cli-
|
|
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-
|
|
7
|
+
} from "./cli-zgj5bakm.js";
|
|
8
8
|
import"./cli-mm48br00.js";
|
|
9
9
|
import {
|
|
10
10
|
runHarnessCommand
|
|
11
|
-
} from "./cli-
|
|
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
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.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.
|
|
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
|
|
241
|
-
|
|
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
|
| --- | --- | --- | --- |
|