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.
- package/dist/{chunk-KT5RLAFH.js → chunk-2M42TEZC.js} +3 -3
- package/dist/{chunk-CZW36H3D.js → chunk-BQ4E66ZV.js} +1 -1
- package/dist/{chunk-4FQACYCV.js → chunk-FSQCAHWF.js} +34 -8
- package/dist/{chunk-TFF47F7P.js → chunk-HEVK3OYL.js} +1 -1
- package/dist/{chunk-KG6HYBGD.js → chunk-PIXAQLXQ.js} +43 -6
- package/dist/{chunk-Z5XTSF7L.js → chunk-XLB2UAKL.js} +40 -2
- package/dist/{config-A4JIINZK.js → config-OFGL545F.js} +4 -4
- package/dist/{dev-E3EHPMHE.js → dev-GCVXE5TW.js} +5 -17
- package/dist/{disable-DCGVIHKG.js → disable-CN6GAG4I.js} +1 -1
- package/dist/{enable-YYWJDOYB.js → enable-MRLKTJRB.js} +1 -1
- package/dist/index.js +26 -26
- package/dist/{init-ORERNRR7.js → init-XAWQUS2X.js} +361 -266
- package/dist/{install-MS7SS2L5.js → install-B3646W7P.js} +3 -3
- package/dist/{mcp-XGWHYBEN.js → mcp-ZG56IYLD.js} +4 -4
- package/dist/{memory-KNKGLCVG.js → memory-LBVPVWJQ.js} +4 -4
- package/dist/{permission-DDBMBFJV.js → permission-W3NM7HOL.js} +3 -3
- package/dist/{status-WICNVD7B.js → status-GQ3ZDYZ4.js} +5 -5
- package/dist/{uninstall-6QKNGLKK.js → uninstall-S5FSXBYX.js} +2 -2
- package/dist/{update-6YMGKFUB.js → update-HGEF46T5.js} +5 -3
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
checkMemoryMcpHealth,
|
|
3
3
|
printHealthSection,
|
|
4
4
|
warnStaleMcpJson
|
|
5
|
-
} from "./chunk-
|
|
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-
|
|
15
|
+
} from "./chunk-BQ4E66ZV.js";
|
|
16
16
|
import {
|
|
17
17
|
showConfigHint
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-XLB2UAKL.js";
|
|
19
19
|
import {
|
|
20
20
|
getLibPath
|
|
21
21
|
} from "./chunk-TN3Y75WG.js";
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
isMemoryMcpRegistered,
|
|
10
10
|
registerMemoryMcp,
|
|
11
11
|
removeMemoryMcpEntry
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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
|
};
|
|
@@ -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
|
|
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
|
|
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(
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
246
|
-
|
|
247
|
-
if (existsSync(
|
|
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
|
);
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
295
|
+
const { devUpdateCommand } = await import("./dev-GCVXE5TW.js");
|
|
296
296
|
await devUpdateCommand(path);
|
|
297
297
|
});
|
|
298
298
|
program.hook("postAction", async () => {
|