coding-friend-cli 1.38.3 → 1.39.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/dist/{chunk-32UAW3NX.js → chunk-2EY7VVFT.js} +1 -1
  2. package/dist/{chunk-RCE4OWNX.js → chunk-463QKRBN.js} +1 -1
  3. package/dist/{chunk-ETTZRJ55.js → chunk-4CPUWHIN.js} +1 -1
  4. package/dist/{chunk-6NXZKAOV.js → chunk-7JQZRMOG.js} +37 -4
  5. package/dist/{chunk-5KHZQCZB.js → chunk-FQUIO5BW.js} +1 -1
  6. package/dist/chunk-GTOEIGDM.js +510 -0
  7. package/dist/{chunk-PLSJW7QJ.js → chunk-IV5OPG34.js} +47 -1
  8. package/dist/{chunk-5QCGEPQO.js → chunk-JSH6BMVZ.js} +1 -1
  9. package/dist/{chunk-S4ENKXXC.js → chunk-ODW27NAC.js} +8 -8
  10. package/dist/chunk-OFEC6OVI.js +99 -0
  11. package/dist/{chunk-GIH6E7GJ.js → chunk-VMODQCSL.js} +4 -53
  12. package/dist/{chunk-I2DQYPKT.js → chunk-WJHQUCOF.js} +162 -17
  13. package/dist/{chunk-VHUU3QDC.js → chunk-YPW67OGP.js} +1 -1
  14. package/dist/{chunk-BXSCYGWE.js → chunk-ZGIUKUL2.js} +51 -6
  15. package/dist/chunk-ZZNTNIM4.js +63 -0
  16. package/dist/{clean-BJSNDUPN.js → clean-LPWEBJJ5.js} +45 -7
  17. package/dist/{config-EX3B3HWO.js → config-VNSC2NAY.js} +15 -13
  18. package/dist/{dev-PTBNMKZT.js → dev-NRTDUQAR.js} +3 -3
  19. package/dist/{disable-MO7AXYYF.js → disable-NROSQUHR.js} +19 -4
  20. package/dist/{enable-4GXLQEHD.js → enable-26FFJGX5.js} +24 -4
  21. package/dist/{guide-HCR43LJN.js → guide-HCLEOAGR.js} +1 -1
  22. package/dist/{host-VIQ5YI3V.js → host-2JOPHLN3.js} +4 -3
  23. package/dist/index.js +46 -46
  24. package/dist/{init-S2K4CQO2.js → init-MHHII5EP.js} +54 -18
  25. package/dist/{install-LUPE3VTC.js → install-OEFJLAWA.js} +52 -9
  26. package/dist/{learn-A3TP6PLL.js → learn-SSNBBDY3.js} +2 -2
  27. package/dist/{mcp-QNJTCZMS.js → mcp-J5VO3OH7.js} +13 -11
  28. package/dist/{mcp-serve-4VP4KDYG.js → mcp-serve-55DSE2J4.js} +4 -3
  29. package/dist/{mcp-serve-learn-UVXIDOEZ.js → mcp-serve-learn-EDBWNL4I.js} +3 -2
  30. package/dist/{memory-7GKTQSIW.js → memory-CDZKWOFL.js} +9 -7
  31. package/dist/{permission-VISPGMUK.js → permission-DPKPA2HU.js} +11 -3
  32. package/dist/{permissions-2SBACQHV.js → permissions-HZYUVKCY.js} +2 -2
  33. package/dist/{session-VDGNTICO.js → session-YWJDLNBP.js} +2 -2
  34. package/dist/{status-RHSL5MBU.js → status-4WMIQL7L.js} +18 -16
  35. package/dist/{statusline-AOZHEQSV.js → statusline-R5BNYK3H.js} +2 -2
  36. package/dist/{uninstall-QN6527IR.js → uninstall-EV7362NK.js} +52 -8
  37. package/dist/{update-ZQG25VOJ.js → update-YQBBAIIF.js} +10 -7
  38. package/dist/{update-check-7LKJLJPM.js → update-check-EJSGVGO6.js} +1 -1
  39. package/package.json +1 -1
  40. package/dist/chunk-RZRT7NGT.js +0 -18
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  loadConfig,
3
3
  resolveMemoryDir
4
- } from "./chunk-5KHZQCZB.js";
4
+ } from "./chunk-FQUIO5BW.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-PLSJW7QJ.js";
10
+ } from "./chunk-IV5OPG34.js";
11
11
  import {
12
12
  log,
13
13
  printBanner
14
14
  } from "./chunk-NREZK463.js";
15
15
 
16
16
  // src/commands/clean.ts
17
- import { existsSync, readdirSync, rmSync, statSync } from "fs";
17
+ import { existsSync, readFileSync, readdirSync, rmSync, statSync } from "fs";
18
18
  import { join, relative } from "path";
19
19
  import { confirm, input, select } from "@inquirer/prompts";
20
20
  import chalk from "chalk";
@@ -55,6 +55,32 @@ function matchesRange(entryPath, name, range, cutoff, now) {
55
55
  return cutoff !== null && date.getTime() < cutoff.getTime();
56
56
  }
57
57
  }
58
+ var STATUS_RE = /^status:\s*([^\s#]+)/m;
59
+ function readPlanStatus(entryPath, isDirectory) {
60
+ let file;
61
+ if (isDirectory) {
62
+ file = join(entryPath, "README.md");
63
+ } else if (entryPath.endsWith(".md")) {
64
+ file = entryPath;
65
+ } else {
66
+ return null;
67
+ }
68
+ if (!existsSync(file)) return null;
69
+ try {
70
+ const content = readFileSync(file, "utf8");
71
+ if (!content.startsWith("---")) return null;
72
+ const end = content.indexOf("\n---", 3);
73
+ if (end === -1) return null;
74
+ const frontmatter = content.slice(3, end);
75
+ const m = STATUS_RE.exec(frontmatter);
76
+ return m ? m[1].trim().toLowerCase() : null;
77
+ } catch {
78
+ return null;
79
+ }
80
+ }
81
+ function isDonePlan(entryPath, isDirectory) {
82
+ return readPlanStatus(entryPath, isDirectory) === "done";
83
+ }
58
84
  function countFiles(dir) {
59
85
  if (!existsSync(dir)) return 0;
60
86
  let count = 0;
@@ -68,12 +94,13 @@ function countFiles(dir) {
68
94
  }
69
95
  return count;
70
96
  }
71
- function deleteMatchingEntries(dir, range, cutoff, now) {
97
+ function deleteMatchingEntries(dir, range, cutoff, now, extraFilter) {
72
98
  if (!existsSync(dir)) return { deleted: 0, failed: 0 };
73
99
  let deleted = 0;
74
100
  let failed = 0;
75
101
  for (const entry of readdirSync(dir, { withFileTypes: true })) {
76
102
  const entryPath = join(dir, entry.name);
103
+ if (extraFilter && !extraFilter(entryPath, entry.isDirectory())) continue;
77
104
  if (matchesRange(entryPath, entry.name, range, cutoff, now)) {
78
105
  const filesBefore = entry.isDirectory() ? countFiles(entryPath) : 1;
79
106
  try {
@@ -147,7 +174,15 @@ async function cleanCommand() {
147
174
  console.log(`${chalk.yellow("\u2192")} ${chalk.bold(entry.key)} (${relPath})`);
148
175
  const { range, cutoff } = await promptDateRange();
149
176
  const isMemory = entry.key === "memory";
150
- const message = isMemory ? `Delete matching contents of ${relPath}/? (includes SQLite databases \u2014 stop memory daemon first if running)` : `Delete matching contents of ${relPath}/?`;
177
+ const isPlans = entry.key === "plans";
178
+ let message;
179
+ if (isMemory) {
180
+ message = `Delete matching contents of ${relPath}/? (includes SQLite databases \u2014 stop memory daemon first if running)`;
181
+ } else if (isPlans) {
182
+ message = `Delete matching plans in ${relPath}/? (only plans with frontmatter status: done are removed \u2014 in-progress/failed plans are kept)`;
183
+ } else {
184
+ message = `Delete matching contents of ${relPath}/?`;
185
+ }
151
186
  const ok = await confirm({ message, default: false });
152
187
  if (ok) {
153
188
  const now = /* @__PURE__ */ new Date();
@@ -155,7 +190,8 @@ async function cleanCommand() {
155
190
  entry.path,
156
191
  range,
157
192
  cutoff,
158
- now
193
+ now,
194
+ isPlans ? isDonePlan : void 0
159
195
  );
160
196
  summary.push({ key: entry.key, deleted });
161
197
  const failNote = failed > 0 ? `, ${failed} failed` : "";
@@ -181,7 +217,9 @@ async function cleanCommand() {
181
217
  export {
182
218
  cleanCommand,
183
219
  getEffectiveDate,
220
+ isDonePlan,
184
221
  matchesRange,
185
222
  olderThanDays,
186
- parseDateFromName
223
+ parseDateFromName,
224
+ readPlanStatus
187
225
  };
@@ -1,17 +1,13 @@
1
1
  import {
2
2
  getAllRules,
3
3
  getExistingRules
4
- } from "./chunk-RCE4OWNX.js";
4
+ } from "./chunk-463QKRBN.js";
5
5
  import {
6
6
  listMdFilesRecursive
7
7
  } from "./chunk-2DTXVMPQ.js";
8
- import {
9
- registerLearnMcp,
10
- unregisterLearnMcp
11
- } from "./chunk-6NXZKAOV.js";
12
8
  import {
13
9
  resolveLearnDir
14
- } from "./chunk-5KHZQCZB.js";
10
+ } from "./chunk-FQUIO5BW.js";
15
11
  import {
16
12
  findStatuslineHookPath,
17
13
  getCurrentAccountEmail,
@@ -22,11 +18,15 @@ import {
22
18
  saveStatuslineConfig,
23
19
  selectStatuslineComponents,
24
20
  writeStatuslineSettings
25
- } from "./chunk-ETTZRJ55.js";
21
+ } from "./chunk-4CPUWHIN.js";
26
22
  import {
27
23
  ALL_COMPONENT_IDS,
28
24
  DEFAULT_CONFIG
29
25
  } from "./chunk-3WIZA5OZ.js";
26
+ import {
27
+ registerLearnMcp,
28
+ unregisterLearnMcp
29
+ } from "./chunk-7JQZRMOG.js";
30
30
  import {
31
31
  ensureShellCompletion,
32
32
  hasShellCompletion,
@@ -34,8 +34,8 @@ import {
34
34
  } from "./chunk-667NMPN4.js";
35
35
  import {
36
36
  memoryConfigMenu
37
- } from "./chunk-BXSCYGWE.js";
38
- import "./chunk-RZRT7NGT.js";
37
+ } from "./chunk-ZGIUKUL2.js";
38
+ import "./chunk-GTOEIGDM.js";
39
39
  import {
40
40
  BACK,
41
41
  applyDocsDirChange,
@@ -45,7 +45,9 @@ import {
45
45
  getScopeLabel,
46
46
  injectBackChoice,
47
47
  showConfigHint
48
- } from "./chunk-GIH6E7GJ.js";
48
+ } from "./chunk-VMODQCSL.js";
49
+ import "./chunk-ZZNTNIM4.js";
50
+ import "./chunk-OFEC6OVI.js";
49
51
  import "./chunk-EVGXUDX4.js";
50
52
  import {
51
53
  mergeJson,
@@ -58,7 +60,7 @@ import {
58
60
  globalConfigPath,
59
61
  localConfigPath,
60
62
  resolvePath
61
- } from "./chunk-PLSJW7QJ.js";
63
+ } from "./chunk-IV5OPG34.js";
62
64
  import {
63
65
  log,
64
66
  printBanner
@@ -541,7 +543,7 @@ async function editAutoApprove(globalCfg, localCfg) {
541
543
  if (scope === "back") return;
542
544
  writeToScope(scope, { autoApprove: value });
543
545
  if (value) {
544
- const { runDangerousRulesAudit } = await import("./permissions-2SBACQHV.js");
546
+ const { runDangerousRulesAudit } = await import("./permissions-HZYUVKCY.js");
545
547
  await runDangerousRulesAudit(
546
548
  [
547
549
  claudeProjectSettingsPath(),
@@ -737,7 +739,7 @@ async function editPermissions() {
737
739
  )
738
740
  });
739
741
  if (choice === BACK) return;
740
- const { permissionCommand } = await import("./permission-VISPGMUK.js");
742
+ const { permissionCommand } = await import("./permission-DPKPA2HU.js");
741
743
  switch (choice) {
742
744
  case "interactive":
743
745
  await permissionCommand({});
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ensureStatusline
3
- } from "./chunk-ETTZRJ55.js";
3
+ } from "./chunk-4CPUWHIN.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-32UAW3NX.js";
11
+ } from "./chunk-2EY7VVFT.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-PLSJW7QJ.js";
25
+ } from "./chunk-IV5OPG34.js";
26
26
  import {
27
27
  log,
28
28
  printBanner
@@ -1,18 +1,23 @@
1
1
  import {
2
2
  isPluginDisabled,
3
3
  setPluginEnabled
4
- } from "./chunk-32UAW3NX.js";
4
+ } from "./chunk-2EY7VVFT.js";
5
5
  import {
6
6
  isCodexPluginDisabled,
7
7
  setCodexPluginEnabled
8
- } from "./chunk-5QCGEPQO.js";
8
+ } from "./chunk-JSH6BMVZ.js";
9
+ import {
10
+ setOmpAgentDisabled
11
+ } from "./chunk-GTOEIGDM.js";
9
12
  import {
10
13
  resolveHostFlags,
11
14
  resolveScope
12
- } from "./chunk-GIH6E7GJ.js";
15
+ } from "./chunk-VMODQCSL.js";
16
+ import "./chunk-ZZNTNIM4.js";
17
+ import "./chunk-OFEC6OVI.js";
13
18
  import "./chunk-EVGXUDX4.js";
14
19
  import "./chunk-5UVDWG5L.js";
15
- import "./chunk-PLSJW7QJ.js";
20
+ import "./chunk-IV5OPG34.js";
16
21
  import {
17
22
  log
18
23
  } from "./chunk-NREZK463.js";
@@ -32,6 +37,16 @@ async function disableCommand(opts = {}) {
32
37
  log.dim("Restart Codex CLI for the change to take effect.");
33
38
  return;
34
39
  }
40
+ if (host === "omp") {
41
+ const ompScope = opts.project || opts.local ? "project" : "user";
42
+ log.step(`Disabling omp agents (${chalk.cyan(ompScope)} scope)...`);
43
+ setOmpAgentDisabled(ompScope);
44
+ log.success(
45
+ `Coding Friend disabled for omp at ${chalk.cyan(ompScope)} scope.`
46
+ );
47
+ log.dim("Restart omp for the change to take effect.");
48
+ return;
49
+ }
35
50
  const scope = await resolveScope(
36
51
  opts,
37
52
  "Where should Coding Friend be disabled?"
@@ -1,18 +1,23 @@
1
1
  import {
2
2
  isPluginDisabled,
3
3
  setPluginEnabled
4
- } from "./chunk-32UAW3NX.js";
4
+ } from "./chunk-2EY7VVFT.js";
5
5
  import {
6
6
  isCodexPluginDisabled,
7
7
  setCodexPluginEnabled
8
- } from "./chunk-5QCGEPQO.js";
8
+ } from "./chunk-JSH6BMVZ.js";
9
+ import {
10
+ setOmpAgentEnabled
11
+ } from "./chunk-GTOEIGDM.js";
9
12
  import {
10
13
  resolveHostFlags,
11
14
  resolveScope
12
- } from "./chunk-GIH6E7GJ.js";
15
+ } from "./chunk-VMODQCSL.js";
16
+ import "./chunk-ZZNTNIM4.js";
17
+ import "./chunk-OFEC6OVI.js";
13
18
  import "./chunk-EVGXUDX4.js";
14
19
  import "./chunk-5UVDWG5L.js";
15
- import "./chunk-PLSJW7QJ.js";
20
+ import "./chunk-IV5OPG34.js";
16
21
  import {
17
22
  log
18
23
  } from "./chunk-NREZK463.js";
@@ -32,6 +37,21 @@ async function enableCommand(opts = {}) {
32
37
  log.dim("Restart Codex CLI for the change to take effect.");
33
38
  return;
34
39
  }
40
+ if (host === "omp") {
41
+ const ompScope = opts.project || opts.local ? "project" : "user";
42
+ if (!setOmpAgentEnabled(ompScope)) {
43
+ log.info(
44
+ `Coding Friend is already enabled for omp at ${chalk.cyan(ompScope)} scope.`
45
+ );
46
+ return;
47
+ }
48
+ log.step(`Enabling omp agents (${chalk.cyan(ompScope)} scope)...`);
49
+ log.success(
50
+ `Coding Friend enabled for omp at ${chalk.cyan(ompScope)} scope.`
51
+ );
52
+ log.dim("Restart omp for the change to take effect.");
53
+ return;
54
+ }
35
55
  const scope = await resolveScope(
36
56
  opts,
37
57
  "Where should Coding Friend be enabled?"
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  devStatePath,
6
6
  pluginCachePath
7
- } from "./chunk-PLSJW7QJ.js";
7
+ } from "./chunk-IV5OPG34.js";
8
8
  import {
9
9
  log
10
10
  } from "./chunk-NREZK463.js";
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  resolveLearnDir
3
- } from "./chunk-5KHZQCZB.js";
3
+ } from "./chunk-FQUIO5BW.js";
4
4
  import "./chunk-3WIZA5OZ.js";
5
5
  import {
6
6
  getLibPath
7
- } from "./chunk-RZRT7NGT.js";
7
+ } from "./chunk-ZZNTNIM4.js";
8
+ import "./chunk-OFEC6OVI.js";
8
9
  import {
9
10
  run,
10
11
  streamExec
@@ -14,7 +15,7 @@ import {
14
15
  } from "./chunk-5UVDWG5L.js";
15
16
  import {
16
17
  globalConfigPath
17
- } from "./chunk-PLSJW7QJ.js";
18
+ } from "./chunk-IV5OPG34.js";
18
19
  import {
19
20
  log,
20
21
  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-PLSJW7QJ.js";
4
+ } from "./chunk-IV5OPG34.js";
5
5
 
