coding-friend-cli 1.36.0 → 1.36.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 (29) hide show
  1. package/dist/{chunk-DUKBBMVM.js → chunk-CDTQL4FI.js} +9 -5
  2. package/dist/{chunk-KIKN5HEH.js → chunk-EAJJVXAE.js} +9 -5
  3. package/dist/{chunk-PQUACN4U.js → chunk-MAGBNYZK.js} +4 -4
  4. package/dist/{chunk-GHR3TNL6.js → chunk-TPGAW67X.js} +35 -15
  5. package/dist/{chunk-7QFJODWB.js → chunk-VV2U7NDN.js} +5 -5
  6. package/dist/{clean-2IRHH4SU.js → clean-MXIMMXDH.js} +5 -5
  7. package/dist/{config-36YY3XLM.js → config-U3UYCC7M.js} +101 -13
  8. package/dist/{disable-35RSJICU.js → disable-HL5OEURT.js} +3 -3
  9. package/dist/{enable-RXWDQRIU.js → enable-CZIOCKKJ.js} +3 -3
  10. package/dist/{host-BYJEZN6T.js → host-PEKK7OOC.js} +5 -5
  11. package/dist/index.js +37 -37
  12. package/dist/{init-QXCMAPXT.js → init-GJ5II4WB.js} +121 -22
  13. package/dist/{install-NALHBTGG.js → install-VFMO45SP.js} +6 -6
  14. package/dist/{learn-PNG2TI2E.js → learn-QQ7XEHDY.js} +5 -5
  15. package/dist/{mcp-6GRHKIQW.js → mcp-372LGOZJ.js} +16 -16
  16. package/dist/{memory-A7OUTQ54.js → memory-XINRMEWB.js} +10 -8
  17. package/dist/{permission-PB3OMKRB.js → permission-I3OFJUYA.js} +11 -11
  18. package/dist/{session-YJJRGQPX.js → session-2R7WWNML.js} +4 -4
  19. package/dist/{status-SG5LCXER.js → status-Z4V7IYOB.js} +12 -12
  20. package/dist/{uninstall-JLSEHXS5.js → uninstall-ASLHT3MH.js} +5 -5
  21. package/dist/{update-MO5BT3C5.js → update-MY2DRJLV.js} +3 -3
  22. package/package.json +1 -1
  23. package/dist/{chunk-EFRPDFO7.js → chunk-IKLMHJH6.js} +3 -3
  24. package/dist/{chunk-TEC25H6C.js → chunk-YIXAQ4R2.js} +3 -3
  25. package/dist/{dev-JSYPSXEZ.js → dev-GKD52XE6.js} +4 -4
  26. package/dist/{guide-ECSMH2AT.js → guide-CO2V4ZLZ.js} +3 -3
  27. package/dist/{mcp-serve-learn-36ZQQQTF.js → mcp-serve-learn-OF3ZJUJC.js} +3 -3
  28. package/dist/{statusline-3Z4DE24F.js → statusline-WDTN3OI4.js} +2 -2
  29. package/dist/{update-check-I2RSVGFO.js → update-check-25SCLHZO.js} +3 -3
@@ -1,9 +1,6 @@
1
1
  import {
2
2
  DEFAULT_CONFIG
3
3
  } from "./chunk-57EGAXYI.js";
4
- import {
5
- log
6
- } from "./chunk-NREZK463.js";
7
4
  import {
8
5
  readJson
9
6
  } from "./chunk-5UVDWG5L.js";
@@ -12,6 +9,9 @@ import {
12
9
  localConfigPath,
13
10
  resolvePath
14
11
  } from "./chunk-X2H7JJMR.js";
12
+ import {
13
+ log
14
+ } from "./chunk-NREZK463.js";
15
15
 
16
16
  // src/lib/config.ts
17
17
  import { z } from "zod";
@@ -80,7 +80,9 @@ var ConfigSchema = z.strictObject({
80
80
  review: ReviewConfigSchema.optional(),
81
81
  autoApprove: z.boolean().optional(),
82
82
  autoApproveIgnore: z.array(z.string()).optional(),
83
- autoApproveAllowExtra: z.array(z.string()).optional()
83
+ autoApproveAllowExtra: z.array(z.string()).optional(),
84
+ disableGUIPlan: z.boolean().optional(),
85
+ guiPlanFormat: z.enum(["html", "md"]).optional()
84
86
  });
