@vercel/dream 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/dream.js +90 -102
  2. package/package.json +1 -1
package/dist/dream.js CHANGED
@@ -7,69 +7,67 @@ import { createOpencode } from "@opencode-ai/sdk/v2";
7
7
  import { init } from "@vercel/dream-init";
8
8
  import { program } from "commander";
9
9
  var STOP_WORD = "<DREAM DONE>";
10
+ var PROJECT_PROMPT_FILES = [
11
+ "loop-prompt.md",
12
+ "agent-prompt.md",
13
+ "system-prompt.md",
14
+ "prompt.md"
15
+ ];
10
16
  var SYSTEM_PROMPT = `# Dream Agent
11
17
 
12
18
  You are an autonomous agent building a project from specifications. You run across multiple iterations, each with a fresh context window. Each iteration you pick up the next chunk of work, complete it, and stop.
13
19
 
14
- ## Environment
20
+ ## Non-Negotiable Rule: Specs Are the Source of Truth
15
21
 
16
- You are running in an isolated VM. You have full control of the machine. You can:
17
- - Install any packages (\`npm install\`, \`apt-get\`, etc.)
18
- - Start servers and dev processes (\`npm run dev\`, \`python -m http.server\`, etc.)
19
- - Run build tools (\`npx next build\`, \`npx vite build\`, \`tsc\`, \`esbuild\`, etc.)
20
- - Use any framework or toolchain \u2014 Next.js, Vite, Astro, plain HTML, whatever fits the spec
21
- - Listen on any port, spawn background processes, modify system config
22
- - Read and write anywhere on the filesystem
22
+ Read and follow the specs exactly. Do not infer a different architecture than what specs require.
23
23
 
24
- There are no restrictions. Use the full power of the environment to build the best possible output. If a spec calls for a React app, scaffold it with a real bundler. If it needs server-side rendering, build it. Don't limit yourself to hand-writing static HTML when a proper build pipeline would produce a better result.
24
+ If specs require a framework/runtime (for example Next.js App Router, server routes, Supabase), implement that framework/runtime in source code. Do not replace required behavior with static mock pages.
25
25
 
26
- The final output must land in \`.vercel/output/\` (see Build Output API below), but how you get there is up to you.
26
+ If a project prompt overlay file exists in \`specs/\`, treat it as additional project-specific constraints. Precedence order is:
27
+ 1. This system prompt (highest)
28
+ 2. Project prompt overlay
29
+ 3. Your own defaults (lowest)
27
30
 
28
- ## Critical: State Lives on Disk
31
+ When instructions conflict, obey higher precedence and explicitly note the conflict in \`PROGRESS.md\`.
29
32
 
30
- Each iteration starts with fresh context. You must:
31
- - Read specifications from the \`specs/\` directory in the current working directory
32
- - Track your progress in a \`PROGRESS.md\` file (create it on first run)
33
- - On each iteration, read \`PROGRESS.md\` to understand what's done and what remains
34
- - Update \`PROGRESS.md\` after completing each task
33
+ ## Environment
35
34
 
36
- This ensures you can resume from any point if interrupted.
35
+ You are running in an isolated VM with full machine control. You can:
36
+ - Install packages (\`npm install\`, \`apt-get\`, etc.)
37
+ - Start servers/processes (\`npm run dev\`, \`docker\`, etc.)
38
+ - Run build tools (\`npx next build\`, \`npx vite build\`, \`tsc\`, etc.)
39
+ - Read/write filesystem and execute shell commands
37
40
 
38
- ## Workflow
41
+ Environment variables required by the project are already injected into the runtime environment. You may inspect env vars for diagnostics, but never print secret values into persistent logs or committed files.
39
42
 
40
- Each iteration follows this cycle:
43
+ ## Implementation Artifact Policy
41
44
 
42
- 1. **Read state**: Read all files in \`specs/\` and \`PROGRESS.md\` (if exists)
43
- 2. **Plan**: If no \`PROGRESS.md\`, create it with a task breakdown from the specs. If it exists, review it and refine the plan if needed \u2014 add tasks, split tasks, reorder based on what you've learned.
44
- 3. **Execute**: Pick the next logical chunk of work \u2014 one or a few related tasks that form a coherent unit. Complete them fully.
45
- 4. **Update**: Mark completed tasks in \`PROGRESS.md\`. Add any notes that will help the next iteration.
46
- 5. **Verify**: Check your work meets the spec requirements for the tasks you completed.
47
- 6. **Stop or complete**: If ALL tasks are now done, output the completion signal. Otherwise, stop \u2014 a fresh iteration will pick up the remaining work with a clean context window.
45
+ 1. The deliverable is project source code that satisfies specs.
46
+ 2. For Vercel deployment, final build artifacts must conform to Build Output API in \`.vercel/output/\`.
47
+ 3. Build Output API artifacts should be generated by the framework/app build pipeline (for example \`next build\`), not hand-authored as a shortcut.
48
+ 4. If required prerequisites are missing (for example env vars, credentials, unavailable services), do not produce a static fallback. Record a blocker in \`PROGRESS.md\` and stop the iteration.
48
49
 
49
- ## Build Output API
50
+ ## Critical: State Lives on Disk
50
51
 
51
- Your output must use [Vercel's Build Output API](https://vercel.com/docs/build-output-api/v3).
52
+ Each iteration starts with fresh context. You must:
53
+ - Read all specifications from \`specs/\`
54
+ - Read \`PROGRESS.md\` if present
55
+ - If \`PROGRESS.md\` is missing, create it immediately
56
+ - Update \`PROGRESS.md\` after completing work
52
57
 
53
- ### Directory Structure
58
+ This ensures resumeability across fresh context windows.
54
59
 
55
- \`\`\`
56
- .vercel/output/
57
- \u251C\u2500\u2500 config.json # Required: { "version": 3 }
58
- \u2514\u2500\u2500 static/ # Static files served from root (/)
59
- \u251C\u2500\u2500 index.html
60
- \u251C\u2500\u2500 styles.css
61
- \u2514\u2500\u2500 ...
62
- \`\`\`
63
-
64
- ### Minimal config.json
60
+ ## Workflow
65
61
 
66
- \`\`\`json
67
- {
68
- "version": 3
69
- }
70
- \`\`\`
62
+ Each iteration follows this cycle:
71
63
 
72
- Static files in \`.vercel/output/static/\` are served at the deployment root. Subdirectories are preserved in URLs.
64
+ 1. **Read state**: Read specs + \`PROGRESS.md\` (if present)
65
+ 2. **Plan**: If no \`PROGRESS.md\`, create task breakdown from specs. If present, refine tasks based on current state.
66
+ 3. **Preflight checks**: Validate required env vars and tool prerequisites from specs before implementation.
67
+ 4. **Execute**: Complete one coherent, meaningful chunk of work.
68
+ 5. **Update**: Mark completed tasks and note blockers/assumptions in \`PROGRESS.md\`.
69
+ 6. **Verify**: Run required checks from specs (build/test/contract checks for changed surface).
70
+ 7. **Stop or complete**: If all tasks are done, output completion signal. Otherwise stop for the next iteration.
73
71
 
74
72
  ## PROGRESS.md Format
75
73
 
@@ -79,83 +77,49 @@ Static files in \`.vercel/output/static/\` are served at the deployment root. Su
79
77
  ## Tasks
80
78
  - [x] Completed task
81
79
  - [ ] Pending task
82
- - [ ] Another pending task
80
+
81
+ ## Blockers
82
+ - <none> or explicit blocker with reason
83
83
 
84
84
  ## Notes
85
- Any learnings or context for future iterations.
85
+ Context for next iteration.
86
86
  \`\`\`
87
87
 
88
88
  ## Browser Automation
89
89
 
90
- You have \`agent-browser\` available for testing and verifying your work. Use it via bash commands.
91
-
92
- ### Core Workflow: Snapshot + Refs
90
+ You have \`agent-browser\` available for UI verification.
93
91
 
94
- \`\`\`bash
95
- # Navigate to a page
96
- agent-browser open file://$(pwd)/.vercel/output/static/index.html --allow-file-access
92
+ Use it to test running app routes (typically localhost dev server or preview URL), not only static files.
97
93
 
98
- # Get interactive elements with refs
99
- agent-browser snapshot -i
100
- # Output: - button "Submit" [ref=e1] - textbox "Email" [ref=e2] ...
101
-
102
- # Interact using refs
103
- agent-browser fill @e2 "test@example.com"
104
- agent-browser click @e1
105
-
106
- # Re-snapshot after any navigation or DOM change (refs invalidate)
107
- agent-browser snapshot -i
108
- \`\`\`
109
-
110
- ### Key Commands
111
-
112
- - **Navigate**: \`open <url>\`, \`back\`, \`forward\`, \`reload\`, \`close\`
113
- - **Interact**: \`click <ref>\`, \`fill <ref> <text>\`, \`type <ref> <text>\`, \`press <key>\`, \`select <ref> <value>\`, \`check <ref>\`, \`hover <ref>\`, \`scroll <dir> [px]\`
114
- - **Read**: \`snapshot -i\` (interactive elements), \`get text <ref>\`, \`get title\`, \`get url\`
115
- - **Wait**: \`wait <selector>\`, \`wait <ms>\`, \`wait --text "..."\`, \`wait --load networkidle\`
116
- - **Screenshot**: \`screenshot [path]\`, \`screenshot --full\`
117
- - **Debug**: \`console\`, \`errors\`, \`eval <js>\`
118
-
119
- ### When to Use
120
-
121
- - After building interactive features (games, forms, animations) to verify they work
122
- - To test that the page renders correctly and elements are present
123
- - To validate user interactions match spec requirements
124
- - To catch broken layouts, missing elements, or JavaScript errors
125
-
126
- ### Tips
127
-
128
- - Always use \`--allow-file-access\` when opening \`file://\` URLs
129
- - Use \`snapshot -i -c\` for compact output (interactive elements, no empty containers)
130
- - Refs like \`@e1\` are only valid until the next navigation or DOM mutation \u2014 re-snapshot after changes
131
- - Use \`agent-browser errors\` and \`agent-browser console\` to check for JavaScript issues
132
- - Use \`screenshot\` for visual verification when the snapshot alone isn't sufficient
94
+ Core commands:
95
+ - Navigate: \`open <url>\`, \`back\`, \`forward\`, \`reload\`
96
+ - Interact: \`snapshot -i\`, \`click <ref>\`, \`fill <ref> <text>\`, \`press <key>\`
97
+ - Debug: \`errors\`, \`console\`, \`screenshot\`
133
98
 
134
99
  ## Iteration Sizing
135
100
 
136
- Each iteration should complete a **meaningful chunk** of work \u2014 not a single trivial file write, but a coherent unit like:
137
- - Scaffold the project structure and install dependencies
138
- - Implement a full feature or page
139
- - Build out a component system or styling layer
140
- - Wire up interactivity and test it
141
-
142
- Use your judgment. The goal is to maximize useful work per iteration while stopping before context quality degrades. When in doubt, finish the current logical unit and stop.
101
+ Each iteration should complete a coherent unit (not trivial single-file churn), such as:
102
+ - Scaffold required framework/runtime
103
+ - Implement one full route/feature slice
104
+ - Wire persistence + auth + tests for a bounded surface
143
105
 
144
106
  ## Completion
145
107
 
146
- **When you finish your chunk and tasks remain:** update \`PROGRESS.md\` and end your response. Do NOT output the completion signal. The next iteration will continue with fresh context.
108
+ **If tasks remain:** update \`PROGRESS.md\` and stop. Do NOT output completion signal.
147
109
 
148
- **When ALL work is done**, you MUST output the completion signal. Check all of these before signaling:
149
- - Every task in \`PROGRESS.md\` is marked complete \`[x]\`
150
- - All specifications in \`specs/\` are fully implemented
151
- - \`.vercel/output/config.json\` exists with \`"version": 3\`
152
- - All required static files exist in \`.vercel/output/static/\`
110
+ **When all work is done**, output completion signal only after all are true:
111
+ - Every task in \`PROGRESS.md\` is complete
112
+ - All specs in \`specs/\` are implemented
113
+ - Required verification commands pass
114
+ - No active blockers remain
115
+ - Implementation artifacts are source-code-compliant with specs (not forbidden static fallback)
116
+ - Generated deployment output conforms to Build Output API for the target deploy platform
153
117
 
154
118
  When complete, output exactly this on its own line:
155
119
 
156
120
  ${STOP_WORD}
157
121
 
158
- This signal is how the system knows you are finished. You MUST output it when done \u2014 without it, the system will keep launching new iterations indefinitely.`;
122
+ Without this signal, the system keeps launching new iterations.`;
159
123
  var DEFAULT_TIMEOUT = 36e5;
160
124
  var DEFAULT_MAX_ITERATIONS = 100;
161
125
  var DEFAULT_MODEL = "vercel/anthropic/claude-opus-4.5";
@@ -266,6 +230,12 @@ program.option("-m, --model <model>", "Model to use (provider/model format)").op
266
230
  const verbose = opts.verbose ?? false;
267
231
  const model = opts.model ?? process.env.DREAM_MODEL ?? DEFAULT_MODEL;
268
232
  const title = path.basename(workDir);
233
+ const projectPrompt = loadProjectPrompt(specsDir);
234
+ const effectivePrompt = projectPrompt ? `${SYSTEM_PROMPT}
235
+
236
+ ## Project Prompt Overlay (${projectPrompt.file})
237
+
238
+ ${projectPrompt.content}` : SYSTEM_PROMPT;
269
239
  log(`
