codetree-claude 1.0.1 → 1.2.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 (40) hide show
  1. package/LICENSE +21 -0
  2. package/dist/hook/post-compact.d.ts +18 -0
  3. package/dist/hook/post-compact.d.ts.map +1 -0
  4. package/dist/hook/post-compact.js +192 -0
  5. package/dist/hook/post-compact.js.map +1 -0
  6. package/dist/hook/post-tool-use.d.ts +11 -0
  7. package/dist/hook/post-tool-use.d.ts.map +1 -0
  8. package/dist/hook/post-tool-use.js +85 -0
  9. package/dist/hook/post-tool-use.js.map +1 -0
  10. package/dist/hook/pre-compact.d.ts +18 -0
  11. package/dist/hook/pre-compact.d.ts.map +1 -0
  12. package/dist/hook/pre-compact.js +190 -0
  13. package/dist/hook/pre-compact.js.map +1 -0
  14. package/dist/hook/session-start.d.ts +14 -0
  15. package/dist/hook/session-start.d.ts.map +1 -0
  16. package/dist/hook/session-start.js +136 -0
  17. package/dist/hook/session-start.js.map +1 -0
  18. package/dist/server/ipc.d.ts +11 -0
  19. package/dist/server/ipc.d.ts.map +1 -1
  20. package/dist/server/ipc.js +233 -0
  21. package/dist/server/ipc.js.map +1 -1
  22. package/dist/server/mcp-server.js +3 -1
  23. package/dist/server/mcp-server.js.map +1 -1
  24. package/dist/server/tools/codetree-memory.d.ts +121 -0
  25. package/dist/server/tools/codetree-memory.d.ts.map +1 -0
  26. package/dist/server/tools/codetree-memory.js +129 -0
  27. package/dist/server/tools/codetree-memory.js.map +1 -0
  28. package/dist/setup/install.d.ts +1 -1
  29. package/dist/setup/install.d.ts.map +1 -1
  30. package/dist/setup/install.js +76 -3
  31. package/dist/setup/install.js.map +1 -1
  32. package/dist/storage/database.d.ts +59 -0
  33. package/dist/storage/database.d.ts.map +1 -1
  34. package/dist/storage/database.js +381 -0
  35. package/dist/storage/database.js.map +1 -1
  36. package/dist/storage/disk-manager.d.ts +26 -0
  37. package/dist/storage/disk-manager.d.ts.map +1 -0
  38. package/dist/storage/disk-manager.js +100 -0
  39. package/dist/storage/disk-manager.js.map +1 -0
  40. package/package.json +1 -1
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nitish Pandey
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree PostCompact Hook
4
+ *
5
+ * Fires AFTER Claude Code compacts its context window.
6
+ * Claude has lost most of its working memory. We re-inject:
7
+ *
8
+ * 1. What the user was working on (task summary)
9
+ * 2. Files read and their key exports/symbols
10
+ * 3. Architecture discoveries
11
+ * 4. Decisions made
12
+ * 5. What changed since files were last read
13
+ * 6. What Claude was about to do next
14
+ *
15
+ * This goes to stdout — Claude Code adds it to the post-compaction context.
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=post-compact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-compact.d.ts","sourceRoot":"","sources":["../../src/hook/post-compact.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree PostCompact Hook
4
+ *
5
+ * Fires AFTER Claude Code compacts its context window.
6
+ * Claude has lost most of its working memory. We re-inject:
7
+ *
8
+ * 1. What the user was working on (task summary)
9
+ * 2. Files read and their key exports/symbols
10
+ * 3. Architecture discoveries
11
+ * 4. Decisions made
12
+ * 5. What changed since files were last read
13
+ * 6. What Claude was about to do next
14
+ *
15
+ * This goes to stdout — Claude Code adds it to the post-compaction context.
16
+ */
17
+ import { readFileSync, existsSync } from "node:fs";
18
+ import { join, dirname } from "node:path";
19
+ import { queryIpc } from "./hook-client.js";
20
+ async function main() {
21
+ let rawInput = "";
22
+ for await (const chunk of process.stdin) {
23
+ rawInput += chunk;
24
+ }
25
+ let input;
26
+ try {
27
+ input = JSON.parse(rawInput);
28
+ }
29
+ catch {
30
+ process.exit(0);
31
+ }
32
+ const { session_id, cwd } = input;
33
+ const port = findIpcPort(cwd);
34
+ if (!port) {
35
+ process.exit(0);
36
+ }
37
+ // Get the compaction snapshot
38
+ const snapshot = await queryIpc(port, `/compaction/restore?session=${encodeURIComponent(session_id)}`, 500);
39
+ if (!snapshot || !snapshot.found) {
40
+ process.exit(0);
41
+ }
42
+ const data = snapshot.data;
43
+ const lines = [];
44
+ lines.push("╔══════════════════════════════════════════════════════════════╗");
45
+ lines.push("║ CODETREE: POST-COMPACTION CONTEXT RESTORE ║");
46
+ lines.push("║ Your context was compacted. Here's what you knew: ║");
47
+ lines.push("╚══════════════════════════════════════════════════════════════╝");
48
+ lines.push("");
49
+ // Task summary
50
+ if (data.taskSummary) {
51
+ lines.push(`## TASK: ${data.taskSummary}`);
52
+ lines.push("");
53
+ }
54
+ // User requests
55
+ const userRequests = safeParseArray(data.userRequests);
56
+ if (userRequests.length > 0) {
57
+ lines.push("## USER REQUESTS (most recent):");
58
+ for (const req of userRequests.slice(-5)) {
59
+ lines.push(`- ${req}`);
60
+ }
61
+ lines.push("");
62
+ }
63
+ // Current plan / what was being done
64
+ if (data.currentPlan) {
65
+ lines.push("## WHAT YOU WERE DOING:");
66
+ lines.push(data.currentPlan.slice(0, 500));
67
+ lines.push("");
68
+ }
69
+ // Architecture notes
70
+ const archNotes = safeParseArray(data.architectureNotes);
71
+ if (archNotes.length > 0) {
72
+ lines.push("## ARCHITECTURE DISCOVERIES:");
73
+ for (const note of archNotes) {
74
+ lines.push(`- ${note}`);
75
+ }
76
+ lines.push("");
77
+ }
78
+ // Decisions
79
+ const decisions = safeParseArray(data.decisions);
80
+ if (decisions.length > 0) {
81
+ lines.push("## DECISIONS MADE:");
82
+ for (const d of decisions) {
83
+ lines.push(`- ${d}`);
84
+ }
85
+ lines.push("");
86
+ }
87
+ // File summaries (the most token-saving part)
88
+ const fileSummaries = safeParseObject(data.fileSummaries);
89
+ const summaryKeys = Object.keys(fileSummaries);
90
+ if (summaryKeys.length > 0) {
91
+ lines.push(`## FILES YOU READ (${summaryKeys.length} files — summaries, NOT full content):`);
92
+ lines.push("(Use codetree_read if you need to re-read any file)");
93
+ lines.push("");
94
+ for (const filePath of summaryKeys.slice(0, 30)) {
95
+ lines.push(`### ${filePath}`);
96
+ lines.push(` ${fileSummaries[filePath]}`);
97
+ }
98
+ if (summaryKeys.length > 30) {
99
+ lines.push(` ... and ${summaryKeys.length - 30} more files (use codetree_memory get_context to see all)`);
100
+ }
101
+ lines.push("");
102
+ }
103
+ // Files modified
104
+ const filesModified = safeParseArray(data.filesModified);
105
+ if (filesModified.length > 0) {
106
+ lines.push("## FILES YOU MODIFIED:");
107
+ for (const f of filesModified) {
108
+ lines.push(`- ${f}`);
109
+ }
110
+ lines.push("");
111
+ }
112
+ // Symbols discovered
113
+ const symbols = safeParseArray(data.symbolsDiscovered);
114
+ if (symbols.length > 0) {
115
+ lines.push("## KEY SYMBOLS/PATTERNS FOUND:");
116
+ lines.push(symbols.join(", "));
117
+ lines.push("");
118
+ }
119
+ // Changed files since snapshot
120
+ if (data.changedSinceSnapshot?.length > 0) {
121
+ lines.push(`## ⚠ FILES CHANGED SINCE YOU LAST READ THEM (${data.changedSinceSnapshot.length}):`);
122
+ for (const f of data.changedSinceSnapshot.slice(0, 10)) {
123
+ lines.push(`- ${f.path} (${f.language}, ${f.line_count} lines)`);
124
+ }
125
+ lines.push("(These files have been modified — re-read before making assumptions)");
126
+ lines.push("");
127
+ }
128
+ // Session insights
129
+ if (data.insights?.length > 0) {
130
+ lines.push("## SAVED INSIGHTS:");
131
+ for (const insight of data.insights) {
132
+ lines.push(`- [${insight.category}] ${insight.content}`);
133
+ }
134
+ lines.push("");
135
+ }
136
+ lines.push("═══════════════════════════════════════════════════════════════");
137
+ lines.push("Continue where you left off. Use codetree_read for cached files.");
138
+ lines.push("Use codetree_memory save_insight to persist important discoveries.");
139
+ lines.push("═══════════════════════════════════════════════════════════════");
140
+ // Output to stdout — Claude Code injects this into context
141
+ process.stdout.write(lines.join("\n"));
142
+ process.exit(0);
143
+ }
144
+ function safeParseArray(val) {
145
+ if (Array.isArray(val))
146
+ return val;
147
+ if (typeof val === "string") {
148
+ try {
149
+ return JSON.parse(val);
150
+ }
151
+ catch {
152
+ return [];
153
+ }
154
+ }
155
+ return [];
156
+ }
157
+ function safeParseObject(val) {
158
+ if (typeof val === "object" && val !== null && !Array.isArray(val))
159
+ return val;
160
+ if (typeof val === "string") {
161
+ try {
162
+ return JSON.parse(val);
163
+ }
164
+ catch {
165
+ return {};
166
+ }
167
+ }
168
+ return {};
169
+ }
170
+ function findIpcPort(startDir) {
171
+ let dir = startDir;
172
+ for (let i = 0; i < 10; i++) {
173
+ const portFile = join(dir, ".codetree", "ipc.port");
174
+ if (existsSync(portFile)) {
175
+ try {
176
+ const port = parseInt(readFileSync(portFile, "utf-8").trim(), 10);
177
+ if (port > 0 && port <= 65535)
178
+ return port;
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ }
184
+ const parent = dirname(dir);
185
+ if (parent === dir)
186
+ break;
187
+ dir = parent;
188
+ }
189
+ return null;
190
+ }
191
+ main().catch(() => { process.exit(0); });
192
+ //# sourceMappingURL=post-compact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-compact.js","sourceRoot":"","sources":["../../src/hook/post-compact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree PostToolUse Hook
4
+ *
5
+ * Captures what Claude reads, writes, and searches — logs it to the session memory.
6
+ * This runs AFTER every tool call and records the activity.
7
+ *
8
+ * Exit 0 always — we never block, just observe.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=post-tool-use.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-tool-use.d.ts","sourceRoot":"","sources":["../../src/hook/post-tool-use.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree PostToolUse Hook
4
+ *
5
+ * Captures what Claude reads, writes, and searches — logs it to the session memory.
6
+ * This runs AFTER every tool call and records the activity.
7
+ *
8
+ * Exit 0 always — we never block, just observe.
9
+ */
10
+ import { readFileSync, existsSync } from "node:fs";
11
+ import { join, dirname } from "node:path";
12
+ import { queryIpc } from "./hook-client.js";
13
+ async function main() {
14
+ let rawInput = "";
15
+ for await (const chunk of process.stdin) {
16
+ rawInput += chunk;
17
+ }
18
+ let input;
19
+ try {
20
+ input = JSON.parse(rawInput);
21
+ }
22
+ catch {
23
+ process.exit(0);
24
+ }
25
+ const { tool_name, tool_input, cwd, session_id } = input;
26
+ const port = findIpcPort(cwd);
27
+ if (!port) {
28
+ process.exit(0);
29
+ }
30
+ // Log based on tool type
31
+ switch (tool_name) {
32
+ case "Read":
33
+ case "codetree_read": {
34
+ const filePath = tool_input.file_path || "";
35
+ const offset = tool_input.offset;
36
+ const limit = tool_input.limit;
37
+ if (filePath) {
38
+ await queryIpc(port, `/session/log-read?session=${encodeURIComponent(session_id)}&path=${encodeURIComponent(filePath)}&tool=${tool_name}&start=${offset || 0}&end=${limit ? (offset || 0) + limit : 0}`, 50);
39
+ }
40
+ break;
41
+ }
42
+ case "Grep":
43
+ case "codetree_search": {
44
+ const pattern = (tool_input.pattern || tool_input.query) || "";
45
+ if (pattern) {
46
+ await queryIpc(port, `/session/log-search?session=${encodeURIComponent(session_id)}&symbol=${encodeURIComponent(pattern)}`, 50);
47
+ }
48
+ break;
49
+ }
50
+ case "Edit":
51
+ case "Write": {
52
+ const filePath = tool_input.file_path || "";
53
+ if (filePath) {
54
+ await queryIpc(port, `/session/log-modify?session=${encodeURIComponent(session_id)}&path=${encodeURIComponent(filePath)}`, 50);
55
+ }
56
+ break;
57
+ }
58
+ }
59
+ process.exit(0);
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)
77
+ break;
78
+ dir = parent;
79
+ }
80
+ return null;
81
+ }
82
+ main().catch(() => {
83
+ process.exit(0);
84
+ });
85
+ //# sourceMappingURL=post-tool-use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-tool-use.js","sourceRoot":"","sources":["../../src/hook/post-tool-use.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree PreCompact Hook
4
+ *
5
+ * Fires BEFORE Claude Code compacts its context window.
6
+ * This is the critical moment — we save everything Claude knows
7
+ * so we can re-inject it after compaction.
8
+ *
9
+ * What we capture:
10
+ * 1. All files read in this session (from session_reads table)
11
+ * 2. File summaries with key symbols (from index)
12
+ * 3. Session insights (if any were saved via codetree_memory)
13
+ * 4. Transcript analysis — what the user asked for, what Claude found
14
+ *
15
+ * Exit 0 always — never block compaction.
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=pre-compact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-compact.d.ts","sourceRoot":"","sources":["../../src/hook/pre-compact.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree PreCompact Hook
4
+ *
5
+ * Fires BEFORE Claude Code compacts its context window.
6
+ * This is the critical moment — we save everything Claude knows
7
+ * so we can re-inject it after compaction.
8
+ *
9
+ * What we capture:
10
+ * 1. All files read in this session (from session_reads table)
11
+ * 2. File summaries with key symbols (from index)
12
+ * 3. Session insights (if any were saved via codetree_memory)
13
+ * 4. Transcript analysis — what the user asked for, what Claude found
14
+ *
15
+ * Exit 0 always — never block compaction.
16
+ */
17
+ import { readFileSync, existsSync } from "node:fs";
18
+ import { join, dirname } from "node:path";
19
+ import { queryIpc } from "./hook-client.js";
20
+ async function main() {
21
+ let rawInput = "";
22
+ for await (const chunk of process.stdin) {
23
+ rawInput += chunk;
24
+ }
25
+ let input;
26
+ try {
27
+ input = JSON.parse(rawInput);
28
+ }
29
+ catch {
30
+ process.exit(0);
31
+ }
32
+ const { session_id, cwd, transcript_path } = input;
33
+ const port = findIpcPort(cwd);
34
+ if (!port) {
35
+ process.exit(0);
36
+ }
37
+ // Extract context from transcript if available
38
+ let taskSummary = "";
39
+ let userRequests = [];
40
+ let currentPlan = "";
41
+ let architectureNotes = [];
42
+ let decisions = [];
43
+ if (transcript_path && existsSync(transcript_path)) {
44
+ try {
45
+ const transcript = readFileSync(transcript_path, "utf-8");
46
+ const parsed = parseTranscript(transcript);
47
+ taskSummary = parsed.taskSummary;
48
+ userRequests = parsed.userRequests;
49
+ currentPlan = parsed.currentPlan;
50
+ architectureNotes = parsed.architectureNotes;
51
+ decisions = parsed.decisions;
52
+ }
53
+ catch {
54
+ // Transcript parsing failed — continue without it
55
+ }
56
+ }
57
+ // Tell the server to save a compaction snapshot
58
+ const params = new URLSearchParams();
59
+ params.set("session", session_id);
60
+ params.set("task", taskSummary);
61
+ params.set("plan", currentPlan);
62
+ params.set("requests", JSON.stringify(userRequests));
63
+ params.set("architecture", JSON.stringify(architectureNotes));
64
+ params.set("decisions", JSON.stringify(decisions));
65
+ await queryIpc(port, `/compaction/save?${params.toString()}`, 500);
66
+ process.exit(0);
67
+ }
68
+ /**
69
+ * Parse the JSONL transcript to extract key information.
70
+ * Transcript is line-delimited JSON with role/content fields.
71
+ */
72
+ function parseTranscript(transcript) {
73
+ const lines = transcript.trim().split("\n");
74
+ const userRequests = [];
75
+ const architectureNotes = [];
76
+ const decisions = [];
77
+ let taskSummary = "";
78
+ let lastAssistantMessage = "";
79
+ for (const line of lines) {
80
+ try {
81
+ const entry = JSON.parse(line);
82
+ const role = entry.role || entry.type;
83
+ let content = "";
84
+ if (typeof entry.content === "string") {
85
+ content = entry.content;
86
+ }
87
+ else if (Array.isArray(entry.content)) {
88
+ content = entry.content
89
+ .filter((c) => c.type === "text")
90
+ .map((c) => c.text)
91
+ .join(" ");
92
+ }
93
+ else if (entry.message?.content) {
94
+ content = typeof entry.message.content === "string"
95
+ ? entry.message.content
96
+ : JSON.stringify(entry.message.content);
97
+ }
98
+ if (!content)
99
+ continue;
100
+ if (role === "user" || role === "human") {
101
+ // Capture user requests (first 200 chars each)
102
+ const trimmed = content.trim().slice(0, 200);
103
+ if (trimmed.length > 10) {
104
+ userRequests.push(trimmed);
105
+ }
106
+ // First user message is likely the main task
107
+ if (!taskSummary && trimmed.length > 10) {
108
+ taskSummary = trimmed;
109
+ }
110
+ }
111
+ if (role === "assistant") {
112
+ lastAssistantMessage = content;
113
+ // Look for architecture-related statements
114
+ const archPatterns = [
115
+ /uses?\s+(JWT|OAuth|session|cookie|token)/i,
116
+ /database\s+(schema|model|table|migration)/i,
117
+ /architecture\s+(is|uses|follows|pattern)/i,
118
+ /the\s+(api|service|module|component)\s+(handles|manages|is responsible)/i,
119
+ /important.*?(?:note|finding|discovery)/i,
120
+ ];
121
+ for (const pattern of archPatterns) {
122
+ const match = content.match(pattern);
123
+ if (match) {
124
+ // Extract the sentence containing the match
125
+ const idx = content.indexOf(match[0]);
126
+ const start = content.lastIndexOf(".", idx - 1) + 1;
127
+ const end = content.indexOf(".", idx + match[0].length);
128
+ const sentence = content.slice(start, end > 0 ? end + 1 : idx + 200).trim();
129
+ if (sentence.length > 20 && sentence.length < 300) {
130
+ architectureNotes.push(sentence);
131
+ }
132
+ }
133
+ }
134
+ // Look for decisions
135
+ const decisionPatterns = [
136
+ /I'll\s+(use|implement|create|modify|update|fix|change|add|remove)/i,
137
+ /(?:should|will|going to)\s+(refactor|split|merge|extract|move)/i,
138
+ /(?:best approach|plan is to|strategy is)/i,
139
+ ];
140
+ for (const pattern of decisionPatterns) {
141
+ const match = content.match(pattern);
142
+ if (match) {
143
+ const idx = content.indexOf(match[0]);
144
+ const start = content.lastIndexOf(".", idx - 1) + 1;
145
+ const end = content.indexOf(".", idx + match[0].length);
146
+ const sentence = content.slice(start, end > 0 ? end + 1 : idx + 200).trim();
147
+ if (sentence.length > 15 && sentence.length < 300) {
148
+ decisions.push(sentence);
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ catch {
155
+ // Skip unparseable lines
156
+ }
157
+ }
158
+ // Current plan = last assistant message's intent (first 300 chars)
159
+ const currentPlan = lastAssistantMessage.slice(0, 300);
160
+ return {
161
+ taskSummary: taskSummary.slice(0, 200),
162
+ userRequests: userRequests.slice(-10), // Last 10 requests
163
+ currentPlan,
164
+ architectureNotes: [...new Set(architectureNotes)].slice(0, 15),
165
+ decisions: [...new Set(decisions)].slice(0, 10),
166
+ };
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
+ main().catch(() => { process.exit(0); });
190
+ //# sourceMappingURL=pre-compact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-compact.js","sourceRoot":"","sources":["../../src/hook/pre-compact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree SessionStart Hook
4
+ *
5
+ * When Claude starts a new session, this hook injects:
6
+ * 1. Summary of what Claude knew from recent sessions
7
+ * 2. List of hot files (most frequently read across sessions)
8
+ * 3. What changed since the last session
9
+ * 4. Key insights/decisions from past sessions
10
+ *
11
+ * This goes to stdout (exit 0) — Claude Code adds stdout to the session context.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=session-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/hook/session-start.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}