@kici-dev/sdk 0.1.16 → 0.1.18

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 (70) hide show
  1. package/dist/api-types.d.ts +25 -1
  2. package/dist/api-types.js +29 -3
  3. package/dist/approval.js +1 -1
  4. package/dist/cache-types.js +1 -1
  5. package/dist/context.d.ts +75 -2
  6. package/dist/context.js +14 -2
  7. package/dist/dynamic-group.js +1 -1
  8. package/dist/errors.js +3 -1
  9. package/dist/events/define-event.js +1 -1
  10. package/dist/events/event-payloads.js +1 -1
  11. package/dist/events/event-payloads.test-d.js +1 -1
  12. package/dist/events/index.js +1 -1
  13. package/dist/events/types.js +1 -1
  14. package/dist/fixture.js +1 -1
  15. package/dist/hooks/index.js +1 -1
  16. package/dist/hooks/types.js +1 -1
  17. package/dist/idempotent.js +1 -1
  18. package/dist/index.d.ts +10 -5
  19. package/dist/index.js +7 -4
  20. package/dist/job.js +21 -7
  21. package/dist/matrix/expand.d.ts +1 -24
  22. package/dist/matrix/expand.js +2 -65
  23. package/dist/matrix/index.js +1 -1
  24. package/dist/matrix/types.d.ts +2 -19
  25. package/dist/matrix/types.js +1 -1
  26. package/dist/needs-context.d.ts +32 -0
  27. package/dist/needs-context.js +44 -0
  28. package/dist/outputs.d.ts +12 -0
  29. package/dist/outputs.js +37 -2
  30. package/dist/provenance-types.d.ts +38 -0
  31. package/dist/provenance-types.js +10 -0
  32. package/dist/rules/evaluator.js +1 -1
  33. package/dist/rules/index.js +1 -1
  34. package/dist/rules/rule.js +1 -1
  35. package/dist/rules/types.js +1 -1
  36. package/dist/secrets.js +1 -1
  37. package/dist/step.js +1 -1
  38. package/dist/triggers/comment.js +1 -1
  39. package/dist/triggers/create.js +1 -1
  40. package/dist/triggers/delete.js +1 -1
  41. package/dist/triggers/dispatch.js +1 -1
  42. package/dist/triggers/fork.js +1 -1
  43. package/dist/triggers/generic-webhook.js +1 -1
  44. package/dist/triggers/index.js +1 -1
  45. package/dist/triggers/job-complete.js +1 -1
  46. package/dist/triggers/kici-event.js +1 -1
  47. package/dist/triggers/lifecycle.js +1 -1
  48. package/dist/triggers/pr.js +1 -1
  49. package/dist/triggers/push.js +1 -1
  50. package/dist/triggers/release.js +1 -1
  51. package/dist/triggers/review-comment.js +1 -1
  52. package/dist/triggers/review.js +1 -1
  53. package/dist/triggers/schedule.js +1 -1
  54. package/dist/triggers/star.js +1 -1
  55. package/dist/triggers/status.js +1 -1
  56. package/dist/triggers/tag.js +1 -1
  57. package/dist/triggers/types.js +1 -1
  58. package/dist/triggers/watch.js +1 -1
  59. package/dist/triggers/webhook.js +1 -1
  60. package/dist/triggers/workflow-complete.js +1 -1
  61. package/dist/triggers/workflow-run.js +1 -1
  62. package/dist/types.d.ts +162 -28
  63. package/dist/types.js +25 -5
  64. package/dist/validation/dag.js +1 -1
  65. package/dist/validation/index.js +1 -1
  66. package/dist/wait-for.js +1 -1
  67. package/dist/workflow.js +1 -1
  68. package/package.json +4 -5
  69. package/sbom.spdx.json +229 -179
  70. /package/dist/{chunk-gOLHoazu.js → chunk-BTugEXQM.js} +0 -0
package/dist/types.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { z } from 'zod';
2
2
  import type { $ as Shell } from 'zx';
3
- import type { ResourceRequest } from '@kici-dev/engine';
3
+ import type { ResourceRequest, RunsOnAllInput, OnUnreachableMode } from '@kici-dev/engine';
4
4
  import type { StepContext, Logger } from './context.js';
5
5
  import type { TriggerConfig } from './triggers/types.js';
6
6
  import type { Rule } from './rules/types.js';
