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.
- package/README.md +59 -18
- package/dist/cli/index.js +1407 -343
- package/dist/cli/index.js.map +1 -1
- package/dist/server/daemon.js +1397 -193
- package/dist/server/daemon.js.map +1 -1
- package/dist/web/assets/index-DBK7WjlV.css +1 -0
- package/dist/web/assets/index-DkylW082.js +244 -0
- package/dist/web/assets/syntax-DdLzhglo.js +13 -0
- package/dist/web/index.html +2 -2
- package/dist/web/prompt.md +14 -6
- package/dist/web/setup.md +27 -8
- package/package.json +4 -1
- package/skill/SKILL.md +55 -36
- package/dist/web/assets/index-Dj8yXNw3.css +0 -1
- package/dist/web/assets/index-mwzx-OHz.js +0 -189
package/dist/web/index.html
CHANGED
|
@@ -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-
|
|
32
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
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>
|
package/dist/web/prompt.md
CHANGED
|
@@ -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.
|
|
28
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
11
|
-
2. Leave
|
|
12
|
-
3. Parse the JSON output and read `feedbackPath
|
|
13
|
-
4.
|
|
14
|
-
5.
|
|
15
|
-
6.
|
|
16
|
-
7.
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
33
|
-
|
|
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
|
-
|
|
42
|
-
apply-directly workflow.
|
|
35
|
+
## Feedback Scope
|
|
43
36
|
|
|
44
|
-
|
|
37
|
+
Check `feedback.reviewScope` before editing:
|
|
45
38
|
|
|
46
|
-
- `feedback
|
|
47
|
-
- `feedback
|
|
48
|
-
- `
|
|
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
|
-
|
|
56
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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}
|