tubeless 0.1.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/LICENSE +21 -0
- package/README.md +106 -0
- package/dist/abort.d.ts +12 -0
- package/dist/abort.d.ts.map +1 -0
- package/dist/abort.js +49 -0
- package/dist/abort.js.map +1 -0
- package/dist/batch.d.ts +22 -0
- package/dist/batch.d.ts.map +1 -0
- package/dist/batch.js +73 -0
- package/dist/batch.js.map +1 -0
- package/dist/checkpoint.d.ts +33 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +71 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/child-execution.d.ts +30 -0
- package/dist/child-execution.d.ts.map +1 -0
- package/dist/child-execution.js +270 -0
- package/dist/child-execution.js.map +1 -0
- package/dist/cli-command.d.ts +29 -0
- package/dist/cli-command.d.ts.map +1 -0
- package/dist/cli-command.js +314 -0
- package/dist/cli-command.js.map +1 -0
- package/dist/cli-parser.d.ts +28 -0
- package/dist/cli-parser.d.ts.map +1 -0
- package/dist/cli-parser.js +557 -0
- package/dist/cli-parser.js.map +1 -0
- package/dist/cli-pipeline-command.d.ts +84 -0
- package/dist/cli-pipeline-command.d.ts.map +1 -0
- package/dist/cli-pipeline-command.js +185 -0
- package/dist/cli-pipeline-command.js.map +1 -0
- package/dist/cli-types.d.ts +220 -0
- package/dist/cli-types.d.ts.map +1 -0
- package/dist/cli-types.js +19 -0
- package/dist/cli-types.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +8 -0
- package/dist/env.js.map +1 -0
- package/dist/file-utils.d.ts +4 -0
- package/dist/file-utils.d.ts.map +1 -0
- package/dist/file-utils.js +35 -0
- package/dist/file-utils.js.map +1 -0
- package/dist/interactive-reporter.d.ts +38 -0
- package/dist/interactive-reporter.d.ts.map +1 -0
- package/dist/interactive-reporter.js +308 -0
- package/dist/interactive-reporter.js.map +1 -0
- package/dist/lifecycle.d.ts +17 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +77 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/live-ticker.d.ts +21 -0
- package/dist/live-ticker.d.ts.map +1 -0
- package/dist/live-ticker.js +377 -0
- package/dist/live-ticker.js.map +1 -0
- package/dist/mapped-child-progress.d.ts +109 -0
- package/dist/mapped-child-progress.d.ts.map +1 -0
- package/dist/mapped-child-progress.js +133 -0
- package/dist/mapped-child-progress.js.map +1 -0
- package/dist/node.d.ts +5 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +5 -0
- package/dist/node.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +19 -0
- package/dist/paths.js.map +1 -0
- package/dist/pipeline-command-marker.d.ts +5 -0
- package/dist/pipeline-command-marker.d.ts.map +1 -0
- package/dist/pipeline-command-marker.js +21 -0
- package/dist/pipeline-command-marker.js.map +1 -0
- package/dist/pipeline-diagnostics.d.ts +4 -0
- package/dist/pipeline-diagnostics.d.ts.map +1 -0
- package/dist/pipeline-diagnostics.js +17 -0
- package/dist/pipeline-diagnostics.js.map +1 -0
- package/dist/pipeline-module.d.ts +62 -0
- package/dist/pipeline-module.d.ts.map +1 -0
- package/dist/pipeline-module.js +157 -0
- package/dist/pipeline-module.js.map +1 -0
- package/dist/pipeline.d.ts +606 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +1444 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/progress.d.ts +4 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +8 -0
- package/dist/progress.js.map +1 -0
- package/dist/prompt-select.d.ts +81 -0
- package/dist/prompt-select.d.ts.map +1 -0
- package/dist/prompt-select.js +197 -0
- package/dist/prompt-select.js.map +1 -0
- package/dist/rate-limit.d.ts +7 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +23 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/render.d.ts +21 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +60 -0
- package/dist/render.js.map +1 -0
- package/dist/reporter-entry.d.ts +3 -0
- package/dist/reporter-entry.d.ts.map +1 -0
- package/dist/reporter-entry.js +3 -0
- package/dist/reporter-entry.js.map +1 -0
- package/dist/reporter.d.ts +50 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +167 -0
- package/dist/reporter.js.map +1 -0
- package/dist/retry.d.ts +28 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +59 -0
- package/dist/retry.js.map +1 -0
- package/dist/run-store-sqlite.d.ts +12 -0
- package/dist/run-store-sqlite.d.ts.map +1 -0
- package/dist/run-store-sqlite.js +187 -0
- package/dist/run-store-sqlite.js.map +1 -0
- package/dist/run-store-ui-http.d.ts +5 -0
- package/dist/run-store-ui-http.d.ts.map +1 -0
- package/dist/run-store-ui-http.js +19 -0
- package/dist/run-store-ui-http.js.map +1 -0
- package/dist/run-store-ui-page.d.ts +2 -0
- package/dist/run-store-ui-page.d.ts.map +1 -0
- package/dist/run-store-ui-page.js +759 -0
- package/dist/run-store-ui-page.js.map +1 -0
- package/dist/run-store-ui-protocol.d.ts +28 -0
- package/dist/run-store-ui-protocol.d.ts.map +1 -0
- package/dist/run-store-ui-protocol.js +84 -0
- package/dist/run-store-ui-protocol.js.map +1 -0
- package/dist/run-store-ui-state.d.ts +21 -0
- package/dist/run-store-ui-state.d.ts.map +1 -0
- package/dist/run-store-ui-state.js +65 -0
- package/dist/run-store-ui-state.js.map +1 -0
- package/dist/run-store-ui.d.ts +25 -0
- package/dist/run-store-ui.d.ts.map +1 -0
- package/dist/run-store-ui.js +217 -0
- package/dist/run-store-ui.js.map +1 -0
- package/dist/run-store.d.ts +109 -0
- package/dist/run-store.d.ts.map +1 -0
- package/dist/run-store.js +345 -0
- package/dist/run-store.js.map +1 -0
- package/dist/testing.d.ts +40 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +83 -0
- package/dist/testing.js.map +1 -0
- package/dist/tracing-internal.d.ts +21 -0
- package/dist/tracing-internal.d.ts.map +1 -0
- package/dist/tracing-internal.js +206 -0
- package/dist/tracing-internal.js.map +1 -0
- package/dist/tracing-json.d.ts +12 -0
- package/dist/tracing-json.d.ts.map +1 -0
- package/dist/tracing-json.js +8 -0
- package/dist/tracing-json.js.map +1 -0
- package/dist/tracing-otel.d.ts +36 -0
- package/dist/tracing-otel.d.ts.map +1 -0
- package/dist/tracing-otel.js +60 -0
- package/dist/tracing-otel.js.map +1 -0
- package/dist/tracing.d.ts +48 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +2 -0
- package/dist/tracing.js.map +1 -0
- package/dist/workbench-bin.d.ts +3 -0
- package/dist/workbench-bin.d.ts.map +1 -0
- package/dist/workbench-bin.js +8 -0
- package/dist/workbench-bin.js.map +1 -0
- package/dist/workbench-graph.d.ts +3 -0
- package/dist/workbench-graph.d.ts.map +1 -0
- package/dist/workbench-graph.js +64 -0
- package/dist/workbench-graph.js.map +1 -0
- package/dist/workbench-inspect.d.ts +3 -0
- package/dist/workbench-inspect.d.ts.map +1 -0
- package/dist/workbench-inspect.js +65 -0
- package/dist/workbench-inspect.js.map +1 -0
- package/dist/workbench-plan.d.ts +3 -0
- package/dist/workbench-plan.d.ts.map +1 -0
- package/dist/workbench-plan.js +72 -0
- package/dist/workbench-plan.js.map +1 -0
- package/dist/workbench-run.d.ts +13 -0
- package/dist/workbench-run.d.ts.map +1 -0
- package/dist/workbench-run.js +115 -0
- package/dist/workbench-run.js.map +1 -0
- package/dist/workbench-shared.d.ts +67 -0
- package/dist/workbench-shared.d.ts.map +1 -0
- package/dist/workbench-shared.js +163 -0
- package/dist/workbench-shared.js.map +1 -0
- package/dist/workbench-studio.d.ts +26 -0
- package/dist/workbench-studio.d.ts.map +1 -0
- package/dist/workbench-studio.js +57 -0
- package/dist/workbench-studio.js.map +1 -0
- package/dist/workbench-ui.d.ts +3 -0
- package/dist/workbench-ui.d.ts.map +1 -0
- package/dist/workbench-ui.js +262 -0
- package/dist/workbench-ui.js.map +1 -0
- package/dist/workbench.d.ts +5 -0
- package/dist/workbench.d.ts.map +1 -0
- package/dist/workbench.js +43 -0
- package/dist/workbench.js.map +1 -0
- package/docs/README.md +31 -0
- package/docs/agent-guide.md +168 -0
- package/docs/api-reference.md +269 -0
- package/docs/api-report.json +298 -0
- package/docs/child-pipeline-composition.md +185 -0
- package/docs/cli.md +118 -0
- package/docs/concepts.md +502 -0
- package/docs/getting-started.md +162 -0
- package/docs/llms.txt +62 -0
- package/docs/recipes.md +51 -0
- package/docs/studio.md +86 -0
- package/examples/best-effort.ts +42 -0
- package/examples/cancellation-and-testing.ts +45 -0
- package/examples/child-pipeline.ts +51 -0
- package/examples/cli-job.ts +86 -0
- package/examples/conditional-step.ts +41 -0
- package/examples/fan-out-progress.ts +53 -0
- package/examples/local-observability.ts +80 -0
- package/examples/publish-with-gates.ts +56 -0
- package/examples/rendering.ts +34 -0
- package/examples/resumable-enrichment.ts +75 -0
- package/examples/tracing.ts +35 -0
- package/examples/tsconfig.json +15 -0
- package/examples/typed-import.ts +54 -0
- package/examples/validated-boundaries.ts +75 -0
- package/package.json +156 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { parseArgs } from "node:util";
|
|
2
|
+
import { renderPipelinePlan } from "./render.js";
|
|
3
|
+
import { errorMessage, loadPlanSource, TUBELESS_WORKBENCH_EXIT_CODE, writeUsageError, } from "./workbench-shared.js";
|
|
4
|
+
const PLAN_USAGE = `Usage: tubeless plan [options] <pipeline-or-command-file>
|
|
5
|
+
|
|
6
|
+
Preview pipeline selection without running steps or requiring domain options.
|
|
7
|
+
|
|
8
|
+
Options:
|
|
9
|
+
-e, --export <name> Select a pipeline or command export when the file has more than one
|
|
10
|
+
-t, --target <id> Select a declared target and its prerequisites (repeatable)
|
|
11
|
+
-s, --step <id> Select exact internal steps (repeatable)
|
|
12
|
+
--dry-run Show each step's dry-run disposition
|
|
13
|
+
--explain Include target/dependency selection provenance
|
|
14
|
+
--json Emit the complete structured plan as JSON
|
|
15
|
+
-h, --help Show this help
|
|
16
|
+
`;
|
|
17
|
+
function parsePlanArgs(argv) {
|
|
18
|
+
return parseArgs({
|
|
19
|
+
args: [...argv],
|
|
20
|
+
allowPositionals: true,
|
|
21
|
+
options: {
|
|
22
|
+
"dry-run": { type: "boolean" },
|
|
23
|
+
explain: { type: "boolean" },
|
|
24
|
+
export: { type: "string", short: "e" },
|
|
25
|
+
help: { type: "boolean", short: "h" },
|
|
26
|
+
json: { type: "boolean" },
|
|
27
|
+
step: { type: "string", short: "s", multiple: true },
|
|
28
|
+
target: { type: "string", short: "t", multiple: true },
|
|
29
|
+
},
|
|
30
|
+
strict: true,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export async function runPlan(argv, io) {
|
|
34
|
+
let parsed;
|
|
35
|
+
try {
|
|
36
|
+
parsed = parsePlanArgs(argv);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
return writeUsageError(io, errorMessage(error), PLAN_USAGE);
|
|
40
|
+
}
|
|
41
|
+
if (parsed.values.help) {
|
|
42
|
+
io.stdout.write(PLAN_USAGE);
|
|
43
|
+
return TUBELESS_WORKBENCH_EXIT_CODE.success;
|
|
44
|
+
}
|
|
45
|
+
if (parsed.positionals.length !== 1) {
|
|
46
|
+
return writeUsageError(io, "Pass exactly one pipeline or command file.", PLAN_USAGE);
|
|
47
|
+
}
|
|
48
|
+
const loaded = await loadPlanSource(parsed.positionals[0], parsed.values.export, io);
|
|
49
|
+
if ("exitCode" in loaded)
|
|
50
|
+
return loaded.exitCode;
|
|
51
|
+
const controls = {
|
|
52
|
+
dryRun: parsed.values["dry-run"] ?? false,
|
|
53
|
+
};
|
|
54
|
+
if (parsed.values.step !== undefined)
|
|
55
|
+
controls.stepIds = parsed.values.step;
|
|
56
|
+
if (parsed.values.target !== undefined)
|
|
57
|
+
controls.targets = parsed.values.target;
|
|
58
|
+
const planInput = { dryRun: controls.dryRun };
|
|
59
|
+
if (controls.stepIds !== undefined)
|
|
60
|
+
planInput.step = controls.stepIds;
|
|
61
|
+
if (controls.targets !== undefined)
|
|
62
|
+
planInput.target = controls.targets;
|
|
63
|
+
const plan = loaded.source.kind === "command"
|
|
64
|
+
? loaded.source.command.plan(planInput)
|
|
65
|
+
: loaded.source.pipeline.plan(controls);
|
|
66
|
+
const rendered = parsed.values.json
|
|
67
|
+
? renderPipelinePlan(plan, { format: "json", pretty: true })
|
|
68
|
+
: renderPipelinePlan(plan, { explain: parsed.values.explain ?? false });
|
|
69
|
+
io.stdout.write(`${rendered}\n`);
|
|
70
|
+
return plan.ok ? TUBELESS_WORKBENCH_EXIT_CODE.success : TUBELESS_WORKBENCH_EXIT_CODE.planning;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=workbench-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-plan.js","sourceRoot":"","sources":["../src/workbench-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CliContext } from "./cli.js";
|
|
2
|
+
import type { PipelineContext } from "./pipeline.js";
|
|
3
|
+
import type { WorkbenchPipelineCommand } from "./pipeline-module.js";
|
|
4
|
+
import { type WorkbenchCliIo } from "./workbench-shared.js";
|
|
5
|
+
export interface WorkbenchStructuredPipelineCommand extends WorkbenchPipelineCommand {
|
|
6
|
+
execute(values: Record<string, unknown>, context?: Partial<CliContext>): Promise<unknown>;
|
|
7
|
+
parseValues(values: Record<string, unknown>, context?: Partial<CliContext>): ReturnType<WorkbenchPipelineCommand["parse"]>;
|
|
8
|
+
}
|
|
9
|
+
export declare function executePipelineCommand(command: WorkbenchPipelineCommand, args: readonly string[], io: WorkbenchCliIo, signal: AbortSignal, pipelineContext?: Omit<PipelineContext, "cwd" | "log" | "signal">): Promise<number>;
|
|
10
|
+
/** Execute already validated structured command values through the normal workbench errors. */
|
|
11
|
+
export declare function executePipelineCommandValues(command: WorkbenchStructuredPipelineCommand, values: Record<string, unknown>, io: WorkbenchCliIo, signal: AbortSignal, pipelineContext?: Omit<PipelineContext, "cwd" | "log" | "signal">): Promise<number>;
|
|
12
|
+
export declare function runCommand(argv: readonly string[], io: WorkbenchCliIo): Promise<number>;
|
|
13
|
+
//# sourceMappingURL=workbench-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-run.d.ts","sourceRoot":"","sources":["../src/workbench-run.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAGrE,OAAO,EAWL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,kCAAmC,SAAQ,wBAAwB;IAClF,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,WAAW,CACT,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAC5B,UAAU,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;CAClD;AAiCD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,WAAW,EACnB,eAAe,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC,GAChE,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,+FAA+F;AAC/F,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,kCAAkC,EAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,WAAW,EACnB,eAAe,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC,GAChE,OAAO,CAAC,MAAM,CAAC,CAQjB;AAsCD,wBAAsB,UAAU,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAkD7F"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { isAbortError } from "./abort.js";
|
|
4
|
+
import { renderPipelineError } from "./render.js";
|
|
5
|
+
import { commandContext, errorMessage, isCliHelpRequested, isCliValidationError, isPipelineExecutionError, loadPipelineCommand, manageWorkbenchSignal, TUBELESS_WORKBENCH_EXIT_CODE, toExitCode, writeUsageError, } from "./workbench-shared.js";
|
|
6
|
+
const RUN_USAGE = `Usage: tubeless run [options] <command-file> [-- <command-args...>]
|
|
7
|
+
|
|
8
|
+
Execute an exported definePipelineCommand using its own validated CLI contract.
|
|
9
|
+
|
|
10
|
+
Options:
|
|
11
|
+
-e, --export <name> Select a command export when the file has more than one
|
|
12
|
+
--store <path> Append run events to a local SQLite database
|
|
13
|
+
-h, --help Show this workbench help
|
|
14
|
+
|
|
15
|
+
Pass application flags after --. For command help, use: tubeless run <file> -- --help
|
|
16
|
+
`;
|
|
17
|
+
function parseRunArgs(argv) {
|
|
18
|
+
const separatorIndex = argv.indexOf("--");
|
|
19
|
+
const workbenchArgs = separatorIndex === -1 ? argv : argv.slice(0, separatorIndex);
|
|
20
|
+
const commandArgs = separatorIndex === -1 ? [] : argv.slice(separatorIndex + 1);
|
|
21
|
+
return {
|
|
22
|
+
commandArgs,
|
|
23
|
+
parsed: parseArgs({
|
|
24
|
+
args: [...workbenchArgs],
|
|
25
|
+
allowPositionals: true,
|
|
26
|
+
options: {
|
|
27
|
+
export: { type: "string", short: "e" },
|
|
28
|
+
help: { type: "boolean", short: "h" },
|
|
29
|
+
store: { type: "string" },
|
|
30
|
+
},
|
|
31
|
+
strict: true,
|
|
32
|
+
}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export async function executePipelineCommand(command, args, io, signal, pipelineContext) {
|
|
36
|
+
return executePipelineCommandOperation(async () => {
|
|
37
|
+
await command.run(args, commandContext(io, signal, pipelineContext));
|
|
38
|
+
}, io, signal);
|
|
39
|
+
}
|
|
40
|
+
/** Execute already validated structured command values through the normal workbench errors. */
|
|
41
|
+
export async function executePipelineCommandValues(command, values, io, signal, pipelineContext) {
|
|
42
|
+
return executePipelineCommandOperation(async () => {
|
|
43
|
+
await command.execute(values, commandContext(io, signal, pipelineContext));
|
|
44
|
+
}, io, signal);
|
|
45
|
+
}
|
|
46
|
+
async function executePipelineCommandOperation(operation, io, signal) {
|
|
47
|
+
try {
|
|
48
|
+
await operation();
|
|
49
|
+
return signal.aborted
|
|
50
|
+
? TUBELESS_WORKBENCH_EXIT_CODE.cancellation
|
|
51
|
+
: TUBELESS_WORKBENCH_EXIT_CODE.success;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (isCliHelpRequested(error)) {
|
|
55
|
+
io.stdout.write(`${error.helpText.replace(/\n+$/, "")}\n`);
|
|
56
|
+
return toExitCode(error);
|
|
57
|
+
}
|
|
58
|
+
if (isCliValidationError(error)) {
|
|
59
|
+
for (const validationError of error.errors) {
|
|
60
|
+
io.stderr.write(`Error: ${validationError}\n`);
|
|
61
|
+
}
|
|
62
|
+
io.stderr.write(`\n${error.helpText.replace(/\n+$/, "")}\n`);
|
|
63
|
+
return toExitCode(error);
|
|
64
|
+
}
|
|
65
|
+
if (isPipelineExecutionError(error)) {
|
|
66
|
+
for (const pipelineError of error.result.errors) {
|
|
67
|
+
io.stderr.write(`Error: ${renderPipelineError(pipelineError)}\n`);
|
|
68
|
+
}
|
|
69
|
+
return toExitCode(error);
|
|
70
|
+
}
|
|
71
|
+
if (signal.aborted && isAbortError(error)) {
|
|
72
|
+
return TUBELESS_WORKBENCH_EXIT_CODE.cancellation;
|
|
73
|
+
}
|
|
74
|
+
io.stderr.write(`Error: ${errorMessage(error)}\n`);
|
|
75
|
+
return toExitCode(error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export async function runCommand(argv, io) {
|
|
79
|
+
let parsed;
|
|
80
|
+
try {
|
|
81
|
+
parsed = parseRunArgs(argv);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return writeUsageError(io, `${errorMessage(error)} Application flags belong after --.`, RUN_USAGE);
|
|
85
|
+
}
|
|
86
|
+
if (parsed.parsed.values.help) {
|
|
87
|
+
io.stdout.write(RUN_USAGE);
|
|
88
|
+
return TUBELESS_WORKBENCH_EXIT_CODE.success;
|
|
89
|
+
}
|
|
90
|
+
if (parsed.parsed.positionals.length !== 1) {
|
|
91
|
+
return writeUsageError(io, "Pass exactly one pipeline command file.", RUN_USAGE);
|
|
92
|
+
}
|
|
93
|
+
const loaded = await loadPipelineCommand(parsed.parsed.positionals[0], parsed.parsed.values.export, io);
|
|
94
|
+
if ("exitCode" in loaded)
|
|
95
|
+
return loaded.exitCode;
|
|
96
|
+
const managedSignal = manageWorkbenchSignal(io);
|
|
97
|
+
let store;
|
|
98
|
+
try {
|
|
99
|
+
let pipelineContext;
|
|
100
|
+
if (parsed.parsed.values.store) {
|
|
101
|
+
const { openSqlitePipelineRunStore } = await import("./run-store-sqlite.js");
|
|
102
|
+
store = await openSqlitePipelineRunStore(path.resolve(io.cwd, parsed.parsed.values.store));
|
|
103
|
+
pipelineContext = { tracing: { exporter: store } };
|
|
104
|
+
}
|
|
105
|
+
const exitCode = await executePipelineCommand(loaded.command, parsed.commandArgs, io, managedSignal.signal, pipelineContext);
|
|
106
|
+
return exitCode === TUBELESS_WORKBENCH_EXIT_CODE.success && managedSignal.wasInterrupted()
|
|
107
|
+
? TUBELESS_WORKBENCH_EXIT_CODE.cancellation
|
|
108
|
+
: exitCode;
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
await store?.close();
|
|
112
|
+
managedSignal.cleanup();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=workbench-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-run.js","sourceRoot":"","sources":["../src/workbench-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { CliContext } from "./cli.js";
|
|
2
|
+
import { type PipelineContext, type PipelineError } from "./pipeline.js";
|
|
3
|
+
import { type WorkbenchPipeline, type WorkbenchPipelineCommand, type WorkbenchPlanSource } from "./pipeline-module.js";
|
|
4
|
+
/** Stable shell exit codes for the workbench command family. */
|
|
5
|
+
export declare const TUBELESS_WORKBENCH_EXIT_CODE: {
|
|
6
|
+
readonly success: 0;
|
|
7
|
+
readonly usage: 1;
|
|
8
|
+
readonly load: 2;
|
|
9
|
+
readonly definition: 3;
|
|
10
|
+
readonly validation: 4;
|
|
11
|
+
readonly planning: 5;
|
|
12
|
+
readonly execution: 6;
|
|
13
|
+
readonly cancellation: 7;
|
|
14
|
+
};
|
|
15
|
+
export interface WorkbenchCliIo {
|
|
16
|
+
cwd: string;
|
|
17
|
+
signal?: AbortSignal;
|
|
18
|
+
stderr: {
|
|
19
|
+
write(chunk: string): void;
|
|
20
|
+
};
|
|
21
|
+
stdout: {
|
|
22
|
+
write(chunk: string): void;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare function writeUsageError(io: WorkbenchCliIo, message: string, usage: string): number;
|
|
26
|
+
export declare function isDefinitionError(error: unknown): boolean;
|
|
27
|
+
export declare function errorMessage(error: unknown): string;
|
|
28
|
+
export declare function errorName(error: unknown): string | undefined;
|
|
29
|
+
export declare function isCliHelpRequested(error: unknown): error is {
|
|
30
|
+
helpText: string;
|
|
31
|
+
};
|
|
32
|
+
export declare function isCliValidationError(error: unknown): error is {
|
|
33
|
+
errors: readonly string[];
|
|
34
|
+
helpText: string;
|
|
35
|
+
};
|
|
36
|
+
export declare function isPipelineExecutionError(error: unknown): error is {
|
|
37
|
+
result: {
|
|
38
|
+
errors: PipelineError[];
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
/** Map a thrown CLI or pipeline error onto the workbench exit-code family. */
|
|
42
|
+
export declare function toExitCode(error: unknown): number;
|
|
43
|
+
export declare function loadPipeline(fileArgument: string, exportName: string | undefined, io: WorkbenchCliIo): Promise<{
|
|
44
|
+
pipeline: WorkbenchPipeline;
|
|
45
|
+
} | {
|
|
46
|
+
exitCode: number;
|
|
47
|
+
}>;
|
|
48
|
+
export declare function loadPipelineCommand(fileArgument: string, exportName: string | undefined, io: WorkbenchCliIo): Promise<{
|
|
49
|
+
command: WorkbenchPipelineCommand;
|
|
50
|
+
exportName: string;
|
|
51
|
+
} | {
|
|
52
|
+
exitCode: number;
|
|
53
|
+
}>;
|
|
54
|
+
export declare function loadPlanSource(fileArgument: string, exportName: string | undefined, io: WorkbenchCliIo): Promise<{
|
|
55
|
+
source: WorkbenchPlanSource;
|
|
56
|
+
} | {
|
|
57
|
+
exitCode: number;
|
|
58
|
+
}>;
|
|
59
|
+
export declare function writeCommandLine(output: WorkbenchCliIo["stdout"] | WorkbenchCliIo["stderr"], message: string, ...optionalParams: string[]): void;
|
|
60
|
+
export declare function commandContext(io: WorkbenchCliIo, signal: AbortSignal, pipelineContext?: Omit<PipelineContext, "cwd" | "log" | "signal">): Partial<CliContext>;
|
|
61
|
+
export interface ManagedWorkbenchSignal {
|
|
62
|
+
cleanup(): void;
|
|
63
|
+
signal: AbortSignal;
|
|
64
|
+
wasInterrupted(): boolean;
|
|
65
|
+
}
|
|
66
|
+
export declare function manageWorkbenchSignal(io: WorkbenchCliIo): ManagedWorkbenchSignal;
|
|
67
|
+
//# sourceMappingURL=workbench-shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-shared.d.ts","sourceRoot":"","sources":["../src/workbench-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { PipelineDefinitionError } from "./pipeline.js";
|
|
4
|
+
import { loadPipelineCommandModuleWithName, loadPipelineModule, loadPlanSourceModule, } from "./pipeline-module.js";
|
|
5
|
+
/** Stable shell exit codes for the workbench command family. */
|
|
6
|
+
export const TUBELESS_WORKBENCH_EXIT_CODE = {
|
|
7
|
+
success: 0,
|
|
8
|
+
usage: 1,
|
|
9
|
+
load: 2,
|
|
10
|
+
definition: 3,
|
|
11
|
+
validation: 4,
|
|
12
|
+
planning: 5,
|
|
13
|
+
execution: 6,
|
|
14
|
+
cancellation: 7,
|
|
15
|
+
};
|
|
16
|
+
export function writeUsageError(io, message, usage) {
|
|
17
|
+
io.stderr.write(`Error: ${message}\n\n${usage}`);
|
|
18
|
+
return TUBELESS_WORKBENCH_EXIT_CODE.usage;
|
|
19
|
+
}
|
|
20
|
+
export function isDefinitionError(error) {
|
|
21
|
+
return (error instanceof PipelineDefinitionError ||
|
|
22
|
+
(error instanceof Error && error.name === "PipelineDefinitionError"));
|
|
23
|
+
}
|
|
24
|
+
export function errorMessage(error) {
|
|
25
|
+
return error instanceof Error ? error.message : String(error);
|
|
26
|
+
}
|
|
27
|
+
export function errorName(error) {
|
|
28
|
+
return typeof error === "object" && error !== null && "name" in error
|
|
29
|
+
? String(error.name)
|
|
30
|
+
: undefined;
|
|
31
|
+
}
|
|
32
|
+
export function isCliHelpRequested(error) {
|
|
33
|
+
return (errorName(error) === "CliHelpRequested" &&
|
|
34
|
+
typeof error === "object" &&
|
|
35
|
+
error !== null &&
|
|
36
|
+
"helpText" in error &&
|
|
37
|
+
typeof error.helpText === "string");
|
|
38
|
+
}
|
|
39
|
+
export function isCliValidationError(error) {
|
|
40
|
+
return (errorName(error) === "CliValidationError" &&
|
|
41
|
+
typeof error === "object" &&
|
|
42
|
+
error !== null &&
|
|
43
|
+
"errors" in error &&
|
|
44
|
+
Array.isArray(error.errors) &&
|
|
45
|
+
"helpText" in error &&
|
|
46
|
+
typeof error.helpText === "string");
|
|
47
|
+
}
|
|
48
|
+
export function isPipelineExecutionError(error) {
|
|
49
|
+
return (errorName(error) === "PipelineExecutionError" &&
|
|
50
|
+
typeof error === "object" &&
|
|
51
|
+
error !== null &&
|
|
52
|
+
"result" in error &&
|
|
53
|
+
typeof error.result === "object" &&
|
|
54
|
+
error.result !== null &&
|
|
55
|
+
"errors" in error.result &&
|
|
56
|
+
Array.isArray(error.result.errors));
|
|
57
|
+
}
|
|
58
|
+
/** Map a thrown CLI or pipeline error onto the workbench exit-code family. */
|
|
59
|
+
export function toExitCode(error) {
|
|
60
|
+
if (isCliHelpRequested(error))
|
|
61
|
+
return TUBELESS_WORKBENCH_EXIT_CODE.success;
|
|
62
|
+
if (isCliValidationError(error))
|
|
63
|
+
return TUBELESS_WORKBENCH_EXIT_CODE.validation;
|
|
64
|
+
if (isPipelineExecutionError(error)) {
|
|
65
|
+
const errors = error.result.errors;
|
|
66
|
+
if (errors.length > 0 && errors.every(({ kind }) => kind === "cancellation")) {
|
|
67
|
+
return TUBELESS_WORKBENCH_EXIT_CODE.cancellation;
|
|
68
|
+
}
|
|
69
|
+
if (errors.some(({ phase }) => phase === "planning")) {
|
|
70
|
+
return TUBELESS_WORKBENCH_EXIT_CODE.planning;
|
|
71
|
+
}
|
|
72
|
+
return TUBELESS_WORKBENCH_EXIT_CODE.execution;
|
|
73
|
+
}
|
|
74
|
+
return TUBELESS_WORKBENCH_EXIT_CODE.execution;
|
|
75
|
+
}
|
|
76
|
+
export async function loadPipeline(fileArgument, exportName, io) {
|
|
77
|
+
const filePath = path.resolve(io.cwd, fileArgument);
|
|
78
|
+
try {
|
|
79
|
+
const fileStat = await stat(filePath);
|
|
80
|
+
if (!fileStat.isFile())
|
|
81
|
+
throw new Error(`${filePath} is not a file.`);
|
|
82
|
+
return { pipeline: await loadPipelineModule(filePath, exportName) };
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const exitCode = isDefinitionError(error)
|
|
86
|
+
? TUBELESS_WORKBENCH_EXIT_CODE.definition
|
|
87
|
+
: TUBELESS_WORKBENCH_EXIT_CODE.load;
|
|
88
|
+
io.stderr.write(`Error: ${errorMessage(error)}\n`);
|
|
89
|
+
return { exitCode };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export async function loadPipelineCommand(fileArgument, exportName, io) {
|
|
93
|
+
const filePath = path.resolve(io.cwd, fileArgument);
|
|
94
|
+
try {
|
|
95
|
+
const fileStat = await stat(filePath);
|
|
96
|
+
if (!fileStat.isFile())
|
|
97
|
+
throw new Error(`${filePath} is not a file.`);
|
|
98
|
+
return await loadPipelineCommandModuleWithName(filePath, exportName);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const exitCode = isDefinitionError(error)
|
|
102
|
+
? TUBELESS_WORKBENCH_EXIT_CODE.definition
|
|
103
|
+
: TUBELESS_WORKBENCH_EXIT_CODE.load;
|
|
104
|
+
io.stderr.write(`Error: ${errorMessage(error)}\n`);
|
|
105
|
+
return { exitCode };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export async function loadPlanSource(fileArgument, exportName, io) {
|
|
109
|
+
const filePath = path.resolve(io.cwd, fileArgument);
|
|
110
|
+
try {
|
|
111
|
+
const fileStat = await stat(filePath);
|
|
112
|
+
if (!fileStat.isFile())
|
|
113
|
+
throw new Error(`${filePath} is not a file.`);
|
|
114
|
+
return { source: await loadPlanSourceModule(filePath, exportName) };
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
const exitCode = isDefinitionError(error)
|
|
118
|
+
? TUBELESS_WORKBENCH_EXIT_CODE.definition
|
|
119
|
+
: TUBELESS_WORKBENCH_EXIT_CODE.load;
|
|
120
|
+
io.stderr.write(`Error: ${errorMessage(error)}\n`);
|
|
121
|
+
return { exitCode };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export function writeCommandLine(output, message, ...optionalParams) {
|
|
125
|
+
output.write(`${[message, ...optionalParams].join(" ")}\n`);
|
|
126
|
+
}
|
|
127
|
+
export function commandContext(io, signal, pipelineContext) {
|
|
128
|
+
const context = {
|
|
129
|
+
cwd: io.cwd,
|
|
130
|
+
log: {
|
|
131
|
+
error: (message, ...params) => writeCommandLine(io.stderr, String(message ?? ""), ...params.map((param) => String(param ?? ""))),
|
|
132
|
+
log: (message, ...params) => writeCommandLine(io.stdout, String(message ?? ""), ...params.map((param) => String(param ?? ""))),
|
|
133
|
+
warn: (message, ...params) => writeCommandLine(io.stderr, String(message ?? ""), ...params.map((param) => String(param ?? ""))),
|
|
134
|
+
},
|
|
135
|
+
signal,
|
|
136
|
+
};
|
|
137
|
+
if (pipelineContext)
|
|
138
|
+
context.pipelineContext = pipelineContext;
|
|
139
|
+
return context;
|
|
140
|
+
}
|
|
141
|
+
export function manageWorkbenchSignal(io) {
|
|
142
|
+
if (io.signal) {
|
|
143
|
+
return {
|
|
144
|
+
cleanup: () => { },
|
|
145
|
+
signal: io.signal,
|
|
146
|
+
wasInterrupted: () => io.signal?.aborted === true,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const controller = new AbortController();
|
|
150
|
+
let interrupted = false;
|
|
151
|
+
const onSigint = () => {
|
|
152
|
+
interrupted = true;
|
|
153
|
+
io.stderr.write("SIGINT received; cancelling pipeline work.\n");
|
|
154
|
+
controller.abort();
|
|
155
|
+
};
|
|
156
|
+
process.once("SIGINT", onSigint);
|
|
157
|
+
return {
|
|
158
|
+
cleanup: () => process.removeListener("SIGINT", onSigint),
|
|
159
|
+
signal: controller.signal,
|
|
160
|
+
wasInterrupted: () => interrupted,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=workbench-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-shared.js","sourceRoot":"","sources":["../src/workbench-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Current version of the declarative local-studio configuration contract. */
|
|
2
|
+
export declare const PIPELINE_STUDIO_CONFIG_VERSION: 1;
|
|
3
|
+
export interface PipelineStudioCommandModule {
|
|
4
|
+
/** Command module path, resolved relative to the studio configuration file. */
|
|
5
|
+
file: string;
|
|
6
|
+
/** Select a named definePipelineCommand export when the module has more than one. */
|
|
7
|
+
export?: string;
|
|
8
|
+
/** Optional display-name override. Defaults to the command's generated name. */
|
|
9
|
+
name?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PipelineStudioConfigInput {
|
|
12
|
+
/** Explicitly registered definePipelineCommand modules. */
|
|
13
|
+
commands: readonly PipelineStudioCommandModule[];
|
|
14
|
+
/** Command execution directory, relative to this file. Defaults to this file's directory. */
|
|
15
|
+
cwd?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PipelineStudioConfig {
|
|
18
|
+
readonly commands: readonly PipelineStudioCommandModule[];
|
|
19
|
+
readonly cwd?: string;
|
|
20
|
+
readonly version: typeof PIPELINE_STUDIO_CONFIG_VERSION;
|
|
21
|
+
}
|
|
22
|
+
/** Declare a versioned, dependency-free manifest of commands available to `tubeless ui`. */
|
|
23
|
+
export declare function definePipelineStudio(config: PipelineStudioConfigInput): PipelineStudioConfig;
|
|
24
|
+
/** Runtime guard used by the workbench when selecting an exported studio config. */
|
|
25
|
+
export declare function isPipelineStudioConfig(value: unknown): value is PipelineStudioConfig;
|
|
26
|
+
//# sourceMappingURL=workbench-studio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-studio.d.ts","sourceRoot":"","sources":["../src/workbench-studio.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,eAAO,MAAM,8BAA8B,EAAG,CAAU,CAAC;AAIzD,MAAM,WAAW,2BAA2B;IAC1C,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,2DAA2D;IAC3D,QAAQ,EAAE,SAAS,2BAA2B,EAAE,CAAC;IACjD,6FAA6F;IAC7F,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC1D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,8BAA8B,CAAC;CACzD;AAeD,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,yBAAyB,GAAG,oBAAoB,CAmC5F;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAOpF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** Current version of the declarative local-studio configuration contract. */
|
|
2
|
+
export const PIPELINE_STUDIO_CONFIG_VERSION = 1;
|
|
3
|
+
const PIPELINE_STUDIO_CONFIG_MARKER = Symbol.for("tubeless/pipeline-studio-config/v1");
|
|
4
|
+
function requiredText(value, label) {
|
|
5
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
6
|
+
throw new Error(`${label} must be a non-empty string.`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/** Declare a versioned, dependency-free manifest of commands available to `tubeless ui`. */
|
|
10
|
+
export function definePipelineStudio(config) {
|
|
11
|
+
if (!Array.isArray(config.commands) || config.commands.length === 0) {
|
|
12
|
+
throw new Error("Pipeline studio config must declare at least one command.");
|
|
13
|
+
}
|
|
14
|
+
if (config.cwd !== undefined)
|
|
15
|
+
requiredText(config.cwd, "Pipeline studio cwd");
|
|
16
|
+
const identities = new Set();
|
|
17
|
+
const commands = config.commands.map((command, index) => {
|
|
18
|
+
requiredText(command.file, `Pipeline studio command ${index + 1} file`);
|
|
19
|
+
if (command.export !== undefined) {
|
|
20
|
+
requiredText(command.export, `Pipeline studio command ${index + 1} export`);
|
|
21
|
+
}
|
|
22
|
+
if (command.name !== undefined) {
|
|
23
|
+
requiredText(command.name, `Pipeline studio command ${index + 1} name`);
|
|
24
|
+
}
|
|
25
|
+
const identity = `${command.file}\0${command.export ?? ""}`;
|
|
26
|
+
if (identities.has(identity)) {
|
|
27
|
+
throw new Error(`Pipeline studio command ${JSON.stringify(command.file)}${command.export ? ` export ${JSON.stringify(command.export)}` : ""} is declared more than once.`);
|
|
28
|
+
}
|
|
29
|
+
identities.add(identity);
|
|
30
|
+
const frozenCommand = { file: command.file };
|
|
31
|
+
if (command.export !== undefined)
|
|
32
|
+
frozenCommand.export = command.export;
|
|
33
|
+
if (command.name !== undefined)
|
|
34
|
+
frozenCommand.name = command.name;
|
|
35
|
+
return Object.freeze(frozenCommand);
|
|
36
|
+
});
|
|
37
|
+
const defined = {
|
|
38
|
+
commands: Object.freeze(commands),
|
|
39
|
+
version: PIPELINE_STUDIO_CONFIG_VERSION,
|
|
40
|
+
};
|
|
41
|
+
if (config.cwd !== undefined)
|
|
42
|
+
defined.cwd = config.cwd;
|
|
43
|
+
Object.defineProperty(defined, PIPELINE_STUDIO_CONFIG_MARKER, { value: true });
|
|
44
|
+
return Object.freeze(defined);
|
|
45
|
+
}
|
|
46
|
+
/** Runtime guard used by the workbench when selecting an exported studio config. */
|
|
47
|
+
export function isPipelineStudioConfig(value) {
|
|
48
|
+
if (typeof value !== "object" || value === null)
|
|
49
|
+
return false;
|
|
50
|
+
if (!(PIPELINE_STUDIO_CONFIG_MARKER in value))
|
|
51
|
+
return false;
|
|
52
|
+
// SAFETY: The marker is only installed by definePipelineStudio, which sets version and
|
|
53
|
+
// commands to their declared types, so reading them via a structural view is safe.
|
|
54
|
+
const candidate = value;
|
|
55
|
+
return candidate.version === PIPELINE_STUDIO_CONFIG_VERSION && Array.isArray(candidate.commands);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=workbench-studio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-studio.js","sourceRoot":"","sources":["../src/workbench-studio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workbench-ui.d.ts","sourceRoot":"","sources":["../src/workbench-ui.ts"],"names":[],"mappings":"AAWA,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAiF/B,wBAAsB,KAAK,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAiOxF"}
|