conductor-bridge 1.0.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/README.md +69 -0
- package/dist/bridge/index.d.ts +8 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +8 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/json-interchange.d.ts +94 -0
- package/dist/bridge/json-interchange.d.ts.map +1 -0
- package/dist/bridge/json-interchange.js +301 -0
- package/dist/bridge/json-interchange.js.map +1 -0
- package/dist/cli/commands/amend.d.ts +12 -0
- package/dist/cli/commands/amend.d.ts.map +1 -0
- package/dist/cli/commands/amend.js +205 -0
- package/dist/cli/commands/amend.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +12 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +60 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/dispatch.d.ts +12 -0
- package/dist/cli/commands/dispatch.d.ts.map +1 -0
- package/dist/cli/commands/dispatch.js +207 -0
- package/dist/cli/commands/dispatch.js.map +1 -0
- package/dist/cli/commands/handoff.d.ts +31 -0
- package/dist/cli/commands/handoff.d.ts.map +1 -0
- package/dist/cli/commands/handoff.js +273 -0
- package/dist/cli/commands/handoff.js.map +1 -0
- package/dist/cli/commands/init.d.ts +12 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +301 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +206 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +148 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/handoff/encryption.d.ts +85 -0
- package/dist/handoff/encryption.d.ts.map +1 -0
- package/dist/handoff/encryption.js +308 -0
- package/dist/handoff/encryption.js.map +1 -0
- package/dist/handoff/index.d.ts +8 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +10 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/mycelium-arc.d.ts +116 -0
- package/dist/handoff/mycelium-arc.d.ts.map +1 -0
- package/dist/handoff/mycelium-arc.js +410 -0
- package/dist/handoff/mycelium-arc.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/index.d.ts +10 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +12 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/plan-parser.d.ts +29 -0
- package/dist/parsers/plan-parser.d.ts.map +1 -0
- package/dist/parsers/plan-parser.js +503 -0
- package/dist/parsers/plan-parser.js.map +1 -0
- package/dist/parsers/spec-parser.d.ts +10 -0
- package/dist/parsers/spec-parser.d.ts.map +1 -0
- package/dist/parsers/spec-parser.js +382 -0
- package/dist/parsers/spec-parser.js.map +1 -0
- package/dist/parsers/state-parser.d.ts +21 -0
- package/dist/parsers/state-parser.d.ts.map +1 -0
- package/dist/parsers/state-parser.js +378 -0
- package/dist/parsers/state-parser.js.map +1 -0
- package/dist/parsers/types.d.ts +190 -0
- package/dist/parsers/types.d.ts.map +1 -0
- package/dist/parsers/types.js +7 -0
- package/dist/parsers/types.js.map +1 -0
- package/dist/schemas/cognitive-state.d.ts +1523 -0
- package/dist/schemas/cognitive-state.d.ts.map +1 -0
- package/dist/schemas/cognitive-state.js +328 -0
- package/dist/schemas/cognitive-state.js.map +1 -0
- package/dist/schemas/enums.d.ts +124 -0
- package/dist/schemas/enums.d.ts.map +1 -0
- package/dist/schemas/enums.js +108 -0
- package/dist/schemas/enums.js.map +1 -0
- package/dist/schemas/index.d.ts +9 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +9 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/sync/adhd-continuity.d.ts +91 -0
- package/dist/sync/adhd-continuity.d.ts.map +1 -0
- package/dist/sync/adhd-continuity.js +302 -0
- package/dist/sync/adhd-continuity.js.map +1 -0
- package/dist/sync/convergence-tracker.d.ts +111 -0
- package/dist/sync/convergence-tracker.d.ts.map +1 -0
- package/dist/sync/convergence-tracker.js +299 -0
- package/dist/sync/convergence-tracker.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +15 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/state-sync.d.ts +105 -0
- package/dist/sync/state-sync.d.ts.map +1 -0
- package/dist/sync/state-sync.js +403 -0
- package/dist/sync/state-sync.js.map +1 -0
- package/dist/sync/watcher.d.ts +90 -0
- package/dist/sync/watcher.d.ts.map +1 -0
- package/dist/sync/watcher.js +281 -0
- package/dist/sync/watcher.js.map +1 -0
- package/dist/utils/atomic-write.d.ts +31 -0
- package/dist/utils/atomic-write.d.ts.map +1 -0
- package/dist/utils/atomic-write.js +69 -0
- package/dist/utils/atomic-write.js.map +1 -0
- package/dist/utils/error-handling.d.ts +70 -0
- package/dist/utils/error-handling.d.ts.map +1 -0
- package/dist/utils/error-handling.js +109 -0
- package/dist/utils/error-handling.js.map +1 -0
- package/dist/utils/file-lock.d.ts +46 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +117 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/rlm-navigator.d.ts +160 -0
- package/dist/utils/rlm-navigator.d.ts.map +1 -0
- package/dist/utils/rlm-navigator.js +368 -0
- package/dist/utils/rlm-navigator.js.map +1 -0
- package/dist/utils/safe-path.d.ts +44 -0
- package/dist/utils/safe-path.d.ts.map +1 -0
- package/dist/utils/safe-path.js +96 -0
- package/dist/utils/safe-path.js.map +1 -0
- package/dist/utils/timed-io.d.ts +51 -0
- package/dist/utils/timed-io.d.ts.map +1 -0
- package/dist/utils/timed-io.js +128 -0
- package/dist/utils/timed-io.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Conductor plan.md files into structured data.
|
|
5
|
+
* Implements checkbox state machine for task tracking.
|
|
6
|
+
*/
|
|
7
|
+
import matter from 'gray-matter';
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Patterns
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Checkbox: - [ ] content, - [x] content, - [~] content, - [!] content
|
|
12
|
+
const CHECKBOX_PATTERN = /^(\s*)-\s+\[([ x~!])\]\s+(.+)$/;
|
|
13
|
+
// Track header: ## Track: name or ## Phase N: name
|
|
14
|
+
const TRACK_HEADER_PATTERN = /^##\s+(?:Track:\s*|Phase\s+\d+:\s*)(.+)$/;
|
|
15
|
+
// Track metadata: - **Key**: value
|
|
16
|
+
const TRACK_METADATA_PATTERN = /^-\s+\*\*(\w+)\*\*:\s*(.*)$/;
|
|
17
|
+
// Section header within track: ### Tasks, ### Artifacts, ### Notes
|
|
18
|
+
const SUBSECTION_PATTERN = /^###\s+(\w+)$/;
|
|
19
|
+
// Summary table row: | Key | Value |
|
|
20
|
+
const TABLE_ROW_PATTERN = /^\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|$/;
|
|
21
|
+
// Amendment link: [AMEND-001](path)
|
|
22
|
+
const AMENDMENT_LINK_PATTERN = /\[AMEND-(\d+)\]\(([^)]+)\)/;
|
|
23
|
+
// Changelog row: | version | date | agent | summary |
|
|
24
|
+
const CHANGELOG_ROW_PATTERN = /^\|\s*(\d+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|$/;
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Checkbox State Machine
|
|
27
|
+
// ============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* Convert checkbox marker to state
|
|
30
|
+
*/
|
|
31
|
+
function checkboxToState(marker) {
|
|
32
|
+
switch (marker) {
|
|
33
|
+
case 'x':
|
|
34
|
+
return 'complete';
|
|
35
|
+
case '~':
|
|
36
|
+
return 'in_progress';
|
|
37
|
+
case '!':
|
|
38
|
+
return 'blocked';
|
|
39
|
+
default:
|
|
40
|
+
return 'pending';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Convert state to checkbox marker
|
|
45
|
+
*/
|
|
46
|
+
export function stateToCheckbox(state) {
|
|
47
|
+
switch (state) {
|
|
48
|
+
case 'complete':
|
|
49
|
+
return 'x';
|
|
50
|
+
case 'in_progress':
|
|
51
|
+
return '~';
|
|
52
|
+
case 'blocked':
|
|
53
|
+
return '!';
|
|
54
|
+
default:
|
|
55
|
+
return ' ';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Valid state transitions
|
|
60
|
+
*/
|
|
61
|
+
const VALID_TRANSITIONS = {
|
|
62
|
+
pending: ['in_progress', 'blocked'],
|
|
63
|
+
in_progress: ['complete', 'blocked', 'pending'],
|
|
64
|
+
complete: ['pending'], // Can be reopened
|
|
65
|
+
blocked: ['pending', 'in_progress'],
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Check if state transition is valid
|
|
69
|
+
*/
|
|
70
|
+
export function isValidTransition(from, to) {
|
|
71
|
+
return VALID_TRANSITIONS[from]?.includes(to) ?? false;
|
|
72
|
+
}
|
|
73
|
+
function parseTaskLines(content, startLine) {
|
|
74
|
+
const lines = content.split('\n');
|
|
75
|
+
const tasks = [];
|
|
76
|
+
for (let i = 0; i < lines.length; i++) {
|
|
77
|
+
const line = lines[i] ?? '';
|
|
78
|
+
const match = line.match(CHECKBOX_PATTERN);
|
|
79
|
+
if (match) {
|
|
80
|
+
const indent = (match[1]?.length ?? 0) / 2; // Assume 2-space indentation
|
|
81
|
+
tasks.push({
|
|
82
|
+
indent,
|
|
83
|
+
state: checkboxToState(match[2] ?? ' '),
|
|
84
|
+
content: match[3]?.trim() ?? '',
|
|
85
|
+
line: startLine + i,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return tasks;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Build task hierarchy from flat list
|
|
93
|
+
*/
|
|
94
|
+
function buildTaskHierarchy(taskLines) {
|
|
95
|
+
const tasks = [];
|
|
96
|
+
const stack = [];
|
|
97
|
+
let taskIndex = 0;
|
|
98
|
+
for (const line of taskLines) {
|
|
99
|
+
taskIndex++;
|
|
100
|
+
const task = {
|
|
101
|
+
id: `task-${taskIndex}`,
|
|
102
|
+
content: line.content,
|
|
103
|
+
state: line.state,
|
|
104
|
+
subtasks: [],
|
|
105
|
+
line: line.line,
|
|
106
|
+
indent: line.indent,
|
|
107
|
+
};
|
|
108
|
+
// Pop stack until we find a parent with lower indent
|
|
109
|
+
while (stack.length > 0 && stack[stack.length - 1].indent >= line.indent) {
|
|
110
|
+
stack.pop();
|
|
111
|
+
}
|
|
112
|
+
if (stack.length === 0) {
|
|
113
|
+
// Top-level task
|
|
114
|
+
tasks.push(task);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// Subtask
|
|
118
|
+
stack[stack.length - 1].task.subtasks.push(task);
|
|
119
|
+
}
|
|
120
|
+
stack.push({ task, indent: line.indent });
|
|
121
|
+
}
|
|
122
|
+
return tasks;
|
|
123
|
+
}
|
|
124
|
+
function extractTracks(content) {
|
|
125
|
+
const lines = content.split('\n');
|
|
126
|
+
const tracks = [];
|
|
127
|
+
let currentTrack = null;
|
|
128
|
+
for (let i = 0; i < lines.length; i++) {
|
|
129
|
+
const line = lines[i] ?? '';
|
|
130
|
+
const trackMatch = line.match(TRACK_HEADER_PATTERN);
|
|
131
|
+
if (trackMatch) {
|
|
132
|
+
// Save previous track
|
|
133
|
+
if (currentTrack) {
|
|
134
|
+
currentTrack.endLine = i - 1;
|
|
135
|
+
currentTrack.content = lines
|
|
136
|
+
.slice(currentTrack.startLine + 1, i)
|
|
137
|
+
.join('\n');
|
|
138
|
+
tracks.push(currentTrack);
|
|
139
|
+
}
|
|
140
|
+
// Start new track
|
|
141
|
+
currentTrack = {
|
|
142
|
+
name: trackMatch[1]?.trim() ?? '',
|
|
143
|
+
description: '',
|
|
144
|
+
startLine: i,
|
|
145
|
+
endLine: lines.length - 1,
|
|
146
|
+
content: '',
|
|
147
|
+
};
|
|
148
|
+
// Look for description (blockquote after header)
|
|
149
|
+
const nextLine = lines[i + 1];
|
|
150
|
+
if (nextLine?.startsWith('>')) {
|
|
151
|
+
currentTrack.description = nextLine.slice(1).trim();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Save final track
|
|
156
|
+
if (currentTrack) {
|
|
157
|
+
currentTrack.content = lines.slice(currentTrack.startLine + 1).join('\n');
|
|
158
|
+
tracks.push(currentTrack);
|
|
159
|
+
}
|
|
160
|
+
return tracks;
|
|
161
|
+
}
|
|
162
|
+
function parseTrackMetadata(content) {
|
|
163
|
+
const metadata = {};
|
|
164
|
+
const lines = content.split('\n');
|
|
165
|
+
for (const line of lines) {
|
|
166
|
+
const match = line.match(TRACK_METADATA_PATTERN);
|
|
167
|
+
if (match && match[1] && match[2] !== undefined) {
|
|
168
|
+
metadata[match[1].toLowerCase()] = match[2].trim();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return metadata;
|
|
172
|
+
}
|
|
173
|
+
function extractSubsection(content, name) {
|
|
174
|
+
const lines = content.split('\n');
|
|
175
|
+
let inSection = false;
|
|
176
|
+
const sectionLines = [];
|
|
177
|
+
for (let i = 0; i < lines.length; i++) {
|
|
178
|
+
const line = lines[i] ?? '';
|
|
179
|
+
const subsectionMatch = line.match(SUBSECTION_PATTERN);
|
|
180
|
+
if (subsectionMatch) {
|
|
181
|
+
if (subsectionMatch[1]?.toLowerCase() === name.toLowerCase()) {
|
|
182
|
+
inSection = true;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
else if (inSection) {
|
|
186
|
+
// End of our section
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (inSection) {
|
|
191
|
+
sectionLines.push(line);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return sectionLines.join('\n').trim();
|
|
195
|
+
}
|
|
196
|
+
function parseTrack(section, trackIndex) {
|
|
197
|
+
const metadata = parseTrackMetadata(section.content);
|
|
198
|
+
// Parse tasks
|
|
199
|
+
const tasksContent = extractSubsection(section.content, 'Tasks');
|
|
200
|
+
const taskLines = parseTaskLines(tasksContent, section.startLine);
|
|
201
|
+
const tasks = buildTaskHierarchy(taskLines);
|
|
202
|
+
// Parse artifacts
|
|
203
|
+
const artifactsContent = extractSubsection(section.content, 'Artifacts');
|
|
204
|
+
const artifacts = artifactsContent
|
|
205
|
+
.split('\n')
|
|
206
|
+
.filter((l) => l.trim().startsWith('-') || l.trim().startsWith('*'))
|
|
207
|
+
.map((l) => l.replace(/^[-*]\s*/, '').trim().replace(/`/g, ''));
|
|
208
|
+
// Parse notes (fenced code block)
|
|
209
|
+
const notesContent = extractSubsection(section.content, 'Notes');
|
|
210
|
+
const notesMatch = notesContent.match(/```[\s\S]*?\n([\s\S]*?)```/);
|
|
211
|
+
const notes = notesMatch?.[1]?.trim() ?? '';
|
|
212
|
+
// Derive track status from tasks
|
|
213
|
+
let status = 'pending';
|
|
214
|
+
if (tasks.length > 0) {
|
|
215
|
+
const allComplete = tasks.every((t) => t.state === 'complete');
|
|
216
|
+
const anyInProgress = tasks.some((t) => t.state === 'in_progress');
|
|
217
|
+
const anyBlocked = tasks.some((t) => t.state === 'blocked');
|
|
218
|
+
if (allComplete) {
|
|
219
|
+
status = 'complete';
|
|
220
|
+
}
|
|
221
|
+
else if (anyBlocked) {
|
|
222
|
+
status = 'blocked';
|
|
223
|
+
}
|
|
224
|
+
else if (anyInProgress) {
|
|
225
|
+
status = 'in_progress';
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Override with explicit status if present
|
|
229
|
+
if (metadata.status) {
|
|
230
|
+
const explicitStatus = metadata.status.toLowerCase();
|
|
231
|
+
if (['pending', 'in_progress', 'complete', 'blocked'].includes(explicitStatus)) {
|
|
232
|
+
status = explicitStatus;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
id: `track-${trackIndex + 1}`,
|
|
237
|
+
name: section.name,
|
|
238
|
+
description: section.description,
|
|
239
|
+
agent: metadata.agent ?? 'unassigned',
|
|
240
|
+
status,
|
|
241
|
+
dependencies: metadata.dependencies
|
|
242
|
+
? metadata.dependencies.split(',').map((d) => d.trim())
|
|
243
|
+
: [],
|
|
244
|
+
tasks,
|
|
245
|
+
artifacts,
|
|
246
|
+
notes,
|
|
247
|
+
started: metadata.started,
|
|
248
|
+
completed: metadata.completed,
|
|
249
|
+
line: section.startLine,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
// ============================================================================
|
|
253
|
+
// Summary Parser
|
|
254
|
+
// ============================================================================
|
|
255
|
+
function parseSummaryTable(content) {
|
|
256
|
+
const summary = {
|
|
257
|
+
totalTracks: 0,
|
|
258
|
+
completedTracks: 0,
|
|
259
|
+
progress: 0,
|
|
260
|
+
};
|
|
261
|
+
const lines = content.split('\n');
|
|
262
|
+
for (const line of lines) {
|
|
263
|
+
const match = line.match(TABLE_ROW_PATTERN);
|
|
264
|
+
if (match && match[1] && match[2]) {
|
|
265
|
+
const key = match[1].trim().toLowerCase();
|
|
266
|
+
const value = match[2].trim();
|
|
267
|
+
switch (key) {
|
|
268
|
+
case 'total tracks':
|
|
269
|
+
summary.totalTracks = parseInt(value, 10) || 0;
|
|
270
|
+
break;
|
|
271
|
+
case 'completed':
|
|
272
|
+
summary.completedTracks = parseInt(value, 10) || 0;
|
|
273
|
+
break;
|
|
274
|
+
case 'progress':
|
|
275
|
+
summary.progress = parseInt(value.replace('%', ''), 10) || 0;
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return summary;
|
|
281
|
+
}
|
|
282
|
+
// ============================================================================
|
|
283
|
+
// Amendment Parser
|
|
284
|
+
// ============================================================================
|
|
285
|
+
function parsePendingAmendments(content) {
|
|
286
|
+
const amendments = [];
|
|
287
|
+
const lines = content.split('\n');
|
|
288
|
+
for (const line of lines) {
|
|
289
|
+
const match = line.match(AMENDMENT_LINK_PATTERN);
|
|
290
|
+
if (match && match[1] && match[2]) {
|
|
291
|
+
// Extract title after the link
|
|
292
|
+
const titleMatch = line.match(/\]\([^)]+\)\s*[—–-]\s*(.+)$/);
|
|
293
|
+
amendments.push({
|
|
294
|
+
id: `AMEND-${match[1].padStart(3, '0')}`,
|
|
295
|
+
title: titleMatch?.[1]?.trim() ?? '',
|
|
296
|
+
path: match[2],
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return amendments;
|
|
301
|
+
}
|
|
302
|
+
// ============================================================================
|
|
303
|
+
// Changelog Parser
|
|
304
|
+
// ============================================================================
|
|
305
|
+
function parseChangelog(content) {
|
|
306
|
+
const changelog = [];
|
|
307
|
+
const lines = content.split('\n');
|
|
308
|
+
for (const line of lines) {
|
|
309
|
+
const match = line.match(CHANGELOG_ROW_PATTERN);
|
|
310
|
+
if (match && match[1] && match[2] && match[3] && match[4]) {
|
|
311
|
+
changelog.push({
|
|
312
|
+
version: parseInt(match[1], 10),
|
|
313
|
+
date: match[2].trim(),
|
|
314
|
+
agent: match[3].trim(),
|
|
315
|
+
summary: match[4].trim(),
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return changelog;
|
|
320
|
+
}
|
|
321
|
+
// ============================================================================
|
|
322
|
+
// Main Parser
|
|
323
|
+
// ============================================================================
|
|
324
|
+
export function parsePlan(content) {
|
|
325
|
+
const errors = [];
|
|
326
|
+
const warnings = [];
|
|
327
|
+
try {
|
|
328
|
+
// Parse frontmatter
|
|
329
|
+
const { data: frontmatter, content: body } = matter(content);
|
|
330
|
+
// Validate required frontmatter
|
|
331
|
+
if (!frontmatter.conductor) {
|
|
332
|
+
errors.push({
|
|
333
|
+
message: 'Missing required frontmatter field: conductor',
|
|
334
|
+
severity: 'error',
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
if (!frontmatter.spec) {
|
|
338
|
+
errors.push({
|
|
339
|
+
message: 'Missing required frontmatter field: spec',
|
|
340
|
+
severity: 'error',
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
// Extract title
|
|
344
|
+
const titleMatch = body.match(/^#\s+(.+)$/m);
|
|
345
|
+
const title = titleMatch?.[1]?.trim() ?? '';
|
|
346
|
+
// Extract summary section (text before first ## Track)
|
|
347
|
+
const summaryMatch = body.match(/^##\s+Summary\n([\s\S]*?)(?=\n##\s+(?:Track|Phase))/);
|
|
348
|
+
const summaryContent = summaryMatch?.[1] ?? '';
|
|
349
|
+
const summaryText = summaryContent.split('\n')[0]?.trim() ?? '';
|
|
350
|
+
const metrics = parseSummaryTable(summaryContent);
|
|
351
|
+
// Extract tracks
|
|
352
|
+
const trackSections = extractTracks(body);
|
|
353
|
+
const tracks = trackSections.map((section, index) => parseTrack(section, index));
|
|
354
|
+
// Update metrics from actual tracks
|
|
355
|
+
metrics.totalTracks = tracks.length;
|
|
356
|
+
metrics.completedTracks = tracks.filter((t) => t.status === 'complete').length;
|
|
357
|
+
metrics.progress =
|
|
358
|
+
tracks.length > 0
|
|
359
|
+
? Math.round((metrics.completedTracks / tracks.length) * 100)
|
|
360
|
+
: 0;
|
|
361
|
+
// Extract pending amendments section
|
|
362
|
+
const amendmentsMatch = body.match(/##\s+Pending Amendments\n([\s\S]*?)(?=\n##|$)/);
|
|
363
|
+
const pendingAmendments = amendmentsMatch
|
|
364
|
+
? parsePendingAmendments(amendmentsMatch[1] ?? '')
|
|
365
|
+
: [];
|
|
366
|
+
// Extract changelog
|
|
367
|
+
const changelogMatch = body.match(/##\s+Change Log\n([\s\S]*?)(?=\n##|$)/);
|
|
368
|
+
const changelog = changelogMatch
|
|
369
|
+
? parseChangelog(changelogMatch[1] ?? '')
|
|
370
|
+
: [];
|
|
371
|
+
// Warnings
|
|
372
|
+
if (tracks.length === 0) {
|
|
373
|
+
warnings.push({
|
|
374
|
+
message: 'No tracks found in plan',
|
|
375
|
+
severity: 'warning',
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
const blockedTracks = tracks.filter((t) => t.status === 'blocked');
|
|
379
|
+
if (blockedTracks.length > 0) {
|
|
380
|
+
warnings.push({
|
|
381
|
+
message: `${blockedTracks.length} track(s) are blocked`,
|
|
382
|
+
severity: 'warning',
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
if (errors.length > 0) {
|
|
386
|
+
return { success: false, errors, warnings };
|
|
387
|
+
}
|
|
388
|
+
return {
|
|
389
|
+
success: true,
|
|
390
|
+
data: {
|
|
391
|
+
frontmatter: {
|
|
392
|
+
conductor: frontmatter.conductor ?? '1.0',
|
|
393
|
+
spec: frontmatter.spec ?? '',
|
|
394
|
+
spec_version: frontmatter.spec_version ?? '1.0.0',
|
|
395
|
+
plan_version: frontmatter.plan_version ?? 1,
|
|
396
|
+
status: frontmatter.status ?? 'pending',
|
|
397
|
+
created: frontmatter.created ?? '',
|
|
398
|
+
updated: frontmatter.updated ?? '',
|
|
399
|
+
},
|
|
400
|
+
title,
|
|
401
|
+
summary: summaryText,
|
|
402
|
+
metrics,
|
|
403
|
+
tracks,
|
|
404
|
+
pendingAmendments,
|
|
405
|
+
changelog,
|
|
406
|
+
raw: content,
|
|
407
|
+
},
|
|
408
|
+
errors: [],
|
|
409
|
+
warnings,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
return {
|
|
414
|
+
success: false,
|
|
415
|
+
errors: [
|
|
416
|
+
{
|
|
417
|
+
message: `Failed to parse plan: ${error instanceof Error ? error.message : String(error)}`,
|
|
418
|
+
severity: 'error',
|
|
419
|
+
},
|
|
420
|
+
],
|
|
421
|
+
warnings: [],
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// ============================================================================
|
|
426
|
+
// Task Operations
|
|
427
|
+
// ============================================================================
|
|
428
|
+
/**
|
|
429
|
+
* Find a task by ID in a plan
|
|
430
|
+
*/
|
|
431
|
+
export function findTask(plan, taskId) {
|
|
432
|
+
for (const track of plan.tracks) {
|
|
433
|
+
const found = findTaskInList(track.tasks, taskId);
|
|
434
|
+
if (found)
|
|
435
|
+
return found;
|
|
436
|
+
}
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
function findTaskInList(tasks, taskId) {
|
|
440
|
+
for (const task of tasks) {
|
|
441
|
+
if (task.id === taskId)
|
|
442
|
+
return task;
|
|
443
|
+
const found = findTaskInList(task.subtasks, taskId);
|
|
444
|
+
if (found)
|
|
445
|
+
return found;
|
|
446
|
+
}
|
|
447
|
+
return null;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Count tasks by state
|
|
451
|
+
*/
|
|
452
|
+
export function countTasksByState(plan) {
|
|
453
|
+
const counts = {
|
|
454
|
+
pending: 0,
|
|
455
|
+
in_progress: 0,
|
|
456
|
+
complete: 0,
|
|
457
|
+
blocked: 0,
|
|
458
|
+
};
|
|
459
|
+
for (const track of plan.tracks) {
|
|
460
|
+
countTasksInList(track.tasks, counts);
|
|
461
|
+
}
|
|
462
|
+
return counts;
|
|
463
|
+
}
|
|
464
|
+
function countTasksInList(tasks, counts) {
|
|
465
|
+
for (const task of tasks) {
|
|
466
|
+
counts[task.state]++;
|
|
467
|
+
countTasksInList(task.subtasks, counts);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Get next pending task
|
|
472
|
+
*/
|
|
473
|
+
export function getNextPendingTask(plan) {
|
|
474
|
+
for (const track of plan.tracks) {
|
|
475
|
+
if (track.status === 'blocked')
|
|
476
|
+
continue;
|
|
477
|
+
// Check dependencies
|
|
478
|
+
const depsComplete = track.dependencies.every((depName) => {
|
|
479
|
+
const depTrack = plan.tracks.find((t) => t.name === depName);
|
|
480
|
+
return depTrack?.status === 'complete';
|
|
481
|
+
});
|
|
482
|
+
if (!depsComplete)
|
|
483
|
+
continue;
|
|
484
|
+
const pending = findPendingInList(track.tasks);
|
|
485
|
+
if (pending)
|
|
486
|
+
return pending;
|
|
487
|
+
}
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
function findPendingInList(tasks) {
|
|
491
|
+
for (const task of tasks) {
|
|
492
|
+
if (task.state === 'pending')
|
|
493
|
+
return task;
|
|
494
|
+
if (task.state === 'in_progress') {
|
|
495
|
+
// Check subtasks
|
|
496
|
+
const pending = findPendingInList(task.subtasks);
|
|
497
|
+
if (pending)
|
|
498
|
+
return pending;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return null;
|
|
502
|
+
}
|
|
503
|
+
//# sourceMappingURL=plan-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan-parser.js","sourceRoot":"","sources":["../../src/parsers/plan-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses Conductor spec.md files into structured data.
|
|
5
|
+
* Extracts frontmatter, success criteria, constraints, ADRs, and interfaces.
|
|
6
|
+
*/
|
|
7
|
+
import type { ParsedSpec, ParseResult, ParseError } from './types.js';
|
|
8
|
+
export declare function parseSpec(content: string): ParseResult<ParsedSpec>;
|
|
9
|
+
export declare function validateSpec(spec: ParsedSpec): ParseError[];
|
|
10
|
+
//# sourceMappingURL=spec-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/spec-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,UAAU,EAKV,WAAW,EACX,UAAU,EACX,MAAM,YAAY,CAAC;AAmSpB,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,CAkIlE;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,CAsB3D"}
|