coding-friend-cli 1.37.0 → 1.38.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 (71) hide show
  1. package/README.md +7 -2
  2. package/dist/{chunk-GZT3YPAP.js → chunk-32UAW3NX.js} +1 -1
  3. package/dist/chunk-5QCGEPQO.js +238 -0
  4. package/dist/{chunk-YIXAQ4R2.js → chunk-6NXZKAOV.js} +1 -1
  5. package/dist/{chunk-676YCW6T.js → chunk-776ZY62N.js} +99 -7
  6. package/dist/{chunk-DP6DFQ4G.js → chunk-BXSCYGWE.js} +2 -2
  7. package/dist/{chunk-W6D3J5DX.js → chunk-CGEMETKQ.js} +8 -6
  8. package/dist/{chunk-XEKQW4RN.js → chunk-ETTZRJ55.js} +1 -1
  9. package/dist/{chunk-IKLMHJH6.js → chunk-GIH6E7GJ.js} +62 -1
  10. package/dist/{chunk-6S7352JG.js → chunk-ONG4KRYP.js} +1 -1
  11. package/dist/{chunk-X2H7JJMR.js → chunk-PLSJW7QJ.js} +29 -1
  12. package/dist/{chunk-O5ZKLFSL.js → chunk-RCE4OWNX.js} +1 -1
  13. package/dist/{chunk-PI4P34KF.js → chunk-RFNKPAJW.js} +3 -1
  14. package/dist/{clean-WEYQZB34.js → clean-YWEMYDE5.js} +2 -2
  15. package/dist/{config-ZMR2AOBB.js → config-NG7SICM4.js} +12 -24
  16. package/dist/{dev-IGHMMEP4.js → dev-PTBNMKZT.js} +3 -3
  17. package/dist/{disable-HL5OEURT.js → disable-MO7AXYYF.js} +20 -3
  18. package/dist/{enable-CZIOCKKJ.js → enable-4GXLQEHD.js} +20 -3
  19. package/dist/{guide-CO2V4ZLZ.js → guide-HCR43LJN.js} +1 -1
  20. package/dist/{host-SSRI4JZV.js → host-EV6QIVTI.js} +2 -2
  21. package/dist/index.js +59 -47
  22. package/dist/{init-6MFQWPOP.js → init-KYE5CJMW.js} +115 -12
  23. package/dist/{install-37NN4CQH.js → install-XAFQY5YF.js} +79 -6
  24. package/dist/{learn-OPH3CI67.js → learn-MC4VDHZH.js} +2 -2
  25. package/dist/{mcp-DWKVMNC7.js → mcp-FV6YX3ZT.js} +7 -7
  26. package/dist/{mcp-serve-5GODJ4DJ.js → mcp-serve-PXREYQRZ.js} +2 -2
  27. package/dist/{mcp-serve-learn-OF3ZJUJC.js → mcp-serve-learn-UVXIDOEZ.js} +1 -1
  28. package/dist/{memory-TRDLADUM.js → memory-DF7OUOTV.js} +6 -6
  29. package/dist/{permission-I3OFJUYA.js → permission-VISPGMUK.js} +38 -4
  30. package/dist/{permissions-J46VP6US.js → permissions-2SBACQHV.js} +2 -2
  31. package/dist/{session-S4WKA4P5.js → session-QK6OZO3X.js} +2 -2
  32. package/dist/{status-YZEOUX46.js → status-FVFTJ6GS.js} +11 -10
  33. package/dist/{statusline-KKFJPTI7.js → statusline-AOZHEQSV.js} +2 -2
  34. package/dist/{uninstall-AVA3J554.js → uninstall-MF6FRUBO.js} +51 -4
  35. package/dist/{update-Q3ACCK4Z.js → update-QNUCSDSA.js} +6 -5
  36. package/dist/{update-check-25SCLHZO.js → update-check-7LKJLJPM.js} +1 -1
  37. package/lib/cf-memory/src/lib/claude-md.ts +82 -70
  38. package/lib/cf-memory/src/lib/status-frame.ts +2 -2
  39. package/lib/cf-memory/src/tools/delete.ts +1 -1
  40. package/lib/cf-memory/src/tools/store.ts +6 -6
  41. package/lib/cf-memory/src/tools/update.ts +5 -11
  42. package/package.json +32 -4
  43. package/lib/cf-memory/README.md +0 -317
  44. package/lib/cf-memory/src/__tests__/claude-md.test.ts +0 -343
  45. package/lib/cf-memory/src/__tests__/daemon-client.test.ts +0 -146
  46. package/lib/cf-memory/src/__tests__/daemon-e2e.test.ts +0 -223
  47. package/lib/cf-memory/src/__tests__/daemon.test.ts +0 -407
  48. package/lib/cf-memory/src/__tests__/dedup.test.ts +0 -103
  49. package/lib/cf-memory/src/__tests__/embeddings.test.ts +0 -292
  50. package/lib/cf-memory/src/__tests__/lazy-install.test.ts +0 -210
  51. package/lib/cf-memory/src/__tests__/markdown-backend.test.ts +0 -450
  52. package/lib/cf-memory/src/__tests__/migration.test.ts +0 -255
  53. package/lib/cf-memory/src/__tests__/migrations.test.ts +0 -288
  54. package/lib/cf-memory/src/__tests__/minisearch-backend.test.ts +0 -262
  55. package/lib/cf-memory/src/__tests__/ollama.test.ts +0 -48
  56. package/lib/cf-memory/src/__tests__/project-id.test.ts +0 -43
  57. package/lib/cf-memory/src/__tests__/schema.test.ts +0 -128
  58. package/lib/cf-memory/src/__tests__/search.test.ts +0 -115
  59. package/lib/cf-memory/src/__tests__/sqlite-lazy-db.test.ts +0 -213
  60. package/lib/cf-memory/src/__tests__/status-frame.test.ts +0 -136
  61. package/lib/cf-memory/src/__tests__/temporal-decay.test.ts +0 -54
  62. package/lib/cf-memory/src/__tests__/tier.test.ts +0 -388
  63. package/lib/cf-memory/src/__tests__/tools.test.ts +0 -83
  64. package/lib/cf-memory/vitest.config.ts +0 -7
  65. package/lib/learn-host/.prettierignore +0 -4
  66. package/lib/learn-host/.prettierrc +0 -8
  67. package/lib/learn-host/README.md +0 -113
  68. package/lib/learn-host/eslint.config.mjs +0 -6
  69. package/lib/learn-mcp/README.md +0 -187
  70. package/lib/learn-mcp/src/__tests__/docs.test.ts +0 -117
  71. package/lib/learn-mcp/vitest.config.ts +0 -8
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-5UVDWG5L.js";
5
5
  import {
6
6
  pluginCachePath
7
- } from "./chunk-X2H7JJMR.js";
7
+ } from "./chunk-PLSJW7QJ.js";
8
8
 
