gateproof 0.2.4 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1447 -153
- package/dist/cloudflare/index.d.ts +4 -6
- package/dist/cloudflare/index.d.ts.map +1 -1
- package/dist/cloudflare/index.js +9 -43
- package/dist/cloudflare/index.js.map +1 -1
- package/dist/index.d.ts +263 -75
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1327 -212
- package/dist/index.js.map +1 -1
- package/package.json +18 -48
- package/dist/act.d.ts +0 -78
- package/dist/act.d.ts.map +0 -1
- package/dist/act.js +0 -47
- package/dist/act.js.map +0 -1
- package/dist/action-executors.d.ts +0 -39
- package/dist/action-executors.d.ts.map +0 -1
- package/dist/action-executors.js +0 -195
- package/dist/action-executors.js.map +0 -1
- package/dist/assert.d.ts +0 -59
- package/dist/assert.d.ts.map +0 -1
- package/dist/assert.js +0 -120
- package/dist/assert.js.map +0 -1
- package/dist/authority.d.ts +0 -34
- package/dist/authority.d.ts.map +0 -1
- package/dist/authority.js +0 -141
- package/dist/authority.js.map +0 -1
- package/dist/cli/gateproof.d.ts +0 -3
- package/dist/cli/gateproof.d.ts.map +0 -1
- package/dist/cli/gateproof.js +0 -548
- package/dist/cli/gateproof.js.map +0 -1
- package/dist/cloudflare/analytics.d.ts +0 -9
- package/dist/cloudflare/analytics.d.ts.map +0 -1
- package/dist/cloudflare/analytics.js +0 -98
- package/dist/cloudflare/analytics.js.map +0 -1
- package/dist/cloudflare/cli-stream.d.ts +0 -7
- package/dist/cloudflare/cli-stream.d.ts.map +0 -1
- package/dist/cloudflare/cli-stream.js +0 -85
- package/dist/cloudflare/cli-stream.js.map +0 -1
- package/dist/cloudflare/polling-backend.d.ts +0 -18
- package/dist/cloudflare/polling-backend.d.ts.map +0 -1
- package/dist/cloudflare/polling-backend.js +0 -53
- package/dist/cloudflare/polling-backend.js.map +0 -1
- package/dist/cloudflare/workers-logs.d.ts +0 -9
- package/dist/cloudflare/workers-logs.d.ts.map +0 -1
- package/dist/cloudflare/workers-logs.js +0 -51
- package/dist/cloudflare/workers-logs.js.map +0 -1
- package/dist/constants.d.ts +0 -11
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -11
- package/dist/constants.js.map +0 -1
- package/dist/filepath-backend.d.ts +0 -64
- package/dist/filepath-backend.d.ts.map +0 -1
- package/dist/filepath-backend.js +0 -126
- package/dist/filepath-backend.js.map +0 -1
- package/dist/filepath-protocol.d.ts +0 -214
- package/dist/filepath-protocol.d.ts.map +0 -1
- package/dist/filepath-protocol.js +0 -239
- package/dist/filepath-protocol.js.map +0 -1
- package/dist/filepath-runtime.d.ts +0 -100
- package/dist/filepath-runtime.d.ts.map +0 -1
- package/dist/filepath-runtime.js +0 -190
- package/dist/filepath-runtime.js.map +0 -1
- package/dist/http-backend.d.ts +0 -32
- package/dist/http-backend.d.ts.map +0 -1
- package/dist/http-backend.js +0 -166
- package/dist/http-backend.js.map +0 -1
- package/dist/observe.d.ts +0 -26
- package/dist/observe.d.ts.map +0 -1
- package/dist/observe.js +0 -84
- package/dist/observe.js.map +0 -1
- package/dist/prd/define-prd.d.ts +0 -7
- package/dist/prd/define-prd.d.ts.map +0 -1
- package/dist/prd/define-prd.js +0 -8
- package/dist/prd/define-prd.js.map +0 -1
- package/dist/prd/index.d.ts +0 -7
- package/dist/prd/index.d.ts.map +0 -1
- package/dist/prd/index.js +0 -8
- package/dist/prd/index.js.map +0 -1
- package/dist/prd/loop.d.ts +0 -160
- package/dist/prd/loop.d.ts.map +0 -1
- package/dist/prd/loop.js +0 -462
- package/dist/prd/loop.js.map +0 -1
- package/dist/prd/runner.d.ts +0 -19
- package/dist/prd/runner.d.ts.map +0 -1
- package/dist/prd/runner.js +0 -253
- package/dist/prd/runner.js.map +0 -1
- package/dist/prd/scope-check.d.ts +0 -28
- package/dist/prd/scope-check.d.ts.map +0 -1
- package/dist/prd/scope-check.js +0 -135
- package/dist/prd/scope-check.js.map +0 -1
- package/dist/prd/scope-defaults.d.ts +0 -75
- package/dist/prd/scope-defaults.d.ts.map +0 -1
- package/dist/prd/scope-defaults.js +0 -235
- package/dist/prd/scope-defaults.js.map +0 -1
- package/dist/prd/types.d.ts +0 -101
- package/dist/prd/types.d.ts.map +0 -1
- package/dist/prd/types.js +0 -2
- package/dist/prd/types.js.map +0 -1
- package/dist/provider.d.ts +0 -6
- package/dist/provider.d.ts.map +0 -1
- package/dist/provider.js +0 -2
- package/dist/provider.js.map +0 -1
- package/dist/report.d.ts +0 -137
- package/dist/report.d.ts.map +0 -1
- package/dist/report.js +0 -234
- package/dist/report.js.map +0 -1
- package/dist/test-helpers.d.ts +0 -12
- package/dist/test-helpers.d.ts.map +0 -1
- package/dist/test-helpers.js +0 -33
- package/dist/test-helpers.js.map +0 -1
- package/dist/types.d.ts +0 -41
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils.d.ts +0 -22
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -49
- package/dist/utils.js.map +0 -1
- package/dist/validation.d.ts +0 -6
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -38
- package/dist/validation.js.map +0 -1
package/dist/prd/runner.js
DELETED
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
import { resolve } from "path";
|
|
2
|
-
import { readFileSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { serializeError } from "../report";
|
|
4
|
-
import { validateScope, getDiffStats } from "./scope-check";
|
|
5
|
-
import { flattenStoryTree, mergeAuthority } from "../authority";
|
|
6
|
-
/**
|
|
7
|
-
* Validates that all story dependencies exist and there are no cycles.
|
|
8
|
-
*/
|
|
9
|
-
function validateDependencies(stories) {
|
|
10
|
-
const byId = new Map(stories.map((s) => [s.id, s]));
|
|
11
|
-
for (const story of stories) {
|
|
12
|
-
const deps = story.dependsOn ?? [];
|
|
13
|
-
for (const depId of deps) {
|
|
14
|
-
if (!byId.has(depId)) {
|
|
15
|
-
throw new Error(`Story "${story.id}" depends on unknown story "${depId}"`);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Topologically sorts stories by their dependencies.
|
|
22
|
-
* Throws if there's a cycle or missing dependency.
|
|
23
|
-
*/
|
|
24
|
-
function orderStories(stories) {
|
|
25
|
-
validateDependencies(stories);
|
|
26
|
-
const byId = new Map(stories.map((s) => [s.id, s]));
|
|
27
|
-
const out = [];
|
|
28
|
-
const remaining = new Set(stories.map((s) => s.id));
|
|
29
|
-
const visiting = new Set();
|
|
30
|
-
function visit(id) {
|
|
31
|
-
if (visiting.has(id)) {
|
|
32
|
-
throw new Error(`PRD dependency cycle detected involving "${id}"`);
|
|
33
|
-
}
|
|
34
|
-
if (!remaining.has(id)) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
visiting.add(id);
|
|
38
|
-
const story = byId.get(id);
|
|
39
|
-
if (!story) {
|
|
40
|
-
throw new Error(`Unknown story id: ${id}`);
|
|
41
|
-
}
|
|
42
|
-
const deps = story.dependsOn ?? [];
|
|
43
|
-
for (const depId of deps) {
|
|
44
|
-
visit(depId);
|
|
45
|
-
}
|
|
46
|
-
visiting.delete(id);
|
|
47
|
-
remaining.delete(id);
|
|
48
|
-
out.push(story);
|
|
49
|
-
}
|
|
50
|
-
while (remaining.size > 0) {
|
|
51
|
-
const nextId = Array.from(remaining)[0];
|
|
52
|
-
visit(nextId);
|
|
53
|
-
}
|
|
54
|
-
return out;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Groups topologically-sorted stories into parallel "levels".
|
|
58
|
-
* Stories within a level have all their dependencies satisfied by prior levels,
|
|
59
|
-
* so they can execute concurrently.
|
|
60
|
-
*/
|
|
61
|
-
function buildLevels(stories) {
|
|
62
|
-
const ordered = orderStories(stories);
|
|
63
|
-
const levels = [];
|
|
64
|
-
const resolved = new Set();
|
|
65
|
-
while (resolved.size < ordered.length) {
|
|
66
|
-
const level = [];
|
|
67
|
-
for (const story of ordered) {
|
|
68
|
-
if (resolved.has(story.id))
|
|
69
|
-
continue;
|
|
70
|
-
const deps = story.dependsOn ?? [];
|
|
71
|
-
if (deps.every((d) => resolved.has(d))) {
|
|
72
|
-
level.push(story);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (level.length === 0) {
|
|
76
|
-
throw new Error("Unable to resolve remaining story dependencies");
|
|
77
|
-
}
|
|
78
|
-
levels.push(level);
|
|
79
|
-
for (const s of level) {
|
|
80
|
-
resolved.add(s.id);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return levels;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Loads default forbidden paths from .gateproof/scope.defaults.json
|
|
87
|
-
*/
|
|
88
|
-
function loadDefaultForbidden(cwd) {
|
|
89
|
-
try {
|
|
90
|
-
const defaultsPath = resolve(cwd, ".gateproof/scope.defaults.json");
|
|
91
|
-
const content = readFileSync(defaultsPath, "utf-8");
|
|
92
|
-
const parsed = JSON.parse(content);
|
|
93
|
-
return parsed.forbiddenPaths ?? [];
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
return [];
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Runs a single story gate and returns a typed outcome.
|
|
101
|
-
*/
|
|
102
|
-
async function runStory(story, cwd, options) {
|
|
103
|
-
const storyStartTime = Date.now();
|
|
104
|
-
try {
|
|
105
|
-
if (options.checkScope && story.scope) {
|
|
106
|
-
const diffStats = getDiffStats(options.baseRef);
|
|
107
|
-
const violations = validateScope(story, diffStats, options.defaultForbidden);
|
|
108
|
-
if (violations.length > 0) {
|
|
109
|
-
const violation = violations[0];
|
|
110
|
-
const storyError = {
|
|
111
|
-
name: "ScopeViolation",
|
|
112
|
-
message: violation.message,
|
|
113
|
-
tag: violation.category,
|
|
114
|
-
};
|
|
115
|
-
return {
|
|
116
|
-
ok: false,
|
|
117
|
-
result: {
|
|
118
|
-
id: story.id, title: story.title, gateFile: story.gateFile,
|
|
119
|
-
status: "failed", durationMs: Date.now() - storyStartTime, error: storyError,
|
|
120
|
-
},
|
|
121
|
-
story,
|
|
122
|
-
error: new Error(violation.message),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
const gatePath = resolve(cwd, story.gateFile);
|
|
127
|
-
const mod = await import(`file://${gatePath}`);
|
|
128
|
-
const run = mod.run;
|
|
129
|
-
if (typeof run !== "function") {
|
|
130
|
-
throw new Error(`Gate file must export "run" function: ${story.gateFile}`);
|
|
131
|
-
}
|
|
132
|
-
console.log(`\n--- ${story.id}: ${story.title}`);
|
|
133
|
-
const result = (await run());
|
|
134
|
-
const durationMs = Date.now() - storyStartTime;
|
|
135
|
-
// Check for positive signal if required
|
|
136
|
-
if (result.status === "success" && story.requirePositiveSignal) {
|
|
137
|
-
const evidence = result.evidence;
|
|
138
|
-
const hasPositiveSignal = (evidence?.actionsSeen && evidence.actionsSeen.length > 0) ||
|
|
139
|
-
(evidence?.stagesSeen && evidence.stagesSeen.length > 0);
|
|
140
|
-
if (!hasPositiveSignal) {
|
|
141
|
-
const storyError = {
|
|
142
|
-
name: "NoPositiveSignal",
|
|
143
|
-
message: `Story "${story.id}" requires positive signal but no actions or stages were observed`,
|
|
144
|
-
};
|
|
145
|
-
return {
|
|
146
|
-
ok: false,
|
|
147
|
-
result: {
|
|
148
|
-
id: story.id, title: story.title, gateFile: story.gateFile,
|
|
149
|
-
status: "failed", durationMs, error: storyError,
|
|
150
|
-
},
|
|
151
|
-
story,
|
|
152
|
-
error: new Error(`No positive signal observed for story "${story.id}"`),
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
if (result.status !== "success") {
|
|
157
|
-
const storyError = result.error ? serializeError(result.error) : {
|
|
158
|
-
name: "GateFailed",
|
|
159
|
-
message: `Gate failed with status: ${result.status}`,
|
|
160
|
-
};
|
|
161
|
-
return {
|
|
162
|
-
ok: false,
|
|
163
|
-
result: {
|
|
164
|
-
id: story.id, title: story.title, gateFile: story.gateFile,
|
|
165
|
-
status: result.status, durationMs, error: storyError,
|
|
166
|
-
},
|
|
167
|
-
story,
|
|
168
|
-
error: new Error(`Gate failed with status: ${result.status}`),
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
return {
|
|
172
|
-
ok: true,
|
|
173
|
-
result: {
|
|
174
|
-
id: story.id, title: story.title, gateFile: story.gateFile,
|
|
175
|
-
status: "success", durationMs,
|
|
176
|
-
},
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
catch (error) {
|
|
180
|
-
const durationMs = Date.now() - storyStartTime;
|
|
181
|
-
return {
|
|
182
|
-
ok: false,
|
|
183
|
-
result: {
|
|
184
|
-
id: story.id, title: story.title, gateFile: story.gateFile,
|
|
185
|
-
status: "failed", durationMs, error: serializeError(error),
|
|
186
|
-
},
|
|
187
|
-
story,
|
|
188
|
-
error: error instanceof Error ? error : new Error(String(error)),
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
function writeReport(reportPath, report) {
|
|
193
|
-
if (reportPath) {
|
|
194
|
-
writeFileSync(reportPath, JSON.stringify(report, null, 2));
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Runs a PRD by executing story gates in dependency order.
|
|
199
|
-
* Independent stories (no mutual dependencies) within a level run concurrently.
|
|
200
|
-
* Stops on first failure within a level.
|
|
201
|
-
*/
|
|
202
|
-
export async function runPrd(prd, cwd = process.cwd(), options = {}) {
|
|
203
|
-
// Flatten hierarchical stories (children[] → flat list with parentId)
|
|
204
|
-
// and merge authority policies from PRD defaults
|
|
205
|
-
const flatStories = flattenStoryTree(prd.stories).map((story) => ({
|
|
206
|
-
...story,
|
|
207
|
-
authority: mergeAuthority(story.authority, prd.defaultAuthority),
|
|
208
|
-
}));
|
|
209
|
-
const levels = buildLevels(flatStories);
|
|
210
|
-
const storyResults = [];
|
|
211
|
-
const startTime = Date.now();
|
|
212
|
-
const defaultForbidden = loadDefaultForbidden(cwd);
|
|
213
|
-
const baseRef = options.baseRef ?? (process.env.CI ? "origin/main" : "HEAD");
|
|
214
|
-
for (const level of levels) {
|
|
215
|
-
// Run all stories in this level concurrently
|
|
216
|
-
const outcomes = await Promise.all(level.map((story) => runStory(story, cwd, { checkScope: options.checkScope, baseRef, defaultForbidden })));
|
|
217
|
-
// Collect results from this level
|
|
218
|
-
for (const outcome of outcomes) {
|
|
219
|
-
storyResults.push(outcome.result);
|
|
220
|
-
}
|
|
221
|
-
// Check for any failures in this level
|
|
222
|
-
const firstFailure = outcomes.find((o) => !o.ok);
|
|
223
|
-
if (firstFailure && !firstFailure.ok) {
|
|
224
|
-
const report = {
|
|
225
|
-
version: "1",
|
|
226
|
-
success: false,
|
|
227
|
-
stories: storyResults,
|
|
228
|
-
failedStory: {
|
|
229
|
-
id: firstFailure.story.id,
|
|
230
|
-
title: firstFailure.story.title,
|
|
231
|
-
gateFile: firstFailure.story.gateFile,
|
|
232
|
-
},
|
|
233
|
-
totalDurationMs: Date.now() - startTime,
|
|
234
|
-
};
|
|
235
|
-
writeReport(options.reportPath, report);
|
|
236
|
-
return {
|
|
237
|
-
success: false,
|
|
238
|
-
failedStory: firstFailure.story,
|
|
239
|
-
error: firstFailure.error,
|
|
240
|
-
report,
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
const report = {
|
|
245
|
-
version: "1",
|
|
246
|
-
success: true,
|
|
247
|
-
stories: storyResults,
|
|
248
|
-
totalDurationMs: Date.now() - startTime,
|
|
249
|
-
};
|
|
250
|
-
writeReport(options.reportPath, report);
|
|
251
|
-
return { success: true, report };
|
|
252
|
-
}
|
|
253
|
-
//# sourceMappingURL=runner.js.map
|
package/dist/prd/runner.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/prd/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import type { Story } from "./types";
|
|
2
|
-
export interface ScopeViolation {
|
|
3
|
-
category: "scope_violation";
|
|
4
|
-
message: string;
|
|
5
|
-
details: {
|
|
6
|
-
storyId: string;
|
|
7
|
-
violation: "forbidden_path" | "max_files_exceeded" | "max_lines_exceeded" | "default_forbidden";
|
|
8
|
-
path?: string;
|
|
9
|
-
actualFiles?: number;
|
|
10
|
-
maxFiles?: number;
|
|
11
|
-
actualLines?: number;
|
|
12
|
-
maxLines?: number;
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
export interface DiffStats {
|
|
16
|
-
changedFiles: string[];
|
|
17
|
-
totalLines: number;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Gets git diff stats against a base ref.
|
|
21
|
-
* For CI PRs, use origin/main. For local, use HEAD or a passed ref.
|
|
22
|
-
*/
|
|
23
|
-
export declare function getDiffStats(baseRef?: string): DiffStats;
|
|
24
|
-
/**
|
|
25
|
-
* Validates that changed files match the story's scope constraints.
|
|
26
|
-
*/
|
|
27
|
-
export declare function validateScope(story: Story, diffStats: DiffStats, defaultForbidden?: string[]): ScopeViolation[];
|
|
28
|
-
//# sourceMappingURL=scope-check.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scope-check.d.ts","sourceRoot":"","sources":["../../src/prd/scope-check.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,SAAS,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,gBAAgB,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,mBAAmB,CAAC;QAChG,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,MAAe,GAAG,SAAS,CA8BhE;AAiBD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,EACpB,gBAAgB,GAAE,MAAM,EAAO,GAC9B,cAAc,EAAE,CAyFlB"}
|
package/dist/prd/scope-check.js
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { execSync } from "node:child_process";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
/**
|
|
4
|
-
* Gets git diff stats against a base ref.
|
|
5
|
-
* For CI PRs, use origin/main. For local, use HEAD or a passed ref.
|
|
6
|
-
*/
|
|
7
|
-
export function getDiffStats(baseRef = "HEAD") {
|
|
8
|
-
try {
|
|
9
|
-
const changedFiles = execSync(`git diff --name-only ${baseRef}`, {
|
|
10
|
-
encoding: "utf-8",
|
|
11
|
-
cwd: process.cwd(),
|
|
12
|
-
})
|
|
13
|
-
.trim()
|
|
14
|
-
.split("\n")
|
|
15
|
-
.filter((f) => f.length > 0);
|
|
16
|
-
let totalLines = 0;
|
|
17
|
-
if (changedFiles.length > 0) {
|
|
18
|
-
const diffStat = execSync(`git diff --shortstat ${baseRef}`, {
|
|
19
|
-
encoding: "utf-8",
|
|
20
|
-
cwd: process.cwd(),
|
|
21
|
-
}).trim();
|
|
22
|
-
const match = diffStat.match(/(\d+)\s+files? changed/);
|
|
23
|
-
if (match) {
|
|
24
|
-
const linesMatch = diffStat.match(/(\d+)\s+insertions?/);
|
|
25
|
-
const deletionsMatch = diffStat.match(/(\d+)\s+deletions?/);
|
|
26
|
-
const insertions = linesMatch ? parseInt(linesMatch[1], 10) : 0;
|
|
27
|
-
const deletions = deletionsMatch ? parseInt(deletionsMatch[1], 10) : 0;
|
|
28
|
-
totalLines = insertions + deletions;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return { changedFiles, totalLines };
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
throw new Error(`Failed to get git diff stats: ${error instanceof Error ? error.message : String(error)}`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Checks if a path matches any of the glob patterns.
|
|
39
|
-
* Simple prefix/suffix matching for now (not full glob).
|
|
40
|
-
*/
|
|
41
|
-
function matchesPattern(path, pattern) {
|
|
42
|
-
if (pattern.includes("**")) {
|
|
43
|
-
const prefix = pattern.replace(/\*\*/g, "");
|
|
44
|
-
return path.startsWith(prefix);
|
|
45
|
-
}
|
|
46
|
-
if (pattern.endsWith("*")) {
|
|
47
|
-
return path.startsWith(pattern.slice(0, -1));
|
|
48
|
-
}
|
|
49
|
-
return path === pattern;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Validates that changed files match the story's scope constraints.
|
|
53
|
-
*/
|
|
54
|
-
export function validateScope(story, diffStats, defaultForbidden = []) {
|
|
55
|
-
const violations = [];
|
|
56
|
-
const scope = story.scope;
|
|
57
|
-
if (!scope) {
|
|
58
|
-
return violations;
|
|
59
|
-
}
|
|
60
|
-
const { changedFiles, totalLines } = diffStats;
|
|
61
|
-
for (const file of changedFiles) {
|
|
62
|
-
const filePath = resolve(process.cwd(), file);
|
|
63
|
-
if (scope.forbiddenPaths) {
|
|
64
|
-
for (const forbidden of scope.forbiddenPaths) {
|
|
65
|
-
if (matchesPattern(file, forbidden)) {
|
|
66
|
-
violations.push({
|
|
67
|
-
category: "scope_violation",
|
|
68
|
-
message: `Story "${story.id}" changed forbidden path: ${file}`,
|
|
69
|
-
details: {
|
|
70
|
-
storyId: story.id,
|
|
71
|
-
violation: "forbidden_path",
|
|
72
|
-
path: file,
|
|
73
|
-
},
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
for (const forbidden of defaultForbidden) {
|
|
79
|
-
if (matchesPattern(file, forbidden)) {
|
|
80
|
-
const isAllowed = scope.allowedPaths?.some((allowed) => matchesPattern(file, allowed));
|
|
81
|
-
if (!isAllowed) {
|
|
82
|
-
violations.push({
|
|
83
|
-
category: "scope_violation",
|
|
84
|
-
message: `Story "${story.id}" changed default-forbidden path: ${file}`,
|
|
85
|
-
details: {
|
|
86
|
-
storyId: story.id,
|
|
87
|
-
violation: "default_forbidden",
|
|
88
|
-
path: file,
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
if (scope.allowedPaths && scope.allowedPaths.length > 0) {
|
|
95
|
-
const isAllowed = scope.allowedPaths.some((allowed) => matchesPattern(file, allowed));
|
|
96
|
-
if (!isAllowed) {
|
|
97
|
-
violations.push({
|
|
98
|
-
category: "scope_violation",
|
|
99
|
-
message: `Story "${story.id}" changed path outside allowed scope: ${file}`,
|
|
100
|
-
details: {
|
|
101
|
-
storyId: story.id,
|
|
102
|
-
violation: "forbidden_path",
|
|
103
|
-
path: file,
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
if (scope.maxChangedFiles !== undefined && changedFiles.length > scope.maxChangedFiles) {
|
|
110
|
-
violations.push({
|
|
111
|
-
category: "scope_violation",
|
|
112
|
-
message: `Story "${story.id}" changed ${changedFiles.length} files, max allowed: ${scope.maxChangedFiles}`,
|
|
113
|
-
details: {
|
|
114
|
-
storyId: story.id,
|
|
115
|
-
violation: "max_files_exceeded",
|
|
116
|
-
actualFiles: changedFiles.length,
|
|
117
|
-
maxFiles: scope.maxChangedFiles,
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
if (scope.maxChangedLines !== undefined && totalLines > scope.maxChangedLines) {
|
|
122
|
-
violations.push({
|
|
123
|
-
category: "scope_violation",
|
|
124
|
-
message: `Story "${story.id}" changed ${totalLines} lines, max allowed: ${scope.maxChangedLines}`,
|
|
125
|
-
details: {
|
|
126
|
-
storyId: story.id,
|
|
127
|
-
violation: "max_lines_exceeded",
|
|
128
|
-
actualLines: totalLines,
|
|
129
|
-
maxLines: scope.maxChangedLines,
|
|
130
|
-
},
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
return violations;
|
|
134
|
-
}
|
|
135
|
-
//# sourceMappingURL=scope-check.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scope-check.js","sourceRoot":"","sources":["../../src/prd/scope-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,75 +0,0 @@
|
|
|
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
|
-
/**
|
|
10
|
-
* Default forbidden paths that should never be modified by an agent.
|
|
11
|
-
*/
|
|
12
|
-
export declare const DEFAULT_FORBIDDEN_PATHS: string[];
|
|
13
|
-
/**
|
|
14
|
-
* Common source directory patterns to auto-detect.
|
|
15
|
-
*/
|
|
16
|
-
export declare const COMMON_SRC_PATTERNS: string[];
|
|
17
|
-
/**
|
|
18
|
-
* Configuration paths that should typically be allowed but carefully.
|
|
19
|
-
*/
|
|
20
|
-
export declare const CONFIG_PATHS: string[];
|
|
21
|
-
export interface InferredScopeDefaults {
|
|
22
|
-
/** Detected source directories that likely contain code to modify */
|
|
23
|
-
allowedPaths: string[];
|
|
24
|
-
/** Paths that should never be modified */
|
|
25
|
-
forbiddenPaths: string[];
|
|
26
|
-
/** Whether a monorepo structure was detected */
|
|
27
|
-
isMonorepo: boolean;
|
|
28
|
-
/** Root directories of detected workspaces (if monorepo) */
|
|
29
|
-
workspaces: string[];
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Infers sensible scope defaults based on project structure.
|
|
33
|
-
*
|
|
34
|
-
* This function analyzes the project to determine:
|
|
35
|
-
* - Which directories contain source code (allowedPaths)
|
|
36
|
-
* - Which directories should never be modified (forbiddenPaths)
|
|
37
|
-
* - Whether this is a monorepo
|
|
38
|
-
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```ts
|
|
41
|
-
* const defaults = inferScopeDefaults(process.cwd());
|
|
42
|
-
* console.log(defaults.allowedPaths);
|
|
43
|
-
* // ["src/", "app/", "components/"]
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
export declare function inferScopeDefaults(cwd?: string): InferredScopeDefaults;
|
|
47
|
-
/**
|
|
48
|
-
* Loads custom scope defaults from .gateproof/scope.defaults.json
|
|
49
|
-
*/
|
|
50
|
-
export declare function loadCustomScopeDefaults(cwd?: string): Partial<InferredScopeDefaults> | null;
|
|
51
|
-
/**
|
|
52
|
-
* Merges inferred defaults with custom overrides.
|
|
53
|
-
*/
|
|
54
|
-
export declare function getScopeDefaults(cwd?: string): InferredScopeDefaults;
|
|
55
|
-
/**
|
|
56
|
-
* Applies default scope to a story if no explicit scope is provided.
|
|
57
|
-
* Returns a new story object with scope defaults applied.
|
|
58
|
-
*
|
|
59
|
-
* Note: This is opt-in - stories without scope are not modified unless
|
|
60
|
-
* applyDefaults is called.
|
|
61
|
-
*/
|
|
62
|
-
export declare function applyDefaultScope<TId extends string>(story: {
|
|
63
|
-
id: TId;
|
|
64
|
-
scope?: {
|
|
65
|
-
allowedPaths?: string[];
|
|
66
|
-
forbiddenPaths?: string[];
|
|
67
|
-
};
|
|
68
|
-
}, defaults: InferredScopeDefaults): {
|
|
69
|
-
id: TId;
|
|
70
|
-
scope: {
|
|
71
|
-
allowedPaths: string[];
|
|
72
|
-
forbiddenPaths: string[];
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
//# sourceMappingURL=scope-defaults.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scope-defaults.d.ts","sourceRoot":"","sources":["../../src/prd/scope-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;GAEG;AACH,eAAO,MAAM,uBAAuB,UAenC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAW/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,UAWxB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,0CAA0C;IAC1C,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gDAAgD;IAChD,UAAU,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAuFD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAsB,GAAG,qBAAqB,CAmCrF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAU1G;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAsB,GAAG,qBAAqB,CAYnF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,SAAS,MAAM,EAClD,KAAK,EAAE;IAAE,EAAE,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,EAClF,QAAQ,EAAE,qBAAqB,GAC9B;IAAE,EAAE,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,CAW1E"}
|