@iq-context/core 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 (52) hide show
  1. package/dist/capture.d.ts +5 -0
  2. package/dist/capture.js +138 -0
  3. package/dist/capture.js.map +1 -0
  4. package/dist/config.d.ts +11 -0
  5. package/dist/config.js +85 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/discovery.d.ts +1 -0
  8. package/dist/discovery.js +18 -0
  9. package/dist/discovery.js.map +1 -0
  10. package/dist/doctor.d.ts +2 -0
  11. package/dist/doctor.js +166 -0
  12. package/dist/doctor.js.map +1 -0
  13. package/dist/find.d.ts +2 -0
  14. package/dist/find.js +137 -0
  15. package/dist/find.js.map +1 -0
  16. package/dist/go.d.ts +2 -0
  17. package/dist/go.js +31 -0
  18. package/dist/go.js.map +1 -0
  19. package/dist/index.d.ts +16 -0
  20. package/dist/index.js +14 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/init.d.ts +13 -0
  23. package/dist/init.js +481 -0
  24. package/dist/init.js.map +1 -0
  25. package/dist/persistence.d.ts +6 -0
  26. package/dist/persistence.js +32 -0
  27. package/dist/persistence.js.map +1 -0
  28. package/dist/save.d.ts +2 -0
  29. package/dist/save.js +61 -0
  30. package/dist/save.js.map +1 -0
  31. package/dist/staleness.d.ts +9 -0
  32. package/dist/staleness.js +272 -0
  33. package/dist/staleness.js.map +1 -0
  34. package/dist/state.d.ts +18 -0
  35. package/dist/state.js +176 -0
  36. package/dist/state.js.map +1 -0
  37. package/dist/status.d.ts +2 -0
  38. package/dist/status.js +18 -0
  39. package/dist/status.js.map +1 -0
  40. package/dist/trackedArtifacts.d.ts +12 -0
  41. package/dist/trackedArtifacts.js +138 -0
  42. package/dist/trackedArtifacts.js.map +1 -0
  43. package/dist/types.d.ts +276 -0
  44. package/dist/types.js +2 -0
  45. package/dist/types.js.map +1 -0
  46. package/dist/workstream.d.ts +28 -0
  47. package/dist/workstream.js +119 -0
  48. package/dist/workstream.js.map +1 -0
  49. package/dist/wrap.d.ts +2 -0
  50. package/dist/wrap.js +257 -0
  51. package/dist/wrap.js.map +1 -0
  52. package/package.json +20 -0
