diff --git a/.changeset/unified-layout-language.md b/.changeset/unified-layout-language.md new file mode 100644 index 000000000..006d4d25c --- /dev/null +++ b/.changeset/unified-layout-language.md @@ -0,0 +1,5 @@ +--- +"hunkdiff": minor +--- + +Rename the single-column diff layout to unified, add canonical OpenTUI and extension API v23 fields, and retain deprecated stack compatibility across existing CLI, config, command, OpenTUI, and extension integrations. diff --git a/AGENTS.md b/AGENTS.md index 9c6dda1e5..79fe7795d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -98,7 +98,7 @@ ReviewIntent + caller facts -> planReviewIntent -> ReviewAction[] -> reducer -> - Keep the app review-first: the main pane is a single top-to-bottom stream of all visible file diffs. - The sidebar is for navigation. Selecting a file jumps to that file in the main review stream; it should not collapse the main pane to one file. - Keep Pierre as the diff engine and renderer foundation. Do not switch the main renderer back to OpenTUI's built-in `` widget. -- Keep split and stack views terminal-native and driven from the same normalized diff model. +- Keep split and unified views terminal-native and driven from the same normalized diff model. - Preserve mouse + keyboard parity for primary actions. - Keep the chrome restrained: top menu bar, minimal borders, no redundant metadata headers. @@ -165,7 +165,7 @@ ReviewIntent + caller facts -> planReviewIntent -> ReviewAction[] -> reducer -> ## review behavior - Default behavior is a multi-file review stream in sidebar order. -- Layout modes are `auto`, `split`, and `stack`. `auto` chooses split on wide terminals and stack +- Layout modes are `auto`, `split`, and `unified`. `auto` chooses split on wide terminals and unified on narrow ones; explicit modes override it. - `[` and `]` navigate hunks across the full review stream. Do not reintroduce `j`/`k` hunk navigation unless the user asks. - Agent context belongs beside the code, not hidden in a separate mode or workflow. diff --git a/README.md b/README.md index 1811d16ec..c3c4d4c61 100644 --- a/README.md +++ b/README.md @@ -11,21 +11,21 @@ Hunk is a review-first terminal diff viewer for agent-authored changesets, built - multi-file review stream with sidebar navigation - inline AI and agent annotations beside the code -- split, stack, and responsive auto layouts +- split, unified, and responsive auto layouts - watch mode for auto-reloading file and Git-backed reviews - keyboard, mouse, pager, and Git difftool support
- image + image
Split view with sidebar and inline AI notes
- image + image
- Stacked view and mouse-selectable menus + Unified view and mouse-selectable menus
@@ -135,17 +135,17 @@ For the full live-session and `--agent-context` workflow guide, see [the agent w ## Feature comparison -| Capability | [hunk](https://github.com/modem-dev/hunk) | [lumen](https://github.com/jnsahaj/lumen) | [difftastic](https://github.com/Wilfred/difftastic) | [delta](https://github.com/dandavison/delta) | [diff-so-fancy](https://github.com/so-fancy/diff-so-fancy) | [diff](https://www.gnu.org/software/diffutils/) | -| ---------------------------------- | ----------------------------------------- | ----------------------------------------- | --------------------------------------------------- | -------------------------------------------- | ---------------------------------------------------------- | ----------------------------------------------- | -| Review-first interactive UI | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | -| Multi-file review stream + sidebar | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | -| Inline agent / AI annotations | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | -| Responsive auto split/stack layout | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | -| Mouse support inside the viewer | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | -| Runtime view toggles | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | -| Syntax highlighting | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | -| Structural diffing | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | -| Pager-compatible mode | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | +| Capability | [hunk](https://github.com/modem-dev/hunk) | [lumen](https://github.com/jnsahaj/lumen) | [difftastic](https://github.com/Wilfred/difftastic) | [delta](https://github.com/dandavison/delta) | [diff-so-fancy](https://github.com/so-fancy/diff-so-fancy) | [diff](https://www.gnu.org/software/diffutils/) | +| ------------------------------------ | ----------------------------------------- | ----------------------------------------- | --------------------------------------------------- | -------------------------------------------- | ---------------------------------------------------------- | ----------------------------------------------- | +| Review-first interactive UI | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | +| Multi-file review stream + sidebar | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | +| Inline agent / AI annotations | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| Responsive auto split/unified layout | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| Mouse support inside the viewer | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | +| Runtime view toggles | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | +| Syntax highlighting | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | +| Structural diffing | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | +| Pager-compatible mode | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | Hunk is optimized for reviewing a full changeset interactively. @@ -162,7 +162,7 @@ Example: ```toml theme = "github-dark-default" # any built-in theme id, auto, or custom -mode = "auto" # auto, split, stack +mode = "auto" # auto, split, unified vcs = "git" # git, jj, sl watch = false exclude_untracked = false diff --git a/benchmarks/README.md b/benchmarks/README.md index 7b2794cd3..5882f63ec 100644 --- a/benchmarks/README.md +++ b/benchmarks/README.md @@ -58,7 +58,7 @@ bun run bench:competitors - `bootstrap-load.ts` — measures bootstrap and git-loader cost on a synthetic large repo, including file-pair bootstrap. - `working-tree-load.ts` — measures git working-tree loads across small, medium, large, many-untracked, and few-large-untracked repos. - `changeset-parse.ts` — measures patch normalization, Pierre parsing, patch chunking, and normalized `DiffFile` construction for many-small-files, balanced, and large-single-file patches. -- `render-layout.ts` — measures pure split/stack row building, section geometry, and review-plan construction for many-small-files, balanced, and large-single-file streams. +- `render-layout.ts` — measures pure split/unified row building, section geometry, and review-plan construction for many-small-files, balanced, and large-single-file streams. - `highlight-prefetch.ts` — measures selected-file highlight startup and adjacent prefetch readiness. - `worker-highlight-cache.ts` — measures a cold worker highlight against an immediate compact-result cache hit. - `highlight-cache-layers.ts` — measures a resident terminal-cache hit against a worker-cache revisit after the terminal cache evicts the diff. diff --git a/benchmarks/render-layout.ts b/benchmarks/render-layout.ts index 6d5effc07..15f0e6032 100644 --- a/benchmarks/render-layout.ts +++ b/benchmarks/render-layout.ts @@ -1,6 +1,6 @@ -// Benchmark pure diff row/layout planning across split, stack, and size-shape cases. +// Benchmark pure diff row/layout planning across split, unified, and size-shape cases. import { performance } from "perf_hooks"; -import { buildSplitRows, buildStackRows } from "../packages/hunk/src/ui/diff/diffRows"; +import { buildSplitRows, buildUnifiedRows } from "../packages/hunk/src/ui/diff/diffRows"; import { buildReviewRenderPlan } from "../packages/hunk/src/ui/diff/reviewRenderPlan"; import { measureDiffSectionGeometry } from "../packages/hunk/src/ui/diff/diffSectionGeometry"; import { resolveTheme } from "../packages/hunk/src/ui/themes"; @@ -16,7 +16,7 @@ function measureMs(run: () => void) { function measureScenario(name: string, files: ReturnType) { let splitRows = 0; - let stackRows = 0; + let unifiedRows = 0; let plannedRows = 0; const splitRowsMs = measureMs(() => { @@ -25,9 +25,9 @@ function measureScenario(name: string, files: ReturnType { + const unifiedRowsMs = measureMs(() => { for (const file of files) { - stackRows += buildStackRows(file, null, theme).length; + unifiedRows += buildUnifiedRows(file, null, theme).length; } }); @@ -50,12 +50,12 @@ function measureScenario(name: string, files: ReturnType + ``` Use it when you just want a drop-in diff viewer. @@ -76,7 +76,7 @@ Use it when you just want a drop-in diff viewer. ```tsx - + ``` @@ -190,9 +190,14 @@ If you need direct access to Pierre's parser, `parsePatchFiles(...)` is still re ## Common props +Use `canonicalLayout` in new integrations. The legacy `layout` prop and `HunkDiffLayout` type keep +their original `split | stack` shape so existing exhaustive TypeScript consumers continue to +compile; when both props are present, `canonicalLayout` wins. + | Prop | Type | Default | Notes | | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ----------------------------------------------------------------------------------- | -| `layout` | `"split" \| "stack"` | `"split"` | Chooses side-by-side or stacked rendering. | +| `canonicalLayout` | `"split" \| "unified"` | `"split"` | Chooses side-by-side or unified rendering in new integrations. | +| `layout` | `"split" \| "stack"` | `undefined` | Legacy source-compatible input; `stack` renders as unified. | | `width` | `number` | — | Required content width in terminal columns. | | `theme` | `"graphite" \| "midnight" \| "paper" \| "ember" \| "catppuccin-latte" \| "catppuccin-frappe" \| "catppuccin-macchiato" \| "catppuccin-mocha" \| "zenburn"` | `"graphite"` | Matches Hunk's built-in themes. | | `showLineNumbers` | `boolean` | `true` | Toggles line-number columns. | @@ -217,6 +222,7 @@ If you need direct access to Pierre's parser, `parsePatchFiles(...)` is still re - `countHunkDiffStats` - `HUNK_DIFF_THEME_NAMES` - `HunkDiffThemeName` +- `CanonicalHunkDiffLayout` - `HunkDiffLayout` - `HunkDiffFile` - `HunkDiffFileInput` diff --git a/examples/4-ui-polish/README.md b/examples/4-ui-polish/README.md index 99871555d..1a9effafd 100644 --- a/examples/4-ui-polish/README.md +++ b/examples/4-ui-polish/README.md @@ -12,4 +12,4 @@ hunk diff --files examples/4-ui-polish/before.tsx examples/4-ui-polish/after.tsx - renamed props and extracted button-label helper - nice intra-line emphasis in strings and labels -- a compact UI-focused diff that looks good in split and stacked layouts +- a compact UI-focused diff that looks good in split and unified layouts diff --git a/examples/5-pager-tour/after.ts b/examples/5-pager-tour/after.ts index e679fef16..221f494b9 100644 --- a/examples/5-pager-tour/after.ts +++ b/examples/5-pager-tour/after.ts @@ -34,7 +34,7 @@ export const tourLine24 = "Readable filler text makes navigation practice feel intentional instead of synthetic."; export const tourLine25 = "A few distinct hunks are better than one endless wall of edits."; export const tourLine26 = "Split view is great when you want both sides visible at once."; -export const tourLine27 = "Stack view can feel calmer when lines are long or heavily wrapped."; +export const tourLine27 = "Unified view can feel calmer when lines are long or heavily wrapped."; export const tourLine28 = "Pager mode should stay familiar to people who already live in git diff and less."; export const tourLine29 = diff --git a/examples/5-pager-tour/before.ts b/examples/5-pager-tour/before.ts index 5a902fdf0..7449add87 100644 --- a/examples/5-pager-tour/before.ts +++ b/examples/5-pager-tour/before.ts @@ -24,7 +24,7 @@ export const tourLine23 = "The best demos let you try scrolling without any setu export const tourLine24 = "Readable filler text keeps navigation practice from feeling fake."; export const tourLine25 = "A few distinct hunks are better than one endless wall of edits."; export const tourLine26 = "Split view is great when you want both sides visible at once."; -export const tourLine27 = "Stack view can feel calmer when lines are long."; +export const tourLine27 = "Unified view can feel calmer when lines are long."; export const tourLine28 = "Pager mode should stay familiar to people who live in git diff."; export const tourLine29 = "Clean copy changes are useful because they are easy to scan."; export const tourLine30 = "Repeated line structure makes scrolling behavior obvious."; diff --git a/examples/7-opentui-component/README.md b/examples/7-opentui-component/README.md index 48a87ba89..94d1c7677 100644 --- a/examples/7-opentui-component/README.md +++ b/examples/7-opentui-component/README.md @@ -16,7 +16,7 @@ bun run examples/7-opentui-component/from-patch.tsx - embedding `HunkDiffView` inside a normal OpenTUI app shell - building `diff.metadata` with `parseDiffFromFile` - parsing raw unified diff text with `parsePatchFiles` -- switching between split and stacked layouts with example shell controls +- switching between split and unified layouts with example shell controls - a scrollable terminal diff component that other OpenTUI apps can reuse The in-repo demos import from `../../packages/hunk/src/opentui` so they run from source. Published consumers should import from `hunkdiff/opentui` instead. diff --git a/examples/7-opentui-component/support.tsx b/examples/7-opentui-component/support.tsx index c1fe2c5e7..83809aeab 100644 --- a/examples/7-opentui-component/support.tsx +++ b/examples/7-opentui-component/support.tsx @@ -3,7 +3,7 @@ import path from "node:path"; import { createCliRenderer } from "@opentui/core"; import { createRoot, useTerminalDimensions } from "@opentui/react"; import { useState } from "react"; -import type { HunkDiffFile, HunkDiffLayout } from "../../packages/hunk/src/opentui"; +import type { CanonicalHunkDiffLayout, HunkDiffFile } from "../../packages/hunk/src/opentui"; import { HunkDiffView } from "../../packages/hunk/src/opentui"; import { fitText } from "../../packages/hunk/src/ui/lib/text"; @@ -11,7 +11,7 @@ interface ExampleProps { title: string; subtitle: string; diff: HunkDiffFile; - layout?: HunkDiffLayout; + layout?: CanonicalHunkDiffLayout; } /** Read one checked-in example file relative to this folder. */ @@ -76,14 +76,19 @@ function ExampleApp({ title, subtitle, diff, layout = "split" }: ExampleProps) { /> setActiveLayout("stack")} + active={activeLayout === "unified"} + label="Unified" + onPress={() => setActiveLayout("unified")} /> - + ); diff --git a/examples/8-opentui-primitives/README.md b/examples/8-opentui-primitives/README.md index 5a443929c..52b028ced 100644 --- a/examples/8-opentui-primitives/README.md +++ b/examples/8-opentui-primitives/README.md @@ -17,6 +17,6 @@ bun run examples/8-opentui-primitives/primitives-demo.tsx - `HunkReviewStream` for a multi-file review stream without Hunk's menu bar or global shortcuts - `HunkDiffFileHeader` and `HunkDiffBody` for a single-file view assembled by the host app - Host-owned window borders/chrome around each primitive so you can inspect component boundaries -- Host-owned state for selected file and split/stack layout +- Host-owned state for selected file and split/unified layout The in-repo demo imports from `../../packages/hunk/src/opentui` so it runs from source. Published consumers should import from `hunkdiff/opentui` instead. diff --git a/examples/8-opentui-primitives/primitives-demo.tsx b/examples/8-opentui-primitives/primitives-demo.tsx index 2f193825d..ba20cf969 100644 --- a/examples/8-opentui-primitives/primitives-demo.tsx +++ b/examples/8-opentui-primitives/primitives-demo.tsx @@ -9,7 +9,7 @@ import { HunkFileNav, HunkReviewStream, createHunkDiffFilesFromPatch, - type HunkDiffLayout, + type CanonicalHunkDiffLayout, } from "../../packages/hunk/src/opentui"; import { fitText, padText } from "../../packages/hunk/src/ui/lib/text"; @@ -108,7 +108,7 @@ function WindowFrame({ function PrimitivesDemoApp({ onQuit }: { onQuit: () => void }) { const terminal = useTerminalDimensions(); const files = useMemo(() => createHunkDiffFilesFromPatch(PATCH, "primitives-demo"), []); - const [layout, setLayout] = useState("split"); + const [layout, setLayout] = useState("split"); const [selectedFileId, setSelectedFileId] = useState(files[0]?.id ?? ""); const selectedFile = files.find((file) => file.id === selectedFileId) ?? files[0]; const sidebarWidth = Math.min(34, Math.max(24, Math.floor(terminal.width * 0.28))); @@ -132,7 +132,7 @@ function PrimitivesDemoApp({ onQuit }: { onQuit: () => void }) { } if (key.name === "2") { - setLayout("stack"); + setLayout("unified"); return; } @@ -159,7 +159,7 @@ function PrimitivesDemoApp({ onQuit }: { onQuit: () => void }) { {padText( fitText( - " Hunk primitives as app windows — q quit · Tab next file · 1 split · 2 stack ", + " Hunk primitives as app windows — q quit · Tab next file · 1 split · 2 unified ", Math.max(1, terminal.width - 2), ), Math.max(1, terminal.width - 2), @@ -217,7 +217,7 @@ function PrimitivesDemoApp({ onQuit }: { onQuit: () => void }) { > @@ -236,7 +236,7 @@ function PrimitivesDemoApp({ onQuit }: { onQuit: () => void }) { > - image + image
Split view with sidebar and inline AI notes - image + image
- Stacked view and mouse-selectable menus + Unified view and mouse-selectable menus @@ -135,17 +135,17 @@ For the full live-session and `--agent-context` workflow guide, see [the agent w ## Feature comparison -| Capability | [hunk](https://github.com/modem-dev/hunk) | [lumen](https://github.com/jnsahaj/lumen) | [difftastic](https://github.com/Wilfred/difftastic) | [delta](https://github.com/dandavison/delta) | [diff-so-fancy](https://github.com/so-fancy/diff-so-fancy) | [diff](https://www.gnu.org/software/diffutils/) | -| ---------------------------------- | ----------------------------------------- | ----------------------------------------- | --------------------------------------------------- | -------------------------------------------- | ---------------------------------------------------------- | ----------------------------------------------- | -| Review-first interactive UI | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | -| Multi-file review stream + sidebar | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | -| Inline agent / AI annotations | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | -| Responsive auto split/stack layout | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | -| Mouse support inside the viewer | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | -| Runtime view toggles | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | -| Syntax highlighting | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | -| Structural diffing | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | -| Pager-compatible mode | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | +| Capability | [hunk](https://github.com/modem-dev/hunk) | [lumen](https://github.com/jnsahaj/lumen) | [difftastic](https://github.com/Wilfred/difftastic) | [delta](https://github.com/dandavison/delta) | [diff-so-fancy](https://github.com/so-fancy/diff-so-fancy) | [diff](https://www.gnu.org/software/diffutils/) | +| ------------------------------------ | ----------------------------------------- | ----------------------------------------- | --------------------------------------------------- | -------------------------------------------- | ---------------------------------------------------------- | ----------------------------------------------- | +| Review-first interactive UI | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | +| Multi-file review stream + sidebar | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | +| Inline agent / AI annotations | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| Responsive auto split/unified layout | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | +| Mouse support inside the viewer | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | +| Runtime view toggles | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | +| Syntax highlighting | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | +| Structural diffing | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | +| Pager-compatible mode | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | Hunk is optimized for reviewing a full changeset interactively. @@ -162,7 +162,7 @@ Example: ```toml theme = "github-dark-default" # any built-in theme id, auto, or custom -mode = "auto" # auto, split, stack +mode = "auto" # auto, split, unified vcs = "git" # git, jj, sl watch = false exclude_untracked = false diff --git a/packages/hunk/skills/hunk-extensions/SKILL.md b/packages/hunk/skills/hunk-extensions/SKILL.md index 2dcc21106..31867b9f6 100644 --- a/packages/hunk/skills/hunk-extensions/SKILL.md +++ b/packages/hunk/skills/hunk-extensions/SKILL.md @@ -111,7 +111,7 @@ bad or duplicate id is skipped with a startup notice. | Reload after an external agent changes reviewed inputs | `ctx.review.requestReload()` in an event | | Read user-supplied settings | `hunk.config` (`[extension.]` table) | | Snapshot stable files and every saved review note | `ctx.review.snapshot()` in a command | -| Branch on the API generation (currently `18`) | `hunk.apiVersion` | +| Branch on the API generation (currently `21`) | `hunk.apiVersion` | Registration is only valid while the factory runs — Hunk seals the API object afterwards. diff --git a/packages/hunk/src/app/cli.test.ts b/packages/hunk/src/app/cli.test.ts index 20311ffb3..856bf88d5 100644 --- a/packages/hunk/src/app/cli.test.ts +++ b/packages/hunk/src/app/cli.test.ts @@ -64,6 +64,8 @@ describe("parseCli", () => { expect(parsed.text).toContain("hunk skill path"); expect(parsed.text).toContain("Global options:"); expect(parsed.text).toContain("Common review options:"); + expect(parsed.text).toContain("layout mode: auto, split, unified"); + expect(parsed.text).not.toContain("layout mode: auto, split, stack"); expect(parsed.text).toContain("--file-gap"); expect(parsed.text).toContain("file separator rows, including ─"); expect(parsed.text).toContain("--hunk-gap"); @@ -387,14 +389,23 @@ describe("parseCli", () => { left, right, "--mode", - "stack", + "unified", ]); expect(parsed).toMatchObject({ kind: "diff", left, right, - options: { mode: "stack" }, + options: { mode: "unified" }, + }); + }); + + test("normalizes the deprecated stack layout input to unified", async () => { + const parsed = await parseCli(["bun", "hunk", "diff", "--mode", "stack"]); + + expect(parsed).toMatchObject({ + kind: "vcs", + options: { mode: "unified" }, }); }); @@ -1803,7 +1814,7 @@ describe("parseCli", () => { "right.ts", "src/example.ts", "--mode", - "stack", + "unified", ]); expect(parsed).toMatchObject({ @@ -1812,7 +1823,7 @@ describe("parseCli", () => { right: "right.ts", path: "src/example.ts", options: { - mode: "stack", + mode: "unified", }, }); if (parsed.kind !== "difftool") { diff --git a/packages/hunk/src/app/cli.ts b/packages/hunk/src/app/cli.ts index ca8197705..f5ed164a7 100644 --- a/packages/hunk/src/app/cli.ts +++ b/packages/hunk/src/app/cli.ts @@ -1,18 +1,20 @@ import { existsSync, realpathSync } from "node:fs"; import { resolve } from "node:path"; import { Command, Option } from "commander"; -import type { - CliInput, - CommonOptions, - CursorLine, - ExtensionManageCommandInput, - HelpCommandInput, - LayoutMode, - PagerCommandInput, - ParsedCliInput, - SelfUpdateCommandInput, - SessionCommentListType, - SessionCommentApplyItemInput, +import { + isLayoutModeInput, + normalizeLayoutModeInput, + type CliInput, + type CommonOptions, + type CursorLine, + type ExtensionManageCommandInput, + type HelpCommandInput, + type LayoutMode, + type PagerCommandInput, + type ParsedCliInput, + type SelfUpdateCommandInput, + type SessionCommentListType, + type SessionCommentApplyItemInput, } from "../core/run/commandInputs"; import { isBuiltInCliCommandName, @@ -97,7 +99,7 @@ export interface CliReferenceCommand { /** Review flags registered on every full-screen review command. */ export const COMMON_REVIEW_OPTIONS = [ - { flag: "--mode ", description: "layout mode: auto, split, stack", parse: "layout" }, + { flag: "--mode ", description: "layout mode: auto, split, unified", parse: "layout" }, { flag: "--cursor-line