codetree-claude 1.0.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 (108) hide show
  1. package/.codetreerc.default.json +41 -0
  2. package/README.md +171 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +185 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +131 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +111 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/hook/hook-client.d.ts +6 -0
  12. package/dist/hook/hook-client.d.ts.map +1 -0
  13. package/dist/hook/hook-client.js +48 -0
  14. package/dist/hook/hook-client.js.map +1 -0
  15. package/dist/hook/pre-tool-use.bundled.js +162 -0
  16. package/dist/hook/pre-tool-use.d.ts +14 -0
  17. package/dist/hook/pre-tool-use.d.ts.map +1 -0
  18. package/dist/hook/pre-tool-use.js +140 -0
  19. package/dist/hook/pre-tool-use.js.map +1 -0
  20. package/dist/index.d.ts +10 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +12 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/indexer/extractor-registry.d.ts +10 -0
  25. package/dist/indexer/extractor-registry.d.ts.map +1 -0
  26. package/dist/indexer/extractor-registry.js +39 -0
  27. package/dist/indexer/extractor-registry.js.map +1 -0
  28. package/dist/indexer/extractors/generic.d.ts +11 -0
  29. package/dist/indexer/extractors/generic.d.ts.map +1 -0
  30. package/dist/indexer/extractors/generic.js +12 -0
  31. package/dist/indexer/extractors/generic.js.map +1 -0
  32. package/dist/indexer/extractors/go.d.ts +10 -0
  33. package/dist/indexer/extractors/go.d.ts.map +1 -0
  34. package/dist/indexer/extractors/go.js +119 -0
  35. package/dist/indexer/extractors/go.js.map +1 -0
  36. package/dist/indexer/extractors/java.d.ts +10 -0
  37. package/dist/indexer/extractors/java.d.ts.map +1 -0
  38. package/dist/indexer/extractors/java.js +89 -0
  39. package/dist/indexer/extractors/java.js.map +1 -0
  40. package/dist/indexer/extractors/javascript.d.ts +11 -0
  41. package/dist/indexer/extractors/javascript.d.ts.map +1 -0
  42. package/dist/indexer/extractors/javascript.js +190 -0
  43. package/dist/indexer/extractors/javascript.js.map +1 -0
  44. package/dist/indexer/extractors/python.d.ts +11 -0
  45. package/dist/indexer/extractors/python.d.ts.map +1 -0
  46. package/dist/indexer/extractors/python.js +115 -0
  47. package/dist/indexer/extractors/python.js.map +1 -0
  48. package/dist/indexer/extractors/types.d.ts +26 -0
  49. package/dist/indexer/extractors/types.d.ts.map +1 -0
  50. package/dist/indexer/extractors/types.js +36 -0
  51. package/dist/indexer/extractors/types.js.map +1 -0
  52. package/dist/indexer/hasher.d.ts +11 -0
  53. package/dist/indexer/hasher.d.ts.map +1 -0
  54. package/dist/indexer/hasher.js +41 -0
  55. package/dist/indexer/hasher.js.map +1 -0
  56. package/dist/indexer/ignore.d.ts +15 -0
  57. package/dist/indexer/ignore.d.ts.map +1 -0
  58. package/dist/indexer/ignore.js +63 -0
  59. package/dist/indexer/ignore.js.map +1 -0
  60. package/dist/indexer/indexer.d.ts +64 -0
  61. package/dist/indexer/indexer.d.ts.map +1 -0
  62. package/dist/indexer/indexer.js +295 -0
  63. package/dist/indexer/indexer.js.map +1 -0
  64. package/dist/indexer/watcher.d.ts +16 -0
  65. package/dist/indexer/watcher.d.ts.map +1 -0
  66. package/dist/indexer/watcher.js +79 -0
  67. package/dist/indexer/watcher.js.map +1 -0
  68. package/dist/server/ipc.d.ts +38 -0
  69. package/dist/server/ipc.d.ts.map +1 -0
  70. package/dist/server/ipc.js +212 -0
  71. package/dist/server/ipc.js.map +1 -0
  72. package/dist/server/mcp-server.d.ts +2 -0
  73. package/dist/server/mcp-server.d.ts.map +1 -0
  74. package/dist/server/mcp-server.js +133 -0
  75. package/dist/server/mcp-server.js.map +1 -0
  76. package/dist/server/tools/codetree-find-refs.d.ts +46 -0
  77. package/dist/server/tools/codetree-find-refs.d.ts.map +1 -0
  78. package/dist/server/tools/codetree-find-refs.js +83 -0
  79. package/dist/server/tools/codetree-find-refs.js.map +1 -0
  80. package/dist/server/tools/codetree-read.d.ts +46 -0
  81. package/dist/server/tools/codetree-read.d.ts.map +1 -0
  82. package/dist/server/tools/codetree-read.js +82 -0
  83. package/dist/server/tools/codetree-read.js.map +1 -0
  84. package/dist/server/tools/codetree-search.d.ts +59 -0
  85. package/dist/server/tools/codetree-search.d.ts.map +1 -0
  86. package/dist/server/tools/codetree-search.js +92 -0
  87. package/dist/server/tools/codetree-search.js.map +1 -0
  88. package/dist/server/tools/codetree-structure.d.ts +55 -0
  89. package/dist/server/tools/codetree-structure.d.ts.map +1 -0
  90. package/dist/server/tools/codetree-structure.js +137 -0
  91. package/dist/server/tools/codetree-structure.js.map +1 -0
  92. package/dist/server/tools/codetree-summary.d.ts +36 -0
  93. package/dist/server/tools/codetree-summary.d.ts.map +1 -0
  94. package/dist/server/tools/codetree-summary.js +94 -0
  95. package/dist/server/tools/codetree-summary.js.map +1 -0
  96. package/dist/setup/install.d.ts +26 -0
  97. package/dist/setup/install.d.ts.map +1 -0
  98. package/dist/setup/install.js +127 -0
  99. package/dist/setup/install.js.map +1 -0
  100. package/dist/storage/cache.d.ts +29 -0
  101. package/dist/storage/cache.d.ts.map +1 -0
  102. package/dist/storage/cache.js +54 -0
  103. package/dist/storage/cache.js.map +1 -0
  104. package/dist/storage/database.d.ts +52 -0
  105. package/dist/storage/database.d.ts.map +1 -0
  106. package/dist/storage/database.js +346 -0
  107. package/dist/storage/database.js.map +1 -0
  108. package/package.json +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-client.d.ts","sourceRoot":"","sources":["../../src/hook/hook-client.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,SAAK,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CA8CzC"}
