coding-friend-cli 1.39.0 → 1.40.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.
Files changed (40) hide show
  1. package/README.md +5 -0
  2. package/dist/{chunk-ODW27NAC.js → chunk-B44ROTV6.js} +10 -10
  3. package/dist/{chunk-ZGIUKUL2.js → chunk-CZW36H3D.js} +39 -7
  4. package/dist/{chunk-FQUIO5BW.js → chunk-E4NBTQXR.js} +13 -7
  5. package/dist/{chunk-IV5OPG34.js → chunk-IYBIIRH4.js} +29 -1
  6. package/dist/{chunk-GTOEIGDM.js → chunk-KCBMCHSA.js} +295 -44
  7. package/dist/{chunk-463QKRBN.js → chunk-KG6HYBGD.js} +23 -7
  8. package/dist/{chunk-WJHQUCOF.js → chunk-KTUPGMIV.js} +111 -15
  9. package/dist/{chunk-7JQZRMOG.js → chunk-NIMO4VJW.js} +37 -6
  10. package/dist/{chunk-OFEC6OVI.js → chunk-OBCNHQFA.js} +42 -2
  11. package/dist/{chunk-4CPUWHIN.js → chunk-Q2QDSYQT.js} +1 -1
  12. package/dist/{chunk-JSH6BMVZ.js → chunk-RG3EMZH6.js} +11 -1
  13. package/dist/{chunk-2EY7VVFT.js → chunk-SUYE5S2W.js} +1 -1
  14. package/dist/{chunk-YPW67OGP.js → chunk-TFF47F7P.js} +1 -1
  15. package/dist/{chunk-ZZNTNIM4.js → chunk-TN3Y75WG.js} +2 -2
  16. package/dist/{chunk-VMODQCSL.js → chunk-Z5XTSF7L.js} +5 -5
  17. package/dist/{clean-LPWEBJJ5.js → clean-PKSSS662.js} +3 -3
  18. package/dist/{config-VNSC2NAY.js → config-2CH4GI2L.js} +47 -26
  19. package/dist/{dev-NRTDUQAR.js → dev-HWKNWOZY.js} +7 -7
  20. package/dist/{disable-NROSQUHR.js → disable-DCGVIHKG.js} +22 -8
  21. package/dist/{enable-26FFJGX5.js → enable-YYWJDOYB.js} +21 -8
  22. package/dist/{guide-HCLEOAGR.js → guide-45EIK76P.js} +1 -1
  23. package/dist/{host-2JOPHLN3.js → host-GZJSMJSF.js} +7 -7
  24. package/dist/index.js +67 -46
  25. package/dist/{init-MHHII5EP.js → init-TUBWQCBQ.js} +236 -53
  26. package/dist/{install-OEFJLAWA.js → install-45O5ICBA.js} +68 -11
  27. package/dist/{learn-SSNBBDY3.js → learn-AJT7Z6F7.js} +5 -5
  28. package/dist/{mcp-J5VO3OH7.js → mcp-JGBZMNWL.js} +26 -13
  29. package/dist/{mcp-serve-55DSE2J4.js → mcp-serve-SHS5MQRW.js} +5 -5
  30. package/dist/{mcp-serve-learn-EDBWNL4I.js → mcp-serve-learn-HXZZ3DUI.js} +6 -6
  31. package/dist/{memory-CDZKWOFL.js → memory-4NVLWOFS.js} +10 -10
  32. package/dist/{permission-DPKPA2HU.js → permission-L5QMNMID.js} +25 -25
  33. package/dist/{session-YWJDLNBP.js → session-GBHL5TH3.js} +3 -3
  34. package/dist/{status-4WMIQL7L.js → status-KQQJNSEZ.js} +33 -15
  35. package/dist/{statusline-R5BNYK3H.js → statusline-B7PXP3AQ.js} +3 -3
  36. package/dist/{uninstall-EV7362NK.js → uninstall-6QKNGLKK.js} +38 -13
  37. package/dist/{update-YQBBAIIF.js → update-YJ363TBU.js} +11 -11
  38. package/dist/{update-check-EJSGVGO6.js → update-check-5JZUJGUM.js} +1 -1
  39. package/package.json +1 -1
  40. package/dist/permissions-HZYUVKCY.js +0 -38
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ensureStatusline,
3
3
  getInstalledVersion