85
87
  var KNOWN_KEYS = [
86
88
  "language",
@@ -92,7 +94,9 @@ var KNOWN_KEYS = [
92
94
  "review",
93
95
  "autoApprove",
94
96
  "autoApproveIgnore",
95
- "autoApproveAllowExtra"
97
+ "autoApproveAllowExtra",
98
+ "disableGUIPlan",
99
+ "guiPlanFormat"
96
100
  ];
97
101
  function suggestKey(unknown) {
98
102
  let best = null;
@@ -7,23 +7,23 @@ import {
7
7
  } from "./chunk-667NMPN4.js";
8
8
  import {
9
9
  resolveScope
10
- } from "./chunk-EFRPDFO7.js";
10
+ } from "./chunk-IKLMHJH6.js";
11
11
  import {
12
12
  commandExists,
13
13
  run,
14
14
  runWithStderr,
15
15
  sleepSync
16
16
  } from "./chunk-EVGXUDX4.js";
17
- import {
18
- log,
19
- printBanner
20
- } from "./chunk-NREZK463.js";
21
17
  import {
22
18
  readJson
23
19
  } from "./chunk-5UVDWG5L.js";
24
20
  import {
25
21
  claudeSettingsPath
26
22
  } from "./chunk-X2H7JJMR.js";
23
+ import {
24
+ log,
25
+ printBanner
26
+ } from "./chunk-NREZK463.js";
27
27
 
28
28
  // src/commands/update.ts
29
29
  import { readFileSync } from "fs";
@@ -248,6 +248,10 @@ async function updateCommand(opts) {
248
248
  }
249
249
  }
250
250
  }
251
+ if (doCli) {
252
+ const { refreshMemoryAfterUpdate } = await import("./memory-XINRMEWB.js");
253
+ await refreshMemoryAfterUpdate();
254
+ }
251
255
  if (doStatusline) {
252
256
  const updatedVersion = ensureStatusline();
253
257
  if (updatedVersion) {
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  writeMemoryMcpEntry
3
- } from "./chunk-7QFJODWB.js";
4
- import {
5
- log
6
- } from "./chunk-NREZK463.js";
3
+ } from "./chunk-VV2U7NDN.js";
7
4
  import {
8
5
  readJson
9
6
  } from "./chunk-5UVDWG5L.js";
7
+ import {
8
+ log
9
+ } from "./chunk-NREZK463.js";
10
10
 
11
11
  // src/lib/mcp-state.ts
12
12
  import { existsSync } from "fs";
@@ -2,30 +2,26 @@ import {
2
2
  checkMemoryMcpHealth,
3
3
  printHealthSection,
4
4
  warnStaleMcpJson
5
- } from "./chunk-PQUACN4U.js";
5
+ } from "./chunk-MAGBNYZK.js";
6
6
  import {
7
7
  getMemoryMcpStatus,
8
8
  memoryConfigMenu,
9
9
  writeMemoryMcpEntry
10
- } from "./chunk-7QFJODWB.js";
10
+ } from "./chunk-VV2U7NDN.js";
11
11
  import {
12
12
  loadConfig,
13
13
  resolveMemoryDir
14
- } from "./chunk-DUKBBMVM.js";
14
+ } from "./chunk-CDTQL4FI.js";
15
15
  import {
16
16
  getLibPath
17
17
  } from "./chunk-RZRT7NGT.js";
18
18
  import {
19
19
  showConfigHint
20
- } from "./chunk-EFRPDFO7.js";
20
+ } from "./chunk-IKLMHJH6.js";
21
21
  import {
22
22
  run,
23
23
  runWithStderr
24
24
  } from "./chunk-EVGXUDX4.js";
