Skip to content

Commit 0f1bebb

Browse files
KD-K2N2claude
andcommitted
Fix 5 bugs found during pre-launch testing
- Fix MCP server crash: start.ts was calling startMCPServer(db) without the required cwd argument, causing detectProject() to crash silently on every Claude Code session start. Memories were never captured. - Fix export crash: limit was set to 500 but API max is 200 - Fix search crash on empty query: validate before API call - Add --dry-run to clear command for safe preview - Fix export --project: resolve project names to IDs Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9dc01dd commit 0f1bebb

2 files changed

Lines changed: 34 additions & 8 deletions

File tree

packages/cli/src/index.ts

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ program
195195
// SEARCH
196196
// ──────────────────────────────────────────
197197
program
198-
.command('search <query>')
198+
.command('search [query]')
199199
.description('Full-text search across all memories')
200200
.option('--project <id>', 'Scope to project')
201201
.option('--type <type>', 'Filter by type')
@@ -204,6 +204,11 @@ program
204204
.action(async (query, opts) => {
205205
if (!(await ensureDaemon())) return;
206206

207+
if (!query || query.trim().length === 0) {
208+
fmt.error('Please provide a search query. Usage: cortex search "your query"');
209+
return;
210+
}
211+
207212
const body: Record<string, unknown> = { query };
208213
if (opts.project) body.project_id = opts.project;
209214
if (opts.type) body.type = opts.type;
@@ -457,12 +462,16 @@ program
457462
const projects = await api.listProjects();
458463
const exportData: any = { exported_at: new Date().toISOString(), projects: [] };
459464

460-
const projectList = opts.project
461-
? projects.data.filter((p: any) => p.id === opts.project)
462-
: projects.data;
465+
let projectList;
466+
if (opts.project) {
467+
const resolvedId = await resolveProjectId(opts.project);
468+
projectList = projects.data.filter((p: any) => p.id === resolvedId || p.name.toLowerCase() === opts.project.toLowerCase());
469+
} else {
470+
projectList = projects.data;
471+
}
463472

464473
for (const p of projectList) {
465-
const memories = await api.listMemories({ project_id: p.id, limit: '500' });
474+
const memories = await api.listMemories({ project_id: p.id, limit: '200' });
466475
exportData.projects.push({
467476
...p,
468477
memories: memories.data,
@@ -752,12 +761,28 @@ program
752761
.description('Delete all memories (with backup)')
753762
.option('--force', 'Skip confirmation')
754763
.option('--no-backup', 'Skip backup')
764+
.option('--dry-run', 'Preview what would be deleted without deleting')
755765
.option('--json', 'Output as JSON')
756766
.action(async (project, opts) => {
757767
if (!(await ensureDaemon())) return;
758768

759769
const projectId = await resolveProjectId(project);
760770

771+
if (opts.dryRun) {
772+
const projects = await api.listProjects();
773+
const projectList = projectId
774+
? projects.data.filter((p: any) => p.id === projectId)
775+
: projects.data;
776+
let total = 0;
777+
for (const p of projectList) {
778+
const memories = await api.listMemories({ project_id: p.id, limit: '200' });
779+
fmt.info(` ${p.name}: ${memories.data.length} memories would be deleted`);
780+
total += memories.data.length;
781+
}
782+
fmt.info(`\nDry run: ${total} memories across ${projectList.length} projects would be deleted.`);
783+
return;
784+
}
785+
761786
// Export backup first unless --no-backup
762787
if (opts.backup !== false) {
763788
const projects = await api.listProjects();
@@ -767,7 +792,7 @@ program
767792
: projects.data;
768793

769794
for (const p of projectList) {
770-
const memories = await api.listMemories({ project_id: p.id, limit: '500' });
795+
const memories = await api.listMemories({ project_id: p.id, limit: '200' });
771796
exportData.projects.push({ ...p, memories: memories.data });
772797
}
773798

@@ -808,7 +833,7 @@ program
808833
const projects = await api.listProjects();
809834
let total = 0;
810835
for (const p of projects.data) {
811-
const memories = await api.listMemories({ project_id: p.id, limit: '500' });
836+
const memories = await api.listMemories({ project_id: p.id, limit: '200' });
812837
for (const m of memories.data) {
813838
await api.deleteMemory(m.id);
814839
}

packages/server/src/start.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ const sseEmitter = new SSEEmitter();
3131

3232
if (STDIO_MODE) {
3333
// MCP mode — Claude Code connects via stdio
34-
startMCPServer(db).catch((err) => {
34+
const cwd = process.env.CORTEX_CWD || process.cwd();
35+
startMCPServer(db, cwd).catch((err) => {
3536
console.error('[cortex] MCP server failed:', err);
3637
process.exit(1);
3738
});

0 commit comments

Comments
 (0)