developing-agent-forge 1.0.0 → 2.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.
Files changed (54) hide show
  1. package/README.md +42 -39
  2. package/README.zh-CN.md +42 -39
  3. package/developing-forge.yaml +35 -0
  4. package/dist/agents/developer.d.ts +15 -1
  5. package/dist/agents/developer.d.ts.map +1 -1
  6. package/dist/agents/developer.js +41 -4
  7. package/dist/agents/developer.js.map +1 -1
  8. package/dist/agents/manager.d.ts +7 -4
  9. package/dist/agents/manager.d.ts.map +1 -1
  10. package/dist/agents/manager.js +26 -13
  11. package/dist/agents/manager.js.map +1 -1
  12. package/dist/agents/reviewer.js +2 -2
  13. package/dist/agents/trajectory-optimizer.d.ts +1 -2
  14. package/dist/agents/trajectory-optimizer.d.ts.map +1 -1
  15. package/dist/agents/trajectory-optimizer.js +5 -8
  16. package/dist/agents/trajectory-optimizer.js.map +1 -1
  17. package/dist/index.d.ts +2 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/pipeline/factory.d.ts +3 -0
  22. package/dist/pipeline/factory.d.ts.map +1 -0
  23. package/dist/pipeline/factory.js +7 -0
  24. package/dist/pipeline/factory.js.map +1 -0
  25. package/dist/pipeline/index.d.ts +2 -2
  26. package/dist/pipeline/index.d.ts.map +1 -1
  27. package/dist/pipeline/index.js +2 -2
  28. package/dist/pipeline/index.js.map +1 -1
  29. package/dist/pipeline/pipeline.d.ts +49 -29
  30. package/dist/pipeline/pipeline.d.ts.map +1 -1
  31. package/dist/pipeline/pipeline.js +37 -24
  32. package/dist/pipeline/pipeline.js.map +1 -1
  33. package/dist/pipeline/pipelineskill.d.ts +43 -25
  34. package/dist/pipeline/pipelineskill.d.ts.map +1 -1
  35. package/dist/pipeline/pipelineskill.js +4 -5
  36. package/dist/pipeline/pipelineskill.js.map +1 -1
  37. package/dist/pipeline/project-devloop.d.ts +15 -0
  38. package/dist/pipeline/project-devloop.d.ts.map +1 -0
  39. package/dist/pipeline/project-devloop.js +59 -0
  40. package/dist/pipeline/project-devloop.js.map +1 -0
  41. package/dist/pipeline/task-devloop.d.ts +11 -0
  42. package/dist/pipeline/task-devloop.d.ts.map +1 -0
  43. package/dist/pipeline/task-devloop.js +77 -0
  44. package/dist/pipeline/task-devloop.js.map +1 -0
  45. package/package.json +3 -2
  46. package/skills/coding-style/SKILL.md +4 -4
  47. package/dist/pipeline/development.d.ts +0 -14
  48. package/dist/pipeline/development.d.ts.map +0 -1
  49. package/dist/pipeline/development.js +0 -55
  50. package/dist/pipeline/development.js.map +0 -1
  51. package/dist/pipeline/revision.d.ts +0 -10
  52. package/dist/pipeline/revision.d.ts.map +0 -1
  53. package/dist/pipeline/revision.js +0 -52
  54. package/dist/pipeline/revision.js.map +0 -1
