@tagma/sdk 0.4.1 → 0.4.3

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 (106) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/stdin-approval.d.ts +6 -0
  3. package/dist/adapters/stdin-approval.d.ts.map +1 -0
  4. package/dist/adapters/stdin-approval.js +90 -0
  5. package/dist/adapters/stdin-approval.js.map +1 -0
  6. package/dist/adapters/websocket-approval.d.ts +28 -0
  7. package/dist/adapters/websocket-approval.d.ts.map +1 -0
  8. package/dist/adapters/websocket-approval.js +145 -0
  9. package/dist/adapters/websocket-approval.js.map +1 -0
  10. package/dist/approval.d.ts +13 -0
  11. package/dist/approval.d.ts.map +1 -0
  12. package/dist/approval.js +91 -0
  13. package/dist/approval.js.map +1 -0
  14. package/dist/bootstrap.d.ts +2 -0
  15. package/dist/bootstrap.d.ts.map +1 -0
  16. package/dist/bootstrap.js +30 -0
  17. package/dist/bootstrap.js.map +1 -0
  18. package/dist/completions/exit-code.d.ts +3 -0
  19. package/dist/completions/exit-code.d.ts.map +1 -0
  20. package/dist/completions/exit-code.js +25 -0
  21. package/dist/completions/exit-code.js.map +1 -0
  22. package/dist/completions/file-exists.d.ts +3 -0
  23. package/dist/completions/file-exists.d.ts.map +1 -0
  24. package/dist/completions/file-exists.js +58 -0
  25. package/dist/completions/file-exists.js.map +1 -0
  26. package/dist/completions/output-check.d.ts +3 -0
  27. package/dist/completions/output-check.d.ts.map +1 -0
  28. package/dist/completions/output-check.js +81 -0
  29. package/dist/completions/output-check.js.map +1 -0
  30. package/dist/config-ops.d.ts +55 -0
  31. package/dist/config-ops.d.ts.map +1 -0
  32. package/dist/config-ops.js +258 -0
  33. package/dist/config-ops.js.map +1 -0
  34. package/dist/dag.d.ts +46 -0
  35. package/dist/dag.d.ts.map +1 -0
  36. package/dist/dag.js +193 -0
  37. package/dist/dag.js.map +1 -0
  38. package/dist/drivers/claude-code.d.ts +3 -0
  39. package/dist/drivers/claude-code.d.ts.map +1 -0
  40. package/dist/drivers/claude-code.js +210 -0
  41. package/dist/drivers/claude-code.js.map +1 -0
  42. package/dist/engine.d.ts +89 -0
  43. package/dist/engine.d.ts.map +1 -0
  44. package/dist/engine.js +815 -0
  45. package/dist/engine.js.map +1 -0
  46. package/dist/hooks.d.ts +73 -0
  47. package/dist/hooks.d.ts.map +1 -0
  48. package/dist/hooks.js +103 -0
  49. package/dist/hooks.js.map +1 -0
  50. package/dist/logger.d.ts +61 -0
  51. package/dist/logger.d.ts.map +1 -0
  52. package/dist/logger.js +151 -0
  53. package/dist/logger.js.map +1 -0
  54. package/dist/middlewares/static-context.d.ts +3 -0
  55. package/dist/middlewares/static-context.d.ts.map +1 -0
  56. package/dist/middlewares/static-context.js +36 -0
  57. package/dist/middlewares/static-context.js.map +1 -0
  58. package/dist/pipeline-runner.d.ts +50 -0
  59. package/dist/pipeline-runner.d.ts.map +1 -0
  60. package/dist/pipeline-runner.js +139 -0
  61. package/dist/pipeline-runner.js.map +1 -0
  62. package/dist/registry.d.ts +43 -0
  63. package/dist/registry.d.ts.map +1 -0
  64. package/dist/registry.js +182 -0
  65. package/dist/registry.js.map +1 -0
  66. package/dist/runner.d.ts +19 -0
  67. package/dist/runner.d.ts.map +1 -0
  68. package/dist/runner.js +364 -0
  69. package/dist/runner.js.map +1 -0
  70. package/dist/schema.d.ts +27 -0
  71. package/dist/schema.d.ts.map +1 -0
  72. package/dist/schema.js +373 -0
  73. package/dist/schema.js.map +1 -0
  74. package/dist/sdk.d.ts +27 -0
  75. package/dist/sdk.d.ts.map +1 -0
  76. package/dist/sdk.js +33 -0
  77. package/dist/sdk.js.map +1 -0
  78. package/dist/templates.d.ts +20 -0
  79. package/dist/templates.d.ts.map +1 -0
  80. package/dist/templates.js +93 -0
  81. package/dist/templates.js.map +1 -0
  82. package/dist/triggers/file.d.ts +3 -0
  83. package/dist/triggers/file.d.ts.map +1 -0
  84. package/dist/triggers/file.js +123 -0
  85. package/dist/triggers/file.js.map +1 -0
  86. package/dist/triggers/manual.d.ts +3 -0
  87. package/dist/triggers/manual.d.ts.map +1 -0
  88. package/dist/triggers/manual.js +73 -0
  89. package/dist/triggers/manual.js.map +1 -0
  90. package/dist/types.d.ts +4 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +14 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/utils.d.ts +14 -0
  95. package/dist/utils.d.ts.map +1 -0
  96. package/dist/utils.js +138 -0
  97. package/dist/utils.js.map +1 -0
  98. package/dist/validate-raw.d.ts +26 -0
  99. package/dist/validate-raw.d.ts.map +1 -0
  100. package/dist/validate-raw.js +260 -0
  101. package/dist/validate-raw.js.map +1 -0
  102. package/package.json +26 -17
  103. package/src/adapters/websocket-approval.ts +20 -4
  104. package/src/approval.ts +5 -3
  105. package/src/registry.ts +214 -214
  106. package/scripts/preinstall.js +0 -38
package/dist/schema.js ADDED
@@ -0,0 +1,373 @@
1
+ import yaml from 'js-yaml';
2
+ import { relative } from 'path';
3
+ import { truncateForName, validatePathParam, validatePath } from './utils';
4
+ import { DEFAULT_PERMISSIONS } from './types';
5
+ import { buildDag } from './dag';
6
+ // ═══ YAML Parsing ═══
7
+ export function parseYaml(content) {
8
+ const doc = yaml.load(content);
9
+ if (!doc?.pipeline) {
10
+ throw new Error('YAML must contain a top-level "pipeline" key');
11
+ }
12
+ const p = doc.pipeline;
13
+ if (!p.name)
14
+ throw new Error('pipeline.name is required');
15
+ if (!p.tracks || p.tracks.length === 0)
16
+ throw new Error('pipeline.tracks must be non-empty');
17
+ for (const track of p.tracks) {
18
+ validateRawTrack(track);
19
+ }
20
+ return p;
21
+ }
22
+ function validateRawTrack(track) {
23
+ if (!track.id)
24
+ throw new Error('track.id is required');
25
+ if (!track.name)
26
+ throw new Error(`track "${track.id}": name is required`);
27
+ if (!track.tasks || track.tasks.length === 0) {
28
+ throw new Error(`track "${track.id}": tasks must be non-empty`);
29
+ }
30
+ for (const task of track.tasks) {
31
+ validateRawTask(task, track.id);
32
+ }
33
+ }
34
+ function validateRawTask(task, trackId) {
35
+ if (!task.id)
36
+ throw new Error(`track "${trackId}": task.id is required`);
37
+ if (task.use)
38
+ return; // template usage, validated later
39
+ const hasPromptKey = typeof task.prompt === 'string';
40
+ const hasCommandKey = typeof task.command === 'string';
41
+ if (!hasPromptKey && !hasCommandKey) {
42
+ throw new Error(`task "${task.id}": must have either "prompt" or "command"`);
43
+ }
44
+ if (hasPromptKey && hasCommandKey) {
45
+ throw new Error(`task "${task.id}": cannot have both "prompt" and "command"`);
46
+ }
47
+ // Empty-content tasks (e.g. `prompt: ''`) are allowed at parse time and
48
+ // flagged as non-fatal validation errors by validate-raw.ts.
49
+ }
50
+ // ═══ Template Expansion ═══
51
+ export async function expandTemplates(tasks, instancePrefix) {
52
+ const result = [];
53
+ for (const task of tasks) {
54
+ if (!task.use) {
55
+ result.push(task);
56
+ continue;
57
+ }
58
+ const template = await loadTemplate(task.use);
59
+ const params = resolveTemplateParams(template, task.with ?? {}, task.id);
60
+ const expanded = expandTemplateTask(template, params, task.id, instancePrefix);
61
+ result.push(...expanded);
62
+ }
63
+ return result;
64
+ }
65
+ function validateTemplateRef(ref) {
66
+ const stripped = ref.replace(/@v\d+$/, '');
67
+ // Reject path traversal and absolute paths before they reach import().
68
+ if (stripped.includes('..') || stripped.startsWith('/') || /^[a-zA-Z]:/.test(stripped)) {
69
+ throw new Error(`Invalid template ref "${ref}": path traversal and absolute paths are not allowed. ` +
70
+ `Use a scoped package name, e.g. "@tagma/template-review".`);
71
+ }
72
+ // Whitelist: only @tagma/template-* packages are allowed.
73
+ if (!stripped.startsWith('@tagma/template-')) {
74
+ throw new Error(`Invalid template ref "${ref}": only "@tagma/template-*" packages are allowed as templates. ` +
75
+ `Example: "@tagma/template-review".`);
76
+ }
77
+ }
78
+ async function loadTemplate(ref) {
79
+ validateTemplateRef(ref);
80
+ // Strip version suffix for import
81
+ const moduleName = ref.replace(/@v\d+$/, '');
82
+ try {
83
+ const mod = await import(moduleName);
84
+ // Expect the module to export a template.yaml content or parsed object
85
+ if (mod.template)
86
+ return mod.template;
87
+ // Try loading template.yaml from the package.
88
+ // NOTE: require.resolve is a CommonJS API. Bun supports it natively, but
89
+ // this would need import.meta.resolve() for pure ESM runtimes (e.g. Deno).
90
+ const pkgPath = require.resolve(`${moduleName}/template.yaml`);
91
+ const content = await Bun.file(pkgPath).text();
92
+ const doc = yaml.load(content);
93
+ return doc.template;
94
+ }
95
+ catch (err) {
96
+ if (err instanceof Error && err.message.startsWith('Invalid template ref'))
97
+ throw err;
98
+ throw new Error(`Failed to load template: "${ref}". Is the package installed?`);
99
+ }
100
+ }
101
+ function resolveTemplateParams(template, provided, instanceId) {
102
+ const params = {};
103
+ const defs = template.params ?? {};
104
+ for (const [key, def] of Object.entries(defs)) {
105
+ const value = provided[key] ?? def.default;
106
+ if (value === undefined) {
107
+ throw new Error(`Template "${template.name}" instance "${instanceId}": missing required param "${key}"`);
108
+ }
109
+ validateParamType(key, value, def, template.name, instanceId);
110
+ params[key] = value;
111
+ }
112
+ // Warn about unknown params
113
+ for (const key of Object.keys(provided)) {
114
+ if (!(key in defs)) {
115
+ console.warn(`Template "${template.name}" instance "${instanceId}": unknown param "${key}"`);
116
+ }
117
+ }
118
+ return params;
119
+ }
120
+ function validateParamType(key, value, def, templateName, instanceId) {
121
+ const ctx = `Template "${templateName}" instance "${instanceId}" param "${key}"`;
122
+ const ptype = def.type ?? 'string';
123
+ switch (ptype) {
124
+ case 'string':
125
+ if (typeof value !== 'string')
126
+ throw new Error(`${ctx}: expected string, got ${typeof value}`);
127
+ break;
128
+ case 'path':
129
+ if (typeof value !== 'string')
130
+ throw new Error(`${ctx}: expected path string, got ${typeof value}`);
131
+ validatePathParam(value);
132
+ break;
133
+ case 'enum':
134
+ if (!def.enum?.includes(value)) {
135
+ throw new Error(`${ctx}: value "${value}" not in allowed values [${def.enum?.join(', ')}]`);
136
+ }
137
+ break;
138
+ case 'number':
139
+ if (typeof value !== 'number')
140
+ throw new Error(`${ctx}: expected number, got ${typeof value}`);
141
+ if (def.min !== undefined && value < def.min)
142
+ throw new Error(`${ctx}: ${value} < min ${def.min}`);
143
+ if (def.max !== undefined && value > def.max)
144
+ throw new Error(`${ctx}: ${value} > max ${def.max}`);
145
+ break;
146
+ }
147
+ }
148
+ function expandTemplateTask(template, params, instanceId, instancePrefix) {
149
+ return template.tasks.map(task => {
150
+ const prefixedId = `${instanceId}.${task.id}`;
151
+ // Replace ${{ params.xxx }} in string fields
152
+ const interpolate = (s) => s.replace(/\$\{\{\s*params\.(\w+)\s*\}\}/g, (_, key) => String(params[key] ?? ''));
153
+ const newTask = { ...task, id: prefixedId };
154
+ // Interpolate string fields
155
+ if (task.prompt)
156
+ newTask.prompt = interpolate(task.prompt);
157
+ if (task.command)
158
+ newTask.command = interpolate(task.command);
159
+ // Namespace depends_on
160
+ if (task.depends_on) {
161
+ newTask.depends_on = task.depends_on.map(dep => `${instanceId}.${dep}`);
162
+ }
163
+ // Namespace continue_from
164
+ if (task.continue_from) {
165
+ newTask.continue_from = `${instanceId}.${task.continue_from}`;
166
+ }
167
+ // Rewrite output path to instance namespace so parallel template
168
+ // instances don't collide on the same file. Handles any relative path
169
+ // (e.g. ./tmp/foo, ./output/bar, ./build/result.json) by injecting
170
+ // the instanceId as the first directory component after `./`.
171
+ if (task.output) {
172
+ const original = interpolate(task.output);
173
+ newTask.output = original.startsWith('./')
174
+ ? `./${instanceId}/${original.slice(2)}`
175
+ : `${instanceId}/${original}`;
176
+ }
177
+ return newTask;
178
+ });
179
+ }
180
+ // ═══ Config Inheritance Resolution ═══
181
+ export function resolveConfig(raw, workDir) {
182
+ // Build qualified ID set for resolving bare continue_from references
183
+ const allQualifiedIds = new Set();
184
+ for (const t of raw.tracks) {
185
+ if (!t.id)
186
+ continue;
187
+ for (const tk of t.tasks ?? []) {
188
+ if (tk.id)
189
+ allQualifiedIds.add(`${t.id}.${tk.id}`);
190
+ }
191
+ }
192
+ function qualifyContinueFrom(ref, trackId) {
193
+ // Already qualified
194
+ if (allQualifiedIds.has(ref))
195
+ return ref;
196
+ // Same-track shorthand
197
+ const sameTrack = `${trackId}.${ref}`;
198
+ if (allQualifiedIds.has(sameTrack))
199
+ return sameTrack;
200
+ // Cross-track bare lookup — must be unambiguous
201
+ let match = null;
202
+ for (const qid of allQualifiedIds) {
203
+ if (qid.endsWith(`.${ref}`)) {
204
+ if (match !== null)
205
+ return ref; // ambiguous — leave as-is
206
+ match = qid;
207
+ }
208
+ }
209
+ return match ?? ref; // not found — leave as-is (validated elsewhere)
210
+ }
211
+ const tracks = raw.tracks.map(rawTrack => {
212
+ const trackDriver = rawTrack.driver ?? raw.driver;
213
+ // validatePath enforces no .. traversal and no absolute paths escaping workDir.
214
+ const trackCwd = rawTrack.cwd ? validatePath(rawTrack.cwd, workDir) : workDir;
215
+ const tasks = rawTrack.tasks.map(rawTask => {
216
+ const name = rawTask.name
217
+ ?? (rawTask.prompt ? truncateForName(rawTask.prompt) : rawTask.command ?? rawTask.id);
218
+ return {
219
+ id: rawTask.id,
220
+ name,
221
+ prompt: rawTask.prompt,
222
+ command: rawTask.command,
223
+ depends_on: rawTask.depends_on,
224
+ trigger: rawTask.trigger,
225
+ continue_from: rawTask.continue_from
226
+ ? qualifyContinueFrom(rawTask.continue_from, rawTrack.id)
227
+ : undefined,
228
+ output: rawTask.output,
229
+ // Inheritance: Task > Track
230
+ model_tier: rawTask.model_tier ?? rawTrack.model_tier ?? 'medium',
231
+ permissions: rawTask.permissions ?? rawTrack.permissions ?? DEFAULT_PERMISSIONS,
232
+ driver: rawTask.driver ?? trackDriver ?? 'claude-code',
233
+ timeout: rawTask.timeout,
234
+ // Middleware: Task-level overrides Track (including [] to disable)
235
+ middlewares: rawTask.middlewares !== undefined ? rawTask.middlewares : rawTrack.middlewares,
236
+ completion: rawTask.completion,
237
+ agent_profile: rawTask.agent_profile ?? rawTrack.agent_profile,
238
+ cwd: rawTask.cwd ? validatePath(rawTask.cwd, workDir) : trackCwd,
239
+ };
240
+ });
241
+ return {
242
+ id: rawTrack.id,
243
+ name: rawTrack.name,
244
+ color: rawTrack.color,
245
+ agent_profile: rawTrack.agent_profile,
246
+ model_tier: rawTrack.model_tier ?? 'medium',
247
+ permissions: rawTrack.permissions ?? DEFAULT_PERMISSIONS,
248
+ driver: trackDriver ?? 'claude-code',
249
+ cwd: trackCwd,
250
+ middlewares: rawTrack.middlewares,
251
+ on_failure: rawTrack.on_failure ?? 'skip_downstream',
252
+ tasks,
253
+ };
254
+ });
255
+ return {
256
+ name: raw.name,
257
+ driver: raw.driver,
258
+ timeout: raw.timeout,
259
+ plugins: raw.plugins,
260
+ hooks: raw.hooks,
261
+ tracks,
262
+ };
263
+ }
264
+ // Field-by-field permissions comparison — avoids relying on JSON.stringify key order.
265
+ function permissionsEqual(a, b) {
266
+ if (a === b)
267
+ return true;
268
+ if (!a || !b)
269
+ return false;
270
+ return a.read === b.read && a.write === b.write && a.execute === b.execute;
271
+ }
272
+ // ═══ YAML Serialization ═══
273
+ /**
274
+ * Serialize a pipeline config back to YAML string.
275
+ * Wraps the config under the top-level `pipeline` key as expected by parseYaml.
276
+ */
277
+ export function serializePipeline(config) {
278
+ return yaml.dump({ pipeline: config }, { lineWidth: 120, indent: 2 });
279
+ }
280
+ /**
281
+ * Convert a resolved PipelineConfig back to a RawPipelineConfig for serialization.
282
+ * Strips injected defaults and converts absolute cwd paths back to relative so the
283
+ * resulting YAML is portable across machines.
284
+ *
285
+ * Use this when you need to save a config that was previously loaded via
286
+ * loadPipeline(). For a pure load→edit→save cycle on raw YAML, prefer
287
+ * parseYaml() → edit RawPipelineConfig → serializePipeline().
288
+ */
289
+ export function deresolvePipeline(config, workDir) {
290
+ const tracks = config.tracks.map(track => {
291
+ const trackCwdRel = track.cwd && track.cwd !== workDir
292
+ ? relative(workDir, track.cwd)
293
+ : undefined;
294
+ const effectiveTrackDriver = track.driver ?? config.driver ?? 'claude-code';
295
+ const tasks = track.tasks.map(task => {
296
+ const taskCwdRel = task.cwd && task.cwd !== track.cwd
297
+ ? relative(workDir, task.cwd)
298
+ : undefined;
299
+ return {
300
+ id: task.id,
301
+ ...(task.name ? { name: task.name } : {}),
302
+ ...(task.prompt !== undefined ? { prompt: task.prompt } : {}),
303
+ ...(task.command !== undefined ? { command: task.command } : {}),
304
+ ...(task.depends_on?.length ? { depends_on: task.depends_on } : {}),
305
+ ...(task.trigger ? { trigger: task.trigger } : {}),
306
+ ...(task.continue_from ? { continue_from: task.continue_from } : {}),
307
+ ...(task.output ? { output: task.output } : {}),
308
+ ...(taskCwdRel ? { cwd: taskCwdRel } : {}),
309
+ ...(task.model_tier && task.model_tier !== 'medium' ? { model_tier: task.model_tier } : {}),
310
+ ...(task.driver && task.driver !== effectiveTrackDriver ? { driver: task.driver } : {}),
311
+ ...(task.timeout ? { timeout: task.timeout } : {}),
312
+ ...(task.middlewares !== undefined ? { middlewares: task.middlewares } : {}),
313
+ ...(task.completion ? { completion: task.completion } : {}),
314
+ ...(task.agent_profile ? { agent_profile: task.agent_profile } : {}),
315
+ ...(task.permissions && !permissionsEqual(task.permissions, track.permissions)
316
+ ? { permissions: task.permissions }
317
+ : {}),
318
+ };
319
+ });
320
+ return {
321
+ id: track.id,
322
+ name: track.name,
323
+ ...(track.color ? { color: track.color } : {}),
324
+ ...(track.agent_profile ? { agent_profile: track.agent_profile } : {}),
325
+ ...(track.model_tier && track.model_tier !== 'medium' ? { model_tier: track.model_tier } : {}),
326
+ ...(track.driver && track.driver !== (config.driver ?? 'claude-code') ? { driver: track.driver } : {}),
327
+ ...(trackCwdRel ? { cwd: trackCwdRel } : {}),
328
+ ...(track.middlewares?.length ? { middlewares: track.middlewares } : {}),
329
+ ...(track.on_failure && track.on_failure !== 'skip_downstream' ? { on_failure: track.on_failure } : {}),
330
+ ...(track.permissions && !permissionsEqual(track.permissions, DEFAULT_PERMISSIONS)
331
+ ? { permissions: track.permissions }
332
+ : {}),
333
+ tasks,
334
+ };
335
+ });
336
+ return {
337
+ name: config.name,
338
+ ...(config.driver ? { driver: config.driver } : {}),
339
+ ...(config.timeout ? { timeout: config.timeout } : {}),
340
+ ...(config.plugins?.length ? { plugins: config.plugins } : {}),
341
+ ...(config.hooks ? { hooks: config.hooks } : {}),
342
+ tracks,
343
+ };
344
+ }
345
+ // ═══ Offline Validation ═══
346
+ /**
347
+ * Validate a pipeline config without executing it.
348
+ * Only checks structural/DAG correctness — does not check plugin registration.
349
+ * Returns an array of error messages (empty = valid).
350
+ */
351
+ export function validateConfig(config) {
352
+ const errors = [];
353
+ try {
354
+ buildDag(config);
355
+ }
356
+ catch (err) {
357
+ errors.push(err instanceof Error ? err.message : String(err));
358
+ }
359
+ return errors;
360
+ }
361
+ // ═══ Full Parse Pipeline ═══
362
+ export async function loadPipeline(yamlContent, workDir) {
363
+ const raw = parseYaml(yamlContent);
364
+ // Expand templates in each track
365
+ const expandedTracks = [];
366
+ for (const track of raw.tracks) {
367
+ const expandedTasks = await expandTemplates(track.tasks, track.id);
368
+ expandedTracks.push({ ...track, tasks: expandedTasks });
369
+ }
370
+ const expandedRaw = { ...raw, tracks: expandedTracks };
371
+ return resolveConfig(expandedRaw, workDir);
372
+ }
373
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/dist/sdk.d.ts ADDED
@@ -0,0 +1,27 @@
1
+ export { runPipeline, TriggerBlockedError, TriggerTimeoutError } from './engine';
2
+ export type { EngineResult, RunPipelineOptions, PipelineEvent } from './engine';
3
+ export { PipelineRunner } from './pipeline-runner';
4
+ export type { PipelineRunnerStatus } from './pipeline-runner';
5
+ export { createEmptyPipeline, setPipelineField, upsertTrack, removeTrack, moveTrack, updateTrack, upsertTask, removeTask, moveTask, transferTask, } from './config-ops';
6
+ export { validateRaw } from './validate-raw';
7
+ export type { ValidationError } from './validate-raw';
8
+ export { parseYaml, resolveConfig, expandTemplates, loadPipeline, serializePipeline, deresolvePipeline, validateConfig } from './schema';
9
+ export { discoverTemplates, loadTemplateManifest } from './templates';
10
+ export type { TemplateManifest } from './templates';
11
+ export { buildDag, buildRawDag } from './dag';
12
+ export type { DagNode, Dag, RawDagNode, RawDag } from './dag';
13
+ export { bootstrapBuiltins } from './bootstrap';
14
+ export { loadPlugins, registerPlugin, unregisterPlugin, getHandler, hasHandler, listRegistered, isValidPluginName, PLUGIN_NAME_RE, readPluginManifest, } from './registry';
15
+ export type { RegisterResult } from './registry';
16
+ export { InMemoryApprovalGateway } from './approval';
17
+ export type { ApprovalGateway, ApprovalRequest, ApprovalDecision, ApprovalOutcome, ApprovalEvent, ApprovalListener, } from './approval';
18
+ export { attachStdinApprovalAdapter } from './adapters/stdin-approval';
19
+ export type { StdinApprovalAdapter } from './adapters/stdin-approval';
20
+ export { attachWebSocketApprovalAdapter } from './adapters/websocket-approval';
21
+ export type { WebSocketApprovalAdapter, WebSocketApprovalAdapterOptions } from './adapters/websocket-approval';
22
+ export { Logger, tailLines, clip } from './logger';
23
+ export type { LogRecord, LogLevel, LogListener } from './logger';
24
+ export type { HookResult, PipelineInfo, TrackInfo, TaskInfo } from './hooks';
25
+ export { parseDuration, validatePath, generateRunId, nowISO, truncateForName } from './utils';
26
+ export * from './types';
27
+ //# sourceMappingURL=sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACjF,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGhF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,QAAQ,EACR,YAAY,GACb,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGzI,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9C,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,YAAY,EACV,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAC/E,YAAY,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAG/G,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACnD,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGjE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG7E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG9F,cAAc,SAAS,CAAC"}
package/dist/sdk.js ADDED
@@ -0,0 +1,33 @@
1
+ // ═══ tagma-sdk public API ═══
2
+ //
3
+ // This is the SDK entry point. Import from here, not from internal modules.
4
+ // The CLI (src/index.ts in the CLI project) also imports from here.
5
+ // ── Core engine ──
6
+ export { runPipeline, TriggerBlockedError, TriggerTimeoutError } from './engine';
7
+ // ── Pipeline runner (multi-pipeline lifecycle management) ──
8
+ export { PipelineRunner } from './pipeline-runner';
9
+ // ── Raw config CRUD (visual editor / YAML sync) ──
10
+ export { createEmptyPipeline, setPipelineField, upsertTrack, removeTrack, moveTrack, updateTrack, upsertTask, removeTask, moveTask, transferTask, } from './config-ops';
11
+ // ── Raw config validation (real-time feedback) ──
12
+ export { validateRaw } from './validate-raw';
13
+ // ── Schema: parse / resolve / load / serialize / validate ──
14
+ export { parseYaml, resolveConfig, expandTemplates, loadPipeline, serializePipeline, deresolvePipeline, validateConfig } from './schema';
15
+ // ── Templates: discovery + manifest loading (F1) ──
16
+ export { discoverTemplates, loadTemplateManifest } from './templates';
17
+ // ── DAG ──
18
+ export { buildDag, buildRawDag } from './dag';
19
+ // ── Plugin registry ──
20
+ export { bootstrapBuiltins } from './bootstrap';
21
+ export { loadPlugins, registerPlugin, unregisterPlugin, getHandler, hasHandler, listRegistered, isValidPluginName, PLUGIN_NAME_RE, readPluginManifest, } from './registry';
22
+ // ── Approval gateway ──
23
+ export { InMemoryApprovalGateway } from './approval';
24
+ // ── Approval adapters ──
25
+ export { attachStdinApprovalAdapter } from './adapters/stdin-approval';
26
+ export { attachWebSocketApprovalAdapter } from './adapters/websocket-approval';
27
+ // ── Logger ──
28
+ export { Logger, tailLines, clip } from './logger';
29
+ // ── Utils (public subset) ──
30
+ export { parseDuration, validatePath, generateRunId, nowISO, truncateForName } from './utils';
31
+ // ── All types from @tagma/types + runtime constants ──
32
+ export * from './types';
33
+ //# sourceMappingURL=sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,EAAE;AACF,4EAA4E;AAC5E,oEAAoE;AAEpE,oBAAoB;AACpB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAGjF,8DAA8D;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,oDAAoD;AACpD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,QAAQ,EACR,YAAY,GACb,MAAM,cAAc,CAAC;AAEtB,mDAAmD;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,8DAA8D;AAC9D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEzI,qDAAqD;AACrD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGtE,YAAY;AACZ,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAG9C,wBAAwB;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,yBAAyB;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAUrD,0BAA0B;AAC1B,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAEvE,OAAO,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAC;AAG/E,eAAe;AACf,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAMnD,8BAA8B;AAC9B,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE9F,wDAAwD;AACxD,cAAc,SAAS,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { TemplateConfig } from './types';
2
+ export interface TemplateManifest extends TemplateConfig {
3
+ /** The package ref as it would appear in `task.use`, e.g. `@tagma/template-review`. */
4
+ readonly ref: string;
5
+ }
6
+ /**
7
+ * Scan the workspace's `node_modules/@tagma/*` for packages whose name starts
8
+ * with `template-` and load each one's manifest. Packages without a valid
9
+ * `template.yaml` (or that fail to parse) are silently skipped.
10
+ *
11
+ * Returns an empty array when `workDir` doesn't exist or has no such packages.
12
+ */
13
+ export declare function discoverTemplates(workDir: string): TemplateManifest[];
14
+ /**
15
+ * Load a single template's manifest by its ref (e.g. `@tagma/template-review`)
16
+ * from the given workspace's `node_modules`. Returns `null` if the package
17
+ * isn't installed or its manifest can't be parsed.
18
+ */
19
+ export declare function loadTemplateManifest(ref: string, workDir: string): TemplateManifest | null;
20
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,uFAAuF;IACvF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CA8BrE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAO1F"}
@@ -0,0 +1,93 @@
1
+ // ═══ Template Discovery (F1) ═══
2
+ //
3
+ // Public helpers so editors / UIs can enumerate installed `@tagma/template-*`
4
+ // packages in a workspace and read each template's declarative metadata
5
+ // (name, description, params) without actually expanding the template.
6
+ //
7
+ // The legacy private `loadTemplate` in schema.ts uses Bun-specific APIs
8
+ // (Bun.file, require.resolve). These helpers are Node-compatible because
9
+ // the editor server runs on Node, not Bun.
10
+ import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
11
+ import { join } from 'path';
12
+ import yaml from 'js-yaml';
13
+ /**
14
+ * Scan the workspace's `node_modules/@tagma/*` for packages whose name starts
15
+ * with `template-` and load each one's manifest. Packages without a valid
16
+ * `template.yaml` (or that fail to parse) are silently skipped.
17
+ *
18
+ * Returns an empty array when `workDir` doesn't exist or has no such packages.
19
+ */
20
+ export function discoverTemplates(workDir) {
21
+ const out = [];
22
+ const scopeDir = join(workDir, 'node_modules', '@tagma');
23
+ if (!existsSync(scopeDir))
24
+ return out;
25
+ let entries = [];
26
+ try {
27
+ entries = readdirSync(scopeDir);
28
+ }
29
+ catch {
30
+ return out;
31
+ }
32
+ for (const entry of entries) {
33
+ if (!entry.startsWith('template-'))
34
+ continue;
35
+ const pkgDir = join(scopeDir, entry);
36
+ try {
37
+ const st = statSync(pkgDir);
38
+ if (!st.isDirectory())
39
+ continue;
40
+ }
41
+ catch {
42
+ continue;
43
+ }
44
+ const ref = `@tagma/${entry}`;
45
+ const manifest = loadTemplateManifestFromDir(pkgDir, ref);
46
+ if (manifest)
47
+ out.push(manifest);
48
+ }
49
+ // Sort alphabetically for deterministic UI rendering.
50
+ out.sort((a, b) => a.ref.localeCompare(b.ref));
51
+ return out;
52
+ }
53
+ /**
54
+ * Load a single template's manifest by its ref (e.g. `@tagma/template-review`)
55
+ * from the given workspace's `node_modules`. Returns `null` if the package
56
+ * isn't installed or its manifest can't be parsed.
57
+ */
58
+ export function loadTemplateManifest(ref, workDir) {
59
+ // Only @tagma/template-* refs are supported (matches SDK validateTemplateRef).
60
+ const stripped = ref.replace(/@v\d+$/, '');
61
+ if (!stripped.startsWith('@tagma/template-'))
62
+ return null;
63
+ const pkgDir = join(workDir, 'node_modules', stripped);
64
+ if (!existsSync(pkgDir))
65
+ return null;
66
+ return loadTemplateManifestFromDir(pkgDir, stripped);
67
+ }
68
+ /**
69
+ * Resolve a template manifest from an absolute package directory. Tries
70
+ * `template.yaml` first (the documented convention), then a `template` export
71
+ * from `package.json`'s `main`. Returns `null` on any failure so discovery
72
+ * stays robust against malformed packages.
73
+ */
74
+ function loadTemplateManifestFromDir(pkgDir, ref) {
75
+ const yamlPath = join(pkgDir, 'template.yaml');
76
+ if (existsSync(yamlPath)) {
77
+ try {
78
+ const content = readFileSync(yamlPath, 'utf-8');
79
+ const doc = yaml.load(content);
80
+ const tpl = (doc && typeof doc === 'object' && 'template' in doc
81
+ ? doc.template
82
+ : doc);
83
+ if (tpl && typeof tpl === 'object' && tpl.name && Array.isArray(tpl.tasks)) {
84
+ return { ...tpl, ref };
85
+ }
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ return null;
92
+ }
93
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TriggerPlugin } from '../types';
2
+ export declare const FileTrigger: TriggerPlugin;
3
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/triggers/file.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,UAAU,CAAC;AAU9D,eAAO,MAAM,WAAW,EAAE,aAmHzB,CAAC"}