@wemuda/launchrail 1.15.1 → 1.17.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 +4 -2
- package/assets/agents-docs/domain.md +1 -1
- package/assets/skills/launchrail/launch/SKILL.md +1 -1
- package/assets/skills/launchrail/launch/workflow.md +1 -1
- package/assets/skills/launchrail/launch-browser-smoke/SKILL.md +18 -11
- package/assets/skills/launchrail/launch-browser-smoke/composed-stack.md +46 -0
- package/assets/skills/launchrail/launch-grill/domain-modeling.md +2 -2
- package/assets/skills/launchrail/launch-loop-readiness/SKILL.md +1 -0
- package/dist/commands/add.js +3 -3
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/adr.d.ts +18 -0
- package/dist/commands/adr.js +35 -0
- package/dist/commands/adr.js.map +1 -0
- package/dist/commands/dev.d.ts +35 -0
- package/dist/commands/dev.js +158 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.js +38 -16
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +3 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/verify.js +7 -0
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.js +36 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/adr.d.ts +46 -8
- package/dist/lib/adr.js +209 -37
- package/dist/lib/adr.js.map +1 -1
- package/dist/lib/browser-testing.d.ts +2 -3
- package/dist/lib/browser-testing.js +9 -59
- package/dist/lib/browser-testing.js.map +1 -1
- package/dist/lib/manifest.d.ts +14 -0
- package/dist/lib/manifest.js +29 -1
- package/dist/lib/manifest.js.map +1 -1
- package/dist/lib/seeds.js +7 -6
- package/dist/lib/seeds.js.map +1 -1
- package/dist/lib/stack.d.ts +77 -0
- package/dist/lib/stack.js +210 -0
- package/dist/lib/stack.js.map +1 -0
- package/package.json +1 -1
package/dist/lib/adr.js
CHANGED
|
@@ -3,61 +3,232 @@ import { join } from "node:path";
|
|
|
3
3
|
export const ADR_DIR = "docs/adr";
|
|
4
4
|
export const ADR_TEMPLATE_FILENAME = "0000-template.md";
|
|
5
5
|
export const ADR_REGISTRY_PATH = `${ADR_DIR}/README.md`;
|
|
6
|
-
const
|
|
6
|
+
export const ADR_INDEX_START = "<!-- adr-index:start — generated by `launchrail adr index`; edit the records, not this table -->";
|
|
7
|
+
export const ADR_INDEX_END = "<!-- adr-index:end -->";
|
|
8
|
+
/** Legacy numbered records: `0031-adr-registry.md`. A dated filename is not a numbered one. */
|
|
9
|
+
const NUMBERED_FILENAME = /^(\d{4})-(?!\d{2}-\d{2}-)(.+)\.md$/;
|
|
10
|
+
/** Dated records: `2026-09-11-adr-date-slug-identifiers.md` — the date is when the decision was made. */
|
|
11
|
+
const DATED_FILENAME = /^(\d{4}-\d{2}-\d{2})-([a-z0-9][a-z0-9-]*)\.md$/;
|
|
7
12
|
const TITLE_PREFIX = /^ADR[-\s]?\d+\s*[:—–-]\s*/i;
|
|
8
|
-
function
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
function parseFilename(file) {
|
|
14
|
+
const dated = DATED_FILENAME.exec(file);
|
|
15
|
+
if (dated?.[1] !== undefined && dated[2] !== undefined)
|
|
16
|
+
return { id: dated[2], date: dated[1] };
|
|
17
|
+
const numbered = NUMBERED_FILENAME.exec(file);
|
|
18
|
+
if (numbered?.[1] !== undefined)
|
|
19
|
+
return { id: numbered[1], date: null };
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
function adrTitle(source, file) {
|
|
23
|
+
const heading = /^#\s+(.+)$/m.exec(source)?.[1];
|
|
24
|
+
if (heading)
|
|
25
|
+
return heading.replace(TITLE_PREFIX, "").trim();
|
|
17
26
|
return file.replace(/\.md$/, "");
|
|
18
27
|
}
|
|
28
|
+
/** The first paragraph under `## Status`, whitespace-collapsed onto one line. */
|
|
29
|
+
function adrStatus(source) {
|
|
30
|
+
const match = /^##\s+Status[^\n]*\n([\s\S]*?)(?=^##\s|(?![\s\S]))/m.exec(source);
|
|
31
|
+
if (!match)
|
|
32
|
+
return "";
|
|
33
|
+
const paragraph = (match[1] ?? "").trim().split(/\n\s*\n/)[0] ?? "";
|
|
34
|
+
return paragraph.replace(/\s+/g, " ").trim();
|
|
35
|
+
}
|
|
19
36
|
/**
|
|
20
37
|
* The decision records already in a repository's docs/adr/ (template and
|
|
21
|
-
* registry excluded), sorted by
|
|
38
|
+
* registry excluded), sorted by filename — numbered records first, dated
|
|
39
|
+
* records after them in date order, so the mixed corpus reads as a timeline.
|
|
40
|
+
* Read-only.
|
|
22
41
|
*/
|
|
23
42
|
export function scanAdrs(cwd) {
|
|
24
43
|
const dir = join(cwd, ADR_DIR);
|
|
25
44
|
if (!existsSync(dir))
|
|
26
45
|
return [];
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
46
|
+
const entries = [];
|
|
47
|
+
for (const file of readdirSync(dir).sort()) {
|
|
48
|
+
if (file === ADR_TEMPLATE_FILENAME)
|
|
49
|
+
continue;
|
|
50
|
+
const parsed = parseFilename(file);
|
|
51
|
+
if (!parsed)
|
|
52
|
+
continue;
|
|
53
|
+
let source = "";
|
|
54
|
+
try {
|
|
55
|
+
source = readFileSync(join(dir, file), "utf8");
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Unreadable file — title falls back to the filename, status to empty.
|
|
59
|
+
}
|
|
60
|
+
entries.push({ ...parsed, file, title: adrTitle(source, file), status: adrStatus(source) });
|
|
61
|
+
}
|
|
62
|
+
return entries;
|
|
36
63
|
}
|
|
37
|
-
/**
|
|
38
|
-
export function
|
|
64
|
+
/** Ids (numbers or slugs) claimed by more than one record — every reference by id is ambiguous. */
|
|
65
|
+
export function duplicateAdrIds(entries) {
|
|
39
66
|
const counts = new Map();
|
|
40
67
|
for (const entry of entries)
|
|
41
|
-
counts.set(entry.
|
|
42
|
-
return [...counts.entries()].filter(([, n]) => n > 1).map(([
|
|
68
|
+
counts.set(entry.id, (counts.get(entry.id) ?? 0) + 1);
|
|
69
|
+
return [...counts.entries()].filter(([, n]) => n > 1).map(([id]) => id);
|
|
43
70
|
}
|
|
44
71
|
/** Records whose filename never appears in the registry — rows the index is missing. */
|
|
45
72
|
export function unindexedAdrs(registrySource, entries) {
|
|
46
73
|
return entries.filter((entry) => !registrySource.includes(entry.file));
|
|
47
74
|
}
|
|
75
|
+
const FORWARD = { supersedes: "supersedes", amends: "amends", extends: "extends" };
|
|
76
|
+
const BACKWARD = {
|
|
77
|
+
"superseded by": "supersedes",
|
|
78
|
+
"amended by": "amends",
|
|
79
|
+
"extended by": "extends",
|
|
80
|
+
};
|
|
81
|
+
const RELATION_KEYWORD = /\b(partially\s+superseded\s+by|superseded\s+by|amended\s+by|extended\s+by|supersedes|amends|extends)\b/gi;
|
|
82
|
+
/** A clause ends at the next relation keyword, a semicolon, or a sentence end. */
|
|
83
|
+
const CLAUSE_END = /;|\.\s|\.$/;
|
|
84
|
+
/** Every record the clause names: link targets that are record files, or `ADR-NNNN` mentions. */
|
|
85
|
+
function refsIn(clause, byFile, byNumber) {
|
|
86
|
+
const refs = [];
|
|
87
|
+
const seen = new Set();
|
|
88
|
+
const push = (entry) => {
|
|
89
|
+
if (entry && !seen.has(entry.file)) {
|
|
90
|
+
seen.add(entry.file);
|
|
91
|
+
refs.push(entry);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
for (const match of clause.matchAll(/\]\(([^)\s]+)\)/g))
|
|
95
|
+
push(byFile.get((match[1] ?? "").split("/").pop() ?? ""));
|
|
96
|
+
for (const match of clause.matchAll(/\bADR[-\s]?(\d{4})\b/g))
|
|
97
|
+
push(byNumber.get(match[1] ?? ""));
|
|
98
|
+
return refs;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The relation graph declared across the corpus. A record declares what it
|
|
102
|
+
* `supersedes`/`amends`/`extends` in its own `## Status`; legacy records may also
|
|
103
|
+
* carry the reverse (`amended by …`). Both directions feed one graph, keyed by
|
|
104
|
+
* the earlier record's file, so the index can print back-references that no
|
|
105
|
+
* record had to be edited to carry.
|
|
106
|
+
*/
|
|
107
|
+
export function adrRelations(entries) {
|
|
108
|
+
const byFile = new Map(entries.map((e) => [e.file, e]));
|
|
109
|
+
const byNumber = new Map(entries.filter((e) => e.date === null).map((e) => [e.id, e]));
|
|
110
|
+
const graph = new Map();
|
|
111
|
+
const link = (target, relation, source) => {
|
|
112
|
+
if (target.file === source.file)
|
|
113
|
+
return;
|
|
114
|
+
const slot = graph.get(target.file) ?? { supersedes: [], amends: [], extends: [] };
|
|
115
|
+
if (!slot[relation].some((e) => e.file === source.file))
|
|
116
|
+
slot[relation].push(source);
|
|
117
|
+
graph.set(target.file, slot);
|
|
118
|
+
};
|
|
119
|
+
for (const entry of entries) {
|
|
120
|
+
const keywords = [...entry.status.matchAll(RELATION_KEYWORD)];
|
|
121
|
+
keywords.forEach((match, i) => {
|
|
122
|
+
const start = match.index + match[0].length;
|
|
123
|
+
const rest = entry.status.slice(start, keywords[i + 1]?.index ?? entry.status.length);
|
|
124
|
+
const end = CLAUSE_END.exec(rest);
|
|
125
|
+
const clause = end ? rest.slice(0, end.index) : rest;
|
|
126
|
+
const keyword = (match[1] ?? "").toLowerCase().replace(/\s+/g, " ").replace(/^partially /, "");
|
|
127
|
+
const refs = refsIn(clause, byFile, byNumber);
|
|
128
|
+
const forward = FORWARD[keyword];
|
|
129
|
+
const backward = BACKWARD[keyword];
|
|
130
|
+
if (forward)
|
|
131
|
+
for (const target of refs)
|
|
132
|
+
link(target, forward, entry);
|
|
133
|
+
else if (backward)
|
|
134
|
+
for (const source of refs)
|
|
135
|
+
link(entry, backward, source);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return graph;
|
|
139
|
+
}
|
|
140
|
+
// --- Index ---------------------------------------------------------------------
|
|
141
|
+
/** The leading word of the status line (`Accepted`, `Superseded`, …); Unclassified when there is no status at all. */
|
|
142
|
+
function stateOf(status) {
|
|
143
|
+
const word = /^([A-Za-z]+)/.exec(status)?.[1];
|
|
144
|
+
if (!word)
|
|
145
|
+
return "Unclassified";
|
|
146
|
+
return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
|
|
147
|
+
}
|
|
148
|
+
function idLink(entry) {
|
|
149
|
+
return `[${entry.id}](${entry.file})`;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* One record's status cell: its state, the relations it declares, and the
|
|
153
|
+
* back-references derived from later records. Superseded records also name
|
|
154
|
+
* their successor(s), the one fact a reader must not miss.
|
|
155
|
+
*/
|
|
156
|
+
export function adrStatusCell(entry, entries, graph = adrRelations(entries)) {
|
|
157
|
+
const state = stateOf(entry.status);
|
|
158
|
+
const declared = { supersedes: [], amends: [], extends: [] };
|
|
159
|
+
for (const [file, slot] of graph) {
|
|
160
|
+
for (const relation of ["supersedes", "amends", "extends"]) {
|
|
161
|
+
if (slot[relation].some((e) => e.file === entry.file)) {
|
|
162
|
+
const target = entries.find((e) => e.file === file);
|
|
163
|
+
if (target)
|
|
164
|
+
declared[relation].push(target);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const received = graph.get(entry.file) ?? { supersedes: [], amends: [], extends: [] };
|
|
169
|
+
const list = (records) => records.map(idLink).join(", ");
|
|
170
|
+
const parts = [];
|
|
171
|
+
if (received.supersedes.length > 0 && state === "Superseded")
|
|
172
|
+
parts.push(`**Superseded by ${list(received.supersedes)}**`);
|
|
173
|
+
else if (received.supersedes.length > 0)
|
|
174
|
+
parts.push(`${state} — partially superseded by ${list(received.supersedes)}`);
|
|
175
|
+
else
|
|
176
|
+
parts.push(state);
|
|
177
|
+
if (declared.supersedes.length > 0)
|
|
178
|
+
parts.push(`supersedes ${list(declared.supersedes)}`);
|
|
179
|
+
if (declared.amends.length > 0)
|
|
180
|
+
parts.push(`amends ${list(declared.amends)}`);
|
|
181
|
+
if (declared.extends.length > 0)
|
|
182
|
+
parts.push(`extends ${list(declared.extends)}`);
|
|
183
|
+
if (received.amends.length > 0)
|
|
184
|
+
parts.push(`amended by ${list(received.amends)}`);
|
|
185
|
+
if (received.extends.length > 0)
|
|
186
|
+
parts.push(`extended by ${list(received.extends)}`);
|
|
187
|
+
return parts.join("; ");
|
|
188
|
+
}
|
|
189
|
+
/** The generated index table, markers included. */
|
|
190
|
+
export function adrIndexTable(entries) {
|
|
191
|
+
const graph = adrRelations(entries);
|
|
192
|
+
const header = "| ADR | Decided | Title | Status |\n| --- | --- | --- | --- |";
|
|
193
|
+
const rows = entries.map((e) => `| ${idLink(e)} | ${e.date ?? "—"} | ${e.title.replace(/\|/g, "\\|")} | ${adrStatusCell(e, entries, graph)} |`);
|
|
194
|
+
return [ADR_INDEX_START, header, ...rows, ADR_INDEX_END].join("\n");
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* The registry with its index table regenerated in place. Between the markers
|
|
198
|
+
* when they exist; otherwise the first table under `## Index` is replaced and
|
|
199
|
+
* the markers introduced around it (a registry written before the generator
|
|
200
|
+
* migrates on its first run). Null when the registry has neither.
|
|
201
|
+
*/
|
|
202
|
+
export function withRegeneratedIndex(registrySource, entries) {
|
|
203
|
+
const table = adrIndexTable(entries);
|
|
204
|
+
const start = registrySource.indexOf("<!-- adr-index:start");
|
|
205
|
+
const end = registrySource.indexOf(ADR_INDEX_END);
|
|
206
|
+
if (start !== -1 && end !== -1 && end > start) {
|
|
207
|
+
return registrySource.slice(0, start) + table + registrySource.slice(end + ADR_INDEX_END.length);
|
|
208
|
+
}
|
|
209
|
+
const heading = /^##\s+Index\s*$/m.exec(registrySource);
|
|
210
|
+
if (!heading)
|
|
211
|
+
return null;
|
|
212
|
+
const afterHeading = heading.index + heading[0].length;
|
|
213
|
+
const rest = registrySource.slice(afterHeading);
|
|
214
|
+
const tableMatch = /\n(\|[^\n]*\n)+/.exec(rest);
|
|
215
|
+
if (!tableMatch)
|
|
216
|
+
return null;
|
|
217
|
+
const before = registrySource.slice(0, afterHeading + tableMatch.index);
|
|
218
|
+
const after = rest.slice(tableMatch.index + tableMatch[0].length);
|
|
219
|
+
return `${before}\n${table}\n${after}`;
|
|
220
|
+
}
|
|
48
221
|
/**
|
|
49
222
|
* The seeded ADR registry. When init/sync adopts a repository that already has
|
|
50
|
-
* decision records, the index prefills from them
|
|
51
|
-
*
|
|
52
|
-
*
|
|
223
|
+
* decision records, the index prefills from them; a fresh repository gets the
|
|
224
|
+
* empty index. Seeded once, then project-owned — but the table between the
|
|
225
|
+
* markers is regenerated by `launchrail adr index`, so the project maintains
|
|
226
|
+
* the records and the live picture, never the rows.
|
|
53
227
|
*/
|
|
54
228
|
export function adrRegistryContent(entries) {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const unclassifiedNote = entries.length === 0
|
|
59
|
-
? ""
|
|
60
|
-
: "\n\nRows marked **Unclassified** existed before this registry was seeded. Classify each as you next touch its area: set the record's status (`Accepted`, `Accepted — amended by ADR-NNNN`, `Superseded by ADR-NNNN`) and mirror it here.";
|
|
229
|
+
const unclassifiedNote = entries.some((e) => e.status === "")
|
|
230
|
+
? "\n\nRows marked **Unclassified** carry no `## Status` section yet. Classify each as you next touch its area: give the record a status line (`Accepted`, `Superseded by [id](file)`, …) and re-run `launchrail adr index`."
|
|
231
|
+
: "";
|
|
61
232
|
const livePicture = entries.length === 0
|
|
62
233
|
? "_No decisions recorded yet. When ADRs land, summarize here how they compose into the current system, and name the few a newcomer should read first._"
|
|
63
234
|
: "_Not yet written. Summarize how the accepted decisions compose into the current system, and name the few ADRs a newcomer should read first._";
|
|
@@ -69,7 +240,7 @@ An ADR records a decision and the context it was made in. It is **not documentat
|
|
|
69
240
|
|
|
70
241
|
## Index
|
|
71
242
|
|
|
72
|
-
${
|
|
243
|
+
${adrIndexTable(entries)}${unclassifiedNote}
|
|
73
244
|
|
|
74
245
|
## The live picture
|
|
75
246
|
|
|
@@ -79,9 +250,10 @@ ${livePicture}
|
|
|
79
250
|
|
|
80
251
|
## Maintaining this registry
|
|
81
252
|
|
|
82
|
-
- New ADRs copy [0000-template.md](0000-template.md)
|
|
83
|
-
-
|
|
84
|
-
-
|
|
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.
|
|
85
257
|
`;
|
|
86
258
|
}
|
|
87
259
|
//# 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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"}
|
|
@@ -9,8 +9,6 @@ export declare const SEMANTIC_SCRIPTS: readonly ["setup", "dev", "verify", "doct
|
|
|
9
9
|
* inside a subagent — and `--session` keeps parallel builders apart.
|
|
10
10
|
*/
|
|
11
11
|
export declare const BROWSER_DRIVER_PACKAGE = "agent-browser";
|
|
12
|
-
/** Where `scripts/dev.mjs` records the URL and pid of the app it started. */
|
|
13
|
-
export declare const DEV_STATE_DIR = ".launchrail/state";
|
|
14
12
|
/**
|
|
15
13
|
* Paths the module seeded before ADR-0034 — the journey catalogue, the
|
|
16
14
|
* `smoke` entry point and the Playwright MCP config. The retirement migration
|
|
@@ -28,6 +26,7 @@ export interface BrowserTestingContext {
|
|
|
28
26
|
*
|
|
29
27
|
* Two lanes (ADR-0034): the deterministic e2e baseline runs inside `verify`;
|
|
30
28
|
* the browser smoke is one-off driving by the agent and seeds no file of its
|
|
31
|
-
* own — its driver installs through `scripts/setup.mjs
|
|
29
|
+
* own — its driver installs through `scripts/setup.mjs`, and the stack it
|
|
30
|
+
* drives starts through `launchrail dev` (ADR-0036).
|
|
32
31
|
*/
|
|
33
32
|
export declare function browserTestingFiles(ctx: BrowserTestingContext): FileSpec[];
|
|
@@ -6,8 +6,6 @@ export const SEMANTIC_SCRIPTS = ["setup", "dev", "verify", "doctor"];
|
|
|
6
6
|
* inside a subagent — and `--session` keeps parallel builders apart.
|
|
7
7
|
*/
|
|
8
8
|
export const BROWSER_DRIVER_PACKAGE = "agent-browser";
|
|
9
|
-
/** Where `scripts/dev.mjs` records the URL and pid of the app it started. */
|
|
10
|
-
export const DEV_STATE_DIR = ".launchrail/state";
|
|
11
9
|
/**
|
|
12
10
|
* Paths the module seeded before ADR-0034 — the journey catalogue, the
|
|
13
11
|
* `smoke` entry point and the Playwright MCP config. The retirement migration
|
|
@@ -94,62 +92,15 @@ if (!existsSync("node_modules/@playwright/test")) {
|
|
|
94
92
|
}
|
|
95
93
|
// Cloud and CI machines need browser OS dependencies; local machines usually have them.
|
|
96
94
|
run(cloud ? "npx playwright install --with-deps chromium" : "npx playwright install chromium");
|
|
97
|
-
// The browser smoke's driver
|
|
95
|
+
// The browser smoke's driver (a shell-driven browser for agents). It reuses Playwright's
|
|
96
|
+
// Chromium via .launchrail/state/browser.env, written by \`launchrail dev\` — no second download.
|
|
97
|
+
// Where no Playwright Chromium exists, \`npx ${BROWSER_DRIVER_PACKAGE} install\` fetches its own.
|
|
98
98
|
if (!existsSync("node_modules/${BROWSER_DRIVER_PACKAGE}")) {
|
|
99
99
|
run("${addDev(BROWSER_DRIVER_PACKAGE)}");
|
|
100
100
|
}
|
|
101
|
-
run("npx ${BROWSER_DRIVER_PACKAGE} install");
|
|
102
101
|
console.log("\\nSetup complete. Next: node scripts/doctor.mjs");
|
|
103
102
|
`;
|
|
104
103
|
}
|
|
105
|
-
function devScript(devCommand, appUrl) {
|
|
106
|
-
return `#!/usr/bin/env node
|
|
107
|
-
// Seeded by Launchrail — yours to adapt. Starts the app for development and testing.
|
|
108
|
-
import { spawn, spawnSync } from "node:child_process";
|
|
109
|
-
import { existsSync, mkdirSync, openSync, writeFileSync } from "node:fs";
|
|
110
|
-
|
|
111
|
-
const DEV_COMMAND = ${JSON.stringify(devCommand ?? "")};
|
|
112
|
-
const APP_URL = ${JSON.stringify(appUrl ?? DEFAULT_APP_URL)};
|
|
113
|
-
const STATE_DIR = ${JSON.stringify(DEV_STATE_DIR)};
|
|
114
|
-
|
|
115
|
-
if (DEV_COMMAND === "") {
|
|
116
|
-
console.error("No dev command configured. Edit scripts/dev.mjs and set DEV_COMMAND to whatever starts this app.");
|
|
117
|
-
process.exit(1);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Parallel builders each start their own app: \`--port <n>\` picks a port nobody
|
|
121
|
-
// else uses. The dev command sees it as PORT — adapt this file if your app reads
|
|
122
|
-
// another name or flag.
|
|
123
|
-
const args = process.argv.slice(2);
|
|
124
|
-
const portFlag = args.indexOf("--port");
|
|
125
|
-
const port = portFlag !== -1 ? args[portFlag + 1] : process.env.PORT;
|
|
126
|
-
const url = new URL(APP_URL);
|
|
127
|
-
if (port) url.port = String(port);
|
|
128
|
-
const appUrl = url.href.replace(/\\/$/, "");
|
|
129
|
-
const env = port ? { ...process.env, PORT: String(port) } : process.env;
|
|
130
|
-
|
|
131
|
-
// Agents read the URL (and the pid, in background mode) from here; the state
|
|
132
|
-
// directory ignores itself so nothing in it reaches git.
|
|
133
|
-
mkdirSync(STATE_DIR, { recursive: true });
|
|
134
|
-
if (!existsSync(STATE_DIR + "/.gitignore")) writeFileSync(STATE_DIR + "/.gitignore", "*\\n");
|
|
135
|
-
writeFileSync(STATE_DIR + "/dev.url", appUrl + "\\n");
|
|
136
|
-
|
|
137
|
-
if (args.includes("--background")) {
|
|
138
|
-
// Cloud and CI sessions need the app running without holding the terminal.
|
|
139
|
-
const log = openSync(STATE_DIR + "/dev.log", "a");
|
|
140
|
-
const child = spawn(DEV_COMMAND, { shell: true, detached: true, stdio: ["ignore", log, log], env });
|
|
141
|
-
child.unref();
|
|
142
|
-
writeFileSync(STATE_DIR + "/dev.pid", String(child.pid) + "\\n");
|
|
143
|
-
console.log(
|
|
144
|
-
"Started \`" + DEV_COMMAND + "\` in the background (pid " + child.pid + ") for " + appUrl +
|
|
145
|
-
". Logs: " + STATE_DIR + "/dev.log — stop it with \`kill $(cat " + STATE_DIR + "/dev.pid)\`.",
|
|
146
|
-
);
|
|
147
|
-
} else {
|
|
148
|
-
const result = spawnSync(DEV_COMMAND, { shell: true, stdio: "inherit", env });
|
|
149
|
-
process.exit(result.status ?? 0);
|
|
150
|
-
}
|
|
151
|
-
`;
|
|
152
|
-
}
|
|
153
104
|
/** Stable semantic entry point that delegates to the Launchrail CLI. */
|
|
154
105
|
function delegatingScript(subcommand) {
|
|
155
106
|
return `#!/usr/bin/env node
|
|
@@ -171,7 +122,8 @@ process.exit(result.status ?? 1);
|
|
|
171
122
|
*
|
|
172
123
|
* Two lanes (ADR-0034): the deterministic e2e baseline runs inside `verify`;
|
|
173
124
|
* the browser smoke is one-off driving by the agent and seeds no file of its
|
|
174
|
-
* own — its driver installs through `scripts/setup.mjs
|
|
125
|
+
* own — its driver installs through `scripts/setup.mjs`, and the stack it
|
|
126
|
+
* drives starts through `launchrail dev` (ADR-0036).
|
|
175
127
|
*/
|
|
176
128
|
export function browserTestingFiles(ctx) {
|
|
177
129
|
const pm = ctx.detection.packageManager ?? "npm";
|
|
@@ -179,12 +131,10 @@ export function browserTestingFiles(ctx) {
|
|
|
179
131
|
if (!ctx.detection.playwrightConfigFile) {
|
|
180
132
|
specs.push({ relPath: "playwright.config.ts", content: playwrightConfig(ctx.manifest), ownership: "seeded" }, { relPath: "tests/e2e/baseline.spec.ts", content: baselineSpec(), ownership: "seeded" });
|
|
181
133
|
}
|
|
182
|
-
specs.push({ relPath: "scripts/setup.mjs", content: setupScript(pm), ownership: "seeded", executable: true },
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
executable: true,
|
|
187
|
-
}, { relPath: "scripts/verify.mjs", content: delegatingScript("verify"), ownership: "seeded", executable: true }, { relPath: "scripts/doctor.mjs", content: delegatingScript("doctor"), ownership: "seeded", executable: true });
|
|
134
|
+
specs.push({ relPath: "scripts/setup.mjs", content: setupScript(pm), ownership: "seeded", executable: true },
|
|
135
|
+
// dev delegates too (ADR-0036): the CLI owns the start contract — state files,
|
|
136
|
+
// --port, readiness, the driver's browser — so an adapted copy cannot drift from it.
|
|
137
|
+
{ relPath: "scripts/dev.mjs", content: delegatingScript("dev"), ownership: "seeded", executable: true }, { relPath: "scripts/verify.mjs", content: delegatingScript("verify"), ownership: "seeded", executable: true }, { relPath: "scripts/doctor.mjs", content: delegatingScript("doctor"), ownership: "seeded", executable: true });
|
|
188
138
|
return specs;
|
|
189
139
|
}
|
|
190
140
|
//# sourceMappingURL=browser-testing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-testing.js","sourceRoot":"","sources":["../../src/lib/browser-testing.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAe,CAAC;AAEtD
|
|
1
|
+
{"version":3,"file":"browser-testing.js","sourceRoot":"","sources":["../../src/lib/browser-testing.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/manifest.d.ts
CHANGED
|
@@ -16,6 +16,19 @@ export type IssueTracker = (typeof ISSUE_TRACKERS)[number];
|
|
|
16
16
|
*/
|
|
17
17
|
export declare const TESTING_KEYS: readonly ["unitCommand", "checkCommand", "devCommand", "e2eCommand", "appUrl"];
|
|
18
18
|
export type TestingKey = (typeof TESTING_KEYS)[number];
|
|
19
|
+
/**
|
|
20
|
+
* How the smokeable stack starts (ADR-0036). Single-process apps need nothing
|
|
21
|
+
* here: `launchrail dev` runs `testing.devCommand` and checks `testing.appUrl`.
|
|
22
|
+
* A composed stack — several origins, an in-process backend, fixtures — names
|
|
23
|
+
* its own start command and the origins it must answer on.
|
|
24
|
+
*/
|
|
25
|
+
export interface SmokeConfig {
|
|
26
|
+
/** Boots the smokeable stack; may merge extra fields into .launchrail/state/stack.json. Falls back to testing.devCommand. */
|
|
27
|
+
start: string | null;
|
|
28
|
+
/** name → URL; every one must answer HTTP before the stack counts as ready. Empty means the single `app` origin at testing.appUrl. */
|
|
29
|
+
origins: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
export declare const DEFAULT_SMOKE: SmokeConfig;
|
|
19
32
|
export interface Manifest {
|
|
20
33
|
schemaVersion: 1;
|
|
21
34
|
origin: Origin;
|
|
@@ -24,6 +37,7 @@ export interface Manifest {
|
|
|
24
37
|
conventionalCommits: boolean;
|
|
25
38
|
};
|
|
26
39
|
testing: Record<TestingKey, string | null>;
|
|
40
|
+
smoke: SmokeConfig;
|
|
27
41
|
modules: Record<string, boolean>;
|
|
28
42
|
}
|
|
29
43
|
export interface ManifestParseResult {
|
package/dist/lib/manifest.js
CHANGED
|
@@ -14,6 +14,7 @@ export const ISSUE_TRACKERS = ["github", "gitlab", "linear", "local", "none"];
|
|
|
14
14
|
* browser-testing module, `e2eCommand`.
|
|
15
15
|
*/
|
|
16
16
|
export const TESTING_KEYS = ["unitCommand", "checkCommand", "devCommand", "e2eCommand", "appUrl"];
|
|
17
|
+
export const DEFAULT_SMOKE = { start: null, origins: {} };
|
|
17
18
|
function isRecord(value) {
|
|
18
19
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
19
20
|
}
|
|
@@ -81,6 +82,28 @@ export function validateManifest(data) {
|
|
|
81
82
|
errors.push("testing must be a mapping");
|
|
82
83
|
}
|
|
83
84
|
}
|
|
85
|
+
const smoke = { start: null, origins: {} };
|
|
86
|
+
if (data.smoke !== undefined) {
|
|
87
|
+
if (isRecord(data.smoke)) {
|
|
88
|
+
if (data.smoke.start !== undefined && data.smoke.start !== null) {
|
|
89
|
+
if (typeof data.smoke.start === "string")
|
|
90
|
+
smoke.start = data.smoke.start;
|
|
91
|
+
else
|
|
92
|
+
errors.push("smoke.start must be a string or null");
|
|
93
|
+
}
|
|
94
|
+
if (data.smoke.origins !== undefined && data.smoke.origins !== null) {
|
|
95
|
+
if (isRecord(data.smoke.origins) && Object.values(data.smoke.origins).every((v) => typeof v === "string")) {
|
|
96
|
+
smoke.origins = { ...data.smoke.origins };
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
errors.push("smoke.origins must map origin names to URLs");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
errors.push("smoke must be a mapping");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
84
107
|
let modules = { core: true };
|
|
85
108
|
if (data.modules !== undefined) {
|
|
86
109
|
if (isRecord(data.modules) && Object.values(data.modules).every((v) => typeof v === "boolean")) {
|
|
@@ -104,6 +127,7 @@ export function validateManifest(data) {
|
|
|
104
127
|
issueTracker,
|
|
105
128
|
conventions: { conventionalCommits },
|
|
106
129
|
testing,
|
|
130
|
+
smoke,
|
|
107
131
|
modules,
|
|
108
132
|
},
|
|
109
133
|
errors: [],
|
|
@@ -122,7 +146,11 @@ export function parseManifest(source) {
|
|
|
122
146
|
export function serializeManifest(manifest) {
|
|
123
147
|
const header = "# Launchrail project manifest — https://github.com/wemuda/launchrail\n" +
|
|
124
148
|
"# This file is yours to edit; Launchrail reads it and never force-overwrites it.\n";
|
|
125
|
-
|
|
149
|
+
// The smoke block is opt-in for composed stacks; a default one is noise in
|
|
150
|
+
// every single-process project's manifest, so it is written only when set.
|
|
151
|
+
const { smoke, ...rest } = manifest;
|
|
152
|
+
const body = smoke.start === null && Object.keys(smoke.origins).length === 0 ? rest : { ...rest, smoke };
|
|
153
|
+
return header + stringify(body);
|
|
126
154
|
}
|
|
127
155
|
/**
|
|
128
156
|
* Remove a retired top-level key from an existing manifest source. Like
|
package/dist/lib/manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/lib/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAEnD;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,UAAU,CAAU,CAAC;AAGpD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAGvF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/lib/manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/seeds.js
CHANGED
|
@@ -40,7 +40,7 @@ ${commitSection}
|
|
|
40
40
|
- Ask, don't guess. On product decisions, data-model or schema changes, security-relevant behaviour, or anything genuinely ambiguous, stop and ask rather than guessing — a wrong guess on these costs more than the question.
|
|
41
41
|
- Do not silently change scope; surface deviations from the spec or ADRs.
|
|
42
42
|
- If implementation invalidates an artifact (vision, spec, ADR, design note), update that artifact in the same change.
|
|
43
|
-
- Decisions that are hard to reverse, surprising without context, and the result of a real trade-off become lightweight ADRs in \`docs/adr/\` using [docs/adr/0000-template.md](docs/adr/0000-template.md),
|
|
43
|
+
- Decisions that are hard to reverse, surprising without context, and the result of a real trade-off become lightweight ADRs in \`docs/adr/\` using [docs/adr/0000-template.md](docs/adr/0000-template.md), named \`YYYY-MM-DD-short-slug.md\` (the decision date, then a slug unique in the directory — no sequence number to claim), with the registry index regenerated (\`launchrail adr index\`) in the same commit. Prefer amending the ADR that owns an area over minting a sibling; product decisions belong in the spec, not an ADR.
|
|
44
44
|
|
|
45
45
|
## Definition of done
|
|
46
46
|
|
|
@@ -66,8 +66,9 @@ function claudeGeneratedMd(ctx) {
|
|
|
66
66
|
## Browser testing
|
|
67
67
|
|
|
68
68
|
- Two lanes (ADR-0034). **e2e** is deterministic and thin: \`npx @wemuda/launchrail verify\` runs the unit command and the Playwright specs under \`tests/e2e/\`; a spec is added for a standing golden path or a behavior only a real browser can exercise, never as the by-product of a smoke. **Browser smoke** is one-off: after building user-facing behavior, drive the running app in a real browser per the \`launch-browser-smoke\` skill to see the change working, report what you saw, and move on — no journeys file, no evidence bundle, no test written from it.
|
|
69
|
-
-
|
|
70
|
-
- The smoke's driver is \`agent-browser\` (installed by \`node scripts/setup.mjs\`), driven from the shell — \`open\`, \`snapshot -i\`, \`click @ref\`, \`fill\`, \`wait\`, \`screenshot\`, \`errors\`, \`console\`, \`network requests\` — one \`--session\` per ticket.
|
|
69
|
+
- In a hosted session (a fresh clone) run \`node scripts/setup.mjs\` first, unconditionally. Then start the stack with \`npx @wemuda/launchrail dev --background\` (\`--port <n>\` when other builders share the machine): it runs \`smoke.start\` from \`.launchrail.yml\`, else \`testing.devCommand\`, waits until every origin answers, and writes \`.launchrail/state/stack.json\` (origins, pid, log — plus whatever a composed start command adds: keys, fixtures, a mailbox) and \`browser.env\`. Stop it with \`launchrail dev --stop\`; prove the contract with \`launchrail dev --check\`.
|
|
70
|
+
- The smoke's driver is \`agent-browser\` (installed by \`node scripts/setup.mjs\`), driven from the shell — \`open\`, \`snapshot -i\`, \`click @ref\`, \`fill\`, \`wait\`, \`screenshot\`, \`errors\`, \`console\`, \`network requests\` — one \`--session\` per ticket. Source \`.launchrail/state/browser.env\` first so it reuses Playwright's Chromium.
|
|
71
|
+
- A stack that \`dev\` cannot start from the manifest is a blocker for the smoke, not something to rebuild by hand inside a ticket: the fix is a \`smoke.start\` command (see the skill's \`composed-stack.md\`).
|
|
71
72
|
- A bug the smoke finds gets its regression test at the cheapest seam that catches it — unit or integration first; a Playwright spec only when the ticket asks for one.
|
|
72
73
|
`
|
|
73
74
|
: "";
|
|
@@ -99,12 +100,12 @@ function claudeGeneratedMd(ctx) {
|
|
|
99
100
|
${browserTesting}${ralph}`;
|
|
100
101
|
}
|
|
101
102
|
function adrTemplate() {
|
|
102
|
-
return `#
|
|
103
|
+
return `# Short decision title
|
|
103
104
|
|
|
104
105
|
## Status
|
|
105
|
-
Proposed | Accepted |
|
|
106
|
+
Proposed | Accepted | Superseded by [slug](YYYY-MM-DD-slug.md)
|
|
106
107
|
|
|
107
|
-
|
|
108
|
+
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.
|
|
108
109
|
|
|
109
110
|
## Context
|
|
110
111
|
What requirement or constraint requires a decision?
|
package/dist/lib/seeds.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../src/lib/seeds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAWtD,SAAS,QAAQ,CAAC,GAAgB;IAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW;QAC3C,CAAC,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO;QACtD,CAAC,CAAC,GAAG,oBAAoB,0BAA0B,CAAC;IAEtD,4EAA4E;IAC5E,8DAA8D;IAC9D,MAAM,WAAW,GACf,QAAQ,CAAC,YAAY,KAAK,OAAO,IAAI,QAAQ,CAAC,YAAY,KAAK,MAAM;QACnE,CAAC,CAAC,sDAAsD;QACxD,CAAC,CAAC,4IAA4I,CAAC;IAEnJ,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,mBAAmB;QAC5D,CAAC,CAAC;;;;CAIL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,gCAAgC,GAAG,CAAC,WAAW;;;;;;;;;;;;KAYnD,WAAW;;;;EAId,QAAQ;EACR,aAAa;;;;;;;;;;;6BAWc,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE;;;;CAIxG,CAAC;AACF,CAAC;AAED,SAAS,QAAQ;IACf,OAAO;;;;;;CAMR,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAgB;IACzC,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5D,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../src/lib/seeds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAWtD,SAAS,QAAQ,CAAC,GAAgB;IAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;IACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW;QAC3C,CAAC,CAAC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO;QACtD,CAAC,CAAC,GAAG,oBAAoB,0BAA0B,CAAC;IAEtD,4EAA4E;IAC5E,8DAA8D;IAC9D,MAAM,WAAW,GACf,QAAQ,CAAC,YAAY,KAAK,OAAO,IAAI,QAAQ,CAAC,YAAY,KAAK,MAAM;QACnE,CAAC,CAAC,sDAAsD;QACxD,CAAC,CAAC,4IAA4I,CAAC;IAEnJ,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,mBAAmB;QAC5D,CAAC,CAAC;;;;CAIL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,gCAAgC,GAAG,CAAC,WAAW;;;;;;;;;;;;KAYnD,WAAW;;;;EAId,QAAQ;EACR,aAAa;;;;;;;;;;;6BAWc,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,EAAE;;;;CAIxG,CAAC;AACF,CAAC;AAED,SAAS,QAAQ;IACf,OAAO;;;;;;CAMR,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAgB;IACzC,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC5D,CAAC,CAAC;;;;;;;;CAQL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK;QACtC,CAAC,CAAC;;;;;;;;;;;CAWL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,+BAA+B,GAAG,CAAC,iBAAiB;;;;;;;;;;;EAW3D,cAAc,GAAG,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;;;;;;;;;;;;;;;;;;;;;CAqBR,CAAC;AACF,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IAClD,OAAO,EAAE,OAAO,EAAE,iCAAiC,EAAE,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC/G,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,GAAgB;IACxC,OAAO;QACL,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;QACrE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;QAClE,EAAE,OAAO,EAAE,2BAA2B,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;QACrF,6EAA6E;QAC7E,8EAA8E;QAC9E,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;QACnG,mBAAmB,CAAC,GAAG,CAAC;KACzB,CAAC;AACJ,CAAC"}
|