@tagma/sdk 0.6.11 → 0.7.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 +91 -18
- package/dist/bootstrap.d.ts +6 -6
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +5 -6
- package/dist/bootstrap.js.map +1 -1
- package/dist/config-ops.d.ts +4 -2
- package/dist/config-ops.d.ts.map +1 -1
- package/dist/config-ops.js +16 -2
- package/dist/config-ops.js.map +1 -1
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -0
- package/dist/core/dataflow.d.ts +23 -0
- package/dist/core/dataflow.d.ts.map +1 -0
- package/dist/core/dataflow.js +63 -0
- package/dist/core/dataflow.js.map +1 -0
- package/dist/core/log-prune.d.ts +16 -0
- package/dist/core/log-prune.d.ts.map +1 -0
- package/dist/core/log-prune.js +34 -0
- package/dist/core/log-prune.js.map +1 -0
- package/dist/core/preflight.d.ts +13 -0
- package/dist/core/preflight.d.ts.map +1 -0
- package/dist/core/preflight.js +61 -0
- package/dist/core/preflight.js.map +1 -0
- package/dist/core/run-context.d.ts +52 -0
- package/dist/core/run-context.d.ts.map +1 -0
- package/dist/core/run-context.js +156 -0
- package/dist/core/run-context.js.map +1 -0
- package/dist/core/run-state.d.ts +25 -0
- package/dist/core/run-state.d.ts.map +1 -0
- package/dist/core/run-state.js +93 -0
- package/dist/core/run-state.js.map +1 -0
- package/dist/core/scheduler.d.ts +13 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +35 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/task-executor.d.ts +13 -0
- package/dist/core/task-executor.d.ts.map +1 -0
- package/dist/core/task-executor.js +639 -0
- package/dist/core/task-executor.js.map +1 -0
- package/dist/core/trigger-errors.d.ts +9 -0
- package/dist/core/trigger-errors.d.ts.map +1 -0
- package/dist/core/trigger-errors.js +15 -0
- package/dist/core/trigger-errors.js.map +1 -0
- package/dist/engine.d.ts +6 -14
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +71 -990
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline-definition.d.ts +3 -0
- package/dist/pipeline-definition.d.ts.map +1 -0
- package/dist/pipeline-definition.js +4 -0
- package/dist/pipeline-definition.js.map +1 -0
- package/dist/pipeline-runner.d.ts +2 -1
- package/dist/pipeline-runner.d.ts.map +1 -1
- package/dist/pipeline-runner.js +2 -2
- package/dist/pipeline-runner.js.map +1 -1
- package/dist/plugins.d.ts +5 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +3 -0
- package/dist/plugins.js.map +1 -0
- package/dist/ports.d.ts +23 -1
- package/dist/ports.d.ts.map +1 -1
- package/dist/ports.js +160 -0
- package/dist/ports.js.map +1 -1
- package/dist/registry.d.ts +3 -19
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +7 -35
- package/dist/registry.js.map +1 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +7 -3
- package/dist/schema.js.map +1 -1
- package/dist/tagma.d.ts +24 -0
- package/dist/tagma.d.ts.map +1 -0
- package/dist/tagma.js +23 -0
- package/dist/tagma.js.map +1 -0
- package/dist/utils-api.d.ts +2 -0
- package/dist/utils-api.d.ts.map +1 -0
- package/dist/utils-api.js +2 -0
- package/dist/utils-api.js.map +1 -0
- package/dist/validate-raw.js +118 -0
- package/dist/validate-raw.js.map +1 -1
- package/dist/yaml.d.ts +4 -0
- package/dist/yaml.d.ts.map +1 -0
- package/dist/yaml.js +3 -0
- package/dist/yaml.js.map +1 -0
- package/package.json +53 -8
- package/src/bootstrap.ts +6 -6
- package/src/config-ops.ts +12 -2
- package/src/config.ts +26 -0
- package/src/core/dataflow.test.ts +167 -0
- package/src/core/dataflow.ts +118 -0
- package/src/core/log-prune.test.ts +58 -0
- package/src/core/log-prune.ts +43 -0
- package/src/core/preflight.test.ts +49 -0
- package/src/core/preflight.ts +89 -0
- package/src/core/run-context.test.ts +244 -0
- package/src/core/run-context.ts +207 -0
- package/src/core/run-state.test.ts +98 -0
- package/src/core/run-state.ts +122 -0
- package/src/core/scheduler.test.ts +83 -0
- package/src/core/scheduler.ts +42 -0
- package/src/core/task-executor.ts +803 -0
- package/src/core/trigger-errors.ts +15 -0
- package/src/engine-ports.test.ts +66 -0
- package/src/engine-task-type.test.ts +56 -0
- package/src/engine.ts +86 -1180
- package/src/index.ts +28 -0
- package/src/pipeline-definition.ts +5 -0
- package/src/pipeline-runner.ts +3 -2
- package/src/plugin-registry.test.ts +7 -10
- package/src/plugins.ts +18 -0
- package/src/ports.test.ts +127 -0
- package/src/ports.ts +224 -1
- package/src/registry.ts +7 -49
- package/src/schema-ports.test.ts +86 -0
- package/src/schema.ts +7 -3
- package/src/tagma.test.ts +84 -0
- package/src/tagma.ts +47 -0
- package/src/utils-api.ts +8 -0
- package/src/validate-raw-ports.test.ts +66 -0
- package/src/validate-raw.ts +137 -0
- package/src/yaml.ts +11 -0
- package/dist/sdk.d.ts +0 -32
- package/dist/sdk.d.ts.map +0 -1
- package/dist/sdk.js +0 -41
- package/dist/sdk.js.map +0 -1
- package/src/sdk.ts +0 -147
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class TriggerBlockedError extends Error {
|
|
2
|
+
readonly code = 'TRIGGER_BLOCKED' as const;
|
|
3
|
+
constructor(message: string) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'TriggerBlockedError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class TriggerTimeoutError extends Error {
|
|
10
|
+
readonly code = 'TRIGGER_TIMEOUT' as const;
|
|
11
|
+
constructor(message: string) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'TriggerTimeoutError';
|
|
14
|
+
}
|
|
15
|
+
}
|
package/src/engine-ports.test.ts
CHANGED
|
@@ -112,6 +112,72 @@ function finalStatusFrom(events: RunEventPayload[], qid: string): TaskStatus | u
|
|
|
112
112
|
// ─── Tests ────────────────────────────────────────────────────────────
|
|
113
113
|
|
|
114
114
|
describe('engine — ports: output extraction + input resolution', () => {
|
|
115
|
+
test('lightweight task inputs substitute command placeholders without ports', async () => {
|
|
116
|
+
const dir = makeDir();
|
|
117
|
+
try {
|
|
118
|
+
const echo = writeEchoArgsScript(dir, 'echo');
|
|
119
|
+
const config = pipeline([
|
|
120
|
+
task({
|
|
121
|
+
id: 'down',
|
|
122
|
+
command: `node "${echo}" "{{inputs.city}}" "{{inputs.mode}}"`,
|
|
123
|
+
inputs: {
|
|
124
|
+
city: { value: 'Shanghai' },
|
|
125
|
+
mode: { default: 'quick' },
|
|
126
|
+
},
|
|
127
|
+
}),
|
|
128
|
+
]);
|
|
129
|
+
|
|
130
|
+
const { events, success } = await run(config, dir);
|
|
131
|
+
expect(success).toBe(true);
|
|
132
|
+
const downFinal = finalUpdateFor(events, 't.down');
|
|
133
|
+
if (downFinal?.type === 'task_update') {
|
|
134
|
+
expect((downFinal.stdout ?? '').trim()).toBe('Shanghai|quick');
|
|
135
|
+
expect(downFinal.inputs).toEqual({ city: 'Shanghai', mode: 'quick' });
|
|
136
|
+
}
|
|
137
|
+
} finally {
|
|
138
|
+
rmSync(dir, { recursive: true, force: true });
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test('lightweight task outputs publish named values for downstream bindings', async () => {
|
|
143
|
+
const dir = makeDir();
|
|
144
|
+
try {
|
|
145
|
+
const emit = writeEmitScript(dir, 'emit', { bundlePath: 'dist/app.js' });
|
|
146
|
+
const echo = writeEchoArgsScript(dir, 'echo');
|
|
147
|
+
const config = pipeline([
|
|
148
|
+
task({
|
|
149
|
+
id: 'build',
|
|
150
|
+
command: `node "${emit}"`,
|
|
151
|
+
outputs: {
|
|
152
|
+
bundlePath: {},
|
|
153
|
+
},
|
|
154
|
+
}),
|
|
155
|
+
task({
|
|
156
|
+
id: 'test',
|
|
157
|
+
depends_on: ['build'],
|
|
158
|
+
command: `node "${echo}" "{{inputs.bundlePath}}"`,
|
|
159
|
+
inputs: {
|
|
160
|
+
bundlePath: { from: 't.build.outputs.bundlePath', required: true },
|
|
161
|
+
},
|
|
162
|
+
}),
|
|
163
|
+
]);
|
|
164
|
+
|
|
165
|
+
const { events, success } = await run(config, dir);
|
|
166
|
+
expect(success).toBe(true);
|
|
167
|
+
const buildFinal = finalUpdateFor(events, 't.build');
|
|
168
|
+
if (buildFinal?.type === 'task_update') {
|
|
169
|
+
expect(buildFinal.outputs).toEqual({ bundlePath: 'dist/app.js' });
|
|
170
|
+
}
|
|
171
|
+
const testFinal = finalUpdateFor(events, 't.test');
|
|
172
|
+
if (testFinal?.type === 'task_update') {
|
|
173
|
+
expect((testFinal.stdout ?? '').trim()).toBe('dist/app.js');
|
|
174
|
+
expect(testFinal.inputs).toEqual({ bundlePath: 'dist/app.js' });
|
|
175
|
+
}
|
|
176
|
+
} finally {
|
|
177
|
+
rmSync(dir, { recursive: true, force: true });
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
|
|
115
181
|
test('upstream outputs feed downstream inputs via name match', async () => {
|
|
116
182
|
const dir = makeDir();
|
|
117
183
|
try {
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, expect, test } from 'bun:test';
|
|
2
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { runPipeline, type RunEventPayload } from './engine';
|
|
6
|
+
import { PluginRegistry } from './registry';
|
|
7
|
+
import type { PipelineConfig } from './types';
|
|
8
|
+
|
|
9
|
+
function makeDir(): string {
|
|
10
|
+
return mkdtempSync(join(tmpdir(), 'tagma-task-type-'));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
describe('engine task type detection', () => {
|
|
14
|
+
test('empty command is still a command task and does not require a driver', async () => {
|
|
15
|
+
const dir = makeDir();
|
|
16
|
+
const previousShell = process.env.PIPELINE_SHELL;
|
|
17
|
+
process.env.PIPELINE_SHELL = 'cmd';
|
|
18
|
+
try {
|
|
19
|
+
const events: RunEventPayload[] = [];
|
|
20
|
+
const config: PipelineConfig = {
|
|
21
|
+
name: 'empty-command',
|
|
22
|
+
tracks: [
|
|
23
|
+
{
|
|
24
|
+
id: 't',
|
|
25
|
+
name: 'T',
|
|
26
|
+
tasks: [{ id: 'cmd', name: 'cmd', command: '' }],
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const result = await runPipeline(config, dir, {
|
|
32
|
+
registry: new PluginRegistry(),
|
|
33
|
+
skipPluginLoading: true,
|
|
34
|
+
onEvent: (event) => events.push(event),
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
expect(result.success).toBe(true);
|
|
38
|
+
expect(events.some((event) => event.type === 'run_start')).toBe(true);
|
|
39
|
+
const final = events.findLast(
|
|
40
|
+
(event) => event.type === 'task_update' && event.taskId === 't.cmd',
|
|
41
|
+
);
|
|
42
|
+
expect(final?.type).toBe('task_update');
|
|
43
|
+
if (final?.type === 'task_update') {
|
|
44
|
+
expect(final.status).toBe('success');
|
|
45
|
+
expect(final.resolvedDriver).toBeNull();
|
|
46
|
+
}
|
|
47
|
+
} finally {
|
|
48
|
+
if (previousShell === undefined) {
|
|
49
|
+
delete process.env.PIPELINE_SHELL;
|
|
50
|
+
} else {
|
|
51
|
+
process.env.PIPELINE_SHELL = previousShell;
|
|
52
|
+
}
|
|
53
|
+
rmSync(dir, { recursive: true, force: true });
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|