coding-friend-cli 1.17.4 → 1.19.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.
@@ -1,3 +1,11 @@
1
+ import {
2
+ memoryConfigMenu
3
+ } from "./chunk-WEMDLEK5.js";
4
+ import {
5
+ getAllRules,
6
+ getExistingRules
7
+ } from "./chunk-7CAIGH2Y.js";
8
+ import "./chunk-RZRT7NGT.js";
1
9
  import {
2
10
  findStatuslineHookPath,
3
11
  isStatuslineConfigured,
@@ -13,7 +21,7 @@ import {
13
21
  ensureShellCompletion,
14
22
  hasShellCompletion,
15
23
  removeShellCompletion
16
- } from "./chunk-DVMWMXDZ.js";
24
+ } from "./chunk-NEQZP5D4.js";
17
25
  import {
18
26
  BACK,
19
27
  applyDocsDirChange,
@@ -28,6 +36,8 @@ import {
28
36
  run
29
37
  } from "./chunk-CYQU33FY.js";
30
38
  import {
39
+ claudeLocalSettingsPath,
40
+ claudeSettingsPath,
31
41
  globalConfigPath,
32
42
  localConfigPath,
33
43
  mergeJson,
@@ -55,9 +65,6 @@ function getNestedFieldScope(section, field, globalCfg, localCfg) {
55
65
  function getLearnFieldScope(field, globalCfg, localCfg) {
56
66
  return getNestedFieldScope("learn", field, globalCfg, localCfg);
57
67
  }
58
- function getMemoryFieldScope(field, globalCfg, localCfg) {
59
- return getNestedFieldScope("memory", field, globalCfg, localCfg);
60
- }
61
68
  function getMergedNestedValue(section, field, globalCfg, localCfg) {
62
69
  const localSection = localCfg?.[section];
63
70
  if (localSection?.[field] !== void 0) return localSection[field];
@@ -67,9 +74,6 @@ function getMergedNestedValue(section, field, globalCfg, localCfg) {
67
74
  function getMergedLearnValue(field, globalCfg, localCfg) {
68
75
  return getMergedNestedValue("learn", field, globalCfg, localCfg);
69
76
  }
70
- function getMergedMemoryValue(field, globalCfg, localCfg) {
71
- return getMergedNestedValue("memory", field, globalCfg, localCfg);
72
- }
73
77
  function writeToScope(scope, data) {
74
78
  const targetPath = scope === "global" ? globalConfigPath() : localConfigPath();
75
79
  mergeJson(targetPath, data);
@@ -86,9 +90,6 @@ function writeNestedField(section, scope, field, value) {
86
90
  function writeLearnField(scope, field, value) {
87
91
  writeNestedField("learn", scope, field, value);
88
92
  }
89
- function writeMemoryField(scope, field, value) {
90
- writeNestedField("memory", scope, field, value);
91
- }
92
93
  async function editDocsDir(globalCfg, localCfg) {
93
94
  const currentValue = getMergedValue("docsDir", globalCfg, localCfg);
94
95
  if (currentValue) {
@@ -374,239 +375,6 @@ async function learnSubMenu() {
374
375
  }
375
376
  }
376
377
  }
377
- async function editMemoryTier(globalCfg, localCfg) {
378
- const currentValue = getMergedMemoryValue("tier", globalCfg, localCfg);
379
- if (currentValue) {
380
- log.dim(`Current: ${currentValue}`);
381
- }
382
- const choice = await select({
383
- message: "Memory search tier:",
384
- choices: injectBackChoice(
385
- [
386
- {
387
- name: "auto \u2014 detect best available (recommended)",
388
- value: "auto"
389
- },
390
- {
391
- name: "full \u2014 SQLite + FTS5 + vector embeddings (Tier 1)",
392
- value: "full"
393
- },
394
- {
395
- name: "lite \u2014 MiniSearch daemon, in-memory BM25 + fuzzy (Tier 2)",
396
- value: "lite"
397
- },
398
- {
399
- name: "markdown \u2014 file-based substring search (Tier 3)",
400
- value: "markdown"
401
- }
402
- ],
403
- "Back"
404
- )
405
- });
406
- if (choice === BACK) return;
407
- const scope = await askScope();
408
- if (scope === "back") return;
409
- writeMemoryField(scope, "tier", choice);
410
- }
411
- async function editMemoryAutoCapture(globalCfg, localCfg) {
412
- const currentValue = getMergedMemoryValue(
413
- "autoCapture",
414
- globalCfg,
415
- localCfg
416
- );
417
- if (currentValue !== void 0) {
418
- log.dim(`Current: ${currentValue}`);
419
- }
420
- const value = await confirm({
421
- message: "Auto-capture session context to memory on PreCompact (context window compression)?",
422
- default: currentValue ?? false
423
- });
424
- const scope = await askScope();
425
- if (scope === "back") return;
426
- writeMemoryField(scope, "autoCapture", value);
427
- }
428
- async function editMemoryAutoStart(globalCfg, localCfg) {
429
- const currentValue = getMergedMemoryValue(
430
- "autoStart",
431
- globalCfg,
432
- localCfg
433
- );
434
- if (currentValue !== void 0) {
435
- log.dim(`Current: ${currentValue}`);
436
- }
437
- const value = await confirm({
438
- message: "Auto-start memory daemon when MCP server connects?",
439
- default: currentValue ?? false
440
- });
441
- const scope = await askScope();
442
- if (scope === "back") return;
443
- writeMemoryField(scope, "autoStart", value);
444
- }
445
- async function editMemoryEmbedding(globalCfg, localCfg) {
446
- const currentEmbedding = getMergedMemoryValue(
447
- "embedding",
448
- globalCfg,
449
- localCfg
450
- );
451
- if (currentEmbedding) {
452
- const parts = [`provider: ${currentEmbedding.provider ?? "transformers"}`];
453
- if (currentEmbedding.model) parts.push(`model: ${currentEmbedding.model}`);
454
- if (currentEmbedding.ollamaUrl)
455
- parts.push(`url: ${currentEmbedding.ollamaUrl}`);
456
- log.dim(`Current: ${parts.join(", ")}`);
457
- }
458
- const provider = await select({
459
- message: "Embedding provider:",
460
- choices: injectBackChoice(
461
- [
462
- {
463
- name: "transformers \u2014 Transformers.js, runs in-process (no external deps)",
464
- value: "transformers"
465
- },
466
- {
467
- name: "ollama \u2014 Local Ollama server (faster, GPU support, wider model selection)",
468
- value: "ollama"
469
- }
470
- ],
471
- "Back"
472
- )
473
- });
474
- if (provider === BACK) return;
475
- let model;
476
- let ollamaUrl;
477
- if (provider === "ollama") {
478
- model = await input({
479
- message: "Ollama model name:",
480
- default: currentEmbedding?.model ?? "all-minilm:l6-v2"
481
- });
482
- ollamaUrl = await input({
483
- message: "Ollama server URL:",
484
- default: currentEmbedding?.ollamaUrl ?? "http://localhost:11434"
485
- });
486
- if (ollamaUrl === "http://localhost:11434") ollamaUrl = void 0;
487
- } else {
488
- model = await input({
489
- message: "Transformers.js model:",
490
- default: currentEmbedding?.model ?? "Xenova/all-MiniLM-L6-v2"
491
- });
492
- if (model === "Xenova/all-MiniLM-L6-v2") model = void 0;
493
- }
494
- const scope = await askScope();
495
- if (scope === "back") return;
496
- const embedding = { provider };
497
- if (model) embedding.model = model;
498
- if (ollamaUrl) embedding.ollamaUrl = ollamaUrl;
499
- writeMemoryField(scope, "embedding", embedding);
500
- }
501
- async function editMemoryDaemonTimeout(globalCfg, localCfg) {
502
- const currentDaemon = getMergedMemoryValue("daemon", globalCfg, localCfg);
503
- const currentMs = currentDaemon?.idleTimeout;
504
- const currentMin = currentMs ? currentMs / 6e4 : void 0;
505
- if (currentMin !== void 0) {
506
- log.dim(`Current: ${currentMin} minutes`);
507
- }
508
- const value = await input({
509
- message: "Daemon idle timeout (minutes):",
510
- default: String(currentMin ?? 30),
511
- validate: (val) => {
512
- const n = Number(val);
513
- if (isNaN(n) || n < 1) return "Must be a positive number";
514
- return true;
515
- }
516
- });
517
- const scope = await askScope();
518
- if (scope === "back") return;
519
- writeMemoryField(scope, "daemon", {
520
- ...currentDaemon,
521
- idleTimeout: Number(value) * 6e4
522
- });
523
- }
524
- async function memorySubMenu() {
525
- while (true) {
526
- const globalCfg = readJson(globalConfigPath());
527
- const localCfg = readJson(localConfigPath());
528
- const tierScope = getMemoryFieldScope("tier", globalCfg, localCfg);
529
- const tierVal = getMergedMemoryValue("tier", globalCfg, localCfg);
530
- const autoCaptureScope = getMemoryFieldScope(
531
- "autoCapture",
532
- globalCfg,
533
- localCfg
534
- );
535
- const autoCaptureVal = getMergedMemoryValue(
536
- "autoCapture",
537
- globalCfg,
538
- localCfg
539
- );
540
- const autoStartScope = getMemoryFieldScope(
541
- "autoStart",
542
- globalCfg,
543
- localCfg
544
- );
545
- const autoStartVal = getMergedMemoryValue(
546
- "autoStart",
547
- globalCfg,
548
- localCfg
549
- );
550
- const embeddingScope = getMemoryFieldScope(
551
- "embedding",
552
- globalCfg,
553
- localCfg
554
- );
555
- const embeddingVal = getMergedMemoryValue(
556
- "embedding",
557
- globalCfg,
558
- localCfg
559
- );
560
- const daemonScope = getMemoryFieldScope("daemon", globalCfg, localCfg);
561
- const daemonVal = getMergedMemoryValue("daemon", globalCfg, localCfg);
562
- const choice = await select({
563
- message: "Memory settings:",
564
- choices: injectBackChoice(
565
- [
566
- {
567
- name: `Tier ${formatScopeLabel(tierScope)}${tierVal ? ` (${tierVal})` : ""}`,
568
- value: "tier"
569
- },
570
- {
571
- name: `Auto-capture ${formatScopeLabel(autoCaptureScope)}${autoCaptureVal !== void 0 ? ` (${autoCaptureVal})` : ""}`,
572
- value: "autoCapture"
573
- },
574
- {
575
- name: `Auto-start daemon ${formatScopeLabel(autoStartScope)}${autoStartVal !== void 0 ? ` (${autoStartVal})` : ""}`,
576
- value: "autoStart"
577
- },
578
- {
579
- name: `Embedding ${formatScopeLabel(embeddingScope)}${embeddingVal?.provider ? ` (${embeddingVal.provider})` : ""}`,
580
- value: "embedding"
581
- },
582
- {
583
- name: `Daemon timeout ${formatScopeLabel(daemonScope)}${daemonVal?.idleTimeout ? ` (${daemonVal.idleTimeout / 6e4}min)` : ""}`,
584
- value: "daemon"
585
- }
586
- ],
587
- "Back"
588
- )
589
- });
590
- if (choice === BACK) return;
591
- switch (choice) {
592
- case "tier":
593
- await editMemoryTier(globalCfg, localCfg);
594
- break;
595
- case "autoCapture":
596
- await editMemoryAutoCapture(globalCfg, localCfg);
597
- break;
598
- case "autoStart":
599
- await editMemoryAutoStart(globalCfg, localCfg);
600
- break;
601
- case "embedding":
602
- await editMemoryEmbedding(globalCfg, localCfg);
603
- break;
604
- case "daemon":
605
- await editMemoryDaemonTimeout(globalCfg, localCfg);
606
- break;
607
- }
608
- }
609
- }
610
378
  async function editStatusline() {
611
379
  const hookResult = findStatuslineHookPath();
612
380
  if (!hookResult) {
@@ -729,6 +497,62 @@ async function editShellCompletion() {
729
497
  ensureShellCompletion({ silent: false });
730
498
  }
731
499
  }
500
+ async function editPermissions() {
501
+ const projectPath = claudeLocalSettingsPath();
502
+ const userPath = claudeSettingsPath();
503
+ const projectRules = getExistingRules(projectPath);
504
+ const userRules = getExistingRules(userPath);
505
+ const allRules = getAllRules();
506
+ const allRuleStrings = allRules.map((r) => r.rule);
507
+ const projectManaged = projectRules.filter(
508
+ (r) => allRuleStrings.includes(r)
509
+ ).length;
510
+ const userManaged = userRules.filter(
511
+ (r) => allRuleStrings.includes(r)
512
+ ).length;
513
+ console.log(
514
+ chalk.dim(
515
+ ` Project: ${projectManaged}/${allRules.length} rules \xB7 User: ${userManaged}/${allRules.length} rules`
516
+ )
517
+ );
518
+ console.log();
519
+ const choice = await select({
520
+ message: "Permissions action:",
521
+ choices: injectBackChoice(
522
+ [
523
+ {
524
+ name: "Run full permission setup (interactive)",
525
+ value: "interactive",
526
+ description: " Opens `cf permission` \u2014 pick categories and rules"
527
+ },
528
+ {
529
+ name: "Apply all recommended (project scope)",
530
+ value: "all-project",
531
+ description: " Quick: adds all recommended rules to .claude/settings.local.json"
532
+ },
533
+ {
534
+ name: "Apply all recommended (user scope)",
535
+ value: "all-user",
536
+ description: " Quick: adds all recommended rules to ~/.claude/settings.json"
537
+ }
538
+ ],
539
+ "Back"
540
+ )
541
+ });
542
+ if (choice === BACK) return;
543
+ const { permissionCommand } = await import("./permission-Z3LOBJ4X.js");
544
+ switch (choice) {
545
+ case "interactive":
546
+ await permissionCommand({});
547
+ break;
548
+ case "all-project":
549
+ await permissionCommand({ all: true, project: true });
550
+ break;
551
+ case "all-user":
552
+ await permissionCommand({ all: true, user: true });
553
+ break;
554
+ }
555
+ }
732
556
  var em = chalk.hex("#10b981");
733
557
  async function configCommand() {
734
558
  console.log();
@@ -752,6 +576,15 @@ async function configCommand() {
752
576
  const memoryScope = getScopeLabel("memory", globalCfg, localCfg);
753
577
  const statuslineStatus = isStatuslineConfigured() ? chalk.green("configured") : chalk.yellow("not configured");
754
578
  const completionStatus = hasShellCompletion() ? chalk.green("installed") : chalk.yellow("not installed");
579
+ const projectRules = getExistingRules(claudeLocalSettingsPath());
580
+ const userRules = getExistingRules(claudeSettingsPath());
581
+ const allRules = getAllRules();
582
+ const allRuleStrings = allRules.map((r) => r.rule);
583
+ const configuredCount = (/* @__PURE__ */ new Set([
584
+ ...projectRules.filter((r) => allRuleStrings.includes(r)),
585
+ ...userRules.filter((r) => allRuleStrings.includes(r))
586
+ ])).size;
587
+ const permissionStatus = configuredCount > 0 ? chalk.green(`${configuredCount}/${allRules.length}`) : chalk.yellow(`0/${allRules.length}`);
755
588
  const choice = await select({
756
589
  message: "What to configure?",
757
590
  choices: injectBackChoice(
@@ -786,6 +619,11 @@ async function configCommand() {
786
619
  value: "gitignore",
787
620
  description: " Add or update coding-friend artifacts in .gitignore"
788
621
  },
622
+ {
623
+ name: `Permissions (${permissionStatus} rules)`,
624
+ value: "permissions",
625
+ description: " Manage Claude Code permissions for Coding Friend skills and hooks"
626
+ },
789
627
  {
790
628
  name: `Shell completion (${completionStatus})`,
791
629
  value: "completion",
@@ -809,7 +647,7 @@ async function configCommand() {
809
647
  await learnSubMenu();
810
648
  break;
811
649
  case "memory":
812
- await memorySubMenu();
650
+ await memoryConfigMenu();
813
651
  break;
814
652
  case "statusline":
815
653
  await editStatusline();
@@ -817,6 +655,9 @@ async function configCommand() {
817
655
  case "gitignore":
818
656
  await editGitignore(globalCfg, localCfg);
819
657
  break;
658
+ case "permissions":
659
+ await editPermissions();
660
+ break;
820
661
  case "completion":
821
662
  await editShellCompletion();
822
663
  break;
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  isMarketplaceRegistered,
3
3
  isPluginInstalled
4
- } from "./chunk-YC6MBHCT.js";
4
+ } from "./chunk-JFGLNTZI.js";
5
5
  import {
6
6
  ensureStatusline
7
7
  } from "./chunk-ORACWEDN.js";
8
8
  import "./chunk-POC2WHU2.js";
9
9
  import {
10
10
  ensureShellCompletion
11
- } from "./chunk-DVMWMXDZ.js";
11
+ } from "./chunk-NEQZP5D4.js";
12
12
  import {
13
13
  commandExists,
14
14
  run
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  isPluginDisabled,
3
3
  setPluginEnabled
4
- } from "./chunk-YC6MBHCT.js";
4
+ } from "./chunk-JFGLNTZI.js";
5
5
  import {
6
6
  resolveScope
7
7
  } from "./chunk-C5LYVVEI.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  isPluginDisabled,
3
3
  setPluginEnabled
4
- } from "./chunk-YC6MBHCT.js";
4
+ } from "./chunk-JFGLNTZI.js";
5
5
  import {
6
6
  resolveScope
7
7
  } from "./chunk-C5LYVVEI.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveDocsDir
3
- } from "./chunk-KTX4MGMR.js";
3
+ } from "./chunk-QMD7P67N.js";
4
4
  import {
5
5
  getLibPath
6
6
  } from "./chunk-RZRT7NGT.js";
package/dist/index.js CHANGED
@@ -14,39 +14,42 @@ program.name("cf").description(
14
14
  "coding-friend CLI \u2014 host learning docs, setup MCP, init projects"
15
15
  ).version(pkg.version, "-v, --version");
16
16
  program.command("install").description("Install the Coding Friend plugin into Claude Code").option("--user", "Install at user scope (all projects)").option("--global", "Install at user scope (all projects)").option("--project", "Install at project scope (shared via git)").option("--local", "Install at local scope (this machine only)").action(async (opts) => {
17
- const { installCommand } = await import("./install-USFLRCS5.js");
17
+ const { installCommand } = await import("./install-HLCVBOXO.js");
18
18
  await installCommand(opts);
19
19
  });
20
20
  program.command("uninstall").description("Uninstall the Coding Friend plugin from Claude Code").option("--user", "Uninstall from user scope (all projects)").option("--global", "Uninstall from user scope (all projects)").option("--project", "Uninstall from project scope").option("--local", "Uninstall from local scope").action(async (opts) => {
21
- const { uninstallCommand } = await import("./uninstall-QSNKGNHR.js");
21
+ const { uninstallCommand } = await import("./uninstall-NNCEKPIE.js");
22
22
  await uninstallCommand(opts);
23
23
  });
24
24
  program.command("disable").description("Disable the Coding Friend plugin without uninstalling").option("--user", "Disable at user scope (all projects)").option("--global", "Disable at user scope (all projects)").option("--project", "Disable at project scope").option("--local", "Disable at local scope").action(async (opts) => {
25
- const { disableCommand } = await import("./disable-R6K5YJN4.js");
25
+ const { disableCommand } = await import("./disable-XYZRE3TD.js");
26
26
  await disableCommand(opts);
27
27
  });
28
28
  program.command("enable").description("Re-enable the Coding Friend plugin").option("--user", "Enable at user scope (all projects)").option("--global", "Enable at user scope (all projects)").option("--project", "Enable at project scope").option("--local", "Enable at local scope").action(async (opts) => {
29
- const { enableCommand } = await import("./enable-HF4PYVJN.js");
29
+ const { enableCommand } = await import("./enable-3NZBQWLQ.js");
30
30
  await enableCommand(opts);
31
31
  });
32
32
  program.command("init").description("Initialize coding-friend in current project").action(async () => {
33
- const { initCommand } = await import("./init-73ECEDU7.js");
33
+ const { initCommand } = await import("./init-ONUC6QMM.js");
34
34
  await initCommand();
35
35
  });
36
36
  program.command("config").description("Manage Coding Friend configuration").action(async () => {
37
- const { configCommand } = await import("./config-HVWEV2K6.js");
37
+ const { configCommand } = await import("./config-UQXY45DN.js");
38
38
  await configCommand();
39
39
  });
40
40
  program.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) => {
41
- const { hostCommand } = await import("./host-SYZH3FVC.js");
41
+ const { hostCommand } = await import("./host-QDWBFJB2.js");
42
42
  await hostCommand(path, opts);
43
43
  });
44
44
  program.command("mcp").description("Setup MCP server for learning docs").argument("[path]", "path to docs folder").action(async (path) => {
45
- const { mcpCommand } = await import("./mcp-TBEDYELW.js");
45
+ const { mcpCommand } = await import("./mcp-GFIOFXOL.js");
46
46
  await mcpCommand(path);
47
47
  });
48
- program.command("permission").description("Manage Claude Code permission rules for Coding Friend").option("--all", "Apply all recommended permissions without prompts").action(async (opts) => {
49
- const { permissionCommand } = await import("./permission-L2QQR5PO.js");
48
+ program.command("permission").description("Manage Claude Code permission rules for Coding Friend").option("--all", "Apply all recommended permissions without prompts").option("--user", "Save to user-level settings (~/.claude/settings.json)").option(
49
+ "--project",
50
+ "Save to project-level settings (.claude/settings.local.json)"
51
+ ).action(async (opts) => {
52
+ const { permissionCommand } = await import("./permission-Z3LOBJ4X.js");
50
53
  await permissionCommand(opts);
51
54
  });
52
55
  program.command("statusline").description("Setup coding-friend statusline in Claude Code").action(async () => {
@@ -54,9 +57,13 @@ program.command("statusline").description("Setup coding-friend statusline in Cla
54
57
  await statuslineCommand();
55
58
  });
56
59
  program.command("update").description("Update coding-friend plugin, CLI, and statusline").option("--cli", "Update only the CLI (npm package)").option("--plugin", "Update only the Claude Code plugin").option("--statusline", "Update only the statusline").option("--user", "Update plugin at user scope (all projects)").option("--global", "Update plugin at user scope (all projects)").option("--project", "Update plugin at project scope").option("--local", "Update plugin at local scope").action(async (opts) => {
57
- const { updateCommand } = await import("./update-PNHTIB6M.js");
60
+ const { updateCommand } = await import("./update-EVOGWLKX.js");
58
61
  await updateCommand(opts);
59
62
  });
63
+ program.command("status").description("Show comprehensive Coding Friend status").action(async () => {
64
+ const { statusCommand } = await import("./status-V324NM64.js");
65
+ await statusCommand();
66
+ });
60
67
  var session = program.command("session").description("Save and load Claude Code sessions across machines");
61
68
  program.addHelpText(
62
69
  "after",
@@ -69,11 +76,11 @@ session.command("save").description("Save current Claude Code session to sync fo
69
76
  "-s, --session-id <id>",
70
77
  "session UUID to save (default: auto-detect newest)"
71
78
  ).option("-l, --label <label>", "label for this session").action(async (opts) => {
72
- const { sessionSaveCommand } = await import("./session-H4XW2WXH.js");
79
+ const { sessionSaveCommand } = await import("./session-JGRF5SNX.js");
73
80
  await sessionSaveCommand(opts);
74
81
  });
75
82
  session.command("load").description("Load a saved session from sync folder").action(async () => {
76
- const { sessionLoadCommand } = await import("./session-H4XW2WXH.js");
83
+ const { sessionLoadCommand } = await import("./session-JGRF5SNX.js");
77
84
  await sessionLoadCommand();
78
85
  });
79
86
  var memory = program.command("memory").description("AI memory system \u2014 store and search project knowledge");
@@ -85,46 +92,51 @@ Memory subcommands:
85
92
  memory search Search memories by query
86
93
  memory list List memories in current project (--projects for all DBs)
87
94
  memory rm Remove a project database (--project-id <id>, --all, or --prune)
88
- memory init Initialize Tier 1 (install SQLite deps, import existing memories)
95
+ memory init Initialize memory system (interactive wizard)
96
+ memory config Configure memory system settings
89
97
  memory start-daemon Start the memory daemon (Tier 2)
90
98
  memory stop-daemon Stop the memory daemon
91
99
  memory rebuild Rebuild the daemon search index
92
100
  memory mcp Show MCP server setup instructions`
93
101
  );
94
102
  memory.command("status").description("Show memory system status").action(async () => {
95
- const { memoryStatusCommand } = await import("./memory-BQK2R7BV.js");
103
+ const { memoryStatusCommand } = await import("./memory-BL37DXPU.js");
96
104
  await memoryStatusCommand();
97
105
  });
98
106
  memory.command("search").description("Search memories by query").argument("<query>", "search query").action(async (query) => {
99
- const { memorySearchCommand } = await import("./memory-BQK2R7BV.js");
107
+ const { memorySearchCommand } = await import("./memory-BL37DXPU.js");
100
108
  await memorySearchCommand(query);
101
109
  });
102
110
  memory.command("list").description(
103
111
  "List memories in current project, or all projects with --projects"
104
112
  ).option("--projects", "List all project databases with size and metadata").action(async (opts) => {
105
- const { memoryListCommand } = await import("./memory-BQK2R7BV.js");
113
+ const { memoryListCommand } = await import("./memory-BL37DXPU.js");
106
114
  await memoryListCommand(opts);
107
115
  });
108
116
  memory.command("init").description(
109
- "Initialize Tier 1 \u2014 install SQLite deps and import existing memories"
117
+ "Initialize memory system \u2014 interactive wizard (first time) or config menu"
110
118
  ).action(async () => {
111
- const { memoryInitCommand } = await import("./memory-BQK2R7BV.js");
119
+ const { memoryInitCommand } = await import("./memory-BL37DXPU.js");
112
120
  await memoryInitCommand();
113
121
  });
122
+ memory.command("config").description("Configure memory system settings").action(async () => {
123
+ const { memoryConfigCommand } = await import("./memory-BL37DXPU.js");
124
+ await memoryConfigCommand();
125
+ });
114
126
  memory.command("start-daemon").description("Start the memory daemon (Tier 2 \u2014 MiniSearch)").action(async () => {
115
- const { memoryStartDaemonCommand } = await import("./memory-BQK2R7BV.js");
127
+ const { memoryStartDaemonCommand } = await import("./memory-BL37DXPU.js");
116
128
  await memoryStartDaemonCommand();
117
129
  });
118
130
  memory.command("stop-daemon").description("Stop the memory daemon").action(async () => {
119
- const { memoryStopDaemonCommand } = await import("./memory-BQK2R7BV.js");
131
+ const { memoryStopDaemonCommand } = await import("./memory-BL37DXPU.js");
120
132
  await memoryStopDaemonCommand();
121
133
  });
122
134
  memory.command("rebuild").description("Rebuild the daemon search index").action(async () => {
123
- const { memoryRebuildCommand } = await import("./memory-BQK2R7BV.js");
135
+ const { memoryRebuildCommand } = await import("./memory-BL37DXPU.js");
124
136
  await memoryRebuildCommand();
125
137
  });
126
138
  memory.command("mcp").description("Show MCP server setup instructions").action(async () => {
127
- const { memoryMcpCommand } = await import("./memory-BQK2R7BV.js");
139
+ const { memoryMcpCommand } = await import("./memory-BL37DXPU.js");
128
140
  await memoryMcpCommand();
129
141
  });
130
142
  memory.command("rm").description("Remove a project database").option("--project-id <id>", "Project ID to remove").option("--all", "Remove all project databases").option(
@@ -132,7 +144,7 @@ memory.command("rm").description("Remove a project database").option("--project-
132
144
  "Remove orphaned projects (source dir missing or 0 memories)"
133
145
  ).action(
134
146
  async (opts) => {
135
- const { memoryRmCommand } = await import("./memory-BQK2R7BV.js");
147
+ const { memoryRmCommand } = await import("./memory-BL37DXPU.js");
136
148
  await memoryRmCommand(opts);
137
149
  }
138
150
  );
@@ -149,35 +161,35 @@ Dev subcommands:
149
161
  dev update [path] Update local dev plugin to latest version`
150
162
  );
151
163
  dev.command("on").description("Switch to local plugin source").argument("[path]", "path to local coding-friend repo (default: cwd)").action(async (path) => {
152
- const { devOnCommand } = await import("./dev-AZSOM775.js");
164
+ const { devOnCommand } = await import("./dev-7DLYIXBO.js");
153
165
  await devOnCommand(path);
154
166
  });
155
167
  dev.command("off").description("Switch back to remote marketplace").action(async () => {
156
- const { devOffCommand } = await import("./dev-AZSOM775.js");
168
+ const { devOffCommand } = await import("./dev-7DLYIXBO.js");
157
169
  await devOffCommand();
158
170
  });
159
171
  dev.command("status").description("Show current dev mode").action(async () => {
160
- const { devStatusCommand } = await import("./dev-AZSOM775.js");
172
+ const { devStatusCommand } = await import("./dev-7DLYIXBO.js");
161
173
  await devStatusCommand();
162
174
  });
163
175
  dev.command("sync").description(
164
176
  "Copy local source files to plugin cache (no version bump needed)"
165
177
  ).action(async () => {
166
- const { devSyncCommand } = await import("./dev-AZSOM775.js");
178
+ const { devSyncCommand } = await import("./dev-7DLYIXBO.js");
167
179
  await devSyncCommand();
168
180
  });
169
181
  dev.command("restart").description("Reinstall local dev plugin (off + on)").argument(
170
182
  "[path]",
171
183
  "path to local coding-friend repo (default: saved path or cwd)"
172
184
  ).action(async (path) => {
173
- const { devRestartCommand } = await import("./dev-AZSOM775.js");
185
+ const { devRestartCommand } = await import("./dev-7DLYIXBO.js");
174
186
  await devRestartCommand(path);
175
187
  });
176
188
  dev.command("update").description("Update local dev plugin to latest version (off + on)").argument(
177
189
  "[path]",
178
190
  "path to local coding-friend repo (default: saved path or cwd)"
179
191
  ).action(async (path) => {
180
- const { devUpdateCommand } = await import("./dev-AZSOM775.js");
192
+ const { devUpdateCommand } = await import("./dev-7DLYIXBO.js");
181
193
  await devUpdateCommand(path);
182
194
  });
183
195
  program.parse();