@@ -0,0 +1,59 @@
1
+ import { Memory, defaultMemoryAgentNames, } from "memory-agent-forge";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { TaskDevLoop } from "./task-devloop.js";
5
+ const MEMORY_DOMAIN_HINT = "Project progress memory for goals, completed tasks, current status, and task-selection context across project iterations.";
6
+ const FINISH_MARK = "FINISHED";
7
+ export class ProjectDevLoop {
8
+ async develop(team, targetPath, codingStyleSkillPath, goal, achiveDir, maxIterations, maxTaskDevLoopIterations, projectProgressMemoryPath, codeDesignMemoryPath, maxMemoryRounds, callbacks, logRecord) {
9
+ const agentVariables = {
10
+ targetPath: path.resolve(targetPath),
11
+ codingStyleSkillPath: path.resolve(codingStyleSkillPath),
12
+ goal,
13
+ };
14
+ await mkdir(achiveDir, { recursive: true });
15
+ const memoryStore = new Memory(defaultMemoryAgentNames);
16
+ const taskDevLoop = new TaskDevLoop();
17
+ for (let iteration = 1; iteration <= maxIterations; iteration++) {
18
+ console.log(`\n# Project dev loop iteration ${String(iteration)}\n`);
19
+ const archiveDir = path.join(achiveDir, new Date().toISOString().replace(/[:.]/g, "-"));
20
+ await mkdir(archiveDir, { recursive: true });
21
+ const codingManager = await team.createAgent("coding-manager");
22
+ const memoryGuidance = (await codingManager.runStreamed({
23
+ ...agentVariables,
24
+ phase: "recall",
25
+ }, logRecord)).trim();
26
+ await writeFile(path.join(archiveDir, "project_devloop_memory_recall_guidance.md"), memoryGuidance, "utf8");
27
+ const memory = (await memoryStore.recall(team, MEMORY_DOMAIN_HINT, projectProgressMemoryPath, maxMemoryRounds, memoryGuidance, logRecord))
28
+ .map(({ content }) => content)
29
+ .join("\n\n");
30
+ await writeFile(path.join(archiveDir, "project_devloop_recalled_memory.md"), memory, "utf8");
31
+ const currentTask = (await codingManager.runStreamed({
32
+ ...agentVariables,
33
+ memory,
34
+ finishMark: FINISH_MARK,
35
+ phase: "select",
36
+ }, logRecord)).trim();
37
+ await writeFile(path.join(archiveDir, "current_task.md"), currentTask, "utf8");
38
+ if (currentTask.trim() === FINISH_MARK) {
39
+ console.log(`\n# ${FINISH_MARK}\n`);
40
+ return;
41
+ }
42
+ await callbacks?.onTaskStart?.(agentVariables, currentTask);
43
+ const taskDevReports = await taskDevLoop.develop(team, agentVariables.targetPath, agentVariables.codingStyleSkillPath, agentVariables.goal, archiveDir, maxTaskDevLoopIterations, currentTask, codeDesignMemoryPath, maxMemoryRounds, logRecord);
44
+ const thingsToRemember = (await codingManager.runStreamed({
45
+ ...agentVariables,
46
+ memory,
47
+ finishMark: FINISH_MARK,
48
+ phase: "update",
49
+ currentTask,
50
+ taskDevReport: taskDevReports.join("\n\n"),
51
+ }, logRecord)).trim();
52
+ await writeFile(path.join(archiveDir, "project_devloop_things_to_remember.md"), thingsToRemember, "utf8");
53
+ await memoryStore.remember(team, MEMORY_DOMAIN_HINT, projectProgressMemoryPath, maxMemoryRounds, thingsToRemember, logRecord);
54
+ await callbacks?.onTaskFinish?.(agentVariables, currentTask, taskDevReports, thingsToRemember);
55
+ }
56
+ throw new Error(`Reached --max-iterations ${String(maxIterations)} before the coding-manager returned ${FINISH_MARK}.`);
57
+ }
58
+ }
59
+ //# sourceMappingURL=project-devloop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-devloop.js","sourceRoot":"","sources":["../../src/pipeline/project-devloop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { AgentTeam, RecordCallback } from "coding-agent-forge";
2
+ import { type MemoryAgentVariablesByName } from "memory-agent-forge";
3
+ import type { CodeReviewerVariables, DeveloperVariables } from "../agents/index.js";
4
+ export type TaskDevLoopAgentVariablesByName = {
5
+ developer: DeveloperVariables;
6
+ "code-reviewer": CodeReviewerVariables;
7
+ } & MemoryAgentVariablesByName;
8
+ export declare class TaskDevLoop {
9
+ develop(team: AgentTeam<TaskDevLoopAgentVariablesByName>, targetPath: string, codingStyleSkillPath: string, goal: string, archiveDir: string, maxIterations: number, currentTask: string, codeDesignMemoryPath: string, maxMemoryRounds: number, logRecord?: RecordCallback): Promise<string[]>;
10
+ }
11
+ //# sourceMappingURL=task-devloop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-devloop.d.ts","sourceRoot":"","sources":["../../src/pipeline/task-devloop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAEnB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,+BAA+B,GAAG;IAC5C,SAAS,EAAE,kBAAkB,CAAC;IAC9B,eAAe,EAAE,qBAAqB,CAAC;CACxC,GAAG,0BAA0B,CAAC;AAM/B,qBAAa,WAAW;IAChB,OAAO,CACX,IAAI,EAAE,SAAS,CAAC,+BAA+B,CAAC,EAChD,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,MAAM,EAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,oBAAoB,EAAE,MAAM,EAC5B,eAAe,EAAE,MAAM,EACvB,SAAS,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC;CAiIrB"}
@@ -0,0 +1,77 @@
1
+ import { Memory, defaultMemoryAgentNames, } from "memory-agent-forge";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ const ACCEPT_MARK = "ACCEPT";
5
+ const MEMORY_DOMAIN_HINT = "Code design memory for logic relationships between code, design rationale, invariants, and implementation decisions in the target repository.";
6
+ export class TaskDevLoop {
7
+ async develop(team, targetPath, codingStyleSkillPath, goal, archiveDir, maxIterations, currentTask, codeDesignMemoryPath, maxMemoryRounds, logRecord) {
8
+ const agentVariables = {
9
+ targetPath,
10
+ codingStyleSkillPath,
11
+ goal,
12
+ };
13
+ await mkdir(archiveDir, { recursive: true });
14
+ const developer = await team.createAgent("developer");
15
+ const codeReviewer = await team.createAgent("code-reviewer");
16
+ const memoryStore = new Memory(defaultMemoryAgentNames);
17
+ const memoryGuidance = (await developer.runStreamed({
18
+ ...agentVariables,
19
+ currentTask,
20
+ phase: "recall",
21
+ }, logRecord)).trim();
22
+ await writeFile(path.join(archiveDir, "task_devloop_memory_recall_guidance.md"), memoryGuidance, "utf8");
23
+ const memory = (await memoryStore.recall(team, MEMORY_DOMAIN_HINT, codeDesignMemoryPath, maxMemoryRounds, memoryGuidance, logRecord))
24
+ .map(({ content }) => content)
25
+ .join("\n\n");
26
+ await writeFile(path.join(archiveDir, "task_devloop_recalled_memory.md"), memory, "utf8");
27
+ let previousReviewerReport = "";
28
+ const taskDevReports = [];
29
+ for (let iteration = 1; iteration <= maxIterations; iteration++) {
30
+ console.log(`\n# Developer/reviewer iteration ${String(iteration)}\n`);
31
+ const developerVariables = {
32
+ ...agentVariables,
33
+ currentTask,
34
+ memory,
35
+ phase: "develop",
36
+ };
37
+ if (previousReviewerReport) {
38
+ developerVariables.reviewerReport = previousReviewerReport;
39
+ }
40
+ const developerReport = (await developer.runStreamed(developerVariables, logRecord)).trim();
41
+ await writeFile(path.join(archiveDir, `developer_report_${String(iteration).padStart(3, "0")}.md`), developerReport, "utf8");
42
+ taskDevReports.push(`Developer report ${String(iteration)}:\n${developerReport}`);
43
+ const reviewerReport = (await codeReviewer.runStreamed({
44
+ ...agentVariables,
45
+ acceptMark: ACCEPT_MARK,
46
+ currentTask,
47
+ developerReport,
48
+ }, logRecord)).trim();
49
+ await writeFile(path.join(archiveDir, `code_review_${String(iteration).padStart(3, "0")}.md`), reviewerReport, "utf8");
50
+ taskDevReports.push(`Reviewer report ${String(iteration)}:\n${reviewerReport}`);
51
+ const accepted = reviewerReport.trim() === ACCEPT_MARK;
52
+ if (accepted) {
53
+ taskDevReports.push("Reviewer accepted the changes.");
54
+ }
55
+ if (!accepted && iteration === maxIterations) {
56
+ taskDevReports.push("Reviewer did not accept the changes before the maximum review attempts.");
57
+ }
58
+ if (accepted) {
59
+ break;
60
+ }
61
+ previousReviewerReport = reviewerReport;
62
+ }
63
+ const taskDevReport = taskDevReports.join("\n\n");
64
+ await writeFile(path.join(archiveDir, "task_devloop_report.md"), taskDevReport, "utf8");
65
+ const thingsToRemember = (await developer.runStreamed({
66
+ ...agentVariables,
67
+ currentTask,
68
+ memory,
69
+ phase: "update",
70
+ taskDevReport,
71
+ }, logRecord)).trim();
72
+ await writeFile(path.join(archiveDir, "task_devloop_things_to_remember.md"), thingsToRemember, "utf8");
73
+ await memoryStore.remember(team, MEMORY_DOMAIN_HINT, codeDesignMemoryPath, maxMemoryRounds, thingsToRemember, logRecord);
74
+ return taskDevReports;
75
+ }
76
+ }
77
+ //# sourceMappingURL=task-devloop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-devloop.js","sourceRoot":"","sources":["../../src/pipeline/task-devloop.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "developing-agent-forge",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "Goal-driven code development pipelines for coding agents, built on coding-agent-forge.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -48,7 +48,8 @@
48
48
  "developing-skill": "tsx src/cli.ts developing-skill"
