gateproof 0.2.1 → 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 -340
- 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 +81 -5
- 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 +80 -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 +11 -3
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default scope guards for PRD stories.
|
|
3
|
+
*
|
|
4
|
+
* These provide sensible defaults for allowedPaths and forbiddenPaths
|
|
5
|
+
* to prevent agents from modifying sensitive areas by accident.
|
|
6
|
+
*
|
|
7
|
+
* All defaults are opt-in and can be overridden by explicit scope configuration.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
10
|
+
import { resolve, dirname } from "node:path";
|
|
11
|
+
/**
|
|
12
|
+
* Default forbidden paths that should never be modified by an agent.
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_FORBIDDEN_PATHS = [
|
|
15
|
+
"node_modules/",
|
|
16
|
+
".git/",
|
|
17
|
+
"dist/",
|
|
18
|
+
"build/",
|
|
19
|
+
".next/",
|
|
20
|
+
".svelte-kit/",
|
|
21
|
+
"coverage/",
|
|
22
|
+
".env",
|
|
23
|
+
".env.*",
|
|
24
|
+
"*.log",
|
|
25
|
+
"package-lock.json",
|
|
26
|
+
"yarn.lock",
|
|
27
|
+
"bun.lockb",
|
|
28
|
+
"pnpm-lock.yaml",
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Common source directory patterns to auto-detect.
|
|
32
|
+
*/
|
|
33
|
+
export const COMMON_SRC_PATTERNS = [
|
|
34
|
+
"src/",
|
|
35
|
+
"app/",
|
|
36
|
+
"components/",
|
|
37
|
+
"pages/",
|
|
38
|
+
"lib/",
|
|
39
|
+
"utils/",
|
|
40
|
+
"hooks/",
|
|
41
|
+
"routes/",
|
|
42
|
+
"api/",
|
|
43
|
+
"services/",
|
|
44
|
+
];
|
|
45
|
+
/**
|
|
46
|
+
* Configuration paths that should typically be allowed but carefully.
|
|
47
|
+
*/
|
|
48
|
+
export const CONFIG_PATHS = [
|
|
49
|
+
"package.json",
|
|
50
|
+
"tsconfig.json",
|
|
51
|
+
"vite.config.*",
|
|
52
|
+
"next.config.*",
|
|
53
|
+
"svelte.config.*",
|
|
54
|
+
"tailwind.config.*",
|
|
55
|
+
"postcss.config.*",
|
|
56
|
+
"eslint.config.*",
|
|
57
|
+
".eslintrc*",
|
|
58
|
+
".prettierrc*",
|
|
59
|
+
];
|
|
60
|
+
/**
|
|
61
|
+
* Finds the project root by looking for package.json
|
|
62
|
+
*/
|
|
63
|
+
function findProjectRoot(startDir) {
|
|
64
|
+
let dir = startDir;
|
|
65
|
+
while (dir !== "/") {
|
|
66
|
+
if (existsSync(resolve(dir, "package.json"))) {
|
|
67
|
+
return dir;
|
|
68
|
+
}
|
|
69
|
+
dir = dirname(dir);
|
|
70
|
+
}
|
|
71
|
+
return startDir;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Detects if this is a monorepo and returns workspace paths
|
|
75
|
+
*/
|
|
76
|
+
function detectWorkspaces(projectRoot) {
|
|
77
|
+
try {
|
|
78
|
+
const pkgPath = resolve(projectRoot, "package.json");
|
|
79
|
+
if (!existsSync(pkgPath))
|
|
80
|
+
return [];
|
|
81
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
82
|
+
// npm/yarn workspaces
|
|
83
|
+
if (pkg.workspaces) {
|
|
84
|
+
const workspaces = Array.isArray(pkg.workspaces)
|
|
85
|
+
? pkg.workspaces
|
|
86
|
+
: pkg.workspaces.packages ?? [];
|
|
87
|
+
// Expand simple globs like "packages/*"
|
|
88
|
+
return workspaces.flatMap((pattern) => {
|
|
89
|
+
if (pattern.includes("*")) {
|
|
90
|
+
const base = pattern.replace("/*", "").replace("/**", "");
|
|
91
|
+
const basePath = resolve(projectRoot, base);
|
|
92
|
+
if (existsSync(basePath)) {
|
|
93
|
+
try {
|
|
94
|
+
const { readdirSync, statSync } = require("node:fs");
|
|
95
|
+
return readdirSync(basePath)
|
|
96
|
+
.filter((name) => {
|
|
97
|
+
const fullPath = resolve(basePath, name);
|
|
98
|
+
return statSync(fullPath).isDirectory() && existsSync(resolve(fullPath, "package.json"));
|
|
99
|
+
})
|
|
100
|
+
.map((name) => `${base}/${name}/`);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return [base + "/"];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return [base + "/"];
|
|
107
|
+
}
|
|
108
|
+
return [pattern.endsWith("/") ? pattern : pattern + "/"];
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// pnpm workspaces
|
|
112
|
+
const pnpmWorkspace = resolve(projectRoot, "pnpm-workspace.yaml");
|
|
113
|
+
if (existsSync(pnpmWorkspace)) {
|
|
114
|
+
// Simple YAML parsing for packages field
|
|
115
|
+
const content = readFileSync(pnpmWorkspace, "utf-8");
|
|
116
|
+
const match = content.match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);
|
|
117
|
+
if (match) {
|
|
118
|
+
return match[1]
|
|
119
|
+
.split("\n")
|
|
120
|
+
.map((line) => line.replace(/^\s*-\s*/, "").trim())
|
|
121
|
+
.filter(Boolean)
|
|
122
|
+
.map((p) => p.replace("/*", "/").replace("/**", "/"));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Detects which common source directories exist in the project
|
|
133
|
+
*/
|
|
134
|
+
function detectSourceDirectories(projectRoot) {
|
|
135
|
+
return COMMON_SRC_PATTERNS.filter((pattern) => {
|
|
136
|
+
const dir = pattern.replace(/\/$/, "");
|
|
137
|
+
return existsSync(resolve(projectRoot, dir));
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Infers sensible scope defaults based on project structure.
|
|
142
|
+
*
|
|
143
|
+
* This function analyzes the project to determine:
|
|
144
|
+
* - Which directories contain source code (allowedPaths)
|
|
145
|
+
* - Which directories should never be modified (forbiddenPaths)
|
|
146
|
+
* - Whether this is a monorepo
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```ts
|
|
150
|
+
* const defaults = inferScopeDefaults(process.cwd());
|
|
151
|
+
* console.log(defaults.allowedPaths);
|
|
152
|
+
* // ["src/", "app/", "components/"]
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
export function inferScopeDefaults(cwd = process.cwd()) {
|
|
156
|
+
const projectRoot = findProjectRoot(cwd);
|
|
157
|
+
const workspaces = detectWorkspaces(projectRoot);
|
|
158
|
+
const isMonorepo = workspaces.length > 0;
|
|
159
|
+
let allowedPaths;
|
|
160
|
+
if (isMonorepo) {
|
|
161
|
+
// For monorepos, allow workspace directories
|
|
162
|
+
allowedPaths = workspaces;
|
|
163
|
+
// Also add common patterns within workspaces
|
|
164
|
+
for (const workspace of workspaces) {
|
|
165
|
+
const workspacePath = resolve(projectRoot, workspace);
|
|
166
|
+
const srcDirs = detectSourceDirectories(workspacePath);
|
|
167
|
+
for (const src of srcDirs) {
|
|
168
|
+
allowedPaths.push(`${workspace}${src}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// For single-package projects, detect source directories
|
|
174
|
+
allowedPaths = detectSourceDirectories(projectRoot);
|
|
175
|
+
// If no common directories found, allow most non-forbidden paths
|
|
176
|
+
if (allowedPaths.length === 0) {
|
|
177
|
+
allowedPaths = ["./"];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
allowedPaths,
|
|
182
|
+
forbiddenPaths: [...DEFAULT_FORBIDDEN_PATHS],
|
|
183
|
+
isMonorepo,
|
|
184
|
+
workspaces,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Loads custom scope defaults from .gateproof/scope.defaults.json
|
|
189
|
+
*/
|
|
190
|
+
export function loadCustomScopeDefaults(cwd = process.cwd()) {
|
|
191
|
+
try {
|
|
192
|
+
const defaultsPath = resolve(cwd, ".gateproof/scope.defaults.json");
|
|
193
|
+
if (!existsSync(defaultsPath))
|
|
194
|
+
return null;
|
|
195
|
+
const content = readFileSync(defaultsPath, "utf-8");
|
|
196
|
+
return JSON.parse(content);
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
return null;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Merges inferred defaults with custom overrides.
|
|
204
|
+
*/
|
|
205
|
+
export function getScopeDefaults(cwd = process.cwd()) {
|
|
206
|
+
const inferred = inferScopeDefaults(cwd);
|
|
207
|
+
const custom = loadCustomScopeDefaults(cwd);
|
|
208
|
+
if (!custom)
|
|
209
|
+
return inferred;
|
|
210
|
+
return {
|
|
211
|
+
allowedPaths: custom.allowedPaths ?? inferred.allowedPaths,
|
|
212
|
+
forbiddenPaths: custom.forbiddenPaths ?? inferred.forbiddenPaths,
|
|
213
|
+
isMonorepo: custom.isMonorepo ?? inferred.isMonorepo,
|
|
214
|
+
workspaces: custom.workspaces ?? inferred.workspaces,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Applies default scope to a story if no explicit scope is provided.
|
|
219
|
+
* Returns a new story object with scope defaults applied.
|
|
220
|
+
*
|
|
221
|
+
* Note: This is opt-in - stories without scope are not modified unless
|
|
222
|
+
* applyDefaults is called.
|
|
223
|
+
*/
|
|
224
|
+
export function applyDefaultScope(story, defaults) {
|
|
225
|
+
const existingScope = story.scope ?? {};
|
|
226
|
+
return {
|
|
227
|
+
...story,
|
|
228
|
+
scope: {
|
|
229
|
+
allowedPaths: existingScope.allowedPaths ?? defaults.allowedPaths,
|
|
230
|
+
forbiddenPaths: existingScope.forbiddenPaths ?? defaults.forbiddenPaths,
|
|
231
|
+
...existingScope,
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=scope-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-defaults.js","sourceRoot":"","sources":["../../src/prd/scope-defaults.ts"],"names":[],"mappings":"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"}
|
package/dist/prd/types.d.ts
CHANGED
|
@@ -10,9 +10,89 @@ export type Story<TId extends string = string> = {
|
|
|
10
10
|
gateFile: string;
|
|
11
11
|
dependsOn?: TId[];
|
|
12
12
|
scope?: StoryScope;
|
|
13
|
+
progress?: string[];
|
|
14
|
+
/**
|
|
15
|
+
* When true, auto-fail the gate if no positive evidence is collected.
|
|
16
|
+
* Positive evidence means at least one log with an action or stage field.
|
|
17
|
+
* Default: false (for backward compatibility).
|
|
18
|
+
*/
|
|
19
|
+
requirePositiveSignal?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Parent story ID — creates a tree of stories.
|
|
22
|
+
* Mirrors Filepath's agent_node parentId pattern.
|
|
23
|
+
* A story with a parentId is a child/sub-task of the parent story.
|
|
24
|
+
*/
|
|
25
|
+
parentId?: TId;
|
|
26
|
+
/**
|
|
27
|
+
* Inline child stories — alternative to parentId for defining
|
|
28
|
+
* the tree declaratively. Children inherit parent scope unless overridden.
|
|
29
|
+
*/
|
|
30
|
+
children?: Story<TId>[];
|
|
31
|
+
/**
|
|
32
|
+
* Authority policy for this story — who/what can execute it,
|
|
33
|
+
* what tools are allowed, what scope restrictions apply.
|
|
34
|
+
*/
|
|
35
|
+
authority?: StoryAuthority;
|
|
13
36
|
};
|
|
37
|
+
/**
|
|
38
|
+
* Authority policy for a story — governance surface.
|
|
39
|
+
*
|
|
40
|
+
* Controls what an agent can do when executing this story's gate.
|
|
41
|
+
* Think of it as the "permissions" for the story's execution context.
|
|
42
|
+
*/
|
|
43
|
+
export interface StoryAuthority {
|
|
44
|
+
/**
|
|
45
|
+
* Which agent runtimes are allowed to execute this story.
|
|
46
|
+
* Empty array or undefined means any agent can run it.
|
|
47
|
+
*/
|
|
48
|
+
allowedAgents?: string[];
|
|
49
|
+
/**
|
|
50
|
+
* Which models are allowed for agent execution.
|
|
51
|
+
* Undefined means any model is acceptable.
|
|
52
|
+
*/
|
|
53
|
+
allowedModels?: string[];
|
|
54
|
+
/**
|
|
55
|
+
* Maximum number of child agents this story can spawn.
|
|
56
|
+
* Prevents runaway agent trees. Default: 0 (no spawning).
|
|
57
|
+
*/
|
|
58
|
+
maxChildAgents?: number;
|
|
59
|
+
/**
|
|
60
|
+
* Maximum wall-clock time for the story's gate in ms.
|
|
61
|
+
* Overrides the gate-level timeout.
|
|
62
|
+
*/
|
|
63
|
+
maxDurationMs?: number;
|
|
64
|
+
/**
|
|
65
|
+
* Whether the agent can make git commits.
|
|
66
|
+
* Default: true for agent-executed stories.
|
|
67
|
+
*/
|
|
68
|
+
canCommit?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Whether the agent can spawn child agents.
|
|
71
|
+
* Default: false — must be explicitly enabled.
|
|
72
|
+
*/
|
|
73
|
+
canSpawn?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Allowed tool names for the agent (Filepath ToolEvent names).
|
|
76
|
+
* Undefined means all tools are allowed.
|
|
77
|
+
*/
|
|
78
|
+
allowedTools?: string[];
|
|
79
|
+
/**
|
|
80
|
+
* Forbidden tool names — takes precedence over allowedTools.
|
|
81
|
+
*/
|
|
82
|
+
forbiddenTools?: string[];
|
|
83
|
+
/**
|
|
84
|
+
* Human approval required before executing this story.
|
|
85
|
+
* When true, the gate will not run until explicitly approved.
|
|
86
|
+
*/
|
|
87
|
+
requiresApproval?: boolean;
|
|
88
|
+
}
|
|
14
89
|
export type Prd<TId extends string = string> = {
|
|
15
90
|
stories: readonly Story<TId>[];
|
|
91
|
+
/**
|
|
92
|
+
* Default authority policy applied to all stories in this PRD.
|
|
93
|
+
* Individual story authority settings override these defaults.
|
|
94
|
+
*/
|
|
95
|
+
defaultAuthority?: StoryAuthority;
|
|
16
96
|
};
|
|
17
97
|
export type GateResult = {
|
|
18
98
|
status: "success" | "failed" | "timeout";
|
package/dist/prd/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prd/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,KAAK,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,IAAI;IAC/C,EAAE,EAAE,GAAG,CAAC;IACR,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/prd/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,KAAK,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,IAAI;IAC/C,EAAE,EAAE,GAAG,CAAC;IACR,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAIhC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC;IAEf;;;OAGG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IAIxB;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAEzB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,MAAM,GAAG,MAAM,IAAI;IAC7C,OAAO,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IAE/B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,cAAc,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC"}
|
package/dist/report.d.ts
CHANGED
|
@@ -64,4 +64,74 @@ export declare function toGateResultV1(result: {
|
|
|
64
64
|
};
|
|
65
65
|
error?: Error | unknown;
|
|
66
66
|
}): GateResultV1;
|
|
67
|
+
/**
|
|
68
|
+
* LLM-friendly failure summary for agents.
|
|
69
|
+
* Provides structured, actionable information about what failed and why.
|
|
70
|
+
*/
|
|
71
|
+
export interface LLMFailureSummary {
|
|
72
|
+
/** Short summary of what went wrong */
|
|
73
|
+
summary: string;
|
|
74
|
+
/** The specific assertions that failed */
|
|
75
|
+
failedAssertions: Array<{
|
|
76
|
+
name: string;
|
|
77
|
+
message: string;
|
|
78
|
+
expected?: string;
|
|
79
|
+
actual?: string;
|
|
80
|
+
}>;
|
|
81
|
+
/** Relevant slice of the PRD (story details) */
|
|
82
|
+
prdRelevantSlice?: {
|
|
83
|
+
storyId: string;
|
|
84
|
+
storyTitle: string;
|
|
85
|
+
gateFile: string;
|
|
86
|
+
scope?: {
|
|
87
|
+
allowedPaths?: string[];
|
|
88
|
+
forbiddenPaths?: string[];
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
/** Evidence from the gate run */
|
|
92
|
+
evidence: {
|
|
93
|
+
actionsSeen: string[];
|
|
94
|
+
stagesSeen: string[];
|
|
95
|
+
errorTags: string[];
|
|
96
|
+
logCount: number;
|
|
97
|
+
};
|
|
98
|
+
/** Recent diff snippet (truncated) */
|
|
99
|
+
diffSnippet?: string;
|
|
100
|
+
/** Suggested next steps */
|
|
101
|
+
suggestions: string[];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Creates an LLM-friendly failure summary from a PRD report.
|
|
105
|
+
*
|
|
106
|
+
* This format is optimized for AI agents to understand:
|
|
107
|
+
* - What failed (specific assertions)
|
|
108
|
+
* - Why it failed (evidence from logs)
|
|
109
|
+
* - What to fix (suggestions)
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```ts
|
|
113
|
+
* const summary = createLLMFailureSummary(report, {
|
|
114
|
+
* diffSnippet: gitDiffOutput,
|
|
115
|
+
* });
|
|
116
|
+
* console.log(JSON.stringify(summary, null, 2));
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
export declare function createLLMFailureSummary(report: PrdReportV1, options?: {
|
|
120
|
+
prdSlice?: {
|
|
121
|
+
storyId: string;
|
|
122
|
+
storyTitle: string;
|
|
123
|
+
gateFile: string;
|
|
124
|
+
scope?: {
|
|
125
|
+
allowedPaths?: string[];
|
|
126
|
+
forbiddenPaths?: string[];
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
diffSnippet?: string;
|
|
130
|
+
logs?: unknown[];
|
|
131
|
+
}): LLMFailureSummary;
|
|
132
|
+
/**
|
|
133
|
+
* Formats an LLM failure summary as a string block.
|
|
134
|
+
* Useful for including in prompts or console output.
|
|
135
|
+
*/
|
|
136
|
+
export declare function formatLLMFailureSummary(summary: LLMFailureSummary): string;
|
|
67
137
|
//# sourceMappingURL=report.d.ts.map
|
package/dist/report.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAwBhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAElD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;CACzB,GAAG,YAAY,CASf"}
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
package/dist/report.js
CHANGED
|
@@ -48,4 +48,187 @@ export function toGateResultV1(result) {
|
|
|
48
48
|
error: result.error ? serializeError(result.error) : undefined,
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Creates an LLM-friendly failure summary from a PRD report.
|
|
53
|
+
*
|
|
54
|
+
* This format is optimized for AI agents to understand:
|
|
55
|
+
* - What failed (specific assertions)
|
|
56
|
+
* - Why it failed (evidence from logs)
|
|
57
|
+
* - What to fix (suggestions)
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* const summary = createLLMFailureSummary(report, {
|
|
62
|
+
* diffSnippet: gitDiffOutput,
|
|
63
|
+
* });
|
|
64
|
+
* console.log(JSON.stringify(summary, null, 2));
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export function createLLMFailureSummary(report, options) {
|
|
68
|
+
const failedStory = report.failedStory;
|
|
69
|
+
const failedResult = report.stories.find((s) => s.id === failedStory?.id);
|
|
70
|
+
const failedAssertions = [];
|
|
71
|
+
const suggestions = [];
|
|
72
|
+
// Parse error to extract assertion details
|
|
73
|
+
if (failedResult?.error) {
|
|
74
|
+
const err = failedResult.error;
|
|
75
|
+
if (err.tag === "AssertionFailed" || err.name === "AssertionFailed") {
|
|
76
|
+
const match = err.message.match(/(\w+):\s*(.+)/);
|
|
77
|
+
if (match) {
|
|
78
|
+
failedAssertions.push({
|
|
79
|
+
name: match[1],
|
|
80
|
+
message: match[2],
|
|
81
|
+
});
|
|
82
|
+
// Add specific suggestions based on assertion type
|
|
83
|
+
if (match[1] === "HasAction") {
|
|
84
|
+
suggestions.push(`Ensure the code logs an action named "${match[2].replace("missing ", "").replace(/'/g, "")}"`);
|
|
85
|
+
suggestions.push("Check if the relevant code path is being executed");
|
|
86
|
+
}
|
|
87
|
+
else if (match[1] === "NoErrors") {
|
|
88
|
+
suggestions.push("Fix the error indicated in the logs");
|
|
89
|
+
suggestions.push("Check error handling in the relevant code");
|
|
90
|
+
}
|
|
91
|
+
else if (match[1] === "HasStage") {
|
|
92
|
+
suggestions.push(`Ensure a stage named "${match[2].replace("missing ", "").replace(/'/g, "")}" is logged`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
failedAssertions.push({
|
|
97
|
+
name: err.name || "Unknown",
|
|
98
|
+
message: err.message,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (err.tag === "NoPositiveSignal" || err.name === "NoPositiveSignal") {
|
|
103
|
+
failedAssertions.push({
|
|
104
|
+
name: "NoPositiveSignal",
|
|
105
|
+
message: "No actions or stages were observed in logs",
|
|
106
|
+
});
|
|
107
|
+
suggestions.push("Ensure the code is logging actions or stages");
|
|
108
|
+
suggestions.push("Check if the observe resource is configured correctly");
|
|
109
|
+
}
|
|
110
|
+
else if (err.tag === "ScopeViolation" || err.name === "ScopeViolation") {
|
|
111
|
+
failedAssertions.push({
|
|
112
|
+
name: "ScopeViolation",
|
|
113
|
+
message: err.message,
|
|
114
|
+
});
|
|
115
|
+
suggestions.push("Restrict changes to files within allowedPaths");
|
|
116
|
+
suggestions.push("Avoid modifying files in forbiddenPaths");
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
failedAssertions.push({
|
|
120
|
+
name: err.name || "Error",
|
|
121
|
+
message: err.message,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Build summary
|
|
126
|
+
let summary = "Gate failed";
|
|
127
|
+
if (failedStory) {
|
|
128
|
+
summary = `Gate "${failedStory.id}" failed`;
|
|
129
|
+
}
|
|
130
|
+
if (failedResult?.error) {
|
|
131
|
+
summary += `: ${failedResult.error.message}`;
|
|
132
|
+
}
|
|
133
|
+
// Extract evidence from logs if available
|
|
134
|
+
const logs = options?.logs ?? [];
|
|
135
|
+
const evidence = {
|
|
136
|
+
actionsSeen: [],
|
|
137
|
+
stagesSeen: [],
|
|
138
|
+
errorTags: [],
|
|
139
|
+
logCount: logs.length,
|
|
140
|
+
};
|
|
141
|
+
for (const log of logs) {
|
|
142
|
+
if (log && typeof log === "object") {
|
|
143
|
+
const l = log;
|
|
144
|
+
if (l.action && typeof l.action === "string") {
|
|
145
|
+
if (!evidence.actionsSeen.includes(l.action)) {
|
|
146
|
+
evidence.actionsSeen.push(l.action);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (l.stage && typeof l.stage === "string") {
|
|
150
|
+
if (!evidence.stagesSeen.includes(l.stage)) {
|
|
151
|
+
evidence.stagesSeen.push(l.stage);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (l.error && typeof l.error === "object") {
|
|
155
|
+
const err = l.error;
|
|
156
|
+
if (err.tag && typeof err.tag === "string") {
|
|
157
|
+
if (!evidence.errorTags.includes(err.tag)) {
|
|
158
|
+
evidence.errorTags.push(err.tag);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Add default suggestions if none
|
|
165
|
+
if (suggestions.length === 0) {
|
|
166
|
+
suggestions.push("Read the gate file to understand expected behavior");
|
|
167
|
+
suggestions.push("Check if all required actions are being logged");
|
|
168
|
+
suggestions.push("Verify the observe resource is receiving logs");
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
summary,
|
|
172
|
+
failedAssertions,
|
|
173
|
+
prdRelevantSlice: options?.prdSlice ?? (failedStory ? {
|
|
174
|
+
storyId: failedStory.id,
|
|
175
|
+
storyTitle: failedStory.title,
|
|
176
|
+
gateFile: failedStory.gateFile,
|
|
177
|
+
} : undefined),
|
|
178
|
+
evidence,
|
|
179
|
+
diffSnippet: options?.diffSnippet,
|
|
180
|
+
suggestions,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Formats an LLM failure summary as a string block.
|
|
185
|
+
* Useful for including in prompts or console output.
|
|
186
|
+
*/
|
|
187
|
+
export function formatLLMFailureSummary(summary) {
|
|
188
|
+
const lines = [
|
|
189
|
+
"=== GATEPROOF FAILURE SUMMARY (LLM-FRIENDLY) ===",
|
|
190
|
+
"",
|
|
191
|
+
`Summary: ${summary.summary}`,
|
|
192
|
+
"",
|
|
193
|
+
];
|
|
194
|
+
if (summary.prdRelevantSlice) {
|
|
195
|
+
lines.push("PRD Context:");
|
|
196
|
+
lines.push(` Story: ${summary.prdRelevantSlice.storyId}`);
|
|
197
|
+
lines.push(` Title: ${summary.prdRelevantSlice.storyTitle}`);
|
|
198
|
+
lines.push(` Gate: ${summary.prdRelevantSlice.gateFile}`);
|
|
199
|
+
if (summary.prdRelevantSlice.scope?.allowedPaths) {
|
|
200
|
+
lines.push(` Allowed paths: ${summary.prdRelevantSlice.scope.allowedPaths.join(", ")}`);
|
|
201
|
+
}
|
|
202
|
+
lines.push("");
|
|
203
|
+
}
|
|
204
|
+
if (summary.failedAssertions.length > 0) {
|
|
205
|
+
lines.push("Failed Assertions:");
|
|
206
|
+
for (const assertion of summary.failedAssertions) {
|
|
207
|
+
lines.push(` - ${assertion.name}: ${assertion.message}`);
|
|
208
|
+
if (assertion.expected)
|
|
209
|
+
lines.push(` Expected: ${assertion.expected}`);
|
|
210
|
+
if (assertion.actual)
|
|
211
|
+
lines.push(` Actual: ${assertion.actual}`);
|
|
212
|
+
}
|
|
213
|
+
lines.push("");
|
|
214
|
+
}
|
|
215
|
+
lines.push("Evidence:");
|
|
216
|
+
lines.push(` Actions seen: ${summary.evidence.actionsSeen.join(", ") || "(none)"}`);
|
|
217
|
+
lines.push(` Stages seen: ${summary.evidence.stagesSeen.join(", ") || "(none)"}`);
|
|
218
|
+
lines.push(` Error tags: ${summary.evidence.errorTags.join(", ") || "(none)"}`);
|
|
219
|
+
lines.push(` Log count: ${summary.evidence.logCount}`);
|
|
220
|
+
lines.push("");
|
|
221
|
+
if (summary.diffSnippet) {
|
|
222
|
+
lines.push("Recent Diff:");
|
|
223
|
+
lines.push(summary.diffSnippet.split("\n").slice(0, 20).join("\n"));
|
|
224
|
+
lines.push("");
|
|
225
|
+
}
|
|
226
|
+
lines.push("Suggestions:");
|
|
227
|
+
for (const suggestion of summary.suggestions) {
|
|
228
|
+
lines.push(` - ${suggestion}`);
|
|
229
|
+
}
|
|
230
|
+
lines.push("");
|
|
231
|
+
lines.push("=== END FAILURE SUMMARY ===");
|
|
232
|
+
return lines.join("\n");
|
|
233
|
+
}
|
|
51
234
|
//# sourceMappingURL=report.js.map
|
package/dist/report.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4CH;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,KAAkC,CAAC;QACxD,OAAO;YACL,GAAG,EAAE,YAAY,CAAC,IAAI;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO;YAC3B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;YACvC,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,KAAiE,CAAC;QACjF,OAAO;YACL,GAAG,EAAE,MAAM,CAAC,IAAI;YAChB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;SACzC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;KACvB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAI,GAAQ;IAC3C,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAW9B;IACC,OAAO;QACL,OAAO,EAAE,GAAG;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;KAC/D,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|