@duo-director/cli 0.3.0-rc.5 → 0.3.0

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.
@@ -13661,7 +13661,9 @@ var TEMPLATES = {
13661
13661
  unresolved: (id3) => `${id3} is not in the Project Truth. Which Requirement or Issue do you mean?`,
13662
13662
  pending: (id3, title, on) => `${id3} "${title}" is an unconfirmed proposal. This task${on} depends on it; please confirm or reject it.`,
13663
13663
  declared: (owner, text4) => `Open question in ${owner}: "${text4}". It affects this task; please decide it.`,
13664
- missingIntent: () => "No confirmed Requirement or Decision is linked to this task.",
13664
+ // C258 (T59): the signal is about the assembled context (Context packet intent tier), not about the task or the
13665
+ // Project Truth as a whole; a review may have no task and its rules may still apply a confirmed Decision.
13666
+ missingIntent: () => "The context DUO assembled contains no confirmed Requirement or Decision intent.",
13665
13667
  note: (owner, text4) => `${owner}: UNKNOWN ${text4}`,
13666
13668
  pendingNote: (id3, title) => `${id3} "${title}" is PENDING / NOT CONFIRMED`
13667
13669
  },
@@ -13670,7 +13672,7 @@ var TEMPLATES = {
13670
13672
  unresolved: (id3) => `${id3}\uAC00 \uD604\uC7AC Project Truth\uC5D0 \uC5C6\uC2B5\uB2C8\uB2E4. \uC5B4\uB5A4 Requirement/Issue\uB97C \uC758\uBBF8\uD558\uB294\uC9C0 \uD655\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.`,
13671
13673
  pending: (id3, title, on) => `${id3} "${title}"\uB294 \uC544\uC9C1 \uD655\uC815\uB418\uC9C0 \uC54A\uC740 \uC81C\uC548\uC785\uB2C8\uB2E4. \uC774 \uC791\uC5C5${on}\uC740 \uC774 \uACB0\uC815\uC5D0 \uC758\uC874\uD558\uBBC0\uB85C \uD655\uC815 \uB610\uB294 \uAC70\uC808\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.`,
13672
13674
  declared: (owner, text4) => `${owner}\uC758 \uBBF8\uD655\uC815 \uC0AC\uD56D: "${text4}". \uC774 \uC791\uC5C5\uC5D0 \uC601\uD5A5\uC744 \uC8FC\uBBC0\uB85C \uAC12\uC744 \uC815\uD574 \uC8FC\uC138\uC694.`,
13673
- missingIntent: () => "\uC774 \uC791\uC5C5\uACFC \uC5F0\uACB0\uB41C \uD655\uC815 Requirement/Decision\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.",
13675
+ missingIntent: () => "DUO\uAC00 \uAD6C\uC131\uD55C Context\uC5D0 \uD655\uC815\uB41C Requirement/Decision intent\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
13674
13676
  note: (owner, text4) => `${owner}: UNKNOWN ${text4}`,
13675
13677
  pendingNote: (id3, title) => `${id3} "${title}"\uB294 \uD655\uC815\uB418\uC9C0 \uC54A\uC740 \uC81C\uC548\uC785\uB2C8\uB2E4(PENDING / NOT CONFIRMED)`
13676
13678
  }
@@ -14785,7 +14787,7 @@ function reviewVerdict(claims, gaps) {
14785
14787
  const ask = gaps?.requiresHumanInput === true ? gaps.gaps.filter((g) => g.action === "ask").map((g) => g.id) : [];
14786
14788
  const warn = [
14787
14789
  ...claims.filter((c) => !c.blockEligible && c.provenance !== "pre-existing" && (c.alignment === "PARTIAL" || c.alignment === "CONFLICT" || c.alignment === "UNKNOWN" && c.drift)).map((c) => c.id).sort(compareUtf8),
14788
- ...(gaps?.gaps ?? []).filter((g) => g.action === "surface").map((g) => g.id)
14790
+ ...(gaps?.gaps ?? []).filter((g) => g.action === "surface" && g.kind !== "missing-intent").map((g) => g.id)
14789
14791
  ];
14790
14792
  const verdict = blocking.length > 0 ? "BLOCK" : ask.length > 0 ? "ASK" : warn.length > 0 ? "WARN" : "PASS";
14791
14793
  return { verdict, basis: { blocking, ask, warn } };
@@ -16555,7 +16557,14 @@ ${advice.join("\n")}`);
16555
16557
  `Semantic assistance (supplemental, never blocks): ${a.status}${a.failure === void 0 ? "" : ` (${a.failure})`}`,
16556
16558
  ...a.claims.filter((c) => c.alignment !== "ALIGNED").map((c) => `- semantic ${c.alignment} ${c.claimId}: ${c.reason}`)
16557
16559
  ];
16558
- return [`Verdict ${r.verdict ?? "-"} \xB7 ${r.claims.length} claims \xB7 llm calls ${r.metrics.llmCalls}`, ...lines4, ...semantic].join("\n");
16560
+ const q = r.gaps === void 0 ? void 0 : renderGapQuestions(r.gaps, { locale: "en" });
16561
+ const gaps = q === void 0 || q.primaryQuestion === void 0 && q.notes.length === 0 ? [] : [
16562
+ "Knowledge gaps:",
16563
+ ...q.primaryQuestion === void 0 ? [] : [`Question for the human: ${q.primaryQuestion}`],
16564
+ ...q.additionalQuestions.map((a2) => `Question for the human: ${a2.question}`),
16565
+ ...q.notes.map((n) => `- ${n.note}`)
16566
+ ];
16567
+ return [`Verdict ${r.verdict ?? "-"} \xB7 ${r.claims.length} claims \xB7 llm calls ${r.metrics.llmCalls}`, ...lines4, ...gaps, ...semantic].join("\n");
16559
16568
  }
16560
16569
  },
16561
16570
  duo_get_requirement: {
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-3KHF55G7.js");
15
+ await import("./cli-BR27FGZA.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,10 +1,10 @@
1
1
  {
2
2
  "format": "duo.runtime-tree/1",
3
- "package": "@duo-director/cli@0.3.0-rc.5",
3
+ "package": "@duo-director/cli@0.3.0",
4
4
  "delivery": "bundleDependencies",
5
5
  "lock": {
6
6
  "file": "apps/cli/npm-shrinkwrap.json",
7
- "sha256": "7cca8bc7e55f3180f2aa4841c93df8eada41a39af209b9f1298a08cfbb6f9b90",
7
+ "sha256": "1733968ee9cb267f46aa1553b8724547f144de43f2b9dc0c313ee2fec411e81b",
8
8
  "registry": "https://registry.npmjs.org/"
9
9
  },
10
10
  "packages": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duo-director/cli",
3
- "version": "0.3.0-rc.5",
3
+ "version": "0.3.0",
4
4
  "description": "DUO: AI Project Direction Layer for Coding Agents (duoctl)",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {