coding-friend-cli 1.40.2 → 1.40.3

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.
@@ -2,7 +2,7 @@ import {
2
2
  checkMemoryMcpHealth,
3
3
  printHealthSection,
4
4
  warnStaleMcpJson
5
- } from "./chunk-TFF47F7P.js";
5
+ } from "./chunk-HEVK3OYL.js";
6
6
  import {
7
7
  loadConfig,
8
8
  resolveMemoryDir
@@ -12,10 +12,10 @@ import {
12
12
  isMemoryMcpRegistered,
13
13
  memoryConfigMenu,
14
14
  registerMemoryMcp
15
- } from "./chunk-CZW36H3D.js";
15
+ } from "./chunk-BQ4E66ZV.js";
16
16
  import {
17
17
  showConfigHint
18
- } from "./chunk-Z5XTSF7L.js";
18
+ } from "./chunk-XLB2UAKL.js";
19
19
  import {
20
20
  getLibPath
21
21
  } from "./chunk-TN3Y75WG.js";
@@ -11,7 +11,7 @@ import {
11
11
  askScope,
12
12
  formatScopeLabel,
13
13
  injectBackChoice
14
- } from "./chunk-Z5XTSF7L.js";
14
+ } from "./chunk-XLB2UAKL.js";
15
15
  import {
16
16
  getLibPath
17
17
  } from "./chunk-TN3Y75WG.js";
@@ -9,7 +9,7 @@ import {
9
9
  isMemoryMcpRegistered,
10
10
  registerMemoryMcp,
11
11
  removeMemoryMcpEntry
12
- } from "./chunk-CZW36H3D.js";
12
+ } from "./chunk-BQ4E66ZV.js";
13
13
  import {
14
14
  isPluginInstalled
15
15
  } from "./chunk-SUYE5S2W.js";
@@ -33,7 +33,7 @@ import {
33
33
  import {
34
34
  resolveHostFlags,
35
35
  resolveScope
36
- } from "./chunk-Z5XTSF7L.js";
36
+ } from "./chunk-XLB2UAKL.js";
37
37
  import {
38
38
  detectHostsAvailable
39
39
  } from "./chunk-OBCNHQFA.js";
@@ -55,7 +55,7 @@ import {
55
55
  } from "./chunk-NREZK463.js";
56
56
 
57
57
  // src/commands/update.ts
58
- import { readFileSync } from "fs";
58
+ import { lstatSync, readFileSync } from "fs";
59
59
  import { dirname, join } from "path";
60
60
  import { fileURLToPath } from "url";
61
61
  import chalk from "chalk";
