@knowledgine/cli 0.1.0 → 0.2.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/dist/commands/capture.d.ts +10 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +132 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/demo.d.ts +6 -0
- package/dist/commands/demo.d.ts.map +1 -0
- package/dist/commands/demo.js +44 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/commands/feedback.d.ts +18 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +79 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/ingest.d.ts +8 -0
- package/dist/commands/ingest.d.ts.map +1 -0
- package/dist/commands/ingest.js +98 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +294 -37
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/plugins.d.ts +6 -0
- package/dist/commands/plugins.d.ts.map +1 -0
- package/dist/commands/plugins.js +40 -0
- package/dist/commands/plugins.js.map +1 -0
- package/dist/commands/search.d.ts +16 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +117 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/setup.d.ts +14 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +167 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/start.d.ts +1 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +82 -15
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +121 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tool.d.ts +29 -0
- package/dist/commands/tool.d.ts.map +1 -0
- package/dist/commands/tool.js +247 -0
- package/dist/commands/tool.js.map +1 -0
- package/dist/commands/upgrade.d.ts +6 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +91 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/index.js +144 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/demo-manager.d.ts +16 -0
- package/dist/lib/demo-manager.d.ts.map +1 -0
- package/dist/lib/demo-manager.js +37 -0
- package/dist/lib/demo-manager.js.map +1 -0
- package/dist/lib/formatter.d.ts +7 -0
- package/dist/lib/formatter.d.ts.map +1 -0
- package/dist/lib/formatter.js +91 -0
- package/dist/lib/formatter.js.map +1 -0
- package/dist/lib/indexer.d.ts +4 -1
- package/dist/lib/indexer.d.ts.map +1 -1
- package/dist/lib/indexer.js +2 -1
- package/dist/lib/indexer.js.map +1 -1
- package/dist/lib/ingest-watcher.d.ts +20 -0
- package/dist/lib/ingest-watcher.d.ts.map +1 -0
- package/dist/lib/ingest-watcher.js +44 -0
- package/dist/lib/ingest-watcher.js.map +1 -0
- package/dist/lib/plugin-loader.d.ts +5 -0
- package/dist/lib/plugin-loader.d.ts.map +1 -0
- package/dist/lib/plugin-loader.js +27 -0
- package/dist/lib/plugin-loader.js.map +1 -0
- package/dist/lib/progress.d.ts +57 -0
- package/dist/lib/progress.d.ts.map +1 -0
- package/dist/lib/progress.js +191 -0
- package/dist/lib/progress.js.map +1 -0
- package/dist/lib/url-validator.d.ts +2 -0
- package/dist/lib/url-validator.d.ts.map +1 -0
- package/dist/lib/url-validator.js +17 -0
- package/dist/lib/url-validator.js.map +1 -0
- package/fixtures/demo/notes/api-design-decisions.md +79 -0
- package/fixtures/demo/notes/auth-debugging.md +52 -0
- package/fixtures/demo/notes/ci-cd-pipeline.md +90 -0
- package/fixtures/demo/notes/code-review-notes.md +71 -0
- package/fixtures/demo/notes/database-optimization.md +73 -0
- package/fixtures/demo/notes/docker-troubleshooting.md +74 -0
- package/fixtures/demo/notes/react-performance.md +66 -0
- package/fixtures/demo/notes/typescript-migration.md +80 -0
- package/package.json +6 -4
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { resolve, join } from "path";
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from "fs";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import { createInterface } from "readline";
|
|
5
|
+
function getClaudeDesktopConfigPath() {
|
|
6
|
+
switch (process.platform) {
|
|
7
|
+
case "darwin":
|
|
8
|
+
return join(homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
|
|
9
|
+
case "linux":
|
|
10
|
+
return join(homedir(), ".config", "claude", "claude_desktop_config.json");
|
|
11
|
+
case "win32":
|
|
12
|
+
return join(process.env["APPDATA"] ?? join(homedir(), "AppData", "Roaming"), "Claude", "claude_desktop_config.json");
|
|
13
|
+
default:
|
|
14
|
+
return join(homedir(), ".config", "claude", "claude_desktop_config.json");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function getCursorConfigPath() {
|
|
18
|
+
return join(homedir(), ".cursor", "mcp.json");
|
|
19
|
+
}
|
|
20
|
+
function getConfigPath(target) {
|
|
21
|
+
switch (target) {
|
|
22
|
+
case "claude-desktop":
|
|
23
|
+
return getClaudeDesktopConfigPath();
|
|
24
|
+
case "cursor":
|
|
25
|
+
return getCursorConfigPath();
|
|
26
|
+
default:
|
|
27
|
+
throw new Error(`Unknown target: ${target}. Supported: claude-desktop, cursor`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function getTargetLabel(target) {
|
|
31
|
+
switch (target) {
|
|
32
|
+
case "claude-desktop":
|
|
33
|
+
return "Claude Desktop";
|
|
34
|
+
case "cursor":
|
|
35
|
+
return "Cursor";
|
|
36
|
+
default:
|
|
37
|
+
return target;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function buildMcpConfig(rootPath) {
|
|
41
|
+
return {
|
|
42
|
+
command: "npx",
|
|
43
|
+
args: ["-y", "@knowledgine/cli", "start", "--path", rootPath],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function readExistingConfig(configPath) {
|
|
47
|
+
if (!existsSync(configPath)) {
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
51
|
+
try {
|
|
52
|
+
return JSON.parse(raw);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error(`Failed to parse existing config: ${configPath}\n` +
|
|
56
|
+
`The file contains invalid JSON. Fix it manually or remove it before running setup.`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function mergeConfig(existing, rootPath) {
|
|
60
|
+
const serverConfig = buildMcpConfig(rootPath);
|
|
61
|
+
return {
|
|
62
|
+
...existing,
|
|
63
|
+
mcpServers: {
|
|
64
|
+
...(existing.mcpServers ?? {}),
|
|
65
|
+
knowledgine: serverConfig,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function getDefaultIO() {
|
|
70
|
+
return {
|
|
71
|
+
input: process.stdin,
|
|
72
|
+
output: process.stderr,
|
|
73
|
+
isTTY: process.stderr.isTTY ?? false,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function promptTarget(io) {
|
|
77
|
+
const targets = [
|
|
78
|
+
{ value: "claude-desktop", label: "Claude Desktop" },
|
|
79
|
+
{ value: "cursor", label: "Cursor" },
|
|
80
|
+
];
|
|
81
|
+
return new Promise((resolvePrompt, reject) => {
|
|
82
|
+
const rl = createInterface({
|
|
83
|
+
input: io.input,
|
|
84
|
+
output: io.output,
|
|
85
|
+
});
|
|
86
|
+
io.output.write("Select target AI tool:\n");
|
|
87
|
+
for (let i = 0; i < targets.length; i++) {
|
|
88
|
+
io.output.write(` ${i + 1}) ${targets[i].label}\n`);
|
|
89
|
+
}
|
|
90
|
+
rl.question("Enter number (1-2): ", (answer) => {
|
|
91
|
+
rl.close();
|
|
92
|
+
const idx = parseInt(answer, 10) - 1;
|
|
93
|
+
if (idx >= 0 && idx < targets.length) {
|
|
94
|
+
resolvePrompt(targets[idx].value);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
reject(new Error("Invalid selection. Run with --target to specify directly."));
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
export async function setupCommand(options, io) {
|
|
103
|
+
const rootPath = resolve(options.path ?? process.cwd());
|
|
104
|
+
const setupIO = io ?? getDefaultIO();
|
|
105
|
+
// Check initialization
|
|
106
|
+
const knowledgineDir = resolve(rootPath, ".knowledgine");
|
|
107
|
+
if (!existsSync(knowledgineDir)) {
|
|
108
|
+
console.error(`Error: Not initialized. Run 'knowledgine init --path ${rootPath}' first.`);
|
|
109
|
+
process.exitCode = 1;
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
// Determine target
|
|
113
|
+
let target = options.target;
|
|
114
|
+
if (!target) {
|
|
115
|
+
if (!setupIO.isTTY) {
|
|
116
|
+
console.error("Error: --target is required in non-interactive mode.");
|
|
117
|
+
console.error(" Supported targets: claude-desktop, cursor");
|
|
118
|
+
process.exitCode = 1;
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
target = await promptTarget(setupIO);
|
|
122
|
+
}
|
|
123
|
+
const configPath = getConfigPath(target);
|
|
124
|
+
const targetLabel = getTargetLabel(target);
|
|
125
|
+
const shouldWrite = options.write === true;
|
|
126
|
+
// Read existing config (may throw on invalid JSON)
|
|
127
|
+
let existingConfig;
|
|
128
|
+
try {
|
|
129
|
+
existingConfig = readExistingConfig(configPath);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
133
|
+
process.exitCode = 1;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const mergedConfig = mergeConfig(existingConfig, rootPath);
|
|
137
|
+
const configJson = JSON.stringify(mergedConfig, null, 2);
|
|
138
|
+
console.error(`\nMCP configuration for ${targetLabel}:`);
|
|
139
|
+
console.error(` Config: ${configPath}`);
|
|
140
|
+
console.error("");
|
|
141
|
+
console.error(configJson);
|
|
142
|
+
console.error("");
|
|
143
|
+
if (!shouldWrite) {
|
|
144
|
+
console.error(`To apply: Run with --write flag, then restart ${targetLabel}.`);
|
|
145
|
+
console.error(` knowledgine setup --target ${target} --path ${rootPath} --write`);
|
|
146
|
+
console.error("");
|
|
147
|
+
console.error("Run 'knowledgine status' to verify your setup.");
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Write config
|
|
151
|
+
const configDir = resolve(configPath, "..");
|
|
152
|
+
if (!existsSync(configDir)) {
|
|
153
|
+
mkdirSync(configDir, { recursive: true });
|
|
154
|
+
}
|
|
155
|
+
// Backup existing file
|
|
156
|
+
if (existsSync(configPath)) {
|
|
157
|
+
const backupPath = configPath + ".bak";
|
|
158
|
+
copyFileSync(configPath, backupPath);
|
|
159
|
+
console.error(`Backup created: ${backupPath}`);
|
|
160
|
+
}
|
|
161
|
+
writeFileSync(configPath, configJson + "\n", "utf-8");
|
|
162
|
+
console.error(`Config written: ${configPath}`);
|
|
163
|
+
console.error("");
|
|
164
|
+
console.error(`Restart ${targetLabel} to activate knowledgine.`);
|
|
165
|
+
console.error("Run 'knowledgine status' to verify your setup.");
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/start.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgNvE"}
|
package/dist/commands/start.js
CHANGED
|
@@ -1,43 +1,104 @@
|
|
|
1
1
|
import { resolve } from "path";
|
|
2
2
|
import { mkdirSync } from "fs";
|
|
3
3
|
import { watch } from "chokidar";
|
|
4
|
-
import {
|
|
4
|
+
import { loadConfig, createDatabase, loadSqliteVecExtension, Migrator, KnowledgeRepository, GraphRepository, FeedbackRepository, FileProcessor, PatternExtractor, ALL_MIGRATIONS, OnnxEmbeddingProvider, ModelManager, } from "@knowledgine/core";
|
|
5
5
|
import { createKnowledgineMcpServer, StdioServerTransport } from "@knowledgine/mcp-server";
|
|
6
6
|
import { indexFile } from "../lib/indexer.js";
|
|
7
7
|
export async function startCommand(options) {
|
|
8
8
|
const rootPath = resolve(options.path ?? process.cwd());
|
|
9
9
|
// Ensure .knowledgine directory exists
|
|
10
10
|
mkdirSync(resolve(rootPath, ".knowledgine"), { recursive: true });
|
|
11
|
-
//
|
|
12
|
-
const config =
|
|
13
|
-
|
|
11
|
+
// Load config (respects .knowledginerc.json and env vars)
|
|
12
|
+
const config = loadConfig(rootPath);
|
|
13
|
+
// Auto-detect model for backward compatibility
|
|
14
|
+
if (!config.embedding.enabled) {
|
|
15
|
+
const modelManager = new ModelManager();
|
|
16
|
+
if (modelManager.isModelAvailable(config.embedding.modelName)) {
|
|
17
|
+
config.embedding.enabled = true;
|
|
18
|
+
console.error("[knowledgine] Semantic search enabled (model detected)");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Initialize database
|
|
22
|
+
const db = createDatabase(config.dbPath);
|
|
23
|
+
// Load sqlite-vec if semantic search is enabled
|
|
24
|
+
if (config.embedding.enabled) {
|
|
25
|
+
await loadSqliteVecExtension(db);
|
|
26
|
+
}
|
|
14
27
|
new Migrator(db, ALL_MIGRATIONS).migrate();
|
|
15
28
|
const repository = new KnowledgeRepository(db);
|
|
16
29
|
const graphRepository = new GraphRepository(db);
|
|
30
|
+
const feedbackRepository = new FeedbackRepository(db);
|
|
17
31
|
// Warn if no notes indexed (H-8)
|
|
18
32
|
const stats = repository.getStats();
|
|
19
33
|
if (stats.totalNotes === 0) {
|
|
20
34
|
console.error("Warning: No notes indexed. Run `knowledgine init` first.");
|
|
21
35
|
}
|
|
22
|
-
// Initialize embedding provider if model is available
|
|
36
|
+
// Initialize embedding provider if model is available and semantic is enabled
|
|
23
37
|
let embeddingProvider;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
38
|
+
if (config.embedding.enabled) {
|
|
39
|
+
const modelManager = new ModelManager();
|
|
40
|
+
if (modelManager.isModelAvailable()) {
|
|
41
|
+
embeddingProvider = new OnnxEmbeddingProvider(undefined, modelManager);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Warn if notes exist but no embeddings
|
|
45
|
+
const notesWithout = repository.getNotesWithoutEmbeddings();
|
|
46
|
+
if (notesWithout.length > 0) {
|
|
47
|
+
console.error(`Warning: ${notesWithout.length} notes have no embeddings. ` +
|
|
48
|
+
"Semantic search unavailable. Run 'knowledgine upgrade --semantic' to download the model and generate embeddings.");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
27
51
|
}
|
|
28
52
|
else {
|
|
29
|
-
|
|
30
|
-
const notesWithout = repository.getNotesWithoutEmbeddings();
|
|
31
|
-
if (notesWithout.length > 0) {
|
|
32
|
-
console.error(`Warning: ${notesWithout.length} notes have no embeddings. ` +
|
|
33
|
-
"Semantic search unavailable. Run: node scripts/download-model.js");
|
|
34
|
-
}
|
|
53
|
+
console.error("[knowledgine] Running with FTS5 full-text search only");
|
|
35
54
|
}
|
|
36
55
|
// Start MCP server via stdio
|
|
37
|
-
const server = createKnowledgineMcpServer(
|
|
56
|
+
const server = createKnowledgineMcpServer({
|
|
57
|
+
repository,
|
|
58
|
+
rootPath,
|
|
59
|
+
embeddingProvider,
|
|
60
|
+
graphRepository,
|
|
61
|
+
feedbackRepository,
|
|
62
|
+
db,
|
|
63
|
+
});
|
|
38
64
|
const transport = new StdioServerTransport();
|
|
39
65
|
await server.connect(transport);
|
|
40
66
|
console.error("MCP server started on stdio");
|
|
67
|
+
// IngestEngine integration (only when --ingest flag is set)
|
|
68
|
+
let ingestWatcher;
|
|
69
|
+
let ingestRegistry;
|
|
70
|
+
if (options.ingest) {
|
|
71
|
+
const { createDefaultRegistry, initializePlugins } = await import("../lib/plugin-loader.js");
|
|
72
|
+
const { IngestEngine } = await import("@knowledgine/ingest");
|
|
73
|
+
const { IngestWatcher } = await import("../lib/ingest-watcher.js");
|
|
74
|
+
ingestRegistry = createDefaultRegistry();
|
|
75
|
+
const initResults = await initializePlugins(ingestRegistry);
|
|
76
|
+
// Warn about failed plugins but continue
|
|
77
|
+
for (const [pluginId, result] of initResults) {
|
|
78
|
+
if (!result.ok) {
|
|
79
|
+
console.error(`Warning: Plugin "${pluginId}" failed to initialize: ${result.error}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const engine = new IngestEngine(ingestRegistry, db, repository);
|
|
83
|
+
ingestWatcher = new IngestWatcher({
|
|
84
|
+
engine,
|
|
85
|
+
registry: ingestRegistry,
|
|
86
|
+
rootPath,
|
|
87
|
+
onComplete: (summaries) => {
|
|
88
|
+
const total = summaries.reduce((acc, s) => acc + s.processed, 0);
|
|
89
|
+
const errors = summaries.reduce((acc, s) => acc + s.errors, 0);
|
|
90
|
+
console.error(`Ingest complete: ${total} events processed, ${errors} errors`);
|
|
91
|
+
},
|
|
92
|
+
onError: (pluginId, error) => {
|
|
93
|
+
console.error(`Ingest error (${pluginId}): ${error.message}`);
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
// Run initial ingest in background (don't block MCP responses)
|
|
97
|
+
ingestWatcher.runInitialIngest().catch((error) => {
|
|
98
|
+
console.error(`Initial ingest failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
99
|
+
});
|
|
100
|
+
console.error("IngestEngine started (background ingestion)");
|
|
101
|
+
}
|
|
41
102
|
// File watcher for auto-reindexing
|
|
42
103
|
const fileProcessor = new FileProcessor();
|
|
43
104
|
const patternExtractor = new PatternExtractor();
|
|
@@ -91,6 +152,12 @@ export async function startCommand(options) {
|
|
|
91
152
|
// Graceful shutdown
|
|
92
153
|
const shutdown = async () => {
|
|
93
154
|
console.error("Shutting down...");
|
|
155
|
+
if (ingestWatcher) {
|
|
156
|
+
await ingestWatcher.stop();
|
|
157
|
+
}
|
|
158
|
+
if (ingestRegistry) {
|
|
159
|
+
await ingestRegistry.disposeAll();
|
|
160
|
+
}
|
|
94
161
|
if (embeddingProvider) {
|
|
95
162
|
await embeddingProvider.close();
|
|
96
163
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0CD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FzE"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { resolve, join } from "path";
|
|
2
|
+
import { existsSync, statSync, readFileSync } from "fs";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import { loadConfig, createDatabase, Migrator, KnowledgeRepository, ALL_MIGRATIONS, ModelManager, } from "@knowledgine/core";
|
|
5
|
+
function formatBytes(bytes) {
|
|
6
|
+
if (bytes < 1024)
|
|
7
|
+
return `${bytes} B`;
|
|
8
|
+
if (bytes < 1024 * 1024)
|
|
9
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
10
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
11
|
+
}
|
|
12
|
+
function getClaudeDesktopConfigPath() {
|
|
13
|
+
switch (process.platform) {
|
|
14
|
+
case "darwin":
|
|
15
|
+
return join(homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
|
|
16
|
+
case "linux":
|
|
17
|
+
return join(homedir(), ".config", "claude", "claude_desktop_config.json");
|
|
18
|
+
case "win32":
|
|
19
|
+
return join(process.env["APPDATA"] ?? join(homedir(), "AppData", "Roaming"), "Claude", "claude_desktop_config.json");
|
|
20
|
+
default:
|
|
21
|
+
return join(homedir(), ".config", "claude", "claude_desktop_config.json");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function getCursorConfigPath() {
|
|
25
|
+
return join(homedir(), ".cursor", "mcp.json");
|
|
26
|
+
}
|
|
27
|
+
function checkMcpConfig(configPath) {
|
|
28
|
+
if (!existsSync(configPath))
|
|
29
|
+
return false;
|
|
30
|
+
try {
|
|
31
|
+
const raw = readFileSync(configPath, "utf-8");
|
|
32
|
+
const config = JSON.parse(raw);
|
|
33
|
+
return config.mcpServers != null && "knowledgine" in config.mcpServers;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export async function statusCommand(options) {
|
|
40
|
+
const rootPath = resolve(options.path ?? process.cwd());
|
|
41
|
+
const knowledgineDir = resolve(rootPath, ".knowledgine");
|
|
42
|
+
const dbPath = resolve(knowledgineDir, "index.sqlite");
|
|
43
|
+
console.error("");
|
|
44
|
+
// Database check
|
|
45
|
+
if (!existsSync(knowledgineDir) || !existsSync(dbPath)) {
|
|
46
|
+
console.error(" Status: Not initialized");
|
|
47
|
+
console.error(` Run 'knowledgine init --path ${rootPath}' to get started.`);
|
|
48
|
+
console.error("");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const dbStat = statSync(dbPath);
|
|
52
|
+
console.error(` Database: ${dbPath} (${formatBytes(dbStat.size)})`);
|
|
53
|
+
// Open DB and get stats
|
|
54
|
+
let totalNotes = 0;
|
|
55
|
+
let totalPatterns = 0;
|
|
56
|
+
let notesWithoutEmbeddings = 0;
|
|
57
|
+
try {
|
|
58
|
+
const db = createDatabase(dbPath);
|
|
59
|
+
new Migrator(db, ALL_MIGRATIONS).migrate();
|
|
60
|
+
const repository = new KnowledgeRepository(db);
|
|
61
|
+
const stats = repository.getStats();
|
|
62
|
+
totalNotes = stats.totalNotes;
|
|
63
|
+
totalPatterns = stats.totalPatterns;
|
|
64
|
+
notesWithoutEmbeddings = repository.getNotesWithoutEmbeddings().length;
|
|
65
|
+
db.close();
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error(` Error reading database: ${error instanceof Error ? error.message : String(error)}`);
|
|
69
|
+
console.error("");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const embeddingsGenerated = totalNotes - notesWithoutEmbeddings;
|
|
73
|
+
console.error(` Notes: ${totalNotes} indexed`);
|
|
74
|
+
console.error(` Patterns: ${totalPatterns} extracted`);
|
|
75
|
+
console.error(` Embeddings: ${embeddingsGenerated}/${totalNotes} generated`);
|
|
76
|
+
// Model check
|
|
77
|
+
const modelManager = new ModelManager();
|
|
78
|
+
const modelAvailable = modelManager.isModelAvailable();
|
|
79
|
+
console.error(` Model: all-MiniLM-L6-v2 (${modelAvailable ? "available" : "not found"})`);
|
|
80
|
+
// Semantic search mode
|
|
81
|
+
const config = loadConfig(rootPath);
|
|
82
|
+
const semanticMode = config.embedding.enabled || modelAvailable;
|
|
83
|
+
console.error(` Search mode: ${semanticMode ? "semantic + FTS5" : "FTS5 only"}`);
|
|
84
|
+
// MCP config checks
|
|
85
|
+
const targets = [
|
|
86
|
+
{
|
|
87
|
+
name: "Claude Desktop",
|
|
88
|
+
configured: checkMcpConfig(getClaudeDesktopConfigPath()),
|
|
89
|
+
configPath: getClaudeDesktopConfigPath(),
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: "Cursor",
|
|
93
|
+
configured: checkMcpConfig(getCursorConfigPath()),
|
|
94
|
+
configPath: getCursorConfigPath(),
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
console.error(" MCP Config:");
|
|
98
|
+
for (const t of targets) {
|
|
99
|
+
const status = t.configured ? "configured" : "not configured";
|
|
100
|
+
console.error(` ${t.name}: ${status}`);
|
|
101
|
+
}
|
|
102
|
+
// Overall status
|
|
103
|
+
const isReady = totalNotes > 0;
|
|
104
|
+
const statusLabel = isReady
|
|
105
|
+
? semanticMode
|
|
106
|
+
? "Ready (semantic + FTS5)"
|
|
107
|
+
: "Ready (FTS5 only)"
|
|
108
|
+
: "Not initialized";
|
|
109
|
+
console.error(` Status: ${statusLabel}`);
|
|
110
|
+
if (!semanticMode && totalNotes > 0) {
|
|
111
|
+
console.error("");
|
|
112
|
+
console.error(" Hint: Run 'knowledgine upgrade --semantic' to enable semantic search.");
|
|
113
|
+
}
|
|
114
|
+
const unconfigured = targets.filter((t) => !t.configured);
|
|
115
|
+
if (unconfigured.length > 0 && totalNotes > 0) {
|
|
116
|
+
console.error("");
|
|
117
|
+
console.error(" Hint: Run 'knowledgine setup' to configure your AI tool.");
|
|
118
|
+
}
|
|
119
|
+
console.error("");
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
export interface ToolSearchOptions {
|
|
3
|
+
path?: string;
|
|
4
|
+
limit?: string;
|
|
5
|
+
mode?: string;
|
|
6
|
+
format?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function toolSearchCommand(query: string, options: ToolSearchOptions): Promise<void>;
|
|
9
|
+
export interface ToolRelatedOptions {
|
|
10
|
+
path?: string;
|
|
11
|
+
id?: string;
|
|
12
|
+
file?: string;
|
|
13
|
+
limit?: string;
|
|
14
|
+
format?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function toolRelatedCommand(options: ToolRelatedOptions): Promise<void>;
|
|
17
|
+
export interface ToolStatsOptions {
|
|
18
|
+
path?: string;
|
|
19
|
+
format?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function toolStatsCommand(options: ToolStatsOptions): Promise<void>;
|
|
22
|
+
export interface ToolEntitiesOptions {
|
|
23
|
+
path?: string;
|
|
24
|
+
limit?: string;
|
|
25
|
+
format?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function toolEntitiesCommand(query: string, options: ToolEntitiesOptions): Promise<void>;
|
|
28
|
+
export declare function registerToolCommands(program: Command): void;
|
|
29
|
+
//# sourceMappingURL=tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/commands/tool.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCzC,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC/E;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoC3D"}
|