6
6
  // src/index.ts
7
7
  import { Command } from "commander";
@@ -42,34 +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 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-LUPE3VTC.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, codex, or omp").option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").action(async (opts) => {
46
+ const { installCommand } = await import("./install-OEFJLAWA.js");
47
47
  await installCommand(opts);
48
48
  });
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(
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, codex, or omp").option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").option(
50
50
  "--remove-marketplace",
51
51
  "Also remove the host marketplace registration"
52
52
  ).action(async (opts) => {
53
- const { uninstallCommand } = await import("./uninstall-QN6527IR.js");
53
+ const { uninstallCommand } = await import("./uninstall-EV7362NK.js");
54
54
  await uninstallCommand(opts);
55
55
  });
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");
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, codex, or omp").option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").action(async (opts) => {
57
+ const { disableCommand } = await import("./disable-NROSQUHR.js");
58
58
  await disableCommand(opts);
59
59
  });
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");
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, codex, or omp").option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").action(async (opts) => {
61
+ const { enableCommand } = await import("./enable-26FFJGX5.js");
62
62
  await enableCommand(opts);
63
63
  });
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(
64
+ program.command("init").description("Initialize coding-friend in current project").option("--agent <agent>", "Operate on host agent: claude, codex, or omp").option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").option(
65
65
  "--trust-project",
66
66
  "For Codex, mark the current project trusted in ~/.codex/config.toml"
67
67
  ).action(async (opts) => {
68
- const { initCommand } = await import("./init-S2K4CQO2.js");
68
+ const { initCommand } = await import("./init-MHHII5EP.js");
69
69
  await initCommand(opts);
70
70
  });
