codesearch-mcp 0.0.1-alpha

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.
Files changed (39) hide show
  1. package/README.md +129 -0
  2. package/dist/app.d.ts +1 -0
  3. package/dist/app.js +124 -0
  4. package/dist/src/ast.d.ts +2 -0
  5. package/dist/src/ast.js +60 -0
  6. package/dist/src/config.d.ts +26 -0
  7. package/dist/src/config.js +60 -0
  8. package/dist/src/db/data-source.d.ts +2 -0
  9. package/dist/src/db/data-source.js +13 -0
  10. package/dist/src/db/entities/code-chunk.entity.d.ts +9 -0
  11. package/dist/src/db/entities/code-chunk.entity.js +54 -0
  12. package/dist/src/db/entities/code-dependency.entity.d.ts +9 -0
  13. package/dist/src/db/entities/code-dependency.entity.js +54 -0
  14. package/dist/src/db/index.d.ts +4 -0
  15. package/dist/src/db/index.js +12 -0
  16. package/dist/src/db/init.d.ts +2 -0
  17. package/dist/src/db/init.js +50 -0
  18. package/dist/src/env-loader.d.ts +1 -0
  19. package/dist/src/env-loader.js +41 -0
  20. package/dist/src/file-utils.d.ts +12 -0
  21. package/dist/src/file-utils.js +97 -0
  22. package/dist/src/graph.d.ts +4 -0
  23. package/dist/src/graph.js +259 -0
  24. package/dist/src/indexer.d.ts +13 -0
  25. package/dist/src/indexer.js +217 -0
  26. package/dist/src/interrupt.d.ts +3 -0
  27. package/dist/src/interrupt.js +27 -0
  28. package/dist/src/mcp.d.ts +1 -0
  29. package/dist/src/mcp.js +248 -0
  30. package/dist/src/project-selector.d.ts +7 -0
  31. package/dist/src/project-selector.js +116 -0
  32. package/dist/src/searcher.d.ts +50 -0
  33. package/dist/src/searcher.js +205 -0
  34. package/dist/src/setup.d.ts +1 -0
  35. package/dist/src/setup.js +145 -0
  36. package/dist/vitest.config.d.ts +2 -0
  37. package/dist/vitest.config.js +9 -0
  38. package/docker/docker-compose.yml +19 -0
  39. package/package.json +49 -0
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runSetup = runSetup;
37
+ const readline = __importStar(require("readline"));
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const os = __importStar(require("os"));
41
+ const child_process_1 = require("child_process");
42
+ const CONFIG_DIR = path.join(os.homedir(), '.config', 'codesearch-mcp');
43
+ const CONFIG_FILE = path.join(CONFIG_DIR, '.env');
44
+ const DOCKER_COMPOSE_SRC = path.join(__dirname, '..', 'docker', 'docker-compose.yml');
45
+ const DOCKER_COMPOSE_DST = path.join(CONFIG_DIR, 'docker-compose.yml');
46
+ function ask(rl, question) {
47
+ return new Promise(resolve => rl.question(question, resolve));
48
+ }
49
+ async function prompt(rl, label, defaultVal) {
50
+ const answer = await ask(rl, `${label} (${defaultVal}): `);
51
+ return answer.trim() || defaultVal;
52
+ }
53
+ function writeEnv(vars) {
54
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
55
+ const content = Object.entries(vars)
56
+ .map(([k, v]) => `${k}=${v}`)
57
+ .join('\n') + '\n';
58
+ fs.writeFileSync(CONFIG_FILE, content, { mode: 0o600 });
59
+ console.log(`\nConfig saved to ${CONFIG_FILE}`);
60
+ }
61
+ async function checkRemoteDb(host, port, user, pass, db) {
62
+ try {
63
+ const { Client } = await Promise.resolve().then(() => __importStar(require('pg')));
64
+ const client = new Client({ host, port: parseInt(port), user, password: pass, database: db, connectionTimeoutMillis: 5000 });
65
+ await client.connect();
66
+ await client.end();
67
+ return true;
68
+ }
69
+ catch (err) {
70
+ console.error(` Connection failed: ${err.message}`);
71
+ return false;
72
+ }
73
+ }
74
+ async function setupLocalDocker(rl) {
75
+ console.log('\nCopying docker-compose.yml to', DOCKER_COMPOSE_DST);
76
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
77
+ fs.copyFileSync(DOCKER_COMPOSE_SRC, DOCKER_COMPOSE_DST);
78
+ console.log('\nStarting Docker containers...');
79
+ const upResult = (0, child_process_1.spawnSync)('docker', ['compose', '-f', DOCKER_COMPOSE_DST, 'up', '-d'], { stdio: 'inherit' });
80
+ if (upResult.status !== 0) {
81
+ console.error('Failed to start Docker containers. Make sure Docker is running.');
82
+ process.exit(1);
83
+ }
84
+ console.log('\nWaiting for Ollama to be ready...');
85
+ await new Promise(r => setTimeout(r, 5000));
86
+ console.log('Pulling bge-m3 model (this may take a while)...');
87
+ (0, child_process_1.spawnSync)('docker', ['exec', 'codesearch-mcp-ollama-1', 'ollama', 'pull', 'bge-m3'], { stdio: 'inherit' });
88
+ return {
89
+ DB_HOST: 'localhost',
90
+ DB_PORT: '5433',
91
+ DB_USER: 'dev',
92
+ DB_PASS: 'dev',
93
+ DB_NAME: 'rag',
94
+ };
95
+ }
96
+ async function setupRemoteDb(rl) {
97
+ let vars = {};
98
+ while (true) {
99
+ vars.DB_HOST = await prompt(rl, 'DB host', 'localhost');
100
+ vars.DB_PORT = await prompt(rl, 'DB port', '5432');
101
+ vars.DB_USER = await prompt(rl, 'DB user', 'postgres');
102
+ vars.DB_PASS = await prompt(rl, 'DB password', '');
103
+ vars.DB_NAME = await prompt(rl, 'DB name', 'rag');
104
+ console.log('\nTesting connection...');
105
+ const ok = await checkRemoteDb(vars.DB_HOST, vars.DB_PORT, vars.DB_USER, vars.DB_PASS, vars.DB_NAME);
106
+ if (ok) {
107
+ console.log('Connection successful.');
108
+ break;
109
+ }
110
+ const retry = await ask(rl, 'Retry? (y/n): ');
111
+ if (retry.trim().toLowerCase() !== 'y')
112
+ break;
113
+ }
114
+ return vars;
115
+ }
116
+ async function runSetup() {
117
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
118
+ console.log('=== codesearch-mcp setup ===\n');
119
+ const dbChoice = await ask(rl, 'Database type:\n 1. Local Docker (auto-start)\n 2. Remote (Supabase, Railway, self-hosted)\n\nEnter choice (1): ');
120
+ const useDocker = (dbChoice.trim() || '1') === '1';
121
+ const dbVars = useDocker
122
+ ? await setupLocalDocker(rl)
123
+ : await setupRemoteDb(rl);
124
+ const workspaceRoot = await prompt(rl, 'Workspace root path', path.join(os.homedir(), 'Projects'));
125
+ const ollamaHost = await prompt(rl, 'Ollama API URL', 'http://localhost:11434');
126
+ const ollamaModel = await prompt(rl, 'Embedding model', 'bge-m3');
127
+ writeEnv({
128
+ ...dbVars,
129
+ WORKSPACE_ROOT: workspaceRoot,
130
+ OLLAMA_HOST: ollamaHost,
131
+ OLLAMA_MODEL: ollamaModel,
132
+ });
133
+ rl.close();
134
+ console.log('\nInitializing database schema...');
135
+ // Re-apply env from the file we just wrote so initDbWithSchema picks up the new values
136
+ const dotenv = await Promise.resolve().then(() => __importStar(require('dotenv')));
137
+ dotenv.config({ path: CONFIG_FILE, override: true });
138
+ const { initDbWithSchema } = await Promise.resolve().then(() => __importStar(require('./db')));
139
+ await initDbWithSchema();
140
+ console.log('\nSetup complete!');
141
+ console.log('\nNext steps:');
142
+ console.log(` rag-index ${workspaceRoot}`);
143
+ console.log(' claude mcp add codesearch-mcp -s user -- rag-mcp');
144
+ process.exit(0);
145
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: UserConfig;
2
+ export default _default;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config_1 = require("vitest/config");
4
+ exports.default = (0, config_1.defineConfig)({
5
+ test: {
6
+ environment: 'node',
7
+ include: ['tests/**/*.test.ts'],
8
+ },
9
+ });
@@ -0,0 +1,19 @@
1
+ services:
2
+ db:
3
+ image: pgvector/pgvector:pg17
4
+ environment:
5
+ POSTGRES_USER: dev
6
+ POSTGRES_PASSWORD: dev
7
+ POSTGRES_DB: rag
8
+ ports:
9
+ - "5433:5432"
10
+
11
+ ollama:
12
+ image: ollama/ollama
13
+ ports:
14
+ - "11434:11434"
15
+ volumes:
16
+ - ollama_data:/root/.ollama
17
+
18
+ volumes:
19
+ ollama_data:
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "codesearch-mcp",
3
+ "version": "0.0.1-alpha",
4
+ "description": "Local semantic codebase search via MCP — indexes projects into pgvector, exposes search to Claude",
5
+ "main": "dist/app.js",
6
+ "bin": {
7
+ "rag-index": "dist/app.js",
8
+ "rag-mcp": "dist/app.js",
9
+ "rag-setup": "dist/app.js"
10
+ },
11
+ "files": [
12
+ "dist/",
13
+ "docker/",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "postbuild": "node -e \"const fs=require('fs');const f='dist/app.js';fs.writeFileSync(f,'#!/usr/bin/env node\\n'+fs.readFileSync(f,'utf8'));fs.chmodSync(f,0o755);\"",
19
+ "prepublishOnly": "npm run build && npm run typecheck",
20
+ "start:mcp": "ts-node app.ts mcp",
21
+ "index:workspace": "ts-node app.ts index",
22
+ "index:reindex": "ts-node app.ts index --reindex",
23
+ "typecheck": "tsc --noEmit",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest"
26
+ },
27
+ "dependencies": {
28
+ "@inquirer/prompts": "^8.4.1",
29
+ "@langchain/textsplitters": "^0.1.0",
30
+ "@modelcontextprotocol/sdk": "^1.0.0",
31
+ "cli-progress": "^3.12.0",
32
+ "dotenv": "^17.4.2",
33
+ "ignore": "^7.0.5",
34
+ "ollama": "^0.5.0",
35
+ "pg": "^8.13.0",
36
+ "reflect-metadata": "^0.2.2",
37
+ "ts-morph": "^28.0.0",
38
+ "typeorm": "^0.3.20",
39
+ "zod": "^4.3.6"
40
+ },
41
+ "devDependencies": {
42
+ "@types/cli-progress": "^3.11.6",
43
+ "@types/node": "^22.0.0",
44
+ "@types/pg": "^8.20.0",
45
+ "ts-node": "^10.9.2",
46
+ "typescript": "^5.6.0",
47
+ "vitest": "^4.1.4"
48
+ }
49
+ }