@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.
@@ -0,0 +1,210 @@
1
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ /**
5
+ * The smokeable stack's state (ADR-0036): where `launchrail dev` records what
6
+ * it started, and where the browser smoke reads it back. The directory ignores
7
+ * itself in git, so nothing here — URLs, pids, logs, a throwaway driver script —
8
+ * ever shows up as an untracked file.
9
+ */
10
+ export const STATE_DIR = ".launchrail/state";
11
+ export const STACK_STATE_FILE = `${STATE_DIR}/stack.json`;
12
+ export const DEV_URL_FILE = `${STATE_DIR}/dev.url`;
13
+ export const DEV_PID_FILE = `${STATE_DIR}/dev.pid`;
14
+ export const DEV_LOG_FILE = `${STATE_DIR}/dev.log`;
15
+ export const BROWSER_ENV_FILE = `${STATE_DIR}/browser.env`;
16
+ export const DEFAULT_APP_URL = "http://localhost:3000";
17
+ export function ensureStateDir(cwd) {
18
+ mkdirSync(join(cwd, STATE_DIR), { recursive: true });
19
+ const ignore = join(cwd, STATE_DIR, ".gitignore");
20
+ if (!existsSync(ignore))
21
+ writeFileSync(ignore, "*\n", "utf8");
22
+ }
23
+ /** True when the state directory exists but does not ignore itself (written by an older seed). */
24
+ export function stateDirUnignored(cwd) {
25
+ return existsSync(join(cwd, STATE_DIR)) && !existsSync(join(cwd, STATE_DIR, ".gitignore"));
26
+ }
27
+ /** Resolve how this project's smokeable stack starts and where it answers. */
28
+ export function resolveStackStart(manifest, port = null) {
29
+ const composed = Object.keys(manifest.smoke.origins).length > 0;
30
+ const command = manifest.smoke.start ?? manifest.testing.devCommand;
31
+ const source = manifest.smoke.start ? "smoke.start" : manifest.testing.devCommand ? "testing.devCommand" : null;
32
+ let origins;
33
+ if (composed) {
34
+ origins = { ...manifest.smoke.origins };
35
+ }
36
+ else {
37
+ const url = new URL(manifest.testing.appUrl ?? DEFAULT_APP_URL);
38
+ // --port only re-addresses the derived single origin; a composed stack's
39
+ // start command owns its ports and writes the real ones into stack.json.
40
+ if (port)
41
+ url.port = port;
42
+ origins = { app: url.href.replace(/\/$/, "") };
43
+ }
44
+ return { command, source, origins, composed };
45
+ }
46
+ /**
47
+ * Read-merge-write: both `launchrail dev` and a composed stack's start command
48
+ * write here, so neither ever replaces the other's fields — the start command
49
+ * adds what the smoke needs (keys, fixture ids, a mailbox path), the CLI adds
50
+ * what it started.
51
+ */
52
+ export function mergeStackState(cwd, patch) {
53
+ const path = join(cwd, STACK_STATE_FILE);
54
+ let current = {};
55
+ if (existsSync(path)) {
56
+ try {
57
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
58
+ if (typeof parsed === "object" && parsed !== null)
59
+ current = parsed;
60
+ }
61
+ catch {
62
+ // A half-written or hand-edited file is replaced, not fatal.
63
+ }
64
+ }
65
+ const next = {
66
+ schemaVersion: 1,
67
+ command: null,
68
+ origins: {},
69
+ pid: null,
70
+ log: null,
71
+ startedAt: null,
72
+ ...current,
73
+ ...patch,
74
+ };
75
+ writeFileSync(path, JSON.stringify(next, null, 2) + "\n", "utf8");
76
+ return next;
77
+ }
78
+ export function readStackState(cwd) {
79
+ const path = join(cwd, STACK_STATE_FILE);
80
+ if (!existsSync(path))
81
+ return null;
82
+ try {
83
+ return JSON.parse(readFileSync(path, "utf8"));
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ const KNOWN_CHROMIUM_PATHS = ["/opt/pw-browsers/chromium"];
90
+ function chromiumUnder(dir) {
91
+ if (!existsSync(dir))
92
+ return null;
93
+ let entries;
94
+ try {
95
+ entries = readdirSync(dir);
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ for (const entry of entries.filter((e) => e.startsWith("chromium")).sort().reverse()) {
101
+ for (const rel of ["chrome-linux/chrome", "chrome-mac/Chromium.app/Contents/MacOS/Chromium", "chrome-win/chrome.exe"]) {
102
+ const candidate = join(dir, entry, rel);
103
+ if (existsSync(candidate))
104
+ return candidate;
105
+ }
106
+ }
107
+ return null;
108
+ }
109
+ function isFile(path) {
110
+ try {
111
+ return statSync(path).isFile();
112
+ }
113
+ catch {
114
+ return false;
115
+ }
116
+ }
117
+ /**
118
+ * Where the browser smoke's driver finds a browser. Resolution order: an
119
+ * explicit AGENT_BROWSER_EXECUTABLE_PATH; Playwright's browsers path (a file,
120
+ * or a directory of `chromium-*` builds); the hosted image's Chromium;
121
+ * Playwright's per-user cache. None found means agent-browser downloads its
122
+ * own (`npx agent-browser install`). File checks only — doctor may call this.
123
+ */
124
+ export function resolveBrowserEnv(env = process.env) {
125
+ const isRoot = typeof process.getuid === "function" && process.getuid() === 0;
126
+ const args = isRoot ? "--no-sandbox,--disable-dev-shm-usage" : null;
127
+ const found = (executablePath, source) => ({ executablePath, source, args });
128
+ if (env.AGENT_BROWSER_EXECUTABLE_PATH)
129
+ return found(env.AGENT_BROWSER_EXECUTABLE_PATH, "AGENT_BROWSER_EXECUTABLE_PATH");
130
+ if (env.PLAYWRIGHT_BROWSERS_PATH) {
131
+ const p = env.PLAYWRIGHT_BROWSERS_PATH;
132
+ if (isFile(p))
133
+ return found(p, "PLAYWRIGHT_BROWSERS_PATH");
134
+ const under = chromiumUnder(p);
135
+ if (under)
136
+ return found(under, "PLAYWRIGHT_BROWSERS_PATH");
137
+ }
138
+ for (const known of KNOWN_CHROMIUM_PATHS) {
139
+ if (isFile(known))
140
+ return found(known, "hosted image");
141
+ }
142
+ const caches = [
143
+ join(homedir(), ".cache", "ms-playwright"),
144
+ join(homedir(), "Library", "Caches", "ms-playwright"),
145
+ ...(env.LOCALAPPDATA ? [join(env.LOCALAPPDATA, "ms-playwright")] : []),
146
+ ];
147
+ for (const cache of caches) {
148
+ const under = chromiumUnder(cache);
149
+ if (under)
150
+ return found(under, "Playwright cache");
151
+ }
152
+ return { executablePath: null, source: null, args };
153
+ }
154
+ /**
155
+ * The shell fragment the smoke sources before its first driver command.
156
+ * The env-var form is the reliable one: `--executable-path` is ignored once a
157
+ * daemon is running and only warns.
158
+ */
159
+ export function browserEnvFile(resolved) {
160
+ const lines = [
161
+ "# Written by `launchrail dev` — source it before the first agent-browser command:",
162
+ `# set -a; . ${BROWSER_ENV_FILE}; set +a`,
163
+ "# The env-var form is reliable; --executable-path is ignored once a daemon runs. Change it only after `agent-browser close`.",
164
+ ];
165
+ if (resolved.executablePath) {
166
+ lines.push(`export AGENT_BROWSER_EXECUTABLE_PATH=${JSON.stringify(resolved.executablePath)}`);
167
+ }
168
+ else {
169
+ lines.push("# No Playwright Chromium found — agent-browser uses its own: `npx agent-browser install`.");
170
+ }
171
+ if (resolved.args)
172
+ lines.push(`export AGENT_BROWSER_ARGS=${JSON.stringify(resolved.args)}`);
173
+ return lines.join("\n") + "\n";
174
+ }
175
+ export function writeBrowserEnv(cwd, env = process.env) {
176
+ ensureStateDir(cwd);
177
+ const resolved = resolveBrowserEnv(env);
178
+ writeFileSync(join(cwd, BROWSER_ENV_FILE), browserEnvFile(resolved), "utf8");
179
+ return resolved;
180
+ }
181
+ /** One probe per origin: any HTTP response counts as ready; a connection failure does not. */
182
+ export async function probeOrigin(url, timeoutMs = 2000) {
183
+ try {
184
+ const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs), redirect: "manual" });
185
+ return `HTTP ${response.status}`;
186
+ }
187
+ catch {
188
+ return null;
189
+ }
190
+ }
191
+ /** Poll every origin until all answer or the deadline passes. */
192
+ export async function waitForOrigins(origins, timeoutMs, intervalMs = 500) {
193
+ const status = Object.fromEntries(Object.keys(origins).map((name) => [name, null]));
194
+ const deadline = Date.now() + timeoutMs;
195
+ for (;;) {
196
+ await Promise.all(Object.entries(origins).map(async ([name, url]) => {
197
+ if (status[name] === null)
198
+ status[name] = await probeOrigin(url);
199
+ }));
200
+ if (Object.values(status).every((s) => s !== null) || Date.now() >= deadline)
201
+ return status;
202
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
203
+ }
204
+ }
205
+ /** Dependencies missing from a Node project — the fix is the install, not the failing command. */
206
+ export function missingDependencies(cwd) {
207
+ return existsSync(join(cwd, "package.json")) && !existsSync(join(cwd, "node_modules"));
208
+ }
209
+ export const INSTALL_HINT = "run `node scripts/setup.mjs` (or the project's install command) first";
210
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/lib/stack.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wemuda/launchrail",
3
- "version": "1.15.1",
3
+ "version": "1.16.0",
4
4
  "description": "Launchrail — initialize, inspect, update, and validate repositories using the Launchrail development system.",
5
5
  "license": "MIT",
6
6
  "type": "module",