@tagma/sdk 0.4.14 → 0.4.16

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 (67) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +569 -569
  3. package/dist/dag.d.ts.map +1 -1
  4. package/dist/dag.js +58 -69
  5. package/dist/dag.js.map +1 -1
  6. package/dist/engine.d.ts.map +1 -1
  7. package/dist/engine.js +63 -37
  8. package/dist/engine.js.map +1 -1
  9. package/dist/middlewares/static-context.d.ts.map +1 -1
  10. package/dist/middlewares/static-context.js +7 -3
  11. package/dist/middlewares/static-context.js.map +1 -1
  12. package/dist/prompt-doc.d.ts +36 -0
  13. package/dist/prompt-doc.d.ts.map +1 -0
  14. package/dist/prompt-doc.js +44 -0
  15. package/dist/prompt-doc.js.map +1 -0
  16. package/dist/registry.d.ts.map +1 -1
  17. package/dist/registry.js +11 -0
  18. package/dist/registry.js.map +1 -1
  19. package/dist/sdk.d.ts +3 -0
  20. package/dist/sdk.d.ts.map +1 -1
  21. package/dist/sdk.js +4 -0
  22. package/dist/sdk.js.map +1 -1
  23. package/dist/task-ref.d.ts +55 -0
  24. package/dist/task-ref.d.ts.map +1 -0
  25. package/dist/task-ref.js +101 -0
  26. package/dist/task-ref.js.map +1 -0
  27. package/dist/task-ref.test.d.ts +2 -0
  28. package/dist/task-ref.test.d.ts.map +1 -0
  29. package/dist/task-ref.test.js +364 -0
  30. package/dist/task-ref.test.js.map +1 -0
  31. package/dist/templates.d.ts +20 -0
  32. package/dist/templates.d.ts.map +1 -0
  33. package/dist/templates.js +93 -0
  34. package/dist/templates.js.map +1 -0
  35. package/dist/validate-raw.d.ts.map +1 -1
  36. package/dist/validate-raw.js +27 -53
  37. package/dist/validate-raw.js.map +1 -1
  38. package/package.json +2 -2
  39. package/scripts/preinstall.js +31 -31
  40. package/src/adapters/stdin-approval.ts +106 -106
  41. package/src/adapters/websocket-approval.ts +224 -224
  42. package/src/approval.ts +131 -131
  43. package/src/bootstrap.ts +37 -37
  44. package/src/completions/exit-code.ts +34 -34
  45. package/src/completions/file-exists.ts +66 -66
  46. package/src/completions/output-check.ts +86 -86
  47. package/src/config-ops.ts +307 -307
  48. package/src/dag.ts +61 -67
  49. package/src/drivers/claude-code.ts +250 -250
  50. package/src/engine.ts +1137 -1098
  51. package/src/hooks.ts +187 -187
  52. package/src/logger.ts +182 -182
  53. package/src/middlewares/static-context.ts +49 -45
  54. package/src/pipeline-runner.ts +156 -156
  55. package/src/prompt-doc.ts +49 -0
  56. package/src/registry.ts +255 -242
  57. package/src/runner.ts +395 -395
  58. package/src/schema.test.ts +101 -101
  59. package/src/schema.ts +338 -338
  60. package/src/sdk.ts +111 -92
  61. package/src/task-ref.test.ts +401 -0
  62. package/src/task-ref.ts +120 -0
  63. package/src/triggers/file.ts +164 -164
  64. package/src/triggers/manual.ts +86 -86
  65. package/src/types.ts +18 -18
  66. package/src/utils.ts +203 -203
  67. package/src/validate-raw.ts +412 -442
@@ -0,0 +1,364 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+ import { TASK_ID_RE, isValidTaskId, qualifyTaskId, isQualifiedRef, buildTaskIndex, resolveTaskRef, AMBIGUOUS, } from './task-ref';
3
+ import { buildDag, buildRawDag } from './dag';
4
+ import { validateRaw } from './validate-raw';
5
+ // ═══ Low-level helpers ═══
6
+ describe('isValidTaskId', () => {
7
+ test('accepts letter-led ids with letters, digits, underscores, hyphens', () => {
8
+ for (const id of ['a', 'A', '_', 'task_1', 'Task-2', '_private', 'a_b-c_1']) {
9
+ expect(isValidTaskId(id)).toBe(true);
10
+ expect(TASK_ID_RE.test(id)).toBe(true);
11
+ }
12
+ });
13
+ test('rejects empty, digit-led, dot-bearing, and whitespace forms', () => {
14
+ for (const id of ['', '1task', 'a.b', 'foo bar', '-leading', 'has/slash', 'dot.']) {
15
+ expect(isValidTaskId(id)).toBe(false);
16
+ }
17
+ });
18
+ test('rejects non-string values', () => {
19
+ expect(isValidTaskId(null)).toBe(false);
20
+ expect(isValidTaskId(undefined)).toBe(false);
21
+ expect(isValidTaskId(42)).toBe(false);
22
+ });
23
+ });
24
+ describe('qualifyTaskId + isQualifiedRef', () => {
25
+ test('qualifyTaskId joins with dot; isQualifiedRef detects dotted form', () => {
26
+ expect(qualifyTaskId('alpha', 'review')).toBe('alpha.review');
27
+ expect(isQualifiedRef('alpha.review')).toBe(true);
28
+ expect(isQualifiedRef('review')).toBe(false);
29
+ });
30
+ });
31
+ // ═══ Index build ═══
32
+ describe('buildTaskIndex', () => {
33
+ test('collects all qualified ids and unique bare ids', () => {
34
+ const cfg = {
35
+ name: 'T',
36
+ tracks: [
37
+ { id: 'alpha', name: 'A', tasks: [{ id: 'plan', prompt: 'p' }] },
38
+ { id: 'beta', name: 'B', tasks: [{ id: 'ship', prompt: 'p' }] },
39
+ ],
40
+ };
41
+ const idx = buildTaskIndex(cfg);
42
+ expect(idx.allQualified.has('alpha.plan')).toBe(true);
43
+ expect(idx.allQualified.has('beta.ship')).toBe(true);
44
+ expect(idx.bareToQualified.get('plan')).toBe('alpha.plan');
45
+ expect(idx.bareToQualified.get('ship')).toBe('beta.ship');
46
+ });
47
+ test('marks bare ids shared across tracks as ambiguous', () => {
48
+ const cfg = {
49
+ name: 'T',
50
+ tracks: [
51
+ { id: 'alpha', name: 'A', tasks: [{ id: 'review', prompt: 'p' }] },
52
+ { id: 'beta', name: 'B', tasks: [{ id: 'review', prompt: 'p' }] },
53
+ ],
54
+ };
55
+ const idx = buildTaskIndex(cfg);
56
+ expect(idx.bareToQualified.get('review')).toBe(AMBIGUOUS);
57
+ expect(idx.allQualified.has('alpha.review')).toBe(true);
58
+ expect(idx.allQualified.has('beta.review')).toBe(true);
59
+ });
60
+ test('tolerates tracks/tasks missing ids (editor in-progress state)', () => {
61
+ const cfg = {
62
+ name: 'T',
63
+ tracks: [
64
+ { id: '', name: 'half-typed', tasks: [{ id: 'x', prompt: 'p' }] },
65
+ { id: 'ok', name: 'OK', tasks: [{ id: '', prompt: 'p' }, { id: 'y', prompt: 'p' }] },
66
+ ],
67
+ };
68
+ const idx = buildTaskIndex(cfg);
69
+ expect(idx.allQualified.size).toBe(1);
70
+ expect(idx.allQualified.has('ok.y')).toBe(true);
71
+ });
72
+ });
73
+ // ═══ Ref resolution ═══
74
+ describe('resolveTaskRef', () => {
75
+ const cfg = {
76
+ name: 'T',
77
+ tracks: [
78
+ {
79
+ id: 'alpha',
80
+ name: 'A',
81
+ tasks: [
82
+ { id: 'plan', prompt: 'p' },
83
+ { id: 'review', prompt: 'p' },
84
+ ],
85
+ },
86
+ {
87
+ id: 'beta',
88
+ name: 'B',
89
+ tasks: [
90
+ { id: 'review', prompt: 'p' },
91
+ { id: 'ship', prompt: 'p' },
92
+ ],
93
+ },
94
+ ],
95
+ };
96
+ const idx = buildTaskIndex(cfg);
97
+ test('fully qualified ref resolves when it exists', () => {
98
+ expect(resolveTaskRef('alpha.plan', 'beta', idx)).toEqual({
99
+ kind: 'resolved',
100
+ qid: 'alpha.plan',
101
+ });
102
+ });
103
+ test('fully qualified ref that does not exist is not_found', () => {
104
+ expect(resolveTaskRef('alpha.ghost', 'beta', idx)).toEqual({
105
+ kind: 'not_found',
106
+ ref: 'alpha.ghost',
107
+ });
108
+ });
109
+ test('bare ref prefers same-track shorthand', () => {
110
+ // "review" exists in both tracks — from beta's perspective, the same-
111
+ // track shadow must win over the cross-track ambiguous pool.
112
+ expect(resolveTaskRef('review', 'beta', idx)).toEqual({
113
+ kind: 'resolved',
114
+ qid: 'beta.review',
115
+ });
116
+ expect(resolveTaskRef('review', 'alpha', idx)).toEqual({
117
+ kind: 'resolved',
118
+ qid: 'alpha.review',
119
+ });
120
+ });
121
+ test('bare ref not in current track is ambiguous when multiple tracks have it', () => {
122
+ const twoForeign = {
123
+ name: 'T',
124
+ tracks: [
125
+ { id: 'a', name: 'A', tasks: [{ id: 'review', prompt: 'p' }] },
126
+ { id: 'b', name: 'B', tasks: [{ id: 'review', prompt: 'p' }] },
127
+ { id: 'c', name: 'C', tasks: [{ id: 'other', prompt: 'p' }] },
128
+ ],
129
+ };
130
+ const idx2 = buildTaskIndex(twoForeign);
131
+ expect(resolveTaskRef('review', 'c', idx2)).toEqual({ kind: 'ambiguous', ref: 'review' });
132
+ });
133
+ test('bare ref unique in the pool resolves cross-track', () => {
134
+ expect(resolveTaskRef('ship', 'alpha', idx)).toEqual({
135
+ kind: 'resolved',
136
+ qid: 'beta.ship',
137
+ });
138
+ });
139
+ test('bare ref nobody has is not_found', () => {
140
+ expect(resolveTaskRef('nowhere', 'alpha', idx)).toEqual({
141
+ kind: 'not_found',
142
+ ref: 'nowhere',
143
+ });
144
+ });
145
+ });
146
+ // ═══ Regression: bug #2 — same bare task id in multiple tracks ═══
147
+ describe('regression: continue_from across same-named tasks (bug #2)', () => {
148
+ test('bare continue_from resolves via same-track shadow — qualified id handed downstream', () => {
149
+ // Two tracks, each with a "review" task and a follower that continues
150
+ // from it. The follower MUST bind to its own track's review via the
151
+ // same-track shorthand, not to the other track's review.
152
+ const resolved = {
153
+ name: 'Same-Bare',
154
+ tracks: [
155
+ {
156
+ id: 'alpha',
157
+ name: 'Alpha',
158
+ tasks: [
159
+ { id: 'review', name: 'Review', prompt: 'do A' },
160
+ {
161
+ id: 'ship',
162
+ name: 'Ship',
163
+ prompt: 'ship A',
164
+ depends_on: ['review'],
165
+ continue_from: 'review',
166
+ },
167
+ ],
168
+ },
169
+ {
170
+ id: 'beta',
171
+ name: 'Beta',
172
+ tasks: [
173
+ { id: 'review', name: 'Review', prompt: 'do B' },
174
+ {
175
+ id: 'ship',
176
+ name: 'Ship',
177
+ prompt: 'ship B',
178
+ depends_on: ['review'],
179
+ continue_from: 'review',
180
+ },
181
+ ],
182
+ },
183
+ ],
184
+ };
185
+ const dag = buildDag(resolved);
186
+ const alphaShip = dag.nodes.get('alpha.ship');
187
+ const betaShip = dag.nodes.get('beta.ship');
188
+ expect(alphaShip.resolvedContinueFrom).toBe('alpha.review');
189
+ expect(betaShip.resolvedContinueFrom).toBe('beta.review');
190
+ // And the dep edges get qualified too, preventing engine map-key misses.
191
+ expect(alphaShip.dependsOn).toContain('alpha.review');
192
+ expect(betaShip.dependsOn).toContain('beta.review');
193
+ });
194
+ test('bare continue_from pointing at a foreign ambiguous task throws', () => {
195
+ const resolved = {
196
+ name: 'Ambiguous',
197
+ tracks: [
198
+ {
199
+ id: 'alpha',
200
+ name: 'Alpha',
201
+ tasks: [
202
+ { id: 'review', name: 'Review', prompt: 'p' },
203
+ // ship has no local "review" so bare "review" is ambiguous.
204
+ { id: 'filler', name: 'Filler', prompt: 'p' },
205
+ ],
206
+ },
207
+ {
208
+ id: 'beta',
209
+ name: 'Beta',
210
+ tasks: [{ id: 'review', name: 'Review', prompt: 'p' }],
211
+ },
212
+ {
213
+ id: 'gamma',
214
+ name: 'Gamma',
215
+ tasks: [
216
+ {
217
+ id: 'ship',
218
+ name: 'Ship',
219
+ prompt: 'ship',
220
+ continue_from: 'review',
221
+ },
222
+ ],
223
+ },
224
+ ],
225
+ };
226
+ expect(() => buildDag(resolved)).toThrow(/ambiguous/i);
227
+ });
228
+ test('qualified continue_from always wins — no same-track-shadow risk', () => {
229
+ const resolved = {
230
+ name: 'Qualified',
231
+ tracks: [
232
+ {
233
+ id: 'alpha',
234
+ name: 'Alpha',
235
+ tasks: [
236
+ { id: 'plan', name: 'Plan', prompt: 'p' },
237
+ {
238
+ id: 'plan_v2',
239
+ name: 'Plan v2',
240
+ prompt: 'p2',
241
+ continue_from: 'plan',
242
+ },
243
+ ],
244
+ },
245
+ {
246
+ id: 'beta',
247
+ name: 'Beta',
248
+ tasks: [
249
+ { id: 'plan', name: 'Plan B', prompt: 'p' },
250
+ {
251
+ id: 'cross',
252
+ name: 'Cross',
253
+ prompt: 'x',
254
+ continue_from: 'alpha.plan',
255
+ },
256
+ ],
257
+ },
258
+ ],
259
+ };
260
+ const dag = buildDag(resolved);
261
+ expect(dag.nodes.get('alpha.plan_v2').resolvedContinueFrom).toBe('alpha.plan');
262
+ expect(dag.nodes.get('beta.cross').resolvedContinueFrom).toBe('alpha.plan');
263
+ });
264
+ });
265
+ // ═══ Regression: bug #10 — editor-generated ids always pass validate-raw ═══
266
+ describe('regression: TASK_ID_RE is the single source of truth (bug #10)', () => {
267
+ test('validateRaw rejects exactly what isValidTaskId rejects', () => {
268
+ // Any string the helper says is invalid must be flagged by validateRaw
269
+ // as an "invalid characters" error — proving they read from the same
270
+ // regex rather than two drifted copies.
271
+ const invalids = ['1bad', 'has.dot', 'with space', '-leading', 'q?mark', ''];
272
+ for (const badId of invalids) {
273
+ const cfg = {
274
+ name: 'T',
275
+ tracks: [
276
+ {
277
+ id: 'ok',
278
+ name: 'OK',
279
+ tasks: [{ id: badId, prompt: 'p' }],
280
+ },
281
+ ],
282
+ };
283
+ const errs = validateRaw(cfg);
284
+ expect(errs.length).toBeGreaterThan(0);
285
+ expect(isValidTaskId(badId)).toBe(false);
286
+ }
287
+ });
288
+ });
289
+ // ═══ Regression: buildDag topo sort is deterministic (bug #13) ═══
290
+ describe('regression: buildDag topo sort is deterministic', () => {
291
+ const base = (trackOrder) => ({
292
+ name: 'Determinism',
293
+ tracks: trackOrder.map((id) => ({
294
+ id,
295
+ name: id,
296
+ tasks: [
297
+ { id: 'a', name: 'A', prompt: 'p' },
298
+ { id: 'b', name: 'B', prompt: 'p', depends_on: ['a'] },
299
+ ],
300
+ })),
301
+ });
302
+ test('parallel tasks with equal depth sort by qid, independent of YAML order', () => {
303
+ const forward = buildDag(base(['alpha', 'beta', 'gamma']));
304
+ const reversed = buildDag(base(['gamma', 'beta', 'alpha']));
305
+ expect(forward.sorted).toEqual(reversed.sorted);
306
+ // And the actual order is alphabetical by qid — every "a" before every "b".
307
+ expect(forward.sorted).toEqual([
308
+ 'alpha.a',
309
+ 'beta.a',
310
+ 'gamma.a',
311
+ 'alpha.b',
312
+ 'beta.b',
313
+ 'gamma.b',
314
+ ]);
315
+ });
316
+ test('diamond dependency still produces a unique sorted order', () => {
317
+ // root -> left, right -> join
318
+ const cfg = {
319
+ name: 'Diamond',
320
+ tracks: [
321
+ {
322
+ id: 't',
323
+ name: 't',
324
+ tasks: [
325
+ { id: 'root', name: 'r', prompt: 'p' },
326
+ { id: 'left', name: 'l', prompt: 'p', depends_on: ['root'] },
327
+ { id: 'right', name: 'r', prompt: 'p', depends_on: ['root'] },
328
+ { id: 'join', name: 'j', prompt: 'p', depends_on: ['left', 'right'] },
329
+ ],
330
+ },
331
+ ],
332
+ };
333
+ const first = buildDag(cfg).sorted;
334
+ const second = buildDag(cfg).sorted;
335
+ expect(first).toEqual(second);
336
+ // root first, join last; left/right in alphabetical order between.
337
+ expect(first[0]).toBe('t.root');
338
+ expect(first[first.length - 1]).toBe('t.join');
339
+ expect(first.indexOf('t.left')).toBeLessThan(first.indexOf('t.right'));
340
+ });
341
+ });
342
+ // ═══ Regression: buildRawDag stays lenient (editor real-time view) ═══
343
+ describe('buildRawDag tolerates unresolved refs', () => {
344
+ test('ambiguous bare continue_from is silently skipped (no edge, no throw)', () => {
345
+ const cfg = {
346
+ name: 'T',
347
+ tracks: [
348
+ { id: 'a', name: 'A', tasks: [{ id: 'review', prompt: 'p' }] },
349
+ { id: 'b', name: 'B', tasks: [{ id: 'review', prompt: 'p' }] },
350
+ {
351
+ id: 'c',
352
+ name: 'C',
353
+ tasks: [{ id: 'use', prompt: 'p', continue_from: 'review' }],
354
+ },
355
+ ],
356
+ };
357
+ const raw = buildRawDag(cfg);
358
+ expect(raw.nodes.size).toBe(3);
359
+ // No edge for the ambiguous ref — the editor panel should prompt the
360
+ // user to qualify it instead of silently linking to the wrong track.
361
+ expect(raw.edges.find((e) => e.to === 'c.use')).toBeUndefined();
362
+ });
363
+ });
364
+ //# sourceMappingURL=task-ref.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-ref.test.js","sourceRoot":"","sources":["../src/task-ref.test.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-raw.d.ts","sourceRoot":"","sources":["../src/validate-raw.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA+BjD;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,iBAAiB,EACzB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,eAAe,EAAE,CAyQnB"}
1
+ {"version":3,"file":"validate-raw.d.ts","sourceRoot":"","sources":["../src/validate-raw.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAqCjD;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,iBAAiB,EACzB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,eAAe,EAAE,CA2PnB"}