@developerz.ai/aitm 0.0.0
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/LICENSE +21 -0
- package/README.md +30 -0
- package/dist/agent-config/agent-config-detector.d.ts +15 -0
- package/dist/agent-config/agent-config-detector.js +56 -0
- package/dist/agent-config/agent-config-detector.js.map +1 -0
- package/dist/cli/args.d.ts +37 -0
- package/dist/cli/args.js +238 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/cli.d.ts +15 -0
- package/dist/cli/cli.js +113 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands.d.ts +83 -0
- package/dist/cli/commands.js +521 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/compaction/compactor.d.ts +20 -0
- package/dist/compaction/compactor.js +75 -0
- package/dist/compaction/compactor.js.map +1 -0
- package/dist/config/config-loader.d.ts +25 -0
- package/dist/config/config-loader.js +275 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-writer.d.ts +14 -0
- package/dist/config/config-writer.js +178 -0
- package/dist/config/config-writer.js.map +1 -0
- package/dist/config/schema.d.ts +85 -0
- package/dist/config/schema.js +38 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/credentials/credentials.d.ts +15 -0
- package/dist/credentials/credentials.js +58 -0
- package/dist/credentials/credentials.js.map +1 -0
- package/dist/credentials/defaults.d.ts +2 -0
- package/dist/credentials/defaults.js +21 -0
- package/dist/credentials/defaults.js.map +1 -0
- package/dist/fs/atomic-write.d.ts +1 -0
- package/dist/fs/atomic-write.js +27 -0
- package/dist/fs/atomic-write.js.map +1 -0
- package/dist/github/errors.d.ts +18 -0
- package/dist/github/errors.js +20 -0
- package/dist/github/errors.js.map +1 -0
- package/dist/github/github-client.d.ts +47 -0
- package/dist/github/github-client.js +417 -0
- package/dist/github/github-client.js.map +1 -0
- package/dist/github/schema.d.ts +44 -0
- package/dist/github/schema.js +23 -0
- package/dist/github/schema.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/logger.d.ts +36 -0
- package/dist/logger/logger.js +123 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/loop/run-loop-adapter.d.ts +46 -0
- package/dist/loop/run-loop-adapter.js +270 -0
- package/dist/loop/run-loop-adapter.js.map +1 -0
- package/dist/loop/take-over-flow.d.ts +57 -0
- package/dist/loop/take-over-flow.js +183 -0
- package/dist/loop/take-over-flow.js.map +1 -0
- package/dist/loop/work-loop.d.ts +95 -0
- package/dist/loop/work-loop.js +211 -0
- package/dist/loop/work-loop.js.map +1 -0
- package/dist/mcp/mcp-client.d.ts +27 -0
- package/dist/mcp/mcp-client.js +123 -0
- package/dist/mcp/mcp-client.js.map +1 -0
- package/dist/mcp/schema.d.ts +53 -0
- package/dist/mcp/schema.js +39 -0
- package/dist/mcp/schema.js.map +1 -0
- package/dist/openrouter/client.d.ts +28 -0
- package/dist/openrouter/client.js +40 -0
- package/dist/openrouter/client.js.map +1 -0
- package/dist/openrouter/model-limits.d.ts +21 -0
- package/dist/openrouter/model-limits.js +39 -0
- package/dist/openrouter/model-limits.js.map +1 -0
- package/dist/openrouter/server-tools.d.ts +35 -0
- package/dist/openrouter/server-tools.js +25 -0
- package/dist/openrouter/server-tools.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +60 -0
- package/dist/orchestrator/orchestrator.js +180 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/subagent-tools.d.ts +44 -0
- package/dist/orchestrator/subagent-tools.js +133 -0
- package/dist/orchestrator/subagent-tools.js.map +1 -0
- package/dist/orchestrator/system-prompts.d.ts +4 -0
- package/dist/orchestrator/system-prompts.js +78 -0
- package/dist/orchestrator/system-prompts.js.map +1 -0
- package/dist/plan/plan-graph.d.ts +11 -0
- package/dist/plan/plan-graph.js +69 -0
- package/dist/plan/plan-graph.js.map +1 -0
- package/dist/plan/schema.d.ts +30 -0
- package/dist/plan/schema.js +24 -0
- package/dist/plan/schema.js.map +1 -0
- package/dist/state/schema.d.ts +88 -0
- package/dist/state/schema.js +53 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/state/state-store.d.ts +16 -0
- package/dist/state/state-store.js +129 -0
- package/dist/state/state-store.js.map +1 -0
- package/dist/subagents/factory.d.ts +8 -0
- package/dist/subagents/factory.js +10 -0
- package/dist/subagents/factory.js.map +1 -0
- package/dist/subagents/planner.d.ts +31 -0
- package/dist/subagents/planner.js +83 -0
- package/dist/subagents/planner.js.map +1 -0
- package/dist/subagents/reviewer.d.ts +60 -0
- package/dist/subagents/reviewer.js +159 -0
- package/dist/subagents/reviewer.js.map +1 -0
- package/dist/subagents/worker.d.ts +71 -0
- package/dist/subagents/worker.js +180 -0
- package/dist/subagents/worker.js.map +1 -0
- package/dist/testing/temp-repo.d.ts +7 -0
- package/dist/testing/temp-repo.js +21 -0
- package/dist/testing/temp-repo.js.map +1 -0
- package/dist/tools/datetime.d.ts +12 -0
- package/dist/tools/datetime.js +42 -0
- package/dist/tools/datetime.js.map +1 -0
- package/dist/tools/fetch-html.d.ts +32 -0
- package/dist/tools/fetch-html.js +139 -0
- package/dist/tools/fetch-html.js.map +1 -0
- package/dist/tools/github-thread-tool.d.ts +10 -0
- package/dist/tools/github-thread-tool.js +36 -0
- package/dist/tools/github-thread-tool.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +31 -0
- package/dist/tools/web-fetch.js +223 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/workspace/worktree-pool.d.ts +21 -0
- package/dist/workspace/worktree-pool.js +104 -0
- package/dist/workspace/worktree-pool.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const PrGroupStatusSchema: z.ZodEnum<{
|
|
3
|
+
pending: "pending";
|
|
4
|
+
"in-progress": "in-progress";
|
|
5
|
+
"awaiting-pr": "awaiting-pr";
|
|
6
|
+
merged: "merged";
|
|
7
|
+
blocked: "blocked";
|
|
8
|
+
}>;
|
|
9
|
+
export type PrGroupStatus = z.infer<typeof PrGroupStatusSchema>;
|
|
10
|
+
export declare const PrGroupSchema: z.ZodObject<{
|
|
11
|
+
id: z.ZodString;
|
|
12
|
+
title: z.ZodString;
|
|
13
|
+
tasks: z.ZodArray<z.ZodString>;
|
|
14
|
+
dependsOn: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
15
|
+
branch: z.ZodNullable<z.ZodString>;
|
|
16
|
+
pr: z.ZodNullable<z.ZodNumber>;
|
|
17
|
+
status: z.ZodEnum<{
|
|
18
|
+
pending: "pending";
|
|
19
|
+
"in-progress": "in-progress";
|
|
20
|
+
"awaiting-pr": "awaiting-pr";
|
|
21
|
+
merged: "merged";
|
|
22
|
+
blocked: "blocked";
|
|
23
|
+
}>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
export type PrGroup = z.infer<typeof PrGroupSchema>;
|
|
26
|
+
export declare const RunStatusSchema: z.ZodEnum<{
|
|
27
|
+
success: "success";
|
|
28
|
+
"awaiting-pr": "awaiting-pr";
|
|
29
|
+
blocked: "blocked";
|
|
30
|
+
planning: "planning";
|
|
31
|
+
working: "working";
|
|
32
|
+
reviewing: "reviewing";
|
|
33
|
+
failed: "failed";
|
|
34
|
+
}>;
|
|
35
|
+
export type RunStatus = z.infer<typeof RunStatusSchema>;
|
|
36
|
+
export declare const RunStateSchema: z.ZodObject<{
|
|
37
|
+
status: z.ZodEnum<{
|
|
38
|
+
success: "success";
|
|
39
|
+
"awaiting-pr": "awaiting-pr";
|
|
40
|
+
blocked: "blocked";
|
|
41
|
+
planning: "planning";
|
|
42
|
+
working: "working";
|
|
43
|
+
reviewing: "reviewing";
|
|
44
|
+
failed: "failed";
|
|
45
|
+
}>;
|
|
46
|
+
prGroups: z.ZodArray<z.ZodObject<{
|
|
47
|
+
id: z.ZodString;
|
|
48
|
+
title: z.ZodString;
|
|
49
|
+
tasks: z.ZodArray<z.ZodString>;
|
|
50
|
+
dependsOn: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
51
|
+
branch: z.ZodNullable<z.ZodString>;
|
|
52
|
+
pr: z.ZodNullable<z.ZodNumber>;
|
|
53
|
+
status: z.ZodEnum<{
|
|
54
|
+
pending: "pending";
|
|
55
|
+
"in-progress": "in-progress";
|
|
56
|
+
"awaiting-pr": "awaiting-pr";
|
|
57
|
+
merged: "merged";
|
|
58
|
+
blocked: "blocked";
|
|
59
|
+
}>;
|
|
60
|
+
}, z.core.$strip>>;
|
|
61
|
+
currentGroupIndex: z.ZodNumber;
|
|
62
|
+
currentTaskIndex: z.ZodNumber;
|
|
63
|
+
sessionCount: z.ZodNumber;
|
|
64
|
+
currentPr: z.ZodNullable<z.ZodNumber>;
|
|
65
|
+
runId: z.ZodString;
|
|
66
|
+
provider: z.ZodLiteral<"openrouter">;
|
|
67
|
+
model: z.ZodString;
|
|
68
|
+
agentConfigFile: z.ZodEnum<{
|
|
69
|
+
custom: "custom";
|
|
70
|
+
"CLAUDE.md": "CLAUDE.md";
|
|
71
|
+
"AGENTS.md": "AGENTS.md";
|
|
72
|
+
}>;
|
|
73
|
+
createdAt: z.ZodString;
|
|
74
|
+
updatedAt: z.ZodString;
|
|
75
|
+
options: z.ZodObject<{
|
|
76
|
+
autoMerge: z.ZodBoolean;
|
|
77
|
+
maxPrs: z.ZodNumber;
|
|
78
|
+
maxSessions: z.ZodNullable<z.ZodNumber>;
|
|
79
|
+
mergeMethod: z.ZodEnum<{
|
|
80
|
+
squash: "squash";
|
|
81
|
+
merge: "merge";
|
|
82
|
+
rebase: "rebase";
|
|
83
|
+
}>;
|
|
84
|
+
stylePath: z.ZodNullable<z.ZodString>;
|
|
85
|
+
concurrency: z.ZodNumber;
|
|
86
|
+
}, z.core.$strip>;
|
|
87
|
+
}, z.core.$strip>;
|
|
88
|
+
export type RunState = z.infer<typeof RunStateSchema>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// docs/state.md §"state.json schema" and §"PrGroup sub-schema"
|
|
2
|
+
// Source of truth for run-state shape. Extended with PrGroup.dependsOn to support DAG planning.
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export const PrGroupStatusSchema = z.enum([
|
|
5
|
+
'pending',
|
|
6
|
+
'in-progress',
|
|
7
|
+
'awaiting-pr',
|
|
8
|
+
'merged',
|
|
9
|
+
'blocked',
|
|
10
|
+
]);
|
|
11
|
+
export const PrGroupSchema = z.object({
|
|
12
|
+
id: z.string(),
|
|
13
|
+
title: z.string(),
|
|
14
|
+
tasks: z.array(z.string()),
|
|
15
|
+
// Group ids that must be merged before this group is runnable.
|
|
16
|
+
// Empty array means the group is in the initial ready set. See src/plan/plan-graph.ts.
|
|
17
|
+
dependsOn: z.array(z.string()).default([]),
|
|
18
|
+
branch: z.string().nullable(),
|
|
19
|
+
pr: z.number().int().positive().nullable(),
|
|
20
|
+
status: PrGroupStatusSchema,
|
|
21
|
+
});
|
|
22
|
+
export const RunStatusSchema = z.enum([
|
|
23
|
+
'planning',
|
|
24
|
+
'working',
|
|
25
|
+
'awaiting-pr',
|
|
26
|
+
'reviewing',
|
|
27
|
+
'blocked',
|
|
28
|
+
'success',
|
|
29
|
+
'failed',
|
|
30
|
+
]);
|
|
31
|
+
export const RunStateSchema = z.object({
|
|
32
|
+
status: RunStatusSchema,
|
|
33
|
+
prGroups: z.array(PrGroupSchema),
|
|
34
|
+
currentGroupIndex: z.number().int().nonnegative(),
|
|
35
|
+
currentTaskIndex: z.number().int().nonnegative(),
|
|
36
|
+
sessionCount: z.number().int().nonnegative(),
|
|
37
|
+
currentPr: z.number().int().positive().nullable(),
|
|
38
|
+
runId: z.string(),
|
|
39
|
+
provider: z.literal('openrouter'),
|
|
40
|
+
model: z.string(),
|
|
41
|
+
agentConfigFile: z.enum(['CLAUDE.md', 'AGENTS.md', 'custom']),
|
|
42
|
+
createdAt: z.string(),
|
|
43
|
+
updatedAt: z.string(),
|
|
44
|
+
options: z.object({
|
|
45
|
+
autoMerge: z.boolean(),
|
|
46
|
+
maxPrs: z.number().int().positive(),
|
|
47
|
+
maxSessions: z.number().int().positive().nullable(),
|
|
48
|
+
mergeMethod: z.enum(['squash', 'merge', 'rebase']),
|
|
49
|
+
stylePath: z.string().nullable(),
|
|
50
|
+
concurrency: z.number().int().positive(),
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/state/schema.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gGAAgG;AAEhG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC;IACxC,SAAS;IACT,aAAa;IACb,aAAa;IACb,QAAQ;IACR,SAAS;CACV,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1B,+DAA+D;IAC/D,uFAAuF;IACvF,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,MAAM,EAAE,mBAAmB;CAC5B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,UAAU;IACV,SAAS;IACT,aAAa;IACb,WAAW;IACX,SAAS;IACT,SAAS;IACT,QAAQ;CACT,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,eAAe;IACvB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACjD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAChD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC5C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;QACtB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;QACnD,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACzC,CAAC;CACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type RunState } from './schema.ts';
|
|
2
|
+
export declare class StateStore {
|
|
3
|
+
private readonly stateDir;
|
|
4
|
+
private updateChain;
|
|
5
|
+
constructor(stateDir: string);
|
|
6
|
+
init(initial: RunState): Promise<void>;
|
|
7
|
+
read(): Promise<RunState>;
|
|
8
|
+
update(mutator: (s: RunState) => RunState): Promise<RunState>;
|
|
9
|
+
writeGoal(goal: string, criteria?: string): Promise<void>;
|
|
10
|
+
writePlan(plan: string): Promise<void>;
|
|
11
|
+
appendProgress(entry: string): Promise<void>;
|
|
12
|
+
writeContext(summary: string): Promise<void>;
|
|
13
|
+
readContext(): Promise<string | null>;
|
|
14
|
+
cleanupOnSuccess(): Promise<void>;
|
|
15
|
+
private path;
|
|
16
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// docs/state.md
|
|
2
|
+
// Only module that reads or writes .ai-task-master/. Atomic writes via temp file + fsync + rename.
|
|
3
|
+
import { appendFile, mkdir, readdir, readFile, rm } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { ZodError } from 'zod';
|
|
6
|
+
import { atomicWrite } from "../fs/atomic-write.js";
|
|
7
|
+
import { RunStateSchema } from "./schema.js";
|
|
8
|
+
const STATE_FILE = 'state.json';
|
|
9
|
+
const GOAL_FILE = 'goal.txt';
|
|
10
|
+
const CRITERIA_FILE = 'criteria.txt';
|
|
11
|
+
const PLAN_FILE = 'plan.md';
|
|
12
|
+
const PROGRESS_FILE = 'progress.md';
|
|
13
|
+
const CONTEXT_FILE = 'context.md';
|
|
14
|
+
const LOGS_DIR = 'logs';
|
|
15
|
+
export class StateStore {
|
|
16
|
+
stateDir;
|
|
17
|
+
// Chained promise serializes concurrent update() calls so they observe linear semantics.
|
|
18
|
+
// Each caller awaits the prior in-flight update before its read → mutate → write runs,
|
|
19
|
+
// preventing lost updates when callers race via Promise.all.
|
|
20
|
+
updateChain = Promise.resolve();
|
|
21
|
+
constructor(stateDir) {
|
|
22
|
+
this.stateDir = stateDir;
|
|
23
|
+
}
|
|
24
|
+
async init(initial) {
|
|
25
|
+
const validated = RunStateSchema.parse(initial);
|
|
26
|
+
await mkdir(this.stateDir, { recursive: true });
|
|
27
|
+
await mkdir(join(this.stateDir, LOGS_DIR), { recursive: true });
|
|
28
|
+
await atomicWrite(this.path(STATE_FILE), `${JSON.stringify(validated, null, 2)}\n`);
|
|
29
|
+
}
|
|
30
|
+
async read() {
|
|
31
|
+
const path = this.path(STATE_FILE);
|
|
32
|
+
const raw = await readFile(path, 'utf8');
|
|
33
|
+
let parsed;
|
|
34
|
+
try {
|
|
35
|
+
parsed = JSON.parse(raw);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
39
|
+
throw new Error(`${path}: invalid JSON — ${msg}`);
|
|
40
|
+
}
|
|
41
|
+
return parseState(parsed, path);
|
|
42
|
+
}
|
|
43
|
+
async update(mutator) {
|
|
44
|
+
const next = this.updateChain.then(async () => {
|
|
45
|
+
const current = await this.read();
|
|
46
|
+
const draft = mutator(current);
|
|
47
|
+
const updated = { ...draft, updatedAt: new Date().toISOString() };
|
|
48
|
+
const validated = parseState(updated, this.path(STATE_FILE));
|
|
49
|
+
await atomicWrite(this.path(STATE_FILE), `${JSON.stringify(validated, null, 2)}\n`);
|
|
50
|
+
return validated;
|
|
51
|
+
});
|
|
52
|
+
// Swallow rejection on the chain so a failed update doesn't poison subsequent callers.
|
|
53
|
+
// The original `next` promise still rejects for the caller that owns this update.
|
|
54
|
+
this.updateChain = next.catch(() => undefined);
|
|
55
|
+
return next;
|
|
56
|
+
}
|
|
57
|
+
async writeGoal(goal, criteria) {
|
|
58
|
+
await mkdir(this.stateDir, { recursive: true });
|
|
59
|
+
await atomicWrite(this.path(GOAL_FILE), ensureTrailingNewline(goal));
|
|
60
|
+
if (criteria !== undefined) {
|
|
61
|
+
await atomicWrite(this.path(CRITERIA_FILE), ensureTrailingNewline(criteria));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async writePlan(plan) {
|
|
65
|
+
await mkdir(this.stateDir, { recursive: true });
|
|
66
|
+
await atomicWrite(this.path(PLAN_FILE), ensureTrailingNewline(plan));
|
|
67
|
+
}
|
|
68
|
+
async appendProgress(entry) {
|
|
69
|
+
await mkdir(this.stateDir, { recursive: true });
|
|
70
|
+
await appendFile(this.path(PROGRESS_FILE), ensureTrailingNewline(entry));
|
|
71
|
+
}
|
|
72
|
+
async writeContext(summary) {
|
|
73
|
+
await mkdir(this.stateDir, { recursive: true });
|
|
74
|
+
await atomicWrite(this.path(CONTEXT_FILE), ensureTrailingNewline(summary));
|
|
75
|
+
}
|
|
76
|
+
async readContext() {
|
|
77
|
+
try {
|
|
78
|
+
return await readFile(this.path(CONTEXT_FILE), 'utf8');
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
if (isNotFound(err))
|
|
82
|
+
return null;
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async cleanupOnSuccess() {
|
|
87
|
+
let entries;
|
|
88
|
+
try {
|
|
89
|
+
entries = await readdir(this.stateDir);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (isNotFound(err))
|
|
93
|
+
return;
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
for (const entry of entries) {
|
|
97
|
+
if (entry === LOGS_DIR)
|
|
98
|
+
continue;
|
|
99
|
+
await rm(this.path(entry), { recursive: true, force: true });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
path(name) {
|
|
103
|
+
return join(this.stateDir, name);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function parseState(value, path) {
|
|
107
|
+
try {
|
|
108
|
+
return RunStateSchema.parse(value);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
if (err instanceof ZodError) {
|
|
112
|
+
throw new Error(`${path}: ${formatZodError(err)}`);
|
|
113
|
+
}
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function ensureTrailingNewline(s) {
|
|
118
|
+
return s.endsWith('\n') ? s : `${s}\n`;
|
|
119
|
+
}
|
|
120
|
+
function isNotFound(err) {
|
|
121
|
+
return (typeof err === 'object' &&
|
|
122
|
+
err !== null &&
|
|
123
|
+
'code' in err &&
|
|
124
|
+
err.code === 'ENOENT');
|
|
125
|
+
}
|
|
126
|
+
function formatZodError(err) {
|
|
127
|
+
return err.issues.map((i) => `${i.path.join('.') || '<root>'}: ${i.message}`).join('; ');
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=state-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/state/state-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LanguageModel, ToolSet } from 'ai';
|
|
2
|
+
export type SubagentInit<TTools extends ToolSet = ToolSet> = {
|
|
3
|
+
model: LanguageModel;
|
|
4
|
+
tools: TTools;
|
|
5
|
+
systemPrompt: string;
|
|
6
|
+
maxSteps?: number;
|
|
7
|
+
};
|
|
8
|
+
export type SubagentFactory<TInit, TAgent> = (init: TInit) => TAgent;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// docs/subagents.md §"SRP + tested" — every subagent is a pure factory:
|
|
2
|
+
// (model, tools, systemPrompt) -> Agent
|
|
3
|
+
// SDK reference: docs/vendor/ai-sdk/chunk-04.md §"ToolLoopAgent" (note: CLAUDE.md
|
|
4
|
+
// still says experimental_Agent — that is the legacy AI SDK 5 name; v6 ships ToolLoopAgent).
|
|
5
|
+
//
|
|
6
|
+
// The ToolLoopAgent wrapper (`createSubagent`) and the system-prompt composer
|
|
7
|
+
// (`composeSystemPrompt`) now live in @developerz.ai/ai-claude-compat; the concrete factories
|
|
8
|
+
// (planner.ts/worker.ts/reviewer.ts) call createSubagent with their own tools + output type.
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/subagents/factory.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,0CAA0C;AAC1C,kFAAkF;AAClF,6FAA6F;AAC7F,EAAE;AACF,8EAA8E;AAC9E,8FAA8F;AAC9F,6FAA6F"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { GlobInput, GlobOutput, GrepInput, GrepOutput, ReadFileInput, ReadFileOutput } from '@developerz.ai/ai-claude-compat';
|
|
2
|
+
import { type DeepPartial, Output, type Tool, type ToolLoopAgent } from 'ai';
|
|
3
|
+
import { type Plan } from '../plan/schema.ts';
|
|
4
|
+
import type { SubagentInit } from './factory.ts';
|
|
5
|
+
type PlannerOutput = Output.Output<Plan, DeepPartial<Plan>, never>;
|
|
6
|
+
export type PlannerAgent = ToolLoopAgent<never, PlannerTools, PlannerOutput>;
|
|
7
|
+
export type PlannerTools = {
|
|
8
|
+
readFile: Tool<ReadFileInput, ReadFileOutput>;
|
|
9
|
+
grep: Tool<GrepInput, GrepOutput>;
|
|
10
|
+
glob: Tool<GlobInput, GlobOutput>;
|
|
11
|
+
};
|
|
12
|
+
export type PlannerInput = {
|
|
13
|
+
goal: string;
|
|
14
|
+
criteria?: string;
|
|
15
|
+
styleContents: string;
|
|
16
|
+
maxPrs: number;
|
|
17
|
+
};
|
|
18
|
+
export type PlannerResult = {
|
|
19
|
+
kind: 'ok';
|
|
20
|
+
plan: Plan;
|
|
21
|
+
} | {
|
|
22
|
+
kind: 'blocked';
|
|
23
|
+
reason: string;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'error';
|
|
26
|
+
error: string;
|
|
27
|
+
};
|
|
28
|
+
export declare const PLANNER_SYSTEM_PREFIX: string;
|
|
29
|
+
export declare function createPlannerAgent(init: SubagentInit<PlannerTools>): PlannerAgent;
|
|
30
|
+
export declare function runPlanner(agent: PlannerAgent, input: PlannerInput): Promise<PlannerResult>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// docs/subagents.md (Planner row), docs/task-groups.md, docs/agent-config-detection.md
|
|
2
|
+
// Goal + repo survey → ordered PR groups (DAG) with Zod-validated output.
|
|
3
|
+
// SDK reference: docs/vendor/ai-sdk/chunk-09.md §"Subagents" + chunk-05.md §"Generating Structured Data".
|
|
4
|
+
import { createSubagent } from '@developerz.ai/ai-claude-compat';
|
|
5
|
+
import { Output } from 'ai';
|
|
6
|
+
import { PlanSchema } from "../plan/schema.js";
|
|
7
|
+
// Inlined per CLAUDE.md "no premature abstraction". The Orchestrator builds the
|
|
8
|
+
// caller-side system prompt as `styleContents + PLANNER_SYSTEM_PREFIX` so the
|
|
9
|
+
// agent inherits the repo's house style alongside its role.
|
|
10
|
+
export const PLANNER_SYSTEM_PREFIX = [
|
|
11
|
+
'',
|
|
12
|
+
'You are the Planner subagent. You receive a goal and an optional acceptance criteria.',
|
|
13
|
+
'You output a directed-acyclic plan of PR groups: each group is one cohesive pull request,',
|
|
14
|
+
'roughly 300 lines of code, that can be reviewed independently. Use read-only repo tools',
|
|
15
|
+
'(readFile, glob, grep) to ground the plan in the actual code before emitting it.',
|
|
16
|
+
'',
|
|
17
|
+
'Rules:',
|
|
18
|
+
'- Emit at most maxPrs groups. If the work is larger, fold the tail into the last group.',
|
|
19
|
+
'- Each group has a stable id (slug), a one-line title, an ordered list of tasks,',
|
|
20
|
+
' and a dependsOn list of earlier group ids. dependsOn is empty for the root(s).',
|
|
21
|
+
'- Prefer parallelizable siblings over a single linear chain.',
|
|
22
|
+
'- Do not invent files. Do not propose work outside the repo.',
|
|
23
|
+
'',
|
|
24
|
+
'Return JSON that matches the Plan schema exactly.',
|
|
25
|
+
].join('\n');
|
|
26
|
+
export function createPlannerAgent(init) {
|
|
27
|
+
return createSubagent({
|
|
28
|
+
model: init.model,
|
|
29
|
+
tools: init.tools,
|
|
30
|
+
systemPrompt: init.systemPrompt,
|
|
31
|
+
output: plannerOutput(),
|
|
32
|
+
...(init.maxSteps !== undefined ? { maxSteps: init.maxSteps } : {}),
|
|
33
|
+
}, 20);
|
|
34
|
+
}
|
|
35
|
+
export async function runPlanner(agent, input) {
|
|
36
|
+
if (!Number.isInteger(input.maxPrs) || input.maxPrs < 1) {
|
|
37
|
+
return { kind: 'error', error: `maxPrs must be a positive integer, received ${input.maxPrs}` };
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const result = await agent.generate({ prompt: buildUserPrompt(input) });
|
|
41
|
+
const raw = result.experimental_output;
|
|
42
|
+
if (!raw.groups || raw.groups.length === 0) {
|
|
43
|
+
return { kind: 'blocked', reason: 'planner returned an empty group list' };
|
|
44
|
+
}
|
|
45
|
+
return { kind: 'ok', plan: capGroups(raw, input.maxPrs) };
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
return { kind: 'error', error: err instanceof Error ? err.message : String(err) };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function plannerOutput() {
|
|
52
|
+
return Output.object({ schema: PlanSchema, name: 'Plan' });
|
|
53
|
+
}
|
|
54
|
+
function buildUserPrompt(input) {
|
|
55
|
+
const lines = [`Goal: ${input.goal}`];
|
|
56
|
+
if (input.criteria?.trim()) {
|
|
57
|
+
lines.push(`Acceptance criteria: ${input.criteria}`);
|
|
58
|
+
}
|
|
59
|
+
lines.push(`maxPrs: ${input.maxPrs}`);
|
|
60
|
+
lines.push('Survey the repo with the read-only tools, then emit the Plan JSON.');
|
|
61
|
+
return lines.join('\n');
|
|
62
|
+
}
|
|
63
|
+
// Truncate to maxPrs groups; fold any overflow into a single remainder task on
|
|
64
|
+
// the last kept group so no work is silently dropped.
|
|
65
|
+
function capGroups(plan, maxPrs) {
|
|
66
|
+
if (plan.groups.length <= maxPrs)
|
|
67
|
+
return plan;
|
|
68
|
+
const kept = plan.groups.slice(0, maxPrs);
|
|
69
|
+
const overflow = plan.groups.slice(maxPrs);
|
|
70
|
+
const lastKept = kept[maxPrs - 1];
|
|
71
|
+
if (!lastKept)
|
|
72
|
+
return plan;
|
|
73
|
+
const remainder = {
|
|
74
|
+
description: `remainder: ${overflow.map(summarizeGroup).join('; ')}`,
|
|
75
|
+
};
|
|
76
|
+
const merged = { ...lastKept, tasks: [...lastKept.tasks, remainder] };
|
|
77
|
+
const newGroups = [...kept.slice(0, maxPrs - 1), merged];
|
|
78
|
+
return { ...plan, groups: newGroups };
|
|
79
|
+
}
|
|
80
|
+
function summarizeGroup(g) {
|
|
81
|
+
return `${g.id} (${g.tasks.length} tasks)`;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=planner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/subagents/planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type DeepPartial, Output, type Tool, type ToolLoopAgent } from 'ai';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { ReviewThread } from '../github/schema.ts';
|
|
4
|
+
import type { SubagentInit } from './factory.ts';
|
|
5
|
+
import type { WorkerTools } from './worker.ts';
|
|
6
|
+
export type GithubToolInput = {
|
|
7
|
+
action: 'replyToThread' | 'resolveThread';
|
|
8
|
+
threadId: string;
|
|
9
|
+
body?: string | undefined;
|
|
10
|
+
};
|
|
11
|
+
export type GithubToolOutput = {
|
|
12
|
+
ok: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type ReviewerTools = WorkerTools & {
|
|
15
|
+
github: Tool<GithubToolInput, GithubToolOutput>;
|
|
16
|
+
};
|
|
17
|
+
export declare const ThreadResolutionOutputSchema: z.ZodObject<{
|
|
18
|
+
kind: z.ZodEnum<{
|
|
19
|
+
fixed: "fixed";
|
|
20
|
+
replied: "replied";
|
|
21
|
+
wontfix: "wontfix";
|
|
22
|
+
}>;
|
|
23
|
+
commitMessage: z.ZodOptional<z.ZodString>;
|
|
24
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
export type ThreadResolutionOutput = z.infer<typeof ThreadResolutionOutputSchema>;
|
|
27
|
+
type ReviewerAgentOutput = Output.Output<ThreadResolutionOutput, DeepPartial<ThreadResolutionOutput>, never>;
|
|
28
|
+
export type ReviewerAgent = ToolLoopAgent<never, ReviewerTools, ReviewerAgentOutput>;
|
|
29
|
+
export type ReviewerInput = {
|
|
30
|
+
pr: number;
|
|
31
|
+
threads: ReviewThread[];
|
|
32
|
+
worktreePath: string;
|
|
33
|
+
styleContents: string;
|
|
34
|
+
};
|
|
35
|
+
export type ThreadResolution = {
|
|
36
|
+
threadId: string;
|
|
37
|
+
kind: 'fixed';
|
|
38
|
+
commitSha: string;
|
|
39
|
+
} | {
|
|
40
|
+
threadId: string;
|
|
41
|
+
kind: 'replied';
|
|
42
|
+
} | {
|
|
43
|
+
threadId: string;
|
|
44
|
+
kind: 'wontfix';
|
|
45
|
+
reason: string;
|
|
46
|
+
};
|
|
47
|
+
export type ReviewerResult = {
|
|
48
|
+
kind: 'ok';
|
|
49
|
+
resolutions: ThreadResolution[];
|
|
50
|
+
} | {
|
|
51
|
+
kind: 'blocked';
|
|
52
|
+
reason: string;
|
|
53
|
+
} | {
|
|
54
|
+
kind: 'error';
|
|
55
|
+
error: string;
|
|
56
|
+
};
|
|
57
|
+
export declare const REVIEWER_SYSTEM_PREFIX: string;
|
|
58
|
+
export declare function createReviewerAgent(init: SubagentInit<ReviewerTools>): ReviewerAgent;
|
|
59
|
+
export declare function runReviewer(agent: ReviewerAgent, input: ReviewerInput): Promise<ReviewerResult>;
|
|
60
|
+
export {};
|