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,84 @@
|
|
|
1
|
+
import type { CliBooleanParam, CliCheckpointConfig, CliCommandDescriptor, CliContext, CliParams, CliParamsSchema, CliStringParam } from "./cli-types.js";
|
|
2
|
+
import { type Pipeline, type PipelineHooks, type PipelinePlan, type PipelineRunOptions } from "./pipeline.js";
|
|
3
|
+
import { type PipelineReporterConfig } from "./reporter-entry.js";
|
|
4
|
+
export type PipelineCliBuiltins = {
|
|
5
|
+
step: CliStringParam & {
|
|
6
|
+
multiple: true;
|
|
7
|
+
};
|
|
8
|
+
target: CliStringParam & {
|
|
9
|
+
multiple: true;
|
|
10
|
+
};
|
|
11
|
+
continueOnError: CliBooleanParam;
|
|
12
|
+
};
|
|
13
|
+
export type PipelineCliValues<TSchema extends CliParamsSchema> = CliParams<TSchema> & {
|
|
14
|
+
step: readonly string[];
|
|
15
|
+
target: readonly string[];
|
|
16
|
+
continueOnError: boolean;
|
|
17
|
+
};
|
|
18
|
+
export type PipelineCliParseResult<TSchema extends CliParamsSchema> = {
|
|
19
|
+
kind: "values";
|
|
20
|
+
values: PipelineCliValues<TSchema>;
|
|
21
|
+
} | {
|
|
22
|
+
kind: "help";
|
|
23
|
+
helpText: string;
|
|
24
|
+
} | {
|
|
25
|
+
kind: "error";
|
|
26
|
+
errors: readonly string[];
|
|
27
|
+
helpText: string;
|
|
28
|
+
};
|
|
29
|
+
/** Selection-only input for a side-effect-free pipeline command plan. */
|
|
30
|
+
export interface PipelineCommandPlanInput {
|
|
31
|
+
dryRun?: boolean;
|
|
32
|
+
step?: readonly string[];
|
|
33
|
+
target?: readonly string[];
|
|
34
|
+
}
|
|
35
|
+
export interface PipelineCommand<TSchema extends CliParamsSchema, TResult> {
|
|
36
|
+
readonly descriptor: CliCommandDescriptor;
|
|
37
|
+
/** Plan without parsing or requiring domain parameters. */
|
|
38
|
+
plan(input?: PipelineCommandPlanInput): PipelinePlan;
|
|
39
|
+
parse(argv?: readonly string[], context?: Partial<CliContext>): PipelineCliParseResult<TSchema>;
|
|
40
|
+
/** Validate structured form values without tokenizing argv. */
|
|
41
|
+
parseValues(values: Record<string, unknown>, context?: Partial<CliContext>): PipelineCliParseResult<TSchema>;
|
|
42
|
+
/** Execute already validated form values. */
|
|
43
|
+
execute(values: PipelineCliValues<TSchema>, context?: Partial<CliContext>): Promise<TResult>;
|
|
44
|
+
run(argv?: readonly string[], context?: Partial<CliContext>): Promise<TResult>;
|
|
45
|
+
main(argv?: readonly string[], context?: Partial<CliContext>): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
export interface PipelineCommandHookContext<TSchema extends CliParamsSchema> {
|
|
48
|
+
context: CliContext;
|
|
49
|
+
values: PipelineCliValues<TSchema>;
|
|
50
|
+
}
|
|
51
|
+
export type PipelineCommandHookSets<TResult> = PipelineHooks<TResult> | readonly PipelineHooks<TResult>[];
|
|
52
|
+
export type PipelineCommandHookConfig<TResult, TSchema extends CliParamsSchema> = PipelineCommandHookSets<TResult> | ((input: PipelineCommandHookContext<TSchema>) => PipelineCommandHookSets<TResult> | undefined);
|
|
53
|
+
type PipelineCommandMapOptions<TOptions extends object, TSchema extends CliParamsSchema> = (values: PipelineCliValues<TSchema>, context: CliContext) => PipelineRunOptions<TOptions> | Promise<PipelineRunOptions<TOptions>>;
|
|
54
|
+
type DefaultPipelineCommandOptions<TSchema extends CliParamsSchema> = Omit<PipelineCliValues<TSchema>, "continueOnError" | "dryRun" | "resume" | "step" | "target">;
|
|
55
|
+
type CanDefaultPipelineCommandOptions<TOptions extends object, TSchema extends CliParamsSchema> = DefaultPipelineCommandOptions<TSchema> extends TOptions ? Exclude<keyof TSchema, keyof TOptions> extends never ? true : false : false;
|
|
56
|
+
interface DefinePipelineCommandConfigBase<TResult, TSchema extends CliParamsSchema> {
|
|
57
|
+
/** Defaults to pipeline.id. */
|
|
58
|
+
name?: string;
|
|
59
|
+
description?: string;
|
|
60
|
+
/** Extra flags beyond the command and pipeline built-ins. */
|
|
61
|
+
params?: TSchema;
|
|
62
|
+
/** Extra parameter keys accepted in positional order. */
|
|
63
|
+
positionals?: readonly (keyof TSchema & string)[];
|
|
64
|
+
checkpoint?: CliCheckpointConfig;
|
|
65
|
+
/** Additional lifecycle hooks, or a factory resolved from parsed values and CLI context. */
|
|
66
|
+
hooks?: PipelineCommandHookConfig<TResult, TSchema>;
|
|
67
|
+
/** Configure plain/interactive reporting, or disable it. Defaults to automatic mode. */
|
|
68
|
+
reporter?: false | PipelineReporterConfig;
|
|
69
|
+
/** Print domain-specific result lines after a successful run. */
|
|
70
|
+
summarize?(result: TResult, values: PipelineCliValues<TSchema>, context: CliContext): readonly string[] | void;
|
|
71
|
+
validate?(values: PipelineCliValues<TSchema>, context: CliContext): string[] | void;
|
|
72
|
+
}
|
|
73
|
+
/** Configuration for a typed pipeline command. Mapping is optional only for compatible flags. */
|
|
74
|
+
export type DefinePipelineCommandConfig<TOptions extends object, TResult, TSchema extends CliParamsSchema> = DefinePipelineCommandConfigBase<TResult, TSchema> & (CanDefaultPipelineCommandOptions<TOptions, TSchema> extends true ? {
|
|
75
|
+
/** Override the default same-name flag-to-option mapping. */
|
|
76
|
+
mapOptions?: PipelineCommandMapOptions<TOptions, TSchema>;
|
|
77
|
+
} : {
|
|
78
|
+
/** Required when parsed flags do not already satisfy the pipeline's domain options. */
|
|
79
|
+
mapOptions: PipelineCommandMapOptions<TOptions, TSchema>;
|
|
80
|
+
});
|
|
81
|
+
/** Turn a typed pipeline into a command with selection, plan, and reporting defaults. */
|
|
82
|
+
export declare function definePipelineCommand<TOptions extends object, TResult, const TSchema extends CliParamsSchema = {}>(pipeline: Pipeline<TOptions, TResult>, config: DefinePipelineCommandConfig<NoInfer<TOptions>, TResult, TSchema>): PipelineCommand<TSchema, TResult>;
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=cli-pipeline-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-pipeline-command.d.ts","sourceRoot":"","sources":["../src/cli-pipeline-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { createCommand } from "./cli-command.js";
|
|
2
|
+
import { flagName } from "./cli-parser.js";
|
|
3
|
+
import { markPipelineCommand } from "./pipeline-command-marker.js";
|
|
4
|
+
import {} from "./pipeline.js";
|
|
5
|
+
import { createPipelineReporter } from "./reporter-entry.js";
|
|
6
|
+
import { TUBELESS_WORKBENCH_EXIT_CODE } from "./workbench-shared.js";
|
|
7
|
+
const PIPELINE_COMMAND_KEYS = new Set(["continueOnError", "plan", "step", "target"]);
|
|
8
|
+
const PIPELINE_COMMAND_FLAGS = new Set(["continue-on-error", "plan", "step", "target"]);
|
|
9
|
+
function assertNoPipelineCommandConflicts(params) {
|
|
10
|
+
for (const [key, param] of Object.entries(params)) {
|
|
11
|
+
if (PIPELINE_COMMAND_KEYS.has(key)) {
|
|
12
|
+
throw new Error(`"${key}" is a reserved parameter provided automatically by pipeline commands; remove it from params.`);
|
|
13
|
+
}
|
|
14
|
+
const flag = flagName(key, param);
|
|
15
|
+
if (PIPELINE_COMMAND_FLAGS.has(flag)) {
|
|
16
|
+
throw new Error(`--${flag} is a reserved flag provided automatically by pipeline commands; remove "${key}" from params or give it a different flag name.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function normalizePipelineCliValues(values) {
|
|
21
|
+
// SAFETY: `PipelineCliValues<TSchema>` is `CliParams<TSchema>` plus the builtin
|
|
22
|
+
// `step`/`target`/`continueOnError` keys, all of which `CliParams<PipelineCliBuiltins & TSchema>`
|
|
23
|
+
// already provides, so the runtime shape matches the target type.
|
|
24
|
+
const pipelineValues = values;
|
|
25
|
+
const { continueOnError, step, target } = pipelineValues;
|
|
26
|
+
return {
|
|
27
|
+
...pipelineValues,
|
|
28
|
+
continueOnError,
|
|
29
|
+
step,
|
|
30
|
+
target: target ?? [],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function normalizePipelineHookSets(hooks) {
|
|
34
|
+
if (!hooks)
|
|
35
|
+
return [];
|
|
36
|
+
// SAFETY: a non-array `PipelineCommandHookSets` is always a single `PipelineHooks`.
|
|
37
|
+
return Array.isArray(hooks) ? [...hooks] : [hooks];
|
|
38
|
+
}
|
|
39
|
+
function isHookConfigFunction(config) {
|
|
40
|
+
return typeof config === "function";
|
|
41
|
+
}
|
|
42
|
+
function defaultPipelineCommandOptions(values) {
|
|
43
|
+
const { continueOnError, dryRun, resume, step, target, ...domainValues } = values;
|
|
44
|
+
return domainValues;
|
|
45
|
+
}
|
|
46
|
+
/** Turn a typed pipeline into a command with selection, plan, and reporting defaults. */
|
|
47
|
+
export function definePipelineCommand(pipeline, config) {
|
|
48
|
+
// SAFETY: `config.params` is declared as `TSchema`; the empty-object fallback is only
|
|
49
|
+
// reached when the caller omits `params`, which is exactly the `{}` schema case.
|
|
50
|
+
const userParams = config.params ?? {};
|
|
51
|
+
assertNoPipelineCommandConflicts(userParams);
|
|
52
|
+
const targetFlagEnabled = pipeline.targetIds.length > 0;
|
|
53
|
+
const bridgeParams = {
|
|
54
|
+
step: {
|
|
55
|
+
type: "string",
|
|
56
|
+
multiple: true,
|
|
57
|
+
choices: pipeline.stepIds,
|
|
58
|
+
description: `Run exactly this step. Steps: ${pipeline.stepIds.join(", ")}`,
|
|
59
|
+
},
|
|
60
|
+
continueOnError: {
|
|
61
|
+
type: "boolean",
|
|
62
|
+
description: "Continue independent work after a step fails.",
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
if (targetFlagEnabled) {
|
|
66
|
+
bridgeParams.target = {
|
|
67
|
+
type: "string",
|
|
68
|
+
multiple: true,
|
|
69
|
+
choices: pipeline.targetIds,
|
|
70
|
+
description: `Run this declared target and its prerequisites. Targets: ${pipeline.targetIds.join(", ")}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// SAFETY: `bridgeParams` supplies the `PipelineCliBuiltins` keys and `userParams` is
|
|
74
|
+
// `TSchema`, so the merged object satisfies `PipelineCliBuiltins & TSchema`.
|
|
75
|
+
const params = { ...bridgeParams, ...userParams };
|
|
76
|
+
const commandConfig = {
|
|
77
|
+
name: config.name ?? pipeline.id,
|
|
78
|
+
description: config.description,
|
|
79
|
+
params,
|
|
80
|
+
positionals: config.positionals,
|
|
81
|
+
checkpoint: config.checkpoint,
|
|
82
|
+
validate: (values, context) => {
|
|
83
|
+
const pipelineValues = normalizePipelineCliValues(values);
|
|
84
|
+
const errors = config.validate?.(pipelineValues, context) ?? [];
|
|
85
|
+
if (pipelineValues.step.length > 0 && pipelineValues.target.length > 0) {
|
|
86
|
+
return ["--step and --target cannot be used together.", ...errors];
|
|
87
|
+
}
|
|
88
|
+
return errors.length > 0 ? errors : undefined;
|
|
89
|
+
},
|
|
90
|
+
run: async (values, cliContext) => {
|
|
91
|
+
const pipelineValues = normalizePipelineCliValues(values);
|
|
92
|
+
let mapped;
|
|
93
|
+
if (config.mapOptions) {
|
|
94
|
+
mapped = await config.mapOptions(pipelineValues, cliContext);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// SAFETY: `defaultPipelineCommandOptions` returns exactly the domain options the
|
|
98
|
+
// `CanDefaultPipelineCommandOptions` constraint guarantees map to `TOptions`.
|
|
99
|
+
mapped = defaultPipelineCommandOptions(pipelineValues);
|
|
100
|
+
}
|
|
101
|
+
const controls = {
|
|
102
|
+
dryRun: values.dryRun,
|
|
103
|
+
continueOnError: pipelineValues.continueOnError,
|
|
104
|
+
};
|
|
105
|
+
if (pipelineValues.step.length > 0) {
|
|
106
|
+
controls.stepIds = pipelineValues.step;
|
|
107
|
+
}
|
|
108
|
+
if (targetFlagEnabled && pipelineValues.target.length > 0) {
|
|
109
|
+
controls.targets = pipelineValues.target;
|
|
110
|
+
}
|
|
111
|
+
const reporter = config.reporter === false
|
|
112
|
+
? undefined
|
|
113
|
+
: createPipelineReporter({ log: cliContext.log, ...(config.reporter ?? {}) });
|
|
114
|
+
const runtimeContext = reporter ? { ...cliContext, log: reporter.log } : cliContext;
|
|
115
|
+
let result;
|
|
116
|
+
try {
|
|
117
|
+
const configuredHooks = isHookConfigFunction(config.hooks)
|
|
118
|
+
? config.hooks({ context: runtimeContext, values: pipelineValues })
|
|
119
|
+
: config.hooks;
|
|
120
|
+
const hooks = [
|
|
121
|
+
...normalizePipelineHookSets(cliContext.pipelineContext?.hooks),
|
|
122
|
+
...(reporter ? [reporter.hooks] : []),
|
|
123
|
+
...normalizePipelineHookSets(configuredHooks),
|
|
124
|
+
];
|
|
125
|
+
// SAFETY: `mapped` is `TOptions` and `controls` is `PipelineRunControls`, so the
|
|
126
|
+
// merged object satisfies `PipelineRunOptions<TOptions>`.
|
|
127
|
+
const options = { ...mapped, ...controls };
|
|
128
|
+
result = await pipeline.runOrThrow(options, {
|
|
129
|
+
...cliContext.pipelineContext,
|
|
130
|
+
cwd: runtimeContext.cwd,
|
|
131
|
+
log: runtimeContext.log,
|
|
132
|
+
hooks: hooks.length > 0 ? hooks : undefined,
|
|
133
|
+
signal: runtimeContext.signal,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
reporter?.dispose();
|
|
138
|
+
}
|
|
139
|
+
for (const line of config.summarize?.(result, pipelineValues, cliContext) ?? []) {
|
|
140
|
+
cliContext.log.log(line);
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
const command = createCommand(commandConfig, undefined, {
|
|
146
|
+
validation: TUBELESS_WORKBENCH_EXIT_CODE.validation,
|
|
147
|
+
});
|
|
148
|
+
function parse(argv = process.argv.slice(2), contextOverrides) {
|
|
149
|
+
const result = command.parse(argv, contextOverrides);
|
|
150
|
+
return result.kind === "values"
|
|
151
|
+
? { kind: "values", values: normalizePipelineCliValues(result.values) }
|
|
152
|
+
: result;
|
|
153
|
+
}
|
|
154
|
+
function plan(input = {}) {
|
|
155
|
+
const controls = {
|
|
156
|
+
dryRun: input.dryRun === true,
|
|
157
|
+
};
|
|
158
|
+
if (input.step && input.step.length > 0) {
|
|
159
|
+
controls.stepIds = input.step;
|
|
160
|
+
}
|
|
161
|
+
if (input.target && input.target.length > 0) {
|
|
162
|
+
controls.targets = input.target;
|
|
163
|
+
}
|
|
164
|
+
return pipeline.plan(controls);
|
|
165
|
+
}
|
|
166
|
+
function parseValues(values, contextOverrides) {
|
|
167
|
+
const result = command.parseValues(values, contextOverrides);
|
|
168
|
+
return result.kind === "values"
|
|
169
|
+
? { kind: "values", values: normalizePipelineCliValues(result.values) }
|
|
170
|
+
: result;
|
|
171
|
+
}
|
|
172
|
+
return markPipelineCommand({
|
|
173
|
+
descriptor: command.descriptor,
|
|
174
|
+
execute: (values, contextOverrides) =>
|
|
175
|
+
// SAFETY: `execute` receives `PipelineCliValues<TSchema>` from the public interface,
|
|
176
|
+
// which is a subtype of `CliParams<PipelineCliBuiltins & TSchema>`.
|
|
177
|
+
command.execute(values, contextOverrides),
|
|
178
|
+
parse,
|
|
179
|
+
parseValues,
|
|
180
|
+
plan,
|
|
181
|
+
run: command.run,
|
|
182
|
+
main: command.main,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=cli-pipeline-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-pipeline-command.js","sourceRoot":"","sources":["../src/cli-pipeline-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import type { CheckpointStore } from "./checkpoint.js";
|
|
2
|
+
import type { PipelineContext, PipelineLogger } from "./pipeline.js";
|
|
3
|
+
/**
|
|
4
|
+
* Typed command-line entry points for scripts, mirroring how `definePipeline` turns a
|
|
5
|
+
* declarative step list into a runnable pipeline: declare a flag schema once and get a
|
|
6
|
+
* fully-typed, validated `values` object handed to `run`, instead of each script hand-
|
|
7
|
+
* rolling its own `process.argv` scanning and `as` casts.
|
|
8
|
+
*/
|
|
9
|
+
export type CliParamType = "string" | "number" | "boolean" | "path";
|
|
10
|
+
interface CliParamBase {
|
|
11
|
+
/** Shown next to the flag in generated `--help` output. */
|
|
12
|
+
description?: string;
|
|
13
|
+
/** Overrides the derived `--flag-name`; defaults to the kebab-case of the schema key. */
|
|
14
|
+
flag?: string;
|
|
15
|
+
/** Optional one-letter alias, for example `short: "v"` enables `-v`. */
|
|
16
|
+
short?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Optional environment-variable fallback. Explicit argv values always win;
|
|
19
|
+
* the environment value is validated like argv but never echoed in errors.
|
|
20
|
+
*/
|
|
21
|
+
env?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface CliStringParam extends CliParamBase {
|
|
24
|
+
type: "string";
|
|
25
|
+
choices?: readonly string[];
|
|
26
|
+
default?: string;
|
|
27
|
+
optional?: boolean;
|
|
28
|
+
/** Repeatable: `--flag a --flag b` accumulates into `readonly string[]`, `[]` when absent. Cannot combine with `default`. */
|
|
29
|
+
multiple?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface CliNumberParam extends CliParamBase {
|
|
32
|
+
type: "number";
|
|
33
|
+
default?: number;
|
|
34
|
+
optional?: boolean;
|
|
35
|
+
integer?: boolean;
|
|
36
|
+
min?: number;
|
|
37
|
+
max?: number;
|
|
38
|
+
/** Repeatable: `--flag 1 --flag 2` accumulates into `readonly number[]`, `[]` when absent. Cannot combine with `default`. */
|
|
39
|
+
multiple?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface CliBooleanParam extends CliParamBase {
|
|
42
|
+
type: "boolean";
|
|
43
|
+
/** Defaults to `false`. A bare `--flag` sets `true`; `--no-flag` sets `false`. */
|
|
44
|
+
default?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface CliPathParam extends CliParamBase {
|
|
47
|
+
type: "path";
|
|
48
|
+
/** Relative defaults and values are resolved against `context.cwd`, like `definePaths`. */
|
|
49
|
+
default?: string;
|
|
50
|
+
optional?: boolean;
|
|
51
|
+
/** Validates the resolved path exists before `run` is called. */
|
|
52
|
+
mustExist?: boolean;
|
|
53
|
+
/** Only checked when `mustExist` is true; asserts the resolved path's kind. */
|
|
54
|
+
kind?: "file" | "directory";
|
|
55
|
+
}
|
|
56
|
+
export type CliParam = CliStringParam | CliNumberParam | CliBooleanParam | CliPathParam;
|
|
57
|
+
export type CliParamsSchema = Record<string, CliParam>;
|
|
58
|
+
/** JSON-safe description of one validated command parameter for non-terminal clients. */
|
|
59
|
+
export interface CliParameterDescriptor {
|
|
60
|
+
readonly choices?: readonly string[];
|
|
61
|
+
readonly default?: string | number | boolean;
|
|
62
|
+
readonly description?: string;
|
|
63
|
+
readonly environment?: string;
|
|
64
|
+
readonly flag: string;
|
|
65
|
+
readonly integer?: boolean;
|
|
66
|
+
readonly key: string;
|
|
67
|
+
readonly max?: number;
|
|
68
|
+
readonly min?: number;
|
|
69
|
+
readonly multiple: boolean;
|
|
70
|
+
readonly mustExist?: boolean;
|
|
71
|
+
readonly pathKind?: "directory" | "file";
|
|
72
|
+
readonly positional: boolean;
|
|
73
|
+
readonly required: boolean;
|
|
74
|
+
readonly short?: string;
|
|
75
|
+
readonly type: CliParamType;
|
|
76
|
+
}
|
|
77
|
+
/** Immutable, presentation-neutral command contract shared by CLI and UI adapters. */
|
|
78
|
+
export interface CliCommandDescriptor {
|
|
79
|
+
readonly description?: string;
|
|
80
|
+
readonly name: string;
|
|
81
|
+
readonly parameters: readonly CliParameterDescriptor[];
|
|
82
|
+
}
|
|
83
|
+
type CliScalarStringValue<P extends CliParam> = P extends {
|
|
84
|
+
choices: readonly (infer TChoice extends string)[];
|
|
85
|
+
} ? TChoice : string;
|
|
86
|
+
type CliParamValue<P extends CliParam> = P extends {
|
|
87
|
+
type: "string";
|
|
88
|
+
} ? P extends {
|
|
89
|
+
multiple: true;
|
|
90
|
+
} ? readonly CliScalarStringValue<P>[] : CliScalarStringValue<P> : P extends {
|
|
91
|
+
type: "number";
|
|
92
|
+
} ? P extends {
|
|
93
|
+
multiple: true;
|
|
94
|
+
} ? readonly number[] : number : P extends {
|
|
95
|
+
type: "boolean";
|
|
96
|
+
} ? boolean : P extends {
|
|
97
|
+
type: "path";
|
|
98
|
+
} ? string : never;
|
|
99
|
+
/**
|
|
100
|
+
* A field is optional in the parsed output only when it's explicitly marked `optional:
|
|
101
|
+
* true` (booleans never are — an absent boolean flag just means `false`). A field with a
|
|
102
|
+
* `default` is also always present at runtime, but that's already covered: schemas
|
|
103
|
+
* shouldn't combine `default` with `optional: true`, and if one does, the parsed type is
|
|
104
|
+
* merely wider than necessary (`T | undefined` instead of `T`), never wrong.
|
|
105
|
+
*/
|
|
106
|
+
type CliParamIsOptional<P extends CliParam> = P extends {
|
|
107
|
+
type: "boolean";
|
|
108
|
+
} ? false : P extends {
|
|
109
|
+
multiple: true;
|
|
110
|
+
} ? false : P extends {
|
|
111
|
+
optional: true;
|
|
112
|
+
} ? true : false;
|
|
113
|
+
type RequiredCliParams<TSchema extends CliParamsSchema> = {
|
|
114
|
+
[K in keyof TSchema as CliParamIsOptional<TSchema[K]> extends true ? never : K]: CliParamValue<TSchema[K]>;
|
|
115
|
+
};
|
|
116
|
+
type OptionalCliParams<TSchema extends CliParamsSchema> = {
|
|
117
|
+
[K in keyof TSchema as CliParamIsOptional<TSchema[K]> extends true ? K : never]?: CliParamValue<TSchema[K]>;
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Every command's parsed values include `dryRun` and `resume`, whether or not `TSchema`
|
|
121
|
+
* declares them. `resume` is `false` unless `--resume` is passed or `checkpoint.defaultResume`
|
|
122
|
+
* is `true`; it's meaningful even without `checkpoint` configured — a command can implement
|
|
123
|
+
* its own "is this done" check and just read `values.resume` directly.
|
|
124
|
+
*/
|
|
125
|
+
export type CliParams<TSchema extends CliParamsSchema> = {
|
|
126
|
+
dryRun: boolean;
|
|
127
|
+
resume: boolean;
|
|
128
|
+
} & RequiredCliParams<TSchema> & OptionalCliParams<TSchema>;
|
|
129
|
+
export interface CliContext {
|
|
130
|
+
cwd: string;
|
|
131
|
+
/** Environment used for `param.env` fallbacks. Defaults to `process.env`. */
|
|
132
|
+
env?: NodeJS.ProcessEnv;
|
|
133
|
+
log: PipelineLogger;
|
|
134
|
+
/** Optional executor-only context used when this command runs a pipeline. */
|
|
135
|
+
pipelineContext?: Omit<PipelineContext, "cwd" | "log" | "signal">;
|
|
136
|
+
/** Optional caller-owned cancellation signal forwarded to command work. */
|
|
137
|
+
signal?: AbortSignal;
|
|
138
|
+
/** Present whenever the command's `checkpoint` config is set; see `CliCheckpointConfig`. */
|
|
139
|
+
checkpoint?: CheckpointStore;
|
|
140
|
+
}
|
|
141
|
+
export type CliParseResult<TSchema extends CliParamsSchema> = {
|
|
142
|
+
kind: "values";
|
|
143
|
+
values: CliParams<TSchema>;
|
|
144
|
+
} | {
|
|
145
|
+
kind: "help";
|
|
146
|
+
helpText: string;
|
|
147
|
+
} | {
|
|
148
|
+
kind: "error";
|
|
149
|
+
errors: readonly string[];
|
|
150
|
+
helpText: string;
|
|
151
|
+
};
|
|
152
|
+
export declare class CliValidationError extends Error {
|
|
153
|
+
readonly errors: readonly string[];
|
|
154
|
+
readonly helpText: string;
|
|
155
|
+
constructor(errors: readonly string[], helpText: string);
|
|
156
|
+
}
|
|
157
|
+
export declare class CliHelpRequested extends Error {
|
|
158
|
+
readonly helpText: string;
|
|
159
|
+
constructor(helpText: string);
|
|
160
|
+
}
|
|
161
|
+
export interface CliCheckpointConfig {
|
|
162
|
+
/** Relative paths resolve against `context.cwd`, like `CliPathParam`. */
|
|
163
|
+
path: string;
|
|
164
|
+
/**
|
|
165
|
+
* Defaults to `true`: a fully successful, non-dry-run `run` clears the checkpoint —
|
|
166
|
+
* the one-shot resumable-job pattern (start fresh next time). Set `false` for an
|
|
167
|
+
* incrementally-growing "done" set (e.g. entity enrichment) that must never auto-clear,
|
|
168
|
+
* since clearing it would cause already-processed items to be reprocessed.
|
|
169
|
+
*/
|
|
170
|
+
clearOnSuccess?: boolean;
|
|
171
|
+
/**
|
|
172
|
+
* Defaults to `false`: start fresh unless `--resume` is passed. Set `true` to always
|
|
173
|
+
* resume by default (skip already-recorded items every run); `--no-resume` is the free
|
|
174
|
+
* opt-out, since boolean flags already support `--no-<flag>` negation.
|
|
175
|
+
*/
|
|
176
|
+
defaultResume?: boolean;
|
|
177
|
+
}
|
|
178
|
+
export interface CliCommandConfig<TSchema extends CliParamsSchema, TResult> {
|
|
179
|
+
/** Shown in generated usage text; defaults to the running script's file name. */
|
|
180
|
+
name?: string;
|
|
181
|
+
description?: string;
|
|
182
|
+
/** `dryRun`/`--dry-run` and `-h`/`--help` are provided automatically; don't redeclare them. */
|
|
183
|
+
params: TSchema;
|
|
184
|
+
/**
|
|
185
|
+
* Schema keys accepted in positional order. Flags for an earlier positional
|
|
186
|
+
* let the next positional fill the next unset field; a repeatable positional
|
|
187
|
+
* must be last.
|
|
188
|
+
*/
|
|
189
|
+
positionals?: readonly (keyof TSchema & string)[];
|
|
190
|
+
/**
|
|
191
|
+
* Opts into a managed checkpoint file. Adds a reserved `--resume`/`--no-resume` flag
|
|
192
|
+
* (also don't redeclare a `resume` param) and populates `context.checkpoint` before
|
|
193
|
+
* `run` is called: resolved fresh (existing file cleared) unless resuming, and cleared
|
|
194
|
+
* again after a successful non-dry-run unless `clearOnSuccess` is `false`.
|
|
195
|
+
*/
|
|
196
|
+
checkpoint?: CliCheckpointConfig;
|
|
197
|
+
/** Runs after every field passes its own validation; return error messages to reject. */
|
|
198
|
+
validate?(values: CliParams<TSchema>, context: CliContext): string[] | void;
|
|
199
|
+
run(values: CliParams<TSchema>, context: CliContext): TResult | Promise<TResult>;
|
|
200
|
+
}
|
|
201
|
+
export interface CliCommand<TSchema extends CliParamsSchema, TResult> {
|
|
202
|
+
/** Structured schema metadata for adapters that should not parse generated help text. */
|
|
203
|
+
readonly descriptor: CliCommandDescriptor;
|
|
204
|
+
/** Pure: parses and validates without calling `run` or touching the process. */
|
|
205
|
+
parse(argv?: readonly string[], context?: Partial<CliContext>): CliParseResult<TSchema>;
|
|
206
|
+
/** Validates structured parameter values without tokenizing command-line arguments. */
|
|
207
|
+
parseValues(values: Record<string, unknown>, context?: Partial<CliContext>): CliParseResult<TSchema>;
|
|
208
|
+
/** Calls `run` from already validated parameter values. */
|
|
209
|
+
execute(values: CliParams<TSchema>, context?: Partial<CliContext>): Promise<TResult>;
|
|
210
|
+
/** Parses and calls `run`; throws `CliValidationError`/`CliHelpRequested` instead of running it. */
|
|
211
|
+
run(argv?: readonly string[], context?: Partial<CliContext>): Promise<TResult>;
|
|
212
|
+
/**
|
|
213
|
+
* Entry point for `if (import.meta.main) void command.main();`. Prints help/errors and
|
|
214
|
+
* sets `process.exitCode` — never calls `process.exit`, so buffered output still flushes
|
|
215
|
+
* — instead of throwing.
|
|
216
|
+
*/
|
|
217
|
+
main(argv?: readonly string[], context?: Partial<CliContext>): Promise<void>;
|
|
218
|
+
}
|
|
219
|
+
export {};
|
|
220
|
+
//# sourceMappingURL=cli-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-types.d.ts","sourceRoot":"","sources":["../src/cli-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class CliValidationError extends Error {
|
|
2
|
+
errors;
|
|
3
|
+
helpText;
|
|
4
|
+
constructor(errors, helpText) {
|
|
5
|
+
super(`Invalid command-line arguments:\n${errors.map((error) => ` - ${error}`).join("\n")}`);
|
|
6
|
+
this.errors = errors;
|
|
7
|
+
this.helpText = helpText;
|
|
8
|
+
this.name = "CliValidationError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class CliHelpRequested extends Error {
|
|
12
|
+
helpText;
|
|
13
|
+
constructor(helpText) {
|
|
14
|
+
super(helpText);
|
|
15
|
+
this.helpText = helpText;
|
|
16
|
+
this.name = "CliHelpRequested";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=cli-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-types.js","sourceRoot":"","sources":["../src/cli-types.ts"],"names":[],"mappings":"AA2KA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEhC,MAAM;IACN,QAAQ;IAFnB,YACW,MAAyB,EACzB,QAAgB;QAEzB,KAAK,CAAC,oCAAoC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;sBAHrF,MAAM;wBACN,QAAQ;QAGjB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACpB,QAAQ;IAA7B,YAAqB,QAAgB;QACnC,KAAK,CAAC,QAAQ,CAAC,CAAC;wBADG,QAAQ;QAE3B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { CliHelpRequested, CliValidationError, type CliBooleanParam, type CliCheckpointConfig, type CliCommand, type CliCommandConfig, type CliCommandDescriptor, type CliContext, type CliNumberParam, type CliParam, type CliParameterDescriptor, type CliParams, type CliParamsSchema, type CliParamType, type CliParseResult, type CliPathParam, type CliStringParam, } from "./cli-types.js";
|
|
2
|
+
export { defineCommand } from "./cli-command.js";
|
|
3
|
+
export { definePipelineCommand, type DefinePipelineCommandConfig, type PipelineCliBuiltins, type PipelineCliParseResult, type PipelineCliValues, type PipelineCommand, type PipelineCommandHookConfig, type PipelineCommandHookContext, type PipelineCommandHookSets, type PipelineCommandPlanInput, } from "./cli-pipeline-command.js";
|
|
4
|
+
export { normalizeMultiSelectChoices, parseMultiSelectInput, promptMultiSelect, type MultiSelectChoice, type MultiSelectResult, type ParseMultiSelectInputOptions, type PromptMultiSelectOptions, } from "./prompt-select.js";
|
|
5
|
+
export { TUBELESS_WORKBENCH_EXIT_CODE } from "./workbench-shared.js";
|
|
6
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,qBAAqB,EACrB,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACrB,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { CliHelpRequested, CliValidationError, } from "./cli-types.js";
|
|
2
|
+
export { defineCommand } from "./cli-command.js";
|
|
3
|
+
export { definePipelineCommand, } from "./cli-pipeline-command.js";
|
|
4
|
+
export { normalizeMultiSelectChoices, parseMultiSelectInput, promptMultiSelect, } from "./prompt-select.js";
|
|
5
|
+
export { TUBELESS_WORKBENCH_EXIT_CODE } from "./workbench-shared.js";
|
|
6
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GAgBnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,qBAAqB,GAUtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACrB,iBAAiB,GAKlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/env.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlE"}
|
package/dist/env.js
ADDED
package/dist/env.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,MAAc;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,oBAAoB,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../src/file-utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAkBhE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAM/C;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG9C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
export function writeJson(filePath, value) {
|
|
4
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
5
|
+
// Write to a sibling temp file and rename over the destination rather than
|
|
6
|
+
// writeFileSync-ing the target directly: a crash mid-write would otherwise
|
|
7
|
+
// leave truncated JSON. Rename is atomic on the same filesystem (same pattern
|
|
8
|
+
// as openCheckpoint flush).
|
|
9
|
+
const tmpPath = `${filePath}.tmp-${process.pid}`;
|
|
10
|
+
try {
|
|
11
|
+
fs.writeFileSync(tmpPath, `${JSON.stringify(value, null, 2)}\n`);
|
|
12
|
+
fs.renameSync(tmpPath, filePath);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
try {
|
|
16
|
+
fs.rmSync(tmpPath, { force: true });
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Best-effort cleanup; surface the original write/rename error.
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function readJson(filePath) {
|
|
25
|
+
// SAFETY: the caller's type parameter T is the contract for the file's
|
|
26
|
+
// contents; the file is expected to hold JSON matching T (files written by
|
|
27
|
+
// writeJson round-trip). JSON.parse returns `any`, so the assertion only
|
|
28
|
+
// documents the caller's guarantee — it performs no runtime narrowing.
|
|
29
|
+
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
30
|
+
}
|
|
31
|
+
export function resetDir(dirPath) {
|
|
32
|
+
fs.rmSync(dirPath, { recursive: true, force: true });
|
|
33
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=file-utils.js.map
|