@pat-lewczuk/cezar 0.1.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/dist/config.d.ts +62 -0
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-runner.d.ts +13 -0
- package/dist/core/claude-cli-runner.js +23 -2
- package/dist/core/claude-cli-runner.js.map +1 -1
- package/dist/git-worktree.d.ts +56 -0
- package/dist/git-worktree.js +143 -0
- package/dist/git-worktree.js.map +1 -0
- package/dist/handoff.d.ts +42 -0
- package/dist/handoff.js +120 -0
- package/dist/handoff.js.map +1 -0
- package/dist/index.js +27 -6
- package/dist/index.js.map +1 -1
- package/dist/planner.d.ts +17 -0
- package/dist/planner.js +244 -0
- package/dist/planner.js.map +1 -0
- package/dist/runs/store.d.ts +40 -13
- package/dist/runs/store.js +33 -3
- package/dist/runs/store.js.map +1 -1
- package/dist/server/git.d.ts +5 -0
- package/dist/server/git.js +38 -0
- package/dist/server/git.js.map +1 -1
- package/dist/server/github.d.ts +29 -0
- package/dist/server/github.js +140 -0
- package/dist/server/github.js.map +1 -0
- package/dist/server/launch-key.d.ts +7 -0
- package/dist/server/launch-key.js +33 -0
- package/dist/server/launch-key.js.map +1 -0
- package/dist/server/pr.d.ts +22 -0
- package/dist/server/pr.js +98 -0
- package/dist/server/pr.js.map +1 -0
- package/dist/server/server.js +537 -19
- package/dist/server/server.js.map +1 -1
- package/dist/skills-remote.d.ts +35 -0
- package/dist/skills-remote.js +266 -0
- package/dist/skills-remote.js.map +1 -0
- package/dist/skills.d.ts +20 -6
- package/dist/skills.js +77 -12
- package/dist/skills.js.map +1 -1
- package/dist/todos.d.ts +60 -0
- package/dist/todos.js +166 -0
- package/dist/todos.js.map +1 -0
- package/dist/workflows/load.js +8 -10
- package/dist/workflows/load.js.map +1 -1
- package/dist/workflows/run.d.ts +62 -3
- package/dist/workflows/run.js +351 -45
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/types.d.ts +96 -26
- package/dist/workflows/types.js +73 -2
- package/dist/workflows/types.js.map +1 -1
- package/package.json +1 -1
- package/scripts/mock-claude.mjs +118 -0
- package/web/app.js +2821 -154
- package/web/index.html +82 -23
- package/web/open-mercato.svg +11 -0
- package/web/style.css +1652 -222
package/dist/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/todos.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* The global follow-up inbox (spec 007): `.ai/cezar/todos.json`, a flat JSON
|
|
4
|
+
* array agents append to (via CEZ_TODOS_FILE). Agent entries are external
|
|
5
|
+
* data — each one is zod-validated on read and malformed ones are skipped
|
|
6
|
+
* with a warning, never fatal. Server writes are serialized with an
|
|
7
|
+
* in-process lock (the janitor `withLock` pattern) and land atomically
|
|
8
|
+
* (tmp + rename, the runs.json pattern).
|
|
9
|
+
*/
|
|
10
|
+
declare const todoSchema: z.ZodObject<{
|
|
11
|
+
id: z.ZodOptional<z.ZodString>;
|
|
12
|
+
ts: z.ZodOptional<z.ZodString>;
|
|
13
|
+
taskId: z.ZodOptional<z.ZodString>;
|
|
14
|
+
summary: z.ZodString;
|
|
15
|
+
action: z.ZodOptional<z.ZodString>;
|
|
16
|
+
prUrl: z.ZodOptional<z.ZodString>;
|
|
17
|
+
suggestedSkill: z.ZodOptional<z.ZodString>;
|
|
18
|
+
suggestedArgs: z.ZodOptional<z.ZodString>;
|
|
19
|
+
suggestedPrompt: z.ZodOptional<z.ZodString>;
|
|
20
|
+
/** Set by the server when "▶ Run" turned this entry into a task. */
|
|
21
|
+
startedTaskId: z.ZodOptional<z.ZodString>;
|
|
22
|
+
}, "strip", z.ZodTypeAny, {
|
|
23
|
+
summary: string;
|
|
24
|
+
id?: string | undefined;
|
|
25
|
+
ts?: string | undefined;
|
|
26
|
+
taskId?: string | undefined;
|
|
27
|
+
action?: string | undefined;
|
|
28
|
+
prUrl?: string | undefined;
|
|
29
|
+
suggestedSkill?: string | undefined;
|
|
30
|
+
suggestedArgs?: string | undefined;
|
|
31
|
+
suggestedPrompt?: string | undefined;
|
|
32
|
+
startedTaskId?: string | undefined;
|
|
33
|
+
}, {
|
|
34
|
+
summary: string;
|
|
35
|
+
id?: string | undefined;
|
|
36
|
+
ts?: string | undefined;
|
|
37
|
+
taskId?: string | undefined;
|
|
38
|
+
action?: string | undefined;
|
|
39
|
+
prUrl?: string | undefined;
|
|
40
|
+
suggestedSkill?: string | undefined;
|
|
41
|
+
suggestedArgs?: string | undefined;
|
|
42
|
+
suggestedPrompt?: string | undefined;
|
|
43
|
+
startedTaskId?: string | undefined;
|
|
44
|
+
}>;
|
|
45
|
+
export type TodoItem = z.infer<typeof todoSchema> & {
|
|
46
|
+
id: string;
|
|
47
|
+
};
|
|
48
|
+
export declare function todosPath(dataDir: string): string;
|
|
49
|
+
export declare function readTodos(dataDir: string): Promise<TodoItem[]>;
|
|
50
|
+
/** Check off (delete) an entry. False when the id isn't there. */
|
|
51
|
+
export declare function removeTodo(dataDir: string, id: string): Promise<boolean>;
|
|
52
|
+
/** Record that "▶ Run" turned the entry into task `taskId`. The entry stays
|
|
53
|
+
* in the file as an audit trail; the GUI hides started entries. */
|
|
54
|
+
export declare function markStarted(dataDir: string, id: string, taskId: string): Promise<boolean>;
|
|
55
|
+
/** Watch `.ai/cezar/` for todos.json changes (agents write it from another
|
|
56
|
+
* process) and emit debounced change events. Degrades to no watch on error. */
|
|
57
|
+
export declare function startTodosWatch(dataDir: string): void;
|
|
58
|
+
/** Subscribe to inbox changes; returns the unsubscribe function. */
|
|
59
|
+
export declare function onTodosChanged(cb: () => void): () => void;
|
|
60
|
+
export {};
|
package/dist/todos.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { promises as fs } from 'node:fs';
|
|
4
|
+
import { mkdirSync, watch } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
/**
|
|
8
|
+
* The global follow-up inbox (spec 007): `.ai/cezar/todos.json`, a flat JSON
|
|
9
|
+
* array agents append to (via CEZ_TODOS_FILE). Agent entries are external
|
|
10
|
+
* data — each one is zod-validated on read and malformed ones are skipped
|
|
11
|
+
* with a warning, never fatal. Server writes are serialized with an
|
|
12
|
+
* in-process lock (the janitor `withLock` pattern) and land atomically
|
|
13
|
+
* (tmp + rename, the runs.json pattern).
|
|
14
|
+
*/
|
|
15
|
+
const todoSchema = z.object({
|
|
16
|
+
id: z.string().min(1).optional(),
|
|
17
|
+
ts: z.string().optional(),
|
|
18
|
+
taskId: z.string().optional(),
|
|
19
|
+
summary: z.string().min(1),
|
|
20
|
+
action: z.string().optional(),
|
|
21
|
+
prUrl: z.string().optional(),
|
|
22
|
+
suggestedSkill: z.string().optional(),
|
|
23
|
+
suggestedArgs: z.string().optional(),
|
|
24
|
+
suggestedPrompt: z.string().optional(),
|
|
25
|
+
/** Set by the server when "▶ Run" turned this entry into a task. */
|
|
26
|
+
startedTaskId: z.string().optional(),
|
|
27
|
+
});
|
|
28
|
+
export function todosPath(dataDir) {
|
|
29
|
+
return join(dataDir, 'todos.json');
|
|
30
|
+
}
|
|
31
|
+
// ---- in-process lock (15-line port of janitor's storage.withLock) ----------
|
|
32
|
+
const locks = new Map();
|
|
33
|
+
async function withLock(key, fn) {
|
|
34
|
+
const prev = locks.get(key) ?? Promise.resolve();
|
|
35
|
+
let release = () => undefined;
|
|
36
|
+
const next = new Promise((r) => {
|
|
37
|
+
release = r;
|
|
38
|
+
});
|
|
39
|
+
locks.set(key, prev.then(() => next));
|
|
40
|
+
try {
|
|
41
|
+
await prev;
|
|
42
|
+
return await fn();
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
release();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// ---- read / write -----------------------------------------------------------
|
|
49
|
+
/** Parse + validate the file. Broken JSON / non-array → []; bad entries are
|
|
50
|
+
* skipped with a warning; entries without an id get one assigned. */
|
|
51
|
+
async function readRaw(dataDir) {
|
|
52
|
+
let raw;
|
|
53
|
+
try {
|
|
54
|
+
raw = await fs.readFile(todosPath(dataDir), 'utf8');
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return { items: [], needsRewrite: false }; // no file yet — empty inbox
|
|
58
|
+
}
|
|
59
|
+
let parsed;
|
|
60
|
+
try {
|
|
61
|
+
parsed = JSON.parse(raw);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
65
|
+
console.warn(`[cez] todos.json is not valid JSON — showing an empty inbox (${message})`);
|
|
66
|
+
return { items: [], needsRewrite: false };
|
|
67
|
+
}
|
|
68
|
+
if (!Array.isArray(parsed)) {
|
|
69
|
+
console.warn('[cez] todos.json is not a JSON array — showing an empty inbox');
|
|
70
|
+
return { items: [], needsRewrite: false };
|
|
71
|
+
}
|
|
72
|
+
const items = [];
|
|
73
|
+
let needsRewrite = false;
|
|
74
|
+
for (const entry of parsed) {
|
|
75
|
+
const result = todoSchema.safeParse(entry);
|
|
76
|
+
if (!result.success) {
|
|
77
|
+
console.warn(`[cez] skipped a malformed todos.json entry: ${result.error.issues.map((i) => i.message).join('; ')}`);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (!result.data.id) {
|
|
81
|
+
// Agent entries arrive without ids — assign one so the GUI can address
|
|
82
|
+
// the entry; the file is rewritten (under the lock) on this read.
|
|
83
|
+
needsRewrite = true;
|
|
84
|
+
items.push({ ...result.data, id: randomUUID() });
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
items.push({ ...result.data, id: result.data.id });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { items, needsRewrite };
|
|
91
|
+
}
|
|
92
|
+
async function writeAtomic(dataDir, items) {
|
|
93
|
+
const file = todosPath(dataDir);
|
|
94
|
+
const tmp = `${file}.tmp`;
|
|
95
|
+
await fs.mkdir(dataDir, { recursive: true });
|
|
96
|
+
await fs.writeFile(tmp, JSON.stringify(items, null, 2), 'utf8');
|
|
97
|
+
await fs.rename(tmp, file);
|
|
98
|
+
}
|
|
99
|
+
export async function readTodos(dataDir) {
|
|
100
|
+
return withLock(dataDir, async () => {
|
|
101
|
+
const { items, needsRewrite } = await readRaw(dataDir);
|
|
102
|
+
if (needsRewrite) {
|
|
103
|
+
await writeAtomic(dataDir, items).catch(() => undefined); // best effort
|
|
104
|
+
}
|
|
105
|
+
return items;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/** Check off (delete) an entry. False when the id isn't there. */
|
|
109
|
+
export async function removeTodo(dataDir, id) {
|
|
110
|
+
return withLock(dataDir, async () => {
|
|
111
|
+
const { items } = await readRaw(dataDir);
|
|
112
|
+
const next = items.filter((t) => t.id !== id);
|
|
113
|
+
if (next.length === items.length)
|
|
114
|
+
return false;
|
|
115
|
+
await writeAtomic(dataDir, next);
|
|
116
|
+
return true;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/** Record that "▶ Run" turned the entry into task `taskId`. The entry stays
|
|
120
|
+
* in the file as an audit trail; the GUI hides started entries. */
|
|
121
|
+
export async function markStarted(dataDir, id, taskId) {
|
|
122
|
+
return withLock(dataDir, async () => {
|
|
123
|
+
const { items } = await readRaw(dataDir);
|
|
124
|
+
const item = items.find((t) => t.id === id);
|
|
125
|
+
if (!item)
|
|
126
|
+
return false;
|
|
127
|
+
item.startedTaskId = taskId;
|
|
128
|
+
await writeAtomic(dataDir, items);
|
|
129
|
+
return true;
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// ---- change notifications ----------------------------------------------------
|
|
133
|
+
const emitter = new EventEmitter();
|
|
134
|
+
emitter.setMaxListeners(100);
|
|
135
|
+
let watching = false;
|
|
136
|
+
/** Watch `.ai/cezar/` for todos.json changes (agents write it from another
|
|
137
|
+
* process) and emit debounced change events. Degrades to no watch on error. */
|
|
138
|
+
export function startTodosWatch(dataDir) {
|
|
139
|
+
if (watching)
|
|
140
|
+
return;
|
|
141
|
+
watching = true;
|
|
142
|
+
try {
|
|
143
|
+
mkdirSync(dataDir, { recursive: true });
|
|
144
|
+
let timer;
|
|
145
|
+
const watcher = watch(dataDir, (_event, filename) => {
|
|
146
|
+
if (filename && filename !== 'todos.json')
|
|
147
|
+
return;
|
|
148
|
+
if (timer)
|
|
149
|
+
clearTimeout(timer);
|
|
150
|
+
timer = setTimeout(() => emitter.emit('changed'), 300);
|
|
151
|
+
timer.unref?.();
|
|
152
|
+
});
|
|
153
|
+
watcher.on('error', () => undefined); // a dying watcher must not kill the server
|
|
154
|
+
watcher.unref?.();
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
158
|
+
console.warn(`[cez] todos watch unavailable — the Inbox updates on refresh only (${message})`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** Subscribe to inbox changes; returns the unsubscribe function. */
|
|
162
|
+
export function onTodosChanged(cb) {
|
|
163
|
+
emitter.on('changed', cb);
|
|
164
|
+
return () => emitter.off('changed', cb);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=todos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todos.js","sourceRoot":"","sources":["../src/todos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AAEH,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,oEAAoE;IACpE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAIH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACrC,CAAC;AAED,+EAA+E;AAE/E,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;AAElD,KAAK,UAAU,QAAQ,CAAI,GAAW,EAAE,EAAoB;IAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACjD,IAAI,OAAO,GAAe,GAAG,EAAE,CAAC,SAAS,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;QACnC,OAAO,GAAG,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC;QACX,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF;sEACsE;AACtE,KAAK,UAAU,OAAO,CAAC,OAAe;IACpC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,4BAA4B;IACzE,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,gEAAgE,OAAO,GAAG,CAAC,CAAC;QACzF,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC9E,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IACD,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,+CAA+C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpH,SAAS;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACpB,uEAAuE;YACvE,kEAAkE;YAClE,YAAY,GAAG,IAAI,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,KAAiB;IAC3D,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC;IAC1B,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc;QAC1E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,EAAU;IAC1D,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/C,MAAM,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;oEACoE;AACpE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,EAAU,EAAE,MAAc;IAC3E,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,MAAM,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AAEjF,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;AACnC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB;gFACgF;AAChF,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,QAAQ;QAAE,OAAO;IACrB,QAAQ,GAAG,IAAI,CAAC;IAChB,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,KAAiC,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YAClD,IAAI,QAAQ,IAAI,QAAQ,KAAK,YAAY;gBAAE,OAAO;YAClD,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;YACvD,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,2CAA2C;QACjF,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,sEAAsE,OAAO,GAAG,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,EAAc;IAC3C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC1B,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC"}
|
package/dist/workflows/load.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readdir, readFile } from 'node:fs/promises';
|
|
2
2
|
import { extname, join, resolve } from 'node:path';
|
|
3
3
|
import { parse as parseYaml } from 'yaml';
|
|
4
|
-
import { QUICK_TASK_WORKFLOW, workflowFileSchema } from './types.js';
|
|
4
|
+
import { QUICK_TASK_WORKFLOW, normalizeWorkflowDoc, stepsIssue, workflowFileSchema, } from './types.js';
|
|
5
5
|
export const WORKFLOWS_DIR = '.ai/cezar/workflows';
|
|
6
6
|
/**
|
|
7
7
|
* Load the workflow catalog: the built-in `quick-task` plus every
|
|
@@ -31,17 +31,15 @@ export async function loadWorkflows(repoRoot) {
|
|
|
31
31
|
issues.push({ path, message: parsed.error.issues.map((i) => i.message).join('; ') });
|
|
32
32
|
continue;
|
|
33
33
|
}
|
|
34
|
-
//
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
message: `step "${badRetry.id}": onFail.retry must reference an earlier step (got "${badRetry.onFail.retry}")`,
|
|
41
|
-
});
|
|
34
|
+
// `skills:` shorthand files become plain agent steps here (spec 012).
|
|
35
|
+
const normalized = normalizeWorkflowDoc(parsed.data);
|
|
36
|
+
// Steps referenced by onFail.retry must exist and come earlier; ids unique.
|
|
37
|
+
const issue = stepsIssue(normalized.steps);
|
|
38
|
+
if (issue) {
|
|
39
|
+
issues.push({ path, message: issue });
|
|
42
40
|
continue;
|
|
43
41
|
}
|
|
44
|
-
fromFiles.push({ ...
|
|
42
|
+
fromFiles.push({ ...normalized, source: 'file', path });
|
|
45
43
|
}
|
|
46
44
|
catch (err) {
|
|
47
45
|
issues.push({ path, message: err instanceof Error ? err.message : String(err) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/workflows/load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/workflows/load.ts"],"names":[],"mappings":"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"}
|
package/dist/workflows/run.d.ts
CHANGED
|
@@ -3,24 +3,60 @@ import type { RunRecord, RunStore } from '../runs/store.js';
|
|
|
3
3
|
import { type WorkflowDef } from './types.js';
|
|
4
4
|
/** An interactive session that hears nothing from the user closes itself. */
|
|
5
5
|
export declare const IDLE_TIMEOUT_MS: number;
|
|
6
|
+
/** Periodic "cezar autosave" commit in the task worktree (spec 006). */
|
|
7
|
+
export declare const AUTOSAVE_INTERVAL_MS = 90000;
|
|
6
8
|
export interface StartRunInput {
|
|
7
9
|
task: string;
|
|
8
10
|
model?: string;
|
|
11
|
+
/** Screenshots pasted into the new-task form — delivered once, with the
|
|
12
|
+
* first agent step's opening message. */
|
|
13
|
+
images?: ContentBlock[];
|
|
9
14
|
}
|
|
15
|
+
/** Variant letters + the fixed diversification hints (spec 010). A runs the
|
|
16
|
+
* task verbatim; B/C get one constant sentence each — zero configuration. */
|
|
17
|
+
export declare const VARIANT_LETTERS: readonly ["A", "B", "C"];
|
|
10
18
|
/**
|
|
11
19
|
* The mini workflow engine: executes a `WorkflowDef` against a repo, one step
|
|
12
20
|
* at a time, persisting every event to the RunStore (which the SSE endpoints
|
|
13
21
|
* relay live to the GUI). No GitHub choreography — agent steps and shell
|
|
14
22
|
* checks with bounded retry loops, plus live sessions: the last agent step
|
|
15
23
|
* stays open for follow-ups (`waiting`) until "finish", idle timeout, or
|
|
16
|
-
* cancel.
|
|
24
|
+
* cancel. Runs queue behind `maxParallel` slots and each run executes in its
|
|
25
|
+
* own git worktree on a `cez/<id8>` branch (spec 006), autosave-committed
|
|
26
|
+
* every 90 s — the user's working tree is never touched.
|
|
17
27
|
*/
|
|
18
28
|
export declare class RunManager {
|
|
19
29
|
private readonly store;
|
|
20
30
|
private readonly repoRoot;
|
|
21
31
|
private readonly active;
|
|
32
|
+
private readonly queue;
|
|
33
|
+
private readonly starting;
|
|
34
|
+
private readonly pendingJobs;
|
|
35
|
+
private pumping;
|
|
36
|
+
/** `.ai/cezar` — where the per-task handoff files and todos.json live. */
|
|
37
|
+
private readonly dataDir;
|
|
22
38
|
constructor(store: RunStore, repoRoot: string);
|
|
23
|
-
|
|
39
|
+
/** Env the spawned claude gets so the agent can find its handoff file and
|
|
40
|
+
* the global inbox (spec 007). */
|
|
41
|
+
private agentEnv;
|
|
42
|
+
startRun(workflow: WorkflowDef, input: StartRunInput, group?: {
|
|
43
|
+
groupId: string;
|
|
44
|
+
variant: string;
|
|
45
|
+
}): RunRecord;
|
|
46
|
+
/**
|
|
47
|
+
* Parallel variants (spec 010): N runs of the same workflow on the same
|
|
48
|
+
* task, sharing a groupId. Variant A gets the task verbatim; B and C get a
|
|
49
|
+
* fixed one-line approach hint appended to the *task input* (not the step
|
|
50
|
+
* template), so diversification works with any workflow. The normal queue
|
|
51
|
+
* applies — with maxParallel=2 a third variant simply waits.
|
|
52
|
+
*/
|
|
53
|
+
startVariants(workflow: WorkflowDef, input: StartRunInput, count: number): RunRecord[];
|
|
54
|
+
/**
|
|
55
|
+
* Start queued runs while parallel slots are free. `maxParallel` comes from
|
|
56
|
+
* `.ai/cezar/config.json` (default 2); a non-git directory degrades to 1
|
|
57
|
+
* sequential run in the repo root (spec 006 degradation rule).
|
|
58
|
+
*/
|
|
59
|
+
private pump;
|
|
24
60
|
cancel(runId: string): boolean;
|
|
25
61
|
isActive(runId: string): boolean;
|
|
26
62
|
/**
|
|
@@ -29,7 +65,11 @@ export declare class RunManager {
|
|
|
29
65
|
* then offers "Continue" instead.
|
|
30
66
|
*/
|
|
31
67
|
sendMessage(runId: string, content: ContentBlock[]): boolean;
|
|
32
|
-
/** Close the open session gracefully — the run then completes as `done
|
|
68
|
+
/** Close the open session gracefully — the run then completes as `done`
|
|
69
|
+
* (or rests at `review` when the worktree holds changes, spec 009).
|
|
70
|
+
* On a run already resting at `review` (no session — the engine loop is
|
|
71
|
+
* over), "Finish" is the third review exit: accept the changes without a
|
|
72
|
+
* PR and flip straight to `done`. */
|
|
33
73
|
finish(runId: string): boolean;
|
|
34
74
|
/**
|
|
35
75
|
* "Continue" (spec 003): reopen a finished run's claude session in-process
|
|
@@ -45,8 +85,27 @@ export declare class RunManager {
|
|
|
45
85
|
private execute;
|
|
46
86
|
/** Returns an error message, or null on success. */
|
|
47
87
|
private runAgentStep;
|
|
88
|
+
/**
|
|
89
|
+
* Diff-first review gate (spec 009), shared by `execute` and
|
|
90
|
+
* `runContinuation`: a *successful* run whose worktree holds changes rests
|
|
91
|
+
* at `review` instead of `done` — the user inspects the diff first, then
|
|
92
|
+
* sends feedback back, opens a draft PR, or just finishes. Failed/cancelled
|
|
93
|
+
* runs never enter review; no worktree or an empty diff means plain `done`.
|
|
94
|
+
*/
|
|
95
|
+
private settleSuccess;
|
|
96
|
+
/**
|
|
97
|
+
* Agent screenshot (an image block inside a tool result): the base64 data
|
|
98
|
+
* never enters the NDJSON event log — it lands as a file under
|
|
99
|
+
* `.ai/cezar/runs/<id>-images/` and the transcript event carries only the
|
|
100
|
+
* name + serving URL. Best effort: on failure the screenshot is dropped,
|
|
101
|
+
* the transcript still shows the tool result's `[screenshot]` placeholder.
|
|
102
|
+
*/
|
|
103
|
+
private persistImage;
|
|
48
104
|
private armIdleTimer;
|
|
49
105
|
private clearIdleTimer;
|
|
106
|
+
/** Autosave-commit the worktree every 90 s while the run lives (spec 006). */
|
|
107
|
+
private armAutosave;
|
|
108
|
+
private clearAutosaveTimer;
|
|
50
109
|
private runCheckStep;
|
|
51
110
|
private finishStep;
|
|
52
111
|
}
|