@duo-director/cli 0.2.1 → 0.2.2

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 (81) hide show
  1. package/dist/THIRD_PARTY_NOTICES.md +3 -3
  2. package/dist/{cli-WTCBCBVN.js → cli-QTN5SRNE.js} +61 -15
  3. package/dist/duoctl.js +1 -1
  4. package/dist/runtime-tree.json +12 -12
  5. package/dist/ui/app.js +2 -2
  6. package/node_modules/@modelcontextprotocol/client/dist/{index-CEk3qkZM.d.cts → index-D_CiY-T3.d.cts} +3 -1
  7. package/node_modules/@modelcontextprotocol/client/dist/index-D_CiY-T3.d.cts.map +1 -0
  8. package/node_modules/@modelcontextprotocol/client/dist/{index-BCtJi0p5.d.mts → index-D_QDtbiv.d.mts} +3 -1
  9. package/node_modules/@modelcontextprotocol/client/dist/index-D_QDtbiv.d.mts.map +1 -0
  10. package/node_modules/@modelcontextprotocol/client/dist/index.cjs +100 -55
  11. package/node_modules/@modelcontextprotocol/client/dist/index.cjs.map +1 -1
  12. package/node_modules/@modelcontextprotocol/client/dist/index.d.cts +157 -30
  13. package/node_modules/@modelcontextprotocol/client/dist/index.d.cts.map +1 -1
  14. package/node_modules/@modelcontextprotocol/client/dist/index.d.mts +157 -30
  15. package/node_modules/@modelcontextprotocol/client/dist/index.d.mts.map +1 -1
  16. package/node_modules/@modelcontextprotocol/client/dist/index.mjs +100 -55
  17. package/node_modules/@modelcontextprotocol/client/dist/index.mjs.map +1 -1
  18. package/node_modules/@modelcontextprotocol/client/dist/shimsWorkerd.cjs +1 -1
  19. package/node_modules/@modelcontextprotocol/client/dist/shimsWorkerd.mjs +1 -1
  20. package/node_modules/@modelcontextprotocol/client/dist/{src-D0qEN74R.cjs → src-oZBjf3U1.cjs} +21 -4
  21. package/node_modules/@modelcontextprotocol/client/dist/src-oZBjf3U1.cjs.map +1 -0
  22. package/node_modules/@modelcontextprotocol/client/dist/{src-DDAAhLnO.mjs → src-xKF0PJN-.mjs} +16 -5
  23. package/node_modules/@modelcontextprotocol/client/dist/src-xKF0PJN-.mjs.map +1 -0
  24. package/node_modules/@modelcontextprotocol/client/dist/stdio.cjs +1 -1
  25. package/node_modules/@modelcontextprotocol/client/dist/stdio.d.cts +1 -1
  26. package/node_modules/@modelcontextprotocol/client/dist/stdio.d.mts +1 -1
  27. package/node_modules/@modelcontextprotocol/client/dist/stdio.mjs +1 -1
  28. package/node_modules/@modelcontextprotocol/client/package.json +3 -3
  29. package/node_modules/@modelcontextprotocol/core/dist/{auth--n_Yzytt.d.cts → auth-Anm-lwWi.d.mts} +9 -8
  30. package/node_modules/@modelcontextprotocol/core/dist/{auth--n_Yzytt.d.cts.map → auth-Anm-lwWi.d.mts.map} +1 -1
  31. package/node_modules/@modelcontextprotocol/core/dist/{auth-CGP0BDVq.mjs → auth-BNDyLTqp.mjs} +5 -3
  32. package/node_modules/@modelcontextprotocol/core/dist/{auth-CGP0BDVq.mjs.map → auth-BNDyLTqp.mjs.map} +1 -1
  33. package/node_modules/@modelcontextprotocol/core/dist/{auth-4-zilcqg.cjs → auth-D1CeV_Jr.cjs} +5 -3
  34. package/node_modules/@modelcontextprotocol/core/dist/{auth-4-zilcqg.cjs.map → auth-D1CeV_Jr.cjs.map} +1 -1
  35. package/node_modules/@modelcontextprotocol/core/dist/{auth-YUQV3RRv.d.mts → auth-V9XJSCfa.d.cts} +9 -8
  36. package/node_modules/@modelcontextprotocol/core/dist/{auth-YUQV3RRv.d.mts.map → auth-V9XJSCfa.d.cts.map} +1 -1
  37. package/node_modules/@modelcontextprotocol/core/dist/index.cjs +1 -1
  38. package/node_modules/@modelcontextprotocol/core/dist/index.d.cts +1 -1
  39. package/node_modules/@modelcontextprotocol/core/dist/index.d.mts +1 -1
  40. package/node_modules/@modelcontextprotocol/core/dist/index.mjs +1 -1
  41. package/node_modules/@modelcontextprotocol/core/dist/internal.cjs +1 -1
  42. package/node_modules/@modelcontextprotocol/core/dist/internal.d.cts +1 -1
  43. package/node_modules/@modelcontextprotocol/core/dist/internal.d.mts +1 -1
  44. package/node_modules/@modelcontextprotocol/core/dist/internal.mjs +1 -1
  45. package/node_modules/@modelcontextprotocol/core/package.json +1 -1
  46. package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-Bt6U_Fqb.d.mts → createMcpHandler-CfX6zgs1.d.mts} +3 -1
  47. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CfX6zgs1.d.mts.map +1 -0
  48. package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-BLVe3qmU.d.cts → createMcpHandler-LSKhyqpU.d.cts} +3 -1
  49. package/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-BLVe3qmU.d.cts.map → createMcpHandler-LSKhyqpU.d.cts.map} +1 -1
  50. package/node_modules/@modelcontextprotocol/server/dist/index.cjs +5 -3
  51. package/node_modules/@modelcontextprotocol/server/dist/index.cjs.map +1 -1
  52. package/node_modules/@modelcontextprotocol/server/dist/index.d.cts +1 -1
  53. package/node_modules/@modelcontextprotocol/server/dist/index.d.mts +1 -1
  54. package/node_modules/@modelcontextprotocol/server/dist/index.d.mts.map +1 -1
  55. package/node_modules/@modelcontextprotocol/server/dist/index.mjs +5 -3
  56. package/node_modules/@modelcontextprotocol/server/dist/index.mjs.map +1 -1
  57. package/node_modules/@modelcontextprotocol/server/dist/{mcp-Dw2OlZ1f.mjs → mcp-DYuW2ZSs.mjs} +6 -2
  58. package/node_modules/@modelcontextprotocol/server/dist/mcp-DYuW2ZSs.mjs.map +1 -0
  59. package/node_modules/@modelcontextprotocol/server/dist/{mcp-DUcCQSTW.cjs → mcp-TfXCpFsH.cjs} +6 -2
  60. package/node_modules/@modelcontextprotocol/server/dist/mcp-TfXCpFsH.cjs.map +1 -0
  61. package/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.cjs +1 -1
  62. package/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.mjs +1 -1
  63. package/node_modules/@modelcontextprotocol/server/dist/{src-D-y6h4N7.mjs → src-BHSMhZ_W.mjs} +8 -4
  64. package/node_modules/@modelcontextprotocol/server/dist/src-BHSMhZ_W.mjs.map +1 -0
  65. package/node_modules/@modelcontextprotocol/server/dist/{src-CgFsfg3E.cjs → src-BtQ5YSyq.cjs} +8 -4
  66. package/node_modules/@modelcontextprotocol/server/dist/src-BtQ5YSyq.cjs.map +1 -0
  67. package/node_modules/@modelcontextprotocol/server/dist/stdio.cjs +2 -2
  68. package/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts +1 -1
  69. package/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts +1 -1
  70. package/node_modules/@modelcontextprotocol/server/dist/stdio.mjs +2 -2
  71. package/node_modules/@modelcontextprotocol/server/package.json +3 -3
  72. package/package.json +3 -3
  73. package/node_modules/@modelcontextprotocol/client/dist/index-BCtJi0p5.d.mts.map +0 -1
  74. package/node_modules/@modelcontextprotocol/client/dist/index-CEk3qkZM.d.cts.map +0 -1
  75. package/node_modules/@modelcontextprotocol/client/dist/src-D0qEN74R.cjs.map +0 -1
  76. package/node_modules/@modelcontextprotocol/client/dist/src-DDAAhLnO.mjs.map +0 -1
  77. package/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-Bt6U_Fqb.d.mts.map +0 -1
  78. package/node_modules/@modelcontextprotocol/server/dist/mcp-DUcCQSTW.cjs.map +0 -1
  79. package/node_modules/@modelcontextprotocol/server/dist/mcp-Dw2OlZ1f.mjs.map +0 -1
  80. package/node_modules/@modelcontextprotocol/server/dist/src-CgFsfg3E.cjs.map +0 -1
  81. package/node_modules/@modelcontextprotocol/server/dist/src-D-y6h4N7.mjs.map +0 -1
