context-eng 0.1.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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +272 -0
  3. package/dist/categories.d.ts +27 -0
  4. package/dist/categories.js +71 -0
  5. package/dist/categories.js.map +1 -0
  6. package/dist/cli-entry.d.ts +2 -0
  7. package/dist/cli-entry.js +7 -0
  8. package/dist/cli-entry.js.map +1 -0
  9. package/dist/cli.d.ts +30 -0
  10. package/dist/cli.js +327 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/db.d.ts +40 -0
  13. package/dist/db.js +158 -0
  14. package/dist/db.js.map +1 -0
  15. package/dist/engine.d.ts +149 -0
  16. package/dist/engine.js +589 -0
  17. package/dist/engine.js.map +1 -0
  18. package/dist/harness.d.ts +56 -0
  19. package/dist/harness.js +358 -0
  20. package/dist/harness.js.map +1 -0
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.js +3 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/inspect-cli.d.ts +2 -0
  25. package/dist/inspect-cli.js +96 -0
  26. package/dist/inspect-cli.js.map +1 -0
  27. package/dist/inspect.d.ts +33 -0
  28. package/dist/inspect.js +149 -0
  29. package/dist/inspect.js.map +1 -0
  30. package/dist/map.d.ts +39 -0
  31. package/dist/map.js +106 -0
  32. package/dist/map.js.map +1 -0
  33. package/dist/mcp.d.ts +5 -0
  34. package/dist/mcp.js +348 -0
  35. package/dist/mcp.js.map +1 -0
  36. package/dist/migrate.d.ts +7 -0
  37. package/dist/migrate.js +107 -0
  38. package/dist/migrate.js.map +1 -0
  39. package/dist/paths.d.ts +29 -0
  40. package/dist/paths.js +69 -0
  41. package/dist/paths.js.map +1 -0
  42. package/dist/search.d.ts +144 -0
  43. package/dist/search.js +449 -0
  44. package/dist/search.js.map +1 -0
  45. package/dist/secrets.d.ts +28 -0
  46. package/dist/secrets.js +135 -0
  47. package/dist/secrets.js.map +1 -0
  48. package/dist/text.d.ts +22 -0
  49. package/dist/text.js +153 -0
  50. package/dist/text.js.map +1 -0
  51. package/dist/tokens.d.ts +6 -0
  52. package/dist/tokens.js +15 -0
  53. package/dist/tokens.js.map +1 -0
  54. package/dist/typesafe.d.ts +40 -0
  55. package/dist/typesafe.js +170 -0
  56. package/dist/typesafe.js.map +1 -0
  57. package/package.json +51 -0
  58. package/system_prompts/AGENTS.md +14 -0
  59. package/system_prompts/CLAUDE.md +14 -0
  60. package/system_prompts/rules.md +157 -0
