coding-friend-cli 1.37.0 → 1.38.1

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-DP6DFQ4G.js → chunk-BXSCYGWE.js} +2 -2
  6. package/dist/{chunk-W6D3J5DX.js → chunk-CGEMETKQ.js} +8 -6
  7. package/dist/{chunk-XEKQW4RN.js → chunk-ETTZRJ55.js} +1 -1
  8. package/dist/{chunk-IKLMHJH6.js → chunk-GIH6E7GJ.js} +62 -1
  9. package/dist/{chunk-6S7352JG.js → chunk-ONG4KRYP.js} +1 -1
  10. package/dist/{chunk-X2H7JJMR.js → chunk-PLSJW7QJ.js} +29 -1
  11. package/dist/{chunk-O5ZKLFSL.js → chunk-RCE4OWNX.js} +1 -1
  12. package/dist/{chunk-PI4P34KF.js → chunk-RFNKPAJW.js} +3 -1
  13. package/dist/{chunk-676YCW6T.js → chunk-XAYWGZQT.js} +101 -8
  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-3YEPLDMD.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-6HQRVZKR.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-SMWXKJ3R.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
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ensureStatusline,
3
3
  getInstalledVersion
4
- } from "./chunk-XEKQW4RN.js";
4
+ } from "./chunk-ETTZRJ55.js";
5
5
  import {
6
6
  ensureShellCompletion
7
7
  } from "./chunk-667NMPN4.js";
@@ -9,10 +9,15 @@ import {
9
9
  isMemoryMcpRegistered,
10
10
  registerMemoryMcp,
11
11
  removeMemoryMcpEntry
12
- } from "./chunk-DP6DFQ4G.js";
12
+ } from "./chunk-BXSCYGWE.js";
13
13
  import {
14
+ CODEX_MARKETPLACE_NAME,
15
+ getCodexInstalledVersion
16
+ } from "./chunk-5QCGEPQO.js";
17
+ import {
18
+ resolveHostFlags,
14
19
  resolveScope
15
- } from "./chunk-IKLMHJH6.js";
20
+ } from "./chunk-GIH6E7GJ.js";
16
21
  import {
17
22
  commandExists,
18
23
  run,
@@ -24,7 +29,7 @@ import {
24
29
  } from "./chunk-5UVDWG5L.js";
25
30
  import {
26
31
  claudeSettingsPath
27
- } from "./chunk-X2H7JJMR.js";
32
+ } from "./chunk-PLSJW7QJ.js";
28
33
  import {
29
34
  log,
30
35
  printBanner
@@ -94,6 +99,11 @@ function getStatuslineVersion() {
94
99
  return match?.[1]?.replace(/^v/, "") ?? null;
95
100
  }
96
101
  async function updateCommand(opts) {
102
+ const { host } = resolveHostFlags(opts);
103
+ if (host === "codex") {
104
+ await updateCodexCommand(opts);
105
+ return;
106
+ }
97
107
  const updateAll = !opts.cli && !opts.plugin && !opts.statusline;
98
108
  const doCli = updateAll || !!opts.cli;
99
109
  const doPlugin = updateAll || !!opts.plugin;
@@ -223,7 +233,9 @@ async function updateCommand(opts) {
223
233
  }
224
234
  }
225
235
  }
236
+ let refreshMemoryAfterUpdate = null;
226
237
  if (doCli) {
238
+ ({ refreshMemoryAfterUpdate } = await import("./memory-DF7OUOTV.js"));
227
239
  if (!latestCliVersion) {
228
240
  log.warn("Cannot check latest CLI version from npm.");
229
241
  } else {
@@ -253,8 +265,7 @@ async function updateCommand(opts) {
253
265
  }
254
266
  }
255
267
  }