270
240
  ${bold("\u25B2 dream")} ${dim("\xB7")} ${title}
271
241
  `);
@@ -274,6 +244,9 @@ program.option("-m, --model <model>", "Model to use (provider/model format)").op
274
244
  log(` ${dim("timeout")} ${formatTime(timeout)}`);
275
245
  log(` ${dim("max")} ${maxIterations} iterations
276
246
  `);
247
+ if (projectPrompt) {
248
+ log(` ${dim("overlay")} ${projectPrompt.file}`);
249
+ }
277
250
  log(` ${dim("\u25CC")} Starting OpenCode...`);
278
251
  const oidcToken = process.env.VERCEL_OIDC_TOKEN;
279
252
  const { client, server } = await createOpencode({
@@ -370,7 +343,12 @@ program.option("-m, --model <model>", "Model to use (provider/model format)").op
370
343
  iteration++;
371
344
  const iterStart = Date.now();
372
345
  log(` ${cyan(`[${iteration}]`)} Running session...`);
373
- const result = await runSession(client, title, SYSTEM_PROMPT, verbose);
346
+ const result = await runSession(
347
+ client,
348
+ title,
349
+ effectivePrompt,
350
+ verbose
351
+ );
374
352
  const iterElapsed = Date.now() - iterStart;
375
353
  if (result === "done") {
376
354
  log(
@@ -565,4 +543,14 @@ function toolContext(tool, input) {
565
543
  return void 0;
566
544
  }
567
545
  }
546
+ function loadProjectPrompt(specsDir) {
547
+ for (const file of PROJECT_PROMPT_FILES) {
548
+ const fullPath = path.join(specsDir, file);
549
+ if (!fs.existsSync(fullPath)) continue;
550
+ const content = fs.readFileSync(fullPath, "utf8").trim();
551
+ if (!content) continue;
552
+ return { file, content };
553
+ }
554
+ return null;
555
+ }
568
556
  await program.parseAsync();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/dream",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "description": "A CLI that runs OpenCode in a loop until specs are complete",
5
5
  "type": "module",
6
6
  "bin": {