@luckydraw/cumulus 1.0.35 → 1.0.37
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/CHANGELOG.md +26 -1
- package/dist/gateway/adapters/webchat.d.ts.map +1 -1
- package/dist/gateway/adapters/webchat.js +54 -0
- package/dist/gateway/adapters/webchat.js.map +1 -1
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/gateway/server.js +30 -3
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/stall-detection.d.ts +48 -0
- package/dist/gateway/stall-detection.d.ts.map +1 -1
- package/dist/gateway/stall-detection.js +52 -0
- package/dist/gateway/stall-detection.js.map +1 -1
- package/dist/gateway/static/widget.js +458 -0
- package/dist/gateway/tasks.d.ts +35 -0
- package/dist/gateway/tasks.d.ts.map +1 -0
- package/dist/gateway/tasks.js +84 -0
- package/dist/gateway/tasks.js.map +1 -0
- package/dist/lib/config.d.ts +2 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +11 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/tasks-file.d.ts +115 -0
- package/dist/lib/tasks-file.d.ts.map +1 -0
- package/dist/lib/tasks-file.js +433 -0
- package/dist/lib/tasks-file.js.map +1 -0
- package/dist/lib/tasks-format.d.ts +16 -0
- package/dist/lib/tasks-format.d.ts.map +1 -0
- package/dist/lib/tasks-format.js +58 -0
- package/dist/lib/tasks-format.js.map +1 -0
- package/dist/lib/templates.d.ts.map +1 -1
- package/dist/lib/templates.js +5 -1
- package/dist/lib/templates.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task 176 — `Tasks.md` as a machine format.
|
|
3
|
+
*
|
|
4
|
+
* The file is managed by the gateway and by agents writing through the schema
|
|
5
|
+
* prescribed inside the file itself; humans read it, they do not hand-edit it.
|
|
6
|
+
*
|
|
7
|
+
* Structure (in order):
|
|
8
|
+
*
|
|
9
|
+
* # <title>
|
|
10
|
+
* <!-- cumulus:tasks v1 -->
|
|
11
|
+
*
|
|
12
|
+
* ## Format ← verbatim instructions. NOT parsed. ALWAYS sent to the model.
|
|
13
|
+
* ## Queue ← the build order, top to bottom
|
|
14
|
+
* ## Done ← finished work. Parsed, never sent to the model.
|
|
15
|
+
*
|
|
16
|
+
* A row is `- [status] <id> · <title>`, indented two spaces per depth level.
|
|
17
|
+
* A row indented under another is BLOCKED BY the nearest row above it one
|
|
18
|
+
* level shallower, so a blocker is always above what it blocks and the first
|
|
19
|
+
* row of the queue can never be blocked.
|
|
20
|
+
*
|
|
21
|
+
* Fields are indented `key value` lines under their row. Exactly five keys
|
|
22
|
+
* parse; anything else in a parsed section is a hard error rather than a
|
|
23
|
+
* silent skip, because a silent skip is how a drag-reorder loses data.
|
|
24
|
+
*/
|
|
25
|
+
import { TASKS_FORMAT_SECTION } from './tasks-format.js';
|
|
26
|
+
export { TASKS_FORMAT_SECTION };
|
|
27
|
+
/** Presence of this line is what makes a `Tasks.md` a schema file. */
|
|
28
|
+
export const TASKS_FILE_MARKER = '<!-- cumulus:tasks v1 -->';
|
|
29
|
+
/** Field keys the parser accepts. Nothing else parses. */
|
|
30
|
+
export const TASK_FIELD_KEYS = ['doc', 'phase', 'note', 'dep', 'done'];
|
|
31
|
+
/** Two spaces of indent per level of dependency nesting. */
|
|
32
|
+
const INDENT_UNIT = 2;
|
|
33
|
+
/** Fields sit one further indent unit past their row, for legibility only. */
|
|
34
|
+
const FIELD_INDENT = 4;
|
|
35
|
+
/** The only legal `dep` value — an edge the migration proposed, not one Karl confirmed. */
|
|
36
|
+
const DEP_PROPOSED = 'proposed';
|
|
37
|
+
/** Thrown by the mutation helpers when a requested change would break the schema. */
|
|
38
|
+
export class TasksFileError extends Error {
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* A new project's `Tasks.md`. Scaffolding emits the schema rather than a bare
|
|
42
|
+
* title, so a freshly created thread's drawer works on its first open — a
|
|
43
|
+
* scaffold that produced the old free-form shape would leave two formats alive.
|
|
44
|
+
*/
|
|
45
|
+
export function emptyTasksFile(projectName) {
|
|
46
|
+
return [
|
|
47
|
+
`# ${projectName} Tasks`,
|
|
48
|
+
'',
|
|
49
|
+
TASKS_FILE_MARKER,
|
|
50
|
+
'',
|
|
51
|
+
TASKS_FORMAT_SECTION,
|
|
52
|
+
'',
|
|
53
|
+
'## Queue',
|
|
54
|
+
'',
|
|
55
|
+
'## Done',
|
|
56
|
+
'',
|
|
57
|
+
].join('\n');
|
|
58
|
+
}
|
|
59
|
+
const ROW_RE = /^( *)- \[([^\]]*)\] (\d+) · (.+)$/;
|
|
60
|
+
const FIELD_RE = /^( +)([a-z]+) +(.+)$/;
|
|
61
|
+
const HEADING_RE = /^## +(.+?) *$/;
|
|
62
|
+
export function hasTasksMarker(content) {
|
|
63
|
+
return content.includes(TASKS_FILE_MARKER);
|
|
64
|
+
}
|
|
65
|
+
function applyHeading(file, state, raw, headingName, lineNo, fail) {
|
|
66
|
+
state.current = null;
|
|
67
|
+
const name = headingName.toLowerCase();
|
|
68
|
+
if (name === 'format') {
|
|
69
|
+
state.section = 'format';
|
|
70
|
+
state.rows = null;
|
|
71
|
+
file.format.push(raw);
|
|
72
|
+
}
|
|
73
|
+
else if (name === 'queue') {
|
|
74
|
+
state.section = 'queue';
|
|
75
|
+
state.rows = file.queue;
|
|
76
|
+
}
|
|
77
|
+
else if (name === 'done') {
|
|
78
|
+
state.section = 'done';
|
|
79
|
+
state.rows = file.done;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
state.section = 'unknown';
|
|
83
|
+
state.rows = null;
|
|
84
|
+
fail(lineNo, raw, `Unknown section "${headingName}" — only Format, Queue and Done exist`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function applyRow(state, match, raw, lineNo, fail) {
|
|
88
|
+
const rows = state.rows;
|
|
89
|
+
if (!rows)
|
|
90
|
+
return;
|
|
91
|
+
const indent = match[1] ?? '';
|
|
92
|
+
if (indent.length % INDENT_UNIT !== 0) {
|
|
93
|
+
fail(lineNo, raw, `Indent of ${indent.length} is not a multiple of ${INDENT_UNIT}`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const depth = indent.length / INDENT_UNIT;
|
|
97
|
+
const last = rows[rows.length - 1];
|
|
98
|
+
if (depth > (last ? last.depth : -1) + 1) {
|
|
99
|
+
fail(lineNo, raw, `Depth ${depth} has no row at depth ${depth - 1} above it`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const row = {
|
|
103
|
+
id: match[3] ?? '',
|
|
104
|
+
status: match[2] ?? '',
|
|
105
|
+
title: (match[4] ?? '').trim(),
|
|
106
|
+
depth,
|
|
107
|
+
notes: [],
|
|
108
|
+
depProposed: false,
|
|
109
|
+
};
|
|
110
|
+
rows.push(row);
|
|
111
|
+
state.current = row;
|
|
112
|
+
state.currentIndent = indent.length;
|
|
113
|
+
}
|
|
114
|
+
function applyFieldLine(state, match, raw, lineNo, fail) {
|
|
115
|
+
const indent = match[1] ?? '';
|
|
116
|
+
const key = match[2] ?? '';
|
|
117
|
+
const value = match[3] ?? '';
|
|
118
|
+
if (!state.current) {
|
|
119
|
+
fail(lineNo, raw, `Field "${key}" has no task row above it`);
|
|
120
|
+
}
|
|
121
|
+
else if (indent.length <= state.currentIndent) {
|
|
122
|
+
fail(lineNo, raw, `Field "${key}" must be indented past its row`);
|
|
123
|
+
}
|
|
124
|
+
else if (!TASK_FIELD_KEYS.includes(key)) {
|
|
125
|
+
fail(lineNo, raw, `Unknown field "${key}" — expected one of ${TASK_FIELD_KEYS.join(', ')}`);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
applyField(state.current, key, value.trim(), lineNo, raw, fail);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Parse a schema `Tasks.md`. Always returns a file — errors are collected, not
|
|
133
|
+
* thrown, so the drawer can show a broken line instead of an empty panel. Writes
|
|
134
|
+
* are refused while `errors` is non-empty (see {@link assertWritable}).
|
|
135
|
+
*/
|
|
136
|
+
export function parseTasksFile(content) {
|
|
137
|
+
const file = { preamble: [], format: [], queue: [], done: [], errors: [] };
|
|
138
|
+
const state = { section: 'preamble', rows: null, current: null, currentIndent: 0 };
|
|
139
|
+
const fail = (line, text, reason) => file.errors.push({ line, text, reason });
|
|
140
|
+
const lines = content.split('\n');
|
|
141
|
+
for (let i = 0; i < lines.length; i++) {
|
|
142
|
+
const raw = lines[i] ?? '';
|
|
143
|
+
const lineNo = i + 1;
|
|
144
|
+
const heading = HEADING_RE.exec(raw);
|
|
145
|
+
if (heading) {
|
|
146
|
+
applyHeading(file, state, raw, heading[1] ?? '', lineNo, fail);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (state.section === 'preamble') {
|
|
150
|
+
file.preamble.push(raw);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (state.section === 'format') {
|
|
154
|
+
// Verbatim. The Format section documents the row syntax, so its example
|
|
155
|
+
// lines LOOK like rows — parsing it would be parsing the manual.
|
|
156
|
+
file.format.push(raw);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (state.section === 'unknown' || raw.trim() === '')
|
|
160
|
+
continue;
|
|
161
|
+
const rowMatch = ROW_RE.exec(raw);
|
|
162
|
+
if (rowMatch && state.rows) {
|
|
163
|
+
applyRow(state, rowMatch, raw, lineNo, fail);
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
const fieldMatch = FIELD_RE.exec(raw);
|
|
167
|
+
if (fieldMatch) {
|
|
168
|
+
applyFieldLine(state, fieldMatch, raw, lineNo, fail);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
fail(lineNo, raw, 'Not a task row, a field, a heading or blank');
|
|
172
|
+
}
|
|
173
|
+
const seen = new Set();
|
|
174
|
+
for (const row of [...file.queue, ...file.done]) {
|
|
175
|
+
if (seen.has(row.id)) {
|
|
176
|
+
file.errors.push({ line: 0, text: row.id, reason: `Duplicate task id ${row.id}` });
|
|
177
|
+
}
|
|
178
|
+
seen.add(row.id);
|
|
179
|
+
}
|
|
180
|
+
return file;
|
|
181
|
+
}
|
|
182
|
+
function applyField(row, key, value, lineNo, raw, fail) {
|
|
183
|
+
switch (key) {
|
|
184
|
+
case 'doc':
|
|
185
|
+
row.doc = value;
|
|
186
|
+
break;
|
|
187
|
+
case 'phase':
|
|
188
|
+
row.phase = value;
|
|
189
|
+
break;
|
|
190
|
+
case 'note':
|
|
191
|
+
row.notes.push(value);
|
|
192
|
+
break;
|
|
193
|
+
case 'done':
|
|
194
|
+
row.done = value;
|
|
195
|
+
break;
|
|
196
|
+
case 'dep':
|
|
197
|
+
if (value !== DEP_PROPOSED) {
|
|
198
|
+
fail(lineNo, raw, `dep must be "${DEP_PROPOSED}" — got "${value}"`);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (row.depth === 0) {
|
|
202
|
+
fail(lineNo, raw, 'dep proposed on a row that is not indented under a blocker');
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
row.depProposed = true;
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// ── Serialization ────────────────────────────────────────────────────────────
|
|
210
|
+
function serializeRow(row) {
|
|
211
|
+
const indent = ' '.repeat(row.depth * INDENT_UNIT);
|
|
212
|
+
const fieldIndent = ' '.repeat(row.depth * INDENT_UNIT + FIELD_INDENT);
|
|
213
|
+
const out = [`${indent}- [${row.status}] ${row.id} · ${row.title}`];
|
|
214
|
+
const field = (key, value) => out.push(`${fieldIndent}${key.padEnd(5)} ${value}`);
|
|
215
|
+
// Short identifying fields first, prose last — `note` is the only repeatable
|
|
216
|
+
// key and the only one that can run long.
|
|
217
|
+
if (row.doc)
|
|
218
|
+
field('doc', row.doc);
|
|
219
|
+
if (row.phase)
|
|
220
|
+
field('phase', row.phase);
|
|
221
|
+
if (row.depProposed)
|
|
222
|
+
field('dep', DEP_PROPOSED);
|
|
223
|
+
if (row.done)
|
|
224
|
+
field('done', row.done);
|
|
225
|
+
for (const note of row.notes)
|
|
226
|
+
field('note', note);
|
|
227
|
+
return out;
|
|
228
|
+
}
|
|
229
|
+
/** Round-trips a parsed file. Rewrites field order and spacing to canonical form. */
|
|
230
|
+
export function serializeTasksFile(file) {
|
|
231
|
+
const out = [...file.preamble];
|
|
232
|
+
if (file.format.length > 0)
|
|
233
|
+
out.push(...file.format);
|
|
234
|
+
out.push('', '## Queue', '');
|
|
235
|
+
for (const row of file.queue)
|
|
236
|
+
out.push(...serializeRow(row));
|
|
237
|
+
out.push('', '## Done', '');
|
|
238
|
+
for (const row of file.done)
|
|
239
|
+
out.push(...serializeRow(row));
|
|
240
|
+
out.push('');
|
|
241
|
+
// Collapse any run of blank lines the sections introduced at their seams.
|
|
242
|
+
const collapsed = [];
|
|
243
|
+
for (const line of out) {
|
|
244
|
+
if (line === '' && collapsed[collapsed.length - 1] === '')
|
|
245
|
+
continue;
|
|
246
|
+
collapsed.push(line);
|
|
247
|
+
}
|
|
248
|
+
return collapsed.join('\n');
|
|
249
|
+
}
|
|
250
|
+
// ── Tree helpers ─────────────────────────────────────────────────────────────
|
|
251
|
+
/** Row at a known-valid index. Loud rather than undefined — every caller below
|
|
252
|
+
* has already established the index exists, so a miss is a bug, not a case. */
|
|
253
|
+
function at(rows, i) {
|
|
254
|
+
const row = rows[i];
|
|
255
|
+
if (!row)
|
|
256
|
+
throw new TasksFileError(`No task row at index ${i}`);
|
|
257
|
+
return row;
|
|
258
|
+
}
|
|
259
|
+
/** Last index of the subtree rooted at `i` (every following row deeper than it). */
|
|
260
|
+
export function subtreeEnd(rows, i) {
|
|
261
|
+
const depth = at(rows, i).depth;
|
|
262
|
+
let end = i;
|
|
263
|
+
for (let j = i + 1; j < rows.length && at(rows, j).depth > depth; j++)
|
|
264
|
+
end = j;
|
|
265
|
+
return end;
|
|
266
|
+
}
|
|
267
|
+
/** Index of the row that blocks `i`, or -1 when `i` is not blocked. */
|
|
268
|
+
export function parentIndexOf(rows, i) {
|
|
269
|
+
const depth = at(rows, i).depth;
|
|
270
|
+
if (depth === 0)
|
|
271
|
+
return -1;
|
|
272
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
273
|
+
if (at(rows, j).depth === depth - 1)
|
|
274
|
+
return j;
|
|
275
|
+
}
|
|
276
|
+
return -1;
|
|
277
|
+
}
|
|
278
|
+
/** Index of the depth-0 row whose cluster contains `i`. */
|
|
279
|
+
export function rootIndexOf(rows, i) {
|
|
280
|
+
for (let j = i; j >= 0; j--) {
|
|
281
|
+
if (at(rows, j).depth === 0)
|
|
282
|
+
return j;
|
|
283
|
+
}
|
|
284
|
+
return 0;
|
|
285
|
+
}
|
|
286
|
+
function indexOfId(rows, id) {
|
|
287
|
+
const i = rows.findIndex(r => r.id === id);
|
|
288
|
+
if (i === -1)
|
|
289
|
+
throw new TasksFileError(`No task ${id} in the queue`);
|
|
290
|
+
return i;
|
|
291
|
+
}
|
|
292
|
+
// ── Mutations ────────────────────────────────────────────────────────────────
|
|
293
|
+
/**
|
|
294
|
+
* Move `dragId` relative to `targetId`. Three cases, one rule — the cluster is
|
|
295
|
+
* the unit of movement, and a drag can never separate a task from its blocker:
|
|
296
|
+
*
|
|
297
|
+
* - same parent → sibling reorder, dragged row's subtree travels
|
|
298
|
+
* - different cluster → the dragged row's WHOLE cluster moves, blocker first
|
|
299
|
+
* - same cluster, other parent → illegal, nothing is written
|
|
300
|
+
*/
|
|
301
|
+
export function moveTask(rows, dragId, targetId, position) {
|
|
302
|
+
if (dragId === targetId)
|
|
303
|
+
return rows.slice();
|
|
304
|
+
const di = indexOfId(rows, dragId);
|
|
305
|
+
const ti = indexOfId(rows, targetId);
|
|
306
|
+
const sameParent = parentIndexOf(rows, di) === parentIndexOf(rows, ti);
|
|
307
|
+
const sameCluster = rootIndexOf(rows, di) === rootIndexOf(rows, ti);
|
|
308
|
+
if (sameCluster && !sameParent) {
|
|
309
|
+
throw new TasksFileError(`${dragId} and ${targetId} are in the same dependency cluster but have different blockers — ` +
|
|
310
|
+
`reorder siblings, or change the dependency in the row's menu`);
|
|
311
|
+
}
|
|
312
|
+
// Which block travels: the row itself when reordering siblings, the whole
|
|
313
|
+
// cluster when leaving. The second case is what makes a blocker follow the
|
|
314
|
+
// task it blocks and land ahead of it.
|
|
315
|
+
const [from, to] = sameParent ? [di, subtreeEnd(rows, di)] : movingCluster(rows, di);
|
|
316
|
+
if (ti >= from && ti <= to) {
|
|
317
|
+
throw new TasksFileError(`Cannot drop ${dragId} inside its own dependency cluster`);
|
|
318
|
+
}
|
|
319
|
+
const [anchorStart, anchorEnd] = sameParent
|
|
320
|
+
? [ti, subtreeEnd(rows, ti)]
|
|
321
|
+
: movingCluster(rows, ti);
|
|
322
|
+
const block = rows.slice(from, to + 1);
|
|
323
|
+
const rest = [...rows.slice(0, from), ...rows.slice(to + 1)];
|
|
324
|
+
// Recompute the anchor's position in the array the block was lifted out of.
|
|
325
|
+
const shift = (n) => (n > to ? n - block.length : n);
|
|
326
|
+
const insertAt = position === 'before' ? shift(anchorStart) : shift(anchorEnd) + 1;
|
|
327
|
+
const next = [...rest.slice(0, insertAt), ...block, ...rest.slice(insertAt)];
|
|
328
|
+
assertValidQueue(next);
|
|
329
|
+
return next;
|
|
330
|
+
}
|
|
331
|
+
function movingCluster(rows, i) {
|
|
332
|
+
const root = rootIndexOf(rows, i);
|
|
333
|
+
return [root, subtreeEnd(rows, root)];
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Accept or reject a proposed dependency edge. Accepting keeps the nesting and
|
|
337
|
+
* drops the marker; rejecting outdents the row and its subtree to depth 0 and
|
|
338
|
+
* lands them after the cluster they just left.
|
|
339
|
+
*/
|
|
340
|
+
export function resolveProposedDep(rows, id, accept) {
|
|
341
|
+
const i = indexOfId(rows, id);
|
|
342
|
+
const row = at(rows, i);
|
|
343
|
+
if (!row.depProposed) {
|
|
344
|
+
throw new TasksFileError(`Task ${id} has no proposed dependency to resolve`);
|
|
345
|
+
}
|
|
346
|
+
if (accept) {
|
|
347
|
+
const next = rows.map(r => (r.id === id ? { ...r, depProposed: false } : r));
|
|
348
|
+
assertValidQueue(next);
|
|
349
|
+
return next;
|
|
350
|
+
}
|
|
351
|
+
const end = subtreeEnd(rows, i);
|
|
352
|
+
const shed = row.depth;
|
|
353
|
+
const block = rows
|
|
354
|
+
.slice(i, end + 1)
|
|
355
|
+
.map(r => ({ ...r, depth: r.depth - shed, depProposed: r.id === id ? false : r.depProposed }));
|
|
356
|
+
const rest = [...rows.slice(0, i), ...rows.slice(end + 1)];
|
|
357
|
+
// Land after whatever remains of the cluster it was pulled out of. The root
|
|
358
|
+
// is always strictly above `i` (an indented row has a blocker above it), so
|
|
359
|
+
// its index is unchanged by lifting the block out.
|
|
360
|
+
const rootAt = rootIndexOf(rows, i);
|
|
361
|
+
const insertAt = subtreeEnd(rest, rootAt) + 1;
|
|
362
|
+
const next = [...rest.slice(0, insertAt), ...block, ...rest.slice(insertAt)];
|
|
363
|
+
assertValidQueue(next);
|
|
364
|
+
return next;
|
|
365
|
+
}
|
|
366
|
+
/** Structural invariants every write must preserve. */
|
|
367
|
+
export function assertValidQueue(rows) {
|
|
368
|
+
if (rows.length === 0)
|
|
369
|
+
return;
|
|
370
|
+
if (at(rows, 0).depth !== 0) {
|
|
371
|
+
throw new TasksFileError('The first task in the queue cannot be blocked');
|
|
372
|
+
}
|
|
373
|
+
for (let i = 1; i < rows.length; i++) {
|
|
374
|
+
if (at(rows, i).depth > at(rows, i - 1).depth + 1) {
|
|
375
|
+
throw new TasksFileError(`Task ${at(rows, i).id} is nested under nothing`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
/** Refuses writes to a file the parser did not fully understand. */
|
|
380
|
+
export function assertWritable(file) {
|
|
381
|
+
if (file.errors.length > 0) {
|
|
382
|
+
const first = file.errors[0] ?? { line: 0, reason: 'unknown' };
|
|
383
|
+
throw new TasksFileError(`Tasks.md has ${file.errors.length} unparsed line(s) — refusing to write. ` +
|
|
384
|
+
`First: line ${first.line}: ${first.reason}`);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// ── Prompt projection ────────────────────────────────────────────────────────
|
|
388
|
+
/**
|
|
389
|
+
* What the model sees. The `## Format` section is verbatim (it is the
|
|
390
|
+
* instructions for writing the file back), the task in hand is in full, the
|
|
391
|
+
* rest of the queue is title lines, and `## Done` is one summary line.
|
|
392
|
+
*
|
|
393
|
+
* Returns null when `content` is not a schema tasks file, so an un-migrated
|
|
394
|
+
* `Tasks.md` in any other project is passed through untouched.
|
|
395
|
+
*/
|
|
396
|
+
export function projectTasksFile(content) {
|
|
397
|
+
if (!hasTasksMarker(content))
|
|
398
|
+
return null;
|
|
399
|
+
const file = parseTasksFile(content);
|
|
400
|
+
const out = [];
|
|
401
|
+
for (const line of file.preamble) {
|
|
402
|
+
if (line.includes(TASKS_FILE_MARKER))
|
|
403
|
+
continue;
|
|
404
|
+
out.push(line);
|
|
405
|
+
}
|
|
406
|
+
if (file.format.length > 0)
|
|
407
|
+
out.push(...file.format);
|
|
408
|
+
out.push('', '## Queue', '');
|
|
409
|
+
if (file.queue.length === 0) {
|
|
410
|
+
out.push('(empty)');
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
// The task in hand — the top row, per Karl's "top of queue = what I'm on".
|
|
414
|
+
out.push(...serializeRow(at(file.queue, 0)));
|
|
415
|
+
for (const row of file.queue.slice(1)) {
|
|
416
|
+
const indent = ' '.repeat(row.depth * INDENT_UNIT);
|
|
417
|
+
out.push(`${indent}- [${row.status}] ${row.id} · ${row.title}`);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
out.push('', `## Done (${file.done.length} finished tasks, deliberately not included here)`, '');
|
|
421
|
+
if (file.errors.length > 0) {
|
|
422
|
+
out.push(`NOTE: ${file.errors.length} line(s) of Tasks.md do not match the format above ` +
|
|
423
|
+
`(first: line ${file.errors[0]?.line ?? 0}). Fix them before writing to the file.`, '');
|
|
424
|
+
}
|
|
425
|
+
const collapsed = [];
|
|
426
|
+
for (const line of out) {
|
|
427
|
+
if (line === '' && collapsed[collapsed.length - 1] === '')
|
|
428
|
+
continue;
|
|
429
|
+
collapsed.push(line);
|
|
430
|
+
}
|
|
431
|
+
return collapsed.join('\n');
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=tasks-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks-file.js","sourceRoot":"","sources":["../../src/lib/tasks-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task 176 — the tasks-file manual.
|
|
3
|
+
*
|
|
4
|
+
* Kept apart from the parser because it is a document, not code: it is seeded
|
|
5
|
+
* into every new `Tasks.md`, carried verbatim into every prompt, and locked
|
|
6
|
+
* against this repo's own file by a test — so the instructions a model reads
|
|
7
|
+
* cannot drift from the grammar the parser enforces.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The manual, verbatim — one copy, in code, seeded into every new tasks file and
|
|
11
|
+
* carried into every prompt. A test asserts this repo's own `Tasks.md` still
|
|
12
|
+
* matches it, so the instructions a model reads cannot drift from the grammar
|
|
13
|
+
* the parser enforces.
|
|
14
|
+
*/
|
|
15
|
+
export declare const TASKS_FORMAT_SECTION: string;
|
|
16
|
+
//# sourceMappingURL=tasks-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks-format.d.ts","sourceRoot":"","sources":["../../src/lib/tasks-format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QA0CrB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task 176 — the tasks-file manual.
|
|
3
|
+
*
|
|
4
|
+
* Kept apart from the parser because it is a document, not code: it is seeded
|
|
5
|
+
* into every new `Tasks.md`, carried verbatim into every prompt, and locked
|
|
6
|
+
* against this repo's own file by a test — so the instructions a model reads
|
|
7
|
+
* cannot drift from the grammar the parser enforces.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* The manual, verbatim — one copy, in code, seeded into every new tasks file and
|
|
11
|
+
* carried into every prompt. A test asserts this repo's own `Tasks.md` still
|
|
12
|
+
* matches it, so the instructions a model reads cannot drift from the grammar
|
|
13
|
+
* the parser enforces.
|
|
14
|
+
*/
|
|
15
|
+
export const TASKS_FORMAT_SECTION = [
|
|
16
|
+
'## Format',
|
|
17
|
+
'',
|
|
18
|
+
'This file is written by machines. Do not hand-edit it: every line must match the',
|
|
19
|
+
'grammar below, and the `/tasks` drawer refuses to write to a file it could not',
|
|
20
|
+
'fully parse.',
|
|
21
|
+
'',
|
|
22
|
+
'Three sections, in this order, and no others: `## Format`, `## Queue`, `## Done`.',
|
|
23
|
+
'',
|
|
24
|
+
'A TASK ROW is:',
|
|
25
|
+
'',
|
|
26
|
+
' - [status] <id> · <title>',
|
|
27
|
+
'',
|
|
28
|
+
'`status` is one of `[ ]` pending, `[◔]` scaffolded, `[◑]` fleshed out,',
|
|
29
|
+
'`[◕]` implemented, `[✅]` verified, `[❌]` failed. `id` is digits and unique across',
|
|
30
|
+
'the whole file. The separator is a middle dot `·`.',
|
|
31
|
+
'',
|
|
32
|
+
'FIELDS belong to the row above them and are indented four spaces past it:',
|
|
33
|
+
'',
|
|
34
|
+
' doc docs/tasks/176-tasks-file-schema-and-drawer.md',
|
|
35
|
+
' phase gateway-stability',
|
|
36
|
+
' note one line of detail — repeatable, and the only place prose belongs',
|
|
37
|
+
' dep proposed',
|
|
38
|
+
' done 2026-09-02',
|
|
39
|
+
'',
|
|
40
|
+
'Those five keys are the entire vocabulary. Any other key, and any other line',
|
|
41
|
+
'shape, is a parse error the drawer shows rather than skipping.',
|
|
42
|
+
'',
|
|
43
|
+
'DEPENDENCIES ARE INDENTATION. A row indented two spaces further than the row',
|
|
44
|
+
'above it is BLOCKED BY that row. Build order is top to bottom, so a blocker is',
|
|
45
|
+
'always above what it blocks, and the first row of `## Queue` can never be blocked:',
|
|
46
|
+
'',
|
|
47
|
+
' - [ ] 073 · StorePool reaping',
|
|
48
|
+
' - [ ] 074 · Content store eviction (cannot start until 073 lands)',
|
|
49
|
+
'',
|
|
50
|
+
'`dep proposed` marks a dependency that was guessed during migration rather than',
|
|
51
|
+
'confirmed by Karl; the drawer offers accept/reject on exactly those rows.',
|
|
52
|
+
'',
|
|
53
|
+
'`## Queue` is the build order and **the top row is the task in hand** — there is no',
|
|
54
|
+
'separate in-progress marker. `## Done` is finished work: it is kept for the record',
|
|
55
|
+
'and is never sent to a model. On finishing a task, move its row to the top of',
|
|
56
|
+
'`## Done` and add `done <YYYY-MM-DD>`.',
|
|
57
|
+
].join('\n');
|
|
58
|
+
//# sourceMappingURL=tasks-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks-format.js","sourceRoot":"","sources":["../../src/lib/tasks-format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,WAAW;IACX,EAAE;IACF,kFAAkF;IAClF,gFAAgF;IAChF,cAAc;IACd,EAAE;IACF,mFAAmF;IACnF,EAAE;IACF,gBAAgB;IAChB,EAAE;IACF,+BAA+B;IAC/B,EAAE;IACF,wEAAwE;IACxE,mFAAmF;IACnF,oDAAoD;IACpD,EAAE;IACF,2EAA2E;IAC3E,EAAE;IACF,2DAA2D;IAC3D,8BAA8B;IAC9B,8EAA8E;IAC9E,qBAAqB;IACrB,uBAAuB;IACvB,EAAE;IACF,8EAA8E;IAC9E,gEAAgE;IAChE,EAAE;IACF,8EAA8E;IAC9E,gFAAgF;IAChF,oFAAoF;IACpF,EAAE;IACF,mCAAmC;IACnC,4EAA4E;IAC5E,EAAE;IACF,iFAAiF;IACjF,2EAA2E;IAC3E,EAAE;IACF,qFAAqF;IACrF,oFAAoF;IACpF,+EAA+E;IAC/E,wCAAwC;CACzC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAC;CAChC;AA4BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,eAAe,CAEhF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,EACpB,eAAe,CAAC,EAAE,eAAe,GAChC,MAAM,EAAE,CAGV"}
|
package/dist/lib/templates.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import * as fs from 'fs';
|
|
6
6
|
import * as os from 'os';
|
|
7
7
|
import * as path from 'path';
|
|
8
|
+
import { emptyTasksFile } from './tasks-file.js';
|
|
8
9
|
const CUMULUS_DIR = process.env.CUMULUS_DIR || path.join(os.homedir(), '.cumulus');
|
|
9
10
|
const TEMPLATES_DIR = path.join(CUMULUS_DIR, 'templates');
|
|
10
11
|
// ─── Default templates ───────────────────────────────────────────────────────
|
|
@@ -22,7 +23,10 @@ const DEFAULT_TEMPLATES = {
|
|
|
22
23
|
};
|
|
23
24
|
// ─── Default file contents ───────────────────────────────────────────────────
|
|
24
25
|
function defaultTasksMd(projectName) {
|
|
25
|
-
|
|
26
|
+
// Task 176: the schema, not a bare title — a scaffold that emitted the old
|
|
27
|
+
// free-form shape would keep two formats alive, and the new thread's `/tasks`
|
|
28
|
+
// drawer would report it as "no tasks file".
|
|
29
|
+
return emptyTasksFile(projectName);
|
|
26
30
|
}
|
|
27
31
|
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
28
32
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACnF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAc1D,gFAAgF;AAEhF,MAAM,iBAAiB,GAAoB;IACzC,OAAO,EAAE;QACP,QAAQ,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,iBAAiB,CAAC;QACxD,aAAa,EAAE,CAAC,UAAU,CAAC;QAC3B,YAAY,EAAE,EAAE;KACjB;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,CAAC;QAC3E,aAAa,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;QACxC,YAAY,EAAE,EAAE;KACjB;CACF,CAAC;AAEF,gFAAgF;AAEhF,SAAS,cAAc,CAAC,WAAmB;IACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"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"}
|