@luckydraw/cumulus 1.0.36 → 1.0.38

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.
@@ -0,0 +1,457 @@
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
+ /**
30
+ * Task 177: how far into a file the marker may sit. Both converted files carry
31
+ * it on line 3, under the title. A bound is what stops a document that *quotes*
32
+ * the marker — a rules file, a migration instruction, this repo's task docs —
33
+ * from being read as a task list.
34
+ */
35
+ const MARKER_MAX_LINE = 10;
36
+ /** Field keys the parser accepts. Nothing else parses. */
37
+ export const TASK_FIELD_KEYS = ['doc', 'phase', 'note', 'dep', 'done'];
38
+ /** Two spaces of indent per level of dependency nesting. */
39
+ const INDENT_UNIT = 2;
40
+ /** Fields sit one further indent unit past their row, for legibility only. */
41
+ const FIELD_INDENT = 4;
42
+ /** The only legal `dep` value — an edge the migration proposed, not one Karl confirmed. */
43
+ const DEP_PROPOSED = 'proposed';
44
+ /** Thrown by the mutation helpers when a requested change would break the schema. */
45
+ export class TasksFileError extends Error {
46
+ }
47
+ /**
48
+ * A new project's `Tasks.md`. Scaffolding emits the schema rather than a bare
49
+ * title, so a freshly created thread's drawer works on its first open — a
50
+ * scaffold that produced the old free-form shape would leave two formats alive.
51
+ */
52
+ export function emptyTasksFile(projectName) {
53
+ return [
54
+ `# ${projectName} Tasks`,
55
+ '',
56
+ TASKS_FILE_MARKER,
57
+ '',
58
+ TASKS_FORMAT_SECTION,
59
+ '',
60
+ '## Queue',
61
+ '',
62
+ '## Done',
63
+ '',
64
+ ].join('\n');
65
+ }
66
+ const ROW_RE = /^( *)- \[([^\]]*)\] (\d+) · (.+)$/;
67
+ const FIELD_RE = /^( +)([a-z]+) +(.+)$/;
68
+ const HEADING_RE = /^## +(.+?) *$/;
69
+ /**
70
+ * Is this a schema tasks file? The marker must stand alone on its own line
71
+ * within the first {@link MARKER_MAX_LINE} lines — a mention inside a sentence,
72
+ * a code span or a quoted copy of the manual is not a marker.
73
+ *
74
+ * Task 177: this was a substring test, so writing the marker into a sentence of
75
+ * ordimor's `RULES.md` made that file parse as a task list and cost it 85% of
76
+ * its content on every turn.
77
+ */
78
+ export function hasTasksMarker(content) {
79
+ return content.split('\n', MARKER_MAX_LINE).some(line => line.trim() === TASKS_FILE_MARKER);
80
+ }
81
+ function applyHeading(file, state, raw, headingName, lineNo, fail) {
82
+ state.current = null;
83
+ const name = headingName.toLowerCase();
84
+ if (name === 'format') {
85
+ state.section = 'format';
86
+ state.rows = null;
87
+ file.format.push(raw);
88
+ }
89
+ else if (name === 'queue') {
90
+ state.section = 'queue';
91
+ state.rows = file.queue;
92
+ }
93
+ else if (name === 'done') {
94
+ state.section = 'done';
95
+ state.rows = file.done;
96
+ }
97
+ else {
98
+ state.section = 'unknown';
99
+ state.rows = null;
100
+ fail(lineNo, raw, `Unknown section "${headingName}" — only Format, Queue and Done exist`);
101
+ }
102
+ }
103
+ function applyRow(state, match, raw, lineNo, fail) {
104
+ const rows = state.rows;
105
+ if (!rows)
106
+ return;
107
+ const indent = match[1] ?? '';
108
+ if (indent.length % INDENT_UNIT !== 0) {
109
+ fail(lineNo, raw, `Indent of ${indent.length} is not a multiple of ${INDENT_UNIT}`);
110
+ return;
111
+ }
112
+ const depth = indent.length / INDENT_UNIT;
113
+ const last = rows[rows.length - 1];
114
+ if (depth > (last ? last.depth : -1) + 1) {
115
+ fail(lineNo, raw, `Depth ${depth} has no row at depth ${depth - 1} above it`);
116
+ return;
117
+ }
118
+ const row = {
119
+ id: match[3] ?? '',
120
+ status: match[2] ?? '',
121
+ title: (match[4] ?? '').trim(),
122
+ depth,
123
+ notes: [],
124
+ depProposed: false,
125
+ };
126
+ rows.push(row);
127
+ state.current = row;
128
+ state.currentIndent = indent.length;
129
+ }
130
+ function applyFieldLine(state, match, raw, lineNo, fail) {
131
+ const indent = match[1] ?? '';
132
+ const key = match[2] ?? '';
133
+ const value = match[3] ?? '';
134
+ if (!state.current) {
135
+ fail(lineNo, raw, `Field "${key}" has no task row above it`);
136
+ }
137
+ else if (indent.length <= state.currentIndent) {
138
+ fail(lineNo, raw, `Field "${key}" must be indented past its row`);
139
+ }
140
+ else if (!TASK_FIELD_KEYS.includes(key)) {
141
+ fail(lineNo, raw, `Unknown field "${key}" — expected one of ${TASK_FIELD_KEYS.join(', ')}`);
142
+ }
143
+ else {
144
+ applyField(state.current, key, value.trim(), lineNo, raw, fail);
145
+ }
146
+ }
147
+ /**
148
+ * Parse a schema `Tasks.md`. Always returns a file — errors are collected, not
149
+ * thrown, so the drawer can show a broken line instead of an empty panel. Writes
150
+ * are refused while `errors` is non-empty (see {@link assertWritable}).
151
+ */
152
+ export function parseTasksFile(content) {
153
+ const file = { preamble: [], format: [], queue: [], done: [], errors: [] };
154
+ const state = { section: 'preamble', rows: null, current: null, currentIndent: 0 };
155
+ const fail = (line, text, reason) => file.errors.push({ line, text, reason });
156
+ const lines = content.split('\n');
157
+ for (let i = 0; i < lines.length; i++) {
158
+ const raw = lines[i] ?? '';
159
+ const lineNo = i + 1;
160
+ const heading = HEADING_RE.exec(raw);
161
+ if (heading) {
162
+ applyHeading(file, state, raw, heading[1] ?? '', lineNo, fail);
163
+ continue;
164
+ }
165
+ if (state.section === 'preamble') {
166
+ file.preamble.push(raw);
167
+ continue;
168
+ }
169
+ if (state.section === 'format') {
170
+ // Verbatim. The Format section documents the row syntax, so its example
171
+ // lines LOOK like rows — parsing it would be parsing the manual.
172
+ file.format.push(raw);
173
+ continue;
174
+ }
175
+ if (state.section === 'unknown' || raw.trim() === '')
176
+ continue;
177
+ const rowMatch = ROW_RE.exec(raw);
178
+ if (rowMatch && state.rows) {
179
+ applyRow(state, rowMatch, raw, lineNo, fail);
180
+ continue;
181
+ }
182
+ const fieldMatch = FIELD_RE.exec(raw);
183
+ if (fieldMatch) {
184
+ applyFieldLine(state, fieldMatch, raw, lineNo, fail);
185
+ continue;
186
+ }
187
+ fail(lineNo, raw, 'Not a task row, a field, a heading or blank');
188
+ }
189
+ const seen = new Set();
190
+ for (const row of [...file.queue, ...file.done]) {
191
+ if (seen.has(row.id)) {
192
+ file.errors.push({ line: 0, text: row.id, reason: `Duplicate task id ${row.id}` });
193
+ }
194
+ seen.add(row.id);
195
+ }
196
+ return file;
197
+ }
198
+ function applyField(row, key, value, lineNo, raw, fail) {
199
+ switch (key) {
200
+ case 'doc':
201
+ row.doc = value;
202
+ break;
203
+ case 'phase':
204
+ row.phase = value;
205
+ break;
206
+ case 'note':
207
+ row.notes.push(value);
208
+ break;
209
+ case 'done':
210
+ row.done = value;
211
+ break;
212
+ case 'dep':
213
+ if (value !== DEP_PROPOSED) {
214
+ fail(lineNo, raw, `dep must be "${DEP_PROPOSED}" — got "${value}"`);
215
+ return;
216
+ }
217
+ if (row.depth === 0) {
218
+ fail(lineNo, raw, 'dep proposed on a row that is not indented under a blocker');
219
+ return;
220
+ }
221
+ row.depProposed = true;
222
+ break;
223
+ }
224
+ }
225
+ // ── Serialization ────────────────────────────────────────────────────────────
226
+ function serializeRow(row) {
227
+ const indent = ' '.repeat(row.depth * INDENT_UNIT);
228
+ const fieldIndent = ' '.repeat(row.depth * INDENT_UNIT + FIELD_INDENT);
229
+ const out = [`${indent}- [${row.status}] ${row.id} · ${row.title}`];
230
+ // Width matches the worked example in the manual (`phase` is the longest key,
231
+ // plus one space). The manual is what agents write the file by, so a narrower
232
+ // column here would rewrite every field line on the first drawer write.
233
+ const field = (key, value) => out.push(`${fieldIndent}${key.padEnd(6)} ${value}`);
234
+ // Short identifying fields first, prose last — `note` is the only repeatable
235
+ // key and the only one that can run long.
236
+ if (row.doc)
237
+ field('doc', row.doc);
238
+ if (row.phase)
239
+ field('phase', row.phase);
240
+ if (row.depProposed)
241
+ field('dep', DEP_PROPOSED);
242
+ if (row.done)
243
+ field('done', row.done);
244
+ for (const note of row.notes)
245
+ field('note', note);
246
+ return out;
247
+ }
248
+ /** Round-trips a parsed file. Rewrites field order and spacing to canonical form. */
249
+ export function serializeTasksFile(file) {
250
+ const out = [...file.preamble];
251
+ if (file.format.length > 0)
252
+ out.push(...file.format);
253
+ out.push('', '## Queue', '');
254
+ for (const row of file.queue)
255
+ out.push(...serializeRow(row));
256
+ out.push('', '## Done', '');
257
+ for (const row of file.done)
258
+ out.push(...serializeRow(row));
259
+ out.push('');
260
+ // Collapse any run of blank lines the sections introduced at their seams.
261
+ const collapsed = [];
262
+ for (const line of out) {
263
+ if (line === '' && collapsed[collapsed.length - 1] === '')
264
+ continue;
265
+ collapsed.push(line);
266
+ }
267
+ return collapsed.join('\n');
268
+ }
269
+ // ── Tree helpers ─────────────────────────────────────────────────────────────
270
+ /** Row at a known-valid index. Loud rather than undefined — every caller below
271
+ * has already established the index exists, so a miss is a bug, not a case. */
272
+ function at(rows, i) {
273
+ const row = rows[i];
274
+ if (!row)
275
+ throw new TasksFileError(`No task row at index ${i}`);
276
+ return row;
277
+ }
278
+ /** Last index of the subtree rooted at `i` (every following row deeper than it). */
279
+ export function subtreeEnd(rows, i) {
280
+ const depth = at(rows, i).depth;
281
+ let end = i;
282
+ for (let j = i + 1; j < rows.length && at(rows, j).depth > depth; j++)
283
+ end = j;
284
+ return end;
285
+ }
286
+ /** Index of the row that blocks `i`, or -1 when `i` is not blocked. */
287
+ export function parentIndexOf(rows, i) {
288
+ const depth = at(rows, i).depth;
289
+ if (depth === 0)
290
+ return -1;
291
+ for (let j = i - 1; j >= 0; j--) {
292
+ if (at(rows, j).depth === depth - 1)
293
+ return j;
294
+ }
295
+ return -1;
296
+ }
297
+ /** Index of the depth-0 row whose cluster contains `i`. */
298
+ export function rootIndexOf(rows, i) {
299
+ for (let j = i; j >= 0; j--) {
300
+ if (at(rows, j).depth === 0)
301
+ return j;
302
+ }
303
+ return 0;
304
+ }
305
+ function indexOfId(rows, id) {
306
+ const i = rows.findIndex(r => r.id === id);
307
+ if (i === -1)
308
+ throw new TasksFileError(`No task ${id} in the queue`);
309
+ return i;
310
+ }
311
+ // ── Mutations ────────────────────────────────────────────────────────────────
312
+ /**
313
+ * Move `dragId` relative to `targetId`. Three cases, one rule — the cluster is
314
+ * the unit of movement, and a drag can never separate a task from its blocker:
315
+ *
316
+ * - same parent → sibling reorder, dragged row's subtree travels
317
+ * - different cluster → the dragged row's WHOLE cluster moves, blocker first
318
+ * - same cluster, other parent → illegal, nothing is written
319
+ */
320
+ export function moveTask(rows, dragId, targetId, position) {
321
+ if (dragId === targetId)
322
+ return rows.slice();
323
+ const di = indexOfId(rows, dragId);
324
+ const ti = indexOfId(rows, targetId);
325
+ const sameParent = parentIndexOf(rows, di) === parentIndexOf(rows, ti);
326
+ const sameCluster = rootIndexOf(rows, di) === rootIndexOf(rows, ti);
327
+ if (sameCluster && !sameParent) {
328
+ throw new TasksFileError(`${dragId} and ${targetId} are in the same dependency cluster but have different blockers — ` +
329
+ `reorder siblings, or change the dependency in the row's menu`);
330
+ }
331
+ // Which block travels: the row itself when reordering siblings, the whole
332
+ // cluster when leaving. The second case is what makes a blocker follow the
333
+ // task it blocks and land ahead of it.
334
+ const [from, to] = sameParent ? [di, subtreeEnd(rows, di)] : movingCluster(rows, di);
335
+ if (ti >= from && ti <= to) {
336
+ throw new TasksFileError(`Cannot drop ${dragId} inside its own dependency cluster`);
337
+ }
338
+ const [anchorStart, anchorEnd] = sameParent
339
+ ? [ti, subtreeEnd(rows, ti)]
340
+ : movingCluster(rows, ti);
341
+ const block = rows.slice(from, to + 1);
342
+ const rest = [...rows.slice(0, from), ...rows.slice(to + 1)];
343
+ // Recompute the anchor's position in the array the block was lifted out of.
344
+ const shift = (n) => (n > to ? n - block.length : n);
345
+ const insertAt = position === 'before' ? shift(anchorStart) : shift(anchorEnd) + 1;
346
+ const next = [...rest.slice(0, insertAt), ...block, ...rest.slice(insertAt)];
347
+ assertValidQueue(next);
348
+ return next;
349
+ }
350
+ function movingCluster(rows, i) {
351
+ const root = rootIndexOf(rows, i);
352
+ return [root, subtreeEnd(rows, root)];
353
+ }
354
+ /**
355
+ * Accept or reject a proposed dependency edge. Accepting keeps the nesting and
356
+ * drops the marker; rejecting outdents the row and its subtree to depth 0 and
357
+ * lands them after the cluster they just left.
358
+ */
359
+ export function resolveProposedDep(rows, id, accept) {
360
+ const i = indexOfId(rows, id);
361
+ const row = at(rows, i);
362
+ if (!row.depProposed) {
363
+ throw new TasksFileError(`Task ${id} has no proposed dependency to resolve`);
364
+ }
365
+ if (accept) {
366
+ const next = rows.map(r => (r.id === id ? { ...r, depProposed: false } : r));
367
+ assertValidQueue(next);
368
+ return next;
369
+ }
370
+ const end = subtreeEnd(rows, i);
371
+ const shed = row.depth;
372
+ const block = rows
373
+ .slice(i, end + 1)
374
+ .map(r => ({ ...r, depth: r.depth - shed, depProposed: r.id === id ? false : r.depProposed }));
375
+ const rest = [...rows.slice(0, i), ...rows.slice(end + 1)];
376
+ // Land after whatever remains of the cluster it was pulled out of. The root
377
+ // is always strictly above `i` (an indented row has a blocker above it), so
378
+ // its index is unchanged by lifting the block out.
379
+ const rootAt = rootIndexOf(rows, i);
380
+ const insertAt = subtreeEnd(rest, rootAt) + 1;
381
+ const next = [...rest.slice(0, insertAt), ...block, ...rest.slice(insertAt)];
382
+ assertValidQueue(next);
383
+ return next;
384
+ }
385
+ /** Structural invariants every write must preserve. */
386
+ export function assertValidQueue(rows) {
387
+ if (rows.length === 0)
388
+ return;
389
+ if (at(rows, 0).depth !== 0) {
390
+ throw new TasksFileError('The first task in the queue cannot be blocked');
391
+ }
392
+ for (let i = 1; i < rows.length; i++) {
393
+ if (at(rows, i).depth > at(rows, i - 1).depth + 1) {
394
+ throw new TasksFileError(`Task ${at(rows, i).id} is nested under nothing`);
395
+ }
396
+ }
397
+ }
398
+ /** Refuses writes to a file the parser did not fully understand. */
399
+ export function assertWritable(file) {
400
+ if (file.errors.length > 0) {
401
+ const first = file.errors[0] ?? { line: 0, reason: 'unknown' };
402
+ throw new TasksFileError(`Tasks.md has ${file.errors.length} unparsed line(s) — refusing to write. ` +
403
+ `First: line ${first.line}: ${first.reason}`);
404
+ }
405
+ }
406
+ // ── Prompt projection ────────────────────────────────────────────────────────
407
+ /**
408
+ * What the model sees. The `## Format` section is verbatim (it is the
409
+ * instructions for writing the file back), the task in hand is in full, the
410
+ * rest of the queue is title lines, and `## Done` is one summary line.
411
+ *
412
+ * Returns null when `content` is not a schema tasks file, so an un-migrated
413
+ * `Tasks.md` in any other project is passed through untouched — and equally
414
+ * when it is one the parser could not fully read.
415
+ *
416
+ * Task 177: that second case used to project anyway and append a note counting
417
+ * the bad lines, which meant everything under an unrecognised heading left the
418
+ * prompt without trace. A file that does not parse is passed through whole: it
419
+ * costs its full size, which is visible, instead of losing content, which is
420
+ * not.
421
+ */
422
+ export function projectTasksFile(content) {
423
+ if (!hasTasksMarker(content))
424
+ return null;
425
+ const file = parseTasksFile(content);
426
+ if (file.errors.length > 0)
427
+ return null;
428
+ const out = [];
429
+ for (const line of file.preamble) {
430
+ if (line.includes(TASKS_FILE_MARKER))
431
+ continue;
432
+ out.push(line);
433
+ }
434
+ if (file.format.length > 0)
435
+ out.push(...file.format);
436
+ out.push('', '## Queue', '');
437
+ if (file.queue.length === 0) {
438
+ out.push('(empty)');
439
+ }
440
+ else {
441
+ // The task in hand — the top row, per Karl's "top of queue = what I'm on".
442
+ out.push(...serializeRow(at(file.queue, 0)));
443
+ for (const row of file.queue.slice(1)) {
444
+ const indent = ' '.repeat(row.depth * INDENT_UNIT);
445
+ out.push(`${indent}- [${row.status}] ${row.id} · ${row.title}`);
446
+ }
447
+ }
448
+ out.push('', `## Done (${file.done.length} finished tasks, deliberately not included here)`, '');
449
+ const collapsed = [];
450
+ for (const line of out) {
451
+ if (line === '' && collapsed[collapsed.length - 1] === '')
452
+ continue;
453
+ collapsed.push(line);
454
+ }
455
+ return collapsed.join('\n');
456
+ }
457
+ //# 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,QA8CrB,CAAC"}
@@ -0,0 +1,62 @@
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
+ 'The file opens with its title and then, alone on its line and within the first',
23
+ 'ten lines, the marker `<!-- cumulus:tasks v1 -->`. That line is what identifies a',
24
+ 'tasks file; a document that merely quotes the marker further down is not one.',
25
+ '',
26
+ 'Three sections, in this order, and no others: `## Format`, `## Queue`, `## Done`.',
27
+ '',
28
+ 'A TASK ROW is:',
29
+ '',
30
+ ' - [status] <id> · <title>',
31
+ '',
32
+ '`status` is one of `[ ]` pending, `[◔]` scaffolded, `[◑]` fleshed out,',
33
+ '`[◕]` implemented, `[✅]` verified, `[❌]` failed. `id` is digits and unique across',
34
+ 'the whole file. The separator is a middle dot `·`.',
35
+ '',
36
+ 'FIELDS belong to the row above them and are indented four spaces past it:',
37
+ '',
38
+ ' doc docs/tasks/176-tasks-file-schema-and-drawer.md',
39
+ ' phase gateway-stability',
40
+ ' note one line of detail — repeatable, and the only place prose belongs',
41
+ ' dep proposed',
42
+ ' done 2026-09-02',
43
+ '',
44
+ 'Those five keys are the entire vocabulary. Any other key, and any other line',
45
+ 'shape, is a parse error the drawer shows rather than skipping.',
46
+ '',
47
+ 'DEPENDENCIES ARE INDENTATION. A row indented two spaces further than the row',
48
+ 'above it is BLOCKED BY that row. Build order is top to bottom, so a blocker is',
49
+ 'always above what it blocks, and the first row of `## Queue` can never be blocked:',
50
+ '',
51
+ ' - [ ] 073 · StorePool reaping',
52
+ ' - [ ] 074 · Content store eviction (cannot start until 073 lands)',
53
+ '',
54
+ '`dep proposed` marks a dependency that was guessed during migration rather than',
55
+ 'confirmed by Karl; the drawer offers accept/reject on exactly those rows.',
56
+ '',
57
+ '`## Queue` is the build order and **the top row is the task in hand** — there is no',
58
+ 'separate in-progress marker. `## Done` is finished work: it is kept for the record',
59
+ 'and is never sent to a model. On finishing a task, move its row to the top of',
60
+ '`## Done` and add `done <YYYY-MM-DD>`.',
61
+ ].join('\n');
62
+ //# 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,gFAAgF;IAChF,mFAAmF;IACnF,+EAA+E;IAC/E,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;AAWH,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;AAyBD;;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"}
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"}
@@ -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
- return `# ${projectName} Tasks\n\n\n`;
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":"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"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/lib/templates.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luckydraw/cumulus",
3
- "version": "1.0.36",
3
+ "version": "1.0.38",
4
4
  "description": "RLM-based CLI chat wrapper for Claude with external history context management",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",