gateproof 0.2.0 → 0.2.1

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 CHANGED
@@ -28,6 +28,48 @@ gateproof **executes gates**. It does not define intent, plans, or workflows. A
28
28
 
29
29
  gateproof never decides *what* to build. It returns results; your CI/CD decides whether you are allowed to proceed.
30
30
 
31
+ ## Agent skill: prdts-maker
32
+
33
+ This repo is agent-first. Use the `prdts-maker` skill to turn story bullets into a working `prd.ts`.
34
+
35
+ **How to use it:**
36
+ - Provide story bullets + dependencies in plain language.
37
+ - Ask the agent to run the `prdts-maker` skill and output a complete `prd.ts`.
38
+ - Save and run: `bun run prd.ts`.
39
+
40
+ **Example prompt:**
41
+ ```text
42
+ @prdts-maker Create prd.ts for:
43
+ - User can sign up
44
+ - Email verification works (depends on signup)
45
+ - User can log in (depends on verification)
46
+ Include gate files under ./gates/.
47
+ ```
48
+
49
+ ## CLI: npx gateproof prdts
50
+
51
+ Generate a `prd.ts` from story bullets without opening the repo.
52
+
53
+ ```bash
54
+ echo "User can sign up\nEmail verification works (depends on signup)" | npx gateproof prdts --stdout
55
+ npx gateproof prdts --in stories.txt --out prd.ts
56
+ ```
57
+
58
+ This calls Opencode directly. Set `OPENCODE_ZEN_API_KEY` (or pass `--api-key`).
59
+
60
+ Paste mode (interactive stdin):
61
+
62
+ ```bash
63
+ npx gateproof prdts
64
+ # paste stories, then Ctrl-D
65
+ ```
66
+
67
+ To target a different Opencode base URL or model:
68
+
69
+ ```bash
70
+ npx gateproof prdts --endpoint https://opencode.ai/zen/v1 --model big-pickle --in stories.txt --out prd.ts
71
+ ```
72
+
31
73
  ## Agent Iterations: The Loop
32
74
 
33
75
  The core innovation: agents work from PRD only, gates verify, iterate until correct.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=gateproof.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateproof.d.ts","sourceRoot":"","sources":["../../src/cli/gateproof.ts"],"names":[],"mappings":""}
