goalforge-claude 1.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 +343 -0
  2. package/dist/components/claude-cli.d.ts +14 -0
  3. package/dist/components/claude-cli.d.ts.map +1 -0
  4. package/dist/components/claude-cli.js +50 -0
  5. package/dist/components/claude-cli.js.map +1 -0
  6. package/dist/components/cost-optimizer.d.ts +43 -0
  7. package/dist/components/cost-optimizer.d.ts.map +1 -0
  8. package/dist/components/cost-optimizer.js +140 -0
  9. package/dist/components/cost-optimizer.js.map +1 -0
  10. package/dist/components/executor.d.ts +18 -0
  11. package/dist/components/executor.d.ts.map +1 -0
  12. package/dist/components/executor.js +154 -0
  13. package/dist/components/executor.js.map +1 -0
  14. package/dist/components/memory-store.d.ts +47 -0
  15. package/dist/components/memory-store.d.ts.map +1 -0
  16. package/dist/components/memory-store.js +168 -0
  17. package/dist/components/memory-store.js.map +1 -0
  18. package/dist/components/planner.d.ts +22 -0
  19. package/dist/components/planner.d.ts.map +1 -0
  20. package/dist/components/planner.js +164 -0
  21. package/dist/components/planner.js.map +1 -0
  22. package/dist/components/reviewer.d.ts +19 -0
  23. package/dist/components/reviewer.d.ts.map +1 -0
  24. package/dist/components/reviewer.js +162 -0
  25. package/dist/components/reviewer.js.map +1 -0
  26. package/dist/components/task-queue.d.ts +36 -0
  27. package/dist/components/task-queue.d.ts.map +1 -0
  28. package/dist/components/task-queue.js +156 -0
  29. package/dist/components/task-queue.js.map +1 -0
  30. package/dist/components/test-runner.d.ts +20 -0
  31. package/dist/components/test-runner.d.ts.map +1 -0
  32. package/dist/components/test-runner.js +201 -0
  33. package/dist/components/test-runner.js.map +1 -0
  34. package/dist/core/config.d.ts +5 -0
  35. package/dist/core/config.d.ts.map +1 -0
  36. package/dist/core/config.js +38 -0
  37. package/dist/core/config.js.map +1 -0
  38. package/dist/core/logger.d.ts +16 -0
  39. package/dist/core/logger.d.ts.map +1 -0
  40. package/dist/core/logger.js +78 -0
  41. package/dist/core/logger.js.map +1 -0
  42. package/dist/core/types.d.ts +122 -0
  43. package/dist/core/types.d.ts.map +1 -0
  44. package/dist/core/types.js +4 -0
  45. package/dist/core/types.js.map +1 -0
  46. package/dist/index.d.ts +3 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +137 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/loop-controller.d.ts +39 -0
  51. package/dist/loop-controller.d.ts.map +1 -0
  52. package/dist/loop-controller.js +272 -0
  53. package/dist/loop-controller.js.map +1 -0
  54. package/package.json +50 -0
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_BUDGET = void 0;
4
+ exports.calcCost = calcCost;
5
+ exports.defaultLoopConfig = defaultLoopConfig;
6
+ const path_1 = require("path");
7
+ exports.DEFAULT_BUDGET = {
8
+ maxCostUsd: 10.0,
9
+ maxInputTokensPerCall: 100000,
10
+ maxOutputTokensPerCall: 8000,
11
+ warnThresholdPercent: 80,
12
+ };
13
+ // Pricing constants retained for token-based cost estimation in CostOptimizer.
14
+ // Actual billing uses the cost reported by the claude CLI.
15
+ const PRICING = {
16
+ inputPerMillion: 3.0,
17
+ outputPerMillion: 15.0,
18
+ };
19
+ function calcCost(inputTokens, outputTokens) {
20
+ return ((inputTokens / 1000000) * PRICING.inputPerMillion +
21
+ (outputTokens / 1000000) * PRICING.outputPerMillion);
22
+ }
23
+ function defaultLoopConfig(overrides = {}) {
24
+ const base = (0, path_1.join)(process.cwd(), '..');
25
+ return {
26
+ projectId: `project-${Date.now()}`,
27
+ goal: '',
28
+ targetCoveragePercent: 95,
29
+ maxIterations: 20,
30
+ maxCostUsd: exports.DEFAULT_BUDGET.maxCostUsd,
31
+ maxCriticalIssues: 0,
32
+ workspaceDir: (0, path_1.join)(base, 'workspace'),
33
+ memoryDir: (0, path_1.join)(base, 'engine', 'memory'),
34
+ dryRun: false,
35
+ ...overrides,
36
+ };
37
+ }
38
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":";;;AAiBA,4BAKC;AAED,8CAeC;AAvCD,+BAA4B;AAGf,QAAA,cAAc,GAAe;IACxC,UAAU,EAAE,IAAI;IAChB,qBAAqB,EAAE,MAAO;IAC9B,sBAAsB,EAAE,IAAK;IAC7B,oBAAoB,EAAE,EAAE;CACzB,CAAC;AAEF,+EAA+E;AAC/E,2DAA2D;AAC3D,MAAM,OAAO,GAAG;IACd,eAAe,EAAE,GAAG;IACpB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,SAAgB,QAAQ,CAAC,WAAmB,EAAE,YAAoB;IAChE,OAAO,CACL,CAAC,WAAW,GAAG,OAAS,CAAC,GAAG,OAAO,CAAC,eAAe;QACnD,CAAC,YAAY,GAAG,OAAS,CAAC,GAAG,OAAO,CAAC,gBAAgB,CACtD,CAAC;AACJ,CAAC;AAED,SAAgB,iBAAiB,CAAC,YAAiC,EAAE;IACnE,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAEvC,OAAO;QACL,SAAS,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE;QAClC,IAAI,EAAE,EAAE;QACR,qBAAqB,EAAE,EAAE;QACzB,aAAa,EAAE,EAAE;QACjB,UAAU,EAAE,sBAAc,CAAC,UAAU;QACrC,iBAAiB,EAAE,CAAC;QACpB,YAAY,EAAE,IAAA,WAAI,EAAC,IAAI,EAAE,WAAW,CAAC;QACrC,SAAS,EAAE,IAAA,WAAI,EAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACzC,MAAM,EAAE,KAAK;QACb,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type LogLevel = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';
2
+ export declare class Logger {
3
+ private component;
4
+ private minLevel;
5
+ private logFilePath;
6
+ constructor(component: string, minLevel?: LogLevel, logDir?: string);
7
+ private shouldLog;
8
+ private format;
9
+ private write;
10
+ debug(message: string, meta?: object): void;
11
+ info(message: string, meta?: object): void;
12
+ warn(message: string, meta?: object): void;
13
+ error(message: string, meta?: object): void;
14
+ }
15
+ export declare function createLogger(component: string, logDir?: string): Logger;
16
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAiB3D,qBAAa,MAAM;IACjB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAgB;gBAEvB,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAiB,EAAE,MAAM,CAAC,EAAE,MAAM;IAY3E,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,KAAK;IAqBb,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;CAG5C;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGvE"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Logger = void 0;
4
+ exports.createLogger = createLogger;
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ const LEVEL_ORDER = {
8
+ DEBUG: 0,
9
+ INFO: 1,
10
+ WARN: 2,
11
+ ERROR: 3,
12
+ };
13
+ const COLORS = {
14
+ DEBUG: '\x1b[37m', // white
15
+ INFO: '\x1b[36m', // cyan
16
+ WARN: '\x1b[33m', // yellow
17
+ ERROR: '\x1b[31m', // red
18
+ };
19
+ const RESET = '\x1b[0m';
20
+ class Logger {
21
+ constructor(component, minLevel = 'INFO', logDir) {
22
+ this.component = component;
23
+ this.minLevel = minLevel;
24
+ if (logDir) {
25
+ (0, fs_1.mkdirSync)(logDir, { recursive: true });
26
+ this.logFilePath = (0, path_1.join)(logDir, 'goalforge.log');
27
+ }
28
+ else {
29
+ this.logFilePath = null;
30
+ }
31
+ }
32
+ shouldLog(level) {
33
+ return LEVEL_ORDER[level] >= LEVEL_ORDER[this.minLevel];
34
+ }
35
+ format(level, message, meta) {
36
+ const ts = new Date().toISOString();
37
+ const metaStr = meta ? ` ${JSON.stringify(meta)}` : '';
38
+ return `[${ts}] [${level}] [${this.component}] ${message}${metaStr}`;
39
+ }
40
+ write(level, message, meta) {
41
+ if (!this.shouldLog(level))
42
+ return;
43
+ const line = this.format(level, message, meta);
44
+ const colored = `${COLORS[level]}${line}${RESET}`;
45
+ if (level === 'ERROR') {
46
+ console.error(colored);
47
+ }
48
+ else {
49
+ console.log(colored);
50
+ }
51
+ if (this.logFilePath) {
52
+ try {
53
+ (0, fs_1.appendFileSync)(this.logFilePath, line + '\n');
54
+ }
55
+ catch {
56
+ // silently ignore log write errors
57
+ }
58
+ }
59
+ }
60
+ debug(message, meta) {
61
+ this.write('DEBUG', message, meta);
62
+ }
63
+ info(message, meta) {
64
+ this.write('INFO', message, meta);
65
+ }
66
+ warn(message, meta) {
67
+ this.write('WARN', message, meta);
68
+ }
69
+ error(message, meta) {
70
+ this.write('ERROR', message, meta);
71
+ }
72
+ }
73
+ exports.Logger = Logger;
74
+ function createLogger(component, logDir) {
75
+ const level = process.env.LOG_LEVEL ?? 'INFO';
76
+ return new Logger(component, level, logDir);
77
+ }
78
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ export type TaskStatus = 'PENDING' | 'RUNNING' | 'BLOCKED' | 'COMPLETE' | 'FAILED';
2
+ export type EffortLevel = 'low' | 'medium' | 'high';
3
+ export type CritiqueSeverity = 'low' | 'medium' | 'high' | 'critical';
4
+ export type CritiqueCategory = 'missing-feature' | 'complexity' | 'correctness' | 'performance' | 'security';
5
+ export type OptimizerAction = 'proceed' | 'optimize' | 'cache-hit' | 'skip';
6
+ export interface PlannerOutput {
7
+ objective: string;
8
+ priority: number;
9
+ dependencies: string[];
10
+ estimatedEffort: EffortLevel;
11
+ rationale?: string;
12
+ }
13
+ export interface TokenUsage {
14
+ inputTokens: number;
15
+ outputTokens: number;
16
+ estimatedCostUsd: number;
17
+ }
18
+ export interface TaskResult {
19
+ output: string;
20
+ filesCreated: string[];
21
+ filesModified: string[];
22
+ commandsRun: string[];
23
+ tokenUsage: TokenUsage;
24
+ executedAt: string;
25
+ }
26
+ export interface Task extends PlannerOutput {
27
+ id: string;
28
+ status: TaskStatus;
29
+ createdAt: string;
30
+ updatedAt: string;
31
+ result?: TaskResult;
32
+ blockedReason?: string;
33
+ retryCount: number;
34
+ }
35
+ export interface Critique {
36
+ id: string;
37
+ taskId: string;
38
+ severity: CritiqueSeverity;
39
+ category: CritiqueCategory;
40
+ description: string;
41
+ suggestion: string;
42
+ createdAt: string;
43
+ }
44
+ export interface ReviewResult {
45
+ taskId: string;
46
+ passed: boolean;
47
+ score: number;
48
+ critiques: Critique[];
49
+ suggestions: string[];
50
+ reviewedAt: string;
51
+ }
52
+ export interface TestFailure {
53
+ testName: string;
54
+ file: string;
55
+ error: string;
56
+ }
57
+ export interface TestReport {
58
+ runAt: string;
59
+ totalTests: number;
60
+ passed: number;
61
+ failed: number;
62
+ skipped: number;
63
+ coveragePercent: number;
64
+ failures: TestFailure[];
65
+ rawOutput: string;
66
+ }
67
+ export interface CostEstimate {
68
+ cacheKey: string;
69
+ isCacheHit: boolean;
70
+ inputTokens: number;
71
+ outputTokens: number;
72
+ estimatedCostUsd: number;
73
+ recommendedAction: OptimizerAction;
74
+ reason: string;
75
+ }
76
+ export interface CostBudget {
77
+ maxCostUsd: number;
78
+ maxInputTokensPerCall: number;
79
+ maxOutputTokensPerCall: number;
80
+ warnThresholdPercent: number;
81
+ }
82
+ export interface ArchitectureDecision {
83
+ id: string;
84
+ title: string;
85
+ context: string;
86
+ decision: string;
87
+ consequences: string;
88
+ madeAt: string;
89
+ }
90
+ export interface ProjectState {
91
+ projectId: string;
92
+ goal: string;
93
+ currentPhase: string;
94
+ iterationCount: number;
95
+ totalInputTokens: number;
96
+ totalOutputTokens: number;
97
+ totalCostUsd: number;
98
+ coveragePercent: number;
99
+ testsPassing: boolean;
100
+ criticalIssueCount: number;
101
+ completedTaskIds: string[];
102
+ failedTaskIds: string[];
103
+ startedAt: string;
104
+ lastUpdatedAt: string;
105
+ }
106
+ export interface LoopConfig {
107
+ projectId: string;
108
+ goal: string;
109
+ targetCoveragePercent: number;
110
+ maxIterations: number;
111
+ maxCostUsd: number;
112
+ maxCriticalIssues: number;
113
+ workspaceDir: string;
114
+ memoryDir: string;
115
+ dryRun: boolean;
116
+ }
117
+ export interface LoopExitReason {
118
+ reason: 'coverage-met' | 'tests-passing' | 'cost-exceeded' | 'no-critical-issues' | 'max-iterations' | 'all-tasks-complete' | 'fatal-error';
119
+ detail: string;
120
+ finalState: ProjectState;
121
+ }
122
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // ─── Task ────────────────────────────────────────────────────────────────────
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":";AAAA,gFAAgF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const path_1 = require("path");
5
+ const loop_controller_1 = require("./loop-controller");
6
+ const config_1 = require("./core/config");
7
+ const logger_1 = require("./core/logger");
8
+ const VERSION = '1.0.0';
9
+ const HELP = `
10
+ GoalForge — Describe what you want. Claude builds it. No API key needed.
11
+
12
+ Usage:
13
+ goalforge <goal> Run with a goal
14
+ goalforge --dry-run <goal> Dry run (no Claude calls)
15
+ goalforge --iter 5 --cost 3 <goal> Custom limits
16
+
17
+ Options:
18
+ <goal> What to build (required, or set GOAL env var)
19
+ --iter, -i <N> Max loop iterations (default: 20)
20
+ --cost, -c <N> Max spend cap in USD (default: 10)
21
+ --cover, -k <N> Target line coverage % (default: 95)
22
+ --id, -p <id> Project ID for resuming (default: auto)
23
+ --dry-run, -d Skip Claude calls, write placeholders
24
+ --workspace <path> Output directory (default: ./workspace)
25
+ --version, -v Show version
26
+ --help, -h Show this help
27
+
28
+ Environment variables (overridden by flags):
29
+ GOAL, MAX_ITERATIONS, MAX_COST_USD, TARGET_COVERAGE, PROJECT_ID, DRY_RUN
30
+
31
+ Examples:
32
+ goalforge "Build a REST API with JWT auth"
33
+ goalforge --iter 3 --cost 2 "Scaffold an Express server"
34
+ goalforge --dry-run "Build a CLI tool"
35
+ goalforge --id my-project "Build a REST API" # resume existing project
36
+ `;
37
+ function parseArgs(argv) {
38
+ const args = argv.slice(2);
39
+ if (args.includes('--help') || args.includes('-h')) {
40
+ process.stdout.write(HELP + '\n');
41
+ process.exit(0);
42
+ }
43
+ if (args.includes('--version') || args.includes('-v')) {
44
+ process.stdout.write(`goalforge v${VERSION}\n`);
45
+ process.exit(0);
46
+ }
47
+ let maxIterations = Number(process.env.MAX_ITERATIONS ?? 20);
48
+ let maxCostUsd = Number(process.env.MAX_COST_USD ?? 10);
49
+ let targetCoverage = Number(process.env.TARGET_COVERAGE ?? 95);
50
+ let projectId = process.env.PROJECT_ID ?? `project-${Date.now()}`;
51
+ let dryRun = process.env.DRY_RUN === 'true';
52
+ let workspace = (0, path_1.join)(process.cwd(), 'workspace');
53
+ const positional = [];
54
+ for (let i = 0; i < args.length; i++) {
55
+ const a = args[i];
56
+ switch (a) {
57
+ case '--iter':
58
+ case '-i':
59
+ maxIterations = Number(args[++i]);
60
+ break;
61
+ case '--cost':
62
+ case '-c':
63
+ maxCostUsd = Number(args[++i]);
64
+ break;
65
+ case '--cover':
66
+ case '-k':
67
+ targetCoverage = Number(args[++i]);
68
+ break;
69
+ case '--id':
70
+ case '-p':
71
+ projectId = args[++i];
72
+ break;
73
+ case '--workspace':
74
+ workspace = args[++i];
75
+ break;
76
+ case '--dry-run':
77
+ case '-d':
78
+ dryRun = true;
79
+ break;
80
+ default:
81
+ if (!a.startsWith('-'))
82
+ positional.push(a);
83
+ else {
84
+ process.stderr.write(`Unknown flag: ${a}\n${HELP}\n`);
85
+ process.exit(1);
86
+ }
87
+ }
88
+ }
89
+ const goal = positional.join(' ') ||
90
+ process.env.GOAL ||
91
+ '';
92
+ if (!goal) {
93
+ process.stderr.write('Error: no goal provided.\n\nUsage: goalforge "Build a REST API"\n');
94
+ process.exit(1);
95
+ }
96
+ return { goal, maxIterations, maxCostUsd, targetCoverage, projectId, dryRun, workspace };
97
+ }
98
+ const log = (0, logger_1.createLogger)('GoalForge');
99
+ async function main() {
100
+ const { goal, maxIterations, maxCostUsd, targetCoverage, projectId, dryRun, workspace } = parseArgs(process.argv);
101
+ const config = (0, config_1.defaultLoopConfig)({
102
+ projectId,
103
+ goal,
104
+ targetCoveragePercent: targetCoverage,
105
+ maxIterations,
106
+ maxCostUsd,
107
+ workspaceDir: workspace,
108
+ memoryDir: (0, path_1.join)(process.cwd(), '.goalforge', 'memory'),
109
+ dryRun,
110
+ });
111
+ log.info('GoalForge starting', {
112
+ projectId: config.projectId,
113
+ goal: config.goal.slice(0, 80),
114
+ dryRun: config.dryRun,
115
+ maxIterations: config.maxIterations,
116
+ maxCostUsd: config.maxCostUsd,
117
+ workspace: config.workspaceDir,
118
+ });
119
+ const controller = new loop_controller_1.LoopController(config);
120
+ try {
121
+ const exit = await controller.run();
122
+ log.info('GoalForge complete', {
123
+ reason: exit.reason,
124
+ detail: exit.detail,
125
+ totalCostUsd: exit.finalState.totalCostUsd.toFixed(4),
126
+ iterations: exit.finalState.iterationCount,
127
+ tasksCompleted: exit.finalState.completedTaskIds.length,
128
+ });
129
+ process.exit(0);
130
+ }
131
+ catch (err) {
132
+ log.error('Fatal error', { err: String(err) });
133
+ process.exit(1);
134
+ }
135
+ }
136
+ main();
137
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { LoopConfig, LoopExitReason, ProjectState } from './core/types';
2
+ /**
3
+ * LoopController is the autonomous development loop.
4
+ *
5
+ * while (project_not_complete) {
6
+ * planner() → produce tasks
7
+ * executor() → implement tasks
8
+ * testRunner() → validate coverage
9
+ * reviewer() → critique output
10
+ * costOptimizer() → check budget
11
+ * updateMemory() → persist state
12
+ * }
13
+ */
14
+ export declare class LoopController {
15
+ private readonly config;
16
+ private readonly log;
17
+ private readonly memory;
18
+ private readonly queue;
19
+ private readonly optimizer;
20
+ private readonly planner;
21
+ private readonly executor;
22
+ private readonly reviewer;
23
+ private readonly testRunner;
24
+ private state;
25
+ constructor(config: LoopConfig);
26
+ run(): Promise<LoopExitReason>;
27
+ getState(): ProjectState;
28
+ private planPhase;
29
+ private executePhase;
30
+ private testPhase;
31
+ private reviewPhase;
32
+ private costCheckPhase;
33
+ private updateMemoryPhase;
34
+ private checkExitConditions;
35
+ private initState;
36
+ private persistState;
37
+ private buildExit;
38
+ }
39
+ //# sourceMappingURL=loop-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-controller.d.ts","sourceRoot":"","sources":["../src/loop-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,cAAc,CAAC;AAWpF;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IAWb,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkC;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,KAAK,CAAe;gBAEC,MAAM,EAAE,UAAU;IAiCzC,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;IAgDpC,QAAQ,IAAI,YAAY;YAMV,SAAS;YA8BT,YAAY;YA0CZ,SAAS;YAkBT,WAAW;IAuCzB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,SAAS;IAgCjB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,SAAS;CAQlB"}