4
- } from "./chunk-4CPUWHIN.js";
4
+ } from "./chunk-Q2QDSYQT.js";
5
5
  import {
6
6
  ensureShellCompletion
7
7
  } from "./chunk-667NMPN4.js";
@@ -9,39 +9,46 @@ import {
9
9
  isMemoryMcpRegistered,
10
10
  registerMemoryMcp,
11
11
  removeMemoryMcpEntry
12
- } from "./chunk-ZGIUKUL2.js";
12
+ } from "./chunk-CZW36H3D.js";
13
13
  import {
14
14
  isPluginInstalled
15
- } from "./chunk-2EY7VVFT.js";
15
+ } from "./chunk-SUYE5S2W.js";
16
16
  import {
17
17
  CODEX_MARKETPLACE_NAME,
18
18
  getCodexInstalledVersion,
19
+ isCodexMarketplaceLocal,
19
20
  isCodexMarketplaceRegistered
20
- } from "./chunk-JSH6BMVZ.js";
21
+ } from "./chunk-RG3EMZH6.js";
21
22
  import {
23
+ deployAgyPlugin,
22
24
  deployOmpAgents,
25
+ isAgyPluginInstalled,
23
26
  isOmpAgentInstalled,
27
+ readAgyMcpConfig,
28
+ readAgyPluginVersion,
29
+ resolveAgyPluginSource,
30
+ writeAgyMcpEntry,
24
31
  writeOmpExtensionEntry
25
- } from "./chunk-GTOEIGDM.js";
32
+ } from "./chunk-KCBMCHSA.js";
26
33
  import {
27
34
  resolveHostFlags,
28
35
  resolveScope
29
- } from "./chunk-VMODQCSL.js";
36
+ } from "./chunk-Z5XTSF7L.js";
30
37
  import {
31
38
  detectHostsAvailable
32
- } from "./chunk-OFEC6OVI.js";
39
+ } from "./chunk-OBCNHQFA.js";
40
+ import {
41
+ readJson
42
+ } from "./chunk-5UVDWG5L.js";
33
43
  import {
34
44
  commandExists,
35
45
  run,
36
46
  runWithStderr,
37
47
  sleepSync
38
48
  } from "./chunk-EVGXUDX4.js";