71
71
  program.command("config").description("Manage Coding Friend configuration").action(async () => {
72
- const { configCommand } = await import("./config-EX3B3HWO.js");
72
+ const { configCommand } = await import("./config-VNSC2NAY.js");
73
73
  await configCommand();
74
74
  });
75
75
  var learn = program.command("learn").description("Manage learning docs \u2014 host as a website or push to git");
@@ -81,58 +81,58 @@ Learn subcommands:
81
81
  learn push [path] Commit and push learning docs (only if learn dir is the git root)`
82
82
  );
83
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) => {
84
- const { hostCommand } = await import("./host-VIQ5YI3V.js");
84
+ const { hostCommand } = await import("./host-2JOPHLN3.js");
85
85
  await hostCommand(path, opts);
86
86
  });
87
87
  learn.command("push").description("Commit and push learning docs to origin").argument("[path]", "path to docs folder").action(async (path) => {
88
- const { learnPushCommand } = await import("./learn-A3TP6PLL.js");
88
+ const { learnPushCommand } = await import("./learn-SSNBBDY3.js");
89
89
  await learnPushCommand(path);
90
90
  });
91
91
  program.command("host", { hidden: true }).argument("[path]", "path to docs folder").option("-p, --port <port>", "port number", "3333").action(async (path, opts) => {
92
- const { hostCommand } = await import("./host-VIQ5YI3V.js");
92
+ const { hostCommand } = await import("./host-2JOPHLN3.js");
93
93
  await hostCommand(path, opts);
94
94
  });
95
95
  program.command("mcp").description("Setup MCP server for learning docs").action(async () => {
96
- const { mcpCommand } = await import("./mcp-QNJTCZMS.js");
96
+ const { mcpCommand } = await import("./mcp-J5VO3OH7.js");
97
97
  await mcpCommand();
98
98
  });
99
99
  program.command("mcp-serve").description(
100
100
  "Start the cf-memory MCP server (used internally by npx). When memoryDir is omitted, resolves from CLAUDE_PROJECT_DIR at runtime."
101
101
  ).argument("[memoryDir]", "path to memory directory (optional)").action(async (memoryDir) => {
102
- const { mcpServeCommand } = await import("./mcp-serve-4VP4KDYG.js");
102
+ const { mcpServeCommand } = await import("./mcp-serve-55DSE2J4.js");
103
103
  await mcpServeCommand(memoryDir);
104
104
  });
105
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) => {
106
- const { mcpServeLearnCommand } = await import("./mcp-serve-learn-UVXIDOEZ.js");
106
+ const { mcpServeLearnCommand } = await import("./mcp-serve-learn-EDBWNL4I.js");
107
107
  await mcpServeLearnCommand(docsDir);
108
108
  });
109
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(
110
110
  "--project",
111
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(
112
+ ).option("--agent <agent>", "Operate on host agent: claude, codex, or omp").option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").option(
113
113
  "--enable-auto-approve",
114
114
  "For Codex, enable deterministic Coding Friend auto-approve"
115
115
  ).option(
116
116
  "--disable-auto-approve",
117
117
  "For Codex, disable deterministic Coding Friend auto-approve"
118
118
  ).action(async (opts) => {
119
- const { permissionCommand } = await import("./permission-VISPGMUK.js");
119
+ const { permissionCommand } = await import("./permission-DPKPA2HU.js");
120
120
  await permissionCommand(opts);
121
121
  });
122
122
  program.command("statusline").description("Setup coding-friend statusline in Claude Code").action(async () => {
123
- const { statuslineCommand } = await import("./statusline-AOZHEQSV.js");
123
+ const { statuslineCommand } = await import("./statusline-R5BNYK3H.js");
124
124
  await statuslineCommand();
125
125
  });
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-ZQG25VOJ.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, codex, or omp").option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").action(async (opts) => {
127
+ const { updateCommand } = await import("./update-YQBBAIIF.js");
128
128
  await updateCommand(opts);
129
129
  });
130
130
  program.command("status").description("Show comprehensive Coding Friend status").action(async () => {
131
- const { statusCommand } = await import("./status-RHSL5MBU.js");
131
+ const { statusCommand } = await import("./status-4WMIQL7L.js");
132
132
  await statusCommand();
133
133
  });
134
134
  program.command("clean").description("Clean files generated by Coding Friend in docs/").action(async () => {
135
- const { cleanCommand } = await import("./clean-BJSNDUPN.js");
135
+ const { cleanCommand } = await import("./clean-LPWEBJJ5.js");
136
136
  await cleanCommand();
137
137
  });
138
138
  var session = program.command("session").description("[beta] Save and load Claude Code sessions across machines");
@@ -147,11 +147,11 @@ session.command("save").description("Save current Claude Code session to sync fo
147
147
  "-s, --session-id <id>",
148
148
  "session UUID to save (default: auto-detect newest)"
149
149
  ).option("-l, --label <label>", "label for this session").action(async (opts) => {
150
- const { sessionSaveCommand } = await import("./session-VDGNTICO.js");
150
+ const { sessionSaveCommand } = await import("./session-YWJDLNBP.js");
151
151
  await sessionSaveCommand(opts);
152
152
  });
153
153
  session.command("load").description("Load a saved session from sync folder").action(async () => {
154
- const { sessionLoadCommand } = await import("./session-VDGNTICO.js");
154
+ const { sessionLoadCommand } = await import("./session-YWJDLNBP.js");
155
155
  await sessionLoadCommand();
156
156
  });
157
157
  var memory = program.command("memory").description("AI memory system \u2014 store and search project knowledge");
@@ -171,43 +171,43 @@ Memory subcommands:
171
171
  memory mcp Show MCP server setup instructions`
