gateproof 0.2.2 → 0.2.4
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 +132 -350
- package/dist/act.d.ts +45 -0
- package/dist/act.d.ts.map +1 -1
- package/dist/act.js +22 -0
- package/dist/act.js.map +1 -1
- package/dist/action-executors.d.ts +17 -0
- package/dist/action-executors.d.ts.map +1 -1
- package/dist/action-executors.js +60 -0
- package/dist/action-executors.js.map +1 -1
- package/dist/assert.d.ts +20 -0
- package/dist/assert.d.ts.map +1 -1
- package/dist/assert.js +32 -0
- package/dist/assert.js.map +1 -1
- package/dist/authority.d.ts +34 -0
- package/dist/authority.d.ts.map +1 -0
- package/dist/authority.js +141 -0
- package/dist/authority.js.map +1 -0
- package/dist/cli/gateproof.js +76 -0
- package/dist/cli/gateproof.js.map +1 -1
- package/dist/filepath-backend.d.ts +64 -0
- package/dist/filepath-backend.d.ts.map +1 -0
- package/dist/filepath-backend.js +126 -0
- package/dist/filepath-backend.js.map +1 -0
- package/dist/filepath-protocol.d.ts +214 -0
- package/dist/filepath-protocol.d.ts.map +1 -0
- package/dist/filepath-protocol.js +239 -0
- package/dist/filepath-protocol.js.map +1 -0
- package/dist/filepath-runtime.d.ts +100 -0
- package/dist/filepath-runtime.d.ts.map +1 -0
- package/dist/filepath-runtime.js +190 -0
- package/dist/filepath-runtime.js.map +1 -0
- package/dist/http-backend.d.ts +9 -0
- package/dist/http-backend.d.ts.map +1 -1
- package/dist/http-backend.js +50 -8
- package/dist/http-backend.js.map +1 -1
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/prd/index.d.ts +2 -0
- package/dist/prd/index.d.ts.map +1 -1
- package/dist/prd/index.js +4 -0
- package/dist/prd/index.js.map +1 -1
- package/dist/prd/loop.d.ts +160 -0
- package/dist/prd/loop.d.ts.map +1 -0
- package/dist/prd/loop.js +462 -0
- package/dist/prd/loop.js.map +1 -0
- package/dist/prd/runner.d.ts +2 -5
- package/dist/prd/runner.d.ts.map +1 -1
- package/dist/prd/runner.js +154 -122
- package/dist/prd/runner.js.map +1 -1
- package/dist/prd/scope-defaults.d.ts +75 -0
- package/dist/prd/scope-defaults.d.ts.map +1 -0
- package/dist/prd/scope-defaults.js +235 -0
- package/dist/prd/scope-defaults.js.map +1 -0
- package/dist/prd/types.d.ts +79 -0
- package/dist/prd/types.d.ts.map +1 -1
- package/dist/report.d.ts +70 -0
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +183 -0
- package/dist/report.js.map +1 -1
- package/package.json +10 -2
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native PRD loop function - enables agents and scripts to run the retry loop
|
|
3
|
+
* without external bash orchestration.
|
|
4
|
+
*
|
|
5
|
+
* This is an additive feature - the existing `bun run prd:loop` command remains unchanged.
|
|
6
|
+
*/
|
|
7
|
+
import type { Story } from "./types";
|
|
8
|
+
import type { PrdReportV1 } from "../report";
|
|
9
|
+
/**
|
|
10
|
+
* Context provided to custom agent functions
|
|
11
|
+
*/
|
|
12
|
+
export interface AgentContext {
|
|
13
|
+
/** The relevant PRD slice (title + failing story details) */
|
|
14
|
+
prdSlice: string;
|
|
15
|
+
/** Summary of what failed and why */
|
|
16
|
+
failureSummary: string;
|
|
17
|
+
/** Recent git diff (truncated if too large) */
|
|
18
|
+
recentDiff: string;
|
|
19
|
+
/** The full PRD content */
|
|
20
|
+
prdContent: string;
|
|
21
|
+
/** The failed story details */
|
|
22
|
+
failedStory?: Story;
|
|
23
|
+
/** The report from the last run */
|
|
24
|
+
lastReport?: PrdReportV1;
|
|
25
|
+
/** Current iteration number */
|
|
26
|
+
iteration: number;
|
|
27
|
+
/** Abort signal — agents should pass this to long-running calls so they can be cancelled on timeout */
|
|
28
|
+
signal?: AbortSignal;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Result from a custom agent function
|
|
32
|
+
*/
|
|
33
|
+
export interface AgentResult {
|
|
34
|
+
/** List of changes made (for logging) */
|
|
35
|
+
changes: string[];
|
|
36
|
+
/** Optional commit message if autoCommit is enabled */
|
|
37
|
+
commitMsg?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Callback for iteration status updates
|
|
41
|
+
*/
|
|
42
|
+
export interface IterationStatus {
|
|
43
|
+
/** Current attempt number (1-indexed) */
|
|
44
|
+
attempt: number;
|
|
45
|
+
/** Whether this attempt passed all gates */
|
|
46
|
+
passed: boolean;
|
|
47
|
+
/** Failure details if !passed */
|
|
48
|
+
failure?: string;
|
|
49
|
+
/** The failed story if any */
|
|
50
|
+
failedStory?: Story;
|
|
51
|
+
/** Duration of this iteration in ms */
|
|
52
|
+
durationMs: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Options for runPrdLoop
|
|
56
|
+
*/
|
|
57
|
+
export interface PrdLoopOptions {
|
|
58
|
+
/** Maximum iterations before giving up (default: 7) */
|
|
59
|
+
maxIterations?: number;
|
|
60
|
+
/** Maximum wall-clock time for the entire loop in ms. Aborts after this budget is exhausted. */
|
|
61
|
+
maxTotalMs?: number;
|
|
62
|
+
/** Maximum time for a single agent call in ms. The agent is aborted if it exceeds this. */
|
|
63
|
+
iterationTimeoutMs?: number;
|
|
64
|
+
/** Custom agent function to make changes. If not provided, uses default OpenCode Zen agent. */
|
|
65
|
+
agent?: (ctx: AgentContext) => Promise<AgentResult>;
|
|
66
|
+
/** Callback fired after each iteration */
|
|
67
|
+
onIteration?: (status: IterationStatus) => void;
|
|
68
|
+
/** Auto-commit changes after each successful agent run */
|
|
69
|
+
autoCommit?: boolean | {
|
|
70
|
+
/** Use simple-git instance for commits */
|
|
71
|
+
git?: {
|
|
72
|
+
commit: (message: string) => Promise<void>;
|
|
73
|
+
add: (files: string[]) => Promise<void>;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
/** Working directory (default: process.cwd()) */
|
|
77
|
+
cwd?: string;
|
|
78
|
+
/** Path to write PRD report (default: .gateproof/prd-report.json) */
|
|
79
|
+
reportPath?: string;
|
|
80
|
+
/** Whether to check scope constraints (default: true) */
|
|
81
|
+
checkScope?: boolean;
|
|
82
|
+
/** Git ref for scope checking */
|
|
83
|
+
baseRef?: string;
|
|
84
|
+
/** Append evidence to .gateproof/evidence.log */
|
|
85
|
+
writeEvidenceLog?: boolean;
|
|
86
|
+
/** Quiet mode - suppress console output */
|
|
87
|
+
quiet?: boolean;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Result from runPrdLoop
|
|
91
|
+
*/
|
|
92
|
+
export interface PrdLoopResult {
|
|
93
|
+
/** Whether all gates eventually passed */
|
|
94
|
+
success: boolean;
|
|
95
|
+
/** Number of iterations run */
|
|
96
|
+
attempts: number;
|
|
97
|
+
/** Final failure message if !success */
|
|
98
|
+
finalFailure?: string;
|
|
99
|
+
/** The last report */
|
|
100
|
+
lastReport?: PrdReportV1;
|
|
101
|
+
/** Total duration in ms */
|
|
102
|
+
totalDurationMs: number;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Runs the PRD loop, iterating until all gates pass or maxIterations is reached.
|
|
106
|
+
*
|
|
107
|
+
* This is the native, programmatic way to run the gateproof retry loop.
|
|
108
|
+
* It can be called from scripts, tests, or integrated into custom tooling.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```ts
|
|
112
|
+
* import { runPrdLoop } from "gateproof/prd";
|
|
113
|
+
*
|
|
114
|
+
* const result = await runPrdLoop("./prd.ts", {
|
|
115
|
+
* maxIterations: 5,
|
|
116
|
+
* maxTotalMs: 300_000, // 5 minute wall-clock budget
|
|
117
|
+
* iterationTimeoutMs: 60_000, // 1 minute per agent call
|
|
118
|
+
* agent: async (ctx) => {
|
|
119
|
+
* // Make changes based on ctx.failureSummary
|
|
120
|
+
* return { changes: ["fixed the bug"] };
|
|
121
|
+
* },
|
|
122
|
+
* onIteration: (status) => {
|
|
123
|
+
* console.log(`Attempt ${status.attempt}: ${status.passed ? "passed" : "failed"}`);
|
|
124
|
+
* },
|
|
125
|
+
* });
|
|
126
|
+
*
|
|
127
|
+
* if (result.success) {
|
|
128
|
+
* console.log("All gates passed!");
|
|
129
|
+
* }
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export declare function runPrdLoop(
|
|
133
|
+
/** Path to prd.ts file OR a Story object to run a single story */
|
|
134
|
+
prdPathOrStory: string | Story, options?: PrdLoopOptions): Promise<PrdLoopResult>;
|
|
135
|
+
/**
|
|
136
|
+
* Creates an agent function that uses the OpenCode Zen API.
|
|
137
|
+
* This is a convenience wrapper for the most common use case.
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```ts
|
|
141
|
+
* const agent = createOpenCodeAgent({
|
|
142
|
+
* apiKey: process.env.OPENCODE_ZEN_API_KEY,
|
|
143
|
+
* model: "big-pickle",
|
|
144
|
+
* timeoutMs: 60_000,
|
|
145
|
+
* });
|
|
146
|
+
*
|
|
147
|
+
* await runPrdLoop("./prd.ts", { agent });
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
export declare function createOpenCodeAgent(config: {
|
|
151
|
+
apiKey?: string;
|
|
152
|
+
endpoint?: string;
|
|
153
|
+
model?: string;
|
|
154
|
+
maxSteps?: number;
|
|
155
|
+
/** Timeout for the LLM generateText call in ms (default: 120_000) */
|
|
156
|
+
timeoutMs?: number;
|
|
157
|
+
/** Max retries on 429/5xx errors (default: 1) */
|
|
158
|
+
maxRetries?: number;
|
|
159
|
+
}): (ctx: AgentContext) => Promise<AgentResult>;
|
|
160
|
+
//# sourceMappingURL=loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/prd/loop.ts"],"names":[],"mappings":"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"}
|
package/dist/prd/loop.js
ADDED
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native PRD loop function - enables agents and scripts to run the retry loop
|
|
3
|
+
* without external bash orchestration.
|
|
4
|
+
*
|
|
5
|
+
* This is an additive feature - the existing `bun run prd:loop` command remains unchanged.
|
|
6
|
+
*/
|
|
7
|
+
import { resolve } from "node:path";
|
|
8
|
+
import { readFileSync, existsSync, mkdirSync, appendFileSync } from "node:fs";
|
|
9
|
+
import { execSync } from "node:child_process";
|
|
10
|
+
import { runPrd } from "./runner";
|
|
11
|
+
/**
|
|
12
|
+
* Loads a PRD from a file path by dynamic import
|
|
13
|
+
*/
|
|
14
|
+
async function loadPrd(prdPath) {
|
|
15
|
+
const absolutePath = resolve(prdPath);
|
|
16
|
+
const mod = await import(`file://${absolutePath}`);
|
|
17
|
+
// Handle both default export and named 'prd' export
|
|
18
|
+
if (mod.default && typeof mod.default === 'object' && 'stories' in mod.default) {
|
|
19
|
+
return mod.default;
|
|
20
|
+
}
|
|
21
|
+
if (mod.prd && typeof mod.prd === 'object' && 'stories' in mod.prd) {
|
|
22
|
+
return mod.prd;
|
|
23
|
+
}
|
|
24
|
+
throw new Error(`PRD file must export 'prd' or a default object with 'stories': ${prdPath}`);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Gets a truncated git diff
|
|
28
|
+
*/
|
|
29
|
+
function getRecentDiff(baseRef = "HEAD", maxLines = 100) {
|
|
30
|
+
try {
|
|
31
|
+
const diff = execSync(`git diff ${baseRef}`, {
|
|
32
|
+
encoding: "utf-8",
|
|
33
|
+
cwd: process.cwd(),
|
|
34
|
+
maxBuffer: 1024 * 1024, // 1MB
|
|
35
|
+
});
|
|
36
|
+
const lines = diff.split("\n");
|
|
37
|
+
if (lines.length > maxLines) {
|
|
38
|
+
return lines.slice(0, maxLines).join("\n") + `\n... (truncated, ${lines.length - maxLines} more lines)`;
|
|
39
|
+
}
|
|
40
|
+
return diff;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return "(no diff available)";
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Builds a context object for the agent
|
|
48
|
+
*/
|
|
49
|
+
function buildAgentContext(prdPath, result, iteration, baseRef) {
|
|
50
|
+
const prdContent = readFileSync(prdPath, "utf-8");
|
|
51
|
+
const failedStory = result.failedStory;
|
|
52
|
+
// Build a focused slice of the PRD relevant to the failure
|
|
53
|
+
let prdSlice = "";
|
|
54
|
+
if (failedStory) {
|
|
55
|
+
prdSlice = `Story: ${failedStory.id}\nTitle: ${failedStory.title}\nGate: ${failedStory.gateFile}`;
|
|
56
|
+
if (failedStory.scope) {
|
|
57
|
+
prdSlice += `\nScope: ${JSON.stringify(failedStory.scope, null, 2)}`;
|
|
58
|
+
}
|
|
59
|
+
if (failedStory.progress && failedStory.progress.length > 0) {
|
|
60
|
+
prdSlice += `\nProgress: ${failedStory.progress.join(", ")}`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Build failure summary
|
|
64
|
+
let failureSummary = "";
|
|
65
|
+
if (result.error) {
|
|
66
|
+
failureSummary = result.error.message;
|
|
67
|
+
}
|
|
68
|
+
if (result.report?.failedStory) {
|
|
69
|
+
const storyResult = result.report.stories.find(s => s.id === result.report?.failedStory?.id);
|
|
70
|
+
if (storyResult?.error) {
|
|
71
|
+
failureSummary += `\n${storyResult.error.tag || storyResult.error.name}: ${storyResult.error.message}`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
prdSlice,
|
|
76
|
+
failureSummary,
|
|
77
|
+
recentDiff: getRecentDiff(baseRef),
|
|
78
|
+
prdContent,
|
|
79
|
+
failedStory,
|
|
80
|
+
lastReport: result.report,
|
|
81
|
+
iteration,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Ensures the .gateproof directory exists
|
|
86
|
+
*/
|
|
87
|
+
function ensureGateproofDir(cwd) {
|
|
88
|
+
const dir = resolve(cwd, ".gateproof");
|
|
89
|
+
if (!existsSync(dir)) {
|
|
90
|
+
mkdirSync(dir, { recursive: true });
|
|
91
|
+
}
|
|
92
|
+
return dir;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Appends iteration evidence to the evidence log
|
|
96
|
+
*/
|
|
97
|
+
function appendEvidenceLog(cwd, iteration, status, report) {
|
|
98
|
+
const gateproofDir = ensureGateproofDir(cwd);
|
|
99
|
+
const logPath = resolve(gateproofDir, "evidence.log");
|
|
100
|
+
const entry = {
|
|
101
|
+
timestamp: new Date().toISOString(),
|
|
102
|
+
iteration,
|
|
103
|
+
passed: status.passed,
|
|
104
|
+
durationMs: status.durationMs,
|
|
105
|
+
failedStory: status.failedStory?.id,
|
|
106
|
+
failure: status.failure,
|
|
107
|
+
storiesRun: report?.stories.map(s => ({ id: s.id, status: s.status })),
|
|
108
|
+
};
|
|
109
|
+
appendFileSync(logPath, JSON.stringify(entry) + "\n", "utf-8");
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Default agent that logs a warning (real agent integration requires API key)
|
|
113
|
+
*/
|
|
114
|
+
async function defaultNoopAgent(ctx) {
|
|
115
|
+
console.warn("[runPrdLoop] No agent function provided. Provide an agent option to enable automatic fixes.");
|
|
116
|
+
console.log("\n--- Agent Context ---");
|
|
117
|
+
console.log(`Iteration: ${ctx.iteration}`);
|
|
118
|
+
console.log(`Failed story: ${ctx.failedStory?.id || "(none)"}`);
|
|
119
|
+
console.log(`Failure: ${ctx.failureSummary}`);
|
|
120
|
+
console.log("---\n");
|
|
121
|
+
return { changes: [] };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Wraps a promise with a timeout and an AbortController for real cancellation.
|
|
125
|
+
* The caller should pass the AbortSignal into the underlying work so it actually stops.
|
|
126
|
+
*/
|
|
127
|
+
function withTimeout(fn, ms, label) {
|
|
128
|
+
const controller = new AbortController();
|
|
129
|
+
let timer;
|
|
130
|
+
const timeout = new Promise((_, reject) => {
|
|
131
|
+
timer = setTimeout(() => {
|
|
132
|
+
controller.abort();
|
|
133
|
+
reject(new Error(`${label} timed out after ${ms}ms`));
|
|
134
|
+
}, ms);
|
|
135
|
+
});
|
|
136
|
+
return Promise.race([fn(controller.signal), timeout]).finally(() => clearTimeout(timer));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Generates a short run ID for namespacing report files in concurrent CI.
|
|
140
|
+
*/
|
|
141
|
+
function generateRunId() {
|
|
142
|
+
const ts = Date.now().toString(36);
|
|
143
|
+
const rand = Math.random().toString(36).slice(2, 6);
|
|
144
|
+
return `${ts}-${rand}`;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Runs the PRD loop, iterating until all gates pass or maxIterations is reached.
|
|
148
|
+
*
|
|
149
|
+
* This is the native, programmatic way to run the gateproof retry loop.
|
|
150
|
+
* It can be called from scripts, tests, or integrated into custom tooling.
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* ```ts
|
|
154
|
+
* import { runPrdLoop } from "gateproof/prd";
|
|
155
|
+
*
|
|
156
|
+
* const result = await runPrdLoop("./prd.ts", {
|
|
157
|
+
* maxIterations: 5,
|
|
158
|
+
* maxTotalMs: 300_000, // 5 minute wall-clock budget
|
|
159
|
+
* iterationTimeoutMs: 60_000, // 1 minute per agent call
|
|
160
|
+
* agent: async (ctx) => {
|
|
161
|
+
* // Make changes based on ctx.failureSummary
|
|
162
|
+
* return { changes: ["fixed the bug"] };
|
|
163
|
+
* },
|
|
164
|
+
* onIteration: (status) => {
|
|
165
|
+
* console.log(`Attempt ${status.attempt}: ${status.passed ? "passed" : "failed"}`);
|
|
166
|
+
* },
|
|
167
|
+
* });
|
|
168
|
+
*
|
|
169
|
+
* if (result.success) {
|
|
170
|
+
* console.log("All gates passed!");
|
|
171
|
+
* }
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
export async function runPrdLoop(
|
|
175
|
+
/** Path to prd.ts file OR a Story object to run a single story */
|
|
176
|
+
prdPathOrStory, options = {}) {
|
|
177
|
+
const { maxIterations = 7, maxTotalMs, iterationTimeoutMs, agent = defaultNoopAgent, onIteration, autoCommit = false, cwd = process.cwd(), reportPath, checkScope = true, baseRef, writeEvidenceLog = false, quiet = false, } = options;
|
|
178
|
+
const startTime = Date.now();
|
|
179
|
+
const gateproofDir = ensureGateproofDir(cwd);
|
|
180
|
+
const runId = generateRunId();
|
|
181
|
+
const effectiveReportPath = reportPath ?? resolve(gateproofDir, `prd-report-${runId}.json`);
|
|
182
|
+
// Determine the PRD path
|
|
183
|
+
let prdPath;
|
|
184
|
+
let singleStoryPrd;
|
|
185
|
+
if (typeof prdPathOrStory === "string") {
|
|
186
|
+
prdPath = resolve(cwd, prdPathOrStory);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// Single story mode - create a synthetic PRD
|
|
190
|
+
const story = prdPathOrStory;
|
|
191
|
+
prdPath = resolve(cwd, "prd.ts"); // For context building only
|
|
192
|
+
singleStoryPrd = { stories: [story] };
|
|
193
|
+
}
|
|
194
|
+
const log = quiet ? () => { } : console.log;
|
|
195
|
+
for (let iteration = 1; iteration <= maxIterations; iteration++) {
|
|
196
|
+
// Check wall-clock budget
|
|
197
|
+
if (maxTotalMs && (Date.now() - startTime) >= maxTotalMs) {
|
|
198
|
+
log(`\n⏱️ Wall-clock budget exhausted (${maxTotalMs}ms)`);
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
const iterStart = Date.now();
|
|
202
|
+
log(`\n=== PRD Loop Iteration ${iteration}/${maxIterations} ===`);
|
|
203
|
+
// Load or use the PRD
|
|
204
|
+
let prd;
|
|
205
|
+
if (singleStoryPrd) {
|
|
206
|
+
prd = singleStoryPrd;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
try {
|
|
210
|
+
// Clear module cache for hot reloading
|
|
211
|
+
delete require.cache[prdPath];
|
|
212
|
+
prd = await loadPrd(prdPath);
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
216
|
+
return {
|
|
217
|
+
success: false,
|
|
218
|
+
attempts: iteration,
|
|
219
|
+
finalFailure: `Failed to load PRD: ${msg}`,
|
|
220
|
+
totalDurationMs: Date.now() - startTime,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Run the PRD
|
|
225
|
+
const result = await runPrd(prd, cwd, {
|
|
226
|
+
reportPath: effectiveReportPath,
|
|
227
|
+
checkScope,
|
|
228
|
+
baseRef,
|
|
229
|
+
});
|
|
230
|
+
const iterDuration = Date.now() - iterStart;
|
|
231
|
+
// Build status for callback
|
|
232
|
+
const status = {
|
|
233
|
+
attempt: iteration,
|
|
234
|
+
passed: result.success,
|
|
235
|
+
failure: result.error?.message,
|
|
236
|
+
failedStory: result.failedStory,
|
|
237
|
+
durationMs: iterDuration,
|
|
238
|
+
};
|
|
239
|
+
// Write evidence log if enabled
|
|
240
|
+
if (writeEvidenceLog) {
|
|
241
|
+
appendEvidenceLog(cwd, iteration, status, result.report);
|
|
242
|
+
}
|
|
243
|
+
// Call iteration callback
|
|
244
|
+
onIteration?.(status);
|
|
245
|
+
if (result.success) {
|
|
246
|
+
log("\n✅ All PRD stories passed!");
|
|
247
|
+
return {
|
|
248
|
+
success: true,
|
|
249
|
+
attempts: iteration,
|
|
250
|
+
lastReport: result.report,
|
|
251
|
+
totalDurationMs: Date.now() - startTime,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
log(`\n❌ Gate failed: ${result.failedStory?.id || "unknown"}`);
|
|
255
|
+
if (result.error) {
|
|
256
|
+
log(` ${result.error.message}`);
|
|
257
|
+
}
|
|
258
|
+
// If this is the last iteration, don't call the agent
|
|
259
|
+
if (iteration >= maxIterations) {
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
// Check wall-clock budget before calling agent
|
|
263
|
+
if (maxTotalMs && (Date.now() - startTime) >= maxTotalMs) {
|
|
264
|
+
log(`\n⏱️ Wall-clock budget exhausted (${maxTotalMs}ms), skipping agent`);
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
// Build context and call agent
|
|
268
|
+
const ctx = buildAgentContext(prdPath, result, iteration, baseRef ?? (process.env.CI ? "origin/main" : "HEAD"));
|
|
269
|
+
log("\n🤖 Calling agent to fix...");
|
|
270
|
+
try {
|
|
271
|
+
const agentResult = iterationTimeoutMs
|
|
272
|
+
? await withTimeout((signal) => agent({ ...ctx, signal }), iterationTimeoutMs, "Agent call")
|
|
273
|
+
: await agent(ctx);
|
|
274
|
+
if (agentResult.changes.length > 0) {
|
|
275
|
+
log(` Made ${agentResult.changes.length} change(s):`);
|
|
276
|
+
for (const change of agentResult.changes.slice(0, 5)) {
|
|
277
|
+
log(` - ${change}`);
|
|
278
|
+
}
|
|
279
|
+
if (agentResult.changes.length > 5) {
|
|
280
|
+
log(` ... and ${agentResult.changes.length - 5} more`);
|
|
281
|
+
}
|
|
282
|
+
// Auto-commit if enabled
|
|
283
|
+
if (autoCommit && agentResult.commitMsg) {
|
|
284
|
+
const commitMsg = agentResult.commitMsg;
|
|
285
|
+
if (typeof autoCommit === "object" && autoCommit.git) {
|
|
286
|
+
await autoCommit.git.add(["."]);
|
|
287
|
+
await autoCommit.git.commit(commitMsg);
|
|
288
|
+
log(` 📝 Committed: ${commitMsg}`);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
try {
|
|
292
|
+
execSync(`git add -A && git commit -m ${JSON.stringify(commitMsg)}`, {
|
|
293
|
+
cwd,
|
|
294
|
+
encoding: "utf-8",
|
|
295
|
+
});
|
|
296
|
+
log(` 📝 Committed: ${commitMsg}`);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
log(` ⚠️ Commit failed (maybe no changes?)`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
log(" No changes made by agent");
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch (err) {
|
|
309
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
310
|
+
log(` ⚠️ Agent error: ${msg}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Failed after all iterations
|
|
314
|
+
const lastReport = existsSync(effectiveReportPath)
|
|
315
|
+
? JSON.parse(readFileSync(effectiveReportPath, "utf-8"))
|
|
316
|
+
: undefined;
|
|
317
|
+
return {
|
|
318
|
+
success: false,
|
|
319
|
+
attempts: maxIterations,
|
|
320
|
+
finalFailure: `Failed after ${maxIterations} iterations`,
|
|
321
|
+
lastReport,
|
|
322
|
+
totalDurationMs: Date.now() - startTime,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Creates an agent function that uses the OpenCode Zen API.
|
|
327
|
+
* This is a convenience wrapper for the most common use case.
|
|
328
|
+
*
|
|
329
|
+
* @example
|
|
330
|
+
* ```ts
|
|
331
|
+
* const agent = createOpenCodeAgent({
|
|
332
|
+
* apiKey: process.env.OPENCODE_ZEN_API_KEY,
|
|
333
|
+
* model: "big-pickle",
|
|
334
|
+
* timeoutMs: 60_000,
|
|
335
|
+
* });
|
|
336
|
+
*
|
|
337
|
+
* await runPrdLoop("./prd.ts", { agent });
|
|
338
|
+
* ```
|
|
339
|
+
*/
|
|
340
|
+
export function createOpenCodeAgent(config) {
|
|
341
|
+
const { apiKey = process.env.OPENCODE_ZEN_API_KEY, endpoint = "https://opencode.ai/zen/v1", model = "big-pickle", maxSteps = 10, timeoutMs = 120_000, maxRetries = 1, } = config;
|
|
342
|
+
if (!apiKey) {
|
|
343
|
+
throw new Error("createOpenCodeAgent requires an API key (set OPENCODE_ZEN_API_KEY or pass apiKey)");
|
|
344
|
+
}
|
|
345
|
+
return async (ctx) => {
|
|
346
|
+
// Dynamic import to avoid requiring ai/openai-compatible as hard deps
|
|
347
|
+
const { generateText, tool } = await import("ai");
|
|
348
|
+
const { createOpenAICompatible } = await import("@ai-sdk/openai-compatible");
|
|
349
|
+
const { z } = await import("zod");
|
|
350
|
+
const { existsSync, readFileSync, writeFileSync } = await import("node:fs");
|
|
351
|
+
const opencode = createOpenAICompatible({
|
|
352
|
+
name: "opencode-zen",
|
|
353
|
+
apiKey,
|
|
354
|
+
baseURL: endpoint,
|
|
355
|
+
});
|
|
356
|
+
const changes = [];
|
|
357
|
+
// Define tools - using type assertions to work around strict AI SDK typing
|
|
358
|
+
// The runtime behavior is correct per AI SDK documentation
|
|
359
|
+
const readTool = tool({
|
|
360
|
+
description: "Read the contents of a file at the given path.",
|
|
361
|
+
parameters: z.object({
|
|
362
|
+
path: z.string().describe("The file path to read"),
|
|
363
|
+
}),
|
|
364
|
+
execute: async (params) => {
|
|
365
|
+
if (!existsSync(params.path))
|
|
366
|
+
return `Error: file not found: ${params.path}`;
|
|
367
|
+
return readFileSync(params.path, "utf8");
|
|
368
|
+
},
|
|
369
|
+
});
|
|
370
|
+
const writeTool = tool({
|
|
371
|
+
description: "Write file contents exactly (overwrites).",
|
|
372
|
+
parameters: z.object({
|
|
373
|
+
path: z.string().describe("File path"),
|
|
374
|
+
content: z.string().describe("Full file contents"),
|
|
375
|
+
}),
|
|
376
|
+
execute: async (params) => {
|
|
377
|
+
writeFileSync(params.path, params.content, "utf8");
|
|
378
|
+
changes.push(`Wrote ${params.path}`);
|
|
379
|
+
return `Wrote ${params.path}`;
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
const replaceTool = tool({
|
|
383
|
+
description: "Replace a string in a file. Fails if the string is not found.",
|
|
384
|
+
parameters: z.object({
|
|
385
|
+
path: z.string().describe("File path"),
|
|
386
|
+
old_string: z.string().describe("String to replace"),
|
|
387
|
+
new_string: z.string().describe("Replacement string"),
|
|
388
|
+
}),
|
|
389
|
+
execute: async (params) => {
|
|
390
|
+
if (!existsSync(params.path))
|
|
391
|
+
return `Error: file not found: ${params.path}`;
|
|
392
|
+
const content = readFileSync(params.path, "utf8");
|
|
393
|
+
if (!content.includes(params.old_string)) {
|
|
394
|
+
return `Error: string not found in ${params.path}`;
|
|
395
|
+
}
|
|
396
|
+
const next = content.replace(params.old_string, params.new_string);
|
|
397
|
+
writeFileSync(params.path, next, "utf8");
|
|
398
|
+
changes.push(`Updated ${params.path}`);
|
|
399
|
+
return `Updated ${params.path}`;
|
|
400
|
+
},
|
|
401
|
+
});
|
|
402
|
+
const tools = { read: readTool, write: writeTool, replace: replaceTool };
|
|
403
|
+
const prompt = `You are a gateproof loop agent.
|
|
404
|
+
|
|
405
|
+
Goal:
|
|
406
|
+
- Make the PRD pass (all gates green).
|
|
407
|
+
|
|
408
|
+
Rules:
|
|
409
|
+
- Use the provided tools to inspect and edit files.
|
|
410
|
+
- Keep changes minimal and scoped to what's needed to pass.
|
|
411
|
+
- Fix only the specific failing assertion.
|
|
412
|
+
|
|
413
|
+
PRD Content:
|
|
414
|
+
${ctx.prdContent}
|
|
415
|
+
|
|
416
|
+
Failed Story:
|
|
417
|
+
${ctx.prdSlice}
|
|
418
|
+
|
|
419
|
+
Failure Summary:
|
|
420
|
+
${ctx.failureSummary}
|
|
421
|
+
|
|
422
|
+
Recent Diff:
|
|
423
|
+
${ctx.recentDiff}
|
|
424
|
+
`;
|
|
425
|
+
// Retry wrapper for transient LLM errors (429, 5xx)
|
|
426
|
+
let lastError;
|
|
427
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
428
|
+
try {
|
|
429
|
+
await withTimeout((signal) => generateText({
|
|
430
|
+
model: opencode(model),
|
|
431
|
+
tools,
|
|
432
|
+
maxSteps: maxSteps,
|
|
433
|
+
prompt,
|
|
434
|
+
abortSignal: ctx.signal ?? signal,
|
|
435
|
+
}), timeoutMs, "LLM generateText");
|
|
436
|
+
// If we get here, the call succeeded
|
|
437
|
+
return {
|
|
438
|
+
changes,
|
|
439
|
+
commitMsg: changes.length > 0
|
|
440
|
+
? `fix(prd): ${ctx.failedStory?.id || "gate"} - iteration ${ctx.iteration}`
|
|
441
|
+
: undefined,
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
catch (err) {
|
|
445
|
+
lastError = err;
|
|
446
|
+
const isRetryable = err instanceof Error && (err.message.includes("429") ||
|
|
447
|
+
err.message.includes("500") ||
|
|
448
|
+
err.message.includes("502") ||
|
|
449
|
+
err.message.includes("503") ||
|
|
450
|
+
err.message.includes("rate"));
|
|
451
|
+
if (isRetryable && attempt < maxRetries) {
|
|
452
|
+
const backoffMs = 1000 * Math.pow(2, attempt); // 1s, 2s, 4s...
|
|
453
|
+
await new Promise((r) => setTimeout(r, backoffMs));
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
throw err;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
throw lastError;
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/prd/loop.ts"],"names":[],"mappings":"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"}
|
package/dist/prd/runner.d.ts
CHANGED
|
@@ -8,11 +8,8 @@ export interface RunPrdResult {
|
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
10
|
* Runs a PRD by executing story gates in dependency order.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* @param options.reportPath - If provided, writes a structured JSON report to this path
|
|
14
|
-
* @param options.checkScope - If true, validates scope constraints against git diff
|
|
15
|
-
* @param options.baseRef - Git ref to compare against for scope checking (default: "HEAD" for local, "origin/main" for CI)
|
|
11
|
+
* Independent stories (no mutual dependencies) within a level run concurrently.
|
|
12
|
+
* Stops on first failure within a level.
|
|
16
13
|
*/
|
|
17
14
|
export declare function runPrd<TId extends string>(prd: Prd<TId>, cwd?: string, options?: {
|
|
18
15
|
reportPath?: string;
|
package/dist/prd/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/prd/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAc,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAoC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/prd/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAc,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAoC,MAAM,WAAW,CAAC;AAK/E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAuOD;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,GAAG,SAAS,MAAM,EAC7C,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EACb,GAAG,GAAE,MAAsB,EAC3B,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,OAAO,CAAC,YAAY,CAAC,CA2DvB"}
|