256
- if (doCli) {
257
- const { refreshMemoryAfterUpdate } = await import("./memory-TRDLADUM.js");
268
+ if (doCli && refreshMemoryAfterUpdate) {
258
269
  await refreshMemoryAfterUpdate();
259
270
  }
260
271
  if (!isMemoryMcpRegistered()) {
@@ -263,9 +274,13 @@ async function updateCommand(opts) {
263
274
  const migrationResult = removeMemoryMcpEntry();
264
275
  if (migrationResult.removed) {
265
276
  if (migrationResult.fileDeleted) {
266
- log.success("Removed legacy project-scope coding-friend-memory from .mcp.json (file deleted \u2014 was empty).");
277
+ log.success(
278
+ "Removed legacy project-scope coding-friend-memory from .mcp.json (file deleted \u2014 was empty)."
279
+ );
267
280
  } else {
268
- log.success("Removed legacy project-scope coding-friend-memory from .mcp.json");
281
+ log.success(
282
+ "Removed legacy project-scope coding-friend-memory from .mcp.json"
283
+ );
269
284
  }
270
285
  }
271
286
  if (doStatusline) {
@@ -278,6 +293,84 @@ async function updateCommand(opts) {
278
293
  console.log();
279
294
  log.dim("Restart Claude Code (or start a new session) to see changes.");
280
295
  }
296
+ async function updateCodexCommand(opts) {
297
+ const updateAll = !opts.cli && !opts.plugin && !opts.statusline;
298
+ const doCli = updateAll || !!opts.cli;
299
+ const doPlugin = updateAll || !!opts.plugin;
300
+ printBanner("\u2728 Coding Friend Codex Update \u2728");
301
+ console.log();
302
+ if (doPlugin) {
303
+ const beforeVersion = getCodexInstalledVersion();
304
+ console.log(
305
+ ` Plugin ${beforeVersion ? beforeVersion : chalk.dim("not installed")}`
306
+ );
307
+ if (!commandExists("codex")) {
308
+ log.error("Codex CLI not found. Cannot update Codex plugin.");
309
+ } else {
310
+ log.step("Updating Codex marketplace...");
311
+ const result = runWithStderr("codex", [
312
+ "plugin",
313
+ "marketplace",
314
+ "upgrade",
315
+ CODEX_MARKETPLACE_NAME
316
+ ]);
317
+ if (result.exitCode !== 0) {
318
+ log.error(
319
+ `Codex marketplace upgrade failed. Try manually: codex plugin marketplace upgrade ${CODEX_MARKETPLACE_NAME}`
320
+ );
321
+ if (result.stderr) log.dim(`stderr: ${result.stderr}`);
322
+ } else {
323
+ const afterVersion = getCodexInstalledVersion();
324
+ if (afterVersion && afterVersion !== beforeVersion) {
325
+ log.success(
326
+ `Codex plugin updated to ${chalk.green(`v${afterVersion}`)}.`
327
+ );
328
+ } else if (afterVersion) {
329
+ log.success(
330
+ `Codex plugin is installed at ${chalk.green(`v${afterVersion}`)}.`
331
+ );
332
+ } else {
333
+ log.warn(
334
+ "Marketplace updated, but coding-friend is not installed yet. Open Codex and run /plugins to install it."
335
+ );
336
+ }
337
+ }
338
+ }
339
+ }
340
+ if (doCli) {
341
+ const cliVersion = getCliVersion();
342
+ const latestCliVersion = getLatestCliVersion();
343
+ if (!latestCliVersion) {
344
+ log.warn("Cannot check latest CLI version from npm.");
345
+ } else {
346
+ const cmp = semverCompare(cliVersion, latestCliVersion);
347
+ if (cmp < 0) {
348
+ log.step(
349
+ `CLI update available: ${chalk.yellow(`v${cliVersion}`)} \u2192 ${chalk.green(`v${latestCliVersion}`)}`
350
+ );
351
+ const result = run("npm", [
352
+ "install",
353
+ "-g",
354
+ "coding-friend-cli@latest"
355
+ ]);
356
+ if (result === null) {
357
+ log.error(
358
+ "CLI update failed. Try manually: npm install -g coding-friend-cli@latest"
359
+ );
360
+ } else {
361
+ log.success(`CLI updated to ${chalk.green(`v${latestCliVersion}`)}`);
362
+ }
363
+ }
364
+ }
365
+ }
366
+ if (opts.statusline) {
367
+ log.warn(
368
+ "Codex owns its TUI footer. Open Codex and run /statusline to configure it."
369
+ );
370
+ }
371
+ console.log();
372
+ log.dim("Restart Codex CLI (or start a new session) to see changes.");
373
+ }
281
374
 
282
375
  export {
283
376
  semverCompare,
@@ -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