@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.
@@ -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.11.1",
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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"}