getgloss 0.7.2 → 0.8.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.
@@ -28,8 +28,8 @@
28
28
  content="Comment on local code diffs and save feedback in your repo."
29
29
  />
30
30
  <meta name="twitter:image" content="https://getgloss.dev/og.png" />
31
- <script type="module" crossorigin src="/assets/index-mwzx-OHz.js"></script>
32
- <link rel="stylesheet" crossorigin href="/assets/index-Dj8yXNw3.css">
31
+ <script type="module" crossorigin src="/assets/index-DkylW082.js"></script>
32
+ <link rel="stylesheet" crossorigin href="/assets/index-DBK7WjlV.css">
33
33
  </head>
34
34
  <body>
35
35
  <div id="root"></div>
@@ -24,8 +24,12 @@ user clicks Submit in the browser, and that exit is your signal to resume.
24
24
 
25
25
  When `gloss open --json` exits, parse the JSON output. Prefer reading
26
26
  `feedbackPath` from disk when present, because it contains the durable structured
27
- feedback bundle. Address every comment in file/line order, then run the
28
- narrowest relevant validation. After validation, run
27
+ feedback bundle. Check `feedback.reviewScope` before editing: missing or
28
+ `{ "mode": "all" }` means the whole turn was submitted; `{ "mode": "single" }`
29
+ or `{ "mode": "range" }` means the human submitted feedback while viewing only
30
+ that commit preview. Treat scoped feedback as comments on that slice, and do not
31
+ infer that unreviewed commits were approved. Address every comment in file/line
32
+ order, then run the narrowest relevant validation. After validation, run
29
33
  `gloss resolve <reviewId> --summary "<what changed>"`.
30
34
  When tracking progress comment-by-comment is useful, run
31
35
  `gloss resolve <reviewId> --comment <commentId> --summary "<what changed>"`
@@ -38,14 +42,17 @@ gloss open --json --no-watch
38
42
  ```
39
43
 
40
44
  If the user asks for another pass after fixes, commits, or additional changes,
41
- start a fresh review session with `gloss open --json`.
45
+ continue the same review with `gloss open --review <reviewId> --json`.
46
+ The browser keeps one stable review URL; each follow-up is a new turn in the
47
+ same review history. Use a fresh `gloss open --json` only for unrelated work or
48
+ when the user explicitly wants a new review.
42
49
 
43
50
  Gloss feedback is stored under:
44
51
 
45
52
  ```text
46
- ~/.gloss/reviews/<reviewId>/feedback.json
47
- ~/.gloss/reviews/<reviewId>/feedback.md
48
- ~/.gloss/reviews/<reviewId>/resolved.json
53
+ ~/.gloss/reviews/<reviewId>/turns/<turnId>/feedback.json
54
+ ~/.gloss/reviews/<reviewId>/turns/<turnId>/feedback.md
55
+ ~/.gloss/reviews/<reviewId>/turns/<turnId>/resolved.json
49
56
  ```
50
57
 
51
58
  Use `feedback.json` for structured agent work. Use `feedback.md` when a human
@@ -60,6 +67,7 @@ Useful commands:
60
67
  ```bash
61
68
  gloss status --json
62
69
  gloss watch <reviewId> --json
70
+ gloss open --review <reviewId> --json
63
71
  gloss resolve <reviewId> --comment <commentId> --summary "Applied one comment"
64
72
  gloss resolve <reviewId> --summary "Applied review feedback"
65
73
  gloss doctor
package/dist/web/setup.md CHANGED
@@ -5,7 +5,7 @@ coding-agent loops.
5
5
 
6
6
  Gloss captures the current git diff, opens a localhost browser review UI, lets
7
7
  the user attach comments to changed lines and ranges, then writes structured
8
- feedback to `~/.gloss/reviews/<reviewId>/feedback.json` and `feedback.md`.
8
+ feedback under `~/.gloss/reviews/<reviewId>/turns/<turnId>/`.
9
9
 
10
10
  ## Check Installation
11
11
 
@@ -53,12 +53,16 @@ The skill pairs the CLI with the browser app:
53
53
  1. Run `gloss open --json` from the repo root unless the user names a base ref.
54
54
  2. Wait for the browser review to be submitted.
55
55
  3. Read `feedbackPath` from the JSON output.
56
- 4. Address each comment in file and line order.
57
- 5. Validate the fix with the narrowest relevant checks.
58
- 6. Optionally mark individual comments handled with
56
+ 4. Check `feedback.reviewScope`; scoped feedback means the human submitted while
57
+ viewing one commit or commit range, not necessarily the whole turn.
58
+ 5. Address each comment in file and line order.
59
+ 6. Validate the fix with the narrowest relevant checks.
60
+ 7. Optionally mark individual comments handled with
59
61
  `gloss resolve <reviewId> --comment <commentId> --summary "<what changed>"`.
60
- 7. Run `gloss resolve <reviewId> --summary "<what changed>"`, then summarize
62
+ 8. Run `gloss resolve <reviewId> --summary "<what changed>"`, then summarize
61
63
  what changed.
64
+ 9. For another pass on the same review, run
65
+ `gloss open --review <reviewId> --json`.
62
66
 
63
67
  Browser review shortcuts:
64
68
 
@@ -165,22 +169,34 @@ Open a review and return immediately:
165
169
  gloss open --json --no-watch
166
170
  ```
167
171
 
172
+ Continue an existing review with another turn:
173
+
174
+ ```bash
175
+ gloss open --review <reviewId> --json
176
+ ```
177
+
178
+ `gloss open --json` intentionally waits until browser submission or timeout.
179
+ Use `--no-watch` when the caller only needs to open the review. The background
180
+ daemon exits automatically after a short idle window with no pending reviews.
181
+ If cleanup looks stale, run `gloss doctor`; use `gloss stop --all` when you
182
+ want to terminate all Gloss daemon processes for the current user.
183
+
168
184
  Mark a submitted review handled after applying feedback:
169
185
 
170
186
  ```bash
171
187
  gloss resolve <reviewId> --summary "Applied review feedback"
172
188
  ```
173
189
 
174
- Mark one submitted comment handled while work is in progress:
190
+ Mark one submitted comment handled:
175
191
 
176
192
  ```bash
177
193
  gloss resolve <reviewId> --comment <commentId> --summary "Applied this comment"
178
194
  ```
179
195
 
180
- For a follow-up pass after fixes or new commits, start a fresh session:
196
+ For a follow-up pass after fixes or new commits in the same review loop:
181
197
 
182
198
  ```bash