172
172
  );
173
173
  memory.command("status").description("Show memory system status").action(async () => {
174
- const { memoryStatusCommand } = await import("./memory-7GKTQSIW.js");
174
+ const { memoryStatusCommand } = await import("./memory-CDZKWOFL.js");
175
175
  await memoryStatusCommand();
176
176
  });
177
177
  memory.command("search").description("Search memories by query").argument("<query>", "search query").action(async (query) => {
178
- const { memorySearchCommand } = await import("./memory-7GKTQSIW.js");
178
+ const { memorySearchCommand } = await import("./memory-CDZKWOFL.js");
179
179
  await memorySearchCommand(query);
180
180
  });
181
181
  memory.command("list").description(
182
182
  "List memories in current project, or all projects with --projects"
183
183
  ).option("--projects", "List all project databases with size and metadata").action(async (opts) => {
184
- const { memoryListCommand } = await import("./memory-7GKTQSIW.js");
184
+ const { memoryListCommand } = await import("./memory-CDZKWOFL.js");
185
185
  await memoryListCommand(opts);
186
186
  });
187
187
  memory.command("init").description(
188
188
  "Initialize memory system \u2014 interactive wizard (first time) or config menu"
189
189
  ).action(async () => {
190
- const { memoryInitCommand } = await import("./memory-7GKTQSIW.js");
190
+ const { memoryInitCommand } = await import("./memory-CDZKWOFL.js");
191
191
  await memoryInitCommand();
192
192
  });
