agentrium 0.3.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/README.md +181 -0
- package/dist/agents/architect.d.ts +2 -0
- package/dist/agents/architect.js +23 -0
- package/dist/agents/architect.js.map +1 -0
- package/dist/agents/base.d.ts +10 -0
- package/dist/agents/base.js +37 -0
- package/dist/agents/base.js.map +1 -0
- package/dist/agents/codeReviewer.d.ts +3 -0
- package/dist/agents/codeReviewer.js +32 -0
- package/dist/agents/codeReviewer.js.map +1 -0
- package/dist/agents/productManager.d.ts +2 -0
- package/dist/agents/productManager.js +23 -0
- package/dist/agents/productManager.js.map +1 -0
- package/dist/agents/qaEngineer.d.ts +2 -0
- package/dist/agents/qaEngineer.js +23 -0
- package/dist/agents/qaEngineer.js.map +1 -0
- package/dist/agents/registry.d.ts +3 -0
- package/dist/agents/registry.js +30 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/reviewArbiter.d.ts +2 -0
- package/dist/agents/reviewArbiter.js +24 -0
- package/dist/agents/reviewArbiter.js.map +1 -0
- package/dist/agents/softwareEngineer.d.ts +2 -0
- package/dist/agents/softwareEngineer.js +23 -0
- package/dist/agents/softwareEngineer.js.map +1 -0
- package/dist/agents/technicalWriter.d.ts +2 -0
- package/dist/agents/technicalWriter.js +24 -0
- package/dist/agents/technicalWriter.js.map +1 -0
- package/dist/agents/types.d.ts +10 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/uxDesigner.d.ts +2 -0
- package/dist/agents/uxDesigner.js +23 -0
- package/dist/agents/uxDesigner.js.map +1 -0
- package/dist/artifacts/store.d.ts +20 -0
- package/dist/artifacts/store.js +81 -0
- package/dist/artifacts/store.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.js +44 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/run.d.ts +2 -0
- package/dist/cli/commands/run.js +67 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/runs.d.ts +2 -0
- package/dist/cli/commands/runs.js +37 -0
- package/dist/cli/commands/runs.js.map +1 -0
- package/dist/cli/commands/show.d.ts +4 -0
- package/dist/cli/commands/show.js +56 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.js +28 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/workspaces.d.ts +2 -0
- package/dist/cli/commands/workspaces.js +24 -0
- package/dist/cli/commands/workspaces.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.js +30 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils.d.ts +1 -0
- package/dist/cli/utils.js +28 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/context/configParser.d.ts +2 -0
- package/dist/context/configParser.js +109 -0
- package/dist/context/configParser.js.map +1 -0
- package/dist/context/contextBuilder.d.ts +2 -0
- package/dist/context/contextBuilder.js +39 -0
- package/dist/context/contextBuilder.js.map +1 -0
- package/dist/context/repoAnalyzer.d.ts +4 -0
- package/dist/context/repoAnalyzer.js +84 -0
- package/dist/context/repoAnalyzer.js.map +1 -0
- package/dist/context/types.d.ts +35 -0
- package/dist/context/types.js +2 -0
- package/dist/context/types.js.map +1 -0
- package/dist/pipeline/checkpoint.d.ts +4 -0
- package/dist/pipeline/checkpoint.js +62 -0
- package/dist/pipeline/checkpoint.js.map +1 -0
- package/dist/pipeline/pipeline.d.ts +7 -0
- package/dist/pipeline/pipeline.js +33 -0
- package/dist/pipeline/pipeline.js.map +1 -0
- package/dist/pipeline/runner.d.ts +15 -0
- package/dist/pipeline/runner.js +127 -0
- package/dist/pipeline/runner.js.map +1 -0
- package/dist/pipeline/types.d.ts +14 -0
- package/dist/pipeline/types.js +14 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/review/process.d.ts +15 -0
- package/dist/review/process.js +149 -0
- package/dist/review/process.js.map +1 -0
- package/dist/review/types.d.ts +9 -0
- package/dist/review/types.js +16 -0
- package/dist/review/types.js.map +1 -0
- package/dist/workspace/manager.d.ts +7 -0
- package/dist/workspace/manager.js +63 -0
- package/dist/workspace/manager.js.map +1 -0
- package/package.json +51 -0
- package/prompts/architect.md +40 -0
- package/prompts/codeReviewerLogic.md +43 -0
- package/prompts/codeReviewerSecurity.md +43 -0
- package/prompts/productManager.md +29 -0
- package/prompts/qaEngineer.md +49 -0
- package/prompts/reviewArbiter.md +45 -0
- package/prompts/softwareEngineer.md +43 -0
- package/prompts/technicalWriter.md +40 -0
- package/prompts/uxDesigner.md +42 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export function buildContextPrompt(context) {
|
|
2
|
+
const sections = [];
|
|
3
|
+
sections.push(`# Workspace: ${context.workspace.name}`);
|
|
4
|
+
sections.push("");
|
|
5
|
+
if (context.workspace.techStack.length > 0) {
|
|
6
|
+
sections.push("## Tech Stack");
|
|
7
|
+
for (const tech of context.workspace.techStack) {
|
|
8
|
+
sections.push(`- ${tech}`);
|
|
9
|
+
}
|
|
10
|
+
sections.push("");
|
|
11
|
+
}
|
|
12
|
+
for (const repo of context.repos) {
|
|
13
|
+
sections.push(`## Repository: ${repo.name}`);
|
|
14
|
+
sections.push(`Path: ${repo.path}`);
|
|
15
|
+
if (repo.stack.length > 0) {
|
|
16
|
+
sections.push(`Detected stack: ${repo.stack.join(", ")}`);
|
|
17
|
+
}
|
|
18
|
+
sections.push("");
|
|
19
|
+
sections.push("### Directory Structure");
|
|
20
|
+
sections.push("```");
|
|
21
|
+
sections.push(repo.structure);
|
|
22
|
+
sections.push("```");
|
|
23
|
+
sections.push("");
|
|
24
|
+
if (repo.conventions) {
|
|
25
|
+
sections.push("### Conventions");
|
|
26
|
+
sections.push(repo.conventions);
|
|
27
|
+
sections.push("");
|
|
28
|
+
}
|
|
29
|
+
if (repo.recentCommits.length > 0) {
|
|
30
|
+
sections.push("### Recent Commits");
|
|
31
|
+
for (const commit of repo.recentCommits) {
|
|
32
|
+
sections.push(`- ${commit}`);
|
|
33
|
+
}
|
|
34
|
+
sections.push("");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return sections.join("\n");
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=contextBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextBuilder.js","sourceRoot":"","sources":["../../src/context/contextBuilder.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,OAAoB;IACrD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAElB,IAAI,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YAC/C,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAEpC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAElB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACjC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACpC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;YAC/B,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { RepoContext } from "./types.js";
|
|
2
|
+
export declare function detectStack(repoPath: string): string[];
|
|
3
|
+
export declare function getDirectoryTree(repoPath: string, maxDepth?: number): string;
|
|
4
|
+
export declare function analyzeRepo(repoPath: string): Promise<RepoContext>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
const STACK_MARKERS = [
|
|
4
|
+
{ file: "tsconfig.json", stack: ["typescript"] },
|
|
5
|
+
{ file: "package.json", stack: ["node"] },
|
|
6
|
+
{ file: "uv.lock", stack: ["python", "uv"] },
|
|
7
|
+
{ file: "pyproject.toml", stack: ["python"] },
|
|
8
|
+
{ file: "requirements.txt", stack: ["python"] },
|
|
9
|
+
{ file: "Pipfile", stack: ["python"] },
|
|
10
|
+
{ file: "go.mod", stack: ["go"] },
|
|
11
|
+
{ file: "Cargo.toml", stack: ["rust"] },
|
|
12
|
+
{ file: "pom.xml", stack: ["java"] },
|
|
13
|
+
{ file: "build.gradle", stack: ["java"] },
|
|
14
|
+
{ file: "build.gradle.kts", stack: ["kotlin"] },
|
|
15
|
+
];
|
|
16
|
+
export function detectStack(repoPath) {
|
|
17
|
+
const detected = new Set();
|
|
18
|
+
const entries = fs.readdirSync(repoPath);
|
|
19
|
+
for (const marker of STACK_MARKERS) {
|
|
20
|
+
if (entries.includes(marker.file)) {
|
|
21
|
+
for (const s of marker.stack)
|
|
22
|
+
detected.add(s);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (entries.some((e) => e.endsWith(".csproj") || e.endsWith(".sln"))) {
|
|
26
|
+
detected.add("dotnet");
|
|
27
|
+
}
|
|
28
|
+
return [...detected];
|
|
29
|
+
}
|
|
30
|
+
export function getDirectoryTree(repoPath, maxDepth = 3) {
|
|
31
|
+
const lines = [];
|
|
32
|
+
buildTree(repoPath, "", 0, maxDepth, lines);
|
|
33
|
+
return lines.join("\n");
|
|
34
|
+
}
|
|
35
|
+
function buildTree(dir, prefix, depth, maxDepth, lines) {
|
|
36
|
+
if (depth >= maxDepth)
|
|
37
|
+
return;
|
|
38
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true })
|
|
39
|
+
.filter((e) => !e.name.startsWith(".") && e.name !== "node_modules" && e.name !== "dist")
|
|
40
|
+
.sort((a, b) => {
|
|
41
|
+
if (a.isDirectory() && !b.isDirectory())
|
|
42
|
+
return -1;
|
|
43
|
+
if (!a.isDirectory() && b.isDirectory())
|
|
44
|
+
return 1;
|
|
45
|
+
return a.name.localeCompare(b.name);
|
|
46
|
+
});
|
|
47
|
+
for (let i = 0; i < entries.length; i++) {
|
|
48
|
+
const entry = entries[i];
|
|
49
|
+
const isLast = i === entries.length - 1;
|
|
50
|
+
const connector = isLast ? "└── " : "├── ";
|
|
51
|
+
const childPrefix = isLast ? " " : "│ ";
|
|
52
|
+
lines.push(`${prefix}${connector}${entry.name}${entry.isDirectory() ? "/" : ""}`);
|
|
53
|
+
if (entry.isDirectory()) {
|
|
54
|
+
buildTree(path.join(dir, entry.name), prefix + childPrefix, depth + 1, maxDepth, lines);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function readFileIfExists(filePath) {
|
|
59
|
+
try {
|
|
60
|
+
return fs.readFileSync(filePath, "utf-8");
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function analyzeRepo(repoPath) {
|
|
67
|
+
const name = path.basename(repoPath);
|
|
68
|
+
const stack = detectStack(repoPath);
|
|
69
|
+
const structure = getDirectoryTree(repoPath);
|
|
70
|
+
const conventions = readFileIfExists(path.join(repoPath, "CLAUDE.md"))
|
|
71
|
+
?? readFileIfExists(path.join(repoPath, "CONVENTIONS.md"));
|
|
72
|
+
let recentCommits = [];
|
|
73
|
+
try {
|
|
74
|
+
const { simpleGit } = await import("simple-git");
|
|
75
|
+
const git = simpleGit(repoPath);
|
|
76
|
+
const log = await git.log({ maxCount: 10 });
|
|
77
|
+
recentCommits = log.all.map((c) => `${c.hash.slice(0, 7)} ${c.message}`);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Not a git repo or git not available
|
|
81
|
+
}
|
|
82
|
+
return { name, path: repoPath, stack, structure, conventions, recentCommits };
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=repoAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repoAnalyzer.js","sourceRoot":"","sources":["../../src/context/repoAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB,MAAM,aAAa,GAAkB;IACnC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE;IAChD,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;IACzC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE;IAC5C,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE;IAC7C,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE;IAC/C,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE;IACtC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE;IACjC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;IACvC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;IACpC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;IACzC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE;CAChD,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK;gBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACrE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,WAAmB,CAAC;IACrE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,MAAc,EAAE,KAAa,EAAE,QAAgB,EAAE,KAAe;IAC9F,IAAI,KAAK,IAAI,QAAQ;QAAE,OAAO;IAE9B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACzD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SACxF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAE7C,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAElF,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;WACjE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE7D,IAAI,aAAa,GAAa,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface WorkspaceConfig {
|
|
2
|
+
name: string;
|
|
3
|
+
repositories: RepositoryRef[];
|
|
4
|
+
techStack: string[];
|
|
5
|
+
conventions: string | null;
|
|
6
|
+
pipelineSettings: PipelineSettings;
|
|
7
|
+
knowledgeSources: KnowledgeSource[];
|
|
8
|
+
}
|
|
9
|
+
export interface RepositoryRef {
|
|
10
|
+
name: string;
|
|
11
|
+
path: string;
|
|
12
|
+
description: string;
|
|
13
|
+
}
|
|
14
|
+
export interface PipelineSettings {
|
|
15
|
+
checkpoints: "all" | "none" | string[];
|
|
16
|
+
maxReviewIterations: number;
|
|
17
|
+
skipStages: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface KnowledgeSource {
|
|
20
|
+
type: "file" | "mcp";
|
|
21
|
+
path?: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface RepoContext {
|
|
25
|
+
name: string;
|
|
26
|
+
path: string;
|
|
27
|
+
stack: string[];
|
|
28
|
+
structure: string;
|
|
29
|
+
conventions: string | null;
|
|
30
|
+
recentCommits: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface FullContext {
|
|
33
|
+
workspace: WorkspaceConfig;
|
|
34
|
+
repos: RepoContext[];
|
|
35
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/context/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CheckpointDecision, Stage } from "./types.js";
|
|
2
|
+
import type { ArtifactStore } from "../artifacts/store.js";
|
|
3
|
+
export declare function parseCheckpointInput(input: string): CheckpointDecision | null;
|
|
4
|
+
export declare function promptCheckpoint(stage: Stage, artifactPreview: string, store: ArtifactStore, runId: string): Promise<CheckpointDecision>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import readline from "readline";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
export function parseCheckpointInput(input) {
|
|
4
|
+
const normalized = input.trim().toLowerCase();
|
|
5
|
+
const map = {
|
|
6
|
+
a: "approve",
|
|
7
|
+
approve: "approve",
|
|
8
|
+
r: "reject",
|
|
9
|
+
reject: "reject",
|
|
10
|
+
s: "skip",
|
|
11
|
+
skip: "skip",
|
|
12
|
+
v: "view",
|
|
13
|
+
view: "view",
|
|
14
|
+
};
|
|
15
|
+
return map[normalized] ?? null;
|
|
16
|
+
}
|
|
17
|
+
export async function promptCheckpoint(stage, artifactPreview, store, runId) {
|
|
18
|
+
console.log("");
|
|
19
|
+
console.log(chalk.yellow(`── Checkpoint: ${stage} ──`));
|
|
20
|
+
console.log("");
|
|
21
|
+
console.log(artifactPreview.slice(0, 2000));
|
|
22
|
+
if (artifactPreview.length > 2000) {
|
|
23
|
+
console.log(chalk.gray(`... (${artifactPreview.length - 2000} more characters)`));
|
|
24
|
+
}
|
|
25
|
+
console.log("");
|
|
26
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
27
|
+
const askOnce = () => new Promise((resolve) => {
|
|
28
|
+
rl.question(chalk.cyan("[a]pprove [r]eject [s]kip [v]iew previous > "), (answer) => {
|
|
29
|
+
const decision = parseCheckpointInput(answer);
|
|
30
|
+
if (!decision) {
|
|
31
|
+
console.log(chalk.red("Invalid input. Try again."));
|
|
32
|
+
resolve(askOnce());
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (decision === "view") {
|
|
36
|
+
const meta = store.readMeta(runId);
|
|
37
|
+
const completedStages = Object.keys(meta.stages);
|
|
38
|
+
if (completedStages.length === 0) {
|
|
39
|
+
console.log(chalk.gray("No previous stages to view."));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
for (const s of completedStages) {
|
|
43
|
+
const content = store.readArtifact(runId, s);
|
|
44
|
+
if (content) {
|
|
45
|
+
console.log(chalk.blue(`\n── ${s} ──`));
|
|
46
|
+
console.log(content.slice(0, 1000));
|
|
47
|
+
if (content.length > 1000) {
|
|
48
|
+
console.log(chalk.gray(`... (truncated)`));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
resolve(askOnce());
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
rl.close();
|
|
57
|
+
resolve(decision);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
return askOnce();
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/pipeline/checkpoint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Stage, type PipelineConfig } from "./types.js";
|
|
2
|
+
export interface PlannedStage {
|
|
3
|
+
stage: Stage;
|
|
4
|
+
agentName: string;
|
|
5
|
+
hasCheckpoint: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function buildPipelineStages(config: PipelineConfig, includeOptional?: Stage[]): PlannedStage[];
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { STAGE_ORDER, isOptionalStage } from "./types.js";
|
|
2
|
+
const STAGE_AGENT_MAP = {
|
|
3
|
+
analysis: "product-manager",
|
|
4
|
+
design: "ux-designer",
|
|
5
|
+
architecture: "architect",
|
|
6
|
+
implementation: "software-engineer",
|
|
7
|
+
testing: "qa-engineer",
|
|
8
|
+
documentation: "technical-writer",
|
|
9
|
+
review: "code-reviewer",
|
|
10
|
+
};
|
|
11
|
+
export function buildPipelineStages(config, includeOptional = []) {
|
|
12
|
+
const includeSet = new Set(includeOptional);
|
|
13
|
+
const stages = STAGE_ORDER.filter((stage) => {
|
|
14
|
+
if (config.skipStages.includes(stage))
|
|
15
|
+
return false;
|
|
16
|
+
if (isOptionalStage(stage) && !includeSet.has(stage))
|
|
17
|
+
return false;
|
|
18
|
+
return true;
|
|
19
|
+
});
|
|
20
|
+
return stages.map((stage) => ({
|
|
21
|
+
stage,
|
|
22
|
+
agentName: STAGE_AGENT_MAP[stage],
|
|
23
|
+
hasCheckpoint: resolveCheckpoint(config, stage),
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
function resolveCheckpoint(config, stage) {
|
|
27
|
+
if (config.checkpoints === "all")
|
|
28
|
+
return true;
|
|
29
|
+
if (config.checkpoints === "none")
|
|
30
|
+
return false;
|
|
31
|
+
return config.checkpoints.includes(stage);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/pipeline/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,WAAW,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAC;AAQ3F,MAAM,eAAe,GAA0B;IAC7C,QAAQ,EAAE,iBAAiB;IAC3B,MAAM,EAAE,aAAa;IACrB,YAAY,EAAE,WAAW;IACzB,cAAc,EAAE,mBAAmB;IACnC,OAAO,EAAE,aAAa;IACtB,aAAa,EAAE,kBAAkB;IACjC,MAAM,EAAE,eAAe;CACxB,CAAC;AAEF,MAAM,UAAU,mBAAmB,CACjC,MAAsB,EACtB,kBAA2B,EAAE;IAE7B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1C,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACpD,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5B,KAAK;QACL,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC;QACjC,aAAa,EAAE,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC;KAChD,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAsB,EAAE,KAAY;IAC7D,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,MAAM,CAAC,WAAW,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Stage, PipelineConfig } from "./types.js";
|
|
2
|
+
import { ArtifactStore } from "../artifacts/store.js";
|
|
3
|
+
export declare class PipelineRunner {
|
|
4
|
+
private readonly store;
|
|
5
|
+
private readonly runId;
|
|
6
|
+
private readonly workspaceContext;
|
|
7
|
+
private readonly maxReviewIterations;
|
|
8
|
+
constructor(store: ArtifactStore, runId: string, workspaceContext: string, maxReviewIterations: number);
|
|
9
|
+
assembleAgentContext(currentStage: Stage): string;
|
|
10
|
+
buildTaskDescription(currentStage: Stage, originalTask: string): string;
|
|
11
|
+
isReviewStage(stage: string): boolean;
|
|
12
|
+
runPipeline(task: string, config: PipelineConfig, includeOptional?: Stage[]): Promise<void>;
|
|
13
|
+
private runStage;
|
|
14
|
+
private runReviewStage;
|
|
15
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// src/pipeline/runner.ts
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { STAGE_ORDER } from "./types.js";
|
|
5
|
+
import { buildPipelineStages } from "./pipeline.js";
|
|
6
|
+
import { promptCheckpoint } from "./checkpoint.js";
|
|
7
|
+
import { createAgentByName } from "../agents/registry.js";
|
|
8
|
+
import { ReviewProcess } from "../review/process.js";
|
|
9
|
+
const ARTIFACT_STAGES = ["intake", ...STAGE_ORDER];
|
|
10
|
+
export class PipelineRunner {
|
|
11
|
+
store;
|
|
12
|
+
runId;
|
|
13
|
+
workspaceContext;
|
|
14
|
+
maxReviewIterations;
|
|
15
|
+
constructor(store, runId, workspaceContext, maxReviewIterations) {
|
|
16
|
+
this.store = store;
|
|
17
|
+
this.runId = runId;
|
|
18
|
+
this.workspaceContext = workspaceContext;
|
|
19
|
+
this.maxReviewIterations = maxReviewIterations;
|
|
20
|
+
}
|
|
21
|
+
assembleAgentContext(currentStage) {
|
|
22
|
+
const sections = [this.workspaceContext];
|
|
23
|
+
for (const stage of ARTIFACT_STAGES) {
|
|
24
|
+
if (stage === currentStage)
|
|
25
|
+
break;
|
|
26
|
+
const artifact = this.store.readArtifact(this.runId, stage);
|
|
27
|
+
if (artifact) {
|
|
28
|
+
sections.push(`\n---\n\n## Previous Stage: ${stage}\n\n${artifact}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return sections.join("\n");
|
|
32
|
+
}
|
|
33
|
+
buildTaskDescription(currentStage, originalTask) {
|
|
34
|
+
const meta = this.store.readMeta(this.runId);
|
|
35
|
+
const completedStages = Object.keys(meta.stages);
|
|
36
|
+
let desc = `Original task: ${originalTask}\n\n`;
|
|
37
|
+
desc += `Current stage: ${currentStage}\n\n`;
|
|
38
|
+
if (completedStages.length > 0) {
|
|
39
|
+
desc += `Completed stages: ${completedStages.join(", ")}\n\n`;
|
|
40
|
+
desc += `Review the outputs from previous stages (provided in your context) and produce your deliverable for the "${currentStage}" stage.`;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
desc += `This is the first stage. Analyze the task and produce your deliverable.`;
|
|
44
|
+
}
|
|
45
|
+
return desc;
|
|
46
|
+
}
|
|
47
|
+
isReviewStage(stage) {
|
|
48
|
+
return stage === "review";
|
|
49
|
+
}
|
|
50
|
+
async runPipeline(task, config, includeOptional = []) {
|
|
51
|
+
const stages = buildPipelineStages(config, includeOptional);
|
|
52
|
+
console.log(chalk.blue(`Pipeline: ${stages.map((s) => s.stage).join(" → ")}`));
|
|
53
|
+
console.log("");
|
|
54
|
+
for (const planned of stages) {
|
|
55
|
+
let result;
|
|
56
|
+
if (this.isReviewStage(planned.stage)) {
|
|
57
|
+
result = await this.runReviewStage(planned, task);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
result = await this.runStage(planned, task);
|
|
61
|
+
}
|
|
62
|
+
if (!result) {
|
|
63
|
+
console.log(chalk.yellow(`Stage "${planned.stage}" was skipped.`));
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (planned.hasCheckpoint) {
|
|
67
|
+
const decision = await promptCheckpoint(planned.stage, result.artifact, this.store, this.runId);
|
|
68
|
+
if (decision === "reject") {
|
|
69
|
+
console.log(chalk.red(`Stage "${planned.stage}" rejected. Aborting pipeline.`));
|
|
70
|
+
this.store.updateStatus(this.runId, "aborted");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (decision === "skip") {
|
|
74
|
+
console.log(chalk.yellow(`Skipping to next stage.`));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
this.store.updateStatus(this.runId, "completed");
|
|
79
|
+
console.log(chalk.green(`\nPipeline completed for run ${this.runId}.`));
|
|
80
|
+
}
|
|
81
|
+
async runStage(planned, task) {
|
|
82
|
+
const spinner = ora(`${planned.agentName} working on ${planned.stage}...`).start();
|
|
83
|
+
const startTime = Date.now();
|
|
84
|
+
try {
|
|
85
|
+
const agent = createAgentByName(planned.agentName);
|
|
86
|
+
const context = this.assembleAgentContext(planned.stage);
|
|
87
|
+
const taskDesc = this.buildTaskDescription(planned.stage, task);
|
|
88
|
+
const result = await agent.run(context, taskDesc);
|
|
89
|
+
this.store.saveArtifact(this.runId, planned.stage, result.artifact);
|
|
90
|
+
const durationMs = Date.now() - startTime;
|
|
91
|
+
spinner.succeed(`${planned.stage} complete (${(durationMs / 1000).toFixed(1)}s)`);
|
|
92
|
+
return {
|
|
93
|
+
stage: planned.stage,
|
|
94
|
+
artifact: result.artifact,
|
|
95
|
+
agentName: planned.agentName,
|
|
96
|
+
durationMs,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
spinner.fail(`${planned.stage} failed`);
|
|
101
|
+
this.store.updateStatus(this.runId, "failed");
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async runReviewStage(planned, task) {
|
|
106
|
+
const startTime = Date.now();
|
|
107
|
+
try {
|
|
108
|
+
const reviewProcess = new ReviewProcess(this.store, this.runId, this.workspaceContext, this.maxReviewIterations);
|
|
109
|
+
const verdict = await reviewProcess.run(task);
|
|
110
|
+
const durationMs = Date.now() - startTime;
|
|
111
|
+
console.log(chalk.green(`Review complete: ${verdict} (${(durationMs / 1000).toFixed(1)}s)`));
|
|
112
|
+
const artifact = this.store.readArtifact(this.runId, "review") ?? "";
|
|
113
|
+
return {
|
|
114
|
+
stage: planned.stage,
|
|
115
|
+
artifact,
|
|
116
|
+
agentName: "review-process",
|
|
117
|
+
durationMs,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.log(chalk.red("Review stage failed"));
|
|
122
|
+
this.store.updateStatus(this.runId, "failed");
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type Stage = "analysis" | "design" | "architecture" | "implementation" | "testing" | "documentation" | "review";
|
|
2
|
+
export declare const STAGE_ORDER: Stage[];
|
|
3
|
+
export declare function isOptionalStage(stage: Stage): boolean;
|
|
4
|
+
export type CheckpointDecision = "approve" | "reject" | "skip" | "view";
|
|
5
|
+
export interface StageResult {
|
|
6
|
+
stage: Stage;
|
|
7
|
+
artifact: string;
|
|
8
|
+
agentName: string;
|
|
9
|
+
durationMs: number;
|
|
10
|
+
}
|
|
11
|
+
export interface PipelineConfig {
|
|
12
|
+
checkpoints: "all" | "none" | Stage[];
|
|
13
|
+
skipStages: Stage[];
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const STAGE_ORDER = [
|
|
2
|
+
"analysis",
|
|
3
|
+
"design",
|
|
4
|
+
"architecture",
|
|
5
|
+
"implementation",
|
|
6
|
+
"testing",
|
|
7
|
+
"documentation",
|
|
8
|
+
"review",
|
|
9
|
+
];
|
|
10
|
+
const OPTIONAL_STAGES = new Set(["design", "documentation"]);
|
|
11
|
+
export function isOptionalStage(stage) {
|
|
12
|
+
return OPTIONAL_STAGES.has(stage);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pipeline/types.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,UAAU;IACV,QAAQ;IACR,cAAc;IACd,gBAAgB;IAChB,SAAS;IACT,eAAe;IACf,QAAQ;CACT,CAAC;AAEF,MAAM,eAAe,GAAe,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;AAEzE,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ArtifactStore } from "../artifacts/store.js";
|
|
2
|
+
import { type ReviewVerdict } from "./types.js";
|
|
3
|
+
export declare class ReviewProcess {
|
|
4
|
+
private readonly store;
|
|
5
|
+
private readonly runId;
|
|
6
|
+
private readonly workspaceContext;
|
|
7
|
+
private readonly maxIterations;
|
|
8
|
+
constructor(store: ArtifactStore, runId: string, workspaceContext: string, maxIterations: number);
|
|
9
|
+
buildReviewContext(): string;
|
|
10
|
+
buildReviewTaskDescription(originalTask: string): string;
|
|
11
|
+
buildArbiterTaskDescription(logicFindings: string, securityFindings: string, originalTask: string): string;
|
|
12
|
+
buildReworkTaskDescription(arbiterOutput: string, originalTask: string, reworkIteration: number): string;
|
|
13
|
+
private buildContextForIteration;
|
|
14
|
+
run(originalTask: string): Promise<ReviewVerdict>;
|
|
15
|
+
}
|