183
- gloss open --json
199
+ gloss open --review <reviewId> --json
184
200
  ```
185
201
 
186
202
  Diagnose setup:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "getgloss",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "Local browser-based diff review for coding-agent loops.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.33.2",
@@ -31,6 +31,8 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@hono/node-server": "1.19.14",
34
+ "@shikijs/langs": "4.1.0",
35
+ "@shikijs/themes": "4.1.0",
34
36
  "@tailwindcss/vite": "4.3.0",
35
37
  "commander": "14.0.3",
36
38
  "execa": "9.6.1",
@@ -40,6 +42,7 @@
40
42
  "open": "10.2.0",
41
43
  "react": "19.2.6",
42
44
  "react-dom": "19.2.6",
45
+ "shiki": "4.1.0",
43
46
  "ulid": "3.0.2",
44
47
  "zustand": "5.0.13"
45
48
  },
package/skill/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: gloss
3
- description: Open local working-tree or branch changes in Gloss for browser review, wait for submitted feedback, and address returned comments or discuss them before editing. Use when the user asks to review local code changes, says "gloss this" or "open Gloss", wants to inspect a browser diff, wants comments handled before a PR, or asks to discuss/propose feedback fixes first.
3
+ description: Open local working-tree or branch changes in Gloss for browser review, wait for submitted feedback, continue existing reviews with new turns, and address returned comments or discuss them before editing. Use when the user asks to review local code changes, says "gloss this" or "open Gloss", wants to inspect a browser diff, wants comments handled before a PR, asks for a follow-up review pass, or asks to discuss/propose feedback fixes first.
4
4
  ---
5
5
 
6
6
  # Gloss
@@ -10,11 +10,17 @@ description: Open local working-tree or branch changes in Gloss for browser revi
10
10
  1. Run `gloss open --json` from the repo root unless the user names a base ref.
11
11
  2. Leave the command running. It blocks until the browser review is submitted.
12
12
  3. Parse the JSON output and read `feedbackPath` when present.
13
- 4. Decide the mode (see "Discussion Mode" below). Default is apply-directly.
14
- 5. Address every comment in file and line order, or per the discussion plan.
15
- 6. Validate the fix with the narrowest relevant checks.
16
- 7. When useful, run `gloss resolve <reviewId> --comment <commentId> --summary "<what changed>"` as each comment is handled.
17
- 8. Run `gloss resolve <reviewId> --summary "<what changed>"`, then summarize the feedback addressed and validation performed.
13
+ 4. Check `feedback.reviewScope`:
14
+ - Missing or `{ "mode": "all" }` means the human submitted feedback while viewing the whole turn.
15
+ - `{ "mode": "single", "sha": "..." }` means feedback was submitted from one commit preview.
16
+ - `{ "mode": "range", "fromSha": "...", "toSha": "..." }` means feedback was submitted from a contiguous commit range preview.
17
+ Treat scoped feedback as comments on that submitted slice; do not infer that unreviewed commits were approved.
18
+ 5. Decide the mode (see "Discussion Mode" below). Default is apply-directly.
19
+ 6. Address every comment in file and line order, or per the discussion plan.
20
+ 7. Validate the fix with the narrowest relevant checks.
21
+ 8. When useful, run `gloss resolve <reviewId> --comment <commentId> --summary "<what changed>"` as each comment is handled.
22
+ 9. Run `gloss resolve <reviewId> --summary "<what changed>"`, then summarize the feedback addressed and validation performed.
23
+ 10. If the user asks for another pass on the same work, run `gloss open --review <reviewId> --json` so the next diff is added as a new turn in the same review.
18
24
 
19
25
  ## Discussion Mode
20
26
 
@@ -43,9 +49,14 @@ apply-directly workflow.
43
49
 
44
50
  Feedback is stored under `~/.gloss/reviews/<reviewId>/`:
45
51
 
46
- - `feedback.json` is the machine-readable handoff.
47
- - `feedback.md` is the human-readable copy.
48
- - `resolved.json` tracks mutable comment-level and review-level resolution progress.
52
+ - `turns/<turnId>/feedback.json` is the machine-readable handoff.
53
+ - `turns/<turnId>/feedback.md` is the human-readable copy.
54
+ - `turns/<turnId>/resolved.json` tracks mutable comment-level and turn-level resolution progress.
55
+
56
+ The same browser URL stays open for the whole loop. Each `gloss open --review
57
+ <reviewId> --json` creates or resumes the next turn, and the browser turn history
58
+ shows the lineage. Historical turns are read-only. Keep using the same review ID
59
+ until the user starts unrelated work or explicitly wants a new review.
49
60
 
50
61
  Gloss opens staged, unstaged, and untracked working changes first. If the
51
62
  working tree is clean, it falls back to the branch diff against the best
@@ -55,9 +66,19 @@ comparison such as `origin/main`, `origin/master`, or `HEAD`.
55
66
  If the user asks only to open the review and not wait, run
56
67
  `gloss open --json --no-watch`.
57
68
 
69
+ `gloss open --json` intentionally stays alive until the browser review is
70
+ submitted or the watch timeout expires. If a long-running `gloss open` looks
71
+ unexpected, first check whether it is waiting on an active browser review
72
+ before killing processes.
73
+
74
+ The background daemon shuts down on its own after a short idle window with no
75
+ pending reviews. If process cleanup still looks stale, run `gloss doctor` to
76
+ report unmanaged daemons. Use `gloss stop --all` only when intentionally
77
+ cleaning up all Gloss daemon processes for the current user.
78
+
58
79
  If the user asks for a follow-up review after fixes, commits, or additional
59
- changes, run a fresh `gloss open --json` session instead of reusing the old
60
- review.
80
+ changes in the same review loop, run `gloss open --review <reviewId> --json`.
81
+ Use a fresh `gloss open --json` only for unrelated work or a truly new review.
61
82
 
62
83
  For less-common options, run `gloss open --help` or `gloss --help` instead of
63
84
  guessing flags.
@@ -1 +0,0 @@
1
- @import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700;800&display=swap";/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--font-weight-medium:500;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.fixed{position:fixed}.block{display:block}.contents{display:contents}.hidden{display:none}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}:root{color-scheme:dark;--color-midnight-ink:#111;--color-ghost-ash:#f9f9f9;--color-deep-graphite:#2b2b2b;--color-muted-stone:#b7b3a2;--color-light-grayscale:#eee;--color-shadow-ink:#000;--color-subtle-gray:#d6d6d6;--color-midtone-gray:#6e6e6e;--color-silver-mist:#9c9c9c;--color-dark-frost:#222;--color-slate-border:#565656;--font-primary:"JetBrains Mono", "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;--font-mono:var(--font-primary);--text-caption:10px;--text-small:12px;--text-body:16px;--text-subheading:20px;--text-heading:24px;--text-display:80px;--leading-caption:1.73;--leading-body:1.5;--leading-subheading:1.3;--leading-heading:1.2;--leading-display:.9;--font-weight-regular:400;--font-weight-medium:500;--spacing-8:8px;--spacing-16:16px;--spacing-24:24px;--spacing-32:32px;--spacing-40:40px;--spacing-48:48px;--spacing-64:64px;--spacing-80:80px;--spacing-96:96px;--spacing-128:128px;--spacing-144:144px;--spacing-192:192px;--page-max-width:1200px;--section-gap:48px;--card-padding:32px;--element-gap:16px;--radius-nav:4px;--radius-cards:12px;--radius-buttons:4px;--radius-decorative:20px;--radius-panel:8px;--grid-line:#f9f9f90e;--surface-dark:var(--color-midnight-ink);--surface-inset:#191919;--surface-raised:var(--color-dark-frost);--surface-strong:var(--color-deep-graphite);--surface-soft:#f9f9f90b;--border-soft:#d6d6d62e;--border-strong:var(--color-slate-border);--text-primary:var(--color-ghost-ash);--text-secondary:var(--color-silver-mist);--text-muted:var(--color-muted-stone);--site-accent:#3fb950;--site-accent-hover:#56d364;--site-accent-muted:#2ea04326;--accent:var(--site-accent);--ide-bg:#0d1117;--ide-bg-muted:#151b23;--ide-fg:#f0f6fc;--ide-fg-muted:#9198a1;--ide-border:#3d444d;--ide-success:#3fb950;--ide-success-muted:#2ea04326;--ide-success-gutter:#3fb9504d;--ide-success-word:#2ea04366;--ide-danger:#f85149;--ide-danger-muted:#f851491a;--ide-danger-gutter:#f851494d;--ide-danger-word:#f8514966;--ide-warning:#d29922;--ide-warning-muted:#bb800926;--ide-warning-border:#bb800966;--ide-accent:#4493f8;--ide-accent-muted:#388bfd1a;--ide-accent-border:#388bfd66;font-family:var(--font-primary);background:var(--surface-dark);color:var(--text-primary);font-weight:var(--font-weight-regular)}*{box-sizing:border-box}html{background:var(--surface-dark);scroll-behavior:smooth}body{background:linear-gradient(var(--grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--grid-line) 1px,transparent 1px),var(--surface-dark);min-width:320px;min-height:100vh;color:var(--text-primary);background-size:32px 32px;margin:0}button,textarea{font:inherit}button{color:inherit}a,button{-webkit-tap-highlight-color:transparent}a:focus-visible,button:focus-visible,textarea:focus-visible,.diff-scroller:focus-visible{outline:2px solid var(--accent);outline-offset:2px}code,pre{font-family:var(--font-mono)}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.brand-mark{border:1px solid var(--border-soft);border-radius:var(--radius-nav);background:var(--color-shadow-ink);width:28px;height:28px;display:block}.muted{color:var(--text-secondary);font-size:var(--text-small);line-height:var(--leading-body);margin:4px 0 0}.primary-button,.secondary-button,.icon-button,.marketing-copy,.hero-primary,.hero-secondary,.scene-composer button,.scene-inline-comment button,.scene-submit button{border-radius:var(--radius-buttons)}.primary-button,.secondary-button,.icon-button{cursor:pointer;border:1px solid #0000;justify-content:center;align-items:center;display:inline-flex}.primary-button{gap:var(--spacing-8);min-height:36px;padding:0 var(--spacing-16);background:var(--accent);color:var(--color-midnight-ink);font-size:var(--text-small);font-weight:var(--font-weight-medium)}.primary-button:hover:not(:disabled){background:var(--site-accent-hover)}.primary-button:disabled{cursor:default;opacity:.58}.secondary-button{gap:var(--spacing-8);min-height:36px;padding:0 var(--spacing-16);border:1px solid var(--ide-border);color:var(--ide-fg);font-size:var(--text-small);font-weight:var(--font-weight-medium);background:0 0}.secondary-button:hover{border-color:var(--ide-warning-border);background:var(--ide-warning-muted)}.icon-button{width:28px;height:28px;color:var(--text-secondary);background:0 0}.icon-button:hover{border-color:var(--border-soft);background:var(--surface-strong);color:var(--text-primary)}.spin{animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.review-shell{width:min(1320px,100vw - 32px);padding:var(--spacing-16) 0 112px;margin:0 auto}.topbar{z-index:5;justify-content:space-between;align-items:center;gap:var(--spacing-16);padding:var(--spacing-16) 0;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border-bottom:1px solid var(--border-soft);background:#111111f0;display:flex;position:sticky;top:0}.topbar-main{align-items:flex-start;gap:var(--spacing-16);min-width:0;display:flex}.review-heading{min-width:0}.review-heading h1{color:var(--text-primary);font-size:var(--text-subheading);font-weight:var(--font-weight-medium);letter-spacing:0;margin:0}.brand-row{align-items:center;gap:10px;display:flex}.brand-row h1{color:var(--text-primary);font-size:var(--text-subheading);font-weight:var(--font-weight-medium);letter-spacing:0;margin:0}.product-name{color:var(--text-secondary);font-size:var(--text-small);font-weight:var(--font-weight-medium);margin:0 0 2px}.meta-row{flex-wrap:wrap;gap:6px;margin-top:7px;display:flex}.meta-row span{border:1px solid var(--border-soft);border-radius:var(--radius-nav);background:var(--surface-raised);max-width:min(46vw,420px);min-height:24px;color:var(--text-secondary);font-size:var(--text-small);padding:0 var(--spacing-8);text-overflow:ellipsis;white-space:nowrap;align-items:center;line-height:1;display:inline-flex;overflow:hidden}.branch-pill{align-items:center;gap:var(--spacing-8);border:1px solid var(--border-soft);border-radius:var(--radius-nav);background:var(--surface-raised);min-width:0;max-width:46vw;color:var(--text-primary);font-size:var(--text-small);padding:7px 10px;display:inline-flex}.branch-pill span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.topbar-actions{align-items:center;gap:var(--spacing-8);flex:none;min-width:0;display:inline-flex}.wrap-toggle{border-color:var(--border-soft);background:var(--surface-raised);flex:none}.wrap-toggle[aria-pressed=true]{border-color:var(--ide-accent-border);background:var(--ide-accent-muted);color:var(--ide-accent)}.review-state-banner{align-items:center;gap:var(--spacing-16);margin-top:var(--spacing-16);border:1px solid var(--ide-border);border-radius:var(--radius-panel);color:var(--ide-fg-muted);font-size:var(--text-small);background:#151b23e6;padding:10px 12px;display:flex}.review-state-banner.resolved{border-color:var(--ide-success)}@supports (color:color-mix(in lab,red,red)){.review-state-banner.resolved{border-color:color-mix(in srgb,var(--ide-success) 50%,var(--ide-border))}}.review-state-banner.resolved{background:var(--ide-success)}@supports (color:color-mix(in lab,red,red)){.review-state-banner.resolved{background:color-mix(in srgb,var(--ide-success) 12%,#151b23e6)}}.review-state-title{align-items:center;gap:var(--spacing-8);color:var(--ide-fg);font-weight:var(--font-weight-medium);flex:none;display:inline-flex}.review-state-title svg{color:var(--ide-success)}.review-state-banner p{text-overflow:ellipsis;white-space:nowrap;min-width:0;margin:0;overflow:hidden}.review-state-banner time{color:var(--ide-fg-muted);white-space:nowrap;margin-left:auto}.diff-stack{gap:var(--spacing-16);padding-top:var(--spacing-16);display:grid}.file-card{border:1px solid var(--ide-border);border-radius:var(--radius-cards);background:var(--ide-bg);overflow:hidden}.file-header{width:100%;padding:11px var(--spacing-16);border:0;border-bottom:1px solid var(--ide-border);background:var(--ide-bg-muted);cursor:pointer;text-align:left;grid-template-columns:auto auto minmax(0,1fr) auto auto auto;align-items:center;gap:10px;display:grid}.file-header:hover{background:var(--ide-accent-muted)}.file-path,.rename-path{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.file-path{color:var(--ide-fg);font-family:var(--font-mono);font-size:13px}.rename-path{max-width:240px;color:var(--ide-fg-muted);font-size:var(--text-small)}.stat{font-family:var(--font-mono);font-size:var(--text-small);font-weight:var(--font-weight-medium)}.stat.add{color:var(--ide-success)}.stat.del{color:var(--ide-danger)}.diff-scroller{width:100%;padding:6px 0;overflow-x:auto}.diff-table{border:0;width:max-content;min-width:100%;margin:0}.hunk+.hunk{border-top:1px solid var(--ide-border)}.hunk-header,.hidden-lines,.binary-note{background:var(--ide-accent-muted);width:100%;color:var(--ide-fg-muted);font-family:var(--font-mono);font-size:var(--text-small);text-align:left;border:0}.hunk-header{padding:var(--spacing-8) var(--spacing-16)}.hidden-lines{padding:7px var(--spacing-16);cursor:pointer;display:block}.hidden-lines:hover{color:var(--ide-accent)}.binary-note{padding:var(--spacing-16)}.diff-row{--range-background:var(--ide-accent)}@supports (color:color-mix(in lab,red,red)){.diff-row{--range-background:color-mix(in srgb, var(--ide-accent) 28%, var(--ide-bg-muted))}}.diff-row{--range-border:var(--ide-accent-border);--range-gutter-background:var(--ide-accent)}@supports (color:color-mix(in lab,red,red)){.diff-row{--range-gutter-background:color-mix(in srgb, var(--ide-accent) 40%, var(--ide-bg-muted))}}.diff-row{--range-rail:var(--ide-accent);width:100%;min-height:26px;color:var(--ide-fg);cursor:cell;text-align:left;background:0 0;border:0;grid-template-columns:58px 58px 24px minmax(680px,max-content);align-items:stretch;display:grid;position:relative}.diff-row:hover{background:var(--ide-accent-muted)}.diff-row.read-only{cursor:default}.diff-row.read-only:hover{background:0 0}.diff-row.add.read-only:hover{background:var(--ide-success-muted)}.diff-row.delete.read-only:hover{background:var(--ide-danger-muted)}.diff-row.add{background:var(--ide-success-muted)}.diff-row.delete{background:var(--ide-danger-muted)}.diff-row.add:hover{background:var(--ide-success-gutter)}.diff-row.delete:hover{background:var(--ide-danger-gutter)}.diff-row.range-selected{background:var(--range-background);box-shadow:none}.diff-row.add.range-selected{--range-background:var(--ide-success)}@supports (color:color-mix(in lab,red,red)){.diff-row.add.range-selected{--range-background:color-mix(in srgb, var(--ide-success) 28%, color-mix(in srgb, var(--ide-accent) 24%, var(--ide-bg-muted)))}}.diff-row.add.range-selected{--range-border:var(--ide-success)}@supports (color:color-mix(in lab,red,red)){.diff-row.add.range-selected{--range-border:color-mix(in srgb, var(--ide-success) 70%, var(--ide-accent))}}.diff-row.add.range-selected{--range-gutter-background:var(--ide-accent)}@supports (color:color-mix(in lab,red,red)){.diff-row.add.range-selected{--range-gutter-background:color-mix(in srgb, var(--ide-accent) 40%, color-mix(in srgb, var(--ide-success) 18%, var(--ide-bg-muted)))}}.diff-row.add.range-selected{--range-rail:var(--ide-success)}.diff-row.delete.range-selected{--range-background:var(--ide-danger)}@supports (color:color-mix(in lab,red,red)){.diff-row.delete.range-selected{--range-background:color-mix(in srgb, var(--ide-danger) 30%, color-mix(in srgb, var(--ide-accent) 28%, var(--ide-bg-muted)))}}.diff-row.delete.range-selected{--range-border:var(--ide-danger)}@supports (color:color-mix(in lab,red,red)){.diff-row.delete.range-selected{--range-border:color-mix(in srgb, var(--ide-danger) 72%, var(--ide-accent))}}.diff-row.delete.range-selected{--range-gutter-background:var(--ide-accent)}@supports (color:color-mix(in lab,red,red)){.diff-row.delete.range-selected{--range-gutter-background:color-mix(in srgb, var(--ide-accent) 42%, color-mix(in srgb, var(--ide-danger) 18%, var(--ide-bg-muted)))}}.diff-row.delete.range-selected{--range-rail:var(--ide-danger)}.selection-rail{z-index:2;background:repeating-linear-gradient(to bottom,var(--range-rail) 0 2px,var(--range-rail) 2px 3px,transparent 3px 5px);width:6px;position:absolute;top:0;bottom:0;left:0}@supports (color:color-mix(in lab,red,red)){.selection-rail{background:repeating-linear-gradient(to bottom,var(--range-rail) 0 2px,color-mix(in srgb,var(--range-rail) 42%,transparent) 2px 3px,transparent 3px 5px)}}.selection-rail{pointer-events:none}.diff-row.range-start{box-shadow:inset 0 1px var(--range-border)}.diff-row.range-end{box-shadow:inset 0 -1px var(--range-border)}.diff-row.range-single{box-shadow:inset 0 1px var(--range-border),inset 0 -1px var(--range-border)}.diff-row.range-continues{box-shadow:none}.diff-row.range-single.range-continues{box-shadow:inset 0 1px var(--range-border)}.line-number{-webkit-user-select:none;user-select:none;border-right:1px solid var(--ide-border);color:var(--ide-fg-muted);font-family:var(--font-mono);font-size:var(--text-small);text-align:right;padding-right:10px;line-height:26px}.marker{-webkit-user-select:none;user-select:none;color:var(--ide-fg-muted);font-family:var(--font-mono);font-size:var(--text-small);text-align:center;line-height:26px}.diff-row.add .line-number{background:var(--ide-success-gutter)}.diff-row.delete .line-number{background:var(--ide-danger-gutter)}.diff-row.add .marker{color:var(--ide-success)}.diff-row.delete .marker{color:var(--ide-danger)}.diff-row.range-selected .line-number{background:var(--range-gutter-background);color:var(--ide-fg)}.diff-row.range-selected .marker{color:var(--range-rail)}.diff-row code{white-space:pre;font-family:var(--font-mono);font-size:12.5px;line-height:26px;overflow:visible}.diff-scroller.wrap-lines{overflow-x:hidden}.diff-scroller.wrap-lines .diff-table{width:100%;min-width:0}.diff-scroller.wrap-lines .diff-row{grid-template-columns:58px 58px 24px minmax(0,1fr)}.diff-scroller.wrap-lines .diff-row code{overflow-wrap:anywhere;white-space:pre-wrap;min-width:0}.inline-comment{gap:var(--spacing-8);padding:var(--spacing-8) 10px;border:1px solid var(--ide-warning-border);border-radius:var(--radius-nav);background:var(--ide-warning-muted);color:var(--ide-fg);align-items:flex-start;margin:4px 12px 8px 140px;font-size:13px;display:flex}.inline-comment.resolved{border-color:var(--ide-success)}@supports (color:color-mix(in lab,red,red)){.inline-comment.resolved{border-color:color-mix(in srgb,var(--ide-success) 45%,var(--ide-border))}}.inline-comment.resolved{background:var(--ide-success-muted)}@supports (color:color-mix(in lab,red,red)){.inline-comment.resolved{background:color-mix(in srgb,var(--ide-success-muted) 70%,var(--ide-bg-muted))}}.inline-comment.resolved{color:var(--ide-fg)}@supports (color:color-mix(in lab,red,red)){.inline-comment.resolved{color:color-mix(in srgb,var(--ide-fg) 76%,var(--ide-fg-muted))}}.inline-comment svg{color:var(--ide-warning);flex:none}.inline-comment.resolved svg{color:var(--ide-success)}.inline-comment-content{gap:4px;min-width:0;display:grid}.inline-comment-status{color:var(--ide-fg-muted);font-size:11px;font-weight:var(--font-weight-medium);text-transform:uppercase;line-height:1.2}.inline-comment-body,.inline-comment-summary{overflow-wrap:anywhere}.inline-comment-summary{color:var(--ide-fg-muted);font-size:12px;line-height:1.4}.draft-comment-shell{--draft-range-background:var(--ide-accent)}@supports (color:color-mix(in lab,red,red)){.draft-comment-shell{--draft-range-background:color-mix(in srgb, var(--ide-accent) 28%, var(--ide-bg-muted))}}.draft-comment-shell{--draft-range-border:var(--ide-accent-border);background:var(--draft-range-background);width:100%;box-shadow:inset 0 -1px var(--draft-range-border);padding:10px 12px 10px 140px}.draft-comment-card{border:1px solid var(--ide-border);border-radius:var(--radius-cards);width:min(1040px,100%);color:var(--ide-fg);background:#262626;gap:0;display:grid;overflow:hidden}.draft-comment-title{justify-content:space-between;align-items:center;gap:var(--spacing-16);min-height:48px;padding:0 var(--spacing-16);color:var(--ide-fg);font-size:14px;font-weight:var(--font-weight-medium);border-bottom:1px solid #f0f6fc0f;display:flex}.draft-comment-heading{align-items:center;gap:12px;min-width:0;display:inline-flex}.draft-comment-icon{width:28px;height:28px;color:var(--ide-fg);background:#151515;border:1px solid #f0f6fc21;border-radius:999px;flex:none;justify-content:center;align-items:center;display:inline-flex}.draft-comment-label{color:var(--ide-fg-muted);font-size:var(--text-small);font-weight:var(--font-weight-regular);text-align:right;white-space:nowrap;flex:0 auto}.draft-comment-card textarea{resize:vertical;width:100%;min-height:72px;color:var(--ide-fg);padding:14px var(--spacing-16);font-family:var(--font-mono);background:0 0;border:0;border-radius:0;outline:none;font-size:14px;line-height:1.45}.draft-comment-card textarea::placeholder{color:#f0f6fc57}.draft-comment-actions{justify-content:flex-end;align-items:center;gap:var(--spacing-8);padding:0 var(--spacing-16) 12px;display:flex}.draft-comment-actions .secondary-button{min-height:34px;color:var(--ide-fg-muted);background:0 0;border-color:#0000;padding:0 10px;font-size:14px}.draft-comment-actions .secondary-button:hover{color:var(--ide-fg);background:0 0;border-color:#0000}.draft-comment-actions .primary-button{min-height:34px;padding:0 var(--spacing-16);color:var(--ide-bg);background:#8b949e;border-color:#8b949e;font-size:14px}.draft-comment-actions .primary-button:hover:not(:disabled){background:#b1bac4;border-color:#b1bac4}.popover{z-index:20;width:min(360px,100vw - 24px);padding:var(--spacing-16);border:1px solid var(--ide-border);border-radius:var(--radius-panel);background:var(--ide-bg-muted);position:fixed}.popover-title{color:var(--ide-fg);font-size:13px;font-weight:var(--font-weight-medium);justify-content:space-between;align-items:center;display:flex}.popover-subtitle{color:var(--ide-fg-muted);font-size:var(--text-small);margin-top:2px}.popover textarea{resize:vertical;border:1px solid var(--ide-border);background:var(--ide-bg);width:100%;min-height:96px;color:var(--ide-fg);border-radius:0;outline:none;margin-top:10px;padding:9px}.popover textarea:focus{border-color:var(--ide-accent)}.popover-actions,.submit-actions{justify-content:flex-end;align-items:center;gap:10px;display:flex}.popover-actions{margin-top:10px}.submit-bar{right:var(--spacing-16);bottom:var(--spacing-16);left:var(--spacing-16);z-index:10;justify-content:space-between;align-items:center;gap:var(--spacing-16);border:1px solid var(--ide-border);border-radius:var(--radius-cards);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#151b23f5;width:min(1320px,100vw - 32px);margin:0 auto;padding:12px;display:flex;position:fixed}.comment-list{gap:var(--spacing-8);flex:1;min-width:0;display:flex;overflow-x:auto}.comment-chip{align-items:center;gap:var(--spacing-8);border:1px solid var(--ide-warning-border);border-radius:var(--radius-nav);background:var(--ide-warning-muted);min-width:max-content;color:var(--ide-fg);font-family:var(--font-mono);font-size:var(--text-small);padding:5px 7px 5px 10px;display:inline-flex}.comment-chip .icon-button{color:var(--ide-warning)}.submit-message{max-width:36vw;color:var(--ide-fg-muted);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.submit-message.error{color:var(--ide-danger)}.submit-message.done{color:var(--ide-success)}.empty-shell{min-height:100vh;padding:var(--spacing-24);place-items:center;display:grid}.empty-panel,.empty-diff{border:1px solid var(--border-soft);border-radius:var(--radius-cards);background:var(--surface-raised)}.empty-panel{width:min(420px,100%);padding:var(--spacing-24);text-align:center}.empty-panel h1{margin:0 0 var(--spacing-8);font-size:var(--text-heading);font-weight:var(--font-weight-medium)}.empty-panel p{color:var(--text-secondary)}.empty-diff{padding:var(--spacing-24);color:var(--text-secondary)}.setup-page{width:min(860px,100vw - 32px);padding:var(--spacing-32) 0 var(--spacing-80);margin:0 auto}.setup-nav{z-index:3;justify-content:space-between;align-items:center;gap:var(--spacing-16);margin-bottom:var(--spacing-64);padding:var(--spacing-16) 0;border-bottom:1px solid var(--border-soft);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);font-size:var(--text-small);background:#111111f0;display:flex;position:sticky;top:0}.setup-nav>a:not(.marketing-wordmark),.setup-note a{color:var(--accent);text-decoration:none}.setup-nav>a:not(.marketing-wordmark):hover,.setup-note a:hover{text-decoration:underline}.setup-header h1{max-width:760px;color:var(--text-primary);font-size:64px;font-weight:var(--font-weight-medium);line-height:var(--leading-display);letter-spacing:0;margin:0}.setup-header p{max-width:660px;margin:var(--spacing-16) 0 0;color:var(--text-secondary);font-size:var(--text-body);line-height:var(--leading-body)}.setup-section{margin-top:var(--section-gap);border-top:1px solid var(--border-soft);padding-top:var(--spacing-32)}.setup-section h2{margin:0 0 var(--spacing-16);color:var(--accent);font-size:var(--text-small);font-weight:var(--font-weight-medium);letter-spacing:0;text-transform:uppercase}.setup-section p,.setup-section li{color:var(--color-subtle-gray);font-size:15px;line-height:1.65}.setup-section ul{margin:12px 0 0;padding-left:22px}.setup-section pre{overflow-wrap:anywhere;border:1px solid var(--border-soft);border-radius:var(--radius-panel);background:var(--surface-raised);color:var(--text-primary);padding:var(--spacing-16);white-space:pre-wrap;margin:12px 0 0;font-size:13px;line-height:1.7;overflow-x:auto}.setup-section code{color:var(--text-primary)}.setup-note{margin-top:var(--section-gap);border:1px solid var(--border-strong);border-radius:var(--radius-cards);background:var(--surface-raised);padding:var(--spacing-16)}.setup-note p{color:var(--color-subtle-gray);margin:0;font-size:15px;line-height:1.65}.marketing-page{--marketing-max:var(--page-max-width);background:var(--surface-dark);min-height:100vh}.marketing-hero{border-bottom:1px solid var(--border-soft);background:linear-gradient(to bottom,transparent 68%,var(--surface-dark) 100%),linear-gradient(var(--grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--grid-line) 1px,transparent 1px),var(--surface-dark);min-height:100vh;padding-bottom:var(--spacing-64);background-size:100% 100%,32px 32px,32px 32px}.marketing-wordmark{color:var(--text-primary);font-weight:var(--font-weight-medium);align-items:center;gap:9px;margin-right:auto;text-decoration:none;display:inline-flex}.marketing-wordmark .brand-mark{width:26px;height:26px}.hero-copy{width:min(var(--marketing-max),calc(100vw - 40px));gap:var(--spacing-64);padding:var(--spacing-80) 0 var(--spacing-32);grid-template-columns:minmax(0,760px) minmax(260px,360px);align-items:end;margin:0 auto;display:grid}.hero-copy-main{min-width:0}.hero-logo{margin-bottom:var(--spacing-32);display:inline-flex}.hero-logo .brand-mark{width:76px;height:76px}.hero-kicker,.section-heading p{color:var(--accent);font-size:var(--text-small);font-weight:var(--font-weight-medium);letter-spacing:0;text-transform:uppercase;margin:0}.hero-copy h1{color:var(--text-primary);font-size:var(--text-display);font-weight:var(--font-weight-medium);line-height:var(--leading-display);letter-spacing:0;margin:0}.hero-subtitle{max-width:720px;margin:var(--spacing-16) 0 0;color:var(--text-primary);font-size:40px;font-weight:var(--font-weight-medium);line-height:1}.hero-body{max-width:640px;margin:var(--spacing-16) 0 0;color:var(--color-subtle-gray);font-size:var(--text-body);line-height:var(--leading-body)}.hero-actions{margin-top:var(--spacing-24);flex-wrap:wrap;gap:10px;display:flex}.hero-primary,.hero-secondary{justify-content:center;align-items:center;gap:var(--spacing-8);min-height:42px;padding:0 var(--spacing-16);font-size:var(--text-body);font-weight:var(--font-weight-medium);text-decoration:none;display:inline-flex}.hero-primary{border:1px solid var(--accent);background:var(--accent);color:var(--color-midnight-ink)}.hero-primary:hover{border-color:var(--site-accent-hover);background:var(--site-accent-hover);color:var(--color-midnight-ink);text-decoration:none}.hero-secondary{border:1px solid var(--accent);color:var(--accent);background:0 0}.hero-secondary:hover{background:var(--site-accent-muted);text-decoration:none}.hero-quickstart{border-left:2px solid var(--accent);padding:2px 0 2px var(--spacing-16);justify-items:start;gap:10px;display:grid}.hero-quickstart span{color:var(--text-secondary);font-size:var(--text-small);font-weight:var(--font-weight-medium)}.hero-quickstart code{max-width:100%;color:var(--text-primary);font-family:var(--font-mono);font-size:var(--text-small);white-space:nowrap;line-height:1.55;overflow-x:auto}.hero-scene{width:min(var(--marketing-max),calc(100vw - 40px));border:1px solid var(--ide-border);border-radius:var(--radius-cards);background:var(--ide-bg);margin:0 auto;overflow:hidden}.scene-topbar,.scene-shell,.scene-submit{min-width:0}.scene-topbar{justify-content:space-between;align-items:center;gap:var(--spacing-16);border-bottom:1px solid var(--ide-border);background:var(--ide-bg-muted);padding:10px 12px;display:flex}.scene-brand,.scene-meta,.terminal-header,.feedback-title{align-items:center;gap:var(--spacing-8);min-width:0;color:var(--ide-fg-muted);font-size:var(--text-small);display:flex}.scene-meta span,.feedback-title span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.scene-shell{background:var(--ide-bg);grid-template-rows:auto minmax(0,1fr);grid-template-columns:minmax(0,1fr) minmax(320px,.42fr);display:grid}.scene-terminal{border-bottom:1px solid var(--ide-border);background:var(--ide-bg);grid-column:1/-1;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:14px;padding:10px 12px;display:grid}.terminal-lines{min-width:0;color:var(--ide-fg-muted);font-family:var(--font-mono);font-size:var(--text-small);white-space:nowrap;gap:14px;display:flex;overflow:hidden}.terminal-lines p{margin:0}.terminal-lines span{color:var(--ide-success)}.scene-review{min-height:520px;position:relative;overflow:hidden}.scene-file-header{align-items:center;gap:var(--spacing-8);border:0;border-bottom:1px solid var(--ide-border);background:var(--ide-bg-muted);width:100%;color:var(--ide-fg);cursor:default;text-align:left;grid-template-columns:auto auto minmax(0,1fr) auto auto;padding:9px 12px;display:grid}.scene-file-header span{font-family:var(--font-mono);font-size:var(--text-small);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.scene-add{color:var(--ide-success);font-size:var(--text-small)}.scene-del{color:var(--ide-danger);font-size:var(--text-small)}.scene-hidden,.scene-hunk{background:var(--ide-accent-muted);width:100%;color:var(--ide-fg-muted);font-family:var(--font-mono);font-size:var(--text-small);text-align:left;border:0}.scene-hidden{padding:var(--spacing-8) 12px;cursor:pointer}.scene-hidden:hover{color:var(--ide-accent)}.scene-hunk{padding:var(--spacing-8) 12px}.scene-row{width:100%;min-height:27px;color:var(--ide-fg);cursor:pointer;font-family:var(--font-mono);font-size:var(--text-small);text-align:left;background:0 0;border:0;grid-template-columns:48px 48px minmax(480px,1fr);align-items:center;padding:0;display:grid}.scene-row:hover{background:var(--ide-accent-muted)}.scene-row span{border-right:1px solid var(--ide-border);color:var(--ide-fg-muted);text-align:right;padding-right:9px;line-height:27px}.scene-row.add span{background:var(--ide-success-gutter)}.scene-row.remove span{background:var(--ide-danger-gutter)}.scene-row code{text-overflow:ellipsis;white-space:pre;min-width:0;padding-left:12px;display:block;overflow:hidden}.scene-row.add{background:var(--ide-success-muted)}.scene-row.add:hover{background:var(--ide-success-gutter)}.scene-row.remove{background:var(--ide-danger-muted)}.scene-row.remove:hover{background:var(--ide-danger-gutter)}.scene-row.selected{outline:1px solid var(--ide-accent-border);outline-offset:-1px}.scene-row.dimmed{color:var(--ide-fg-muted)}.scene-row.agent-dimmed{opacity:.5}.scene-row.agent-applied{outline:1px solid var(--ide-success)}@supports (color:color-mix(in lab,red,red)){.scene-row.agent-applied{outline:1px solid color-mix(in srgb,var(--ide-success) 42%,transparent)}}.scene-row.agent-applied{outline-offset:-1px}.scene-applied-status{border-left:2px solid var(--ide-success);color:var(--ide-success);font-size:var(--text-small);align-items:center;gap:7px;margin:4px 12px 4px 112px;padding:4px 0 4px 10px;display:inline-flex}.scene-inline-comment{border:1px solid var(--ide-warning-border);border-radius:var(--radius-nav);background:var(--ide-warning-muted);color:var(--ide-fg);grid-template-columns:minmax(0,1fr) auto;align-items:stretch;gap:0;margin:4px 12px 4px 112px;font-size:13px;line-height:1.45;display:grid;overflow:hidden}.scene-inline-comment-body{align-items:start;gap:var(--spacing-8);min-width:0;color:inherit;padding:var(--spacing-8) 10px;cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;grid-template-columns:auto minmax(0,1fr);display:grid}.scene-inline-comment-body:hover{background:var(--ide-warning)}@supports (color:color-mix(in lab,red,red)){.scene-inline-comment-body:hover{background:color-mix(in srgb,var(--ide-warning) 14%,transparent)}}.scene-inline-comment svg{color:var(--ide-warning);flex:none}.scene-inline-comment span{overflow-wrap:anywhere;min-width:0}.scene-inline-comment-remove{width:32px;color:var(--ide-fg-muted);cursor:pointer;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;display:inline-flex}.scene-inline-comment-remove:hover{background:var(--ide-warning)}@supports (color:color-mix(in lab,red,red)){.scene-inline-comment-remove:hover{background:color-mix(in srgb,var(--ide-warning) 14%,transparent)}}.scene-inline-comment-remove:hover{color:var(--ide-fg)}.scene-composer{width:min(560px,100% - 124px);margin:var(--spacing-8) 12px 12px 112px;border:1px solid var(--ide-border);border-radius:var(--radius-panel);background:var(--ide-bg-muted);display:grid;overflow:hidden}.scene-composer-title{justify-content:space-between;align-items:center;gap:var(--spacing-16);border-bottom:1px solid #f0f6fc0f;min-height:42px;padding:0 12px;display:flex}.scene-composer-title strong{color:var(--ide-fg);font-size:13px;font-weight:var(--font-weight-medium)}.scene-composer-title span{color:var(--ide-fg-muted);font-size:var(--text-small);text-align:right}.scene-composer textarea{resize:vertical;width:100%;min-height:72px;color:var(--ide-fg);font-family:var(--font-mono);background:0 0;border:0;outline:none;padding:12px;font-size:13px;line-height:1.45}.scene-composer textarea::placeholder{color:#f0f6fc57}.scene-composer-actions{justify-content:flex-end;gap:var(--spacing-8);padding:0 12px 12px;display:flex}.scene-composer button,.scene-submit button{border:1px solid var(--accent);background:var(--accent);min-height:30px;color:var(--color-midnight-ink);font-size:var(--text-small);font-weight:var(--font-weight-medium);cursor:pointer;align-items:center;gap:7px;padding:0 10px;display:inline-flex}.scene-composer button:disabled,.scene-submit button:disabled{cursor:default;opacity:.56}.scene-composer .scene-secondary-action{color:var(--ide-fg-muted);background:0 0;border-color:#0000}.scene-composer .scene-secondary-action:hover{color:var(--ide-fg)}.scene-feedback{border-left:1px solid var(--ide-border);background:var(--ide-bg-muted);grid-template-rows:auto minmax(0,1fr);align-items:stretch;gap:12px;padding:12px;display:grid}.scene-feedback pre{border-radius:var(--radius-nav);background:var(--ide-bg);min-height:0;max-height:100%;color:var(--ide-fg-muted);font-family:var(--font-mono);white-space:pre-wrap;border:1px solid #f0f6fc14;margin:0;padding:10px;font-size:11px;line-height:1.5;overflow:auto}.agent-update-card{align-content:start;gap:var(--spacing-16);border-radius:var(--radius-nav);background:var(--ide-bg);min-height:0;color:var(--ide-fg-muted);border:1px solid #f0f6fc14;padding:12px;display:grid}.agent-update-card code{color:var(--ide-fg);font-family:var(--font-mono);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:1.45;display:block;overflow:hidden}.agent-update-card ul{gap:10px;margin:0;padding:0;display:grid}.agent-update-card li{align-items:center;gap:var(--spacing-8);color:var(--ide-fg);font-size:13px;list-style:none;display:flex}.agent-update-card li svg{color:var(--ide-success);flex:none}.scene-submit{border-top:1px solid var(--ide-border);background:var(--ide-bg-muted);color:var(--ide-fg-muted);justify-content:flex-end;align-items:center;gap:12px;padding:10px;font-size:13px;display:flex}.marketing-band{border-bottom:1px solid var(--border-soft);padding:var(--spacing-80) max(20px,calc((100vw - var(--marketing-max)) / 2));scroll-margin-top:var(--spacing-24)}.section-heading{gap:10px;max-width:760px;display:grid}.section-heading h2{max-width:720px;color:var(--text-primary);font-size:40px;font-weight:var(--font-weight-medium);letter-spacing:0;margin:0;line-height:1.06}.demo-video-band{gap:var(--spacing-32);display:grid}.demo-video-header{gap:var(--spacing-32);grid-template-columns:minmax(0,1fr) minmax(280px,.48fr);align-items:end;display:grid}.demo-video-caption{border-left:2px solid var(--accent);color:var(--color-subtle-gray);padding-left:var(--spacing-16);margin:0;font-size:14px;line-height:1.65}.demo-video-frame{border:1px solid var(--ide-border);border-radius:var(--radius-cards);aspect-ratio:16/9;background:var(--ide-bg);width:100%;overflow:hidden}.demo-video-frame video{background:var(--ide-bg);object-fit:cover;width:100%;height:100%;display:block}.install-grid{margin-top:var(--spacing-32);border-top:1px solid var(--border-soft);gap:0;display:grid}.command-line{border-bottom:1px solid var(--border-soft);color:var(--color-subtle-gray);grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;padding:13px 0;display:grid}.command-line>span{color:var(--accent);font-family:var(--font-mono)}.command-line code{color:var(--text-primary);font-family:var(--font-mono);white-space:nowrap;font-size:13px;overflow:auto}.marketing-copy{border:1px solid var(--accent);min-height:30px;color:var(--accent);font-size:var(--text-small);font-weight:var(--font-weight-medium);cursor:pointer;background:0 0;justify-content:center;align-items:center;gap:7px;padding:0 10px;display:inline-flex}.marketing-copy:hover{background:var(--site-accent-muted)}.agent-prompt{align-items:center;gap:var(--spacing-16);margin-top:var(--spacing-24);border-left:2px solid var(--accent);padding:2px 0 2px var(--spacing-16);grid-template-columns:auto minmax(0,1fr) auto;display:grid}.agent-prompt-label,.agent-prompt-links{align-items:center;gap:var(--spacing-8);display:flex}.agent-prompt-label{color:var(--accent);font-size:13px;font-weight:var(--font-weight-medium)}.agent-prompt p{color:var(--text-primary);margin:0;font-size:14px;line-height:1.55}.agent-skill-command{border:1px solid var(--border-soft);border-radius:var(--radius-panel);background:var(--surface-raised);grid-column:1/-1;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;padding:10px 12px;display:grid}.agent-skill-command code{white-space:nowrap;font-size:12px;overflow:auto}.agent-prompt pre{border:1px solid var(--border-soft);border-radius:var(--radius-panel);background:var(--surface-raised);color:var(--text-primary);font-family:var(--font-mono);white-space:pre-wrap;grid-column:1/-2;margin:0;padding:12px;font-size:12px;line-height:1.65;overflow-x:auto}.agent-prompt>.marketing-copy{place-self:start end}.agent-prompt code,.contract-copy code{color:var(--text-primary);font-family:var(--font-mono);font-size:.92em}.agent-prompt-links{white-space:nowrap;justify-content:flex-end}.agent-prompt-links a{color:var(--accent);font-size:13px;font-weight:var(--font-weight-medium);text-decoration:none}.agent-prompt-links a:hover{text-decoration:underline}.workflow-story{margin-top:var(--spacing-32);border-top:1px solid var(--border-soft);gap:0;display:grid}.workflow-step{gap:var(--spacing-24);border-bottom:1px solid var(--border-soft);padding:var(--spacing-24) 0;grid-template-columns:56px minmax(0,1fr);display:grid}.workflow-step:last-child{border-bottom:0}.workflow-step span{color:var(--accent);font-family:var(--font-mono);font-size:var(--text-small)}.workflow-step h3{color:var(--text-primary);font-size:var(--text-subheading);font-weight:var(--font-weight-medium);letter-spacing:0;margin:0}.workflow-step p,.contract-copy p{color:var(--color-subtle-gray);margin:6px 0 0;font-size:14px;line-height:1.65}.contract-layout{gap:var(--spacing-24);margin-top:var(--spacing-32);border-top:1px solid var(--border-soft);padding-top:var(--spacing-24);grid-template-columns:minmax(0,1fr) minmax(280px,.62fr);align-items:center;display:grid}.contract-layout pre{border-left:2px solid var(--border-soft);color:var(--color-subtle-gray);font-family:var(--font-mono);padding:2px 0 2px var(--spacing-16);margin:0;font-size:13px;line-height:1.7;overflow:auto}.contract-copy{max-width:460px}.contract-copy p{border-left:2px solid var(--accent);margin:0;padding-left:12px}.marketing-footer{padding:var(--spacing-32) max(20px,calc((100vw - var(--marketing-max)) / 2));justify-content:center;display:flex}.marketing-footer a{align-items:center;gap:var(--spacing-8);color:var(--accent);font-size:13px;font-weight:var(--font-weight-medium);text-decoration:none;display:inline-flex}.marketing-footer a:hover{text-underline-offset:6px;text-decoration:underline}@media(max-width:980px){.hero-copy,.hero-scene{width:min(720px,100vw - 32px)}.hero-copy{gap:var(--spacing-32);padding:var(--spacing-64) 0 var(--spacing-32);grid-template-columns:1fr}.hero-copy h1{font-size:64px}.hero-subtitle,.section-heading h2{font-size:32px}.hero-quickstart{max-width:460px}.scene-terminal,.scene-feedback{grid-template-columns:1fr}.scene-shell{grid-template-columns:minmax(0,1fr)}.scene-feedback{border-top:1px solid var(--ide-border);border-left:0}.terminal-lines{gap:3px;display:grid}.scene-submit{justify-content:space-between}.contract-layout,.demo-video-header{grid-template-columns:1fr}.demo-video-caption{max-width:560px}}@media(max-width:720px){.review-shell{width:calc(100vw - 18px)}.topbar{flex-direction:column;align-items:flex-start}.topbar-actions{width:100%}.branch-pill{max-width:100%}.review-state-banner{flex-direction:column;align-items:flex-start;gap:6px}.review-state-banner p{white-space:normal}.review-state-banner time{margin-left:0}.file-header{grid-template-columns:auto auto minmax(0,1fr) auto auto}.rename-path{display:none}.diff-row{grid-template-columns:46px 46px 22px minmax(520px,max-content)}.diff-scroller.wrap-lines .diff-row{grid-template-columns:46px 46px 22px minmax(0,1fr)}.inline-comment{margin-left:108px}.draft-comment-shell{padding-left:114px}.draft-comment-title{min-height:auto;padding:12px var(--spacing-16);flex-direction:column;align-items:flex-start;gap:4px}.draft-comment-label{text-align:left;white-space:normal}.submit-bar{flex-direction:column;align-items:stretch}.submit-actions{justify-content:space-between}}@media(max-width:640px){.setup-nav{white-space:nowrap;justify-content:flex-start;gap:14px;overflow-x:auto}.marketing-wordmark{min-width:max-content}.hero-copy,.hero-scene{width:calc(100vw - 28px)}.hero-copy{padding-top:var(--spacing-48)}.hero-copy h1,.setup-header h1{font-size:48px}.hero-logo .brand-mark{width:58px;height:58px}.hero-subtitle,.section-heading h2{font-size:var(--text-heading);line-height:var(--leading-heading)}.hero-body{font-size:15px}.hero-quickstart{max-width:none}.demo-video-band{gap:var(--spacing-24)}.scene-meta,.scene-terminal,.scene-feedback{display:none}.scene-review{min-height:560px}.scene-row{grid-template-columns:38px 38px minmax(0,1fr)}.scene-inline-comment,.scene-composer{width:calc(100% - 100px);margin-left:88px}.scene-composer-title{flex-direction:column;align-items:flex-start;gap:3px;padding:10px 12px}.scene-composer-title span{text-align:left}.command-line,.agent-prompt{grid-template-columns:1fr}.agent-prompt-links{justify-content:flex-start}.agent-prompt pre,.agent-skill-command,.agent-prompt>.marketing-copy{grid-column:auto;justify-self:stretch}.agent-skill-command{grid-template-columns:1fr}.agent-skill-command .marketing-copy{justify-self:stretch}.workflow-step{gap:var(--spacing-8);grid-template-columns:1fr}.workflow-step:last-child{border-bottom:0}.marketing-band{padding:var(--spacing-64) var(--spacing-16)}.marketing-footer{padding:var(--spacing-32) var(--spacing-16);justify-content:center}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}