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.
- package/README.md +9 -3
- package/dist/chunk-7CAIGH2Y.js +365 -0
- package/dist/{chunk-UWQPMVJY.js → chunk-IRPW2BMP.js} +3 -1
- package/dist/{chunk-YC6MBHCT.js → chunk-JFGLNTZI.js} +13 -0
- package/dist/{chunk-DVMWMXDZ.js → chunk-NEQZP5D4.js} +31 -6
- package/dist/{chunk-KTX4MGMR.js → chunk-QMD7P67N.js} +24 -4
- package/dist/chunk-WEMDLEK5.js +331 -0
- package/dist/{config-HVWEV2K6.js → config-UQXY45DN.js} +85 -244
- package/dist/{dev-AZSOM775.js → dev-7DLYIXBO.js} +2 -2
- package/dist/{disable-R6K5YJN4.js → disable-XYZRE3TD.js} +1 -1
- package/dist/{enable-HF4PYVJN.js → enable-3NZBQWLQ.js} +1 -1
- package/dist/{host-SYZH3FVC.js → host-QDWBFJB2.js} +1 -1
- package/dist/index.js +42 -30
- package/dist/{init-73ECEDU7.js → init-ONUC6QMM.js} +220 -35
- package/dist/{install-USFLRCS5.js → install-HLCVBOXO.js} +3 -3
- package/dist/{mcp-TBEDYELW.js → mcp-GFIOFXOL.js} +1 -1
- package/dist/{memory-BQK2R7BV.js → memory-BL37DXPU.js} +141 -21
- package/dist/{permission-L2QQR5PO.js → permission-Z3LOBJ4X.js} +72 -11
- package/dist/postinstall.js +1 -1
- package/dist/{session-H4XW2WXH.js → session-JGRF5SNX.js} +1 -1
- package/dist/status-V324NM64.js +223 -0
- package/dist/{uninstall-QSNKGNHR.js → uninstall-NNCEKPIE.js} +2 -2
- package/dist/{update-PNHTIB6M.js → update-EVOGWLKX.js} +6 -2
- package/package.json +1 -1
- package/dist/chunk-56U7US6J.js +0 -198
|
@@ -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-
|
|
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
|
|
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-
|
|
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-
|
|
11
|
+
} from "./chunk-NEQZP5D4.js";
|
|
12
12
|
import {
|
|
13
13
|
commandExists,
|
|
14
14
|
run
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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").
|
|
49
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
113
|
+
const { memoryListCommand } = await import("./memory-BL37DXPU.js");
|
|
106
114
|
await memoryListCommand(opts);
|
|
107
115
|
});
|
|
108
116
|
memory.command("init").description(
|
|
109
|
-
"Initialize
|
|
117
|
+
"Initialize memory system \u2014 interactive wizard (first time) or config menu"
|
|
110
118
|
).action(async () => {
|
|
111
|
-
const { memoryInitCommand } = await import("./memory-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
192
|
+
const { devUpdateCommand } = await import("./dev-7DLYIXBO.js");
|
|
181
193
|
await devUpdateCommand(path);
|
|
182
194
|
});
|
|
183
195
|
program.parse();
|