@db-lyon/flowkit 0.11.1 → 0.12.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 +1 -1
- package/dist/flow/runner.d.ts +23 -2
- package/dist/flow/runner.d.ts.map +1 -1
- package/dist/flow/runner.js +89 -29
- package/dist/flow/runner.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/{flow/references.d.ts → references.d.ts} +3 -1
- package/dist/references.d.ts.map +1 -0
- package/dist/{flow/references.js → references.js} +3 -1
- package/dist/references.js.map +1 -0
- package/dist/task/agent-task.d.ts.map +1 -1
- package/dist/task/agent-task.js +1 -7
- package/dist/task/agent-task.js.map +1 -1
- package/dist/task/base-task.d.ts +28 -3
- package/dist/task/base-task.d.ts.map +1 -1
- package/dist/task/base-task.js +13 -4
- package/dist/task/base-task.js.map +1 -1
- package/dist/task/task-resolution.d.ts +33 -0
- package/dist/task/task-resolution.d.ts.map +1 -0
- package/dist/task/task-resolution.js +34 -0
- package/dist/task/task-resolution.js.map +1 -0
- package/docs/ai-agents.md +368 -0
- package/docs/api-reference.md +430 -0
- package/docs/configuration.md +347 -0
- package/docs/custom-tasks.md +232 -0
- package/docs/getting-started.md +172 -0
- package/package.json +3 -2
- package/dist/flow/references.d.ts.map +0 -1
- package/dist/flow/references.js.map +0 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Getting started
|
|
2
|
+
|
|
3
|
+
This guide walks through setting up flowkit from scratch.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- Node.js >= 20
|
|
8
|
+
- TypeScript project with `"module": "NodeNext"` (or compatible ESM setup)
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install @db-lyon/flowkit
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## 1. Create a YAML config
|
|
17
|
+
|
|
18
|
+
Create `config/pipeline.yml`:
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
tasks:
|
|
22
|
+
greet:
|
|
23
|
+
class_path: tasks.Greet
|
|
24
|
+
description: Print a greeting
|
|
25
|
+
options:
|
|
26
|
+
name: world
|
|
27
|
+
|
|
28
|
+
flows:
|
|
29
|
+
hello:
|
|
30
|
+
description: Run the greeting
|
|
31
|
+
steps:
|
|
32
|
+
1:
|
|
33
|
+
task: greet
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### What's happening here
|
|
37
|
+
|
|
38
|
+
- **tasks** defines reusable units of work. Each task has a `class_path` that tells flowkit how to find the task implementation, and optional default `options`.
|
|
39
|
+
- **flows** defines sequences of steps. Each step references a task (or another flow) by name. Steps execute in numeric order.
|
|
40
|
+
|
|
41
|
+
## 2. Create a task class
|
|
42
|
+
|
|
43
|
+
Create `tasks/Greet.ts`:
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
import { BaseTask, type TaskResult } from '@db-lyon/flowkit';
|
|
47
|
+
|
|
48
|
+
interface GreetOptions {
|
|
49
|
+
name: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default class Greet extends BaseTask<GreetOptions> {
|
|
53
|
+
get taskName() {
|
|
54
|
+
return 'greet';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async execute(): Promise<TaskResult> {
|
|
58
|
+
const message = `Hello, ${this.options.name}!`;
|
|
59
|
+
this.logger.info(message);
|
|
60
|
+
return { success: true, data: { message } };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Every task must:
|
|
66
|
+
1. Extend `BaseTask<TOptions>`
|
|
67
|
+
2. Implement the `taskName` getter
|
|
68
|
+
3. Implement the async `execute()` method returning a `TaskResult`
|
|
69
|
+
|
|
70
|
+
## 3. Wire it up
|
|
71
|
+
|
|
72
|
+
Create `run.ts`:
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import {
|
|
76
|
+
loadConfig,
|
|
77
|
+
EngineConfigSchema,
|
|
78
|
+
TaskRegistry,
|
|
79
|
+
FlowRunner,
|
|
80
|
+
} from '@db-lyon/flowkit';
|
|
81
|
+
|
|
82
|
+
// Load and validate the YAML config
|
|
83
|
+
const { config } = loadConfig({
|
|
84
|
+
filename: 'pipeline.yml',
|
|
85
|
+
schema: EngineConfigSchema,
|
|
86
|
+
configDir: './config',
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// Create a registry — flowkit uses this to resolve class_path → constructor
|
|
90
|
+
const registry = new TaskRegistry();
|
|
91
|
+
|
|
92
|
+
// Create the flow runner
|
|
93
|
+
const runner = new FlowRunner({
|
|
94
|
+
tasks: config.tasks,
|
|
95
|
+
flows: config.flows,
|
|
96
|
+
registry,
|
|
97
|
+
context: {},
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// Run the flow
|
|
101
|
+
const result = await runner.run({ flowName: 'hello' });
|
|
102
|
+
|
|
103
|
+
if (result.success) {
|
|
104
|
+
console.log('Flow completed successfully');
|
|
105
|
+
} else {
|
|
106
|
+
console.error('Flow failed:', result.error?.message);
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 4. Run it
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
npx tsx run.ts
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
The `greet` task's `class_path: tasks.Greet` tells flowkit to look for `tasks/Greet.ts` (or `.js`) relative to `process.cwd()`. It dynamically imports the file and instantiates the default export.
|
|
117
|
+
|
|
118
|
+
## How task resolution works
|
|
119
|
+
|
|
120
|
+
When the flow runner encounters a task step, it:
|
|
121
|
+
|
|
122
|
+
1. Looks up the task name in `config.tasks` to get the `class_path`
|
|
123
|
+
2. Checks the registry for a constructor registered under that `class_path` or name
|
|
124
|
+
3. If not found, converts the dotted path to a file path and dynamically imports it (e.g., `tasks.Greet` → `tasks/Greet.ts`)
|
|
125
|
+
4. Instantiates the task with the merged options (task defaults + step overrides)
|
|
126
|
+
5. Calls `task.run()` which runs `validate()` → `execute()` → returns the result
|
|
127
|
+
|
|
128
|
+
## Explicit registration
|
|
129
|
+
|
|
130
|
+
Instead of relying on dynamic filesystem resolution, you can register tasks directly:
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
import Greet from './tasks/Greet.js';
|
|
134
|
+
|
|
135
|
+
const registry = new TaskRegistry();
|
|
136
|
+
registry.register('greet', Greet as any);
|
|
137
|
+
|
|
138
|
+
// Or by class_path
|
|
139
|
+
registry.registerClassPath('tasks.Greet', Greet as any);
|
|
140
|
+
|
|
141
|
+
// Or bulk register
|
|
142
|
+
registry.registerAll({
|
|
143
|
+
greet: Greet as any,
|
|
144
|
+
// ...more tasks
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Adding a logger
|
|
149
|
+
|
|
150
|
+
Flowkit accepts any logger with `debug`, `info`, `warn`, `error`, and `child` methods (pino, winston, etc.):
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
import pino from 'pino';
|
|
154
|
+
|
|
155
|
+
const logger = pino();
|
|
156
|
+
|
|
157
|
+
const runner = new FlowRunner({
|
|
158
|
+
tasks: config.tasks,
|
|
159
|
+
flows: config.flows,
|
|
160
|
+
registry,
|
|
161
|
+
context: { logger },
|
|
162
|
+
logger,
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
The context logger is passed to each task instance. The runner logger is used for flow-level logging. Both fall back to a silent no-op logger if omitted.
|
|
167
|
+
|
|
168
|
+
## Next steps
|
|
169
|
+
|
|
170
|
+
- [Custom tasks](custom-tasks.md) — validation, error handling, and the ShellTask
|
|
171
|
+
- [Configuration](configuration.md) — layered configs, environment overlays, deep merge
|
|
172
|
+
- [API reference](api-reference.md) — full type and function docs
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@db-lyon/flowkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "YAML-configured task and flow orchestration engine",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
"./dag": "./dist/dag/index.js"
|
|
14
14
|
},
|
|
15
15
|
"files": [
|
|
16
|
-
"/dist"
|
|
16
|
+
"/dist",
|
|
17
|
+
"/docs"
|
|
17
18
|
],
|
|
18
19
|
"scripts": {
|
|
19
20
|
"build": "tsc -b",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../src/flow/references.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,iDAAiD;IACjD,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAQD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,gBAAgB,GAAG,CAAC,CAcvE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"references.js","sourceRoot":"","sources":["../../src/flow/references.ts"],"names":[],"mappings":"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"}
|