@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.
Files changed (221) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +1 -6
  3. package/dist/assets/api-TJJVHrjC.json +118 -0
  4. package/dist/assets/descriptor-BTtjzN9L.json +1382 -0
  5. package/dist/assets/package-BpQF9kR8.json +74 -0
  6. package/dist/assets/package-Ceo2h27X.json +89 -0
  7. package/dist/assets/source_context-D0atuL28.json +20 -0
  8. package/dist/assets/type-BFqO8SCZ.json +202 -0
  9. package/dist/auth/headless-detect.d.ts +14 -0
  10. package/dist/auth/headless-detect.js +25 -0
  11. package/dist/chunk-gOLHoazu.js +4 -0
  12. package/dist/cli.d.ts +3 -0
  13. package/dist/cli.js +193 -0
  14. package/dist/commands/cancel.d.ts +22 -0
  15. package/dist/commands/cancel.js +124 -0
  16. package/dist/commands/compile.d.ts +17 -0
  17. package/dist/commands/compile.js +99 -0
  18. package/dist/commands/docs.d.ts +26 -0
  19. package/dist/commands/docs.js +60 -0
  20. package/dist/commands/drain-worker.d.ts +19 -0
  21. package/dist/commands/drain-worker.js +45 -0
  22. package/dist/commands/endpoints.d.ts +53 -0
  23. package/dist/commands/endpoints.js +185 -0
  24. package/dist/commands/fixture.d.ts +14 -0
  25. package/dist/commands/fixture.js +104 -0
  26. package/dist/commands/hook.d.ts +20 -0
  27. package/dist/commands/hook.js +97 -0
  28. package/dist/commands/index.d.ts +33 -0
  29. package/dist/commands/index.js +20 -0
  30. package/dist/commands/init.d.ts +35 -0
  31. package/dist/commands/init.js +393 -0
  32. package/dist/commands/login.d.ts +23 -0
  33. package/dist/commands/login.js +144 -0
  34. package/dist/commands/logout.d.ts +18 -0
  35. package/dist/commands/logout.js +55 -0
  36. package/dist/commands/org.d.ts +27 -0
  37. package/dist/commands/org.js +126 -0
  38. package/dist/commands/run.d.ts +21 -0
  39. package/dist/commands/run.js +562 -0
  40. package/dist/commands/secrets-list.d.ts +16 -0
  41. package/dist/commands/secrets-list.js +85 -0
  42. package/dist/commands/status.d.ts +30 -0
  43. package/dist/commands/status.js +210 -0
  44. package/dist/commands/test.d.ts +61 -0
  45. package/dist/commands/test.js +220 -0
  46. package/dist/commands/types.d.ts +18 -0
  47. package/dist/commands/types.js +74 -0
  48. package/dist/commands/watch.d.ts +14 -0
  49. package/dist/commands/watch.js +97 -0
  50. package/dist/commands/workflows.d.ts +28 -0
  51. package/dist/commands/workflows.js +154 -0
  52. package/dist/comment-created.json +30 -0
  53. package/dist/create-branch.json +17 -0
  54. package/dist/delete-branch.json +15 -0
  55. package/dist/dispatch.json +15 -0
  56. package/dist/errors/capability-gap.d.ts +50 -0
  57. package/dist/errors/capability-gap.js +54 -0
  58. package/dist/errors/codes.d.ts +25 -0
  59. package/dist/errors/formatter.d.ts +32 -0
  60. package/dist/errors/formatter.js +35 -0
  61. package/dist/errors/index.d.ts +5 -0
  62. package/dist/errors/index.js +4 -0
  63. package/dist/execution/executor.d.ts +61 -0
  64. package/dist/execution/executor.js +230 -0
  65. package/dist/execution/index.d.ts +4 -0
  66. package/dist/execution/index.js +3 -0
  67. package/dist/execution/sdk-alias.d.ts +33 -0
  68. package/dist/execution/sdk-alias.js +102 -0
  69. package/dist/fixtures/compiler.d.ts +47 -0
  70. package/dist/fixtures/compiler.js +177 -0
  71. package/dist/fixtures/defaults/comment-created.json +30 -0
  72. package/dist/fixtures/defaults/create-branch.json +17 -0
  73. package/dist/fixtures/defaults/delete-branch.json +15 -0
  74. package/dist/fixtures/defaults/dispatch.json +15 -0
  75. package/dist/fixtures/defaults/fork.json +19 -0
  76. package/dist/fixtures/defaults/index.d.ts +16 -0
  77. package/dist/fixtures/defaults/index.js +105 -0
  78. package/dist/fixtures/defaults/index.ts +145 -0
  79. package/dist/fixtures/defaults/pr-closed.json +28 -0
  80. package/dist/fixtures/defaults/pr-opened.json +27 -0
  81. package/dist/fixtures/defaults/pr-reopened.json +27 -0
  82. package/dist/fixtures/defaults/pr-synchronize.json +27 -0
  83. package/dist/fixtures/defaults/push.json +16 -0
  84. package/dist/fixtures/defaults/release-published.json +23 -0
  85. package/dist/fixtures/defaults/review-comment-created.json +36 -0
  86. package/dist/fixtures/defaults/review-submitted.json +35 -0
  87. package/dist/fixtures/defaults/star-created.json +15 -0
  88. package/dist/fixtures/defaults/status.json +26 -0
  89. package/dist/fixtures/defaults/tag-push.json +20 -0
  90. package/dist/fixtures/defaults/watch-started.json +15 -0
  91. package/dist/fixtures/defaults/workflow-run-completed.json +23 -0
  92. package/dist/fork.json +19 -0
  93. package/dist/format.d.ts +5 -0
  94. package/dist/format.js +20 -0
  95. package/dist/generators/secrets-dts.d.ts +29 -0
  96. package/dist/generators/secrets-dts.js +67 -0
  97. package/dist/hooks/detector.d.ts +39 -0
  98. package/dist/hooks/detector.js +133 -0
  99. package/dist/hooks/index.d.ts +6 -0
  100. package/dist/hooks/index.js +5 -0
  101. package/dist/hooks/installer.d.ts +24 -0
  102. package/dist/hooks/installer.js +328 -0
  103. package/dist/hooks/templates.d.ts +26 -0
  104. package/dist/hooks/templates.js +63 -0
  105. package/dist/index.d.ts +12 -0
  106. package/dist/index.js +12 -0
  107. package/dist/llm-context/llms-full.txt +9974 -0
  108. package/dist/llm-context/llms.txt +61 -0
  109. package/dist/local-executor/dag-scheduler.d.ts +44 -0
  110. package/dist/local-executor/dag-scheduler.js +183 -0
  111. package/dist/local-executor/index.d.ts +23 -0
  112. package/dist/local-executor/index.js +309 -0
  113. package/dist/local-executor/job-runner.d.ts +40 -0
  114. package/dist/local-executor/job-runner.js +307 -0
  115. package/dist/local-executor/output-streamer.d.ts +31 -0
  116. package/dist/local-executor/output-streamer.js +166 -0
  117. package/dist/local-executor/payload-generator.d.ts +16 -0
  118. package/dist/local-executor/payload-generator.js +138 -0
  119. package/dist/local-executor/picker.d.ts +33 -0
  120. package/dist/local-executor/picker.js +109 -0
  121. package/dist/local-executor/secret-loader.d.ts +18 -0
  122. package/dist/local-executor/secret-loader.js +105 -0
  123. package/dist/local-executor/types.d.ts +80 -0
  124. package/dist/local-executor/types.js +2 -0
  125. package/dist/local-executor/workflow-lock.d.ts +81 -0
  126. package/dist/local-executor/workflow-lock.js +0 -0
  127. package/dist/lockfile/generator.d.ts +39 -0
  128. package/dist/lockfile/generator.js +688 -0
  129. package/dist/lockfile/hash-files.d.ts +14 -0
  130. package/dist/lockfile/hash-files.js +50 -0
  131. package/dist/lockfile/hasher.d.ts +36 -0
  132. package/dist/lockfile/hasher.js +46 -0
  133. package/dist/lockfile/index.d.ts +3 -0
  134. package/dist/lockfile/index.js +4 -0
  135. package/dist/lockfile/purity-analyzer.d.ts +25 -0
  136. package/dist/lockfile/purity-analyzer.js +204 -0
  137. package/dist/package-F7UXSDHW.json +74 -0
  138. package/dist/postinstall.d.ts +9 -0
  139. package/dist/postinstall.js +60 -0
  140. package/dist/pr-closed.json +28 -0
  141. package/dist/pr-opened.json +27 -0
  142. package/dist/pr-reopened.json +27 -0
  143. package/dist/pr-synchronize.json +27 -0
  144. package/dist/push.json +16 -0
  145. package/dist/release-published.json +23 -0
  146. package/dist/remote/client.d.ts +204 -0
  147. package/dist/remote/client.js +203 -0
  148. package/dist/remote/config.d.ts +54 -0
  149. package/dist/remote/config.js +92 -0
  150. package/dist/remote/encryption.d.ts +35 -0
  151. package/dist/remote/encryption.js +87 -0
  152. package/dist/remote/history.d.ts +91 -0
  153. package/dist/remote/history.js +146 -0
  154. package/dist/remote/oauth.d.ts +65 -0
  155. package/dist/remote/oauth.js +302 -0
  156. package/dist/remote/observer.d.ts +81 -0
  157. package/dist/remote/observer.js +174 -0
  158. package/dist/remote/output/json.d.ts +13 -0
  159. package/dist/remote/output/json.js +36 -0
  160. package/dist/remote/output/junit.d.ts +18 -0
  161. package/dist/remote/output/junit.js +50 -0
  162. package/dist/remote/output/streaming.d.ts +57 -0
  163. package/dist/remote/output/streaming.js +124 -0
  164. package/dist/remote/output/summary.d.ts +39 -0
  165. package/dist/remote/output/summary.js +99 -0
  166. package/dist/remote/uploader.d.ts +87 -0
  167. package/dist/remote/uploader.js +197 -0
  168. package/dist/review-comment-created.json +36 -0
  169. package/dist/review-submitted.json +35 -0
  170. package/dist/star-created.json +15 -0
  171. package/dist/status.json +26 -0
  172. package/dist/tag-push.json +20 -0
  173. package/dist/templates/agents-md.d.ts +8 -0
  174. package/dist/templates/agents-md.js +130 -0
  175. package/dist/templates/index.d.ts +43 -0
  176. package/dist/templates/index.js +48 -0
  177. package/dist/templates/package-json.d.ts +18 -0
  178. package/dist/templates/package-json.js +34 -0
  179. package/dist/templates/tsconfig-json.d.ts +9 -0
  180. package/dist/templates/tsconfig-json.js +26 -0
  181. package/dist/templates/workflows/hello-world.d.ts +2 -0
  182. package/dist/templates/workflows/hello-world.js +16 -0
  183. package/dist/templates/workflows/hello-world.ts +21 -0
  184. package/dist/templates/workflows/pr-checks.d.ts +2 -0
  185. package/dist/templates/workflows/pr-checks.js +40 -0
  186. package/dist/templates/workflows/pr-checks.ts +57 -0
  187. package/dist/test-runner/dry-run.d.ts +12 -0
  188. package/dist/test-runner/dry-run.js +66 -0
  189. package/dist/test-runner/event-types.d.ts +86 -0
  190. package/dist/test-runner/event-types.js +330 -0
  191. package/dist/test-runner/git-detector.d.ts +15 -0
  192. package/dist/test-runner/git-detector.js +30 -0
  193. package/dist/test-runner/index.d.ts +13 -0
  194. package/dist/test-runner/index.js +11 -0
  195. package/dist/test-runner/job-executor.d.ts +48 -0
  196. package/dist/test-runner/job-executor.js +245 -0
  197. package/dist/test-runner/output-formatter.d.ts +47 -0
  198. package/dist/test-runner/output-formatter.js +92 -0
  199. package/dist/test-runner/payload-builder.d.ts +20 -0
  200. package/dist/test-runner/payload-builder.js +216 -0
  201. package/dist/test-runner/rule-evaluator.d.ts +14 -0
  202. package/dist/test-runner/rule-evaluator.js +31 -0
  203. package/dist/test-runner/secrets-file.d.ts +24 -0
  204. package/dist/test-runner/secrets-file.js +62 -0
  205. package/dist/test-runner/step-context.d.ts +15 -0
  206. package/dist/test-runner/step-context.js +140 -0
  207. package/dist/test-runner/summary.d.ts +7 -0
  208. package/dist/types.d.ts +525 -0
  209. package/dist/types.js +33 -0
  210. package/dist/validation/index.d.ts +3 -0
  211. package/dist/validation/index.js +3 -0
  212. package/dist/validation/validator.d.ts +26 -0
  213. package/dist/validation/validator.js +164 -0
  214. package/dist/watch-started.json +15 -0
  215. package/dist/workflow-run-completed.json +23 -0
  216. package/dist/workflows/hello-world.ts +21 -0
  217. package/dist/workflows/pr-checks.ts +57 -0
  218. package/hack/postinstall.mjs +105 -0
  219. package/package.json +60 -6
  220. package/sbom.spdx.json +10997 -0
  221. 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