@wemuda/launchrail 1.17.0 → 1.19.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/README.md +1 -0
- package/assets/ralph.workflow.js +11 -11
- package/assets/skills/launchrail/launch/SKILL.md +2 -2
- package/assets/skills/launchrail/launch/workflow.md +3 -1
- package/assets/skills/launchrail/launch-browser-smoke/SKILL.md +1 -1
- package/assets/skills/launchrail/launch-design-handoff/SKILL.md +8 -7
- package/assets/skills/launchrail/launch-design-implement/SKILL.md +72 -0
- package/assets/skills/launchrail/launch-design-implement/fidelity.md +98 -0
- package/assets/skills/launchrail/launch-ralph/SKILL.md +6 -6
- package/assets/skills/launchrail/launch-ralph-implement/SKILL.md +3 -3
- package/dist/commands/adr.d.ts +29 -0
- package/dist/commands/adr.js +71 -2
- package/dist/commands/adr.js.map +1 -1
- package/dist/commands/doctor.js +26 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +15 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/sync.js +8 -0
- package/dist/commands/sync.js.map +1 -1
- package/dist/index.js +17 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/adr.d.ts +60 -4
- package/dist/lib/adr.js +171 -27
- package/dist/lib/adr.js.map +1 -1
- package/dist/lib/adrMergeDriver.d.ts +73 -0
- package/dist/lib/adrMergeDriver.js +223 -0
- package/dist/lib/adrMergeDriver.js.map +1 -0
- package/dist/lib/migrations.js +73 -0
- package/dist/lib/migrations.js.map +1 -1
- package/dist/lib/seeds.js +4 -27
- package/dist/lib/seeds.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/adr.js
CHANGED
|
@@ -33,6 +33,35 @@ function adrStatus(source) {
|
|
|
33
33
|
const paragraph = (match[1] ?? "").trim().split(/\n\s*\n/)[0] ?? "";
|
|
34
34
|
return paragraph.replace(/\s+/g, " ").trim();
|
|
35
35
|
}
|
|
36
|
+
/** Whether a filename in docs/adr/ is a decision record (not the template, not the registry). */
|
|
37
|
+
export function isAdrRecordFilename(file) {
|
|
38
|
+
return file !== ADR_TEMPLATE_FILENAME && parseFilename(file) !== null;
|
|
39
|
+
}
|
|
40
|
+
/** Parse one record's file and source into an entry; null when the filename is not a record. */
|
|
41
|
+
export function parseAdrEntry(file, source) {
|
|
42
|
+
if (file === ADR_TEMPLATE_FILENAME)
|
|
43
|
+
return null;
|
|
44
|
+
const parsed = parseFilename(file);
|
|
45
|
+
if (!parsed)
|
|
46
|
+
return null;
|
|
47
|
+
return { ...parsed, file, title: adrTitle(source, file), status: adrStatus(source) };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The record list built from an explicit set of file→source pairs, sorted by
|
|
51
|
+
* filename exactly as scanAdrs sorts the directory — numbered records first,
|
|
52
|
+
* dated records after them in date order. The merge driver uses this to
|
|
53
|
+
* assemble the corpus from the working tree plus the records only the incoming
|
|
54
|
+
* side carries, which are not yet on disk when git invokes the driver.
|
|
55
|
+
*/
|
|
56
|
+
export function entriesFromSources(sources) {
|
|
57
|
+
const entries = [];
|
|
58
|
+
for (const [file, source] of [...sources].sort(([a], [b]) => a.localeCompare(b))) {
|
|
59
|
+
const entry = parseAdrEntry(file, source);
|
|
60
|
+
if (entry)
|
|
61
|
+
entries.push(entry);
|
|
62
|
+
}
|
|
63
|
+
return entries;
|
|
64
|
+
}
|
|
36
65
|
/**
|
|
37
66
|
* The decision records already in a repository's docs/adr/ (template and
|
|
38
67
|
* registry excluded), sorted by filename — numbered records first, dated
|
|
@@ -43,12 +72,9 @@ export function scanAdrs(cwd) {
|
|
|
43
72
|
const dir = join(cwd, ADR_DIR);
|
|
44
73
|
if (!existsSync(dir))
|
|
45
74
|
return [];
|
|
46
|
-
const
|
|
47
|
-
for (const file of readdirSync(dir)
|
|
48
|
-
if (file
|
|
49
|
-
continue;
|
|
50
|
-
const parsed = parseFilename(file);
|
|
51
|
-
if (!parsed)
|
|
75
|
+
const sources = [];
|
|
76
|
+
for (const file of readdirSync(dir)) {
|
|
77
|
+
if (!isAdrRecordFilename(file))
|
|
52
78
|
continue;
|
|
53
79
|
let source = "";
|
|
54
80
|
try {
|
|
@@ -57,16 +83,19 @@ export function scanAdrs(cwd) {
|
|
|
57
83
|
catch {
|
|
58
84
|
// Unreadable file — title falls back to the filename, status to empty.
|
|
59
85
|
}
|
|
60
|
-
|
|
86
|
+
sources.push([file, source]);
|
|
61
87
|
}
|
|
62
|
-
return
|
|
88
|
+
return entriesFromSources(sources);
|
|
63
89
|
}
|
|
64
|
-
/**
|
|
65
|
-
|
|
66
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Ids (numbers or slugs) claimed by more than one record, each with the files
|
|
92
|
+
* that claim it — every reference by such an id is ambiguous.
|
|
93
|
+
*/
|
|
94
|
+
export function adrDuplicates(entries) {
|
|
95
|
+
const byId = new Map();
|
|
67
96
|
for (const entry of entries)
|
|
68
|
-
|
|
69
|
-
return [...
|
|
97
|
+
byId.set(entry.id, [...(byId.get(entry.id) ?? []), entry.file]);
|
|
98
|
+
return [...byId.entries()].filter(([, files]) => files.length > 1).map(([id, files]) => ({ id, files }));
|
|
70
99
|
}
|
|
71
100
|
/** Records whose filename never appears in the registry — rows the index is missing. */
|
|
72
101
|
export function unindexedAdrs(registrySource, entries) {
|
|
@@ -194,17 +223,23 @@ export function adrIndexTable(entries) {
|
|
|
194
223
|
return [ADR_INDEX_START, header, ...rows, ADR_INDEX_END].join("\n");
|
|
195
224
|
}
|
|
196
225
|
/**
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
226
|
+
* A single-line placeholder the merge driver substitutes for the index region
|
|
227
|
+
* while it 3-way merges the registry's prose, then swaps back out for the freshly
|
|
228
|
+
* regenerated table. Comment-shaped so it is inert if it ever leaks into a file,
|
|
229
|
+
* and identical across all three sides so the prose merge sees no index diff.
|
|
201
230
|
*/
|
|
202
|
-
export
|
|
203
|
-
|
|
231
|
+
export const ADR_INDEX_SENTINEL = "<!-- launchrail:adr-index-merge-placeholder -->";
|
|
232
|
+
/**
|
|
233
|
+
* Replace the registry's index region with `replacement`: everything between the
|
|
234
|
+
* markers when they exist; otherwise the first table under `## Index`, with the
|
|
235
|
+
* region newline-padded (a registry written before the generator migrates on its
|
|
236
|
+
* first run). Null when the registry has neither — there is nothing to replace.
|
|
237
|
+
*/
|
|
238
|
+
export function replaceIndexRegion(registrySource, replacement) {
|
|
204
239
|
const start = registrySource.indexOf("<!-- adr-index:start");
|
|
205
240
|
const end = registrySource.indexOf(ADR_INDEX_END);
|
|
206
241
|
if (start !== -1 && end !== -1 && end > start) {
|
|
207
|
-
return registrySource.slice(0, start) +
|
|
242
|
+
return registrySource.slice(0, start) + replacement + registrySource.slice(end + ADR_INDEX_END.length);
|
|
208
243
|
}
|
|
209
244
|
const heading = /^##\s+Index\s*$/m.exec(registrySource);
|
|
210
245
|
if (!heading)
|
|
@@ -216,7 +251,121 @@ export function withRegeneratedIndex(registrySource, entries) {
|
|
|
216
251
|
return null;
|
|
217
252
|
const before = registrySource.slice(0, afterHeading + tableMatch.index);
|
|
218
253
|
const after = rest.slice(tableMatch.index + tableMatch[0].length);
|
|
219
|
-
return `${before}\n${
|
|
254
|
+
return `${before}\n${replacement}\n${after}`;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* The registry with its index table regenerated in place. Between the markers
|
|
258
|
+
* when they exist; otherwise the first table under `## Index` is replaced and
|
|
259
|
+
* the markers introduced around it. Null when the registry has neither.
|
|
260
|
+
*/
|
|
261
|
+
export function withRegeneratedIndex(registrySource, entries) {
|
|
262
|
+
return replaceIndexRegion(registrySource, adrIndexTable(entries));
|
|
263
|
+
}
|
|
264
|
+
// --- Minting guidance: a managed contract, a seeded summary, a one-time heal ----
|
|
265
|
+
//
|
|
266
|
+
// How a record is minted is an *operational instruction* the toolchain must be
|
|
267
|
+
// able to keep current. The authoritative copy therefore lives in the managed
|
|
268
|
+
// workflow instructions (`.launchrail/CLAUDE.generated.md`), which sync rewrites
|
|
269
|
+
// every version. The seeded registry and template carry only a project-owned
|
|
270
|
+
// summary and defer to it. The strings below are shared by the seed and by the
|
|
271
|
+
// heal migration so both write the same bytes, and the pre-date-slug versions
|
|
272
|
+
// are pinned exactly so the migration corrects a repo Launchrail seeded before
|
|
273
|
+
// the dated-identifier scheme without ever touching one a project has edited.
|
|
274
|
+
/** The seeded ADR template: date-and-slug titled, teaching the forward-declared relation model. */
|
|
275
|
+
export const ADR_TEMPLATE = `# Short decision title
|
|
276
|
+
|
|
277
|
+
## Status
|
|
278
|
+
Proposed | Accepted | Superseded by [slug](YYYY-MM-DD-slug.md)
|
|
279
|
+
|
|
280
|
+
Name here what this record supersedes, amends, or extends, linking the earlier record by file (\`Accepted — amends [slug](YYYY-MM-DD-slug.md): what changed\`). The registry index ([README.md](README.md)) derives the reverse links, so an earlier record need not be edited when this one amends it; when this record is superseded later, this line is rewritten to name the successor. Re-run \`launchrail adr index\` after any change here.
|
|
281
|
+
|
|
282
|
+
## Context
|
|
283
|
+
What requirement or constraint requires a decision?
|
|
284
|
+
|
|
285
|
+
## Decision
|
|
286
|
+
What was selected?
|
|
287
|
+
|
|
288
|
+
## Alternatives considered
|
|
289
|
+
What realistic alternatives were rejected?
|
|
290
|
+
|
|
291
|
+
## Consequences
|
|
292
|
+
What becomes easier, harder, or constrained?
|
|
293
|
+
|
|
294
|
+
## Revisit when
|
|
295
|
+
What change would justify reconsidering this decision?
|
|
296
|
+
`;
|
|
297
|
+
/** The `# ADR-NNNN:`-titled template seeded before the dated-identifier ADR (byte-stable until then). */
|
|
298
|
+
export const PRE_DATE_SLUG_ADR_TEMPLATE = `# ADR-NNNN: Short decision title
|
|
299
|
+
|
|
300
|
+
## Status
|
|
301
|
+
Proposed | Accepted | Accepted — amended by ADR-NNNN | Superseded by ADR-NNNN
|
|
302
|
+
|
|
303
|
+
When a later ADR amends or supersedes this one, update this line and the registry index ([README.md](README.md)) in the same commit.
|
|
304
|
+
|
|
305
|
+
## Context
|
|
306
|
+
What requirement or constraint requires a decision?
|
|
307
|
+
|
|
308
|
+
## Decision
|
|
309
|
+
What was selected?
|
|
310
|
+
|
|
311
|
+
## Alternatives considered
|
|
312
|
+
What realistic alternatives were rejected?
|
|
313
|
+
|
|
314
|
+
## Consequences
|
|
315
|
+
What becomes easier, harder, or constrained?
|
|
316
|
+
|
|
317
|
+
## Revisit when
|
|
318
|
+
What change would justify reconsidering this decision?
|
|
319
|
+
`;
|
|
320
|
+
/** The registry's project-owned summary of how records are minted; defers to the managed contract. */
|
|
321
|
+
export const ADR_MAINTAINING_SECTION = `## Maintaining this registry
|
|
322
|
+
|
|
323
|
+
- New ADRs copy [0000-template.md](0000-template.md) to \`YYYY-MM-DD-short-slug.md\` — the date the decision was made, then a slug unique in this directory. There is no sequence number to claim, so parallel branches never collide, and nothing is renumbered.
|
|
324
|
+
- The index table between the markers is **generated**: run \`launchrail adr index\` after adding or re-statusing a record, and commit the result. Never hand-edit the rows; the rest of this file is yours. Parallel branches do not collide on it — Launchrail installs a git merge driver (\`launchrail doctor\` registers it in each clone) that rebuilds the table from the records on merge or rebase, so both branches' new rows land in date order with no conflict. If you ever do see a conflict here — a fresh clone before \`launchrail doctor\` ran, say — never resolve it by editing rows: run \`launchrail adr index && git add docs/adr/README.md\` and continue the merge or rebase.
|
|
325
|
+
- A new ADR declares what it supersedes, amends, or extends in its own \`## Status\` line, linking the earlier record by file. The index derives the reverse links, so amending an ADR does not require editing it. A superseded ADR's \`## Status\` line is still rewritten to name its successor — that is the one fact a reader of the record alone must not miss.
|
|
326
|
+
- Never delete or rename an ADR once it is referenced; superseded ADRs are historical records other documents link to.
|
|
327
|
+
- The naming and relation mechanics above summarize a contract Launchrail keeps current in the managed workflow instructions (\`.launchrail/CLAUDE.generated.md\`); if this seeded summary ever drifts from that managed contract, the managed contract is what holds.`;
|
|
328
|
+
/**
|
|
329
|
+
* The "Maintaining this registry" section seeded before the dated-identifier ADR —
|
|
330
|
+
* the one that told agents to "take the next free number". Byte-stable from
|
|
331
|
+
* ADR-0031 until that ADR, so `healRegistryMinting` matches it exactly.
|
|
332
|
+
*/
|
|
333
|
+
export const PRE_DATE_SLUG_MAINTAINING_SECTION = `## Maintaining this registry
|
|
334
|
+
|
|
335
|
+
- New ADRs copy [0000-template.md](0000-template.md), take the next free number (\`NNNN-short-slug.md\` — check both this index and the files on disk), and add their row here **in the same commit**. The shared row turns two branches minting the same number into a visible merge conflict instead of a silent collision.
|
|
336
|
+
- When a new ADR supersedes or amends an earlier one — including reversing part of the earlier one's context — update the earlier ADR's \`## Status\` line and its row here in the same commit.
|
|
337
|
+
- Never delete or renumber an ADR once it is referenced; superseded ADRs are historical records other documents link to.`;
|
|
338
|
+
const MAINTAINING_HEADING = "## Maintaining this registry";
|
|
339
|
+
/** Slice a registry into the text before/at/after its "Maintaining this registry" section (to the next `## ` heading or EOF). */
|
|
340
|
+
function maintainingSlice(source) {
|
|
341
|
+
const start = source.indexOf(MAINTAINING_HEADING);
|
|
342
|
+
if (start === -1)
|
|
343
|
+
return null;
|
|
344
|
+
const bodyStart = start + MAINTAINING_HEADING.length;
|
|
345
|
+
const nextRel = source.slice(bodyStart).search(/\n## /);
|
|
346
|
+
const end = nextRel === -1 ? source.length : bodyStart + nextRel;
|
|
347
|
+
return { before: source.slice(0, start), section: source.slice(start, end), after: source.slice(end) };
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Correct a registry's minting guidance in place. Returns `healed` (with the
|
|
351
|
+
* rewritten source) only when the section is exactly the pre-date-slug text
|
|
352
|
+
* Launchrail seeded; `current` when it already matches the canonical section;
|
|
353
|
+
* `modified` when a project has edited it (left untouched — it is theirs);
|
|
354
|
+
* `absent` when there is no such section. The heal migration acts only on
|
|
355
|
+
* `healed`; the others are no-ops, which keeps a re-run empty.
|
|
356
|
+
*/
|
|
357
|
+
export function healRegistryMinting(source) {
|
|
358
|
+
const slice = maintainingSlice(source);
|
|
359
|
+
if (!slice)
|
|
360
|
+
return { state: "absent", next: source };
|
|
361
|
+
const found = slice.section.trim();
|
|
362
|
+
if (found === ADR_MAINTAINING_SECTION.trim())
|
|
363
|
+
return { state: "current", next: source };
|
|
364
|
+
if (found === PRE_DATE_SLUG_MAINTAINING_SECTION.trim()) {
|
|
365
|
+
const tail = slice.after === "" ? "\n" : slice.after;
|
|
366
|
+
return { state: "healed", next: slice.before + ADR_MAINTAINING_SECTION.trim() + tail };
|
|
367
|
+
}
|
|
368
|
+
return { state: "modified", next: source };
|
|
220
369
|
}
|
|
221
370
|
/**
|
|
222
371
|
* The seeded ADR registry. When init/sync adopts a repository that already has
|
|
@@ -248,12 +397,7 @@ How the accepted decisions compose into the current system. This section describ
|
|
|
248
397
|
|
|
249
398
|
${livePicture}
|
|
250
399
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
- New ADRs copy [0000-template.md](0000-template.md) to \`YYYY-MM-DD-short-slug.md\` — the date the decision was made, then a slug unique in this directory. There is no sequence number to claim, so parallel branches never collide.
|
|
254
|
-
- The index table between the markers is **generated**: run \`launchrail adr index\` after adding or re-statusing a record (and after merging), and commit the result. Never hand-edit the rows; the rest of this file is yours.
|
|
255
|
-
- A new ADR declares what it supersedes, amends, or extends in its own \`## Status\` line, linking the earlier record by file. The index derives the reverse links, so amending an ADR does not require editing it. A superseded ADR's \`## Status\` line is still rewritten to name its successor — that is the one fact a reader of the record alone must not miss.
|
|
256
|
-
- Never delete or rename an ADR once it is referenced; superseded ADRs are historical records other documents link to.
|
|
400
|
+
${ADR_MAINTAINING_SECTION}
|
|
257
401
|
`;
|
|
258
402
|
}
|
|
259
403
|
//# sourceMappingURL=adr.js.map
|
package/dist/lib/adr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adr.js","sourceRoot":"","sources":["../../src/lib/adr.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"adr.js","sourceRoot":"","sources":["../../src/lib/adr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The generated ADR index (`docs/adr/README.md`, the rows between the markers)
|
|
3
|
+
* is a pure derived artifact: two branches that each add a record and run
|
|
4
|
+
* `launchrail adr index` insert different rows at the same anchor, which git's
|
|
5
|
+
* line merge cannot order and reports as a textual conflict — even though the
|
|
6
|
+
* records themselves (dated `YYYY-MM-DD-slug.md` names never collide) merge
|
|
7
|
+
* cleanly. The conflict carries no real disagreement, so Launchrail resolves it
|
|
8
|
+
* by regeneration rather than line-merge, via a named git merge driver.
|
|
9
|
+
*
|
|
10
|
+
* A merge driver is named in committed `.gitattributes` but *defined* in
|
|
11
|
+
* per-clone git config, so it takes two installs: this module manages the
|
|
12
|
+
* `.gitattributes` line (committed, additive) and registers the driver in the
|
|
13
|
+
* repo's local git config (per clone, from init / sync / doctor). The driver
|
|
14
|
+
* itself is `launchrail adr merge-driver` (see commands/adr.ts).
|
|
15
|
+
*/
|
|
16
|
+
export declare const ADR_MERGE_DRIVER_NAME = "launchrail-adr-index";
|
|
17
|
+
/** The committed `.gitattributes` file and the single line Launchrail manages in it. */
|
|
18
|
+
export declare const GITATTRIBUTES_FILENAME = ".gitattributes";
|
|
19
|
+
export declare const ADR_MERGE_ATTRIBUTE_LINE = "docs/adr/README.md merge=launchrail-adr-index";
|
|
20
|
+
/** Human-readable driver name git shows in diagnostics. */
|
|
21
|
+
export declare const ADR_MERGE_DRIVER_DESCRIPTION = "Launchrail ADR registry index (regenerated on merge)";
|
|
22
|
+
/**
|
|
23
|
+
* The command git stores in per-clone config and runs to resolve the file. It
|
|
24
|
+
* invokes the same published package that generates the index, so the driver
|
|
25
|
+
* can never drift from the generator's format (a hand-rolled driver in each
|
|
26
|
+
* consumer repo would). `%O %A %B` are the base/ours/theirs temp files and `%P`
|
|
27
|
+
* the path in the work tree; git reads the resolved result back from `%A`. The
|
|
28
|
+
* placeholders are quoted so a temp path with a space cannot split an argument.
|
|
29
|
+
*/
|
|
30
|
+
export declare const ADR_MERGE_DRIVER_COMMAND = "npx --yes @wemuda/launchrail adr merge-driver \"%O\" \"%A\" \"%B\" \"%P\"";
|
|
31
|
+
/**
|
|
32
|
+
* Every ADR record in the merged corpus, file→source. Feed to
|
|
33
|
+
* `entriesFromSources` to regenerate the index exactly as `launchrail adr index`
|
|
34
|
+
* would over the finished merge — the property that keeps `adr index --check`
|
|
35
|
+
* clean on the result.
|
|
36
|
+
*
|
|
37
|
+
* Only the three README temp files are guaranteed complete when git invokes the
|
|
38
|
+
* driver: with merge-ort the incoming side's record files are not on disk yet,
|
|
39
|
+
* nor in the index. So the records are read from git. Preferred path is a real
|
|
40
|
+
* 3-way merged tree, which resolves records the incoming side *modifies* (a new
|
|
41
|
+
* ADR that supersedes and re-statuses an older one) exactly as the finished merge
|
|
42
|
+
* will. The fallback — this side's working tree plus the records only the
|
|
43
|
+
* incoming side adds — covers older git and is correct for the additive case
|
|
44
|
+
* (two branches each add a record).
|
|
45
|
+
*/
|
|
46
|
+
export declare function gatherMergedAdrSources(cwd: string): Map<string, string>;
|
|
47
|
+
export type AttributePlanKind = "create" | "append" | "present";
|
|
48
|
+
export interface AttributePlan {
|
|
49
|
+
kind: AttributePlanKind;
|
|
50
|
+
detail: string;
|
|
51
|
+
/** Full file content to write; null when the line is already present. */
|
|
52
|
+
content: string | null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Plan the `.gitattributes` line additively: create the file with just the line,
|
|
56
|
+
* append the line (on its own newline) to an existing file, or do nothing when
|
|
57
|
+
* the binding is already present. The file is shared and project-owned — never
|
|
58
|
+
* lockfile-tracked, never rewritten wholesale, only this one line added.
|
|
59
|
+
*/
|
|
60
|
+
export declare function planAdrMergeAttribute(cwd: string): AttributePlan;
|
|
61
|
+
/** Execute the `.gitattributes` plan. Returns true when the file was written. */
|
|
62
|
+
export declare function applyAdrMergeAttribute(cwd: string): boolean;
|
|
63
|
+
export type MergeDriverConfigState = "registered" | "mismatch" | "unregistered" | "not-git";
|
|
64
|
+
/** Whether the driver is defined in this clone's local git config. */
|
|
65
|
+
export declare function adrMergeDriverConfigState(cwd: string): MergeDriverConfigState;
|
|
66
|
+
/**
|
|
67
|
+
* Register (or correct) the driver in the repo's local git config. Idempotent,
|
|
68
|
+
* and a no-op outside a git repo. Because the definition is per-clone and never
|
|
69
|
+
* committed, this must run from whatever a fresh clone runs (init / sync /
|
|
70
|
+
* doctor) rather than once behind a lockfile-recorded migration. Returns whether
|
|
71
|
+
* it changed anything.
|
|
72
|
+
*/
|
|
73
|
+
export declare function registerAdrMergeDriver(cwd: string): boolean;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { isAbsolute, join } from "node:path";
|
|
4
|
+
import { ADR_DIR, ADR_REGISTRY_PATH, isAdrRecordFilename } from "./adr.js";
|
|
5
|
+
/**
|
|
6
|
+
* The generated ADR index (`docs/adr/README.md`, the rows between the markers)
|
|
7
|
+
* is a pure derived artifact: two branches that each add a record and run
|
|
8
|
+
* `launchrail adr index` insert different rows at the same anchor, which git's
|
|
9
|
+
* line merge cannot order and reports as a textual conflict — even though the
|
|
10
|
+
* records themselves (dated `YYYY-MM-DD-slug.md` names never collide) merge
|
|
11
|
+
* cleanly. The conflict carries no real disagreement, so Launchrail resolves it
|
|
12
|
+
* by regeneration rather than line-merge, via a named git merge driver.
|
|
13
|
+
*
|
|
14
|
+
* A merge driver is named in committed `.gitattributes` but *defined* in
|
|
15
|
+
* per-clone git config, so it takes two installs: this module manages the
|
|
16
|
+
* `.gitattributes` line (committed, additive) and registers the driver in the
|
|
17
|
+
* repo's local git config (per clone, from init / sync / doctor). The driver
|
|
18
|
+
* itself is `launchrail adr merge-driver` (see commands/adr.ts).
|
|
19
|
+
*/
|
|
20
|
+
export const ADR_MERGE_DRIVER_NAME = "launchrail-adr-index";
|
|
21
|
+
/** The committed `.gitattributes` file and the single line Launchrail manages in it. */
|
|
22
|
+
export const GITATTRIBUTES_FILENAME = ".gitattributes";
|
|
23
|
+
export const ADR_MERGE_ATTRIBUTE_LINE = `${ADR_REGISTRY_PATH} merge=${ADR_MERGE_DRIVER_NAME}`;
|
|
24
|
+
/** Human-readable driver name git shows in diagnostics. */
|
|
25
|
+
export const ADR_MERGE_DRIVER_DESCRIPTION = "Launchrail ADR registry index (regenerated on merge)";
|
|
26
|
+
/**
|
|
27
|
+
* The command git stores in per-clone config and runs to resolve the file. It
|
|
28
|
+
* invokes the same published package that generates the index, so the driver
|
|
29
|
+
* can never drift from the generator's format (a hand-rolled driver in each
|
|
30
|
+
* consumer repo would). `%O %A %B` are the base/ours/theirs temp files and `%P`
|
|
31
|
+
* the path in the work tree; git reads the resolved result back from `%A`. The
|
|
32
|
+
* placeholders are quoted so a temp path with a space cannot split an argument.
|
|
33
|
+
*/
|
|
34
|
+
export const ADR_MERGE_DRIVER_COMMAND = 'npx --yes @wemuda/launchrail adr merge-driver "%O" "%A" "%B" "%P"';
|
|
35
|
+
function git(cwd, args) {
|
|
36
|
+
try {
|
|
37
|
+
return execFileSync("git", args, { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function isGitRepo(cwd) {
|
|
44
|
+
return (git(cwd, ["rev-parse", "--is-inside-work-tree"]) ?? "").trim() === "true";
|
|
45
|
+
}
|
|
46
|
+
function gitDir(cwd) {
|
|
47
|
+
const dir = (git(cwd, ["rev-parse", "--git-dir"]) ?? ".git").trim() || ".git";
|
|
48
|
+
return isAbsolute(dir) ? dir : join(cwd, dir);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The commits carrying the "other side" of the operation git is resolving. Only
|
|
52
|
+
* the three README temp files are guaranteed complete when the driver runs (with
|
|
53
|
+
* merge-ort the incoming side's new record files are not yet on disk, nor in the
|
|
54
|
+
* index), so the driver must read those records straight from git. Covers the
|
|
55
|
+
* standard operations: merge exports `GITHEAD_<sha>` per merged head; cherry-pick
|
|
56
|
+
* / revert / (stopped) rebase write their own head refs; rebase keeps the branch
|
|
57
|
+
* being replayed under `.git/rebase-merge/orig-head` (or `rebase-apply/`).
|
|
58
|
+
*/
|
|
59
|
+
function incomingCommits(cwd) {
|
|
60
|
+
const shas = new Set();
|
|
61
|
+
for (const key of Object.keys(process.env)) {
|
|
62
|
+
const match = /^GITHEAD_([0-9a-f]{7,64})$/.exec(key);
|
|
63
|
+
if (match?.[1])
|
|
64
|
+
shas.add(match[1]);
|
|
65
|
+
}
|
|
66
|
+
for (const ref of ["MERGE_HEAD", "CHERRY_PICK_HEAD", "REVERT_HEAD", "REBASE_HEAD"]) {
|
|
67
|
+
const sha = (git(cwd, ["rev-parse", "--verify", "--quiet", ref]) ?? "").trim();
|
|
68
|
+
if (sha)
|
|
69
|
+
shas.add(sha);
|
|
70
|
+
}
|
|
71
|
+
const dir = gitDir(cwd);
|
|
72
|
+
for (const rel of ["rebase-merge/orig-head", "rebase-apply/original-commit"]) {
|
|
73
|
+
const path = join(dir, rel);
|
|
74
|
+
if (!existsSync(path))
|
|
75
|
+
continue;
|
|
76
|
+
const sha = readFileSync(path, "utf8").trim();
|
|
77
|
+
if (sha)
|
|
78
|
+
shas.add(sha);
|
|
79
|
+
}
|
|
80
|
+
return [...shas];
|
|
81
|
+
}
|
|
82
|
+
/** Read every ADR record blob under docs/adr/ from a tree-ish into `sources`. */
|
|
83
|
+
function recordsFromTree(cwd, treeish, sources, skipExisting) {
|
|
84
|
+
const listing = git(cwd, ["ls-tree", "-r", "-z", treeish, "--", `${ADR_DIR}/`]);
|
|
85
|
+
if (!listing)
|
|
86
|
+
return;
|
|
87
|
+
for (const entry of listing.split("\0")) {
|
|
88
|
+
if (!entry)
|
|
89
|
+
continue;
|
|
90
|
+
const match = /^\d+ blob ([0-9a-f]+)\t(.+)$/.exec(entry);
|
|
91
|
+
if (!match?.[1] || !match[2])
|
|
92
|
+
continue;
|
|
93
|
+
const file = match[2].split("/").pop() ?? "";
|
|
94
|
+
if (!isAdrRecordFilename(file) || (skipExisting && sources.has(file)))
|
|
95
|
+
continue;
|
|
96
|
+
const content = git(cwd, ["cat-file", "blob", match[1]]);
|
|
97
|
+
if (content !== null)
|
|
98
|
+
sources.set(file, content);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The tree of the real 3-way merge of two commit-ish, via `git merge-tree
|
|
103
|
+
* --write-tree` (git >= 2.38). Null on older git (no `--write-tree`), a usage
|
|
104
|
+
* error, or unparsable output. Exit 1 means "merged, with conflicts in some
|
|
105
|
+
* files"; the tree is still written and returned — a genuinely conflicted record
|
|
106
|
+
* would be surfaced by git separately, so the ADR index resolved off it is moot.
|
|
107
|
+
*/
|
|
108
|
+
function mergedTree(cwd, ours, theirs) {
|
|
109
|
+
const result = spawnSync("git", ["merge-tree", "--write-tree", ours, theirs], { cwd, encoding: "utf8" });
|
|
110
|
+
if (result.error || (typeof result.status === "number" && result.status > 1))
|
|
111
|
+
return null;
|
|
112
|
+
const first = (result.stdout ?? "").split("\n")[0]?.trim() ?? "";
|
|
113
|
+
return /^[0-9a-f]{7,64}$/.test(first) ? first : null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Every ADR record in the merged corpus, file→source. Feed to
|
|
117
|
+
* `entriesFromSources` to regenerate the index exactly as `launchrail adr index`
|
|
118
|
+
* would over the finished merge — the property that keeps `adr index --check`
|
|
119
|
+
* clean on the result.
|
|
120
|
+
*
|
|
121
|
+
* Only the three README temp files are guaranteed complete when git invokes the
|
|
122
|
+
* driver: with merge-ort the incoming side's record files are not on disk yet,
|
|
123
|
+
* nor in the index. So the records are read from git. Preferred path is a real
|
|
124
|
+
* 3-way merged tree, which resolves records the incoming side *modifies* (a new
|
|
125
|
+
* ADR that supersedes and re-statuses an older one) exactly as the finished merge
|
|
126
|
+
* will. The fallback — this side's working tree plus the records only the
|
|
127
|
+
* incoming side adds — covers older git and is correct for the additive case
|
|
128
|
+
* (two branches each add a record).
|
|
129
|
+
*/
|
|
130
|
+
export function gatherMergedAdrSources(cwd) {
|
|
131
|
+
const head = (git(cwd, ["rev-parse", "--verify", "--quiet", "HEAD"]) ?? "").trim();
|
|
132
|
+
const incoming = incomingCommits(cwd);
|
|
133
|
+
if (head && incoming.length === 1 && incoming[0]) {
|
|
134
|
+
const tree = mergedTree(cwd, head, incoming[0]);
|
|
135
|
+
if (tree) {
|
|
136
|
+
const merged = new Map();
|
|
137
|
+
recordsFromTree(cwd, tree, merged, false);
|
|
138
|
+
return merged;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const sources = new Map();
|
|
142
|
+
const dir = join(cwd, ADR_DIR);
|
|
143
|
+
if (existsSync(dir)) {
|
|
144
|
+
for (const file of readdirSync(dir)) {
|
|
145
|
+
if (!isAdrRecordFilename(file))
|
|
146
|
+
continue;
|
|
147
|
+
try {
|
|
148
|
+
sources.set(file, readFileSync(join(dir, file), "utf8"));
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
sources.set(file, "");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const commit of incoming)
|
|
156
|
+
recordsFromTree(cwd, commit, sources, true);
|
|
157
|
+
return sources;
|
|
158
|
+
}
|
|
159
|
+
/** Whether `.gitattributes` already binds the registry path to the driver. */
|
|
160
|
+
function hasMergeAttribute(source) {
|
|
161
|
+
return source.split(/\r?\n/).some((line) => {
|
|
162
|
+
const trimmed = line.trim();
|
|
163
|
+
if (trimmed === "" || trimmed.startsWith("#"))
|
|
164
|
+
return false;
|
|
165
|
+
const [pattern, ...attrs] = trimmed.split(/\s+/);
|
|
166
|
+
return pattern === ADR_REGISTRY_PATH && attrs.includes(`merge=${ADR_MERGE_DRIVER_NAME}`);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Plan the `.gitattributes` line additively: create the file with just the line,
|
|
171
|
+
* append the line (on its own newline) to an existing file, or do nothing when
|
|
172
|
+
* the binding is already present. The file is shared and project-owned — never
|
|
173
|
+
* lockfile-tracked, never rewritten wholesale, only this one line added.
|
|
174
|
+
*/
|
|
175
|
+
export function planAdrMergeAttribute(cwd) {
|
|
176
|
+
const path = join(cwd, GITATTRIBUTES_FILENAME);
|
|
177
|
+
if (!existsSync(path)) {
|
|
178
|
+
return { kind: "create", detail: `add \`${ADR_MERGE_ATTRIBUTE_LINE}\``, content: `${ADR_MERGE_ATTRIBUTE_LINE}\n` };
|
|
179
|
+
}
|
|
180
|
+
const current = readFileSync(path, "utf8");
|
|
181
|
+
if (hasMergeAttribute(current)) {
|
|
182
|
+
return { kind: "present", detail: "already binds the ADR index to the merge driver", content: null };
|
|
183
|
+
}
|
|
184
|
+
const separator = current.length === 0 || current.endsWith("\n") ? "" : "\n";
|
|
185
|
+
return {
|
|
186
|
+
kind: "append",
|
|
187
|
+
detail: `append \`${ADR_MERGE_ATTRIBUTE_LINE}\``,
|
|
188
|
+
content: `${current}${separator}${ADR_MERGE_ATTRIBUTE_LINE}\n`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/** Execute the `.gitattributes` plan. Returns true when the file was written. */
|
|
192
|
+
export function applyAdrMergeAttribute(cwd) {
|
|
193
|
+
const plan = planAdrMergeAttribute(cwd);
|
|
194
|
+
if (plan.content === null)
|
|
195
|
+
return false;
|
|
196
|
+
writeFileSync(join(cwd, GITATTRIBUTES_FILENAME), plan.content, "utf8");
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
/** Whether the driver is defined in this clone's local git config. */
|
|
200
|
+
export function adrMergeDriverConfigState(cwd) {
|
|
201
|
+
if (!isGitRepo(cwd))
|
|
202
|
+
return "not-git";
|
|
203
|
+
const current = git(cwd, ["config", "--local", "--get", `merge.${ADR_MERGE_DRIVER_NAME}.driver`]);
|
|
204
|
+
if (current === null)
|
|
205
|
+
return "unregistered";
|
|
206
|
+
return current.trim() === ADR_MERGE_DRIVER_COMMAND ? "registered" : "mismatch";
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Register (or correct) the driver in the repo's local git config. Idempotent,
|
|
210
|
+
* and a no-op outside a git repo. Because the definition is per-clone and never
|
|
211
|
+
* committed, this must run from whatever a fresh clone runs (init / sync /
|
|
212
|
+
* doctor) rather than once behind a lockfile-recorded migration. Returns whether
|
|
213
|
+
* it changed anything.
|
|
214
|
+
*/
|
|
215
|
+
export function registerAdrMergeDriver(cwd) {
|
|
216
|
+
const state = adrMergeDriverConfigState(cwd);
|
|
217
|
+
if (state === "not-git" || state === "registered")
|
|
218
|
+
return false;
|
|
219
|
+
git(cwd, ["config", "--local", `merge.${ADR_MERGE_DRIVER_NAME}.name`, ADR_MERGE_DRIVER_DESCRIPTION]);
|
|
220
|
+
git(cwd, ["config", "--local", `merge.${ADR_MERGE_DRIVER_NAME}.driver`, ADR_MERGE_DRIVER_COMMAND]);
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=adrMergeDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adrMergeDriver.js","sourceRoot":"","sources":["../../src/lib/adrMergeDriver.ts"],"names":[],"mappings":"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"}
|