@@ -97,7 +97,7 @@ Each WASM file is accompanied by its license in dist/grammars/LICENSE-<package>;
97
97
 
98
98
  These packages are inside this package (bundleDependencies): the release lock installed from registry.npmjs.org, files unchanged, each package with its own license files in node_modules/. A file a package publishes outside its own "files" list is not packed by npm (listed as notPacked). Paths, versions, integrity and content hashes are in dist/runtime-tree.json.
99
99
 
100
- ### @modelcontextprotocol/client@2.1.0 (MIT)
100
+ ### @modelcontextprotocol/client@2.2.0 (MIT)
101
101
 
102
102
  node_modules/@modelcontextprotocol/client/LICENSE:
103
103
 
@@ -320,7 +320,7 @@ CC-BY-4.0. See https://creativecommons.org/licenses/by/4.0/legalcode for
320
320
  the full license text.
321
321
  ```
322
322
 
323
- ### @modelcontextprotocol/core@2.1.0 (MIT)
323
+ ### @modelcontextprotocol/core@2.2.0 (MIT)
324
324
 
325
325
  node_modules/@modelcontextprotocol/core/LICENSE:
326
326
 
@@ -543,7 +543,7 @@ CC-BY-4.0. See https://creativecommons.org/licenses/by/4.0/legalcode for
543
543
  the full license text.
544
544
  ```
