@sentropic/track 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.
- package/LICENSE +21 -0
- package/README.md +84 -0
- package/dist/accept/index.d.ts +3 -0
- package/dist/accept/index.d.ts.map +1 -0
- package/dist/accept/index.js +5 -0
- package/dist/accept/index.js.map +1 -0
- package/dist/accept/ingest.d.ts +16 -0
- package/dist/accept/ingest.d.ts.map +1 -0
- package/dist/accept/ingest.js +60 -0
- package/dist/accept/ingest.js.map +1 -0
- package/dist/accept/status.d.ts +15 -0
- package/dist/accept/status.d.ts.map +1 -0
- package/dist/accept/status.js +44 -0
- package/dist/accept/status.js.map +1 -0
- package/dist/branch/index.d.ts +2 -0
- package/dist/branch/index.d.ts.map +1 -0
- package/dist/branch/index.js +3 -0
- package/dist/branch/index.js.map +1 -0
- package/dist/branch/parse.d.ts +31 -0
- package/dist/branch/parse.d.ts.map +1 -0
- package/dist/branch/parse.js +116 -0
- package/dist/branch/parse.js.map +1 -0
- package/dist/cli/desync.d.ts +14 -0
- package/dist/cli/desync.d.ts.map +1 -0
- package/dist/cli/desync.js +35 -0
- package/dist/cli/desync.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +402 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/events/canonical.d.ts +5 -0
- package/dist/events/canonical.d.ts.map +1 -0
- package/dist/events/canonical.js +134 -0
- package/dist/events/canonical.js.map +1 -0
- package/dist/events/frame.d.ts +11 -0
- package/dist/events/frame.d.ts.map +1 -0
- package/dist/events/frame.js +19 -0
- package/dist/events/frame.js.map +1 -0
- package/dist/events/head.d.ts +21 -0
- package/dist/events/head.d.ts.map +1 -0
- package/dist/events/head.js +54 -0
- package/dist/events/head.js.map +1 -0
- package/dist/events/index.d.ts +7 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +9 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/store.d.ts +33 -0
- package/dist/events/store.d.ts.map +1 -0
- package/dist/events/store.js +121 -0
- package/dist/events/store.js.map +1 -0
- package/dist/events/types.d.ts +42 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +22 -0
- package/dist/events/types.js.map +1 -0
- package/dist/events/validate.d.ts +72 -0
- package/dist/events/validate.d.ts.map +1 -0
- package/dist/events/validate.js +210 -0
- package/dist/events/validate.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/model/acceptance.d.ts +60 -0
- package/dist/model/acceptance.d.ts.map +1 -0
- package/dist/model/acceptance.js +2 -0
- package/dist/model/acceptance.js.map +1 -0
- package/dist/model/blocker.d.ts +33 -0
- package/dist/model/blocker.d.ts.map +1 -0
- package/dist/model/blocker.js +15 -0
- package/dist/model/blocker.js.map +1 -0
- package/dist/model/decision.d.ts +59 -0
- package/dist/model/decision.d.ts.map +1 -0
- package/dist/model/decision.js +17 -0
- package/dist/model/decision.js.map +1 -0
- package/dist/model/index.d.ts +6 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +7 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/item.d.ts +51 -0
- package/dist/model/item.d.ts.map +1 -0
- package/dist/model/item.js +42 -0
- package/dist/model/item.js.map +1 -0
- package/dist/model/priority.d.ts +22 -0
- package/dist/model/priority.d.ts.map +1 -0
- package/dist/model/priority.js +13 -0
- package/dist/model/priority.js.map +1 -0
- package/dist/priority/index.d.ts +2 -0
- package/dist/priority/index.d.ts.map +1 -0
- package/dist/priority/index.js +4 -0
- package/dist/priority/index.js.map +1 -0
- package/dist/report/buckets.d.ts +18 -0
- package/dist/report/buckets.d.ts.map +1 -0
- package/dist/report/buckets.js +24 -0
- package/dist/report/buckets.js.map +1 -0
- package/dist/report/build.d.ts +44 -0
- package/dist/report/build.d.ts.map +1 -0
- package/dist/report/build.js +62 -0
- package/dist/report/build.js.map +1 -0
- package/dist/report/format.d.ts +5 -0
- package/dist/report/format.d.ts.map +1 -0
- package/dist/report/format.js +81 -0
- package/dist/report/format.js.map +1 -0
- package/dist/report/index.d.ts +4 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +5 -0
- package/dist/report/index.js.map +1 -0
- package/dist/state/fold.d.ts +25 -0
- package/dist/state/fold.d.ts.map +1 -0
- package/dist/state/fold.js +208 -0
- package/dist/state/fold.js.map +1 -0
- package/dist/state/index.d.ts +3 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +4 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/snapshot.d.ts +27 -0
- package/dist/state/snapshot.d.ts.map +1 -0
- package/dist/state/snapshot.js +49 -0
- package/dist/state/snapshot.js.map +1 -0
- package/dist/track.d.ts +118 -0
- package/dist/track.d.ts.map +1 -0
- package/dist/track.js +450 -0
- package/dist/track.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { mkdirSync, readFileSync } from 'node:fs';
|
|
4
|
+
import { basename, isAbsolute, join } from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { readHead } from '../events/head.js';
|
|
7
|
+
import { EventStore } from '../events/store.js';
|
|
8
|
+
import { validate } from '../events/validate.js';
|
|
9
|
+
import { DomainError } from '../model/item.js';
|
|
10
|
+
import { formatReport, formatRows } from '../report/format.js';
|
|
11
|
+
import { Track } from '../track.js';
|
|
12
|
+
import { desyncFindings } from './desync.js';
|
|
13
|
+
const USAGE = `usage: track <command>
|
|
14
|
+
init
|
|
15
|
+
item new --kind <feature|bug|chore> --title <t> --workspace <w> [--body <b>] [--parent <id>]
|
|
16
|
+
item spec <itemId> <to-specify|specified>
|
|
17
|
+
item realize <itemId> <in-progress|done|cancelled>
|
|
18
|
+
item show <itemId>
|
|
19
|
+
item ls [--workspace <w>] [--kind <feature|bug|chore>] [--format json|text|md]
|
|
20
|
+
decision new --kind <orientation|commitment> --title <t> --workspace <w> --targets <id,id> [--context <c>]
|
|
21
|
+
decision outcome <decisionId> <go|no-go|deferred>
|
|
22
|
+
decision dossier <decisionId> --context <c>
|
|
23
|
+
decision disposition <itemId> <orientation|commitment> <required|skipped|not-applicable>
|
|
24
|
+
blocker raise --target <id> --kind <decision|dependency> --ref <id> [--reason <r>] [--rule <linked-done|manual>]
|
|
25
|
+
blocker resolve <blockerId>
|
|
26
|
+
accept criterion <itemId> --statement <s>
|
|
27
|
+
accept link <criterionId> --kind <unit|integration|e2e|manual> --locator <l>
|
|
28
|
+
accept run <evidenceId> --result <pass|fail> [--commit <c>] [--env <e>] [--runner <r>]
|
|
29
|
+
accept run --from <report> --format <junit|json> [--commit <c>] [--env <e>] [--runner <r>]
|
|
30
|
+
accept waive <criterionId> --reason <r>
|
|
31
|
+
priority assess <itemId> --ubv <n> --tc <n> --rr <n> --js <n>
|
|
32
|
+
report [--decisions] [--require-accepted] [--format json|text|md] [--commit <sha>]
|
|
33
|
+
query [--kind <k>] [--workspace <w>] [--bucket <AWAITED|DROPPED|DONE|TO-DO>] [--realization <r>] [--acceptance <a>] [--format json|text|md] [--commit <sha>]
|
|
34
|
+
validate [--commit <sha>]
|
|
35
|
+
branch import <BRANCH.md> [--commit <sha>]
|
|
36
|
+
`;
|
|
37
|
+
const ITEM_KINDS = ['feature', 'bug', 'chore'];
|
|
38
|
+
const SPEC_TARGETS = ['to-specify', 'specified'];
|
|
39
|
+
const REALIZE_TARGETS = ['in-progress', 'done', 'cancelled'];
|
|
40
|
+
const REALIZATIONS = ['to-do', 'in-progress', 'done', 'cancelled', 'rejected'];
|
|
41
|
+
const DECISION_KINDS = ['orientation', 'commitment'];
|
|
42
|
+
const OUTCOMES = ['go', 'no-go', 'deferred'];
|
|
43
|
+
const GATES = ['orientation', 'commitment'];
|
|
44
|
+
const DISPOSITIONS = ['required', 'skipped', 'not-applicable'];
|
|
45
|
+
const BLOCKER_KINDS = ['decision', 'dependency'];
|
|
46
|
+
// `linked-accepted` is SPEC §10 (v2+) and not yet auto-resolvable — not offered in the MVP.
|
|
47
|
+
const RESOLUTION_RULES = ['linked-done', 'manual'];
|
|
48
|
+
const EVIDENCE_KINDS = ['unit', 'integration', 'e2e', 'manual'];
|
|
49
|
+
const RESULTS = ['pass', 'fail'];
|
|
50
|
+
const FROM_FORMATS = ['junit', 'json'];
|
|
51
|
+
const BUCKETS_ARG = ['AWAITED', 'DROPPED', 'DONE', 'TO-DO'];
|
|
52
|
+
// `n/a` is decision-only; `query` projects non-decision rows, so it would never match.
|
|
53
|
+
const ACCEPTANCES = ['fail', 'waived', 'unknown', 'stale', 'pass'];
|
|
54
|
+
function trackDir(cwd) {
|
|
55
|
+
return join(cwd, '.track');
|
|
56
|
+
}
|
|
57
|
+
function eventsPath(cwd) {
|
|
58
|
+
return join(trackDir(cwd), 'events.jsonl');
|
|
59
|
+
}
|
|
60
|
+
function store(cwd) {
|
|
61
|
+
return new EventStore(eventsPath(cwd));
|
|
62
|
+
}
|
|
63
|
+
function gitHead(cwd) {
|
|
64
|
+
try {
|
|
65
|
+
// stdio: silence git's own stderr (off-repo, rev-parse fails — we fall back to 'HEAD').
|
|
66
|
+
return execFileSync('git', ['rev-parse', 'HEAD'], {
|
|
67
|
+
cwd,
|
|
68
|
+
encoding: 'utf8',
|
|
69
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
70
|
+
}).trim();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return 'HEAD';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function parseFlags(args) {
|
|
77
|
+
const positional = [];
|
|
78
|
+
const flags = {};
|
|
79
|
+
for (let i = 0; i < args.length; i++) {
|
|
80
|
+
const a = args[i];
|
|
81
|
+
if (a.startsWith('--')) {
|
|
82
|
+
const key = a.slice(2);
|
|
83
|
+
const next = args[i + 1];
|
|
84
|
+
if (next !== undefined && !next.startsWith('--')) {
|
|
85
|
+
flags[key] = next;
|
|
86
|
+
i++;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
flags[key] = true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
positional.push(a);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { positional, flags };
|
|
97
|
+
}
|
|
98
|
+
function req(flags, key) {
|
|
99
|
+
const v = flags[key];
|
|
100
|
+
if (typeof v !== 'string')
|
|
101
|
+
throw new DomainError(`missing required --${key}`);
|
|
102
|
+
return v;
|
|
103
|
+
}
|
|
104
|
+
function opt(flags, key) {
|
|
105
|
+
const v = flags[key];
|
|
106
|
+
return typeof v === 'string' ? v : undefined;
|
|
107
|
+
}
|
|
108
|
+
function num(flags, key) {
|
|
109
|
+
const n = Number(req(flags, key));
|
|
110
|
+
if (Number.isNaN(n))
|
|
111
|
+
throw new DomainError(`--${key} must be a number`);
|
|
112
|
+
return n;
|
|
113
|
+
}
|
|
114
|
+
/** Validate a positional/flag against an allowed enum (CLI-boundary input validation). */
|
|
115
|
+
function oneOf(value, allowed, name) {
|
|
116
|
+
if (value === undefined || !allowed.includes(value)) {
|
|
117
|
+
throw new DomainError(`${name} must be one of: ${allowed.join('|')} (got ${value === undefined ? '<none>' : `"${value}"`})`);
|
|
118
|
+
}
|
|
119
|
+
return value;
|
|
120
|
+
}
|
|
121
|
+
function fmt(flags) {
|
|
122
|
+
return oneOf(opt(flags, 'format') ?? 'text', ['json', 'text', 'md'], '--format');
|
|
123
|
+
}
|
|
124
|
+
export function runCli(argv, io) {
|
|
125
|
+
const cmd = argv[0];
|
|
126
|
+
const rest = argv.slice(1);
|
|
127
|
+
try {
|
|
128
|
+
switch (cmd) {
|
|
129
|
+
case 'init':
|
|
130
|
+
mkdirSync(trackDir(io.cwd), { recursive: true });
|
|
131
|
+
io.out(`Initialized .track/ in ${io.cwd}\n`);
|
|
132
|
+
return 0;
|
|
133
|
+
case 'item':
|
|
134
|
+
return cmdItem(rest, io);
|
|
135
|
+
case 'decision':
|
|
136
|
+
return cmdDecision(rest, io);
|
|
137
|
+
case 'blocker':
|
|
138
|
+
return cmdBlocker(rest, io);
|
|
139
|
+
case 'accept':
|
|
140
|
+
return cmdAccept(rest, io);
|
|
141
|
+
case 'priority':
|
|
142
|
+
return cmdPriority(rest, io);
|
|
143
|
+
case 'report':
|
|
144
|
+
return cmdReport(rest, io);
|
|
145
|
+
case 'query':
|
|
146
|
+
return cmdQuery(rest, io);
|
|
147
|
+
case 'validate':
|
|
148
|
+
return cmdValidate(rest, io);
|
|
149
|
+
case 'branch':
|
|
150
|
+
return cmdBranch(rest, io);
|
|
151
|
+
default:
|
|
152
|
+
io.err(USAGE);
|
|
153
|
+
return 2;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
io.err(`error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
158
|
+
return 1;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function rowsOut(rows, format, io) {
|
|
162
|
+
io.out(format === 'json' ? `${JSON.stringify(rows, null, 2)}\n` : formatRows(rows, format));
|
|
163
|
+
}
|
|
164
|
+
function cmdItem(args, io) {
|
|
165
|
+
const sub = args[0];
|
|
166
|
+
const { positional, flags } = parseFlags(args.slice(1));
|
|
167
|
+
const track = new Track(store(io.cwd));
|
|
168
|
+
if (sub === 'new') {
|
|
169
|
+
const id = track.createItem({
|
|
170
|
+
kind: oneOf(req(flags, 'kind'), ITEM_KINDS, '--kind'),
|
|
171
|
+
title: req(flags, 'title'),
|
|
172
|
+
workspace: req(flags, 'workspace'),
|
|
173
|
+
...(opt(flags, 'body') !== undefined ? { body: req(flags, 'body') } : {}),
|
|
174
|
+
...(opt(flags, 'parent') !== undefined ? { parentId: req(flags, 'parent') } : {}),
|
|
175
|
+
});
|
|
176
|
+
io.out(`${id}\n`);
|
|
177
|
+
return 0;
|
|
178
|
+
}
|
|
179
|
+
if (sub === 'spec') {
|
|
180
|
+
track.setSpec(positional[0], oneOf(positional[1], SPEC_TARGETS, 'spec'));
|
|
181
|
+
io.out('ok\n');
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
if (sub === 'realize') {
|
|
185
|
+
track.setRealization(positional[0], oneOf(positional[1], REALIZE_TARGETS, 'realize'));
|
|
186
|
+
io.out('ok\n');
|
|
187
|
+
return 0;
|
|
188
|
+
}
|
|
189
|
+
if (sub === 'show') {
|
|
190
|
+
io.out(`${JSON.stringify(track.state().items.get(positional[0]) ?? null, null, 2)}\n`);
|
|
191
|
+
return 0;
|
|
192
|
+
}
|
|
193
|
+
if (sub === 'ls') {
|
|
194
|
+
const rows = track.query({
|
|
195
|
+
...(opt(flags, 'kind') !== undefined ? { kind: oneOf(req(flags, 'kind'), ITEM_KINDS, '--kind') } : {}),
|
|
196
|
+
...(opt(flags, 'workspace') !== undefined ? { workspace: req(flags, 'workspace') } : {}),
|
|
197
|
+
}, { baselineCommit: opt(flags, 'commit') ?? gitHead(io.cwd) });
|
|
198
|
+
rowsOut(rows, fmt(flags), io);
|
|
199
|
+
return 0;
|
|
200
|
+
}
|
|
201
|
+
io.err('usage: track item <new|spec|realize|show|ls>\n');
|
|
202
|
+
return 2;
|
|
203
|
+
}
|
|
204
|
+
function cmdDecision(args, io) {
|
|
205
|
+
const sub = args[0];
|
|
206
|
+
const { positional, flags } = parseFlags(args.slice(1));
|
|
207
|
+
const track = new Track(store(io.cwd));
|
|
208
|
+
if (sub === 'new') {
|
|
209
|
+
const id = track.createDecision({
|
|
210
|
+
decisionKind: oneOf(req(flags, 'kind'), DECISION_KINDS, '--kind'),
|
|
211
|
+
title: req(flags, 'title'),
|
|
212
|
+
workspace: req(flags, 'workspace'),
|
|
213
|
+
targets: req(flags, 'targets').split(',').map((s) => s.trim()).filter(Boolean),
|
|
214
|
+
dossier: { context: opt(flags, 'context') ?? '', options: [], qa: [] },
|
|
215
|
+
});
|
|
216
|
+
io.out(`${id}\n`);
|
|
217
|
+
return 0;
|
|
218
|
+
}
|
|
219
|
+
if (sub === 'outcome') {
|
|
220
|
+
track.setOutcome(positional[0], oneOf(positional[1], OUTCOMES, 'outcome'));
|
|
221
|
+
io.out('ok\n');
|
|
222
|
+
return 0;
|
|
223
|
+
}
|
|
224
|
+
if (sub === 'dossier') {
|
|
225
|
+
// merge: a context-only edit must not erase existing options/qa/recommendation
|
|
226
|
+
const current = track.state().decisions.get(positional[0])?.dossier;
|
|
227
|
+
if (current === undefined)
|
|
228
|
+
throw new DomainError(`unknown decision ${positional[0]}`);
|
|
229
|
+
track.reviseDossier(positional[0], { ...current, context: opt(flags, 'context') ?? current.context });
|
|
230
|
+
io.out('ok\n');
|
|
231
|
+
return 0;
|
|
232
|
+
}
|
|
233
|
+
if (sub === 'disposition') {
|
|
234
|
+
track.setDisposition(positional[0], oneOf(positional[1], GATES, 'gate'), oneOf(positional[2], DISPOSITIONS, 'disposition'));
|
|
235
|
+
io.out('ok\n');
|
|
236
|
+
return 0;
|
|
237
|
+
}
|
|
238
|
+
io.err('usage: track decision <new|outcome|dossier|disposition>\n');
|
|
239
|
+
return 2;
|
|
240
|
+
}
|
|
241
|
+
function cmdBlocker(args, io) {
|
|
242
|
+
const sub = args[0];
|
|
243
|
+
const { positional, flags } = parseFlags(args.slice(1));
|
|
244
|
+
const track = new Track(store(io.cwd));
|
|
245
|
+
if (sub === 'raise') {
|
|
246
|
+
const id = track.openBlocker({
|
|
247
|
+
targetId: req(flags, 'target'),
|
|
248
|
+
kind: oneOf(req(flags, 'kind'), BLOCKER_KINDS, '--kind'),
|
|
249
|
+
ref: req(flags, 'ref'),
|
|
250
|
+
reason: opt(flags, 'reason') ?? '',
|
|
251
|
+
...(opt(flags, 'rule') !== undefined
|
|
252
|
+
? { resolutionRule: oneOf(req(flags, 'rule'), RESOLUTION_RULES, '--rule') }
|
|
253
|
+
: {}),
|
|
254
|
+
});
|
|
255
|
+
io.out(`${id}\n`);
|
|
256
|
+
return 0;
|
|
257
|
+
}
|
|
258
|
+
if (sub === 'resolve') {
|
|
259
|
+
track.resolveBlocker(positional[0]);
|
|
260
|
+
io.out('ok\n');
|
|
261
|
+
return 0;
|
|
262
|
+
}
|
|
263
|
+
io.err('usage: track blocker <raise|resolve>\n');
|
|
264
|
+
return 2;
|
|
265
|
+
}
|
|
266
|
+
function cmdAccept(args, io) {
|
|
267
|
+
const sub = args[0];
|
|
268
|
+
const { positional, flags } = parseFlags(args.slice(1));
|
|
269
|
+
const track = new Track(store(io.cwd));
|
|
270
|
+
if (sub === 'criterion') {
|
|
271
|
+
io.out(`${track.addCriterion(positional[0], req(flags, 'statement'))}\n`);
|
|
272
|
+
return 0;
|
|
273
|
+
}
|
|
274
|
+
if (sub === 'link') {
|
|
275
|
+
io.out(`${track.linkEvidence(positional[0], oneOf(req(flags, 'kind'), EVIDENCE_KINDS, '--kind'), req(flags, 'locator'))}\n`);
|
|
276
|
+
return 0;
|
|
277
|
+
}
|
|
278
|
+
if (sub === 'run') {
|
|
279
|
+
const commit = opt(flags, 'commit') ?? gitHead(io.cwd);
|
|
280
|
+
const env = opt(flags, 'env') ?? 'ci';
|
|
281
|
+
const runner = opt(flags, 'runner') ?? 'cli';
|
|
282
|
+
const from = opt(flags, 'from');
|
|
283
|
+
if (from !== undefined) {
|
|
284
|
+
const content = readFileSync(isAbsolute(from) ? from : join(io.cwd, from), 'utf8');
|
|
285
|
+
const format = oneOf(req(flags, 'format'), FROM_FORMATS, '--format');
|
|
286
|
+
io.out(`ingested ${track.ingestRuns(content, format, { commit, env, runner })} run(s)\n`);
|
|
287
|
+
return 0;
|
|
288
|
+
}
|
|
289
|
+
track.recordRun(positional[0], {
|
|
290
|
+
commit,
|
|
291
|
+
env,
|
|
292
|
+
runner,
|
|
293
|
+
result: oneOf(req(flags, 'result'), RESULTS, '--result'),
|
|
294
|
+
});
|
|
295
|
+
io.out('ok\n');
|
|
296
|
+
return 0;
|
|
297
|
+
}
|
|
298
|
+
if (sub === 'waive') {
|
|
299
|
+
track.waive(positional[0], req(flags, 'reason'));
|
|
300
|
+
io.out('ok\n');
|
|
301
|
+
return 0;
|
|
302
|
+
}
|
|
303
|
+
io.err('usage: track accept <criterion|link|run|waive>\n');
|
|
304
|
+
return 2;
|
|
305
|
+
}
|
|
306
|
+
function cmdPriority(args, io) {
|
|
307
|
+
const sub = args[0];
|
|
308
|
+
const { positional, flags } = parseFlags(args.slice(1));
|
|
309
|
+
const track = new Track(store(io.cwd));
|
|
310
|
+
if (sub === 'assess') {
|
|
311
|
+
const a = track.assessPriority(positional[0], {
|
|
312
|
+
userBusinessValue: num(flags, 'ubv'),
|
|
313
|
+
timeCriticality: num(flags, 'tc'),
|
|
314
|
+
riskReductionOpportunityEnablement: num(flags, 'rr'),
|
|
315
|
+
jobSize: num(flags, 'js'),
|
|
316
|
+
});
|
|
317
|
+
io.out(`wsjf score ${a.score}\n`);
|
|
318
|
+
return 0;
|
|
319
|
+
}
|
|
320
|
+
io.err('usage: track priority assess <itemId> --ubv --tc --rr --js\n');
|
|
321
|
+
return 2;
|
|
322
|
+
}
|
|
323
|
+
function cmdReport(args, io) {
|
|
324
|
+
const { flags } = parseFlags(args);
|
|
325
|
+
const track = new Track(store(io.cwd));
|
|
326
|
+
const report = track.report({
|
|
327
|
+
baselineCommit: opt(flags, 'commit') ?? gitHead(io.cwd),
|
|
328
|
+
requireAccepted: flags['require-accepted'] === true,
|
|
329
|
+
decisions: flags['decisions'] === true,
|
|
330
|
+
});
|
|
331
|
+
io.out(formatReport(report, fmt(flags)));
|
|
332
|
+
return 0;
|
|
333
|
+
}
|
|
334
|
+
function cmdQuery(args, io) {
|
|
335
|
+
const { flags } = parseFlags(args);
|
|
336
|
+
const track = new Track(store(io.cwd));
|
|
337
|
+
const rows = track.query({
|
|
338
|
+
...(opt(flags, 'kind') !== undefined ? { kind: oneOf(req(flags, 'kind'), ITEM_KINDS, '--kind') } : {}),
|
|
339
|
+
...(opt(flags, 'workspace') !== undefined ? { workspace: req(flags, 'workspace') } : {}),
|
|
340
|
+
...(opt(flags, 'bucket') !== undefined ? { bucket: oneOf(req(flags, 'bucket'), BUCKETS_ARG, '--bucket') } : {}),
|
|
341
|
+
...(opt(flags, 'realization') !== undefined
|
|
342
|
+
? { realization: oneOf(req(flags, 'realization'), REALIZATIONS, '--realization') }
|
|
343
|
+
: {}),
|
|
344
|
+
...(opt(flags, 'acceptance') !== undefined
|
|
345
|
+
? { acceptance: oneOf(req(flags, 'acceptance'), ACCEPTANCES, '--acceptance') }
|
|
346
|
+
: {}),
|
|
347
|
+
}, { baselineCommit: opt(flags, 'commit') ?? gitHead(io.cwd) });
|
|
348
|
+
rowsOut(rows, fmt(flags), io);
|
|
349
|
+
return 0;
|
|
350
|
+
}
|
|
351
|
+
function cmdValidate(args, io) {
|
|
352
|
+
const { flags } = parseFlags(args);
|
|
353
|
+
void flags;
|
|
354
|
+
const s = store(io.cwd);
|
|
355
|
+
let events;
|
|
356
|
+
try {
|
|
357
|
+
events = s.readAll();
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
io.out(`INVALID: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
361
|
+
return 1;
|
|
362
|
+
}
|
|
363
|
+
const integrity = validate(events, readHead(eventsPath(io.cwd)));
|
|
364
|
+
const desync = desyncFindings(new Track(s).state(), io.cwd);
|
|
365
|
+
const findings = [...integrity.findings.map((f) => ({ ...f })), ...desync];
|
|
366
|
+
if (findings.length === 0) {
|
|
367
|
+
io.out(`OK: ${events.length} events, integrity + desync clean\n`);
|
|
368
|
+
return 0;
|
|
369
|
+
}
|
|
370
|
+
io.out(`INVALID: ${integrity.findings.length} integrity + ${desync.length} desync finding(s)\n`);
|
|
371
|
+
io.out(`${JSON.stringify(findings, null, 2)}\n`);
|
|
372
|
+
return 1;
|
|
373
|
+
}
|
|
374
|
+
function cmdBranch(args, io) {
|
|
375
|
+
if (args[0] !== 'import') {
|
|
376
|
+
io.err('usage: track branch import <BRANCH.md> [--commit <sha>]\n');
|
|
377
|
+
return 2;
|
|
378
|
+
}
|
|
379
|
+
const { positional, flags } = parseFlags(args.slice(1));
|
|
380
|
+
const file = positional[0];
|
|
381
|
+
if (file === undefined) {
|
|
382
|
+
io.err('usage: track branch import <BRANCH.md> [--commit <sha>]\n');
|
|
383
|
+
return 2;
|
|
384
|
+
}
|
|
385
|
+
const content = readFileSync(isAbsolute(file) ? file : join(io.cwd, file), 'utf8');
|
|
386
|
+
const track = new Track(store(io.cwd));
|
|
387
|
+
const result = track.importBranch(content, {
|
|
388
|
+
locator: file,
|
|
389
|
+
fileSlug: basename(file).replace(/\.md$/, ''),
|
|
390
|
+
commit: opt(flags, 'commit') ?? gitHead(io.cwd),
|
|
391
|
+
});
|
|
392
|
+
io.out(`Imported ${result.branchSlug}: ${result.created} created, ${result.updated} updated\n`);
|
|
393
|
+
return 0;
|
|
394
|
+
}
|
|
395
|
+
if (process.argv[1] !== undefined && process.argv[1] === fileURLToPath(import.meta.url)) {
|
|
396
|
+
process.exit(runCli(process.argv.slice(2), {
|
|
397
|
+
cwd: process.cwd(),
|
|
398
|
+
out: (s) => process.stdout.write(s),
|
|
399
|
+
err: (s) => process.stderr.write(s),
|
|
400
|
+
}));
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAIhD,OAAO,EAAE,WAAW,EAAiF,MAAM,kBAAkB,CAAA;AAE7H,OAAO,EAAE,YAAY,EAAE,UAAU,EAAe,MAAM,qBAAqB,CAAA;AAC3E,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAU5C,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAA;AAED,MAAM,UAAU,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAU,CAAA;AACvD,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,WAAW,CAAU,CAAA;AACzD,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,CAAU,CAAA;AACrE,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,CAAU,CAAA;AACvF,MAAM,cAAc,GAAG,CAAC,aAAa,EAAE,YAAY,CAAU,CAAA;AAC7D,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAU,CAAA;AACrD,MAAM,KAAK,GAAG,CAAC,aAAa,EAAE,YAAY,CAAU,CAAA;AACpD,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAU,CAAA;AACvE,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,YAAY,CAAU,CAAA;AACzD,4FAA4F;AAC5F,MAAM,gBAAgB,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAU,CAAA;AAC3D,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAU,CAAA;AACxE,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAA;AACzC,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,CAAU,CAAA;AAC/C,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAU,CAAA;AACpE,uFAAuF;AACvF,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAU,CAAA;AAE3E,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;AAC5B,CAAC;AACD,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,CAAA;AAC5C,CAAC;AACD,SAAS,KAAK,CAAC,GAAW;IACxB,OAAO,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;AACxC,CAAC;AACD,SAAS,OAAO,CAAC,GAAW;IAC1B,IAAI,CAAC;QACH,wFAAwF;QACxF,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE;YAChD,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC,IAAI,EAAE,CAAA;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAA;IACf,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAc;IAChC,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAU,EAAE,CAAA;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QAClB,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YACxB,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;gBACjB,CAAC,EAAE,CAAA;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;YACnB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;AAC9B,CAAC;AAED,SAAS,GAAG,CAAC,KAAY,EAAE,GAAW;IACpC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IACpB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,MAAM,IAAI,WAAW,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAA;IAC7E,OAAO,CAAC,CAAA;AACV,CAAC;AACD,SAAS,GAAG,CAAC,KAAY,EAAE,GAAW;IACpC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IACpB,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAC9C,CAAC;AACD,SAAS,GAAG,CAAC,KAAY,EAAE,GAAW;IACpC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IACjC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,KAAK,GAAG,mBAAmB,CAAC,CAAA;IACvE,OAAO,CAAC,CAAA;AACV,CAAC;AACD,0FAA0F;AAC1F,SAAS,KAAK,CAAmB,KAAyB,EAAE,OAAqB,EAAE,IAAY;IAC7F,IAAI,KAAK,KAAK,SAAS,IAAI,CAAE,OAA6B,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,WAAW,CAAC,GAAG,IAAI,oBAAoB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,GAAG,CAAC,CAAA;IAC9H,CAAC;IACD,OAAO,KAAU,CAAA;AACnB,CAAC;AACD,SAAS,GAAG,CAAC,KAAY;IACvB,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,EAAS;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,MAAM;gBACT,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;gBAChD,EAAE,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,GAAG,IAAI,CAAC,CAAA;gBAC5C,OAAO,CAAC,CAAA;YACV,KAAK,MAAM;gBACT,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC1B,KAAK,UAAU;gBACb,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC9B,KAAK,SAAS;gBACZ,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC7B,KAAK,QAAQ;gBACX,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC5B,KAAK,UAAU;gBACb,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC9B,KAAK,QAAQ;gBACX,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC5B,KAAK,OAAO;gBACV,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC3B,KAAK,UAAU;gBACb,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC9B,KAAK,QAAQ;gBACX,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;YAC5B;gBACE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBACb,OAAO,CAAC,CAAA;QACZ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5E,OAAO,CAAC,CAAA;IACV,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAe,EAAE,MAAc,EAAE,EAAS;IACzD,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAa,EAAE,MAAM,CAAC,CAAC,CAAA;AACtG,CAAC;AAED,SAAS,OAAO,CAAC,IAAc,EAAE,EAAS;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACtC,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC;YAC1B,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAa;YACjE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;YAC1B,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC;YAClC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClF,CAAC,CAAA;QACF,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACjB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAe,CAAC,CAAA;QACvF,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACd,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,SAAS,CAAgB,CAAC,CAAA;QACrG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACd,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QACvF,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CACtB;YACE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtG,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzF,EACD,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAC5D,CAAA;QACD,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,OAAO,CAAC,CAAA;IACV,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;IACxD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,WAAW,CAAC,IAAc,EAAE,EAAS;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACtC,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,CAAC;YAC9B,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAiB;YACjF,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;YAC1B,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC;YAClC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YAC9E,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;SACvE,CAAC,CAAA;QACF,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACjB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAY,CAAC,CAAA;QACtF,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACd,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,+EAA+E;QAC/E,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,EAAE,OAAO,CAAA;QACpE,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,WAAW,CAAC,oBAAoB,UAAU,CAAC,CAAC,CAAE,EAAE,CAAC,CAAA;QACtF,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QACtG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACd,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;QAC1B,KAAK,CAAC,cAAc,CAClB,UAAU,CAAC,CAAC,CAAE,EACd,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAS,EAC3C,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,aAAa,CAAsC,CACvF,CAAA;QACD,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACd,OAAO,CAAC,CAAA;IACV,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAA;IACnE,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,UAAU,CAAC,IAAc,EAAE,EAAS;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACtC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;YAC3B,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC;YAC9B,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAgB;YACvE,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;YACtB,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE;YAClC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,SAAS;gBAClC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAmB,EAAE;gBAC7F,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAA;QACF,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QACjB,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,CAAA;QACpC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACd,OAAO,CAAC,CAAA;IACV,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;IAChD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,SAAS,CAAC,IAAc,EAAE,EAAS;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACtC,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QACxB,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAA;QAC1E,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,EAAE,CAAC,GAAG,CACJ,GAAG,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAiB,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,IAAI,CACtI,CAAA;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;QACtD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,CAAA;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAA;QAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;YAClF,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;YACpE,EAAE,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,CAAA;YACzF,OAAO,CAAC,CAAA;QACV,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE;YAC9B,MAAM;YACN,GAAG;YACH,MAAM;YACN,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,UAAU,CAAc;SACtE,CAAC,CAAA;QACF,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACd,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;QACjD,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACd,OAAO,CAAC,CAAA;IACV,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;IAC1D,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,WAAW,CAAC,IAAc,EAAE,EAAS;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACtC,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE;YAC7C,iBAAiB,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;YACpC,eAAe,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;YACjC,kCAAkC,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;YACpD,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;SAC1B,CAAC,CAAA;QACF,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;QACjC,OAAO,CAAC,CAAA;IACV,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAA;IACtE,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,SAAS,CAAC,IAAc,EAAE,EAAS;IAC1C,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC;QACvD,eAAe,EAAE,KAAK,CAAC,kBAAkB,CAAC,KAAK,IAAI;QACnD,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI;KACvC,CAAC,CAAA;IACF,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACxC,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,QAAQ,CAAC,IAAc,EAAE,EAAS;IACzC,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CACtB;QACE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtG,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,UAAU,CAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzH,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,YAAY,EAAE,eAAe,CAAgB,EAAE;YACjG,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,SAAS;YACxC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,cAAc,CAAU,EAAE;YACvF,CAAC,CAAC,EAAE,CAAC;KACR,EACD,EAAE,cAAc,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAC5D,CAAA;IACD,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;IAC7B,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,WAAW,CAAC,IAAc,EAAE,EAAS;IAC5C,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAClC,KAAK,KAAK,CAAA;IACV,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACvB,IAAI,MAAM,CAAA;IACV,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,GAAG,CAAC,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC9E,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAChE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;IAC3D,MAAM,QAAQ,GAAG,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;IAC1E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,EAAE,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,qCAAqC,CAAC,CAAA;QACjE,OAAO,CAAC,CAAA;IACV,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,QAAQ,CAAC,MAAM,gBAAgB,MAAM,CAAC,MAAM,sBAAsB,CAAC,CAAA;IAChG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;IAChD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,SAAS,SAAS,CAAC,IAAc,EAAE,EAAS;IAC1C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACzB,EAAE,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAA;QACnE,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,EAAE,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAA;QACnE,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAClF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE;QACzC,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC;KAChD,CAAC,CAAA;IACF,EAAE,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,OAAO,YAAY,CAAC,CAAA;IAC/F,OAAO,CAAC,CAAA;AACV,CAAC;AAED,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACxF,OAAO,CAAC,IAAI,CACV,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC5B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KACpC,CAAC,CACH,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** One-pass deep clone to inert plain data, rejecting anything that would hash ≠ persist. */
|
|
2
|
+
export declare function materialize(value: unknown): unknown;
|
|
3
|
+
export declare function canonicalize(value: unknown): string;
|
|
4
|
+
export declare function computeHash(value: unknown): string;
|
|
5
|
+
//# sourceMappingURL=canonical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/events/canonical.ts"],"names":[],"mappings":"AAkDA,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA2CnD;AAiDD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIlD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Deterministic canonical JSON, plus `materialize`. Together they make the **hash domain equal
|
|
4
|
+
* the persisted domain by construction** — the store hashes via `computeHash` and persists via
|
|
5
|
+
* `canonicalize`, i.e. the SAME serialization function, applied to the SAME inert snapshot:
|
|
6
|
+
*
|
|
7
|
+
* - `materialize(value)` performs ONE traversal of the (possibly live) input, returning an
|
|
8
|
+
* inert plain-data deep clone and fail-loud rejecting anything whose hash form would differ
|
|
9
|
+
* from its persisted form. A live value (a `Proxy`, a non-idempotent getter) is therefore
|
|
10
|
+
* frozen to what the single traversal read.
|
|
11
|
+
* - `canonicalize` and `materialize` inspect ONLY own properties (`Object.hasOwn`, own
|
|
12
|
+
* descriptors) and never honour an inherited `toJSON`/accessor/index — so a polluted
|
|
13
|
+
* `Object.prototype`/`Array.prototype` cannot make the two diverge.
|
|
14
|
+
*
|
|
15
|
+
* Rejected (fail-loud, before any write): non-finite numbers, non-plain objects (`Date`/`Map`/
|
|
16
|
+
* class), own `toJSON`, accessor (getter/setter) properties, sparse-array holes (and inherited
|
|
17
|
+
* indices), `undefined`/symbol/function members. Hardened relative to h2a's `canonical.ts`
|
|
18
|
+
* (kept h2a-free per SPEC §9).
|
|
19
|
+
*/
|
|
20
|
+
function rejectExoticContainer(value) {
|
|
21
|
+
if (!Array.isArray(value)) {
|
|
22
|
+
const proto = Object.getPrototypeOf(value);
|
|
23
|
+
if (proto !== null && proto !== Object.prototype) {
|
|
24
|
+
const name = value.constructor?.name ?? 'unknown';
|
|
25
|
+
throw new Error(`canonicalize: non-plain object is not supported (${name})`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (Object.hasOwn(value, 'toJSON') &&
|
|
29
|
+
typeof value.toJSON === 'function') {
|
|
30
|
+
throw new Error('canonicalize: value with an own toJSON is not supported (hash/persist divergence)');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function eachArrayIndex(value, visit) {
|
|
34
|
+
for (let i = 0; i < value.length; i++) {
|
|
35
|
+
if (!Object.hasOwn(value, i)) {
|
|
36
|
+
throw new Error('canonicalize: sparse arrays (holes / inherited indices) are not supported');
|
|
37
|
+
}
|
|
38
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, i);
|
|
39
|
+
if (descriptor.get !== undefined || descriptor.set !== undefined) {
|
|
40
|
+
throw new Error(`canonicalize: accessor array index ${i} is not supported`);
|
|
41
|
+
}
|
|
42
|
+
visit(i);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** One-pass deep clone to inert plain data, rejecting anything that would hash ≠ persist. */
|
|
46
|
+
export function materialize(value) {
|
|
47
|
+
if (value === null)
|
|
48
|
+
return null;
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
rejectExoticContainer(value);
|
|
51
|
+
const out = [];
|
|
52
|
+
eachArrayIndex(value, (i) => {
|
|
53
|
+
out.push(materialize(value[i]));
|
|
54
|
+
});
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
const kind = typeof value;
|
|
58
|
+
if (kind === 'object') {
|
|
59
|
+
rejectExoticContainer(value);
|
|
60
|
+
const source = value;
|
|
61
|
+
// null-proto accumulator so a literal `__proto__` own key clones as a data key (no setter).
|
|
62
|
+
const out = Object.create(null);
|
|
63
|
+
for (const key of Object.keys(source)) {
|
|
64
|
+
const descriptor = Object.getOwnPropertyDescriptor(source, key);
|
|
65
|
+
if (descriptor.get !== undefined || descriptor.set !== undefined) {
|
|
66
|
+
throw new Error(`canonicalize: accessor property "${key}" is not supported`);
|
|
67
|
+
}
|
|
68
|
+
const child = source[key];
|
|
69
|
+
if (child === undefined)
|
|
70
|
+
continue;
|
|
71
|
+
out[key] = materialize(child);
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
75
|
+
if (kind === 'number') {
|
|
76
|
+
if (!Number.isFinite(value)) {
|
|
77
|
+
throw new Error(`canonicalize: non-finite numbers are not supported (${value})`);
|
|
78
|
+
}
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
if (kind === 'string' || kind === 'boolean') {
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
throw new Error(`canonicalize: unsupported value type (${kind})`);
|
|
85
|
+
}
|
|
86
|
+
/** Deterministic JSON string: sort keys, drop `undefined`, own-properties only. */
|
|
87
|
+
function canonicalString(value) {
|
|
88
|
+
if (value === null) {
|
|
89
|
+
return 'null';
|
|
90
|
+
}
|
|
91
|
+
if (Array.isArray(value)) {
|
|
92
|
+
rejectExoticContainer(value);
|
|
93
|
+
const members = [];
|
|
94
|
+
eachArrayIndex(value, (i) => {
|
|
95
|
+
members.push(canonicalString(value[i]));
|
|
96
|
+
});
|
|
97
|
+
return '[' + members.join(',') + ']';
|
|
98
|
+
}
|
|
99
|
+
const kind = typeof value;
|
|
100
|
+
if (kind === 'object') {
|
|
101
|
+
rejectExoticContainer(value);
|
|
102
|
+
const source = value;
|
|
103
|
+
for (const key of Object.keys(source)) {
|
|
104
|
+
const descriptor = Object.getOwnPropertyDescriptor(source, key);
|
|
105
|
+
if (descriptor.get !== undefined || descriptor.set !== undefined) {
|
|
106
|
+
throw new Error(`canonicalize: accessor property "${key}" is not supported`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const keys = Object.keys(source)
|
|
110
|
+
.filter((key) => source[key] !== undefined)
|
|
111
|
+
.sort();
|
|
112
|
+
const members = keys.map((key) => `${JSON.stringify(key)}:${canonicalString(source[key])}`);
|
|
113
|
+
return '{' + members.join(',') + '}';
|
|
114
|
+
}
|
|
115
|
+
if (kind === 'number') {
|
|
116
|
+
if (!Number.isFinite(value)) {
|
|
117
|
+
throw new Error(`canonicalize: non-finite numbers are not supported (${value})`);
|
|
118
|
+
}
|
|
119
|
+
return JSON.stringify(value);
|
|
120
|
+
}
|
|
121
|
+
if (kind === 'string' || kind === 'boolean') {
|
|
122
|
+
return JSON.stringify(value);
|
|
123
|
+
}
|
|
124
|
+
throw new Error(`canonicalize: unsupported value type (${kind})`);
|
|
125
|
+
}
|
|
126
|
+
export function canonicalize(value) {
|
|
127
|
+
return canonicalString(value);
|
|
128
|
+
}
|
|
129
|
+
export function computeHash(value) {
|
|
130
|
+
const canonical = canonicalize(value);
|
|
131
|
+
const digest = createHash('sha256').update(canonical, 'utf8').digest('hex');
|
|
132
|
+
return `sha256:${digest}`;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=canonical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/events/canonical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { EventCore, Sha256, TrackEvent } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* contentHash domain = the `EventCore` (the event minus its integrity frame
|
|
4
|
+
* `{seq, prevHash, contentHash}`), faithful to h2a `journal.ts` `stripFrame()`.
|
|
5
|
+
* canonicalize() drops `undefined` keys and sorts keys, so an absent `cmdId`/`cmd`
|
|
6
|
+
* does not change the hash.
|
|
7
|
+
*/
|
|
8
|
+
export declare function contentHashOf(core: EventCore): Sha256;
|
|
9
|
+
/** Recover the hash domain from a persisted event (drops the integrity frame). */
|
|
10
|
+
export declare function stripFrame(event: TrackEvent): EventCore;
|
|
11
|
+
//# sourceMappingURL=frame.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../../src/events/frame.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE/D;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAErD;AAED,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAMvD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { computeHash } from './canonical.js';
|
|
2
|
+
/**
|
|
3
|
+
* contentHash domain = the `EventCore` (the event minus its integrity frame
|
|
4
|
+
* `{seq, prevHash, contentHash}`), faithful to h2a `journal.ts` `stripFrame()`.
|
|
5
|
+
* canonicalize() drops `undefined` keys and sorts keys, so an absent `cmdId`/`cmd`
|
|
6
|
+
* does not change the hash.
|
|
7
|
+
*/
|
|
8
|
+
export function contentHashOf(core) {
|
|
9
|
+
return computeHash(core);
|
|
10
|
+
}
|
|
11
|
+
/** Recover the hash domain from a persisted event (drops the integrity frame). */
|
|
12
|
+
export function stripFrame(event) {
|
|
13
|
+
const { seq: _seq, prevHash: _prevHash, contentHash: _contentHash, ...core } = event;
|
|
14
|
+
void _seq;
|
|
15
|
+
void _prevHash;
|
|
16
|
+
void _contentHash;
|
|
17
|
+
return core;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../src/events/frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAe;IAC3C,OAAO,WAAW,CAAC,IAAI,CAAW,CAAA;AACpC,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAA;IACpF,KAAK,IAAI,CAAA;IACT,KAAK,SAAS,CAAA;IACd,KAAK,YAAY,CAAA;IACjB,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Sha256 } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Non-authoritative anchor that lets `validate` detect suffix **truncation** of the
|
|
4
|
+
* append-only log (SPEC §3 threat model). The log stays the source of truth; the head is a
|
|
5
|
+
* convenience pointer (like snapshots), rebuildable from the log, and additionally durable via
|
|
6
|
+
* the docs-git backend.
|
|
7
|
+
*/
|
|
8
|
+
export interface Head {
|
|
9
|
+
streamLength: number;
|
|
10
|
+
lastContentHash: Sha256 | null;
|
|
11
|
+
}
|
|
12
|
+
export declare function headPath(eventsPath: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Read the head, or `null` if it is missing, unparseable, OR malformed in shape. The head is
|
|
15
|
+
* rebuildable, so any problem must degrade to "no head" (never throw, never a bogus anchor that
|
|
16
|
+
* would silently disable detection or raise a false truncation/head-mismatch).
|
|
17
|
+
*/
|
|
18
|
+
export declare function readHead(eventsPath: string): Head | null;
|
|
19
|
+
/** Write the head atomically (temp file + fsync + rename) so a crash never leaves a torn head. */
|
|
20
|
+
export declare function writeHead(eventsPath: string, head: Head): void;
|
|
21
|
+
//# sourceMappingURL=head.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../../src/events/head.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC;;;;;GAKG;AACH,MAAM,WAAW,IAAI;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAoBxD;AAED,kGAAkG;AAClG,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAY9D"}
|