@substrat-run/cli 0.46.0 → 0.47.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/dist/plan.js ADDED
@@ -0,0 +1,430 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join, resolve } from 'node:path';
4
+ import { decisionsLog, entityDiagram, lifecycleDiagram, parseModel, parsePermissions } from '@substrat-run/model-view';
5
+ import { classify } from './bump.js';
6
+ import { baseCommit, CannotRun, changesetDirFor, defaultBase, gitRoot, packageNameOf, readArtifacts } from './changeset.js';
7
+ import { renderConceptFor } from './concept.js';
8
+ const sorted = (xs) => [...xs].sort();
9
+ const under = (prefix, c) => c.path === prefix || c.path.startsWith(`${prefix}.`);
10
+ /** The transitions that differ between two versions of one entity's lifecycle (absent = none). */
11
+ function transitionChanges(entity, base, head) {
12
+ const edges = (lc) => {
13
+ const out = new Map();
14
+ for (const [from, def] of Object.entries(lc?.states ?? {})) {
15
+ for (const [operation, to] of Object.entries(def.on ?? {})) {
16
+ out.set(`${from}\u0000${operation}`, to);
17
+ }
18
+ }
19
+ return out;
20
+ };
21
+ const b = edges(base);
22
+ const h = edges(head);
23
+ const out = [];
24
+ for (const k of sorted(new Set([...b.keys(), ...h.keys()]))) {
25
+ const [from, operation] = k.split('\u0000');
26
+ const was = b.get(k);
27
+ const to = h.get(k);
28
+ if (was === to)
29
+ continue;
30
+ if (to === undefined)
31
+ out.push({ entity, from, operation, to: was, change: 'removed' });
32
+ else if (was === undefined)
33
+ out.push({ entity, from, operation, to, change: 'added' });
34
+ else
35
+ out.push({ entity, from, operation, to, change: 'retargeted', was });
36
+ }
37
+ return out;
38
+ }
39
+ /** The permission-diff rows that differ: a key added, removed, re-described or held by other roles. */
40
+ function permissionRows(baseMd, headMd) {
41
+ const view = (md) => {
42
+ if (md === null)
43
+ return { holders: new Map(), descriptions: new Map() };
44
+ const v = parsePermissions(md);
45
+ const holders = new Map([...v.descriptions.keys()].map((k) => [k, []]));
46
+ for (const r of v.roles)
47
+ for (const k of r.keys)
48
+ (holders.get(k) ?? holders.set(k, []).get(k)).push(r.role);
49
+ for (const list of holders.values())
50
+ list.sort();
51
+ return { holders, descriptions: v.descriptions };
52
+ };
53
+ const b = view(baseMd);
54
+ const h = view(headMd);
55
+ const rows = [];
56
+ for (const key of sorted(new Set([...b.holders.keys(), ...h.holders.keys()]))) {
57
+ const before = b.holders.get(key) ?? null;
58
+ const after = h.holders.get(key) ?? null;
59
+ const description = h.descriptions.get(key) ?? b.descriptions.get(key) ?? '';
60
+ if (JSON.stringify(before) === JSON.stringify(after) && b.descriptions.get(key) === h.descriptions.get(key))
61
+ continue;
62
+ rows.push({ key, description, before, after });
63
+ }
64
+ return rows;
65
+ }
66
+ /** operation → its declared check and holders, from one side's `PERMISSIONS.md`. */
67
+ function checksIn(md) {
68
+ const out = new Map();
69
+ if (md === null)
70
+ return { checks: out };
71
+ const v = parsePermissions(md);
72
+ if (v.operationsUnreadable !== undefined)
73
+ return { checks: out, unreadable: v.operationsUnreadable };
74
+ for (const [op, c] of v.operations ?? []) {
75
+ const holds = (keys) => keys.some((k) => c.keys.includes(k));
76
+ out.set(op, {
77
+ declared: c.declared,
78
+ keys: c.keys,
79
+ checkedOn: c.checkedOn,
80
+ roles: sorted(v.roles.filter((r) => holds(r.keys)).map((r) => r.role)),
81
+ grantShapes: sorted(v.entityGrants.filter((g) => holds(g.keys)).map((g) => g.entityType)),
82
+ });
83
+ }
84
+ return { checks: out, unknownFor: v.operationsUnknownFor ?? [] };
85
+ }
86
+ const readModelText = (text, what) => text === null ? null : parseModel(JSON.parse(text), what);
87
+ function withChecks(ts, baseMd, headMd) {
88
+ const before = checksIn(baseMd);
89
+ const now = checksIn(headMd);
90
+ return ts.map((t) => {
91
+ const side = t.change === 'removed' ? before : now;
92
+ if (side.unreadable !== undefined)
93
+ return { ...t, checkUnreadable: side.unreadable };
94
+ const check = side.checks.get(t.operation);
95
+ if (check)
96
+ return { ...t, check };
97
+ return side.unknownFor?.length ? { ...t, operationsUnknownFor: side.unknownFor } : t;
98
+ });
99
+ }
100
+ /** The delta between two sets of artifact texts. Pure: the git and filesystem half is {@link planFor}. */
101
+ export function conceptDelta(pkg, base, head) {
102
+ // First: the classifier refuses an artifact that is not JSON with a message naming the file.
103
+ const impact = classify(base, head);
104
+ const baseModel = readModelText(base.model, 'model.json (base)');
105
+ const headModel = readModelText(head.model, 'model.json');
106
+ if (headModel === null) {
107
+ throw new CannotRun('no model.json in the working tree — declare the change in spec/model.ts and re-emit model.json first');
108
+ }
109
+ const modelChanges = impact.changes.filter((c) => c.artifact === 'model');
110
+ const be = new Set(Object.keys(baseModel?.entities ?? {}));
111
+ const he = new Set(Object.keys(headModel.entities));
112
+ const changed = sorted([...be].filter((e) => he.has(e)))
113
+ .map((entity) => ({ entity, changes: modelChanges.filter((c) => under(`entities.${entity}`, c)) }))
114
+ .filter((e) => e.changes.length > 0);
115
+ const added = sorted([...he].filter((e) => !be.has(e)));
116
+ const removed = sorted([...be].filter((e) => !he.has(e)));
117
+ const anyEntity = added.length + removed.length + changed.length > 0;
118
+ const bl = baseModel?.lifecycles ?? {};
119
+ const hl = headModel.lifecycles ?? {};
120
+ const lifecycleNames = sorted(new Set([...Object.keys(bl), ...Object.keys(hl)]));
121
+ const lifecycleChanges = modelChanges.filter((c) => c.path.startsWith('lifecycles.'));
122
+ // Drawn: each lifecycle that is new (a new vertical has no `lifecycles.*` findings, only "model.json added") or changed.
123
+ const touched = lifecycleNames.filter((n) => n in hl && (!(n in bl) || lifecycleChanges.some((c) => under(`lifecycles.${n}`, c))));
124
+ return {
125
+ package: pkg,
126
+ entities: {
127
+ added,
128
+ removed,
129
+ changed,
130
+ before: anyEntity && baseModel ? entityDiagram(baseModel) : null,
131
+ after: anyEntity ? entityDiagram(headModel) : '',
132
+ },
133
+ lifecycles: {
134
+ added: lifecycleNames.filter((n) => !(n in bl)),
135
+ removed: lifecycleNames.filter((n) => !(n in hl)),
136
+ transitions: withChecks(lifecycleNames.flatMap((n) => transitionChanges(n, bl[n], hl[n])), base.permissions, head.permissions),
137
+ changes: lifecycleChanges,
138
+ after: touched.map((n) => lifecycleDiagram(n, hl[n])),
139
+ },
140
+ permissions: {
141
+ rows: permissionRows(base.permissions, head.permissions),
142
+ changes: impact.changes.filter((c) => c.artifact === 'permissions'),
143
+ },
144
+ impact: { bump: impact.bump, changes: impact.changes },
145
+ };
146
+ }
147
+ /** Whether the delta changes anything at all — an empty one has nothing to approve. */
148
+ export const isEmpty = (d) => d.impact.changes.length === 0;
149
+ /**
150
+ * The delta's identity: the first 12 hex of a SHA-256 over its canonical JSON. No date, ref or
151
+ * path is in a delta, so the same two trees give the same digest wherever they are compared.
152
+ */
153
+ export async function digestOf(d) {
154
+ const bytes = new TextEncoder().encode(JSON.stringify(d));
155
+ const hash = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', bytes));
156
+ return Array.from(hash.slice(0, 6), (b) => b.toString(16).padStart(2, '0')).join('');
157
+ }
158
+ // ─── the decisions-log entry ──────────────────────────────────────────────────────────────────
159
+ const code = (xs) => xs.map((x) => `\`${x}\``).join(', ');
160
+ /** One sentence per part of the delta that moved, in the gate's own order. */
161
+ export function summaryOf(d) {
162
+ const parts = [];
163
+ const e = d.entities;
164
+ const entities = [
165
+ e.added.length ? `added ${code(e.added)}` : '',
166
+ e.removed.length ? `removed ${code(e.removed)}` : '',
167
+ e.changed.length ? `changed ${code(e.changed.map((c) => c.entity))}` : '',
168
+ ].filter(Boolean);
169
+ if (entities.length)
170
+ parts.push(`Entities: ${entities.join('; ')}.`);
171
+ const l = d.lifecycles;
172
+ const lifecycles = [
173
+ l.added.length ? `added for ${code(l.added)}` : '',
174
+ l.removed.length ? `removed from ${code(l.removed)}` : '',
175
+ ...l.transitions.map((t) => t.change === 'retargeted'
176
+ ? `\`${t.operation}\` from \`${t.from}\` now leads to \`${t.to}\` (was \`${t.was}\`) on \`${t.entity}\``
177
+ : `\`${t.operation}\` ${t.change === 'added' ? 'now moves' : 'no longer moves'} \`${t.entity}\` from \`${t.from}\` to \`${t.to}\``),
178
+ ].filter(Boolean);
179
+ if (lifecycles.length)
180
+ parts.push(`Lifecycles: ${lifecycles.join('; ')}.`);
181
+ else if (l.changes.length)
182
+ parts.push(`Lifecycles: ${code(sorted(new Set(l.changes.map((c) => c.path.split('.')[1]))))} changed.`);
183
+ const p = d.permissions;
184
+ const keys = [
185
+ ...p.rows.filter((r) => r.before === null).map((r) => `\`${r.key}\` added`),
186
+ ...p.rows.filter((r) => r.after === null).map((r) => `\`${r.key}\` removed`),
187
+ ...p.rows.filter((r) => r.before !== null && r.after !== null).map((r) => `\`${r.key}\` now held by ${r.after.length ? code(r.after) : 'no role'}`),
188
+ ];
189
+ if (keys.length)
190
+ parts.push(`Permissions: ${keys.join('; ')}.`);
191
+ else if (p.changes.length)
192
+ parts.push(`Permissions: ${p.changes.length} change(s) to roles or grant shapes.`);
193
+ if (parts.length === 0 && d.impact.changes.length)
194
+ parts.push('The operations or the API surface changed; no entity, lifecycle or permission did.');
195
+ return parts.join(' ');
196
+ }
197
+ /** Wrap a list item at `width`, continuation lines indented two spaces as concept.md writes them. */
198
+ function wrapItem(text, width = 100) {
199
+ const lines = [];
200
+ let line = '-';
201
+ for (const word of text.split(/\s+/).filter(Boolean)) {
202
+ if (line.length + 1 + word.length > width && line.trim() !== '-') {
203
+ lines.push(line);
204
+ line = ` ${word}`;
205
+ }
206
+ else
207
+ line += ` ${word}`;
208
+ }
209
+ lines.push(line);
210
+ return lines.map((l, i) => (i === 0 ? l : ` ${l}`)).join('\n');
211
+ }
212
+ /** The decisions-log entry, exactly as `--approve` writes it. */
213
+ export function entryFor(d, e) {
214
+ const why = e.why?.trim() ? e.why.trim().replace(/[.\s]*$/, '.') : '<why, in the owner’s words>.';
215
+ const by = e.by?.trim() || '<approver>';
216
+ return wrapItem(`${e.date}: ${why} ${summaryOf(d)} Spec impact: ${d.impact.bump}. Approved by ${by} at the design gate (\`substrat plan\` ${e.digest}).`);
217
+ }
218
+ // ─── rendering ────────────────────────────────────────────────────────────────────────────────
219
+ const MAX_LISTED = 25;
220
+ const changeLine = (c) => `- ${c.flagged ? '**Review:** ' : ''}\`${c.path}\` (${c.artifact}): ${c.detail} — ${c.level}`;
221
+ const listed = (cs) => {
222
+ const lines = cs.map(changeLine);
223
+ return lines.length > MAX_LISTED ? [...lines.slice(0, MAX_LISTED), `- … and ${lines.length - MAX_LISTED} more`] : lines;
224
+ };
225
+ const roles = (rs) => (rs === null ? '— (no such key)' : rs.length ? code(rs) : '— no role —');
226
+ function checkCell(c) {
227
+ if (c === undefined)
228
+ return '— not in PERMISSIONS.md —';
229
+ if (!c.declared)
230
+ return 'checked in code, not declared';
231
+ if (c.keys.length === 0)
232
+ return cell(c.checkedOn);
233
+ const holders = [
234
+ c.roles.length ? `roles ${code(c.roles)}` : '',
235
+ c.grantShapes.length ? `per record on ${code(c.grantShapes)}` : '',
236
+ ].filter(Boolean);
237
+ return `${code(c.keys)} on ${cell(c.checkedOn)} — ${holders.join('; ') || 'no role or grant shape'}`;
238
+ }
239
+ const cell = (s) => s.replace(/\|/g, '\\|').replace(/\n/g, ' ');
240
+ /** The delta as Markdown — what the design gate shows. Deterministic for the same inputs. */
241
+ export function renderDelta(d, opts) {
242
+ const out = [`# Concept delta — ${d.package}`, '', `Against \`${opts.base}\` (the merge-base with HEAD). Digest \`${opts.digest}\`.`, ''];
243
+ out.push('## Entities', '');
244
+ const e = d.entities;
245
+ if (e.added.length + e.removed.length + e.changed.length === 0)
246
+ out.push('_No entity is added, changed or removed._', '');
247
+ else {
248
+ if (e.added.length)
249
+ out.push(`- **Added:** ${code(e.added)}`);
250
+ if (e.removed.length)
251
+ out.push(`- **Removed:** ${code(e.removed)}`);
252
+ for (const c of e.changed)
253
+ out.push(`- **Changed:** \`${c.entity}\``, ...listed(c.changes).map((l) => ` ${l}`));
254
+ out.push('', '### Before', '', e.before ?? '_No model at the base: every entity is new._', '', '### After', '', e.after, '');
255
+ }
256
+ out.push('## Lifecycles', '');
257
+ const l = d.lifecycles;
258
+ if (l.changes.length === 0 && l.transitions.length === 0 && l.added.length + l.removed.length === 0)
259
+ out.push('_No lifecycle, state or transition changes._', '');
260
+ else {
261
+ if (l.added.length)
262
+ out.push(`- **Lifecycle added:** ${code(l.added)}`);
263
+ if (l.removed.length)
264
+ out.push(`- **Lifecycle removed:** ${code(l.removed)} — its states are no longer enforced`);
265
+ if (l.transitions.length) {
266
+ out.push('', '| Entity | From | Triggered by | To | Change | Checks — held by |', '| --- | --- | --- | --- | --- | --- |');
267
+ for (const t of l.transitions) {
268
+ const change = t.change === 'retargeted' ? `retargeted (was \`${t.was}\`)` : t.change;
269
+ const checks = t.checkUnreadable !== undefined
270
+ ? '— unreadable: the Operations table is not the emitter’s —'
271
+ : t.operationsUnknownFor !== undefined
272
+ ? `— not listed: operations unknown for ${code(t.operationsUnknownFor)} —`
273
+ : checkCell(t.check);
274
+ out.push(`| \`${t.entity}\` | \`${t.from}\` | \`${t.operation}\` | \`${t.to}\` | ${change} | ${checks} |`);
275
+ }
276
+ out.push('', 'Who may trigger a transition is whoever may run its operation: the last column is the key that operation declares it checks, from the Operations section of PERMISSIONS.md, and the roles and per-record grant shapes holding it. Any change to who holds a key is under Permissions below.');
277
+ const unreadable = [...new Set(l.transitions.flatMap((t) => (t.checkUnreadable === undefined ? [] : [t.checkUnreadable])))];
278
+ if (unreadable.length) {
279
+ out.push('', `The Operations section of PERMISSIONS.md cannot be read (${unreadable.join('; ')}), so no key is named. The classifier ranks this major; re-emit PERMISSIONS.md.`);
280
+ }
281
+ const unknownFor = sorted(new Set(l.transitions.flatMap((t) => t.operationsUnknownFor ?? [])));
282
+ if (unknownFor.length) {
283
+ out.push('', `Operations unknown for ${code(unknownFor)}: registered as a bare manifest, so PERMISSIONS.md cannot list them, and an operation it does not list may be one of theirs.`);
284
+ }
285
+ if (l.transitions.some((t) => t.check === undefined && t.checkUnreadable === undefined && t.operationsUnknownFor === undefined)) {
286
+ out.push('', 'An operation PERMISSIONS.md does not list is named without a key: that file predates its Operations section, the operation is not registered, or its module was bound by a kernel too old to carry declarations. Re-emit PERMISSIONS.md to fill it in.');
287
+ }
288
+ if (l.transitions.some((t) => t.check?.declared === false)) {
289
+ out.push('', 'An operation "checked in code, not declared" makes its check in its handler and declares none, so no artifact names its key.');
290
+ }
291
+ }
292
+ const other = l.changes.filter((c) => !/\.on\./.test(c.path));
293
+ if (other.length)
294
+ out.push('', ...listed(other));
295
+ if (l.after.length)
296
+ out.push('', ...l.after.flatMap((block) => [block, '']));
297
+ else
298
+ out.push('');
299
+ }
300
+ out.push('## Permissions', '');
301
+ const p = d.permissions;
302
+ if (p.rows.length === 0 && p.changes.length === 0)
303
+ out.push('_No permission key, role or grant shape changes._', '');
304
+ else {
305
+ if (p.rows.length) {
306
+ out.push('| Key | Description | Roles before | Roles after |', '| --- | --- | --- | --- |');
307
+ for (const r of p.rows)
308
+ out.push(`| \`${r.key}\` | ${cell(r.description) || '—'} | ${roles(r.before)} | ${roles(r.after)} |`);
309
+ out.push('');
310
+ }
311
+ out.push('Each of these is a permission diff a person reads and approves (the human checkpoint):', '', ...listed(p.changes), '');
312
+ }
313
+ out.push('## Spec-version impact', '');
314
+ if (d.impact.bump === 'none')
315
+ out.push('**none** — nothing a caller sends or reads, and no permission, changed.', '');
316
+ else {
317
+ const top = d.impact.changes.filter((c) => c.level === d.impact.bump);
318
+ out.push(`**${d.impact.bump}** — from the same classifier \`substrat changeset\` writes with, over model.json, openapi.json and PERMISSIONS.md. The ${top.length === 1 ? 'change' : `${top.length} changes`} that set it:`, '', ...listed(top), '');
319
+ const rest = d.impact.changes.filter((c) => c.level !== d.impact.bump);
320
+ if (rest.length)
321
+ out.push('<details><summary>Every other change</summary>', '', ...listed(rest), '', '</details>', '');
322
+ }
323
+ out.push('## Proposed decisions-log entry', '');
324
+ if (isEmpty(d))
325
+ out.push('_Nothing to approve: the artifacts are the same as at the base._');
326
+ else {
327
+ out.push('```md', entryFor(d, { date: opts.date, digest: opts.digest, ...(opts.why ? { why: opts.why } : {}) }), '```', '', `Approving writes it to the Decisions log of spec/concept.md: \`substrat plan --approve ${opts.digest} --by "<name>" --why "<why>"\`.`);
328
+ }
329
+ return `${out.join('\n')}\n`;
330
+ }
331
+ // ─── the filesystem and git half ──────────────────────────────────────────────────────────────
332
+ /** The changesets base branch when the project releases with changesets, else `main` (on origin when fetched). */
333
+ function defaultRef(dir, root) {
334
+ try {
335
+ return defaultBase(changesetDirFor(dir, root), root);
336
+ }
337
+ catch (err) {
338
+ if (!(err instanceof CannotRun))
339
+ throw err;
340
+ return gitRefExists('origin/main', root) ? 'origin/main' : 'main';
341
+ }
342
+ }
343
+ const gitRefExists = (ref, cwd) => spawnSync('git', ['rev-parse', '--verify', '--quiet', `${ref}^{commit}`], { cwd }).status === 0;
344
+ /** The delta for the vertical at `dir` against the merge-base of `base` (default: the changesets base branch). */
345
+ export function planFor(dir, base) {
346
+ const root = gitRoot(dir);
347
+ const ref = base ?? defaultRef(dir, root);
348
+ const commit = baseCommit(ref, root);
349
+ const { base: atBase, head } = readArtifacts(resolve(dir), commit, root);
350
+ return { delta: conceptDelta(packageNameOf(dir), atBase, head), base: ref };
351
+ }
352
+ /**
353
+ * Insert `entry` as the last item of the `## …Decisions log…` section, before the next `##`
354
+ * heading. Refuses a document without that section: `lint:concept` asks for one, and an entry
355
+ * written anywhere else would not satisfy it.
356
+ */
357
+ export function appendDecision(markdown, entry) {
358
+ if (decisionsLog(markdown) === undefined) {
359
+ throw new CannotRun('spec/concept.md has no "Decisions log" section (a `##` heading) to record the approval in');
360
+ }
361
+ const lines = markdown.split('\n');
362
+ const at = lines.findIndex((l) => /^##\s+(\d+\.\s*)?decisions log\b/i.test(l));
363
+ const next = lines.findIndex((l, i) => i > at && /^##\s/.test(l));
364
+ let end = next < 0 ? lines.length : next;
365
+ while (end > at + 1 && lines[end - 1].trim() === '')
366
+ end--;
367
+ // Below the last entry, or a blank line below the heading of an empty log; whatever followed stays.
368
+ return [...lines.slice(0, end), ...(end === at + 1 ? [''] : []), entry, ...lines.slice(end)].join('\n');
369
+ }
370
+ /**
371
+ * Why `--by` or `--why` cannot go into the entry, or `undefined`. A concept marker in it would be
372
+ * a second `<!-- substrat:… -->` in the document — every later sync and `lint:concept` refuses
373
+ * that — and any comment or line break would let one value write structure into concept.md.
374
+ */
375
+ export function entryTextProblem(value) {
376
+ if (value === undefined)
377
+ return undefined;
378
+ if (/<!--|-->/.test(value))
379
+ return 'may not contain an HTML comment (`<!--` or `-->`): it would be read as a concept.md marker';
380
+ if (/[\u0000-\u001f\u007f]/.test(value))
381
+ return 'must be one line of plain text (no line breaks or control characters)';
382
+ return undefined;
383
+ }
384
+ /** `substrat plan`, minus the process: what to print and the exit code. */
385
+ export async function planCommand(dir, opts) {
386
+ const { delta, base } = planFor(dir, opts.base);
387
+ const digest = await digestOf(delta);
388
+ if (opts.approve === undefined) {
389
+ if (opts.json) {
390
+ const entry = isEmpty(delta) ? null : entryFor(delta, { date: opts.date, digest, ...(opts.why ? { why: opts.why } : {}) });
391
+ return { out: [JSON.stringify({ base, digest, ...delta, entry }, null, 2)], err: [], code: 0 };
392
+ }
393
+ return { out: [renderDelta(delta, { base, digest, date: opts.date, ...(opts.why ? { why: opts.why } : {}) })], err: [], code: 0 };
394
+ }
395
+ if (!opts.by?.trim() || !opts.why?.trim()) {
396
+ return { out: [], err: ['--approve needs --by "<who approved it>" and --why "<the reason, in their words>"'], code: 1 };
397
+ }
398
+ if (isEmpty(delta))
399
+ return { out: [], err: [`nothing to approve: the artifacts are the same as at ${base}`], code: 1 };
400
+ if (opts.approve !== digest) {
401
+ return {
402
+ out: [],
403
+ err: [
404
+ `the delta is now ${digest}, not the ${opts.approve} that was approved — the artifacts changed since it was shown.`,
405
+ 'Show it again (`substrat plan`) and take the approval for what it shows now.',
406
+ ],
407
+ code: 1,
408
+ };
409
+ }
410
+ for (const [name, value] of [['--by', opts.by], ['--why', opts.why]]) {
411
+ const problem = entryTextProblem(value);
412
+ if (problem)
413
+ return { out: [], err: [`${name} ${problem}`], code: 1 };
414
+ }
415
+ const file = join(resolve(dir), 'spec', 'concept.md');
416
+ if (!existsSync(file))
417
+ throw new CannotRun(`no spec/concept.md at ${file} — the approval is recorded in its Decisions log`);
418
+ const entry = entryFor(delta, { date: opts.date, why: opts.why, by: opts.by, digest });
419
+ const current = readFileSync(file, 'utf8');
420
+ // The whole result is rendered in memory first, the entry included, and written only once it
421
+ // renders: a refusal (an unreadable marker, wherever it came from) leaves the file byte-identical.
422
+ const { after } = renderConceptFor(dir, appendDecision(current, entry));
423
+ writeFileSync(file, after);
424
+ return {
425
+ out: [`✓ approved ${digest} (${delta.impact.bump}) — recorded in the Decisions log of ${file}, generated sections re-synced`],
426
+ err: [],
427
+ code: 0,
428
+ };
429
+ }
430
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,39 @@
1
1
  import { type StoreDriverReleaseUpload } from '@substrat-run/contracts';
2
2
  import type { StoreDriverRebuildView, StoreDriverView } from '@substrat-run/control-plane-client';
3
3
  /**
4
- * Every file under `dir`, by its path relative to it, `__pycache__` and `.pyc` left out. A symbolic
5
- * link is refused, not followed: it could pack a file from outside `dir`, or loop forever.
4
+ * The markers `pywrangler sync` writes into `python_modules/` beside what it installs: install
5
+ * output, not a dependency. The walk skips exactly these; the upload still refuses them by name.
6
+ */
7
+ export declare const INSTALLER_MARKERS: readonly string[];
8
+ /**
9
+ * Every file under `dir`, by its path relative to it, `__pycache__`, `.pyc` and the
10
+ * {@link INSTALLER_MARKERS} left out. A symbolic link is refused, not followed: it could pack a
11
+ * file from outside `dir`, or loop forever.
6
12
  */
7
13
  export declare function packedFilesOf(dir: string): string[];
14
+ /** The {@link INSTALLER_MARKERS} present under `dir`: what the walk skipped. */
15
+ export declare const skippedInstallerMarkersOf: (dir: string) => string[];
8
16
  /**
9
- * The commit `dir` is checked out at, for the files about to be packed. Refused unless every one
10
- * of them is tracked and unchanged there: an untracked, ignored or edited file is not that
11
- * commit, so the bundle would carry bytes the commit a reviewer reads does not.
17
+ * The commit `dir` is checked out at, for the driver's files about to be packed. Refused unless
18
+ * every one of them is tracked and unchanged there, and nothing else under `dir` but
19
+ * `python_modules/` is changed or deleted: an untracked, ignored or edited file is not that
20
+ * commit, so the bundle would carry bytes the commit a reviewer reads does not. `python_modules/`
21
+ * is held to neither check: it is install output, and the release sha256 vouches for its bytes.
12
22
  */
13
23
  export declare function sourceCommitOf(dir: string, files: readonly string[]): string;
14
24
  /** The driver's package under `dir`, as the upload body. `entry` is the module with the class. */
15
25
  export declare function packStoreDriverDir(dir: string, entry: string, sourceCommit: string): StoreDriverReleaseUpload;
26
+ /**
27
+ * What `upload` says about what vouches for the release it stored, beyond its sha256 and commit:
28
+ * the installer markers the walk skipped, and, when it carries `python_modules/`, that those bytes
29
+ * are vouched for by the sha256 only. Said for every such release, whether it is pinned yet or not.
30
+ */
31
+ export declare function storeDriverPackLines(input: {
32
+ files: readonly string[];
33
+ skipped: readonly string[];
34
+ sha256: string;
35
+ sourceCommit: string;
36
+ }): string[];
16
37
  /** A release is named by its sha256 as `upload` printed it; anything else is refused before a request. */
17
38
  export declare const isReleaseSha: (value: string | undefined) => value is string;
18
39
  type Plane = {
@@ -1 +1 @@
1
- {"version":3,"file":"store-driver.d.ts","sourceRoot":"","sources":["../src/store-driver.ts"],"names":[],"mappings":"AAmBA,OAAO,EAA2B,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACjG,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAelG;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAgB5E;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,wBAAwB,CAoB7G;AAED,0GAA0G;AAC1G,eAAO,MAAM,YAAY,UAAW,MAAM,GAAG,SAAS,KAAG,KAAK,IAAI,MAA6D,CAAC;AAEhI,KAAK,KAAK,GAAG;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAEzE,eAAO,MAAM,wBAAwB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,wBAAwB,CAAA;CAAE;;;EACR,CAAC;AAEnG,eAAO,MAAM,kBAAkB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,uFACU,CAAC;AAE/F,eAAO,MAAM,mBAAmB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,uFACY,CAAC;AAElF,eAAO,MAAM,iBAAiB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,6BACS,CAAC;AAE7E,eAAO,MAAM,kBAAkB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE;;;EACqC,CAAC;AAEpI;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,EAAE,CA4BjF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,EAAE,CAStF"}
1
+ {"version":3,"file":"store-driver.d.ts","sourceRoot":"","sources":["../src/store-driver.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAiF,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACvJ,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAelG;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAA8D,CAAC;AAI9G;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBnD;AAED,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,QAAS,MAAM,KAAG,MAAM,EAAqE,CAAC;AAEpI;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAgB5E;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,wBAAwB,CAiB7G;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,EAAE,CAUpJ;AAED,0GAA0G;AAC1G,eAAO,MAAM,YAAY,UAAW,MAAM,GAAG,SAAS,KAAG,KAAK,IAAI,MAA6D,CAAC;AAEhI,KAAK,KAAK,GAAG;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAEzE,eAAO,MAAM,wBAAwB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,wBAAwB,CAAA;CAAE;;;EACR,CAAC;AAEnG,eAAO,MAAM,kBAAkB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,uFACU,CAAC;AAE/F,eAAO,MAAM,mBAAmB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,uFACY,CAAC;AAElF,eAAO,MAAM,iBAAiB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,6BACS,CAAC;AAE7E,eAAO,MAAM,kBAAkB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE;;;EACqC,CAAC;AAEpI;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,EAAE,CA4BjF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,EAAE,CAStF"}