@@ -0,0 +1,472 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync } from "node:fs";
3
+ import { readFile, writeFile } from "node:fs/promises";
4
+ import { stdin, stdout } from "node:process";
5
+ function printHelp() {
6
+ const text = [
7
+ "gateproof",
8
+ "",
9
+ "Subcommands:",
10
+ " prdts Generate a prd.ts from story descriptions",
11
+ "",
12
+ "Usage:",
13
+ " npx gateproof prdts --in stories.txt --out prd.ts",
14
+ " echo \"User can sign up\" | npx gateproof prdts --stdout",
15
+ "",
16
+ "Options (prdts):",
17
+ " -i, --in <path> Input file with one story per line",
18
+ " -o, --out <path> Output file path (default: ./prd.ts)",
19
+ " --stdout Print the generated prd.ts to stdout",
20
+ " --endpoint <url> API base URL (default: https://opencode.ai/zen/v1)",
21
+ " --model <id> Model id (default: big-pickle)",
22
+ " --api-key <key> API key (or set OPENCODE_ZEN_API_KEY)",
23
+ " --overwrite Overwrite output file if it exists",
24
+ " -h, --help Show help",
25
+ ].join("\n");
26
+ stdout.write(`${text}\n`);
27
+ }
28
+ function parseArgs(argv) {
29
+ const args = {
30
+ endpoint: "https://opencode.ai/zen/v1",
31
+ model: "big-pickle",
32
+ stdout: false,
33
+ overwrite: false,
34
+ };
35
+ if (argv.length > 0 && !argv[0].startsWith("-")) {
36
+ args.subcommand = argv.shift();
37
+ }
38
+ for (let i = 0; i < argv.length; i++) {
39
+ const arg = argv[i];
40
+ switch (arg) {
41
+ case "--in":
42
+ case "-i":
43
+ args.inputPath = argv[++i];
44
+ break;
45
+ case "--out":
46
+ case "-o":
47
+ args.outputPath = argv[++i];
48
+ break;
49
+ case "--endpoint":
50
+ args.endpoint = argv[++i];
51
+ break;
52
+ case "--model":
53
+ args.model = argv[++i];
54
+ break;
55
+ case "--api-key":
56
+ args.apiKey = argv[++i];
57
+ break;
58
+ case "--stdout":
59
+ args.stdout = true;
60
+ break;
61
+ case "--overwrite":
62
+ args.overwrite = true;
63
+ break;
64
+ case "--help":
65
+ case "-h":
66
+ printHelp();
67
+ process.exit(0);
68
+ default:
69
+ if (arg && arg.startsWith("-")) {
70
+ throw new Error(`Unknown flag: ${arg}`);
71
+ }
72
+ }
73
+ }
74
+ return args;
75
+ }
76
+ async function readStdin() {
77
+ return new Promise((resolve, reject) => {
78
+ let data = "";
79
+ stdin.setEncoding("utf8");
80
+ stdin.on("data", (chunk) => {
81
+ data += chunk;
82
+ });
83
+ stdin.on("end", () => resolve(data));
84
+ stdin.on("error", reject);
85
+ });
86
+ }
87
+ async function getDescriptions(inputPath) {
88
+ if (inputPath) {
89
+ return readFile(inputPath, "utf8");
90
+ }
91
+ if (stdin.isTTY) {
92
+ process.stderr.write("Paste story descriptions, then press Ctrl-D.\n");
93
+ }
94
+ return readStdin();
95
+ }
96
+ function stripCodeFences(text) {
97
+ return text.replace(/```(?:json|ts|typescript)?/g, "").replace(/```/g, "").trim();
98
+ }
99
+ function extractJson(text) {
100
+ const cleaned = stripCodeFences(text);
101
+ try {
102
+ return JSON.parse(cleaned);
103
+ }
104
+ catch {
105
+ // Try to extract the first JSON object or array.
106
+ const objectStart = cleaned.indexOf("{");
107
+ const objectEnd = cleaned.lastIndexOf("}");
108
+ if (objectStart !== -1 && objectEnd !== -1 && objectEnd > objectStart) {
109
+ try {
110
+ return JSON.parse(cleaned.slice(objectStart, objectEnd + 1));
111
+ }
112
+ catch {
113
+ // continue
114
+ }
115
+ }
116
+ const arrayStart = cleaned.indexOf("[");
117
+ const arrayEnd = cleaned.lastIndexOf("]");
118
+ if (arrayStart !== -1 && arrayEnd !== -1 && arrayEnd > arrayStart) {
119
+ return JSON.parse(cleaned.slice(arrayStart, arrayEnd + 1));
120
+ }
121
+ throw new Error("Model response did not contain valid JSON.");
122
+ }
123
+ }
124
+ function normalizePrd(input) {
125
+ if (Array.isArray(input)) {
126
+ return { stories: input };
127
+ }
128
+ if (input && typeof input === "object" && "prd" in input) {
129
+ const prdValue = input.prd;
130
+ if (prdValue && typeof prdValue === "object") {
131
+ return prdValue;
132
+ }
133
+ }
134
+ if (!input || typeof input !== "object")
135
+ return input;
136
+ const root = input;
137
+ if (!Array.isArray(root.stories))
138
+ return input;
139
+ const normalizedStories = root.stories.map((story) => {
140
+ if (!story || typeof story !== "object")
141
+ return story;
142
+ const s = story;
143
+ const gateImplementation = s.gateImplementation ?? s.gateImplementationCode ?? s.gateImplementation_code;
144
+ const dependsOn = s.dependsOn ?? s.depends_on;
145
+ return {
146
+ ...s,
147
+ gateImplementation,
148
+ dependsOn,
149
+ };
150
+ });
151
+ return { ...root, stories: normalizedStories };
152
+ }
153
+ function coercePrd(input) {
154
+ const normalized = normalizePrd(input);
155
+ if (!normalized || typeof normalized !== "object") {
156
+ throw new Error("PRD output must be an object.");
157
+ }
158
+ const storiesValue = normalized.stories;
159
+ if (!Array.isArray(storiesValue)) {
160
+ throw new Error("PRD output must include stories[].");
161
+ }
162
+ const stories = storiesValue.map((story, index) => {
163
+ if (!story || typeof story !== "object") {
164
+ throw new Error(`stories[${index}] must be an object.`);
165
+ }
166
+ const s = story;
167
+ const id = s.id;
168
+ const title = s.title;
169
+ const gateImplementation = s.gateImplementation;
170
+ const dependsOn = s.dependsOn;
171
+ if (typeof id !== "string" || id.length === 0) {
172
+ throw new Error(`stories[${index}].id must be a non-empty string.`);
173
+ }
174
+ if (typeof title !== "string" || title.length === 0) {
175
+ throw new Error(`stories[${index}].title must be a non-empty string.`);
176
+ }
177
+ let code;
178
+ if (typeof gateImplementation === "string") {
179
+ code = gateImplementation;
180
+ }
181
+ else if (gateImplementation && typeof gateImplementation === "object") {
182
+ const codeValue = gateImplementation.code;
183
+ if (typeof codeValue === "string")
184
+ code = codeValue;
185
+ }
186
+ if (!code) {
187
+ throw new Error(`stories[${index}].gateImplementation.code must be a string.`);
188
+ }
189
+ let dependsOnArray;
190
+ if (dependsOn !== undefined) {
191
+ if (!Array.isArray(dependsOn)) {
192
+ throw new Error(`stories[${index}].dependsOn must be an array of strings.`);
193
+ }
194
+ for (const dep of dependsOn) {
195
+ if (typeof dep !== "string" || dep.length === 0) {
196
+ throw new Error(`stories[${index}].dependsOn must be an array of strings.`);
197
+ }
198
+ }
199
+ dependsOnArray = dependsOn;
200
+ }
201
+ return {
202
+ id,
203
+ title,
204
+ gateImplementation: { code },
205
+ ...(dependsOnArray ? { dependsOn: dependsOnArray } : {}),
206
+ };
207
+ });
208
+ return { stories };
209
+ }
210
+ function buildPrompt(descriptions) {
211
+ return `Transform the following story descriptions into a structured PRD object with inline gate implementations.
212
+
213
+ Story descriptions:
214
+ ${descriptions}
215
+
216
+ Requirements:
217
+ 1. Generate kebab-case IDs for each story (e.g., "user-signup", "email-verification")
218
+ 2. Create clear, descriptive titles
219
+ 3. For each story, generate a complete gate implementation in the gateImplementation.code field
220
+ 4. Gate implementations should:
221
+ - Use createHttpObserveResource or createEmptyObserveResource for observation
222
+ - Include appropriate Act actions (Act.wait, Act.browser, etc.)
223
+ - Include Assert.custom or Assert.noErrors assertions
224
+ - Be self-contained and runnable
225
+ - Match the story's intent (e.g., if story is about API health, gate should check API endpoint)
226
+ 5. Infer dependencies from story descriptions (e.g., if a story mentions "depends on signup", add "user-signup" to dependsOn)
227
+ 6. If dependencies are mentioned in natural language, map them to the appropriate story IDs
228
+
229
+ For gate implementations, use this EXACT pattern (return the gate spec directly):
230
+ \`\`\`
231
+ import { Gate, Act, Assert, createHttpObserveResource, createEmptyObserveResource } from "gateproof";
232
+
233
+ export function run() {
234
+ return {
235
+ name: "story-id",
236
+ observe: createHttpObserveResource({ url: API_URL + "/endpoint", pollInterval: 500 }),
237
+ act: [Act.wait(500)],
238
+ assert: [
239
+ Assert.custom("check_name", async (logs) => {
240
+ const httpLog = logs.find(l => l.stage === "http");
241
+ return httpLog?.status === "success";
242
+ })
243
+ ],
244
+ stop: { idleMs: 1000, maxMs: 10000 }
245
+ };
246
+ }
247
+ \`\`\`
248
+
249
+ IMPORTANT: The gateImplementation.code field must contain COMPLETE, runnable TypeScript code that:
250
+ - Imports necessary functions from "gateproof"
251
+ - Exports a function called "run" that returns a gate spec object
252
+ - Uses the configuration variables (API_URL, TEST_URL) defined at the top
253
+ - Includes proper assertions that match the story's intent
254
+
255
+ Return ONLY JSON in this shape (no markdown):
256
+ {
257
+ "stories": [
258
+ {
259
+ "id": "story-id",
260
+ "title": "Story title",
261
+ "gateImplementation": { "code": "TypeScript code string" },
262
+ "dependsOn": ["optional-story-id"]
263
+ }
264
+ ]
265
+ }`;
266
+ }
267
+ async function requestPrd(endpoint, model, apiKey, descriptions) {
268
+ const response = await fetch(`${endpoint.replace(/\/$/, "")}/chat/completions`, {
269
+ method: "POST",
270
+ headers: {
271
+ "Content-Type": "application/json",
272
+ Authorization: `Bearer ${apiKey}`,
273
+ },
274
+ body: JSON.stringify({
275
+ model,
276
+ temperature: 0.2,
277
+ max_tokens: 3200,
278
+ messages: [
279
+ {
280
+ role: "user",
281
+ content: buildPrompt(descriptions),
282
+ },
283
+ ],
284
+ }),
285
+ });
286
+ if (!response.ok) {
287
+ const text = await response.text();
288
+ throw new Error(`Opencode request failed (${response.status}): ${text}`);
289
+ }
290
+ const data = (await response.json());
291
+ const content = data.choices?.[0]?.message?.content;
292
+ if (!content) {
293
+ throw new Error("Opencode response did not include content.");
294
+ }
295
+ const json = extractJson(content);
296
+ return coercePrd(json);
297
+ }
298
+ function formatPrdFile(prd) {
299
+ const gateMap = prd.stories.map((story) => {
300
+ const functionName = story.id.replace(/-/g, "_");
301
+ let gateCode = story.gateImplementation.code;
302
+ gateCode = gateCode.replace(/export\s+function\s+run\s*\(\)/g, `function ${functionName}Gate()`);
303
+ gateCode = gateCode.replace(/export\s+/g, "");
304
+ if (!gateCode.includes("return {")) {
305
+ gateCode = gateCode.replace(/function\s+\w+Gate\(\)\s*\{/, `function ${functionName}Gate() {\n return`);
306
+ }
307
+ return { story, functionName, gateCode };
308
+ });
309
+ const gateFunctions = gateMap
310
+ .map(({ story, gateCode }) => {
311
+ return `// Gate: ${story.title}
312
+ ${gateCode}
313
+ `;
314
+ })
315
+ .join("\n");
316
+ const gateMapObject = gateMap
317
+ .map(({ story, functionName }) => {
318
+ return ` "${story.id}": ${functionName}Gate,`;
319
+ })
320
+ .join("\n");
321
+ return `#!/usr/bin/env bun
322
+ /**
323
+ * gateproof PRD - Single File
324
+ *
325
+ * Complete PRD with inline gate implementations.
326
+ * Add your API keys/config at the top and run: bun run prd.ts
327
+ */
328
+
329
+ // ============================================================================
330
+ // CONFIGURATION
331
+ // ============================================================================
332
+ const API_URL = process.env.API_URL || "https://your-api.com";
333
+ const TEST_URL = process.env.TEST_URL || "http://localhost:3000";
334
+
335
+ // ============================================================================
336
+ // GATE IMPLEMENTATIONS
337
+ // ============================================================================
338
+
339
+ import { Gate, Act, Assert, createHttpObserveResource, createEmptyObserveResource } from "gateproof";
340
+
341
+ ${gateFunctions}
342
+
343
+ // ============================================================================
344
+ // PRD DEFINITION & EXECUTION
345
+ // ============================================================================
346
+
347
+ const stories = [
348
+ ${prd.stories
349
+ .map((story) => {
350
+ return ` {
351
+ id: "${story.id}",
352
+ title: "${story.title}",${story.dependsOn ? `\n dependsOn: [${story.dependsOn.map((id) => `"${id}"`).join(", ")}],` : ""}
353
+ }`;
354
+ })
355
+ .join(",\n")}
356
+ ];
357
+
358
+ const gates: Record<string, () => ReturnType<typeof Gate.run> extends Promise<infer T> ? T : never> = {
359
+ ${gateMapObject}
360
+ };
361
+
362
+ async function runPrd() {
363
+ const byId = new Map(stories.map((s) => [s.id, s]));
364
+ const executed = new Set<string>();
365
+ const visiting = new Set<string>();
366
+
367
+ function visit(id: string): string[] {
368
+ if (visiting.has(id)) {
369
+ throw new Error(\`Dependency cycle detected: \${id}\`);
370
+ }
371
+ if (executed.has(id)) {
372
+ return [];
373
+ }
374
+
375
+ visiting.add(id);
376
+ const story = byId.get(id);
377
+ if (!story) {
378
+ throw new Error(\`Unknown story: \${id}\`);
379
+ }
380
+
381
+ const order: string[] = [];
382
+ for (const depId of story.dependsOn || []) {
383
+ order.push(...visit(depId));
384
+ }
385
+
386
+ visiting.delete(id);
387
+ executed.add(id);
388
+ order.push(id);
389
+ return order;
390
+ }
391
+
392
+ const executionOrder = stories.flatMap((s) => visit(s.id));
393
+ const uniqueOrder = Array.from(new Set(executionOrder));
394
+
395
+ for (const storyId of uniqueOrder) {
396
+ const story = byId.get(storyId);
397
+ if (!story) continue;
398
+
399
+ console.log(\`\\n--- \${story.id}: \${story.title}\`);
400
+ const gateFn = gates[storyId];
401
+ if (!gateFn) {
402
+ throw new Error(\`No gate implementation for story: \${storyId}\`);
403
+ }
404
+
405
+ const gateSpec = gateFn();
406
+ const result = await Gate.run(gateSpec);
407
+
408
+ if (result.status !== "success") {
409
+ console.error(\`\\n❌ PRD failed at: \${story.id} - \${story.title}\`);
410
+ if (result.error) {
411
+ console.error(\`Error: \${result.error.message}\`);
412
+ }
413
+ process.exit(1);
414
+ }
415
+ }
416
+
417
+ console.log("\\n✅ All PRD stories passed!");
418
+ }
419
+
420
+ if (import.meta.main) {
421
+ runPrd().catch((error) => {
422
+ console.error("Fatal error:", error);
423
+ process.exit(1);
424
+ });
425
+ }
426
+ `;
427
+ }
428
+ async function runPrdts(args) {
429
+ const descriptions = (await getDescriptions(args.inputPath)).trim();
430
+ if (!descriptions) {
431
+ throw new Error("No story descriptions found.");
432
+ }
433
+ const apiKey = args.apiKey ?? process.env.OPENCODE_ZEN_API_KEY;
434
+ if (!apiKey) {
435
+ throw new Error("Missing OPENCODE_ZEN_API_KEY. Pass --api-key or set OPENCODE_ZEN_API_KEY.");
436
+ }
437
+ const prd = await requestPrd(args.endpoint, args.model, apiKey, descriptions);
438
+ const prdFile = formatPrdFile(prd);
439
+ if (args.stdout) {
440
+ stdout.write(prdFile);
441
+ return;
442
+ }
443
+ const outputPath = args.outputPath ?? "prd.ts";
444
+ if (existsSync(outputPath) && !args.overwrite) {
445
+ throw new Error(`Refusing to overwrite ${outputPath}. Use --overwrite to replace it.`);
446
+ }
447
+ await writeFile(outputPath, prdFile, "utf8");
448
+ stdout.write(`✅ Wrote ${outputPath}\n`);
449
+ }
450
+ async function main() {
451
+ try {
452
+ const args = parseArgs(process.argv.slice(2));
453
+ if (!args.subcommand || args.subcommand === "help") {
454
+ printHelp();
455
+ process.exit(0);
456
+ }
457
+ switch (args.subcommand) {
458
+ case "prdts":
459
+ await runPrdts(args);
460
+ break;
461
+ default:
462
+ throw new Error(`Unknown subcommand: ${args.subcommand}`);
463
+ }
464
+ }
465
+ catch (error) {
466
+ const message = error instanceof Error ? error.message : String(error);
467
+ stdout.write(`❌ ${message}\n`);
468
+ process.exit(1);
469
+ }
470
+ }
471
+ void main();
472
+ //# sourceMappingURL=gateproof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateproof.js","sourceRoot":"","sources":["../../src/cli/gateproof.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gateproof",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "description": "E2E testing harness. Observe logs, run actions, assert results.",
6
6
  "main": "./dist/index.js",
@@ -19,6 +19,9 @@
19
19
  "import": "./dist/prd/index.js"
20
20
  }
21
21
  },
22
+ "bin": {
23
+ "gateproof": "./dist/cli/gateproof.js"
24
+ },
22
25
  "files": [
23
26
  "dist",
24
27
  "README.md",