unfold-deploy 0.0.0-stage → 0.1.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/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (unreleased)
4
+
5
+ First release.
6
+
7
+ - `unfold vercel`: runs `vercel deploy` with your existing login and project link, and shows a live Prepare → Upload → Build → Preview flow pinned to the bottom of the terminal.
8
+ - End-of-run summary with each stage's status and reason, the error, the most likely cause, and URLs.
9
+ - Stages are only confirmed when the output proves it; otherwise they are marked unverified with a reason.
10
+ - `unfold show`: full-screen terminal explorer for a run (stages, evidence, logs, fix prompt).
11
+ - Fix prompts for failed runs, with ready-to-run `claude` and `codex` commands; `--fix claude|codex` starts the agent automatically.
12
+ - Optional browser view with `--web`, served on 127.0.0.1 only.
13
+ - Secret redaction before anything is shown or saved; runs stored in `~/.unfold/runs` (mode 0600, newest 100 kept).
14
+ - Works without node-pty through the system `script` command (macOS and Linux).
15
+ - Demos that run without a Vercel account: `unfold demo success|build-failure|interrupted`.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 faizm10
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,114 @@
1
- # Temporary Holding Version
1
+ # Unfold
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Watch what happens after you hit Enter.**
4
+
5
+ Unfold wraps a CLI command and shows what it's doing as a flow, right in your terminal. The command's own output and prompts work exactly as before, and a small panel pinned to the bottom of the terminal tracks each stage as it happens. It starts with one workflow: a Vercel preview deploy.
6
+
7
+ ```
8
+ Vercel CLI 65.2.0
9
+ Inspect https://vercel.com/acme/acme-web/6TfY2pQk…
10
+ 2026-11-05T18:04:31Z Running "npm run build"
11
+ …
12
+ ── unfold · vercel deploy --logs ─────────────────────── Running 12.4s
13
+ ✓ Prepare ── ✓ Upload ── ⠹ Build ── ○ Preview
14
+ Build: Build logs are streaming from Vercel. · Your build command started.
15
+ ```
16
+
17
+ When the command finishes, the panel turns into a summary: every stage's status and reason, the error and most likely cause with line numbers, the URLs, and (on failure) a ready-made fix command for Claude Code or Codex.
18
+
19
+ Run `unfold show` to explore the run full screen. For each stage it shows two things side by side:
20
+
21
+ - **Observed in this run**: status, facts and the exact output lines from your deploy, each linking to its place in the logs.
22
+ - **How this stage works**: a general, plain-language explanation. It is clearly labeled as not coming from your run.
23
+
24
+ Use ←/→ to switch stages, `l` for the logs, `e` to jump to the error, `f` for the fix prompt, `c`/`x` to copy the Claude/Codex command, and `q` to quit.
25
+
26
+ A stage is only marked **Confirmed** when the output proves it. If the output can't confirm a stage, it stays **Unverified** (`?`) and Unfold says why. One example: Vercel skips uploading files it already has, so a deploy can finish without the output ever showing an upload. When a deploy fails, you see the stage it failed in, the last confirmed stage, the error, the line most likely to be the cause, and a link to that line in the logs.
27
+
28
+ ## Install
29
+
30
+ Requires Node.js 20 or later, on macOS or Linux. Windows should work but hasn't been tested yet.
31
+
32
+ ```sh
33
+ npm install -g unfold-deploy
34
+ ```
35
+
36
+ The package is `unfold-deploy`; the command is `unfold`. To try it without installing, prefix commands with `npx unfold-deploy` (for example `npx unfold-deploy demo success`).
37
+
38
+ ## Try it without a Vercel account
39
+
40
+ The demos play recorded terminal output through the same pipeline a real run uses:
41
+
42
+ ```sh
43
+ unfold demo success # a preview deploy that succeeds
44
+ unfold demo build-failure # the build fails on a TypeScript error
45
+ unfold demo interrupted # Ctrl+C while Vercel is building
46
+ unfold show # explore the run you just watched
47
+ ```
48
+
49
+ Add `--speed 2` to play faster. Press Ctrl+C during any demo to see the interrupted state.
50
+
51
+ ## Run a real preview deploy
52
+
53
+ You need the Vercel CLI (`npm i -g vercel`) and `vercel login`. Then, from your app's folder (the one with its `package.json`):
54
+
55
+ ```sh
56
+ cd ~/code/my-app
57
+ unfold vercel # runs: vercel deploy --logs
58
+ unfold vercel --yes # any vercel deploy flags pass straight through
59
+ ```
60
+
61
+ - Unfold runs your installed `vercel` with your existing login and `.vercel/` project link. If the folder isn't linked yet, the Vercel CLI asks its usual questions in your terminal.
62
+ - Unfold adds `--logs` so that the Build stage has real evidence.
63
+ - Unfold creates preview deployments by default. Adding `--prod` makes a production deploy, so don't pass it unless that's what you want.
64
+ - If you belong to several Vercel teams, the CLI asks which one to use. Pass `--scope <team>` to skip the question.
65
+ - Ctrl+C goes to the Vercel CLI as usual. If the deployment had already been created, Vercel may keep building it, and the summary shows its Inspect URL so you can check.
66
+ - Every run is saved. `unfold show` explores the latest one, `unfold show <run-id>` an older one, and `unfold runs` lists them.
67
+
68
+ Unfold options: `--fix claude|codex` (see below), `--no-panel` (no pinned panel, summary only), `--speed <n>` (demos and replays).
69
+
70
+ ### Browser view (optional)
71
+
72
+ Nothing is served unless you ask for it. Add `--web` to also open the flow in a local browser page, for example `unfold vercel --web` or `unfold show --web`. The page is served on `127.0.0.1` only. With `--web` you can also use `--no-open`, `--once` (exit when the run ends) and `--port <n>` (default 4317).
73
+
74
+ ## When a deploy fails: hand it to Claude Code or Codex
75
+
76
+ Every failed run automatically gets a fix prompt built from that run. It contains:
77
+
78
+ - the error and the output lines most likely to be the cause, most specific first
79
+ - a redacted log excerpt
80
+ - files mentioned in the errors, such as `./app/checkout/page.tsx:42:21`
81
+ - the framework and build command
82
+ - hints about the stage that failed, for example that Vercel builds use the project's Preview environment variables rather than your local `.env`
83
+
84
+ The prompt also tells the agent not to deploy and not to change environment variables.
85
+
86
+ - The prompt is saved to `~/.unfold/runs/<run>.fix-prompt.md` and the summary prints a ready-to-paste command: `claude "$(cat ~/.unfold/runs/<run>.fix-prompt.md)"` or the same with `codex`.
87
+ - In `unfold show`, `f` displays the prompt and `c`/`x` copy the Claude/Codex command. The browser view (`--web`) has the same options.
88
+ - `unfold vercel --fix claude` (or `--fix codex`) goes one step further: if the deploy fails, Unfold starts that agent in your project folder with the prompt. Nothing starts on success, and nothing starts unless you pass the flag.
89
+
90
+ Try it without an account: `unfold demo build-failure`.
91
+
92
+ ## Privacy
93
+
94
+ - **Everything stays local.** By default nothing is served at all. With `--web` the page is served on `127.0.0.1` only, and requests for any other host name are rejected. Unfold sends no telemetry.
95
+ - **Secrets are redacted** before any output is shown on the page or saved to disk. This covers tokens, keys, JWTs, `user:password@` in URLs, `KEY=value` pairs with secret-looking names, private key blocks, and `--token` / `--env` flag values. Values of secret-looking environment variables are also matched, in memory only.
96
+ - **The environment is never recorded.** The Vercel CLI inherits it so that your login works, and Unfold doesn't save it.
97
+ - **Saved runs are private to you.** They're written to `~/.unfold/runs/*.jsonl` with mode `0600`, outside your project, so they can't be committed by accident. The newest 100 runs are kept (`UNFOLD_KEEP_RUNS` changes this). Set `UNFOLD_HOME` to store them elsewhere.
98
+ - Your own terminal shows the CLI's unredacted output, the same as it would without Unfold.
99
+
100
+ ## Troubleshooting
101
+
102
+ - **"Could not find vercel on your PATH"**: install it with `npm i -g vercel`, then run `vercel login`.
103
+ - **Stuck at a Vercel question**: Unfold passes your keystrokes straight to the Vercel CLI, so answer it as usual. In scripts, pass `--yes` and `--scope <team>`.
104
+ - **"Unfold didn't recognize any of this output"**: your Vercel CLI may print a format Unfold doesn't know yet. The deploy itself is unaffected. Please open an issue and include your `vercel --version`.
105
+ - **No live panel**: the panel needs a terminal at least 50×12 and the `node-pty` package. On Linux without build tools, node-pty may not install; Unfold then runs the CLI through the system `script` command, prints only the summary, and keeps prompts working. `UNFOLD_TERMINAL=script` or `UNFOLD_TERMINAL=pipe` forces a fallback, and `--no-panel` turns the panel off.
106
+ - **Terminal looks wrong after a crash**: run `reset`. Unfold restores the terminal on normal exits, Ctrl+C and crashes, so please report the crash.
107
+
108
+ ## Contributing
109
+
110
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, tests, and how to add a provider such as `gcloud`.
111
+
112
+ ## License
113
+
114
+ MIT
package/bin/unfold.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { main } from '../dist/cli.js';
3
+ import { restoreTerminal } from '../dist/tui/restore.js';
4
+
5
+ function crash(err) {
6
+ restoreTerminal();
7
+ process.stderr.write(`\n[unfold] Unexpected error: ${err?.stack ?? err}\n`);
8
+ process.stderr.write('[unfold] Please report it at https://github.com/faizm10/unfold/issues\n');
9
+ process.exit(1);
10
+ }
11
+ process.on('uncaughtException', crash);
12
+ process.on('unhandledRejection', crash);
13
+
14
+ main(process.argv.slice(2)).then((code) => process.exit(code), crash);
@@ -0,0 +1,331 @@
1
+ {
2
+ "provider": "vercel",
3
+ "description": "A preview deploy whose Next.js build fails on a type error.",
4
+ "command": [
5
+ "vercel",
6
+ "deploy",
7
+ "--logs"
8
+ ],
9
+ "cwd": "~/projects/acme-web",
10
+ "exitCode": 1,
11
+ "signal": null,
12
+ "interrupted": false,
13
+ "chunks": [
14
+ {
15
+ "t": 0,
16
+ "d": "Vercel CLI 65.2.0\r\n"
17
+ },
18
+ {
19
+ "t": 300,
20
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠋\u001b[39m Retrieving project…"
21
+ },
22
+ {
23
+ "t": 380,
24
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠙\u001b[39m Retrieving project…"
25
+ },
26
+ {
27
+ "t": 460,
28
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠹\u001b[39m Retrieving project…"
29
+ },
30
+ {
31
+ "t": 540,
32
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠸\u001b[39m Retrieving project…"
33
+ },
34
+ {
35
+ "t": 620,
36
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠼\u001b[39m Retrieving project…"
37
+ },
38
+ {
39
+ "t": 700,
40
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠴\u001b[39m Retrieving project…"
41
+ },
42
+ {
43
+ "t": 780,
44
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠦\u001b[39m Retrieving project…"
45
+ },
46
+ {
47
+ "t": 860,
48
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠧\u001b[39m Retrieving project…"
49
+ },
50
+ {
51
+ "t": 940,
52
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠇\u001b[39m Retrieving project…"
53
+ },
54
+ {
55
+ "t": 1020,
56
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠋\u001b[39m Deploying \u001b[1macme/acme-web\u001b[22m"
57
+ },
58
+ {
59
+ "t": 1100,
60
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠙\u001b[39m Deploying \u001b[1macme/acme-web\u001b[22m"
61
+ },
62
+ {
63
+ "t": 1180,
64
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠹\u001b[39m Deploying \u001b[1macme/acme-web\u001b[22m"
65
+ },
66
+ {
67
+ "t": 1260,
68
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠸\u001b[39m Deploying \u001b[1macme/acme-web\u001b[22m"
69
+ },
70
+ {
71
+ "t": 1340,
72
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠼\u001b[39m Deploying \u001b[1macme/acme-web\u001b[22m"
73
+ },
74
+ {
75
+ "t": 1420,
76
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠴\u001b[39m Deploying \u001b[1macme/acme-web\u001b[22m"
77
+ },
78
+ {
79
+ "t": 1500,
80
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠦\u001b[39m Deploying \u001b[1macme/acme-web\u001b[22m"
81
+ },
82
+ {
83
+ "t": 1580,
84
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠧\u001b[39m Deploying \u001b[1macme/acme-web\u001b[22m"
85
+ },
86
+ {
87
+ "t": 1660,
88
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠇\u001b[39m Deploying \u001b[1macme/acme-web\u001b[22m"
89
+ },
90
+ {
91
+ "t": 1780,
92
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠋\u001b[39m Uploading \u001b[0m[--------------------] (0.0KB/184.6KB)"
93
+ },
94
+ {
95
+ "t": 2040,
96
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠙\u001b[39m Uploading \u001b[0m[==------------------] (23.1KB/184.6KB)"
97
+ },
98
+ {
99
+ "t": 2300,
100
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠹\u001b[39m Uploading \u001b[0m[=====---------------] (46.1KB/184.6KB)"
101
+ },
102
+ {
103
+ "t": 2560,
104
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠸\u001b[39m Uploading \u001b[0m[=======-------------] (69.2KB/184.6KB)"
105
+ },
106
+ {
107
+ "t": 2820,
108
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠼\u001b[39m Uploading \u001b[0m[==========----------] (92.3KB/184.6KB)"
109
+ },
110
+ {
111
+ "t": 3080,
112
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠴\u001b[39m Uploading \u001b[0m[============--------] (115.4KB/184.6KB)"
113
+ },
114
+ {
115
+ "t": 3340,
116
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠦\u001b[39m Uploading \u001b[0m[===============-----] (138.4KB/184.6KB)"
117
+ },
118
+ {
119
+ "t": 3600,
120
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠧\u001b[39m Uploading \u001b[0m[=================---] (161.5KB/184.6KB)"
121
+ },
122
+ {
123
+ "t": 3860,
124
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠇\u001b[39m Uploading \u001b[0m[====================] (184.6KB/184.6KB)"
125
+ },
126
+ {
127
+ "t": 4160,
128
+ "d": "\u001b[2K\u001b[1G"
129
+ },
130
+ {
131
+ "t": 4160,
132
+ "d": " \u001b[1mInspect \u001b[22m\u001b[1m\u001b[36mhttps://vercel.com/acme/acme-web/6TfY2pQkzR1mWcN8xLbV3hGd\u001b[39m\u001b[22m\r\n"
133
+ },
134
+ {
135
+ "t": 4180,
136
+ "d": " \u001b[1mPreview \u001b[22m\u001b[1m\u001b[36mhttps://acme-web-7k2m9xq4p-acme.vercel.app\u001b[39m\u001b[22m\r\n"
137
+ },
138
+ {
139
+ "t": 4300,
140
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠋\u001b[39m Queued…"
141
+ },
142
+ {
143
+ "t": 4380,
144
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠙\u001b[39m Queued…"
145
+ },
146
+ {
147
+ "t": 4460,
148
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠹\u001b[39m Queued…"
149
+ },
150
+ {
151
+ "t": 4540,
152
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠸\u001b[39m Queued…"
153
+ },
154
+ {
155
+ "t": 4620,
156
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠼\u001b[39m Queued…"
157
+ },
158
+ {
159
+ "t": 4700,
160
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠴\u001b[39m Queued…"
161
+ },
162
+ {
163
+ "t": 4780,
164
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠦\u001b[39m Queued…"
165
+ },
166
+ {
167
+ "t": 4860,
168
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠧\u001b[39m Queued…"
169
+ },
170
+ {
171
+ "t": 4940,
172
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠇\u001b[39m Queued…"
173
+ },
174
+ {
175
+ "t": 5020,
176
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠏\u001b[39m Queued…"
177
+ },
178
+ {
179
+ "t": 5100,
180
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠋\u001b[39m Queued…"
181
+ },
182
+ {
183
+ "t": 5180,
184
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠙\u001b[39m Queued…"
185
+ },
186
+ {
187
+ "t": 5260,
188
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠹\u001b[39m Queued…"
189
+ },
190
+ {
191
+ "t": 5340,
192
+ "d": "\u001b[2K\u001b[1G\u001b[36m⠸\u001b[39m Queued…"
193
+ },
194
+ {
195
+ "t": 5340,
196
+ "d": "\u001b[2K\u001b[1G"
197
+ },
198
+ {
199
+ "t": 5540,
200
+ "d": "\u001b[2m2026-11-05T18:04:03.460Z\u001b[22m Running build in Washington, D.C., USA (East) – iad1\r\n"
201
+ },
202
+ {
203
+ "t": 5680,
204
+ "d": "\u001b[2m2026-11-05T18:04:04.482Z\u001b[22m Build machine configuration: 2 cores, 8 GB\r\n"
205
+ },
206
+ {
207
+ "t": 5820,
208
+ "d": "\u001b[2m2026-11-05T18:04:05.504Z\u001b[22m Retrieving list of deployment files...\r\n"
209
+ },
210
+ {
211
+ "t": 6120,
212
+ "d": "\u001b[2m2026-11-05T18:04:07.694Z\u001b[22m Downloading 41 deployment files...\r\n"
213
+ },
214
+ {
215
+ "t": 6620,
216
+ "d": "\u001b[2m2026-11-05T18:04:11.344Z\u001b[22m Restored build cache from previous deployment (9QwErTy2uIoPaSdF)\r\n"
217
+ },
218
+ {
219
+ "t": 6820,
220
+ "d": "\u001b[2m2026-11-05T18:04:12.804Z\u001b[22m Running \"vercel build\"\r\n"
221
+ },
222
+ {
223
+ "t": 7120,
224
+ "d": "\u001b[2m2026-11-05T18:04:14.994Z\u001b[22m Vercel CLI 65.2.0\r\n"
225
+ },
226
+ {
227
+ "t": 7320,
228
+ "d": "\u001b[2m2026-11-05T18:04:16.454Z\u001b[22m Installing dependencies...\r\n"
229
+ },
230
+ {
231
+ "t": 8920,
232
+ "d": "\u001b[2m2026-11-05T18:04:28.134Z\u001b[22m added 3 packages, and audited 318 packages in 3s\r\n"
233
+ },
234
+ {
235
+ "t": 9120,
236
+ "d": "\u001b[2m2026-11-05T18:04:29.594Z\u001b[22m Detected Next.js version: 16.0.1\r\n"
237
+ },
238
+ {
239
+ "t": 9320,
240
+ "d": "\u001b[2m2026-11-05T18:04:31.054Z\u001b[22m Running \"npm run build\"\r\n"
241
+ },
242
+ {
243
+ "t": 9460,
244
+ "d": "\u001b[2m2026-11-05T18:04:32.076Z\u001b[22m \r\n"
245
+ },
246
+ {
247
+ "t": 9660,
248
+ "d": "\u001b[2m2026-11-05T18:04:33.536Z\u001b[22m > acme-web@0.1.0 build\r\n"
249
+ },
250
+ {
251
+ "t": 9800,
252
+ "d": "\u001b[2m2026-11-05T18:04:34.558Z\u001b[22m > next build\r\n"
253
+ },
254
+ {
255
+ "t": 9940,
256
+ "d": "\u001b[2m2026-11-05T18:04:35.580Z\u001b[22m \r\n"
257
+ },
258
+ {
259
+ "t": 10340,
260
+ "d": "\u001b[2m2026-11-05T18:04:38.500Z\u001b[22m ▲ Next.js 16.0.1\r\n"
261
+ },
262
+ {
263
+ "t": 10540,
264
+ "d": "\u001b[2m2026-11-05T18:04:39.960Z\u001b[22m Creating an optimized production build ...\r\n"
265
+ },
266
+ {
267
+ "t": 11440,
268
+ "d": "\u001b[2m2026-11-05T18:04:46.530Z\u001b[22m [db] checking migrations with DATABASE_URL=postgres://acme_app:Demo-Pa55-not-real@db.acme.internal:5432/acme\r\n"
269
+ },
270
+ {
271
+ "t": 13240,
272
+ "d": "\u001b[2m2026-11-05T18:04:59.670Z\u001b[22m ✓ Compiled successfully in 6.9s\r\n"
273
+ },
274
+ {
275
+ "t": 13440,
276
+ "d": "\u001b[2m2026-11-05T18:05:01.130Z\u001b[22m Linting and checking validity of types ...\r\n"
277
+ },
278
+ {
279
+ "t": 14940,
280
+ "d": "\u001b[2m2026-11-05T18:05:12.080Z\u001b[22m \u001b[31mFailed to compile.\u001b[39m\r\n"
281
+ },
282
+ {
283
+ "t": 15080,
284
+ "d": "\u001b[2m2026-11-05T18:05:13.102Z\u001b[22m \r\n"
285
+ },
286
+ {
287
+ "t": 15100,
288
+ "d": "\u001b[2m2026-11-05T18:05:13.248Z\u001b[22m \u001b[31m./app/checkout/page.tsx:42:21\u001b[39m\r\n"
289
+ },
290
+ {
291
+ "t": 15120,
292
+ "d": "\u001b[2m2026-11-05T18:05:13.394Z\u001b[22m \u001b[31mType error: Property 'totalCents' does not exist on type 'Cart'. Did you mean 'subtotalCents'?\u001b[39m\r\n"
293
+ },
294
+ {
295
+ "t": 15260,
296
+ "d": "\u001b[2m2026-11-05T18:05:14.416Z\u001b[22m \r\n"
297
+ },
298
+ {
299
+ "t": 15280,
300
+ "d": "\u001b[2m2026-11-05T18:05:14.562Z\u001b[22m 40 | return (\r\n"
301
+ },
302
+ {
303
+ "t": 15300,
304
+ "d": "\u001b[2m2026-11-05T18:05:14.708Z\u001b[22m 41 | <OrderSummary\r\n"
305
+ },
306
+ {
307
+ "t": 15320,
308
+ "d": "\u001b[2m2026-11-05T18:05:14.854Z\u001b[22m > 42 | total={cart.totalCents}\r\n"
309
+ },
310
+ {
311
+ "t": 15340,
312
+ "d": "\u001b[2m2026-11-05T18:05:15.000Z\u001b[22m | ^\r\n"
313
+ },
314
+ {
315
+ "t": 15360,
316
+ "d": "\u001b[2m2026-11-05T18:05:15.146Z\u001b[22m 43 | currency={cart.currency}\r\n"
317
+ },
318
+ {
319
+ "t": 15560,
320
+ "d": "\u001b[2m2026-11-05T18:05:16.606Z\u001b[22m \u001b[31mNext.js build worker exited with code: 1 and signal: null\u001b[39m\r\n"
321
+ },
322
+ {
323
+ "t": 15860,
324
+ "d": "\u001b[2m2026-11-05T18:05:18.796Z\u001b[22m \u001b[31mError: Command \"npm run build\" exited with 1\u001b[39m\r\n"
325
+ },
326
+ {
327
+ "t": 16560,
328
+ "d": "\u001b[31mError:\u001b[39m Command \"npm run build\" exited with 1\r\n"
329
+ }
330
+ ]
331
+ }