@kici-dev/compiler 0.0.0 → 0.1.2
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/LICENSE +202 -0
- package/README.md +1 -6
- package/dist/assets/api-TJJVHrjC.json +118 -0
- package/dist/assets/descriptor-BTtjzN9L.json +1382 -0
- package/dist/assets/package-BpQF9kR8.json +74 -0
- package/dist/assets/package-Ceo2h27X.json +89 -0
- package/dist/assets/source_context-D0atuL28.json +20 -0
- package/dist/assets/type-BFqO8SCZ.json +202 -0
- package/dist/auth/headless-detect.d.ts +14 -0
- package/dist/auth/headless-detect.js +25 -0
- package/dist/chunk-gOLHoazu.js +4 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +193 -0
- package/dist/commands/cancel.d.ts +22 -0
- package/dist/commands/cancel.js +124 -0
- package/dist/commands/compile.d.ts +17 -0
- package/dist/commands/compile.js +99 -0
- package/dist/commands/docs.d.ts +26 -0
- package/dist/commands/docs.js +60 -0
- package/dist/commands/drain-worker.d.ts +19 -0
- package/dist/commands/drain-worker.js +45 -0
- package/dist/commands/endpoints.d.ts +53 -0
- package/dist/commands/endpoints.js +185 -0
- package/dist/commands/fixture.d.ts +14 -0
- package/dist/commands/fixture.js +104 -0
- package/dist/commands/hook.d.ts +20 -0
- package/dist/commands/hook.js +97 -0
- package/dist/commands/index.d.ts +33 -0
- package/dist/commands/index.js +20 -0
- package/dist/commands/init.d.ts +35 -0
- package/dist/commands/init.js +393 -0
- package/dist/commands/login.d.ts +23 -0
- package/dist/commands/login.js +144 -0
- package/dist/commands/logout.d.ts +18 -0
- package/dist/commands/logout.js +55 -0
- package/dist/commands/org.d.ts +27 -0
- package/dist/commands/org.js +126 -0
- package/dist/commands/run.d.ts +21 -0
- package/dist/commands/run.js +562 -0
- package/dist/commands/secrets-list.d.ts +16 -0
- package/dist/commands/secrets-list.js +85 -0
- package/dist/commands/status.d.ts +30 -0
- package/dist/commands/status.js +210 -0
- package/dist/commands/test.d.ts +61 -0
- package/dist/commands/test.js +220 -0
- package/dist/commands/types.d.ts +18 -0
- package/dist/commands/types.js +74 -0
- package/dist/commands/watch.d.ts +14 -0
- package/dist/commands/watch.js +97 -0
- package/dist/commands/workflows.d.ts +28 -0
- package/dist/commands/workflows.js +154 -0
- package/dist/comment-created.json +30 -0
- package/dist/create-branch.json +17 -0
- package/dist/delete-branch.json +15 -0
- package/dist/dispatch.json +15 -0
- package/dist/errors/capability-gap.d.ts +50 -0
- package/dist/errors/capability-gap.js +54 -0
- package/dist/errors/codes.d.ts +25 -0
- package/dist/errors/formatter.d.ts +32 -0
- package/dist/errors/formatter.js +35 -0
- package/dist/errors/index.d.ts +5 -0
- package/dist/errors/index.js +4 -0
- package/dist/execution/executor.d.ts +61 -0
- package/dist/execution/executor.js +230 -0
- package/dist/execution/index.d.ts +4 -0
- package/dist/execution/index.js +3 -0
- package/dist/execution/sdk-alias.d.ts +33 -0
- package/dist/execution/sdk-alias.js +102 -0
- package/dist/fixtures/compiler.d.ts +47 -0
- package/dist/fixtures/compiler.js +177 -0
- package/dist/fixtures/defaults/comment-created.json +30 -0
- package/dist/fixtures/defaults/create-branch.json +17 -0
- package/dist/fixtures/defaults/delete-branch.json +15 -0
- package/dist/fixtures/defaults/dispatch.json +15 -0
- package/dist/fixtures/defaults/fork.json +19 -0
- package/dist/fixtures/defaults/index.d.ts +16 -0
- package/dist/fixtures/defaults/index.js +105 -0
- package/dist/fixtures/defaults/index.ts +145 -0
- package/dist/fixtures/defaults/pr-closed.json +28 -0
- package/dist/fixtures/defaults/pr-opened.json +27 -0
- package/dist/fixtures/defaults/pr-reopened.json +27 -0
- package/dist/fixtures/defaults/pr-synchronize.json +27 -0
- package/dist/fixtures/defaults/push.json +16 -0
- package/dist/fixtures/defaults/release-published.json +23 -0
- package/dist/fixtures/defaults/review-comment-created.json +36 -0
- package/dist/fixtures/defaults/review-submitted.json +35 -0
- package/dist/fixtures/defaults/star-created.json +15 -0
- package/dist/fixtures/defaults/status.json +26 -0
- package/dist/fixtures/defaults/tag-push.json +20 -0
- package/dist/fixtures/defaults/watch-started.json +15 -0
- package/dist/fixtures/defaults/workflow-run-completed.json +23 -0
- package/dist/fork.json +19 -0
- package/dist/format.d.ts +5 -0
- package/dist/format.js +20 -0
- package/dist/generators/secrets-dts.d.ts +29 -0
- package/dist/generators/secrets-dts.js +67 -0
- package/dist/hooks/detector.d.ts +39 -0
- package/dist/hooks/detector.js +133 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/installer.d.ts +24 -0
- package/dist/hooks/installer.js +328 -0
- package/dist/hooks/templates.d.ts +26 -0
- package/dist/hooks/templates.js +63 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +12 -0
- package/dist/llm-context/llms-full.txt +9974 -0
- package/dist/llm-context/llms.txt +61 -0
- package/dist/local-executor/dag-scheduler.d.ts +44 -0
- package/dist/local-executor/dag-scheduler.js +183 -0
- package/dist/local-executor/index.d.ts +23 -0
- package/dist/local-executor/index.js +309 -0
- package/dist/local-executor/job-runner.d.ts +40 -0
- package/dist/local-executor/job-runner.js +307 -0
- package/dist/local-executor/output-streamer.d.ts +31 -0
- package/dist/local-executor/output-streamer.js +166 -0
- package/dist/local-executor/payload-generator.d.ts +16 -0
- package/dist/local-executor/payload-generator.js +138 -0
- package/dist/local-executor/picker.d.ts +33 -0
- package/dist/local-executor/picker.js +109 -0
- package/dist/local-executor/secret-loader.d.ts +18 -0
- package/dist/local-executor/secret-loader.js +105 -0
- package/dist/local-executor/types.d.ts +80 -0
- package/dist/local-executor/types.js +2 -0
- package/dist/local-executor/workflow-lock.d.ts +81 -0
- package/dist/local-executor/workflow-lock.js +0 -0
- package/dist/lockfile/generator.d.ts +39 -0
- package/dist/lockfile/generator.js +688 -0
- package/dist/lockfile/hash-files.d.ts +14 -0
- package/dist/lockfile/hash-files.js +50 -0
- package/dist/lockfile/hasher.d.ts +36 -0
- package/dist/lockfile/hasher.js +46 -0
- package/dist/lockfile/index.d.ts +3 -0
- package/dist/lockfile/index.js +4 -0
- package/dist/lockfile/purity-analyzer.d.ts +25 -0
- package/dist/lockfile/purity-analyzer.js +204 -0
- package/dist/package-F7UXSDHW.json +74 -0
- package/dist/postinstall.d.ts +9 -0
- package/dist/postinstall.js +60 -0
- package/dist/pr-closed.json +28 -0
- package/dist/pr-opened.json +27 -0
- package/dist/pr-reopened.json +27 -0
- package/dist/pr-synchronize.json +27 -0
- package/dist/push.json +16 -0
- package/dist/release-published.json +23 -0
- package/dist/remote/client.d.ts +204 -0
- package/dist/remote/client.js +203 -0
- package/dist/remote/config.d.ts +54 -0
- package/dist/remote/config.js +92 -0
- package/dist/remote/encryption.d.ts +35 -0
- package/dist/remote/encryption.js +87 -0
- package/dist/remote/history.d.ts +91 -0
- package/dist/remote/history.js +146 -0
- package/dist/remote/oauth.d.ts +65 -0
- package/dist/remote/oauth.js +302 -0
- package/dist/remote/observer.d.ts +81 -0
- package/dist/remote/observer.js +174 -0
- package/dist/remote/output/json.d.ts +13 -0
- package/dist/remote/output/json.js +36 -0
- package/dist/remote/output/junit.d.ts +18 -0
- package/dist/remote/output/junit.js +50 -0
- package/dist/remote/output/streaming.d.ts +57 -0
- package/dist/remote/output/streaming.js +124 -0
- package/dist/remote/output/summary.d.ts +39 -0
- package/dist/remote/output/summary.js +99 -0
- package/dist/remote/uploader.d.ts +87 -0
- package/dist/remote/uploader.js +197 -0
- package/dist/review-comment-created.json +36 -0
- package/dist/review-submitted.json +35 -0
- package/dist/star-created.json +15 -0
- package/dist/status.json +26 -0
- package/dist/tag-push.json +20 -0
- package/dist/templates/agents-md.d.ts +8 -0
- package/dist/templates/agents-md.js +130 -0
- package/dist/templates/index.d.ts +43 -0
- package/dist/templates/index.js +48 -0
- package/dist/templates/package-json.d.ts +18 -0
- package/dist/templates/package-json.js +34 -0
- package/dist/templates/tsconfig-json.d.ts +9 -0
- package/dist/templates/tsconfig-json.js +26 -0
- package/dist/templates/workflows/hello-world.d.ts +2 -0
- package/dist/templates/workflows/hello-world.js +16 -0
- package/dist/templates/workflows/hello-world.ts +21 -0
- package/dist/templates/workflows/pr-checks.d.ts +2 -0
- package/dist/templates/workflows/pr-checks.js +40 -0
- package/dist/templates/workflows/pr-checks.ts +57 -0
- package/dist/test-runner/dry-run.d.ts +12 -0
- package/dist/test-runner/dry-run.js +66 -0
- package/dist/test-runner/event-types.d.ts +86 -0
- package/dist/test-runner/event-types.js +330 -0
- package/dist/test-runner/git-detector.d.ts +15 -0
- package/dist/test-runner/git-detector.js +30 -0
- package/dist/test-runner/index.d.ts +13 -0
- package/dist/test-runner/index.js +11 -0
- package/dist/test-runner/job-executor.d.ts +48 -0
- package/dist/test-runner/job-executor.js +245 -0
- package/dist/test-runner/output-formatter.d.ts +47 -0
- package/dist/test-runner/output-formatter.js +92 -0
- package/dist/test-runner/payload-builder.d.ts +20 -0
- package/dist/test-runner/payload-builder.js +216 -0
- package/dist/test-runner/rule-evaluator.d.ts +14 -0
- package/dist/test-runner/rule-evaluator.js +31 -0
- package/dist/test-runner/secrets-file.d.ts +24 -0
- package/dist/test-runner/secrets-file.js +62 -0
- package/dist/test-runner/step-context.d.ts +15 -0
- package/dist/test-runner/step-context.js +140 -0
- package/dist/test-runner/summary.d.ts +7 -0
- package/dist/types.d.ts +525 -0
- package/dist/types.js +33 -0
- package/dist/validation/index.d.ts +3 -0
- package/dist/validation/index.js +3 -0
- package/dist/validation/validator.d.ts +26 -0
- package/dist/validation/validator.js +164 -0
- package/dist/watch-started.json +15 -0
- package/dist/workflow-run-completed.json +23 -0
- package/dist/workflows/hello-world.ts +21 -0
- package/dist/workflows/pr-checks.ts +57 -0
- package/hack/postinstall.mjs +105 -0
- package/package.json +60 -6
- package/sbom.spdx.json +10997 -0
- package/index.js +0 -3
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import "../chunk-gOLHoazu.js";
|
|
2
|
+
//#region src/test-runner/event-types.ts
|
|
3
|
+
/**
|
|
4
|
+
* Parse CLI event argument to EventType.
|
|
5
|
+
* Supports all trigger types and common action shortcuts.
|
|
6
|
+
*/
|
|
7
|
+
function parseEventArg(arg) {
|
|
8
|
+
const normalized = arg.toLowerCase().trim();
|
|
9
|
+
switch (normalized) {
|
|
10
|
+
case "pr:open":
|
|
11
|
+
case "pr:opened": return {
|
|
12
|
+
type: "pull_request",
|
|
13
|
+
action: "opened"
|
|
14
|
+
};
|
|
15
|
+
case "pr:sync":
|
|
16
|
+
case "pr:synchronize": return {
|
|
17
|
+
type: "pull_request",
|
|
18
|
+
action: "synchronize"
|
|
19
|
+
};
|
|
20
|
+
case "pr:close":
|
|
21
|
+
case "pr:closed": return {
|
|
22
|
+
type: "pull_request",
|
|
23
|
+
action: "closed"
|
|
24
|
+
};
|
|
25
|
+
case "pr:reopen":
|
|
26
|
+
case "pr:reopened": return {
|
|
27
|
+
type: "pull_request",
|
|
28
|
+
action: "reopened"
|
|
29
|
+
};
|
|
30
|
+
case "push": return { type: "push" };
|
|
31
|
+
case "tag": return { type: "tag" };
|
|
32
|
+
case "comment":
|
|
33
|
+
case "comment:created": return {
|
|
34
|
+
type: "comment",
|
|
35
|
+
action: "created"
|
|
36
|
+
};
|
|
37
|
+
case "comment:edited": return {
|
|
38
|
+
type: "comment",
|
|
39
|
+
action: "edited"
|
|
40
|
+
};
|
|
41
|
+
case "comment:deleted": return {
|
|
42
|
+
type: "comment",
|
|
43
|
+
action: "deleted"
|
|
44
|
+
};
|
|
45
|
+
case "review":
|
|
46
|
+
case "review:submitted": return {
|
|
47
|
+
type: "review",
|
|
48
|
+
action: "submitted"
|
|
49
|
+
};
|
|
50
|
+
case "review:edited": return {
|
|
51
|
+
type: "review",
|
|
52
|
+
action: "edited"
|
|
53
|
+
};
|
|
54
|
+
case "review:dismissed": return {
|
|
55
|
+
type: "review",
|
|
56
|
+
action: "dismissed"
|
|
57
|
+
};
|
|
58
|
+
case "review_comment":
|
|
59
|
+
case "review_comment:created": return {
|
|
60
|
+
type: "review_comment",
|
|
61
|
+
action: "created"
|
|
62
|
+
};
|
|
63
|
+
case "review_comment:edited": return {
|
|
64
|
+
type: "review_comment",
|
|
65
|
+
action: "edited"
|
|
66
|
+
};
|
|
67
|
+
case "review_comment:deleted": return {
|
|
68
|
+
type: "review_comment",
|
|
69
|
+
action: "deleted"
|
|
70
|
+
};
|
|
71
|
+
case "release":
|
|
72
|
+
case "release:published": return {
|
|
73
|
+
type: "release",
|
|
74
|
+
action: "published"
|
|
75
|
+
};
|
|
76
|
+
case "release:unpublished": return {
|
|
77
|
+
type: "release",
|
|
78
|
+
action: "unpublished"
|
|
79
|
+
};
|
|
80
|
+
case "release:created": return {
|
|
81
|
+
type: "release",
|
|
82
|
+
action: "created"
|
|
83
|
+
};
|
|
84
|
+
case "release:edited": return {
|
|
85
|
+
type: "release",
|
|
86
|
+
action: "edited"
|
|
87
|
+
};
|
|
88
|
+
case "release:deleted": return {
|
|
89
|
+
type: "release",
|
|
90
|
+
action: "deleted"
|
|
91
|
+
};
|
|
92
|
+
case "release:prereleased": return {
|
|
93
|
+
type: "release",
|
|
94
|
+
action: "prereleased"
|
|
95
|
+
};
|
|
96
|
+
case "release:released": return {
|
|
97
|
+
type: "release",
|
|
98
|
+
action: "released"
|
|
99
|
+
};
|
|
100
|
+
case "dispatch": return { type: "dispatch" };
|
|
101
|
+
case "create": return { type: "create" };
|
|
102
|
+
case "create:branch": return {
|
|
103
|
+
type: "create",
|
|
104
|
+
refType: "branch"
|
|
105
|
+
};
|
|
106
|
+
case "create:tag": return {
|
|
107
|
+
type: "create",
|
|
108
|
+
refType: "tag"
|
|
109
|
+
};
|
|
110
|
+
case "delete": return { type: "delete" };
|
|
111
|
+
case "delete:branch": return {
|
|
112
|
+
type: "delete",
|
|
113
|
+
refType: "branch"
|
|
114
|
+
};
|
|
115
|
+
case "delete:tag": return {
|
|
116
|
+
type: "delete",
|
|
117
|
+
refType: "tag"
|
|
118
|
+
};
|
|
119
|
+
case "status": return { type: "status" };
|
|
120
|
+
case "workflow_run":
|
|
121
|
+
case "workflow_run:completed": return {
|
|
122
|
+
type: "workflow_run",
|
|
123
|
+
action: "completed"
|
|
124
|
+
};
|
|
125
|
+
case "workflow_run:requested": return {
|
|
126
|
+
type: "workflow_run",
|
|
127
|
+
action: "requested"
|
|
128
|
+
};
|
|
129
|
+
case "workflow_run:in_progress": return {
|
|
130
|
+
type: "workflow_run",
|
|
131
|
+
action: "in_progress"
|
|
132
|
+
};
|
|
133
|
+
case "fork": return { type: "fork" };
|
|
134
|
+
case "star":
|
|
135
|
+
case "star:created": return {
|
|
136
|
+
type: "star",
|
|
137
|
+
action: "created"
|
|
138
|
+
};
|
|
139
|
+
case "star:deleted": return {
|
|
140
|
+
type: "star",
|
|
141
|
+
action: "deleted"
|
|
142
|
+
};
|
|
143
|
+
case "watch":
|
|
144
|
+
case "watch:started": return {
|
|
145
|
+
type: "watch",
|
|
146
|
+
action: "started"
|
|
147
|
+
};
|
|
148
|
+
case "kici_event": return {
|
|
149
|
+
type: "kici_event",
|
|
150
|
+
eventName: "test-event"
|
|
151
|
+
};
|
|
152
|
+
case "workflow_complete": return {
|
|
153
|
+
type: "workflow_complete",
|
|
154
|
+
workflowName: "test",
|
|
155
|
+
status: "success"
|
|
156
|
+
};
|
|
157
|
+
case "workflow_complete:success": return {
|
|
158
|
+
type: "workflow_complete",
|
|
159
|
+
workflowName: "test",
|
|
160
|
+
status: "success"
|
|
161
|
+
};
|
|
162
|
+
case "workflow_complete:failed": return {
|
|
163
|
+
type: "workflow_complete",
|
|
164
|
+
workflowName: "test",
|
|
165
|
+
status: "failed"
|
|
166
|
+
};
|
|
167
|
+
case "workflow_complete:cancelled": return {
|
|
168
|
+
type: "workflow_complete",
|
|
169
|
+
workflowName: "test",
|
|
170
|
+
status: "cancelled"
|
|
171
|
+
};
|
|
172
|
+
case "job_complete": return {
|
|
173
|
+
type: "job_complete",
|
|
174
|
+
workflowName: "test",
|
|
175
|
+
jobName: "test",
|
|
176
|
+
status: "success"
|
|
177
|
+
};
|
|
178
|
+
case "generic_webhook": return { type: "generic_webhook" };
|
|
179
|
+
case "schedule": return { type: "schedule" };
|
|
180
|
+
case "lifecycle": return {
|
|
181
|
+
type: "lifecycle",
|
|
182
|
+
lifecycleEvent: "workflow_complete"
|
|
183
|
+
};
|
|
184
|
+
default:
|
|
185
|
+
if (normalized.startsWith("kici_event:")) return {
|
|
186
|
+
type: "kici_event",
|
|
187
|
+
eventName: normalized.slice(11)
|
|
188
|
+
};
|
|
189
|
+
if (normalized.startsWith("workflow_complete:")) return {
|
|
190
|
+
type: "workflow_complete",
|
|
191
|
+
workflowName: "test",
|
|
192
|
+
status: normalized.slice(18)
|
|
193
|
+
};
|
|
194
|
+
if (normalized.startsWith("job_complete:")) return {
|
|
195
|
+
type: "job_complete",
|
|
196
|
+
workflowName: "test",
|
|
197
|
+
jobName: "test",
|
|
198
|
+
status: normalized.slice(13)
|
|
199
|
+
};
|
|
200
|
+
if (normalized.startsWith("generic_webhook:")) return {
|
|
201
|
+
type: "generic_webhook",
|
|
202
|
+
source: normalized.slice(16)
|
|
203
|
+
};
|
|
204
|
+
if (normalized.startsWith("webhook:")) return {
|
|
205
|
+
type: "generic_webhook",
|
|
206
|
+
source: normalized.slice(8)
|
|
207
|
+
};
|
|
208
|
+
if (normalized.startsWith("lifecycle:")) return {
|
|
209
|
+
type: "lifecycle",
|
|
210
|
+
lifecycleEvent: normalized.slice(10)
|
|
211
|
+
};
|
|
212
|
+
if (normalized.startsWith("schedule:")) return {
|
|
213
|
+
type: "schedule",
|
|
214
|
+
cronExpression: normalized.slice(9)
|
|
215
|
+
};
|
|
216
|
+
throw new Error(`Unknown event name: ${arg}\nAvailable events: pr:open, pr:sync, pr:close, pr:reopen, push, tag, comment, comment:created, comment:edited, comment:deleted, review, review:submitted, review:edited, review:dismissed, review_comment, review_comment:created, release, release:published, release:created, release:prereleased, dispatch, create, create:branch, create:tag, delete, delete:branch, delete:tag, status, workflow_run, workflow_run:completed, fork, star, star:created, watch, kici_event, kici_event:<name>, workflow_complete, workflow_complete:<status>, job_complete, generic_webhook, generic_webhook:<source>, webhook:<source>, schedule, lifecycle, lifecycle:<event>`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function assertNever(x) {
|
|
220
|
+
throw new Error(`Unhandled trigger type: ${JSON.stringify(x)}`);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Derive an event-arg string from a `LockTrigger` that `parseEventArg` can accept.
|
|
224
|
+
* Inverse of `parseEventArg` for picker-driven flows: pick a trigger, feed the
|
|
225
|
+
* derived event arg back through the standard pipeline.
|
|
226
|
+
*/
|
|
227
|
+
function triggerToEventArg(trigger) {
|
|
228
|
+
switch (trigger._type) {
|
|
229
|
+
case "pr": return `pr:${trigger.events[0] ?? "opened"}`;
|
|
230
|
+
case "push": return "push";
|
|
231
|
+
case "tag": return "tag";
|
|
232
|
+
case "comment": return `comment:${trigger.actions[0] ?? "created"}`;
|
|
233
|
+
case "review": return `review:${trigger.actions[0] ?? "submitted"}`;
|
|
234
|
+
case "review_comment": return `review_comment:${trigger.actions[0] ?? "created"}`;
|
|
235
|
+
case "release": return `release:${trigger.actions[0] ?? "published"}`;
|
|
236
|
+
case "dispatch": return "dispatch";
|
|
237
|
+
case "create": {
|
|
238
|
+
const refType = trigger.refTypes[0];
|
|
239
|
+
return refType ? `create:${refType}` : "create";
|
|
240
|
+
}
|
|
241
|
+
case "delete": {
|
|
242
|
+
const refType = trigger.refTypes[0];
|
|
243
|
+
return refType ? `delete:${refType}` : "delete";
|
|
244
|
+
}
|
|
245
|
+
case "status": return "status";
|
|
246
|
+
case "workflow_run": return `workflow_run:${trigger.actions[0] ?? "completed"}`;
|
|
247
|
+
case "fork": return "fork";
|
|
248
|
+
case "star": return `star:${trigger.actions[0] ?? "created"}`;
|
|
249
|
+
case "watch": return `watch:${trigger.actions[0] ?? "started"}`;
|
|
250
|
+
case "webhook": {
|
|
251
|
+
const event = trigger.events[0];
|
|
252
|
+
return event ? `webhook:${event}` : "generic_webhook";
|
|
253
|
+
}
|
|
254
|
+
case "kici_event": return `kici_event:${trigger.eventName}`;
|
|
255
|
+
case "workflow_complete": {
|
|
256
|
+
const status = trigger.status?.[0];
|
|
257
|
+
return status ? `workflow_complete:${status}` : "workflow_complete";
|
|
258
|
+
}
|
|
259
|
+
case "job_complete": {
|
|
260
|
+
const status = trigger.status?.[0];
|
|
261
|
+
return status ? `job_complete:${status}` : "job_complete";
|
|
262
|
+
}
|
|
263
|
+
case "generic_webhook": return `webhook:${trigger.source}`;
|
|
264
|
+
case "schedule": return "schedule";
|
|
265
|
+
case "lifecycle": return `lifecycle:${trigger.events[0] ?? "workflow_complete"}`;
|
|
266
|
+
default: return assertNever(trigger);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function joinList(values, max = 3) {
|
|
270
|
+
if (values.length === 0) return "";
|
|
271
|
+
if (values.length <= max) return values.join(",");
|
|
272
|
+
return `${values.slice(0, max).join(",")}…`;
|
|
273
|
+
}
|
|
274
|
+
function patternSummary(patterns, max = 3) {
|
|
275
|
+
return joinList(patterns.map((p) => p.pattern), max);
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* One-line label for a `LockTrigger`, suitable for interactive picker rows.
|
|
279
|
+
* Keeps output compact and human-readable.
|
|
280
|
+
*/
|
|
281
|
+
function triggerSummary(trigger) {
|
|
282
|
+
switch (trigger._type) {
|
|
283
|
+
case "pr": {
|
|
284
|
+
const events = joinList(trigger.events);
|
|
285
|
+
const targets = patternSummary(trigger.targetBranches);
|
|
286
|
+
return `pr(${events}${targets ? ` on ${targets}` : ""})`;
|
|
287
|
+
}
|
|
288
|
+
case "push": {
|
|
289
|
+
const branches = patternSummary(trigger.branches);
|
|
290
|
+
return branches ? `push(${branches})` : "push";
|
|
291
|
+
}
|
|
292
|
+
case "tag": {
|
|
293
|
+
const patterns = patternSummary(trigger.patterns);
|
|
294
|
+
return patterns ? `tag(${patterns})` : "tag";
|
|
295
|
+
}
|
|
296
|
+
case "comment": return `comment(${joinList(trigger.actions)}${trigger.source ? ` ${trigger.source}` : ""})`;
|
|
297
|
+
case "review": return `review(${joinList(trigger.actions)})`;
|
|
298
|
+
case "review_comment": return `review_comment(${joinList(trigger.actions)})`;
|
|
299
|
+
case "release": return `release(${joinList(trigger.actions)})`;
|
|
300
|
+
case "dispatch": {
|
|
301
|
+
const types = joinList(trigger.types);
|
|
302
|
+
return types ? `dispatch(${types})` : "dispatch";
|
|
303
|
+
}
|
|
304
|
+
case "create": {
|
|
305
|
+
const refTypes = joinList(trigger.refTypes);
|
|
306
|
+
return refTypes ? `create(${refTypes})` : "create";
|
|
307
|
+
}
|
|
308
|
+
case "delete": {
|
|
309
|
+
const refTypes = joinList(trigger.refTypes);
|
|
310
|
+
return refTypes ? `delete(${refTypes})` : "delete";
|
|
311
|
+
}
|
|
312
|
+
case "status": return `status(${joinList(trigger.states)})`;
|
|
313
|
+
case "workflow_run": return `workflow_run(${joinList(trigger.actions)})`;
|
|
314
|
+
case "fork": return "fork";
|
|
315
|
+
case "star": return `star(${joinList(trigger.actions)})`;
|
|
316
|
+
case "watch": return `watch(${joinList(trigger.actions)})`;
|
|
317
|
+
case "webhook": return `webhook(${joinList(trigger.events)})`;
|
|
318
|
+
case "kici_event": return `kici_event(${trigger.eventName})`;
|
|
319
|
+
case "workflow_complete": return `workflow_complete(${trigger.name ? `${trigger.name}` : "*"}${trigger.status?.length ? `, ${joinList(trigger.status)}` : ""})`;
|
|
320
|
+
case "job_complete": return `job_complete(${trigger.workflow ?? "*"}${trigger.job ? `.${trigger.job}` : ""}${trigger.status?.length ? `, ${joinList(trigger.status)}` : ""})`;
|
|
321
|
+
case "generic_webhook": return `webhook(${trigger.source})`;
|
|
322
|
+
case "schedule": return `schedule('${trigger.cronExpression}')`;
|
|
323
|
+
case "lifecycle": return `lifecycle(${joinList(trigger.events)})`;
|
|
324
|
+
default: return assertNever(trigger);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
//#endregion
|
|
328
|
+
export { parseEventArg, triggerSummary, triggerToEventArg };
|
|
329
|
+
|
|
330
|
+
//# sourceMappingURL=event-types.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-detect repository information from .git/config
|
|
3
|
+
*/
|
|
4
|
+
interface RepoInfo {
|
|
5
|
+
owner: string;
|
|
6
|
+
name: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Detect repository owner and name from .git/config
|
|
10
|
+
* @param cwd - Working directory to search for .git/config
|
|
11
|
+
* @returns Repository info or null if not a git repo or no origin
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectRepoFromGit(cwd?: string): Promise<RepoInfo | null>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=git-detector.d.ts.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import "../chunk-gOLHoazu.js";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
//#region src/test-runner/git-detector.ts
|
|
5
|
+
/**
|
|
6
|
+
* Auto-detect repository information from .git/config
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Detect repository owner and name from .git/config
|
|
10
|
+
* @param cwd - Working directory to search for .git/config
|
|
11
|
+
* @returns Repository info or null if not a git repo or no origin
|
|
12
|
+
*/
|
|
13
|
+
async function detectRepoFromGit(cwd = process.cwd()) {
|
|
14
|
+
try {
|
|
15
|
+
const remoteMatch = (await readFile(path.join(cwd, ".git", "config"), "utf-8")).match(/\[remote "origin"\][^[]*url\s*=\s*(.+)/m);
|
|
16
|
+
if (!remoteMatch) return null;
|
|
17
|
+
const match = remoteMatch[1].trim().match(/github\.com[:/]([^/]+)\/([^/\s]+?)(\.git)?$/);
|
|
18
|
+
if (!match) return null;
|
|
19
|
+
return {
|
|
20
|
+
owner: match[1],
|
|
21
|
+
name: match[2]
|
|
22
|
+
};
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { detectRepoFromGit };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=git-detector.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test runner utilities and exports
|
|
3
|
+
*/
|
|
4
|
+
export * from './event-types.js';
|
|
5
|
+
export * from './git-detector.js';
|
|
6
|
+
export * from './step-context.js';
|
|
7
|
+
export * from './rule-evaluator.js';
|
|
8
|
+
export * from './job-executor.js';
|
|
9
|
+
export * from './output-formatter.js';
|
|
10
|
+
export * from './payload-builder.js';
|
|
11
|
+
export * from './dry-run.js';
|
|
12
|
+
export { getDefaultFixture, listAvailableEvents } from '../fixtures/defaults/index.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import "../chunk-gOLHoazu.js";
|
|
2
|
+
import { getDefaultFixture, listAvailableEvents } from "../fixtures/defaults/index.js";
|
|
3
|
+
import { detectRepoFromGit } from "./git-detector.js";
|
|
4
|
+
import { parseEventArg, triggerSummary, triggerToEventArg } from "./event-types.js";
|
|
5
|
+
import { buildEventPayload } from "./payload-builder.js";
|
|
6
|
+
import { displayDryRun } from "./dry-run.js";
|
|
7
|
+
import { formatter } from "./output-formatter.js";
|
|
8
|
+
import { createStepContext } from "./step-context.js";
|
|
9
|
+
import { createRuleContext, evaluateRules as evaluateRulesWithFormatting } from "./rule-evaluator.js";
|
|
10
|
+
import { executeJob, executeWorkflow } from "./job-executor.js";
|
|
11
|
+
export { buildEventPayload, createRuleContext, createStepContext, detectRepoFromGit, displayDryRun, evaluateRulesWithFormatting as evaluateRules, executeJob, executeWorkflow, formatter, getDefaultFixture, listAvailableEvents, parseEventArg, triggerSummary, triggerToEventArg };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Job, Workflow } from '@kici-dev/sdk';
|
|
2
|
+
import type { OutputsMap, StepRefMap } from '@kici-dev/sdk';
|
|
3
|
+
import type { SimulatedEvent } from '@kici-dev/engine';
|
|
4
|
+
import type { RuleResult } from '@kici-dev/sdk';
|
|
5
|
+
import type { ParsedSecrets } from './secrets-file.js';
|
|
6
|
+
/**
|
|
7
|
+
* SDK output setters resolved from the workflow's module instance.
|
|
8
|
+
* When the SDK is externalized in rolldown, the workflow shares the same
|
|
9
|
+
* module instance. We use these to set up output infrastructure.
|
|
10
|
+
*/
|
|
11
|
+
interface SdkOutputSetters {
|
|
12
|
+
setStepOutputsMap: (map: OutputsMap) => void;
|
|
13
|
+
setStepRefMap: (map: StepRefMap) => void;
|
|
14
|
+
setJobOutputsMap: (map: OutputsMap) => void;
|
|
15
|
+
}
|
|
16
|
+
export interface StepResult {
|
|
17
|
+
name: string;
|
|
18
|
+
status: 'success' | 'failure';
|
|
19
|
+
durationMs: number;
|
|
20
|
+
error?: Error;
|
|
21
|
+
outputs?: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
export interface JobResult {
|
|
24
|
+
name: string;
|
|
25
|
+
status: 'success' | 'failure' | 'skipped';
|
|
26
|
+
durationMs: number;
|
|
27
|
+
steps: StepResult[];
|
|
28
|
+
ruleResults?: RuleResult[];
|
|
29
|
+
error?: Error;
|
|
30
|
+
}
|
|
31
|
+
interface WorkflowResult {
|
|
32
|
+
name: string;
|
|
33
|
+
status: 'success' | 'failure' | 'skipped';
|
|
34
|
+
durationMs: number;
|
|
35
|
+
jobs: JobResult[];
|
|
36
|
+
ruleResults?: RuleResult[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Execute a job sequentially (steps run in order).
|
|
40
|
+
*/
|
|
41
|
+
export declare function executeJob(job: Job, workflowName: string, event: SimulatedEvent, repoRoot: string, testSecrets?: ParsedSecrets, sdkSetters?: SdkOutputSetters): Promise<JobResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Execute a workflow with parallel job execution.
|
|
44
|
+
* Jobs run in parallel where dependencies allow (respecting needs).
|
|
45
|
+
*/
|
|
46
|
+
export declare function executeWorkflow(workflow: Workflow, event: SimulatedEvent, repoRoot: string, testSecrets?: ParsedSecrets, kiciDir?: string): Promise<WorkflowResult>;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=job-executor.d.ts.map
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import "../chunk-gOLHoazu.js";
|
|
2
|
+
import { formatter } from "./output-formatter.js";
|
|
3
|
+
import { createStepContext } from "./step-context.js";
|
|
4
|
+
import { createRuleContext, evaluateRules as evaluateRulesWithFormatting } from "./rule-evaluator.js";
|
|
5
|
+
import pc from "picocolors";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { logger } from "@kici-dev/shared";
|
|
8
|
+
import { pathToFileURL } from "node:url";
|
|
9
|
+
import { setJobOutputsMap, setStepOutputsMap, setStepRefMap } from "@kici-dev/sdk";
|
|
10
|
+
//#region src/test-runner/job-executor.ts
|
|
11
|
+
/**
|
|
12
|
+
* Resolve SDK output setter functions from the workflow's module instance.
|
|
13
|
+
* This ensures the output maps are set on the same SDK module that the
|
|
14
|
+
* workflow code uses for .result proxy resolution and ctx.outputsOf().
|
|
15
|
+
*
|
|
16
|
+
* Falls back to the compiler's own SDK import if dynamic resolution fails.
|
|
17
|
+
*/
|
|
18
|
+
async function resolveSdkSetters(kiciDir) {
|
|
19
|
+
if (kiciDir) try {
|
|
20
|
+
const sdk = await import(pathToFileURL(path.join(kiciDir, "node_modules", "@kici-dev", "sdk", "dist", "index.js")).href);
|
|
21
|
+
return {
|
|
22
|
+
setStepOutputsMap: sdk.setStepOutputsMap,
|
|
23
|
+
setStepRefMap: sdk.setStepRefMap,
|
|
24
|
+
setJobOutputsMap: sdk.setJobOutputsMap
|
|
25
|
+
};
|
|
26
|
+
} catch {}
|
|
27
|
+
return {
|
|
28
|
+
setStepOutputsMap,
|
|
29
|
+
setStepRefMap,
|
|
30
|
+
setJobOutputsMap
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Execute a single step.
|
|
35
|
+
*/
|
|
36
|
+
async function executeStep(step, ctx, jobName) {
|
|
37
|
+
formatter.logStepStart(jobName, step.name);
|
|
38
|
+
const startTime = Date.now();
|
|
39
|
+
try {
|
|
40
|
+
const outputs = await step.run(ctx);
|
|
41
|
+
const durationMs = Date.now() - startTime;
|
|
42
|
+
formatter.logStepComplete(jobName, step.name, durationMs);
|
|
43
|
+
return {
|
|
44
|
+
name: step.name,
|
|
45
|
+
status: "success",
|
|
46
|
+
durationMs,
|
|
47
|
+
outputs
|
|
48
|
+
};
|
|
49
|
+
} catch (e) {
|
|
50
|
+
const durationMs = Date.now() - startTime;
|
|
51
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
52
|
+
formatter.logStepError(jobName, step.name, error);
|
|
53
|
+
return {
|
|
54
|
+
name: step.name,
|
|
55
|
+
status: "failure",
|
|
56
|
+
durationMs,
|
|
57
|
+
error
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Execute a job sequentially (steps run in order).
|
|
63
|
+
*/
|
|
64
|
+
async function executeJob(job, workflowName, event, repoRoot, testSecrets, sdkSetters) {
|
|
65
|
+
const setters = sdkSetters ?? {
|
|
66
|
+
setStepOutputsMap,
|
|
67
|
+
setStepRefMap,
|
|
68
|
+
setJobOutputsMap
|
|
69
|
+
};
|
|
70
|
+
formatter.logJobStart(job.name);
|
|
71
|
+
const startTime = Date.now();
|
|
72
|
+
const stepResults = [];
|
|
73
|
+
let ruleResults;
|
|
74
|
+
if (job.rules && job.rules.length > 0) {
|
|
75
|
+
const ruleContext = createRuleContext(event, event.changedFiles);
|
|
76
|
+
const ruleEval = await evaluateRulesWithFormatting(job.rules, ruleContext, job.name);
|
|
77
|
+
ruleResults = ruleEval.results;
|
|
78
|
+
if (!ruleEval.allPassed) {
|
|
79
|
+
const durationMs = Date.now() - startTime;
|
|
80
|
+
return {
|
|
81
|
+
name: job.name,
|
|
82
|
+
status: "skipped",
|
|
83
|
+
durationMs,
|
|
84
|
+
steps: [],
|
|
85
|
+
ruleResults
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const outputsMap = /* @__PURE__ */ new Map();
|
|
90
|
+
const refMap = /* @__PURE__ */ new WeakMap();
|
|
91
|
+
setters.setStepOutputsMap(outputsMap);
|
|
92
|
+
setters.setStepRefMap(refMap);
|
|
93
|
+
setStepOutputsMap(outputsMap);
|
|
94
|
+
setStepRefMap(refMap);
|
|
95
|
+
const ctx = createStepContext({ name: workflowName }, {
|
|
96
|
+
name: job.name,
|
|
97
|
+
runsOn: typeof job.runsOn === "string" ? job.runsOn : Array.isArray(job.runsOn) ? job.runsOn.join(",") : (Array.isArray(job.runsOn.labels) ? job.runsOn.labels : [job.runsOn.labels]).join(",")
|
|
98
|
+
}, repoRoot, void 0, void 0, testSecrets, void 0, event.payload, event.provider);
|
|
99
|
+
let stepCounter = 0;
|
|
100
|
+
for (const stepOrFn of job.steps) {
|
|
101
|
+
let normalizedStep;
|
|
102
|
+
if (typeof stepOrFn === "function") {
|
|
103
|
+
stepCounter++;
|
|
104
|
+
const name = `step-${stepCounter}`;
|
|
105
|
+
refMap.set(stepOrFn, name);
|
|
106
|
+
normalizedStep = {
|
|
107
|
+
_tag: "Step",
|
|
108
|
+
name,
|
|
109
|
+
run: stepOrFn
|
|
110
|
+
};
|
|
111
|
+
} else {
|
|
112
|
+
normalizedStep = stepOrFn;
|
|
113
|
+
if (!normalizedStep.name) stepCounter++;
|
|
114
|
+
}
|
|
115
|
+
const result = await executeStep(normalizedStep, ctx, job.name);
|
|
116
|
+
if (result.status === "success" && result.outputs != null) outputsMap.set(normalizedStep.name, result.outputs);
|
|
117
|
+
stepResults.push(result);
|
|
118
|
+
if (result.status === "failure") {
|
|
119
|
+
const durationMs = Date.now() - startTime;
|
|
120
|
+
formatter.logJobFailure(job.name, durationMs, result.error);
|
|
121
|
+
return {
|
|
122
|
+
name: job.name,
|
|
123
|
+
status: "failure",
|
|
124
|
+
durationMs,
|
|
125
|
+
steps: stepResults,
|
|
126
|
+
ruleResults,
|
|
127
|
+
error: result.error
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const durationMs = Date.now() - startTime;
|
|
132
|
+
formatter.logJobComplete(job.name, durationMs);
|
|
133
|
+
return {
|
|
134
|
+
name: job.name,
|
|
135
|
+
status: "success",
|
|
136
|
+
durationMs,
|
|
137
|
+
steps: stepResults,
|
|
138
|
+
ruleResults
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Execute a workflow with parallel job execution.
|
|
143
|
+
* Jobs run in parallel where dependencies allow (respecting needs).
|
|
144
|
+
*/
|
|
145
|
+
async function executeWorkflow(workflow, event, repoRoot, testSecrets, kiciDir) {
|
|
146
|
+
logger.info(`\n${pc.bold("▶ Running workflow:")} ${workflow.name}\n`);
|
|
147
|
+
const startTime = Date.now();
|
|
148
|
+
const sdkSetters = await resolveSdkSetters(kiciDir);
|
|
149
|
+
let ruleResults;
|
|
150
|
+
if (workflow.rules && workflow.rules.length > 0) {
|
|
151
|
+
const ruleContext = createRuleContext(event, event.changedFiles);
|
|
152
|
+
const ruleEval = await evaluateRulesWithFormatting(workflow.rules, ruleContext, workflow.name);
|
|
153
|
+
ruleResults = ruleEval.results;
|
|
154
|
+
if (!ruleEval.allPassed) {
|
|
155
|
+
const durationMs = Date.now() - startTime;
|
|
156
|
+
logger.info(pc.yellow(`\n⚠ Workflow skipped due to rule failure\n`));
|
|
157
|
+
return {
|
|
158
|
+
name: workflow.name,
|
|
159
|
+
status: "skipped",
|
|
160
|
+
durationMs,
|
|
161
|
+
jobs: [],
|
|
162
|
+
ruleResults
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const staticJobs = workflow.jobs.filter((j) => typeof j !== "function");
|
|
167
|
+
const jobMap = new Map(staticJobs.map((j) => [j.name, j]));
|
|
168
|
+
const completed = /* @__PURE__ */ new Map();
|
|
169
|
+
const pending = new Set(staticJobs.map((j) => j.name));
|
|
170
|
+
const jobOutputsMap = /* @__PURE__ */ new Map();
|
|
171
|
+
sdkSetters.setJobOutputsMap(jobOutputsMap);
|
|
172
|
+
setJobOutputsMap(jobOutputsMap);
|
|
173
|
+
while (pending.size > 0) {
|
|
174
|
+
const ready = [...pending].filter((jobName) => {
|
|
175
|
+
const job = jobMap.get(jobName);
|
|
176
|
+
if (!job.needs || job.needs.length === 0) return true;
|
|
177
|
+
return job.needs.every((need) => {
|
|
178
|
+
let needName;
|
|
179
|
+
if (typeof need === "string") needName = need;
|
|
180
|
+
else if ("name" in need) needName = need.name;
|
|
181
|
+
else if ("group" in need) return true;
|
|
182
|
+
else needName = need.name;
|
|
183
|
+
const result = completed.get(needName);
|
|
184
|
+
return result && result.status === "success";
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
if (ready.length === 0 && pending.size > 0) {
|
|
188
|
+
const remaining = [...pending];
|
|
189
|
+
logger.info(pc.yellow(`\n⚠ Skipping jobs with failed dependencies: ${remaining.join(", ")}\n`));
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
const results = await Promise.allSettled(ready.map((jobName) => {
|
|
193
|
+
const job = jobMap.get(jobName);
|
|
194
|
+
pending.delete(jobName);
|
|
195
|
+
return executeJob(job, workflow.name, event, repoRoot, testSecrets, sdkSetters);
|
|
196
|
+
}));
|
|
197
|
+
for (let i = 0; i < ready.length; i++) {
|
|
198
|
+
const result = results[i];
|
|
199
|
+
const jobName = ready[i];
|
|
200
|
+
if (result.status === "fulfilled") {
|
|
201
|
+
completed.set(jobName, result.value);
|
|
202
|
+
if (result.value.status === "success") {
|
|
203
|
+
const jobResult = result.value;
|
|
204
|
+
const stepsWithOutputs = jobResult.steps.filter((s) => s.outputs != null);
|
|
205
|
+
if (stepsWithOutputs.length === 1 && jobResult.steps.length === 1) jobOutputsMap.set(jobName, stepsWithOutputs[0].outputs);
|
|
206
|
+
else if (stepsWithOutputs.length > 0) {
|
|
207
|
+
const aggregated = {};
|
|
208
|
+
for (const stepResult of stepsWithOutputs) aggregated[stepResult.name] = stepResult.outputs;
|
|
209
|
+
jobOutputsMap.set(jobName, aggregated);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (result.value.status === "failure") {
|
|
213
|
+
const durationMs = Date.now() - startTime;
|
|
214
|
+
logger.info(pc.red(`\n✗ Workflow failed\n`));
|
|
215
|
+
return {
|
|
216
|
+
name: workflow.name,
|
|
217
|
+
status: "failure",
|
|
218
|
+
durationMs,
|
|
219
|
+
jobs: [...completed.values()],
|
|
220
|
+
ruleResults
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
} else completed.set(jobName, {
|
|
224
|
+
name: jobName,
|
|
225
|
+
status: "failure",
|
|
226
|
+
durationMs: 0,
|
|
227
|
+
steps: [],
|
|
228
|
+
error: result.reason instanceof Error ? result.reason : new Error(String(result.reason))
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const durationMs = Date.now() - startTime;
|
|
233
|
+
logger.info(pc.green(`\n✓ Workflow complete`) + pc.gray(` (${durationMs}ms)\n`));
|
|
234
|
+
return {
|
|
235
|
+
name: workflow.name,
|
|
236
|
+
status: "success",
|
|
237
|
+
durationMs,
|
|
238
|
+
jobs: [...completed.values()],
|
|
239
|
+
ruleResults
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
//#endregion
|
|
243
|
+
export { executeJob, executeWorkflow };
|
|
244
|
+
|
|
245
|
+
//# sourceMappingURL=job-executor.js.map
|