9
9
  // src/lib/permissions.ts
10
10
  var STATIC_RULES = [
@@ -11,7 +11,7 @@ import {
11
11
  globalConfigPath,
12
12
  localConfigPath,
13
13
  resolvePath
14
- } from "./chunk-X2H7JJMR.js";
14
+ } from "./chunk-PLSJW7QJ.js";
15
15
  import {
16
16
  log
17
17
  } from "./chunk-NREZK463.js";
@@ -107,6 +107,7 @@ var ConfigSchema = z.strictObject({
107
107
  memory: MemoryConfigSchema.optional(),
108
108
  review: ReviewConfigSchema.optional(),
109
109
  autoApprove: z.boolean().optional(),
110
+ autoApproveCodex: z.boolean().optional(),
110
111
  autoApproveIgnore: z.array(z.string()).optional(),
111
112
  autoApproveAllowExtra: z.array(z.string()).optional(),
112
113
  disableGUIPlan: z.boolean().optional(),
@@ -121,6 +122,7 @@ var KNOWN_KEYS = [
121
122
  "memory",
122
123
  "review",
123
124
  "autoApprove",
125
+ "autoApproveCodex",
124
126
  "autoApproveIgnore",
125
127
  "autoApproveAllowExtra",
126
128
  "disableGUIPlan",
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  loadConfig,
3
3
  resolveMemoryDir
4
- } from "./chunk-PI4P34KF.js";
4
+ } from "./chunk-RFNKPAJW.js";
5
5
  import "./chunk-3WIZA5OZ.js";
6
6
  import "./chunk-EVGXUDX4.js";
7
7
  import "./chunk-5UVDWG5L.js";
8
8
  import {
9
9
  resolvePath
10
- } from "./chunk-X2H7JJMR.js";
10
+ } from "./chunk-PLSJW7QJ.js";
11
11
  import {
12
12
  log,
13
13
  printBanner
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  getAllRules,
3
3
  getExistingRules
4
- } from "./chunk-O5ZKLFSL.js";
4
+ } from "./chunk-RCE4OWNX.js";
5
5
  import {
6
6
  listMdFilesRecursive
7
7
  } from "./chunk-2DTXVMPQ.js";
