@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.
Files changed (98) hide show
  1. package/README.md +261 -0
  2. package/dist/src/index.d.ts +3 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +88 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/mcp/db.d.ts +29 -0
  7. package/dist/src/mcp/db.d.ts.map +1 -0
  8. package/dist/src/mcp/db.js +111 -0
  9. package/dist/src/mcp/db.js.map +1 -0
  10. package/dist/src/mcp/gitignore.d.ts +6 -0
  11. package/dist/src/mcp/gitignore.d.ts.map +1 -0
  12. package/dist/src/mcp/gitignore.js +32 -0
  13. package/dist/src/mcp/gitignore.js.map +1 -0
  14. package/dist/src/mcp/index.d.ts +7 -0
  15. package/dist/src/mcp/index.d.ts.map +1 -0
  16. package/dist/src/mcp/index.js +87 -0
  17. package/dist/src/mcp/index.js.map +1 -0
  18. package/dist/src/mcp/scanner.d.ts +7 -0
  19. package/dist/src/mcp/scanner.d.ts.map +1 -0
  20. package/dist/src/mcp/scanner.js +45 -0
  21. package/dist/src/mcp/scanner.js.map +1 -0
  22. package/dist/src/mcp/tools/get-todo-stats.d.ts +3 -0
  23. package/dist/src/mcp/tools/get-todo-stats.d.ts.map +1 -0
  24. package/dist/src/mcp/tools/get-todo-stats.js +37 -0
  25. package/dist/src/mcp/tools/get-todo-stats.js.map +1 -0
  26. package/dist/src/mcp/tools/list-extensions.d.ts +3 -0
  27. package/dist/src/mcp/tools/list-extensions.d.ts.map +1 -0
  28. package/dist/src/mcp/tools/list-extensions.js +28 -0
  29. package/dist/src/mcp/tools/list-extensions.js.map +1 -0
  30. package/dist/src/mcp/tools/list-todos.d.ts +3 -0
  31. package/dist/src/mcp/tools/list-todos.d.ts.map +1 -0
  32. package/dist/src/mcp/tools/list-todos.js +60 -0
  33. package/dist/src/mcp/tools/list-todos.js.map +1 -0
  34. package/dist/src/mcp/tools/scan-directory.d.ts +3 -0
  35. package/dist/src/mcp/tools/scan-directory.d.ts.map +1 -0
  36. package/dist/src/mcp/tools/scan-directory.js +78 -0
  37. package/dist/src/mcp/tools/scan-directory.js.map +1 -0
  38. package/dist/src/mcp/tools/scan-file.d.ts +3 -0
  39. package/dist/src/mcp/tools/scan-file.d.ts.map +1 -0
  40. package/dist/src/mcp/tools/scan-file.js +63 -0
  41. package/dist/src/mcp/tools/scan-file.js.map +1 -0
  42. package/dist/src/mcp/tools/watch.d.ts +4 -0
  43. package/dist/src/mcp/tools/watch.d.ts.map +1 -0
  44. package/dist/src/mcp/tools/watch.js +110 -0
  45. package/dist/src/mcp/tools/watch.js.map +1 -0
  46. package/dist/src/mcp/types.d.ts +35 -0
  47. package/dist/src/mcp/types.d.ts.map +1 -0
  48. package/dist/src/mcp/types.js +23 -0
  49. package/dist/src/mcp/types.js.map +1 -0
  50. package/dist/src/mcp/watcher.d.ts +7 -0
  51. package/dist/src/mcp/watcher.d.ts.map +1 -0
  52. package/dist/src/mcp/watcher.js +74 -0
  53. package/dist/src/mcp/watcher.js.map +1 -0
  54. package/dist/tests/db.test.d.ts +2 -0
  55. package/dist/tests/db.test.d.ts.map +1 -0
  56. package/dist/tests/db.test.js +339 -0
  57. package/dist/tests/db.test.js.map +1 -0
  58. package/dist/tests/mcp/index.test.d.ts +2 -0
  59. package/dist/tests/mcp/index.test.d.ts.map +1 -0
  60. package/dist/tests/mcp/index.test.js +276 -0
  61. package/dist/tests/mcp/index.test.js.map +1 -0
  62. package/dist/tests/scanner.test.d.ts +2 -0
  63. package/dist/tests/scanner.test.d.ts.map +1 -0
  64. package/dist/tests/scanner.test.js +101 -0
  65. package/dist/tests/scanner.test.js.map +1 -0
  66. package/dist/tests/tools/get-todo-stats.test.d.ts +2 -0
  67. package/dist/tests/tools/get-todo-stats.test.d.ts.map +1 -0
  68. package/dist/tests/tools/get-todo-stats.test.js +256 -0
  69. package/dist/tests/tools/get-todo-stats.test.js.map +1 -0
  70. package/dist/tests/tools/list-extensions.test.d.ts +2 -0
  71. package/dist/tests/tools/list-extensions.test.d.ts.map +1 -0
  72. package/dist/tests/tools/list-extensions.test.js +123 -0
  73. package/dist/tests/tools/list-extensions.test.js.map +1 -0
  74. package/dist/tests/tools/list-todos.test.d.ts +2 -0
  75. package/dist/tests/tools/list-todos.test.d.ts.map +1 -0
  76. package/dist/tests/tools/list-todos.test.js +279 -0
  77. package/dist/tests/tools/list-todos.test.js.map +1 -0
  78. package/dist/tests/tools/scan-directory.test.d.ts +2 -0
  79. package/dist/tests/tools/scan-directory.test.d.ts.map +1 -0
  80. package/dist/tests/tools/scan-directory.test.js +194 -0
  81. package/dist/tests/tools/scan-directory.test.js.map +1 -0
  82. package/dist/tests/tools/scan-file.test.d.ts +2 -0
  83. package/dist/tests/tools/scan-file.test.d.ts.map +1 -0
  84. package/dist/tests/tools/scan-file.test.js +176 -0
  85. package/dist/tests/tools/scan-file.test.js.map +1 -0
  86. package/dist/tests/tools/watch.test.d.ts +2 -0
  87. package/dist/tests/tools/watch.test.d.ts.map +1 -0
  88. package/dist/tests/tools/watch.test.js +286 -0
  89. package/dist/tests/tools/watch.test.js.map +1 -0
  90. package/dist/tests/watcher.test.d.ts +2 -0
  91. package/dist/tests/watcher.test.d.ts.map +1 -0
  92. package/dist/tests/watcher.test.js +372 -0
  93. package/dist/tests/watcher.test.js.map +1 -0
  94. package/dist/vitest.config.d.ts +3 -0
  95. package/dist/vitest.config.d.ts.map +1 -0
  96. package/dist/vitest.config.js +15 -0
  97. package/dist/vitest.config.js.map +1 -0
  98. 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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerGetTodoStats(server: McpServer): void;
3
+ //# sourceMappingURL=get-todo-stats.d.ts.map
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerListExtensions(server: McpServer): void;
3
+ //# sourceMappingURL=list-extensions.d.ts.map
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerListTodos(server: McpServer): void;
3
+ //# sourceMappingURL=list-todos.d.ts.map
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerScanDirectory(server: McpServer): void;
3
+ //# sourceMappingURL=scan-directory.d.ts.map
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerScanFile(server: McpServer): void;
3
+ //# sourceMappingURL=scan-file.d.ts.map
@@ -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"}