@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.
Files changed (132) hide show
  1. package/README.md +91 -18
  2. package/dist/bootstrap.d.ts +6 -6
  3. package/dist/bootstrap.d.ts.map +1 -1
  4. package/dist/bootstrap.js +5 -6
  5. package/dist/bootstrap.js.map +1 -1
  6. package/dist/config-ops.d.ts +4 -2
  7. package/dist/config-ops.d.ts.map +1 -1
  8. package/dist/config-ops.js +16 -2
  9. package/dist/config-ops.js.map +1 -1
  10. package/dist/config.d.ts +8 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +5 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/core/dataflow.d.ts +23 -0
  15. package/dist/core/dataflow.d.ts.map +1 -0
  16. package/dist/core/dataflow.js +63 -0
  17. package/dist/core/dataflow.js.map +1 -0
  18. package/dist/core/log-prune.d.ts +16 -0
  19. package/dist/core/log-prune.d.ts.map +1 -0
  20. package/dist/core/log-prune.js +34 -0
  21. package/dist/core/log-prune.js.map +1 -0
  22. package/dist/core/preflight.d.ts +13 -0
  23. package/dist/core/preflight.d.ts.map +1 -0
  24. package/dist/core/preflight.js +61 -0
  25. package/dist/core/preflight.js.map +1 -0
  26. package/dist/core/run-context.d.ts +52 -0
  27. package/dist/core/run-context.d.ts.map +1 -0
  28. package/dist/core/run-context.js +156 -0
  29. package/dist/core/run-context.js.map +1 -0
  30. package/dist/core/run-state.d.ts +25 -0
  31. package/dist/core/run-state.d.ts.map +1 -0
  32. package/dist/core/run-state.js +93 -0
  33. package/dist/core/run-state.js.map +1 -0
  34. package/dist/core/scheduler.d.ts +13 -0
  35. package/dist/core/scheduler.d.ts.map +1 -0
  36. package/dist/core/scheduler.js +35 -0
  37. package/dist/core/scheduler.js.map +1 -0
  38. package/dist/core/task-executor.d.ts +13 -0
  39. package/dist/core/task-executor.d.ts.map +1 -0
  40. package/dist/core/task-executor.js +639 -0
  41. package/dist/core/task-executor.js.map +1 -0
  42. package/dist/core/trigger-errors.d.ts +9 -0
  43. package/dist/core/trigger-errors.d.ts.map +1 -0
  44. package/dist/core/trigger-errors.js +15 -0
  45. package/dist/core/trigger-errors.js.map +1 -0
  46. package/dist/engine.d.ts +6 -14
  47. package/dist/engine.d.ts.map +1 -1
  48. package/dist/engine.js +71 -990
  49. package/dist/engine.js.map +1 -1
  50. package/dist/index.d.ts +9 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +6 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/pipeline-definition.d.ts +3 -0
  55. package/dist/pipeline-definition.d.ts.map +1 -0
  56. package/dist/pipeline-definition.js +4 -0
  57. package/dist/pipeline-definition.js.map +1 -0
  58. package/dist/pipeline-runner.d.ts +2 -1
  59. package/dist/pipeline-runner.d.ts.map +1 -1
  60. package/dist/pipeline-runner.js +2 -2
  61. package/dist/pipeline-runner.js.map +1 -1
  62. package/dist/plugins.d.ts +5 -0
  63. package/dist/plugins.d.ts.map +1 -0
  64. package/dist/plugins.js +3 -0
  65. package/dist/plugins.js.map +1 -0
  66. package/dist/ports.d.ts +23 -1
  67. package/dist/ports.d.ts.map +1 -1
  68. package/dist/ports.js +160 -0
  69. package/dist/ports.js.map +1 -1
  70. package/dist/registry.d.ts +3 -19
  71. package/dist/registry.d.ts.map +1 -1
  72. package/dist/registry.js +7 -35
  73. package/dist/registry.js.map +1 -1
  74. package/dist/schema.d.ts.map +1 -1
  75. package/dist/schema.js +7 -3
  76. package/dist/schema.js.map +1 -1
  77. package/dist/tagma.d.ts +24 -0
  78. package/dist/tagma.d.ts.map +1 -0
  79. package/dist/tagma.js +23 -0
  80. package/dist/tagma.js.map +1 -0
  81. package/dist/utils-api.d.ts +2 -0
  82. package/dist/utils-api.d.ts.map +1 -0
  83. package/dist/utils-api.js +2 -0
  84. package/dist/utils-api.js.map +1 -0
  85. package/dist/validate-raw.js +118 -0
  86. package/dist/validate-raw.js.map +1 -1
  87. package/dist/yaml.d.ts +4 -0
  88. package/dist/yaml.d.ts.map +1 -0
  89. package/dist/yaml.js +3 -0
  90. package/dist/yaml.js.map +1 -0
  91. package/package.json +53 -8
  92. package/src/bootstrap.ts +6 -6
  93. package/src/config-ops.ts +12 -2
  94. package/src/config.ts +26 -0
  95. package/src/core/dataflow.test.ts +167 -0
  96. package/src/core/dataflow.ts +118 -0
  97. package/src/core/log-prune.test.ts +58 -0
  98. package/src/core/log-prune.ts +43 -0
  99. package/src/core/preflight.test.ts +49 -0
  100. package/src/core/preflight.ts +89 -0
  101. package/src/core/run-context.test.ts +244 -0
  102. package/src/core/run-context.ts +207 -0
  103. package/src/core/run-state.test.ts +98 -0
  104. package/src/core/run-state.ts +122 -0
  105. package/src/core/scheduler.test.ts +83 -0
  106. package/src/core/scheduler.ts +42 -0
  107. package/src/core/task-executor.ts +803 -0
  108. package/src/core/trigger-errors.ts +15 -0
  109. package/src/engine-ports.test.ts +66 -0
  110. package/src/engine-task-type.test.ts +56 -0
  111. package/src/engine.ts +86 -1180
  112. package/src/index.ts +28 -0
  113. package/src/pipeline-definition.ts +5 -0
  114. package/src/pipeline-runner.ts +3 -2
  115. package/src/plugin-registry.test.ts +7 -10
  116. package/src/plugins.ts +18 -0
  117. package/src/ports.test.ts +127 -0
  118. package/src/ports.ts +224 -1
  119. package/src/registry.ts +7 -49
  120. package/src/schema-ports.test.ts +86 -0
  121. package/src/schema.ts +7 -3
  122. package/src/tagma.test.ts +84 -0
  123. package/src/tagma.ts +47 -0
  124. package/src/utils-api.ts +8 -0
  125. package/src/validate-raw-ports.test.ts +66 -0
  126. package/src/validate-raw.ts +137 -0
  127. package/src/yaml.ts +11 -0
  128. package/dist/sdk.d.ts +0 -32
  129. package/dist/sdk.d.ts.map +0 -1
  130. package/dist/sdk.js +0 -41
  131. package/dist/sdk.js.map +0 -1
  132. 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
+ }
@@ -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
+ });