8
8
  import {
9
9
  registerLearnMcp,
10
10
  unregisterLearnMcp
11
- } from "./chunk-YIXAQ4R2.js";
11
+ } from "./chunk-6NXZKAOV.js";
12
12
  import {
13
13
  resolveLearnDir
14
- } from "./chunk-PI4P34KF.js";
14
+ } from "./chunk-RFNKPAJW.js";
15
15
  import {
16
16
  findStatuslineHookPath,
17
17
  getCurrentAccountEmail,
@@ -22,7 +22,7 @@ import {
22
22
  saveStatuslineConfig,
23
23
  selectStatuslineComponents,
24
24
  writeStatuslineSettings
25
- } from "./chunk-XEKQW4RN.js";
25
+ } from "./chunk-ETTZRJ55.js";
26
26
  import {
27
27
  ALL_COMPONENT_IDS,
28
28
  DEFAULT_CONFIG
@@ -34,7 +34,7 @@ import {
34
34
  } from "./chunk-667NMPN4.js";
35
35
  import {
36
36
  memoryConfigMenu
37
- } from "./chunk-DP6DFQ4G.js";
37
+ } from "./chunk-BXSCYGWE.js";
38
38
  import "./chunk-RZRT7NGT.js";
39
39
  import {
40
40
  BACK,
@@ -45,7 +45,7 @@ import {
45
45
  getScopeLabel,
46
46
  injectBackChoice,
47
47
  showConfigHint
48
- } from "./chunk-IKLMHJH6.js";
48
+ } from "./chunk-GIH6E7GJ.js";
49
49
  import "./chunk-EVGXUDX4.js";