@@ -0,0 +1,56 @@
1
+ export declare const PACKAGE_NAME = "context-eng";
2
+ export type HarnessId = "cursor" | "claude" | "codex";
3
+ export interface McpLaunch {
4
+ command: string;
5
+ args: string[];
6
+ }
7
+ export interface HarnessHit {
8
+ id: HarnessId;
9
+ installed: boolean;
10
+ via: string;
11
+ }
12
+ export interface HarnessWrite extends HarnessHit {
13
+ file?: string;
14
+ error?: string;
15
+ skipped?: boolean;
16
+ unchanged?: boolean;
17
+ preserved?: boolean;
18
+ }
19
+ export interface HarnessChoice {
20
+ ids: HarnessId[];
21
+ cursor: number;
22
+ selected: boolean[];
23
+ }
24
+ export interface HarnessReport {
25
+ launch: McpLaunch;
26
+ harnesses: HarnessWrite[];
27
+ }
28
+ export declare function mcpLaunch(hasCommand: (name: string) => boolean): McpLaunch;
29
+ export declare function pathHasCommand(name: string): boolean;
30
+ export declare function detectHarnesses(input: {
31
+ home: string;
32
+ hasCommand: (name: string) => boolean;
33
+ exists?: (file: string) => boolean;
34
+ }): HarnessHit[];
35
+ export declare function upsertMcpJson(existing: string | null, serverName: string, server: Record<string, unknown>): string;
36
+ export declare function upsertTomlSection(existing: string, header: string, body: string[]): string;
37
+ export declare function initialHarnessChoice(ids: readonly HarnessId[]): HarnessChoice;
38
+ export declare function applyHarnessChoiceKey(choice: HarnessChoice, key: string): {
39
+ choice: HarnessChoice;
40
+ done: boolean;
41
+ };
42
+ export declare function chosenHarnessIds(choice: HarnessChoice): HarnessId[];
43
+ export declare function renderHarnessChoice(choice: HarnessChoice): string;
44
+ export declare function promptHarnessChoice(ids: readonly HarnessId[], io?: {
45
+ input?: NodeJS.ReadStream;
46
+ output?: NodeJS.WriteStream;
47
+ }): Promise<HarnessId[]>;
48
+ export declare function installDetectedHarnesses(input: {
49
+ home: string;
50
+ hasCommand: (name: string) => boolean;
51
+ exists?: (file: string) => boolean;
52
+ selected?: readonly HarnessId[];
53
+ confirmReplace?: (id: HarnessId, file: string) => Promise<boolean> | boolean;
54
+ }): Promise<HarnessReport>;
55
+ export declare function formatHarnessReport(report: HarnessReport): string;
56
+ export declare function writeConfigAtomically(file: string, content: string): void;
@@ -0,0 +1,358 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
4
+ import path from "node:path";
5
+ import { isDeepStrictEqual } from "node:util";
6
+ export const PACKAGE_NAME = "context-eng";
7
+ export function mcpLaunch(hasCommand) {
8
+ if (hasCommand("pnpm") && !hasCommand("npx")) {
9
+ return { command: "pnpm", args: ["dlx", PACKAGE_NAME, "mcp"] };
10
+ }
11
+ return { command: "npx", args: ["-y", PACKAGE_NAME, "mcp"] };
12
+ }
13
+ export function pathHasCommand(name) {
14
+ const finder = process.platform === "win32" ? "where" : "which";
15
+ try {
16
+ execFileSync(finder, [name], { stdio: "ignore" });
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ export function detectHarnesses(input) {
24
+ const exists = input.exists ?? existsSync;
25
+ const present = (rel) => exists(path.join(input.home, rel));
26
+ return [
27
+ locate("cursor", [
28
+ [input.hasCommand("cursor"), "cursor on PATH"],
29
+ [present(".cursor"), "~/.cursor"],
30
+ ]),
31
+ locate("claude", [
32
+ [input.hasCommand("claude"), "claude on PATH"],
33
+ [present(".claude"), "~/.claude"],
34
+ [present(".claude.json"), "~/.claude.json"],
35
+ ]),
36
+ locate("codex", [
37
+ [input.hasCommand("codex"), "codex on PATH"],
38
+ [present(".codex"), "~/.codex"],
39
+ ]),
40
+ ];
41
+ }
42
+ export function upsertMcpJson(existing, serverName, server) {
43
+ let root = {};
44
+ if (existing !== null && existing.trim() !== "") {
45
+ let parsed;
46
+ try {
47
+ parsed = JSON.parse(existing);
48
+ }
49
+ catch (error) {
50
+ const message = error instanceof Error ? error.message : String(error);
51
+ throw new Error(`invalid JSON (${message})`, { cause: error });
52
+ }
53
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
54
+ throw new Error("MCP config must be a JSON object");
55
+ }
56
+ root = { ...parsed };
57
+ }
58
+ const current = root.mcpServers;
59
+ const servers = typeof current === "object" && current !== null && !Array.isArray(current)
60
+ ? { ...current }
61
+ : {};
62
+ servers[serverName] = server;
63
+ root.mcpServers = servers;
64
+ return `${JSON.stringify(root, null, 2)}\n`;
65
+ }
66
+ export function upsertTomlSection(existing, header, body) {
67
+ const title = `[${header}]`;
68
+ const block = [title, ...body];
69
+ const source = existing.replace(/\s+$/, "");
70
+ if (source === "")
71
+ return `${block.join("\n")}\n`;
72
+ const lines = source.split("\n");
73
+ const section = findTomlSection(lines, title);
74
+ if (section === undefined) {
75
+ return `${source}\n\n${block.join("\n")}\n`;
76
+ }
77
+ const next = [...lines.slice(0, section.start), ...block, ...lines.slice(section.end)];
78
+ return `${next.join("\n").replace(/\n{3,}/g, "\n\n")}\n`;
79
+ }
80
+ function findTomlSection(lines, title) {
81
+ const start = lines.findIndex((line) => {
82
+ const heading = line.trim();
83
+ if (title === "[mcp_servers.context-eng]") {
84
+ return /^\[\s*mcp_servers\s*\.\s*(?:context-eng|"context-eng"|'context-eng')\s*\](?:\s*#.*)?$/.test(heading);
85
+ }
86
+ return heading === title;
87
+ });
88
+ if (start === -1)
89
+ return undefined;
90
+ let end = lines.length;
91
+ for (let index = start + 1; index < lines.length; index += 1) {
92
+ if (/^\s*\[/.test(lines[index] ?? "")) {
93
+ end = index;
94
+ break;
95
+ }
96
+ }
97
+ return { start, end };
98
+ }
99
+ export function initialHarnessChoice(ids) {
100
+ return { ids: [...ids], cursor: 0, selected: ids.map(() => true) };
101
+ }
102
+ export function applyHarnessChoiceKey(choice, key) {
103
+ if (key === "\u0003")
104
+ throw new Error("Harness prompt aborted");
105
+ if (key === "\r" || key === "\n")
106
+ return { choice, done: true };
107
+ if (key === " ") {
108
+ const selected = choice.selected.slice();
109
+ const at = choice.cursor;
110
+ selected[at] = !selected[at];
111
+ return { choice: { ...choice, selected }, done: false };
112
+ }
113
+ if (key === "\u001b[A" || key === "k") {
114
+ const cursor = choice.cursor === 0 ? choice.ids.length - 1 : choice.cursor - 1;
115
+ return { choice: { ...choice, cursor }, done: false };
116
+ }
117
+ if (key === "\u001b[B" || key === "j") {
118
+ const cursor = (choice.cursor + 1) % choice.ids.length;
119
+ return { choice: { ...choice, cursor }, done: false };
120
+ }
121
+ return { choice, done: false };
122
+ }
123
+ export function chosenHarnessIds(choice) {
124
+ return choice.ids.filter((_, index) => choice.selected[index] === true);
125
+ }
126
+ export function renderHarnessChoice(choice) {
127
+ const lines = ["Select harnesses. Space toggles, Enter confirms. All start selected."];
128
+ choice.ids.forEach((id, index) => {
129
+ const mark = choice.selected[index] === true ? "x" : " ";
130
+ const pointer = index === choice.cursor ? ">" : " ";
131
+ lines.push(`${pointer} [${mark}] ${id}`);
132
+ });
133
+ return lines.join("\n");
134
+ }
135
+ export function promptHarnessChoice(ids, io = {}) {
136
+ if (ids.length === 0)
137
+ return Promise.resolve([]);
138
+ const input = io.input ?? process.stdin;
139
+ const output = io.output ?? process.stdout;
140
+ if (!input.isTTY || typeof input.setRawMode !== "function")
141
+ return Promise.resolve([...ids]);
142
+ return new Promise((resolve, reject) => {
143
+ let choice = initialHarnessChoice(ids);
144
+ let drawn = 0;
145
+ let pending = "";
146
+ let settled = false;
147
+ const paint = () => {
148
+ const text = renderHarnessChoice(choice);
149
+ if (drawn > 0)
150
+ output.write(`\x1b[${drawn}A\x1b[J`);
151
+ output.write(`${text}\n`);
152
+ drawn = text.split("\n").length;
153
+ };
154
+ const finish = (fn) => {
155
+ if (settled)
156
+ return;
157
+ settled = true;
158
+ input.setRawMode(false);
159
+ input.pause();
160
+ input.off("data", onData);
161
+ fn();
162
+ };
163
+ const onData = (chunk) => {
164
+ pending += typeof chunk === "string" ? chunk : chunk.toString("utf8");
165
+ while (pending.length > 0) {
166
+ const key = takeKey(pending);
167
+ if (key === null)
168
+ return;
169
+ pending = pending.slice(key.length);
170
+ try {
171
+ const next = applyHarnessChoiceKey(choice, key);
172
+ choice = next.choice;
173
+ if (next.done) {
174
+ finish(() => resolve(chosenHarnessIds(choice)));
175
+ return;
176
+ }
177
+ paint();
178
+ }
179
+ catch (error) {
180
+ const aborted = error instanceof Error ? error : new Error(String(error), { cause: error });
181
+ finish(() => reject(aborted));
182
+ }
183
+ }
184
+ };
185
+ paint();
186
+ input.setRawMode(true);
187
+ input.resume();
188
+ input.on("data", onData);
189
+ });
190
+ }
191
+ export async function installDetectedHarnesses(input) {
192
+ const launch = mcpLaunch(input.hasCommand);
193
+ const exists = input.exists ?? existsSync;
194
+ const allowed = input.selected === undefined ? null : new Set(input.selected);
195
+ const harnesses = [];
196
+ for (const hit of detectHarnesses(input)) {
197
+ if (!hit.installed) {
198
+ harnesses.push(hit);
199
+ continue;
200
+ }
201
+ if (allowed !== null && !allowed.has(hit.id)) {
202
+ harnesses.push({ ...hit, skipped: true });
203
+ continue;
204
+ }
205
+ try {
206
+ const result = await writeHarness(hit.id, input.home, launch, exists, input.confirmReplace);
207
+ harnesses.push({ ...hit, ...result });
208
+ }
209
+ catch (error) {
210
+ const message = error instanceof Error ? error.message : String(error);
211
+ harnesses.push({ ...hit, error: message });
212
+ }
213
+ }
214
+ return { launch, harnesses };
215
+ }
216
+ export function formatHarnessReport(report) {
217
+ const lines = ["Harnesses"];
218
+ for (const item of report.harnesses) {
219
+ if (!item.installed) {
220
+ lines.push(` ${item.id}: not installed`);
221
+ continue;
222
+ }
223
+ if (item.skipped) {
224
+ lines.push(` ${item.id}: installed (${item.via}) - not selected`);
225
+ continue;
226
+ }
227
+ if (item.error) {
228
+ lines.push(` ${item.id}: installed (${item.via}) - ${item.error}`);
229
+ continue;
230
+ }
231
+ if (item.preserved) {
232
+ lines.push(` ${item.id}: installed (${item.via}) - kept existing setup in ${item.file}`);
233
+ continue;
234
+ }
235
+ if (item.unchanged) {
236
+ lines.push(` ${item.id}: installed (${item.via}) - already configured in ${item.file}`);
237
+ continue;
238
+ }
239
+ lines.push(` ${item.id}: installed (${item.via}) -> ${item.file}`);
240
+ }
241
+ lines.push(` server: ${report.launch.command} ${report.launch.args.join(" ")}`);
242
+ return lines.join("\n");
243
+ }
244
+ function takeKey(pending) {
245
+ if (!pending.startsWith("\u001b"))
246
+ return pending.slice(0, 1);
247
+ if (pending.length === 1)
248
+ return null;
249
+ if (pending[1] !== "[")
250
+ return pending.slice(0, 1);
251
+ if (pending.length < 3)
252
+ return null;
253
+ return pending.slice(0, 3);
254
+ }
255
+ function locate(id, checks) {
256
+ const found = checks.find(([ok]) => ok);
257
+ if (!found)
258
+ return { id, installed: false, via: "not installed" };
259
+ return { id, installed: true, via: found[1] };
260
+ }
261
+ export function writeConfigAtomically(file, content) {
262
+ mkdirSync(path.dirname(file), { recursive: true });
263
+ let isLink = false;
264
+ try {
265
+ isLink = lstatSync(file).isSymbolicLink();
266
+ }
267
+ catch (error) {
268
+ if (!isMissingFile(error))
269
+ throw error;
270
+ }
271
+ const realFile = isLink
272
+ ? realpathSync(file)
273
+ : path.join(realpathSync(path.dirname(file)), path.basename(file));
274
+ const mode = existsSync(realFile) ? statSync(realFile).mode & 0o777 : 0o600;
275
+ const temp = path.join(path.dirname(realFile), `.${path.basename(realFile)}.${randomUUID()}.tmp`);
276
+ try {
277
+ writeFileSync(temp, content, { encoding: "utf8", flag: "wx", mode });
278
+ chmodSync(temp, mode);
279
+ renameSync(temp, realFile);
280
+ }
281
+ finally {
282
+ if (existsSync(temp))
283
+ unlinkSync(temp);
284
+ }
285
+ }
286
+ function isMissingFile(error) {
287
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
288
+ }
289
+ async function writeHarness(id, home, launch, exists, confirmReplace) {
290
+ if (id === "codex")
291
+ return writeCodex(home, launch, exists, confirmReplace);
292
+ const file = id === "cursor"
293
+ ? path.join(home, ".cursor", "mcp.json")
294
+ : path.join(home, ".claude.json");
295
+ const server = id === "claude"
296
+ ? { type: "stdio", command: launch.command, args: launch.args }
297
+ : { command: launch.command, args: launch.args };
298
+ const existing = exists(file) ? readFileSync(file, "utf8") : null;
299
+ const current = existingMcpServer(existing);
300
+ if (current.found) {
301
+ if (isDeepStrictEqual(current.value, server))
302
+ return { file, unchanged: true };
303
+ if (await confirmReplace?.(id, file) !== true)
304
+ return { file, preserved: true };
305
+ }
306
+ writeConfigAtomically(file, upsertMcpJson(existing, PACKAGE_NAME, server));
307
+ return { file };
308
+ }
309
+ function existingMcpServer(existing) {
310
+ if (existing === null || existing.trim() === "")
311
+ return { found: false };
312
+ let parsed;
313
+ try {
314
+ parsed = JSON.parse(existing);
315
+ }
316
+ catch (error) {
317
+ const message = error instanceof Error ? error.message : String(error);
318
+ throw new Error(`invalid JSON (${message})`, { cause: error });
319
+ }
320
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
321
+ throw new Error("MCP config must be a JSON object");
322
+ }
323
+ const servers = parsed.mcpServers;
324
+ if (servers === undefined)
325
+ return { found: false };
326
+ if (typeof servers !== "object" || servers === null || Array.isArray(servers)) {
327
+ throw new Error("mcpServers must be a JSON object");
328
+ }
329
+ const entries = servers;
330
+ return Object.hasOwn(entries, PACKAGE_NAME)
331
+ ? { found: true, value: entries[PACKAGE_NAME] }
332
+ : { found: false };
333
+ }
334
+ async function writeCodex(home, launch, exists, confirmReplace) {
335
+ const file = path.join(home, ".codex", "config.toml");
336
+ const existing = exists(file) ? readFileSync(file, "utf8") : "";
337
+ const args = launch.args.map((arg) => JSON.stringify(arg)).join(", ");
338
+ const body = [
339
+ `command = ${JSON.stringify(launch.command)}`,
340
+ `args = [${args}]`,
341
+ ];
342
+ const lines = existing.split("\n");
343
+ const section = findTomlSection(lines, "[mcp_servers.context-eng]");
344
+ if (section !== undefined) {
345
+ const current = lines.slice(section.start + 1, section.end)
346
+ .map((line) => line.trim())
347
+ .filter((line) => line !== "" && !line.startsWith("#"));
348
+ if (current.length === body.length && body.every((line) => current.includes(line))) {
349
+ return { file, unchanged: true };
350
+ }
351
+ if (await confirmReplace?.("codex", file) !== true)
352
+ return { file, preserved: true };
353
+ }
354
+ const next = upsertTomlSection(existing, "mcp_servers.context-eng", body);
355
+ writeConfigAtomically(file, next);
356
+ return { file };
357
+ }
358
+ //# sourceMappingURL=harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../src/harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { AUTO_PROMOTE, CATEGORIES, MAX_EXHAUSTIVE_SEARCH_ROWS, MAX_EXHAUSTIVE_SEARCH_TOKENS, MAX_HITS, MAX_JEV_BATCHES, MAX_JEV_CANDIDATES, MAX_READ_TOKENS, MAX_SEARCH_CATEGORIES, MAX_TOKENS, SCOPES, STAGING, } from "./categories.js";
2
+ export type { Category, Scope } from "./categories.js";
3
+ export { Engine, EngineError } from "./engine.js";
4
+ export type { CreateInput, CreateResult, EditInput, EngineErrorCode, EngineOptions, Memory, MemoryMapResult, ListFilter, MatchMode, SearchFilters, SearchHints, SearchHit, SearchInput, SearchResult, SearchSort, TimeFilter, } from "./engine.js";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { AUTO_PROMOTE, CATEGORIES, MAX_EXHAUSTIVE_SEARCH_ROWS, MAX_EXHAUSTIVE_SEARCH_TOKENS, MAX_HITS, MAX_JEV_BATCHES, MAX_JEV_CANDIDATES, MAX_READ_TOKENS, MAX_SEARCH_CATEGORIES, MAX_TOKENS, SCOPES, STAGING, } from "./categories.js";
2
+ export { Engine, EngineError } from "./engine.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,0BAA0B,EAC1B,4BAA4B,EAC5B,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,UAAU,EACV,MAAM,EACN,OAAO,GACR,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from "node:util";
3
+ import { Engine, EngineError } from "./engine.js";
4
+ import { renderSearchInspection, runSearchInspection } from "./inspect.js";
5
+ import { loadTypeSafeApiKey } from "./secrets.js";
6
+ import { TypeSafeRelevanceEvaluator } from "./typesafe.js";
7
+ const USAGE = `Usage:
8
+ npm run inspect:search -- --project <path> --query <text> [--scope project|global|both] [--jev] [--json]
9
+ npm run inspect:search -- --project <path> --input '<SearchInput JSON>' [--jev] [--json]
10
+
11
+ Examples:
12
+ npm run inspect:search -- --project . --query "memory create rules" --scope project
13
+ npm run inspect:search -- --project . --input '{"query":"memory rules","filters":{"scope":"project"}}' --jev
14
+
15
+ The script never reads .env itself. --jev uses TYPESAFE_API_KEY when set, otherwise the OS keychain entry saved by context-eng init. TYPESAFE_API_URL still comes from the environment.
16
+ `;
17
+ async function main() {
18
+ const { values } = parseArgs({
19
+ options: {
20
+ project: { type: "string", default: "." },
21
+ query: { type: "string" },
22
+ scope: { type: "string" },
23
+ input: { type: "string" },
24
+ jev: { type: "boolean", default: false },
25
+ json: { type: "boolean", default: false },
26
+ help: { type: "boolean", short: "h", default: false },
27
+ },
28
+ strict: true,
29
+ });
30
+ if (values.help) {
31
+ process.stdout.write(USAGE);
32
+ return;
33
+ }
34
+ if (values.input !== undefined && values.query !== undefined) {
35
+ throw new Error("use either --input or --query, not both");
36
+ }
37
+ const input = values.input !== undefined
38
+ ? parseInput(values.input)
39
+ : shorthandInput(values.query, values.scope);
40
+ const engine = new Engine({ projectPath: values.project ?? "." });
41
+ try {
42
+ const jev = values.jev === true ? await loadTypeSafeApiKey() : undefined;
43
+ if (jev?.warning)
44
+ console.error(jev.warning);
45
+ const report = await runSearchInspection(engine, input, {
46
+ evaluateJev: values.jev === true,
47
+ ...(jev ? { evaluator: new TypeSafeRelevanceEvaluator({ apiKey: jev.apiKey }) } : {}),
48
+ });
49
+ process.stdout.write(values.json === true ? `${JSON.stringify(report, null, 2)}\n` : renderSearchInspection(report));
50
+ }
51
+ finally {
52
+ engine.close();
53
+ }
54
+ }
55
+ function parseInput(raw) {
56
+ let value;
57
+ try {
58
+ value = JSON.parse(raw);
59
+ }
60
+ catch (error) {
61
+ throw new Error(`--input must be valid JSON: ${error instanceof Error ? error.message : String(error)}`, {
62
+ cause: error,
63
+ });
64
+ }
65
+ if (!isSearchInput(value))
66
+ throw new Error("--input.query must be a non-empty string");
67
+ return value;
68
+ }
69
+ function isSearchInput(value) {
70
+ if (typeof value !== "object" || value === null || Array.isArray(value))
71
+ return false;
72
+ const query = value.query;
73
+ return typeof query === "string" && query.trim() !== "";
74
+ }
75
+ function shorthandInput(query, scope) {
76
+ if (query === undefined || query.trim() === "")
77
+ throw new Error("--query is required when --input is omitted");
78
+ if (scope !== undefined && !isSearchScope(scope)) {
79
+ throw new Error("--scope must be project, global, or both");
80
+ }
81
+ return {
82
+ query,
83
+ ...(scope !== undefined ? { filters: { scope } } : {}),
84
+ };
85
+ }
86
+ function isSearchScope(value) {
87
+ return value === "project" || value === "global" || value === "both";
88
+ }
89
+ main().catch((error) => {
90
+ const message = error instanceof EngineError
91
+ ? `${error.code}: ${error.message}`
92
+ : error instanceof Error ? error.message : String(error);
93
+ process.stderr.write(`${message}\n\n${USAGE}`);
94
+ process.exitCode = 1;
95
+ });
96
+ //# sourceMappingURL=inspect-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect-cli.js","sourceRoot":"","sources":["../src/inspect-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { Engine } from "./engine.js";
2
+ import type { SearchCandidate, SearchHit, SearchInput, SearchResult } from "./search.js";
3
+ import { type RelevantSearchResult, type RelevanceEvaluator } from "./typesafe.js";
4
+ export type JevDecision = "kept" | "rejected" | "budgeted_out" | "not_evaluated";
5
+ export interface SearchInspectionCandidate extends SearchCandidate {
6
+ position: number;
7
+ }
8
+ export interface SearchInspectionReport {
9
+ input: SearchInput;
10
+ result: SearchResult;
11
+ eligible: SearchHit[];
12
+ candidates: SearchInspectionCandidate[];
13
+ corrected_query?: string;
14
+ jev: {
15
+ status: "not_requested" | "unavailable" | "evaluated" | "failed";
16
+ evaluated_count: number;
17
+ decisions: Array<{
18
+ position: number;
19
+ id: string;
20
+ score?: number;
21
+ decision: JevDecision;
22
+ }>;
23
+ kept_ids: string[];
24
+ error?: string;
25
+ };
26
+ relevance?: RelevantSearchResult;
27
+ local_fallback?: SearchResult;
28
+ }
29
+ export declare function runSearchInspection(engine: Engine, input: SearchInput, options?: {
30
+ evaluateJev?: boolean;
31
+ evaluator?: RelevanceEvaluator;
32
+ }): Promise<SearchInspectionReport>;
33
+ export declare function renderSearchInspection(report: SearchInspectionReport): string;