@@ -0,0 +1,5 @@
1
+ import type { CaptureEntry, CaptureOptions, CaptureResult, CaptureScope } from "./types.js";
2
+ export declare function captureMaterial(options: CaptureOptions): CaptureResult;
3
+ export declare function listRecentCaptures(projectRoot: string, workstreamId: string, limit?: number): CaptureEntry[];
4
+ export declare function listProjectAndWorkstreamCaptures(projectRoot: string, workstreamId: string): CaptureEntry[];
5
+ export declare function getCaptureLogPath(projectRoot: string, scope: CaptureScope, workstreamId: string | null): string;
@@ -0,0 +1,138 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { resolveProjectRoot, resolveTargetWorkstream } from "./state.js";
5
+ const MAX_BODY_BYTES = 1024 * 1024;
6
+ const MAX_NOTE_BYTES = 16 * 1024;
7
+ export function captureMaterial(options) {
8
+ const projectRoot = resolveProjectRoot(options.startDir, options.projectRoot);
9
+ const scope = options.scope;
10
+ if (scope === "project" && options.workstreamId) {
11
+ throw new Error("capture --scope project cannot be combined with --workstream.");
12
+ }
13
+ const workstreamId = scope === "workstream"
14
+ ? resolveTargetWorkstream(projectRoot, options.workstreamId)
15
+ : null;
16
+ const body = preserveNonBlankBody(options.body);
17
+ const note = preserveNonBlankNote(options.note);
18
+ const files = normalizeFileReferences(projectRoot, options.files);
19
+ if (!body && files.length === 0) {
20
+ throw new Error("capture requires text, --stdin input, or at least one --file reference.");
21
+ }
22
+ validateByteLength("capture body", body, MAX_BODY_BYTES);
23
+ validateByteLength("capture note", note, MAX_NOTE_BYTES);
24
+ const capturedAt = new Date().toISOString();
25
+ const kind = options.kind ?? (body ? "note" : "reference");
26
+ const entry = {
27
+ version: 1,
28
+ id: buildCaptureId(capturedAt),
29
+ captured_at: capturedAt,
30
+ scope,
31
+ workstream_id: workstreamId,
32
+ kind,
33
+ body,
34
+ note,
35
+ files,
36
+ source: {
37
+ command: "capture",
38
+ input: options.inputSource,
39
+ },
40
+ };
41
+ const capturePath = getCaptureLogPath(projectRoot, scope, workstreamId);
42
+ appendCaptureEntry(capturePath, entry);
43
+ return {
44
+ projectRoot,
45
+ capturePath,
46
+ entry,
47
+ };
48
+ }
49
+ export function listRecentCaptures(projectRoot, workstreamId, limit = 5) {
50
+ return listProjectAndWorkstreamCaptures(projectRoot, workstreamId)
51
+ .sort((left, right) => right.captured_at.localeCompare(left.captured_at))
52
+ .slice(0, limit);
53
+ }
54
+ export function listProjectAndWorkstreamCaptures(projectRoot, workstreamId) {
55
+ const projectCaptures = readCaptureLog(getCaptureLogPath(projectRoot, "project", null));
56
+ const workstreamCaptures = readCaptureLog(getCaptureLogPath(projectRoot, "workstream", workstreamId));
57
+ return [...projectCaptures, ...workstreamCaptures];
58
+ }
59
+ export function getCaptureLogPath(projectRoot, scope, workstreamId) {
60
+ if (scope === "project") {
61
+ return path.join(projectRoot, ".iq-context", "captures.jsonl");
62
+ }
63
+ if (!workstreamId) {
64
+ throw new Error("workstream capture log requires a workstream id.");
65
+ }
66
+ return path.join(projectRoot, ".iq-context", "workstreams", workstreamId, "captures.jsonl");
67
+ }
68
+ function appendCaptureEntry(capturePath, entry) {
69
+ fs.mkdirSync(path.dirname(capturePath), { recursive: true });
70
+ fs.appendFileSync(capturePath, `${JSON.stringify(entry)}\n`, "utf8");
71
+ }
72
+ function readCaptureLog(capturePath) {
73
+ if (!fs.existsSync(capturePath)) {
74
+ return [];
75
+ }
76
+ const content = fs.readFileSync(capturePath, "utf8");
77
+ const entries = [];
78
+ for (const [index, line] of content.split(/\r?\n/).entries()) {
79
+ if (line.trim().length === 0) {
80
+ continue;
81
+ }
82
+ try {
83
+ entries.push(JSON.parse(line));
84
+ }
85
+ catch (error) {
86
+ throw new Error(`Invalid capture JSONL at ${capturePath}:${index + 1}: ${error instanceof Error ? error.message : String(error)}`);
87
+ }
88
+ }
89
+ return entries;
90
+ }
91
+ function preserveNonBlankBody(body) {
92
+ if (body === undefined) {
93
+ return null;
94
+ }
95
+ return body.trim().length > 0 ? body : null;
96
+ }
97
+ function preserveNonBlankNote(note) {
98
+ if (note === undefined) {
99
+ return null;
100
+ }
101
+ return note.trim().length > 0 ? note : null;
102
+ }
103
+ function normalizeFileReferences(projectRoot, files) {
104
+ const normalized = [];
105
+ const seen = new Set();
106
+ for (const file of files) {
107
+ const absolutePath = path.resolve(projectRoot, file);
108
+ const relativePath = path.relative(projectRoot, absolutePath);
109
+ if (relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
110
+ throw new Error(`Capture file must be inside the project root: ${file}`);
111
+ }
112
+ if (!fs.existsSync(absolutePath)) {
113
+ throw new Error(`Capture file does not exist: ${file}`);
114
+ }
115
+ if (!fs.statSync(absolutePath).isFile()) {
116
+ throw new Error(`Capture path is not a regular file: ${file}`);
117
+ }
118
+ const portablePath = relativePath.split(path.sep).join("/");
119
+ if (!seen.has(portablePath)) {
120
+ seen.add(portablePath);
121
+ normalized.push(portablePath);
122
+ }
123
+ }
124
+ return normalized;
125
+ }
126
+ function validateByteLength(label, value, maxBytes) {
127
+ if (value === null) {
128
+ return;
129
+ }
130
+ if (Buffer.byteLength(value, "utf8") > maxBytes) {
131
+ throw new Error(`${label} exceeds ${maxBytes} bytes.`);
132
+ }
133
+ }
134
+ function buildCaptureId(capturedAt) {
135
+ const compactTimestamp = capturedAt.replace(/[-:]/g, "").replace(/\.\d{3}Z$/, "Z");
136
+ return `cap_${compactTimestamp}_${crypto.randomBytes(4).toString("hex")}`;
137
+ }
138
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../src/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { BriefingMode } from "./types.js";
2
+ export interface ProjectConfig {
3
+ version: number;
4
+ project_id: string;
5
+ project_name: string;
6
+ default_briefing_mode: BriefingMode;
7
+ default_workstream: string;
8
+ tracked_artifacts: string[];
9
+ }
10
+ export declare function loadProjectConfig(projectRoot: string): ProjectConfig;
11
+ export declare function parseProjectConfigFile(configPath: string): ProjectConfig;
package/dist/config.js ADDED
@@ -0,0 +1,85 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export function loadProjectConfig(projectRoot) {
4
+ return parseProjectConfigFile(path.join(projectRoot, ".iq-context", "config.yaml"));
5
+ }
6
+ export function parseProjectConfigFile(configPath) {
7
+ if (!fs.existsSync(configPath)) {
8
+ throw new Error(`Missing iq-context config at ${configPath}.`);
9
+ }
10
+ const parsed = parseSimpleConfigYaml(fs.readFileSync(configPath, "utf8"));
11
+ const version = Number(parsed.version);
12
+ const briefingMode = parsed.default_briefing_mode;
13
+ const trackedArtifacts = parsed.tracked_artifacts;
14
+ if (version !== 1) {
15
+ throw new Error(`Invalid config version in ${configPath}: expected 1.`);
16
+ }
17
+ if (briefingMode !== "lean" && briefingMode !== "standard" && briefingMode !== "deep") {
18
+ throw new Error(`Invalid default_briefing_mode in ${configPath}: expected lean, standard, or deep.`);
19
+ }
20
+ if (!Array.isArray(trackedArtifacts) || trackedArtifacts.length === 0) {
21
+ throw new Error(`Invalid tracked_artifacts in ${configPath}: expected at least one entry.`);
22
+ }
23
+ for (const artifact of trackedArtifacts) {
24
+ if (typeof artifact !== "string" || artifact.trim().length === 0) {
25
+ throw new Error(`Invalid tracked_artifacts entry in ${configPath}: entries must be non-empty strings.`);
26
+ }
27
+ }
28
+ return {
29
+ version,
30
+ project_id: requireString(parsed.project_id, "project_id", configPath),
31
+ project_name: requireString(parsed.project_name, "project_name", configPath),
32
+ default_briefing_mode: briefingMode,
33
+ default_workstream: requireString(parsed.default_workstream, "default_workstream", configPath),
34
+ tracked_artifacts: trackedArtifacts,
35
+ };
36
+ }
37
+ function parseSimpleConfigYaml(content) {
38
+ const result = {};
39
+ let activeListKey = null;
40
+ for (const rawLine of content.split(/\r?\n/)) {
41
+ const line = rawLine.trimEnd();
42
+ if (line.trim().length === 0 || line.trimStart().startsWith("#")) {
43
+ continue;
44
+ }
45
+ const listMatch = line.match(/^ - (.+)$/);
46
+ if (listMatch && activeListKey) {
47
+ const list = result[activeListKey];
48
+ if (!Array.isArray(list)) {
49
+ result[activeListKey] = [];
50
+ }
51
+ result[activeListKey].push(unquoteScalar(listMatch[1].trim()));
52
+ continue;
53
+ }
54
+ const keyMatch = line.match(/^([A-Za-z0-9_]+):(?:\s*(.*))?$/);
55
+ if (!keyMatch) {
56
+ activeListKey = null;
57
+ continue;
58
+ }
59
+ const key = keyMatch[1];
60
+ const value = keyMatch[2] ?? "";
61
+ if (value.length === 0) {
62
+ result[key] = [];
63
+ activeListKey = key;
64
+ }
65
+ else {
66
+ result[key] = unquoteScalar(value.trim());
67
+ activeListKey = null;
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+ function unquoteScalar(value) {
73
+ if ((value.startsWith("\"") && value.endsWith("\""))
74
+ || (value.startsWith("'") && value.endsWith("'"))) {
75
+ return value.slice(1, -1);
76
+ }
77
+ return value;
78
+ }
79
+ function requireString(value, label, configPath) {
80
+ if (typeof value !== "string" || value.trim().length === 0) {
81
+ throw new Error(`Invalid ${label} in ${configPath}: expected a non-empty string.`);
82
+ }
83
+ return value;
84
+ }
85
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function discoverProjectRoot(startDir: string): string | null;
@@ -0,0 +1,18 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs";
3
+ const CONFIG_RELATIVE_PATH = path.join(".iq-context", "config.yaml");
4
+ export function discoverProjectRoot(startDir) {
5
+ let currentDir = path.resolve(startDir);
6
+ while (true) {
7
+ const configPath = path.join(currentDir, CONFIG_RELATIVE_PATH);
8
+ if (fs.existsSync(configPath)) {
9
+ return currentDir;
10
+ }
11
+ const parentDir = path.dirname(currentDir);
12
+ if (parentDir === currentDir) {
13
+ return null;
14
+ }
15
+ currentDir = parentDir;
16
+ }
17
+ }
18
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAErE,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAE/D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE3C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { DoctorOptions, DoctorResult } from "./types.js";
2
+ export declare function runDoctor(options: DoctorOptions): DoctorResult;
package/dist/doctor.js ADDED
@@ -0,0 +1,166 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { parseProjectConfigFile } from "./config.js";
4
+ import { detectTrackedArtifacts } from "./init.js";
5
+ import { getProjectPaths, listWorkstreamIds, loadFocusState, loadProjectState, resolveProjectRoot } from "./state.js";
6
+ export function runDoctor(options) {
7
+ const projectRoot = resolveProjectRoot(options.startDir, options.projectRoot);
8
+ const paths = getProjectPaths(projectRoot);
9
+ const checks = [];
10
+ checks.push(checkPathExists(paths.configPath, "config.yaml exists"));
11
+ checks.push(checkProjectConfig(paths.configPath));
12
+ checks.push(checkJsonFile(paths.projectStatePath, "project-state.json is valid JSON"));
13
+ checks.push(checkConfigMatchesProjectState(projectRoot, paths.configPath));
14
+ checks.push(checkDetectedTrackedArtifacts(projectRoot, paths.configPath));
15
+ checks.push(checkJsonFile(paths.focusStatePath, "focus-state.json is valid JSON"));
16
+ checks.push(checkPathExists(paths.workstreamsDir, "workstreams directory exists"));
17
+ checks.push(checkPathExists(path.join(projectRoot, ".iq-context", "logs"), "logs directory exists"));
18
+ checks.push(checkPathExists(path.join(projectRoot, "docs", "sessions"), "sessions directory exists"));
19
+ checks.push(checkPathExists(path.join(projectRoot, "docs", "decisions"), "decisions directory exists"));
20
+ checks.push(checkPathExists(path.join(projectRoot, "docs", "discoveries"), "discoveries directory exists"));
21
+ checks.push(checkPathExists(path.join(projectRoot, "docs", "assumptions"), "assumptions directory exists"));
22
+ checks.push(checkOptionalJsonlFile(path.join(projectRoot, ".iq-context", "captures.jsonl"), "project captures JSONL is valid"));
23
+ const workstreamIds = listWorkstreamIds(projectRoot);
24
+ if (workstreamIds.length === 0) {
25
+ checks.push(failCheck("at least one workstream exists", "No workstreams found."));
26
+ }
27
+ else {
28
+ checks.push(passCheck("at least one workstream exists"));
29
+ }
30
+ for (const workstreamId of workstreamIds) {
31
+ checks.push(checkJsonFile(path.join(projectRoot, ".iq-context", "workstreams", workstreamId, "state.json"), `workstream ${workstreamId} state is valid JSON`));
32
+ checks.push(checkJsonFile(path.join(projectRoot, ".iq-context", "workstreams", workstreamId, "resume-state.json"), `workstream ${workstreamId} resume state is valid JSON`));
33
+ checks.push(checkOptionalJsonFile(path.join(projectRoot, ".iq-context", "workstreams", workstreamId, "host-bindings.json"), `workstream ${workstreamId} host bindings are valid JSON`));
34
+ checks.push(checkOptionalJsonlFile(path.join(projectRoot, ".iq-context", "workstreams", workstreamId, "captures.jsonl"), `workstream ${workstreamId} captures JSONL is valid`));
35
+ }
36
+ try {
37
+ const focusState = loadFocusState(projectRoot);
38
+ if (workstreamIds.includes(focusState.current_workstream_id)) {
39
+ checks.push(passCheck("focus points to an existing workstream"));
40
+ }
41
+ else {
42
+ checks.push(failCheck("focus points to an existing workstream", `Focus points to missing workstream: ${focusState.current_workstream_id}`));
43
+ }
44
+ }
45
+ catch (error) {
46
+ checks.push(failCheck("focus points to an existing workstream", error instanceof Error ? error.message : String(error)));
47
+ }
48
+ return {
49
+ projectRoot,
50
+ checks,
51
+ };
52
+ }
53
+ function checkDetectedTrackedArtifacts(projectRoot, configPath) {
54
+ try {
55
+ const config = parseProjectConfigFile(configPath);
56
+ const detectedArtifacts = detectTrackedArtifacts(projectRoot);
57
+ const configuredArtifacts = new Set(config.tracked_artifacts);
58
+ const missingArtifacts = detectedArtifacts.filter((artifact) => !configuredArtifacts.has(artifact));
59
+ if (missingArtifacts.length === 0) {
60
+ return passCheck("detected tracked artifacts are configured");
61
+ }
62
+ return warnCheck("detected tracked artifacts are configured", [
63
+ "Detected tracked artifacts are not configured.",
64
+ "Missing detected tracked artifacts:",
65
+ ...missingArtifacts.map((artifact) => `- ${artifact}`),
66
+ `Add these to ${path.relative(projectRoot, configPath)} if this project should track them.`,
67
+ "This check uses exact pattern comparison; broader equivalent globs are not inferred.",
68
+ ].join("\n"));
69
+ }
70
+ catch (error) {
71
+ return failCheck("detected tracked artifacts are configured", error instanceof Error ? error.message : String(error));
72
+ }
73
+ }
74
+ function checkProjectConfig(configPath) {
75
+ try {
76
+ parseProjectConfigFile(configPath);
77
+ return passCheck("config.yaml has a valid v1 config contract");
78
+ }
79
+ catch (error) {
80
+ return failCheck("config.yaml has a valid v1 config contract", error instanceof Error ? error.message : String(error));
81
+ }
82
+ }
83
+ function checkConfigMatchesProjectState(projectRoot, configPath) {
84
+ try {
85
+ const config = parseProjectConfigFile(configPath);
86
+ const projectState = loadProjectState(projectRoot);
87
+ if (config.project_id !== projectState.project_id) {
88
+ return failCheck("config.yaml matches project-state defaults", `project_id mismatch: config has ${config.project_id}, project-state has ${projectState.project_id}.`);
89
+ }
90
+ if (config.project_name !== projectState.project_name) {
91
+ return failCheck("config.yaml matches project-state defaults", `project_name mismatch: config has ${config.project_name}, project-state has ${projectState.project_name}.`);
92
+ }
93
+ if (config.default_briefing_mode !== projectState.default_briefing_mode) {
94
+ return failCheck("config.yaml matches project-state defaults", `default_briefing_mode mismatch: config has ${config.default_briefing_mode}, project-state has ${projectState.default_briefing_mode}.`);
95
+ }
96
+ if (JSON.stringify(config.tracked_artifacts) !== JSON.stringify(projectState.tracked_artifacts)) {
97
+ return failCheck("config.yaml matches project-state defaults", "tracked_artifacts mismatch between config.yaml and project-state.json.");
98
+ }
99
+ return passCheck("config.yaml matches project-state defaults");
100
+ }
101
+ catch (error) {
102
+ return failCheck("config.yaml matches project-state defaults", error instanceof Error ? error.message : String(error));
103
+ }
104
+ }
105
+ function checkPathExists(filePath, label) {
106
+ return fs.existsSync(filePath)
107
+ ? passCheck(label)
108
+ : failCheck(label, `Missing path: ${filePath}`);
109
+ }
110
+ function checkJsonFile(filePath, label) {
111
+ if (!fs.existsSync(filePath)) {
112
+ return failCheck(label, `Missing file: ${filePath}`);
113
+ }
114
+ try {
115
+ JSON.parse(fs.readFileSync(filePath, "utf8"));
116
+ return passCheck(label);
117
+ }
118
+ catch (error) {
119
+ return failCheck(label, error instanceof Error ? error.message : String(error));
120
+ }
121
+ }
122
+ function checkOptionalJsonFile(filePath, label) {
123
+ if (!fs.existsSync(filePath)) {
124
+ return passCheck(label);
125
+ }
126
+ return checkJsonFile(filePath, label);
127
+ }
128
+ function checkOptionalJsonlFile(filePath, label) {
129
+ if (!fs.existsSync(filePath)) {
130
+ return passCheck(label);
131
+ }
132
+ const lines = fs.readFileSync(filePath, "utf8").split(/\r?\n/);
133
+ for (const [index, line] of lines.entries()) {
134
+ if (line.trim().length === 0) {
135
+ continue;
136
+ }
137
+ try {
138
+ JSON.parse(line);
139
+ }
140
+ catch (error) {
141
+ return failCheck(label, `${filePath}:${index + 1}: ${error instanceof Error ? error.message : String(error)}`);
142
+ }
143
+ }
144
+ return passCheck(label);
145
+ }
146
+ function passCheck(label) {
147
+ return {
148
+ label,
149
+ status: "pass",
150
+ };
151
+ }
152
+ function warnCheck(label, message) {
153
+ return {
154
+ label,
155
+ status: "warn",
156
+ message,
157
+ };
158
+ }
159
+ function failCheck(label, message) {
160
+ return {
161
+ label,
162
+ status: "fail",
163
+ message,
164
+ };
165
+ }
166
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
package/dist/find.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import type { FindOptions, FindResult } from "./types.js";
2
+ export declare function findInProject(options: FindOptions): FindResult;
package/dist/find.js ADDED
@@ -0,0 +1,137 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { loadProjectConfig } from "./config.js";
4
+ import { resolveProjectRoot, resolveTargetWorkstream } from "./state.js";
5
+ import { resolveTrackedArtifacts } from "./trackedArtifacts.js";
6
+ export function findInProject(options) {
7
+ const projectRoot = resolveProjectRoot(options.startDir, options.projectRoot);
8
+ const query = options.query.trim();
9
+ if (query.length === 0) {
10
+ throw new Error("find requires a non-empty query.");
11
+ }
12
+ const workstreamId = options.workstreamId
13
+ ? resolveTargetWorkstream(projectRoot, options.workstreamId)
14
+ : undefined;
15
+ const filesToSearch = collectSearchTargets(projectRoot, options.scope, workstreamId);
16
+ const lowerQuery = query.toLowerCase();
17
+ const matches = [];
18
+ for (const target of filesToSearch) {
19
+ const relativePath = path.relative(projectRoot, target.filePath);
20
+ const content = fs.readFileSync(target.filePath, "utf8");
21
+ const lines = content.split(/\r?\n/);
22
+ lines.forEach((line, index) => {
23
+ if (line.toLowerCase().includes(lowerQuery)) {
24
+ matches.push({
25
+ filePath: relativePath,
26
+ lineNumber: index + 1,
27
+ line,
28
+ sourceKind: target.sourceKind,
29
+ });
30
+ }
31
+ });
32
+ }
33
+ const limitedMatches = typeof options.limit === "number"
34
+ ? matches.slice(0, options.limit)
35
+ : matches;
36
+ return {
37
+ projectRoot,
38
+ query,
39
+ scope: options.scope,
40
+ totalMatches: matches.length,
41
+ matches: limitedMatches,
42
+ };
43
+ }
44
+ function collectSearchTargets(projectRoot, scope, workstreamId) {
45
+ const targets = [];
46
+ if (scope === "all") {
47
+ collectFiles(path.join(projectRoot, ".iq-context"), targets, isSearchableFile, classifyIqContextFile);
48
+ }
49
+ if (scope === "state") {
50
+ collectFiles(path.join(projectRoot, ".iq-context"), targets, (filePath) => {
51
+ return isSearchableFile(filePath) && !filePath.endsWith("captures.jsonl");
52
+ }, () => "state");
53
+ }
54
+ if (scope === "all" || scope === "sessions") {
55
+ collectFiles(path.join(projectRoot, "docs", "sessions"), targets, isSearchableFile, () => "session");
56
+ }
57
+ if (scope === "all" || scope === "docs") {
58
+ collectFiles(path.join(projectRoot, "docs"), targets, (filePath) => {
59
+ if (!isSearchableFile(filePath)) {
60
+ return false;
61
+ }
62
+ return !filePath.includes(`${path.sep}sessions${path.sep}`);
63
+ }, () => "doc");
64
+ collectTrackedArtifactTargets(projectRoot, targets);
65
+ }
66
+ if (scope === "captures") {
67
+ if (workstreamId) {
68
+ const capturePath = path.join(projectRoot, ".iq-context", "workstreams", workstreamId, "captures.jsonl");
69
+ if (fs.existsSync(capturePath)) {
70
+ targets.push({ filePath: capturePath, sourceKind: "capture" });
71
+ }
72
+ }
73
+ else {
74
+ collectFiles(path.join(projectRoot, ".iq-context"), targets, (filePath) => {
75
+ return filePath.endsWith("captures.jsonl");
76
+ }, () => "capture");
77
+ }
78
+ }
79
+ return uniqueTargets(targets);
80
+ }
81
+ function collectTrackedArtifactTargets(projectRoot, targets) {
82
+ try {
83
+ const config = loadProjectConfig(projectRoot);
84
+ for (const artifact of resolveTrackedArtifacts(projectRoot, config.tracked_artifacts)) {
85
+ if (isSearchableFile(artifact.absolutePath)) {
86
+ targets.push({ filePath: artifact.absolutePath, sourceKind: "artifact" });
87
+ }
88
+ }
89
+ }
90
+ catch {
91
+ // Conventional docs remain searchable while doctor reports invalid config.
92
+ }
93
+ }
94
+ function collectFiles(directoryPath, targets, predicate, classifySource) {
95
+ if (!fs.existsSync(directoryPath)) {
96
+ return;
97
+ }
98
+ for (const entry of fs.readdirSync(directoryPath, { withFileTypes: true })) {
99
+ const absolutePath = path.join(directoryPath, entry.name);
100
+ if (entry.isDirectory()) {
101
+ collectFiles(absolutePath, targets, predicate, classifySource);
102
+ continue;
103
+ }
104
+ if (predicate(absolutePath)) {
105
+ targets.push({ filePath: absolutePath, sourceKind: classifySource(absolutePath) });
106
+ }
107
+ }
108
+ }
109
+ function isSearchableFile(filePath) {
110
+ return filePath.endsWith(".md")
111
+ || filePath.endsWith(".json")
112
+ || filePath.endsWith(".yaml")
113
+ || filePath.endsWith(".yml")
114
+ || filePath.endsWith(".txt")
115
+ || filePath.endsWith(".jsonl");
116
+ }
117
+ function classifyIqContextFile(filePath) {
118
+ return filePath.endsWith("captures.jsonl") ? "capture" : "state";
119
+ }
120
+ function uniqueTargets(targets) {
121
+ const byPath = new Map();
122
+ for (const target of targets) {
123
+ if (!byPath.has(target.filePath)) {
124
+ byPath.set(target.filePath, target);
125
+ }
126
+ }
127
+ return Array.from(byPath.values()).sort((left, right) => {
128
+ if (left.filePath < right.filePath) {
129
+ return -1;
130
+ }
131
+ if (left.filePath > right.filePath) {
132
+ return 1;
133
+ }
134
+ return 0;
135
+ });
136
+ }
137
+ //# sourceMappingURL=find.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.js","sourceRoot":"","sources":["../src/find.ts"],"names":[],"mappings":"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"}
package/dist/go.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import type { GoOptions, GoResult } from "./types.js";
2
+ export declare function buildGoBriefing(options: GoOptions): GoResult;