causantic 0.7.2 → 0.8.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 +5 -4
- package/config.schema.json +46 -0
- package/dist/cli/commands/init/api-key.d.ts +2 -0
- package/dist/cli/commands/init/api-key.d.ts.map +1 -0
- package/dist/cli/commands/init/api-key.js +26 -0
- package/dist/cli/commands/init/api-key.js.map +1 -0
- package/dist/cli/commands/init/encryption.d.ts +2 -0
- package/dist/cli/commands/init/encryption.d.ts.map +1 -0
- package/dist/cli/commands/init/encryption.js +104 -0
- package/dist/cli/commands/init/encryption.js.map +1 -0
- package/dist/cli/commands/init/health.d.ts +2 -0
- package/dist/cli/commands/init/health.d.ts.map +1 -0
- package/dist/cli/commands/init/health.js +15 -0
- package/dist/cli/commands/init/health.js.map +1 -0
- package/dist/cli/commands/init/hooks.d.ts +2 -0
- package/dist/cli/commands/init/hooks.d.ts.map +1 -0
- package/dist/cli/commands/init/hooks.js +92 -0
- package/dist/cli/commands/init/hooks.js.map +1 -0
- package/dist/cli/commands/init/index.d.ts +3 -0
- package/dist/cli/commands/init/index.d.ts.map +1 -0
- package/dist/cli/commands/init/index.js +95 -0
- package/dist/cli/commands/init/index.js.map +1 -0
- package/dist/cli/commands/init/ingest.d.ts +2 -0
- package/dist/cli/commands/init/ingest.d.ts.map +1 -0
- package/dist/cli/commands/init/ingest.js +171 -0
- package/dist/cli/commands/init/ingest.js.map +1 -0
- package/dist/cli/commands/init/mcp-config.d.ts +9 -0
- package/dist/cli/commands/init/mcp-config.d.ts.map +1 -0
- package/dist/cli/commands/init/mcp-config.js +191 -0
- package/dist/cli/commands/init/mcp-config.js.map +1 -0
- package/dist/cli/commands/init/shared.d.ts +9 -0
- package/dist/cli/commands/init/shared.d.ts.map +1 -0
- package/dist/cli/commands/init/shared.js +58 -0
- package/dist/cli/commands/init/shared.js.map +1 -0
- package/dist/cli/commands/init/skills.d.ts +2 -0
- package/dist/cli/commands/init/skills.d.ts.map +1 -0
- package/dist/cli/commands/init/skills.js +68 -0
- package/dist/cli/commands/init/skills.js.map +1 -0
- package/dist/cli/commands/reindex.d.ts +8 -0
- package/dist/cli/commands/reindex.d.ts.map +1 -0
- package/dist/cli/commands/reindex.js +143 -0
- package/dist/cli/commands/reindex.js.map +1 -0
- package/dist/cli/index.js +4 -7
- package/dist/cli/index.js.map +1 -1
- package/dist/clusters/cluster-manager.d.ts +23 -0
- package/dist/clusters/cluster-manager.d.ts.map +1 -1
- package/dist/clusters/cluster-manager.js +134 -0
- package/dist/clusters/cluster-manager.js.map +1 -1
- package/dist/clusters/hdbscan-model-store.d.ts +37 -0
- package/dist/clusters/hdbscan-model-store.d.ts.map +1 -0
- package/dist/clusters/hdbscan-model-store.js +73 -0
- package/dist/clusters/hdbscan-model-store.js.map +1 -0
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +38 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/memory-config.d.ts +6 -0
- package/dist/config/memory-config.d.ts.map +1 -1
- package/dist/config/memory-config.js +6 -0
- package/dist/config/memory-config.js.map +1 -1
- package/dist/dashboard/client/assets/index-Bv5lFW-1.js +17 -0
- package/dist/dashboard/client/assets/index-DTriNsi9.css +1 -0
- package/dist/dashboard/client/index.html +2 -2
- package/dist/ingest/ingest-session.d.ts.map +1 -1
- package/dist/ingest/ingest-session.js +165 -217
- package/dist/ingest/ingest-session.js.map +1 -1
- package/dist/maintenance/scheduler.d.ts.map +1 -1
- package/dist/maintenance/scheduler.js +17 -6
- package/dist/maintenance/scheduler.js.map +1 -1
- package/dist/maintenance/tasks/update-clusters.d.ts +9 -0
- package/dist/maintenance/tasks/update-clusters.d.ts.map +1 -1
- package/dist/maintenance/tasks/update-clusters.js +26 -7
- package/dist/maintenance/tasks/update-clusters.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +1 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/services.d.ts +27 -0
- package/dist/mcp/services.d.ts.map +1 -0
- package/dist/mcp/services.js +99 -0
- package/dist/mcp/services.js.map +1 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +39 -102
- package/dist/mcp/tools.js.map +1 -1
- package/dist/models/embedder.d.ts.map +1 -1
- package/dist/models/embedder.js +2 -0
- package/dist/models/embedder.js.map +1 -1
- package/dist/retrieval/chain-assembler.js +2 -6
- package/dist/retrieval/chain-assembler.js.map +1 -1
- package/dist/retrieval/chain-walker.d.ts +12 -6
- package/dist/retrieval/chain-walker.d.ts.map +1 -1
- package/dist/retrieval/chain-walker.js +121 -84
- package/dist/retrieval/chain-walker.js.map +1 -1
- package/dist/retrieval/cluster-expander.d.ts +1 -1
- package/dist/retrieval/cluster-expander.d.ts.map +1 -1
- package/dist/retrieval/cluster-expander.js +13 -1
- package/dist/retrieval/cluster-expander.js.map +1 -1
- package/dist/retrieval/formatting.d.ts +13 -0
- package/dist/retrieval/formatting.d.ts.map +1 -0
- package/dist/retrieval/formatting.js +27 -0
- package/dist/retrieval/formatting.js.map +1 -0
- package/dist/retrieval/search-assembler.d.ts.map +1 -1
- package/dist/retrieval/search-assembler.js +21 -15
- package/dist/retrieval/search-assembler.js.map +1 -1
- package/dist/storage/feedback-store.d.ts +34 -0
- package/dist/storage/feedback-store.d.ts.map +1 -0
- package/dist/storage/feedback-store.js +67 -0
- package/dist/storage/feedback-store.js.map +1 -0
- package/dist/storage/migrations.d.ts.map +1 -1
- package/dist/storage/migrations.js +68 -0
- package/dist/storage/migrations.js.map +1 -1
- package/dist/storage/schema.sql +24 -2
- package/dist/storage/vector-store.d.ts +20 -0
- package/dist/storage/vector-store.d.ts.map +1 -1
- package/dist/storage/vector-store.js +66 -26
- package/dist/storage/vector-store.js.map +1 -1
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +7 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +8 -7
- package/src/dashboard/client/package-lock.json +179 -880
- package/src/dashboard/client/package.json +3 -3
- package/dist/cli/commands/init.d.ts +0 -3
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -781
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/dashboard/client/assets/index-BmZeW-Jd.css +0 -1
- package/dist/dashboard/client/assets/index-Br0W1mEc.js +0 -166
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import { runTask } from '../../../maintenance/scheduler.js';
|
|
5
|
+
import { getChunkCount } from '../../../storage/chunk-store.js';
|
|
6
|
+
import { promptUser } from '../../utils.js';
|
|
7
|
+
import { createSpinner } from './shared.js';
|
|
8
|
+
import { offerApiKeySetup } from './api-key.js';
|
|
9
|
+
export async function offerBatchIngest() {
|
|
10
|
+
const claudeProjectsDir = path.join(os.homedir(), '.claude', 'projects');
|
|
11
|
+
if (!fs.existsSync(claudeProjectsDir))
|
|
12
|
+
return;
|
|
13
|
+
console.log('');
|
|
14
|
+
console.log('Existing Claude Code sessions found.');
|
|
15
|
+
const projectDirs = [];
|
|
16
|
+
try {
|
|
17
|
+
const entries = fs.readdirSync(claudeProjectsDir, { withFileTypes: true });
|
|
18
|
+
for (const entry of entries) {
|
|
19
|
+
if (entry.isDirectory() && !entry.name.startsWith('.')) {
|
|
20
|
+
const projectPath = path.join(claudeProjectsDir, entry.name);
|
|
21
|
+
const files = fs.readdirSync(projectPath);
|
|
22
|
+
const sessionCount = files.filter((f) => f.endsWith('.jsonl') &&
|
|
23
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\.jsonl$/i.test(f)).length;
|
|
24
|
+
if (sessionCount > 0) {
|
|
25
|
+
const readableName = entry.name
|
|
26
|
+
.replace(/^-/, '')
|
|
27
|
+
.replace(/-/g, '/')
|
|
28
|
+
.replace(/^Users\/[^/]+\//, '~/');
|
|
29
|
+
projectDirs.push({ name: readableName, path: projectPath, sessionCount });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Ignore errors reading projects
|
|
36
|
+
}
|
|
37
|
+
if (projectDirs.length === 0)
|
|
38
|
+
return;
|
|
39
|
+
projectDirs.sort((a, b) => b.sessionCount - a.sessionCount);
|
|
40
|
+
const totalSessions = projectDirs.reduce((sum, p) => sum + p.sessionCount, 0);
|
|
41
|
+
console.log(`Found ${projectDirs.length} projects with ${totalSessions} total sessions.`);
|
|
42
|
+
console.log('');
|
|
43
|
+
console.log('Import existing sessions?');
|
|
44
|
+
console.log(' [A] All projects');
|
|
45
|
+
console.log(' [S] Select specific projects');
|
|
46
|
+
console.log(' [N] Skip (can run "causantic batch-ingest" later)');
|
|
47
|
+
console.log('');
|
|
48
|
+
const importChoice = (await promptUser('Choice [A/s/n]: ')).toLowerCase() || 'a';
|
|
49
|
+
let projectsToIngest = [];
|
|
50
|
+
if (importChoice === 'a' || importChoice === 'all') {
|
|
51
|
+
projectsToIngest = projectDirs.map((p) => p.path);
|
|
52
|
+
}
|
|
53
|
+
else if (importChoice === 's' || importChoice === 'select') {
|
|
54
|
+
console.log('');
|
|
55
|
+
console.log('Select projects to import (comma-separated numbers, or "all"):');
|
|
56
|
+
console.log('');
|
|
57
|
+
projectDirs.forEach((p, i) => {
|
|
58
|
+
console.log(` [${i + 1}] ${p.name} (${p.sessionCount} sessions)`);
|
|
59
|
+
});
|
|
60
|
+
console.log('');
|
|
61
|
+
const selection = (await promptUser('Projects: ')).trim();
|
|
62
|
+
if (selection.toLowerCase() === 'all') {
|
|
63
|
+
projectsToIngest = projectDirs.map((p) => p.path);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const indices = selection.split(',').map((s) => parseInt(s.trim(), 10) - 1);
|
|
67
|
+
for (const idx of indices) {
|
|
68
|
+
if (idx >= 0 && idx < projectDirs.length) {
|
|
69
|
+
projectsToIngest.push(projectDirs[idx].path);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.log('Skipping session import.');
|
|
76
|
+
}
|
|
77
|
+
if (projectsToIngest.length === 0)
|
|
78
|
+
return;
|
|
79
|
+
const spinner = createSpinner();
|
|
80
|
+
const { detectDevice } = await import('../../../models/device-detector.js');
|
|
81
|
+
const { setLogLevel } = await import('../../../utils/logger.js');
|
|
82
|
+
const detectedDevice = detectDevice();
|
|
83
|
+
console.log('');
|
|
84
|
+
const availableHint = detectedDevice.available?.length
|
|
85
|
+
? ` (${detectedDevice.available.join(', ')} available)`
|
|
86
|
+
: '';
|
|
87
|
+
console.log(`\u2713 Inference: ${detectedDevice.label}${availableHint}`);
|
|
88
|
+
console.log(`Importing ${projectsToIngest.length} project(s)...`);
|
|
89
|
+
console.log('');
|
|
90
|
+
setLogLevel('warn');
|
|
91
|
+
const { discoverSessions, batchIngest } = await import('../../../ingest/batch-ingest.js');
|
|
92
|
+
const { Embedder } = await import('../../../models/embedder.js');
|
|
93
|
+
const { getModel } = await import('../../../models/model-registry.js');
|
|
94
|
+
const { loadConfig, toRuntimeConfig } = await import('../../../config/loader.js');
|
|
95
|
+
const runtimeConfig = toRuntimeConfig(loadConfig());
|
|
96
|
+
const sharedEmbedder = new Embedder();
|
|
97
|
+
await sharedEmbedder.load(getModel(runtimeConfig.embeddingModel), {
|
|
98
|
+
device: detectedDevice.device,
|
|
99
|
+
});
|
|
100
|
+
let totalIngested = 0;
|
|
101
|
+
let totalSkipped = 0;
|
|
102
|
+
let totalChunks = 0;
|
|
103
|
+
let totalEdges = 0;
|
|
104
|
+
for (const projectPath of projectsToIngest) {
|
|
105
|
+
const projectName = path
|
|
106
|
+
.basename(projectPath)
|
|
107
|
+
.replace(/^-/, '')
|
|
108
|
+
.replace(/-/g, '/')
|
|
109
|
+
.replace(/^Users\/[^/]+\//, '~/');
|
|
110
|
+
const shortName = projectName.split('/').pop() || projectName;
|
|
111
|
+
const sessions = await discoverSessions(projectPath);
|
|
112
|
+
if (sessions.length === 0) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
spinner.start(`${shortName}: 0/${sessions.length} sessions`);
|
|
116
|
+
const result = await batchIngest(sessions, {
|
|
117
|
+
embeddingDevice: detectedDevice.device,
|
|
118
|
+
embedder: sharedEmbedder,
|
|
119
|
+
progressCallback: (progress) => {
|
|
120
|
+
spinner.update(`${shortName}: ${progress.done}/${progress.total} sessions, ${progress.totalChunks} chunks`);
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
spinner.stop();
|
|
124
|
+
if (result.successCount > 0) {
|
|
125
|
+
console.log(` \u2713 ${shortName}: ${result.successCount} sessions, ${result.totalChunks} chunks, ${result.totalEdges} edges`);
|
|
126
|
+
}
|
|
127
|
+
else if (result.skippedCount > 0) {
|
|
128
|
+
console.log(` \u2713 ${shortName}: ${result.skippedCount} sessions (already ingested)`);
|
|
129
|
+
}
|
|
130
|
+
totalIngested += result.successCount;
|
|
131
|
+
totalSkipped += result.skippedCount;
|
|
132
|
+
totalChunks += result.totalChunks;
|
|
133
|
+
totalEdges += result.totalEdges;
|
|
134
|
+
}
|
|
135
|
+
await sharedEmbedder.dispose();
|
|
136
|
+
setLogLevel('info');
|
|
137
|
+
if (totalIngested === 0 && totalSkipped === 0) {
|
|
138
|
+
console.log(' No sessions found to import.');
|
|
139
|
+
}
|
|
140
|
+
else if (totalIngested === 0) {
|
|
141
|
+
console.log('');
|
|
142
|
+
console.log(`\u2713 All ${totalSkipped} sessions already ingested`);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
console.log('');
|
|
146
|
+
const skippedSuffix = totalSkipped > 0 ? `, ${totalSkipped} skipped` : '';
|
|
147
|
+
console.log(`\u2713 Total: ${totalIngested} sessions, ${totalChunks} chunks, ${totalEdges} edges${skippedSuffix}`);
|
|
148
|
+
}
|
|
149
|
+
// Run post-ingestion maintenance tasks
|
|
150
|
+
const existingChunks = getChunkCount();
|
|
151
|
+
if (existingChunks > 0) {
|
|
152
|
+
// Offer API key BEFORE clustering so labels can be generated in one pass
|
|
153
|
+
await offerApiKeySetup();
|
|
154
|
+
console.log('');
|
|
155
|
+
console.log('Running post-ingestion processing...');
|
|
156
|
+
const { setLogLevel: setPostLogLevel } = await import('../../../utils/logger.js');
|
|
157
|
+
setPostLogLevel('warn');
|
|
158
|
+
spinner.start('Building clusters...');
|
|
159
|
+
try {
|
|
160
|
+
const clusterResult = await runTask('update-clusters');
|
|
161
|
+
spinner.stop(clusterResult.success
|
|
162
|
+
? ` \u2713 ${clusterResult.message}`
|
|
163
|
+
: ` \u26a0 Clustering: ${clusterResult.message}`);
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
spinner.stop(` \u2717 Clustering error: ${err.message}`);
|
|
167
|
+
}
|
|
168
|
+
setPostLogLevel('info');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrate Causantic MCP entry from ~/.claude/settings.json to ~/.claude.json.
|
|
3
|
+
* Claude Code reads MCP servers from ~/.claude.json, not settings.json.
|
|
4
|
+
* This cleans up entries left by pre-0.5.0 installs.
|
|
5
|
+
*/
|
|
6
|
+
export declare function migrateMcpFromSettings(settingsPath: string, mcpConfigPath: string): void;
|
|
7
|
+
export declare function configureMcp(mcpConfigPath: string): Promise<void>;
|
|
8
|
+
export declare function patchProjectMcpFiles(): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=mcp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/mcp-config.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAmCxF;AAED,wBAAsB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiEvE;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+E1D"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import { promptYesNo } from '../../utils.js';
|
|
5
|
+
import { getCliEntryPath } from './shared.js';
|
|
6
|
+
/**
|
|
7
|
+
* Migrate Causantic MCP entry from ~/.claude/settings.json to ~/.claude.json.
|
|
8
|
+
* Claude Code reads MCP servers from ~/.claude.json, not settings.json.
|
|
9
|
+
* This cleans up entries left by pre-0.5.0 installs.
|
|
10
|
+
*/
|
|
11
|
+
export function migrateMcpFromSettings(settingsPath, mcpConfigPath) {
|
|
12
|
+
try {
|
|
13
|
+
if (!fs.existsSync(settingsPath))
|
|
14
|
+
return;
|
|
15
|
+
const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
|
|
16
|
+
const CAUSANTIC_SERVER_KEY = 'causantic';
|
|
17
|
+
if (!settings.mcpServers?.[CAUSANTIC_SERVER_KEY])
|
|
18
|
+
return;
|
|
19
|
+
// Check if already present in mcpConfigPath
|
|
20
|
+
let mcpConfig = {};
|
|
21
|
+
if (fs.existsSync(mcpConfigPath)) {
|
|
22
|
+
try {
|
|
23
|
+
mcpConfig = JSON.parse(fs.readFileSync(mcpConfigPath, 'utf-8'));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Treat as empty if unparseable
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const mcpServers = (mcpConfig.mcpServers ?? {});
|
|
30
|
+
if (!mcpServers[CAUSANTIC_SERVER_KEY]) {
|
|
31
|
+
mcpConfig.mcpServers = {
|
|
32
|
+
...mcpServers,
|
|
33
|
+
[CAUSANTIC_SERVER_KEY]: settings.mcpServers[CAUSANTIC_SERVER_KEY],
|
|
34
|
+
};
|
|
35
|
+
fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2));
|
|
36
|
+
console.log('\u2713 Migrated Causantic MCP config: settings.json \u2192 ~/.claude.json');
|
|
37
|
+
}
|
|
38
|
+
// Clean up old entry from settings.json
|
|
39
|
+
delete settings.mcpServers[CAUSANTIC_SERVER_KEY];
|
|
40
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Best-effort migration
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function configureMcp(mcpConfigPath) {
|
|
47
|
+
let config;
|
|
48
|
+
if (!fs.existsSync(mcpConfigPath)) {
|
|
49
|
+
config = { mcpServers: {} };
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
try {
|
|
53
|
+
const configContent = fs.readFileSync(mcpConfigPath, 'utf-8');
|
|
54
|
+
config = JSON.parse(configContent);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
console.log('\u26a0 Could not parse Claude Code MCP config');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const CAUSANTIC_SERVER_KEY = 'causantic';
|
|
62
|
+
const mcpServers = (config.mcpServers ?? {});
|
|
63
|
+
// Migrate old 'memory' key -> 'causantic'
|
|
64
|
+
if (mcpServers.memory && !mcpServers[CAUSANTIC_SERVER_KEY]) {
|
|
65
|
+
mcpServers[CAUSANTIC_SERVER_KEY] = mcpServers.memory;
|
|
66
|
+
delete mcpServers.memory;
|
|
67
|
+
config.mcpServers = mcpServers;
|
|
68
|
+
fs.writeFileSync(mcpConfigPath, JSON.stringify(config, null, 2));
|
|
69
|
+
console.log('\u2713 Migrated config: memory \u2192 causantic');
|
|
70
|
+
}
|
|
71
|
+
if (mcpServers[CAUSANTIC_SERVER_KEY]) {
|
|
72
|
+
const existing = mcpServers[CAUSANTIC_SERVER_KEY];
|
|
73
|
+
const expectedArgs = [getCliEntryPath(), 'serve'];
|
|
74
|
+
const currentArgs = Array.isArray(existing.args) ? existing.args : [];
|
|
75
|
+
const cliPathStale = currentArgs.length >= 1 &&
|
|
76
|
+
currentArgs[0] !== expectedArgs[0] &&
|
|
77
|
+
!fs.existsSync(currentArgs[0]);
|
|
78
|
+
const usesNpx = existing.command === 'npx';
|
|
79
|
+
if (usesNpx || cliPathStale) {
|
|
80
|
+
mcpServers[CAUSANTIC_SERVER_KEY] = {
|
|
81
|
+
command: process.execPath,
|
|
82
|
+
args: expectedArgs,
|
|
83
|
+
};
|
|
84
|
+
config.mcpServers = mcpServers;
|
|
85
|
+
fs.writeFileSync(mcpConfigPath, JSON.stringify(config, null, 2));
|
|
86
|
+
if (cliPathStale) {
|
|
87
|
+
console.log('\u2713 Updated Causantic config (CLI path was stale)');
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.log('\u2713 Updated Causantic config to use absolute paths');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.log('\u2713 Causantic already configured in Claude Code');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
if (await promptYesNo('Add Causantic to Claude Code MCP config?', true)) {
|
|
99
|
+
mcpServers[CAUSANTIC_SERVER_KEY] = {
|
|
100
|
+
command: process.execPath,
|
|
101
|
+
args: [getCliEntryPath(), 'serve'],
|
|
102
|
+
};
|
|
103
|
+
config.mcpServers = mcpServers;
|
|
104
|
+
fs.writeFileSync(mcpConfigPath, JSON.stringify(config, null, 2));
|
|
105
|
+
console.log('\u2713 Added Causantic to Claude Code config');
|
|
106
|
+
console.log(` Node: ${process.execPath}`);
|
|
107
|
+
console.log(' Restart Claude Code to activate');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export async function patchProjectMcpFiles() {
|
|
112
|
+
const claudeProjectsDir = path.join(os.homedir(), '.claude', 'projects');
|
|
113
|
+
if (!fs.existsSync(claudeProjectsDir))
|
|
114
|
+
return;
|
|
115
|
+
const serverConfig = {
|
|
116
|
+
command: process.execPath,
|
|
117
|
+
args: [getCliEntryPath(), 'serve'],
|
|
118
|
+
};
|
|
119
|
+
const CAUSANTIC_KEY = 'causantic';
|
|
120
|
+
const projectsToFix = [];
|
|
121
|
+
try {
|
|
122
|
+
const entries = fs.readdirSync(claudeProjectsDir, { withFileTypes: true });
|
|
123
|
+
for (const entry of entries) {
|
|
124
|
+
if (!entry.isDirectory() || entry.name.startsWith('.'))
|
|
125
|
+
continue;
|
|
126
|
+
const projectPath = '/' + entry.name.replace(/^-/, '').replace(/-/g, '/');
|
|
127
|
+
const mcpPath = path.join(projectPath, '.mcp.json');
|
|
128
|
+
if (!fs.existsSync(mcpPath))
|
|
129
|
+
continue;
|
|
130
|
+
try {
|
|
131
|
+
const mcpContent = JSON.parse(fs.readFileSync(mcpPath, 'utf-8'));
|
|
132
|
+
if (!mcpContent.mcpServers)
|
|
133
|
+
continue;
|
|
134
|
+
const readableName = projectPath.replace(new RegExp(`^/Users/${os.userInfo().username}/`), '~/');
|
|
135
|
+
if (mcpContent.mcpServers.memory && !mcpContent.mcpServers[CAUSANTIC_KEY]) {
|
|
136
|
+
projectsToFix.push({ name: readableName, mcpPath, needsMigrate: true });
|
|
137
|
+
}
|
|
138
|
+
else if (!mcpContent.mcpServers[CAUSANTIC_KEY]) {
|
|
139
|
+
projectsToFix.push({ name: readableName, mcpPath, needsMigrate: false });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Skip unparseable files
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (projectsToFix.length === 0)
|
|
151
|
+
return;
|
|
152
|
+
const migrateCount = projectsToFix.filter((p) => p.needsMigrate).length;
|
|
153
|
+
const addCount = projectsToFix.length - migrateCount;
|
|
154
|
+
console.log('');
|
|
155
|
+
if (migrateCount > 0 && addCount > 0) {
|
|
156
|
+
console.log(`Found ${addCount} project(s) missing Causantic and ${migrateCount} to migrate:`);
|
|
157
|
+
}
|
|
158
|
+
else if (migrateCount > 0) {
|
|
159
|
+
console.log(`Found ${migrateCount} project(s) with old 'memory' key to migrate:`);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.log(`Found ${addCount} project(s) with .mcp.json missing Causantic:`);
|
|
163
|
+
}
|
|
164
|
+
for (const p of projectsToFix) {
|
|
165
|
+
console.log(` ${p.name}${p.needsMigrate ? ' (migrate)' : ''}`);
|
|
166
|
+
}
|
|
167
|
+
if (!(await promptYesNo('Add/migrate Causantic server in these projects?', true)))
|
|
168
|
+
return;
|
|
169
|
+
let patched = 0;
|
|
170
|
+
for (const p of projectsToFix) {
|
|
171
|
+
try {
|
|
172
|
+
const mcpContent = JSON.parse(fs.readFileSync(p.mcpPath, 'utf-8'));
|
|
173
|
+
if (p.needsMigrate) {
|
|
174
|
+
mcpContent.mcpServers[CAUSANTIC_KEY] = mcpContent.mcpServers.memory;
|
|
175
|
+
delete mcpContent.mcpServers.memory;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
mcpContent.mcpServers[CAUSANTIC_KEY] = serverConfig;
|
|
179
|
+
}
|
|
180
|
+
fs.writeFileSync(p.mcpPath, JSON.stringify(mcpContent, null, 2) + '\n');
|
|
181
|
+
patched++;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
console.log(` \u26a0 Could not patch ${p.name}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (patched > 0) {
|
|
188
|
+
console.log(`\u2713 Updated Causantic in ${patched} project .mcp.json file(s)`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/mcp-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Resolve the CLI entry point path for MCP/hook configuration. */
|
|
2
|
+
export declare function getCliEntryPath(): string;
|
|
3
|
+
/** Create a terminal spinner for progress display. */
|
|
4
|
+
export declare function createSpinner(): {
|
|
5
|
+
start(label: string): void;
|
|
6
|
+
update(label: string): void;
|
|
7
|
+
stop(doneText?: string): void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/shared.ts"],"names":[],"mappings":"AAGA,mEAAmE;AACnE,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,sDAAsD;AACtD,wBAAgB,aAAa;iBAwBZ,MAAM;kBAUL,MAAM;oBAGJ,MAAM;EAazB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
/** Resolve the CLI entry point path for MCP/hook configuration. */
|
|
4
|
+
export function getCliEntryPath() {
|
|
5
|
+
return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', 'index.js');
|
|
6
|
+
}
|
|
7
|
+
/** Create a terminal spinner for progress display. */
|
|
8
|
+
export function createSpinner() {
|
|
9
|
+
const frames = [
|
|
10
|
+
'\u280b',
|
|
11
|
+
'\u2819',
|
|
12
|
+
'\u2839',
|
|
13
|
+
'\u2838',
|
|
14
|
+
'\u283c',
|
|
15
|
+
'\u2834',
|
|
16
|
+
'\u2826',
|
|
17
|
+
'\u2827',
|
|
18
|
+
'\u2807',
|
|
19
|
+
'\u280f',
|
|
20
|
+
];
|
|
21
|
+
let idx = 0;
|
|
22
|
+
let timer = null;
|
|
23
|
+
let text = '';
|
|
24
|
+
const writeLine = (line) => {
|
|
25
|
+
if (process.stdout.isTTY) {
|
|
26
|
+
process.stdout.write('\r\x1b[K' + line);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
start(label) {
|
|
31
|
+
if (!process.stdout.isTTY)
|
|
32
|
+
return;
|
|
33
|
+
text = label;
|
|
34
|
+
idx = 0;
|
|
35
|
+
writeLine(`${frames[0]} ${text}`);
|
|
36
|
+
timer = setInterval(() => {
|
|
37
|
+
idx = (idx + 1) % frames.length;
|
|
38
|
+
writeLine(`${frames[idx]} ${text}`);
|
|
39
|
+
}, 80);
|
|
40
|
+
},
|
|
41
|
+
update(label) {
|
|
42
|
+
text = label;
|
|
43
|
+
},
|
|
44
|
+
stop(doneText) {
|
|
45
|
+
if (timer) {
|
|
46
|
+
clearInterval(timer);
|
|
47
|
+
timer = null;
|
|
48
|
+
}
|
|
49
|
+
if (process.stdout.isTTY) {
|
|
50
|
+
process.stdout.write('\r\x1b[K');
|
|
51
|
+
}
|
|
52
|
+
if (doneText) {
|
|
53
|
+
console.log(doneText);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,mEAAmE;AACnE,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAC5F,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG;QACb,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,QAAQ;KACT,CAAC;IACF,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAA0C,IAAI,CAAC;IACxD,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;QACjC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,KAAa;YACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;gBAAE,OAAO;YAClC,IAAI,GAAG,KAAK,CAAC;YACb,GAAG,GAAG,CAAC,CAAC;YACR,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAClC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;gBACvB,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;gBAChC,SAAS,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC,EAAE,EAAE,CAAC,CAAC;QACT,CAAC;QACD,MAAM,CAAC,KAAa;YAClB,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,QAAiB;YACpB,IAAI,KAAK,EAAE,CAAC;gBACV,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/skills.ts"],"names":[],"mappings":"AAIA,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkE9D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
export async function installSkillsAndClaudeMd() {
|
|
5
|
+
const { CAUSANTIC_SKILLS, getMinimalClaudeMdBlock } = await import('../../skill-templates.js');
|
|
6
|
+
const skillsDir = path.join(os.homedir(), '.claude', 'skills');
|
|
7
|
+
let skillsInstalled = 0;
|
|
8
|
+
for (const skill of CAUSANTIC_SKILLS) {
|
|
9
|
+
try {
|
|
10
|
+
const skillDir = path.join(skillsDir, skill.dirName);
|
|
11
|
+
if (!fs.existsSync(skillDir)) {
|
|
12
|
+
fs.mkdirSync(skillDir, { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), skill.content);
|
|
15
|
+
skillsInstalled++;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
console.log(`\u26a0 Could not install skill: ${skill.dirName}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (skillsInstalled > 0) {
|
|
22
|
+
console.log(`\u2713 Installed ${skillsInstalled} Causantic skills to ~/.claude/skills/`);
|
|
23
|
+
}
|
|
24
|
+
// Clean up removed skills (causantic-context merged into causantic-explain)
|
|
25
|
+
const removedSkills = ['causantic-context'];
|
|
26
|
+
for (const name of removedSkills) {
|
|
27
|
+
const removedDir = path.join(skillsDir, name);
|
|
28
|
+
if (fs.existsSync(removedDir)) {
|
|
29
|
+
try {
|
|
30
|
+
fs.rmSync(removedDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// best-effort cleanup
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const claudeMdPath = path.join(os.homedir(), '.claude', 'CLAUDE.md');
|
|
38
|
+
const CAUSANTIC_START = '<!-- CAUSANTIC_MEMORY_START -->';
|
|
39
|
+
const CAUSANTIC_END = '<!-- CAUSANTIC_MEMORY_END -->';
|
|
40
|
+
const memoryInstructions = getMinimalClaudeMdBlock();
|
|
41
|
+
try {
|
|
42
|
+
let claudeMd = '';
|
|
43
|
+
if (fs.existsSync(claudeMdPath)) {
|
|
44
|
+
claudeMd = fs.readFileSync(claudeMdPath, 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
if (claudeMd.includes(CAUSANTIC_START)) {
|
|
47
|
+
const startIdx = claudeMd.indexOf(CAUSANTIC_START);
|
|
48
|
+
const endIdx = claudeMd.indexOf(CAUSANTIC_END);
|
|
49
|
+
if (endIdx > startIdx) {
|
|
50
|
+
claudeMd =
|
|
51
|
+
claudeMd.slice(0, startIdx) +
|
|
52
|
+
memoryInstructions +
|
|
53
|
+
claudeMd.slice(endIdx + CAUSANTIC_END.length);
|
|
54
|
+
fs.writeFileSync(claudeMdPath, claudeMd);
|
|
55
|
+
console.log('\u2713 Updated CLAUDE.md with skill references');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const separator = claudeMd.length > 0 && !claudeMd.endsWith('\n\n') ? '\n' : '';
|
|
60
|
+
fs.writeFileSync(claudeMdPath, claudeMd + separator + memoryInstructions + '\n');
|
|
61
|
+
console.log('\u2713 Added Causantic reference to CLAUDE.md');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
console.log('\u26a0 Could not update CLAUDE.md');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI command: re-embed all chunks with the configured embedding model.
|
|
3
|
+
*
|
|
4
|
+
* Usage: npx causantic reindex [--batch-size N] [--dry-run]
|
|
5
|
+
*/
|
|
6
|
+
import type { Command } from '../types.js';
|
|
7
|
+
export declare const reindexCommand: Command;
|
|
8
|
+
//# sourceMappingURL=reindex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reindex.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/reindex.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAqC3C,eAAO,MAAM,cAAc,EAAE,OA4I5B,CAAC"}
|