codetree-claude 1.6.0 → 1.7.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 (52) hide show
  1. package/dist/cli.js +9 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/cloud/client.d.ts +28 -0
  4. package/dist/cloud/client.d.ts.map +1 -0
  5. package/dist/cloud/client.js +34 -0
  6. package/dist/cloud/client.js.map +1 -0
  7. package/dist/cloud/commands.d.ts +3 -0
  8. package/dist/cloud/commands.d.ts.map +1 -0
  9. package/dist/cloud/commands.js +77 -0
  10. package/dist/cloud/commands.js.map +1 -0
  11. package/dist/cloud/rework.d.ts +24 -0
  12. package/dist/cloud/rework.d.ts.map +1 -0
  13. package/dist/cloud/rework.js +87 -0
  14. package/dist/cloud/rework.js.map +1 -0
  15. package/dist/cloud/state.d.ts +15 -0
  16. package/dist/cloud/state.d.ts.map +1 -0
  17. package/dist/cloud/state.js +59 -0
  18. package/dist/cloud/state.js.map +1 -0
  19. package/dist/cloud/transcript.d.ts +19 -0
  20. package/dist/cloud/transcript.d.ts.map +1 -0
  21. package/dist/cloud/transcript.js +49 -0
  22. package/dist/cloud/transcript.js.map +1 -0
  23. package/dist/config.d.ts +90 -0
  24. package/dist/config.d.ts.map +1 -1
  25. package/dist/config.js +108 -0
  26. package/dist/config.js.map +1 -1
  27. package/dist/hook/score-prompt.d.ts +20 -0
  28. package/dist/hook/score-prompt.d.ts.map +1 -0
  29. package/dist/hook/score-prompt.js +281 -0
  30. package/dist/hook/score-prompt.js.map +1 -0
  31. package/dist/hook/stop.d.ts +11 -0
  32. package/dist/hook/stop.d.ts.map +1 -0
  33. package/dist/hook/stop.js +100 -0
  34. package/dist/hook/stop.js.map +1 -0
  35. package/dist/hook/user-prompt-submit.d.ts +10 -0
  36. package/dist/hook/user-prompt-submit.d.ts.map +1 -0
  37. package/dist/hook/user-prompt-submit.js +87 -0
  38. package/dist/hook/user-prompt-submit.js.map +1 -0
  39. package/dist/indexer/indexer.d.ts +3 -1
  40. package/dist/indexer/indexer.d.ts.map +1 -1
  41. package/dist/indexer/indexer.js +4 -1
  42. package/dist/indexer/indexer.js.map +1 -1
  43. package/dist/server/ipc.d.ts.map +1 -1
  44. package/dist/server/ipc.js +68 -6
  45. package/dist/server/ipc.js.map +1 -1
  46. package/dist/server/tools/codetree-read.d.ts.map +1 -1
  47. package/dist/server/tools/codetree-read.js +25 -4
  48. package/dist/server/tools/codetree-read.js.map +1 -1
  49. package/dist/setup/install.d.ts.map +1 -1
  50. package/dist/setup/install.js +10 -0
  51. package/dist/setup/install.js.map +1 -1
  52. package/package.json +1 -1
package/dist/config.d.ts CHANGED
@@ -60,6 +60,37 @@ declare const ConfigSchema: z.ZodObject<{
60
60
  enabled?: boolean | undefined;
61
61
  statsFile?: string | undefined;
62
62
  }>>;