25
- import {
26
- log,
27
- printBanner
28
- } from "./chunk-NREZK463.js";
29
25
  import {
30
26
  mergeJson,
31
27
  readJson
@@ -34,6 +30,10 @@ import {
34
30
  globalConfigPath,
35
31
  localConfigPath
36
32
  } from "./chunk-X2H7JJMR.js";
33
+ import {
34
+ log,
35
+ printBanner
36
+ } from "./chunk-NREZK463.js";
37
37
 
38
38
  // src/commands/memory.ts
39
39
  import { existsSync, readdirSync, statSync, rmSync } from "fs";
@@ -65,14 +65,19 @@ function truncateError(text) {
65
65
  const skipped = lines.length - 28;
66
66
  return [...head, ` ... (${skipped} lines omitted) ...`, ...tail].join("\n");
67
67
  }
68
- function ensureMemoryBuilt(mcpDir) {
68
+ function ensureMemoryBuilt(mcpDir, opts) {
69
+ const exitOnError = opts?.exitOnError ?? true;
70
+ const fail = (msg, stderr) => {
71
+ log.error(msg);
72
+ if (stderr) log.error(truncateError(stderr));
73
+ if (exitOnError) process.exit(1);
74
+ return false;
75
+ };
69
76
  if (!existsSync(join(mcpDir, "node_modules"))) {
70
77
  log.step("Installing memory server dependencies (one-time setup)...");
71
78
  const result = runWithStderr("npm", ["install"], { cwd: mcpDir });
72
79
  if (result.exitCode !== 0) {
73
- log.error("Failed to install dependencies");
74
- if (result.stderr) log.error(truncateError(result.stderr));
75
- process.exit(1);
80
+ return fail("Failed to install dependencies", result.stderr);
76
81
  }
77
82
  log.success("Done.");
78
83
  }
@@ -80,12 +85,26 @@ function ensureMemoryBuilt(mcpDir) {
80
85
  log.step("Building memory server...");
81
86
  const result = runWithStderr("npm", ["run", "build"], { cwd: mcpDir });
82
87
  if (result.exitCode !== 0) {
83
- log.error("Failed to build memory server");
84
- if (result.stderr) log.error(truncateError(result.stderr));
85
- process.exit(1);
88
+ return fail("Failed to build memory server", result.stderr);
86
89
  }
87
90
  log.success("Done.");
88
91
  }
92
+ return true;
93
+ }
94
+ async function refreshMemoryAfterUpdate() {
95
+ try {
96
+ if (!isMemoryInitialized()) return;
97
+ const mcpDir = getLibPath("cf-memory");
98
+ log.step("Ensuring memory server is built...");
99
+ const built = ensureMemoryBuilt(mcpDir, { exitOnError: false });
100
+ if (built) {
101
+ log.success("Memory server ready.");
102
+ } else {
103
+ log.warn('Memory server build failed \u2014 run "cf memory status" to retry.');
104
+ }
105
+ } catch {
106
+ log.warn('Could not refresh memory server \u2014 run "cf memory status" to retry.');
107
+ }
89
108
  }
90
109
  function printMemoryMcpConfig(memoryDir) {
91
110
  console.log(chalk.dim("Add this to your MCP client config:"));
@@ -855,6 +874,7 @@ async function memoryMcpCommand() {
855
874
 
856
875
  export {
857
876
  ensureMemoryBuilt,
877
+ refreshMemoryAfterUpdate,
858
878
  printMemoryMcpConfig,
859
879
  memoryStatusCommand,
860
880
  memorySearchCommand,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveMemoryDir
3
- } from "./chunk-DUKBBMVM.js";
3
+ } from "./chunk-CDTQL4FI.js";
4
4
  import {
5
5
  getLibPath
6
6
  } from "./chunk-RZRT7NGT.js";
@@ -9,10 +9,7 @@ import {
9
9
  askScope,
10
10
  formatScopeLabel,
11
11
  injectBackChoice
12
- } from "./chunk-EFRPDFO7.js";
13
- import {
14
- log
15
- } from "./chunk-NREZK463.js";
12
+ } from "./chunk-IKLMHJH6.js";
16
13
  import {
17
14
  mergeJson,
18
15
  readJson,
@@ -23,6 +20,9 @@ import {
23
20
  globalConfigPath,
24
21
  localConfigPath
25
22
  } from "./chunk-X2H7JJMR.js";
23
+ import {
24
+ log
25
+ } from "./chunk-NREZK463.js";
26
26
 
27
27
  // src/lib/memory-prompts.ts
28
28
  import { confirm, input, select } from "@inquirer/prompts";
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  loadConfig,
3
3
  resolveMemoryDir
4
- } from "./chunk-DUKBBMVM.js";
4
+ } from "./chunk-CDTQL4FI.js";
5
5
  import "./chunk-57EGAXYI.js";
6
- import {
7
- log,
8
- printBanner
9
- } from "./chunk-NREZK463.js";
10
6
  import "./chunk-5UVDWG5L.js";
11
7
  import {
12
8
  resolvePath
13
9
  } from "./chunk-X2H7JJMR.js";
10
+ import {
11
+ log,
12
+ printBanner
13
+ } from "./chunk-NREZK463.js";
14
14
 
15
15
  // src/commands/clean.ts
16
16
  import { existsSync, readdirSync, rmSync, statSync } from "fs";
@@ -1,16 +1,20 @@
1
+ import {
2
+ getAllRules,
3
+ getExistingRules
4
+ } from "./chunk-O5ZKLFSL.js";
1
5
  import {
2
6
  listMdFilesRecursive
3
7
  } from "./chunk-2DTXVMPQ.js";
4
8
  import {
5
9
  registerLearnMcp,
6
10
  unregisterLearnMcp
7
- } from "./chunk-TEC25H6C.js";
11
+ } from "./chunk-YIXAQ4R2.js";
8
12
  import {
9
13
  memoryConfigMenu
10
- } from "./chunk-7QFJODWB.js";
14
+ } from "./chunk-VV2U7NDN.js";
11
15
  import {
12
16
  resolveLearnDir
13
- } from "./chunk-DUKBBMVM.js";
17
+ } from "./chunk-CDTQL4FI.js";
14
18
  import "./chunk-RZRT7NGT.js";
