@rundiffusion/ledger 0.1.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.
@@ -0,0 +1,498 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createInterface } from 'node:readline/promises';
4
+ import { stdin, stdout } from 'node:process';
5
+ import { DONE_WHEN, PRIORITIES, TASK_TYPES } from './types.js';
6
+ import { checkboxState, appendHistory, replaceSection, section, writeMarkdown } from './markdown.js';
7
+ import { claimMap, derivedState, eligibleTasks, loadShiplogs, loadTasks, nextTaskId, pendingByTask, validateLedger, } from './ledger.js';
8
+ import { createClaimWorktree, createMetadataCommit, currentBranch, defaultSha, deleteCas, fetchBranch, fetchFullHistory, fetchLedgerRefs, git, gitIdentity, headSha, pushCas, pushCreate, remoteRefSha, } from './git.js';
9
+ import { asString, flag, localDate, option, slugify, timestamp } from './util.js';
10
+ function requireTask(tasks, id) {
11
+ const task = tasks.find(item => item.id === id);
12
+ if (!task)
13
+ throw new Error(`Unknown task: ${id}`);
14
+ return task;
15
+ }
16
+ async function value(options, name, label, fallback) {
17
+ const supplied = option(options, name);
18
+ if (supplied !== undefined)
19
+ return supplied.trim();
20
+ if (!stdin.isTTY) {
21
+ if (fallback !== undefined)
22
+ return fallback;
23
+ throw new Error(`--${name} is required in a non-interactive shell`);
24
+ }
25
+ const prompt = createInterface({ input: stdin, output: stdout });
26
+ try {
27
+ const suffix = fallback ? ` [${fallback}]` : '';
28
+ const answer = (await prompt.question(`${label}${suffix}: `)).trim();
29
+ return answer || fallback || '';
30
+ }
31
+ finally {
32
+ prompt.close();
33
+ }
34
+ }
35
+ function commaList(raw) {
36
+ return raw.split(',').map(item => item.trim()).filter(Boolean);
37
+ }
38
+ function checklist(raw, checked) {
39
+ return commaList(raw).map(item => `- [${checked ? 'x' : ' '}] ${item}`).join('\n');
40
+ }
41
+ function taskBody(input) {
42
+ const bug = input.type === 'bug'
43
+ ? `\n## Observed\n\n${input.observed}\n\n## Expected\n\n${input.expected}\n\n## Reproduction\n\n${input.reproduction}\n`
44
+ : '';
45
+ const handoff = input.handoff
46
+ ? `\n## Handoff\n\n- Ref: \`${input.handoff.ref}\`\n- Commit: \`${input.handoff.commit}\`\n- Source branch: \`${input.handoff.sourceBranch}\`\n- Begin by reviewing the pinned prototype; do not assume it satisfies the acceptance criteria.\n`
47
+ : '';
48
+ return `# ${input.title}\n\n## Outcome\n\n${input.outcome}\n\n## Context\n\n${input.context}\n${bug}${handoff}\n## Acceptance criteria\n\n${checklist(input.acceptance, input.checked)}\n\n## Validation\n\n${checklist(input.validation, input.checked)}\n\n## Work log\n\n- ${localDate()} created - Task distilled into the Git ledger.\n`;
49
+ }
50
+ async function createTask(context, args, informal = false, checked = false) {
51
+ const tasks = loadTasks(context.root);
52
+ const id = option(args.options, 'id') || nextTaskId(tasks, context.config);
53
+ if (!new RegExp(context.config.id_pattern).test(id))
54
+ throw new Error(`Invalid task ID: ${id}`);
55
+ if (tasks.some(task => task.id === id))
56
+ throw new Error(`Task already exists: ${id}`);
57
+ const title = await value(args.options, 'title', 'Task title');
58
+ const outcome = await value(args.options, 'outcome', 'Desired outcome');
59
+ const taskContext = await value(args.options, 'context', 'Relevant context');
60
+ const acceptance = await value(args.options, 'acceptance', 'Acceptance criteria (comma-separated)');
61
+ const validation = await value(args.options, 'validation', 'Validation steps (comma-separated)');
62
+ const type = await value(args.options, 'type', 'Type', 'feature');
63
+ const priority = await value(args.options, 'priority', 'Priority', 'p2');
64
+ const doneWhen = await value(args.options, 'done-when', 'Done when', 'merged');
65
+ const areaFallback = context.config.areas[0];
66
+ const areas = commaList(await value(args.options, 'areas', 'Areas (comma-separated)', areaFallback));
67
+ const dependencies = commaList(option(args.options, 'depends-on') ?? '');
68
+ const source = option(args.options, 'source');
69
+ if (!TASK_TYPES.includes(type))
70
+ throw new Error(`type must be one of: ${TASK_TYPES.join(', ')}`);
71
+ if (!PRIORITIES.includes(priority))
72
+ throw new Error(`priority must be one of: ${PRIORITIES.join(', ')}`);
73
+ if (!DONE_WHEN.includes(doneWhen))
74
+ throw new Error(`done-when must be one of: ${DONE_WHEN.join(', ')}`);
75
+ if (context.config.areas.length) {
76
+ const unknown = areas.filter(area => !context.config.areas.includes(area));
77
+ if (unknown.length)
78
+ throw new Error(`unknown area(s): ${unknown.join(', ')}`);
79
+ }
80
+ const missingDependencies = dependencies.filter(id => !tasks.some(task => task.id === id));
81
+ if (missingDependencies.length)
82
+ throw new Error(`unknown dependency task(s): ${missingDependencies.join(', ')}`);
83
+ if (!title || !outcome || !taskContext || !acceptance || !validation || !areas.length) {
84
+ throw new Error('title, outcome, context, acceptance, validation, and areas are required');
85
+ }
86
+ const observed = type === 'bug' ? await value(args.options, 'observed', 'Observed behavior') : undefined;
87
+ const expected = type === 'bug' ? await value(args.options, 'expected', 'Expected behavior', outcome) : undefined;
88
+ const reproduction = type === 'bug' ? await value(args.options, 'reproduction', 'Reproduction steps') : undefined;
89
+ if (type === 'bug' && (!observed || !expected || !reproduction)) {
90
+ throw new Error('bugs require observed, expected, and reproduction');
91
+ }
92
+ const from = option(args.options, 'from');
93
+ let handoff;
94
+ if (from) {
95
+ fetchLedgerRefs(context.root, context.config);
96
+ const commit = fetchBranch(context.root, context.config, from);
97
+ if (!commit)
98
+ throw new Error(`Remote branch does not exist: ${from}`);
99
+ const ref = `handoff/${id}`;
100
+ if (!pushCreate(context.root, context.config, ref, commit)) {
101
+ throw new Error(`${ref} already exists; handoffs are immutable`);
102
+ }
103
+ handoff = { ref, commit, sourceBranch: from };
104
+ fetchBranch(context.root, context.config, ref);
105
+ }
106
+ const date = localDate();
107
+ const data = {
108
+ id,
109
+ title,
110
+ status: 'open',
111
+ priority,
112
+ type,
113
+ done_when: doneWhen,
114
+ areas,
115
+ depends_on: dependencies,
116
+ created: date,
117
+ updated: date,
118
+ ...(source ? { source } : {}),
119
+ ...(informal ? { informal: true, implementation_branch: currentBranch(context.root) } : {}),
120
+ ...(handoff ? { handoff: { ref: handoff.ref, commit: handoff.commit, source_branch: handoff.sourceBranch } } : {}),
121
+ };
122
+ const relativePath = `tasks/${id}-${slugify(title)}.md`;
123
+ const file = path.join(context.root, relativePath);
124
+ fs.mkdirSync(path.dirname(file), { recursive: true });
125
+ if (fs.existsSync(file))
126
+ throw new Error(`Task file exists: ${relativePath}`);
127
+ writeMarkdown(file, data, taskBody({
128
+ title,
129
+ outcome,
130
+ context: taskContext,
131
+ acceptance,
132
+ validation,
133
+ type,
134
+ checked,
135
+ ...(observed ? { observed } : {}),
136
+ ...(expected ? { expected } : {}),
137
+ ...(reproduction ? { reproduction } : {}),
138
+ ...(handoff ? { handoff } : {}),
139
+ }));
140
+ const task = requireTask(loadTasks(context.root), id);
141
+ console.log(`Created ${relativePath}. Review it, then commit it in a task-only intake PR.`);
142
+ if (handoff)
143
+ console.log(`Pinned ${from} at ${handoff.ref} (${handoff.commit}).`);
144
+ return { task, createdPath: relativePath };
145
+ }
146
+ function validationErrors(context) {
147
+ return validateLedger(context.root, context.config).findings
148
+ .filter(item => item.severity === 'error')
149
+ .map(item => `${item.scope}: ${item.message}`);
150
+ }
151
+ export async function commandList(context, args) {
152
+ if (!flag(args.options, 'offline'))
153
+ fetchLedgerRefs(context.root, context.config);
154
+ const result = validateLedger(context.root, context.config);
155
+ const claims = claimMap(context.root, context.config);
156
+ const pending = pendingByTask(result.shiplogs);
157
+ const tasks = [...result.tasks].sort((left, right) => left.priority.localeCompare(right.priority) || left.created.localeCompare(right.created) || left.id.localeCompare(right.id));
158
+ if (!tasks.length) {
159
+ console.log('No tasks. Distill current work with `rdt new`.');
160
+ }
161
+ else {
162
+ console.log('ID PRI STATE TITLE');
163
+ for (const task of tasks) {
164
+ console.log(`${task.id.padEnd(18)} ${task.priority.padEnd(4)} ${derivedState(task, claims, pending).padEnd(23)} ${task.title}`);
165
+ }
166
+ }
167
+ const errors = result.findings.filter(item => item.severity === 'error');
168
+ if (errors.length) {
169
+ console.error(`\n${errors.length} validation error(s); run rdt check for details.`);
170
+ process.exitCode = 1;
171
+ }
172
+ }
173
+ export async function commandNext(context, args) {
174
+ if (!flag(args.options, 'offline'))
175
+ fetchLedgerRefs(context.root, context.config);
176
+ const errors = validationErrors(context);
177
+ if (errors.length)
178
+ throw new Error(`Ledger is invalid:\n- ${errors.join('\n- ')}`);
179
+ const tasks = loadTasks(context.root);
180
+ const next = eligibleTasks(tasks, loadShiplogs(context.root), claimMap(context.root, context.config))[0];
181
+ if (!next) {
182
+ console.log('No eligible task. Active, blocked, dependent, and pending-delivery work is excluded.');
183
+ return;
184
+ }
185
+ console.log(`${next.id} ${next.priority} ${next.title}\n${next.relativePath}`);
186
+ }
187
+ export async function commandNew(context, args) {
188
+ await createTask(context, args);
189
+ }
190
+ export async function commandStart(context, args) {
191
+ fetchLedgerRefs(context.root, context.config);
192
+ const errors = validationErrors(context);
193
+ if (errors.length)
194
+ throw new Error(`Ledger is invalid:\n- ${errors.join('\n- ')}`);
195
+ const explicit = args.positional[0];
196
+ let candidates = eligibleTasks(loadTasks(context.root), loadShiplogs(context.root), claimMap(context.root, context.config));
197
+ if (explicit) {
198
+ const task = requireTask(loadTasks(context.root), explicit);
199
+ if (!candidates.some(candidate => candidate.id === task.id))
200
+ throw new Error(`${explicit} is not eligible (it may be active, blocked, dependent, closed, or awaiting delivery)`);
201
+ candidates = [task];
202
+ }
203
+ if (!candidates.length)
204
+ throw new Error('No eligible task to start');
205
+ const identity = gitIdentity(context.root);
206
+ for (const task of candidates) {
207
+ const parent = defaultSha(context.root, context.config);
208
+ const claim = createMetadataCommit(context.root, parent, `claim(${task.id}): ${identity}`, [`Task: ${task.id}`, `Claimant: ${identity}`]);
209
+ if (!pushCreate(context.root, context.config, `work/${task.id}`, claim)) {
210
+ if (explicit)
211
+ throw new Error(`${task.id} was claimed by another worker`);
212
+ fetchLedgerRefs(context.root, context.config);
213
+ continue;
214
+ }
215
+ fetchBranch(context.root, context.config, `work/${task.id}`);
216
+ try {
217
+ const directory = createClaimWorktree(context.root, context.config, task.id);
218
+ console.log(`Claimed ${task.id} atomically.\nWorktree: ${directory}\nTask: ${path.join(directory, task.relativePath)}`);
219
+ return;
220
+ }
221
+ catch (error) {
222
+ deleteCas(context.root, context.config, `work/${task.id}`, claim);
223
+ throw new Error(`Claim won but worktree creation failed; claim was released. ${error instanceof Error ? error.message : String(error)}`);
224
+ }
225
+ }
226
+ throw new Error('Every eligible task lost a claim race; run rdt start again');
227
+ }
228
+ function taskIdFromArgs(context, args) {
229
+ const explicit = args.positional[0];
230
+ if (explicit)
231
+ return explicit;
232
+ const branch = currentBranch(context.root);
233
+ const match = /^work\/(.+)$/.exec(branch);
234
+ if (match?.[1])
235
+ return match[1];
236
+ throw new Error('TASK-ID is required outside a work/<ID> branch');
237
+ }
238
+ function ensureFinalChecklists(task) {
239
+ for (const heading of ['Acceptance criteria', 'Validation']) {
240
+ const boxes = checkboxState(task.body, heading);
241
+ if (!boxes.total || boxes.unchecked)
242
+ throw new Error(`${task.id} has ${boxes.unchecked || 'missing'} unchecked ${heading.toLowerCase()} item(s)`);
243
+ }
244
+ }
245
+ async function createPendingShiplog(context, task, args) {
246
+ const target = await value(args.options, 'target', 'Delivery target');
247
+ const verification = await value(args.options, 'verification-evidence', 'How production/release will be verified');
248
+ if (!target || !verification)
249
+ throw new Error('target and verification-evidence are required');
250
+ const date = localDate();
251
+ const relativePath = `shiplog/${date}-${slugify(task.title)}.md`;
252
+ const file = path.join(context.root, relativePath);
253
+ if (fs.existsSync(file))
254
+ throw new Error(`Shiplog already exists: ${relativePath}`);
255
+ const commit = headSha(context.root);
256
+ const responsible = gitIdentity(context.root);
257
+ const kind = task.doneWhen === 'released' ? 'release' : 'deploy';
258
+ const data = {
259
+ title: task.title,
260
+ date,
261
+ updated: date,
262
+ kind,
263
+ status: 'pending-delivery',
264
+ tasks: [task.id],
265
+ target,
266
+ commit,
267
+ responsible,
268
+ };
269
+ const body = `# ${task.title}\n\n## Evidence\n\n- Implementation tip \`${commit}\` is ready for ${kind} to ${target}.\n\n## Verification\n\n- [ ] ${verification}\n\n## History\n\n- ${date} pending-delivery - ${responsible} accepted delivery follow-through.\n`;
270
+ fs.mkdirSync(path.dirname(file), { recursive: true });
271
+ writeMarkdown(file, data, body);
272
+ task.data.shiplog = relativePath;
273
+ return relativePath;
274
+ }
275
+ export async function commandSubmit(context, args) {
276
+ let task;
277
+ if (flag(args.options, 'new'))
278
+ task = (await createTask(context, args, true, flag(args.options, 'final'))).task;
279
+ else
280
+ task = requireTask(loadTasks(context.root), taskIdFromArgs(context, args));
281
+ const date = localDate();
282
+ task.data.updated = date;
283
+ task.body = appendHistory(task.body, 'Work log', `${date} submitted - ${gitIdentity(context.root)} prepared the implementation for review.`);
284
+ if (flag(args.options, 'final')) {
285
+ ensureFinalChecklists(task);
286
+ if (task.doneWhen === 'merged') {
287
+ task.data.status = 'done';
288
+ task.data.completed = date;
289
+ task.body = appendHistory(task.body, 'Work log', `${date} done-on-merge - Acceptance and validation evidence are complete; this becomes durable when the PR merges.`);
290
+ }
291
+ else {
292
+ const shiplog = asString(task.data.shiplog) || await createPendingShiplog(context, task, args);
293
+ task.body = appendHistory(task.body, 'Work log', `${date} pending-delivery - Linked ${shiplog}.`);
294
+ }
295
+ }
296
+ writeMarkdown(task.file, task.data, task.body);
297
+ console.log(`Prepared ${task.id}${flag(args.options, 'final') ? ' for final review' : ''}. Commit and push the task metadata with the implementation PR.`);
298
+ }
299
+ function shiplogForTask(context, task) {
300
+ const target = asString(task.data.shiplog);
301
+ const shiplog = loadShiplogs(context.root).find(item => item.relativePath === target || item.tasks.includes(task.id));
302
+ if (!shiplog)
303
+ throw new Error(`${task.id} has no shiplog`);
304
+ return shiplog;
305
+ }
306
+ export async function commandShip(context, args) {
307
+ const task = requireTask(loadTasks(context.root), taskIdFromArgs(context, args));
308
+ const shiplog = shiplogForTask(context, task);
309
+ const evidence = await value(args.options, 'evidence', 'Delivery evidence');
310
+ if (!evidence)
311
+ throw new Error('delivery evidence is required');
312
+ const date = localDate();
313
+ if (flag(args.options, 'rollback')) {
314
+ if (['rolled-back', 'superseded'].includes(shiplog.status))
315
+ throw new Error(`${shiplog.relativePath} cannot be rolled back from ${shiplog.status}`);
316
+ shiplog.data.status = 'rolled-back';
317
+ shiplog.data.updated = date;
318
+ shiplog.body = replaceSection(shiplog.body, 'Evidence', `${section(shiplog.body, 'Evidence')}\n- ${date} rollback: ${evidence}`);
319
+ shiplog.body = appendHistory(shiplog.body, 'History', `${date} rolled-back - ${evidence}`);
320
+ task.data.status = 'blocked';
321
+ task.data.updated = date;
322
+ task.data.blocked_reason = `Delivery rolled back: ${evidence}`;
323
+ delete task.data.completed;
324
+ task.body = appendHistory(task.body, 'Work log', `${date} blocked-after-rollback - ${evidence}`);
325
+ writeMarkdown(shiplog.file, shiplog.data, shiplog.body);
326
+ writeMarkdown(task.file, task.data, task.body);
327
+ console.log(`Recorded rollback for ${task.id}; the task is blocked pending an explicit recovery decision.`);
328
+ return;
329
+ }
330
+ if (shiplog.status !== 'pending-delivery')
331
+ throw new Error(`${shiplog.relativePath} must be pending-delivery`);
332
+ const commit = option(args.options, 'commit') || headSha(context.root);
333
+ if (!/^[0-9a-f]{7,40}$/i.test(commit))
334
+ throw new Error('commit must be a Git SHA');
335
+ shiplog.data.commit = commit;
336
+ shiplog.data.status = 'pending-verification';
337
+ shiplog.data.updated = date;
338
+ shiplog.body = replaceSection(shiplog.body, 'Evidence', `${section(shiplog.body, 'Evidence')}\n- ${date}: ${evidence}`);
339
+ shiplog.body = appendHistory(shiplog.body, 'History', `${date} pending-verification - Delivery completed; verification remains with ${shiplog.responsible}.`);
340
+ writeMarkdown(shiplog.file, shiplog.data, shiplog.body);
341
+ console.log(`Recorded delivery for ${task.id}; ${shiplog.responsible} remains responsible through verification.`);
342
+ }
343
+ export async function commandVerify(context, args) {
344
+ const task = requireTask(loadTasks(context.root), taskIdFromArgs(context, args));
345
+ const shiplog = shiplogForTask(context, task);
346
+ if (shiplog.status !== 'pending-verification')
347
+ throw new Error(`${shiplog.relativePath} must be pending-verification`);
348
+ const evidence = await value(args.options, 'evidence', 'Verification evidence');
349
+ if (!evidence)
350
+ throw new Error('verification evidence is required');
351
+ const date = localDate();
352
+ const verification = section(shiplog.body, 'Verification').replace(/^(\s*[-*]\s+)\[ \]/gm, '$1[x]');
353
+ shiplog.data.status = 'verified';
354
+ shiplog.data.updated = date;
355
+ shiplog.body = replaceSection(shiplog.body, 'Verification', verification);
356
+ shiplog.body = replaceSection(shiplog.body, 'Evidence', `${section(shiplog.body, 'Evidence')}\n- ${date}: ${evidence}`);
357
+ shiplog.body = appendHistory(shiplog.body, 'History', `${date} verified - ${evidence}`);
358
+ task.data.status = 'done';
359
+ task.data.updated = date;
360
+ task.data.completed = date;
361
+ task.body = appendHistory(task.body, 'Work log', `${date} done - Verified via ${shiplog.relativePath}.`);
362
+ writeMarkdown(shiplog.file, shiplog.data, shiplog.body);
363
+ writeMarkdown(task.file, task.data, task.body);
364
+ console.log(`Verified ${task.id}. Responsibility remains recorded as ${shiplog.responsible}.`);
365
+ }
366
+ export async function commandHandoff(context, args) {
367
+ const task = requireTask(loadTasks(context.root), taskIdFromArgs(context, args));
368
+ const reason = await value(args.options, 'reason', 'Handoff reason');
369
+ if (!reason)
370
+ throw new Error('handoff reason is required');
371
+ const responsible = option(args.options, 'responsible');
372
+ const sourceBranch = currentBranch(context.root);
373
+ const deliveryOnly = Boolean(responsible) && sourceBranch !== `work/${task.id}`;
374
+ let pinned = '';
375
+ if (!deliveryOnly) {
376
+ if (sourceBranch !== `work/${task.id}`)
377
+ throw new Error(`code handoff must run from work/${task.id}`);
378
+ fetchLedgerRefs(context.root, context.config);
379
+ const branch = `handoff/${task.id}`;
380
+ const commit = headSha(context.root);
381
+ if (!pushCreate(context.root, context.config, branch, commit))
382
+ throw new Error(`${branch} already exists; handoffs are immutable`);
383
+ task.data.handoff = { ref: branch, commit, source_branch: sourceBranch, reason };
384
+ task.body = replaceSection(task.body, 'Handoff', `- Ref: \`${branch}\`\n- Commit: \`${commit}\`\n- Source branch: \`${sourceBranch}\`\n- Reason: ${reason}`);
385
+ pinned = `${branch} (${commit})`;
386
+ }
387
+ task.data.updated = localDate();
388
+ task.body = appendHistory(task.body, 'Work log', `${localDate()} handoff - ${reason}`);
389
+ if (responsible) {
390
+ const shiplog = shiplogForTask(context, task);
391
+ if (!['pending-delivery', 'pending-verification'].includes(shiplog.status))
392
+ throw new Error('delivery responsibility can only transfer while pending');
393
+ shiplog.data.responsible = responsible;
394
+ shiplog.data.updated = localDate();
395
+ shiplog.body = appendHistory(shiplog.body, 'History', `${localDate()} responsibility-transfer - ${reason}; now ${responsible}.`);
396
+ writeMarkdown(shiplog.file, shiplog.data, shiplog.body);
397
+ }
398
+ writeMarkdown(task.file, task.data, task.body);
399
+ console.log(deliveryOnly ? `Transferred ${task.id} delivery responsibility to ${responsible}.` : `Pinned ${task.id} handoff at ${pinned}.`);
400
+ }
401
+ function requireCleanWorktree(root) {
402
+ const dirty = git(root, ['status', '--porcelain']);
403
+ if (dirty)
404
+ throw new Error('Commit or stash all changes before release/takeover so no work is lost');
405
+ }
406
+ export async function commandRelease(context, args) {
407
+ const id = taskIdFromArgs(context, args);
408
+ const reason = option(args.options, 'reason');
409
+ if (!reason)
410
+ throw new Error('release requires --reason');
411
+ requireCleanWorktree(context.root);
412
+ fetchLedgerRefs(context.root, context.config);
413
+ const branch = `work/${id}`;
414
+ const expected = remoteRefSha(context.root, context.config, branch);
415
+ if (!expected)
416
+ throw new Error(`${branch} does not exist`);
417
+ const localBranch = currentBranch(context.root);
418
+ if (localBranch !== branch)
419
+ throw new Error(`Release must run from the matching ${branch} worktree`);
420
+ const current = headSha(context.root);
421
+ if (current !== expected) {
422
+ throw new Error(`Local ${branch} tip does not match the remote claim; commit and push your work, then retry`);
423
+ }
424
+ const archive = `archive/work/${id}/${timestamp()}`;
425
+ const identity = gitIdentity(context.root);
426
+ const releaseRecord = createMetadataCommit(context.root, current, `release(${id}): ${identity}`, [`Task: ${id}`, `Reason: ${reason}`, `Released-Work: ${current}`]);
427
+ if (!pushCreate(context.root, context.config, archive, releaseRecord))
428
+ throw new Error(`archive ref collision: ${archive}`);
429
+ if (!deleteCas(context.root, context.config, branch, expected))
430
+ throw new Error(`Claim changed while releasing; ${archive} is safe, but the claim was not deleted`);
431
+ console.log(`Released ${id}: ${reason}\nArchived committed work and release record at ${archive} (${releaseRecord}).`);
432
+ }
433
+ export async function commandTakeover(context, args) {
434
+ const id = args.positional[0];
435
+ if (!id)
436
+ throw new Error('takeover requires TASK-ID');
437
+ const reason = option(args.options, 'reason');
438
+ if (!reason)
439
+ throw new Error('takeover requires --reason');
440
+ fetchLedgerRefs(context.root, context.config);
441
+ const branch = `work/${id}`;
442
+ const expected = remoteRefSha(context.root, context.config, branch);
443
+ if (!expected)
444
+ throw new Error(`${branch} does not exist`);
445
+ const archive = `archive/work/${id}/${timestamp()}`;
446
+ if (!pushCreate(context.root, context.config, archive, expected))
447
+ throw new Error(`archive ref collision: ${archive}`);
448
+ const identity = gitIdentity(context.root);
449
+ const next = createMetadataCommit(context.root, expected, `takeover(${id}): ${identity}`, [`Task: ${id}`, `Reason: ${reason}`, `Previous: ${expected}`]);
450
+ if (!pushCas(context.root, context.config, branch, expected, next))
451
+ throw new Error(`Claim changed during takeover; prior state remains archived at ${archive}`);
452
+ fetchBranch(context.root, context.config, branch);
453
+ const directory = createClaimWorktree(context.root, context.config, id);
454
+ console.log(`Took over ${id} with exact-SHA CAS.\nPrevious work: ${archive}\nWorktree: ${directory}`);
455
+ }
456
+ export async function commandCheck(context, args) {
457
+ const audit = flag(args.options, 'audit');
458
+ const hygiene = flag(args.options, 'hygiene');
459
+ const ci = flag(args.options, 'ci') || Boolean(process.env.CI);
460
+ if (audit)
461
+ fetchFullHistory(context.root, context.config);
462
+ else if (hygiene)
463
+ fetchLedgerRefs(context.root, context.config);
464
+ const result = validateLedger(context.root, context.config, { audit, hygiene, ci, verifyProvenance: ci });
465
+ for (const item of result.findings) {
466
+ const owner = item.responsible ? ` [responsible: ${item.responsible}]` : '';
467
+ const stream = item.severity === 'error' ? console.error : console.warn;
468
+ stream(`${item.severity.toUpperCase()} ${item.code} ${item.scope}: ${item.message}${owner}`);
469
+ }
470
+ const jsonPath = option(args.options, 'json');
471
+ if (jsonPath) {
472
+ const absolute = path.resolve(context.root, jsonPath);
473
+ fs.writeFileSync(absolute, `${JSON.stringify({ generated_at: new Date().toISOString(), audit, findings: result.findings }, null, 2)}\n`, 'utf8');
474
+ console.log(`Wrote disposable audit artifact: ${absolute}`);
475
+ }
476
+ const errors = result.findings.filter(item => item.severity === 'error').length;
477
+ const warnings = result.findings.length - errors;
478
+ console.log(`Ledger check: ${result.tasks.length} task(s), ${result.shiplogs.length} shiplog(s), ${errors} error(s), ${warnings} warning(s).`);
479
+ if (errors)
480
+ process.exitCode = 1;
481
+ }
482
+ export async function dispatch(context, args) {
483
+ switch (args.command) {
484
+ case 'list': return commandList(context, args);
485
+ case 'next': return commandNext(context, args);
486
+ case 'new': return commandNew(context, args);
487
+ case 'start': return commandStart(context, args);
488
+ case 'submit': return commandSubmit(context, args);
489
+ case 'handoff': return commandHandoff(context, args);
490
+ case 'release': return commandRelease(context, args);
491
+ case 'takeover': return commandTakeover(context, args);
492
+ case 'ship': return commandShip(context, args);
493
+ case 'verify': return commandVerify(context, args);
494
+ case 'check': return commandCheck(context, args);
495
+ default: throw new Error(`Unknown command: ${args.command}`);
496
+ }
497
+ }
498
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { LedgerConfig } from './types.js';
2
+ export declare function findRepoRoot(cwd?: string): string;
3
+ export declare function loadConfig(root: string): LedgerConfig;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa/C,wBAAgB,YAAY,CAAC,GAAG,SAAgB,GAAG,MAAM,CAUxD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CA8CrD"}
package/dist/config.js ADDED
@@ -0,0 +1,79 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { asString, asStringList } from './util.js';
4
+ const DEFAULTS = {
5
+ schema_version: 1,
6
+ id_pattern: '^[A-Z][A-Z0-9-]*-\\d{4}-\\d{3}$',
7
+ remote: 'origin',
8
+ claim_stale_days: 7,
9
+ delivery_stale_days: 7,
10
+ blocked_stale_days: 30,
11
+ linkage: 'warn',
12
+ };
13
+ export function findRepoRoot(cwd = process.cwd()) {
14
+ let current = path.resolve(cwd);
15
+ while (true) {
16
+ if (fs.existsSync(path.join(current, 'accountability.config.json')))
17
+ return current;
18
+ const parent = path.dirname(current);
19
+ if (parent === current) {
20
+ throw new Error('No accountability.config.json found in this directory or its parents');
21
+ }
22
+ current = parent;
23
+ }
24
+ }
25
+ export function loadConfig(root) {
26
+ const file = path.join(root, 'accountability.config.json');
27
+ let value;
28
+ try {
29
+ value = JSON.parse(fs.readFileSync(file, 'utf8'));
30
+ }
31
+ catch (error) {
32
+ throw new Error(`Cannot read ${file}: ${error instanceof Error ? error.message : String(error)}`);
33
+ }
34
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
35
+ throw new Error('accountability.config.json must contain a JSON object');
36
+ }
37
+ const data = value;
38
+ const idPrefix = asString(data.id_prefix);
39
+ const defaultBranch = asString(data.default_branch);
40
+ const areas = asStringList(data.areas);
41
+ const linkage = asString(data.linkage) || DEFAULTS.linkage;
42
+ if (data.schema_version !== 1)
43
+ throw new Error('schema_version must be 1');
44
+ if (!/^[A-Z][A-Z0-9-]*$/.test(idPrefix))
45
+ throw new Error('id_prefix must be uppercase letters, digits, or hyphens');
46
+ if (!defaultBranch || !/^[A-Za-z0-9._/-]+$/.test(defaultBranch))
47
+ throw new Error('default_branch is invalid');
48
+ if (areas === null)
49
+ throw new Error('areas must be a string list');
50
+ if (linkage !== 'warn' && linkage !== 'required')
51
+ throw new Error('linkage must be warn or required');
52
+ const numberValue = (key) => {
53
+ const candidate = data[key] ?? DEFAULTS[key];
54
+ if (typeof candidate !== 'number' || !Number.isInteger(candidate) || candidate < 1) {
55
+ throw new Error(`${key} must be a positive integer`);
56
+ }
57
+ return candidate;
58
+ };
59
+ const idPattern = asString(data.id_pattern) || DEFAULTS.id_pattern;
60
+ try {
61
+ new RegExp(idPattern);
62
+ }
63
+ catch {
64
+ throw new Error('id_pattern must be a valid regular expression');
65
+ }
66
+ return {
67
+ schema_version: 1,
68
+ id_prefix: idPrefix,
69
+ id_pattern: idPattern,
70
+ default_branch: defaultBranch,
71
+ remote: asString(data.remote) || DEFAULTS.remote,
72
+ areas: areas ?? [],
73
+ claim_stale_days: numberValue('claim_stale_days'),
74
+ delivery_stale_days: numberValue('delivery_stale_days'),
75
+ blocked_stale_days: numberValue('blocked_stale_days'),
76
+ linkage,
77
+ };
78
+ }
79
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}