getgloss 0.7.2 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,37 @@ 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
+ Use `gloss clear --dry-run` to preview old completed review artifacts, and
184
+ `gloss clear` to delete completed artifacts older than 30 days. Pending reviews
185
+ are always preserved.
186
+
168
187
  Mark a submitted review handled after applying feedback:
169
188
 
170
189
  ```bash
171
190
  gloss resolve <reviewId> --summary "Applied review feedback"
172
191
  ```
173
192
 
174
- Mark one submitted comment handled while work is in progress:
193
+ Mark one submitted comment handled:
175
194
 
176
195
  ```bash
177
196
  gloss resolve <reviewId> --comment <commentId> --summary "Applied this comment"
178
197
  ```
179
198
 
180
- For a follow-up pass after fixes or new commits, start a fresh session:
199
+ For a follow-up pass after fixes or new commits in the same review loop:
181
200
 
182
201
  ```bash
183
- gloss open --json
202
+ gloss open --review <reviewId> --json
184
203
  ```
185
204
 
186
205
  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.1",
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,63 +1,82 @@
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, inspect Gloss status/state, 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, asks to find Gloss review state/artifacts, or asks to discuss/propose feedback fixes first.
4
4
  ---
5
5
 
6
6
  # Gloss
7
7
 
8
8
  ## Workflow
9
9
 
10
- 1. Run `gloss open --json` from the repo root unless the user names a base ref.
11
- 2. Leave the command running. It blocks until the browser review is submitted.
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.
10
+ 1. From the repo root, run `gloss open --json` unless the user names a base ref.
11
+ 2. Leave it running; it waits until browser submission. Use `--no-watch` only when the user only wants the review opened.
12
+ 3. Parse the JSON output and read `feedbackPath`.
13
+ 4. Apply feedback in file/line order unless "Discussion Mode" applies.
14
+ 5. Validate with the narrowest relevant checks.
15
+ 6. Resolve handled feedback with `gloss resolve <reviewId> --comment <commentId> --summary "<what changed>"` when useful, then `gloss resolve <reviewId> --summary "<what changed>"`.
16
+ 7. For another pass on the same work, run `gloss open --review <reviewId> --json`; use a fresh `gloss open --json` only for unrelated work.
18
17
 
19
18
  ## Discussion Mode
20
19
 
21
- Some feedback is ambiguous, opinionated, or wide-reaching enough that the right
22
- move is to talk through it before editing code. Enter discussion mode when any
23
- of these are true:
20
+ Enter discussion mode when the user asks to discuss/propose first, or when a
21
+ comment is too ambiguous to apply safely. Trigger phrases include "discuss
22
+ first", "talk through it", "don't apply yet", "review the comments with me",
23
+ and "propose first".
24
24
 
25
- - The user asked for it before running gloss — phrases like "discuss first",
26
- "talk through it", "don't apply yet", "let's discuss", "review the comments
27
- with me", or "propose first".
28
- - A comment is genuinely ambiguous and you'd otherwise have to guess intent.
25
+ When discussing:
29
26
 
30
- When in discussion mode:
27
+ 1. Read every comment in `feedback.json` before editing. Do not edit files yet.
28
+ 2. Group comments by file. Restate each comment in one line, propose the change, and flag conflicts/out-of-scope items.
29
+ 3. Ask which items to apply, modify, or skip, then wait for the answer.
30
+ 4. Apply only approved items, validate, then resolve as usual. Mention skipped items in the resolution summary.
31
31
 
32
- 1. Read every comment in `feedback.json` first. Do not edit any files yet.
33
- 2. Group comments by file. For each, restate the comment in one line and
34
- propose how you'd address it — the approach plus the lines that would
35
- change. Flag any that conflict, are out of scope, or need a decision.
36
- 3. Ask the user which to apply, modify, or skip. Wait for an answer.
37
- 4. Apply only what's approved. Skip or defer the rest, and note skipped items
38
- in the resolution summary so they aren't silently dropped.
39
- 5. Validate, then resolve as usual.
32
+ Default when the user did not request discussion and comments are clear:
33
+ apply feedback directly.
40
34
 
41
- Default (no discussion request and no ambiguous comments): the current
42
- apply-directly workflow.
35
+ ## Feedback Scope
43
36
 
44
- Feedback is stored under `~/.gloss/reviews/<reviewId>/`:
37
+ Check `feedback.reviewScope` before editing:
45
38
 
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.
39
+ - Missing or `{ "mode": "all" }`: feedback covers the whole turn.
40
+ - `{ "mode": "single", "sha": "..." }`: feedback covers one commit preview.
41
+ - `{ "mode": "range", "fromSha": "...", "toSha": "..." }`: feedback covers a contiguous commit range.
42
+
43
+ Treat scoped feedback as comments on that submitted slice; do not infer that
44
+ unreviewed commits were approved.
45
+
46
+ ## State And Artifacts
47
+
48
+ For existing loops, run `gloss status --json` first; it reports daemon state and
49
+ active review metadata. If the daemon is down or the review ID is missing,
50
+ inspect durable state under `${GLOSS_STATE_DIR:-$HOME/.gloss}`:
51
+
52
+ - `server.json`: daemon pid, port, version, and state dir.
53
+ - `reviews/<reviewId>/meta.json`: review status, cwd, active turn, and turn summaries.
54
+ - `reviews/<reviewId>/turns/<turnId>/`: `turn.json`, `diff.json`, `feedback.json`, `feedback.md`, `resolved.json`.
55
+
56
+ Use this pattern to discover review files:
57
+
58
+ ```bash
59
+ state_dir="${GLOSS_STATE_DIR:-$HOME/.gloss}"
60
+ find "$state_dir/reviews" -maxdepth 4 -type f
61
+ ```
62
+
63
+ The same browser URL stays open for each review loop. Historical turns are
64
+ read-only.
49
65
 
50
66
  Gloss opens staged, unstaged, and untracked working changes first. If the
51
67
  working tree is clean, it falls back to the branch diff against the best
52
68
  available merge-base. Use `--base <ref>` only when the user asks for a specific
53
69
  comparison such as `origin/main`, `origin/master`, or `HEAD`.
54
70
 
55
- If the user asks only to open the review and not wait, run
56
- `gloss open --json --no-watch`.
71
+ `gloss open --json` intentionally stays alive until the browser review is
72
+ submitted or times out. If it looks stuck, check whether it is waiting on an
73
+ active browser review before killing processes.
57
74
 
58
- 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.
75
+ The background daemon shuts down on its own after a short idle window with no
76
+ pending reviews. Use `gloss doctor` for stale process cleanup diagnostics,
77
+ `gloss stop --all` only for intentional daemon cleanup, and
78
+ `gloss clear --dry-run` before deleting completed artifacts older than 30 days
79
+ with `gloss clear`. Pending reviews are always preserved.
61
80
 
62
81
  For less-common options, run `gloss open --help` or `gloss --help` instead of
63
82
  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}