@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.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/dist/capture.js +2 -1
  3. package/dist/capture.js.map +1 -1
  4. package/dist/config.d.ts +1 -0
  5. package/dist/config.js +10 -1
  6. package/dist/config.js.map +1 -1
  7. package/dist/discovery.d.ts +9 -0
  8. package/dist/discovery.js +25 -0
  9. package/dist/discovery.js.map +1 -1
  10. package/dist/doctor.js +140 -112
  11. package/dist/doctor.js.map +1 -1
  12. package/dist/find.js +2 -1
  13. package/dist/find.js.map +1 -1
  14. package/dist/git.d.ts +1 -0
  15. package/dist/git.js +15 -0
  16. package/dist/git.js.map +1 -0
  17. package/dist/go.js +6 -1
  18. package/dist/go.js.map +1 -1
  19. package/dist/headline.d.ts +13 -0
  20. package/dist/headline.js +32 -0
  21. package/dist/headline.js.map +1 -0
  22. package/dist/index.d.ts +14 -3
  23. package/dist/index.js +12 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/init.js +93 -51
  26. package/dist/init.js.map +1 -1
  27. package/dist/invariantSnapshot.d.ts +2 -0
  28. package/dist/invariantSnapshot.js +219 -0
  29. package/dist/invariantSnapshot.js.map +1 -0
  30. package/dist/invariantTypes.d.ts +100 -0
  31. package/dist/invariantTypes.js +4 -0
  32. package/dist/invariantTypes.js.map +1 -0
  33. package/dist/invariants.d.ts +13 -0
  34. package/dist/invariants.js +415 -0
  35. package/dist/invariants.js.map +1 -0
  36. package/dist/listMutation.d.ts +4 -0
  37. package/dist/listMutation.js +37 -0
  38. package/dist/listMutation.js.map +1 -0
  39. package/dist/obligations.d.ts +3 -0
  40. package/dist/obligations.js +84 -0
  41. package/dist/obligations.js.map +1 -0
  42. package/dist/persistence.js +7 -4
  43. package/dist/persistence.js.map +1 -1
  44. package/dist/save.js +34 -34
  45. package/dist/save.js.map +1 -1
  46. package/dist/staleness.d.ts +2 -2
  47. package/dist/staleness.js +12 -89
  48. package/dist/staleness.js.map +1 -1
  49. package/dist/state.d.ts +6 -1
  50. package/dist/state.js +63 -23
  51. package/dist/state.js.map +1 -1
  52. package/dist/stateSchemas.d.ts +16 -0
  53. package/dist/stateSchemas.js +212 -0
  54. package/dist/stateSchemas.js.map +1 -0
  55. package/dist/status.js +1 -1
  56. package/dist/status.js.map +1 -1
  57. package/dist/trackedPath.d.ts +3 -0
  58. package/dist/trackedPath.js +27 -0
  59. package/dist/trackedPath.js.map +1 -0
  60. package/dist/types.d.ts +33 -18
  61. package/dist/workstream.js +3 -8
  62. package/dist/workstream.js.map +1 -1
  63. package/dist/workstreamId.d.ts +2 -0
  64. package/dist/workstreamId.js +67 -0
  65. package/dist/workstreamId.js.map +1 -0
  66. package/dist/wrap.js +100 -46
  67. package/dist/wrap.js.map +1 -1
  68. package/package.json +12 -2
