@wemuda/launchrail 1.15.1 → 1.16.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 +2 -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-loop-readiness/SKILL.md +1 -0
- package/dist/commands/add.js +3 -3
- package/dist/commands/add.js.map +1 -1
- 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 +20 -3
- 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 +23 -0
- package/dist/index.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 +3 -2
- 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/commands/verify.js
CHANGED
|
@@ -3,6 +3,7 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { BROWSER_TESTING_MODULE } from "../lib/browser-testing.js";
|
|
5
5
|
import { MANIFEST_FILENAME, parseManifest } from "../lib/manifest.js";
|
|
6
|
+
import { INSTALL_HINT, missingDependencies } from "../lib/stack.js";
|
|
6
7
|
/**
|
|
7
8
|
* Run the project's deterministic verification contract: every configured
|
|
8
9
|
* check, in order, with a pass/fail summary. The browser smoke is separate — a
|
|
@@ -23,6 +24,12 @@ export function runVerify(cwd, options = {}) {
|
|
|
23
24
|
console.error(` - ${error}`);
|
|
24
25
|
return { code: 1, results: [] };
|
|
25
26
|
}
|
|
27
|
+
// A fresh clone (every hosted session) has no node_modules: the failure to
|
|
28
|
+
// name is the missing install, not "turbo: not found" from the first step.
|
|
29
|
+
if (missingDependencies(cwd)) {
|
|
30
|
+
console.error(`launchrail: dependencies are not installed (no node_modules) — ${INSTALL_HINT}.`);
|
|
31
|
+
return { code: 1, results: [] };
|
|
32
|
+
}
|
|
26
33
|
const { testing, modules } = parsed.manifest;
|
|
27
34
|
const steps = [];
|
|
28
35
|
if (options.fast) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { AVAILABLE_MODULES, runAdd } from "./commands/add.js";
|
|
3
3
|
import { printDiff, runDiff } from "./commands/diff.js";
|
|
4
|
+
import { runDev } from "./commands/dev.js";
|
|
4
5
|
import { runDoctor, printDoctor } from "./commands/doctor.js";
|
|
5
6
|
import { runEject } from "./commands/eject.js";
|
|
6
7
|
import { runInit } from "./commands/init.js";
|
|
@@ -17,6 +18,7 @@ Commands:
|
|
|
17
18
|
doctor Validate the repository and environment
|
|
18
19
|
add Add a module to the project (available: ${AVAILABLE_MODULES.join(", ")})
|
|
19
20
|
verify Run the deterministic verification contract
|
|
21
|
+
dev Start the smokeable stack from the manifest and record its state
|
|
20
22
|
status Inspect versions, enabled modules, drift, and missing requirements
|
|
21
23
|
diff Preview upstream changes
|
|
22
24
|
sync Synchronize managed capabilities and run migrations
|
|
@@ -34,6 +36,13 @@ init / add options:
|
|
|
34
36
|
verify options:
|
|
35
37
|
--fast Run only the fast gate (testing.checkCommand, else unitCommand; never e2e)
|
|
36
38
|
|
|
39
|
+
dev options:
|
|
40
|
+
--background Start detached, wait for every origin to answer, leave it running
|
|
41
|
+
--port <n> Re-address the app origin and expose PORT to the start command
|
|
42
|
+
--stop Stop the background stack recorded in .launchrail/state/dev.pid
|
|
43
|
+
--check Start, wait, assert the state files, tear down — proves the start contract
|
|
44
|
+
--timeout <s> Readiness deadline for --background/--check (default 120)
|
|
45
|
+
|
|
37
46
|
sync options:
|
|
38
47
|
--dry-run Preview migrations and file updates without writing
|
|
39
48
|
|
|
@@ -82,6 +91,20 @@ if (command === "add") {
|
|
|
82
91
|
if (command === "verify") {
|
|
83
92
|
process.exit(runVerify(process.cwd(), { fast: flags.has("--fast") }).code);
|
|
84
93
|
}
|
|
94
|
+
if (command === "dev") {
|
|
95
|
+
const portIndex = args.indexOf("--port");
|
|
96
|
+
const timeoutIndex = args.indexOf("--timeout");
|
|
97
|
+
const timeoutSeconds = timeoutIndex !== -1 ? Number(args[timeoutIndex + 1]) : NaN;
|
|
98
|
+
const outcome = await runDev({
|
|
99
|
+
cwd: process.cwd(),
|
|
100
|
+
background: flags.has("--background"),
|
|
101
|
+
port: portIndex !== -1 ? (args[portIndex + 1] ?? null) : null,
|
|
102
|
+
stop: flags.has("--stop"),
|
|
103
|
+
check: flags.has("--check"),
|
|
104
|
+
timeoutMs: Number.isFinite(timeoutSeconds) ? timeoutSeconds * 1000 : undefined,
|
|
105
|
+
});
|
|
106
|
+
process.exit(outcome.code);
|
|
107
|
+
}
|
|
85
108
|
if (command === "status") {
|
|
86
109
|
const report = runStatus(process.cwd());
|
|
87
110
|
printStatus(report);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,IAAI,GAAG,cAAc,OAAO;;;;;;;sDAOoB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.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
|
@@ -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
|
: "";
|
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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Manifest } from "./manifest.js";
|
|
2
|
+
/**
|
|
3
|
+
* The smokeable stack's state (ADR-0036): where `launchrail dev` records what
|
|
4
|
+
* it started, and where the browser smoke reads it back. The directory ignores
|
|
5
|
+
* itself in git, so nothing here — URLs, pids, logs, a throwaway driver script —
|
|
6
|
+
* ever shows up as an untracked file.
|
|
7
|
+
*/
|
|
8
|
+
export declare const STATE_DIR = ".launchrail/state";
|
|
9
|
+
export declare const STACK_STATE_FILE = ".launchrail/state/stack.json";
|
|
10
|
+
export declare const DEV_URL_FILE = ".launchrail/state/dev.url";
|
|
11
|
+
export declare const DEV_PID_FILE = ".launchrail/state/dev.pid";
|
|
12
|
+
export declare const DEV_LOG_FILE = ".launchrail/state/dev.log";
|
|
13
|
+
export declare const BROWSER_ENV_FILE = ".launchrail/state/browser.env";
|
|
14
|
+
export declare const DEFAULT_APP_URL = "http://localhost:3000";
|
|
15
|
+
export declare function ensureStateDir(cwd: string): void;
|
|
16
|
+
/** True when the state directory exists but does not ignore itself (written by an older seed). */
|
|
17
|
+
export declare function stateDirUnignored(cwd: string): boolean;
|
|
18
|
+
export interface StackStart {
|
|
19
|
+
/** The command that boots the stack — smoke.start, else testing.devCommand; null when neither is set. */
|
|
20
|
+
command: string | null;
|
|
21
|
+
/** Where the command came from, for messages. */
|
|
22
|
+
source: "smoke.start" | "testing.devCommand" | null;
|
|
23
|
+
/** name → URL. Declared for a composed stack; the single `app` at testing.appUrl otherwise. */
|
|
24
|
+
origins: Record<string, string>;
|
|
25
|
+
/** Origins were declared in the manifest (a composed stack) rather than derived. */
|
|
26
|
+
composed: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** Resolve how this project's smokeable stack starts and where it answers. */
|
|
29
|
+
export declare function resolveStackStart(manifest: Manifest, port?: string | null): StackStart;
|
|
30
|
+
export interface StackState {
|
|
31
|
+
schemaVersion: 1;
|
|
32
|
+
command: string | null;
|
|
33
|
+
origins: Record<string, string>;
|
|
34
|
+
pid: number | null;
|
|
35
|
+
log: string | null;
|
|
36
|
+
startedAt: string | null;
|
|
37
|
+
[extra: string]: unknown;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Read-merge-write: both `launchrail dev` and a composed stack's start command
|
|
41
|
+
* write here, so neither ever replaces the other's fields — the start command
|
|
42
|
+
* adds what the smoke needs (keys, fixture ids, a mailbox path), the CLI adds
|
|
43
|
+
* what it started.
|
|
44
|
+
*/
|
|
45
|
+
export declare function mergeStackState(cwd: string, patch: Partial<StackState>): StackState;
|
|
46
|
+
export declare function readStackState(cwd: string): StackState | null;
|
|
47
|
+
export interface BrowserEnv {
|
|
48
|
+
/** A Chromium the driver can reuse — Playwright's, so no second download. */
|
|
49
|
+
executablePath: string | null;
|
|
50
|
+
/** Where it was found, for doctor and messages. */
|
|
51
|
+
source: string | null;
|
|
52
|
+
/** Comma-separated launch args; root containers need the sandbox off. */
|
|
53
|
+
args: string | null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Where the browser smoke's driver finds a browser. Resolution order: an
|
|
57
|
+
* explicit AGENT_BROWSER_EXECUTABLE_PATH; Playwright's browsers path (a file,
|
|
58
|
+
* or a directory of `chromium-*` builds); the hosted image's Chromium;
|
|
59
|
+
* Playwright's per-user cache. None found means agent-browser downloads its
|
|
60
|
+
* own (`npx agent-browser install`). File checks only — doctor may call this.
|
|
61
|
+
*/
|
|
62
|
+
export declare function resolveBrowserEnv(env?: NodeJS.ProcessEnv): BrowserEnv;
|
|
63
|
+
/**
|
|
64
|
+
* The shell fragment the smoke sources before its first driver command.
|
|
65
|
+
* The env-var form is the reliable one: `--executable-path` is ignored once a
|
|
66
|
+
* daemon is running and only warns.
|
|
67
|
+
*/
|
|
68
|
+
export declare function browserEnvFile(resolved: BrowserEnv): string;
|
|
69
|
+
export declare function writeBrowserEnv(cwd: string, env?: NodeJS.ProcessEnv): BrowserEnv;
|
|
70
|
+
export type OriginStatus = string | null;
|
|
71
|
+
/** One probe per origin: any HTTP response counts as ready; a connection failure does not. */
|
|
72
|
+
export declare function probeOrigin(url: string, timeoutMs?: number): Promise<OriginStatus>;
|
|
73
|
+
/** Poll every origin until all answer or the deadline passes. */
|
|
74
|
+
export declare function waitForOrigins(origins: Record<string, string>, timeoutMs: number, intervalMs?: number): Promise<Record<string, OriginStatus>>;
|
|
75
|
+
/** Dependencies missing from a Node project — the fix is the install, not the failing command. */
|
|
76
|
+
export declare function missingDependencies(cwd: string): boolean;
|
|
77
|
+
export declare const INSTALL_HINT = "run `node scripts/setup.mjs` (or the project's install command) first";
|