193
193
  memory.command("config").description("Configure memory system settings").action(async () => {
194
- const { memoryConfigCommand } = await import("./memory-7GKTQSIW.js");
194
+ const { memoryConfigCommand } = await import("./memory-CDZKWOFL.js");
195
195
  await memoryConfigCommand();
196
196
  });
197
197
  memory.command("start-daemon").description("Start the memory daemon (Tier 2 \u2014 MiniSearch)").action(async () => {
198
- const { memoryStartDaemonCommand } = await import("./memory-7GKTQSIW.js");
198
+ const { memoryStartDaemonCommand } = await import("./memory-CDZKWOFL.js");
199
199
  await memoryStartDaemonCommand();
200
200
  });
201
201
  memory.command("stop-daemon").description("Stop the memory daemon").action(async () => {
202
- const { memoryStopDaemonCommand } = await import("./memory-7GKTQSIW.js");
202
+ const { memoryStopDaemonCommand } = await import("./memory-CDZKWOFL.js");
203
203
  await memoryStopDaemonCommand();
204
204
  });
205
205
  memory.command("rebuild").description("Rebuild the daemon search index").action(async () => {
206
- const { memoryRebuildCommand } = await import("./memory-7GKTQSIW.js");
206
+ const { memoryRebuildCommand } = await import("./memory-CDZKWOFL.js");
207
207
  await memoryRebuildCommand();
208
208
  });