@@ -10,7 +10,7 @@ import type { KiciApi } from './api-types.js';
10
10
  import type { DynamicGroupRef } from './dynamic-group.js';
11
11
  import type { EventPayload } from './events/event-payloads.js';
12
12
  import type { RequireApproval } from './approval.js';
13
- export type { ResourceRequest, ResourceSpec } from '@kici-dev/engine';
13
+ export type { ResourceRequest, ResourceSpec, RunsOnAllInput, OnUnreachableMode, } from '@kici-dev/engine';
14
14
  /** Source location captured at a step() call site. */
15
15
  export interface SourceLocation {
16
16
  readonly file: string;
@@ -108,13 +108,16 @@ export type Trigger = TriggerConfig;
108
108
  * the re-evaluation must produce a job with the same name and the same steps.
109
109
  *
110
110
  * - `ctx.event` is deterministic — frozen from the original webhook payload.
111
+ * - `ctx.needs` is deterministic — a snapshot of upstream outputs frozen at first
112
+ * eval and replayed unchanged on re-eval, like `ctx.event`. Present only on
113
+ * result-aware generators created via `dynamicJob(group, { needs, generate })`.
111
114
  * - `$`, `env`, and `kici` can return different results between eval and re-eval
112
115
  * (different agent, different time, different infrastructure state).
113
116
  *
114
- * **Guidance:** derive job names and structure from `ctx.event` data whenever
115
- * possible. If you use `kici.infrastructure.list()` or shell commands to
116
- * determine job names, be aware that changes between eval and re-eval will
117
- * cause a non-determinism warning (or failure if a job disappears).
117
+ * **Guidance:** derive job names and structure from `ctx.event` / `ctx.needs`
118
+ * data whenever possible. If you use `kici.infrastructure.list()` or shell
119
+ * commands to determine job names, be aware that changes between eval and re-eval
120
+ * will cause a non-determinism warning (or failure if a job disappears).
118
121
  */
119
122
  export interface DynamicJobContext {
120
123
  /** zx shell executor for running commands */
@@ -126,6 +129,12 @@ export interface DynamicJobContext {
126
129
  };
127
130
  /** Normalized event envelope that triggered this run. */
128
131
  event?: EventPayload;
132
+ /**
133
+ * Frozen outputs of declared upstream needs (result-aware generators only).
134
+ * Single-job needs expose `ctx.needs.<job>.result.<field>`; group needs
135
+ * expose an ordered array of `{ name, result }`.
136
+ */
137
+ needs?: import('./needs-context.js').NeedsContext;
129
138
  };
130
139
  /** Structured logger */
131
140
  log: Logger;
@@ -167,16 +176,56 @@ export interface TaggedDynamicJobFn extends DynamicJobFn {
167
176
  * Tag a DynamicJobFn with a group name for cross-domain needs.
168
177
  * Static jobs can then depend on this group via `needs: [dynamicGroup('name')]`.
169
178
  *
179
+ * Two forms:
180
+ * - **Function form** (event-only): `dynamicJob('shards', async ({ ctx }) => [...])`.
181
+ * Dispatched at webhook time; deterministic from `ctx.event` alone.
182
+ * - **Options form** (result-aware): `dynamicJob('reports', { needs, generate })`.
183
+ * Deferred until every job/group in `needs` completes, then `generate` is
184
+ * evaluated with the upstreams' frozen outputs available as `ctx.needs`.
185
+ *
170
186
  * @param groupName - The group name (must match what static jobs reference)
171
- * @param fn - The dynamic job generator function
187
+ * @param fnOrConfig - The generator function, or a result-aware `{ needs, generate }` config
172
188
  */
173
- export declare function dynamicJob(groupName: string, fn: DynamicJobFn): TaggedDynamicJobFn;
189
+ export declare function dynamicJob(groupName: string, fnOrConfig: DynamicJobFn | ResultAwareDynamicJobConfig): TaggedDynamicJobFn;
174
190
  /**
175
191
  * Get the group name from a DynamicJobFn, if it was tagged with dynamicJob().
176
192
  * Returns undefined for untagged functions.
177
193
  */
178
194
  export declare function getDynamicJobGroup(fn: DynamicJobFn): string | undefined;
179
195
  export { DYNAMIC_JOB_GROUP_TAG };
196
+ declare const DYNAMIC_JOB_NEEDS_TAG: unique symbol;
197
+ /**
198
+ * One declared upstream edge for a result-aware generator.
199
+ * Same shape as the elements of {@link JobOptions.needs}.
200
+ */
201
+ export type DynamicJobNeed = Job | string | DynamicGroupRef | {
202
+ name: string;
203
+ ifFailed?: 'skip' | 'run';
204
+ } | {
205
+ group: string;
206
+ ifFailed?: 'skip' | 'run';
207
+ };
208
+ /**
209
+ * Options-object form of {@link dynamicJob}: a result-aware generator that is
210
+ * deferred until its declared `needs` complete, then evaluated with their frozen
211
+ * outputs available as `ctx.needs`.
212
+ */
213
+ export interface ResultAwareDynamicJobConfig {
214
+ /** Upstream jobs/groups whose outputs the generator reads via `ctx.needs`. */
215
+ needs: ReadonlyArray<DynamicJobNeed>;
216
+ /** The generator. Receives `ctx.needs` resolved from the frozen upstream snapshot. */
217
+ generate: DynamicJobFn;
218
+ }
219
+ /** A {@link DynamicJobFn} tagged with declared needs (result-aware). */
220
+ export interface ResultAwareDynamicJobFn extends TaggedDynamicJobFn {
221
+ readonly [DYNAMIC_JOB_NEEDS_TAG]: ReadonlyArray<DynamicJobNeed>;
222
+ }
223
+ /**
224
+ * Read the declared needs from a result-aware generator.
225
+ * Returns undefined for event-only generators (the function form of dynamicJob).
226
+ */
227
+ export declare function getDynamicJobNeeds(fn: DynamicJobFn): ReadonlyArray<DynamicJobNeed> | undefined;
228
+ export { DYNAMIC_JOB_NEEDS_TAG };
180
229
  /**
181
230
  * Container configuration for job execution.
182
231
  * When set, all steps run inside the specified container.
@@ -210,34 +259,86 @@ export interface GenericInitConfig {
210
259
  /** Static environment variables available to the command. */
211
260
  env?: Record<string, string>;
212
261
  }
262
+ /**
263
+ * Overrides for the `mise` init preset. The preset supplies the `run` command;
264
+ * these tune the same fields a hand-written {@link GenericInitConfig} exposes,
265
+ * minus `run`.
266
+ */
267
+ export interface MiseInitConfig {
268
+ /** Cache spec for mise's data dir. Omit -> content-derived default; `false` -> no cache. */
269
+ cache?: import('./cache-types.js').CacheSpec | false;
270
+ /** Max wall-clock for the mise init command in ms. Defaults to 600000. */
271
+ timeout?: number;
272
+ /** Static environment variables available to the mise command. */
273
+ env?: Record<string, string>;
274
+ /** Shell used to run the mise command. Defaults to the OS template's shell. */
275
+ shell?: string;
276
+ }
277
+ /** A typed toolchain preset: zero-config string or an object with overrides. */
278
+ export type InitPreset = 'mise' | {
279
+ mise: MiseInitConfig;
280
+ };
281
+ /** One init directive: a hand-written generic config or a typed preset. */
282
+ export type InitItem = GenericInitConfig | InitPreset;
283
+ /**
284
+ * Per-job init configuration:
285
+ * - a single {@link InitItem} (generic config or preset),
286
+ * - an ordered array of items (run in order),
287
+ * - `'auto'` — detect the toolchain from committed files (mise.toml / .tool-versions),
288
+ * - `false` — explicit opt-out.
289
+ *
290
+ * An unset `init` is also "no init". `'auto'` is a scalar only — never an array element.
291
+ */
292
+ export type InitConfig = InitItem | InitItem[] | 'auto' | false;
213
293
  /**
214
294
  * Structured runsOn selector with required and excluded labels.
215
295
  * Used when jobs need to target specific agents while excluding others.
216
296
  *
217
- * **Reserved namespace:** Labels with the `kici:` prefix are reserved for internal use
218
- * (e.g., `kici:role:builder`, `kici:role:init-runner`). User-supplied labels starting with
219
- * `kici:` will be rejected at compile time and agent startup.
297
+ * **Targeting `kici:` labels:** `runsOn` may target any agent label, including the
298
+ * `kici:`-namespaced auto-labels (e.g. `kici:os:linux`, `kici:arch:arm64`,
299
+ * `kici:host:<name>`). Targeting is a requirement on candidate agents, never a grant.
300
+ * Note that `kici:scaler:<name>` / `kici:agent:<backend>` are deployment-specific names,
301
+ * so targeting them couples a workflow to one orchestrator's configuration. Users still
302
+ * cannot *set* `kici:` labels on agents — that namespace is reserved for the scaler and
303
+ * the agent's self-reported platform facts.
220
304
  */
221
305
  export interface RunsOnSelector {
222
- labels: string | string[];
223
- exclude?: string | string[];
306
+ labels: string | RegExp | (string | RegExp)[];
307
+ exclude?: string | RegExp | (string | RegExp)[];
224
308
  }
225
309
  /**
226
310
  * Polymorphic runsOn type: string shorthand, array shorthand, or full selector object.
227
- * - `'linux'` — single label shorthand
228
- * - `['linux', 'docker']` — multi-label shorthand
229
- * - `{ labels: ['linux', 'docker'], exclude: ['gpu'] }` — full selector with exclusions
311
+ * - `'kici:os:linux'` — single label shorthand (targets any linux agent)
312
+ * - `['kici:os:linux', 'gpu']` — multi-label shorthand (all must match)
313
+ * - `{ labels: ['kici:os:linux'], exclude: ['kici:host:box-01'] }` — full selector
230
314
  *
231
- * **Reserved namespace:** Labels with the `kici:` prefix are reserved for internal use
232
- * (e.g., `kici:role:builder`, `kici:role:init-runner`). User-supplied labels starting with
233
- * `kici:` will be rejected at compile time and agent startup.
315
+ * A plain string is matched exactly; a string containing glob metachars (`*?[]{}`) is a
316
+ * glob; a `RegExp` is a regex. Patterns are validated for ReDoS at compile time.
317
+ *
318
+ * **Targeting `kici:` labels:** `runsOn` may target any agent label, including the
319
+ * `kici:`-namespaced auto-labels (`kici:os:`, `kici:arch:`, `kici:host:`, `kici:agent:`,
320
+ * `kici:scaler:`, `kici:role:`). Targeting is a requirement on candidate agents, never a
321
+ * grant. `kici:scaler:` / `kici:agent:` are deployment-specific, so prefer custom labels
322
+ * for portable pool targeting. Users still cannot *set* `kici:` labels on agents.
234
323
  */
235
- export type RunsOn = string | string[] | RunsOnSelector;
324
+ export type RunsOn = string | RegExp | (string | RegExp)[] | RunsOnSelector;
236
325
  /** Job definition returned by job() factory */
237
326
  export interface Job {
238
327
  readonly _tag: 'Job';
239
328
  readonly name: string;
240
- readonly runsOn: RunsOn;
329
+ /** Single-agent targeting. Mutually exclusive with `runsOnAll`. */
330
+ readonly runsOn?: RunsOn;
331
+ /**
332
+ * Host fan-out: run one pinned execution per roster host matching the predicate.
333
+ * Mutually exclusive with `runsOn`.
334
+ */
335
+ readonly runsOnAll?: RunsOnAllInput;
336
+ /** Failure policy for unreachable durable hosts when using `runsOnAll`. */
337
+ readonly onUnreachable?: OnUnreachableMode;
338
+ /** Fan-out concurrency width (sliding window; `1` = serial). Applies to matrix and `runsOnAll`. */
339
+ readonly maxParallel?: number;
340
+ /** Halt the fan-out on first child failure, skipping the remainder. Default `false`. */
341
+ readonly failFast?: boolean;
241
342
  readonly steps: readonly StepInput[];
242
343
  readonly needs?: ReadonlyArray<Job | string | DynamicGroupRef | {
243
344
  name: string;
@@ -298,10 +399,12 @@ export interface Job {
298
399
  readonly resources?: ResourceRequest;
299
400
  /**
300
401
  * Per-job initialization. Runs after clone, before steps.
301
- * - A `GenericInitConfig` (or array, run in order) provisions a toolchain.
302
- * - `false` is an explicit opt-out (reserved for the future auto-detect layer).
402
+ * - A `GenericInitConfig` or typed preset (`'mise'` / `{ mise }`), single or
403
+ * in an ordered array, provisions a toolchain.
404
+ * - `'auto'` detects the toolchain from committed files (mise.toml / .tool-versions).
405
+ * - `false` is an explicit opt-out (an unset `init` is also "no init").
303
406
  */
304
- readonly init?: GenericInitConfig | GenericInitConfig[] | false;
407
+ readonly init?: InitConfig;
305
408
  /** Declarative cache: restored before steps, saved after the job on key miss. */
306
409
  readonly cache?: import('./cache-types.js').CacheInput;
307
410
  /** Pause for a manual human approval before this job dispatches. */
@@ -316,7 +419,36 @@ export interface Job {
316
419
  }
317
420
  /** Options for job() factory */
318
421
  export interface JobOptions {
319
- runsOn: RunsOn;
422
+ /** Single-agent targeting. Mutually exclusive with `runsOnAll`. */
423
+ runsOn?: RunsOn;
424
+ /**
425
+ * Host fan-out: run one pinned execution per roster host matching the predicate.
426
+ * The author writes a label string (`'role:web'`), an array with `!`-prefixed
427
+ * excludes (`['kici:os:linux', 'role:db', '!kici:host:db-01']`), or the
428
+ * structured `{ include: [{ all: [...] }], exclude?: [...] }` form.
429
+ * Mutually exclusive with `runsOn`.
430
+ */
431
+ runsOnAll?: RunsOnAllInput;
432
+ /**
433
+ * Failure policy for unreachable durable hosts when using `runsOnAll`:
434
+ * `'skip'` omits them, `'fail'` fails the run, `'hold'` (default) queues a
435
+ * pinned child and waits. Only meaningful alongside `runsOnAll`.
436
+ */
437
+ onUnreachable?: OnUnreachableMode;
438
+ /**
439
+ * Fan-out concurrency width: the maximum number of fan-out children (matrix
440
+ * combinations or `runsOnAll` hosts) that run at once. A sliding window —
441
+ * each child that reaches a terminal state releases the next held sibling.
442
+ * `1` = strictly serial (rolling). Applies to both matrix and `runsOnAll`
443
+ * fan-out; ignored on a non-fan-out job. Must be `>= 1`.
444
+ */
445
+ maxParallel?: number;
446
+ /**
447
+ * Halt the fan-out on the first child failure: stop releasing new children
448
+ * and skip the ones still held. Default `false` (every child runs regardless
449
+ * of sibling outcomes). Applies to both matrix and `runsOnAll` fan-out.
450
+ */
451
+ failFast?: boolean;
320
452
  /**
321
453
  * Steps to execute in this job. Accepts Step objects and bare async functions.
322
454
  * Mutually exclusive with `run`.
@@ -401,10 +533,12 @@ export interface JobOptions {
401
533
  resources?: ResourceRequest;
402
534
  /**
403
535
  * Per-job initialization. Runs after clone, before steps.
404
- * - A `GenericInitConfig` (or array, run in order) provisions a toolchain.
405
- * - `false` is an explicit opt-out (reserved for the future auto-detect layer).
536
+ * - A `GenericInitConfig` or typed preset (`'mise'` / `{ mise }`), single or
537
+ * in an ordered array, provisions a toolchain.
538
+ * - `'auto'` detects the toolchain from committed files (mise.toml / .tool-versions).
539
+ * - `false` is an explicit opt-out (an unset `init` is also "no init").
406
540
  */
407
- init?: GenericInitConfig | GenericInitConfig[] | false;
541
+ init?: InitConfig;
408
542
  /** Declarative cache: restored before steps, saved after the job on key miss. */
409
543
  cache?: import('./cache-types.js').CacheInput;
410
544
  /** Pause for a manual human approval before this job dispatches. */
package/dist/types.js CHANGED
@@ -1,4 +1,4 @@
1
- import "./chunk-gOLHoazu.js";
1
+ import "./chunk-BTugEXQM.js";
2
2
  //#region src/types.ts
3
3
  /**
4
4
  * Type guard to check if a JobOrFactory is a dynamic job generator.
@@ -11,15 +11,27 @@ const DYNAMIC_JOB_GROUP_TAG = Symbol.for("kici:dynamicJobGroup");
11
11
  * Tag a DynamicJobFn with a group name for cross-domain needs.
12
12
  * Static jobs can then depend on this group via `needs: [dynamicGroup('name')]`.
13
13
  *
14
+ * Two forms:
15
+ * - **Function form** (event-only): `dynamicJob('shards', async ({ ctx }) => [...])`.
16
+ * Dispatched at webhook time; deterministic from `ctx.event` alone.
17
+ * - **Options form** (result-aware): `dynamicJob('reports', { needs, generate })`.
18
+ * Deferred until every job/group in `needs` completes, then `generate` is
19
+ * evaluated with the upstreams' frozen outputs available as `ctx.needs`.
20
+ *
14
21
  * @param groupName - The group name (must match what static jobs reference)
15
- * @param fn - The dynamic job generator function
22
+ * @param fnOrConfig - The generator function, or a result-aware `{ needs, generate }` config
16
23
  */
17
- function dynamicJob(groupName, fn) {
18
- const tagged = fn;
24
+ function dynamicJob(groupName, fnOrConfig) {
25
+ const isConfig = typeof fnOrConfig !== "function";
26
+ const tagged = isConfig ? fnOrConfig.generate : fnOrConfig;
19
27
  Object.defineProperty(tagged, DYNAMIC_JOB_GROUP_TAG, {
20
28
  value: groupName,
21
29
  enumerable: false
22
30
  });
31
+ if (isConfig) Object.defineProperty(tagged, DYNAMIC_JOB_NEEDS_TAG, {
32
+ value: fnOrConfig.needs,
33
+ enumerable: false
34
+ });
23
35
  return tagged;
24
36
  }
25
37
  /**
@@ -29,7 +41,15 @@ function dynamicJob(groupName, fn) {
29
41
  function getDynamicJobGroup(fn) {
30
42
  return fn[DYNAMIC_JOB_GROUP_TAG];
31
43
  }
44
+ const DYNAMIC_JOB_NEEDS_TAG = Symbol.for("kici:dynamicJobNeeds");
45
+ /**
46
+ * Read the declared needs from a result-aware generator.
47
+ * Returns undefined for event-only generators (the function form of dynamicJob).
48
+ */
49
+ function getDynamicJobNeeds(fn) {
50
+ return fn[DYNAMIC_JOB_NEEDS_TAG];
51
+ }
32
52
  //#endregion
33
- export { DYNAMIC_JOB_GROUP_TAG, dynamicJob, getDynamicJobGroup, isDynamicJobFn };
53
+ export { DYNAMIC_JOB_GROUP_TAG, DYNAMIC_JOB_NEEDS_TAG, dynamicJob, getDynamicJobGroup, getDynamicJobNeeds, isDynamicJobFn };
34
54
 
35
55
  //# sourceMappingURL=types.js.map
@@ -1,4 +1,4 @@
1
- import "../chunk-gOLHoazu.js";
1
+ import "../chunk-BTugEXQM.js";
2
2
  //#region src/validation/dag.ts
3
3
  /**
4
4
  * Validate a DAG for common issues: self-references, missing dependencies, and cycles.
@@ -1,3 +1,3 @@
1
- import "../chunk-gOLHoazu.js";
1
+ import "../chunk-BTugEXQM.js";
2
2
  import { validateDag } from "./dag.js";
3
3
  export { validateDag };
package/dist/wait-for.js CHANGED
@@ -1,4 +1,4 @@
1
- import "./chunk-gOLHoazu.js";
1
+ import "./chunk-BTugEXQM.js";
2
2
  import { step } from "./step.js";
3
3
  //#region src/wait-for.ts
4
4
  /**
package/dist/workflow.js CHANGED
@@ -1,4 +1,4 @@
1
- import "./chunk-gOLHoazu.js";
1
+ import "./chunk-BTugEXQM.js";
2
2
  //#region src/workflow.ts
3
3
  /**
4
4
  * Normalize triggers to array.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kici-dev/sdk",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "description": "TypeScript SDK for defining KiCI workflows. Import into `.kici/workflows/*.ts` to declare workflows, jobs, steps, triggers, rules, and matrix configurations.",
5
5
  "keywords": [
6
6
  "ci",
@@ -46,12 +46,11 @@
46
46
  }
47
47
  },
48
48
  "dependencies": {
49
- "fast-cartesian": "^9.0.1",
50
49
  "micromatch": "^4.0.8",
51
- "zod": "^4.3.6",
50
+ "zod": "^4.4.3",
52
51
  "zx": "^8.8.5",
53
- "@kici-dev/core": "0.1.16",
54
- "@kici-dev/engine": "0.1.16"
52
+ "@kici-dev/core": "0.1.18",
53
+ "@kici-dev/engine": "0.1.18"
55
54
  },
56
55
  "devDependencies": {
57
56
  "@types/micromatch": "^4.0.10"