49
49
  },
50
50
  "dependencies": {
51
- "coding-agent-forge": "^1.3.1"
51
+ "coding-agent-forge": "^1.3.1",
52
+ "memory-agent-forge": "^1.0.0"
52
53
  },
53
54
  "devDependencies": {
54
55
  "@eslint/js": "^9.39.4",
@@ -393,7 +393,7 @@ Queue or perform docs sync only when docs are explicitly requested, are part of
393
393
  the active workflow, or the accepted change would leave a current documented
394
394
  surface materially misleading. If docs are excluded from the source/test task,
395
395
  do not promote stale documentation found during validation or TODO maintenance
396
- into the next developer task unless the user, active workflow, or existing
396
+ into the next developing task unless the user, active workflow, or existing
397
397
  trajectory explicitly selects docs sync. Record possible docs staleness as a
398
398
  caveat or candidate, not as a selected handoff.
399
399
 
@@ -420,7 +420,7 @@ Do not use TODO or handoff files to invent the next source, harness, docs, or
420
420
  implementation task. Select a next task only when the user has explicitly selected
421
421
  it, the current workflow instruction names that handoff, or an existing active
422
422
  trajectory already contains that selected task. Otherwise leave a neutral
423
- waiting state such as "no next developer task is selected."
423
+ waiting state such as "no next developing task is selected."
424
424
 
425
425
  When the accepted source/test task explicitly excluded docs, TODO, exports,
426
426
  harnesses, or generated outputs, preserve that exclusion in the
@@ -432,7 +432,7 @@ task-selection pass, not a selected next task by themselves. A repository habit,
432
432
  recent sequence, or reasonable maintenance preference is not explicit selection
433
433
  when the just-finished task excluded that surface. Require selection language
434
434
  from the user, a workflow instruction, or an already-active backlog item before
435
- writing "next developer task: sync docs" or any equivalent handoff after a
435
+ writing "next developing task: sync docs" or any equivalent handoff after a
436
436
  source/test task that excluded docs.
437
437
  Explicit exclusions in the current task are not backlog seeds. If the user says
438
438
  not to add a capability, parser family, registry, export, adapter, harness,
@@ -448,7 +448,7 @@ otherwise leave the trajectory neutral.
448
448
  Do not use a docs-only sync that merely documented an accepted helper as the
449
449
  reason to select an adjacent implementation task. Newly visible omissions in
450
450
  the docs may be recorded as candidates for later selection, but the next
451
- developer task stays neutral unless the user or active workflow explicitly
451
+ developing task stays neutral unless the user or active workflow explicitly
452
452
  selects that implementation work.
453
453
 
454
454
  If a docs-only sync is explicitly selected, name the exact stale current
@@ -1,14 +0,0 @@
1
- import type { AgentTeam, RecordCallback } from "coding-agent-forge";
2
- import type { CodingManagerVariables, DevelopingAgentVariables } from "../agents/index.js";
3
- import { type RevisionAgentVariablesByName } from "./revision.js";
4
- export type DevelopmentAgentVariablesByName = RevisionAgentVariablesByName & {
5
- "coding-manager": CodingManagerVariables;
6
- };
7
- export type DevelopmentCallbacks = {
8
- onTaskStart?: (agentVariables: DevelopingAgentVariables, currentTask: string) => Promise<void> | void;
9
- onTaskFinish?: (agentVariables: DevelopingAgentVariables, currentTask: string, revisionReports: readonly string[], todoUpdateReport: string) => Promise<void> | void;
10
- };
11
- export declare class Development {
12
- develop(team: AgentTeam<DevelopmentAgentVariablesByName>, targetPath: string, achiveDir: string, artifactPath: string, codingStyleSkillPath: string, goal: string, maxIterations: number, maxRevisionIterations: number, callbacks?: DevelopmentCallbacks, logRecord?: RecordCallback): Promise<void>;
13
- }
14
- //# sourceMappingURL=development.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"development.d.ts","sourceRoot":"","sources":["../../src/pipeline/development.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAY,KAAK,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,+BAA+B,GAAG,4BAA4B,GAAG;IAC3E,gBAAgB,EAAE,sBAAsB,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,CAAC,EAAE,CACZ,cAAc,EAAE,wBAAwB,EACxC,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CACb,cAAc,EAAE,wBAAwB,EACxC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,gBAAgB,EAAE,MAAM,KACrB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3B,CAAC;AAIF,qBAAa,WAAW;IAChB,OAAO,CACX,IAAI,EAAE,SAAS,CAAC,+BAA+B,CAAC,EAChD,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,oBAAoB,EAAE,MAAM,EAC5B,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,qBAAqB,EAAE,MAAM,EAC7B,SAAS,CAAC,EAAE,oBAAoB,EAChC,SAAS,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC,IAAI,CAAC;CAsFjB"}
@@ -1,55 +0,0 @@
1
- import { existsSync } from "node:fs";
2
- import { mkdir, writeFile } from "node:fs/promises";
3
- import path from "node:path";
4
- import { Revision } from "./revision.js";
5
- const FINISH_MARK = "FINISHED";
6
- export class Development {
7
- async develop(team, targetPath, achiveDir, artifactPath, codingStyleSkillPath, goal, maxIterations, maxRevisionIterations, callbacks, logRecord) {
8
- const resolvedAchiveDir = path.resolve(achiveDir);
9
- const resolvedArtifactPath = path.resolve(artifactPath);
10
- const todoPath = path.join(resolvedArtifactPath, "TODO.md");
11
- const agentVariables = {
12
- targetPath: path.resolve(targetPath),
13
- codingStyleSkillPath: path.resolve(codingStyleSkillPath),
14
- goal,
15
- };
16
- const revision = new Revision();
17
- await mkdir(resolvedAchiveDir, { recursive: true });
18
- await mkdir(resolvedArtifactPath, { recursive: true });
19
- if (!existsSync(todoPath)) {
20
- await writeFile(todoPath, "# TODO", "utf8");
21
- }
22
- await mkdir(agentVariables.targetPath, { recursive: true });
23
- for (let iteration = 1; iteration <= maxIterations; iteration++) {
24
- console.log(`\n# Developing iteration ${String(iteration)}\n`);
25
- const archiveDir = path.join(resolvedAchiveDir, new Date().toISOString().replace(/[:.]/g, "-"));
26
- await mkdir(archiveDir, { recursive: true });
27
- const codingManager = await team.createAgent("coding-manager");
28
- const currentTask = (await codingManager.runStreamed({
29
- ...agentVariables,
30
- todoPath,
31
- finishMark: FINISH_MARK,
32
- phase: "select",
33
- }, logRecord)).trim();
34
- await writeFile(path.join(archiveDir, "current_task.md"), currentTask, "utf8");
35
- if (currentTask.trim() === FINISH_MARK) {
36
- console.log(`\n# ${FINISH_MARK}\n`);
37
- return;
38
- }
39
- await callbacks?.onTaskStart?.(agentVariables, currentTask);
40
- const revisionReports = await revision.revise(team, agentVariables.targetPath, agentVariables.codingStyleSkillPath, agentVariables.goal, archiveDir, maxRevisionIterations, currentTask, logRecord);
41
- const todoUpdateReport = (await codingManager.runStreamed({
42
- ...agentVariables,
43
- todoPath,
44
- finishMark: FINISH_MARK,
45
- phase: "update",
46
- currentTask,
47
- revisionReport: revisionReports.join("\n\n"),
48
- }, logRecord)).trim();
49
- await writeFile(path.join(archiveDir, "todo_update_report.md"), todoUpdateReport, "utf8");
50
- await callbacks?.onTaskFinish?.(agentVariables, currentTask, revisionReports, todoUpdateReport);
51
- }
52
- throw new Error(`Reached --max-iterations ${String(maxIterations)} before the coding-manager returned ${FINISH_MARK}.`);
53
- }
54
- }
55
- //# sourceMappingURL=development.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"development.js","sourceRoot":"","sources":["../../src/pipeline/development.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { AgentTeam, RecordCallback } from "coding-agent-forge";
2
- import type { CodeReviewerVariables, DeveloperVariables } from "../agents/index.js";
3
- export type RevisionAgentVariablesByName = {
4
- developer: DeveloperVariables;
5
- "code-reviewer": CodeReviewerVariables;
6
- };
7
- export declare class Revision {
8
- revise(team: AgentTeam<RevisionAgentVariablesByName>, targetPath: string, codingStyleSkillPath: string, goal: string, archiveDir: string, maxIterations: number, currentTask: string, logRecord?: RecordCallback): Promise<string[]>;
9
- }
10
- //# sourceMappingURL=revision.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"revision.d.ts","sourceRoot":"","sources":["../../src/pipeline/revision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpE,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAEnB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,4BAA4B,GAAG;IACzC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,eAAe,EAAE,qBAAqB,CAAC;CACxC,CAAC;AAIF,qBAAa,QAAQ;IACb,MAAM,CACV,IAAI,EAAE,SAAS,CAAC,4BAA4B,CAAC,EAC7C,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,MAAM,EAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC;CAyErB"}
@@ -1,52 +0,0 @@
1
- import { mkdir, writeFile } from "node:fs/promises";
2
- import path from "node:path";
3
- const ACCEPT_MARK = "ACCEPT";
4
- export class Revision {
5
- async revise(team, targetPath, codingStyleSkillPath, goal, archiveDir, maxIterations, currentTask, logRecord) {
6
- const agentVariables = {
7
- targetPath,
8
- codingStyleSkillPath,
9
- goal,
10
- };
11
- await mkdir(archiveDir, { recursive: true });
12
- const developer = await team.createAgent("developer");
13
- const codeReviewer = await team.createAgent("code-reviewer");
14
- let previousReviewerReport = "";
15
- const revisionReports = [];
16
- for (let revision = 1; revision <= maxIterations; revision++) {
17
- console.log(`\n# Revision ${String(revision)}\n`);
18
- const developerVariables = {
19
- ...agentVariables,
20
- currentTask,
21
- };
22
- if (previousReviewerReport) {
23
- developerVariables.reviewerReport = previousReviewerReport;
24
- }
25
- const developerReport = (await developer.runStreamed(developerVariables, logRecord)).trim();
26
- await writeFile(path.join(archiveDir, `developer_report_${String(revision).padStart(3, "0")}.md`), developerReport, "utf8");
27
- revisionReports.push(`Developer report ${String(revision)}:\n${developerReport}`);
28
- const reviewerReport = (await codeReviewer.runStreamed({
29
- ...agentVariables,
30
- acceptMark: ACCEPT_MARK,
31
- currentTask,
32
- developerReport,
33
- }, logRecord)).trim();
34
- await writeFile(path.join(archiveDir, `code_review_${String(revision).padStart(3, "0")}.md`), reviewerReport, "utf8");
35
- revisionReports.push(`Reviewer report ${String(revision)}:\n${reviewerReport}`);
36
- const accepted = reviewerReport.trim() === ACCEPT_MARK;
37
- if (accepted) {
38
- revisionReports.push("Reviewer accepted the changes.");
39
- }
40
- if (!accepted && revision === maxIterations) {
41
- revisionReports.push("Reviewer did not accept the changes before max revision iterations.");
42
- }
43
- if (accepted) {
44
- break;
45
- }
46
- previousReviewerReport = reviewerReport;
47
- }
48
- await writeFile(path.join(archiveDir, "revision_report.md"), revisionReports.join("\n\n"), "utf8");
49
- return revisionReports;
50
- }
51
- }
52
- //# sourceMappingURL=revision.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"revision.js","sourceRoot":"","sources":["../../src/pipeline/revision.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAa7B,MAAM,WAAW,GAAG,QAAQ,CAAC;AAE7B,MAAM,OAAO,QAAQ;IACnB,KAAK,CAAC,MAAM,CACV,IAA6C,EAC7C,UAAkB,EAClB,oBAA4B,EAC5B,IAAY,EACZ,UAAkB,EAClB,aAAqB,EACrB,WAAmB,EACnB,SAA0B;QAE1B,MAAM,cAAc,GAA6B;YAC/C,UAAU;YACV,oBAAoB;YACpB,IAAI;SACL,CAAC;QAEF,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAC7D,IAAI,sBAAsB,GAAG,EAAE,CAAC;QAChC,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,IAAI,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAElD,MAAM,kBAAkB,GAAuB;gBAC7C,GAAG,cAAc;gBACjB,WAAW;aACZ,CAAC;YACF,IAAI,sBAAsB,EAAE,CAAC;gBAC3B,kBAAkB,CAAC,cAAc,GAAG,sBAAsB,CAAC;YAC7D,CAAC;YAED,MAAM,eAAe,GAAG,CAAC,MAAM,SAAS,CAAC,WAAW,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5F,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EACjF,eAAe,EACf,MAAM,CACP,CAAC;YACF,eAAe,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,QAAQ,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;YAElF,MAAM,cAAc,GAAG,CACrB,MAAM,YAAY,CAAC,WAAW,CAC5B;gBACE,GAAG,cAAc;gBACjB,UAAU,EAAE,WAAW;gBACvB,WAAW;gBACX,eAAe;aAChB,EACD,SAAS,CACV,CACF,CAAC,IAAI,EAAE,CAAC;YACT,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,EAC5E,cAAc,EACd,MAAM,CACP,CAAC;YACF,eAAe,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;YAEhF,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC;YACvD,IAAI,QAAQ,EAAE,CAAC;gBACb,eAAe,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YACzD,CAAC;YAED,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC5C,eAAe,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;YAC9F,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM;YACR,CAAC;YACD,sBAAsB,GAAG,cAAc,CAAC;QAC1C,CAAC;QAED,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAC3C,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAC5B,MAAM,CACP,CAAC;QACF,OAAO,eAAe,CAAC;IACzB,CAAC;CACF"}