209
209
  memory.command("mcp").description("Show MCP server setup instructions").action(async () => {
210
- const { memoryMcpCommand } = await import("./memory-7GKTQSIW.js");
210
+ const { memoryMcpCommand } = await import("./memory-CDZKWOFL.js");
211
211
  await memoryMcpCommand();
212
212
  });
213
213
  memory.command("rm").description("Remove a project database").option("--project-id <id>", "Project ID to remove").option("--all", "Remove all project databases").option(
@@ -215,17 +215,17 @@ memory.command("rm").description("Remove a project database").option("--project-
215
215
  "Remove orphaned projects (source dir missing or 0 memories)"
216
216
  ).action(
217
217
  async (opts) => {
218
- const { memoryRmCommand } = await import("./memory-7GKTQSIW.js");
218
+ const { memoryRmCommand } = await import("./memory-CDZKWOFL.js");
219
219
  await memoryRmCommand(opts);
220
220
  }
221
221
  );
222
222
  var guide = program.command("guide").description("Manage custom skill guides");
223
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) => {
224
- const { guideCreateCommand } = await import("./guide-HCR43LJN.js");
224
+ const { guideCreateCommand } = await import("./guide-HCLEOAGR.js");
225
225
  guideCreateCommand(skillName);
226
226
  });