15
19
  import {
16
20
  findStatuslineHookPath,
@@ -41,16 +45,8 @@ import {
41
45
  getScopeLabel,
42
46
  injectBackChoice,
43
47
  showConfigHint
44
- } from "./chunk-EFRPDFO7.js";
48
+ } from "./chunk-IKLMHJH6.js";
45
49
  import "./chunk-EVGXUDX4.js";
46
- import {
47
- log,
48
- printBanner
49
- } from "./chunk-NREZK463.js";
50
- import {
51
- getAllRules,
52
- getExistingRules
53
- } from "./chunk-O5ZKLFSL.js";
54
50
  import {
55
51
  mergeJson,
56
52
  readJson
@@ -63,6 +59,10 @@ import {
63
59
  localConfigPath,
64
60
  resolvePath
65
61
  } from "./chunk-X2H7JJMR.js";
62
+ import {
63
+ log,
64
+ printBanner
65
+ } from "./chunk-NREZK463.js";
66
66
 
67
67
  // src/commands/config.ts
68
68
  import { checkbox, confirm, input, select } from "@inquirer/prompts";
@@ -432,6 +432,85 @@ async function learnSubMenu() {
432
432
  }
433
433
  }
434
434
  }
435
+ async function editDisableGUIPlan(globalCfg, localCfg) {
436
+ const currentValue = getMergedValue("disableGUIPlan", globalCfg, localCfg);
437
+ if (currentValue !== void 0) {
438
+ log.dim(`Current: ${currentValue}`);
439
+ }
440
+ const value = await confirm({
441
+ message: "Disable the human overview doc that /cf-plan generates alongside the agent plan?",
442
+ default: currentValue ?? false
443
+ });
444
+ const scope = await askScope();
445
+ if (scope === "back") return;
446
+ writeToScope(scope, { disableGUIPlan: value });
447
+ }
448
+ async function editGuiPlanFormat(globalCfg, localCfg) {
449
+ const currentValue = getMergedValue(
450
+ "guiPlanFormat",
451
+ globalCfg,
452
+ localCfg
453
+ );
454
+ if (currentValue !== void 0) {
455
+ log.dim(`Current: ${currentValue}`);
456
+ }
457
+ const choice = await select({
458
+ message: "Format for the /cf-plan human overview doc?",
459
+ choices: injectBackChoice(
460
+ [
461
+ { name: "HTML", value: "html" },
462
+ { name: "Markdown", value: "md" }
463
+ ],
464
+ "Back"
465
+ ),
466
+ default: currentValue ?? "html"
467
+ });
468
+ if (choice === BACK) return;
469
+ const scope = await askScope();
470
+ if (scope === "back") return;
471
+ writeToScope(scope, { guiPlanFormat: choice });
472
+ }
473
+ async function planDocsSubMenu() {
474
+ while (true) {
475
+ const globalCfg = readJson(globalConfigPath());
476
+ const localCfg = readJson(localConfigPath());
477
+ const disableVal = getMergedValue(
478
+ "disableGUIPlan",
479
+ globalCfg,
480
+ localCfg
481
+ );
482
+ const formatVal = getMergedValue(
483
+ "guiPlanFormat",
484
+ globalCfg,
485
+ localCfg
486
+ );
487
+ const choice = await select({
488
+ message: "Plan docs settings:",
489
+ choices: injectBackChoice(
490
+ [
491
+ {
492
+ name: `Disable overview doc (${disableVal ?? false})`,
493
+ value: "disableGUIPlan"
494
+ },
495
+ {
496
+ name: `Format (${formatVal ?? "html"})`,
497
+ value: "guiPlanFormat"
498
+ }
499
+ ],
500
+ "Back"
501
+ )
502
+ });
503
+ if (choice === BACK) return;
504
+ switch (choice) {
505
+ case "disableGUIPlan":
506
+ await editDisableGUIPlan(globalCfg, localCfg);
507
+ break;
508
+ case "guiPlanFormat":
509
+ await editGuiPlanFormat(globalCfg, localCfg);
510
+ break;
511
+ }
512
+ }
513
+ }
435
514
  async function editTdd(globalCfg, localCfg) {
436
515
  const currentValue = getMergedValue("tdd", globalCfg, localCfg);
437
516
  if (currentValue !== void 0) {
@@ -668,7 +747,7 @@ async function editPermissions() {
668
747
  )
669
748
  });