39
- import {
40
- readJson
41
- } from "./chunk-5UVDWG5L.js";
42
49
  import {
43
50
  claudeSettingsPath
44
- } from "./chunk-IV5OPG34.js";
51
+ } from "./chunk-IYBIIRH4.js";
45
52
  import {
46
53
  log,
47
54
  printBanner
@@ -114,13 +121,14 @@ function argvHasAgentFlag() {
114
121
  return process.argv.some((a) => a === "--agent" || a.startsWith("--agent="));
115
122
  }
116
123
  function hasExplicitHost(opts) {
117
- if (opts.codex === true || opts.omp === true) return true;
124
+ if (opts.codex === true || opts.omp === true || opts.agy === true)
125
+ return true;
118
126
  if (argvHasAgentFlag()) return true;
119
127
  const agent = opts.agent?.trim().toLowerCase();
120
- return agent === "codex" || agent === "omp";
128
+ return agent === "codex" || agent === "omp" || agent === "agy";
121
129
  }
122
130
  function flagsForHostResolve(opts) {
123
- if (!argvHasAgentFlag() && opts.agent === "claude" && (opts.codex === true || opts.omp === true)) {
131
+ if (!argvHasAgentFlag() && opts.agent === "claude" && (opts.codex === true || opts.omp === true || opts.agy === true)) {
124
132
  return { ...opts, agent: void 0 };
125
133
  }
126
134
  return opts;
@@ -133,6 +141,8 @@ function isHostInstalled(host) {
133
141
  return isCodexMarketplaceRegistered();
134
142
  case "omp":
135
143
  return isOmpAgentInstalled("user") || isOmpAgentInstalled("project");
144
+ case "agy":
145
+ return isAgyPluginInstalled();
136
146
  }
137
147
  }
138
148
  function hostSectionTitle(host) {
@@ -143,11 +153,14 @@ function hostSectionTitle(host) {
143
153
  return "Codex";
144
154
  case "omp":
145
155
  return "omp";
156
+ case "agy":
157
+ return "Antigravity";
146
158
  }
147
159
  }
148
160
  async function updateHost(host, opts, mode) {
149
161
  if (host === "codex") return updateCodexCommand(opts, mode);
150
162
  if (host === "omp") return updateOmpCommand(opts, mode);
163
+ if (host === "agy") return updateAgyCommand(opts, mode);
151
164
  return updateClaudeCommand(opts, mode);
152
165
  }
153
166
  async function updateCommand(opts) {
@@ -310,7 +323,7 @@ async function updateClaudeCommand(opts, mode) {
310
323
  }
311
324
  let refreshMemoryAfterUpdate = null;
312
325
  if (doCli) {
313
- ({ refreshMemoryAfterUpdate } = await import("./memory-CDZKWOFL.js"));
326
+ ({ refreshMemoryAfterUpdate } = await import("./memory-4NVLWOFS.js"));
314
327
  if (!latestCliVersion) {
315
328
  log.warn("Cannot check latest CLI version from npm.");
316
329
  } else {
@@ -383,6 +396,19 @@ async function updateCodexCommand(opts, mode) {
383
396
  );
384
397
  if (!commandExists("codex")) {
385
398
  log.error("Codex CLI not found. Cannot update Codex plugin.");
399
+ } else if (isCodexMarketplaceLocal()) {
400
+ if (beforeVersion) {
401
+ log.info(
402
+ "Codex marketplace is a local dev source \u2014 skipping git upgrade (it only works on git marketplaces)."
403
+ );
404
+ log.dim(
405
+ `Codex runs a cached copy at v${beforeVersion}; to pick up working-tree changes, reinstall via Codex \u2192 /plugins.`
406
+ );
407
+ } else {
408
+ log.warn(
409
+ "Codex marketplace is a local dev source, but coding-friend is not installed yet. Open Codex and run /plugins to install it."
410
+ );
411
+ }
386
412
  } else {
387
413
  log.step("Updating Codex marketplace...");
388
414
  const result = runWithStderr("codex", [
@@ -516,6 +542,76 @@ async function updateOmpCommand(opts, mode) {
516
542
  console.log();
517
543
  log.dim("Restart omp (or start a new session) to see changes.");
518
544
  }
545
+ function restoreAgyExtraMcpServers(previous) {
546
+ if (!previous) return;
547
+ const current = readAgyMcpConfig();
548
+ const currentServers = current?.mcpServers ?? {};
549
+ for (const [name, server] of Object.entries(previous.mcpServers)) {
550
+ if (!(name in currentServers)) {
551
+ writeAgyMcpEntry(name, server);
552
+ }
553
+ }
554
+ }
555
+ async function updateAgyCommand(opts, mode) {
556
+ const updateAll = !opts.cli && !opts.plugin && !opts.statusline;
557
+ const doCli = (updateAll || !!opts.cli) && !mode?.skipCli;
558
+ const doPlugin = updateAll || !!opts.plugin;
559
+ if (!mode?.skipBanner) {
560
+ printBanner("\u2728 Coding Friend Antigravity Update (beta) \u2728");
561
+ console.log();
562
+ }
563
+ if (doPlugin) {
564
+ try {
565
+ const previousMcp = readAgyMcpConfig();
566
+ const beforeVersion = readAgyPluginVersion();
567
+ console.log(
568
+ ` Plugin ${beforeVersion ? beforeVersion : chalk.dim("not installed")}`
569
+ );
570
+ const source = resolveAgyPluginSource();
571
+ log.step(`Updating Antigravity plugin (${source.kind} source)...`);
572
+ const { files } = deployAgyPlugin(source.path);
573
+ registerMemoryMcp("agy");
574
+ restoreAgyExtraMcpServers(previousMcp);
575
+ const afterVersion = readAgyPluginVersion();
576
+ const versionPart = afterVersion ? `, v${afterVersion}` : "";
577
+ log.success(`Antigravity plugin updated (${files} files${versionPart}).`);
578
+ } catch (error) {
579
+ const detail = error instanceof Error ? error.message : String(error);
580
+ log.error(detail);
581
+ }
582
+ }
583
+ if (doCli) {
584
+ const cliVersion = getCliVersion();
585
+ const latestCliVersion = getLatestCliVersion();
586
+ if (!latestCliVersion) {
587
+ log.warn("Cannot check latest CLI version from npm.");
588
+ } else {
589
+ const cmp = semverCompare(cliVersion, latestCliVersion);
590
+ if (cmp < 0) {
591
+ log.step(
592
+ `CLI update available: ${chalk.yellow(`v${cliVersion}`)} \u2192 ${chalk.green(`v${latestCliVersion}`)}`
593
+ );
594
+ const result = run("npm", [
595
+ "install",
596
+ "-g",
597
+ "coding-friend-cli@latest"
598
+ ]);
599
+ if (result === null) {
600
+ log.error(
601
+ "CLI update failed. Try manually: npm install -g coding-friend-cli@latest"
602
+ );
603
+ } else {
604
+ log.success(`CLI updated to ${chalk.green(`v${latestCliVersion}`)}`);
605
+ }
606
+ }
607
+ }
608
+ }
609
+ if (opts.statusline) {
610
+ log.warn("Antigravity does not use the Claude statusline. Skipping.");
611
+ }
612
+ console.log();
613
+ log.dim("Restart Antigravity (or start a new `agy` session) to see changes.");
614
+ }
519
615
 
520
616
  export {
521
617
  semverCompare,
@@ -1,32 +1,52 @@
1
1
  import {
2
+ readAgyMcpConfig,
2
3
  readOmpMcpJson,
4
+ removeAgyMcpEntry,
3
5
  removeOmpMcpEntry,
6
+ writeAgyMcpEntry,
4
7
  writeOmpMcpEntry
5
- } from "./chunk-GTOEIGDM.js";
8
+ } from "./chunk-KCBMCHSA.js";
6
9
  import {
7
10
  runWithStderr
8
11
  } from "./chunk-EVGXUDX4.js";
9
12
  import {
10
13
  resolvePath
11
- } from "./chunk-IV5OPG34.js";
14
+ } from "./chunk-IYBIIRH4.js";
12
15
  import {
13
16
  log
14
17
  } from "./chunk-NREZK463.js";
15
18
 
16
19
  // src/lib/learn-prompts.ts
17
20
  var MCP_NAME = "coding-friend-learn";
21
+ function learnServer(resolvedDir) {
22
+ return {
23
+ command: "npx",
24
+ args: ["-y", "coding-friend-cli", "mcp-serve-learn", resolvedDir]
25
+ };
26
+ }
18
27
  function hasOmpLearnEntry() {
19
28
  const data = readOmpMcpJson();
20
29
  return data !== null && MCP_NAME in data.mcpServers;
21
30
  }
31
+ function hasAgyLearnEntry() {
32
+ const data = readAgyMcpConfig();
33
+ return data !== null && MCP_NAME in data.mcpServers;
34
+ }
22
35
  function registerLearnMcp(learnDir, host = "claude") {
23
36
  const resolved = resolvePath(learnDir);
24
37
  if (host === "omp") {
25
38
  try {
26
- writeOmpMcpEntry(MCP_NAME, {
27
- command: "npx",
28
- args: ["-y", "coding-friend-cli", "mcp-serve-learn", resolved]
29
- });
39
+ writeOmpMcpEntry(MCP_NAME, learnServer(resolved));
40
+ return true;
41
+ } catch (error) {
42
+ const detail = error instanceof Error ? error.message : "unknown error";
43
+ log.warn(`Could not register MCP: ${detail}`);
44
+ return false;
45
+ }
46
+ }
47
+ if (host === "agy") {
48
+ try {
49
+ writeAgyMcpEntry(MCP_NAME, learnServer(resolved));
30
50
  return true;
31
51
  } catch (error) {
32
52
  const detail = error instanceof Error ? error.message : "unknown error";
@@ -63,6 +83,7 @@ function registerLearnMcp(learnDir, host = "claude") {
63
83
  }
64
84
  function isLearnMcpRegistered(host = "claude") {
65
85
  if (host === "omp") return hasOmpLearnEntry();
86
+ if (host === "agy") return hasAgyLearnEntry();
66
87
  const result = runWithStderr("claude", ["mcp", "get", MCP_NAME]);
67
88
  return result.exitCode === 0;
68
89
  }
@@ -77,6 +98,16 @@ function unregisterLearnMcp(host = "claude") {
77
98
  return false;
78
99
  }
79
100
  }
101
+ if (host === "agy") {
102
+ try {
103
+ removeAgyMcpEntry(MCP_NAME);
104
+ return !hasAgyLearnEntry();
105
+ } catch (error) {
106
+ const detail = error instanceof Error ? error.message : "unknown error";
107
+ log.warn(`Could not unregister MCP: ${detail}`);
108
+ return false;
109
+ }
110
+ }
80
111
  const result = runWithStderr("claude", [
81
112
  "mcp",
82
113
  "remove",
@@ -6,37 +6,63 @@ import {
6
6
  // src/lib/host.ts
7
7
  var CODEX_MIN_VERSION = "0.130.0";
8
8
  var OMP_MIN_VERSION = "0.1.0";
9
+ var AGY_MIN_VERSION = "1.1.0";
9
10
  function detectHostsAvailable() {
10
11
  const hosts = [];
11
12
  if (commandExists("claude")) hosts.push("claude");
12
13
  if (commandExists("codex")) hosts.push("codex");
13
14
  if (commandExists("omp")) hosts.push("omp");
15
+ if (commandExists("agy")) hosts.push("agy");
14
16
  return hosts;
15
17
  }
16
18
  function resolveHost(opts = {}) {
17
19
  const agent = opts.agent?.trim().toLowerCase();
18
20
  const codexAlias = opts.codex === true;
19
21
  const ompAlias = opts.omp === true;
20
- if (agent && agent !== "claude" && agent !== "codex" && agent !== "omp") {
22
+ const agyAlias = opts.agy === true;
23
+ if (agent && agent !== "claude" && agent !== "codex" && agent !== "omp" && agent !== "agy") {
21
24
  throw new Error(
22
- `Unsupported agent "${opts.agent}". Use "claude", "codex", or "omp".`
25
+ `Unsupported agent "${opts.agent}". Use "claude", "codex", "omp", or "agy".`
23
26
  );
24
27
  }
25
28
  if (codexAlias && ompAlias) {
26
29
  throw new Error("Use either --codex or --omp, not both.");
27
30
  }
31
+ if (agyAlias && codexAlias) {
32
+ throw new Error("Use either --agy or --codex, not both.");
33
+ }
34
+ if (agyAlias && ompAlias) {
35
+ throw new Error("Use either --agy or --omp, not both.");
36
+ }
28
37
  if (codexAlias && agent === "claude") {
29
38
  throw new Error("Use either --agent claude or --codex, not both.");
30
39
  }
31
40
  if (ompAlias && agent === "claude") {
32
41
  throw new Error("Use either --agent claude or --omp, not both.");
33
42
  }
43
+ if (agyAlias && agent === "claude") {
44
+ throw new Error("Use either --agent claude or --agy, not both.");
45
+ }
34
46
  if (ompAlias && agent === "codex") {
35
47
  throw new Error("Use either --agent codex or --omp, not both.");
36
48
  }
49
+ if (agyAlias && agent === "codex") {
50
+ throw new Error("Use either --agent codex or --agy, not both.");
51
+ }
37
52
  if (codexAlias && agent === "omp") {
38
53
  throw new Error("Use either --agent omp or --codex, not both.");
39
54
  }
55
+ if (agyAlias && agent === "omp") {
56
+ throw new Error("Use either --agent omp or --agy, not both.");
57
+ }
58
+ if (codexAlias && agent === "agy") {
59
+ throw new Error("Use either --agent agy or --codex, not both.");
60
+ }
61
+ if (ompAlias && agent === "agy") {
62
+ throw new Error("Use either --agent agy or --omp, not both.");
63
+ }
64
+ if (agyAlias) return "agy";
65
+ if (agent === "agy") return "agy";
40
66
  if (ompAlias) return "omp";
41
67
  if (agent === "omp") return "omp";
42
68
  if (codexAlias) return "codex";
@@ -49,6 +75,9 @@ function getCodexMinVersion() {
49
75
  function getOmpMinVersion() {
50
76
  return OMP_MIN_VERSION;
51
77
  }
78
+ function getAgyMinVersion() {
79
+ return AGY_MIN_VERSION;
80
+ }
52
81
  function checkCodexVersion() {
53
82
  const min = getCodexMinVersion();
54
83
  const output = run("codex", ["--version"]);
@@ -69,6 +98,16 @@ function checkOmpVersion() {
69
98
  min
70
99
  };
71
100
  }
101
+ function checkAgyVersion() {
102
+ const min = getAgyMinVersion();
103
+ const output = run("agy", ["--version"]);
104
+ const actual = output ? extractVersion(output) : void 0;
105
+ return {
106
+ ok: actual ? compareVersions(actual, min) >= 0 : false,
107
+ actual,
108
+ min
109
+ };
110
+ }
72
111
  function extractVersion(input) {
73
112
  return input.match(/\b(\d+\.\d+\.\d+)\b/)?.[1];
74
113
  }
@@ -95,5 +134,6 @@ export {
95
134
  resolveHost,
96
135
  checkCodexVersion,
97
136
  checkOmpVersion,
137
+ checkAgyVersion,
98
138
  compareVersions
99
139
  };
@@ -12,7 +12,7 @@ import {
12
12
  globalConfigPath,
13
13
  installedPluginsPath,
14
14
  pluginCachePath
15
- } from "./chunk-IV5OPG34.js";
15
+ } from "./chunk-IYBIIRH4.js";
16
16
 
17
17
  // src/lib/statusline.ts
18
18
  import { existsSync, readdirSync } from "fs";
@@ -2,7 +2,7 @@ import {
2
2
  codexAgentsDir,
3
3
  codexConfigTomlPath,
4
4
  codexInstalledPluginsPath
5
- } from "./chunk-IV5OPG34.js";
5
+ } from "./chunk-IYBIIRH4.js";
6
6
 
7
7
  // src/lib/codex-config.ts
8
8
  import {
@@ -97,6 +97,15 @@ function isCodexMarketplaceRegistered(configPath = codexConfigTomlPath()) {
97
97
  (line) => line.trim() === tableHeader(`marketplaces.${CODEX_MARKETPLACE_NAME}`)
98
98
  );
99
99
  }
100
+ function isCodexMarketplaceLocal(configPath = codexConfigTomlPath()) {
101
+ const table = getTable(
102
+ readToml(configPath),
103
+ `marketplaces.${CODEX_MARKETPLACE_NAME}`
104
+ );
105
+ return table.some(
106
+ (line) => /^\s*source_type\s*=\s*["']local["']\s*(?:#.*)?$/.test(line)
107
+ );
108
+ }
100
109
  function setCodexPluginEnabled(enabled, configPath = codexConfigTomlPath()) {
101
110
  const content = readToml(configPath);
102
111
  writeToml(
@@ -225,6 +234,7 @@ function deployCodexAgents(sourceDir, targetDir = codexAgentsDir()) {
225
234
  export {
226
235
  CODEX_MARKETPLACE_NAME,
227
236
  isCodexMarketplaceRegistered,
237
+ isCodexMarketplaceLocal,
228
238
  setCodexPluginEnabled,
229
239
  isCodexPluginDisabled,
230
240
  removeCodexMemoryMcpConfig,
@@ -8,7 +8,7 @@ import {
8
8
  claudeSettingsPath,
9
9
  installedPluginsPath,
10
10
  knownMarketplacesPath
11
- } from "./chunk-IV5OPG34.js";
11
+ } from "./chunk-IYBIIRH4.js";
12
12
 
13
13
  // src/lib/plugin-state.ts
14
14
  var MARKETPLACE_NAME = "coding-friend-marketplace";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isMemoryMcpRegistered
3
- } from "./chunk-ZGIUKUL2.js";
3
+ } from "./chunk-CZW36H3D.js";
4
4
  import {
5
5
  readJson
6
6
  } from "./chunk-5UVDWG5L.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  compareVersions
3
- } from "./chunk-OFEC6OVI.js";
3
+ } from "./chunk-OBCNHQFA.js";
4
4
  import {
5
5
  pluginCachePath
6
- } from "./chunk-IV5OPG34.js";
6
+ } from "./chunk-IYBIIRH4.js";
7
7
 
8
8
  // src/lib/lib-path.ts
9
9
  import { existsSync, readdirSync } from "fs";
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  resolveHost
3
- } from "./chunk-OFEC6OVI.js";
4
- import {
5
- run
6
- } from "./chunk-EVGXUDX4.js";
3
+ } from "./chunk-OBCNHQFA.js";
7
4
  import {
8
5
  readJson
9
6
  } from "./chunk-5UVDWG5L.js";
7
+ import {
8
+ run
9
+ } from "./chunk-EVGXUDX4.js";
10
10
  import {
11
11
  globalConfigPath,
12
12
  localConfigPath
13
- } from "./chunk-IV5OPG34.js";
13
+ } from "./chunk-IYBIIRH4.js";
14
14
  import {
15
15
  log
16
16
  } from "./chunk-NREZK463.js";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  loadConfig,
3
3
  resolveMemoryDir
4
- } from "./chunk-FQUIO5BW.js";
4
+ } from "./chunk-E4NBTQXR.js";
5
5
  import "./chunk-3WIZA5OZ.js";
6
- import "./chunk-EVGXUDX4.js";
7
6
  import "./chunk-5UVDWG5L.js";
7
+ import "./chunk-EVGXUDX4.js";
8
8
  import {
9
9
  resolvePath
10
- } from "./chunk-IV5OPG34.js";
10
+ } from "./chunk-IYBIIRH4.js";
11
11
  import {
12
12
  log,
13
13
  printBanner
@@ -1,13 +1,14 @@
1
1
  import {
2
+ afterAutoApproveEnabled,
2
3
  getAllRules,
3
4
  getExistingRules
4
- } from "./chunk-463QKRBN.js";
5
+ } from "./chunk-KG6HYBGD.js";
5
6
  import {
6
7
  listMdFilesRecursive
7
8
  } from "./chunk-2DTXVMPQ.js";
8
9
  import {
9
10
  resolveLearnDir
10
- } from "./chunk-FQUIO5BW.js";
11
+ } from "./chunk-E4NBTQXR.js";
11
12
  import {
12
13
  findStatuslineHookPath,
13
14
  getCurrentAccountEmail,
@@ -18,7 +19,7 @@ import {
18
19
  saveStatuslineConfig,
19
20
  selectStatuslineComponents,
20
21
  writeStatuslineSettings
21
- } from "./chunk-4CPUWHIN.js";
22
+ } from "./chunk-Q2QDSYQT.js";
22
23
  import {
23
24
  ALL_COMPONENT_IDS,
24
25
  DEFAULT_CONFIG
@@ -26,7 +27,7 @@ import {
26
27
  import {
27
28
  registerLearnMcp,
28
29
  unregisterLearnMcp
29
- } from "./chunk-7JQZRMOG.js";
30
+ } from "./chunk-NIMO4VJW.js";
30
31
  import {
31
32
  ensureShellCompletion,
32
33
  hasShellCompletion,
@@ -34,8 +35,8 @@ import {
34
35
  } from "./chunk-667NMPN4.js";
35
36
  import {
36
37
  memoryConfigMenu
37
- } from "./chunk-ZGIUKUL2.js";
38
- import "./chunk-GTOEIGDM.js";
38
+ } from "./chunk-CZW36H3D.js";
39
+ import "./chunk-KCBMCHSA.js";
39
40
  import {
40
41
  BACK,
41
42
  applyDocsDirChange,
@@ -45,22 +46,21 @@ import {
45
46
  getScopeLabel,
46
47
  injectBackChoice,
47
48
  showConfigHint
48
- } from "./chunk-VMODQCSL.js";
49
- import "./chunk-ZZNTNIM4.js";
50
- import "./chunk-OFEC6OVI.js";
51
- import "./chunk-EVGXUDX4.js";
49
+ } from "./chunk-Z5XTSF7L.js";
50
+ import "./chunk-TN3Y75WG.js";
51
+ import "./chunk-OBCNHQFA.js";
52
52
  import {
53
53
  mergeJson,
54
54
  readJson
55
55
  } from "./chunk-5UVDWG5L.js";
56
+ import "./chunk-EVGXUDX4.js";
56
57
  import {
57
58
  claudeLocalSettingsPath,
58
- claudeProjectSettingsPath,
59
59
  claudeSettingsPath,
60
60
  globalConfigPath,
61
61
  localConfigPath,
62
62
  resolvePath
63
- } from "./chunk-IV5OPG34.js";
63
+ } from "./chunk-IYBIIRH4.js";
64
64
  import {
65
65
  log,
66
66
  printBanner
@@ -536,29 +536,32 @@ async function editAutoApprove(globalCfg, localCfg) {
536
536
  log.dim(`Current: ${currentValue}`);
537
537
  }
538
538
  const value = await confirm({
539
- message: "Enable auto-approve? (auto-approves read-only tools + working-dir file edits, LLM classifier for unknowns)",
539
+ message: "Enable auto-approve? (Claude: LLM classifier; Antigravity/Codex: deterministic rules, no LLM)",
540
540
  default: currentValue ?? false
541
541
  });
542
542
  const scope = await askScope();
543
543
  if (scope === "back") return;
544
544
  writeToScope(scope, { autoApprove: value });
545
545
  if (value) {
546
- const { runDangerousRulesAudit } = await import("./permissions-HZYUVKCY.js");
547
- await runDangerousRulesAudit(
548
- [
549
- claudeProjectSettingsPath(),
550
- claudeLocalSettingsPath(),
551
- claudeSettingsPath()
552
- ],
546
+ await afterAutoApproveEnabled(
553
547
  log,
554
548
  (message) => confirm({ message, default: true })
555
549
  );
556
- log.dim(
557
- "Tip: Fine-tune with autoApproveAllowExtra / autoApproveIgnore in config.json"
558
- );
559
- log.dim("Docs: https://cf.dinhanhthi.com/docs/reference/auto-approve/");
560
550
  }
561
551
  }
552
+ async function editPrivacyBlock(globalCfg, localCfg) {
553
+ const currentValue = getMergedValue("privacyBlock", globalCfg, localCfg);
554
+ if (currentValue !== void 0) {
555
+ log.dim(`Current: ${currentValue}`);
556
+ }
557
+ const value = await confirm({
558
+ message: "Keep privacy-block enabled? (deny .env / credentials / keys)",
559
+ default: currentValue !== false
560
+ });
561
+ const scope = await askScope();
562
+ if (scope === "back") return;
563
+ writeToScope(scope, { privacyBlock: value });
564
+ }
562
565
  async function editStatusline() {
563
566
  const hookResult = findStatuslineHookPath();
564
567
  if (!hookResult) {
@@ -739,7 +742,7 @@ async function editPermissions() {
739
742
  )
740
743
  });
741
744
  if (choice === BACK) return;
742
- const { permissionCommand } = await import("./permission-DPKPA2HU.js");
745
+ const { permissionCommand } = await import("./permission-L5QMNMID.js");
743
746
  switch (choice) {
744
747
  case "interactive":
745
748
  await permissionCommand({});
@@ -774,6 +777,16 @@ async function configCommand() {
774
777
  globalCfg,
775
778
  localCfg
776
779
  );
780
+ const privacyBlockScope = getScopeLabel(
781
+ "privacyBlock",
782
+ globalCfg,
783
+ localCfg
784
+ );
785
+ const privacyBlockVal = getMergedValue(
786
+ "privacyBlock",
787
+ globalCfg,
788
+ localCfg
789
+ );
777
790
  const reviewScope = getScopeLabel("review", globalCfg, localCfg);
778
791
  const withCodexVal = getMergedValue("review", globalCfg, localCfg)?.withCodex;
779
792
  const planDocsScope = getScopeLabel("disableGUIPlan", globalCfg, localCfg);
@@ -820,7 +833,12 @@ async function configCommand() {
820
833
  {
821
834
  name: `Auto-approve ${formatScopeLabel(autoApproveScope)}${autoApproveVal !== void 0 ? ` (${autoApproveVal})` : ""}`,
822
835
  value: "autoApprove",
823
- description: " Auto-approve safe tool calls, block destructive ones, prompt for ambiguous"
836
+ description: " Claude: LLM classifier; Antigravity/Codex: deterministic rules"
837
+ },
838
+ {
839
+ name: `Privacy-block ${formatScopeLabel(privacyBlockScope)}${privacyBlockVal !== void 0 ? ` (${privacyBlockVal})` : ""}`,
840
+ value: "privacyBlock",
841
+ description: " Block reads of .env, keys, and similar secrets (all hosts)"
824
842
  },
825
843
  {
826
844
  name: `Codex dual-review ${formatScopeLabel(reviewScope)}${withCodexVal !== void 0 ? ` (${withCodexVal})` : ""}`,
@@ -878,6 +896,9 @@ async function configCommand() {
878
896
  case "autoApprove":
879
897
  await editAutoApprove(globalCfg, localCfg);
880
898
  break;
899
+ case "privacyBlock":
900
+ await editPrivacyBlock(globalCfg, localCfg);
901
+ break;
881
902
  case "review":
882
903
  await editReviewWithCodex(globalCfg, localCfg);
883
904
  break;