63
+ cloud: z.ZodDefault<z.ZodObject<{
64
+ enabled: z.ZodDefault<z.ZodBoolean>;
65
+ apiBaseUrl: z.ZodDefault<z.ZodString>;
66
+ apiKey: z.ZodDefault<z.ZodString>;
67
+ uploadIntervalMs: z.ZodDefault<z.ZodNumber>;
68
+ batchSize: z.ZodDefault<z.ZodNumber>;
69
+ capturePrompts: z.ZodDefault<z.ZodBoolean>;
70
+ promptsDir: z.ZodDefault<z.ZodString>;
71
+ scoring: z.ZodDefault<z.ZodEnum<["server", "local"]>>;
72
+ scoringModel: z.ZodDefault<z.ZodString>;
73
+ }, "strip", z.ZodTypeAny, {
74
+ enabled: boolean;
75
+ apiBaseUrl: string;
76
+ apiKey: string;
77
+ uploadIntervalMs: number;
78
+ batchSize: number;
79
+ capturePrompts: boolean;
80
+ promptsDir: string;
81
+ scoring: "server" | "local";
82
+ scoringModel: string;
83
+ }, {
84
+ enabled?: boolean | undefined;
85
+ apiBaseUrl?: string | undefined;
86
+ apiKey?: string | undefined;
87
+ uploadIntervalMs?: number | undefined;
88
+ batchSize?: number | undefined;
89
+ capturePrompts?: boolean | undefined;
90
+ promptsDir?: string | undefined;
91
+ scoring?: "server" | "local" | undefined;
92
+ scoringModel?: string | undefined;
93
+ }>>;
63
94
  tokenSave: z.ZodDefault<z.ZodObject<{
64
95
  read: z.ZodDefault<z.ZodObject<{
65
96
  includeSymbolsByDefault: z.ZodDefault<z.ZodBoolean>;
@@ -173,6 +204,17 @@ declare const ConfigSchema: z.ZodObject<{
173
204
  enabled: boolean;
174
205
  statsFile: string;
175
206
  };
207
+ cloud: {
208
+ enabled: boolean;
209
+ apiBaseUrl: string;
210
+ apiKey: string;
211
+ uploadIntervalMs: number;
212
+ batchSize: number;
213
+ capturePrompts: boolean;
214
+ promptsDir: string;
215
+ scoring: "server" | "local";
216
+ scoringModel: string;
217
+ };
176
218
  tokenSave: {
177
219
  read: {
178
220
  includeSymbolsByDefault: boolean;
@@ -220,6 +262,17 @@ declare const ConfigSchema: z.ZodObject<{
220
262
  enabled?: boolean | undefined;
221
263
  statsFile?: string | undefined;
222
264
  } | undefined;
265
+ cloud?: {
266
+ enabled?: boolean | undefined;
267
+ apiBaseUrl?: string | undefined;
268
+ apiKey?: string | undefined;
269
+ uploadIntervalMs?: number | undefined;
270
+ batchSize?: number | undefined;
271
+ capturePrompts?: boolean | undefined;
272
+ promptsDir?: string | undefined;
273
+ scoring?: "server" | "local" | undefined;
274
+ scoringModel?: string | undefined;
275
+ } | undefined;
223
276
  tokenSave?: {
224
277
  read?: {
225
278
  includeSymbolsByDefault?: boolean | undefined;
@@ -242,6 +295,15 @@ declare const ConfigSchema: z.ZodObject<{
242
295
  } | undefined;
243
296
  }>;
244
297
  export type CodeTreeConfig = z.infer<typeof ConfigSchema>;
298
+ export declare const CLOUD_LOCAL_FILE: string;
299
+ interface LocalCloud {
300
+ apiKey?: string;
301
+ apiBaseUrl?: string;
302
+ enabled?: boolean;
303
+ scoring?: "server" | "local";
304
+ scoringModel?: string;
305
+ }
306
+ export declare function readLocalCloud(): LocalCloud;
245
307
  /**
246
308
  * Find the project root by walking up from startDir looking for config files or .git
247
309
  */
@@ -251,6 +313,34 @@ export declare function findProjectRoot(startDir: string): string;
251
313
  */
252
314
  export declare function loadConfig(projectRoot?: string): CodeTreeConfig;
253
315
  export declare function normalizePath(p: string): string;
316
+ /**
317
+ * Coerce a host-supplied path into an absolute, OS-native path string so that
318
+ * downstream `path.relative()` / `statSync()` / `readFileSync()` calls all
319
+ * agree on what file is being addressed.
320
+ *
321
+ * Why this exists (1.6.1): on Windows, Claude Code's PreToolUse hooks pass
322
+ * file paths in MSYS / Git Bash form — `/c/ElectionCaffe/foo.py` — even
323
+ * though every file in our SQLite index was keyed by the Node-resolved
324
+ * `C:/ElectionCaffe/foo.py` form. `path.relative('C:\\ElectionCaffe', '/c/ElectionCaffe/foo.py')`
325
+ * on Windows produces a sibling-walk garbage path (`..\\..\\c\\ElectionCaffe\\foo.py`),
326
+ * so `db.getFile(relPath)` returns `undefined`, `isCacheValid` returns false,
327
+ * and EVERY hook check is reported as a cache miss — even when the file is
328
+ * sitting in the LRU. This was the dominant reason `Cache Hit Rate: 0%` on
329
+ * Windows + Claude Code despite hooks firing.
330
+ *
331
+ * Cursor / Antigravity / Codex don't use the hook (they call codetree_*
332
+ * directly with whatever path the agent supplies), but the same agents
333
+ * sometimes hand us unix-style absolute paths too, so we apply the same
334
+ * normalization in the read tool.
335
+ *
336
+ * Recognized inputs:
337
+ * /c/foo/bar → C:\\foo\\bar (Windows; MSYS / Git Bash)
338
+ * /c:/foo/bar → C:\\foo\\bar (Windows; some hosts)
339
+ * C:/foo/bar → C:\\foo\\bar (already absolute Windows)
340
+ * /home/u/foo → /home/u/foo (POSIX absolute, untouched)
341
+ * relative/foo → resolved from cwd (best-effort fallback)
342
+ */
343
+ export declare function toAbsoluteOsPath(p: string): string;
254
344
  export declare const BINARY_EXTENSIONS: Set<string>;
255
345
  export declare function isBinaryExtension(ext: string): boolean;
256
346
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqDxB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAchB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAI1D;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CAyB/D;AAGD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAGD,eAAO,MAAM,iBAAiB,aAQ5B,CAAC;AAEH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyExB,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAehB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAG1D,eAAO,MAAM,gBAAgB,QAA4C,CAAC;AAE1E,UAAU,UAAU;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,cAAc,IAAI,UAAU,CAQ3C;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CA4C/D;AAGD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAiBlD;AAGD,eAAO,MAAM,iBAAiB,aAQ5B,CAAC;AAEH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD"}
package/dist/config.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { readFileSync, existsSync } from "node:fs";
2
2
  import { resolve, join, dirname } from "node:path";
3
+ import { homedir } from "node:os";
3
4
  import { z } from "zod";
4
5
  const CacheConfigSchema = z.object({
5
6
  memoryLimitMB: z.number().min(32).max(4096).default(256),
@@ -25,6 +26,25 @@ const TelemetryConfigSchema = z.object({
25
26
  enabled: z.boolean().default(true),
26
27
  statsFile: z.string().default(".codetree/stats.json"),
27
28
  });
29
+ // CodeTree cloud telemetry (the team dashboard). OFF by default — when disabled,
30
+ // CodeTree opens zero sockets and behaves exactly as before. Secrets normally come
31
+ // from ~/.codetreerc.local.json (written by `codetree login`) or env, never committed.
32
+ const CloudConfigSchema = z.object({
33
+ enabled: z.boolean().default(false),
34
+ // Production cloud by default; overridden by ~/.codetreerc.local.json (written by
35
+ // `codetree login`), the CODETREE_CLOUD_URL env var, or a local dev base URL.
36
+ apiBaseUrl: z.string().default("https://codetree.electioncaffe.ai"),
37
+ apiKey: z.string().default(""), // machine key (tl_…); usually from the local secrets file
38
+ uploadIntervalMs: z.number().min(10_000).default(300_000), // 5 min flush cadence
39
+ batchSize: z.number().min(1).max(500).default(100),
40
+ capturePrompts: z.boolean().default(true), // write prompts/ locally + upload metadata
41
+ promptsDir: z.string().default("prompts"), // local prompt folder (req 8), gitignored
42
+ // Prompt scoring location: "server" = the cloud worker calls its configured LLM (costs the
43
+ // org API $); "local" = score with THIS developer's own `claude` CLI and upload the result
44
+ // (zero server LLM cost — uses the dev's existing Claude subscription). Disclosed + opt-in.
45
+ scoring: z.enum(["server", "local"]).default("server"),
46
+ scoringModel: z.string().default("haiku"), // model for local `claude -p` scoring (fast/cheap)
47
+ });
28
48
  // Token-saving knobs for read / search / structure / session-start
29
49
  const TokenSaveConfigSchema = z.object({
30
50
  read: z.object({
@@ -59,8 +79,22 @@ const ConfigSchema = z.object({
59
79
  watch: WatchConfigSchema.default({}),
60
80
  symbols: SymbolsConfigSchema.default({}),
61
81
  telemetry: TelemetryConfigSchema.default({}),
82
+ cloud: CloudConfigSchema.default({}),
62
83
  tokenSave: TokenSaveConfigSchema,
63
84
  });
85
+ // User-level secrets for the cloud connector (kept out of the repo).
86
+ export const CLOUD_LOCAL_FILE = join(homedir(), ".codetreerc.local.json");
87
+ export function readLocalCloud() {
88
+ if (!existsSync(CLOUD_LOCAL_FILE))
89
+ return {};
90
+ try {
91
+ const raw = JSON.parse(readFileSync(CLOUD_LOCAL_FILE, "utf-8"));
92
+ return raw.cloud ?? raw ?? {};
93
+ }
94
+ catch {
95
+ return {};
96
+ }
97
+ }
64
98
  const CONFIG_FILENAMES = [".codetreerc.json", ".codetreerc", "codetree.config.json"];
65
99
  /**
66
100
  * Find the project root by walking up from startDir looking for config files or .git
@@ -111,12 +145,86 @@ export function loadConfig(projectRoot) {
111
145
  config.projectRoot = resolve(root, config.projectRoot);
112
146
  config.cache.dbPath = resolve(root, config.cache.dbPath);
113
147
  config.telemetry.statsFile = resolve(root, config.telemetry.statsFile);
148
+ // Cloud secrets: ~/.codetreerc.local.json (from `codetree login`) and env override
149
+ // the project config. Precedence: env > local file > project config.
150
+ const local = readLocalCloud();
151
+ if (local.apiBaseUrl)
152
+ config.cloud.apiBaseUrl = local.apiBaseUrl;
153
+ if (local.apiKey)
154
+ config.cloud.apiKey = local.apiKey;
155
+ if (typeof local.enabled === "boolean")
156
+ config.cloud.enabled = local.enabled;
157
+ if (local.scoring)
158
+ config.cloud.scoring = local.scoring;
159
+ if (local.scoringModel)
160
+ config.cloud.scoringModel = local.scoringModel;
161
+ if (process.env.CODETREE_SCORING_MODE === "local" || process.env.CODETREE_SCORING_MODE === "server") {
162
+ config.cloud.scoring = process.env.CODETREE_SCORING_MODE;
163
+ }
164
+ if (process.env.CODETREE_CLOUD_URL)
165
+ config.cloud.apiBaseUrl = process.env.CODETREE_CLOUD_URL;
166
+ if (process.env.CODETREE_CLOUD_API_KEY)
167
+ config.cloud.apiKey = process.env.CODETREE_CLOUD_API_KEY;
168
+ if (process.env.CODETREE_CLOUD === "1")
169
+ config.cloud.enabled = true;
170
+ if (process.env.CODETREE_CLOUD === "0")
171
+ config.cloud.enabled = false;
172
+ // Hard fail-safe: never "enabled" without a key — guarantees cloud-off behaviour by default.
173
+ if (config.cloud.enabled && !config.cloud.apiKey)
174
+ config.cloud.enabled = false;
175
+ config.cloud.promptsDir = resolve(root, config.cloud.promptsDir);
114
176
  return config;
115
177
  }
116
178
  // Normalize paths to forward slashes for cross-platform consistency
117
179
  export function normalizePath(p) {
118
180
  return p.replace(/\\/g, "/");
119
181
  }
182
+ /**
183
+ * Coerce a host-supplied path into an absolute, OS-native path string so that
184
+ * downstream `path.relative()` / `statSync()` / `readFileSync()` calls all
185
+ * agree on what file is being addressed.
186
+ *
187
+ * Why this exists (1.6.1): on Windows, Claude Code's PreToolUse hooks pass
188
+ * file paths in MSYS / Git Bash form — `/c/ElectionCaffe/foo.py` — even
189
+ * though every file in our SQLite index was keyed by the Node-resolved
190
+ * `C:/ElectionCaffe/foo.py` form. `path.relative('C:\\ElectionCaffe', '/c/ElectionCaffe/foo.py')`
191
+ * on Windows produces a sibling-walk garbage path (`..\\..\\c\\ElectionCaffe\\foo.py`),
192
+ * so `db.getFile(relPath)` returns `undefined`, `isCacheValid` returns false,
193
+ * and EVERY hook check is reported as a cache miss — even when the file is
194
+ * sitting in the LRU. This was the dominant reason `Cache Hit Rate: 0%` on
195
+ * Windows + Claude Code despite hooks firing.
196
+ *
197
+ * Cursor / Antigravity / Codex don't use the hook (they call codetree_*
198
+ * directly with whatever path the agent supplies), but the same agents
199
+ * sometimes hand us unix-style absolute paths too, so we apply the same
200
+ * normalization in the read tool.
201
+ *
202
+ * Recognized inputs:
203
+ * /c/foo/bar → C:\\foo\\bar (Windows; MSYS / Git Bash)
204
+ * /c:/foo/bar → C:\\foo\\bar (Windows; some hosts)
205
+ * C:/foo/bar → C:\\foo\\bar (already absolute Windows)
206
+ * /home/u/foo → /home/u/foo (POSIX absolute, untouched)
207
+ * relative/foo → resolved from cwd (best-effort fallback)
208
+ */
209
+ export function toAbsoluteOsPath(p) {
210
+ if (!p)
211
+ return p;
212
+ if (process.platform === "win32") {
213
+ // /c/foo/bar or /c:/foo/bar → C:\foo\bar
214
+ const msys = p.match(/^\/([A-Za-z]):?\/(.*)$/);
215
+ if (msys) {
216
+ const drive = msys[1].toUpperCase();
217
+ const rest = msys[2].replace(/\//g, "\\");
218
+ return `${drive}:\\${rest}`;
219
+ }
220
+ // C:/foo/bar → C:\foo\bar (forward slashes are valid on Windows but
221
+ // `path.relative` is happier with the native separator)
222
+ if (/^[A-Za-z]:[\/\\]/.test(p)) {
223
+ return p.replace(/\//g, "\\");
224
+ }
225
+ }
226
+ return p;
227
+ }
120
228
  // Binary file extensions to skip
121
229
  export const BINARY_EXTENSIONS = new Set([
122
230
  ".png", ".jpg", ".jpeg", ".gif", ".ico", ".bmp", ".webp", ".svg",
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACxD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC;IAChD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;CAC7D,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,kBAAkB;IACjE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACrD,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;QACrC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ;KAC7E,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC;CACtD,CAAC,CAAC;AAEH,mEAAmE;AACnE,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,uBAAuB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,4BAA4B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACvD,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAChD,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC;KAC9D,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACd,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,wBAAwB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QACpD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;KAC1D,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACd,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;KACxC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACd,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC;QACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;KACzD,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACf,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAEf,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC;QAClC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;QACnD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ;KAC3C,CAAC;IACF,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM;IAC5D,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,GAAG,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IAChC,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;IACxC,SAAS,EAAE,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,SAAS,EAAE,qBAAqB;CACjC,CAAC,CAAC;AAIH,MAAM,gBAAgB,GAAG,CAAC,kBAAkB,EAAE,aAAa,EAAE,sBAAsB,CAAC,CAAC;AAErF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpD,OAAO,IAAI,EAAE,CAAC;QACZ,wBAAwB;QACxB,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACpC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAAE,OAAO,GAAG,CAAC;QAC9C,CAAC;QACD,iBAAiB;QACjB,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAC9C,yBAAyB;QACzB,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAEtD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM,CAAC,0BAA0B;QACrD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,OAAO,QAAQ,CAAC,CAAC,uBAAuB;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,WAAoB;IAC7C,MAAM,IAAI,GAAG,WAAW,IAAI,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3D,IAAI,SAAS,GAA4B,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBAClD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChC,MAAM;YACR,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAE7C,8CAA8C;IAC9C,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,iCAAiC;AACjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IACvC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACzC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IACpD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM;IACvC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IACvD,SAAS,EAAE,KAAK,EAAE,OAAO;IACzB,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree LOCAL prompt scorer (scoring="local") — runs DETACHED from the UserPromptSubmit
4
+ * hook so it never blocks the user. It scores the prompt with the developer's OWN `claude`
5
+ * CLI (their existing subscription → ZERO server-side LLM cost), then PATCHes the score onto
6
+ * the already-captured prompt (matched by sessionId + createdAt).
7
+ *
8
+ * R3 — CONTEXT-AWARE: Claude Code maintains the whole conversation in context, so a short
9
+ * follow-up like "option 2" is perfectly clear in the session. Scoring each prompt in
10
+ * isolation unfairly punished follow-ups. We now read the session transcript (passed by the
11
+ * hook as transcript_path), feed a trimmed window of recent turns to the scorer, and judge the
12
+ * latest prompt GIVEN that conversation. Bare acks/selections are flagged `trivial` (and skip
13
+ * the LLM entirely) so they're excluded from quality + coaching.
14
+ *
15
+ * Safety: `claude` is run in a NEUTRAL cwd (os.tmpdir → no project .claude hooks / .mcp.json
16
+ * loaded) AND with CODETREE_SCORING=1 so the scoring turn can never recurse into CodeTree's
17
+ * own hooks. Fail-open: any error → do nothing (the prompt is already captured, just unscored).
18
+ */
19
+ export {};
20
+ //# sourceMappingURL=score-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-prompt.d.ts","sourceRoot":"","sources":["../../src/hook/score-prompt.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,281 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree LOCAL prompt scorer (scoring="local") — runs DETACHED from the UserPromptSubmit
4
+ * hook so it never blocks the user. It scores the prompt with the developer's OWN `claude`
5
+ * CLI (their existing subscription → ZERO server-side LLM cost), then PATCHes the score onto
6
+ * the already-captured prompt (matched by sessionId + createdAt).
7
+ *
8
+ * R3 — CONTEXT-AWARE: Claude Code maintains the whole conversation in context, so a short
9
+ * follow-up like "option 2" is perfectly clear in the session. Scoring each prompt in
10
+ * isolation unfairly punished follow-ups. We now read the session transcript (passed by the
11
+ * hook as transcript_path), feed a trimmed window of recent turns to the scorer, and judge the
12
+ * latest prompt GIVEN that conversation. Bare acks/selections are flagged `trivial` (and skip
13
+ * the LLM entirely) so they're excluded from quality + coaching.
14
+ *
15
+ * Safety: `claude` is run in a NEUTRAL cwd (os.tmpdir → no project .claude hooks / .mcp.json
16
+ * loaded) AND with CODETREE_SCORING=1 so the scoring turn can never recurse into CodeTree's
17
+ * own hooks. Fail-open: any error → do nothing (the prompt is already captured, just unscored).
18
+ */
19
+ import { readFileSync, unlinkSync, readdirSync, existsSync, appendFileSync } from "node:fs";
20
+ import { tmpdir, homedir } from "node:os";
21
+ import { join } from "node:path";
22
+ import { spawnSync } from "node:child_process";
23
+ // Lightweight debug log (set CODETREE_SCORE_DEBUG=0 to silence). Helps diagnose the
24
+ // detached scorer, whose stdout/stderr are otherwise discarded.
25
+ const LOG = join(homedir(), ".codetree-score.log");
26
+ const dbg = (m) => {
27
+ if (process.env.CODETREE_SCORE_DEBUG === "0")
28
+ return;
29
+ try {
30
+ appendFileSync(LOG, `[${new Date().toISOString()}] ${m}\n`);
31
+ }
32
+ catch { /* */ }
33
+ };
34
+ /**
35
+ * Find an invokable `claude`. Many users have NO standalone CLI — Claude Code ships as the
36
+ * VS Code/Cursor extension which bundles a native binary. Order: explicit override → newest
37
+ * bundled extension binary → bare "claude" on PATH.
38
+ */
39
+ function resolveClaude() {
40
+ if (process.env.CODETREE_CLAUDE_BIN)
41
+ return process.env.CODETREE_CLAUDE_BIN;
42
+ const exe = process.platform === "win32" ? "claude.exe" : "claude";
43
+ const roots = [".vscode/extensions", ".cursor/extensions", ".vscode-insiders/extensions", ".vscode-server/extensions"]
44
+ .map((r) => join(homedir(), ...r.split("/")));
45
+ const verOf = (d) => {
46
+ const m = d.match(/-(\d+)\.(\d+)\.(\d+)/);
47
+ return m ? Number(m[1]) * 1e6 + Number(m[2]) * 1e3 + Number(m[3]) : 0;
48
+ };
49
+ let best = "";
50
+ let bestVer = -1;
51
+ for (const root of roots) {
52
+ let dirs;
53
+ try {
54
+ dirs = readdirSync(root);
55
+ }
56
+ catch {
57
+ continue;
58
+ }
59
+ for (const d of dirs) {
60
+ if (!d.startsWith("anthropic.claude-code-"))
61
+ continue;
62
+ const p = join(root, d, "resources", "native-binary", exe);
63
+ const v = verOf(d);
64
+ if (v > bestVer && existsSync(p)) {
65
+ bestVer = v;
66
+ best = p;
67
+ }
68
+ }
69
+ }
70
+ return best || "claude";
71
+ }
72
+ // ── Conversation context ────────────────────────────────────────────────────
73
+ const MAX_TURNS = 6; // recent turns fed to the scorer
74
+ const MAX_TURN_CHARS = 500; // per-turn cap
75
+ const MAX_CONTEXT_CHARS = 3000; // total context cap (keeps the scoring turn cheap/fast)
76
+ /** Pull readable text out of a transcript message's `content` (string OR content-block array). */
77
+ function msgText(content) {
78
+ if (typeof content === "string")
79
+ return content;
80
+ if (Array.isArray(content)) {
81
+ return content
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ .filter((b) => b && b.type === "text" && typeof b.text === "string")
84
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
85
+ .map((b) => b.text)
86
+ .join("\n");
87
+ }
88
+ return "";
89
+ }
90
+ /**
91
+ * Read the last few user/assistant turns from the Claude Code transcript (JSONL), excluding the
92
+ * current prompt. Tool calls/results are skipped — only the actual dialogue is kept.
93
+ */
94
+ function readContext(transcriptPath, currentText) {
95
+ if (!transcriptPath || !existsSync(transcriptPath))
96
+ return { context: "", priorTurns: 0 };
97
+ let raw;
98
+ try {
99
+ raw = readFileSync(transcriptPath, "utf-8");
100
+ }
101
+ catch {
102
+ return { context: "", priorTurns: 0 };
103
+ }
104
+ const turns = [];
105
+ for (const line of raw.split("\n")) {
106
+ const s = line.trim();
107
+ if (!s)
108
+ continue;
109
+ try {
110
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
111
+ const o = JSON.parse(s);
112
+ const role = o?.message?.role ?? o?.role;
113
+ if (role !== "user" && role !== "assistant")
114
+ continue;
115
+ const text = msgText(o?.message?.content ?? o?.content).trim();
116
+ if (!text)
117
+ continue; // pure tool_use / tool_result turns
118
+ turns.push({ role, text });
119
+ }
120
+ catch { /* skip malformed line */ }
121
+ }
122
+ // Drop the trailing entry if it's the current prompt (it lands in the transcript before we run).
123
+ while (turns.length && turns[turns.length - 1].role === "user" && turns[turns.length - 1].text === currentText.trim()) {
124
+ turns.pop();
125
+ }
126
+ if (turns.length === 0)
127
+ return { context: "", priorTurns: 0 };
128
+ const recent = turns.slice(-MAX_TURNS);
129
+ const lines = recent.map((t) => {
130
+ const who = t.role === "assistant" ? "Assistant" : "User";
131
+ const body = t.text.length > MAX_TURN_CHARS ? t.text.slice(0, MAX_TURN_CHARS) + "…" : t.text;
132
+ return `${who}: ${body}`;
133
+ });
134
+ let context = lines.join("\n");
135
+ if (context.length > MAX_CONTEXT_CHARS)
136
+ context = "…" + context.slice(context.length - MAX_CONTEXT_CHARS);
137
+ return { context, priorTurns: recent.length };
138
+ }
139
+ /** Bare acknowledgements / selections that carry nothing to coach (only treated as trivial in-thread). */
140
+ function isTrivialAck(text) {
141
+ const t = text.trim().toLowerCase().replace(/[.!?,]+$/, "");
142
+ if (!t)
143
+ return false;
144
+ if (t.length > 40)
145
+ return false;
146
+ if (/^#?\d+\)?$/.test(t))
147
+ return true; // "2", "#3", "1)"
148
+ if (/^option\s*\d+/.test(t) || /^number\s*\d+/.test(t) || /^the\s+\w+\s+one$/.test(t))
149
+ return true;
150
+ return /^(y|n|yes+|yep|yeah|ya|no+|nope|ok(ay)?|kk|sure|thanks?|thx|ty|thank you|go|go ahead|do it|continue|proceed|next|go on|please|pls|that one|this one|sounds good|lgtm|perfect|great|cool|fine|right|correct|exactly|agreed|approved)$/.test(t);
151
+ }
152
+ const RUBRIC = `You are a senior engineer coaching a developer on how they prompt AI coding tools.
153
+ You are given the recent CONVERSATION so far (reference only — do NOT score it) and then the LATEST
154
+ prompt. Score ONLY the latest prompt, judged as the next instruction GIVEN that conversation.
155
+
156
+ Rules:
157
+ - The AI already has the whole conversation in context. If the latest prompt is a clear continuation,
158
+ do NOT penalize it for omitting context already established above.
159
+ - "context" measures ONLY context the developer should have added that is NOT already in the
160
+ conversation and NOT inferable from it.
161
+ - followUp = true if the prompt depends on / continues the conversation above.
162
+ - trivial = true if it is a bare acknowledgement or selection with nothing to coach
163
+ ("yes", "ok", "do it", "option 2", "go ahead"). If trivial: set all dims to 0, empty rewrite, no suggestions.
164
+
165
+ Return ONLY JSON, no prose, no markdown fences:
166
+ {"intent":"feature|bugfix|refactor|question|exploration|off_topic|continuation",
167
+ "followUp":true|false,"trivial":true|false,
168
+ "quality":{"score":0-100,"dims":{"clarity":0-25,"context":0-25,"specificity":0-25,"scope":0-25},"rationale":"one line on WHY this score, in context"},
169
+ "abusive":{"flag":true|false,"severity":"none|mild|severe"},
170
+ "rewrite":"a concrete improved version of THE LATEST prompt — keep their intent, add only what is genuinely missing given the conversation; one short paragraph (empty if trivial)",
171
+ "suggestions":["2-4 short actionable fixes specific to this prompt (omit if trivial)"]}
172
+ `;
173
+ function coerce(raw) {
174
+ const i = raw.indexOf("{");
175
+ const j = raw.lastIndexOf("}");
176
+ if (i < 0 || j <= i)
177
+ return null;
178
+ try {
179
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
180
+ const p = JSON.parse(raw.slice(i, j + 1));
181
+ const trivial = Boolean(p?.trivial);
182
+ return {
183
+ intent: String(p?.intent ?? "question"),
184
+ followUp: Boolean(p?.followUp),
185
+ trivial,
186
+ qualityScore: trivial ? null : Math.round(Number(p?.quality?.score ?? 0)) || 0,
187
+ qualityDims: trivial
188
+ ? null
189
+ : {
190
+ clarity: Number(p?.quality?.dims?.clarity ?? 0),
191
+ context: Number(p?.quality?.dims?.context ?? 0),
192
+ specificity: Number(p?.quality?.dims?.specificity ?? 0),
193
+ scope: Number(p?.quality?.dims?.scope ?? 0),
194
+ },
195
+ rationale: String(p?.quality?.rationale ?? ""),
196
+ abusiveFlag: Boolean(p?.abusive?.flag),
197
+ abusiveSeverity: String(p?.abusive?.severity ?? "none"),
198
+ rewrite: trivial ? "" : String(p?.rewrite ?? ""),
199
+ suggestions: trivial ? [] : Array.isArray(p?.suggestions) ? p.suggestions.map((s) => String(s)).slice(0, 5) : [],
200
+ };
201
+ }
202
+ catch {
203
+ return null;
204
+ }
205
+ }
206
+ async function postScore(q, payload) {
207
+ try {
208
+ const res = await fetch(`${q.apiBaseUrl.replace(/\/+$/, "")}/v1/prompts/score`, {
209
+ method: "POST",
210
+ headers: { "content-type": "application/json", authorization: `Bearer ${q.apiKey}` },
211
+ body: JSON.stringify({ sessionId: q.sessionId, createdAt: q.createdAt, ...payload }),
212
+ });
213
+ dbg(`posted score (trivial=${payload.trivial} followUp=${payload.followUp}) → ${res.status}`);
214
+ }
215
+ catch (e) {
216
+ dbg(`post failed: ${e.message}`);
217
+ }
218
+ }
219
+ async function main() {
220
+ const qfile = process.argv[2];
221
+ if (!qfile)
222
+ return;
223
+ let q;
224
+ try {
225
+ q = JSON.parse(readFileSync(qfile, "utf-8"));
226
+ }
227
+ catch {
228
+ return;
229
+ }
230
+ try {
231
+ unlinkSync(qfile);
232
+ }
233
+ catch { /* best-effort */ }
234
+ if (!q.text || !q.apiKey) {
235
+ dbg("no text/apiKey in queue");
236
+ return;
237
+ }
238
+ // Conversation context (so follow-ups are judged fairly).
239
+ const { context, priorTurns } = readContext(q.transcriptPath, q.text);
240
+ // Fast path: an obvious ack/selection inside an ongoing thread carries nothing to coach.
241
+ // Flag it trivial WITHOUT spending an LLM turn.
242
+ if (priorTurns > 0 && isTrivialAck(q.text)) {
243
+ dbg(`trivial ack (fast path) session=${q.sessionId}`);
244
+ await postScore(q, { intent: "continuation", followUp: true, trivial: true });
245
+ return;
246
+ }
247
+ let score = null;
248
+ try {
249
+ const claude = resolveClaude();
250
+ const useShell = process.platform === "win32" && !/[\\/]/.test(claude); // only for a bare "claude"
251
+ const userMsg = context
252
+ ? `${RUBRIC}\n=== CONVERSATION SO FAR (context only) ===\n${context}\n=== LATEST PROMPT (score this) ===\n${q.text}`
253
+ : `${RUBRIC}\n=== PROMPT (no prior context; score standalone) ===\n${q.text}`;
254
+ dbg(`scoring session=${q.sessionId} via ${claude} (model ${q.scoringModel}, ${priorTurns} ctx turns)`);
255
+ const r = spawnSync(claude, ["-p", "--model", q.scoringModel || "haiku", userMsg], {
256
+ cwd: tmpdir(), // neutral: no project .claude hooks / .mcp.json
257
+ env: { ...process.env, CODETREE_SCORING: "1" }, // guard against hook recursion
258
+ encoding: "utf-8",
259
+ timeout: 120_000,
260
+ shell: useShell,
261
+ windowsHide: true, // no flashing console window
262
+ maxBuffer: 4 * 1024 * 1024,
263
+ });
264
+ dbg(`claude status=${r.status} err=${r.error?.message ?? ""} stdoutLen=${r.stdout?.length ?? 0}`);
265
+ if (r.status === 0 && r.stdout)
266
+ score = coerce(r.stdout);
267
+ if (!score)
268
+ dbg(`could not parse score; stdout head: ${(r.stdout ?? "").slice(0, 120)}`);
269
+ }
270
+ catch (e) {
271
+ dbg(`claude spawn threw: ${e.message}`);
272
+ }
273
+ if (!score)
274
+ return; // prompt is already captured (unscored) by the hook; nothing to attach
275
+ // The model didn't see prior turns? Then it can't be a follow-up. Trust context presence.
276
+ if (priorTurns === 0)
277
+ score.followUp = false;
278
+ await postScore(q, score);
279
+ }
280
+ main().catch(() => undefined).finally(() => process.exit(0));
281
+ //# sourceMappingURL=score-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score-prompt.js","sourceRoot":"","sources":["../../src/hook/score-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CodeTree Stop Hook — cloud telemetry (OFF unless `codetree login` enabled cloud).
4
+ *
5
+ * Fires when Claude finishes a response. Parses the transcript for REAL token usage
6
+ * (message.usage) → one event per assistant turn, merges CodeTree's own savings delta
7
+ * (baseline-anchored: full-read counterfactual) as a savings event, and uploads to the
8
+ * cloud. Offline-resilient (outbox) and fail-open: any error → exit 0, never blocks Claude.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/hook/stop.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}