@pat-lewczuk/cezar 0.1.1 → 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.
@@ -80,10 +80,15 @@ export declare const workflowStepSchema: z.ZodEffects<z.ZodObject<{
80
80
  max?: number | undefined;
81
81
  } | undefined;
82
82
  }>;
83
- export declare const workflowFileSchema: z.ZodObject<{
83
+ /**
84
+ * A workflow file names either full `steps` or the portable `skills` shorthand
85
+ * (spec 012 — what the builder exports): an ordered list of skill names, each
86
+ * becoming one agent step that applies that skill to `{{task}}`.
87
+ */
88
+ export declare const workflowFileSchema: z.ZodEffects<z.ZodObject<{
84
89
  name: z.ZodString;
85
90
  description: z.ZodOptional<z.ZodString>;
86
- steps: z.ZodArray<z.ZodEffects<z.ZodObject<{
91
+ steps: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodObject<{
87
92
  id: z.ZodString;
88
93
  name: z.ZodOptional<z.ZodString>;
89
94
  prompt: z.ZodOptional<z.ZodString>;
@@ -154,10 +159,47 @@ export declare const workflowFileSchema: z.ZodObject<{
154
159
  retry: string;
155
160
  max?: number | undefined;
156
161
  } | undefined;
157
- }>, "many">;
162
+ }>, "many">>;
163
+ skills: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
158
164
  }, "strip", z.ZodTypeAny, {
159
165
  name: string;
160
- steps: {
166
+ steps?: {
167
+ id: string;
168
+ name?: string | undefined;
169
+ model?: string | undefined;
170
+ skill?: string | undefined;
171
+ command?: string | undefined;
172
+ prompt?: string | undefined;
173
+ allowedTools?: string[] | undefined;
174
+ bashAllowlist?: string[] | undefined;
175
+ onFail?: {
176
+ retry: string;
177
+ max: number;
178
+ } | undefined;
179
+ }[] | undefined;
180
+ skills?: string[] | undefined;
181
+ description?: string | undefined;
182
+ }, {
183
+ name: string;
184
+ steps?: {
185
+ id: string;
186
+ name?: string | undefined;
187
+ model?: string | undefined;
188
+ skill?: string | undefined;
189
+ command?: string | undefined;
190
+ prompt?: string | undefined;
191
+ allowedTools?: string[] | undefined;
192
+ bashAllowlist?: string[] | undefined;
193
+ onFail?: {
194
+ retry: string;
195
+ max?: number | undefined;
196
+ } | undefined;
197
+ }[] | undefined;
198
+ skills?: string[] | undefined;
199
+ description?: string | undefined;
200
+ }>, {
201
+ name: string;
202
+ steps?: {
161
203
  id: string;
162
204
  name?: string | undefined;
163
205
  model?: string | undefined;
@@ -170,11 +212,12 @@ export declare const workflowFileSchema: z.ZodObject<{
170
212
  retry: string;
171
213
  max: number;
172
214
  } | undefined;
173
- }[];
215
+ }[] | undefined;
216
+ skills?: string[] | undefined;
174
217
  description?: string | undefined;
175
218
  }, {
176
219
  name: string;
177
- steps: {
220
+ steps?: {
178
221
  id: string;
179
222
  name?: string | undefined;
180
223
  model?: string | undefined;
@@ -187,14 +230,34 @@ export declare const workflowFileSchema: z.ZodObject<{
187
230
  retry: string;
188
231
  max?: number | undefined;
189
232
  } | undefined;
190
- }[];
233
+ }[] | undefined;
234
+ skills?: string[] | undefined;
191
235
  description?: string | undefined;
192
236
  }>;
193
237
  export type WorkflowStepDef = z.infer<typeof workflowStepSchema>;
194
- export interface WorkflowDef extends z.infer<typeof workflowFileSchema> {
238
+ export type WorkflowDoc = z.infer<typeof workflowFileSchema>;
239
+ export interface WorkflowDef {
240
+ name: string;
241
+ description?: string;
242
+ steps: WorkflowStepDef[];
195
243
  source: 'built-in' | 'file';
196
244
  path?: string;
197
245
  }
246
+ /** `skills: [a, b]` → agent steps, one per skill, each running `{{task}}`. */
247
+ export declare function skillsToSteps(skills: string[]): WorkflowStepDef[];
248
+ /** Resolve the steps/skills XOR into plain steps. */
249
+ export declare function normalizeWorkflowDoc(doc: WorkflowDoc): {
250
+ name: string;
251
+ description?: string;
252
+ steps: WorkflowStepDef[];
253
+ };
254
+ /**
255
+ * The inverse of `skillsToSteps`: when every step is a plain "apply this
256
+ * skill to the task" agent step, return the skill list — the workflow can be
257
+ * written in the portable compact form. Anything richer (checks, custom
258
+ * prompts, per-step models/tools, loops) returns null.
259
+ */
260
+ export declare function skillStackOf(steps: WorkflowStepDef[]): string[] | null;
198
261
  export declare function stepKind(step: WorkflowStepDef): 'agent' | 'check';
199
262
  /**
200
263
  * Structural checks beyond the per-step schema: ids must be unique and every
@@ -30,11 +30,61 @@ export const workflowStepSchema = z
30
30
  .refine((s) => Boolean(s.command) !== Boolean(s.prompt ?? s.skill), {
31
31
  message: 'a step is either an agent step (prompt/skill) or a check step (command), not both',
32
32
  });
33
- export const workflowFileSchema = z.object({
33
+ /**
34
+ * A workflow file names either full `steps` or the portable `skills` shorthand
35
+ * (spec 012 — what the builder exports): an ordered list of skill names, each
36
+ * becoming one agent step that applies that skill to `{{task}}`.
37
+ */
38
+ export const workflowFileSchema = z
39
+ .object({
34
40
  name: z.string().min(1),
35
41
  description: z.string().optional(),
36
- steps: z.array(workflowStepSchema).min(1),
42
+ steps: z.array(workflowStepSchema).min(1).optional(),
43
+ skills: z.array(z.string().trim().min(1)).min(1).optional(),
44
+ })
45
+ .refine((d) => Boolean(d.steps) !== Boolean(d.skills), {
46
+ message: 'a workflow lists either "steps" or "skills", not both',
37
47
  });
48
+ /** `skills: [a, b]` → agent steps, one per skill, each running `{{task}}`. */
49
+ export function skillsToSteps(skills) {
50
+ const used = new Set();
51
+ return skills.map((skill) => {
52
+ let id = skill;
53
+ for (let n = 2; used.has(id); n++)
54
+ id = `${skill}-${n}`;
55
+ used.add(id);
56
+ return { id, name: skill, skill, prompt: '{{task}}' };
57
+ });
58
+ }
59
+ /** Resolve the steps/skills XOR into plain steps. */
60
+ export function normalizeWorkflowDoc(doc) {
61
+ return {
62
+ name: doc.name,
63
+ ...(doc.description ? { description: doc.description } : {}),
64
+ steps: doc.steps ?? skillsToSteps(doc.skills ?? []),
65
+ };
66
+ }
67
+ /**
68
+ * The inverse of `skillsToSteps`: when every step is a plain "apply this
69
+ * skill to the task" agent step, return the skill list — the workflow can be
70
+ * written in the portable compact form. Anything richer (checks, custom
71
+ * prompts, per-step models/tools, loops) returns null.
72
+ */
73
+ export function skillStackOf(steps) {
74
+ const skills = [];
75
+ for (const s of steps) {
76
+ if (stepKind(s) !== 'agent' || !s.skill)
77
+ return null;
78
+ if (s.prompt !== undefined && s.prompt !== '{{task}}')
79
+ return null;
80
+ if (s.name !== undefined && s.name !== s.skill)
81
+ return null;
82
+ if (s.model || s.allowedTools || s.bashAllowlist || s.onFail)
83
+ return null;
84
+ skills.push(s.skill);
85
+ }
86
+ return skills.length ? skills : null;
87
+ }
38
88
  export function stepKind(step) {
39
89
  return step.command ? 'check' : 'agent';
40
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workflows/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/workflows/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pat-lewczuk/cezar",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Local cockpit for running and tracking AI agent tasks in your repo. Uses your logged-in `claude` CLI and `gh` — zero config, zero database.",
5
5
  "license": "MIT",
6
6
  "type": "module",