670
749
  if (choice === BACK) return;
671
- const { permissionCommand } = await import("./permission-PB3OMKRB.js");
750
+ const { permissionCommand } = await import("./permission-I3OFJUYA.js");
672
751
  switch (choice) {
673
752
  case "interactive":
674
753
  await permissionCommand({});
@@ -705,6 +784,7 @@ async function configCommand() {
705
784
  );
706
785
  const reviewScope = getScopeLabel("review", globalCfg, localCfg);
707
786
  const withCodexVal = getMergedValue("review", globalCfg, localCfg)?.withCodex;
787
+ const planDocsScope = getScopeLabel("disableGUIPlan", globalCfg, localCfg);
708
788
  const statuslineStatus = isStatuslineConfigured() ? chalk.green("configured") : chalk.yellow("not configured");
709
789
  const completionStatus = hasShellCompletion() ? chalk.green("installed") : chalk.yellow("not installed");
710
790
  const projectRules = getExistingRules(claudeLocalSettingsPath());
@@ -755,6 +835,11 @@ async function configCommand() {
755
835
  value: "review",
756
836
  description: " Run a Codex second-opinion review alongside Claude's on every /cf-review"
757
837
  },
838
+ {
839
+ name: `Plan docs ${formatScopeLabel(planDocsScope)}`,
840
+ value: "planDocs",
841
+ description: " Human overview doc generated by /cf-plan \u2014 enable/disable + format (html/md)"
842
+ },
758
843
  {
759
844
  name: `Statusline (${statuslineStatus})`,
760
845
  value: "statusline",
@@ -804,6 +889,9 @@ async function configCommand() {
804
889
  case "review":
805
890
  await editReviewWithCodex(globalCfg, localCfg);
806
891
  break;
892
+ case "planDocs":
893
+ await planDocsSubMenu();
894
+ break;
807
895
  case "statusline":
808
896
  await editStatusline();
809
897
  break;
@@ -4,13 +4,13 @@ import {
4
4
  } from "./chunk-GZT3YPAP.js";
5
5
  import {
6
6
  resolveScope
7
- } from "./chunk-EFRPDFO7.js";
7
+ } from "./chunk-IKLMHJH6.js";
8
8
  import "./chunk-EVGXUDX4.js";
9
+ import "./chunk-5UVDWG5L.js";
10
+ import "./chunk-X2H7JJMR.js";
9
11
  import {
10
12
  log
11
13
  } from "./chunk-NREZK463.js";
12
- import "./chunk-5UVDWG5L.js";
13
- import "./chunk-X2H7JJMR.js";
14
14
 
15
15
  // src/commands/disable.ts
16
16
  import chalk from "chalk";
@@ -4,13 +4,13 @@ import {
4
4
  } from "./chunk-GZT3YPAP.js";
5
5
  import {
6
6
  resolveScope
7
- } from "./chunk-EFRPDFO7.js";
7
+ } from "./chunk-IKLMHJH6.js";
8
8
  import "./chunk-EVGXUDX4.js";
9
+ import "./chunk-5UVDWG5L.js";
10
+ import "./chunk-X2H7JJMR.js";
9
11
  import {
10
12
  log
11
13
  } from "./chunk-NREZK463.js";
12
- import "./chunk-5UVDWG5L.js";
13
- import "./chunk-X2H7JJMR.js";
14
14
 
15
15
  // src/commands/enable.ts
16
16
  import chalk from "chalk";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveLearnDir
3
- } from "./chunk-DUKBBMVM.js";
3
+ } from "./chunk-CDTQL4FI.js";
4
4
  import {
5
5
  getLibPath
6
6
  } from "./chunk-RZRT7NGT.js";
@@ -9,16 +9,16 @@ import {
9
9
  run,
10
10
  streamExec
11
11
  } from "./chunk-EVGXUDX4.js";
12
- import {
13
- log,
14
- printBanner
15
- } from "./chunk-NREZK463.js";
16
12
  import {
17
13
  readJson
18
14
  } from "./chunk-5UVDWG5L.js";
19
15
  import {
20
16
  globalConfigPath
21
17
  } from "./chunk-X2H7JJMR.js";
18
+ import {
19
+ log,
20
+ printBanner
21
+ } from "./chunk-NREZK463.js";
22
22
 
23
23
  // src/commands/host.ts
24
24
  import { existsSync, readdirSync } from "fs";