@moda-ai/cli 1.55.72 → 1.55.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -66,6 +66,17 @@ folder presence is not evidence of SDK initialization, so doctor does not warn
66
66
  about instrumentation solely because a `src` or `app` directory exists. Verify
67
67
  your integration with a fresh application conversation and `moda audit`.
68
68
 
69
+ ## Local harness extraction
70
+
71
+ `moda harness extract --path=<repo> --json` scans source without an LLM or network calls. Its JSON preserves the traced call sites and roles, and adds `graph.runtimeAgents` and `graph.artifacts`: agent classes, multi-step tool loops, bound workflows, model-backed cron pipelines, and statically enabled framework/MCP tools alongside existing deterministic artifacts.
72
+
73
+ ```bash
74
+ moda harness extract --path=. --json
75
+ moda harness candidates --path=. --promote=all --out=harness-components.json --yes
76
+ ```
77
+
78
+ Every enumerated component includes a source citation and `reachable` or `defined_only` status. Production trace evidence can later promote it to `in_prod`. Dynamic MCP allow-all servers are one group; extraction does not connect to those servers. The repository-bound `createAgentScopeResolver(result, ctx)` callback maps `CallSite.enclosing` to emitted agent IDs, including inherited hooks and shared helpers; ambiguous or unknown scopes return `[]`.
79
+
69
80
  ## Usage
70
81
 
71
82
  Find things by meaning, then drill in:
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  buildDoctorReport
3
- } from "./cli-9dwq3vyj.js";
3
+ } from "./cli-s4j2m651.js";
4
4
  import"./cli-rrggdmf8.js";
5
- import"./cli-gqkvypxh.js";
5
+ import"./cli-4qx5ax0a.js";
6
6
  import"./cli-mm48br00.js";
7
7
  import {
8
8
  readHarnessSyncState
@@ -14,11 +14,11 @@ import {
14
14
  hashStableJson,
15
15
  readHarnessReport,
16
16
  validateHarnessReport
17
- } from "./cli-9ww72mrd.js";
18
- import"./cli-5ms8rw8x.js";
19
- import"./cli-e0kbye4s.js";
17
+ } from "./cli-y333w08f.js";
20
18
  import"./cli-22yvg5kh.js";
21
19
  import"./cli-87xy1evx.js";
20
+ import"./cli-5ms8rw8x.js";
21
+ import"./cli-e0kbye4s.js";
22
22
  import {
23
23
  resolveApiKey,
24
24
  resolveIngestUrl,
@@ -95,7 +95,7 @@ async function buildAgentContext(context) {
95
95
  const graph = readHarnessGraphIfPresent(context.cwd);
96
96
  const reportState = readHarnessReportState(context.cwd);
97
97
  const syncState = readHarnessSyncState(context.cwd);
98
- const harness = graph ? await import("./harness-qvszhbrt.js") : undefined;
98
+ const harness = graph ? await import("./harness-acdx3zgk.js") : undefined;
99
99
  const topFindings = doctor.checks.filter((check) => check.status === "fail" || check.status === "warning").slice(0, 12).map(checkToFinding);
100
100
  const evidenceRefs = [
101
101
  ...doctor.checks.map(checkToEvidenceRef),
@@ -2,9 +2,6 @@ import {
2
2
  computePromptContentHash,
3
3
  stableJson
4
4
  } from "./cli-mm48br00.js";
5
- import {
6
- createCommandContext
7
- } from "./cli-5ms8rw8x.js";
8
5
  import {
9
6
  assertFlags,
10
7
  assertPositionals
@@ -12,6 +9,9 @@ import {
12
9
  import {
13
10
  callControlAPI
14
11
  } from "./cli-87xy1evx.js";
12
+ import {
13
+ createCommandContext
14
+ } from "./cli-5ms8rw8x.js";
15
15
  import {
16
16
  CliInputError
17
17
  } from "./cli-k4tqwah4.js";
@@ -5768,7 +5768,7 @@ async function runPromptSyncExclusive(flags, profileOptions, options) {
5768
5768
  const analyzedDefinitions = new Map;
5769
5769
  if (flags["no-analyze"] !== "true") {
5770
5770
  options.onProgress?.("Analyzing prompt sources before sync.");
5771
- const { analyzeHarnessPrompts } = await import("./harness-qvszhbrt.js");
5771
+ const { analyzeHarnessPrompts } = await import("./harness-acdx3zgk.js");
5772
5772
  const result = await analyzeHarnessPrompts({
5773
5773
  rootDir: process.cwd(),
5774
5774
  existing: established.flatMap((prompt) => prompt.sourceDefinition ? [prompt.sourceDefinition.source] : []),
@@ -5796,7 +5796,7 @@ async function runPromptSyncExclusive(flags, profileOptions, options) {
5796
5796
  const mergedSources = mergePromptSources(manifest.sources, extraSources);
5797
5797
  const manifestUpdate = stableJson(mergedSources) === stableJson(mergePromptSources(manifest.sources, [])) ? undefined : $stringify({ version: 2, prompt_paths: manifest.promptPaths, sources: mergedSources });
5798
5798
  const prompts = await discoverPrompts(extraSources);
5799
- const { checkPromptAttribution } = await import("./prompt-attribution-t62yzfxb.js");
5799
+ const { checkPromptAttribution } = await import("./prompt-attribution-b0ccme35.js");
5800
5800
  const attribution = checkPromptAttribution(process.cwd(), prompts.map((prompt) => prompt.key));
5801
5801
  const brokenAttribution = attribution.references.filter((reference) => reference.status === "missing");
5802
5802
  if (brokenAttribution.length) {
@@ -6102,7 +6102,7 @@ async function migratePromptManifest(options = {}) {
6102
6102
  let addedSources = [];
6103
6103
  let pendingSources = [];
6104
6104
  if (options.discover) {
6105
- const { analyzeHarnessPrompts } = await import("./harness-qvszhbrt.js");
6105
+ const { analyzeHarnessPrompts } = await import("./harness-acdx3zgk.js");
6106
6106
  const result = await analyzeHarnessPrompts({
6107
6107
  rootDir: root,
6108
6108
  existing: manifest.sources,
@@ -6303,7 +6303,7 @@ async function readHarnessSources(reportPath) {
6303
6303
  if (!graph) {
6304
6304
  throw new CliInputError(`${selected} is not a harness report with a graph (schema: ${schemaLabel}). Regenerate it with \`${HARNESS_REANALYZE_COMMAND}\`.`);
6305
6305
  }
6306
- const { normalizeHarnessReport } = await import("./harness-report-3n7bg314.js");
6306
+ const { normalizeHarnessReport } = await import("./harness-report-1q7322xg.js");
6307
6307
  const { backfillPromptSource, resolvePromptSource } = await loadPromptSources();
6308
6308
  const report = normalizeHarnessReport(raw);
6309
6309
  const artifacts = (report.graph.artifacts ?? []).filter((artifact) => artifact.type === "prompt");