227
227
  guide.command("list").description("List existing custom guides").action(async () => {
228
- const { guideListCommand } = await import("./guide-HCR43LJN.js");
228
+ const { guideListCommand } = await import("./guide-HCLEOAGR.js");
229
229
  guideListCommand();
230
230
  });
231
231
  var dev = program.command("dev").description("Development mode commands");
@@ -241,28 +241,28 @@ Dev subcommands:
241
241
  dev update [path] Update local dev plugin to latest version`
242
242
  );
243
243
  dev.command("on").description("Switch to local plugin source").argument("[path]", "path to local coding-friend repo (default: cwd)").action(async (path) => {
244
- const { devOnCommand } = await import("./dev-PTBNMKZT.js");
244
+ const { devOnCommand } = await import("./dev-NRTDUQAR.js");
245
245
  await devOnCommand(path);
246
246
  });
247
247
  dev.command("off").description("Switch back to remote marketplace").action(async () => {
248
- const { devOffCommand } = await import("./dev-PTBNMKZT.js");
248
+ const { devOffCommand } = await import("./dev-NRTDUQAR.js");
249
249
  await devOffCommand();
250
250
  });
251
251
  dev.command("status").description("Show current dev mode").action(async () => {
252
- const { devStatusCommand } = await import("./dev-PTBNMKZT.js");
252
+ const { devStatusCommand } = await import("./dev-NRTDUQAR.js");
253
253
  await devStatusCommand();
254
254
  });
255
255
  dev.command("sync").description(
256
256
  "Copy local source files to plugin cache (no version bump needed)"
257
257
  ).action(async () => {
258
- const { devSyncCommand } = await import("./dev-PTBNMKZT.js");
258
+ const { devSyncCommand } = await import("./dev-NRTDUQAR.js");
259
259
  await devSyncCommand();
260
260
  });
261
261
  dev.command("restart").description("Reinstall local dev plugin (off + on)").argument(
262
262
  "[path]",
263
263
  "path to local coding-friend repo (default: saved path or cwd)"
264
264
  ).action(async (path) => {
265
- const { devRestartCommand } = await import("./dev-PTBNMKZT.js");
265
+ const { devRestartCommand } = await import("./dev-NRTDUQAR.js");
266
266
  await devRestartCommand(path);
267
267
  });
268
268
  dev.command("update").description(
@@ -271,13 +271,13 @@ dev.command("update").description(
271
271
  "[path]",
272
272
  "path to local coding-friend repo (default: saved path or cwd)"
273
273
  ).action(async (path) => {
274
- const { devUpdateCommand } = await import("./dev-PTBNMKZT.js");
274
+ const { devUpdateCommand } = await import("./dev-NRTDUQAR.js");
275
275
  await devUpdateCommand(path);
276
276
  });
277
277
  program.hook("postAction", async () => {
278
278
  const topCmd = process.argv[2];
279
279
  if (topCmd === "update") return;
280
- const { checkAndNotifyCliUpdate } = await import("./update-check-7LKJLJPM.js");
280
+ const { checkAndNotifyCliUpdate } = await import("./update-check-EJSGVGO6.js");
281
281
  checkAndNotifyCliUpdate(pkg.version);
282
282
  });
283
283
  await program.parseAsync();