codebase-context 1.2.2 → 1.5.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/LICENSE +21 -21
- package/README.md +144 -87
- package/dist/analyzers/angular/index.d.ts +1 -1
- package/dist/analyzers/angular/index.d.ts.map +1 -1
- package/dist/analyzers/angular/index.js +298 -309
- package/dist/analyzers/angular/index.js.map +1 -1
- package/dist/analyzers/generic/index.d.ts +1 -1
- package/dist/analyzers/generic/index.d.ts.map +1 -1
- package/dist/analyzers/generic/index.js +93 -47
- package/dist/analyzers/generic/index.js.map +1 -1
- package/dist/constants/codebase-context.d.ts +6 -0
- package/dist/constants/codebase-context.d.ts.map +1 -0
- package/dist/constants/codebase-context.js +8 -0
- package/dist/constants/codebase-context.js.map +1 -0
- package/dist/core/analyzer-registry.d.ts.map +1 -1
- package/dist/core/analyzer-registry.js +5 -7
- package/dist/core/analyzer-registry.js.map +1 -1
- package/dist/core/indexer.d.ts +9 -1
- package/dist/core/indexer.d.ts.map +1 -1
- package/dist/core/indexer.js +206 -139
- package/dist/core/indexer.js.map +1 -1
- package/dist/core/search.d.ts +1 -1
- package/dist/core/search.d.ts.map +1 -1
- package/dist/core/search.js +63 -59
- package/dist/core/search.js.map +1 -1
- package/dist/embeddings/openai.d.ts.map +1 -1
- package/dist/embeddings/openai.js +2 -2
- package/dist/embeddings/openai.js.map +1 -1
- package/dist/embeddings/transformers.d.ts +1 -1
- package/dist/embeddings/transformers.d.ts.map +1 -1
- package/dist/embeddings/transformers.js +19 -15
- package/dist/embeddings/transformers.js.map +1 -1
- package/dist/embeddings/types.d.ts +1 -1
- package/dist/embeddings/types.d.ts.map +1 -1
- package/dist/embeddings/types.js +3 -3
- package/dist/embeddings/types.js.map +1 -1
- package/dist/errors/index.d.ts +8 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +11 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +6 -28
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +691 -335
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +18 -18
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +23 -23
- package/dist/lib.js.map +1 -1
- package/dist/memory/store.d.ts +22 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +97 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/storage/lancedb.d.ts.map +1 -1
- package/dist/storage/lancedb.js +27 -31
- package/dist/storage/lancedb.js.map +1 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +2 -1
- package/dist/storage/types.js.map +1 -1
- package/dist/types/index.d.ts +27 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/chunking.d.ts.map +1 -1
- package/dist/utils/chunking.js +10 -9
- package/dist/utils/chunking.js.map +1 -1
- package/dist/utils/dependency-detection.d.ts +18 -0
- package/dist/utils/dependency-detection.d.ts.map +1 -0
- package/dist/utils/dependency-detection.js +102 -0
- package/dist/utils/dependency-detection.js.map +1 -0
- package/dist/utils/git-dates.d.ts.map +1 -1
- package/dist/utils/git-dates.js +3 -3
- package/dist/utils/git-dates.js.map +1 -1
- package/dist/utils/language-detection.d.ts.map +1 -1
- package/dist/utils/language-detection.js +69 -17
- package/dist/utils/language-detection.js.map +1 -1
- package/dist/utils/usage-tracker.d.ts +2 -2
- package/dist/utils/usage-tracker.d.ts.map +1 -1
- package/dist/utils/usage-tracker.js +64 -32
- package/dist/utils/usage-tracker.js.map +1 -1
- package/dist/utils/workspace-detection.d.ts +32 -0
- package/dist/utils/workspace-detection.d.ts.map +1 -0
- package/dist/utils/workspace-detection.js +107 -0
- package/dist/utils/workspace-detection.js.map +1 -0
- package/package.json +114 -97
- package/dist/core/file-watcher.d.ts +0 -63
- package/dist/core/file-watcher.d.ts.map +0 -1
- package/dist/core/file-watcher.js +0 -210
- package/dist/core/file-watcher.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -36
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -111
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/pattern-detector.d.ts +0 -41
- package/dist/utils/pattern-detector.d.ts.map +0 -1
- package/dist/utils/pattern-detector.js +0 -101
- package/dist/utils/pattern-detector.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,98 +1,115 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "codebase-context",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "MCP server
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/lib.js",
|
|
7
|
-
"types": "./dist/lib.d.ts",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"import": "./dist/lib.js",
|
|
11
|
-
"types": "./dist/lib.d.ts"
|
|
12
|
-
},
|
|
13
|
-
"./server": {
|
|
14
|
-
"import": "./dist/index.js",
|
|
15
|
-
"types": "./dist/index.d.ts"
|
|
16
|
-
},
|
|
17
|
-
"./analyzers/angular": {
|
|
18
|
-
"import": "./dist/analyzers/angular/index.js",
|
|
19
|
-
"types": "./dist/analyzers/angular/index.d.ts"
|
|
20
|
-
},
|
|
21
|
-
"./analyzers/generic": {
|
|
22
|
-
"import": "./dist/analyzers/generic/index.js",
|
|
23
|
-
"types": "./dist/analyzers/generic/index.d.ts"
|
|
24
|
-
},
|
|
25
|
-
"./embeddings": {
|
|
26
|
-
"import": "./dist/embeddings/index.js",
|
|
27
|
-
"types": "./dist/embeddings/index.d.ts"
|
|
28
|
-
},
|
|
29
|
-
"./storage": {
|
|
30
|
-
"import": "./dist/storage/index.js",
|
|
31
|
-
"types": "./dist/storage/index.d.ts"
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
"bin": {
|
|
35
|
-
"codebase-context": "./dist/index.js"
|
|
36
|
-
},
|
|
37
|
-
"files": [
|
|
38
|
-
"dist",
|
|
39
|
-
"README.md",
|
|
40
|
-
"LICENSE"
|
|
41
|
-
],
|
|
42
|
-
"engines": {
|
|
43
|
-
"node": ">=18.0.0"
|
|
44
|
-
},
|
|
45
|
-
"keywords": [
|
|
46
|
-
"mcp",
|
|
47
|
-
"model-context-protocol",
|
|
48
|
-
"semantic-search",
|
|
49
|
-
"codebase",
|
|
50
|
-
"indexing",
|
|
51
|
-
"embeddings",
|
|
52
|
-
"vector-search",
|
|
53
|
-
"angular",
|
|
54
|
-
"ai",
|
|
55
|
-
"llm",
|
|
56
|
-
"code-understanding",
|
|
57
|
-
"developer-tools"
|
|
58
|
-
],
|
|
59
|
-
"repository": {
|
|
60
|
-
"type": "git",
|
|
61
|
-
"url": "git+https://github.com/PatrickSys/codebase-context.git"
|
|
62
|
-
},
|
|
63
|
-
"bugs": {
|
|
64
|
-
"url": "https://github.com/PatrickSys/codebase-context/issues"
|
|
65
|
-
},
|
|
66
|
-
"homepage": "https://github.com/PatrickSys/codebase-context#readme",
|
|
67
|
-
"author": {
|
|
68
|
-
"name": "Patrick Rosselló",
|
|
69
|
-
"email": "rossellocolompatrick@gmail.com",
|
|
70
|
-
"url": "https://github.com/PatrickSys"
|
|
71
|
-
},
|
|
72
|
-
"license": "MIT",
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
"@
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
"
|
|
97
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "codebase-context",
|
|
3
|
+
"version": "1.5.0",
|
|
4
|
+
"description": "MCP server that helps AI agents understand your codebase - patterns, libraries, architecture, monorepo support",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/lib.js",
|
|
7
|
+
"types": "./dist/lib.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/lib.js",
|
|
11
|
+
"types": "./dist/lib.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./server": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./analyzers/angular": {
|
|
18
|
+
"import": "./dist/analyzers/angular/index.js",
|
|
19
|
+
"types": "./dist/analyzers/angular/index.d.ts"
|
|
20
|
+
},
|
|
21
|
+
"./analyzers/generic": {
|
|
22
|
+
"import": "./dist/analyzers/generic/index.js",
|
|
23
|
+
"types": "./dist/analyzers/generic/index.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./embeddings": {
|
|
26
|
+
"import": "./dist/embeddings/index.js",
|
|
27
|
+
"types": "./dist/embeddings/index.d.ts"
|
|
28
|
+
},
|
|
29
|
+
"./storage": {
|
|
30
|
+
"import": "./dist/storage/index.js",
|
|
31
|
+
"types": "./dist/storage/index.d.ts"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"bin": {
|
|
35
|
+
"codebase-context": "./dist/index.js"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"README.md",
|
|
40
|
+
"LICENSE"
|
|
41
|
+
],
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=18.0.0"
|
|
44
|
+
},
|
|
45
|
+
"keywords": [
|
|
46
|
+
"mcp",
|
|
47
|
+
"model-context-protocol",
|
|
48
|
+
"semantic-search",
|
|
49
|
+
"codebase",
|
|
50
|
+
"indexing",
|
|
51
|
+
"embeddings",
|
|
52
|
+
"vector-search",
|
|
53
|
+
"angular",
|
|
54
|
+
"ai",
|
|
55
|
+
"llm",
|
|
56
|
+
"code-understanding",
|
|
57
|
+
"developer-tools"
|
|
58
|
+
],
|
|
59
|
+
"repository": {
|
|
60
|
+
"type": "git",
|
|
61
|
+
"url": "git+https://github.com/PatrickSys/codebase-context.git"
|
|
62
|
+
},
|
|
63
|
+
"bugs": {
|
|
64
|
+
"url": "https://github.com/PatrickSys/codebase-context/issues"
|
|
65
|
+
},
|
|
66
|
+
"homepage": "https://github.com/PatrickSys/codebase-context#readme",
|
|
67
|
+
"author": {
|
|
68
|
+
"name": "Patrick Rosselló",
|
|
69
|
+
"email": "rossellocolompatrick@gmail.com",
|
|
70
|
+
"url": "https://github.com/PatrickSys"
|
|
71
|
+
},
|
|
72
|
+
"license": "MIT",
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"@lancedb/lancedb": "^0.4.0",
|
|
75
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
76
|
+
"@typescript-eslint/typescript-estree": "^7.0.0",
|
|
77
|
+
"@xenova/transformers": "^2.17.0",
|
|
78
|
+
"fuse.js": "^7.0.0",
|
|
79
|
+
"glob": "^10.3.10",
|
|
80
|
+
"hono": "4.11.7",
|
|
81
|
+
"ignore": "^5.3.1",
|
|
82
|
+
"typescript": "^5.3.3",
|
|
83
|
+
"uuid": "^9.0.1",
|
|
84
|
+
"zod": "^4.3.4"
|
|
85
|
+
},
|
|
86
|
+
"devDependencies": {
|
|
87
|
+
"@eslint/js": "^9.39.2",
|
|
88
|
+
"@types/glob": "^8.1.0",
|
|
89
|
+
"@types/node": "^20.11.24",
|
|
90
|
+
"@types/uuid": "^9.0.8",
|
|
91
|
+
"@typescript-eslint/eslint-plugin": "^8.51.0",
|
|
92
|
+
"@typescript-eslint/parser": "^8.51.0",
|
|
93
|
+
"eslint": "^9.39.2",
|
|
94
|
+
"eslint-config-prettier": "^10.1.8",
|
|
95
|
+
"eslint-plugin-import": "^2.32.0",
|
|
96
|
+
"globals": "^17.0.0",
|
|
97
|
+
"prettier": "^3.7.4",
|
|
98
|
+
"tsx": "^4.21.0",
|
|
99
|
+
"typescript-eslint": "^8.51.0",
|
|
100
|
+
"vitest": "^4.0.16"
|
|
101
|
+
},
|
|
102
|
+
"scripts": {
|
|
103
|
+
"preinstall": "npx only-allow pnpm",
|
|
104
|
+
"build": "tsc",
|
|
105
|
+
"start": "node dist/index.js",
|
|
106
|
+
"dev": "tsx src/index.ts",
|
|
107
|
+
"watch": "tsc -w",
|
|
108
|
+
"test": "vitest run",
|
|
109
|
+
"test:watch": "vitest",
|
|
110
|
+
"lint": "eslint \"src/**/*.ts\"",
|
|
111
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
112
|
+
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
113
|
+
"type-check": "tsc --noEmit"
|
|
114
|
+
}
|
|
98
115
|
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File Watcher for Incremental Index Updates
|
|
3
|
-
*
|
|
4
|
-
* Watches for file changes in the codebase and triggers selective re-indexing.
|
|
5
|
-
* Uses debouncing to avoid excessive re-indexing on rapid changes.
|
|
6
|
-
*/
|
|
7
|
-
import { EventEmitter } from "events";
|
|
8
|
-
export interface FileWatcherOptions {
|
|
9
|
-
/** Root path to watch */
|
|
10
|
-
rootPath: string;
|
|
11
|
-
/** Debounce delay in milliseconds (default: 2000ms) */
|
|
12
|
-
debounceMs?: number;
|
|
13
|
-
/** File extensions to watch (default: ts, tsx, js, jsx, json) */
|
|
14
|
-
extensions?: string[];
|
|
15
|
-
/** Patterns to ignore (glob-like) */
|
|
16
|
-
ignorePatterns?: string[];
|
|
17
|
-
/** Enable verbose logging */
|
|
18
|
-
verbose?: boolean;
|
|
19
|
-
}
|
|
20
|
-
export interface FileChangeEvent {
|
|
21
|
-
type: "add" | "change" | "delete";
|
|
22
|
-
filePath: string;
|
|
23
|
-
relativePath: string;
|
|
24
|
-
timestamp: Date;
|
|
25
|
-
}
|
|
26
|
-
export type FileWatcherCallback = (changes: FileChangeEvent[]) => void;
|
|
27
|
-
export declare class FileWatcher extends EventEmitter {
|
|
28
|
-
private rootPath;
|
|
29
|
-
private options;
|
|
30
|
-
private watchers;
|
|
31
|
-
private pendingChanges;
|
|
32
|
-
private debounceTimer;
|
|
33
|
-
private isRunning;
|
|
34
|
-
private stats;
|
|
35
|
-
constructor(options: FileWatcherOptions);
|
|
36
|
-
/**
|
|
37
|
-
* Start watching the codebase for changes
|
|
38
|
-
*/
|
|
39
|
-
start(): Promise<void>;
|
|
40
|
-
/**
|
|
41
|
-
* Stop watching for changes
|
|
42
|
-
*/
|
|
43
|
-
stop(): void;
|
|
44
|
-
/**
|
|
45
|
-
* Get current statistics
|
|
46
|
-
*/
|
|
47
|
-
getStats(): typeof this.stats;
|
|
48
|
-
/**
|
|
49
|
-
* Check if watcher is active
|
|
50
|
-
*/
|
|
51
|
-
isActive(): boolean;
|
|
52
|
-
private watchDirectory;
|
|
53
|
-
private handleFileChange;
|
|
54
|
-
private scheduleFlush;
|
|
55
|
-
private flushChanges;
|
|
56
|
-
private shouldIgnore;
|
|
57
|
-
private log;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Create and configure a file watcher
|
|
61
|
-
*/
|
|
62
|
-
export declare function createFileWatcher(rootPath: string, onChanges: FileWatcherCallback, options?: Partial<Omit<FileWatcherOptions, "rootPath">>): FileWatcher;
|
|
63
|
-
//# sourceMappingURL=file-watcher.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../src/core/file-watcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,kBAAkB;IAC/B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;AAkBvE,qBAAa,WAAY,SAAQ,YAAY;IACzC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAiD;IAChE,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,cAAc,CAA2C;IACjE,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAIX;gBAEU,OAAO,EAAE,kBAAkB;IAMvC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAsBZ;;OAEG;IACH,QAAQ,IAAI,OAAO,IAAI,CAAC,KAAK;IAI7B;;OAEG;IACH,QAAQ,IAAI,OAAO;YAIL,cAAc;IAsC5B,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,GAAG;CAKd;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,mBAAmB,EAC9B,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,GACxD,WAAW,CAMb"}
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File Watcher for Incremental Index Updates
|
|
3
|
-
*
|
|
4
|
-
* Watches for file changes in the codebase and triggers selective re-indexing.
|
|
5
|
-
* Uses debouncing to avoid excessive re-indexing on rapid changes.
|
|
6
|
-
*/
|
|
7
|
-
import { watch, promises as fs, statSync } from "fs";
|
|
8
|
-
import path from "path";
|
|
9
|
-
import { EventEmitter } from "events";
|
|
10
|
-
const DEFAULT_OPTIONS = {
|
|
11
|
-
debounceMs: 2000,
|
|
12
|
-
extensions: ["ts", "tsx", "js", "jsx", "json", "html", "scss", "css"],
|
|
13
|
-
ignorePatterns: [
|
|
14
|
-
"node_modules",
|
|
15
|
-
"dist",
|
|
16
|
-
".git",
|
|
17
|
-
".codebase-index",
|
|
18
|
-
".codebase-index.json",
|
|
19
|
-
".codebase-intelligence.json",
|
|
20
|
-
"*.spec.ts", // Watch tests separately if needed
|
|
21
|
-
"*.test.ts",
|
|
22
|
-
],
|
|
23
|
-
verbose: false,
|
|
24
|
-
};
|
|
25
|
-
export class FileWatcher extends EventEmitter {
|
|
26
|
-
rootPath;
|
|
27
|
-
options;
|
|
28
|
-
watchers = new Map();
|
|
29
|
-
pendingChanges = new Map();
|
|
30
|
-
debounceTimer = null;
|
|
31
|
-
isRunning = false;
|
|
32
|
-
stats = {
|
|
33
|
-
filesWatched: 0,
|
|
34
|
-
changesDetected: 0,
|
|
35
|
-
reindexTriggered: 0,
|
|
36
|
-
};
|
|
37
|
-
constructor(options) {
|
|
38
|
-
super();
|
|
39
|
-
this.rootPath = path.resolve(options.rootPath);
|
|
40
|
-
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Start watching the codebase for changes
|
|
44
|
-
*/
|
|
45
|
-
async start() {
|
|
46
|
-
if (this.isRunning) {
|
|
47
|
-
this.log("Watcher already running");
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
this.log(`Starting file watcher on: ${this.rootPath}`);
|
|
51
|
-
this.isRunning = true;
|
|
52
|
-
try {
|
|
53
|
-
await this.watchDirectory(this.rootPath);
|
|
54
|
-
this.log(`Watching ${this.stats.filesWatched} directories`);
|
|
55
|
-
this.emit("started", { directories: this.stats.filesWatched });
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
this.isRunning = false;
|
|
59
|
-
this.emit("error", error);
|
|
60
|
-
throw error;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Stop watching for changes
|
|
65
|
-
*/
|
|
66
|
-
stop() {
|
|
67
|
-
if (!this.isRunning)
|
|
68
|
-
return;
|
|
69
|
-
this.log("Stopping file watcher");
|
|
70
|
-
// Close all watchers
|
|
71
|
-
for (const [dir, watcher] of this.watchers) {
|
|
72
|
-
watcher.close();
|
|
73
|
-
}
|
|
74
|
-
this.watchers.clear();
|
|
75
|
-
// Clear pending changes
|
|
76
|
-
if (this.debounceTimer) {
|
|
77
|
-
clearTimeout(this.debounceTimer);
|
|
78
|
-
this.debounceTimer = null;
|
|
79
|
-
}
|
|
80
|
-
this.pendingChanges.clear();
|
|
81
|
-
this.isRunning = false;
|
|
82
|
-
this.emit("stopped");
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Get current statistics
|
|
86
|
-
*/
|
|
87
|
-
getStats() {
|
|
88
|
-
return { ...this.stats };
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Check if watcher is active
|
|
92
|
-
*/
|
|
93
|
-
isActive() {
|
|
94
|
-
return this.isRunning;
|
|
95
|
-
}
|
|
96
|
-
async watchDirectory(dir) {
|
|
97
|
-
// Skip ignored directories
|
|
98
|
-
const relativePath = path.relative(this.rootPath, dir);
|
|
99
|
-
if (this.shouldIgnore(relativePath)) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
try {
|
|
103
|
-
// Watch this directory
|
|
104
|
-
const watcher = watch(dir, { persistent: true }, (eventType, filename) => {
|
|
105
|
-
if (!filename)
|
|
106
|
-
return;
|
|
107
|
-
const filePath = path.join(dir, filename);
|
|
108
|
-
this.handleFileChange(eventType, filePath);
|
|
109
|
-
});
|
|
110
|
-
watcher.on("error", (error) => {
|
|
111
|
-
this.log(`Watcher error on ${dir}: ${error.message}`);
|
|
112
|
-
// Remove broken watcher
|
|
113
|
-
this.watchers.delete(dir);
|
|
114
|
-
});
|
|
115
|
-
this.watchers.set(dir, watcher);
|
|
116
|
-
this.stats.filesWatched++;
|
|
117
|
-
// Recursively watch subdirectories
|
|
118
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
119
|
-
for (const entry of entries) {
|
|
120
|
-
if (entry.isDirectory()) {
|
|
121
|
-
await this.watchDirectory(path.join(dir, entry.name));
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
catch (error) {
|
|
126
|
-
// Directory might not exist or be inaccessible
|
|
127
|
-
this.log(`Could not watch ${dir}: ${error}`);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
handleFileChange(eventType, filePath) {
|
|
131
|
-
const relativePath = path.relative(this.rootPath, filePath);
|
|
132
|
-
// Skip ignored files
|
|
133
|
-
if (this.shouldIgnore(relativePath)) {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
// Skip if not a watched extension
|
|
137
|
-
const ext = path.extname(filePath).slice(1);
|
|
138
|
-
if (!this.options.extensions.includes(ext)) {
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
// Determine change type
|
|
142
|
-
let changeType;
|
|
143
|
-
try {
|
|
144
|
-
statSync(filePath);
|
|
145
|
-
changeType = eventType === "rename" ? "add" : "change";
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
changeType = "delete";
|
|
149
|
-
}
|
|
150
|
-
const event = {
|
|
151
|
-
type: changeType,
|
|
152
|
-
filePath,
|
|
153
|
-
relativePath,
|
|
154
|
-
timestamp: new Date(),
|
|
155
|
-
};
|
|
156
|
-
this.pendingChanges.set(filePath, event);
|
|
157
|
-
this.stats.changesDetected++;
|
|
158
|
-
this.log(`Detected ${changeType}: ${relativePath}`);
|
|
159
|
-
// Debounce the re-index trigger
|
|
160
|
-
this.scheduleFlush();
|
|
161
|
-
}
|
|
162
|
-
scheduleFlush() {
|
|
163
|
-
if (this.debounceTimer) {
|
|
164
|
-
clearTimeout(this.debounceTimer);
|
|
165
|
-
}
|
|
166
|
-
this.debounceTimer = setTimeout(() => {
|
|
167
|
-
this.flushChanges();
|
|
168
|
-
}, this.options.debounceMs);
|
|
169
|
-
}
|
|
170
|
-
flushChanges() {
|
|
171
|
-
if (this.pendingChanges.size === 0)
|
|
172
|
-
return;
|
|
173
|
-
const changes = Array.from(this.pendingChanges.values());
|
|
174
|
-
this.pendingChanges.clear();
|
|
175
|
-
this.stats.reindexTriggered++;
|
|
176
|
-
this.log(`Flushing ${changes.length} changes`);
|
|
177
|
-
this.emit("changes", changes);
|
|
178
|
-
}
|
|
179
|
-
shouldIgnore(relativePath) {
|
|
180
|
-
// Simple pattern matching (not full glob)
|
|
181
|
-
for (const pattern of this.options.ignorePatterns) {
|
|
182
|
-
if (pattern.startsWith("*")) {
|
|
183
|
-
// Extension match: *.spec.ts
|
|
184
|
-
const suffix = pattern.slice(1);
|
|
185
|
-
if (relativePath.endsWith(suffix)) {
|
|
186
|
-
return true;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
else if (relativePath.includes(pattern)) {
|
|
190
|
-
// Directory/path match
|
|
191
|
-
return true;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
return false;
|
|
195
|
-
}
|
|
196
|
-
log(message) {
|
|
197
|
-
if (this.options.verbose) {
|
|
198
|
-
console.error(`[FileWatcher] ${message}`);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Create and configure a file watcher
|
|
204
|
-
*/
|
|
205
|
-
export function createFileWatcher(rootPath, onChanges, options) {
|
|
206
|
-
const watcher = new FileWatcher({ rootPath, ...options });
|
|
207
|
-
watcher.on("changes", onChanges);
|
|
208
|
-
return watcher;
|
|
209
|
-
}
|
|
210
|
-
//# sourceMappingURL=file-watcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../src/core/file-watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/logger.d.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deferred Logger for MCP STDIO Protocol Compatibility
|
|
3
|
-
*
|
|
4
|
-
* Problem: MCP clients using STDIO transport expect the protocol handshake
|
|
5
|
-
* to complete before any stderr output. Some strict clients (Warp, OpenCode, MCPJam)
|
|
6
|
-
* fail if stderr contains non-JSON-RPC content during initialization.
|
|
7
|
-
*
|
|
8
|
-
* Solution: Buffer all startup messages and flush them AFTER the MCP transport
|
|
9
|
-
* is connected and the client has sent its first message.
|
|
10
|
-
*/
|
|
11
|
-
declare class DeferredLogger {
|
|
12
|
-
private buffer;
|
|
13
|
-
private isReady;
|
|
14
|
-
/**
|
|
15
|
-
* Mark the logger as ready (call after MCP transport is connected and client sent first byte).
|
|
16
|
-
* Flushes all buffered messages to stderr.
|
|
17
|
-
*/
|
|
18
|
-
setReady(): void;
|
|
19
|
-
private flush;
|
|
20
|
-
private writeToStderr;
|
|
21
|
-
/**
|
|
22
|
-
* Intercept all console methods (error, warn, info, log) to ensure
|
|
23
|
-
* they are handled by the deferred logger during startup.
|
|
24
|
-
*/
|
|
25
|
-
intercept(): void;
|
|
26
|
-
private formatMessage;
|
|
27
|
-
private log;
|
|
28
|
-
debug(...args: any[]): void;
|
|
29
|
-
info(...args: any[]): void;
|
|
30
|
-
warn(...args: any[]): void;
|
|
31
|
-
error(...args: any[]): void;
|
|
32
|
-
get isConnected(): boolean;
|
|
33
|
-
}
|
|
34
|
-
export declare const logger: DeferredLogger;
|
|
35
|
-
export {};
|
|
36
|
-
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,cAAM,cAAc;IAChB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAS;IAExB;;;OAGG;IACH,QAAQ,IAAI,IAAI;IAOhB,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,aAAa;IAKrB;;;OAGG;IACH,SAAS,IAAI,IAAI;IAYjB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,GAAG;IAWX,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAO3B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI1B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI1B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAI3B,IAAI,WAAW,IAAI,OAAO,CAEzB;CACJ;AAED,eAAO,MAAM,MAAM,gBAAuB,CAAC"}
|
package/dist/utils/logger.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Deferred Logger for MCP STDIO Protocol Compatibility
|
|
3
|
-
*
|
|
4
|
-
* Problem: MCP clients using STDIO transport expect the protocol handshake
|
|
5
|
-
* to complete before any stderr output. Some strict clients (Warp, OpenCode, MCPJam)
|
|
6
|
-
* fail if stderr contains non-JSON-RPC content during initialization.
|
|
7
|
-
*
|
|
8
|
-
* Solution: Buffer all startup messages and flush them AFTER the MCP transport
|
|
9
|
-
* is connected and the client has sent its first message.
|
|
10
|
-
*/
|
|
11
|
-
class DeferredLogger {
|
|
12
|
-
buffer = [];
|
|
13
|
-
isReady = false;
|
|
14
|
-
/**
|
|
15
|
-
* Mark the logger as ready (call after MCP transport is connected and client sent first byte).
|
|
16
|
-
* Flushes all buffered messages to stderr.
|
|
17
|
-
*/
|
|
18
|
-
setReady() {
|
|
19
|
-
if (this.isReady)
|
|
20
|
-
return;
|
|
21
|
-
this.isReady = true;
|
|
22
|
-
this.info("Logger ready, flushing buffer...");
|
|
23
|
-
this.flush();
|
|
24
|
-
}
|
|
25
|
-
flush() {
|
|
26
|
-
for (const entry of this.buffer) {
|
|
27
|
-
this.writeToStderr(entry);
|
|
28
|
-
}
|
|
29
|
-
this.buffer = [];
|
|
30
|
-
}
|
|
31
|
-
writeToStderr(entry) {
|
|
32
|
-
const prefix = entry.level === 'info' ? '' : `[${entry.level.toUpperCase()}] `;
|
|
33
|
-
process.stderr.write(`${prefix}${entry.message}\n`);
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Intercept all console methods (error, warn, info, log) to ensure
|
|
37
|
-
* they are handled by the deferred logger during startup.
|
|
38
|
-
*/
|
|
39
|
-
intercept() {
|
|
40
|
-
const levels = ['error', 'warn', 'info', 'debug'];
|
|
41
|
-
// Also intercept console.log and map to info
|
|
42
|
-
const originalLog = console.log;
|
|
43
|
-
console.log = (...args) => this.info(...args);
|
|
44
|
-
for (const level of levels) {
|
|
45
|
-
console[level] = (...args) => this[level](...args);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
formatMessage(args) {
|
|
49
|
-
return args.map(arg => {
|
|
50
|
-
if (arg === undefined)
|
|
51
|
-
return 'undefined';
|
|
52
|
-
if (arg === null)
|
|
53
|
-
return 'null';
|
|
54
|
-
if (arg instanceof Error) {
|
|
55
|
-
return arg.stack || arg.message;
|
|
56
|
-
}
|
|
57
|
-
if (typeof arg === 'object') {
|
|
58
|
-
try {
|
|
59
|
-
return JSON.stringify(arg, null, 2);
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
return String(arg);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return String(arg);
|
|
66
|
-
}).join(' ');
|
|
67
|
-
}
|
|
68
|
-
log(level, ...args) {
|
|
69
|
-
const message = this.formatMessage(args);
|
|
70
|
-
const entry = { level, message, timestamp: new Date() };
|
|
71
|
-
if (this.isReady) {
|
|
72
|
-
this.writeToStderr(entry);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
this.buffer.push(entry);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
debug(...args) {
|
|
79
|
-
// Only buffer/log debug messages if the environment variable is set
|
|
80
|
-
if (process.env.CODEBASE_CONTEXT_DEBUG) {
|
|
81
|
-
this.log('debug', ...args);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
info(...args) {
|
|
85
|
-
this.log('info', ...args);
|
|
86
|
-
}
|
|
87
|
-
warn(...args) {
|
|
88
|
-
this.log('warn', ...args);
|
|
89
|
-
}
|
|
90
|
-
error(...args) {
|
|
91
|
-
this.log('error', ...args);
|
|
92
|
-
}
|
|
93
|
-
get isConnected() {
|
|
94
|
-
return this.isReady;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
export const logger = new DeferredLogger();
|
|
98
|
-
// Safety: Always flush on exit or fatal error
|
|
99
|
-
process.on('exit', () => {
|
|
100
|
-
logger.setReady();
|
|
101
|
-
});
|
|
102
|
-
process.on('uncaughtException', (error) => {
|
|
103
|
-
logger.setReady();
|
|
104
|
-
console.error('CRITICAL: Uncaught Exception', error);
|
|
105
|
-
process.exit(1);
|
|
106
|
-
});
|
|
107
|
-
process.on('unhandledRejection', (reason) => {
|
|
108
|
-
logger.setReady();
|
|
109
|
-
console.error('CRITICAL: Unhandled Rejection', reason);
|
|
110
|
-
});
|
|
111
|
-
//# sourceMappingURL=logger.js.map
|
package/dist/utils/logger.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|