@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.
- package/dist/capture.d.ts +5 -0
- package/dist/capture.js +138 -0
- package/dist/capture.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.js +85 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +1 -0
- package/dist/discovery.js +18 -0
- package/dist/discovery.js.map +1 -0
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.js +166 -0
- package/dist/doctor.js.map +1 -0
- package/dist/find.d.ts +2 -0
- package/dist/find.js +137 -0
- package/dist/find.js.map +1 -0
- package/dist/go.d.ts +2 -0
- package/dist/go.js +31 -0
- package/dist/go.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +13 -0
- package/dist/init.js +481 -0
- package/dist/init.js.map +1 -0
- package/dist/persistence.d.ts +6 -0
- package/dist/persistence.js +32 -0
- package/dist/persistence.js.map +1 -0
- package/dist/save.d.ts +2 -0
- package/dist/save.js +61 -0
- package/dist/save.js.map +1 -0
- package/dist/staleness.d.ts +9 -0
- package/dist/staleness.js +272 -0
- package/dist/staleness.js.map +1 -0
- package/dist/state.d.ts +18 -0
- package/dist/state.js +176 -0
- package/dist/state.js.map +1 -0
- package/dist/status.d.ts +2 -0
- package/dist/status.js +18 -0
- package/dist/status.js.map +1 -0
- package/dist/trackedArtifacts.d.ts +12 -0
- package/dist/trackedArtifacts.js +138 -0
- package/dist/trackedArtifacts.js.map +1 -0
- package/dist/types.d.ts +276 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/workstream.d.ts +28 -0
- package/dist/workstream.js +119 -0
- package/dist/workstream.js.map +1 -0
- package/dist/wrap.d.ts +2 -0
- package/dist/wrap.js +257 -0
- package/dist/wrap.js.map +1 -0
- package/package.json +20 -0
package/dist/save.d.ts
ADDED
package/dist/save.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { loadResumeState, loadWorkstreamState, resolveProjectRoot, resolveTargetWorkstream, updateFocusAfterSave, writeResumeState, writeWorkstreamState, } from "./state.js";
|
|
2
|
+
export function saveProgress(options) {
|
|
3
|
+
const projectRoot = resolveProjectRoot(options.startDir, options.projectRoot);
|
|
4
|
+
const workstreamId = resolveTargetWorkstream(projectRoot, options.workstreamId);
|
|
5
|
+
const currentWorkstreamState = loadWorkstreamState(projectRoot, workstreamId);
|
|
6
|
+
const currentResumeState = loadResumeState(projectRoot, workstreamId);
|
|
7
|
+
const timestamp = new Date().toISOString();
|
|
8
|
+
const nextWorkstreamState = {
|
|
9
|
+
...currentWorkstreamState,
|
|
10
|
+
mode: options.mode ?? currentWorkstreamState.mode,
|
|
11
|
+
status_summary: options.summary ?? currentWorkstreamState.status_summary,
|
|
12
|
+
active_files: options.files.length > 0 ? uniqueValues(options.files) : currentWorkstreamState.active_files,
|
|
13
|
+
active_artifacts: options.artifacts.length > 0
|
|
14
|
+
? uniqueValues(options.artifacts)
|
|
15
|
+
: currentWorkstreamState.active_artifacts,
|
|
16
|
+
blockers: options.blockers.length > 0 ? uniqueValues(options.blockers) : currentWorkstreamState.blockers,
|
|
17
|
+
open_questions: options.questions.length > 0 ? uniqueValues(options.questions) : currentWorkstreamState.open_questions,
|
|
18
|
+
next_actions: options.nextActions.length > 0 ? uniqueValues(options.nextActions) : currentWorkstreamState.next_actions,
|
|
19
|
+
continuation_hint: buildContinuationHint(options, currentWorkstreamState),
|
|
20
|
+
last_saved_at: timestamp,
|
|
21
|
+
updated_at: timestamp,
|
|
22
|
+
};
|
|
23
|
+
const nextResumeState = {
|
|
24
|
+
...currentResumeState,
|
|
25
|
+
remaining_tasks: options.nextActions.length > 0
|
|
26
|
+
? uniqueValues(options.nextActions)
|
|
27
|
+
: currentResumeState.remaining_tasks,
|
|
28
|
+
resume_from: buildResumeFrom(options, nextWorkstreamState, currentResumeState),
|
|
29
|
+
updated_at: timestamp,
|
|
30
|
+
};
|
|
31
|
+
writeWorkstreamState(projectRoot, nextWorkstreamState);
|
|
32
|
+
writeResumeState(projectRoot, workstreamId, nextResumeState);
|
|
33
|
+
updateFocusAfterSave(projectRoot, nextWorkstreamState, nextResumeState);
|
|
34
|
+
return {
|
|
35
|
+
projectRoot,
|
|
36
|
+
workstreamState: nextWorkstreamState,
|
|
37
|
+
resumeState: nextResumeState,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function buildContinuationHint(options, currentWorkstreamState) {
|
|
41
|
+
if (options.nextActions.length > 0) {
|
|
42
|
+
return `Next: ${options.nextActions[0]}`;
|
|
43
|
+
}
|
|
44
|
+
if (options.summary) {
|
|
45
|
+
return options.summary;
|
|
46
|
+
}
|
|
47
|
+
return currentWorkstreamState.continuation_hint;
|
|
48
|
+
}
|
|
49
|
+
function buildResumeFrom(options, workstreamState, currentResumeState) {
|
|
50
|
+
if (options.nextActions.length > 0) {
|
|
51
|
+
return `Resume with: ${options.nextActions[0]}`;
|
|
52
|
+
}
|
|
53
|
+
if (options.summary) {
|
|
54
|
+
return options.summary;
|
|
55
|
+
}
|
|
56
|
+
return currentResumeState.resume_from || workstreamState.continuation_hint;
|
|
57
|
+
}
|
|
58
|
+
function uniqueValues(values) {
|
|
59
|
+
return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean)));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=save.js.map
|
package/dist/save.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save.js","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ResolvedTrackedArtifact } from "./trackedArtifacts.js";
|
|
2
|
+
import type { FocusState, ProjectState, ResumeState, StalenessReport, WorkstreamState } from "./types.js";
|
|
3
|
+
export interface RefreshStalenessResult {
|
|
4
|
+
projectState: ProjectState;
|
|
5
|
+
focusState: FocusState;
|
|
6
|
+
staleness: StalenessReport;
|
|
7
|
+
}
|
|
8
|
+
export declare function refreshStaleness(projectRoot: string, workstreamId: string, configuredArtifacts?: ResolvedTrackedArtifact[]): RefreshStalenessResult;
|
|
9
|
+
export declare function evaluateStaleness(projectRoot: string, workstreamState: WorkstreamState, resumeState: ResumeState, configuredArtifacts?: ResolvedTrackedArtifact[]): StalenessReport;
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { execFileSync } from "node:child_process";
|
|
4
|
+
import { loadFocusState, loadProjectState, loadResumeState, loadWorkstreamState, writeFocusState, } from "./state.js";
|
|
5
|
+
import { loadProjectConfig } from "./config.js";
|
|
6
|
+
import { resolveTrackedArtifacts } from "./trackedArtifacts.js";
|
|
7
|
+
const CHANGE_GRACE_MS = 1000;
|
|
8
|
+
const NON_STALE_LIFECYCLE_STATUSES = new Set(["completed", "abandoned"]);
|
|
9
|
+
export function refreshStaleness(projectRoot, workstreamId, configuredArtifacts) {
|
|
10
|
+
const projectState = loadProjectState(projectRoot);
|
|
11
|
+
const focusState = loadFocusState(projectRoot);
|
|
12
|
+
const workstreamState = loadWorkstreamState(projectRoot, workstreamId);
|
|
13
|
+
const resumeState = loadResumeState(projectRoot, workstreamId);
|
|
14
|
+
const staleness = evaluateStaleness(projectRoot, workstreamState, resumeState, configuredArtifacts);
|
|
15
|
+
const timestamp = new Date().toISOString();
|
|
16
|
+
const nextFocusState = {
|
|
17
|
+
...focusState,
|
|
18
|
+
stale: staleness.level === "stale",
|
|
19
|
+
mismatch_flags: staleness.mismatchFlags,
|
|
20
|
+
resume_from: resumeState.resume_from || workstreamState.continuation_hint || focusState.resume_from,
|
|
21
|
+
updated_at: (focusState.stale === (staleness.level === "stale")
|
|
22
|
+
&& focusState.mismatch_flags.join("\n") === staleness.mismatchFlags.join("\n"))
|
|
23
|
+
? focusState.updated_at
|
|
24
|
+
: timestamp,
|
|
25
|
+
};
|
|
26
|
+
writeFocusState(projectRoot, nextFocusState);
|
|
27
|
+
return {
|
|
28
|
+
projectState,
|
|
29
|
+
focusState: nextFocusState,
|
|
30
|
+
staleness,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function evaluateStaleness(projectRoot, workstreamState, resumeState, configuredArtifacts) {
|
|
34
|
+
if (NON_STALE_LIFECYCLE_STATUSES.has(workstreamState.lifecycle_status)) {
|
|
35
|
+
return {
|
|
36
|
+
level: "fresh",
|
|
37
|
+
warnings: [],
|
|
38
|
+
warningDetails: [],
|
|
39
|
+
mismatchFlags: [],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const missingWarnings = findMissingTrackedPaths(projectRoot, workstreamState);
|
|
43
|
+
const changedWarnings = findChangedTrackedPaths(projectRoot, workstreamState);
|
|
44
|
+
const trackedArtifactWarnings = findChangedConfiguredArtifacts(projectRoot, workstreamState, new Set(changedWarnings.flatMap((warning) => warning.path ? [warning.path] : [])), configuredArtifacts);
|
|
45
|
+
const mismatchWarnings = findMismatchWarnings(projectRoot, workstreamState);
|
|
46
|
+
const resumeWarnings = findStaleResumeWarnings(workstreamState, resumeState);
|
|
47
|
+
const warningDetails = [
|
|
48
|
+
...missingWarnings,
|
|
49
|
+
...changedWarnings,
|
|
50
|
+
...trackedArtifactWarnings,
|
|
51
|
+
...mismatchWarnings,
|
|
52
|
+
...resumeWarnings,
|
|
53
|
+
];
|
|
54
|
+
const warnings = warningDetails
|
|
55
|
+
.filter((warning) => warning.reason !== "mismatch")
|
|
56
|
+
.map((warning) => warning.message);
|
|
57
|
+
const mismatchFlags = mismatchWarnings.map((warning) => warning.message);
|
|
58
|
+
return {
|
|
59
|
+
level: missingWarnings.length > 0 || mismatchWarnings.length > 0 || resumeWarnings.length > 0
|
|
60
|
+
? "stale"
|
|
61
|
+
: changedWarnings.length > 0 || trackedArtifactWarnings.length > 0
|
|
62
|
+
? "warning"
|
|
63
|
+
: "fresh",
|
|
64
|
+
warnings,
|
|
65
|
+
warningDetails,
|
|
66
|
+
mismatchFlags,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function findChangedConfiguredArtifacts(projectRoot, workstreamState, workstreamChangedPaths, configuredArtifacts) {
|
|
70
|
+
const checkpointTime = latestCheckpointTime(workstreamState);
|
|
71
|
+
if (!checkpointTime) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
let artifacts = configuredArtifacts;
|
|
75
|
+
if (!artifacts) {
|
|
76
|
+
let patterns;
|
|
77
|
+
try {
|
|
78
|
+
patterns = loadProjectConfig(projectRoot).tracked_artifacts;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Staleness stays available while doctor reports invalid project configuration.
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
artifacts = resolveTrackedArtifacts(projectRoot, patterns);
|
|
85
|
+
}
|
|
86
|
+
return artifacts.flatMap((artifact) => {
|
|
87
|
+
if (workstreamChangedPaths.has(artifact.relativePath)) {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
if (fs.statSync(artifact.absolutePath).mtimeMs <= checkpointTime.getTime() + CHANGE_GRACE_MS) {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
return [{
|
|
95
|
+
message: `Tracked artifact changed after the last checkpoint: ${artifact.relativePath}`,
|
|
96
|
+
scope: "project",
|
|
97
|
+
sourceKind: "tracked_artifact",
|
|
98
|
+
reason: "changed_after_checkpoint",
|
|
99
|
+
path: artifact.relativePath,
|
|
100
|
+
}];
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// The artifact may disappear between resolution and stat while files are being rewritten.
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function findStaleResumeWarnings(workstreamState, resumeState) {
|
|
109
|
+
const warnings = [];
|
|
110
|
+
const completedTasks = new Set(resumeState.completed_tasks.map(normalizeComparableText));
|
|
111
|
+
const completedWaves = new Set(resumeState.completed_waves.map(normalizeComparableText));
|
|
112
|
+
for (const remainingTask of resumeState.remaining_tasks) {
|
|
113
|
+
if (completedTasks.has(normalizeComparableText(remainingTask))) {
|
|
114
|
+
warnings.push({
|
|
115
|
+
message: `Resume state still lists a completed task as remaining: ${remainingTask}`,
|
|
116
|
+
scope: "workstream",
|
|
117
|
+
sourceKind: "resume_state",
|
|
118
|
+
reason: "superseded",
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (resumeState.next_wave && completedWaves.has(normalizeComparableText(resumeState.next_wave))) {
|
|
123
|
+
warnings.push({
|
|
124
|
+
message: `Resume state still points at a completed wave: ${resumeState.next_wave}`,
|
|
125
|
+
scope: "workstream",
|
|
126
|
+
sourceKind: "resume_state",
|
|
127
|
+
reason: "superseded",
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
const completedTaskInResumeText = resumeState.completed_tasks.find((task) => {
|
|
131
|
+
const normalizedTask = normalizeComparableText(task);
|
|
132
|
+
return normalizedTask.length > 0 && normalizeComparableText(resumeState.resume_from).includes(normalizedTask);
|
|
133
|
+
});
|
|
134
|
+
if (completedTaskInResumeText) {
|
|
135
|
+
warnings.push({
|
|
136
|
+
message: `Continuation text still points at a completed task: ${completedTaskInResumeText}`,
|
|
137
|
+
scope: "workstream",
|
|
138
|
+
sourceKind: "continuation",
|
|
139
|
+
reason: "superseded",
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
const completedTaskInWorkstreamHint = resumeState.completed_tasks.find((task) => {
|
|
143
|
+
const normalizedTask = normalizeComparableText(task);
|
|
144
|
+
return normalizedTask.length > 0 && normalizeComparableText(workstreamState.continuation_hint).includes(normalizedTask);
|
|
145
|
+
});
|
|
146
|
+
// Avoid duplicate continuation warnings when resume_from and continuation_hint mirror the same stale task.
|
|
147
|
+
if (completedTaskInWorkstreamHint && completedTaskInWorkstreamHint !== completedTaskInResumeText) {
|
|
148
|
+
warnings.push({
|
|
149
|
+
message: `Workstream continuation still points at a completed task: ${completedTaskInWorkstreamHint}`,
|
|
150
|
+
scope: "workstream",
|
|
151
|
+
sourceKind: "continuation",
|
|
152
|
+
reason: "superseded",
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return dedupeWarnings(warnings);
|
|
156
|
+
}
|
|
157
|
+
function normalizeComparableText(value) {
|
|
158
|
+
return value.trim().toLowerCase().replace(/\s+/g, " ");
|
|
159
|
+
}
|
|
160
|
+
function dedupeWarnings(warnings) {
|
|
161
|
+
const seen = new Set();
|
|
162
|
+
return warnings.filter((warning) => {
|
|
163
|
+
const key = `${warning.scope}:${warning.sourceKind}:${warning.reason}:${warning.message}`;
|
|
164
|
+
if (seen.has(key)) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
seen.add(key);
|
|
168
|
+
return true;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function findMissingTrackedPaths(projectRoot, workstreamState) {
|
|
172
|
+
const warnings = [];
|
|
173
|
+
for (const reference of trackedPathReferences(workstreamState)) {
|
|
174
|
+
if (!fs.existsSync(path.join(projectRoot, reference.filePath))) {
|
|
175
|
+
warnings.push({
|
|
176
|
+
message: `${reference.label} is missing: ${reference.filePath}`,
|
|
177
|
+
scope: "workstream",
|
|
178
|
+
sourceKind: reference.sourceKind,
|
|
179
|
+
reason: "missing",
|
|
180
|
+
path: reference.filePath,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return warnings;
|
|
185
|
+
}
|
|
186
|
+
function findChangedTrackedPaths(projectRoot, workstreamState) {
|
|
187
|
+
const checkpointTime = latestCheckpointTime(workstreamState);
|
|
188
|
+
if (!checkpointTime) {
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
const warnings = [];
|
|
192
|
+
for (const reference of trackedPathReferences(workstreamState)) {
|
|
193
|
+
const absolutePath = path.join(projectRoot, reference.filePath);
|
|
194
|
+
if (!fs.existsSync(absolutePath)) {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
const stats = fs.statSync(absolutePath);
|
|
198
|
+
if (stats.isFile() && stats.mtimeMs > checkpointTime.getTime() + CHANGE_GRACE_MS) {
|
|
199
|
+
warnings.push({
|
|
200
|
+
message: `${reference.label} changed after the last checkpoint: ${reference.filePath}`,
|
|
201
|
+
scope: "workstream",
|
|
202
|
+
sourceKind: reference.sourceKind,
|
|
203
|
+
reason: "changed_after_checkpoint",
|
|
204
|
+
path: reference.filePath,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return warnings;
|
|
209
|
+
}
|
|
210
|
+
function findMismatchWarnings(projectRoot, workstreamState) {
|
|
211
|
+
const currentBranch = detectGitBranch(projectRoot);
|
|
212
|
+
if (!currentBranch || !workstreamState.branch || currentBranch === workstreamState.branch) {
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
return [{
|
|
216
|
+
message: `Current branch '${currentBranch}' differs from workstream branch '${workstreamState.branch}'.`,
|
|
217
|
+
scope: "focus",
|
|
218
|
+
sourceKind: "branch",
|
|
219
|
+
reason: "mismatch",
|
|
220
|
+
}];
|
|
221
|
+
}
|
|
222
|
+
function trackedPathReferences(workstreamState) {
|
|
223
|
+
const references = [];
|
|
224
|
+
if (workstreamState.active_plan) {
|
|
225
|
+
references.push({ label: "Active plan", sourceKind: "active_plan", filePath: workstreamState.active_plan });
|
|
226
|
+
}
|
|
227
|
+
for (const filePath of workstreamState.active_files) {
|
|
228
|
+
references.push({ label: "Active file", sourceKind: "active_file", filePath });
|
|
229
|
+
}
|
|
230
|
+
for (const filePath of workstreamState.active_artifacts) {
|
|
231
|
+
references.push({ label: "Active artifact", sourceKind: "active_artifact", filePath });
|
|
232
|
+
}
|
|
233
|
+
return uniqueReferences(references);
|
|
234
|
+
}
|
|
235
|
+
function latestCheckpointTime(workstreamState) {
|
|
236
|
+
const timestamps = [
|
|
237
|
+
workstreamState.last_saved_at,
|
|
238
|
+
workstreamState.last_wrapped_at,
|
|
239
|
+
]
|
|
240
|
+
.filter((value) => Boolean(value))
|
|
241
|
+
.map((value) => new Date(value))
|
|
242
|
+
.filter((value) => !Number.isNaN(value.getTime()));
|
|
243
|
+
if (timestamps.length === 0) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
return new Date(Math.max(...timestamps.map((value) => value.getTime())));
|
|
247
|
+
}
|
|
248
|
+
function uniqueReferences(references) {
|
|
249
|
+
const seen = new Set();
|
|
250
|
+
return references.filter((reference) => {
|
|
251
|
+
const key = `${reference.label}:${reference.filePath}`;
|
|
252
|
+
if (seen.has(key)) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
seen.add(key);
|
|
256
|
+
return true;
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
function detectGitBranch(projectRoot) {
|
|
260
|
+
try {
|
|
261
|
+
const branch = execFileSync("git", ["branch", "--show-current"], {
|
|
262
|
+
cwd: projectRoot,
|
|
263
|
+
encoding: "utf8",
|
|
264
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
265
|
+
}).trim();
|
|
266
|
+
return branch.length > 0 ? branch : null;
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=staleness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"staleness.js","sourceRoot":"","sources":["../src/staleness.ts"],"names":[],"mappings":"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"}
|
package/dist/state.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FocusState, ProjectPaths, ProjectState, ResumeState, WorkstreamState } from "./types.js";
|
|
2
|
+
export declare function resolveProjectRoot(startDir: string, explicitProjectRoot?: string): string;
|
|
3
|
+
export declare function getProjectPaths(projectRoot: string): ProjectPaths;
|
|
4
|
+
export declare function loadProjectState(projectRoot: string): ProjectState;
|
|
5
|
+
export declare function writeProjectState(projectRoot: string, projectState: ProjectState): void;
|
|
6
|
+
export declare function loadFocusState(projectRoot: string): FocusState;
|
|
7
|
+
export declare function listWorkstreamIds(projectRoot: string): string[];
|
|
8
|
+
export declare function loadWorkstreamState(projectRoot: string, workstreamId: string): WorkstreamState;
|
|
9
|
+
export declare function loadResumeState(projectRoot: string, workstreamId: string): ResumeState;
|
|
10
|
+
export declare function writeFocusState(projectRoot: string, focusState: FocusState): void;
|
|
11
|
+
export declare function writeWorkstreamState(projectRoot: string, workstreamState: WorkstreamState): void;
|
|
12
|
+
export declare function writeResumeState(projectRoot: string, workstreamId: string, resumeState: ResumeState): void;
|
|
13
|
+
export declare function writeCurrentWorkstreamPointer(projectRoot: string, workstreamId: string): void;
|
|
14
|
+
export declare function resolveTargetWorkstream(projectRoot: string, explicitWorkstreamId?: string): string;
|
|
15
|
+
export declare function updateFocusAfterGo(projectRoot: string, workstreamState: WorkstreamState, resumeState: ResumeState): void;
|
|
16
|
+
export declare function updateFocusAfterSave(projectRoot: string, workstreamState: WorkstreamState, resumeState: ResumeState): void;
|
|
17
|
+
export declare function updateFocusAfterWrap(projectRoot: string, workstreamState: WorkstreamState, resumeState: ResumeState): void;
|
|
18
|
+
export declare function switchFocusToWorkstream(projectRoot: string, workstreamState: WorkstreamState, resumeState: ResumeState): void;
|
package/dist/state.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { discoverProjectRoot } from "./discovery.js";
|
|
4
|
+
import { writeJsonFileAtomic, writeTextFileAtomic } from "./persistence.js";
|
|
5
|
+
const LIVE_WORKSTREAM_STATUSES = new Set(["active", "paused", "blocked"]);
|
|
6
|
+
export function resolveProjectRoot(startDir, explicitProjectRoot) {
|
|
7
|
+
const projectRoot = explicitProjectRoot
|
|
8
|
+
? path.resolve(explicitProjectRoot)
|
|
9
|
+
: discoverProjectRoot(startDir);
|
|
10
|
+
if (!projectRoot) {
|
|
11
|
+
throw new Error("No iq-context project found. Run iq-context init first.");
|
|
12
|
+
}
|
|
13
|
+
const configPath = path.join(projectRoot, ".iq-context", "config.yaml");
|
|
14
|
+
if (!fs.existsSync(configPath)) {
|
|
15
|
+
throw new Error(`Missing iq-context config at ${configPath}.`);
|
|
16
|
+
}
|
|
17
|
+
return projectRoot;
|
|
18
|
+
}
|
|
19
|
+
export function getProjectPaths(projectRoot) {
|
|
20
|
+
return {
|
|
21
|
+
projectRoot,
|
|
22
|
+
configPath: path.join(projectRoot, ".iq-context", "config.yaml"),
|
|
23
|
+
projectStatePath: path.join(projectRoot, ".iq-context", "project-state.json"),
|
|
24
|
+
focusStatePath: path.join(projectRoot, ".iq-context", "focus-state.json"),
|
|
25
|
+
workstreamsDir: path.join(projectRoot, ".iq-context", "workstreams"),
|
|
26
|
+
currentWorkstreamPath: path.join(projectRoot, ".iq-context", "workstreams", "current.txt"),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function loadProjectState(projectRoot) {
|
|
30
|
+
const paths = getProjectPaths(projectRoot);
|
|
31
|
+
return readJsonFile(paths.projectStatePath);
|
|
32
|
+
}
|
|
33
|
+
export function writeProjectState(projectRoot, projectState) {
|
|
34
|
+
const paths = getProjectPaths(projectRoot);
|
|
35
|
+
writeJsonFile(paths.projectStatePath, projectState);
|
|
36
|
+
}
|
|
37
|
+
export function loadFocusState(projectRoot) {
|
|
38
|
+
const paths = getProjectPaths(projectRoot);
|
|
39
|
+
return readJsonFile(paths.focusStatePath);
|
|
40
|
+
}
|
|
41
|
+
export function listWorkstreamIds(projectRoot) {
|
|
42
|
+
const paths = getProjectPaths(projectRoot);
|
|
43
|
+
if (!fs.existsSync(paths.workstreamsDir)) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
return fs.readdirSync(paths.workstreamsDir, { withFileTypes: true })
|
|
47
|
+
.filter((entry) => entry.isDirectory())
|
|
48
|
+
.map((entry) => entry.name)
|
|
49
|
+
.sort();
|
|
50
|
+
}
|
|
51
|
+
export function loadWorkstreamState(projectRoot, workstreamId) {
|
|
52
|
+
return readJsonFile(path.join(projectRoot, ".iq-context", "workstreams", workstreamId, "state.json"));
|
|
53
|
+
}
|
|
54
|
+
export function loadResumeState(projectRoot, workstreamId) {
|
|
55
|
+
return readJsonFile(path.join(projectRoot, ".iq-context", "workstreams", workstreamId, "resume-state.json"));
|
|
56
|
+
}
|
|
57
|
+
export function writeFocusState(projectRoot, focusState) {
|
|
58
|
+
const paths = getProjectPaths(projectRoot);
|
|
59
|
+
writeJsonFile(paths.focusStatePath, focusState);
|
|
60
|
+
}
|
|
61
|
+
export function writeWorkstreamState(projectRoot, workstreamState) {
|
|
62
|
+
writeJsonFile(path.join(projectRoot, ".iq-context", "workstreams", workstreamState.workstream_id, "state.json"), workstreamState);
|
|
63
|
+
}
|
|
64
|
+
export function writeResumeState(projectRoot, workstreamId, resumeState) {
|
|
65
|
+
writeJsonFile(path.join(projectRoot, ".iq-context", "workstreams", workstreamId, "resume-state.json"), resumeState);
|
|
66
|
+
}
|
|
67
|
+
export function writeCurrentWorkstreamPointer(projectRoot, workstreamId) {
|
|
68
|
+
const paths = getProjectPaths(projectRoot);
|
|
69
|
+
writeTextFileAtomic(paths.currentWorkstreamPath, `${workstreamId}\n`);
|
|
70
|
+
}
|
|
71
|
+
export function resolveTargetWorkstream(projectRoot, explicitWorkstreamId) {
|
|
72
|
+
const paths = getProjectPaths(projectRoot);
|
|
73
|
+
if (explicitWorkstreamId) {
|
|
74
|
+
ensureWorkstreamExists(projectRoot, explicitWorkstreamId);
|
|
75
|
+
return explicitWorkstreamId;
|
|
76
|
+
}
|
|
77
|
+
const focusState = loadFocusState(projectRoot);
|
|
78
|
+
if (focusState.current_workstream_id && isLiveWorkstream(projectRoot, focusState.current_workstream_id)) {
|
|
79
|
+
return focusState.current_workstream_id;
|
|
80
|
+
}
|
|
81
|
+
const currentPointer = readCurrentWorkstreamPointer(paths.currentWorkstreamPath);
|
|
82
|
+
if (currentPointer && isLiveWorkstream(projectRoot, currentPointer)) {
|
|
83
|
+
return currentPointer;
|
|
84
|
+
}
|
|
85
|
+
const liveWorkstreams = listWorkstreamIds(projectRoot)
|
|
86
|
+
.filter((workstreamId) => isLiveWorkstream(projectRoot, workstreamId));
|
|
87
|
+
if (liveWorkstreams.length === 1) {
|
|
88
|
+
return liveWorkstreams[0];
|
|
89
|
+
}
|
|
90
|
+
if (liveWorkstreams.length > 1) {
|
|
91
|
+
throw new Error(`Multiple live workstreams found (${liveWorkstreams.join(", ")}). Re-run with --workstream <id>.`);
|
|
92
|
+
}
|
|
93
|
+
const workstreamIds = listWorkstreamIds(projectRoot);
|
|
94
|
+
if (workstreamIds.length > 0) {
|
|
95
|
+
throw new Error("No live workstreams found. Reopen an existing workstream with iq-context workstream reopen <id> or create one with iq-context workstream new <id>.");
|
|
96
|
+
}
|
|
97
|
+
throw new Error("No workstream could be resolved. Run iq-context init first.");
|
|
98
|
+
}
|
|
99
|
+
export function updateFocusAfterGo(projectRoot, workstreamState, resumeState) {
|
|
100
|
+
const focusState = loadFocusState(projectRoot);
|
|
101
|
+
writeFocusState(projectRoot, buildNextFocusState(focusState, workstreamState, resumeState, "go"));
|
|
102
|
+
}
|
|
103
|
+
export function updateFocusAfterSave(projectRoot, workstreamState, resumeState) {
|
|
104
|
+
const focusState = loadFocusState(projectRoot);
|
|
105
|
+
writeFocusState(projectRoot, buildNextFocusState(focusState, workstreamState, resumeState, "save"));
|
|
106
|
+
}
|
|
107
|
+
export function updateFocusAfterWrap(projectRoot, workstreamState, resumeState) {
|
|
108
|
+
const focusState = loadFocusState(projectRoot);
|
|
109
|
+
const timestamp = new Date().toISOString();
|
|
110
|
+
const nextFocusState = buildNextFocusState(focusState, workstreamState, resumeState, "wrap");
|
|
111
|
+
writeFocusState(projectRoot, {
|
|
112
|
+
...nextFocusState,
|
|
113
|
+
last_wrapped_at: timestamp,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
export function switchFocusToWorkstream(projectRoot, workstreamState, resumeState) {
|
|
117
|
+
const focusState = loadFocusState(projectRoot);
|
|
118
|
+
const timestamp = new Date().toISOString();
|
|
119
|
+
writeCurrentWorkstreamPointer(projectRoot, workstreamState.workstream_id);
|
|
120
|
+
writeFocusState(projectRoot, {
|
|
121
|
+
...focusState,
|
|
122
|
+
current_workstream_id: workstreamState.workstream_id,
|
|
123
|
+
current_environment_id: workstreamState.environment_id ?? focusState.current_environment_id,
|
|
124
|
+
current_branch: workstreamState.branch ?? focusState.current_branch,
|
|
125
|
+
resume_from: resumeState.resume_from || workstreamState.continuation_hint || focusState.resume_from,
|
|
126
|
+
last_command: "workstream switch",
|
|
127
|
+
updated_at: timestamp,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function buildNextFocusState(focusState, workstreamState, resumeState, lastCommand) {
|
|
131
|
+
const timestamp = new Date().toISOString();
|
|
132
|
+
return {
|
|
133
|
+
...focusState,
|
|
134
|
+
current_workstream_id: workstreamState.workstream_id,
|
|
135
|
+
current_environment_id: workstreamState.environment_id ?? focusState.current_environment_id,
|
|
136
|
+
current_branch: workstreamState.branch ?? focusState.current_branch,
|
|
137
|
+
resume_from: resumeState.resume_from || workstreamState.continuation_hint || focusState.resume_from,
|
|
138
|
+
last_command: lastCommand,
|
|
139
|
+
last_saved_at: lastCommand === "save" ? timestamp : focusState.last_saved_at,
|
|
140
|
+
stale: focusState.stale ?? false,
|
|
141
|
+
mismatch_flags: focusState.mismatch_flags ?? [],
|
|
142
|
+
updated_at: timestamp,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function ensureWorkstreamExists(projectRoot, workstreamId) {
|
|
146
|
+
const statePath = path.join(projectRoot, ".iq-context", "workstreams", workstreamId, "state.json");
|
|
147
|
+
if (!fs.existsSync(statePath)) {
|
|
148
|
+
throw new Error(`Unknown workstream: ${workstreamId}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function isLiveWorkstream(projectRoot, workstreamId) {
|
|
152
|
+
try {
|
|
153
|
+
const workstreamState = loadWorkstreamState(projectRoot, workstreamId);
|
|
154
|
+
return LIVE_WORKSTREAM_STATUSES.has(workstreamState.lifecycle_status);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function readCurrentWorkstreamPointer(pointerPath) {
|
|
161
|
+
if (!fs.existsSync(pointerPath)) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
const value = fs.readFileSync(pointerPath, "utf8").trim();
|
|
165
|
+
return value.length > 0 ? value : null;
|
|
166
|
+
}
|
|
167
|
+
function readJsonFile(filePath) {
|
|
168
|
+
if (!fs.existsSync(filePath)) {
|
|
169
|
+
throw new Error(`Missing required state file: ${filePath}`);
|
|
170
|
+
}
|
|
171
|
+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
172
|
+
}
|
|
173
|
+
function writeJsonFile(filePath, value) {
|
|
174
|
+
writeJsonFileAtomic(filePath, value);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
package/dist/status.d.ts
ADDED
package/dist/status.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { loadFocusState, loadProjectState, loadResumeState, loadWorkstreamState, resolveProjectRoot, resolveTargetWorkstream, } from "./state.js";
|
|
2
|
+
import { evaluateStaleness } from "./staleness.js";
|
|
3
|
+
export function getStatus(options) {
|
|
4
|
+
const projectRoot = resolveProjectRoot(options.startDir, options.projectRoot);
|
|
5
|
+
const workstreamId = resolveTargetWorkstream(projectRoot, options.workstreamId);
|
|
6
|
+
const workstreamState = loadWorkstreamState(projectRoot, workstreamId);
|
|
7
|
+
const resumeState = loadResumeState(projectRoot, workstreamId);
|
|
8
|
+
const staleness = evaluateStaleness(projectRoot, workstreamState, resumeState);
|
|
9
|
+
return {
|
|
10
|
+
projectRoot,
|
|
11
|
+
projectState: loadProjectState(projectRoot),
|
|
12
|
+
focusState: loadFocusState(projectRoot),
|
|
13
|
+
workstreamState,
|
|
14
|
+
resumeState,
|
|
15
|
+
staleness,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,MAAM,UAAU,SAAS,CAAC,OAAsB;IAC9C,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9E,MAAM,YAAY,GAAG,uBAAuB,CAAC,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAChF,MAAM,eAAe,GAAG,mBAAmB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,iBAAiB,CAAC,WAAW,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;IAE/E,OAAO;QACL,WAAW;QACX,YAAY,EAAE,gBAAgB,CAAC,WAAW,CAAC;QAC3C,UAAU,EAAE,cAAc,CAAC,WAAW,CAAC;QACvC,eAAe;QACf,WAAW;QACX,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ResolvedTrackedArtifact {
|
|
2
|
+
absolutePath: string;
|
|
3
|
+
relativePath: string;
|
|
4
|
+
patterns: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolve configured artifact patterns against regular files in the project.
|
|
8
|
+
*
|
|
9
|
+
* Patterns are project-relative and use `/` separators. `*` and `?` match
|
|
10
|
+
* within one path segment, while `**` crosses directory boundaries.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolveTrackedArtifacts(projectRoot: string, patterns: string[]): ResolvedTrackedArtifact[];
|