@iq-context/core 0.1.0 → 0.3.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/LICENSE +21 -0
- package/dist/capture.js +2 -1
- package/dist/capture.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +10 -1
- package/dist/config.js.map +1 -1
- package/dist/discovery.d.ts +9 -0
- package/dist/discovery.js +25 -0
- package/dist/discovery.js.map +1 -1
- package/dist/doctor.js +140 -112
- package/dist/doctor.js.map +1 -1
- package/dist/find.js +2 -1
- package/dist/find.js.map +1 -1
- package/dist/git.d.ts +1 -0
- package/dist/git.js +15 -0
- package/dist/git.js.map +1 -0
- package/dist/go.js +6 -1
- package/dist/go.js.map +1 -1
- package/dist/headline.d.ts +13 -0
- package/dist/headline.js +32 -0
- package/dist/headline.js.map +1 -0
- package/dist/index.d.ts +14 -3
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/init.js +93 -51
- package/dist/init.js.map +1 -1
- package/dist/invariantSnapshot.d.ts +2 -0
- package/dist/invariantSnapshot.js +219 -0
- package/dist/invariantSnapshot.js.map +1 -0
- package/dist/invariantTypes.d.ts +100 -0
- package/dist/invariantTypes.js +4 -0
- package/dist/invariantTypes.js.map +1 -0
- package/dist/invariants.d.ts +13 -0
- package/dist/invariants.js +415 -0
- package/dist/invariants.js.map +1 -0
- package/dist/listMutation.d.ts +4 -0
- package/dist/listMutation.js +37 -0
- package/dist/listMutation.js.map +1 -0
- package/dist/obligations.d.ts +3 -0
- package/dist/obligations.js +84 -0
- package/dist/obligations.js.map +1 -0
- package/dist/persistence.js +7 -4
- package/dist/persistence.js.map +1 -1
- package/dist/save.js +34 -34
- package/dist/save.js.map +1 -1
- package/dist/staleness.d.ts +2 -2
- package/dist/staleness.js +12 -89
- package/dist/staleness.js.map +1 -1
- package/dist/state.d.ts +6 -1
- package/dist/state.js +63 -23
- package/dist/state.js.map +1 -1
- package/dist/stateSchemas.d.ts +16 -0
- package/dist/stateSchemas.js +212 -0
- package/dist/stateSchemas.js.map +1 -0
- package/dist/status.js +1 -1
- package/dist/status.js.map +1 -1
- package/dist/trackedPath.d.ts +3 -0
- package/dist/trackedPath.js +27 -0
- package/dist/trackedPath.js.map +1 -0
- package/dist/types.d.ts +33 -18
- package/dist/workstream.js +3 -8
- package/dist/workstream.js.map +1 -1
- package/dist/workstreamId.d.ts +2 -0
- package/dist/workstreamId.js +67 -0
- package/dist/workstreamId.js.map +1 -0
- package/dist/wrap.js +100 -46
- package/dist/wrap.js.map +1 -1
- package/package.json +12 -2
package/dist/save.js
CHANGED
|
@@ -1,61 +1,61 @@
|
|
|
1
1
|
import { loadResumeState, loadWorkstreamState, resolveProjectRoot, resolveTargetWorkstream, updateFocusAfterSave, writeResumeState, writeWorkstreamState, } from "./state.js";
|
|
2
|
+
import { detectGitBranch } from "./git.js";
|
|
3
|
+
import { deriveHeadlines } from "./headline.js";
|
|
4
|
+
import { appendList, replaceList } from "./listMutation.js";
|
|
5
|
+
import { normalizeTrackedPath } from "./trackedPath.js";
|
|
2
6
|
export function saveProgress(options) {
|
|
3
7
|
const projectRoot = resolveProjectRoot(options.startDir, options.projectRoot);
|
|
4
8
|
const workstreamId = resolveTargetWorkstream(projectRoot, options.workstreamId);
|
|
5
9
|
const currentWorkstreamState = loadWorkstreamState(projectRoot, workstreamId);
|
|
6
10
|
const currentResumeState = loadResumeState(projectRoot, workstreamId);
|
|
7
11
|
const timestamp = new Date().toISOString();
|
|
12
|
+
const clearFields = new Set(options.clearFields);
|
|
13
|
+
const delta = {
|
|
14
|
+
files: replaceList(currentWorkstreamState.active_files, options.files, clearFields.has("files"), (value) => normalizeTrackedPath(projectRoot, value)),
|
|
15
|
+
artifacts: replaceList(currentWorkstreamState.active_artifacts, options.artifacts, clearFields.has("artifacts"), (value) => normalizeTrackedPath(projectRoot, value)),
|
|
16
|
+
blockers: appendList(currentWorkstreamState.blockers, options.blockers, clearFields.has("blockers")),
|
|
17
|
+
questions: appendList(currentWorkstreamState.open_questions, options.questions, clearFields.has("questions")),
|
|
18
|
+
next: appendList(currentWorkstreamState.next_actions, options.nextActions, clearFields.has("next")),
|
|
19
|
+
};
|
|
20
|
+
const headlines = deriveHeadlines({
|
|
21
|
+
complete: false,
|
|
22
|
+
nextActions: delta.next.current,
|
|
23
|
+
summary: options.summary,
|
|
24
|
+
previousContinuationHint: currentWorkstreamState.continuation_hint,
|
|
25
|
+
previousResumeFrom: currentResumeState.resume_from,
|
|
26
|
+
preservePrevious: !clearFields.has("next"),
|
|
27
|
+
});
|
|
8
28
|
const nextWorkstreamState = {
|
|
9
29
|
...currentWorkstreamState,
|
|
10
30
|
mode: options.mode ?? currentWorkstreamState.mode,
|
|
11
31
|
status_summary: options.summary ?? currentWorkstreamState.status_summary,
|
|
12
|
-
active_files:
|
|
13
|
-
active_artifacts:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
continuation_hint: buildContinuationHint(options, currentWorkstreamState),
|
|
32
|
+
active_files: delta.files.current,
|
|
33
|
+
active_artifacts: delta.artifacts.current,
|
|
34
|
+
blockers: delta.blockers.current,
|
|
35
|
+
open_questions: delta.questions.current,
|
|
36
|
+
next_actions: delta.next.current,
|
|
37
|
+
continuation_hint: headlines.continuationHint,
|
|
38
|
+
branch: detectGitBranch(projectRoot) ?? currentWorkstreamState.branch,
|
|
20
39
|
last_saved_at: timestamp,
|
|
21
40
|
updated_at: timestamp,
|
|
22
41
|
};
|
|
23
42
|
const nextResumeState = {
|
|
24
43
|
...currentResumeState,
|
|
25
|
-
remaining_tasks:
|
|
26
|
-
|
|
27
|
-
: currentResumeState.remaining_tasks,
|
|
28
|
-
resume_from: buildResumeFrom(options, nextWorkstreamState, currentResumeState),
|
|
44
|
+
remaining_tasks: nextWorkstreamState.next_actions,
|
|
45
|
+
resume_from: headlines.resumeFrom,
|
|
29
46
|
updated_at: timestamp,
|
|
30
47
|
};
|
|
31
|
-
|
|
48
|
+
// Resume state first: if the process dies between these writes, the surviving
|
|
49
|
+
// divergence is a populated remaining_tasks beside stale next_actions, which
|
|
50
|
+
// re-running the same command repairs. The reverse order strands the opposite.
|
|
32
51
|
writeResumeState(projectRoot, workstreamId, nextResumeState);
|
|
52
|
+
writeWorkstreamState(projectRoot, nextWorkstreamState);
|
|
33
53
|
updateFocusAfterSave(projectRoot, nextWorkstreamState, nextResumeState);
|
|
34
54
|
return {
|
|
35
55
|
projectRoot,
|
|
36
56
|
workstreamState: nextWorkstreamState,
|
|
37
57
|
resumeState: nextResumeState,
|
|
58
|
+
delta,
|
|
38
59
|
};
|
|
39
60
|
}
|
|
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
61
|
//# sourceMappingURL=save.js.map
|
package/dist/save.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.js","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"save.js","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"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"}
|
package/dist/staleness.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { ResolvedTrackedArtifact } from "./trackedArtifacts.js";
|
|
2
|
-
import type { FocusState, ProjectState,
|
|
2
|
+
import type { FocusState, ProjectState, StalenessReport, WorkstreamState } from "./types.js";
|
|
3
3
|
export interface RefreshStalenessResult {
|
|
4
4
|
projectState: ProjectState;
|
|
5
5
|
focusState: FocusState;
|
|
6
6
|
staleness: StalenessReport;
|
|
7
7
|
}
|
|
8
8
|
export declare function refreshStaleness(projectRoot: string, workstreamId: string, configuredArtifacts?: ResolvedTrackedArtifact[]): RefreshStalenessResult;
|
|
9
|
-
export declare function evaluateStaleness(projectRoot: string, workstreamState: WorkstreamState,
|
|
9
|
+
export declare function evaluateStaleness(projectRoot: string, workstreamState: WorkstreamState, configuredArtifacts?: ResolvedTrackedArtifact[]): StalenessReport;
|
package/dist/staleness.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
|
-
import
|
|
3
|
-
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { detectGitBranch } from "./git.js";
|
|
4
3
|
import { loadFocusState, loadProjectState, loadResumeState, loadWorkstreamState, writeFocusState, } from "./state.js";
|
|
5
4
|
import { loadProjectConfig } from "./config.js";
|
|
6
5
|
import { resolveTrackedArtifacts } from "./trackedArtifacts.js";
|
|
6
|
+
import { isTrackedPathOutsideProject, resolveTrackedPath } from "./trackedPath.js";
|
|
7
7
|
const CHANGE_GRACE_MS = 1000;
|
|
8
8
|
const NON_STALE_LIFECYCLE_STATUSES = new Set(["completed", "abandoned"]);
|
|
9
9
|
export function refreshStaleness(projectRoot, workstreamId, configuredArtifacts) {
|
|
@@ -11,7 +11,7 @@ export function refreshStaleness(projectRoot, workstreamId, configuredArtifacts)
|
|
|
11
11
|
const focusState = loadFocusState(projectRoot);
|
|
12
12
|
const workstreamState = loadWorkstreamState(projectRoot, workstreamId);
|
|
13
13
|
const resumeState = loadResumeState(projectRoot, workstreamId);
|
|
14
|
-
const staleness = evaluateStaleness(projectRoot, workstreamState,
|
|
14
|
+
const staleness = evaluateStaleness(projectRoot, workstreamState, configuredArtifacts);
|
|
15
15
|
const timestamp = new Date().toISOString();
|
|
16
16
|
const nextFocusState = {
|
|
17
17
|
...focusState,
|
|
@@ -30,7 +30,7 @@ export function refreshStaleness(projectRoot, workstreamId, configuredArtifacts)
|
|
|
30
30
|
staleness,
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
|
-
export function evaluateStaleness(projectRoot, workstreamState,
|
|
33
|
+
export function evaluateStaleness(projectRoot, workstreamState, configuredArtifacts) {
|
|
34
34
|
if (NON_STALE_LIFECYCLE_STATUSES.has(workstreamState.lifecycle_status)) {
|
|
35
35
|
return {
|
|
36
36
|
level: "fresh",
|
|
@@ -43,20 +43,18 @@ export function evaluateStaleness(projectRoot, workstreamState, resumeState, con
|
|
|
43
43
|
const changedWarnings = findChangedTrackedPaths(projectRoot, workstreamState);
|
|
44
44
|
const trackedArtifactWarnings = findChangedConfiguredArtifacts(projectRoot, workstreamState, new Set(changedWarnings.flatMap((warning) => warning.path ? [warning.path] : [])), configuredArtifacts);
|
|
45
45
|
const mismatchWarnings = findMismatchWarnings(projectRoot, workstreamState);
|
|
46
|
-
const resumeWarnings = findStaleResumeWarnings(workstreamState, resumeState);
|
|
47
46
|
const warningDetails = [
|
|
48
47
|
...missingWarnings,
|
|
49
48
|
...changedWarnings,
|
|
50
49
|
...trackedArtifactWarnings,
|
|
51
50
|
...mismatchWarnings,
|
|
52
|
-
...resumeWarnings,
|
|
53
51
|
];
|
|
54
52
|
const warnings = warningDetails
|
|
55
53
|
.filter((warning) => warning.reason !== "mismatch")
|
|
56
54
|
.map((warning) => warning.message);
|
|
57
55
|
const mismatchFlags = mismatchWarnings.map((warning) => warning.message);
|
|
58
56
|
return {
|
|
59
|
-
level: missingWarnings.length > 0 || mismatchWarnings.length > 0
|
|
57
|
+
level: missingWarnings.length > 0 || mismatchWarnings.length > 0
|
|
60
58
|
? "stale"
|
|
61
59
|
: changedWarnings.length > 0 || trackedArtifactWarnings.length > 0
|
|
62
60
|
? "warning"
|
|
@@ -105,75 +103,16 @@ function findChangedConfiguredArtifacts(projectRoot, workstreamState, workstream
|
|
|
105
103
|
}
|
|
106
104
|
});
|
|
107
105
|
}
|
|
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
106
|
function findMissingTrackedPaths(projectRoot, workstreamState) {
|
|
172
107
|
const warnings = [];
|
|
173
108
|
for (const reference of trackedPathReferences(workstreamState)) {
|
|
174
|
-
|
|
109
|
+
const absolutePath = resolveTrackedPath(projectRoot, reference.filePath);
|
|
110
|
+
if (!fs.existsSync(absolutePath)) {
|
|
111
|
+
const outsideProject = isTrackedPathOutsideProject(projectRoot, reference.filePath);
|
|
175
112
|
warnings.push({
|
|
176
|
-
message:
|
|
113
|
+
message: outsideProject
|
|
114
|
+
? `Tracked outside the project root; not found on this host: ${reference.filePath}`
|
|
115
|
+
: `${reference.label} is missing: ${reference.filePath}`,
|
|
177
116
|
scope: "workstream",
|
|
178
117
|
sourceKind: reference.sourceKind,
|
|
179
118
|
reason: "missing",
|
|
@@ -190,7 +129,7 @@ function findChangedTrackedPaths(projectRoot, workstreamState) {
|
|
|
190
129
|
}
|
|
191
130
|
const warnings = [];
|
|
192
131
|
for (const reference of trackedPathReferences(workstreamState)) {
|
|
193
|
-
const absolutePath =
|
|
132
|
+
const absolutePath = resolveTrackedPath(projectRoot, reference.filePath);
|
|
194
133
|
if (!fs.existsSync(absolutePath)) {
|
|
195
134
|
continue;
|
|
196
135
|
}
|
|
@@ -221,9 +160,6 @@ function findMismatchWarnings(projectRoot, workstreamState) {
|
|
|
221
160
|
}
|
|
222
161
|
function trackedPathReferences(workstreamState) {
|
|
223
162
|
const references = [];
|
|
224
|
-
if (workstreamState.active_plan) {
|
|
225
|
-
references.push({ label: "Active plan", sourceKind: "active_plan", filePath: workstreamState.active_plan });
|
|
226
|
-
}
|
|
227
163
|
for (const filePath of workstreamState.active_files) {
|
|
228
164
|
references.push({ label: "Active file", sourceKind: "active_file", filePath });
|
|
229
165
|
}
|
|
@@ -256,17 +192,4 @@ function uniqueReferences(references) {
|
|
|
256
192
|
return true;
|
|
257
193
|
});
|
|
258
194
|
}
|
|
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
195
|
//# sourceMappingURL=staleness.js.map
|
package/dist/staleness.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staleness.js","sourceRoot":"","sources":["../src/staleness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"staleness.js","sourceRoot":"","sources":["../src/staleness.ts"],"names":[],"mappings":"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"}
|
package/dist/state.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { FocusState, ProjectPaths, ProjectState, ResumeState, WorkstreamState } from "./types.js";
|
|
2
|
+
interface ResolveTargetWorkstreamOptions {
|
|
3
|
+
allowClosedFocusFallback?: boolean;
|
|
4
|
+
}
|
|
2
5
|
export declare function resolveProjectRoot(startDir: string, explicitProjectRoot?: string): string;
|
|
3
6
|
export declare function getProjectPaths(projectRoot: string): ProjectPaths;
|
|
4
7
|
export declare function loadProjectState(projectRoot: string): ProjectState;
|
|
@@ -11,8 +14,10 @@ export declare function writeFocusState(projectRoot: string, focusState: FocusSt
|
|
|
11
14
|
export declare function writeWorkstreamState(projectRoot: string, workstreamState: WorkstreamState): void;
|
|
12
15
|
export declare function writeResumeState(projectRoot: string, workstreamId: string, resumeState: ResumeState): void;
|
|
13
16
|
export declare function writeCurrentWorkstreamPointer(projectRoot: string, workstreamId: string): void;
|
|
14
|
-
export declare function resolveTargetWorkstream(projectRoot: string, explicitWorkstreamId?: string): string;
|
|
17
|
+
export declare function resolveTargetWorkstream(projectRoot: string, explicitWorkstreamId?: string, options?: ResolveTargetWorkstreamOptions): string;
|
|
15
18
|
export declare function updateFocusAfterGo(projectRoot: string, workstreamState: WorkstreamState, resumeState: ResumeState): void;
|
|
16
19
|
export declare function updateFocusAfterSave(projectRoot: string, workstreamState: WorkstreamState, resumeState: ResumeState): void;
|
|
17
20
|
export declare function updateFocusAfterWrap(projectRoot: string, workstreamState: WorkstreamState, resumeState: ResumeState): void;
|
|
18
21
|
export declare function switchFocusToWorkstream(projectRoot: string, workstreamState: WorkstreamState, resumeState: ResumeState): void;
|
|
22
|
+
export declare function loadCurrentWorkstreamPointer(pointerPath: string): string | null;
|
|
23
|
+
export {};
|
package/dist/state.js
CHANGED
|
@@ -2,7 +2,10 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { discoverProjectRoot } from "./discovery.js";
|
|
4
4
|
import { writeJsonFileAtomic, writeTextFileAtomic } from "./persistence.js";
|
|
5
|
+
import { parseFocusState, parseProjectState, parseResumeState, parseWorkstreamState, } from "./stateSchemas.js";
|
|
6
|
+
import { resolveWorkstreamPath, validateWorkstreamId } from "./workstreamId.js";
|
|
5
7
|
const LIVE_WORKSTREAM_STATUSES = new Set(["active", "paused", "blocked"]);
|
|
8
|
+
const CLOSED_WORKSTREAM_STATUSES = new Set(["completed", "abandoned"]);
|
|
6
9
|
export function resolveProjectRoot(startDir, explicitProjectRoot) {
|
|
7
10
|
const projectRoot = explicitProjectRoot
|
|
8
11
|
? path.resolve(explicitProjectRoot)
|
|
@@ -28,15 +31,23 @@ export function getProjectPaths(projectRoot) {
|
|
|
28
31
|
}
|
|
29
32
|
export function loadProjectState(projectRoot) {
|
|
30
33
|
const paths = getProjectPaths(projectRoot);
|
|
31
|
-
|
|
34
|
+
const projectState = parseProjectState(readJsonFile(paths.projectStatePath), paths.projectStatePath);
|
|
35
|
+
projectState.workstreams.forEach((workstreamId) => {
|
|
36
|
+
validateWorkstreamId(workstreamId, `persisted workstream id in ${paths.projectStatePath}`);
|
|
37
|
+
});
|
|
38
|
+
return projectState;
|
|
32
39
|
}
|
|
33
40
|
export function writeProjectState(projectRoot, projectState) {
|
|
34
41
|
const paths = getProjectPaths(projectRoot);
|
|
35
|
-
|
|
42
|
+
const validatedState = parseProjectState(projectState, paths.projectStatePath);
|
|
43
|
+
validatedState.workstreams.forEach((workstreamId) => validateWorkstreamId(workstreamId));
|
|
44
|
+
writeJsonFile(paths.projectStatePath, validatedState);
|
|
36
45
|
}
|
|
37
46
|
export function loadFocusState(projectRoot) {
|
|
38
47
|
const paths = getProjectPaths(projectRoot);
|
|
39
|
-
|
|
48
|
+
const focusState = parseFocusState(readJsonFile(paths.focusStatePath), paths.focusStatePath);
|
|
49
|
+
validateWorkstreamId(focusState.current_workstream_id, `current_workstream_id in ${paths.focusStatePath}`);
|
|
50
|
+
return focusState;
|
|
40
51
|
}
|
|
41
52
|
export function listWorkstreamIds(projectRoot) {
|
|
42
53
|
const paths = getProjectPaths(projectRoot);
|
|
@@ -45,40 +56,52 @@ export function listWorkstreamIds(projectRoot) {
|
|
|
45
56
|
}
|
|
46
57
|
return fs.readdirSync(paths.workstreamsDir, { withFileTypes: true })
|
|
47
58
|
.filter((entry) => entry.isDirectory())
|
|
48
|
-
.map((entry) => entry.name)
|
|
59
|
+
.map((entry) => validateWorkstreamId(entry.name, "persisted workstream directory name"))
|
|
49
60
|
.sort();
|
|
50
61
|
}
|
|
51
62
|
export function loadWorkstreamState(projectRoot, workstreamId) {
|
|
52
|
-
|
|
63
|
+
const statePath = resolveWorkstreamPath(projectRoot, workstreamId, "state.json");
|
|
64
|
+
const workstreamState = parseWorkstreamState(readJsonFile(statePath), statePath);
|
|
65
|
+
const persistedId = validateWorkstreamId(workstreamState.workstream_id, `workstream_id in ${statePath}`);
|
|
66
|
+
if (persistedId !== workstreamId) {
|
|
67
|
+
throw new Error(`Workstream ID mismatch in ${statePath}: expected ${workstreamId}, found ${persistedId}.`);
|
|
68
|
+
}
|
|
69
|
+
return workstreamState;
|
|
53
70
|
}
|
|
54
71
|
export function loadResumeState(projectRoot, workstreamId) {
|
|
55
|
-
|
|
72
|
+
const statePath = resolveWorkstreamPath(projectRoot, workstreamId, "resume-state.json");
|
|
73
|
+
return parseResumeState(readJsonFile(statePath), statePath);
|
|
56
74
|
}
|
|
57
75
|
export function writeFocusState(projectRoot, focusState) {
|
|
58
76
|
const paths = getProjectPaths(projectRoot);
|
|
59
|
-
|
|
77
|
+
const validatedState = parseFocusState(focusState, paths.focusStatePath);
|
|
78
|
+
validateWorkstreamId(validatedState.current_workstream_id);
|
|
79
|
+
writeJsonFile(paths.focusStatePath, validatedState);
|
|
60
80
|
}
|
|
61
81
|
export function writeWorkstreamState(projectRoot, workstreamState) {
|
|
62
|
-
|
|
82
|
+
const statePath = resolveWorkstreamPath(projectRoot, workstreamState.workstream_id, "state.json");
|
|
83
|
+
writeJsonFile(statePath, parseWorkstreamState(workstreamState, statePath));
|
|
63
84
|
}
|
|
64
85
|
export function writeResumeState(projectRoot, workstreamId, resumeState) {
|
|
65
|
-
|
|
86
|
+
const statePath = resolveWorkstreamPath(projectRoot, workstreamId, "resume-state.json");
|
|
87
|
+
writeJsonFile(statePath, parseResumeState(resumeState, statePath));
|
|
66
88
|
}
|
|
67
89
|
export function writeCurrentWorkstreamPointer(projectRoot, workstreamId) {
|
|
68
90
|
const paths = getProjectPaths(projectRoot);
|
|
69
|
-
writeTextFileAtomic(paths.currentWorkstreamPath, `${workstreamId}\n`);
|
|
91
|
+
writeTextFileAtomic(paths.currentWorkstreamPath, `${validateWorkstreamId(workstreamId)}\n`);
|
|
70
92
|
}
|
|
71
|
-
export function resolveTargetWorkstream(projectRoot, explicitWorkstreamId) {
|
|
93
|
+
export function resolveTargetWorkstream(projectRoot, explicitWorkstreamId, options = {}) {
|
|
72
94
|
const paths = getProjectPaths(projectRoot);
|
|
73
95
|
if (explicitWorkstreamId) {
|
|
74
|
-
|
|
75
|
-
|
|
96
|
+
const validatedId = validateWorkstreamId(explicitWorkstreamId, "--workstream value");
|
|
97
|
+
ensureWorkstreamExists(projectRoot, validatedId);
|
|
98
|
+
return validatedId;
|
|
76
99
|
}
|
|
77
100
|
const focusState = loadFocusState(projectRoot);
|
|
78
101
|
if (focusState.current_workstream_id && isLiveWorkstream(projectRoot, focusState.current_workstream_id)) {
|
|
79
102
|
return focusState.current_workstream_id;
|
|
80
103
|
}
|
|
81
|
-
const currentPointer =
|
|
104
|
+
const currentPointer = loadCurrentWorkstreamPointer(paths.currentWorkstreamPath);
|
|
82
105
|
if (currentPointer && isLiveWorkstream(projectRoot, currentPointer)) {
|
|
83
106
|
return currentPointer;
|
|
84
107
|
}
|
|
@@ -90,6 +113,14 @@ export function resolveTargetWorkstream(projectRoot, explicitWorkstreamId) {
|
|
|
90
113
|
if (liveWorkstreams.length > 1) {
|
|
91
114
|
throw new Error(`Multiple live workstreams found (${liveWorkstreams.join(", ")}). Re-run with --workstream <id>.`);
|
|
92
115
|
}
|
|
116
|
+
if (options.allowClosedFocusFallback) {
|
|
117
|
+
if (isClosedWorkstream(projectRoot, focusState.current_workstream_id)) {
|
|
118
|
+
return focusState.current_workstream_id;
|
|
119
|
+
}
|
|
120
|
+
if (currentPointer && isClosedWorkstream(projectRoot, currentPointer)) {
|
|
121
|
+
return currentPointer;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
93
124
|
const workstreamIds = listWorkstreamIds(projectRoot);
|
|
94
125
|
if (workstreamIds.length > 0) {
|
|
95
126
|
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>.");
|
|
@@ -120,7 +151,7 @@ export function switchFocusToWorkstream(projectRoot, workstreamState, resumeStat
|
|
|
120
151
|
writeFocusState(projectRoot, {
|
|
121
152
|
...focusState,
|
|
122
153
|
current_workstream_id: workstreamState.workstream_id,
|
|
123
|
-
current_environment_id:
|
|
154
|
+
current_environment_id: focusState.current_environment_id,
|
|
124
155
|
current_branch: workstreamState.branch ?? focusState.current_branch,
|
|
125
156
|
resume_from: resumeState.resume_from || workstreamState.continuation_hint || focusState.resume_from,
|
|
126
157
|
last_command: "workstream switch",
|
|
@@ -132,7 +163,7 @@ function buildNextFocusState(focusState, workstreamState, resumeState, lastComma
|
|
|
132
163
|
return {
|
|
133
164
|
...focusState,
|
|
134
165
|
current_workstream_id: workstreamState.workstream_id,
|
|
135
|
-
current_environment_id:
|
|
166
|
+
current_environment_id: focusState.current_environment_id,
|
|
136
167
|
current_branch: workstreamState.branch ?? focusState.current_branch,
|
|
137
168
|
resume_from: resumeState.resume_from || workstreamState.continuation_hint || focusState.resume_from,
|
|
138
169
|
last_command: lastCommand,
|
|
@@ -143,26 +174,35 @@ function buildNextFocusState(focusState, workstreamState, resumeState, lastComma
|
|
|
143
174
|
};
|
|
144
175
|
}
|
|
145
176
|
function ensureWorkstreamExists(projectRoot, workstreamId) {
|
|
146
|
-
const statePath =
|
|
177
|
+
const statePath = resolveWorkstreamPath(projectRoot, workstreamId, "state.json");
|
|
147
178
|
if (!fs.existsSync(statePath)) {
|
|
148
179
|
throw new Error(`Unknown workstream: ${workstreamId}`);
|
|
149
180
|
}
|
|
150
181
|
}
|
|
151
182
|
function isLiveWorkstream(projectRoot, workstreamId) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
return
|
|
183
|
+
const statePath = resolveWorkstreamPath(projectRoot, workstreamId, "state.json");
|
|
184
|
+
if (!fs.existsSync(statePath)) {
|
|
185
|
+
return false;
|
|
155
186
|
}
|
|
156
|
-
|
|
187
|
+
const workstreamState = loadWorkstreamState(projectRoot, workstreamId);
|
|
188
|
+
return LIVE_WORKSTREAM_STATUSES.has(workstreamState.lifecycle_status);
|
|
189
|
+
}
|
|
190
|
+
function isClosedWorkstream(projectRoot, workstreamId) {
|
|
191
|
+
const statePath = resolveWorkstreamPath(projectRoot, workstreamId, "state.json");
|
|
192
|
+
if (!fs.existsSync(statePath)) {
|
|
157
193
|
return false;
|
|
158
194
|
}
|
|
195
|
+
const workstreamState = loadWorkstreamState(projectRoot, workstreamId);
|
|
196
|
+
return CLOSED_WORKSTREAM_STATUSES.has(workstreamState.lifecycle_status);
|
|
159
197
|
}
|
|
160
|
-
function
|
|
198
|
+
export function loadCurrentWorkstreamPointer(pointerPath) {
|
|
161
199
|
if (!fs.existsSync(pointerPath)) {
|
|
162
200
|
return null;
|
|
163
201
|
}
|
|
164
202
|
const value = fs.readFileSync(pointerPath, "utf8").trim();
|
|
165
|
-
return value.length > 0
|
|
203
|
+
return value.length > 0
|
|
204
|
+
? validateWorkstreamId(value, `workstream pointer in ${pointerPath}`)
|
|
205
|
+
: null;
|
|
166
206
|
}
|
|
167
207
|
function readJsonFile(filePath) {
|
|
168
208
|
if (!fs.existsSync(filePath)) {
|
package/dist/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CaptureEntry, FocusState, ProjectState, ResumeState, WorkstreamState } from "./types.js";
|
|
2
|
+
export declare const STATE_SCHEMA_FIELDS: {
|
|
3
|
+
readonly project: readonly ["version", "project_id", "project_name", "objective", "default_briefing_mode", "tracked_artifacts", "workstreams", "created_at", "updated_at"];
|
|
4
|
+
readonly focus: readonly ["version", "current_workstream_id", "current_environment_id", "current_branch", "resume_from", "last_command", "last_saved_at", "last_wrapped_at", "stale", "mismatch_flags", "updated_at"];
|
|
5
|
+
readonly workstream: readonly ["version", "workstream_id", "title", "objective", "lifecycle_status", "mode", "status_summary", "active_files", "active_artifacts", "blockers", "open_questions", "next_actions", "continuation_hint", "branch", "last_saved_at", "last_wrapped_at", "completed_at", "created_at", "updated_at"];
|
|
6
|
+
readonly resume: readonly ["version", "remaining_tasks", "paused_reason", "resume_from", "updated_at"];
|
|
7
|
+
};
|
|
8
|
+
export declare function parseProjectState(value: unknown, source: string): ProjectState;
|
|
9
|
+
export declare function parseFocusState(value: unknown, source: string): FocusState;
|
|
10
|
+
export declare function parseWorkstreamState(value: unknown, source: string): WorkstreamState;
|
|
11
|
+
export declare function parseResumeState(value: unknown, source: string): ResumeState;
|
|
12
|
+
/**
|
|
13
|
+
* Validated per line rather than per file, so one malformed entry does not
|
|
14
|
+
* abort the rest of the log.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseCaptureEntry(value: unknown, source: string): CaptureEntry;
|