codetree-claude 1.5.0 → 1.5.2
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 +137 -121
- package/dist/cli.js +69 -83
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +126 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -1
- package/dist/diff.d.ts +37 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +181 -0
- package/dist/diff.js.map +1 -0
- package/dist/doctor.d.ts +5 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +139 -0
- package/dist/doctor.js.map +1 -0
- package/dist/hook/post-compact.js +1 -23
- package/dist/hook/post-compact.js.map +1 -1
- package/dist/hook/post-tool-use.js +11 -27
- package/dist/hook/post-tool-use.js.map +1 -1
- package/dist/hook/pre-compact.js +1 -22
- package/dist/hook/pre-compact.js.map +1 -1
- package/dist/hook/pre-tool-use.bundled.js +49 -77
- package/dist/hook/pre-tool-use.js +23 -90
- package/dist/hook/pre-tool-use.js.map +1 -1
- package/dist/hook/session-start.js +19 -23
- package/dist/hook/session-start.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/indexer/extractor-registry.d.ts.map +1 -1
- package/dist/indexer/extractor-registry.js +6 -0
- package/dist/indexer/extractor-registry.js.map +1 -1
- package/dist/indexer/extractors/csharp.d.ts +12 -0
- package/dist/indexer/extractors/csharp.d.ts.map +1 -0
- package/dist/indexer/extractors/csharp.js +165 -0
- package/dist/indexer/extractors/csharp.js.map +1 -0
- package/dist/indexer/extractors/go.js +44 -1
- package/dist/indexer/extractors/go.js.map +1 -1
- package/dist/indexer/extractors/java.d.ts.map +1 -1
- package/dist/indexer/extractors/java.js +41 -3
- package/dist/indexer/extractors/java.js.map +1 -1
- package/dist/indexer/extractors/javascript.d.ts.map +1 -1
- package/dist/indexer/extractors/javascript.js +67 -3
- package/dist/indexer/extractors/javascript.js.map +1 -1
- package/dist/indexer/extractors/python.d.ts.map +1 -1
- package/dist/indexer/extractors/python.js +31 -2
- package/dist/indexer/extractors/python.js.map +1 -1
- package/dist/indexer/extractors/ruby.d.ts +10 -0
- package/dist/indexer/extractors/ruby.d.ts.map +1 -0
- package/dist/indexer/extractors/ruby.js +145 -0
- package/dist/indexer/extractors/ruby.js.map +1 -0
- package/dist/indexer/extractors/rust.d.ts +10 -0
- package/dist/indexer/extractors/rust.d.ts.map +1 -0
- package/dist/indexer/extractors/rust.js +194 -0
- package/dist/indexer/extractors/rust.js.map +1 -0
- package/dist/indexer/indexer.d.ts +15 -0
- package/dist/indexer/indexer.d.ts.map +1 -1
- package/dist/indexer/indexer.js +168 -4
- package/dist/indexer/indexer.js.map +1 -1
- package/dist/server/ipc.d.ts +10 -4
- package/dist/server/ipc.d.ts.map +1 -1
- package/dist/server/ipc.js +190 -109
- package/dist/server/ipc.js.map +1 -1
- package/dist/server/mcp-server.js +36 -27
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/tools/codetree-find-refs.d.ts.map +1 -1
- package/dist/server/tools/codetree-find-refs.js +23 -14
- package/dist/server/tools/codetree-find-refs.js.map +1 -1
- package/dist/server/tools/codetree-memory.d.ts +3 -6
- package/dist/server/tools/codetree-memory.d.ts.map +1 -1
- package/dist/server/tools/codetree-memory.js +9 -10
- package/dist/server/tools/codetree-memory.js.map +1 -1
- package/dist/server/tools/codetree-outline.d.ts +57 -0
- package/dist/server/tools/codetree-outline.d.ts.map +1 -0
- package/dist/server/tools/codetree-outline.js +76 -0
- package/dist/server/tools/codetree-outline.js.map +1 -0
- package/dist/server/tools/codetree-probe.d.ts +53 -0
- package/dist/server/tools/codetree-probe.d.ts.map +1 -0
- package/dist/server/tools/codetree-probe.js +81 -0
- package/dist/server/tools/codetree-probe.js.map +1 -0
- package/dist/server/tools/codetree-read.d.ts +52 -3
- package/dist/server/tools/codetree-read.d.ts.map +1 -1
- package/dist/server/tools/codetree-read.js +237 -55
- package/dist/server/tools/codetree-read.js.map +1 -1
- package/dist/server/tools/codetree-search.d.ts +13 -1
- package/dist/server/tools/codetree-search.d.ts.map +1 -1
- package/dist/server/tools/codetree-search.js +80 -52
- package/dist/server/tools/codetree-search.js.map +1 -1
- package/dist/server/tools/codetree-structure.d.ts +25 -1
- package/dist/server/tools/codetree-structure.d.ts.map +1 -1
- package/dist/server/tools/codetree-structure.js +92 -42
- package/dist/server/tools/codetree-structure.js.map +1 -1
- package/dist/server/tools/codetree-summary.d.ts +2 -0
- package/dist/server/tools/codetree-summary.d.ts.map +1 -1
- package/dist/server/tools/codetree-summary.js +5 -0
- package/dist/server/tools/codetree-summary.js.map +1 -1
- package/dist/setup/install.d.ts +45 -1
- package/dist/setup/install.d.ts.map +1 -1
- package/dist/setup/install.js +163 -58
- package/dist/setup/install.js.map +1 -1
- package/dist/setup/template-load.d.ts +9 -0
- package/dist/setup/template-load.d.ts.map +1 -0
- package/dist/setup/template-load.js +39 -0
- package/dist/setup/template-load.js.map +1 -0
- package/dist/storage/database.d.ts +49 -0
- package/dist/storage/database.d.ts.map +1 -1
- package/dist/storage/database.js +383 -43
- package/dist/storage/database.js.map +1 -1
- package/dist/storage/disk-manager.d.ts.map +1 -1
- package/dist/storage/disk-manager.js +1 -5
- package/dist/storage/disk-manager.js.map +1 -1
- package/dist/utils.d.ts +23 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +102 -0
- package/dist/utils.js.map +1 -0
- package/package.json +46 -10
- package/templates/README.md +15 -0
- package/templates/agents-codetree.snippet.md +24 -0
- package/templates/claude-md-codetree.snippet.md +22 -0
- package/templates/claude-rules-codetree.md +23 -0
- package/templates/cursor-codetree.mdc +31 -0
- package/templates/gemini-codetree.snippet.md +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-compact.js","sourceRoot":"","sources":["../../src/hook/post-compact.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"post-compact.js","sourceRoot":"","sources":["../../src/hook/post-compact.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,8 @@
|
|
|
7
7
|
*
|
|
8
8
|
* Exit 0 always — we never block, just observe.
|
|
9
9
|
*/
|
|
10
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
11
|
-
import { join, dirname } from "node:path";
|
|
12
10
|
import { queryIpc } from "./hook-client.js";
|
|
11
|
+
import { findIpcPort } from "../utils.js";
|
|
13
12
|
async function main() {
|
|
14
13
|
let rawInput = "";
|
|
15
14
|
for await (const chunk of process.stdin) {
|
|
@@ -39,11 +38,17 @@ async function main() {
|
|
|
39
38
|
}
|
|
40
39
|
break;
|
|
41
40
|
}
|
|
42
|
-
case "Grep":
|
|
43
|
-
|
|
44
|
-
const pattern = (tool_input.pattern || tool_input.query) || "";
|
|
41
|
+
case "Grep": {
|
|
42
|
+
const pattern = (tool_input.pattern) || "";
|
|
45
43
|
if (pattern) {
|
|
46
|
-
await queryIpc(port, `/session/log-
|
|
44
|
+
await queryIpc(port, `/session/log-grep?session=${encodeURIComponent(session_id)}&pattern=${encodeURIComponent(pattern)}`, 50);
|
|
45
|
+
}
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
case "codetree_search": {
|
|
49
|
+
const query = (tool_input.query) || "";
|
|
50
|
+
if (query) {
|
|
51
|
+
await queryIpc(port, `/session/log-search?session=${encodeURIComponent(session_id)}&symbol=${encodeURIComponent(query)}`, 50);
|
|
47
52
|
}
|
|
48
53
|
break;
|
|
49
54
|
}
|
|
@@ -62,27 +67,6 @@ async function main() {
|
|
|
62
67
|
}
|
|
63
68
|
process.exit(0);
|
|
64
69
|
}
|
|
65
|
-
function findIpcPort(startDir) {
|
|
66
|
-
let dir = startDir;
|
|
67
|
-
for (let i = 0; i < 10; i++) {
|
|
68
|
-
const portFile = join(dir, ".codetree", "ipc.port");
|
|
69
|
-
if (existsSync(portFile)) {
|
|
70
|
-
try {
|
|
71
|
-
const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
|
|
72
|
-
if (port > 0 && port <= 65535)
|
|
73
|
-
return port;
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const parent = dirname(dir);
|
|
80
|
-
if (parent === dir)
|
|
81
|
-
break;
|
|
82
|
-
dir = parent;
|
|
83
|
-
}
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
70
|
main().catch(() => {
|
|
87
71
|
process.exit(0);
|
|
88
72
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hook/post-tool-use.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hook/post-tool-use.ts"],"names":[],"mappings":"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"}
|
package/dist/hook/pre-compact.js
CHANGED
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
* Exit 0 always — never block compaction.
|
|
16
16
|
*/
|
|
17
17
|
import { readFileSync, existsSync } from "node:fs";
|
|
18
|
-
import { join, dirname } from "node:path";
|
|
19
18
|
import { queryIpc } from "./hook-client.js";
|
|
19
|
+
import { findIpcPort } from "../utils.js";
|
|
20
20
|
async function main() {
|
|
21
21
|
let rawInput = "";
|
|
22
22
|
for await (const chunk of process.stdin) {
|
|
@@ -165,26 +165,5 @@ function parseTranscript(transcript) {
|
|
|
165
165
|
decisions: [...new Set(decisions)].slice(0, 10),
|
|
166
166
|
};
|
|
167
167
|
}
|
|
168
|
-
function findIpcPort(startDir) {
|
|
169
|
-
let dir = startDir;
|
|
170
|
-
for (let i = 0; i < 10; i++) {
|
|
171
|
-
const portFile = join(dir, ".codetree", "ipc.port");
|
|
172
|
-
if (existsSync(portFile)) {
|
|
173
|
-
try {
|
|
174
|
-
const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
|
|
175
|
-
if (port > 0 && port <= 65535)
|
|
176
|
-
return port;
|
|
177
|
-
}
|
|
178
|
-
catch {
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
const parent = dirname(dir);
|
|
183
|
-
if (parent === dir)
|
|
184
|
-
break;
|
|
185
|
-
dir = parent;
|
|
186
|
-
}
|
|
187
|
-
return null;
|
|
188
|
-
}
|
|
189
168
|
main().catch(() => { process.exit(0); });
|
|
190
169
|
//# sourceMappingURL=pre-compact.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-compact.js","sourceRoot":"","sources":["../../src/hook/pre-compact.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pre-compact.js","sourceRoot":"","sources":["../../src/hook/pre-compact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
#!/usr/bin/env node
|
|
3
3
|
|
|
4
|
-
// dist/hook/pre-tool-use.js
|
|
5
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
6
|
-
import { join, dirname } from "node:path";
|
|
7
|
-
|
|
8
4
|
// dist/hook/hook-client.js
|
|
9
5
|
import { request } from "node:http";
|
|
10
6
|
function queryIpc(port, path, timeoutMs = 30) {
|
|
11
|
-
return new Promise((
|
|
7
|
+
return new Promise((resolve2) => {
|
|
12
8
|
const timer = setTimeout(() => {
|
|
13
|
-
|
|
9
|
+
resolve2(null);
|
|
14
10
|
}, timeoutMs);
|
|
15
11
|
try {
|
|
16
12
|
const req = request({
|
|
@@ -27,29 +23,53 @@ function queryIpc(port, path, timeoutMs = 30) {
|
|
|
27
23
|
res.on("end", () => {
|
|
28
24
|
clearTimeout(timer);
|
|
29
25
|
try {
|
|
30
|
-
|
|
26
|
+
resolve2(JSON.parse(data));
|
|
31
27
|
} catch {
|
|
32
|
-
|
|
28
|
+
resolve2(null);
|
|
33
29
|
}
|
|
34
30
|
});
|
|
35
31
|
});
|
|
36
32
|
req.on("error", () => {
|
|
37
33
|
clearTimeout(timer);
|
|
38
|
-
|
|
34
|
+
resolve2(null);
|
|
39
35
|
});
|
|
40
36
|
req.on("timeout", () => {
|
|
41
37
|
req.destroy();
|
|
42
38
|
clearTimeout(timer);
|
|
43
|
-
|
|
39
|
+
resolve2(null);
|
|
44
40
|
});
|
|
45
41
|
req.end();
|
|
46
42
|
} catch {
|
|
47
43
|
clearTimeout(timer);
|
|
48
|
-
|
|
44
|
+
resolve2(null);
|
|
49
45
|
}
|
|
50
46
|
});
|
|
51
47
|
}
|
|
52
48
|
|
|
49
|
+
// dist/utils.js
|
|
50
|
+
import { existsSync, readFileSync, readdirSync, realpathSync } from "node:fs";
|
|
51
|
+
import { join, resolve, dirname } from "node:path";
|
|
52
|
+
function findIpcPort(startDir) {
|
|
53
|
+
let dir = startDir;
|
|
54
|
+
for (let i = 0; i < 10; i++) {
|
|
55
|
+
const portFile = join(dir, ".codetree", "ipc.port");
|
|
56
|
+
if (existsSync(portFile)) {
|
|
57
|
+
try {
|
|
58
|
+
const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
|
|
59
|
+
if (port > 0 && port <= 65535)
|
|
60
|
+
return port;
|
|
61
|
+
} catch {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const parent = dirname(dir);
|
|
66
|
+
if (parent === dir)
|
|
67
|
+
break;
|
|
68
|
+
dir = parent;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
53
73
|
// dist/hook/pre-tool-use.js
|
|
54
74
|
async function main() {
|
|
55
75
|
let rawInput = "";
|
|
@@ -62,14 +82,13 @@ async function main() {
|
|
|
62
82
|
} catch {
|
|
63
83
|
process.exit(0);
|
|
64
84
|
}
|
|
65
|
-
const { tool_name, tool_input, cwd } = input;
|
|
85
|
+
const { tool_name, tool_input, cwd, session_id } = input;
|
|
66
86
|
const port = findIpcPort(cwd);
|
|
67
|
-
if (!port)
|
|
87
|
+
if (!port)
|
|
68
88
|
process.exit(0);
|
|
69
|
-
}
|
|
70
89
|
switch (tool_name) {
|
|
71
90
|
case "Read":
|
|
72
|
-
await handleRead(port, tool_input);
|
|
91
|
+
await handleRead(port, tool_input, session_id);
|
|
73
92
|
break;
|
|
74
93
|
case "Grep":
|
|
75
94
|
await handleGrep(port, tool_input);
|
|
@@ -77,106 +96,59 @@ async function main() {
|
|
|
77
96
|
case "Glob":
|
|
78
97
|
await handleGlob(port, tool_input);
|
|
79
98
|
break;
|
|
80
|
-
case "Edit":
|
|
81
|
-
await handleEdit(port, tool_input);
|
|
82
|
-
break;
|
|
83
|
-
case "Write":
|
|
84
|
-
await handleWrite(port, tool_input);
|
|
85
|
-
break;
|
|
86
99
|
default:
|
|
87
100
|
process.exit(0);
|
|
88
101
|
}
|
|
89
102
|
}
|
|
90
|
-
async function handleRead(port, input) {
|
|
103
|
+
async function handleRead(port, input, sessionId) {
|
|
91
104
|
const filePath = input.file_path;
|
|
92
|
-
if (!filePath)
|
|
105
|
+
if (!filePath)
|
|
93
106
|
process.exit(0);
|
|
107
|
+
const params = new URLSearchParams();
|
|
108
|
+
params.set("path", filePath);
|
|
109
|
+
if (sessionId)
|
|
110
|
+
params.set("session", sessionId);
|
|
111
|
+
const result = await queryIpc(port, `/check?${params.toString()}`);
|
|
112
|
+
if (result?.unchanged) {
|
|
113
|
+
process.stderr.write(`Unchanged since your last read this session. Skip re-reading "${result.path}" (hash ${String(result.hash).slice(0, 8)}).`);
|
|
114
|
+
process.exit(2);
|
|
94
115
|
}
|
|
95
|
-
const result = await queryIpc(port, `/check?path=${encodeURIComponent(filePath)}`);
|
|
96
116
|
if (result?.cached) {
|
|
97
117
|
const relPath = result.path;
|
|
98
118
|
const lineCount = result.lineCount;
|
|
99
119
|
const size = result.size;
|
|
100
|
-
process.stderr.write(`
|
|
120
|
+
process.stderr.write(`Cached. Use codetree_read file_path="${relPath}" (${lineCount}L, ${formatSize(size)}). Pass session_id+expected_hash to skip if unchanged.`);
|
|
101
121
|
process.exit(2);
|
|
102
122
|
}
|
|
103
123
|
process.exit(0);
|
|
104
124
|
}
|
|
105
|
-
async function handleEdit(port, input) {
|
|
106
|
-
const filePath = input.file_path;
|
|
107
|
-
if (!filePath) {
|
|
108
|
-
process.exit(0);
|
|
109
|
-
}
|
|
110
|
-
const result = await queryIpc(port, `/check?path=${encodeURIComponent(filePath)}`);
|
|
111
|
-
if (!result?.cached) {
|
|
112
|
-
process.exit(0);
|
|
113
|
-
}
|
|
114
|
-
process.stderr.write(`Use the codetree_edit tool instead of Edit. It works without requiring a prior Read call. Call codetree_edit with file_path="${filePath}", old_string, and new_string.`);
|
|
115
|
-
process.exit(2);
|
|
116
|
-
}
|
|
117
|
-
async function handleWrite(port, input) {
|
|
118
|
-
const filePath = input.file_path;
|
|
119
|
-
if (!filePath) {
|
|
120
|
-
process.exit(0);
|
|
121
|
-
}
|
|
122
|
-
const result = await queryIpc(port, `/check?path=${encodeURIComponent(filePath)}`);
|
|
123
|
-
if (!result?.cached) {
|
|
124
|
-
process.exit(0);
|
|
125
|
-
}
|
|
126
|
-
process.stderr.write(`Use the codetree_write tool instead of Write. It works without requiring a prior Read call. Call codetree_write with file_path="${filePath}" and content.`);
|
|
127
|
-
process.exit(2);
|
|
128
|
-
}
|
|
129
125
|
async function handleGrep(port, input) {
|
|
130
126
|
const pattern = input.pattern;
|
|
131
127
|
const searchPath = input.path;
|
|
132
|
-
if (!pattern)
|
|
128
|
+
if (!pattern)
|
|
133
129
|
process.exit(0);
|
|
134
|
-
}
|
|
135
130
|
const params = new URLSearchParams();
|
|
136
131
|
params.set("pattern", pattern);
|
|
137
132
|
if (searchPath)
|
|
138
133
|
params.set("path", searchPath);
|
|
139
134
|
const result = await queryIpc(port, `/check-search?${params.toString()}`);
|
|
140
135
|
if (result?.cached) {
|
|
141
|
-
|
|
142
|
-
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.`);
|
|
136
|
+
process.stderr.write(`Indexed. Use codetree_search query="${pattern}" (or codetree_probe for cheap presence check).`);
|
|
143
137
|
process.exit(2);
|
|
144
138
|
}
|
|
145
139
|
process.exit(0);
|
|
146
140
|
}
|
|
147
141
|
async function handleGlob(port, input) {
|
|
148
142
|
const pattern = input.pattern;
|
|
149
|
-
if (!pattern)
|
|
143
|
+
if (!pattern)
|
|
150
144
|
process.exit(0);
|
|
151
|
-
}
|
|
152
145
|
const result = await queryIpc(port, `/check-glob?pattern=${encodeURIComponent(pattern)}`);
|
|
153
146
|
if (result?.cached) {
|
|
154
|
-
|
|
155
|
-
process.stderr.write(`${hint} Call the codetree_structure tool to browse the project tree. Use the pattern parameter to filter files.`);
|
|
147
|
+
process.stderr.write(`Indexed. Use codetree_structure pattern="${pattern}" (format='text' for compact output).`);
|
|
156
148
|
process.exit(2);
|
|
157
149
|
}
|
|
158
150
|
process.exit(0);
|
|
159
151
|
}
|
|
160
|
-
function findIpcPort(startDir) {
|
|
161
|
-
let dir = startDir;
|
|
162
|
-
for (let i = 0; i < 10; i++) {
|
|
163
|
-
const portFile = join(dir, ".codetree", "ipc.port");
|
|
164
|
-
if (existsSync(portFile)) {
|
|
165
|
-
try {
|
|
166
|
-
const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
|
|
167
|
-
if (port > 0 && port <= 65535)
|
|
168
|
-
return port;
|
|
169
|
-
} catch {
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
const parent = dirname(dir);
|
|
174
|
-
if (parent === dir)
|
|
175
|
-
break;
|
|
176
|
-
dir = parent;
|
|
177
|
-
}
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
180
152
|
function formatSize(bytes) {
|
|
181
153
|
if (bytes < 1024)
|
|
182
154
|
return `${bytes}B`;
|
|
@@ -10,9 +10,8 @@
|
|
|
10
10
|
*
|
|
11
11
|
* CRITICAL: This must complete in <50ms. Any failure = exit 0 (fall through).
|
|
12
12
|
*/
|
|
13
|
-
import { readFileSync, existsSync } from "node:fs";
|
|
14
|
-
import { join, dirname } from "node:path";
|
|
15
13
|
import { queryIpc } from "./hook-client.js";
|
|
14
|
+
import { findIpcPort } from "../utils.js";
|
|
16
15
|
async function main() {
|
|
17
16
|
// Read stdin (hook input)
|
|
18
17
|
let rawInput = "";
|
|
@@ -26,16 +25,13 @@ async function main() {
|
|
|
26
25
|
catch {
|
|
27
26
|
process.exit(0); // Can't parse → allow
|
|
28
27
|
}
|
|
29
|
-
const { tool_name, tool_input, cwd } = input;
|
|
30
|
-
// Find the IPC port file
|
|
28
|
+
const { tool_name, tool_input, cwd, session_id } = input;
|
|
31
29
|
const port = findIpcPort(cwd);
|
|
32
|
-
if (!port)
|
|
33
|
-
process.exit(0);
|
|
34
|
-
}
|
|
35
|
-
// Route based on tool
|
|
30
|
+
if (!port)
|
|
31
|
+
process.exit(0);
|
|
36
32
|
switch (tool_name) {
|
|
37
33
|
case "Read":
|
|
38
|
-
await handleRead(port, tool_input);
|
|
34
|
+
await handleRead(port, tool_input, session_id);
|
|
39
35
|
break;
|
|
40
36
|
case "Grep":
|
|
41
37
|
await handleGrep(port, tool_input);
|
|
@@ -43,121 +39,58 @@ async function main() {
|
|
|
43
39
|
case "Glob":
|
|
44
40
|
await handleGlob(port, tool_input);
|
|
45
41
|
break;
|
|
46
|
-
case "Edit":
|
|
47
|
-
await handleEdit(port, tool_input);
|
|
48
|
-
break;
|
|
49
|
-
case "Write":
|
|
50
|
-
await handleWrite(port, tool_input);
|
|
51
|
-
break;
|
|
52
42
|
default:
|
|
53
43
|
process.exit(0); // Unknown tool → allow
|
|
54
44
|
}
|
|
55
45
|
}
|
|
56
|
-
async function handleRead(port, input) {
|
|
46
|
+
async function handleRead(port, input, sessionId) {
|
|
57
47
|
const filePath = input.file_path;
|
|
58
|
-
if (!filePath)
|
|
48
|
+
if (!filePath)
|
|
59
49
|
process.exit(0);
|
|
50
|
+
const params = new URLSearchParams();
|
|
51
|
+
params.set("path", filePath);
|
|
52
|
+
if (sessionId)
|
|
53
|
+
params.set("session", sessionId);
|
|
54
|
+
const result = await queryIpc(port, `/check?${params.toString()}`);
|
|
55
|
+
if (result?.unchanged) {
|
|
56
|
+
process.stderr.write(`Unchanged since your last read this session. Skip re-reading "${result.path}" (hash ${String(result.hash).slice(0, 8)}).`);
|
|
57
|
+
process.exit(2);
|
|
60
58
|
}
|
|
61
|
-
const result = await queryIpc(port, `/check?path=${encodeURIComponent(filePath)}`);
|
|
62
59
|
if (result?.cached) {
|
|
63
60
|
const relPath = result.path;
|
|
64
61
|
const lineCount = result.lineCount;
|
|
65
62
|
const size = result.size;
|
|
66
|
-
|
|
67
|
-
process.stderr.write(`File "${relPath}" is cached in CodeTree (${lineCount} lines, ${formatSize(size)}). ` +
|
|
68
|
-
`Call the codetree_read tool with file_path="${relPath}" to read it. ` +
|
|
69
|
-
`This saves tokens by using the cached version.`);
|
|
63
|
+
process.stderr.write(`Cached. Use codetree_read file_path="${relPath}" (${lineCount}L, ${formatSize(size)}). Pass session_id+expected_hash to skip if unchanged.`);
|
|
70
64
|
process.exit(2);
|
|
71
65
|
}
|
|
72
|
-
process.exit(0);
|
|
73
|
-
}
|
|
74
|
-
async function handleEdit(port, input) {
|
|
75
|
-
const filePath = input.file_path;
|
|
76
|
-
if (!filePath) {
|
|
77
|
-
process.exit(0);
|
|
78
|
-
}
|
|
79
|
-
// Only redirect if file is actually cached — if codetree_edit fails, user can retry with native Edit
|
|
80
|
-
const result = await queryIpc(port, `/check?path=${encodeURIComponent(filePath)}`);
|
|
81
|
-
if (!result?.cached) {
|
|
82
|
-
process.exit(0); // Not cached → allow native Edit
|
|
83
|
-
}
|
|
84
|
-
process.stderr.write(`Use the codetree_edit tool instead of Edit. ` +
|
|
85
|
-
`It works without requiring a prior Read call. ` +
|
|
86
|
-
`Call codetree_edit with file_path="${filePath}", old_string, and new_string.`);
|
|
87
|
-
process.exit(2);
|
|
88
|
-
}
|
|
89
|
-
async function handleWrite(port, input) {
|
|
90
|
-
const filePath = input.file_path;
|
|
91
|
-
if (!filePath) {
|
|
92
|
-
process.exit(0);
|
|
93
|
-
}
|
|
94
|
-
// Only redirect if file is actually cached
|
|
95
|
-
const result = await queryIpc(port, `/check?path=${encodeURIComponent(filePath)}`);
|
|
96
|
-
if (!result?.cached) {
|
|
97
|
-
process.exit(0); // Not cached → allow native Write
|
|
98
|
-
}
|
|
99
|
-
process.stderr.write(`Use the codetree_write tool instead of Write. ` +
|
|
100
|
-
`It works without requiring a prior Read call. ` +
|
|
101
|
-
`Call codetree_write with file_path="${filePath}" and content.`);
|
|
102
|
-
process.exit(2);
|
|
66
|
+
process.exit(0);
|
|
103
67
|
}
|
|
104
68
|
async function handleGrep(port, input) {
|
|
105
69
|
const pattern = input.pattern;
|
|
106
70
|
const searchPath = input.path;
|
|
107
|
-
if (!pattern)
|
|
71
|
+
if (!pattern)
|
|
108
72
|
process.exit(0);
|
|
109
|
-
}
|
|
110
73
|
const params = new URLSearchParams();
|
|
111
74
|
params.set("pattern", pattern);
|
|
112
75
|
if (searchPath)
|
|
113
76
|
params.set("path", searchPath);
|
|
114
77
|
const result = await queryIpc(port, `/check-search?${params.toString()}`);
|
|
115
78
|
if (result?.cached) {
|
|
116
|
-
|
|
117
|
-
process.stderr.write(`${hint} Call the codetree_search tool with query="${pattern}" for indexed results. ` +
|
|
118
|
-
`Set content_search=true if you need line-level matches.`);
|
|
79
|
+
process.stderr.write(`Indexed. Use codetree_search query="${pattern}" (or codetree_probe for cheap presence check).`);
|
|
119
80
|
process.exit(2);
|
|
120
81
|
}
|
|
121
|
-
process.exit(0);
|
|
82
|
+
process.exit(0);
|
|
122
83
|
}
|
|
123
84
|
async function handleGlob(port, input) {
|
|
124
85
|
const pattern = input.pattern;
|
|
125
|
-
if (!pattern)
|
|
86
|
+
if (!pattern)
|
|
126
87
|
process.exit(0);
|
|
127
|
-
}
|
|
128
88
|
const result = await queryIpc(port, `/check-glob?pattern=${encodeURIComponent(pattern)}`);
|
|
129
89
|
if (result?.cached) {
|
|
130
|
-
|
|
131
|
-
process.stderr.write(`${hint} Call the codetree_structure tool to browse the project tree. ` +
|
|
132
|
-
`Use the pattern parameter to filter files.`);
|
|
90
|
+
process.stderr.write(`Indexed. Use codetree_structure pattern="${pattern}" (format='text' for compact output).`);
|
|
133
91
|
process.exit(2);
|
|
134
92
|
}
|
|
135
|
-
process.exit(0);
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Find the IPC port by looking for .codetree/ipc.port file.
|
|
139
|
-
* Walks up from cwd to find the project root.
|
|
140
|
-
*/
|
|
141
|
-
function findIpcPort(startDir) {
|
|
142
|
-
let dir = startDir;
|
|
143
|
-
for (let i = 0; i < 10; i++) {
|
|
144
|
-
const portFile = join(dir, ".codetree", "ipc.port");
|
|
145
|
-
if (existsSync(portFile)) {
|
|
146
|
-
try {
|
|
147
|
-
const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
|
|
148
|
-
if (port > 0 && port <= 65535)
|
|
149
|
-
return port;
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
return null;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
const parent = dirname(dir);
|
|
156
|
-
if (parent === dir)
|
|
157
|
-
break;
|
|
158
|
-
dir = parent;
|
|
159
|
-
}
|
|
160
|
-
return null;
|
|
93
|
+
process.exit(0);
|
|
161
94
|
}
|
|
162
95
|
function formatSize(bytes) {
|
|
163
96
|
if (bytes < 1024)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../src/hook/pre-tool-use.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../src/hook/pre-tool-use.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
* This goes to stdout (exit 0) — Claude Code adds stdout to the session context.
|
|
12
12
|
*/
|
|
13
13
|
import { readFileSync, existsSync } from "node:fs";
|
|
14
|
-
import { join
|
|
14
|
+
import { join } from "node:path";
|
|
15
15
|
import { queryIpc } from "./hook-client.js";
|
|
16
|
+
import { findIpcPort } from "../utils.js";
|
|
16
17
|
async function main() {
|
|
17
18
|
let rawInput = "";
|
|
18
19
|
for await (const chunk of process.stdin) {
|
|
@@ -94,30 +95,25 @@ async function main() {
|
|
|
94
95
|
lines.push("");
|
|
95
96
|
}
|
|
96
97
|
lines.push("=== End CodeTree Session Memory ===");
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
|
|
108
|
-
if (port > 0 && port <= 65535)
|
|
109
|
-
return port;
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
98
|
+
// Cap by bytes — keep session-start cheap on large repos.
|
|
99
|
+
// Read .codetreerc.json if present for sessionStart.maxBytes; default 2KB.
|
|
100
|
+
let maxBytes = 2048;
|
|
101
|
+
try {
|
|
102
|
+
const cfgPath = join(cwd, ".codetreerc.json");
|
|
103
|
+
if (existsSync(cfgPath)) {
|
|
104
|
+
const cfg = JSON.parse(readFileSync(cfgPath, "utf-8"));
|
|
105
|
+
const v = cfg?.tokenSave?.sessionStart?.maxBytes;
|
|
106
|
+
if (typeof v === "number" && v > 0)
|
|
107
|
+
maxBytes = v;
|
|
114
108
|
}
|
|
115
|
-
const parent = dirname(dir);
|
|
116
|
-
if (parent === dir)
|
|
117
|
-
break;
|
|
118
|
-
dir = parent;
|
|
119
109
|
}
|
|
120
|
-
|
|
110
|
+
catch { /* ignore */ }
|
|
111
|
+
let out = lines.join("\n");
|
|
112
|
+
if (Buffer.byteLength(out, "utf-8") > maxBytes) {
|
|
113
|
+
out = out.slice(0, maxBytes) + "\n... [truncated to fit session-start budget]";
|
|
114
|
+
}
|
|
115
|
+
process.stdout.write(out);
|
|
116
|
+
process.exit(0);
|
|
121
117
|
}
|
|
122
118
|
function formatTimeAgo(timestamp) {
|
|
123
119
|
const diff = Date.now() - timestamp;
|