@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.
- package/dist/config.d.ts +7 -0
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -1
- package/dist/git-worktree.d.ts +7 -0
- package/dist/git-worktree.js +14 -0
- package/dist/git-worktree.js.map +1 -1
- package/dist/runs/store.d.ts +2 -2
- 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 +2 -1
- package/dist/server/github.js +17 -10
- package/dist/server/github.js.map +1 -1
- package/dist/server/pr.js +7 -1
- package/dist/server/pr.js.map +1 -1
- package/dist/server/server.js +179 -16
- package/dist/server/server.js.map +1 -1
- package/dist/skills.d.ts +11 -9
- package/dist/skills.js +74 -13
- package/dist/skills.js.map +1 -1
- package/dist/workflows/load.js +5 -3
- package/dist/workflows/load.js.map +1 -1
- package/dist/workflows/run.js +21 -4
- package/dist/workflows/run.js.map +1 -1
- package/dist/workflows/types.d.ts +71 -8
- package/dist/workflows/types.js +52 -2
- package/dist/workflows/types.js.map +1 -1
- package/package.json +1 -1
- package/web/app.js +1036 -71
- package/web/index.html +15 -7
- package/web/open-mercato.svg +11 -0
- package/web/style.css +430 -48
package/dist/config.d.ts
CHANGED
|
@@ -34,6 +34,11 @@ declare const configSchema: z.ZodObject<{
|
|
|
34
34
|
maxParallel: z.ZodDefault<z.ZodNumber>;
|
|
35
35
|
/** Model for the chain planner (spec 008) — cheap but reliable at JSON. */
|
|
36
36
|
plannerModel: z.ZodDefault<z.ZodString>;
|
|
37
|
+
/**
|
|
38
|
+
* Branch task worktrees fork from and draft PRs target (e.g. `develop`).
|
|
39
|
+
* Unset = the branch currently checked out. Settable from the Repo tab.
|
|
40
|
+
*/
|
|
41
|
+
baseBranch: z.ZodOptional<z.ZodString>;
|
|
37
42
|
}, "strip", z.ZodTypeAny, {
|
|
38
43
|
skillsRepos: {
|
|
39
44
|
repo: string;
|
|
@@ -41,6 +46,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
41
46
|
}[];
|
|
42
47
|
maxParallel: number;
|
|
43
48
|
plannerModel: string;
|
|
49
|
+
baseBranch?: string | undefined;
|
|
44
50
|
}, {
|
|
45
51
|
skillsRepos?: {
|
|
46
52
|
repo: string;
|
|
@@ -48,6 +54,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
48
54
|
}[] | undefined;
|
|
49
55
|
maxParallel?: number | undefined;
|
|
50
56
|
plannerModel?: string | undefined;
|
|
57
|
+
baseBranch?: string | undefined;
|
|
51
58
|
}>;
|
|
52
59
|
export type CezConfig = z.infer<typeof configSchema>;
|
|
53
60
|
/** Read `.ai/cezar/config.json` on demand — never cached, never throws. */
|
package/dist/config.js
CHANGED
|
@@ -21,6 +21,11 @@ const configSchema = z.object({
|
|
|
21
21
|
maxParallel: z.number().int().min(1).max(16).default(2),
|
|
22
22
|
/** Model for the chain planner (spec 008) — cheap but reliable at JSON. */
|
|
23
23
|
plannerModel: z.string().min(1).default('sonnet'),
|
|
24
|
+
/**
|
|
25
|
+
* Branch task worktrees fork from and draft PRs target (e.g. `develop`).
|
|
26
|
+
* Unset = the branch currently checked out. Settable from the Repo tab.
|
|
27
|
+
*/
|
|
28
|
+
baseBranch: z.string().trim().min(1).optional(),
|
|
24
29
|
});
|
|
25
30
|
/** Read `.ai/cezar/config.json` on demand — never cached, never throws. */
|
|
26
31
|
export async function loadConfig(repoRoot) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,gFAAgF;IAChF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CACvC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAuB;IACtD,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE,MAAM,EAAE;CAC7C,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACpE,4EAA4E;IAC5E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,2EAA2E;IAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,gFAAgF;IAChF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CACvC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAuB;IACtD,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE,MAAM,EAAE;CAC7C,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACpE,4EAA4E;IAC5E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,2EAA2E;IAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACjD;;;OAGG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CAChD,CAAC,CAAC;AAIH,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/git-worktree.d.ts
CHANGED
|
@@ -9,6 +9,13 @@
|
|
|
9
9
|
/** Repo-relative home of all task worktrees (gitignored via .ai/cezar/.gitignore). */
|
|
10
10
|
export declare const WORKTREES_DIR = ".ai/cezar/worktrees";
|
|
11
11
|
export declare function branchFor(runId: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the configured base branch to something `git worktree add` can
|
|
14
|
+
* fork from: the branch itself, else its remote-tracking ref (base exists
|
|
15
|
+
* only on origin), else null — the caller falls back to the current branch
|
|
16
|
+
* with a note. Never throws.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveBaseRef(repoRoot: string, base: string): Promise<string | null>;
|
|
12
19
|
export declare function worktreePathFor(repoRoot: string, runId: string): string;
|
|
13
20
|
export interface WorktreeInfo {
|
|
14
21
|
path: string;
|
package/dist/git-worktree.js
CHANGED
|
@@ -21,6 +21,20 @@ function git(cwd, args) {
|
|
|
21
21
|
export function branchFor(runId) {
|
|
22
22
|
return `cez/${runId.slice(0, 8)}`;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the configured base branch to something `git worktree add` can
|
|
26
|
+
* fork from: the branch itself, else its remote-tracking ref (base exists
|
|
27
|
+
* only on origin), else null — the caller falls back to the current branch
|
|
28
|
+
* with a note. Never throws.
|
|
29
|
+
*/
|
|
30
|
+
export async function resolveBaseRef(repoRoot, base) {
|
|
31
|
+
for (const ref of [base, `origin/${base}`]) {
|
|
32
|
+
const res = await git(repoRoot, ['rev-parse', '--verify', '--quiet', `${ref}^{commit}`]);
|
|
33
|
+
if (res.ok)
|
|
34
|
+
return ref;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
24
38
|
export function worktreePathFor(repoRoot, runId) {
|
|
25
39
|
return join(repoRoot, WORKTREES_DIR, runId);
|
|
26
40
|
}
|
package/dist/git-worktree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-worktree.js","sourceRoot":"","sources":["../src/git-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;GAOG;AAEH,sFAAsF;AACtF,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAEnD,MAAM,QAAQ,GAAG,OAAO,CAAC;AAQzB,iEAAiE;AACjE,SAAS,GAAG,CAAC,GAAW,EAAE,IAAc;IACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CACN,KAAK,EACL,IAAI,EACJ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,EACtD,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC,CAC3F,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,KAAa;IAC7D,OAAO,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC;AASD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,KAAa,EACb,UAAkB;IAElB,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,uEAAuE;QACvE,+BAA+B;QAC/B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClF,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,YAAoB,EACpB,MAAe;IAEf,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IACrE,MAAM,EAAE,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAChF,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,MAAM;QAAE,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE;QAC5B,IAAI;QACJ,iBAAiB;QACjB,IAAI;QACJ,wBAAwB;QACxB,QAAQ;QACR,aAAa;QACb,IAAI;QACJ,gBAAgB;KACjB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,EAAE,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,YAAoB,EACpB,UAAkB,EAClB,GAAG,GAAG,QAAQ;IAEd,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,yCAAyC;IACtF,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IAC5F,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,iBAAiB,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,mBAAmB,GAAG,CAAC;IACjF,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,sBAAsB,CAAC;IACtF,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,YAAoB,EACpB,UAAkB;IAElB,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,yCAAyC;IACtF,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IAC5F,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9D,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,QAA6B;IAE7B,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,uBAAuB;IACpC,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/D,MAAM,cAAc,CAAC,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"git-worktree.js","sourceRoot":"","sources":["../src/git-worktree.ts"],"names":[],"mappings":"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"}
|
package/dist/runs/store.d.ts
CHANGED
|
@@ -130,8 +130,8 @@ declare const runRecordSchema: z.ZodObject<{
|
|
|
130
130
|
sessionId?: string | undefined;
|
|
131
131
|
costUsd?: number | undefined;
|
|
132
132
|
}[];
|
|
133
|
-
branch?: string | undefined;
|
|
134
133
|
baseBranch?: string | undefined;
|
|
134
|
+
branch?: string | undefined;
|
|
135
135
|
startedAt?: string | undefined;
|
|
136
136
|
finishedAt?: string | undefined;
|
|
137
137
|
error?: string | undefined;
|
|
@@ -164,8 +164,8 @@ declare const runRecordSchema: z.ZodObject<{
|
|
|
164
164
|
sessionId?: string | undefined;
|
|
165
165
|
costUsd?: number | undefined;
|
|
166
166
|
}[];
|
|
167
|
-
branch?: string | undefined;
|
|
168
167
|
baseBranch?: string | undefined;
|
|
168
|
+
branch?: string | undefined;
|
|
169
169
|
startedAt?: string | undefined;
|
|
170
170
|
finishedAt?: string | undefined;
|
|
171
171
|
error?: string | undefined;
|
package/dist/server/git.d.ts
CHANGED
|
@@ -18,4 +18,9 @@ export declare function getRepoInfo(dir: string): Promise<RepoInfo | null>;
|
|
|
18
18
|
export declare function getStatus(root: string): Promise<StatusEntry[]>;
|
|
19
19
|
/** Working-tree diff vs HEAD (staged + unstaged), capped for the GUI. */
|
|
20
20
|
export declare function getDiff(root: string, cap?: number): Promise<string>;
|
|
21
|
+
/** Local + origin branch names, deduped (origin/x counts as x), sorted.
|
|
22
|
+
* Feeds the Repo tab's base-branch picker. */
|
|
23
|
+
export declare function getBranches(root: string): Promise<string[]>;
|
|
24
|
+
/** One commit — message + stat + patch — for the Repo view's expandable rows. */
|
|
25
|
+
export declare function getCommit(root: string, sha: string, cap?: number): Promise<string>;
|
|
21
26
|
export declare function getLog(root: string, count?: number): Promise<LogEntry[]>;
|
package/dist/server/git.js
CHANGED
|
@@ -37,6 +37,44 @@ export async function getDiff(root, cap = 400_000) {
|
|
|
37
37
|
return `${diff.slice(0, cap)}\n… (diff truncated)`;
|
|
38
38
|
return diff;
|
|
39
39
|
}
|
|
40
|
+
/** Local + origin branch names, deduped (origin/x counts as x), sorted.
|
|
41
|
+
* Feeds the Repo tab's base-branch picker. */
|
|
42
|
+
export async function getBranches(root) {
|
|
43
|
+
const names = new Set();
|
|
44
|
+
try {
|
|
45
|
+
const local = await git(root, ['branch', '--list', '--format=%(refname:short)']);
|
|
46
|
+
for (const line of local.split('\n')) {
|
|
47
|
+
const name = line.trim();
|
|
48
|
+
if (name)
|
|
49
|
+
names.add(name);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// no branches — empty list
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const remote = await git(root, ['branch', '-r', '--list', '--format=%(refname:short)']);
|
|
57
|
+
for (const line of remote.split('\n')) {
|
|
58
|
+
const name = line.trim();
|
|
59
|
+
if (!name || name.includes('HEAD'))
|
|
60
|
+
continue;
|
|
61
|
+
names.add(name.replace(/^origin\//, ''));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// no remotes — local only
|
|
66
|
+
}
|
|
67
|
+
return [...names].filter((n) => !n.startsWith('cez/')).sort((a, b) => a.localeCompare(b));
|
|
68
|
+
}
|
|
69
|
+
/** One commit — message + stat + patch — for the Repo view's expandable rows. */
|
|
70
|
+
export async function getCommit(root, sha, cap = 200_000) {
|
|
71
|
+
if (!/^[0-9a-f]{4,40}$/i.test(sha))
|
|
72
|
+
return '(not a commit hash)';
|
|
73
|
+
const out = await git(root, ['show', '--stat', '--patch', '--no-color', sha]);
|
|
74
|
+
if (out.length > cap)
|
|
75
|
+
return `${out.slice(0, cap)}\n… (diff truncated)`;
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
40
78
|
export async function getLog(root, count = 20) {
|
|
41
79
|
const out = await git(root, [
|
|
42
80
|
'log',
|
package/dist/server/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/server/git.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/server/git.ts"],"names":[],"mappings":"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"}
|
package/dist/server/github.d.ts
CHANGED
|
@@ -25,4 +25,5 @@ export interface GithubData {
|
|
|
25
25
|
issues: GithubItem[];
|
|
26
26
|
prs: GithubItem[];
|
|
27
27
|
}
|
|
28
|
-
export declare
|
|
28
|
+
export declare const GH_MAX_LIMIT = 1000;
|
|
29
|
+
export declare function fetchGithub(repoRoot: string, refresh?: boolean, limit?: number): Promise<GithubData>;
|
package/dist/server/github.js
CHANGED
|
@@ -32,31 +32,38 @@ function rollupToChecks(rollup) {
|
|
|
32
32
|
return 'pending';
|
|
33
33
|
return 'passing';
|
|
34
34
|
}
|
|
35
|
-
async function gh(repoRoot, args) {
|
|
35
|
+
async function gh(repoRoot, args, timeout = 15_000) {
|
|
36
36
|
const { stdout } = await exec('gh', args, {
|
|
37
37
|
cwd: repoRoot,
|
|
38
|
-
timeout
|
|
39
|
-
maxBuffer:
|
|
38
|
+
timeout,
|
|
39
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
40
40
|
});
|
|
41
41
|
return stdout;
|
|
42
42
|
}
|
|
43
43
|
/* Reads degrade to `available: false` with a hint — never an error (plan rule
|
|
44
44
|
7): no `gh`, no remote, offline all land on the same quiet path. A short
|
|
45
|
-
cache keeps tab switches from hammering the GitHub API
|
|
45
|
+
cache keeps tab switches from hammering the GitHub API; a cached fetch with
|
|
46
|
+
a bigger limit than asked serves fine (it's a superset). */
|
|
46
47
|
let cache = null;
|
|
47
48
|
const CACHE_MS = 60_000;
|
|
48
|
-
export
|
|
49
|
+
export const GH_MAX_LIMIT = 1000;
|
|
50
|
+
export async function fetchGithub(repoRoot, refresh = false, limit = 30) {
|
|
49
51
|
if (process.env.CEZ_DRY_RUN === '1')
|
|
50
52
|
return mockGithub();
|
|
51
|
-
|
|
53
|
+
const capped = Math.min(Math.max(limit, 1), GH_MAX_LIMIT);
|
|
54
|
+
if (!refresh && cache && Date.now() - cache.at < CACHE_MS && cache.limit >= capped) {
|
|
52
55
|
return cache.data;
|
|
56
|
+
}
|
|
53
57
|
try {
|
|
54
58
|
// No `comments` field — `gh … --json comments` ships full comment bodies.
|
|
59
|
+
// Big fetches (the GUI's follow-up "give me everything" shot) get a
|
|
60
|
+
// longer wall clock — statusCheckRollup on hundreds of PRs is slow.
|
|
61
|
+
const timeout = capped > 100 ? 60_000 : 15_000;
|
|
55
62
|
const fields = 'number,title,author,createdAt,labels,body,url';
|
|
56
63
|
const [repoOut, issuesOut, prsOut] = await Promise.all([
|
|
57
|
-
gh(repoRoot, ['repo', 'view', '--json', 'nameWithOwner', '--jq', '.nameWithOwner']),
|
|
58
|
-
gh(repoRoot, ['issue', 'list', '--limit',
|
|
59
|
-
gh(repoRoot, ['pr', 'list', '--limit',
|
|
64
|
+
gh(repoRoot, ['repo', 'view', '--json', 'nameWithOwner', '--jq', '.nameWithOwner'], timeout),
|
|
65
|
+
gh(repoRoot, ['issue', 'list', '--limit', String(capped), '--json', fields], timeout),
|
|
66
|
+
gh(repoRoot, ['pr', 'list', '--limit', String(capped), '--json', `${fields},isDraft,additions,deletions,statusCheckRollup`], timeout),
|
|
60
67
|
]);
|
|
61
68
|
const issues = z.array(ghIssueSchema).parse(JSON.parse(issuesOut)).map((i) => ({
|
|
62
69
|
kind: 'issue',
|
|
@@ -91,7 +98,7 @@ export async function fetchGithub(repoRoot, refresh = false) {
|
|
|
91
98
|
issues,
|
|
92
99
|
prs,
|
|
93
100
|
};
|
|
94
|
-
cache = { at: Date.now(), data };
|
|
101
|
+
cache = { at: Date.now(), limit: capped, data };
|
|
95
102
|
return data;
|
|
96
103
|
}
|
|
97
104
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/server/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AA+BjC,qEAAqE;AACrE,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;AAC3D,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/C,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;IAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AACH,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,iBAAiB,EAAE,CAAC;SACjB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SAChH,OAAO,EAAE;CACb,CAAC,CAAC;AAEH,SAAS,cAAc,CAAC,MAA+G;IACrI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5F,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3G,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3G,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,EAAE,CAAC,QAAgB,EAAE,IAAc;
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/server/github.ts"],"names":[],"mappings":"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"}
|
package/dist/server/pr.js
CHANGED
|
@@ -33,7 +33,13 @@ export async function createDraftPr(input) {
|
|
|
33
33
|
return { ok: false, error: `git push failed — ${tail(push.stderr) || 'unknown error'}` };
|
|
34
34
|
}
|
|
35
35
|
const body = buildPrBody(input.handoffText, run.task);
|
|
36
|
-
|
|
36
|
+
// Target the branch the worktree forked from (config `baseBranch`) — without
|
|
37
|
+
// --base, gh aims at the repo default (main) even when work started on
|
|
38
|
+
// develop. `origin/x` normalizes to `x`; a raw sha (detached-HEAD fork
|
|
39
|
+
// point) can't be a PR base, so gh falls back to the default branch.
|
|
40
|
+
const prBase = run.baseBranch?.replace(/^origin\//, '');
|
|
41
|
+
const baseArgs = prBase && !/^[0-9a-f]{7,40}$/i.test(prBase) ? ['--base', prBase] : [];
|
|
42
|
+
const pr = await exec('gh', ['pr', 'create', '--draft', '--head', branch, ...baseArgs, '--title', run.title, '--body', body], worktree, PUSH_TIMEOUT_MS);
|
|
37
43
|
if (!pr.ok) {
|
|
38
44
|
if (pr.notFound) {
|
|
39
45
|
return { ok: false, error: 'gh not found — install the GitHub CLI and run `gh auth login`, or merge the branch locally' };
|
package/dist/server/pr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/server/pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;;;;;GAMG;AAEH,MAAM,SAAS,GAAG,oDAAoD,CAAC;AACvE,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAa9B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAmB;IACrD,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC;IAClC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC1B,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC;IAC7E,CAAC;IAED,4EAA4E;IAC5E,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE/B,4EAA4E;IAC5E,gEAAgE;IAChE,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,EAAE,CAAC;QACpC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,+CAA+C,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mFAAmF,EAAE,CAAC;IACnH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IAC5F,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,eAAe,EAAE,EAAE,CAAC;IAC3F,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,MAAM,IAAI,CACnB,IAAI,EACJ,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/server/pr.ts"],"names":[],"mappings":"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"}
|
package/dist/server/server.js
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { basename, dirname, join } from 'node:path';
|
|
2
|
+
import { mkdir, readFile, unlink, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { basename, dirname, join, resolve, sep } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
import { Hono } from 'hono';
|
|
6
6
|
import { serve } from '@hono/node-server';
|
|
7
7
|
import { streamSSE } from 'hono/streaming';
|
|
8
|
-
import { stringify as stringifyYaml } from 'yaml';
|
|
8
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
9
9
|
import { z } from 'zod';
|
|
10
10
|
import { detectEnvironment } from '../core/backend-detect.js';
|
|
11
11
|
import { WORKFLOWS_DIR, loadWorkflows } from '../workflows/load.js';
|
|
12
|
-
import { QUICK_TASK_WORKFLOW, stepsIssue, workflowStepSchema, } from '../workflows/types.js';
|
|
12
|
+
import { QUICK_TASK_WORKFLOW, normalizeWorkflowDoc, skillStackOf, skillsToSteps, stepsIssue, workflowFileSchema, workflowStepSchema, } from '../workflows/types.js';
|
|
13
13
|
import { planChain, slugify } from '../planner.js';
|
|
14
14
|
import { discoverSkills } from '../skills.js';
|
|
15
15
|
import { refreshTeamSkills } from '../skills-remote.js';
|
|
16
16
|
import { appendHandoffHeartbeat, handoffProgressExcerpt, readHandoff } from '../handoff.js';
|
|
17
17
|
import { markStarted, onTodosChanged, readTodos, removeTodo, startTodosWatch } from '../todos.js';
|
|
18
18
|
import { removeWorktree, worktreeDiff, worktreeDiffStat } from '../git-worktree.js';
|
|
19
|
-
import { getDiff, getLog, getRepoInfo, getStatus } from './git.js';
|
|
19
|
+
import { getBranches, getCommit, getDiff, getLog, getRepoInfo, getStatus } from './git.js';
|
|
20
|
+
import { loadConfig } from '../config.js';
|
|
20
21
|
import { fetchGithub } from './github.js';
|
|
21
22
|
import { ensureLaunchKey } from './launch-key.js';
|
|
22
23
|
import { openInTerminal } from './open-in-terminal.js';
|
|
@@ -52,11 +53,34 @@ const pickSchema = z.object({
|
|
|
52
53
|
const planSchema = z.object({
|
|
53
54
|
task: z.string().trim().min(1),
|
|
54
55
|
});
|
|
55
|
-
|
|
56
|
+
// A saved workflow carries full `steps` OR the builder's `skills` stack
|
|
57
|
+
// (spec 012). `overwrite: true` is the builder's Save on an existing file —
|
|
58
|
+
// the GUI asks first; a plain POST still refuses to clobber.
|
|
59
|
+
const saveWorkflowSchema = z
|
|
60
|
+
.object({
|
|
56
61
|
name: z.string().trim().min(1).max(80),
|
|
57
62
|
description: z.string().optional(),
|
|
58
|
-
steps: z.array(workflowStepSchema).min(1).max(8),
|
|
63
|
+
steps: z.array(workflowStepSchema).min(1).max(8).optional(),
|
|
64
|
+
skills: z.array(z.string().trim().min(1)).min(1).max(8).optional(),
|
|
65
|
+
overwrite: z.boolean().optional(),
|
|
66
|
+
})
|
|
67
|
+
.refine((b) => Boolean(b.steps) !== Boolean(b.skills), {
|
|
68
|
+
message: 'provide either "steps" or "skills", not both',
|
|
69
|
+
});
|
|
70
|
+
const parseWorkflowSchema = z.object({
|
|
71
|
+
yaml: z.string().min(1).max(100_000),
|
|
59
72
|
});
|
|
73
|
+
// Small GUI preferences persisted in `.ai/cezar/ui-state.json` (files, not a
|
|
74
|
+
// DB): today just the last-used task source, so the form preselects what you
|
|
75
|
+
// actually run. Unknown keys pass through — future prefs won't need a schema
|
|
76
|
+
// dance.
|
|
77
|
+
const uiStateSchema = z
|
|
78
|
+
.object({
|
|
79
|
+
lastTask: z
|
|
80
|
+
.object({ source: z.enum(['workflow', 'skill']), ref: z.string().min(1).max(200) })
|
|
81
|
+
.optional(),
|
|
82
|
+
})
|
|
83
|
+
.passthrough();
|
|
60
84
|
const messageSchema = z
|
|
61
85
|
.object({
|
|
62
86
|
text: z.string().max(100_000).default(''),
|
|
@@ -91,6 +115,7 @@ export function createApp(deps) {
|
|
|
91
115
|
app.get('/new', staticFile('index.html', 'text/html; charset=utf-8'));
|
|
92
116
|
app.get('/app.js', staticFile('app.js', 'text/javascript; charset=utf-8'));
|
|
93
117
|
app.get('/style.css', staticFile('style.css', 'text/css; charset=utf-8'));
|
|
118
|
+
app.get('/open-mercato.svg', staticFile('open-mercato.svg', 'image/svg+xml'));
|
|
94
119
|
// ---- meta ----------------------------------------------------------------
|
|
95
120
|
// CORS — deliberately for /api/health ONLY (spec 011): the bookmarklets
|
|
96
121
|
// fetch it cross-origin from github.com to discover which local ports run a
|
|
@@ -114,6 +139,33 @@ export function createApp(deps) {
|
|
|
114
139
|
// `/new?auto=1` is honored only with it (spec 011). Same-origin only.
|
|
115
140
|
app.get('/api/launch-key', (c) => c.json({ key: launchKey }));
|
|
116
141
|
app.get('/api/skills', async (c) => c.json(await discoverSkills(repoRoot)));
|
|
142
|
+
// ---- GUI prefs (ui-state.json) --------------------------------------------
|
|
143
|
+
const uiStatePath = join(dataDir, 'ui-state.json');
|
|
144
|
+
const readUiState = async () => {
|
|
145
|
+
try {
|
|
146
|
+
const parsed = JSON.parse(await readFile(uiStatePath, 'utf8'));
|
|
147
|
+
return parsed && typeof parsed === 'object' ? parsed : {};
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return {};
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
app.get('/api/ui-state', async (c) => c.json(await readUiState()));
|
|
154
|
+
app.put('/api/ui-state', async (c) => {
|
|
155
|
+
const parsed = uiStateSchema.safeParse(await c.req.json().catch(() => null));
|
|
156
|
+
if (!parsed.success) {
|
|
157
|
+
return c.json({ error: parsed.error.issues.map((i) => i.message).join('; ') }, 400);
|
|
158
|
+
}
|
|
159
|
+
const merged = { ...(await readUiState()), ...parsed.data };
|
|
160
|
+
try {
|
|
161
|
+
await mkdir(dataDir, { recursive: true });
|
|
162
|
+
await writeFile(uiStatePath, `${JSON.stringify(merged, null, 2)}\n`, 'utf8');
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
return c.json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
166
|
+
}
|
|
167
|
+
return c.json(merged);
|
|
168
|
+
});
|
|
117
169
|
// Refresh team skills (spec 005): clone/fetch the configured skills repos,
|
|
118
170
|
// then return the merged catalog. Degrades quietly — offline just means the
|
|
119
171
|
// team entries stay as they were (or absent).
|
|
@@ -130,30 +182,87 @@ export function createApp(deps) {
|
|
|
130
182
|
if (!parsed.success) {
|
|
131
183
|
return c.json({ error: parsed.error.issues.map((i) => i.message).join('; ') }, 400);
|
|
132
184
|
}
|
|
133
|
-
const
|
|
185
|
+
const steps = parsed.data.steps ?? skillsToSteps(parsed.data.skills ?? []);
|
|
186
|
+
const issue = stepsIssue(steps);
|
|
134
187
|
if (issue)
|
|
135
188
|
return c.json({ error: issue }, 400);
|
|
136
189
|
const slug = slugify(parsed.data.name) || 'chain';
|
|
137
190
|
const dir = join(repoRoot, WORKFLOWS_DIR);
|
|
138
191
|
const path = join(dir, `${slug}.yaml`);
|
|
192
|
+
// Pure skill stacks are written in the portable compact form (spec 012) —
|
|
193
|
+
// `name` + `skills:` — so the file imports cleanly in any repo.
|
|
194
|
+
const stack = skillStackOf(steps);
|
|
139
195
|
const doc = {
|
|
140
196
|
name: parsed.data.name,
|
|
141
197
|
...(parsed.data.description ? { description: parsed.data.description } : {}),
|
|
142
|
-
|
|
198
|
+
...(stack ? { skills: stack } : { steps }),
|
|
143
199
|
};
|
|
144
200
|
try {
|
|
145
201
|
await mkdir(dir, { recursive: true });
|
|
146
202
|
// `wx` = fail if the file exists — no silent overwrite of a chain.
|
|
147
|
-
await writeFile(path, stringifyYaml(doc), {
|
|
203
|
+
await writeFile(path, stringifyYaml(doc), {
|
|
204
|
+
encoding: 'utf8',
|
|
205
|
+
flag: parsed.data.overwrite ? 'w' : 'wx',
|
|
206
|
+
});
|
|
148
207
|
}
|
|
149
208
|
catch (err) {
|
|
150
209
|
if (err instanceof Error && 'code' in err && err.code === 'EEXIST') {
|
|
151
|
-
return c.json({ error: `workflow file already exists: ${path}
|
|
210
|
+
return c.json({ error: `workflow file already exists: ${path}`, exists: true }, 409);
|
|
152
211
|
}
|
|
153
212
|
const message = err instanceof Error ? err.message : String(err);
|
|
154
213
|
return c.json({ error: message }, 500);
|
|
155
214
|
}
|
|
156
|
-
return c.json({ path }, 201);
|
|
215
|
+
return c.json({ path, name: parsed.data.name }, 201);
|
|
216
|
+
});
|
|
217
|
+
// Delete a saved workflow (spec 012 follow-up): file workflows only —
|
|
218
|
+
// built-ins have no file and always come back.
|
|
219
|
+
app.delete('/api/workflows/:name', async (c) => {
|
|
220
|
+
const name = c.req.param('name');
|
|
221
|
+
const { workflows } = await loadWorkflows(repoRoot);
|
|
222
|
+
const wf = workflows.find((w) => w.name === name);
|
|
223
|
+
if (!wf)
|
|
224
|
+
return c.json({ error: `unknown workflow: ${name}` }, 404);
|
|
225
|
+
if (wf.source !== 'file' || !wf.path) {
|
|
226
|
+
return c.json({ error: 'built-in workflows cannot be deleted' }, 400);
|
|
227
|
+
}
|
|
228
|
+
const dir = resolve(repoRoot, WORKFLOWS_DIR);
|
|
229
|
+
const target = resolve(wf.path);
|
|
230
|
+
if (!target.startsWith(dir + sep)) {
|
|
231
|
+
return c.json({ error: 'refusing to delete a file outside the workflows dir' }, 400);
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
await unlink(target);
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
return c.json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
238
|
+
}
|
|
239
|
+
return c.json({ ok: true, path: target });
|
|
240
|
+
});
|
|
241
|
+
// Import support for the builder (spec 012): parse + validate a pasted
|
|
242
|
+
// workflow YAML (either form) and hand back the normalized definition. The
|
|
243
|
+
// server owns YAML parsing — the GUI stays dependency-free.
|
|
244
|
+
app.post('/api/workflows/parse', async (c) => {
|
|
245
|
+
const parsed = parseWorkflowSchema.safeParse(await c.req.json().catch(() => null));
|
|
246
|
+
if (!parsed.success) {
|
|
247
|
+
return c.json({ error: parsed.error.issues.map((i) => i.message).join('; ') }, 400);
|
|
248
|
+
}
|
|
249
|
+
let raw;
|
|
250
|
+
try {
|
|
251
|
+
raw = parseYaml(parsed.data.yaml);
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
255
|
+
return c.json({ error: `not valid YAML: ${message}` }, 400);
|
|
256
|
+
}
|
|
257
|
+
const doc = workflowFileSchema.safeParse(raw);
|
|
258
|
+
if (!doc.success) {
|
|
259
|
+
return c.json({ error: doc.error.issues.map((i) => i.message).join('; ') }, 400);
|
|
260
|
+
}
|
|
261
|
+
const normalized = normalizeWorkflowDoc(doc.data);
|
|
262
|
+
const issue = stepsIssue(normalized.steps);
|
|
263
|
+
if (issue)
|
|
264
|
+
return c.json({ error: issue }, 400);
|
|
265
|
+
return c.json(normalized);
|
|
157
266
|
});
|
|
158
267
|
// Chain-from-prompt (spec 008): one cheap claude call proposes a chain of
|
|
159
268
|
// steps for the task. Never blocks — degraded answers come back as a
|
|
@@ -569,14 +678,56 @@ export function createApp(deps) {
|
|
|
569
678
|
// Issues + PRs of the repo's origin, read through the logged-in `gh` CLI.
|
|
570
679
|
// Degrades to `{available:false, reason}` — no gh / no remote / offline all
|
|
571
680
|
// just render as a hint in the tab, never an error.
|
|
572
|
-
app.get('/api/github', async (c) =>
|
|
681
|
+
app.get('/api/github', async (c) => {
|
|
682
|
+
const limit = Number.parseInt(c.req.query('limit') ?? '', 10);
|
|
683
|
+
return c.json(await fetchGithub(repoRoot, c.req.query('refresh') === '1', Number.isFinite(limit) ? limit : 30));
|
|
684
|
+
});
|
|
573
685
|
// ---- repo view -----------------------------------------------------------
|
|
574
686
|
app.get('/api/repo', async (c) => {
|
|
575
687
|
const info = await getRepoInfo(repoRoot);
|
|
576
688
|
if (!info)
|
|
577
|
-
return c.json({ info: null, status: [], log: [] });
|
|
578
|
-
const [status, log] = await Promise.all([
|
|
579
|
-
|
|
689
|
+
return c.json({ info: null, status: [], log: [], branches: [], baseBranch: null });
|
|
690
|
+
const [status, log, branches, config] = await Promise.all([
|
|
691
|
+
getStatus(info.root),
|
|
692
|
+
getLog(info.root),
|
|
693
|
+
getBranches(info.root),
|
|
694
|
+
loadConfig(repoRoot),
|
|
695
|
+
]);
|
|
696
|
+
return c.json({ info, status, log, branches, baseBranch: config.baseBranch ?? null });
|
|
697
|
+
});
|
|
698
|
+
// Set/clear the agents' base branch (Repo tab). Merges into the RAW
|
|
699
|
+
// config.json so user keys (skillsRepos…) survive and schema defaults are
|
|
700
|
+
// never materialized into the file.
|
|
701
|
+
const setConfigSchema = z.object({
|
|
702
|
+
baseBranch: z.string().trim().min(1).max(200).nullable(),
|
|
703
|
+
});
|
|
704
|
+
app.put('/api/config', async (c) => {
|
|
705
|
+
const parsed = setConfigSchema.safeParse(await c.req.json().catch(() => null));
|
|
706
|
+
if (!parsed.success) {
|
|
707
|
+
return c.json({ error: parsed.error.issues.map((i) => i.message).join('; ') }, 400);
|
|
708
|
+
}
|
|
709
|
+
const configPath = join(dataDir, 'config.json');
|
|
710
|
+
let raw = {};
|
|
711
|
+
try {
|
|
712
|
+
const existing = JSON.parse(await readFile(configPath, 'utf8'));
|
|
713
|
+
if (existing && typeof existing === 'object')
|
|
714
|
+
raw = existing;
|
|
715
|
+
}
|
|
716
|
+
catch {
|
|
717
|
+
// missing or malformed — start fresh
|
|
718
|
+
}
|
|
719
|
+
if (parsed.data.baseBranch === null)
|
|
720
|
+
delete raw.baseBranch;
|
|
721
|
+
else
|
|
722
|
+
raw.baseBranch = parsed.data.baseBranch;
|
|
723
|
+
try {
|
|
724
|
+
await mkdir(dataDir, { recursive: true });
|
|
725
|
+
await writeFile(configPath, `${JSON.stringify(raw, null, 2)}\n`, 'utf8');
|
|
726
|
+
}
|
|
727
|
+
catch (err) {
|
|
728
|
+
return c.json({ error: err instanceof Error ? err.message : String(err) }, 500);
|
|
729
|
+
}
|
|
730
|
+
return c.json({ baseBranch: parsed.data.baseBranch });
|
|
580
731
|
});
|
|
581
732
|
app.get('/api/repo/diff', async (c) => {
|
|
582
733
|
const info = await getRepoInfo(repoRoot);
|
|
@@ -584,6 +735,18 @@ export function createApp(deps) {
|
|
|
584
735
|
return c.text('not a git repository');
|
|
585
736
|
return c.text(await getDiff(info.root));
|
|
586
737
|
});
|
|
738
|
+
// One commit's message + stat + patch — the Repo view expands it inline.
|
|
739
|
+
app.get('/api/repo/commit/:sha', async (c) => {
|
|
740
|
+
const info = await getRepoInfo(repoRoot);
|
|
741
|
+
if (!info)
|
|
742
|
+
return c.text('not a git repository');
|
|
743
|
+
try {
|
|
744
|
+
return c.text(await getCommit(info.root, c.req.param('sha')));
|
|
745
|
+
}
|
|
746
|
+
catch (err) {
|
|
747
|
+
return c.text(`(git show failed: ${err instanceof Error ? err.message : String(err)})`);
|
|
748
|
+
}
|
|
749
|
+
});
|
|
587
750
|
return app;
|
|
588
751
|
}
|
|
589
752
|
export function startServer(deps, port) {
|