545
545
 
546
- ### @modelcontextprotocol/server@2.1.0 (MIT)
546
+ ### @modelcontextprotocol/server@2.2.0 (MIT)
547
547
 
548
548
  node_modules/@modelcontextprotocol/server/LICENSE:
549
549
 
@@ -159,6 +159,8 @@ var DIAGNOSTIC_SEVERITY = {
159
159
  DECISION_LOCK_BUSY: "error",
160
160
  /** A confirmed Decision's lock.digest does not match its content fields (a detection aid, not a signature). */
161
161
  DECISION_LOCK_MISMATCH: "warning",
162
+ /** T40 (N1): an authoritative operation refused partial Project Truth; the loader errors follow it. */
163
+ PROJECT_TRUTH_INVALID: "error",
162
164
  /** A SourceLocation that does not address its canonical source text (a producer bug, T09.1). */
163
165
  SOURCE_LOCATION_INVALID: "error",
164
166
  /** Context Compiler: the request cannot be compiled (empty task, budget out of range or below the packet frame, unknown profile). */
@@ -298,6 +300,7 @@ var DIAGNOSTIC_PERSISTENCE = {
298
300
  DECISION_TARGET_UNSUPPORTED: T,
299
301
  DECISION_SUPERSEDE_TARGET_INVALID: T,
300
302
  DECISION_LOCK_BUSY: T,
303
+ PROJECT_TRUTH_INVALID: T,
301
304
  DECISION_LOCK_MISMATCH: P,
302
305
  SOURCE_LOCATION_INVALID: P,
303
306
  CONTEXT_REQUEST_INVALID: T,
@@ -2183,6 +2186,23 @@ function loadProjectTruth(root, options = {}) {
2183
2186
  return { value: { truth, trace: trace2.model }, diagnostics: diagnostics.sort(compareDiagnostics) };
2184
2187
  }
2185
2188
 
2189
+ // packages/core/dist/loader/authority.js
2190
+ var NON_BLOCKING_TRUTH_ERRORS = /* @__PURE__ */ new Set(["BROKEN_REFERENCE", "REFERENCE_TYPE_MISMATCH"]);
2191
+ function truthAuthorityErrors(diagnostics) {
2192
+ return diagnostics.filter((d) => d.severity === "error" && !NON_BLOCKING_TRUTH_ERRORS.has(d.code));
2193
+ }
2194
+ function projectTruthInvalid(errors) {
2195
+ const files = [...new Set(errors.map((e) => e.source?.path).filter((p) => p !== void 0))];
2196
+ const where = files.length === 0 ? "" : `: ${files.slice(0, 3).join(", ")}${files.length > 3 ? ` and ${files.length - 3} more` : ""}`;
2197
+ return createDiagnostic("PROJECT_TRUTH_INVALID", `Project Truth could not be read completely (${errors.length} error${errors.length === 1 ? "" : "s"}${where}). DUO does not review, compile context or change Decisions on partial Truth. Fix the file; DUO does not change it.`);
2198
+ }
2199
+ function requireCompleteTruth(loaded) {
2200
+ if (loaded.value === void 0)
2201
+ return loaded;
2202
+ const errors = truthAuthorityErrors(loaded.diagnostics);
2203
+ return errors.length === 0 ? loaded : { diagnostics: [projectTruthInvalid(errors), ...errors] };
2204
+ }
2205
+
2186
2206
  // packages/core/dist/decisions/service.js
2187
2207
  import os from "node:os";
2188
2208
 
@@ -2419,8 +2439,9 @@ function createDecisionService(options) {
2419
2439
  await fs28.remove(file);
2420
2440
  }
2421
2441
  }
2422
- function load() {
2423
- const loaded = loadProjectTruth(root);
2442
+ function load(complete = true) {
2443
+ const raw = loadProjectTruth(root);
2444
+ const loaded = complete ? requireCompleteTruth(raw) : raw;
2424
2445
  return loaded.value === void 0 ? failure(loaded.diagnostics) : success(loaded.value.truth, loaded.diagnostics);
2425
2446
  }
2426
2447
  const isServiceFile = (d) => d.location.path === decisionPath(d.id);
@@ -2475,13 +2496,13 @@ function createDecisionService(options) {
2475
2496
  }
2476
2497
  return { repaired, diagnostics };
2477
2498
  }
2478
- async function prepare() {
2479
- let loaded = load();
2499
+ async function prepare(complete = true) {
2500
+ let loaded = load(complete);
2480
2501
  if (loaded.value === void 0)
2481
2502
  return failure(loaded.diagnostics);
2482
2503
  const fixed = await repairWith(loaded.value);
2483
2504
  if (fixed.repaired.length > 0) {
2484
- loaded = load();
2505
+ loaded = load(complete);
2485
2506
  if (loaded.value === void 0)
2486
2507
  return failure(loaded.diagnostics);
2487
2508
  }
@@ -2541,7 +2562,7 @@ function createDecisionService(options) {
2541
2562
  if (denied.length > 0)
2542
2563
  return failure(denied);
2543
2564
  return withLock(async () => {
2544
- const prepared = await prepare();
2565
+ const prepared = await prepare(false);
2545
2566
  if (prepared.value === void 0)
2546
2567
  return failure(prepared.diagnostics);
2547
2568
  const { truth, repaired } = prepared.value;
@@ -11017,7 +11038,7 @@ async function captureAdoptionBaseline(root, options) {
11017
11038
  if (options.actor.kind !== "human") {
11018
11039
  return failure([createDiagnostic("ADOPTION_FORBIDDEN", `${options.actor.kind} "${options.actor.name}" cannot capture the Adoption Baseline; adoption is a human decision`)]);
11019
11040
  }
11020
- const loaded = loadProjectTruth(root);
11041
+ const loaded = requireCompleteTruth(loadProjectTruth(root));
11021
11042
  if (loaded.value === void 0)
11022
11043
  return failure(loaded.diagnostics);
11023
11044
  const { truth } = loaded.value;
@@ -12739,7 +12760,7 @@ async function compileContext(root, request, options) {
12739
12760
  const idle = (status, signals, extra = {}) => success({ status, freshness, signals, cache: { status: "off", written: false }, performance: perf(), diagnostics: canonicalDiagnostics(diagnostics), ...extra }, canonicalDiagnostics(diagnostics));
12740
12761
  if (inspected.value.status !== "current")
12741
12762
  return idle("index-required", []);
12742
- const loaded = loadProjectTruth(root);
12763
+ const loaded = requireCompleteTruth(loadProjectTruth(root));
12743
12764
  if (loaded.value === void 0)
12744
12765
  return failure(loaded.diagnostics);
12745
12766
  const { truth } = loaded.value;
@@ -14773,7 +14794,7 @@ async function reviewChanges(root, request, options) {
14773
14794
  if (inspected.value.status !== "current") {
14774
14795
  return success({ result: { format: "duo.review/1", status: "index-required", request: requestIdentity, baseline, freshness, seeds: [], verdictBasis: { blocking: [], ask: [], warn: [] }, claims: [], evidence: [], limitations: [], semanticAssist: noAssist, metrics: zeroMetrics, diagnostics: [] }, performance: perf() });
14775
14796
  }
14776
- const loaded = loadProjectTruth(root);
14797
+ const loaded = requireCompleteTruth(loadProjectTruth(root));
14777
14798
  if (loaded.value === void 0)
14778
14799
  return { diagnostics: loaded.diagnostics };
14779
14800
  const { truth } = loaded.value;
@@ -15410,7 +15431,7 @@ async function withGraphWriter(root, fn) {
15410
15431
  function project(root) {
15411
15432
  const loaded = loadProjectTruth(root);
15412
15433
  if (loaded.value !== void 0)
15413
- return { value: loaded.value };
15434
+ return { value: loaded.value, diagnostics: loaded.diagnostics };
15414
15435
  const missing = loaded.diagnostics.some((d) => d.code === "PROJECT_FILE_MISSING");
15415
15436
  return { outcome: missing ? { kind: "not-initialized", diagnostics: loaded.diagnostics } : { kind: "failed", diagnostics: loaded.diagnostics } };
15416
15437
  }
@@ -15433,6 +15454,7 @@ function projectStatus(root, options = {}) {
15433
15454
  if (p.value === void 0)
15434
15455
  return p.outcome;
15435
15456
  const { truth } = p.value;
15457
+ const truthErrors = truthAuthorityErrors(p.diagnostics ?? []);
15436
15458
  const inspection = await withRegistry(options.registry, (registry) => withGraphReader(root, (graph) => inspectIndex(root, { graph, registry })));
15437
15459
  const baseline = await getAdoptionBaselineStatus(root);
15438
15460
  const pending = listDecisionProposals(truth).filter((e) => e.status === "pending");
@@ -15441,12 +15463,19 @@ function projectStatus(root, options = {}) {
15441
15463
  const llm = llmPoolOf(options).forConfig(truth.config.llm);
15442
15464
  return {
15443
15465
  kind: "ok",
15444
- diagnostics: errorsOf([...inspection.diagnostics, ...baseline.diagnostics]),
15466
+ diagnostics: errorsOf([...truthErrors, ...inspection.diagnostics, ...baseline.diagnostics]),
15445
15467
  payload: {
15446
15468
  format: STATUS_FORMAT,
15447
15469
  initialized: true,
15448
15470
  project: { name: truth.config.name, vision: truth.vision?.status ?? "missing", currentMilestone: truth.config.currentMilestone },
15449
- truth: { requirements: truth.requirements.length, decisions: truth.decisions.length, constraints: truth.constraints.length, declaredGaps: truth.gaps.length },
15471
+ truth: {
15472
+ requirements: truth.requirements.length,
15473
+ decisions: truth.decisions.length,
15474
+ constraints: truth.constraints.length,
15475
+ declaredGaps: truth.gaps.length,
15476
+ // T40 (additive): loader errors that make review, context and Decision confirm refuse this Truth. Empty when Truth loaded completely.
15477
+ errors: truthErrors.map((d) => ({ code: d.code, message: d.message, ...d.source === void 0 ? {} : { path: d.source.path, ...d.source.startLine === void 0 ? {} : { line: d.source.startLine } } }))
15478
+ },
15450
15479
  index: i === void 0 ? null : {
15451
15480
  status: i.status,
15452
15481
  fullRebuildReason: i.fullRebuildReason ?? null,
@@ -16846,7 +16875,11 @@ async function projectDoctor(rootArg, options) {
16846
16875
  let project2;
16847
16876
  if (runs("truth.project", "git.repository")) {
16848
16877
  const loaded = loadProjectTruth(root);
16849
- if (loaded.value !== void 0) {
16878
+ const authority = loaded.value === void 0 ? [] : truthAuthorityErrors(loaded.diagnostics);
16879
+ if (loaded.value !== void 0 && authority.length > 0) {
16880
+ const problems = authority.slice(0, LIST_LIMIT).map((d) => ({ code: d.code, ...d.source?.path === void 0 ? {} : { path: d.source.path } }));
16881
+ set("truth.project", "error", "invalid", { problems }, [{ id: "fix-truth", commands: [], params: { path: problems.find((p) => p.path !== void 0)?.path ?? ".duo-project/project.yaml" } }]);
16882
+ } else if (loaded.value !== void 0) {
16850
16883
  project2 = loaded.value;
16851
16884
  const t2 = project2.truth;
16852
16885
  set("truth.project", "ok", "valid", { name: t2.config.name, requirements: t2.requirements.length, decisions: t2.decisions.length, constraints: t2.constraints.length });
@@ -17745,6 +17778,7 @@ var EN = {
17745
17778
  "status.analysis": "Analysis: {languages}",
17746
17779
  "status.baseline": "Adoption baseline: {status}{detail}",
17747
17780
  "status.pending": "Pending decisions: {n}",
17781
+ "status.truth-errors": "Truth errors: {n}. These files were not read, so the counts above leave them out. Review, context and Decision confirm refuse to run until they are fixed (DUO does not change them):",
17748
17782
  "status.llm": "LLM: {state}",
17749
17783
  "index.done": "Indexed ({mode}{reason}) \xB7 {files} files \xB7 {analyzed} parsed \xB7 {changed} changed \xB7 graph {written}",
17750
17784
  "index.required": "INDEX_REQUIRED: the index is {status}. Run duoctl index (or pass --refresh).",
@@ -17768,6 +17802,7 @@ var EN = {
17768
17802
  "decision.confirmed": "confirmed as {id} \xB7 {path}",
17769
17803
  "decision.rejected": "rejected {id}",
17770
17804
  "decision.none": "No pending decisions.",
17805
+ "decision.truth-errors": "Not listed: {n} Truth error(s). These files could not be read; confirm and reject refuse to run until they are fixed:",
17771
17806
  "stats.none": "No metrics yet.",
17772
17807
  "not-initialized": "Not a DUO project (no .duo-project/project.yaml). Run duoctl init.",
17773
17808
  "not-implemented": "'{command}' is not implemented yet ({task}).",
@@ -17937,6 +17972,7 @@ var KO = {
17937
17972
  "status.analysis": "\uBD84\uC11D \uC218\uC900: {languages}",
17938
17973
  "status.baseline": "Adoption baseline: {status}{detail}",
17939
17974
  "status.pending": "\uB300\uAE30 \uC911 decision: {n}",
17975
+ "status.truth-errors": "Truth \uC624\uB958: {n}. \uC544\uB798 \uD30C\uC77C\uC740 \uC77D\uC9C0 \uBABB\uD574 \uC704 \uAC1C\uC218\uC5D0\uC11C \uBE60\uC84C\uC2B5\uB2C8\uB2E4. \uACE0\uCE60 \uB54C\uAE4C\uC9C0 review, context, Decision \uD655\uC815\uC740 \uC2E4\uD589\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4(DUO\uB294 \uC774 \uD30C\uC77C\uC744 \uACE0\uCE58\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4):",
17940
17976
  "status.llm": "LLM: {state}",
17941
17977
  "index.done": "Index \uC644\uB8CC({mode}{reason}) \xB7 \uD30C\uC77C {files} \xB7 parse {analyzed} \xB7 \uBCC0\uACBD {changed} \xB7 graph {written}",
17942
17978
  "index.required": "INDEX_REQUIRED: index\uAC00 {status}\uC785\uB2C8\uB2E4. duoctl index\uB97C \uC2E4\uD589\uD558\uC138\uC694(\uB610\uB294 --refresh).",
@@ -17960,6 +17996,7 @@ var KO = {
17960
17996
  "decision.confirmed": "{id}\uB85C \uD655\uC815 \xB7 {path}",
17961
17997
  "decision.rejected": "{id} \uAC70\uC808",
17962
17998
  "decision.none": "\uB300\uAE30 \uC911 decision\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
17999
+ "decision.truth-errors": "\uBAA9\uB85D\uC5D0 \uC5C6\uC74C: Truth \uC624\uB958 {n}\uAC1C. \uC544\uB798 \uD30C\uC77C\uC744 \uC77D\uC9C0 \uBABB\uD588\uC73C\uBA70, \uACE0\uCE60 \uB54C\uAE4C\uC9C0 \uD655\uC815\uACFC \uAC70\uC808\uC740 \uC2E4\uD589\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4:",
17963
18000
  "stats.none": "\uC9C0\uD45C\uAC00 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4.",
17964
18001
  "not-initialized": "DUO project\uAC00 \uC544\uB2D9\uB2C8\uB2E4(.duo-project/project.yaml \uC5C6\uC74C). duoctl init\uC744 \uC2E4\uD589\uD558\uC138\uC694.",
17965
18002
  "not-implemented": "'{command}'\uB294 \uC544\uC9C1 \uAD6C\uD604\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4({task}).",
@@ -18230,8 +18267,12 @@ async function decisionCommand(env, sub, id3, reason) {
18230
18267
  if (sub === "list" || sub === void 0) {
18231
18268
  const pending = entries.filter((e) => e.status === "pending");
18232
18269
  const proposedDecisions = truth.decisions.filter((d) => d.state === "proposed");
18233
- const human = pending.length + proposedDecisions.length === 0 ? [t(env.locale, "decision.none")] : [...pending.map((e) => `${e.id} ${e.proposal.title} (${e.proposal.question} = ${e.proposal.answer})`), ...proposedDecisions.map((d) => `${d.id} ${d.title} (proposed Decision)`)];
18234
- return { command: "decision", exitCode: EXIT.OK, diagnostics: [], human, result: { pending: pending.map((e) => ({ id: e.id, title: e.proposal.title, question: e.proposal.question, answer: e.proposal.answer })), proposedDecisions: proposedDecisions.map((d) => ({ id: d.id, title: d.title })) } };
18270
+ const unread = truthAuthorityErrors(project2.diagnostics);
18271
+ const human = [
18272
+ ...pending.length + proposedDecisions.length === 0 ? [t(env.locale, "decision.none")] : [...pending.map((e) => `${e.id} ${e.proposal.title} (${e.proposal.question} = ${e.proposal.answer})`), ...proposedDecisions.map((d) => `${d.id} ${d.title} (proposed Decision)`)],
18273
+ ...unread.length === 0 ? [] : [t(env.locale, "decision.truth-errors", { n: unread.length }), ...unread.map((d) => ` ${d.code} ${d.source?.path ?? ""}${d.source?.startLine === void 0 ? "" : `:${d.source.startLine}`} ${d.message}`)]
18274
+ ];
18275
+ return { command: "decision", exitCode: EXIT.OK, diagnostics: unread, human, result: { pending: pending.map((e) => ({ id: e.id, title: e.proposal.title, question: e.proposal.question, answer: e.proposal.answer })), proposedDecisions: proposedDecisions.map((d) => ({ id: d.id, title: d.title })) } };
18235
18276
  }
18236
18277
  if (sub !== "confirm" && sub !== "reject")
18237
18278
  return usage("decision", "usage: duoctl decision list | confirm <id> | reject <id> [--reason <text>]");
@@ -18941,6 +18982,11 @@ async function statusCommand(env) {
18941
18982
  const human = [
18942
18983
  t(L, "status.project", { name: s.project.name, goal: s.project.vision, milestone: s.project.currentMilestone ?? "-" }),
18943
18984
  t(L, "status.truth", { requirements: s.truth.requirements, decisions: s.truth.decisions, constraints: s.truth.constraints, gaps: s.truth.declaredGaps }),
18985
+ // T40 (N1): what the loader left out, so a lower Decision count is never silent.
18986
+ ...(s.truth.errors ?? []).length === 0 ? [] : [
18987
+ t(L, "status.truth-errors", { n: s.truth.errors?.length ?? 0 }),
18988
+ ...(s.truth.errors ?? []).map((e) => ` ${e.code} ${e.path ?? ""}${e.line === void 0 ? "" : `:${e.line}`} ${e.message}`)
18989
+ ],
18944
18990
  t(L, "status.index", { status: s.index?.status ?? "unknown", reason: s.index?.fullRebuildReason == null ? "" : ` (full rebuild: ${s.index.fullRebuildReason})` }),
18945
18991
  ...indexNeedsRun ? [t(L, "status.index-remediation")] : [],
18946
18992
  ...c === void 0 ? [] : [t(L, "status.changes", { files: c.files, analysis: c.analysisStale, modules: c.modulesToResolve, calls: c.callsMaybeRecomputed })],
package/dist/duoctl.js CHANGED
@@ -12,7 +12,7 @@ if (problem !== void 0) {
12
12
  process.exit(1);
13
13
  }
14
14
  try {
15
- await import("./cli-WTCBCBVN.js");
15
+ await import("./cli-QTN5SRNE.js");
16
16
  } catch (error) {
17
17
  const e = error;
18
18
  if (e.code === "ERR_MODULE_NOT_FOUND" || e.code === "MODULE_NOT_FOUND") {
@@ -1,39 +1,39 @@
1
1
  {
2
2
  "format": "duo.runtime-tree/1",
3
- "package": "@duo-director/cli@0.2.1",
3
+ "package": "@duo-director/cli@0.2.2",
4
4
  "delivery": "bundleDependencies",
5
5
  "lock": {
6
6
  "file": "apps/cli/npm-shrinkwrap.json",
7
- "sha256": "3d4e3d741378e06cd468a2ff2ea595507cfb312c65bcb52bf5b347f604272b14",
7
+ "sha256": "653189b4540d05ad0560d0c22d637f59e962d927c3ba3ec596fbc53e384348b7",
8
8
  "registry": "https://registry.npmjs.org/"
9
9
  },
10
10
  "packages": [
11
11
  {
12
12
  "path": "node_modules/@modelcontextprotocol/client",
13
13
  "name": "@modelcontextprotocol/client",
14
- "version": "2.1.0",
15
- "integrity": "sha512-mDVhoy5WjDb0U+4dQPzLcciC2erSex/GRVQqnoZdiuMoE3YiTZdiS7ezNcFwX4XEOWOaj7jZr0kLYnILnL8orA==",
14
+ "version": "2.2.0",
15
+ "integrity": "sha512-LxCou/CSYQ6dwEnjhLZY0KnEuc8V4UJ3IEQCl/uR2yHobSQIEdJKUlKLRYRF5i5FqRGHy1eK7une3aAWDHLtig==",
16
16
  "license": "MIT",
17
17
  "files": 85,
18
- "contentHash": "905087f66aabfe2fbc96b54e72b4627e4c4e21496756c3e53007cc894651707a"
18
+ "contentHash": "59c7d17d5cce46b4ba69c3f8e6818b7f9baecffde043e4b3f5b32e8df009bfc8"
19
19
  },
20
20
  {
21
21
  "path": "node_modules/@modelcontextprotocol/core",
22
22
  "name": "@modelcontextprotocol/core",
23
- "version": "2.1.0",
24
- "integrity": "sha512-YdFj5gMRHr0gYNAhTbQDgjLHiEJdIAUYxomhKseUNye7ZGlISQmUoLh2sveFFCiQ7j2YMffT1kgSND0FSfIFjQ==",
23
+ "version": "2.2.0",
24
+ "integrity": "sha512-iLhmprRmWI8EcosOA3wVvww22z02NkgqhV4fBH6f/odQBsi7xnJc0HGmi21yWO+/iKw2yzqVE127Zhna5/+JXw==",
25
25
  "license": "MIT",
26
26
  "files": 21,
27
- "contentHash": "b9b6abb340a92e3ca8fef2c81dace6d96e5330d842bc2d07a6cf27e08fff2c51"
27
+ "contentHash": "4cc7bef28cbc2be2b6da978e479e07ce72110842c628573d763fbbf11f8b4b70"
28
28
  },
29
29
  {
30
30
  "path": "node_modules/@modelcontextprotocol/server",
31
31
  "name": "@modelcontextprotocol/server",
32
- "version": "2.1.0",
33
- "integrity": "sha512-FdvwZU5N03O77Suh35JqjAqq5R1ZTEPFtwu6N4BgBq28qrQtrCnpbLL5U2pwYCuE194jAw0xnlOVmIqhfoYuUQ==",
32
+ "version": "2.2.0",
33
+ "integrity": "sha512-qFnltjus6Gk8Lx6J1w2RXmr3YPN22MNT6qD6zjAkaiWIlFIFxWClz0rXHNuJF/KSUyn5YGhkSvXkWDbQHVLFEQ==",
34
34
  "license": "MIT",
35
35
  "files": 85,
36
- "contentHash": "c4dcfffbcbbe91fbbea87f36e777dfaedf977a6eeded08969e5d7fca04d29de9"
36
+ "contentHash": "a7d3d12260408317939b1325474705066200b0b2ea944866c9b1c73d78628647"
37
37
  },
38
38
  {
39
39
  "path": "node_modules/@types/debug",
@@ -615,5 +615,5 @@
615
615
  "contentHash": "27c427165151653de59dcea1a8e94fdde9925eb1579d7bb118f1aeb63fbf9d73"
616
616
  }
617
617
  ],
618
- "treeHash": "f4d122fd3027540c341c5e69e9ca7dbc49184fa5040cb29c9c92d971b5b190b5"
618
+ "treeHash": "264ab643bb960f509d537f4097c56120b4f368123fe729fd5d1b330d64d09251"
619
619
  }