@duo-director/cli 0.1.0 → 0.1.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.
@@ -13336,8 +13336,12 @@ function llmProviderState(config, provider) {
13336
13336
  return "disabled";
13337
13337
  return provider === void 0 ? "unavailable" : provider.status();
13338
13338
  }
13339
- async function invokeLLM(provider, request, options = {}) {
13339
+ function redactLLMRequest(request) {
13340
+ return { ...request, instructions: redactSecrets(request.instructions).text, input: redactSecrets(request.input).text };
13341
+ }
13342
+ async function invokeLLM(provider, original, options = {}) {
13340
13343
  const t0 = performance5.now();
13344
+ const request = redactLLMRequest(original);
13341
13345
  const aborted = () => request.signal?.aborted === true;
13342
13346
  const requestEstimate = { tokens: countTokens(request.instructions) + countTokens(request.input), estimator: TOKEN_ESTIMATOR.name };
13343
13347
  const done = (response2, called, cached = false) => ({
@@ -13789,7 +13793,7 @@ async function semanticAssist(input) {
13789
13793
  lines4.push(`CLAIM ${c.id} rule=${c.rule} subject=${c.subject.id}`, `expected: ${c.expected}`, `observed: ${c.observed}`, `evidence: ${c.evidenceIds.join(", ")}`, "");
13790
13794
  for (const id3 of allowed) {
13791
13795
  const e = input.store.get(id3);
13792
- lines4.push(`EVIDENCE ${id3} [${e?.basis ?? "?"}] ${e?.summary ?? ""}`, truncateToTokens(input.store.excerpt(id3) ?? "", perExcerpt).text, "");
13796
+ lines4.push(`EVIDENCE ${id3} [${e?.basis ?? "?"}] ${e?.summary ?? ""}`, truncateToTokens(redactSecrets(input.store.excerpt(id3) ?? "").text, perExcerpt).text, "");
13793
13797
  }
13794
13798
  const ids2 = new Set(candidates3.map((c) => c.id));
13795
13799
  const invocation = await invokeLLM(input.provider, {
@@ -16402,6 +16406,8 @@ var EN = {
16402
16406
  "init.dirty.choose": "Adoption baseline: [1] use HEAD as the baseline (current changes stay changes to review) [2] abort and clean the repository first",
16403
16407
  "init.dirty.policy-required": "The working tree is dirty. Choose --baseline-policy head (HEAD as baseline) or abort (clean first). --yes does not choose it.",
16404
16408
  "init.dirty.aborted": "Baseline not captured. Commit or stash your changes, then run duoctl init again (Truth and index are kept).",
16409
+ "init.unborn": "Baseline not captured: this repository does not have an initial commit yet. Create the first commit, then run duoctl init again (Truth and index are kept).",
16410
+ "init.unborn.dirty": "This repository does not have an initial commit yet, so no adoption baseline can be captured. Create the first commit, then run duoctl init again.",
16405
16411
  "init.imports": "Import candidates found: {n} (not imported; review them yourself)",
16406
16412
  "init.documents": "Candidate documents: {list}",
16407
16413
  "init.question.project_goal": "Project goal (one sentence)",
@@ -16414,10 +16420,12 @@ var EN = {
16414
16420
  "init.repair-required": ".duo-project exists without project.yaml; rerun with --repair to add only the missing files.",
16415
16421
  "init.open": "Open questions (UNKNOWN lines in intent/vision.md): {list}",
16416
16422
  "init.done": "DUO is set up. Next: duoctl status \xB7 duoctl context <task> \xB7 duoctl review",
16423
+ "init.agents": "Connect a coding agent: duoctl install codex \xB7 duoctl install claude-code",
16417
16424
  "init.cancelled": "Cancelled; nothing written.",
16418
16425
  "status.project": "Project {name} \xB7 goal {goal} \xB7 milestone {milestone}",
16419
16426
  "status.truth": "Truth: {requirements} requirements \xB7 {decisions} decisions \xB7 {constraints} constraints \xB7 {gaps} declared gaps",
16420
16427
  "status.index": "Index: {status}{reason}",
16428
+ "status.index-remediation": " Run duoctl index to refresh the project index.",
16421
16429
  "status.changes": "Changed since index: {files} files \xB7 analysis stale {analysis} \xB7 module resolution {modules} \xB7 calls may be recomputed {calls}",
16422
16430
  "status.analysis": "Analysis: {languages}",
16423
16431
  "status.baseline": "Adoption baseline: {status}{detail}",
@@ -16486,6 +16494,8 @@ var KO = {
16486
16494
  "init.dirty.choose": "Adoption baseline: [1] HEAD\uB97C baseline\uC73C\uB85C \uC0AC\uC6A9(\uD604\uC7AC \uBCC0\uACBD\uC740 \uC774\uD6C4 Review \uB300\uC0C1) [2] \uC911\uB2E8\uD558\uACE0 \uBA3C\uC800 \uC800\uC7A5\uC18C \uC815\uB9AC",
16487
16495
  "init.dirty.policy-required": "\uC791\uC5C5 \uD2B8\uB9AC\uAC00 dirty\uD569\uB2C8\uB2E4. --baseline-policy head(HEAD\uB97C baseline) \uB610\uB294 abort(\uBA3C\uC800 \uC815\uB9AC)\uB97C \uACE0\uB974\uC138\uC694. --yes\uB294 \uC774\uAC83\uC744 \uACE0\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.",
16488
16496
  "init.dirty.aborted": "Baseline\uC744 \uB9CC\uB4E4\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uBCC0\uACBD\uC744 commit\uD558\uAC70\uB098 stash\uD55C \uB4A4 duoctl init\uC744 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694(Truth\uC640 index\uB294 \uC720\uC9C0).",
16497
+ "init.unborn": "Baseline\uC744 \uB9CC\uB4E4\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4: \uC774 \uC800\uC7A5\uC18C\uC5D0\uB294 \uC544\uC9C1 \uCCAB commit\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uCCAB commit\uC744 \uB9CC\uB4E0 \uB4A4 duoctl init\uC744 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694(Truth\uC640 index\uB294 \uC720\uC9C0).",
16498
+ "init.unborn.dirty": "\uC774 \uC800\uC7A5\uC18C\uC5D0\uB294 \uC544\uC9C1 \uCCAB commit\uC774 \uC5C6\uC5B4 adoption baseline\uC744 \uB9CC\uB4E4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uCCAB commit\uC744 \uB9CC\uB4E0 \uB4A4 duoctl init\uC744 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694.",
16489
16499
  "init.imports": "Import \uD6C4\uBCF4 {n}\uAC1C \uBC1C\uACAC(\uAC00\uC838\uC624\uC9C0 \uC54A\uC74C, \uC9C1\uC811 \uAC80\uD1A0\uD558\uC138\uC694)",
16490
16500
  "init.documents": "\uD6C4\uBCF4 \uBB38\uC11C: {list}",
16491
16501
  "init.question.project_goal": "\uD504\uB85C\uC81D\uD2B8 Goal(\uD55C \uBB38\uC7A5)",
@@ -16498,10 +16508,12 @@ var KO = {
16498
16508
  "init.repair-required": "project.yaml \uC5C6\uB294 .duo-project\uAC00 \uC788\uC2B5\uB2C8\uB2E4. \uC5C6\uB294 \uD30C\uC77C\uB9CC \uCD94\uAC00\uD558\uB824\uBA74 --repair\uB85C \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694.",
16499
16509
  "init.open": "\uC5F4\uB9B0 \uC9C8\uBB38(intent/vision.md\uC758 UNKNOWN \uC904): {list}",
16500
16510
  "init.done": "DUO \uC124\uC815 \uC644\uB8CC. \uB2E4\uC74C: duoctl status \xB7 duoctl context <task> \xB7 duoctl review",
16511
+ "init.agents": "Coding agent \uC5F0\uACB0: duoctl install codex \xB7 duoctl install claude-code",
16501
16512
  "init.cancelled": "\uCDE8\uC18C\uD588\uC2B5\uB2C8\uB2E4. \uC544\uBB34\uAC83\uB3C4 \uC4F0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
16502
16513
  "status.project": "Project {name} \xB7 goal {goal} \xB7 milestone {milestone}",
16503
16514
  "status.truth": "Truth: requirement {requirements} \xB7 decision {decisions} \xB7 constraint {constraints} \xB7 declared gap {gaps}",
16504
16515
  "status.index": "Index: {status}{reason}",
16516
+ "status.index-remediation": " duoctl index\uB97C \uC2E4\uD589\uD574 project index\uB97C \uAC31\uC2E0\uD558\uC138\uC694.",
16505
16517
  "status.changes": "Index \uC774\uD6C4 \uBCC0\uACBD: \uD30C\uC77C {files} \xB7 \uBD84\uC11D stale {analysis} \xB7 module resolution {modules} \xB7 \uC7AC\uACC4\uC0B0 \uAC00\uB2A5 call {calls}",
16506
16518
  "status.analysis": "\uBD84\uC11D \uC218\uC900: {languages}",
16507
16519
  "status.baseline": "Adoption baseline: {status}{detail}",
@@ -16879,6 +16891,8 @@ async function initCommand(env, options) {
16879
16891
  if (!aborted)
16880
16892
  diagnostics.push(createDiagnostic("ADOPTION_DIRTY_POLICY_REQUIRED", t("en", "init.dirty.policy-required")));
16881
16893
  human.push(t(env.locale, aborted ? "init.dirty.aborted" : "init.dirty.policy-required"));
16894
+ if (!aborted && o.git.unborn)
16895
+ human.push(t(env.locale, "init.unborn.dirty"));
16882
16896
  if (aborted)
16883
16897
  baseline = { status: "aborted" };
16884
16898
  report("baseline");
@@ -16967,6 +16981,7 @@ async function initCommand(env, options) {
16967
16981
  if (status.value.status === "incompatible")
16968
16982
  return finish(EXIT.ERROR);
16969
16983
  human.push(t(env.locale, "init.done"));
16984
+ human.push(t(env.locale, "init.agents"));
16970
16985
  return finish(EXIT.OK);
16971
16986
  }
16972
16987
  const captured = await withWriter(env.root, async (graph) => captureAdoptionBaseline(env.root, {
@@ -16981,6 +16996,8 @@ async function initCommand(env, options) {
16981
16996
  steps.baseline = { status: "failed" };
16982
16997
  report("baseline");
16983
16998
  human.push(...diagLines(captured.diagnostics));
16999
+ if (captured.diagnostics.some((d) => d.code === "ADOPTION_HEAD_REQUIRED"))
17000
+ human.push(t(env.locale, "init.unborn"));
16984
17001
  return finish(EXIT.ERROR);
16985
17002
  }
16986
17003
  if (captured.value.status === "aborted") {
@@ -16995,6 +17012,7 @@ async function initCommand(env, options) {
16995
17012
  steps.baseline = { status: "ok", detail: `${b.git.headOid.slice(0, 12)}${b.workingTree.dirty ? " \xB7 dirty at adoption (HEAD_BASELINE)" : ""} \xB7 ${b.findings.length} pre-existing findings` };
16996
17013
  report("baseline");
16997
17014
  human.push(t(env.locale, "init.done"));
17015
+ human.push(t(env.locale, "init.agents"));
16998
17016
  return finish(EXIT.OK);
16999
17017
  });
17000
17018
  }
@@ -17290,6 +17308,7 @@ async function statusCommand(env) {
17290
17308
  const c = s.index?.changes;
17291
17309
  const b = s.baseline;
17292
17310
  const a = s.analysis;
17311
+ const indexNeedsRun = s.index?.status === "stale" || s.index?.status === "missing" || s.index?.status === "incompatible";
17293
17312
  const fileOnlyExts = a?.fileOnly.extensions.slice(0, 5).map((e) => e.extension === "" ? "(none)" : `.${e.extension}`).join(", ") ?? "";
17294
17313
  const analysis = a === null ? void 0 : [
17295
17314
  ...a.languages.map((l) => `${l.language} ${l.level} (${l.files})`),
@@ -17299,6 +17318,7 @@ async function statusCommand(env) {
17299
17318
  t(L, "status.project", { name: s.project.name, goal: s.project.vision, milestone: s.project.currentMilestone ?? "-" }),
17300
17319
  t(L, "status.truth", { requirements: s.truth.requirements, decisions: s.truth.decisions, constraints: s.truth.constraints, gaps: s.truth.declaredGaps }),
17301
17320
  t(L, "status.index", { status: s.index?.status ?? "unknown", reason: s.index?.fullRebuildReason == null ? "" : ` (full rebuild: ${s.index.fullRebuildReason})` }),
17321
+ ...indexNeedsRun ? [t(L, "status.index-remediation")] : [],
17302
17322
  ...c === void 0 ? [] : [t(L, "status.changes", { files: c.files, analysis: c.analysisStale, modules: c.modulesToResolve, calls: c.callsMaybeRecomputed })],
17303
17323
  ...analysis === void 0 || analysis === "" ? [] : [t(L, "status.analysis", { languages: analysis })],
17304
17324
  t(L, "status.baseline", { status: b?.status ?? "unknown", detail: b?.headOid === void 0 ? "" : ` \xB7 ${b.headOid.slice(0, 12)}${b.dirtyAtAdoption === true ? " \xB7 dirty at adoption" : ""} \xB7 ${b.findings ?? 0} findings` }),
package/dist/duoctl.js CHANGED
@@ -29,7 +29,7 @@ if (problem !== void 0) {
29
29
  process.exit(1);
30
30
  }
31
31
  try {
32
- await import("./cli-GSP2L3UX.js");
32
+ await import("./cli-NRTRISEG.js");
33
33
  } catch (error) {
34
34
  const e = error;
35
35
  if (e.code === "ERR_MODULE_NOT_FOUND" || e.code === "MODULE_NOT_FOUND") {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@duo-director/cli",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@duo-director/cli",
9
- "version": "0.1.0",
9
+ "version": "0.1.2",
10
10
  "dependencies": {
11
11
  "@modelcontextprotocol/client": "2.1.0",
12
12
  "@modelcontextprotocol/server": "2.1.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duo-director/cli",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "DUO: AI Project Direction Layer for Coding Agents (duoctl)",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {