gsd-pi 2.41.0-dev.cac69f9 → 2.42.0-dev.97e9e30
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/dist/resources/extensions/gsd/auto/loop.js +80 -0
- package/dist/resources/extensions/gsd/auto/phases.js +2 -2
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +2 -0
- package/dist/resources/extensions/gsd/auto.js +28 -1
- package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +7 -2
- package/dist/resources/extensions/gsd/commands/catalog.js +32 -0
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +146 -0
- package/dist/resources/extensions/gsd/context-injector.js +74 -0
- package/dist/resources/extensions/gsd/custom-execution-policy.js +47 -0
- package/dist/resources/extensions/gsd/custom-verification.js +145 -0
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +164 -0
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -0
- package/dist/resources/extensions/gsd/definition-loader.js +352 -0
- package/dist/resources/extensions/gsd/dev-execution-policy.js +24 -0
- package/dist/resources/extensions/gsd/dev-workflow-engine.js +82 -0
- package/dist/resources/extensions/gsd/engine-resolver.js +40 -0
- package/dist/resources/extensions/gsd/engine-types.js +8 -0
- package/dist/resources/extensions/gsd/execution-policy.js +8 -0
- package/dist/resources/extensions/gsd/graph.js +225 -0
- package/dist/resources/extensions/gsd/run-manager.js +134 -0
- package/dist/resources/extensions/gsd/workflow-engine.js +7 -0
- package/dist/resources/skills/create-workflow/SKILL.md +103 -0
- package/dist/resources/skills/create-workflow/references/feature-patterns.md +128 -0
- package/dist/resources/skills/create-workflow/references/verification-policies.md +76 -0
- package/dist/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
- package/dist/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
- package/dist/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
- package/dist/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
- package/dist/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
- package/dist/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
- package/dist/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/auto/loop.ts +91 -0
- package/src/resources/extensions/gsd/auto/phases.ts +2 -2
- package/src/resources/extensions/gsd/auto/session.ts +6 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +2 -0
- package/src/resources/extensions/gsd/auto.ts +31 -1
- package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +9 -2
- package/src/resources/extensions/gsd/commands/catalog.ts +32 -0
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +164 -0
- package/src/resources/extensions/gsd/context-injector.ts +100 -0
- package/src/resources/extensions/gsd/custom-execution-policy.ts +73 -0
- package/src/resources/extensions/gsd/custom-verification.ts +180 -0
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +216 -0
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -0
- package/src/resources/extensions/gsd/definition-loader.ts +462 -0
- package/src/resources/extensions/gsd/dev-execution-policy.ts +51 -0
- package/src/resources/extensions/gsd/dev-workflow-engine.ts +110 -0
- package/src/resources/extensions/gsd/engine-resolver.ts +57 -0
- package/src/resources/extensions/gsd/engine-types.ts +71 -0
- package/src/resources/extensions/gsd/execution-policy.ts +43 -0
- package/src/resources/extensions/gsd/graph.ts +312 -0
- package/src/resources/extensions/gsd/run-manager.ts +180 -0
- package/src/resources/extensions/gsd/tests/bundled-workflow-defs.test.ts +180 -0
- package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +283 -0
- package/src/resources/extensions/gsd/tests/context-injector.test.ts +313 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +540 -0
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +382 -0
- package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +339 -0
- package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +778 -0
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +318 -0
- package/src/resources/extensions/gsd/tests/e2e-workflow-pipeline-integration.test.ts +476 -0
- package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +271 -0
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +599 -0
- package/src/resources/extensions/gsd/tests/iterate-engine-integration.test.ts +429 -0
- package/src/resources/extensions/gsd/tests/run-manager.test.ts +229 -0
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +45 -0
- package/src/resources/extensions/gsd/workflow-engine.ts +38 -0
- package/src/resources/skills/create-workflow/SKILL.md +103 -0
- package/src/resources/skills/create-workflow/references/feature-patterns.md +128 -0
- package/src/resources/skills/create-workflow/references/verification-policies.md +76 -0
- package/src/resources/skills/create-workflow/references/yaml-schema-v1.md +46 -0
- package/src/resources/skills/create-workflow/templates/blog-post-pipeline.yaml +60 -0
- package/src/resources/skills/create-workflow/templates/code-audit.yaml +60 -0
- package/src/resources/skills/create-workflow/templates/release-checklist.yaml +66 -0
- package/src/resources/skills/create-workflow/templates/workflow-definition.yaml +32 -0
- package/src/resources/skills/create-workflow/workflows/create-from-scratch.md +104 -0
- package/src/resources/skills/create-workflow/workflows/create-from-template.md +72 -0
- /package/dist/web/standalone/.next/static/{EnGUNqHeGbE0tuuUkTJVA → PXrI5DoWsm7rwAVnEU2rD}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{EnGUNqHeGbE0tuuUkTJVA → PXrI5DoWsm7rwAVnEU2rD}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* context-injector.test.ts — Tests for injectContext().
|
|
3
|
+
*
|
|
4
|
+
* Tests context injection from prior step artifacts: single-step,
|
|
5
|
+
* multi-step chain, missing artifact, no contextFrom, truncation,
|
|
6
|
+
* and unknown step ID in contextFrom.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, it } from "node:test";
|
|
10
|
+
import assert from "node:assert/strict";
|
|
11
|
+
import { mkdtempSync, writeFileSync, mkdirSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { tmpdir } from "node:os";
|
|
14
|
+
import { stringify } from "yaml";
|
|
15
|
+
import { injectContext } from "../context-injector.ts";
|
|
16
|
+
import type { WorkflowDefinition } from "../definition-loader.ts";
|
|
17
|
+
|
|
18
|
+
/** Create a temp run directory with the given definition and optional files. */
|
|
19
|
+
function makeTempRun(
|
|
20
|
+
def: WorkflowDefinition,
|
|
21
|
+
files?: Record<string, string>,
|
|
22
|
+
): string {
|
|
23
|
+
const runDir = mkdtempSync(join(tmpdir(), "ci-test-"));
|
|
24
|
+
writeFileSync(join(runDir, "DEFINITION.yaml"), stringify(def), "utf-8");
|
|
25
|
+
|
|
26
|
+
if (files) {
|
|
27
|
+
for (const [relPath, content] of Object.entries(files)) {
|
|
28
|
+
const absPath = join(runDir, relPath);
|
|
29
|
+
const parentDir = join(absPath, "..");
|
|
30
|
+
mkdirSync(parentDir, { recursive: true });
|
|
31
|
+
writeFileSync(absPath, content, "utf-8");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return runDir;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Minimal valid workflow definition factory. */
|
|
39
|
+
function makeDef(
|
|
40
|
+
steps: WorkflowDefinition["steps"],
|
|
41
|
+
): WorkflowDefinition {
|
|
42
|
+
return {
|
|
43
|
+
version: 1,
|
|
44
|
+
name: "test-workflow",
|
|
45
|
+
steps,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ─── single-step context ────────────────────────────────────────────────
|
|
50
|
+
|
|
51
|
+
describe("single-step context injection", () => {
|
|
52
|
+
it("prepends step-1 artifact content to step-2 prompt", () => {
|
|
53
|
+
const def = makeDef([
|
|
54
|
+
{
|
|
55
|
+
id: "step-1",
|
|
56
|
+
name: "Research",
|
|
57
|
+
prompt: "Research the topic",
|
|
58
|
+
requires: [],
|
|
59
|
+
produces: ["output.md"],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "step-2",
|
|
63
|
+
name: "Write",
|
|
64
|
+
prompt: "Write the report",
|
|
65
|
+
requires: ["step-1"],
|
|
66
|
+
produces: ["report.md"],
|
|
67
|
+
contextFrom: ["step-1"],
|
|
68
|
+
},
|
|
69
|
+
]);
|
|
70
|
+
|
|
71
|
+
const runDir = makeTempRun(def, {
|
|
72
|
+
"output.md": "Research findings: AI is growing fast.",
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const result = injectContext(runDir, "step-2", "Write the report");
|
|
76
|
+
assert.ok(result.includes("Research findings: AI is growing fast."));
|
|
77
|
+
assert.ok(result.includes('Context from step "step-1"'));
|
|
78
|
+
assert.ok(result.includes("(file: output.md)"));
|
|
79
|
+
assert.ok(result.endsWith("Write the report"));
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// ─── multi-step chain ───────────────────────────────────────────────────
|
|
84
|
+
|
|
85
|
+
describe("multi-step context chain", () => {
|
|
86
|
+
it("prepends artifacts from both step-1 and step-2", () => {
|
|
87
|
+
const def = makeDef([
|
|
88
|
+
{
|
|
89
|
+
id: "step-1",
|
|
90
|
+
name: "Research",
|
|
91
|
+
prompt: "Research",
|
|
92
|
+
requires: [],
|
|
93
|
+
produces: ["research.md"],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
id: "step-2",
|
|
97
|
+
name: "Outline",
|
|
98
|
+
prompt: "Outline",
|
|
99
|
+
requires: ["step-1"],
|
|
100
|
+
produces: ["outline.md"],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
id: "step-3",
|
|
104
|
+
name: "Draft",
|
|
105
|
+
prompt: "Write the draft",
|
|
106
|
+
requires: ["step-1", "step-2"],
|
|
107
|
+
produces: ["draft.md"],
|
|
108
|
+
contextFrom: ["step-1", "step-2"],
|
|
109
|
+
},
|
|
110
|
+
]);
|
|
111
|
+
|
|
112
|
+
const runDir = makeTempRun(def, {
|
|
113
|
+
"research.md": "Research content here.",
|
|
114
|
+
"outline.md": "Outline content here.",
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const result = injectContext(runDir, "step-3", "Write the draft");
|
|
118
|
+
assert.ok(result.includes("Research content here."));
|
|
119
|
+
assert.ok(result.includes("Outline content here."));
|
|
120
|
+
assert.ok(result.includes('Context from step "step-1"'));
|
|
121
|
+
assert.ok(result.includes('Context from step "step-2"'));
|
|
122
|
+
assert.ok(result.endsWith("Write the draft"));
|
|
123
|
+
|
|
124
|
+
// Verify order: step-1 context appears before step-2 context
|
|
125
|
+
const idx1 = result.indexOf('Context from step "step-1"');
|
|
126
|
+
const idx2 = result.indexOf('Context from step "step-2"');
|
|
127
|
+
assert.ok(idx1 < idx2, "step-1 context should appear before step-2 context");
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// ─── missing artifact file ──────────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
describe("missing artifact file", () => {
|
|
134
|
+
it("skips missing artifact and includes existing ones", () => {
|
|
135
|
+
const def = makeDef([
|
|
136
|
+
{
|
|
137
|
+
id: "step-1",
|
|
138
|
+
name: "Research",
|
|
139
|
+
prompt: "Research",
|
|
140
|
+
requires: [],
|
|
141
|
+
produces: ["found.md", "missing.md"],
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
id: "step-2",
|
|
145
|
+
name: "Write",
|
|
146
|
+
prompt: "Write the report",
|
|
147
|
+
requires: ["step-1"],
|
|
148
|
+
produces: ["report.md"],
|
|
149
|
+
contextFrom: ["step-1"],
|
|
150
|
+
},
|
|
151
|
+
]);
|
|
152
|
+
|
|
153
|
+
// Only create found.md, not missing.md
|
|
154
|
+
const runDir = makeTempRun(def, {
|
|
155
|
+
"found.md": "Found content.",
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
const result = injectContext(runDir, "step-2", "Write the report");
|
|
159
|
+
assert.ok(result.includes("Found content."));
|
|
160
|
+
assert.ok(!result.includes("missing.md"));
|
|
161
|
+
assert.ok(result.endsWith("Write the report"));
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it("returns prompt unchanged when all referenced artifacts are missing", () => {
|
|
165
|
+
const def = makeDef([
|
|
166
|
+
{
|
|
167
|
+
id: "step-1",
|
|
168
|
+
name: "Research",
|
|
169
|
+
prompt: "Research",
|
|
170
|
+
requires: [],
|
|
171
|
+
produces: ["missing.md"],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: "step-2",
|
|
175
|
+
name: "Write",
|
|
176
|
+
prompt: "Write the report",
|
|
177
|
+
requires: ["step-1"],
|
|
178
|
+
produces: ["report.md"],
|
|
179
|
+
contextFrom: ["step-1"],
|
|
180
|
+
},
|
|
181
|
+
]);
|
|
182
|
+
|
|
183
|
+
const runDir = makeTempRun(def);
|
|
184
|
+
|
|
185
|
+
const result = injectContext(runDir, "step-2", "Write the report");
|
|
186
|
+
assert.equal(result, "Write the report");
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// ─── no contextFrom ────────────────────────────────────────────────────
|
|
191
|
+
|
|
192
|
+
describe("no contextFrom", () => {
|
|
193
|
+
it("returns prompt unchanged when step has no contextFrom", () => {
|
|
194
|
+
const def = makeDef([
|
|
195
|
+
{
|
|
196
|
+
id: "step-1",
|
|
197
|
+
name: "Research",
|
|
198
|
+
prompt: "Research",
|
|
199
|
+
requires: [],
|
|
200
|
+
produces: ["output.md"],
|
|
201
|
+
},
|
|
202
|
+
]);
|
|
203
|
+
|
|
204
|
+
const runDir = makeTempRun(def, {
|
|
205
|
+
"output.md": "Some content.",
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
const result = injectContext(runDir, "step-1", "Research");
|
|
209
|
+
assert.equal(result, "Research");
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it("returns prompt unchanged when step ID not found in definition", () => {
|
|
213
|
+
const def = makeDef([
|
|
214
|
+
{
|
|
215
|
+
id: "step-1",
|
|
216
|
+
name: "Research",
|
|
217
|
+
prompt: "Research",
|
|
218
|
+
requires: [],
|
|
219
|
+
produces: [],
|
|
220
|
+
},
|
|
221
|
+
]);
|
|
222
|
+
|
|
223
|
+
const runDir = makeTempRun(def);
|
|
224
|
+
|
|
225
|
+
const result = injectContext(runDir, "nonexistent", "Some prompt");
|
|
226
|
+
assert.equal(result, "Some prompt");
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
// ─── truncation ─────────────────────────────────────────────────────────
|
|
231
|
+
|
|
232
|
+
describe("truncation guard", () => {
|
|
233
|
+
it("truncates artifacts exceeding 10,000 characters", () => {
|
|
234
|
+
const largeContent = "A".repeat(15_000);
|
|
235
|
+
|
|
236
|
+
const def = makeDef([
|
|
237
|
+
{
|
|
238
|
+
id: "step-1",
|
|
239
|
+
name: "Generate",
|
|
240
|
+
prompt: "Generate",
|
|
241
|
+
requires: [],
|
|
242
|
+
produces: ["big.md"],
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
id: "step-2",
|
|
246
|
+
name: "Consume",
|
|
247
|
+
prompt: "Use the output",
|
|
248
|
+
requires: ["step-1"],
|
|
249
|
+
produces: [],
|
|
250
|
+
contextFrom: ["step-1"],
|
|
251
|
+
},
|
|
252
|
+
]);
|
|
253
|
+
|
|
254
|
+
const runDir = makeTempRun(def, {
|
|
255
|
+
"big.md": largeContent,
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
const result = injectContext(runDir, "step-2", "Use the output");
|
|
259
|
+
assert.ok(result.includes("...[truncated]"));
|
|
260
|
+
// The injected content should be 10,000 chars + truncation marker, not all 15,000
|
|
261
|
+
const contextPart = result.split("Use the output")[0];
|
|
262
|
+
assert.ok(contextPart.length < 15_000, "Context should be truncated below original size");
|
|
263
|
+
// Verify the truncated content is exactly 10,000 A's (no collision with header text)
|
|
264
|
+
const aCount = (contextPart.match(/A/g) || []).length;
|
|
265
|
+
assert.equal(aCount, 10_000, "Should contain exactly 10,000 chars of original content");
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// ─── unknown step ID in contextFrom ─────────────────────────────────────
|
|
270
|
+
|
|
271
|
+
describe("unknown step in contextFrom", () => {
|
|
272
|
+
it("skips unknown step IDs gracefully", () => {
|
|
273
|
+
const def = makeDef([
|
|
274
|
+
{
|
|
275
|
+
id: "step-1",
|
|
276
|
+
name: "Research",
|
|
277
|
+
prompt: "Research",
|
|
278
|
+
requires: [],
|
|
279
|
+
produces: ["output.md"],
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
id: "step-2",
|
|
283
|
+
name: "Write",
|
|
284
|
+
prompt: "Write the report",
|
|
285
|
+
requires: ["step-1"],
|
|
286
|
+
produces: [],
|
|
287
|
+
contextFrom: ["step-1", "nonexistent-step"],
|
|
288
|
+
},
|
|
289
|
+
]);
|
|
290
|
+
|
|
291
|
+
const runDir = makeTempRun(def, {
|
|
292
|
+
"output.md": "Research content.",
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
const result = injectContext(runDir, "step-2", "Write the report");
|
|
296
|
+
// Should include step-1 content despite nonexistent-step being in contextFrom
|
|
297
|
+
assert.ok(result.includes("Research content."));
|
|
298
|
+
assert.ok(result.endsWith("Write the report"));
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
// ─── error handling ─────────────────────────────────────────────────────
|
|
303
|
+
|
|
304
|
+
describe("error handling", () => {
|
|
305
|
+
it("throws when DEFINITION.yaml is missing", () => {
|
|
306
|
+
const runDir = mkdtempSync(join(tmpdir(), "ci-test-nodef-"));
|
|
307
|
+
|
|
308
|
+
assert.throws(
|
|
309
|
+
() => injectContext(runDir, "step-1", "Some prompt"),
|
|
310
|
+
/ENOENT/,
|
|
311
|
+
);
|
|
312
|
+
});
|
|
313
|
+
});
|