@db-lyon/flowkit 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +283 -0
- package/dist/config/schema.d.ts +0 -21
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +2 -4
- package/dist/config/schema.js.map +1 -1
- package/dist/flow/runner.d.ts +2 -3
- package/dist/flow/runner.d.ts.map +1 -1
- package/dist/flow/runner.js +6 -35
- package/dist/flow/runner.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/task/base-task.d.ts +13 -0
- package/dist/task/base-task.d.ts.map +1 -1
- package/dist/task/base-task.js +21 -0
- package/dist/task/base-task.js.map +1 -1
- package/dist/task/index.d.ts +2 -0
- package/dist/task/index.d.ts.map +1 -1
- package/dist/task/index.js +1 -0
- package/dist/task/index.js.map +1 -1
- package/dist/task/registry.d.ts +22 -0
- package/dist/task/registry.d.ts.map +1 -1
- package/dist/task/registry.js +32 -0
- package/dist/task/registry.js.map +1 -1
- package/dist/task/shell-task.d.ts +24 -0
- package/dist/task/shell-task.d.ts.map +1 -0
- package/dist/task/shell-task.js +45 -0
- package/dist/task/shell-task.js.map +1 -0
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
# @db-lyon/flowkit
|
|
2
|
+
|
|
3
|
+
YAML-configured task and flow orchestration engine for Node.js.
|
|
4
|
+
|
|
5
|
+
Define reusable **tasks** and compose them into **flows** using declarative YAML. Flowkit handles config layering, task resolution, sequential execution, nested flows, lifecycle hooks, and more.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @db-lyon/flowkit
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Requires Node.js >= 20.
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
**1. Define your config** (`pipeline.yml`):
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
tasks:
|
|
21
|
+
build:
|
|
22
|
+
class_path: tasks.Build
|
|
23
|
+
description: Compile the project
|
|
24
|
+
options:
|
|
25
|
+
target: production
|
|
26
|
+
|
|
27
|
+
test:
|
|
28
|
+
class_path: tasks.Test
|
|
29
|
+
description: Run the test suite
|
|
30
|
+
|
|
31
|
+
deploy:
|
|
32
|
+
class_path: tasks.Deploy
|
|
33
|
+
description: Deploy artifacts
|
|
34
|
+
|
|
35
|
+
flows:
|
|
36
|
+
ci:
|
|
37
|
+
description: Build, test, deploy
|
|
38
|
+
steps:
|
|
39
|
+
1:
|
|
40
|
+
task: build
|
|
41
|
+
2:
|
|
42
|
+
task: test
|
|
43
|
+
3:
|
|
44
|
+
task: deploy
|
|
45
|
+
options:
|
|
46
|
+
environment: staging
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**2. Create a task** (`tasks/Build.ts`):
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import { BaseTask, type TaskResult } from '@db-lyon/flowkit';
|
|
53
|
+
|
|
54
|
+
interface BuildOptions {
|
|
55
|
+
target: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export default class Build extends BaseTask<BuildOptions> {
|
|
59
|
+
get taskName() { return 'build'; }
|
|
60
|
+
|
|
61
|
+
protected validate() {
|
|
62
|
+
if (!this.options.target) throw new Error('target is required');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async execute(): Promise<TaskResult> {
|
|
66
|
+
this.logger.info(`Building for ${this.options.target}`);
|
|
67
|
+
// ... do work ...
|
|
68
|
+
return { success: true, data: { target: this.options.target } };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**3. Run it**:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import {
|
|
77
|
+
loadConfig,
|
|
78
|
+
EngineConfigSchema,
|
|
79
|
+
TaskRegistry,
|
|
80
|
+
FlowRunner,
|
|
81
|
+
} from '@db-lyon/flowkit';
|
|
82
|
+
|
|
83
|
+
const { config } = loadConfig({
|
|
84
|
+
filename: 'pipeline.yml',
|
|
85
|
+
schema: EngineConfigSchema,
|
|
86
|
+
configDir: './config',
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const registry = new TaskRegistry();
|
|
90
|
+
// Tasks with class_path like "tasks.Build" are resolved dynamically
|
|
91
|
+
// from the filesystem (tasks/Build.ts), or register them explicitly:
|
|
92
|
+
// registry.register('build', Build);
|
|
93
|
+
|
|
94
|
+
const runner = new FlowRunner({
|
|
95
|
+
tasks: config.tasks,
|
|
96
|
+
flows: config.flows,
|
|
97
|
+
registry,
|
|
98
|
+
context: { logger: console },
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
const result = await runner.run({ flowName: 'ci' });
|
|
102
|
+
console.log(result.success); // true
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Features
|
|
106
|
+
|
|
107
|
+
### YAML-driven configuration
|
|
108
|
+
|
|
109
|
+
Define tasks and flows in YAML. Each task references a `class_path` (resolved to a file on disk or a registered constructor) and can carry default `options`. Flows are ordered sequences of steps that reference tasks or other flows.
|
|
110
|
+
|
|
111
|
+
### Config layering
|
|
112
|
+
|
|
113
|
+
The config loader merges multiple YAML files in order:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
defaults (code) → pipeline.yml → pipeline.staging.yml → pipeline.local.yml
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const { config } = loadConfig({
|
|
121
|
+
filename: 'pipeline.yml',
|
|
122
|
+
schema: EngineConfigSchema,
|
|
123
|
+
env: 'staging', // loads pipeline.staging.yml overlay
|
|
124
|
+
configDir: './config',
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Environment overlays and `.local.yml` files let you customize per-environment or per-developer without touching the base config. See [docs/configuration.md](docs/configuration.md).
|
|
129
|
+
|
|
130
|
+
### Custom tasks
|
|
131
|
+
|
|
132
|
+
Extend `BaseTask` to create your own tasks. The lifecycle is: `validate()` → `execute()` → result with timing. Exceptions are caught and returned as `{ success: false }` automatically.
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
class MyTask extends BaseTask<MyOptions> {
|
|
136
|
+
get taskName() { return 'my_task'; }
|
|
137
|
+
async execute(): Promise<TaskResult> {
|
|
138
|
+
return { success: true };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
See [docs/custom-tasks.md](docs/custom-tasks.md).
|
|
144
|
+
|
|
145
|
+
### Built-in ShellTask
|
|
146
|
+
|
|
147
|
+
Run shell commands without writing a custom task class:
|
|
148
|
+
|
|
149
|
+
```yaml
|
|
150
|
+
tasks:
|
|
151
|
+
lint:
|
|
152
|
+
class_path: shell
|
|
153
|
+
options:
|
|
154
|
+
command: npm run lint
|
|
155
|
+
cwd: /path/to/project
|
|
156
|
+
timeout: 60000
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Register it in your registry:
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { ShellTask } from '@db-lyon/flowkit';
|
|
163
|
+
registry.register('shell', ShellTask as any);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Nested flows
|
|
167
|
+
|
|
168
|
+
A step can reference another flow instead of a task:
|
|
169
|
+
|
|
170
|
+
```yaml
|
|
171
|
+
flows:
|
|
172
|
+
ci:
|
|
173
|
+
description: CI pipeline
|
|
174
|
+
steps:
|
|
175
|
+
1: { task: build }
|
|
176
|
+
2: { task: test }
|
|
177
|
+
|
|
178
|
+
release:
|
|
179
|
+
description: Full release
|
|
180
|
+
steps:
|
|
181
|
+
1: { flow: ci }
|
|
182
|
+
2: { task: deploy }
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Skip steps
|
|
186
|
+
|
|
187
|
+
Skip by task name or step number:
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
await runner.run({ flowName: 'release', skip: ['deploy'] });
|
|
191
|
+
await runner.run({ flowName: 'release', skip: ['2'] });
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Or mark a step as permanently skipped in YAML:
|
|
195
|
+
|
|
196
|
+
```yaml
|
|
197
|
+
steps:
|
|
198
|
+
3:
|
|
199
|
+
task: None
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### Plan mode
|
|
203
|
+
|
|
204
|
+
Preview the execution plan without running anything:
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
const result = await runner.run({ flowName: 'ci', plan: true });
|
|
208
|
+
result.steps.forEach(s =>
|
|
209
|
+
console.log(`${s.stepNumber}: [${s.type}] ${s.name}${s.skipped ? ' (skip)' : ''}`)
|
|
210
|
+
);
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Lifecycle hooks
|
|
214
|
+
|
|
215
|
+
Attach hooks to observe or react to flow execution:
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
const runner = new FlowRunner({
|
|
219
|
+
// ...
|
|
220
|
+
hooks: {
|
|
221
|
+
beforeRun: async (flowName, plan) => { /* ... */ },
|
|
222
|
+
beforeStep: async (step) => { /* ... */ },
|
|
223
|
+
afterStep: async (step, result) => { /* ... */ },
|
|
224
|
+
onStepError: async (step, error, completed) => { /* ... */ },
|
|
225
|
+
afterRun: async (result) => { /* ... */ },
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
`beforeRun`/`afterRun` fire once for the top-level flow. `beforeStep`/`afterStep` fire for every step including those inside nested flows.
|
|
231
|
+
|
|
232
|
+
### DAG utilities
|
|
233
|
+
|
|
234
|
+
Topological sort with cycle and missing-dependency detection:
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
import { topologicalSort } from '@db-lyon/flowkit';
|
|
238
|
+
|
|
239
|
+
const sorted = topologicalSort([
|
|
240
|
+
{ id: 'a', dependencies: [], data: null },
|
|
241
|
+
{ id: 'b', dependencies: ['a'], data: null },
|
|
242
|
+
{ id: 'c', dependencies: ['a', 'b'], data: null },
|
|
243
|
+
]);
|
|
244
|
+
// sorted: [a, b, c]
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Throws `CircularDependencyError` or `MissingDependencyError` on invalid graphs.
|
|
248
|
+
|
|
249
|
+
### Logger interface
|
|
250
|
+
|
|
251
|
+
Flowkit accepts any logger that implements the `Logger` interface (compatible with pino, winston, etc.):
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
interface Logger {
|
|
255
|
+
debug(...args: unknown[]): void;
|
|
256
|
+
info(...args: unknown[]): void;
|
|
257
|
+
warn(...args: unknown[]): void;
|
|
258
|
+
error(...args: unknown[]): void;
|
|
259
|
+
child(bindings: Record<string, unknown>): Logger;
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Pass it via the task context or flow runner config. A `noopLogger` is used by default.
|
|
264
|
+
|
|
265
|
+
## Sub-path exports
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
import { loadConfig } from '@db-lyon/flowkit/config';
|
|
269
|
+
import { BaseTask, TaskRegistry } from '@db-lyon/flowkit/task';
|
|
270
|
+
import { FlowRunner } from '@db-lyon/flowkit/flow';
|
|
271
|
+
import { topologicalSort } from '@db-lyon/flowkit/dag';
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Docs
|
|
275
|
+
|
|
276
|
+
- [Getting started](docs/getting-started.md) — step-by-step setup guide
|
|
277
|
+
- [Custom tasks](docs/custom-tasks.md) — writing and registering tasks
|
|
278
|
+
- [Configuration](docs/configuration.md) — YAML schema, layering, deep merge
|
|
279
|
+
- [API reference](docs/api-reference.md) — full type and function reference
|
|
280
|
+
|
|
281
|
+
## License
|
|
282
|
+
|
|
283
|
+
MIT — see [LICENSE](LICENSE).
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -19,56 +19,46 @@ export declare const TaskDefinitionSchema: z.ZodObject<{
|
|
|
19
19
|
export declare const FlowStepSchema: z.ZodEffects<z.ZodObject<{
|
|
20
20
|
task: z.ZodOptional<z.ZodString>;
|
|
21
21
|
flow: z.ZodOptional<z.ZodString>;
|
|
22
|
-
shell: z.ZodOptional<z.ZodString>;
|
|
23
22
|
options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
24
23
|
}, "strip", z.ZodTypeAny, {
|
|
25
24
|
options?: Record<string, unknown> | undefined;
|
|
26
25
|
task?: string | undefined;
|
|
27
26
|
flow?: string | undefined;
|
|
28
|
-
shell?: string | undefined;
|
|
29
27
|
}, {
|
|
30
28
|
options?: Record<string, unknown> | undefined;
|
|
31
29
|
task?: string | undefined;
|
|
32
30
|
flow?: string | undefined;
|
|
33
|
-
shell?: string | undefined;
|
|
34
31
|
}>, {
|
|
35
32
|
options?: Record<string, unknown> | undefined;
|
|
36
33
|
task?: string | undefined;
|
|
37
34
|
flow?: string | undefined;
|
|
38
|
-
shell?: string | undefined;
|
|
39
35
|
}, {
|
|
40
36
|
options?: Record<string, unknown> | undefined;
|
|
41
37
|
task?: string | undefined;
|
|
42
38
|
flow?: string | undefined;
|
|
43
|
-
shell?: string | undefined;
|
|
44
39
|
}>;
|
|
45
40
|
export declare const FlowDefinitionSchema: z.ZodObject<{
|
|
46
41
|
description: z.ZodString;
|
|
47
42
|
steps: z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodObject<{
|
|
48
43
|
task: z.ZodOptional<z.ZodString>;
|
|
49
44
|
flow: z.ZodOptional<z.ZodString>;
|
|
50
|
-
shell: z.ZodOptional<z.ZodString>;
|
|
51
45
|
options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
52
46
|
}, "strip", z.ZodTypeAny, {
|
|
53
47
|
options?: Record<string, unknown> | undefined;
|
|
54
48
|
task?: string | undefined;
|
|
55
49
|
flow?: string | undefined;
|
|
56
|
-
shell?: string | undefined;
|
|
57
50
|
}, {
|
|
58
51
|
options?: Record<string, unknown> | undefined;
|
|
59
52
|
task?: string | undefined;
|
|
60
53
|
flow?: string | undefined;
|
|
61
|
-
shell?: string | undefined;
|
|
62
54
|
}>, {
|
|
63
55
|
options?: Record<string, unknown> | undefined;
|
|
64
56
|
task?: string | undefined;
|
|
65
57
|
flow?: string | undefined;
|
|
66
|
-
shell?: string | undefined;
|
|
67
58
|
}, {
|
|
68
59
|
options?: Record<string, unknown> | undefined;
|
|
69
60
|
task?: string | undefined;
|
|
70
61
|
flow?: string | undefined;
|
|
71
|
-
shell?: string | undefined;
|
|
72
62
|
}>>;
|
|
73
63
|
}, "strip", z.ZodTypeAny, {
|
|
74
64
|
description: string;
|
|
@@ -76,7 +66,6 @@ export declare const FlowDefinitionSchema: z.ZodObject<{
|
|
|
76
66
|
options?: Record<string, unknown> | undefined;
|
|
77
67
|
task?: string | undefined;
|
|
78
68
|
flow?: string | undefined;
|
|
79
|
-
shell?: string | undefined;
|
|
80
69
|
}>;
|
|
81
70
|
}, {
|
|
82
71
|
description: string;
|
|
@@ -84,7 +73,6 @@ export declare const FlowDefinitionSchema: z.ZodObject<{
|
|
|
84
73
|
options?: Record<string, unknown> | undefined;
|
|
85
74
|
task?: string | undefined;
|
|
86
75
|
flow?: string | undefined;
|
|
87
|
-
shell?: string | undefined;
|
|
88
76
|
}>;
|
|
89
77
|
}>;
|
|
90
78
|
/** Minimal config shape the engine requires. Consumers extend with their own sections. */
|
|
@@ -110,28 +98,23 @@ export declare const EngineConfigSchema: z.ZodObject<{
|
|
|
110
98
|
steps: z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodObject<{
|
|
111
99
|
task: z.ZodOptional<z.ZodString>;
|
|
112
100
|
flow: z.ZodOptional<z.ZodString>;
|
|
113
|
-
shell: z.ZodOptional<z.ZodString>;
|
|
114
101
|
options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
115
102
|
}, "strip", z.ZodTypeAny, {
|
|
116
103
|
options?: Record<string, unknown> | undefined;
|
|
117
104
|
task?: string | undefined;
|
|
118
105
|
flow?: string | undefined;
|
|
119
|
-
shell?: string | undefined;
|
|
120
106
|
}, {
|
|
121
107
|
options?: Record<string, unknown> | undefined;
|
|
122
108
|
task?: string | undefined;
|
|
123
109
|
flow?: string | undefined;
|
|
124
|
-
shell?: string | undefined;
|
|
125
110
|
}>, {
|
|
126
111
|
options?: Record<string, unknown> | undefined;
|
|
127
112
|
task?: string | undefined;
|
|
128
113
|
flow?: string | undefined;
|
|
129
|
-
shell?: string | undefined;
|
|
130
114
|
}, {
|
|
131
115
|
options?: Record<string, unknown> | undefined;
|
|
132
116
|
task?: string | undefined;
|
|
133
117
|
flow?: string | undefined;
|
|
134
|
-
shell?: string | undefined;
|
|
135
118
|
}>>;
|
|
136
119
|
}, "strip", z.ZodTypeAny, {
|
|
137
120
|
description: string;
|
|
@@ -139,7 +122,6 @@ export declare const EngineConfigSchema: z.ZodObject<{
|
|
|
139
122
|
options?: Record<string, unknown> | undefined;
|
|
140
123
|
task?: string | undefined;
|
|
141
124
|
flow?: string | undefined;
|
|
142
|
-
shell?: string | undefined;
|
|
143
125
|
}>;
|
|
144
126
|
}, {
|
|
145
127
|
description: string;
|
|
@@ -147,7 +129,6 @@ export declare const EngineConfigSchema: z.ZodObject<{
|
|
|
147
129
|
options?: Record<string, unknown> | undefined;
|
|
148
130
|
task?: string | undefined;
|
|
149
131
|
flow?: string | undefined;
|
|
150
|
-
shell?: string | undefined;
|
|
151
132
|
}>;
|
|
152
133
|
}>>>;
|
|
153
134
|
}, "strip", z.ZodTypeAny, {
|
|
@@ -163,7 +144,6 @@ export declare const EngineConfigSchema: z.ZodObject<{
|
|
|
163
144
|
options?: Record<string, unknown> | undefined;
|
|
164
145
|
task?: string | undefined;
|
|
165
146
|
flow?: string | undefined;
|
|
166
|
-
shell?: string | undefined;
|
|
167
147
|
}>;
|
|
168
148
|
}>;
|
|
169
149
|
}, {
|
|
@@ -179,7 +159,6 @@ export declare const EngineConfigSchema: z.ZodObject<{
|
|
|
179
159
|
options?: Record<string, unknown> | undefined;
|
|
180
160
|
task?: string | undefined;
|
|
181
161
|
flow?: string | undefined;
|
|
182
|
-
shell?: string | undefined;
|
|
183
162
|
}>;
|
|
184
163
|
}> | undefined;
|
|
185
164
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB,wCAAwB,CAAC;AAEvD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAC;AAEH,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB,wCAAwB,CAAC;AAEvD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;EAYxB,CAAC;AAEJ,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG/B,CAAC;AAEH,0FAA0F;AAC1F,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG7B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
|
package/dist/config/schema.js
CHANGED
|
@@ -10,15 +10,13 @@ export const FlowStepSchema = z
|
|
|
10
10
|
.object({
|
|
11
11
|
task: z.string().optional(),
|
|
12
12
|
flow: z.string().optional(),
|
|
13
|
-
shell: z.string().optional(),
|
|
14
13
|
options: TaskOptionsSchema.optional(),
|
|
15
14
|
})
|
|
16
15
|
.refine((data) => {
|
|
17
16
|
if (data.task === 'None')
|
|
18
17
|
return true;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}, { message: 'Step must have exactly one of task, flow, or shell (or task: None to skip)' });
|
|
18
|
+
return (data.task && !data.flow) || (!data.task && data.flow);
|
|
19
|
+
}, { message: 'Step must have exactly one of task or flow (or task: None to skip)' });
|
|
22
20
|
export const FlowDefinitionSchema = z.object({
|
|
23
21
|
description: z.string(),
|
|
24
22
|
steps: z.record(z.coerce.string(), FlowStepSchema),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CAClD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CAClD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE;CACtC,CAAC;KACD,MAAM,CACL,CAAC,IAAI,EAAE,EAAE;IACP,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC,EACD,EAAE,OAAO,EAAE,oEAAoE,EAAE,CAClF,CAAC;AAEJ,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC;CACnD,CAAC,CAAC;AAEH,0FAA0F;AAC1F,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAClD,CAAC,CAAC"}
|
package/dist/flow/runner.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export interface FlowRunOptions {
|
|
|
10
10
|
}
|
|
11
11
|
export interface FlowStepResult {
|
|
12
12
|
stepNumber: number;
|
|
13
|
-
type: 'task' | 'flow'
|
|
13
|
+
type: 'task' | 'flow';
|
|
14
14
|
name: string;
|
|
15
15
|
result?: TaskResult;
|
|
16
16
|
skipped: boolean;
|
|
@@ -24,7 +24,7 @@ export interface FlowRunResult {
|
|
|
24
24
|
}
|
|
25
25
|
export interface PlanStep {
|
|
26
26
|
stepNumber: number;
|
|
27
|
-
type: 'task' | 'flow'
|
|
27
|
+
type: 'task' | 'flow';
|
|
28
28
|
name: string;
|
|
29
29
|
skipped: boolean;
|
|
30
30
|
options?: Record<string, unknown>;
|
|
@@ -63,7 +63,6 @@ export declare class FlowRunner {
|
|
|
63
63
|
resolveExecutionPlan(flow: FlowDefinition, skipSet: Set<string>): PlanStep[];
|
|
64
64
|
private executeFlow;
|
|
65
65
|
private executeTaskStep;
|
|
66
|
-
private executeShellStep;
|
|
67
66
|
private resolveTaskDefinition;
|
|
68
67
|
}
|
|
69
68
|
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/flow/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/flow/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/flow/runner.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process';
|
|
2
1
|
import { noopLogger } from '../logger.js';
|
|
3
2
|
// ---------------------------------------------------------------------------
|
|
4
3
|
// FlowRunner
|
|
@@ -16,8 +15,10 @@ export class FlowRunner {
|
|
|
16
15
|
this.tasks = config.tasks;
|
|
17
16
|
this.flows = config.flows;
|
|
18
17
|
this.registry = config.registry;
|
|
19
|
-
this.ctx = config.context;
|
|
20
18
|
this.hooks = config.hooks ?? {};
|
|
19
|
+
// Inject registry into context so tasks can resolve/call other tasks.
|
|
20
|
+
// Spread to avoid mutating the caller's context object.
|
|
21
|
+
this.ctx = { ...config.context, registry: config.registry };
|
|
21
22
|
}
|
|
22
23
|
async run(options) {
|
|
23
24
|
this.runDepth++;
|
|
@@ -39,8 +40,8 @@ export class FlowRunner {
|
|
|
39
40
|
if (step.task === 'None') {
|
|
40
41
|
return { stepNumber: key, type: 'task', name: 'None', skipped: true };
|
|
41
42
|
}
|
|
42
|
-
const name = (step.task ?? step.flow
|
|
43
|
-
const type = step.task ? 'task' :
|
|
43
|
+
const name = (step.task ?? step.flow);
|
|
44
|
+
const type = step.task ? 'task' : 'flow';
|
|
44
45
|
return {
|
|
45
46
|
stepNumber: key,
|
|
46
47
|
type,
|
|
@@ -99,18 +100,7 @@ export class FlowRunner {
|
|
|
99
100
|
const stepStart = Date.now();
|
|
100
101
|
try {
|
|
101
102
|
let stepResult;
|
|
102
|
-
if (planStep.type === '
|
|
103
|
-
const shellResult = this.executeShellStep(planStep);
|
|
104
|
-
stepResult = {
|
|
105
|
-
stepNumber: planStep.stepNumber,
|
|
106
|
-
type: 'shell',
|
|
107
|
-
name: planStep.name,
|
|
108
|
-
result: shellResult,
|
|
109
|
-
skipped: false,
|
|
110
|
-
duration: Date.now() - stepStart,
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
else if (planStep.type === 'task') {
|
|
103
|
+
if (planStep.type === 'task') {
|
|
114
104
|
const taskResult = await this.executeTaskStep(planStep);
|
|
115
105
|
stepResult = {
|
|
116
106
|
stepNumber: planStep.stepNumber,
|
|
@@ -184,25 +174,6 @@ export class FlowRunner {
|
|
|
184
174
|
const task = await this.registry.create(taskDef.class_path, this.ctx, mergedOptions);
|
|
185
175
|
return task.run();
|
|
186
176
|
}
|
|
187
|
-
executeShellStep(step) {
|
|
188
|
-
this.logger.info({ step: step.stepNumber, shell: step.name }, `Executing shell: ${step.name}`);
|
|
189
|
-
try {
|
|
190
|
-
const output = execSync(step.name, {
|
|
191
|
-
encoding: 'utf-8',
|
|
192
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
193
|
-
timeout: 300_000, // 5 min
|
|
194
|
-
});
|
|
195
|
-
return { success: true, data: { output: output.trimEnd() } };
|
|
196
|
-
}
|
|
197
|
-
catch (error) {
|
|
198
|
-
const err = error;
|
|
199
|
-
return {
|
|
200
|
-
success: false,
|
|
201
|
-
error: new Error(`Shell command failed (exit ${err.status}): ${err.stderr ?? err.stdout ?? ''}`),
|
|
202
|
-
data: { exitCode: err.status, stderr: err.stderr, stdout: err.stdout },
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
177
|
resolveTaskDefinition(taskName) {
|
|
207
178
|
const taskDef = this.tasks[taskName];
|
|
208
179
|
if (taskDef) {
|
package/dist/flow/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/flow/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/flow/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export { loadConfig, loadRawYaml, findConfigFile } from './config/loader.js';
|
|
|
5
5
|
export type { LoadConfigOptions, LoadedConfig } from './config/loader.js';
|
|
6
6
|
export { BaseTask } from './task/base-task.js';
|
|
7
7
|
export type { TaskContext, TaskResult } from './task/base-task.js';
|
|
8
|
+
export { ShellTask } from './task/shell-task.js';
|
|
9
|
+
export type { ShellTaskOptions } from './task/shell-task.js';
|
|
8
10
|
export { TaskRegistry } from './task/registry.js';
|
|
9
11
|
export type { TaskConstructor } from './task/registry.js';
|
|
10
12
|
export { FlowRunner } from './flow/runner.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,WAAW,EACX,cAAc,EACd,QAAQ,EACR,cAAc,EACd,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG1E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EACV,cAAc,EACd,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,WAAW,EACX,cAAc,EACd,QAAQ,EACR,cAAc,EACd,YAAY,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG1E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EACV,cAAc,EACd,cAAc,EACd,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export { TaskOptionsSchema, TaskDefinitionSchema, FlowStepSchema, FlowDefinition
|
|
|
4
4
|
export { loadConfig, loadRawYaml, findConfigFile } from './config/loader.js';
|
|
5
5
|
// Task
|
|
6
6
|
export { BaseTask } from './task/base-task.js';
|
|
7
|
+
export { ShellTask } from './task/shell-task.js';
|
|
7
8
|
export { TaskRegistry } from './task/registry.js';
|
|
8
9
|
// Flow
|
|
9
10
|
export { FlowRunner } from './flow/runner.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO;AACP,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAU9C,MAAM;AACN,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAG7E,OAAO;AACP,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO;AACP,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAU9C,MAAM;AACN,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/task/base-task.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { Logger } from '../logger.js';
|
|
2
|
+
import type { TaskRegistry } from './registry.js';
|
|
2
3
|
export interface TaskContext {
|
|
3
4
|
logger?: Logger;
|
|
5
|
+
registry?: TaskRegistry;
|
|
4
6
|
[key: string]: unknown;
|
|
5
7
|
}
|
|
6
8
|
export interface TaskResult {
|
|
@@ -18,6 +20,17 @@ export declare abstract class BaseTask<TOpts = Record<string, unknown>> {
|
|
|
18
20
|
abstract execute(): Promise<TaskResult>;
|
|
19
21
|
/** Override for option validation — called before execute(). */
|
|
20
22
|
protected validate(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve another task by name from the registry.
|
|
25
|
+
* Returns an unexecuted task instance — call `.run()` on it yourself
|
|
26
|
+
* when you need to inspect or configure the task before running.
|
|
27
|
+
*/
|
|
28
|
+
protected resolve<T extends BaseTask = BaseTask>(taskName: string, options?: Record<string, unknown>): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve and execute another task by name in a single call.
|
|
31
|
+
* The resolved task shares this task's context (bridge, project, etc.).
|
|
32
|
+
*/
|
|
33
|
+
protected call(taskName: string, options?: Record<string, unknown>): Promise<TaskResult>;
|
|
21
34
|
/**
|
|
22
35
|
* Lifecycle wrapper: validate → execute → return result.
|
|
23
36
|
* Catches exceptions and returns `{ success: false }` instead of throwing.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-task.d.ts","sourceRoot":"","sources":["../../src/task/base-task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"base-task.d.ts","sourceRoot":"","sources":["../../src/task/base-task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,8BAAsB,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI1D,SAAS,CAAC,GAAG,EAAE,WAAW;IAC1B,SAAS,CAAC,OAAO,EAAE,KAAK;IAJ1B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;gBAGb,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,KAAK;IAM1B,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC;IAEhC,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;IAEvC,gEAAgE;IAChE,SAAS,CAAC,QAAQ,IAAI,IAAI;IAE1B;;;;OAIG;cACa,OAAO,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EACnD,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,CAAC,CAAC;IAWb;;;OAGG;cACa,IAAI,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,UAAU,CAAC;IAKtB;;;OAGG;IACG,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;CA2BjC"}
|
package/dist/task/base-task.js
CHANGED
|
@@ -11,6 +11,27 @@ export class BaseTask {
|
|
|
11
11
|
}
|
|
12
12
|
/** Override for option validation — called before execute(). */
|
|
13
13
|
validate() { }
|
|
14
|
+
/**
|
|
15
|
+
* Resolve another task by name from the registry.
|
|
16
|
+
* Returns an unexecuted task instance — call `.run()` on it yourself
|
|
17
|
+
* when you need to inspect or configure the task before running.
|
|
18
|
+
*/
|
|
19
|
+
async resolve(taskName, options) {
|
|
20
|
+
const registry = this.ctx.registry;
|
|
21
|
+
if (!registry) {
|
|
22
|
+
throw new Error(`Cannot resolve task "${taskName}" — no registry in context. ` +
|
|
23
|
+
'Tasks can only resolve other tasks when run via FlowRunner.');
|
|
24
|
+
}
|
|
25
|
+
return registry.create(taskName, this.ctx, options ?? {});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolve and execute another task by name in a single call.
|
|
29
|
+
* The resolved task shares this task's context (bridge, project, etc.).
|
|
30
|
+
*/
|
|
31
|
+
async call(taskName, options) {
|
|
32
|
+
const task = await this.resolve(taskName, options);
|
|
33
|
+
return task.run();
|
|
34
|
+
}
|
|
14
35
|
/**
|
|
15
36
|
* Lifecycle wrapper: validate → execute → return result.
|
|
16
37
|
* Catches exceptions and returns `{ success: false }` instead of throwing.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-task.js","sourceRoot":"","sources":["../../src/task/base-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"base-task.js","sourceRoot":"","sources":["../../src/task/base-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAgB1C,MAAM,OAAgB,QAAQ;IAIhB;IACA;IAJF,MAAM,CAAS;IAEzB,YACY,GAAgB,EAChB,OAAc;QADd,QAAG,GAAH,GAAG,CAAa;QAChB,YAAO,GAAP,OAAO,CAAO;QAExB,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,IAAI,UAAU,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAMD,gEAAgE;IACtD,QAAQ,KAAU,CAAC;IAE7B;;;;OAIG;IACO,KAAK,CAAC,OAAO,CACrB,QAAgB,EAChB,OAAiC;QAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,wBAAwB,QAAQ,8BAA8B;gBAC5D,6DAA6D,CAChE,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAe,CAAC;IAC1E,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,IAAI,CAClB,QAAgB,EAChB,OAAiC;QAEjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG;QACP,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhF,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAEzC,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EACtD,mBAAmB,IAAI,CAAC,QAAQ,EAAE,CACnC,CAAC;YAEF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,gBAAgB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAExE,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChE,QAAQ;aACT,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
package/dist/task/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { BaseTask } from './base-task.js';
|
|
2
2
|
export type { TaskContext, TaskResult } from './base-task.js';
|
|
3
|
+
export { ShellTask } from './shell-task.js';
|
|
4
|
+
export type { ShellTaskOptions } from './shell-task.js';
|
|
3
5
|
export { TaskRegistry } from './registry.js';
|
|
4
6
|
export type { TaskConstructor } from './registry.js';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/task/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/task/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/task/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/task/index.js
CHANGED
package/dist/task/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/task/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/task/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/task/registry.d.ts
CHANGED
|
@@ -19,6 +19,28 @@ export declare class TaskRegistry {
|
|
|
19
19
|
resolve(classPathOrName: string): Promise<TaskConstructor>;
|
|
20
20
|
/** Resolve + instantiate in one call. */
|
|
21
21
|
create(classPathOrName: string, ctx: TaskContext, options: Record<string, unknown>): Promise<BaseTask>;
|
|
22
|
+
/**
|
|
23
|
+
* Wrap an existing registered task with a decorator class.
|
|
24
|
+
*
|
|
25
|
+
* The `wrapper` factory receives the original constructor and must return
|
|
26
|
+
* a new constructor — typically a subclass that calls `super.execute()`.
|
|
27
|
+
* Multiple wraps compose: each layer sees the previously wrapped version
|
|
28
|
+
* as its `Original`.
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* registry.wrap('asset.list', (Original) => {
|
|
32
|
+
* return class extends Original {
|
|
33
|
+
* get taskName() { return 'asset.list:filtered'; }
|
|
34
|
+
* async execute() {
|
|
35
|
+
* const result = await super.execute();
|
|
36
|
+
* // post-process result …
|
|
37
|
+
* return result;
|
|
38
|
+
* }
|
|
39
|
+
* };
|
|
40
|
+
* });
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
wrap(name: string, wrapper: (Original: TaskConstructor) => TaskConstructor): this;
|
|
22
44
|
/** Return all registered names and class paths. */
|
|
23
45
|
listRegistered(): string[];
|
|
24
46
|
private loadDynamic;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG,KAC5B,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,QAAQ,CAAC;AAEd,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,YAAY,CAAsC;IAE1D,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKnD,gEAAgE;IAChE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKjE,mCAAmC;IACnC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAO3D,mCAAmC;IACnC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAOlE;;;OAGG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQhE,yCAAyC;IACnC,MAAM,CACV,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,QAAQ,CAAC;IAKpB,mDAAmD;IACnD,cAAc,IAAI,MAAM,EAAE;YAQZ,WAAW;IA0CzB,OAAO,CAAC,qBAAqB;CAW9B"}
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG,KAC5B,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,QAAQ,CAAC;AAEd,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,YAAY,CAAsC;IAE1D,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKnD,gEAAgE;IAChE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKjE,mCAAmC;IACnC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAO3D,mCAAmC;IACnC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAOlE;;;OAGG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQhE,yCAAyC;IACnC,MAAM,CACV,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,QAAQ,CAAC;IAKpB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,eAAe,GAAG,IAAI;IAcjF,mDAAmD;IACnD,cAAc,IAAI,MAAM,EAAE;YAQZ,WAAW;IA0CzB,OAAO,CAAC,qBAAqB;CAW9B"}
|
package/dist/task/registry.js
CHANGED
|
@@ -44,6 +44,38 @@ export class TaskRegistry {
|
|
|
44
44
|
const TaskClass = await this.resolve(classPathOrName);
|
|
45
45
|
return new TaskClass(ctx, options);
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Wrap an existing registered task with a decorator class.
|
|
49
|
+
*
|
|
50
|
+
* The `wrapper` factory receives the original constructor and must return
|
|
51
|
+
* a new constructor — typically a subclass that calls `super.execute()`.
|
|
52
|
+
* Multiple wraps compose: each layer sees the previously wrapped version
|
|
53
|
+
* as its `Original`.
|
|
54
|
+
*
|
|
55
|
+
* ```ts
|
|
56
|
+
* registry.wrap('asset.list', (Original) => {
|
|
57
|
+
* return class extends Original {
|
|
58
|
+
* get taskName() { return 'asset.list:filtered'; }
|
|
59
|
+
* async execute() {
|
|
60
|
+
* const result = await super.execute();
|
|
61
|
+
* // post-process result …
|
|
62
|
+
* return result;
|
|
63
|
+
* }
|
|
64
|
+
* };
|
|
65
|
+
* });
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
wrap(name, wrapper) {
|
|
69
|
+
const original = this.nameMap.get(name) ?? this.classPathMap.get(name);
|
|
70
|
+
if (!original) {
|
|
71
|
+
throw new Error(`Cannot wrap task "${name}" — not found in registry. ` +
|
|
72
|
+
`Registered: ${this.listRegistered().join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
const wrapped = wrapper(original);
|
|
75
|
+
// Always write to nameMap so subsequent resolve() finds it
|
|
76
|
+
this.nameMap.set(name, wrapped);
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
47
79
|
/** Return all registered names and class paths. */
|
|
48
80
|
listRegistered() {
|
|
49
81
|
return [...new Set([...this.nameMap.keys(), ...this.classPathMap.keys()])];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BaseTask, type TaskResult } from './base-task.js';
|
|
2
|
+
export interface ShellTaskOptions {
|
|
3
|
+
command: string;
|
|
4
|
+
cwd?: string;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Task that executes a shell command via execSync.
|
|
9
|
+
*
|
|
10
|
+
* Usage in YAML:
|
|
11
|
+
* steps:
|
|
12
|
+
* 2:
|
|
13
|
+
* task: shell
|
|
14
|
+
* options:
|
|
15
|
+
* command: npm run build
|
|
16
|
+
* cwd: /path/to/project # optional
|
|
17
|
+
* timeout: 300000 # optional, default 5 min
|
|
18
|
+
*/
|
|
19
|
+
export declare class ShellTask extends BaseTask<ShellTaskOptions> {
|
|
20
|
+
get taskName(): string;
|
|
21
|
+
protected validate(): void;
|
|
22
|
+
execute(): Promise<TaskResult>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=shell-task.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-task.d.ts","sourceRoot":"","sources":["../../src/task/shell-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,SAAU,SAAQ,QAAQ,CAAC,gBAAgB,CAAC;IACvD,IAAI,QAAQ,WAEX;IAED,SAAS,CAAC,QAAQ,IAAI,IAAI;IAMpB,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;CAoBrC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { BaseTask } from './base-task.js';
|
|
3
|
+
/**
|
|
4
|
+
* Task that executes a shell command via execSync.
|
|
5
|
+
*
|
|
6
|
+
* Usage in YAML:
|
|
7
|
+
* steps:
|
|
8
|
+
* 2:
|
|
9
|
+
* task: shell
|
|
10
|
+
* options:
|
|
11
|
+
* command: npm run build
|
|
12
|
+
* cwd: /path/to/project # optional
|
|
13
|
+
* timeout: 300000 # optional, default 5 min
|
|
14
|
+
*/
|
|
15
|
+
export class ShellTask extends BaseTask {
|
|
16
|
+
get taskName() {
|
|
17
|
+
return `shell:${this.options.command}`;
|
|
18
|
+
}
|
|
19
|
+
validate() {
|
|
20
|
+
if (!this.options.command || typeof this.options.command !== 'string') {
|
|
21
|
+
throw new Error('ShellTask requires a "command" option');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async execute() {
|
|
25
|
+
const { command, cwd, timeout = 300_000 } = this.options;
|
|
26
|
+
try {
|
|
27
|
+
const output = execSync(command, {
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
30
|
+
cwd,
|
|
31
|
+
timeout,
|
|
32
|
+
});
|
|
33
|
+
return { success: true, data: { output: output.trimEnd() } };
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const err = error;
|
|
37
|
+
return {
|
|
38
|
+
success: false,
|
|
39
|
+
error: new Error(`Shell command failed (exit ${err.status}): ${(err.stderr ?? err.stdout ?? '').trimEnd()}`),
|
|
40
|
+
data: { exitCode: err.status, stderr: err.stderr, stdout: err.stdout },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=shell-task.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-task.js","sourceRoot":"","sources":["../../src/task/shell-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAQ3D;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,SAAU,SAAQ,QAA0B;IACvD,IAAI,QAAQ;QACV,OAAO,SAAS,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzC,CAAC;IAES,QAAQ;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE;gBAC/B,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,GAAG;gBACH,OAAO;aACR,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAA8D,CAAC;YAC3E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC5G,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;aACvE,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|