@@ -0,0 +1,212 @@
1
+ const SUPPORTED_STATE_VERSION = 1;
2
+ const BRIEFING_MODES = new Set(["lean", "standard", "deep"]);
3
+ const WORKSTREAM_MODES = new Set(["design", "implement", "debug", "research", "review", "comms"]);
4
+ const LIFECYCLE_STATUSES = new Set(["active", "paused", "blocked", "completed", "abandoned"]);
5
+ export const STATE_SCHEMA_FIELDS = {
6
+ project: [
7
+ "version",
8
+ "project_id",
9
+ "project_name",
10
+ "objective",
11
+ "default_briefing_mode",
12
+ "tracked_artifacts",
13
+ "workstreams",
14
+ "created_at",
15
+ "updated_at",
16
+ ],
17
+ focus: [
18
+ "version",
19
+ "current_workstream_id",
20
+ "current_environment_id",
21
+ "current_branch",
22
+ "resume_from",
23
+ "last_command",
24
+ "last_saved_at",
25
+ "last_wrapped_at",
26
+ "stale",
27
+ "mismatch_flags",
28
+ "updated_at",
29
+ ],
30
+ workstream: [
31
+ "version",
32
+ "workstream_id",
33
+ "title",
34
+ "objective",
35
+ "lifecycle_status",
36
+ "mode",
37
+ "status_summary",
38
+ "active_files",
39
+ "active_artifacts",
40
+ "blockers",
41
+ "open_questions",
42
+ "next_actions",
43
+ "continuation_hint",
44
+ "branch",
45
+ "last_saved_at",
46
+ "last_wrapped_at",
47
+ "completed_at",
48
+ "created_at",
49
+ "updated_at",
50
+ ],
51
+ resume: [
52
+ "version",
53
+ "remaining_tasks",
54
+ "paused_reason",
55
+ "resume_from",
56
+ "updated_at",
57
+ ],
58
+ };
59
+ export function parseProjectState(value, source) {
60
+ const state = stateObject(value, source);
61
+ stringField(state, "project_id", source);
62
+ stringField(state, "project_name", source);
63
+ stringField(state, "objective", source);
64
+ enumField(state, "default_briefing_mode", BRIEFING_MODES, source);
65
+ stringArrayField(state, "tracked_artifacts", source);
66
+ stringArrayField(state, "workstreams", source);
67
+ timestampField(state, "created_at", source);
68
+ timestampField(state, "updated_at", source);
69
+ return state;
70
+ }
71
+ export function parseFocusState(value, source) {
72
+ const state = stateObject(value, source);
73
+ stringField(state, "current_workstream_id", source);
74
+ nullableStringField(state, "current_environment_id", source);
75
+ nullableStringField(state, "current_branch", source);
76
+ stringField(state, "resume_from", source);
77
+ stringField(state, "last_command", source);
78
+ nullableTimestampField(state, "last_saved_at", source);
79
+ nullableTimestampField(state, "last_wrapped_at", source);
80
+ booleanField(state, "stale", source);
81
+ stringArrayField(state, "mismatch_flags", source);
82
+ timestampField(state, "updated_at", source);
83
+ return state;
84
+ }
85
+ export function parseWorkstreamState(value, source) {
86
+ const state = stateObject(value, source);
87
+ stringField(state, "workstream_id", source);
88
+ stringField(state, "title", source);
89
+ stringField(state, "objective", source);
90
+ enumField(state, "lifecycle_status", LIFECYCLE_STATUSES, source);
91
+ enumField(state, "mode", WORKSTREAM_MODES, source);
92
+ stringField(state, "status_summary", source);
93
+ stringArrayField(state, "active_files", source);
94
+ stringArrayField(state, "active_artifacts", source);
95
+ stringArrayField(state, "blockers", source);
96
+ stringArrayField(state, "open_questions", source);
97
+ stringArrayField(state, "next_actions", source);
98
+ stringField(state, "continuation_hint", source);
99
+ nullableStringField(state, "branch", source);
100
+ nullableTimestampField(state, "last_saved_at", source);
101
+ nullableTimestampField(state, "last_wrapped_at", source);
102
+ nullableTimestampField(state, "completed_at", source);
103
+ timestampField(state, "created_at", source);
104
+ timestampField(state, "updated_at", source);
105
+ return state;
106
+ }
107
+ export function parseResumeState(value, source) {
108
+ const state = stateObject(value, source);
109
+ stringArrayField(state, "remaining_tasks", source);
110
+ stringField(state, "paused_reason", source);
111
+ stringField(state, "resume_from", source);
112
+ timestampField(state, "updated_at", source);
113
+ return state;
114
+ }
115
+ function stateObject(value, source) {
116
+ const state = objectValue(value, source, "state object");
117
+ const version = state.version;
118
+ if (!Number.isInteger(version)) {
119
+ invalid(source, "version", "expected integer 1");
120
+ }
121
+ if (version !== SUPPORTED_STATE_VERSION) {
122
+ throw new Error(`Unsupported state version in ${source}: expected ${SUPPORTED_STATE_VERSION}, found ${String(version)}. ` +
123
+ "Run iq-context doctor and upgrade or migrate this project before continuing.");
124
+ }
125
+ return state;
126
+ }
127
+ function stringField(value, field, source, display = field) {
128
+ if (typeof value[field] !== "string") {
129
+ invalid(source, display, "expected a string");
130
+ }
131
+ }
132
+ function nullableStringField(value, field, source) {
133
+ if (value[field] !== null && typeof value[field] !== "string") {
134
+ invalid(source, field, "expected a string or null");
135
+ }
136
+ }
137
+ function stringArrayField(value, field, source) {
138
+ const entries = arrayValue(value[field], source, field);
139
+ entries.forEach((entry, index) => {
140
+ if (typeof entry !== "string") {
141
+ invalid(source, `${field}[${index}]`, "expected a string");
142
+ }
143
+ });
144
+ }
145
+ function enumField(value, field, allowed, source) {
146
+ if (typeof value[field] !== "string" || !allowed.has(value[field])) {
147
+ invalid(source, field, `expected one of ${[...allowed].join(", ")}`);
148
+ }
149
+ }
150
+ function booleanField(value, field, source) {
151
+ if (typeof value[field] !== "boolean") {
152
+ invalid(source, field, "expected a boolean");
153
+ }
154
+ }
155
+ function timestampField(value, field, source) {
156
+ if (!isIsoTimestamp(value[field])) {
157
+ invalid(source, field, "expected an ISO 8601 UTC timestamp");
158
+ }
159
+ }
160
+ function nullableTimestampField(value, field, source) {
161
+ if (value[field] !== null && !isIsoTimestamp(value[field])) {
162
+ invalid(source, field, "expected an ISO 8601 UTC timestamp or null");
163
+ }
164
+ }
165
+ function isIsoTimestamp(value) {
166
+ return typeof value === "string"
167
+ && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$/.test(value)
168
+ && !Number.isNaN(Date.parse(value));
169
+ }
170
+ function objectValue(value, source, field) {
171
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
172
+ invalid(source, field, "expected an object");
173
+ }
174
+ return value;
175
+ }
176
+ function arrayValue(value, source, field) {
177
+ if (!Array.isArray(value)) {
178
+ invalid(source, field, "expected an array");
179
+ }
180
+ return value;
181
+ }
182
+ function invalid(source, field, expectation) {
183
+ throw new Error(`Invalid state schema in ${source} at ${field}: ${expectation}.`);
184
+ }
185
+ const CAPTURE_SCOPES = new Set(["workstream", "project"]);
186
+ const CAPTURE_KINDS = new Set(["note", "idea", "question", "reference", "raw"]);
187
+ const CAPTURE_INPUTS = new Set(["argument", "stdin", "files", "mixed"]);
188
+ /**
189
+ * Validated per line rather than per file, so one malformed entry does not
190
+ * abort the rest of the log.
191
+ */
192
+ export function parseCaptureEntry(value, source) {
193
+ const entry = objectValue(value, source, "capture entry");
194
+ if (entry.version !== SUPPORTED_STATE_VERSION) {
195
+ invalid(source, "version", "expected integer 1");
196
+ }
197
+ stringField(entry, "id", source);
198
+ timestampField(entry, "captured_at", source);
199
+ enumField(entry, "scope", CAPTURE_SCOPES, source);
200
+ nullableStringField(entry, "workstream_id", source);
201
+ enumField(entry, "kind", CAPTURE_KINDS, source);
202
+ nullableStringField(entry, "body", source);
203
+ nullableStringField(entry, "note", source);
204
+ stringArrayField(entry, "files", source);
205
+ const entrySource = objectValue(entry.source, source, "source");
206
+ if (entrySource.command !== "capture") {
207
+ invalid(source, "source.command", "expected \"capture\"");
208
+ }
209
+ enumField(entrySource, "input", CAPTURE_INPUTS, source);
210
+ return entry;
211
+ }
212
+ //# sourceMappingURL=stateSchemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateSchemas.js","sourceRoot":"","sources":["../src/stateSchemas.ts"],"names":[],"mappings":"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"}
package/dist/status.js CHANGED
@@ -5,7 +5,7 @@ export function getStatus(options) {
5
5
  const workstreamId = resolveTargetWorkstream(projectRoot, options.workstreamId);
6
6
  const workstreamState = loadWorkstreamState(projectRoot, workstreamId);
7
7
  const resumeState = loadResumeState(projectRoot, workstreamId);
8
- const staleness = evaluateStaleness(projectRoot, workstreamState, resumeState);
8
+ const staleness = evaluateStaleness(projectRoot, workstreamState);
9
9
  return {
10
10
  projectRoot,
11
11
  projectState: loadProjectState(projectRoot),
@@ -1 +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"}
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,CAAC,CAAC;IAElE,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,3 @@
1
+ export declare function normalizeTrackedPath(projectRoot: string, value: string): string;
2
+ export declare function resolveTrackedPath(projectRoot: string, value: string): string;
3
+ export declare function isTrackedPathOutsideProject(projectRoot: string, value: string): boolean;
@@ -0,0 +1,27 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ export function normalizeTrackedPath(projectRoot, value) {
4
+ const absolutePath = resolveTrackedPath(projectRoot, value);
5
+ const relativePath = path.relative(projectRoot, absolutePath);
6
+ if (!relativePath.startsWith("..") && !path.isAbsolute(relativePath)) {
7
+ return relativePath.length === 0 ? "." : relativePath.split(path.sep).join("/");
8
+ }
9
+ return value;
10
+ }
11
+ export function resolveTrackedPath(projectRoot, value) {
12
+ return path.resolve(projectRoot, expandLeadingTilde(value));
13
+ }
14
+ export function isTrackedPathOutsideProject(projectRoot, value) {
15
+ const relativePath = path.relative(projectRoot, resolveTrackedPath(projectRoot, value));
16
+ return relativePath.startsWith("..") || path.isAbsolute(relativePath);
17
+ }
18
+ function expandLeadingTilde(value) {
19
+ if (value === "~") {
20
+ return os.homedir();
21
+ }
22
+ if (value.startsWith("~/")) {
23
+ return path.join(os.homedir(), value.slice(2));
24
+ }
25
+ return value;
26
+ }
27
+ //# sourceMappingURL=trackedPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackedPath.js","sourceRoot":"","sources":["../src/trackedPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,oBAAoB,CAAC,WAAmB,EAAE,KAAa;IACrE,MAAM,YAAY,GAAG,kBAAkB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAE9D,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACrE,OAAO,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,KAAa;IACnE,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,WAAmB,EAAE,KAAa;IAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;IACxF,OAAO,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACvC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
package/dist/types.d.ts CHANGED
@@ -7,8 +7,9 @@ export type CaptureInputSource = "argument" | "stdin" | "files" | "mixed";
7
7
  export type DurableArtifactKind = "decision" | "discovery" | "assumption";
8
8
  export type StalenessLevel = "fresh" | "warning" | "stale";
9
9
  export type StalenessScope = "focus" | "workstream" | "project";
10
- export type StalenessSourceKind = "active_plan" | "active_file" | "active_artifact" | "tracked_artifact" | "branch" | "resume_state" | "continuation";
10
+ export type StalenessSourceKind = "active_file" | "active_artifact" | "tracked_artifact" | "branch";
11
11
  export type StalenessReason = "missing" | "changed_after_checkpoint" | "mismatch" | "superseded";
12
+ export type ClearField = "files" | "artifacts" | "blockers" | "questions" | "next";
12
13
  export interface InitOptions {
13
14
  projectRoot: string;
14
15
  defaultWorkstream?: string;
@@ -31,11 +32,6 @@ export interface ProjectPaths {
31
32
  workstreamsDir: string;
32
33
  currentWorkstreamPath: string;
33
34
  }
34
- export interface Assumption {
35
- id?: string;
36
- text: string;
37
- status: string;
38
- }
39
35
  export interface ProjectState {
40
36
  version: number;
41
37
  project_id: string;
@@ -43,8 +39,6 @@ export interface ProjectState {
43
39
  objective: string;
44
40
  default_briefing_mode: BriefingMode;
45
41
  tracked_artifacts: string[];
46
- global_assumptions: Assumption[];
47
- stale_warnings: string[];
48
42
  workstreams: string[];
49
43
  created_at: string;
50
44
  updated_at: string;
@@ -70,18 +64,13 @@ export interface WorkstreamState {
70
64
  lifecycle_status: WorkstreamLifecycleStatus;
71
65
  mode: WorkstreamMode;
72
66
  status_summary: string;
73
- active_plan: string | null;
74
- active_task: string | null;
75
67
  active_files: string[];
76
68
  active_artifacts: string[];
77
69
  blockers: string[];
78
70
  open_questions: string[];
79
71
  next_actions: string[];
80
- assumptions: Assumption[];
81
72
  continuation_hint: string;
82
73
  branch: string | null;
83
- worktree: string | null;
84
- environment_id: string | null;
85
74
  last_saved_at: string | null;
86
75
  last_wrapped_at: string | null;
87
76
  completed_at: string | null;
@@ -90,10 +79,6 @@ export interface WorkstreamState {
90
79
  }
91
80
  export interface ResumeState {
92
81
  version: number;
93
- plan_path: string | null;
94
- completed_waves: string[];
95
- next_wave: string | null;
96
- completed_tasks: string[];
97
82
  remaining_tasks: string[];
98
83
  paused_reason: string;
99
84
  resume_from: string;
@@ -112,10 +97,20 @@ export interface GoResult {
112
97
  workstreamState: WorkstreamState;
113
98
  resumeState: ResumeState;
114
99
  trackedArtifacts: TrackedArtifactBriefing;
100
+ openObligations: OpenObligation[];
115
101
  recentCaptures: CaptureEntry[];
116
102
  warnings: string[];
117
103
  staleness: StalenessReport;
118
104
  }
105
+ export interface Obligation {
106
+ id: string;
107
+ description: string;
108
+ kind: string;
109
+ trigger: string;
110
+ origin: string;
111
+ status: string;
112
+ }
113
+ export type OpenObligation = Obligation;
119
114
  export interface TrackedArtifactBriefing {
120
115
  configuredPatterns: string[];
121
116
  resolvedPaths: string[];
@@ -194,11 +189,29 @@ export interface SaveOptions {
194
189
  nextActions: string[];
195
190
  blockers: string[];
196
191
  questions: string[];
192
+ clearFields: ClearField[];
193
+ }
194
+ export interface ListDelta {
195
+ previous: string[];
196
+ current: string[];
197
+ added: string[];
198
+ removed: string[];
199
+ reordered: boolean;
200
+ clearRequested: boolean;
201
+ provided: boolean;
202
+ }
203
+ export interface StateDelta {
204
+ files: ListDelta;
205
+ artifacts: ListDelta;
206
+ blockers: ListDelta;
207
+ questions: ListDelta;
208
+ next: ListDelta;
197
209
  }
198
210
  export interface SaveResult {
199
211
  projectRoot: string;
200
212
  workstreamState: WorkstreamState;
201
213
  resumeState: ResumeState;
214
+ delta: StateDelta;
202
215
  }
203
216
  export interface WrapOptions {
204
217
  startDir: string;
@@ -213,6 +226,7 @@ export interface WrapOptions {
213
226
  assumptions: string[];
214
227
  capturePromotions: CapturePromotion[];
215
228
  complete: boolean;
229
+ clearFields: ClearField[];
216
230
  }
217
231
  export interface WrapResult {
218
232
  projectRoot: string;
@@ -220,6 +234,7 @@ export interface WrapResult {
220
234
  resumeState: ResumeState;
221
235
  sessionArtifactPath: string;
222
236
  durableArtifacts: string[];
237
+ delta: StateDelta;
223
238
  }
224
239
  export interface DoctorOptions {
225
240
  startDir: string;
@@ -227,7 +242,7 @@ export interface DoctorOptions {
227
242
  }
228
243
  export interface DoctorCheck {
229
244
  label: string;
230
- status: "pass" | "warn" | "fail";
245
+ status: "pass" | "warn" | "fail" | "skipped" | "partial";
231
246
  message?: string;
232
247
  }
233
248
  export interface DoctorResult {
@@ -82,7 +82,7 @@ function updateWorkstreamLifecycle(options, lifecycleStatus) {
82
82
  continuation_hint: lifecycleStatus === "completed"
83
83
  ? "Workstream completed."
84
84
  : "Reopened; review the latest session context before continuing.",
85
- completed_at: lifecycleStatus === "completed" ? timestamp : null,
85
+ completed_at: lifecycleStatus === "completed" ? (currentState.completed_at ?? timestamp) : null,
86
86
  updated_at: timestamp,
87
87
  last_wrapped_at: lifecycleStatus === "completed" ? (currentState.last_wrapped_at ?? timestamp) : currentState.last_wrapped_at,
88
88
  };
@@ -108,12 +108,7 @@ function updateWorkstreamLifecycle(options, lifecycleStatus) {
108
108
  };
109
109
  }
110
110
  function getCurrentFocusWorkstreamId(projectRoot) {
111
- try {
112
- const focus = loadFocusState(projectRoot);
113
- return typeof focus.current_workstream_id === "string" ? focus.current_workstream_id : null;
114
- }
115
- catch {
116
- return null;
117
- }
111
+ const focus = loadFocusState(projectRoot);
112
+ return focus.current_workstream_id;
118
113
  }
119
114
  //# sourceMappingURL=workstream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workstream.js","sourceRoot":"","sources":["../src/workstream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workstream.js","sourceRoot":"","sources":["../src/workstream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function validateWorkstreamId(value: unknown, source?: string): string;
2
+ export declare function resolveWorkstreamPath(projectRoot: string, workstreamId: string, ...relativeSegments: string[]): string;
@@ -0,0 +1,67 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ const MAX_WORKSTREAM_ID_LENGTH = 64;
4
+ const WORKSTREAM_ID_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
5
+ const WINDOWS_RESERVED_NAMES = new Set([
6
+ "con",
7
+ "prn",
8
+ "aux",
9
+ "nul",
10
+ ...Array.from({ length: 9 }, (_, index) => `com${index + 1}`),
11
+ ...Array.from({ length: 9 }, (_, index) => `lpt${index + 1}`),
12
+ ]);
13
+ export function validateWorkstreamId(value, source = "workstream id") {
14
+ if (typeof value !== "string"
15
+ || value.length === 0
16
+ || value.length > MAX_WORKSTREAM_ID_LENGTH
17
+ || !WORKSTREAM_ID_PATTERN.test(value)
18
+ || WINDOWS_RESERVED_NAMES.has(value)) {
19
+ throw new Error(`Invalid ${source}: ${JSON.stringify(value)}. `
20
+ + "Workstream IDs must be 1-64 lowercase ASCII letters, numbers, or hyphens; "
21
+ + "must start and end with a letter or number; and must not be a reserved platform name.");
22
+ }
23
+ return value;
24
+ }
25
+ export function resolveWorkstreamPath(projectRoot, workstreamId, ...relativeSegments) {
26
+ const validWorkstreamId = validateWorkstreamId(workstreamId);
27
+ const stateRoot = path.resolve(projectRoot, ".iq-context");
28
+ const workstreamRoot = path.resolve(stateRoot, "workstreams", validWorkstreamId);
29
+ const targetPath = path.resolve(workstreamRoot, ...relativeSegments);
30
+ if (!isWithin(workstreamRoot, targetPath)) {
31
+ throw new Error(`Resolved workstream path escapes ${validWorkstreamId}: ${targetPath}`);
32
+ }
33
+ assertContainedPath(stateRoot, workstreamRoot, targetPath);
34
+ return targetPath;
35
+ }
36
+ function assertContainedPath(stateRoot, workstreamRoot, targetPath) {
37
+ if (!isWithin(stateRoot, targetPath)) {
38
+ throw new Error(`Resolved state path escapes .iq-context: ${targetPath}`);
39
+ }
40
+ if (!fs.existsSync(stateRoot)) {
41
+ return;
42
+ }
43
+ const realStateRoot = fs.realpathSync(stateRoot);
44
+ let existingAncestor = targetPath;
45
+ while (!fs.existsSync(existingAncestor)) {
46
+ const parent = path.dirname(existingAncestor);
47
+ if (parent === existingAncestor) {
48
+ throw new Error(`Could not resolve a contained state path: ${targetPath}`);
49
+ }
50
+ existingAncestor = parent;
51
+ }
52
+ const realAncestor = fs.realpathSync(existingAncestor);
53
+ if (!isWithin(realStateRoot, realAncestor)) {
54
+ throw new Error(`Resolved state path escapes .iq-context through a symbolic link: ${targetPath}`);
55
+ }
56
+ if (fs.existsSync(workstreamRoot)) {
57
+ const realWorkstreamRoot = fs.realpathSync(workstreamRoot);
58
+ if (!isWithin(realWorkstreamRoot, realAncestor)) {
59
+ throw new Error(`Resolved workstream path escapes through a symbolic link: ${targetPath}`);
60
+ }
61
+ }
62
+ }
63
+ function isWithin(rootPath, candidatePath) {
64
+ const relative = path.relative(rootPath, candidatePath);
65
+ return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
66
+ }
67
+ //# sourceMappingURL=workstreamId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workstreamId.js","sourceRoot":"","sources":["../src/workstreamId.ts"],"names":[],"mappings":"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"}