50
50
  import {
51
51
  mergeJson,
@@ -58,7 +58,7 @@ import {
58
58
  globalConfigPath,
59
59
  localConfigPath,
60
60
  resolvePath
61
- } from "./chunk-X2H7JJMR.js";
61
+ } from "./chunk-PLSJW7QJ.js";
62
62
  import {
63
63
  log,
64
64
  printBanner
@@ -448,11 +448,7 @@ async function editDisableGUIPlan(globalCfg, localCfg) {
448
448
  writeToScope(scope, { disableGUIPlan: value });
449
449
  }
450
450
  async function editGuiPlanFormat(globalCfg, localCfg) {
451
- const currentValue = getMergedValue(
452
- "guiPlanFormat",
453
- globalCfg,
454
- localCfg
455
- );
451
+ const currentValue = getMergedValue("guiPlanFormat", globalCfg, localCfg);
456
452
  if (currentValue !== void 0) {
457
453
  log.dim(`Current: ${currentValue}`);
458
454
  }
@@ -476,16 +472,8 @@ async function planDocsSubMenu() {
476
472
  while (true) {
477
473
  const globalCfg = readJson(globalConfigPath());
478
474
  const localCfg = readJson(localConfigPath());
479
- const disableVal = getMergedValue(
480
- "disableGUIPlan",
481
- globalCfg,
482
- localCfg
483
- );
484
- const formatVal = getMergedValue(
485
- "guiPlanFormat",
486
- globalCfg,
487
- localCfg
488
- );
475
+ const disableVal = getMergedValue("disableGUIPlan", globalCfg, localCfg);
476
+ const formatVal = getMergedValue("guiPlanFormat", globalCfg, localCfg);
489
477
  const choice = await select({
490
478
  message: "Plan docs settings:",
491
479
  choices: injectBackChoice(
@@ -553,7 +541,7 @@ async function editAutoApprove(globalCfg, localCfg) {
553
541
  if (scope === "back") return;
554
542
  writeToScope(scope, { autoApprove: value });
555
543
  if (value) {
556
- const { runDangerousRulesAudit } = await import("./permissions-J46VP6US.js");
544
+ const { runDangerousRulesAudit } = await import("./permissions-2SBACQHV.js");
557
545
  await runDangerousRulesAudit(
558
546
  [
559
547
  claudeProjectSettingsPath(),
@@ -749,7 +737,7 @@ async function editPermissions() {
749
737
  )
750
738
  });
751
739
  if (choice === BACK) return;
752
- const { permissionCommand } = await import("./permission-I3OFJUYA.js");
740
+ const { permissionCommand } = await import("./permission-VISPGMUK.js");
753
741
  switch (choice) {
754
742
  case "interactive":
755
743
  await permissionCommand({});
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ensureStatusline
3
- } from "./chunk-XEKQW4RN.js";
3
+ } from "./chunk-ETTZRJ55.js";
4
4
  import "./chunk-3WIZA5OZ.js";
5
5
  import {
6
6
  ensureShellCompletion
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  isMarketplaceRegistered,
10
10
  isPluginInstalled
11
- } from "./chunk-GZT3YPAP.js";
11
+ } from "./chunk-32UAW3NX.js";
12
12
  import {
13
13
  commandExists,
14
14
  run,
@@ -22,7 +22,7 @@ import {
22
22
  devStatePath,
23
23
  knownMarketplacesPath,
24
24
  pluginCachePath
25
- } from "./chunk-X2H7JJMR.js";
25
+ } from "./chunk-PLSJW7QJ.js";
26
26
  import {
27
27
  log,
28
28
  printBanner
@@ -1,13 +1,18 @@
1
1
  import {
2
2
  isPluginDisabled,
3
3
  setPluginEnabled
4
- } from "./chunk-GZT3YPAP.js";
4
+ } from "./chunk-32UAW3NX.js";
5
5
  import {
6
+ isCodexPluginDisabled,
7
+ setCodexPluginEnabled
8
+ } from "./chunk-5QCGEPQO.js";
9
+ import {
10
+ resolveHostFlags,
6
11
  resolveScope
7
- } from "./chunk-IKLMHJH6.js";
12
+ } from "./chunk-GIH6E7GJ.js";
8
13
  import "./chunk-EVGXUDX4.js";
9
14
  import "./chunk-5UVDWG5L.js";
10
- import "./chunk-X2H7JJMR.js";
15
+ import "./chunk-PLSJW7QJ.js";
11
16
  import {
12
17
  log
13
18
  } from "./chunk-NREZK463.js";
@@ -15,6 +20,18 @@ import {
15
20
  // src/commands/disable.ts
16
21
  import chalk from "chalk";
17
22
  async function disableCommand(opts = {}) {
23
+ const { host } = resolveHostFlags(opts);
24
+ if (host === "codex") {
25
+ if (isCodexPluginDisabled()) {
26
+ log.info("Coding Friend is already disabled for Codex.");
27
+ return;
28
+ }
29
+ log.step("Disabling Codex plugin...");
30
+ setCodexPluginEnabled(false);
31
+ log.success("Coding Friend disabled for Codex.");
32
+ log.dim("Restart Codex CLI for the change to take effect.");
33
+ return;
34
+ }
18
35
  const scope = await resolveScope(
19
36
  opts,
20
37
  "Where should Coding Friend be disabled?"
@@ -1,13 +1,18 @@
1
1
  import {
2
2
  isPluginDisabled,
3
3
  setPluginEnabled
4
- } from "./chunk-GZT3YPAP.js";
4
+ } from "./chunk-32UAW3NX.js";
5
5
  import {
6
+ isCodexPluginDisabled,
7
+ setCodexPluginEnabled
8
+ } from "./chunk-5QCGEPQO.js";
9
+ import {
10
+ resolveHostFlags,
6
11
  resolveScope
7
- } from "./chunk-IKLMHJH6.js";
12
+ } from "./chunk-GIH6E7GJ.js";
8
13
  import "./chunk-EVGXUDX4.js";
9
14
  import "./chunk-5UVDWG5L.js";
10
- import "./chunk-X2H7JJMR.js";
15
+ import "./chunk-PLSJW7QJ.js";
11
16
  import {
12
17
  log
13
18
  } from "./chunk-NREZK463.js";
@@ -15,6 +20,18 @@ import {
15
20
  // src/commands/enable.ts
16
21
  import chalk from "chalk";
17
22
  async function enableCommand(opts = {}) {
23
+ const { host } = resolveHostFlags(opts);
24
+ if (host === "codex") {
25
+ if (!isCodexPluginDisabled()) {
26
+ log.info("Coding Friend is already enabled for Codex.");
27
+ return;
28
+ }
29
+ log.step("Enabling Codex plugin...");
30
+ setCodexPluginEnabled(true);
31
+ log.success("Coding Friend enabled for Codex.");
32
+ log.dim("Restart Codex CLI for the change to take effect.");
33
+ return;
34
+ }
18
35
  const scope = await resolveScope(
19
36
  opts,
20
37
  "Where should Coding Friend be enabled?"
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  devStatePath,
6
6
  pluginCachePath
7
- } from "./chunk-X2H7JJMR.js";
7
+ } from "./chunk-PLSJW7QJ.js";
8
8
  import {
9
9
  log
10
10
  } from "./chunk-NREZK463.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveLearnDir
3
- } from "./chunk-PI4P34KF.js";
3
+ } from "./chunk-RFNKPAJW.js";
4
4
  import "./chunk-3WIZA5OZ.js";
5
5
  import {
6
6
  getLibPath
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-5UVDWG5L.js";
15
15
  import {
16
16
  globalConfigPath
17
- } from "./chunk-X2H7JJMR.js";
17
+ } from "./chunk-PLSJW7QJ.js";
18
18
  import {
19
19
  log,
20
20
  printBanner
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  installedPluginsPath
4
- } from "./chunk-X2H7JJMR.js";
4
+ } from "./chunk-PLSJW7QJ.js";
5
5
 
6
6
  // src/index.ts
7
7
  import { Command } from "commander";
@@ -42,28 +42,34 @@ var program = new Command();
42
42
  program.name("cf").description(
43
43
  "coding-friend CLI \u2014 host learning docs, setup MCP, init projects"
44
44
  ).version(wantsVersion ? buildVersionString() : pkg.version, "-v, --version");
45
- program.command("install").description("Install the Coding Friend plugin into Claude Code").option("--user", "Install at user scope (all projects)").option("--global", "Install at user scope (all projects)").option("--project", "Install at project scope (shared via git)").option("--local", "Install at local scope (this machine only)").action(async (opts) => {
46
- const { installCommand } = await import("./install-37NN4CQH.js");
45
+ program.command("install").description("Install the Coding Friend plugin into a supported host").option("--user", "Install at user scope (all projects)").option("--global", "Install at user scope (all projects)").option("--project", "Install at project scope (shared via git)").option("--local", "Install at local scope (this machine only)").option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").action(async (opts) => {
46
+ const { installCommand } = await import("./install-XAFQY5YF.js");
47
47
  await installCommand(opts);
48
48
  });
49
- program.command("uninstall").description("Uninstall the Coding Friend plugin from Claude Code").option("--user", "Uninstall from user scope (all projects)").option("--global", "Uninstall from user scope (all projects)").option("--project", "Uninstall from project scope").option("--local", "Uninstall from local scope").action(async (opts) => {
50
- const { uninstallCommand } = await import("./uninstall-AVA3J554.js");
49
+ program.command("uninstall").description("Uninstall the Coding Friend plugin from a supported host").option("--user", "Uninstall from user scope (all projects)").option("--global", "Uninstall from user scope (all projects)").option("--project", "Uninstall from project scope").option("--local", "Uninstall from local scope").option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").option(
50
+ "--remove-marketplace",
51
+ "Also remove the host marketplace registration"
52
+ ).action(async (opts) => {
53
+ const { uninstallCommand } = await import("./uninstall-MF6FRUBO.js");
51
54
  await uninstallCommand(opts);
52
55
  });
53
- program.command("disable").description("Disable the Coding Friend plugin without uninstalling").option("--user", "Disable at user scope (all projects)").option("--global", "Disable at user scope (all projects)").option("--project", "Disable at project scope").option("--local", "Disable at local scope").action(async (opts) => {
54
- const { disableCommand } = await import("./disable-HL5OEURT.js");
56
+ program.command("disable").description("Disable the Coding Friend plugin without uninstalling").option("--user", "Disable at user scope (all projects)").option("--global", "Disable at user scope (all projects)").option("--project", "Disable at project scope").option("--local", "Disable at local scope").option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").action(async (opts) => {
57
+ const { disableCommand } = await import("./disable-MO7AXYYF.js");
55
58
  await disableCommand(opts);
56
59
  });
57
- program.command("enable").description("Re-enable the Coding Friend plugin").option("--user", "Enable at user scope (all projects)").option("--global", "Enable at user scope (all projects)").option("--project", "Enable at project scope").option("--local", "Enable at local scope").action(async (opts) => {
58
- const { enableCommand } = await import("./enable-CZIOCKKJ.js");
60
+ program.command("enable").description("Re-enable the Coding Friend plugin").option("--user", "Enable at user scope (all projects)").option("--global", "Enable at user scope (all projects)").option("--project", "Enable at project scope").option("--local", "Enable at local scope").option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").action(async (opts) => {
61
+ const { enableCommand } = await import("./enable-4GXLQEHD.js");
59
62
  await enableCommand(opts);
60
63
  });
61
- program.command("init").description("Initialize coding-friend in current project").action(async () => {
62
- const { initCommand } = await import("./init-6MFQWPOP.js");
63
- await initCommand();
64
+ program.command("init").description("Initialize coding-friend in current project").option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").option(
65
+ "--trust-project",
66
+ "For Codex, mark the current project trusted in ~/.codex/config.toml"
67
+ ).action(async (opts) => {
68
+ const { initCommand } = await import("./init-KYE5CJMW.js");
69
+ await initCommand(opts);
64
70
  });
65
71
  program.command("config").description("Manage Coding Friend configuration").action(async () => {
66
- const { configCommand } = await import("./config-ZMR2AOBB.js");
72
+ const { configCommand } = await import("./config-NG7SICM4.js");
67
73
  await configCommand();
68
74
  });
69
75
  var learn = program.command("learn").description("Manage learning docs \u2014 host as a website or push to git");
@@ -75,52 +81,58 @@ Learn subcommands:
75
81
  learn push [path] Commit and push learning docs (only if learn dir is the git root)`
76
82
  );
77
83
  learn.command("host").description("Build and serve learning docs as a static website").argument("[path]", "path to docs folder").option("-p, --port <port>", "port number", "3333").action(async (path, opts) => {
78
- const { hostCommand } = await import("./host-SSRI4JZV.js");
84
+ const { hostCommand } = await import("./host-EV6QIVTI.js");
79
85
  await hostCommand(path, opts);
80
86
  });
81
87
  learn.command("push").description("Commit and push learning docs to origin").argument("[path]", "path to docs folder").action(async (path) => {
82
- const { learnPushCommand } = await import("./learn-OPH3CI67.js");
88
+ const { learnPushCommand } = await import("./learn-MC4VDHZH.js");
83
89
  await learnPushCommand(path);
84
90
  });
85
91
  program.command("host", { hidden: true }).argument("[path]", "path to docs folder").option("-p, --port <port>", "port number", "3333").action(async (path, opts) => {
86
- const { hostCommand } = await import("./host-SSRI4JZV.js");
92
+ const { hostCommand } = await import("./host-EV6QIVTI.js");
87
93
  await hostCommand(path, opts);
88
94
  });
89
95
  program.command("mcp").description("Setup MCP server for learning docs").action(async () => {
90
- const { mcpCommand } = await import("./mcp-DWKVMNC7.js");
96
+ const { mcpCommand } = await import("./mcp-FV6YX3ZT.js");
91
97
  await mcpCommand();
92
98
  });
93
99
  program.command("mcp-serve").description(
94
100
  "Start the cf-memory MCP server (used internally by npx). When memoryDir is omitted, resolves from CLAUDE_PROJECT_DIR at runtime."
95
101
  ).argument("[memoryDir]", "path to memory directory (optional)").action(async (memoryDir) => {
96
- const { mcpServeCommand } = await import("./mcp-serve-5GODJ4DJ.js");
102
+ const { mcpServeCommand } = await import("./mcp-serve-PXREYQRZ.js");
97
103
  await mcpServeCommand(memoryDir);
98
104
  });
99
105
  program.command("mcp-serve-learn").description("Start the learn MCP server (used internally by npx)").argument("<docsDir>", "path to docs directory").action(async (docsDir) => {
100
- const { mcpServeLearnCommand } = await import("./mcp-serve-learn-OF3ZJUJC.js");
106
+ const { mcpServeLearnCommand } = await import("./mcp-serve-learn-UVXIDOEZ.js");
101
107
  await mcpServeLearnCommand(docsDir);
102
108
  });
103
- program.command("permission").description("Manage Claude Code permission rules for Coding Friend").option("--all", "Apply all recommended permissions without prompts").option("--user", "Save to user-level settings (~/.claude/settings.json)").option(
109
+ program.command("permission").description("Manage host permission and approval settings for Coding Friend").option("--all", "Apply all recommended permissions without prompts").option("--user", "Save to user-level settings (~/.claude/settings.json)").option(
104
110
  "--project",
105
111
  "Save to project-level settings (.claude/settings.local.json)"
112
+ ).option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").option(
113
+ "--enable-auto-approve",
114
+ "For Codex, enable deterministic Coding Friend auto-approve"
115
+ ).option(
116
+ "--disable-auto-approve",
117
+ "For Codex, disable deterministic Coding Friend auto-approve"
106
118
  ).action(async (opts) => {
107
- const { permissionCommand } = await import("./permission-I3OFJUYA.js");
119
+ const { permissionCommand } = await import("./permission-VISPGMUK.js");
108
120
  await permissionCommand(opts);
109
121
  });
110
122
  program.command("statusline").description("Setup coding-friend statusline in Claude Code").action(async () => {
111
- const { statuslineCommand } = await import("./statusline-KKFJPTI7.js");
123
+ const { statuslineCommand } = await import("./statusline-AOZHEQSV.js");
112
124
  await statuslineCommand();
113
125
  });
114
- program.command("update").description("Update coding-friend plugin, CLI, and statusline").option("--cli", "Update only the CLI (npm package)").option("--plugin", "Update only the Claude Code plugin").option("--statusline", "Update only the statusline").option("--user", "Update plugin at user scope (all projects)").option("--global", "Update plugin at user scope (all projects)").option("--project", "Update plugin at project scope").option("--local", "Update plugin at local scope").action(async (opts) => {
115
- const { updateCommand } = await import("./update-Q3ACCK4Z.js");
126
+ program.command("update").description("Update coding-friend plugin, CLI, and statusline").option("--cli", "Update only the CLI (npm package)").option("--plugin", "Update only the host plugin").option("--statusline", "Update only the statusline").option("--user", "Update plugin at user scope (all projects)").option("--global", "Update plugin at user scope (all projects)").option("--project", "Update plugin at project scope").option("--local", "Update plugin at local scope").option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").action(async (opts) => {
127
+ const { updateCommand } = await import("./update-QNUCSDSA.js");
116
128
  await updateCommand(opts);
117
129
  });
118
130
  program.command("status").description("Show comprehensive Coding Friend status").action(async () => {
119
- const { statusCommand } = await import("./status-YZEOUX46.js");
131
+ const { statusCommand } = await import("./status-FVFTJ6GS.js");
120
132
  await statusCommand();
121
133
  });
122
134
  program.command("clean").description("Clean files generated by Coding Friend in docs/").action(async () => {
123
- const { cleanCommand } = await import("./clean-WEYQZB34.js");
135
+ const { cleanCommand } = await import("./clean-YWEMYDE5.js");
124
136
  await cleanCommand();
125
137
  });
126
138
  var session = program.command("session").description("[beta] Save and load Claude Code sessions across machines");
@@ -135,11 +147,11 @@ session.command("save").description("Save current Claude Code session to sync fo
135
147
  "-s, --session-id <id>",
136
148
  "session UUID to save (default: auto-detect newest)"
137
149
  ).option("-l, --label <label>", "label for this session").action(async (opts) => {
138
- const { sessionSaveCommand } = await import("./session-S4WKA4P5.js");
150
+ const { sessionSaveCommand } = await import("./session-QK6OZO3X.js");
139
151
  await sessionSaveCommand(opts);
140
152
  });
141
153
  session.command("load").description("Load a saved session from sync folder").action(async () => {
142
- const { sessionLoadCommand } = await import("./session-S4WKA4P5.js");
154
+ const { sessionLoadCommand } = await import("./session-QK6OZO3X.js");
143
155
  await sessionLoadCommand();
144
156
  });
145
157
  var memory = program.command("memory").description("AI memory system \u2014 store and search project knowledge");
@@ -159,43 +171,43 @@ Memory subcommands:
159
171
  memory mcp Show MCP server setup instructions`
160
172
  );
161
173
  memory.command("status").description("Show memory system status").action(async () => {
162
- const { memoryStatusCommand } = await import("./memory-TRDLADUM.js");
174
+ const { memoryStatusCommand } = await import("./memory-DF7OUOTV.js");
163
175
  await memoryStatusCommand();
164
176
  });
165
177
  memory.command("search").description("Search memories by query").argument("<query>", "search query").action(async (query) => {
166
- const { memorySearchCommand } = await import("./memory-TRDLADUM.js");
178
+ const { memorySearchCommand } = await import("./memory-DF7OUOTV.js");
167
179
  await memorySearchCommand(query);
168
180
  });
169
181
  memory.command("list").description(
170
182
  "List memories in current project, or all projects with --projects"
171
183
  ).option("--projects", "List all project databases with size and metadata").action(async (opts) => {
172
- const { memoryListCommand } = await import("./memory-TRDLADUM.js");
184
+ const { memoryListCommand } = await import("./memory-DF7OUOTV.js");
173
185
  await memoryListCommand(opts);
174
186
  });
175
187
  memory.command("init").description(
176
188
  "Initialize memory system \u2014 interactive wizard (first time) or config menu"
177
189
  ).action(async () => {
178
- const { memoryInitCommand } = await import("./memory-TRDLADUM.js");
190
+ const { memoryInitCommand } = await import("./memory-DF7OUOTV.js");
179
191
  await memoryInitCommand();
180
192
  });
181
193
  memory.command("config").description("Configure memory system settings").action(async () => {
182
- const { memoryConfigCommand } = await import("./memory-TRDLADUM.js");
194
+ const { memoryConfigCommand } = await import("./memory-DF7OUOTV.js");
183
195
  await memoryConfigCommand();
184
196
  });
185
197
  memory.command("start-daemon").description("Start the memory daemon (Tier 2 \u2014 MiniSearch)").action(async () => {
186
- const { memoryStartDaemonCommand } = await import("./memory-TRDLADUM.js");
198
+ const { memoryStartDaemonCommand } = await import("./memory-DF7OUOTV.js");
187
199
  await memoryStartDaemonCommand();
188
200
  });
189
201
  memory.command("stop-daemon").description("Stop the memory daemon").action(async () => {
190
- const { memoryStopDaemonCommand } = await import("./memory-TRDLADUM.js");
202
+ const { memoryStopDaemonCommand } = await import("./memory-DF7OUOTV.js");
191
203
  await memoryStopDaemonCommand();
192
204
  });
193
205
  memory.command("rebuild").description("Rebuild the daemon search index").action(async () => {
194
- const { memoryRebuildCommand } = await import("./memory-TRDLADUM.js");
206
+ const { memoryRebuildCommand } = await import("./memory-DF7OUOTV.js");
195
207
  await memoryRebuildCommand();
196
208
  });
197
209
  memory.command("mcp").description("Show MCP server setup instructions").action(async () => {
198
- const { memoryMcpCommand } = await import("./memory-TRDLADUM.js");
210
+ const { memoryMcpCommand } = await import("./memory-DF7OUOTV.js");
199
211
  await memoryMcpCommand();
200
212
  });
201
213
  memory.command("rm").description("Remove a project database").option("--project-id <id>", "Project ID to remove").option("--all", "Remove all project databases").option(
@@ -203,17 +215,17 @@ memory.command("rm").description("Remove a project database").option("--project-
203
215
  "Remove orphaned projects (source dir missing or 0 memories)"
204
216
  ).action(
205
217
  async (opts) => {
206
- const { memoryRmCommand } = await import("./memory-TRDLADUM.js");
218
+ const { memoryRmCommand } = await import("./memory-DF7OUOTV.js");
207
219
  await memoryRmCommand(opts);
208
220
  }
209
221
  );
210
222
  var guide = program.command("guide").description("Manage custom skill guides");
211
223
  guide.command("create").description("Create a custom guide for a skill").argument("<skill-name>", "skill to create guide for (e.g. cf-commit)").action(async (skillName) => {
212
- const { guideCreateCommand } = await import("./guide-CO2V4ZLZ.js");
224
+ const { guideCreateCommand } = await import("./guide-HCR43LJN.js");
213
225
  guideCreateCommand(skillName);
214
226
  });
215
227
  guide.command("list").description("List existing custom guides").action(async () => {
216
- const { guideListCommand } = await import("./guide-CO2V4ZLZ.js");
228
+ const { guideListCommand } = await import("./guide-HCR43LJN.js");
217
229
  guideListCommand();
218
230
  });
219
231
  var dev = program.command("dev").description("Development mode commands");
@@ -229,28 +241,28 @@ Dev subcommands:
229
241
  dev update [path] Update local dev plugin to latest version`
230
242
  );
231
243
  dev.command("on").description("Switch to local plugin source").argument("[path]", "path to local coding-friend repo (default: cwd)").action(async (path) => {
232
- const { devOnCommand } = await import("./dev-IGHMMEP4.js");
244
+ const { devOnCommand } = await import("./dev-PTBNMKZT.js");
233
245
  await devOnCommand(path);
234
246
  });
235
247
  dev.command("off").description("Switch back to remote marketplace").action(async () => {
236
- const { devOffCommand } = await import("./dev-IGHMMEP4.js");
248
+ const { devOffCommand } = await import("./dev-PTBNMKZT.js");
237
249
  await devOffCommand();
238
250
  });
239
251
  dev.command("status").description("Show current dev mode").action(async () => {
240
- const { devStatusCommand } = await import("./dev-IGHMMEP4.js");
252
+ const { devStatusCommand } = await import("./dev-PTBNMKZT.js");
241
253
  await devStatusCommand();
242
254
  });
243
255
  dev.command("sync").description(
244
256
  "Copy local source files to plugin cache (no version bump needed)"
245
257
  ).action(async () => {
246
- const { devSyncCommand } = await import("./dev-IGHMMEP4.js");
258
+ const { devSyncCommand } = await import("./dev-PTBNMKZT.js");
247
259
  await devSyncCommand();
248
260
  });
249
261
  dev.command("restart").description("Reinstall local dev plugin (off + on)").argument(
250
262
  "[path]",
251
263
  "path to local coding-friend repo (default: saved path or cwd)"
252
264
  ).action(async (path) => {
253
- const { devRestartCommand } = await import("./dev-IGHMMEP4.js");
265
+ const { devRestartCommand } = await import("./dev-PTBNMKZT.js");
254
266
  await devRestartCommand(path);
255
267
  });
256
268
  dev.command("update").description(
@@ -259,13 +271,13 @@ dev.command("update").description(
259
271
  "[path]",
260
272
  "path to local coding-friend repo (default: saved path or cwd)"
261
273
  ).action(async (path) => {
262
- const { devUpdateCommand } = await import("./dev-IGHMMEP4.js");
274
+ const { devUpdateCommand } = await import("./dev-PTBNMKZT.js");
263
275
  await devUpdateCommand(path);
264
276
  });
265
277
  program.hook("postAction", async () => {
266
278
  const topCmd = process.argv[2];
267
279
  if (topCmd === "update") return;
268
- const { checkAndNotifyCliUpdate } = await import("./update-check-25SCLHZO.js");
280
+ const { checkAndNotifyCliUpdate } = await import("./update-check-7LKJLJPM.js");
269
281
  checkAndNotifyCliUpdate(pkg.version);
270
282
  });
271
283
  await program.parseAsync();