@@ -78,6 +78,31 @@ function getCliVersion() {
78
78
  function getLatestCliVersion() {
79
79
  return run("npm", ["view", "coding-friend-cli", "version"]);
80
80
  }
81
+ function shouldUpdateCli(requested) {
82
+ if (!requested) return false;
83
+ if (isCliGlobalLinked()) {
84
+ log.info(
85
+ "CLI is npm-linked to a local repo \u2014 skipping CLI update. Build it there instead (`npm run dev`)."
86
+ );
87
+ return false;
88
+ }
89
+ return true;
90
+ }
91
+ function isCliGlobalLinked() {
92
+ const prefix = run("npm", ["prefix", "-g"]);
93
+ if (!prefix) return false;
94
+ const modules = "node_modules";
95
+ return [
96
+ join(prefix.trim(), "lib", modules, "coding-friend-cli"),
97
+ join(prefix.trim(), modules, "coding-friend-cli")
98
+ ].some((p) => {
99
+ try {
100
+ return lstatSync(p).isSymbolicLink();
101
+ } catch {
102
+ return false;
103
+ }
104
+ });
105
+ }
81
106
  function getLatestVersion() {
82
107
  let tag = null;
83
108
  tag = run("gh", [
@@ -191,7 +216,6 @@ async function updateCommand(opts) {
191
216
  }
192
217
  async function updateClaudeCommand(opts, mode) {
193
218
  const updateAll = !opts.cli && !opts.plugin && !opts.statusline;
194
- const doCli = (updateAll || !!opts.cli) && !mode?.skipCli;
195
219
  const doPlugin = updateAll || !!opts.plugin;
196
220
  const doStatusline = updateAll || !!opts.statusline;
197
221
  const hasScopeFlag = !!(opts.user || opts.global || opts.project || opts.local);
@@ -205,6 +229,7 @@ async function updateClaudeCommand(opts, mode) {
205
229
  printBanner("\u2728 Coding Friend Update \u2728");
206
230
  console.log();
207
231
  }
232
+ const doCli = shouldUpdateCli((updateAll || !!opts.cli) && !mode?.skipCli);
208
233
  const currentVersion = getInstalledVersion();
209
234
  const latestVersion = getLatestVersion();
210
235
  const statuslineVersion = getStatuslineVersion();
@@ -323,7 +348,7 @@ async function updateClaudeCommand(opts, mode) {
323
348
  }
324
349
  let refreshMemoryAfterUpdate = null;
325
350
  if (doCli) {
326
- ({ refreshMemoryAfterUpdate } = await import("./memory-KNKGLCVG.js"));
351
+ ({ refreshMemoryAfterUpdate } = await import("./memory-LBVPVWJQ.js"));
327
352
  if (!latestCliVersion) {
328
353
  log.warn("Cannot check latest CLI version from npm.");
329
354
  } else {
@@ -383,12 +408,12 @@ async function updateClaudeCommand(opts, mode) {
383
408
  }
384
409
  async function updateCodexCommand(opts, mode) {
385
410
  const updateAll = !opts.cli && !opts.plugin && !opts.statusline;
386
- const doCli = (updateAll || !!opts.cli) && !mode?.skipCli;
387
411
  const doPlugin = updateAll || !!opts.plugin;
388
412
  if (!mode?.skipBanner) {
389
413
  printBanner("\u2728 Coding Friend Codex Update \u2728");
390
414
  console.log();
391
415
  }
416
+ const doCli = shouldUpdateCli((updateAll || !!opts.cli) && !mode?.skipCli);
392
417
  if (doPlugin) {
393
418
  const beforeVersion = getCodexInstalledVersion();
394
419
  console.log(
@@ -484,13 +509,13 @@ function ompUpdateScopes(opts) {
484
509
  }
485
510
  async function updateOmpCommand(opts, mode) {
486
511
  const updateAll = !opts.cli && !opts.plugin && !opts.statusline;
487
- const doCli = (updateAll || !!opts.cli) && !mode?.skipCli;
488
512
  const doPlugin = updateAll || !!opts.plugin;
489
513
  const scopes = ompUpdateScopes(opts);
490
514
  if (!mode?.skipBanner) {
491
515
  printBanner("\u2728 Coding Friend omp Update \u2728");
492
516
  console.log();
493
517
  }
518
+ const doCli = shouldUpdateCli((updateAll || !!opts.cli) && !mode?.skipCli);
494
519
  if (doPlugin) {
495
520
  const cliVersion = getCliVersion();
496
521
  console.log(` CLI ${cliVersion}`);
@@ -554,12 +579,12 @@ function restoreAgyExtraMcpServers(previous) {
554
579
  }
555
580
  async function updateAgyCommand(opts, mode) {
556
581
  const updateAll = !opts.cli && !opts.plugin && !opts.statusline;
557
- const doCli = (updateAll || !!opts.cli) && !mode?.skipCli;
558
582
  const doPlugin = updateAll || !!opts.plugin;
559
583
  if (!mode?.skipBanner) {
560
584
  printBanner("\u2728 Coding Friend Antigravity Update (beta) \u2728");
561
585
  console.log();
562
586
  }
587
+ const doCli = shouldUpdateCli((updateAll || !!opts.cli) && !mode?.skipCli);
563
588
  if (doPlugin) {
564
589
  try {
565
590
  const previousMcp = readAgyMcpConfig();
@@ -617,6 +642,7 @@ export {
617
642
  semverCompare,
618
643
  getCliVersion,
619
644
  getLatestCliVersion,
645
+ isCliGlobalLinked,
620
646
  getLatestVersion,
621
647
  updateCommand
622
648
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isMemoryMcpRegistered
3
- } from "./chunk-CZW36H3D.js";
3
+ } from "./chunk-BQ4E66ZV.js";
4
4
  import {
5
5
  readJson
6
6
  } from "./chunk-5UVDWG5L.js";
@@ -6,10 +6,13 @@ import {
6
6
  claudeLocalSettingsPath,
7
7
  claudeProjectSettingsPath,
8
8
  claudeSettingsPath,
9
+ knownMarketplacesPath,
9
10
  pluginCachePath
10
11
  } from "./chunk-IYBIIRH4.js";
11
12
 
12
13
  // src/lib/permissions.ts
14
+ import { join } from "path";
15
+ var MARKETPLACE_NAME = "coding-friend-marketplace";
13
16
  var STATIC_RULES = [
14
17
  // Core Utilities (hooks & infrastructure)
15
18
  {
@@ -260,7 +263,14 @@ var STATIC_RULES = [
260
263
  recommended: true
261
264
  }
262
265
  ];
263
- function buildPluginScriptRules() {
266
+ function resolveMarketplacePluginRoot() {
267
+ const data = readJson(
268
+ knownMarketplacesPath()
269
+ );
270
+ const installLocation = data?.[MARKETPLACE_NAME]?.installLocation;
271
+ return installLocation ? join(installLocation, "plugin") : null;
272
+ }
273
+ function buildPluginScriptRules(marketplaceRoot = resolveMarketplacePluginRoot()) {
264
274
  const absBase = pluginCachePath();
265
275
  const readBase = process.env.CLAUDE_CONFIG_DIR?.trim() ? absBase : "~/.claude/plugins/cache/coding-friend-marketplace/coding-friend";
266
276
  return [
@@ -287,11 +297,35 @@ function buildPluginScriptRules() {
287
297
  description: "[read-only] Read user global config \xB7 Used by: session-init hook, /cf-learn",
288
298
  category: "Plugin Scripts",
289
299
  recommended: true
290
- }
300
+ },
301
+ // Skills and hooks self-reference via ${CLAUDE_PLUGIN_ROOT}, which points at
302
+ // the marketplace's install location — the repo itself in dev mode, the
303
+ // clone under ~/.claude/plugins/marketplaces/ otherwise. Neither is the
304
+ // versioned cache above, so those paths need their own rules.
305
+ ...marketplaceRoot ? [
306
+ {
307
+ rule: `Bash(bash ${marketplaceRoot}/*)`,
308
+ description: "[execute] Run plugin scripts from the marketplace root (unquoted) \xB7 Used by: all skills",
309
+ category: "Plugin Scripts",
310
+ recommended: true
311
+ },
312
+ {
313
+ rule: `Bash(bash "${marketplaceRoot}/*)`,
314
+ description: "[execute] Run plugin scripts from the marketplace root (quoted) \xB7 Used by: all skills",
315
+ category: "Plugin Scripts",
316
+ recommended: true
317
+ },
318
+ {
319
+ rule: `Read(${marketplaceRoot}/**)`,
320
+ description: "[read-only] Read plugin files from the marketplace root \xB7 Used by: hooks, agents",
321
+ category: "Plugin Scripts",
322
+ recommended: true
323
+ }
324
+ ] : []
291
325
  ];
292
326
  }
293
- function getAllRules() {
294
- return [...STATIC_RULES, ...buildPluginScriptRules()];
327
+ function getAllRules(marketplaceRoot) {
328
+ return [...STATIC_RULES, ...buildPluginScriptRules(marketplaceRoot)];
295
329
  }
296
330
  var PERMISSION_RULES = getAllRules();
297
331
  var DANGEROUS_RULE_PATTERNS = [
@@ -423,12 +457,15 @@ function extractTag(description) {
423
457
  const match = description.match(/^(\[[^\]]+\])/);
424
458
  return match ? match[1] : null;
425
459
  }
426
- var OLD_PLUGIN_PATH_PATTERN = "/.claude/plugins/cache/coding-friend-marketplace/coding-friend/";
460
+ var OLD_PLUGIN_PATH_PATTERNS = [
461
+ "/.claude/plugins/cache/coding-friend-marketplace/coding-friend/",
462
+ `/.claude/plugins/marketplaces/${MARKETPLACE_NAME}/plugin/`
463
+ ];
427
464
  function cleanupStalePluginRules(settingsPath) {
428
465
  const existing = getExistingRules(settingsPath);
429
466
  const currentRules = new Set(getAllRules().map((r) => r.rule));
430
467
  const stale = existing.filter(
431
- (r) => r.includes(OLD_PLUGIN_PATH_PATTERN) && !currentRules.has(r)
468
+ (r) => OLD_PLUGIN_PATH_PATTERNS.some((p) => r.includes(p)) && !currentRules.has(r)
432
469
  );
433
470
  if (stale.length === 0) return 0;
434
471
  applyPermissions(settingsPath, [], stale);
@@ -16,10 +16,42 @@ import {
16
16
  } from "./chunk-NREZK463.js";
17
17
 
18
18
  // src/lib/prompt-utils.ts
19
- import { select, Separator } from "@inquirer/prompts";
19
+ import { checkbox, confirm, input, select, Separator } from "@inquirer/prompts";
20
20
  import { existsSync } from "fs";
21
+ import { emitKeypressEvents } from "readline";
21
22
  import chalk from "chalk";
22
23
  var BACK = "__back__";
24
+ var BackError = class extends Error {
25
+ constructor() {
26
+ super("back");
27
+ this.name = "BackError";
28
+ }
29
+ };
30
+ var escArmed = false;
31
+ function setEscArmed(armed) {
32
+ escArmed = armed;
33
+ }
34
+ async function withEsc(run2) {
35
+ if (!escArmed) return run2();
36
+ const controller = new AbortController();
37
+ const onKey = (_str, key) => {
38
+ if (key?.name === "escape") controller.abort();
39
+ };
40
+ emitKeypressEvents(process.stdin);
41
+ process.stdin.on("keypress", onKey);
42
+ try {
43
+ return await run2({ signal: controller.signal });
44
+ } catch (err) {
45
+ if (err?.name === "AbortPromptError") throw new BackError();
46
+ throw err;
47
+ } finally {
48
+ process.stdin.off("keypress", onKey);
49
+ }
50
+ }
51
+ var escSelect = (config) => withEsc((ctx) => select(config, ctx));
52
+ var escInput = (config) => withEsc((ctx) => input(config, ctx));
53
+ var escConfirm = (config) => withEsc((ctx) => confirm(config, ctx));
54
+ var escCheckbox = (config) => withEsc((ctx) => checkbox(config, ctx));
23
55
  function injectBackChoice(choices, label = "Back") {
24
56
  return [
25
57
  ...choices,
@@ -28,7 +60,7 @@ function injectBackChoice(choices, label = "Back") {
28
60
  ];
29
61
  }
30
62
  async function askScope(label = "Save to:") {
31
- return select({
63
+ return escSelect({
32
64
  message: label,
33
65
  choices: [
34
66
  { name: "This project only", value: "local" },
@@ -185,6 +217,12 @@ function applyDocsDirChange(newValue, oldValue, scope, subfolders = []) {
185
217
 
186
218
  export {
187
219
  BACK,
220
+ BackError,
221
+ setEscArmed,
222
+ escSelect,
223
+ escInput,
224
+ escConfirm,
225
+ escCheckbox,
188
226
  injectBackChoice,
189
227
  askScope,
190
228
  resolveScope,
@@ -2,7 +2,7 @@ import {
2
2
  afterAutoApproveEnabled,
3
3
  getAllRules,
4
4
  getExistingRules
5
- } from "./chunk-KG6HYBGD.js";
5
+ } from "./chunk-PIXAQLXQ.js";
6
6
  import {
7
7
  listMdFilesRecursive
8
8
  } from "./chunk-2DTXVMPQ.js";
@@ -36,7 +36,7 @@ import {
36
36
  } from "./chunk-667NMPN4.js";
37
37
  import {
38
38
  memoryConfigMenu
39
- } from "./chunk-CZW36H3D.js";
39
+ } from "./chunk-BQ4E66ZV.js";
40
40
  import "./chunk-KCBMCHSA.js";
41
41
  import {
42
42
  BACK,
@@ -47,7 +47,7 @@ import {
47
47
  getScopeLabel,
48
48
  injectBackChoice,
49
49
  showConfigHint
50
- } from "./chunk-Z5XTSF7L.js";
50
+ } from "./chunk-XLB2UAKL.js";
51
51
  import "./chunk-TN3Y75WG.js";
52
52
  import "./chunk-OBCNHQFA.js";
53
53
  import {
@@ -802,7 +802,7 @@ async function editPermissions() {
802
802
  )
803
803
  });
804
804
  if (choice === BACK) return;
805
- const { permissionCommand } = await import("./permission-DDBMBFJV.js");
805
+ const { permissionCommand } = await import("./permission-W3NM7HOL.js");
806
806
  switch (choice) {
807
807
  case "interactive":
808
808
  await permissionCommand({});
@@ -1,5 +1,6 @@
1
1
  import {
2
- ensureStatusline
2
+ ensureStatusline,
3
+ getInstalledVersion
3
4
  } from "./chunk-FK4SXIF7.js";
4
5
  import "./chunk-ITI7MXLA.js";
5
6
  import {
@@ -242,22 +243,9 @@ async function devSyncCommand() {
242
243
  );
243
244
  return;
244
245
  }
245
- const cacheBase = pluginCachePath();
246
- let cacheVersionDir = null;
247
- if (existsSync(cacheBase)) {
248
- const versions = readdirSync(cacheBase).filter(
249
- (v) => statSync(join(cacheBase, v)).isDirectory()
250
- );
251
- if (versions.length > 0) {
252
- cacheVersionDir = join(
253
- cacheBase,
254
- versions.sort((a, b) => {
255
- return statSync(join(cacheBase, b)).mtimeMs - statSync(join(cacheBase, a)).mtimeMs;
256
- })[0]
257
- );
258
- }
259
- }
260
- if (!cacheVersionDir) {
246
+ const installedVersion = getInstalledVersion();
247
+ const cacheVersionDir = installedVersion ? join(pluginCachePath(), installedVersion) : null;
248
+ if (!cacheVersionDir || !existsSync(cacheVersionDir)) {
261
249
  log.error(
262
250
  "No cached plugin version found. Run `cf dev off && cf dev on` first."
263
251
  );
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  resolveHostFlags,
16
16
  resolveScope
17
- } from "./chunk-Z5XTSF7L.js";
17
+ } from "./chunk-XLB2UAKL.js";
18
18
  import "./chunk-TN3Y75WG.js";
19
19
  import "./chunk-OBCNHQFA.js";
20
20
  import "./chunk-5UVDWG5L.js";
@@ -14,7 +14,7 @@ import {
14
14
  import {
15
15
  resolveHostFlags,
16
16
  resolveScope
17
- } from "./chunk-Z5XTSF7L.js";
17
+ } from "./chunk-XLB2UAKL.js";
18
18
  import "./chunk-TN3Y75WG.js";
19
19
  import "./chunk-OBCNHQFA.js";
20
20
  import "./chunk-5UVDWG5L.js";
package/dist/index.js CHANGED
@@ -46,7 +46,7 @@ program.command("install").description("Install the Coding Friend plugin into a
46
46
  "--agent <agent>",
47
47
  "Operate on host agent: claude, codex, omp, or agy"
48
48
  ).option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").option("--agy", "Shortcut for --agent agy (beta)").action(async (opts) => {
49
- const { installCommand } = await import("./install-MS7SS2L5.js");
49
+ const { installCommand } = await import("./install-B3646W7P.js");
50
50
  await installCommand(opts);
51
51
  });
52
52
  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(
@@ -56,21 +56,21 @@ program.command("uninstall").description("Uninstall the Coding Friend plugin fro
56
56
  "--remove-marketplace",
57
57
  "Also remove the host marketplace registration"
58
58
  ).action(async (opts) => {
59
- const { uninstallCommand } = await import("./uninstall-6QKNGLKK.js");
59
+ const { uninstallCommand } = await import("./uninstall-S5FSXBYX.js");
60
60
  await uninstallCommand(opts);
61
61
  });
62
62
  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(
63
63
  "--agent <agent>",
64
64
  "Operate on host agent: claude, codex, omp, or agy"
65
65
  ).option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").option("--agy", "Shortcut for --agent agy (beta)").action(async (opts) => {
66
- const { disableCommand } = await import("./disable-DCGVIHKG.js");
66
+ const { disableCommand } = await import("./disable-CN6GAG4I.js");
67
67
  await disableCommand(opts);
68
68
  });
69
69
  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(
70
70
  "--agent <agent>",
71
71
  "Operate on host agent: claude, codex, omp, or agy"
72
72
  ).option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").option("--agy", "Shortcut for --agent agy (beta)").action(async (opts) => {
73
- const { enableCommand } = await import("./enable-YYWJDOYB.js");
73
+ const { enableCommand } = await import("./enable-MRLKTJRB.js");
74
74
  await enableCommand(opts);
75
75
  });
76
76
  program.command("init").description("Initialize coding-friend in current project").option(
@@ -80,11 +80,11 @@ program.command("init").description("Initialize coding-friend in current project
80
80
  "--trust-project",
81
81
  "For Codex, mark the current project trusted in ~/.codex/config.toml"
82
82
  ).action(async (opts) => {
83
- const { initCommand } = await import("./init-ORERNRR7.js");
83
+ const { initCommand } = await import("./init-XAWQUS2X.js");
84
84
  await initCommand(opts);
85
85
  });
86
86
  program.command("config").description("Manage Coding Friend configuration").action(async () => {
87
- const { configCommand } = await import("./config-A4JIINZK.js");
87
+ const { configCommand } = await import("./config-OFGL545F.js");
88
88
  await configCommand();
89
89
  });
90
90
  var learn = program.command("learn").description("Manage learning docs \u2014 host as a website or push to git");
@@ -108,7 +108,7 @@ program.command("host", { hidden: true }).argument("[path]", "path to docs folde
108
108
  await hostCommand(path, opts);
109
109
  });
110
110
  program.command("mcp").description("Setup MCP server for learning docs").action(async () => {
111
- const { mcpCommand } = await import("./mcp-XGWHYBEN.js");
111
+ const { mcpCommand } = await import("./mcp-ZG56IYLD.js");
112
112
  await mcpCommand();
113
113
  });
114
114
  program.command("mcp-serve").description(
@@ -134,7 +134,7 @@ program.command("permission").description("Manage host permission and approval s
134
134
  "--disable-auto-approve",
135
135
  "For Codex, disable deterministic Coding Friend auto-approve"
136
136
  ).action(async (opts) => {
137
- const { permissionCommand } = await import("./permission-DDBMBFJV.js");
137
+ const { permissionCommand } = await import("./permission-W3NM7HOL.js");
138
138
  await permissionCommand(opts);
139
139
  });
140
140
  program.command("statusline").description("Setup coding-friend statusline in Claude Code").action(async () => {
@@ -145,11 +145,11 @@ program.command("update").description("Update coding-friend plugin, CLI, and sta
145
145
  "--agent <agent>",
146
146
  "Operate on host agent: claude, codex, omp, or agy"
147
147
  ).option("--codex", "Alias for --agent codex").option("--omp", "Alias for --agent omp").option("--agy", "Shortcut for --agent agy (beta)").action(async (opts) => {
148
- const { updateCommand } = await import("./update-6YMGKFUB.js");
148
+ const { updateCommand } = await import("./update-HGEF46T5.js");
149
149
  await updateCommand(opts);
150
150
  });
151
151
  program.command("status").description("Show comprehensive Coding Friend status").action(async () => {
152
- const { statusCommand } = await import("./status-WICNVD7B.js");
152
+ const { statusCommand } = await import("./status-GQ3ZDYZ4.js");
153
153
  await statusCommand();
154
154
  });
155
155
  program.command("clean").description("Clean files generated by Coding Friend in docs/").action(async () => {
@@ -192,43 +192,43 @@ Memory subcommands:
192
192
  memory mcp Show MCP server setup instructions`
193
193
  );
194
194
  memory.command("status").description("Show memory system status").action(async () => {
195
- const { memoryStatusCommand } = await import("./memory-KNKGLCVG.js");
195
+ const { memoryStatusCommand } = await import("./memory-LBVPVWJQ.js");
196
196
  await memoryStatusCommand();
197
197
  });
198
198
  memory.command("search").description("Search memories by query").argument("<query>", "search query").action(async (query) => {
199
- const { memorySearchCommand } = await import("./memory-KNKGLCVG.js");
199
+ const { memorySearchCommand } = await import("./memory-LBVPVWJQ.js");
200
200
  await memorySearchCommand(query);
201
201
  });
202
202
  memory.command("list").description(
203
203
  "List memories in current project, or all projects with --projects"
204
204
  ).option("--projects", "List all project databases with size and metadata").action(async (opts) => {
205
- const { memoryListCommand } = await import("./memory-KNKGLCVG.js");
205
+ const { memoryListCommand } = await import("./memory-LBVPVWJQ.js");
206
206
  await memoryListCommand(opts);
207
207
  });
208
208
  memory.command("init").description(
209
209
  "Initialize memory system \u2014 interactive wizard (first time) or config menu"
210
210
  ).action(async () => {
211
- const { memoryInitCommand } = await import("./memory-KNKGLCVG.js");
211
+ const { memoryInitCommand } = await import("./memory-LBVPVWJQ.js");
212
212
  await memoryInitCommand();
213
213
  });
214
214
  memory.command("config").description("Configure memory system settings").action(async () => {
215
- const { memoryConfigCommand } = await import("./memory-KNKGLCVG.js");
215
+ const { memoryConfigCommand } = await import("./memory-LBVPVWJQ.js");
216
216
  await memoryConfigCommand();
217
217
  });
218
218
  memory.command("start-daemon").description("Start the memory daemon (Tier 2 \u2014 MiniSearch)").action(async () => {
219
- const { memoryStartDaemonCommand } = await import("./memory-KNKGLCVG.js");
219
+ const { memoryStartDaemonCommand } = await import("./memory-LBVPVWJQ.js");
220
220
  await memoryStartDaemonCommand();
221
221
  });
222
222
  memory.command("stop-daemon").description("Stop the memory daemon").action(async () => {
223
- const { memoryStopDaemonCommand } = await import("./memory-KNKGLCVG.js");
223
+ const { memoryStopDaemonCommand } = await import("./memory-LBVPVWJQ.js");
224
224
  await memoryStopDaemonCommand();
225
225
  });
226
226
  memory.command("rebuild").description("Rebuild the daemon search index").action(async () => {
227
- const { memoryRebuildCommand } = await import("./memory-KNKGLCVG.js");
227
+ const { memoryRebuildCommand } = await import("./memory-LBVPVWJQ.js");
228
228
  await memoryRebuildCommand();
229
229
  });
230
230
  memory.command("mcp").description("Show MCP server setup instructions").action(async () => {
231
- const { memoryMcpCommand } = await import("./memory-KNKGLCVG.js");
231
+ const { memoryMcpCommand } = await import("./memory-LBVPVWJQ.js");
232
232
  await memoryMcpCommand();
233
233
  });
234
234
  memory.command("rm").description("Remove a project database").option("--project-id <id>", "Project ID to remove").option("--all", "Remove all project databases").option(
@@ -236,7 +236,7 @@ memory.command("rm").description("Remove a project database").option("--project-
236
236
  "Remove orphaned projects (source dir missing or 0 memories)"
237
237
  ).action(
238
238
  async (opts) => {
239
- const { memoryRmCommand } = await import("./memory-KNKGLCVG.js");
239
+ const { memoryRmCommand } = await import("./memory-LBVPVWJQ.js");
240
240
  await memoryRmCommand(opts);
241
241
  }
242
242
  );
@@ -262,28 +262,28 @@ Dev subcommands:
262
262
  dev update [path] Update local dev plugin to latest version`
263
263
  );
264
264
  dev.command("on").description("Switch to local plugin source").argument("[path]", "path to local coding-friend repo (default: cwd)").action(async (path) => {
265
- const { devOnCommand } = await import("./dev-E3EHPMHE.js");
265
+ const { devOnCommand } = await import("./dev-GCVXE5TW.js");
266
266
  await devOnCommand(path);
267
267
  });
268
268
  dev.command("off").description("Switch back to remote marketplace").action(async () => {
269
- const { devOffCommand } = await import("./dev-E3EHPMHE.js");
269
+ const { devOffCommand } = await import("./dev-GCVXE5TW.js");
270
270
  await devOffCommand();
271
271
  });
272
272
  dev.command("status").description("Show current dev mode").action(async () => {
273
- const { devStatusCommand } = await import("./dev-E3EHPMHE.js");
273
+ const { devStatusCommand } = await import("./dev-GCVXE5TW.js");
274
274
  await devStatusCommand();
275
275
  });
276
276
  dev.command("sync").description(
277
277
  "Copy local source files to plugin cache (no version bump needed)"
278
278
  ).action(async () => {
279
- const { devSyncCommand } = await import("./dev-E3EHPMHE.js");
279
+ const { devSyncCommand } = await import("./dev-GCVXE5TW.js");
280
280
  await devSyncCommand();
281
281
  });
282
282
  dev.command("restart").description("Reinstall local dev plugin (off + on)").argument(
283
283
  "[path]",
284
284
  "path to local coding-friend repo (default: saved path or cwd)"
285
285
  ).action(async (path) => {
286
- const { devRestartCommand } = await import("./dev-E3EHPMHE.js");
286
+ const { devRestartCommand } = await import("./dev-GCVXE5TW.js");
287
287
  await devRestartCommand(path);
288
288
  });
289
289
  dev.command("update").description(
@@ -292,7 +292,7 @@ dev.command("update").description(
292
292
  "[path]",
293
293
  "path to local coding-friend repo (default: saved path or cwd)"
294
294
  ).action(async (path) => {
295
- const { devUpdateCommand } = await import("./dev-E3EHPMHE.js");
295
+ const { devUpdateCommand } = await import("./dev-GCVXE5TW.js");
296
296
  await devUpdateCommand(path);
297
297
  });
298
298
  program.hook("postAction", async () => {