coding-friend-cli 1.38.2 → 1.38.4
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-RFNKPAJW.js → chunk-5KHZQCZB.js} +6 -1
- package/dist/{chunk-XAYWGZQT.js → chunk-I2DQYPKT.js} +1 -1
- package/dist/{chunk-CGEMETKQ.js → chunk-S4ENKXXC.js} +3 -5
- package/dist/{chunk-ONG4KRYP.js → chunk-VHUU3QDC.js} +4 -12
- package/dist/{clean-YWEMYDE5.js → clean-MSRZSOSO.js} +44 -6
- package/dist/{config-NG7SICM4.js → config-EX3B3HWO.js} +1 -1
- package/dist/{host-EV6QIVTI.js → host-VIQ5YI3V.js} +1 -1
- package/dist/index.js +24 -24
- package/dist/{init-EMBQJNTT.js → init-S2K4CQO2.js} +5 -5
- package/dist/{install-3YEPLDMD.js → install-LUPE3VTC.js} +1 -1
- package/dist/{learn-MC4VDHZH.js → learn-A3TP6PLL.js} +1 -1
- package/dist/{mcp-FV6YX3ZT.js → mcp-QNJTCZMS.js} +3 -3
- package/dist/{mcp-serve-PXREYQRZ.js → mcp-serve-4VP4KDYG.js} +1 -1
- package/dist/{memory-DF7OUOTV.js → memory-7GKTQSIW.js} +3 -3
- package/dist/{session-QK6OZO3X.js → session-VDGNTICO.js} +1 -1
- package/dist/{status-6HQRVZKR.js → status-RHSL5MBU.js} +3 -3
- package/dist/{uninstall-MF6FRUBO.js → uninstall-QN6527IR.js} +6 -2
- package/dist/{update-SMWXKJ3R.js → update-ZQG25VOJ.js} +1 -1
- package/lib/learn-host/src/components/Breadcrumbs.tsx +1 -1
- package/package.json +1 -1
|
@@ -23,7 +23,12 @@ import { z } from "zod";
|
|
|
23
23
|
// src/lib/project-root.ts
|
|
24
24
|
import { resolve } from "path";
|
|
25
25
|
function resolveMainRepoRoot(baseDir) {
|
|
26
|
-
const gitCommonDir = run("git", [
|
|
26
|
+
const gitCommonDir = run("git", [
|
|
27
|
+
"-C",
|
|
28
|
+
baseDir,
|
|
29
|
+
"rev-parse",
|
|
30
|
+
"--git-common-dir"
|
|
31
|
+
]);
|
|
27
32
|
if (!gitCommonDir) {
|
|
28
33
|
return resolve(baseDir);
|
|
29
34
|
}
|
|
@@ -235,7 +235,7 @@ async function updateCommand(opts) {
|
|
|
235
235
|
}
|
|
236
236
|
let refreshMemoryAfterUpdate = null;
|
|
237
237
|
if (doCli) {
|
|
238
|
-
({ refreshMemoryAfterUpdate } = await import("./memory-
|
|
238
|
+
({ refreshMemoryAfterUpdate } = await import("./memory-7GKTQSIW.js"));
|
|
239
239
|
if (!latestCliVersion) {
|
|
240
240
|
log.warn("Cannot check latest CLI version from npm.");
|
|
241
241
|
} else {
|
|
@@ -2,11 +2,11 @@ import {
|
|
|
2
2
|
checkMemoryMcpHealth,
|
|
3
3
|
printHealthSection,
|
|
4
4
|
warnStaleMcpJson
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-VHUU3QDC.js";
|
|
6
6
|
import {
|
|
7
7
|
loadConfig,
|
|
8
8
|
resolveMemoryDir
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-5KHZQCZB.js";
|
|
10
10
|
import {
|
|
11
11
|
getMemoryMcpStatus,
|
|
12
12
|
isMemoryMcpRegistered,
|
|
@@ -201,9 +201,7 @@ async function memoryStatusCommand() {
|
|
|
201
201
|
`MCP: ${chalk.green("registered")} ${chalk.dim("(user scope)")} ${chalk.yellow('\u26A0 project .mcp.json shadows user-scope server \u2014 run "cf update" to clean up')}`
|
|
202
202
|
);
|
|
203
203
|
} else if (mcpStatus.userScope) {
|
|
204
|
-
log.info(
|
|
205
|
-
`MCP: ${chalk.green("registered")} ${chalk.dim("(user scope)")}`
|
|
206
|
-
);
|
|
204
|
+
log.info(`MCP: ${chalk.green("registered")} ${chalk.dim("(user scope)")}`);
|
|
207
205
|
} else if (mcpStatus.configured && mcpStatus.scope === "local") {
|
|
208
206
|
log.info(
|
|
209
207
|
`MCP: ${chalk.yellow("configured")} ${chalk.dim('(local .mcp.json \u2014 run "cf mcp" to migrate to user scope)')}`
|
|
@@ -24,33 +24,25 @@ function warnStaleMcpJson() {
|
|
|
24
24
|
}
|
|
25
25
|
const state = detectMemoryMcpState(mcpJson, existsSync);
|
|
26
26
|
if (state.kind === "stale") {
|
|
27
|
-
console.log(
|
|
28
|
-
chalk.yellow(`\u26A0 Stale MCP config detected in .mcp.json`)
|
|
29
|
-
);
|
|
27
|
+
console.log(chalk.yellow(`\u26A0 Stale MCP config detected in .mcp.json`));
|
|
30
28
|
console.log(chalk.dim(` Path no longer exists: ${state.path}`));
|
|
31
29
|
console.log(
|
|
32
30
|
chalk.dim(
|
|
33
31
|
` This project-scope coding-friend-memory entry shadows the global (user-scope) memory server.`
|
|
34
32
|
)
|
|
35
33
|
);
|
|
36
|
-
console.log(
|
|
37
|
-
chalk.dim(` Run "cf update" to remove it automatically.`)
|
|
38
|
-
);
|
|
34
|
+
console.log(chalk.dim(` Run "cf update" to remove it automatically.`));
|
|
39
35
|
console.log();
|
|
40
36
|
} else if (state.kind === "legacy-valid") {
|
|
41
37
|
console.log(
|
|
42
|
-
chalk.cyan(
|
|
43
|
-
`\u2139 .mcp.json has a project-scope coding-friend-memory entry.`
|
|
44
|
-
)
|
|
38
|
+
chalk.cyan(`\u2139 .mcp.json has a project-scope coding-friend-memory entry.`)
|
|
45
39
|
);
|
|
46
40
|
console.log(
|
|
47
41
|
chalk.dim(
|
|
48
42
|
` This shadows the global (user-scope) memory server (Claude Code precedence: local > project > user).`
|
|
49
43
|
)
|
|
50
44
|
);
|
|
51
|
-
console.log(
|
|
52
|
-
chalk.dim(` Run "cf update" to remove it automatically.`)
|
|
53
|
-
);
|
|
45
|
+
console.log(chalk.dim(` Run "cf update" to remove it automatically.`));
|
|
54
46
|
console.log();
|
|
55
47
|
}
|
|
56
48
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadConfig,
|
|
3
3
|
resolveMemoryDir
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-5KHZQCZB.js";
|
|
5
5
|
import "./chunk-3WIZA5OZ.js";
|
|
6
6
|
import "./chunk-EVGXUDX4.js";
|
|
7
7
|
import "./chunk-5UVDWG5L.js";
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
} from "./chunk-NREZK463.js";
|
|
15
15
|
|
|
16
16
|
// src/commands/clean.ts
|
|
17
|
-
import { existsSync, readdirSync, rmSync, statSync } from "fs";
|
|
17
|
+
import { existsSync, readFileSync, readdirSync, rmSync, statSync } from "fs";
|
|
18
18
|
import { join, relative } from "path";
|
|
19
19
|
import { confirm, input, select } from "@inquirer/prompts";
|
|
20
20
|
import chalk from "chalk";
|
|
@@ -55,6 +55,32 @@ function matchesRange(entryPath, name, range, cutoff, now) {
|
|
|
55
55
|
return cutoff !== null && date.getTime() < cutoff.getTime();
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
|
+
var STATUS_RE = /^status:\s*([^\s#]+)/m;
|
|
59
|
+
function readPlanStatus(entryPath, isDirectory) {
|
|
60
|
+
let file;
|
|
61
|
+
if (isDirectory) {
|
|
62
|
+
file = join(entryPath, "README.md");
|
|
63
|
+
} else if (entryPath.endsWith(".md")) {
|
|
64
|
+
file = entryPath;
|
|
65
|
+
} else {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
if (!existsSync(file)) return null;
|
|
69
|
+
try {
|
|
70
|
+
const content = readFileSync(file, "utf8");
|
|
71
|
+
if (!content.startsWith("---")) return null;
|
|
72
|
+
const end = content.indexOf("\n---", 3);
|
|
73
|
+
if (end === -1) return null;
|
|
74
|
+
const frontmatter = content.slice(3, end);
|
|
75
|
+
const m = STATUS_RE.exec(frontmatter);
|
|
76
|
+
return m ? m[1].trim().toLowerCase() : null;
|
|
77
|
+
} catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function isDonePlan(entryPath, isDirectory) {
|
|
82
|
+
return readPlanStatus(entryPath, isDirectory) === "done";
|
|
83
|
+
}
|
|
58
84
|
function countFiles(dir) {
|
|
59
85
|
if (!existsSync(dir)) return 0;
|
|
60
86
|
let count = 0;
|
|
@@ -68,12 +94,13 @@ function countFiles(dir) {
|
|
|
68
94
|
}
|
|
69
95
|
return count;
|
|
70
96
|
}
|
|
71
|
-
function deleteMatchingEntries(dir, range, cutoff, now) {
|
|
97
|
+
function deleteMatchingEntries(dir, range, cutoff, now, extraFilter) {
|
|
72
98
|
if (!existsSync(dir)) return { deleted: 0, failed: 0 };
|
|
73
99
|
let deleted = 0;
|
|
74
100
|
let failed = 0;
|
|
75
101
|
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
76
102
|
const entryPath = join(dir, entry.name);
|
|
103
|
+
if (extraFilter && !extraFilter(entryPath, entry.isDirectory())) continue;
|
|
77
104
|
if (matchesRange(entryPath, entry.name, range, cutoff, now)) {
|
|
78
105
|
const filesBefore = entry.isDirectory() ? countFiles(entryPath) : 1;
|
|
79
106
|
try {
|
|
@@ -147,7 +174,15 @@ async function cleanCommand() {
|
|
|
147
174
|
console.log(`${chalk.yellow("\u2192")} ${chalk.bold(entry.key)} (${relPath})`);
|
|
148
175
|
const { range, cutoff } = await promptDateRange();
|
|
149
176
|
const isMemory = entry.key === "memory";
|
|
150
|
-
const
|
|
177
|
+
const isPlans = entry.key === "plans";
|
|
178
|
+
let message;
|
|
179
|
+
if (isMemory) {
|
|
180
|
+
message = `Delete matching contents of ${relPath}/? (includes SQLite databases \u2014 stop memory daemon first if running)`;
|
|
181
|
+
} else if (isPlans) {
|
|
182
|
+
message = `Delete matching plans in ${relPath}/? (only plans with frontmatter status: done are removed \u2014 in-progress/failed plans are kept)`;
|
|
183
|
+
} else {
|
|
184
|
+
message = `Delete matching contents of ${relPath}/?`;
|
|
185
|
+
}
|
|
151
186
|
const ok = await confirm({ message, default: false });
|
|
152
187
|
if (ok) {
|
|
153
188
|
const now = /* @__PURE__ */ new Date();
|
|
@@ -155,7 +190,8 @@ async function cleanCommand() {
|
|
|
155
190
|
entry.path,
|
|
156
191
|
range,
|
|
157
192
|
cutoff,
|
|
158
|
-
now
|
|
193
|
+
now,
|
|
194
|
+
isPlans ? isDonePlan : void 0
|
|
159
195
|
);
|
|
160
196
|
summary.push({ key: entry.key, deleted });
|
|
161
197
|
const failNote = failed > 0 ? `, ${failed} failed` : "";
|
|
@@ -181,7 +217,9 @@ async function cleanCommand() {
|
|
|
181
217
|
export {
|
|
182
218
|
cleanCommand,
|
|
183
219
|
getEffectiveDate,
|
|
220
|
+
isDonePlan,
|
|
184
221
|
matchesRange,
|
|
185
222
|
olderThanDays,
|
|
186
|
-
parseDateFromName
|
|
223
|
+
parseDateFromName,
|
|
224
|
+
readPlanStatus
|
|
187
225
|
};
|
package/dist/index.js
CHANGED
|
@@ -43,14 +43,14 @@ program.name("cf").description(
|
|
|
43
43
|
"coding-friend CLI \u2014 host learning docs, setup MCP, init projects"
|
|
44
44
|
).version(wantsVersion ? buildVersionString() : pkg.version, "-v, --version");
|
|
45
45
|
program.command("install").description("Install the Coding Friend plugin into a supported host").option("--user", "Install at user scope (all projects)").option("--global", "Install at user scope (all projects)").option("--project", "Install at project scope (shared via git)").option("--local", "Install at local scope (this machine only)").option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").action(async (opts) => {
|
|
46
|
-
const { installCommand } = await import("./install-
|
|
46
|
+
const { installCommand } = await import("./install-LUPE3VTC.js");
|
|
47
47
|
await installCommand(opts);
|
|
48
48
|
});
|
|
49
49
|
program.command("uninstall").description("Uninstall the Coding Friend plugin from a supported host").option("--user", "Uninstall from user scope (all projects)").option("--global", "Uninstall from user scope (all projects)").option("--project", "Uninstall from project scope").option("--local", "Uninstall from local scope").option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").option(
|
|
50
50
|
"--remove-marketplace",
|
|
51
51
|
"Also remove the host marketplace registration"
|
|
52
52
|
).action(async (opts) => {
|
|
53
|
-
const { uninstallCommand } = await import("./uninstall-
|
|
53
|
+
const { uninstallCommand } = await import("./uninstall-QN6527IR.js");
|
|
54
54
|
await uninstallCommand(opts);
|
|
55
55
|
});
|
|
56
56
|
program.command("disable").description("Disable the Coding Friend plugin without uninstalling").option("--user", "Disable at user scope (all projects)").option("--global", "Disable at user scope (all projects)").option("--project", "Disable at project scope").option("--local", "Disable at local scope").option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").action(async (opts) => {
|
|
@@ -65,11 +65,11 @@ program.command("init").description("Initialize coding-friend in current project
|
|
|
65
65
|
"--trust-project",
|
|
66
66
|
"For Codex, mark the current project trusted in ~/.codex/config.toml"
|
|
67
67
|
).action(async (opts) => {
|
|
68
|
-
const { initCommand } = await import("./init-
|
|
68
|
+
const { initCommand } = await import("./init-S2K4CQO2.js");
|
|
69
69
|
await initCommand(opts);
|
|
70
70
|
});
|
|
71
71
|
program.command("config").description("Manage Coding Friend configuration").action(async () => {
|
|
72
|
-
const { configCommand } = await import("./config-
|
|
72
|
+
const { configCommand } = await import("./config-EX3B3HWO.js");
|
|
73
73
|
await configCommand();
|
|
74
74
|
});
|
|
75
75
|
var learn = program.command("learn").description("Manage learning docs \u2014 host as a website or push to git");
|
|
@@ -81,25 +81,25 @@ Learn subcommands:
|
|
|
81
81
|
learn push [path] Commit and push learning docs (only if learn dir is the git root)`
|
|
82
82
|
);
|
|
83
83
|
learn.command("host").description("Build and serve learning docs as a static website").argument("[path]", "path to docs folder").option("-p, --port <port>", "port number", "3333").action(async (path, opts) => {
|
|
84
|
-
const { hostCommand } = await import("./host-
|
|
84
|
+
const { hostCommand } = await import("./host-VIQ5YI3V.js");
|
|
85
85
|
await hostCommand(path, opts);
|
|
86
86
|
});
|
|
87
87
|
learn.command("push").description("Commit and push learning docs to origin").argument("[path]", "path to docs folder").action(async (path) => {
|
|
88
|
-
const { learnPushCommand } = await import("./learn-
|
|
88
|
+
const { learnPushCommand } = await import("./learn-A3TP6PLL.js");
|
|
89
89
|
await learnPushCommand(path);
|
|
90
90
|
});
|
|
91
91
|
program.command("host", { hidden: true }).argument("[path]", "path to docs folder").option("-p, --port <port>", "port number", "3333").action(async (path, opts) => {
|
|
92
|
-
const { hostCommand } = await import("./host-
|
|
92
|
+
const { hostCommand } = await import("./host-VIQ5YI3V.js");
|
|
93
93
|
await hostCommand(path, opts);
|
|
94
94
|
});
|
|
95
95
|
program.command("mcp").description("Setup MCP server for learning docs").action(async () => {
|
|
96
|
-
const { mcpCommand } = await import("./mcp-
|
|
96
|
+
const { mcpCommand } = await import("./mcp-QNJTCZMS.js");
|
|
97
97
|
await mcpCommand();
|
|
98
98
|
});
|
|
99
99
|
program.command("mcp-serve").description(
|
|
100
100
|
"Start the cf-memory MCP server (used internally by npx). When memoryDir is omitted, resolves from CLAUDE_PROJECT_DIR at runtime."
|
|
101
101
|
).argument("[memoryDir]", "path to memory directory (optional)").action(async (memoryDir) => {
|
|
102
|
-
const { mcpServeCommand } = await import("./mcp-serve-
|
|
102
|
+
const { mcpServeCommand } = await import("./mcp-serve-4VP4KDYG.js");
|
|
103
103
|
await mcpServeCommand(memoryDir);
|
|
104
104
|
});
|
|
105
105
|
program.command("mcp-serve-learn").description("Start the learn MCP server (used internally by npx)").argument("<docsDir>", "path to docs directory").action(async (docsDir) => {
|
|
@@ -124,15 +124,15 @@ program.command("statusline").description("Setup coding-friend statusline in Cla
|
|
|
124
124
|
await statuslineCommand();
|
|
125
125
|
});
|
|
126
126
|
program.command("update").description("Update coding-friend plugin, CLI, and statusline").option("--cli", "Update only the CLI (npm package)").option("--plugin", "Update only the host plugin").option("--statusline", "Update only the statusline").option("--user", "Update plugin at user scope (all projects)").option("--global", "Update plugin at user scope (all projects)").option("--project", "Update plugin at project scope").option("--local", "Update plugin at local scope").option("--agent <agent>", "Operate on host agent: claude or codex", "claude").option("--codex", "Alias for --agent codex").action(async (opts) => {
|
|
127
|
-
const { updateCommand } = await import("./update-
|
|
127
|
+
const { updateCommand } = await import("./update-ZQG25VOJ.js");
|
|
128
128
|
await updateCommand(opts);
|
|
129
129
|
});
|
|
130
130
|
program.command("status").description("Show comprehensive Coding Friend status").action(async () => {
|
|
131
|
-
const { statusCommand } = await import("./status-
|
|
131
|
+
const { statusCommand } = await import("./status-RHSL5MBU.js");
|
|
132
132
|
await statusCommand();
|
|
133
133
|
});
|
|
134
134
|
program.command("clean").description("Clean files generated by Coding Friend in docs/").action(async () => {
|
|
135
|
-
const { cleanCommand } = await import("./clean-
|
|
135
|
+
const { cleanCommand } = await import("./clean-MSRZSOSO.js");
|
|
136
136
|
await cleanCommand();
|
|
137
137
|
});
|
|
138
138
|
var session = program.command("session").description("[beta] Save and load Claude Code sessions across machines");
|
|
@@ -147,11 +147,11 @@ session.command("save").description("Save current Claude Code session to sync fo
|
|
|
147
147
|
"-s, --session-id <id>",
|
|
148
148
|
"session UUID to save (default: auto-detect newest)"
|
|
149
149
|
).option("-l, --label <label>", "label for this session").action(async (opts) => {
|
|
150
|
-
const { sessionSaveCommand } = await import("./session-
|
|
150
|
+
const { sessionSaveCommand } = await import("./session-VDGNTICO.js");
|
|
151
151
|
await sessionSaveCommand(opts);
|
|
152
152
|
});
|
|
153
153
|
session.command("load").description("Load a saved session from sync folder").action(async () => {
|
|
154
|
-
const { sessionLoadCommand } = await import("./session-
|
|
154
|
+
const { sessionLoadCommand } = await import("./session-VDGNTICO.js");
|
|
155
155
|
await sessionLoadCommand();
|
|
156
156
|
});
|
|
157
157
|
var memory = program.command("memory").description("AI memory system \u2014 store and search project knowledge");
|
|
@@ -171,43 +171,43 @@ Memory subcommands:
|
|
|
171
171
|
memory mcp Show MCP server setup instructions`
|
|
172
172
|
);
|
|
173
173
|
memory.command("status").description("Show memory system status").action(async () => {
|
|
174
|
-
const { memoryStatusCommand } = await import("./memory-
|
|
174
|
+
const { memoryStatusCommand } = await import("./memory-7GKTQSIW.js");
|
|
175
175
|
await memoryStatusCommand();
|
|
176
176
|
});
|
|
177
177
|
memory.command("search").description("Search memories by query").argument("<query>", "search query").action(async (query) => {
|
|
178
|
-
const { memorySearchCommand } = await import("./memory-
|
|
178
|
+
const { memorySearchCommand } = await import("./memory-7GKTQSIW.js");
|
|
179
179
|
await memorySearchCommand(query);
|
|
180
180
|
});
|
|
181
181
|
memory.command("list").description(
|
|
182
182
|
"List memories in current project, or all projects with --projects"
|
|
183
183
|
).option("--projects", "List all project databases with size and metadata").action(async (opts) => {
|
|
184
|
-
const { memoryListCommand } = await import("./memory-
|
|
184
|
+
const { memoryListCommand } = await import("./memory-7GKTQSIW.js");
|
|
185
185
|
await memoryListCommand(opts);
|
|
186
186
|
});
|
|
187
187
|
memory.command("init").description(
|
|
188
188
|
"Initialize memory system \u2014 interactive wizard (first time) or config menu"
|
|
189
189
|
).action(async () => {
|
|
190
|
-
const { memoryInitCommand } = await import("./memory-
|
|
190
|
+
const { memoryInitCommand } = await import("./memory-7GKTQSIW.js");
|
|
191
191
|
await memoryInitCommand();
|
|
192
192
|
});
|
|
193
193
|
memory.command("config").description("Configure memory system settings").action(async () => {
|
|
194
|
-
const { memoryConfigCommand } = await import("./memory-
|
|
194
|
+
const { memoryConfigCommand } = await import("./memory-7GKTQSIW.js");
|
|
195
195
|
await memoryConfigCommand();
|
|
196
196
|
});
|
|
197
197
|
memory.command("start-daemon").description("Start the memory daemon (Tier 2 \u2014 MiniSearch)").action(async () => {
|
|
198
|
-
const { memoryStartDaemonCommand } = await import("./memory-
|
|
198
|
+
const { memoryStartDaemonCommand } = await import("./memory-7GKTQSIW.js");
|
|
199
199
|
await memoryStartDaemonCommand();
|
|
200
200
|
});
|
|
201
201
|
memory.command("stop-daemon").description("Stop the memory daemon").action(async () => {
|
|
202
|
-
const { memoryStopDaemonCommand } = await import("./memory-
|
|
202
|
+
const { memoryStopDaemonCommand } = await import("./memory-7GKTQSIW.js");
|
|
203
203
|
await memoryStopDaemonCommand();
|
|
204
204
|
});
|
|
205
205
|
memory.command("rebuild").description("Rebuild the daemon search index").action(async () => {
|
|
206
|
-
const { memoryRebuildCommand } = await import("./memory-
|
|
206
|
+
const { memoryRebuildCommand } = await import("./memory-7GKTQSIW.js");
|
|
207
207
|
await memoryRebuildCommand();
|
|
208
208
|
});
|
|
209
209
|
memory.command("mcp").description("Show MCP server setup instructions").action(async () => {
|
|
210
|
-
const { memoryMcpCommand } = await import("./memory-
|
|
210
|
+
const { memoryMcpCommand } = await import("./memory-7GKTQSIW.js");
|
|
211
211
|
await memoryMcpCommand();
|
|
212
212
|
});
|
|
213
213
|
memory.command("rm").description("Remove a project database").option("--project-id <id>", "Project ID to remove").option("--all", "Remove all project databases").option(
|
|
@@ -215,7 +215,7 @@ memory.command("rm").description("Remove a project database").option("--project-
|
|
|
215
215
|
"Remove orphaned projects (source dir missing or 0 memories)"
|
|
216
216
|
).action(
|
|
217
217
|
async (opts) => {
|
|
218
|
-
const { memoryRmCommand } = await import("./memory-
|
|
218
|
+
const { memoryRmCommand } = await import("./memory-7GKTQSIW.js");
|
|
219
219
|
await memoryRmCommand(opts);
|
|
220
220
|
}
|
|
221
221
|
);
|
|
@@ -15,9 +15,9 @@ import {
|
|
|
15
15
|
ensureMemoryBuilt,
|
|
16
16
|
isMemoryInitialized,
|
|
17
17
|
memoryInitWizard
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
18
|
+
} from "./chunk-S4ENKXXC.js";
|
|
19
|
+
import "./chunk-VHUU3QDC.js";
|
|
20
|
+
import "./chunk-5KHZQCZB.js";
|
|
21
21
|
import {
|
|
22
22
|
findStatuslineHookPath,
|
|
23
23
|
getCurrentAccountEmail,
|
|
@@ -1214,7 +1214,7 @@ async function initCommand(opts = {}) {
|
|
|
1214
1214
|
console.log();
|
|
1215
1215
|
log.congrats("Setup complete!");
|
|
1216
1216
|
log.dim(
|
|
1217
|
-
"Available commands: /cf-ask, /cf-plan, /cf-design, /cf-fix, /cf-commit, /cf-review, /cf-review-out, /cf-review-in, /cf-ship, /cf-optimize, /cf-scan, /cf-remember, /cf-learn, /cf-teach, /cf-research, /cf-session, /cf-warm, /cf-checkpoint, /cf-checkpoint-from, /cf-help"
|
|
1217
|
+
"Available commands: /cf-ask, /cf-plan, /cf-later-do, /cf-design, /cf-fix, /cf-commit, /cf-review, /cf-review-out, /cf-review-in, /cf-ship, /cf-optimize, /cf-scan, /cf-remember, /cf-learn, /cf-teach, /cf-research, /cf-session, /cf-warm, /cf-checkpoint, /cf-checkpoint-from, /cf-help"
|
|
1218
1218
|
);
|
|
1219
1219
|
}
|
|
1220
1220
|
function initCodexCommand(opts) {
|
|
@@ -1292,7 +1292,7 @@ Use Coding Friend skills with Codex's $skill syntax.
|
|
|
1292
1292
|
|
|
1293
1293
|
## Skills
|
|
1294
1294
|
|
|
1295
|
-
$cf-ask, $cf-plan, $cf-review, $cf-review-out, $cf-review-in, $cf-commit, $cf-design, $cf-ship, $cf-fix, $cf-optimize, $cf-scan, $cf-remember, $cf-learn, $cf-teach, $cf-research, $cf-session, $cf-warm, $cf-checkpoint, $cf-checkpoint-from, $cf-help
|
|
1295
|
+
$cf-ask, $cf-plan, $cf-later-do, $cf-review, $cf-review-out, $cf-review-in, $cf-commit, $cf-design, $cf-ship, $cf-fix, $cf-optimize, $cf-scan, $cf-remember, $cf-learn, $cf-teach, $cf-research, $cf-session, $cf-warm, $cf-checkpoint, $cf-checkpoint-from, $cf-help
|
|
1296
1296
|
`;
|
|
1297
1297
|
}
|
|
1298
1298
|
function ensureGitignoreEntry(entry) {
|
|
@@ -8,18 +8,18 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
ensureMemoryBuilt,
|
|
10
10
|
printMemoryMcpConfig
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-S4ENKXXC.js";
|
|
12
12
|
import {
|
|
13
13
|
checkLearnMcpHealth,
|
|
14
14
|
checkMemoryMcpHealth,
|
|
15
15
|
detectMemoryMcpState,
|
|
16
16
|
printHealthSection,
|
|
17
17
|
warnStaleMcpJson
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-VHUU3QDC.js";
|
|
19
19
|
import {
|
|
20
20
|
resolveLearnDir,
|
|
21
21
|
resolveMemoryDir
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-5KHZQCZB.js";
|
|
23
23
|
import "./chunk-3WIZA5OZ.js";
|
|
24
24
|
import {
|
|
25
25
|
isMemoryMcpRegistered,
|
|
@@ -14,9 +14,9 @@ import {
|
|
|
14
14
|
memoryStopDaemonCommand,
|
|
15
15
|
printMemoryMcpConfig,
|
|
16
16
|
refreshMemoryAfterUpdate
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-S4ENKXXC.js";
|
|
18
|
+
import "./chunk-VHUU3QDC.js";
|
|
19
|
+
import "./chunk-5KHZQCZB.js";
|
|
20
20
|
import "./chunk-3WIZA5OZ.js";
|
|
21
21
|
import "./chunk-BXSCYGWE.js";
|
|
22
22
|
import "./chunk-RZRT7NGT.js";
|
|
@@ -10,18 +10,18 @@ import {
|
|
|
10
10
|
import {
|
|
11
11
|
checkLearnMcpHealth,
|
|
12
12
|
checkMemoryMcpHealth
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-VHUU3QDC.js";
|
|
14
14
|
import {
|
|
15
15
|
resolveLearnDir,
|
|
16
16
|
resolveMemoryDir,
|
|
17
17
|
sanitizeRawConfig
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-5KHZQCZB.js";
|
|
19
19
|
import {
|
|
20
20
|
getCliVersion,
|
|
21
21
|
getLatestCliVersion,
|
|
22
22
|
getLatestVersion,
|
|
23
23
|
semverCompare
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-I2DQYPKT.js";
|
|
25
25
|
import {
|
|
26
26
|
getInstalledVersion
|
|
27
27
|
} from "./chunk-ETTZRJ55.js";
|
|
@@ -164,9 +164,13 @@ async function uninstallCommand(opts = {}) {
|
|
|
164
164
|
const migrationResult = removeMemoryMcpEntry();
|
|
165
165
|
if (migrationResult.removed) {
|
|
166
166
|
if (migrationResult.fileDeleted) {
|
|
167
|
-
log.success(
|
|
167
|
+
log.success(
|
|
168
|
+
"Removed legacy project-scope coding-friend-memory from .mcp.json (file deleted \u2014 was empty)."
|
|
169
|
+
);
|
|
168
170
|
} else {
|
|
169
|
-
log.success(
|
|
171
|
+
log.success(
|
|
172
|
+
"Removed legacy project-scope coding-friend-memory from .mcp.json"
|
|
173
|
+
);
|
|
170
174
|
}
|
|
171
175
|
}
|
|
172
176
|
}
|
|
@@ -7,7 +7,7 @@ interface Crumb {
|
|
|
7
7
|
|
|
8
8
|
export default function Breadcrumbs({ crumbs }: { crumbs: Crumb[] }) {
|
|
9
9
|
return (
|
|
10
|
-
<nav className="mb-4 flex min-w-0 items-center gap-2 whitespace-nowrap text-
|
|
10
|
+
<nav className="mb-4 flex min-w-0 items-center gap-2 text-sm whitespace-nowrap text-slate-500 dark:text-slate-400">
|
|
11
11
|
<Link
|
|
12
12
|
href="/"
|
|
13
13
|
className="shrink-0 hover:text-amber-600 dark:hover:text-amber-400"
|