@@ -0,0 +1,48 @@
1
+ import { request } from "node:http";
2
+ /**
3
+ * Fast HTTP client for hook -> IPC server communication.
4
+ * Must resolve in <30ms to keep total hook latency under 50ms.
5
+ */
6
+ export function queryIpc(port, path, timeoutMs = 30) {
7
+ return new Promise((resolve) => {
8
+ const timer = setTimeout(() => {
9
+ resolve(null);
10
+ }, timeoutMs);
11
+ try {
12
+ const req = request({
13
+ hostname: "127.0.0.1",
14
+ port,
15
+ path,
16
+ method: "GET",
17
+ timeout: timeoutMs,
18
+ }, (res) => {
19
+ let data = "";
20
+ res.on("data", (chunk) => { data += chunk; });
21
+ res.on("end", () => {
22
+ clearTimeout(timer);
23
+ try {
24
+ resolve(JSON.parse(data));
25
+ }
26
+ catch {
27
+ resolve(null);
28
+ }
29
+ });
30
+ });
31
+ req.on("error", () => {
32
+ clearTimeout(timer);
33
+ resolve(null);
34
+ });
35
+ req.on("timeout", () => {
36
+ req.destroy();
37
+ clearTimeout(timer);
38
+ resolve(null);
39
+ });
40
+ req.end();
41
+ }
42
+ catch {
43
+ clearTimeout(timer);
44
+ resolve(null);
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=hook-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-client.js","sourceRoot":"","sources":["../../src/hook/hook-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,IAAY,EACZ,IAAY,EACZ,SAAS,GAAG,EAAE;IAEd,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,OAAO,CACjB;gBACE,QAAQ,EAAE,WAAW;gBACrB,IAAI;gBACJ,IAAI;gBACJ,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,SAAS;aACnB,EACD,CAAC,GAAG,EAAE,EAAE;gBACN,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;oBACjB,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,IAAI,CAAC;wBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC5B,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,CAAC,IAAI,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CACF,CAAC;YAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACrB,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env node
2
+ #!/usr/bin/env node
3
+
4
+ // dist/hook/pre-tool-use.js
5
+ import { readFileSync, existsSync } from "node:fs";
6
+ import { join, dirname } from "node:path";
7
+
8
+ // dist/hook/hook-client.js
9
+ import { request } from "node:http";
10
+ function queryIpc(port, path, timeoutMs = 30) {
11
+ return new Promise((resolve) => {
12
+ const timer = setTimeout(() => {
13
+ resolve(null);
14
+ }, timeoutMs);
15
+ try {
16
+ const req = request({
17
+ hostname: "127.0.0.1",
18
+ port,
19
+ path,
20
+ method: "GET",
21
+ timeout: timeoutMs
22
+ }, (res) => {
23
+ let data = "";
24
+ res.on("data", (chunk) => {
25
+ data += chunk;
26
+ });
27
+ res.on("end", () => {
28
+ clearTimeout(timer);
29
+ try {
30
+ resolve(JSON.parse(data));
31
+ } catch {
32
+ resolve(null);
33
+ }
34
+ });
35
+ });
36
+ req.on("error", () => {
37
+ clearTimeout(timer);
38
+ resolve(null);
39
+ });
40
+ req.on("timeout", () => {
41
+ req.destroy();
42
+ clearTimeout(timer);
43
+ resolve(null);
44
+ });
45
+ req.end();
46
+ } catch {
47
+ clearTimeout(timer);
48
+ resolve(null);
49
+ }
50
+ });
51
+ }
52
+
53
+ // dist/hook/pre-tool-use.js
54
+ async function main() {
55
+ let rawInput = "";
56
+ for await (const chunk of process.stdin) {
57
+ rawInput += chunk;
58
+ }
59
+ let input;
60
+ try {
61
+ input = JSON.parse(rawInput);
62
+ } catch {
63
+ process.exit(0);
64
+ }
65
+ const { tool_name, tool_input, cwd } = input;
66
+ const port = findIpcPort(cwd);
67
+ if (!port) {
68
+ process.exit(0);
69
+ }
70
+ switch (tool_name) {
71
+ case "Read":
72
+ await handleRead(port, tool_input);
73
+ break;
74
+ case "Grep":
75
+ await handleGrep(port, tool_input);
76
+ break;
77
+ case "Glob":
78
+ await handleGlob(port, tool_input);
79
+ break;
80
+ default:
81
+ process.exit(0);
82
+ }
83
+ }
84
+ async function handleRead(port, input) {
85
+ const filePath = input.file_path;
86
+ if (!filePath) {
87
+ process.exit(0);
88
+ return;
89
+ }
90
+ const result = await queryIpc(port, `/check?path=${encodeURIComponent(filePath)}`);
91
+ if (result?.cached) {
92
+ const relPath = result.path;
93
+ const lineCount = result.lineCount;
94
+ const size = result.size;
95
+ process.stderr.write(`File "${relPath}" is cached in CodeTree (${lineCount} lines, ${formatSize(size)}). Call the codetree_read tool with file_path="${relPath}" to read it. This saves tokens by using the cached version.`);
96
+ process.exit(2);
97
+ }
98
+ process.exit(0);
99
+ }
100
+ async function handleGrep(port, input) {
101
+ const pattern = input.pattern;
102
+ const searchPath = input.path;
103
+ if (!pattern) {
104
+ process.exit(0);
105
+ return;
106
+ }
107
+ const params = new URLSearchParams();
108
+ params.set("pattern", pattern);
109
+ if (searchPath)
110
+ params.set("path", searchPath);
111
+ const result = await queryIpc(port, `/check-search?${params.toString()}`);
112
+ if (result?.cached) {
113
+ const hint = result.hint;
114
+ process.stderr.write(`${hint} Call the codetree_search tool with query="${pattern}" for indexed results. Set content_search=true if you need line-level matches.`);
115
+ process.exit(2);
116
+ }
117
+ process.exit(0);
118
+ }
119
+ async function handleGlob(port, input) {
120
+ const pattern = input.pattern;
121
+ if (!pattern) {
122
+ process.exit(0);
123
+ return;
124
+ }
125
+ const result = await queryIpc(port, `/check-glob?pattern=${encodeURIComponent(pattern)}`);
126
+ if (result?.cached) {
127
+ const hint = result.hint;
128
+ process.stderr.write(`${hint} Call the codetree_structure tool to browse the project tree. Use the pattern parameter to filter files.`);
129
+ process.exit(2);
130
+ }
131
+ process.exit(0);
132
+ }
133
+ function findIpcPort(startDir) {
134
+ let dir = startDir;
135
+ for (let i = 0; i < 10; i++) {
136
+ const portFile = join(dir, ".codetree", "ipc.port");
137
+ if (existsSync(portFile)) {
138
+ try {
139
+ const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
140
+ if (port > 0 && port <= 65535)
141
+ return port;
142
+ } catch {
143
+ return null;
144
+ }
145
+ }
146
+ const parent = dirname(dir);
147
+ if (parent === dir)
148
+ break;
149
+ dir = parent;
150
+ }
151
+ return null;
152
+ }
153
+ function formatSize(bytes) {
154
+ if (bytes < 1024)
155
+ return `${bytes}B`;
156
+ if (bytes < 1024 * 1024)
157
+ return `${(bytes / 1024).toFixed(1)}KB`;
158
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
159
+ }
160
+ main().catch(() => {
161
+ process.exit(0);
162
+ });
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree PreToolUse Hook
4
+ *
5
+ * This script is invoked by Claude Code before every Read, Grep, and Glob call.
6
+ * It checks the CodeTree IPC server to see if the request can be served from cache.
7
+ *
8
+ * If cached → exits with code 2 (deny) and provides a redirect message via stderr.
9
+ * If not cached → exits with code 0 (allow) to let the native tool proceed.
10
+ *
11
+ * CRITICAL: This must complete in <50ms. Any failure = exit 0 (fall through).
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=pre-tool-use.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-tool-use.d.ts","sourceRoot":"","sources":["../../src/hook/pre-tool-use.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree PreToolUse Hook
4
+ *
5
+ * This script is invoked by Claude Code before every Read, Grep, and Glob call.
6
+ * It checks the CodeTree IPC server to see if the request can be served from cache.
7
+ *
8
+ * If cached → exits with code 2 (deny) and provides a redirect message via stderr.
9
+ * If not cached → exits with code 0 (allow) to let the native tool proceed.
10
+ *
11
+ * CRITICAL: This must complete in <50ms. Any failure = exit 0 (fall through).
12
+ */
13
+ import { readFileSync, existsSync } from "node:fs";
14
+ import { join, dirname } from "node:path";
15
+ import { queryIpc } from "./hook-client.js";
16
+ async function main() {
17
+ // Read stdin (hook input)
18
+ let rawInput = "";
19
+ for await (const chunk of process.stdin) {
20
+ rawInput += chunk;
21
+ }
22
+ let input;
23
+ try {
24
+ input = JSON.parse(rawInput);
25
+ }
26
+ catch {
27
+ process.exit(0); // Can't parse → allow
28
+ }
29
+ const { tool_name, tool_input, cwd } = input;
30
+ // Find the IPC port file
31
+ const port = findIpcPort(cwd);
32
+ if (!port) {
33
+ process.exit(0); // No server running → allow
34
+ }
35
+ // Route based on tool
36
+ switch (tool_name) {
37
+ case "Read":
38
+ await handleRead(port, tool_input);
39
+ break;
40
+ case "Grep":
41
+ await handleGrep(port, tool_input);
42
+ break;
43
+ case "Glob":
44
+ await handleGlob(port, tool_input);
45
+ break;
46
+ default:
47
+ process.exit(0); // Unknown tool → allow
48
+ }
49
+ }
50
+ async function handleRead(port, input) {
51
+ const filePath = input.file_path;
52
+ if (!filePath) {
53
+ process.exit(0);
54
+ return;
55
+ }
56
+ const result = await queryIpc(port, `/check?path=${encodeURIComponent(filePath)}`);
57
+ if (result?.cached) {
58
+ const relPath = result.path;
59
+ const lineCount = result.lineCount;
60
+ const size = result.size;
61
+ // Deny with redirect to codetree_read
62
+ process.stderr.write(`File "${relPath}" is cached in CodeTree (${lineCount} lines, ${formatSize(size)}). ` +
63
+ `Call the codetree_read tool with file_path="${relPath}" to read it. ` +
64
+ `This saves tokens by using the cached version.`);
65
+ process.exit(2);
66
+ }
67
+ process.exit(0); // Cache miss → allow native Read
68
+ }
69
+ async function handleGrep(port, input) {
70
+ const pattern = input.pattern;
71
+ const searchPath = input.path;
72
+ if (!pattern) {
73
+ process.exit(0);
74
+ return;
75
+ }
76
+ const params = new URLSearchParams();
77
+ params.set("pattern", pattern);
78
+ if (searchPath)
79
+ params.set("path", searchPath);
80
+ const result = await queryIpc(port, `/check-search?${params.toString()}`);
81
+ if (result?.cached) {
82
+ const hint = result.hint;
83
+ process.stderr.write(`${hint} Call the codetree_search tool with query="${pattern}" for indexed results. ` +
84
+ `Set content_search=true if you need line-level matches.`);
85
+ process.exit(2);
86
+ }
87
+ process.exit(0); // Can't answer from index → allow native Grep
88
+ }
89
+ async function handleGlob(port, input) {
90
+ const pattern = input.pattern;
91
+ if (!pattern) {
92
+ process.exit(0);
93
+ return;
94
+ }
95
+ const result = await queryIpc(port, `/check-glob?pattern=${encodeURIComponent(pattern)}`);
96
+ if (result?.cached) {
97
+ const hint = result.hint;
98
+ process.stderr.write(`${hint} Call the codetree_structure tool to browse the project tree. ` +
99
+ `Use the pattern parameter to filter files.`);
100
+ process.exit(2);
101
+ }
102
+ process.exit(0); // Index not ready → allow native Glob
103
+ }
104
+ /**
105
+ * Find the IPC port by looking for .codetree/ipc.port file.
106
+ * Walks up from cwd to find the project root.
107
+ */
108
+ function findIpcPort(startDir) {
109
+ let dir = startDir;
110
+ for (let i = 0; i < 10; i++) {
111
+ const portFile = join(dir, ".codetree", "ipc.port");
112
+ if (existsSync(portFile)) {
113
+ try {
114
+ const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
115
+ if (port > 0 && port <= 65535)
116
+ return port;
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ const parent = dirname(dir);
123
+ if (parent === dir)
124
+ break;
125
+ dir = parent;
126
+ }
127
+ return null;
128
+ }
129
+ function formatSize(bytes) {
130
+ if (bytes < 1024)
131
+ return `${bytes}B`;
132
+ if (bytes < 1024 * 1024)
133
+ return `${(bytes / 1024).toFixed(1)}KB`;
134
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
135
+ }
136
+ // Run
137
+ main().catch(() => {
138
+ process.exit(0); // Any unhandled error → allow
139
+ });
140
+ //# sourceMappingURL=pre-tool-use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../src/hook/pre-tool-use.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { loadConfig, findProjectRoot, type CodeTreeConfig } from "./config.js";
2
+ export { Database, type FileRecord, type SymbolRecord, type DependencyRecord } from "./storage/database.js";
3
+ export { ContentCache, type CacheEntry } from "./storage/cache.js";
4
+ export { Indexer, type IndexStats } from "./indexer/indexer.js";
5
+ export { FileWatcher } from "./indexer/watcher.js";
6
+ export { IpcServer } from "./server/ipc.js";
7
+ export { ExtractorRegistry } from "./indexer/extractor-registry.js";
8
+ export { detectLanguage } from "./indexer/extractors/types.js";
9
+ export { installHook, installMcpServer, createDefaultConfig, updateGitignore, } from "./setup/install.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ // CodeTree — Codebase Cache for Claude Code
2
+ // Main entry point for programmatic usage
3
+ export { loadConfig, findProjectRoot } from "./config.js";
4
+ export { Database } from "./storage/database.js";
5
+ export { ContentCache } from "./storage/cache.js";
6
+ export { Indexer } from "./indexer/indexer.js";
7
+ export { FileWatcher } from "./indexer/watcher.js";
8
+ export { IpcServer } from "./server/ipc.js";
9
+ export { ExtractorRegistry } from "./indexer/extractor-registry.js";
10
+ export { detectLanguage } from "./indexer/extractors/types.js";
11
+ export { installHook, installMcpServer, createDefaultConfig, updateGitignore, } from "./setup/install.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,0CAA0C;AAE1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAA6D,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAmB,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,GAChB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ExtractionResult } from "./extractors/types.js";
2
+ export declare class ExtractorRegistry {
3
+ private extractors;
4
+ private generic;
5
+ constructor();
6
+ private register;
7
+ extract(content: string, filePath: string): ExtractionResult;
8
+ getLanguage(filePath: string): string | null;
9
+ }
10
+ //# sourceMappingURL=extractor-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor-registry.d.ts","sourceRoot":"","sources":["../../src/indexer/extractor-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAU/E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,OAAO,CAA0B;;IASzC,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAa5D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAG7C"}
@@ -0,0 +1,39 @@
1
+ import { JavaScriptExtractor } from "./extractors/javascript.js";
2
+ import { PythonExtractor } from "./extractors/python.js";
3
+ import { JavaExtractor } from "./extractors/java.js";
4
+ import { GoExtractor } from "./extractors/go.js";
5
+ import { GenericExtractor } from "./extractors/generic.js";
6
+ import { detectLanguage } from "./extractors/types.js";
7
+ const EMPTY_RESULT = { symbols: [], dependencies: [] };
8
+ export class ExtractorRegistry {
9
+ extractors = new Map();
10
+ generic = new GenericExtractor();
11
+ constructor() {
12
+ this.register(new JavaScriptExtractor());
13
+ this.register(new PythonExtractor());
14
+ this.register(new JavaExtractor());
15
+ this.register(new GoExtractor());
16
+ }
17
+ register(extractor) {
18
+ for (const lang of extractor.languages) {
19
+ this.extractors.set(lang, extractor);
20
+ }
21
+ }
22
+ extract(content, filePath) {
23
+ const language = detectLanguage(filePath);
24
+ if (!language)
25
+ return EMPTY_RESULT;
26
+ const extractor = this.extractors.get(language) || this.generic;
27
+ try {
28
+ return extractor.extract(content, filePath);
29
+ }
30
+ catch {
31
+ // If extraction fails, return empty rather than crash
32
+ return EMPTY_RESULT;
33
+ }
34
+ }
35
+ getLanguage(filePath) {
36
+ return detectLanguage(filePath);
37
+ }
38
+ }
39
+ //# sourceMappingURL=extractor-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor-registry.js","sourceRoot":"","sources":["../../src/indexer/extractor-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,YAAY,GAAqB,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;AAEzE,MAAM,OAAO,iBAAiB;IACpB,UAAU,GAAiC,IAAI,GAAG,EAAE,CAAC;IACrD,OAAO,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAEzC;QACE,IAAI,CAAC,QAAQ,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;IACnC,CAAC;IAEO,QAAQ,CAAC,SAA0B;QACzC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,QAAgB;QACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ;YAAE,OAAO,YAAY,CAAC;QAEnC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC;QAChE,IAAI,CAAC;YACH,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;YACtD,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,WAAW,CAAC,QAAgB;QAC1B,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import type { SymbolExtractor, ExtractionResult } from "./types.js";
2
+ /**
3
+ * Generic fallback extractor — only counts lines, no symbol extraction.
4
+ * Used for languages without a dedicated extractor.
5
+ */
6
+ export declare class GenericExtractor implements SymbolExtractor {
7
+ languages: string[];
8
+ extensions: string[];
9
+ extract(_content: string, _filePath: string): ExtractionResult;
10
+ }
11
+ //# sourceMappingURL=generic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../../src/indexer/extractors/generic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,eAAe;IACtD,SAAS,WAAS;IAClB,UAAU,WAAS;IAEnB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB;CAG/D"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Generic fallback extractor — only counts lines, no symbol extraction.
3
+ * Used for languages without a dedicated extractor.
4
+ */
5
+ export class GenericExtractor {
6
+ languages = ["*"];
7
+ extensions = ["*"];
8
+ extract(_content, _filePath) {
9
+ return { symbols: [], dependencies: [] };
10
+ }
11
+ }
12
+ //# sourceMappingURL=generic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.js","sourceRoot":"","sources":["../../../src/indexer/extractors/generic.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAC3B,SAAS,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;IAEnB,OAAO,CAAC,QAAgB,EAAE,SAAiB;QACzC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { SymbolExtractor, ExtractionResult } from "./types.js";
2
+ /**
3
+ * Regex-based symbol extractor for Go.
4
+ */
5
+ export declare class GoExtractor implements SymbolExtractor {
6
+ languages: string[];
7
+ extensions: string[];
8
+ extract(content: string, _filePath: string): ExtractionResult;
9
+ }
10
+ //# sourceMappingURL=go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../../src/indexer/extractors/go.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAwC,MAAM,YAAY,CAAC;AAE1G;;GAEG;AACH,qBAAa,WAAY,YAAW,eAAe;IACjD,SAAS,WAAU;IACnB,UAAU,WAAW;IAErB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB;CAqG9D"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Regex-based symbol extractor for Go.
3
+ */
4
+ export class GoExtractor {
5
+ languages = ["go"];
6
+ extensions = [".go"];
7
+ extract(content, _filePath) {
8
+ const lines = content.split("\n");
9
+ const symbols = [];
10
+ const dependencies = [];
11
+ let inImportBlock = false;
12
+ for (let i = 0; i < lines.length; i++) {
13
+ const line = lines[i];
14
+ const lineNum = i + 1;
15
+ const trimmed = line.trim();
16
+ if (trimmed.startsWith("//") || trimmed === "")
17
+ continue;
18
+ // ─── Import block ───
19
+ if (trimmed === "import (") {
20
+ inImportBlock = true;
21
+ continue;
22
+ }
23
+ if (inImportBlock) {
24
+ if (trimmed === ")") {
25
+ inImportBlock = false;
26
+ continue;
27
+ }
28
+ const spec = trimmed.replace(/^[\w.]+\s+/, "").replace(/["'`]/g, "").trim();
29
+ if (spec) {
30
+ dependencies.push({ specifier: spec, isRelative: spec.startsWith(".") });
31
+ }
32
+ continue;
33
+ }
34
+ // Single import
35
+ const importMatch = trimmed.match(/^import\s+(?:\w+\s+)?["'`]([^"'`]+)["'`]/);
36
+ if (importMatch) {
37
+ dependencies.push({ specifier: importMatch[1], isRelative: importMatch[1].startsWith(".") });
38
+ continue;
39
+ }
40
+ // ─── Function ───
41
+ const funcMatch = trimmed.match(/^func\s+(?:\(\s*\w+\s+\*?(\w+)\s*\)\s+)?(\w+)\s*(\([^)]*\))(?:\s*(\([^)]*\)|[\w*[\]]+))?/);
42
+ if (funcMatch) {
43
+ const receiver = funcMatch[1];
44
+ const name = funcMatch[2];
45
+ const isExported = name[0] === name[0].toUpperCase() && name[0] !== "_";
46
+ symbols.push({
47
+ name: receiver ? `${receiver}.${name}` : name,
48
+ kind: receiver ? "method" : "function",
49
+ lineStart: lineNum,
50
+ lineEnd: findBraceEnd(lines, i),
51
+ signature: trimmed.slice(0, 120),
52
+ exported: isExported,
53
+ });
54
+ continue;
55
+ }
56
+ // ─── Type struct/interface ───
57
+ const typeMatch = trimmed.match(/^type\s+(\w+)\s+(struct|interface)/);
58
+ if (typeMatch) {
59
+ symbols.push({
60
+ name: typeMatch[1],
61
+ kind: typeMatch[2] === "interface" ? "interface" : "class",
62
+ lineStart: lineNum,
63
+ lineEnd: findBraceEnd(lines, i),
64
+ signature: trimmed.slice(0, 100),
65
+ exported: typeMatch[1][0] === typeMatch[1][0].toUpperCase(),
66
+ });
67
+ continue;
68
+ }
69
+ // ─── Type alias ───
70
+ const typeAliasMatch = trimmed.match(/^type\s+(\w+)\s+(?!struct|interface)/);
71
+ if (typeAliasMatch) {
72
+ symbols.push({
73
+ name: typeAliasMatch[1],
74
+ kind: "type",
75
+ lineStart: lineNum,
76
+ lineEnd: lineNum,
77
+ signature: trimmed.slice(0, 100),
78
+ exported: typeAliasMatch[1][0] === typeAliasMatch[1][0].toUpperCase(),
79
+ });
80
+ continue;
81
+ }
82
+ // ─── Package-level var/const ───
83
+ const varMatch = trimmed.match(/^(?:var|const)\s+(\w+)\s/);
84
+ if (varMatch) {
85
+ const indent = line.length - line.trimStart().length;
86
+ if (indent === 0) {
87
+ symbols.push({
88
+ name: varMatch[1],
89
+ kind: "variable",
90
+ lineStart: lineNum,
91
+ lineEnd: lineNum,
92
+ signature: trimmed.slice(0, 80),
93
+ exported: varMatch[1][0] === varMatch[1][0].toUpperCase(),
94
+ });
95
+ }
96
+ }
97
+ }
98
+ return { symbols, dependencies };
99
+ }
100
+ }
101
+ function findBraceEnd(lines, startIdx) {
102
+ let depth = 0;
103
+ let started = false;
104
+ for (let i = startIdx; i < Math.min(startIdx + 500, lines.length); i++) {
105
+ for (const ch of lines[i]) {
106
+ if (ch === "{") {
107
+ depth++;
108
+ started = true;
109
+ }
110
+ else if (ch === "}") {
111
+ depth--;
112
+ if (started && depth === 0)
113
+ return i + 1;
114
+ }
115
+ }
116
+ }
117
+ return startIdx + 1;
118
+ }
119
+ //# sourceMappingURL=go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.js","sourceRoot":"","sources":["../../../src/indexer/extractors/go.ts"],"names":[],"mappings":"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"}