codetree-claude 1.4.7 → 1.5.1
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 +144 -86
- 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 +15 -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 -69
- package/dist/hook/pre-tool-use.js +23 -80
- 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/extractors/types.d.ts.map +1 -1
- package/dist/indexer/extractors/types.js +6 -0
- package/dist/indexer/extractors/types.js.map +1 -1
- package/dist/indexer/indexer.d.ts +23 -0
- package/dist/indexer/indexer.d.ts.map +1 -1
- package/dist/indexer/indexer.js +233 -14
- package/dist/indexer/indexer.js.map +1 -1
- package/dist/indexer/watcher.d.ts +3 -0
- package/dist/indexer/watcher.d.ts.map +1 -1
- package/dist/indexer/watcher.js +33 -1
- package/dist/indexer/watcher.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 +38 -29
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/tools/codetree-edit.d.ts +2 -1
- package/dist/server/tools/codetree-edit.d.ts.map +1 -1
- package/dist/server/tools/codetree-edit.js +24 -6
- package/dist/server/tools/codetree-edit.js.map +1 -1
- package/dist/server/tools/codetree-find-refs.d.ts.map +1 -1
- package/dist/server/tools/codetree-find-refs.js +29 -15
- 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 +249 -38
- 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 +89 -49
- 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 +99 -31
- 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/server/tools/codetree-write.d.ts +2 -1
- package/dist/server/tools/codetree-write.d.ts.map +1 -1
- package/dist/server/tools/codetree-write.js +9 -1
- package/dist/server/tools/codetree-write.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 +398 -53
- 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 +63 -5
- 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
|
}
|
|
@@ -55,29 +60,12 @@ async function main() {
|
|
|
55
60
|
}
|
|
56
61
|
break;
|
|
57
62
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
function findIpcPort(startDir) {
|
|
62
|
-
let dir = startDir;
|
|
63
|
-
for (let i = 0; i < 10; i++) {
|
|
64
|
-
const portFile = join(dir, ".codetree", "ipc.port");
|
|
65
|
-
if (existsSync(portFile)) {
|
|
66
|
-
try {
|
|
67
|
-
const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
|
|
68
|
-
if (port > 0 && port <= 65535)
|
|
69
|
-
return port;
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
const parent = dirname(dir);
|
|
76
|
-
if (parent === dir)
|
|
63
|
+
// codetree_edit/write log via MCP tool handler directly — skip here to avoid double-logging
|
|
64
|
+
case "codetree_edit":
|
|
65
|
+
case "codetree_write":
|
|
77
66
|
break;
|
|
78
|
-
dir = parent;
|
|
79
67
|
}
|
|
80
|
-
|
|
68
|
+
process.exit(0);
|
|
81
69
|
}
|
|
82
70
|
main().catch(() => {
|
|
83
71
|
process.exit(0);
|
|
@@ -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,98 +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
|
-
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.`);
|
|
111
|
-
process.exit(2);
|
|
112
|
-
}
|
|
113
|
-
async function handleWrite(port, input) {
|
|
114
|
-
const filePath = input.file_path;
|
|
115
|
-
if (!filePath) {
|
|
116
|
-
process.exit(0);
|
|
117
|
-
}
|
|
118
|
-
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.`);
|
|
119
|
-
process.exit(2);
|
|
120
|
-
}
|
|
121
125
|
async function handleGrep(port, input) {
|
|
122
126
|
const pattern = input.pattern;
|
|
123
127
|
const searchPath = input.path;
|
|
124
|
-
if (!pattern)
|
|
128
|
+
if (!pattern)
|
|
125
129
|
process.exit(0);
|
|
126
|
-
}
|
|
127
130
|
const params = new URLSearchParams();
|
|
128
131
|
params.set("pattern", pattern);
|
|
129
132
|
if (searchPath)
|
|
130
133
|
params.set("path", searchPath);
|
|
131
134
|
const result = await queryIpc(port, `/check-search?${params.toString()}`);
|
|
132
135
|
if (result?.cached) {
|
|
133
|
-
|
|
134
|
-
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).`);
|
|
135
137
|
process.exit(2);
|
|
136
138
|
}
|
|
137
139
|
process.exit(0);
|
|
138
140
|
}
|
|
139
141
|
async function handleGlob(port, input) {
|
|
140
142
|
const pattern = input.pattern;
|
|
141
|
-
if (!pattern)
|
|
143
|
+
if (!pattern)
|
|
142
144
|
process.exit(0);
|
|
143
|
-
}
|
|
144
145
|
const result = await queryIpc(port, `/check-glob?pattern=${encodeURIComponent(pattern)}`);
|
|
145
146
|
if (result?.cached) {
|
|
146
|
-
|
|
147
|
-
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).`);
|
|
148
148
|
process.exit(2);
|
|
149
149
|
}
|
|
150
150
|
process.exit(0);
|
|
151
151
|
}
|
|
152
|
-
function findIpcPort(startDir) {
|
|
153
|
-
let dir = startDir;
|
|
154
|
-
for (let i = 0; i < 10; i++) {
|
|
155
|
-
const portFile = join(dir, ".codetree", "ipc.port");
|
|
156
|
-
if (existsSync(portFile)) {
|
|
157
|
-
try {
|
|
158
|
-
const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
|
|
159
|
-
if (port > 0 && port <= 65535)
|
|
160
|
-
return port;
|
|
161
|
-
} catch {
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
const parent = dirname(dir);
|
|
166
|
-
if (parent === dir)
|
|
167
|
-
break;
|
|
168
|
-
dir = parent;
|
|
169
|
-
}
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
152
|
function formatSize(bytes) {
|
|
173
153
|
if (bytes < 1024)
|
|
174
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,111 +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
|
-
process.stderr.write(`Use the codetree_edit tool instead of Edit. ` +
|
|
80
|
-
`It works without requiring a prior Read call. ` +
|
|
81
|
-
`Call codetree_edit with file_path="${filePath}", old_string, and new_string.`);
|
|
82
|
-
process.exit(2);
|
|
83
|
-
}
|
|
84
|
-
async function handleWrite(port, input) {
|
|
85
|
-
const filePath = input.file_path;
|
|
86
|
-
if (!filePath) {
|
|
87
|
-
process.exit(0);
|
|
88
|
-
}
|
|
89
|
-
process.stderr.write(`Use the codetree_write tool instead of Write. ` +
|
|
90
|
-
`It works without requiring a prior Read call. ` +
|
|
91
|
-
`Call codetree_write with file_path="${filePath}" and content.`);
|
|
92
|
-
process.exit(2);
|
|
66
|
+
process.exit(0);
|
|
93
67
|
}
|
|
94
68
|
async function handleGrep(port, input) {
|
|
95
69
|
const pattern = input.pattern;
|
|
96
70
|
const searchPath = input.path;
|
|
97
|
-
if (!pattern)
|
|
71
|
+
if (!pattern)
|
|
98
72
|
process.exit(0);
|
|
99
|
-
}
|
|
100
73
|
const params = new URLSearchParams();
|
|
101
74
|
params.set("pattern", pattern);
|
|
102
75
|
if (searchPath)
|
|
103
76
|
params.set("path", searchPath);
|
|
104
77
|
const result = await queryIpc(port, `/check-search?${params.toString()}`);
|
|
105
78
|
if (result?.cached) {
|
|
106
|
-
|
|
107
|
-
process.stderr.write(`${hint} Call the codetree_search tool with query="${pattern}" for indexed results. ` +
|
|
108
|
-
`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).`);
|
|
109
80
|
process.exit(2);
|
|
110
81
|
}
|
|
111
|
-
process.exit(0);
|
|
82
|
+
process.exit(0);
|
|
112
83
|
}
|
|
113
84
|
async function handleGlob(port, input) {
|
|
114
85
|
const pattern = input.pattern;
|
|
115
|
-
if (!pattern)
|
|
86
|
+
if (!pattern)
|
|
116
87
|
process.exit(0);
|
|
117
|
-
}
|
|
118
88
|
const result = await queryIpc(port, `/check-glob?pattern=${encodeURIComponent(pattern)}`);
|
|
119
89
|
if (result?.cached) {
|
|
120
|
-
|
|
121
|
-
process.stderr.write(`${hint} Call the codetree_structure tool to browse the project tree. ` +
|
|
122
|
-
`Use the pattern parameter to filter files.`);
|
|
90
|
+
process.stderr.write(`Indexed. Use codetree_structure pattern="${pattern}" (format='text' for compact output).`);
|
|
123
91
|
process.exit(2);
|
|
124
92
|
}
|
|
125
|
-
process.exit(0);
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Find the IPC port by looking for .codetree/ipc.port file.
|
|
129
|
-
* Walks up from cwd to find the project root.
|
|
130
|
-
*/
|
|
131
|
-
function findIpcPort(startDir) {
|
|
132
|
-
let dir = startDir;
|
|
133
|
-
for (let i = 0; i < 10; i++) {
|
|
134
|
-
const portFile = join(dir, ".codetree", "ipc.port");
|
|
135
|
-
if (existsSync(portFile)) {
|
|
136
|
-
try {
|
|
137
|
-
const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
|
|
138
|
-
if (port > 0 && port <= 65535)
|
|
139
|
-
return port;
|
|
140
|
-
}
|
|
141
|
-
catch {
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
const parent = dirname(dir);
|
|
146
|
-
if (parent === dir)
|
|
147
|
-
break;
|
|
148
|
-
dir = parent;
|
|
149
|
-
}
|
|
150
|
-
return null;
|
|
93
|
+
process.exit(0);
|
|
151
94
|
}
|
|
152
95
|
function formatSize(bytes) {
|
|
153
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;
|