@eeymoo/context-todos 0.1.0-alpha.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 +261 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +88 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/db.d.ts +29 -0
- package/dist/src/mcp/db.d.ts.map +1 -0
- package/dist/src/mcp/db.js +111 -0
- package/dist/src/mcp/db.js.map +1 -0
- package/dist/src/mcp/gitignore.d.ts +6 -0
- package/dist/src/mcp/gitignore.d.ts.map +1 -0
- package/dist/src/mcp/gitignore.js +32 -0
- package/dist/src/mcp/gitignore.js.map +1 -0
- package/dist/src/mcp/index.d.ts +7 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +87 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/mcp/scanner.d.ts +7 -0
- package/dist/src/mcp/scanner.d.ts.map +1 -0
- package/dist/src/mcp/scanner.js +45 -0
- package/dist/src/mcp/scanner.js.map +1 -0
- package/dist/src/mcp/tools/get-todo-stats.d.ts +3 -0
- package/dist/src/mcp/tools/get-todo-stats.d.ts.map +1 -0
- package/dist/src/mcp/tools/get-todo-stats.js +37 -0
- package/dist/src/mcp/tools/get-todo-stats.js.map +1 -0
- package/dist/src/mcp/tools/list-extensions.d.ts +3 -0
- package/dist/src/mcp/tools/list-extensions.d.ts.map +1 -0
- package/dist/src/mcp/tools/list-extensions.js +28 -0
- package/dist/src/mcp/tools/list-extensions.js.map +1 -0
- package/dist/src/mcp/tools/list-todos.d.ts +3 -0
- package/dist/src/mcp/tools/list-todos.d.ts.map +1 -0
- package/dist/src/mcp/tools/list-todos.js +60 -0
- package/dist/src/mcp/tools/list-todos.js.map +1 -0
- package/dist/src/mcp/tools/scan-directory.d.ts +3 -0
- package/dist/src/mcp/tools/scan-directory.d.ts.map +1 -0
- package/dist/src/mcp/tools/scan-directory.js +78 -0
- package/dist/src/mcp/tools/scan-directory.js.map +1 -0
- package/dist/src/mcp/tools/scan-file.d.ts +3 -0
- package/dist/src/mcp/tools/scan-file.d.ts.map +1 -0
- package/dist/src/mcp/tools/scan-file.js +63 -0
- package/dist/src/mcp/tools/scan-file.js.map +1 -0
- package/dist/src/mcp/tools/watch.d.ts +4 -0
- package/dist/src/mcp/tools/watch.d.ts.map +1 -0
- package/dist/src/mcp/tools/watch.js +110 -0
- package/dist/src/mcp/tools/watch.js.map +1 -0
- package/dist/src/mcp/types.d.ts +35 -0
- package/dist/src/mcp/types.d.ts.map +1 -0
- package/dist/src/mcp/types.js +23 -0
- package/dist/src/mcp/types.js.map +1 -0
- package/dist/src/mcp/watcher.d.ts +7 -0
- package/dist/src/mcp/watcher.d.ts.map +1 -0
- package/dist/src/mcp/watcher.js +74 -0
- package/dist/src/mcp/watcher.js.map +1 -0
- package/dist/tests/db.test.d.ts +2 -0
- package/dist/tests/db.test.d.ts.map +1 -0
- package/dist/tests/db.test.js +339 -0
- package/dist/tests/db.test.js.map +1 -0
- package/dist/tests/mcp/index.test.d.ts +2 -0
- package/dist/tests/mcp/index.test.d.ts.map +1 -0
- package/dist/tests/mcp/index.test.js +276 -0
- package/dist/tests/mcp/index.test.js.map +1 -0
- package/dist/tests/scanner.test.d.ts +2 -0
- package/dist/tests/scanner.test.d.ts.map +1 -0
- package/dist/tests/scanner.test.js +101 -0
- package/dist/tests/scanner.test.js.map +1 -0
- package/dist/tests/tools/get-todo-stats.test.d.ts +2 -0
- package/dist/tests/tools/get-todo-stats.test.d.ts.map +1 -0
- package/dist/tests/tools/get-todo-stats.test.js +256 -0
- package/dist/tests/tools/get-todo-stats.test.js.map +1 -0
- package/dist/tests/tools/list-extensions.test.d.ts +2 -0
- package/dist/tests/tools/list-extensions.test.d.ts.map +1 -0
- package/dist/tests/tools/list-extensions.test.js +123 -0
- package/dist/tests/tools/list-extensions.test.js.map +1 -0
- package/dist/tests/tools/list-todos.test.d.ts +2 -0
- package/dist/tests/tools/list-todos.test.d.ts.map +1 -0
- package/dist/tests/tools/list-todos.test.js +279 -0
- package/dist/tests/tools/list-todos.test.js.map +1 -0
- package/dist/tests/tools/scan-directory.test.d.ts +2 -0
- package/dist/tests/tools/scan-directory.test.d.ts.map +1 -0
- package/dist/tests/tools/scan-directory.test.js +194 -0
- package/dist/tests/tools/scan-directory.test.js.map +1 -0
- package/dist/tests/tools/scan-file.test.d.ts +2 -0
- package/dist/tests/tools/scan-file.test.d.ts.map +1 -0
- package/dist/tests/tools/scan-file.test.js +176 -0
- package/dist/tests/tools/scan-file.test.js.map +1 -0
- package/dist/tests/tools/watch.test.d.ts +2 -0
- package/dist/tests/tools/watch.test.d.ts.map +1 -0
- package/dist/tests/tools/watch.test.js +286 -0
- package/dist/tests/tools/watch.test.js.map +1 -0
- package/dist/tests/watcher.test.d.ts +2 -0
- package/dist/tests/watcher.test.d.ts.map +1 -0
- package/dist/tests/watcher.test.js +372 -0
- package/dist/tests/watcher.test.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +15 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { isExtensionSupported } from 'leasot';
|
|
2
|
+
import type { TodoItem } from './types.js';
|
|
3
|
+
import type { GitignoreFilter } from './gitignore.js';
|
|
4
|
+
export declare function collectFiles(dir: string, extensions?: string[], gitignoreFilter?: GitignoreFilter | null): string[];
|
|
5
|
+
export declare function scanFile(filePath: string): Promise<TodoItem[]>;
|
|
6
|
+
export { isExtensionSupported };
|
|
7
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/mcp/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,GACvC,MAAM,EAAE,CA4BV;AAED,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAapE;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { parse, isExtensionSupported } from 'leasot';
|
|
2
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
3
|
+
import { resolve, extname, relative } from 'node:path';
|
|
4
|
+
export function collectFiles(dir, extensions, gitignoreFilter) {
|
|
5
|
+
const files = [];
|
|
6
|
+
function walk(current) {
|
|
7
|
+
const entries = readdirSync(current, { withFileTypes: true });
|
|
8
|
+
for (const entry of entries) {
|
|
9
|
+
const fullPath = resolve(current, entry.name);
|
|
10
|
+
if (entry.isDirectory()) {
|
|
11
|
+
const relDir = relative(dir, fullPath);
|
|
12
|
+
if (gitignoreFilter?.ignoresDir(relDir))
|
|
13
|
+
continue;
|
|
14
|
+
walk(fullPath);
|
|
15
|
+
}
|
|
16
|
+
else if (entry.isFile()) {
|
|
17
|
+
const relPath = relative(dir, fullPath);
|
|
18
|
+
if (gitignoreFilter?.ignores(relPath))
|
|
19
|
+
continue;
|
|
20
|
+
const ext = extname(entry.name);
|
|
21
|
+
if (ext && isExtensionSupported(ext)) {
|
|
22
|
+
if (!extensions || extensions.includes(ext)) {
|
|
23
|
+
files.push(fullPath);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
walk(dir);
|
|
30
|
+
return files;
|
|
31
|
+
}
|
|
32
|
+
export async function scanFile(filePath) {
|
|
33
|
+
const ext = extname(filePath);
|
|
34
|
+
if (!ext || !isExtensionSupported(ext)) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const contents = readFileSync(filePath, 'utf8');
|
|
38
|
+
const todos = await parse(contents, {
|
|
39
|
+
extension: ext,
|
|
40
|
+
filename: filePath,
|
|
41
|
+
});
|
|
42
|
+
return todos;
|
|
43
|
+
}
|
|
44
|
+
export { isExtensionSupported };
|
|
45
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/mcp/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAIvD,MAAM,UAAU,YAAY,CAC1B,GAAW,EACX,UAAqB,EACrB,eAAwC;IAExC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,IAAI,CAAC,OAAe;QAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE9C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACvC,IAAI,eAAe,EAAE,UAAU,CAAC,MAAM,CAAC;oBAAE,SAAS;gBAClD,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACxC,IAAI,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC;oBAAE,SAAS;gBAEhD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,IAAI,GAAG,IAAI,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC5C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QAClC,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,QAAQ;KACnB,CAAC,CAAC;IAEH,OAAO,KAAmB,CAAC;AAC7B,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-todo-stats.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/get-todo-stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QA0CrD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { getTodoStats } from '../db.js';
|
|
2
|
+
export function registerGetTodoStats(server) {
|
|
3
|
+
server.registerTool('get-todo-stats', {
|
|
4
|
+
title: 'Get TODO Statistics',
|
|
5
|
+
description: 'Returns aggregated statistics of all persisted TODOs: total count, breakdown by tag, and top files by TODO count.',
|
|
6
|
+
}, async () => {
|
|
7
|
+
try {
|
|
8
|
+
const stats = await getTodoStats();
|
|
9
|
+
if (stats.total === 0) {
|
|
10
|
+
return {
|
|
11
|
+
content: [{ type: 'text', text: 'No TODOs in database.' }],
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const tagLines = stats.byTag
|
|
15
|
+
.map((t) => ` ${t.tag}: ${t.count}`)
|
|
16
|
+
.join('\n');
|
|
17
|
+
const fileLines = stats.byFile
|
|
18
|
+
.map((f) => ` ${f.file}: ${f.count}`)
|
|
19
|
+
.join('\n');
|
|
20
|
+
const text = `Total TODOs: ${stats.total}\n\nBy Tag:\n${tagLines}\n\nTop Files:\n${fileLines}`;
|
|
21
|
+
return {
|
|
22
|
+
content: [{ type: 'text', text }],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
return {
|
|
27
|
+
content: [
|
|
28
|
+
{
|
|
29
|
+
type: 'text',
|
|
30
|
+
text: `Error getting TODO stats: ${err instanceof Error ? err.message : String(err)}`,
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=get-todo-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-todo-stats.js","sourceRoot":"","sources":["../../../../src/mcp/tools/get-todo-stats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EAAE,mHAAmH;KACjI,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;YAEnC,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;iBACpE,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK;iBACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;iBACpC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM;iBAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;iBACrC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,IAAI,GAAG,gBAAgB,KAAK,CAAC,KAAK,gBAAgB,QAAQ,mBAAmB,SAAS,EAAE,CAAC;YAE/F,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;aAC3C,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBACtF;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-extensions.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/list-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAmBvD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { isExtensionSupported } from '../scanner.js';
|
|
2
|
+
const EXTENSION_CANDIDATES = [
|
|
3
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
4
|
+
'.py', '.rb', '.java', '.go', '.rs', '.c', '.cpp', '.h', '.hpp',
|
|
5
|
+
'.cs', '.php', '.swift', '.kt', '.scala', '.sh', '.bash',
|
|
6
|
+
'.css', '.scss', '.less', '.html', '.vue', '.svelte',
|
|
7
|
+
'.yaml', '.yml', '.toml', '.ini', '.cfg',
|
|
8
|
+
'.sql', '.lua', '.r', '.m', '.mm', '.pl', '.pm',
|
|
9
|
+
'.ex', '.exs', '.erl', '.hs', '.elm', '.clj', '.cljs',
|
|
10
|
+
'.tf', '.hcl', '.dockerfile',
|
|
11
|
+
];
|
|
12
|
+
export function registerListExtensions(server) {
|
|
13
|
+
server.registerTool('list-supported-extensions', {
|
|
14
|
+
title: 'List Supported Extensions',
|
|
15
|
+
description: 'Lists all supported file extensions.',
|
|
16
|
+
}, async () => {
|
|
17
|
+
const supported = EXTENSION_CANDIDATES.filter((ext) => isExtensionSupported(ext));
|
|
18
|
+
return {
|
|
19
|
+
content: [
|
|
20
|
+
{
|
|
21
|
+
type: 'text',
|
|
22
|
+
text: `Supported extensions (${supported.length}):\n${supported.join(', ')}`,
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=list-extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-extensions.js","sourceRoot":"","sources":["../../../../src/mcp/tools/list-extensions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,oBAAoB,GAAG;IAC3B,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC5C,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAC/D,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO;IACxD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;IACpD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IACxC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IAC/C,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IACrD,KAAK,EAAE,MAAM,EAAE,aAAa;CAC7B,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EAAE,sCAAsC;KACpD,EACD,KAAK,IAAI,EAAE;QACT,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,yBAAyB,SAAS,CAAC,MAAM,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC7E;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-todos.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/list-todos.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QA2DlD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
import { queryTodos } from '../db.js';
|
|
3
|
+
export function registerListTodos(server) {
|
|
4
|
+
server.registerTool('list-todos', {
|
|
5
|
+
title: 'List TODOs from Database',
|
|
6
|
+
description: 'Query persisted TODOs from the database. Supports filtering by tag and file, ordered by most recently updated.',
|
|
7
|
+
inputSchema: z.object({
|
|
8
|
+
tag: z.string().describe('Filter by tag (e.g. "TODO", "FIXME", "HACK")').optional(),
|
|
9
|
+
file: z.string().describe('Filter by file path (partial match)').optional(),
|
|
10
|
+
limit: z.number().describe('Maximum number of results (default: 100)').optional(),
|
|
11
|
+
offset: z.number().describe('Offset for pagination (default: 0)').optional(),
|
|
12
|
+
}),
|
|
13
|
+
}, async (params) => {
|
|
14
|
+
try {
|
|
15
|
+
const query = {};
|
|
16
|
+
if (params.tag !== undefined)
|
|
17
|
+
query.tag = params.tag;
|
|
18
|
+
if (params.file !== undefined)
|
|
19
|
+
query.file = params.file;
|
|
20
|
+
if (params.limit !== undefined)
|
|
21
|
+
query.limit = params.limit;
|
|
22
|
+
if (params.offset !== undefined)
|
|
23
|
+
query.offset = params.offset;
|
|
24
|
+
const { todos, total } = await queryTodos(query);
|
|
25
|
+
if (todos.length === 0) {
|
|
26
|
+
return {
|
|
27
|
+
content: [{ type: 'text', text: 'No TODOs found in database.' }],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const formatted = todos
|
|
31
|
+
.map((todo) => {
|
|
32
|
+
let line = '[' + todo.tag + '] ' + todo.file + ':' + todo.line + ' - ' + todo.text;
|
|
33
|
+
if (todo.ref) {
|
|
34
|
+
line = line + ' (ref: ' + todo.ref + ')';
|
|
35
|
+
}
|
|
36
|
+
return line;
|
|
37
|
+
})
|
|
38
|
+
.join('\n');
|
|
39
|
+
return {
|
|
40
|
+
content: [
|
|
41
|
+
{
|
|
42
|
+
type: 'text',
|
|
43
|
+
text: `Showing ${todos.length} of ${total} TODO(s):\n\n${formatted}`,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
return {
|
|
50
|
+
content: [
|
|
51
|
+
{
|
|
52
|
+
type: 'text',
|
|
53
|
+
text: `Error querying TODOs: ${err instanceof Error ? err.message : String(err)}`,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=list-todos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-todos.js","sourceRoot":"","sources":["../../../../src/mcp/tools/list-todos.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,gHAAgH;QAC7H,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC,CAAC,QAAQ,EAAE;YACnF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CAAC,QAAQ,EAAE;YAC3E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC,CAAC,QAAQ,EAAE;YACjF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC,QAAQ,EAAE;SAC7E,CAAC;KACH,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,KAAK,GAAqC,EAAE,CAAC;YACnD,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS;gBAAE,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;YACrD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACxD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC3D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;gBAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAE9D,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;YAEjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC;iBAC1E,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,KAAK;iBACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;gBACnF,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;oBACb,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;gBAC3C,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,WAAW,KAAK,CAAC,MAAM,OAAO,KAAK,gBAAgB,SAAS,EAAE;qBACrE;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBAClF;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-directory.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/scan-directory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAkFtD"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
import { resolve, relative } from 'node:path';
|
|
3
|
+
import { statSync } from 'node:fs';
|
|
4
|
+
import { collectFiles, scanFile } from '../scanner.js';
|
|
5
|
+
export function registerScanDirectory(server) {
|
|
6
|
+
server.registerTool('scan-directory', {
|
|
7
|
+
title: 'Scan Directory for TODOs',
|
|
8
|
+
description: 'Recursively scans a directory for TODO/FIXME/HACK/XXX comments across all supported files.',
|
|
9
|
+
inputSchema: z.object({
|
|
10
|
+
path: z
|
|
11
|
+
.string()
|
|
12
|
+
.describe('Directory path (default: current directory)')
|
|
13
|
+
.optional(),
|
|
14
|
+
extensions: z
|
|
15
|
+
.array(z.string())
|
|
16
|
+
.describe('Filter by file extensions, e.g. [".ts", ".js"]. If omitted, scans all supported extensions.')
|
|
17
|
+
.optional(),
|
|
18
|
+
}),
|
|
19
|
+
}, async ({ path: dirPath, extensions }) => {
|
|
20
|
+
try {
|
|
21
|
+
const absDir = resolve(dirPath ?? '.');
|
|
22
|
+
const stat = statSync(absDir);
|
|
23
|
+
if (!stat.isDirectory()) {
|
|
24
|
+
return {
|
|
25
|
+
content: [
|
|
26
|
+
{
|
|
27
|
+
type: 'text',
|
|
28
|
+
text: `Not a directory: ${absDir}`,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const files = collectFiles(absDir, extensions);
|
|
34
|
+
const allTodos = [];
|
|
35
|
+
for (const file of files) {
|
|
36
|
+
const todos = await scanFile(file);
|
|
37
|
+
for (const todo of todos) {
|
|
38
|
+
allTodos.push({ ...todo, file: relative(absDir, file) });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (allTodos.length === 0) {
|
|
42
|
+
return {
|
|
43
|
+
content: [
|
|
44
|
+
{ type: 'text', text: `No TODOs found in ${absDir}` },
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const formatted = allTodos
|
|
49
|
+
.map((item) => {
|
|
50
|
+
let line = '[' + item.tag + '] ' + item.file + ':' + item.line + ' - ' + item.text;
|
|
51
|
+
if (item.ref) {
|
|
52
|
+
line = line + ' (ref: ' + item.ref + ')';
|
|
53
|
+
}
|
|
54
|
+
return line;
|
|
55
|
+
})
|
|
56
|
+
.join('\n');
|
|
57
|
+
return {
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: `Found ${allTodos.length} TODO(s) across ${files.length} file(s) in ${absDir}:\n\n${formatted}`,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
return {
|
|
68
|
+
content: [
|
|
69
|
+
{
|
|
70
|
+
type: 'text',
|
|
71
|
+
text: `Error scanning directory: ${err instanceof Error ? err.message : String(err)}`,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=scan-directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-directory.js","sourceRoot":"","sources":["../../../../src/mcp/tools/scan-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-file.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/scan-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAmEjD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
import { resolve, extname } from 'node:path';
|
|
3
|
+
import { isExtensionSupported, scanFile } from '../scanner.js';
|
|
4
|
+
export function registerScanFile(server) {
|
|
5
|
+
server.registerTool('scan-file', {
|
|
6
|
+
title: 'Scan File for TODOs',
|
|
7
|
+
description: 'Parse a single file and return all TODO/FIXME/HACK/XXX comments found in it.',
|
|
8
|
+
inputSchema: z.object({
|
|
9
|
+
path: z.string().describe('File path (absolute or relative)'),
|
|
10
|
+
}),
|
|
11
|
+
}, async ({ path: filePath }) => {
|
|
12
|
+
try {
|
|
13
|
+
const absPath = resolve(filePath);
|
|
14
|
+
const ext = extname(absPath);
|
|
15
|
+
if (!ext || !isExtensionSupported(ext)) {
|
|
16
|
+
return {
|
|
17
|
+
content: [
|
|
18
|
+
{
|
|
19
|
+
type: 'text',
|
|
20
|
+
text: `Unsupported file extension: ${ext || '(none)'}`,
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const todos = await scanFile(absPath);
|
|
26
|
+
if (todos.length === 0) {
|
|
27
|
+
return {
|
|
28
|
+
content: [
|
|
29
|
+
{ type: 'text', text: `No TODOs found in ${filePath}` },
|
|
30
|
+
],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const formatted = todos
|
|
34
|
+
.map((todo) => {
|
|
35
|
+
let line = '[' + todo.tag + '] ' + todo.file + ':' + todo.line + ' - ' + todo.text;
|
|
36
|
+
if (todo.ref) {
|
|
37
|
+
line = line + ' (ref: ' + todo.ref + ')';
|
|
38
|
+
}
|
|
39
|
+
return line;
|
|
40
|
+
})
|
|
41
|
+
.join('\n');
|
|
42
|
+
return {
|
|
43
|
+
content: [
|
|
44
|
+
{
|
|
45
|
+
type: 'text',
|
|
46
|
+
text: `Found ${todos.length} TODO(s) in ${filePath}:\n\n${formatted}`,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
return {
|
|
53
|
+
content: [
|
|
54
|
+
{
|
|
55
|
+
type: 'text',
|
|
56
|
+
text: `Error scanning file: ${err instanceof Error ? err.message : String(err)}`,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=scan-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-file.js","sourceRoot":"","sources":["../../../../src/mcp/tools/scan-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE/D,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,8EAA8E;QAChF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;SAC9D,CAAC;KACH,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAE7B,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,+BAA+B,GAAG,IAAI,QAAQ,EAAE;yBACvD;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO;oBACL,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,qBAAqB,QAAQ,EAAE,EAAE;qBACjE;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,KAAK;iBACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACZ,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;gBACnF,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;oBACb,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;gBAC3C,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,SAAS,KAAK,CAAC,MAAM,eAAe,QAAQ,QAAQ,SAAS,EAAE;qBACtE;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBACjF;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { GitignoreFilter } from '../gitignore.js';
|
|
3
|
+
export declare function registerWatchTools(server: McpServer, gitignoreFilter?: GitignoreFilter): void;
|
|
4
|
+
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,eAAe,CAAC,EAAE,eAAe,QA+HlC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
import { createWatcher } from '../watcher.js';
|
|
3
|
+
export function registerWatchTools(server, gitignoreFilter) {
|
|
4
|
+
const watcher = createWatcher(gitignoreFilter ? { gitignoreFilter } : undefined);
|
|
5
|
+
server.registerTool('start-watching', {
|
|
6
|
+
title: 'Start Watching for TODO Changes',
|
|
7
|
+
description: 'Start watching a file or directory for changes. When files are added, modified, or deleted, their TODO comments are automatically re-scanned.',
|
|
8
|
+
inputSchema: z.object({
|
|
9
|
+
path: z
|
|
10
|
+
.string()
|
|
11
|
+
.describe('File or directory path to watch (default: current directory)')
|
|
12
|
+
.optional(),
|
|
13
|
+
extensions: z
|
|
14
|
+
.array(z.string())
|
|
15
|
+
.describe('Filter by file extensions, e.g. [".ts", ".js"]. If omitted, watches all supported extensions.')
|
|
16
|
+
.optional(),
|
|
17
|
+
}),
|
|
18
|
+
}, async ({ path, extensions }) => {
|
|
19
|
+
try {
|
|
20
|
+
await watcher.start(path ?? '.', extensions);
|
|
21
|
+
return {
|
|
22
|
+
content: [
|
|
23
|
+
{
|
|
24
|
+
type: 'text',
|
|
25
|
+
text: `Started watching: ${path ?? '.'}`,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
return {
|
|
32
|
+
content: [
|
|
33
|
+
{
|
|
34
|
+
type: 'text',
|
|
35
|
+
text: `Error starting watcher: ${err instanceof Error ? err.message : String(err)}`,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
server.registerTool('stop-watching', {
|
|
42
|
+
title: 'Stop Watching',
|
|
43
|
+
description: 'Stop the active file watcher.',
|
|
44
|
+
}, async () => {
|
|
45
|
+
if (!watcher.watching) {
|
|
46
|
+
return {
|
|
47
|
+
content: [
|
|
48
|
+
{ type: 'text', text: 'No active watcher to stop.' },
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
await watcher.stop();
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{ type: 'text', text: 'Watcher stopped.' },
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
server.registerTool('get-watched-changes', {
|
|
60
|
+
title: 'Get Watched File Changes',
|
|
61
|
+
description: 'Retrieve TODO changes detected by the watcher since a given timestamp. Returns file change events with their updated TODO lists.',
|
|
62
|
+
inputSchema: z.object({
|
|
63
|
+
since: z
|
|
64
|
+
.number()
|
|
65
|
+
.describe('Unix timestamp (ms). Only return changes after this time. If omitted, returns all buffered changes.')
|
|
66
|
+
.optional(),
|
|
67
|
+
clear: z
|
|
68
|
+
.boolean()
|
|
69
|
+
.describe('Clear the change buffer after reading (default: false)')
|
|
70
|
+
.optional(),
|
|
71
|
+
}),
|
|
72
|
+
}, async ({ since, clear }) => {
|
|
73
|
+
if (!watcher.watching) {
|
|
74
|
+
return {
|
|
75
|
+
content: [
|
|
76
|
+
{ type: 'text', text: 'No active watcher. Call start-watching first.' },
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const changes = watcher.getChanges(since);
|
|
81
|
+
if (clear) {
|
|
82
|
+
watcher.clearChanges();
|
|
83
|
+
}
|
|
84
|
+
if (changes.length === 0) {
|
|
85
|
+
return {
|
|
86
|
+
content: [
|
|
87
|
+
{ type: 'text', text: 'No changes detected.' },
|
|
88
|
+
],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const formatted = changes
|
|
92
|
+
.map((c) => {
|
|
93
|
+
const todoCount = c.todos.length;
|
|
94
|
+
const todoPart = todoCount > 0
|
|
95
|
+
? ' (' + todoCount + ' TODO' + (todoCount > 1 ? 's' : '') + ')'
|
|
96
|
+
: '';
|
|
97
|
+
return '[' + c.type.toUpperCase() + '] ' + c.path + todoPart;
|
|
98
|
+
})
|
|
99
|
+
.join('\n');
|
|
100
|
+
return {
|
|
101
|
+
content: [
|
|
102
|
+
{
|
|
103
|
+
type: 'text',
|
|
104
|
+
text: `${changes.length} change(s) detected:\n\n${formatted}`,
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../../src/mcp/tools/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface TodoItem {
|
|
2
|
+
file: string;
|
|
3
|
+
tag: string;
|
|
4
|
+
line: number;
|
|
5
|
+
ref: string;
|
|
6
|
+
text: string;
|
|
7
|
+
}
|
|
8
|
+
export interface FileChangeEvent {
|
|
9
|
+
type: 'add' | 'change' | 'unlink';
|
|
10
|
+
path: string;
|
|
11
|
+
todos: TodoItem[];
|
|
12
|
+
timestamp: number;
|
|
13
|
+
}
|
|
14
|
+
export interface TodoWatcher {
|
|
15
|
+
readonly watching: boolean;
|
|
16
|
+
start(path: string, extensions?: string[]): Promise<void>;
|
|
17
|
+
stop(): Promise<void>;
|
|
18
|
+
getChanges(since?: number): FileChangeEvent[];
|
|
19
|
+
clearChanges(): void;
|
|
20
|
+
}
|
|
21
|
+
export type ServerMode = 'standard' | 'max' | 'labs-standard' | 'labs-max';
|
|
22
|
+
export interface ModeConfig {
|
|
23
|
+
enableWatcher: boolean;
|
|
24
|
+
enableDatabase: boolean;
|
|
25
|
+
enableGetTodoStats: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare const modeConfigs: Record<ServerMode, ModeConfig>;
|
|
28
|
+
export interface ServerOptions {
|
|
29
|
+
mode: ServerMode;
|
|
30
|
+
watchPath?: string;
|
|
31
|
+
extensions?: string[];
|
|
32
|
+
useGitignore?: boolean;
|
|
33
|
+
gitignorePath?: string;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/mcp/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE,CAAC;IAC9C,YAAY,IAAI,IAAI,CAAC;CACtB;AACD,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,KAAK,GAAG,eAAe,GAAG,UAAU,CAAC;AAC3E,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AACD,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAqBtD,CAAC;AACF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const modeConfigs = {
|
|
2
|
+
standard: {
|
|
3
|
+
enableWatcher: false,
|
|
4
|
+
enableDatabase: false,
|
|
5
|
+
enableGetTodoStats: false,
|
|
6
|
+
},
|
|
7
|
+
max: {
|
|
8
|
+
enableWatcher: true,
|
|
9
|
+
enableDatabase: true,
|
|
10
|
+
enableGetTodoStats: false,
|
|
11
|
+
},
|
|
12
|
+
'labs-standard': {
|
|
13
|
+
enableWatcher: false,
|
|
14
|
+
enableDatabase: false,
|
|
15
|
+
enableGetTodoStats: false,
|
|
16
|
+
},
|
|
17
|
+
'labs-max': {
|
|
18
|
+
enableWatcher: true,
|
|
19
|
+
enableDatabase: true,
|
|
20
|
+
enableGetTodoStats: true,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mcp/types.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAC,MAAM,WAAW,GAAmC;IACzD,QAAQ,EAAE;QACR,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,KAAK;QACrB,kBAAkB,EAAE,KAAK;KAC1B;IACD,GAAG,EAAE;QACH,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,IAAI;QACpB,kBAAkB,EAAE,KAAK;KAC1B;IACD,eAAe,EAAE;QACf,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,KAAK;QACrB,kBAAkB,EAAE,KAAK;KAC1B;IACD,UAAU,EAAE;QACV,aAAa,EAAE,IAAI;QACnB,cAAc,EAAE,IAAI;QACpB,kBAAkB,EAAE,IAAI;KACzB;CACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TodoWatcher } from './types.js';
|
|
2
|
+
import type { GitignoreFilter } from './gitignore.js';
|
|
3
|
+
export declare function createWatcher(options?: {
|
|
4
|
+
maxChanges?: number;
|
|
5
|
+
gitignoreFilter?: GitignoreFilter;
|
|
6
|
+
}): TodoWatcher;
|
|
7
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../../src/mcp/watcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA6B,WAAW,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,GAAG,WAAW,CA4Ed"}
|