mimetic-cli 0.1.4 → 0.1.5
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 +67 -12
- package/dist/env-file.d.ts +14 -0
- package/dist/env-file.js +108 -0
- package/dist/env-file.js.map +1 -0
- package/dist/feedback.d.ts +7 -5
- package/dist/feedback.js +61 -4
- package/dist/feedback.js.map +1 -1
- package/dist/init-templates.js +29 -0
- package/dist/init-templates.js.map +1 -1
- package/dist/lab-app-runner.d.ts +78 -0
- package/dist/lab-app-runner.js +403 -0
- package/dist/lab-app-runner.js.map +1 -0
- package/dist/labs.d.ts +67 -0
- package/dist/labs.js +257 -0
- package/dist/labs.js.map +1 -0
- package/dist/observer-assets.js +473 -25
- package/dist/observer-assets.js.map +1 -1
- package/dist/observer.d.ts +6 -0
- package/dist/observer.js +49 -8
- package/dist/observer.js.map +1 -1
- package/dist/oss-lab.d.ts +1 -1
- package/dist/oss-lab.js +6 -6
- package/dist/oss-lab.js.map +1 -1
- package/dist/oss-meta-lab.d.ts +113 -1
- package/dist/oss-meta-lab.js +2753 -200
- package/dist/oss-meta-lab.js.map +1 -1
- package/dist/oss-remote-telemetry.d.ts +77 -0
- package/dist/oss-remote-telemetry.js +393 -0
- package/dist/oss-remote-telemetry.js.map +1 -0
- package/dist/program.d.ts +8 -0
- package/dist/program.js +668 -70
- package/dist/program.js.map +1 -1
- package/dist/run.d.ts +105 -3
- package/dist/run.js +684 -22
- package/dist/run.js.map +1 -1
- package/docs/architecture/local-codex-tui-actor.md +9 -6
- package/docs/architecture/oss-lab-poc.md +119 -47
- package/docs/architecture/project-layout.md +40 -6
- package/docs/contracts/feedback.md +15 -12
- package/docs/contracts/policy.md +9 -2
- package/docs/contracts/run-bundle.md +62 -0
- package/docs/contracts/schemas.md +21 -0
- package/docs/goals/current.md +50 -17
- package/docs/product/open-source-install-experience.md +63 -8
- package/docs/ramp/README.md +26 -8
- package/docs/roadmap/world-class-open-source-v0.md +41 -20
- package/package.json +8 -6
- package/skills/mimetic-cli/SKILL.md +89 -4
- package/skills/mimetic-cli/agents/openai.yaml +1 -1
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
export const LAB_APP_RUNNER_PLAN_SCHEMA = "mimetic.lab-app-runner-plan.v1";
|
|
2
|
+
const DEFAULT_PORTS = {
|
|
3
|
+
generic: 3000,
|
|
4
|
+
next: 3000,
|
|
5
|
+
vite: 5173
|
|
6
|
+
};
|
|
7
|
+
const RUNNABLE_SCRIPT_NAMES = ["dev", "start", "serve", "preview"];
|
|
8
|
+
const SAFE_SCRIPT_NAME_PATTERN = /^[A-Za-z0-9:_-]+$/;
|
|
9
|
+
export function buildLabAppRunnerPlan(metadata) {
|
|
10
|
+
const packageManager = detectPackageManager(metadata);
|
|
11
|
+
const scripts = collectStringMap(metadata.packageJson?.scripts, metadata.scripts);
|
|
12
|
+
const dependencies = collectStringMap(metadata.packageJson?.dependencies, metadata.dependencies);
|
|
13
|
+
const devDependencies = collectStringMap(metadata.packageJson?.devDependencies, metadata.devDependencies);
|
|
14
|
+
const install = buildInstallPlan(packageManager, metadata);
|
|
15
|
+
const candidate = selectScriptCandidate({ dependencies, devDependencies, scripts });
|
|
16
|
+
const warnings = [];
|
|
17
|
+
if (!candidate) {
|
|
18
|
+
warnings.push("No runnable app script was detected; desktop and mobile app surfaces were not planned.");
|
|
19
|
+
const shell = renderLabAppRunnerShell({
|
|
20
|
+
install,
|
|
21
|
+
packageManager
|
|
22
|
+
});
|
|
23
|
+
return {
|
|
24
|
+
schema: LAB_APP_RUNNER_PLAN_SCHEMA,
|
|
25
|
+
ok: false,
|
|
26
|
+
framework: "none",
|
|
27
|
+
install,
|
|
28
|
+
packageManager,
|
|
29
|
+
shell,
|
|
30
|
+
surfaces: [],
|
|
31
|
+
warnings
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const port = selectPort(metadata.preferredPort, candidate.rawCommand, DEFAULT_PORTS[candidate.framework]);
|
|
35
|
+
const url = `http://127.0.0.1:${port}`;
|
|
36
|
+
const devServer = {
|
|
37
|
+
command: buildStartCommand(packageManager, candidate, candidate.rawCommand),
|
|
38
|
+
framework: candidate.framework,
|
|
39
|
+
port,
|
|
40
|
+
reason: candidate.reason,
|
|
41
|
+
scriptName: candidate.name,
|
|
42
|
+
url
|
|
43
|
+
};
|
|
44
|
+
const readiness = {
|
|
45
|
+
command: `wait_for_http "$APP_URL" ${readinessTimeoutMs(metadata)} ${readinessIntervalMs(metadata)}`,
|
|
46
|
+
intervalMs: readinessIntervalMs(metadata),
|
|
47
|
+
timeoutMs: readinessTimeoutMs(metadata),
|
|
48
|
+
url
|
|
49
|
+
};
|
|
50
|
+
const surfaces = buildSurfaces(url);
|
|
51
|
+
const shell = renderLabAppRunnerShell({
|
|
52
|
+
devServer,
|
|
53
|
+
install,
|
|
54
|
+
packageManager,
|
|
55
|
+
readiness,
|
|
56
|
+
surfaces
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
schema: LAB_APP_RUNNER_PLAN_SCHEMA,
|
|
60
|
+
ok: true,
|
|
61
|
+
devServer,
|
|
62
|
+
framework: candidate.framework,
|
|
63
|
+
install,
|
|
64
|
+
packageManager,
|
|
65
|
+
readiness,
|
|
66
|
+
shell,
|
|
67
|
+
surfaces,
|
|
68
|
+
warnings
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function renderLabAppRunnerShell(args) {
|
|
72
|
+
const commands = [
|
|
73
|
+
...installCommands(args.install),
|
|
74
|
+
...(args.devServer ? [args.devServer.command] : []),
|
|
75
|
+
...(args.readiness ? [args.readiness.command] : []),
|
|
76
|
+
...(args.surfaces ?? []).map((surface) => surface.command)
|
|
77
|
+
];
|
|
78
|
+
return {
|
|
79
|
+
commands,
|
|
80
|
+
script: [
|
|
81
|
+
"#!/usr/bin/env bash",
|
|
82
|
+
"set -Eeuo pipefail",
|
|
83
|
+
"export MIMETIC_PUBLIC_SAFE=1",
|
|
84
|
+
`APP_PORT="\${APP_PORT:-${args.devServer?.port ?? DEFAULT_PORTS.generic}}"`,
|
|
85
|
+
"APP_HOST=\"${APP_HOST:-0.0.0.0}\"",
|
|
86
|
+
"APP_URL=\"${APP_URL:-http://127.0.0.1:${APP_PORT}}\"",
|
|
87
|
+
"APP_RUNNER_LOG=\"${APP_RUNNER_LOG:-mimetic-app-runner.log}\"",
|
|
88
|
+
"",
|
|
89
|
+
renderWaitFunction(),
|
|
90
|
+
"",
|
|
91
|
+
renderOpenFunction(),
|
|
92
|
+
"",
|
|
93
|
+
...renderInstallShell(args.install),
|
|
94
|
+
"",
|
|
95
|
+
...(args.devServer && args.readiness && args.surfaces
|
|
96
|
+
? [
|
|
97
|
+
"echo \"== starting app server ==\"",
|
|
98
|
+
`${args.devServer.command} > "$APP_RUNNER_LOG" 2>&1 &`,
|
|
99
|
+
"APP_RUNNER_PID=$!",
|
|
100
|
+
args.readiness.command,
|
|
101
|
+
...args.surfaces.map((surface) => surface.command),
|
|
102
|
+
"wait \"$APP_RUNNER_PID\""
|
|
103
|
+
]
|
|
104
|
+
: [
|
|
105
|
+
"echo \"No runnable app script detected; skipping app surface launch.\"",
|
|
106
|
+
"exit 2"
|
|
107
|
+
])
|
|
108
|
+
].join("\n")
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function detectPackageManager(metadata) {
|
|
112
|
+
const hint = firstNonEmpty(metadata.packageManager, metadata.packageJson?.packageManager);
|
|
113
|
+
const lockfiles = new Set((metadata.lockfiles ?? []).map((lockfile) => lockfile.trim()));
|
|
114
|
+
if (hint?.startsWith("pnpm@") || lockfiles.has("pnpm-lock.yaml"))
|
|
115
|
+
return "pnpm";
|
|
116
|
+
if (hint?.startsWith("yarn@") || lockfiles.has("yarn.lock"))
|
|
117
|
+
return "yarn";
|
|
118
|
+
if (hint?.startsWith("bun@") || lockfiles.has("bun.lock") || lockfiles.has("bun.lockb"))
|
|
119
|
+
return "bun";
|
|
120
|
+
return "npm";
|
|
121
|
+
}
|
|
122
|
+
function buildInstallPlan(packageManager, metadata) {
|
|
123
|
+
const command = installCommand(packageManager, metadata.lockfiles ?? []);
|
|
124
|
+
if (metadata.hasNodeModules === true) {
|
|
125
|
+
return {
|
|
126
|
+
command,
|
|
127
|
+
mode: "skip",
|
|
128
|
+
reason: "node_modules is already present."
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (metadata.hasNodeModules === false) {
|
|
132
|
+
return {
|
|
133
|
+
command,
|
|
134
|
+
mode: "run",
|
|
135
|
+
reason: "node_modules is missing."
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
command,
|
|
140
|
+
mode: "when-missing",
|
|
141
|
+
reason: "Install only if node_modules is absent at bootstrap time."
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function installCommand(packageManager, lockfiles) {
|
|
145
|
+
const locks = new Set(lockfiles);
|
|
146
|
+
switch (packageManager) {
|
|
147
|
+
case "pnpm":
|
|
148
|
+
return locks.has("pnpm-lock.yaml")
|
|
149
|
+
? "pnpm install --frozen-lockfile --ignore-scripts"
|
|
150
|
+
: "pnpm install --ignore-scripts";
|
|
151
|
+
case "yarn":
|
|
152
|
+
return locks.has("yarn.lock")
|
|
153
|
+
? "yarn install --frozen-lockfile --ignore-scripts"
|
|
154
|
+
: "yarn install --ignore-scripts";
|
|
155
|
+
case "bun":
|
|
156
|
+
return locks.has("bun.lock") || locks.has("bun.lockb")
|
|
157
|
+
? "bun install --frozen-lockfile"
|
|
158
|
+
: "bun install";
|
|
159
|
+
case "npm":
|
|
160
|
+
return locks.has("package-lock.json") || locks.has("npm-shrinkwrap.json")
|
|
161
|
+
? "npm ci --ignore-scripts --no-audit --no-fund"
|
|
162
|
+
: "npm install --ignore-scripts --no-audit --no-fund";
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function selectScriptCandidate(args) {
|
|
166
|
+
const allDependencies = { ...args.dependencies, ...args.devDependencies };
|
|
167
|
+
const scriptEntries = runnableScriptEntries(args.scripts);
|
|
168
|
+
const nextByCommand = scriptEntries.find((entry) => /\bnext\s+(dev|start)\b/.test(entry.command));
|
|
169
|
+
if (nextByCommand) {
|
|
170
|
+
return {
|
|
171
|
+
framework: "next",
|
|
172
|
+
name: nextByCommand.name,
|
|
173
|
+
rawCommand: nextByCommand.command,
|
|
174
|
+
reason: `Selected ${nextByCommand.name} because it matches Next.js app startup.`
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
const viteByCommand = scriptEntries.find((entry) => /\bvite(\s|$)/.test(entry.command));
|
|
178
|
+
if (viteByCommand) {
|
|
179
|
+
return {
|
|
180
|
+
framework: "vite",
|
|
181
|
+
name: viteByCommand.name,
|
|
182
|
+
rawCommand: viteByCommand.command,
|
|
183
|
+
reason: `Selected ${viteByCommand.name} because it matches Vite app startup.`
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
if (Object.prototype.hasOwnProperty.call(allDependencies, "next")) {
|
|
187
|
+
const script = scriptEntries.find((entry) => entry.name === "dev" || entry.name === "start") ?? scriptEntries[0];
|
|
188
|
+
if (script) {
|
|
189
|
+
return {
|
|
190
|
+
framework: "next",
|
|
191
|
+
name: script.name,
|
|
192
|
+
rawCommand: script.command,
|
|
193
|
+
reason: `Selected ${script.name} because package metadata includes Next.js.`
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (Object.prototype.hasOwnProperty.call(allDependencies, "vite")) {
|
|
198
|
+
const script = scriptEntries.find((entry) => entry.name === "dev" || entry.name === "start") ?? scriptEntries[0];
|
|
199
|
+
if (script) {
|
|
200
|
+
return {
|
|
201
|
+
framework: "vite",
|
|
202
|
+
name: script.name,
|
|
203
|
+
rawCommand: script.command,
|
|
204
|
+
reason: `Selected ${script.name} because package metadata includes Vite.`
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const generic = scriptEntries.find((entry) => entry.name === "dev")
|
|
209
|
+
?? scriptEntries.find((entry) => entry.name === "start")
|
|
210
|
+
?? scriptEntries[0];
|
|
211
|
+
if (!generic) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
framework: "generic",
|
|
216
|
+
name: generic.name,
|
|
217
|
+
rawCommand: generic.command,
|
|
218
|
+
reason: `Selected ${generic.name} because it is a common runnable app script.`
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
function runnableScriptEntries(scripts) {
|
|
222
|
+
const entries = [];
|
|
223
|
+
for (const name of RUNNABLE_SCRIPT_NAMES) {
|
|
224
|
+
const command = scripts[name]?.trim();
|
|
225
|
+
if (!command || !SAFE_SCRIPT_NAME_PATTERN.test(name)) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
entries.push({ command, name });
|
|
229
|
+
}
|
|
230
|
+
return entries;
|
|
231
|
+
}
|
|
232
|
+
function selectPort(preferredPort, rawCommand, defaultPort) {
|
|
233
|
+
if (isValidPort(preferredPort))
|
|
234
|
+
return preferredPort;
|
|
235
|
+
const scriptPort = extractPort(rawCommand);
|
|
236
|
+
if (scriptPort)
|
|
237
|
+
return scriptPort;
|
|
238
|
+
return defaultPort;
|
|
239
|
+
}
|
|
240
|
+
function extractPort(rawCommand) {
|
|
241
|
+
const matches = [
|
|
242
|
+
/(?:^|\s)(?:--port|-p)\s+([0-9]{2,5})(?:\s|$)/,
|
|
243
|
+
/(?:^|\s)PORT=([0-9]{2,5})(?:\s|$)/
|
|
244
|
+
];
|
|
245
|
+
for (const pattern of matches) {
|
|
246
|
+
const value = pattern.exec(rawCommand)?.[1];
|
|
247
|
+
const port = value ? Number(value) : NaN;
|
|
248
|
+
if (isValidPort(port))
|
|
249
|
+
return port;
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
function buildStartCommand(packageManager, candidate, rawCommand) {
|
|
254
|
+
const runCommand = `${packageManager} run ${candidate.name}`;
|
|
255
|
+
const envPrefix = 'HOST="$APP_HOST" PORT="$APP_PORT"';
|
|
256
|
+
const extraArgs = frameworkArgs(candidate.framework, rawCommand);
|
|
257
|
+
return `${envPrefix} ${runCommand}${extraArgs.length > 0 ? ` ${scriptArgumentSeparator(packageManager)}${extraArgs.join(" ")}` : ""}`;
|
|
258
|
+
}
|
|
259
|
+
function scriptArgumentSeparator(packageManager) {
|
|
260
|
+
return packageManager === "pnpm" ? "" : "-- ";
|
|
261
|
+
}
|
|
262
|
+
function frameworkArgs(framework, rawCommand) {
|
|
263
|
+
if (framework === "generic") {
|
|
264
|
+
return [];
|
|
265
|
+
}
|
|
266
|
+
const args = [];
|
|
267
|
+
if (!hasHost(rawCommand)) {
|
|
268
|
+
args.push(framework === "next" ? "--hostname" : "--host", '"$APP_HOST"');
|
|
269
|
+
}
|
|
270
|
+
if (!hasPort(rawCommand)) {
|
|
271
|
+
args.push("--port", '"$APP_PORT"');
|
|
272
|
+
}
|
|
273
|
+
return args;
|
|
274
|
+
}
|
|
275
|
+
function hasHost(rawCommand) {
|
|
276
|
+
return /(?:^|\s)(?:--host|--hostname|-H)(?:\s|=)/.test(rawCommand) || /(?:^|\s)HOST=/.test(rawCommand);
|
|
277
|
+
}
|
|
278
|
+
function hasPort(rawCommand) {
|
|
279
|
+
return /(?:^|\s)(?:--port|-p)(?:\s|=)/.test(rawCommand) || /(?:^|\s)PORT=/.test(rawCommand);
|
|
280
|
+
}
|
|
281
|
+
function buildSurfaces(url) {
|
|
282
|
+
return [
|
|
283
|
+
{
|
|
284
|
+
command: 'open_lab_surface "$APP_URL" desktop 1440 960',
|
|
285
|
+
id: "desktop",
|
|
286
|
+
label: "Desktop app surface",
|
|
287
|
+
url,
|
|
288
|
+
viewport: {
|
|
289
|
+
deviceScaleFactor: 1,
|
|
290
|
+
height: 960,
|
|
291
|
+
isMobile: false,
|
|
292
|
+
width: 1440
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
command: 'open_lab_surface "$APP_URL" mobile 390 844',
|
|
297
|
+
id: "mobile",
|
|
298
|
+
label: "Mobile app surface",
|
|
299
|
+
url,
|
|
300
|
+
viewport: {
|
|
301
|
+
deviceScaleFactor: 2,
|
|
302
|
+
height: 844,
|
|
303
|
+
isMobile: true,
|
|
304
|
+
width: 390
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
];
|
|
308
|
+
}
|
|
309
|
+
function installCommands(install) {
|
|
310
|
+
if (install.mode === "skip")
|
|
311
|
+
return [];
|
|
312
|
+
return [install.command];
|
|
313
|
+
}
|
|
314
|
+
function renderInstallShell(install) {
|
|
315
|
+
switch (install.mode) {
|
|
316
|
+
case "skip":
|
|
317
|
+
return ["echo \"== dependencies already present; skipping install ==\""];
|
|
318
|
+
case "run":
|
|
319
|
+
return [
|
|
320
|
+
"echo \"== installing dependencies ==\"",
|
|
321
|
+
install.command
|
|
322
|
+
];
|
|
323
|
+
case "when-missing":
|
|
324
|
+
return [
|
|
325
|
+
"if [ ! -d node_modules ]; then",
|
|
326
|
+
" echo \"== installing dependencies ==\"",
|
|
327
|
+
` ${install.command}`,
|
|
328
|
+
"else",
|
|
329
|
+
" echo \"== dependencies already present; skipping install ==\"",
|
|
330
|
+
"fi"
|
|
331
|
+
];
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function renderWaitFunction() {
|
|
335
|
+
return `wait_for_http() {
|
|
336
|
+
local url="$1"
|
|
337
|
+
local timeout_ms="$2"
|
|
338
|
+
local interval_ms="$3"
|
|
339
|
+
node - "$url" "$timeout_ms" "$interval_ms" <<'NODE'
|
|
340
|
+
const [url, timeoutArg, intervalArg] = process.argv.slice(2);
|
|
341
|
+
const timeoutMs = Number(timeoutArg);
|
|
342
|
+
const intervalMs = Number(intervalArg);
|
|
343
|
+
const startedAt = Date.now();
|
|
344
|
+
|
|
345
|
+
async function probe() {
|
|
346
|
+
const controller = new AbortController();
|
|
347
|
+
const timer = setTimeout(() => controller.abort(), Math.min(intervalMs, 5_000));
|
|
348
|
+
try {
|
|
349
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
350
|
+
return response.status < 500;
|
|
351
|
+
} catch {
|
|
352
|
+
return false;
|
|
353
|
+
} finally {
|
|
354
|
+
clearTimeout(timer);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
while (Date.now() - startedAt <= timeoutMs) {
|
|
359
|
+
if (await probe()) process.exit(0);
|
|
360
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
361
|
+
}
|
|
362
|
+
console.error("Timed out waiting for HTTP readiness.");
|
|
363
|
+
process.exit(1);
|
|
364
|
+
NODE
|
|
365
|
+
}`;
|
|
366
|
+
}
|
|
367
|
+
function renderOpenFunction() {
|
|
368
|
+
return `open_lab_surface() {
|
|
369
|
+
local url="$1"
|
|
370
|
+
local profile="$2"
|
|
371
|
+
local width="$3"
|
|
372
|
+
local height="$4"
|
|
373
|
+
if command -v google-chrome >/dev/null 2>&1; then
|
|
374
|
+
nohup google-chrome --no-first-run --no-default-browser-check --disable-default-apps --user-data-dir=".mimetic-lab-\${profile}-chrome" --window-size="\${width},\${height}" "$url" >/dev/null 2>&1 &
|
|
375
|
+
elif command -v firefox >/dev/null 2>&1; then
|
|
376
|
+
nohup firefox --width "$width" --height "$height" "$url" >/dev/null 2>&1 &
|
|
377
|
+
else
|
|
378
|
+
echo "browser_open=skipped surface=$profile url=$url"
|
|
379
|
+
fi
|
|
380
|
+
}`;
|
|
381
|
+
}
|
|
382
|
+
function readinessTimeoutMs(metadata) {
|
|
383
|
+
return positiveInt(metadata.readinessTimeoutMs, 120_000);
|
|
384
|
+
}
|
|
385
|
+
function readinessIntervalMs(metadata) {
|
|
386
|
+
return positiveInt(metadata.readinessIntervalMs, 1_000);
|
|
387
|
+
}
|
|
388
|
+
function positiveInt(value, fallback) {
|
|
389
|
+
return typeof value === "number" && Number.isInteger(value) && value > 0 ? value : fallback;
|
|
390
|
+
}
|
|
391
|
+
function isValidPort(value) {
|
|
392
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 1 && value <= 65_535;
|
|
393
|
+
}
|
|
394
|
+
function collectStringMap(first, second) {
|
|
395
|
+
return {
|
|
396
|
+
...(first ?? {}),
|
|
397
|
+
...(second ?? {})
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
function firstNonEmpty(...values) {
|
|
401
|
+
return values.find((value) => value !== undefined && value.trim().length > 0);
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=lab-app-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lab-app-runner.js","sourceRoot":"","sources":["../src/lab-app-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/labs.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export declare const LAB_MANIFEST_SCHEMA = "mimetic.lab.v1";
|
|
2
|
+
export declare const LAB_LIST_SCHEMA = "mimetic.lab-list.v1";
|
|
3
|
+
export declare const LAB_INSPECT_SCHEMA = "mimetic.lab-inspect.v1";
|
|
4
|
+
export type LabKind = "synthetic" | "oss-meta" | "oss-smoke";
|
|
5
|
+
export type LabOrigin = "committed" | "ignored" | "explicit";
|
|
6
|
+
export interface LabManifest {
|
|
7
|
+
schema: typeof LAB_MANIFEST_SCHEMA;
|
|
8
|
+
id: string;
|
|
9
|
+
kind: LabKind;
|
|
10
|
+
title?: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
sims?: number;
|
|
13
|
+
count?: number;
|
|
14
|
+
limit?: number;
|
|
15
|
+
repos?: string[];
|
|
16
|
+
defaults?: {
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
open?: boolean;
|
|
19
|
+
redactRepos?: boolean;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface ResolvedLabManifest {
|
|
23
|
+
manifest: LabManifest;
|
|
24
|
+
origin: LabOrigin;
|
|
25
|
+
path: string;
|
|
26
|
+
warnings: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface LabResolveFailure {
|
|
29
|
+
ok: false;
|
|
30
|
+
cwd: string;
|
|
31
|
+
lab: string;
|
|
32
|
+
error: {
|
|
33
|
+
code: "MIMETIC_LAB_NOT_FOUND" | "MIMETIC_LAB_INVALID";
|
|
34
|
+
message: string;
|
|
35
|
+
};
|
|
36
|
+
warnings: string[];
|
|
37
|
+
}
|
|
38
|
+
export type LabResolveResult = ({
|
|
39
|
+
ok: true;
|
|
40
|
+
} & ResolvedLabManifest) | LabResolveFailure;
|
|
41
|
+
export interface LabListResult {
|
|
42
|
+
schema: typeof LAB_LIST_SCHEMA;
|
|
43
|
+
ok: true;
|
|
44
|
+
cwd: string;
|
|
45
|
+
labs: Array<{
|
|
46
|
+
id: string;
|
|
47
|
+
kind: LabKind;
|
|
48
|
+
origin: LabOrigin;
|
|
49
|
+
path: string;
|
|
50
|
+
title?: string;
|
|
51
|
+
}>;
|
|
52
|
+
warnings: string[];
|
|
53
|
+
}
|
|
54
|
+
export interface LabInspectResult {
|
|
55
|
+
schema: typeof LAB_INSPECT_SCHEMA;
|
|
56
|
+
ok: boolean;
|
|
57
|
+
cwd: string;
|
|
58
|
+
lab: string;
|
|
59
|
+
manifest?: LabManifest;
|
|
60
|
+
origin?: LabOrigin;
|
|
61
|
+
path?: string;
|
|
62
|
+
error?: LabResolveFailure["error"];
|
|
63
|
+
warnings: string[];
|
|
64
|
+
}
|
|
65
|
+
export declare function resolveLabManifest(cwd: string, lab: string): Promise<LabResolveResult>;
|
|
66
|
+
export declare function listLabManifests(cwd: string): Promise<LabListResult>;
|
|
67
|
+
export declare function inspectLabManifest(cwd: string, lab: string): Promise<LabInspectResult>;
|