[{"data":1,"prerenderedAt":7355},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fgit":3,"docs-nav":334},{"id":4,"title":5,"body":6,"description":322,"extension":323,"group":324,"icon":325,"meta":326,"navTitle":327,"navigation":328,"order":329,"path":330,"seo":331,"stem":332,"__hash__":333},"docs\u002Fdocs\u002Fgit.md","Git workflow",{"type":7,"value":8,"toc":308},"minimark",[9,19,31,36,48,51,58,78,82,103,117,131,136,146,166,170,183,205,209,216,220,234,244,248,255,277,280,284],[10,11,12,13,18],"p",{},"The Git tab is a full git client for the session's worktree — browse history, stage and commit, stash, push, and reshape the branch without leaving Plexus. It is scoped to the one session's worktree and branch; for the repository itself — the commit graph, branch management, and the project's main checkout — use the ",[14,15,17],"a",{"href":16},"\u002Fdocs\u002Fproject-git","Project Git client",".",[10,20,21,22,26,27,30],{},"Press ",[23,24,25],"code",{},"⌘4"," to open it. The left pane is the commit log; the right pane shows either the commit you selected or the staging panel for uncommitted work. Throughout this page ",[23,28,29],{},"⌘"," is Cmd on macOS and Ctrl on Windows and Linux.",[32,33,35],"h2",{"id":34},"commit-history","Commit history",[10,37,38,39,43,44,47],{},"The left pane lists the branch's commits newest-first. A divider labeled ",[40,41,42],"strong",{},"base"," marks the merge-base — commits above it are unique to this session's branch, commits below are shared with the base. When history runs deeper than the current page, click ",[40,45,46],{},"Load more"," to fetch earlier commits.",[10,49,50],{},"Click any commit to open its detail view: the full message, author, timestamp, and the changed files. Click a file to see its read-only unified diff; binary and oversized files show a placeholder instead of hunks. Merge commits are badged as such.",[10,52,53],{},[54,55],"img",{"alt":56,"src":57},"The Git tab: the commit log with the base divider on the left, and the selected commit's message, author, and file diff on the right.","\u002Fdocs\u002Fgit.png",[10,59,60,61,64,65,68,69,72,73,77],{},"To undo a commit, click ",[40,62,63],{},"Revert"," in its detail view. Plexus runs ",[23,66,67],{},"git revert"," (with ",[23,70,71],{},"-m 1"," for merge commits) and lands a new revert commit on top — your history stays intact. If the revert conflicts, resolve the markers in the ",[14,74,76],{"href":75},"\u002Fdocs\u002Fagent","Agent tab"," and the log refreshes.",[32,79,81],{"id":80},"uncommitted-changes","Uncommitted changes",[10,83,84,85,87,88,91,92,91,95,98,99,102],{},"The ",[40,86,81],{}," node is pinned at the top of the commit list. Click it to open the staging panel, grouped into collapsible ",[40,89,90],{},"Staged",", ",[40,93,94],{},"Unstaged",[40,96,97],{},"Conflicted",", and ",[40,100,101],{},"Stashes"," sections. Click any staged or unstaged file to view its working-tree diff on the right; untracked files render their full contents as added lines.",[10,104,105,106,109,110,113,114,116],{},"Hover a file to reveal a quick stage\u002Funstage icon, or use the section headers' ",[40,107,108],{},"Stage all"," \u002F ",[40,111,112],{},"Unstage all"," buttons. ",[40,115,108],{}," includes untracked files.",[118,119,121],"callout",{"tone":120},"warn",[10,122,123,124,127,128,130],{},"Conflicted files carry a ",[23,125,126],{},"!"," badge and cannot be staged. Resolve the conflict in the ",[14,129,76],{"href":75}," first — once the markers are gone, the file moves to a stageable section.",[132,133,135],"h3",{"id":134},"commit","Commit",[10,137,138,139,141,142,145],{},"With files staged, write a message in the composer and click ",[40,140,135],{}," (or press ",[23,143,144],{},"⌘Enter"," from the message field). Only staged files are committed; the button stays disabled until something is staged and a title is entered. On success the log and panel refresh.",[10,147,148,149,152,153,157,158,161,162,18],{},"Click the ",[40,150,151],{},"AI"," button to draft a message from the staged diff — a concise imperative subject and an optional body explaining the ",[154,155,156],"em",{},"why",". Edit both before committing. Tune the drafting instruction with the ",[23,159,160],{},"git.commit.aiPrompt"," setting; see ",[14,163,165],{"href":164},"\u002Fdocs\u002Fsettings","Settings",[132,167,169],{"id":168},"stash-and-push","Stash and push",[10,171,172,175,176,178,179,182],{},[40,173,174],{},"Stash"," saves all changes — staged, unstaged, and untracked — onto the stash; saved entries appear under ",[40,177,101],{},", where ",[40,180,181],{},"Pop"," restores one. A conflicting pop keeps the stash intact and surfaces the conflict.",[10,184,185,188,189,192,193,196,197,200,201,18],{},[40,186,187],{},"Push"," sends the branch to ",[23,190,191],{},"origin"," (non-force, with ",[23,194,195],{},"-u","). It is disabled when ",[23,198,199],{},"HEAD"," is detached or the branch has no name. Git rejects a non-fast-forward push, so if you rebased or squashed after a prior push you'll need to force-push from the command line — Plexus does not offer that by design. To open a pull request once the branch is pushed, see ",[14,202,204],{"href":203},"\u002Fdocs\u002Fpull-requests","Pull requests",[32,206,208],{"id":207},"branch-operations","Branch operations",[10,210,211,212,215],{},"Three operations reshape the session branch in place. Because they rewrite history, each requires ",[40,213,214],{},"two"," modifiers to prevent accidental fires:",[217,218],"key-table",{":rows":219},"[[\"⌘4\",\"Switch to the Git tab\"],[\"⌘⌥R\",\"Rebase the branch onto its base (linear, no merge commit)\"],[\"⌘⌥M\",\"Merge the base into the branch (--no-ff merge commit)\"],[\"⌘⌥S\",\"Squash all commits since the merge-base into one\"],[\"⌘Enter\",\"Commit staged changes from the composer\"]]",[10,221,222,223,229,230,233],{},"Rebase and merge fetch the base from origin first when it exists remotely, and a failed fetch is surfaced as an error rather than ignored. Each operation toasts its result — for example ",[154,224,225,226],{},"Rebased onto ",[23,227,228],{},"\u003Cbase>"," or ",[154,231,232],{},"Already up to date",". These reshape the session branch only; they do not integrate your work into the trunk.",[118,235,236],{},[10,237,238,239,243],{},"Rebinding any reshape shortcut to a single-modifier key is rejected by settings validation. See ",[14,240,242],{"href":241},"\u002Fdocs\u002Fshortcuts","Keyboard shortcuts"," to view or change the bindings.",[132,245,247],{"id":246},"dirty-worktree","Dirty worktree",[10,249,250,251,254],{},"If you trigger a rebase or merge with uncommitted changes, a ",[40,252,253],{},"Resolve dirty worktree"," dialog appears first with three choices:",[256,257,258,265,271],"ul",{},[259,260,261,264],"li",{},[40,262,263],{},"Commit & continue"," — commit the changes (optionally with a message you provide), then run the operation.",[259,266,267,270],{},[40,268,269],{},"Stash & continue"," — stash the changes; they stay stashed after the reshape.",[259,272,273,276],{},[40,274,275],{},"Stash & pop"," — stash, run the reshape, then attempt to restore the stashed changes.",[10,278,279],{},"Once the tree is clean the original operation runs, and any resulting conflicts appear in the conflict dialog.",[32,281,283],{"id":282},"related","Related",[256,285,286,291,298,303],{},[259,287,288,290],{},[14,289,17],{"href":16}," — the project-level git client: commit graph, branches, and the main checkout.",[259,292,293,297],{},[14,294,296],{"href":295},"\u002Fdocs\u002Freview","Review"," — read the branch's full diff against its base before you commit or open a PR.",[259,299,300,302],{},[14,301,204],{"href":203}," — push the branch and open a GitHub PR.",[259,304,305,307],{},[14,306,242],{"href":241}," — the full list of rebindable git shortcuts.",{"title":309,"searchDepth":310,"depth":310,"links":311},"",2,[312,313,318,321],{"id":34,"depth":310,"text":35},{"id":80,"depth":310,"text":81,"children":314},[315,317],{"id":134,"depth":316,"text":135},3,{"id":168,"depth":316,"text":169},{"id":207,"depth":310,"text":208,"children":319},[320],{"id":246,"depth":316,"text":247},{"id":282,"depth":310,"text":283},"The full git workflow — commits, stash, push, rebase, squash — one keystroke away.","md","Working with sessions","GitMerge",{},"Session Git",true,25,"\u002Fdocs\u002Fgit",{"title":5,"description":322},"docs\u002Fgit","CLC_lDqN7uMy0RVaXXh1cKVaGWC3AQBfv0jXZIduHJU",[335,490,836,1028,1464,1763,1981,2285,3068,3379,3617,3832,4124,4685,4869,5062,5328,5705,5956,6096,6208,7191],{"id":336,"title":337,"body":338,"description":481,"extension":323,"group":482,"icon":483,"meta":484,"navTitle":337,"navigation":328,"order":485,"path":486,"seo":487,"stem":488,"__hash__":489},"docs\u002Fdocs\u002Findex.md","Introduction",{"type":7,"value":339,"toc":476},[340,343,347,362,374,378,446,451,455],[10,341,342],{},"Plexus is a fast, native, local desktop control plane for running coding-agent CLIs — Claude Code — in parallel, without juggling a dozen terminal tabs.",[32,344,346],{"id":345},"the-core-idea","The core idea",[10,348,349,350,353,354,357,358,361],{},"You add a git repository as a ",[40,351,352],{},"Project"," (Projects live inside ",[40,355,356],{},"Workspaces","), then spin up ",[40,359,360],{},"Sessions",". Each Session is its own git worktree on its own branch, wrapping a named Claude Code session in a real terminal. Several agents run side by side, each isolated in its own worktree, so their changes never collide — and you always know at a glance which one is working and which is waiting for you.",[10,363,364,365,368,369,373],{},"The shape of it: ",[40,366,367],{},"Workspace ▸ Project ▸ Session",". See ",[14,370,372],{"href":371},"\u002Fdocs\u002Fconcepts","Concepts"," for the model in depth.",[32,375,377],{"id":376},"what-you-get","What you get",[256,379,380,386,396,404,422,432,440],{},[259,381,382,385],{},[40,383,384],{},"Parallel, isolated sessions."," Every Session lives in its own worktree, so multiple agents work on different features at once without stepping on each other or your main checkout.",[259,387,388,391,392,18],{},[40,389,390],{},"Always know the state."," A live status dot tells you which sessions are actively working versus waiting for input, alongside each session's branch and pull-request state — see ",[14,393,395],{"href":394},"\u002Fdocs\u002Fstatus","Status",[259,397,398,401,402,18],{},[40,399,400],{},"PR-style review."," Read changes as a unified diff and leave inline comments the agent reads and iterates on, all inside the app — see ",[14,403,296],{"href":295},[259,405,406,409,410,413,414,417,418,18],{},[40,407,408],{},"Built-in editor and git client."," Browse and edit files in the worktree, then stage, commit, and manage branches without switching tools — from a per-session ",[14,411,412],{"href":330},"Git tab"," up to a full ",[14,415,416],{"href":16},"project-level git client"," with a commit graph and conflict resolution. See also ",[14,419,421],{"href":420},"\u002Fdocs\u002Fexplorer","Explorer",[259,423,424,427,428,18],{},[40,425,426],{},"Three-level lifecycle hooks."," Run your own commands at the global, workspace, and project levels to automate setup, checks, and teardown — see ",[14,429,431],{"href":430},"\u002Fdocs\u002Fhooks","Hooks",[259,433,434,437,438,18],{},[40,435,436],{},"Layered settings."," Configuration cascades from global defaults down to per-project and per-session overrides, so each repo behaves the way it needs to — see ",[14,439,165],{"href":164},[259,441,442,445],{},[40,443,444],{},"Native, local, and fast."," Plexus is a real desktop app that runs on your machine — your code and credentials never leave it.",[118,447,448],{},[10,449,450],{},"Plexus drives the Claude Code CLI directly, so you keep your existing agent setup, plan, and configuration.",[32,452,454],{"id":453},"where-to-next","Where to next",[256,456,457,464,471],{},[259,458,459,463],{},[14,460,462],{"href":461},"\u002Fdocs\u002Finstall","Install"," — download a signed build and let it auto-update.",[259,465,466,470],{},[14,467,469],{"href":468},"\u002Fdocs\u002Fgetting-started","Getting started"," — add a repository and run your first session.",[259,472,473,475],{},[14,474,372],{"href":371}," — Workspaces, Projects, Sessions, and worktrees explained.",{"title":309,"searchDepth":310,"depth":310,"links":477},[478,479,480],{"id":345,"depth":310,"text":346},{"id":376,"depth":310,"text":377},{"id":453,"depth":310,"text":454},"What Plexus is and the problem it solves.","Overview","BookOpen",{},1,"\u002Fdocs",{"title":337,"description":481},"docs\u002Findex","3pQpgo7s8HP-nLB5wmCqXfVYRsr2BKOpKnYBX74THp4",{"id":491,"title":492,"body":493,"description":831,"extension":323,"group":482,"icon":521,"meta":832,"navTitle":462,"navigation":328,"order":310,"path":461,"seo":833,"stem":834,"__hash__":835},"docs\u002Fdocs\u002Finstall.md","Installation",{"type":7,"value":494,"toc":823},[495,498,502,505,518,522,525,534,549,553,556,595,609,613,624,657,663,671,674,680,693,697,700,722,729,733,740,746,766,770,773,805,817],[10,496,497],{},"Plexus ships as a signed desktop app — download the build for your platform, install it like any other native app, and it keeps itself current after that.",[499,500],"download-button",{"size":501},"lg",[10,503,504],{},"The button picks the right build for your OS automatically; use the platform menu on it to choose another. Prefer to pick by hand? Every asset is listed below.",[118,506,507],{},[10,508,509,510,513,514,18],{},"The download button routes through a lightweight redirect that counts an ",[40,511,512],{},"anonymous"," total-download tally before forwarding you to the file on GitHub — no account, no personal data, no cookies. See our ",[14,515,517],{"href":516},"\u002Flegal\u002Fprivacy","Privacy Policy",[32,519,521],{"id":520},"download","Download",[10,523,524],{},"Every installer lives on the public releases page:",[526,527,532],"pre",{"className":528,"code":530,"language":531},[529],"language-text","https:\u002F\u002Fgithub.com\u002FCodedWords\u002Fplexus-releases\u002Freleases\n","text",[23,533,530],{"__ignoreMap":309},[10,535,536,537,540,541,544,545,548],{},"Open the ",[40,538,539],{},"latest"," release and grab the asset that matches your platform from the sections below. Filenames carry the version (shown here as ",[23,542,543],{},"\u003Cversion>",", e.g. ",[23,546,547],{},"0.1.0",").",[32,550,552],{"id":551},"macos","macOS",[10,554,555],{},"Plexus publishes separate builds for Apple Silicon and Intel — pick the one that matches your Mac.",[557,558,559,571],"table",{},[560,561,562],"thead",{},[563,564,565,569],"tr",{},[566,567,568],"th",{},"Mac",[566,570,521],{},[572,573,574,585],"tbody",{},[563,575,576,580],{},[577,578,579],"td",{},"Apple Silicon (M1 and later)",[577,581,582],{},[23,583,584],{},"Plexus_\u003Cversion>_aarch64.dmg",[563,586,587,590],{},[577,588,589],{},"Intel",[577,591,592],{},[23,593,594],{},"Plexus_\u003Cversion>_x64.dmg",[10,596,536,597,600,601,604,605,608],{},[23,598,599],{},".dmg",", drag ",[40,602,603],{},"Plexus"," into ",[23,606,607],{},"Applications",", then launch it from there.",[32,610,612],{"id":611},"linux","Linux",[10,614,615,616,619,620,623],{},"Linux builds are x86_64 (amd64) only, in two formats. The ",[23,617,618],{},".deb"," suits Debian\u002FUbuntu-based distros; the ",[23,621,622],{},".AppImage"," is a portable single-file binary that runs anywhere.",[557,625,626,635],{},[560,627,628],{},[563,629,630,633],{},[566,631,632],{},"Format",[566,634,521],{},[572,636,637,647],{},[563,638,639,642],{},[577,640,641],{},"Debian\u002FUbuntu package",[577,643,644],{},[23,645,646],{},"Plexus_\u003Cversion>_amd64.deb",[563,648,649,652],{},[577,650,651],{},"Portable AppImage",[577,653,654],{},[23,655,656],{},"Plexus_\u003Cversion>_amd64.AppImage",[10,658,659,660,662],{},"Install the ",[23,661,618],{},":",[526,664,669],{"className":665,"code":667,"language":668,"meta":309},[666],"language-bash","sudo apt install .\u002FPlexus_\u003Cversion>_amd64.deb\n","bash",[23,670,667],{"__ignoreMap":309},[10,672,673],{},"Or run the AppImage directly:",[526,675,678],{"className":676,"code":677,"language":668,"meta":309},[666],"chmod +x Plexus_\u003Cversion>_amd64.AppImage\n.\u002FPlexus_\u003Cversion>_amd64.AppImage\n",[23,679,677],{"__ignoreMap":309},[118,681,682],{},[10,683,684,685,688,689,692],{},"For desktop notifications on Linux, install ",[23,686,687],{},"notify-send"," (",[23,690,691],{},"libnotify-bin"," on Debian\u002FUbuntu). It's optional — Plexus runs fine without it.",[32,694,696],{"id":695},"windows","Windows",[10,698,699],{},"Windows ships a signed installer for x64.",[557,701,702,710],{},[560,703,704],{},[563,705,706,708],{},[566,707,632],{},[566,709,521],{},[572,711,712],{},[563,713,714,717],{},[577,715,716],{},"Installer",[577,718,719],{},[23,720,721],{},"Plexus_\u003Cversion>_x64_en-US.msi",[10,723,724,725,728],{},"Run the ",[23,726,727],{},".msi"," and follow the prompts. Plexus is added to the Start menu when it finishes.",[32,730,732],{"id":731},"verify-prerequisites","Verify prerequisites",[10,734,735,736,739],{},"Plexus drives the Claude Code CLI and Git, so both must be installed and on your ",[23,737,738],{},"PATH",". After installing, confirm them from a terminal:",[526,741,744],{"className":742,"code":743,"language":668,"meta":309},[666],"claude --help\ngit --version\n",[23,745,743],{"__ignoreMap":309},[10,747,748,749,752,753,757,758,761,762,18],{},"If ",[23,750,751],{},"claude"," isn't found, ",[14,754,756],{"href":755},"\u002Fdocs\u002Frequirements","Requirements"," explains how Plexus locates it and the ",[23,759,760],{},"agent.programPath"," override. For pull-request features you connect a git provider (GitHub or Bitbucket) inside the app — no extra CLI to install. See ",[14,763,765],{"href":764},"\u002Fdocs\u002Fconnections","Connections",[32,767,769],{"id":768},"staying-up-to-date","Staying up to date",[10,771,772],{},"Plexus updates itself — you don't need to revisit the releases page for future versions.",[256,774,775,782,793,799,802],{},[259,776,777,778,781],{},"It checks for a new release on launch ",[40,779,780],{},"and every ~30 minutes"," while it's open.",[259,783,784,785,788,789,792],{},"When one is available, you get a one-click ",[40,786,787],{},"Install & restart",", or ",[40,790,791],{},"Install when idle"," — which applies the update automatically once all your sessions finish, so a running agent is never interrupted. It waits for a short countdown (which you can cancel) before restarting.",[259,794,795,796,18],{},"You can also check on demand from ",[40,797,798],{},"Settings → About → Check for updates",[259,800,801],{},"You're prompted once per new version — no repeated nagging.",[259,803,804],{},"Every update is signature-verified before it's applied, so a tampered build won't install.",[118,806,807],{},[10,808,809,810,816],{},"Need to reinstall or roll back manually? Download the installer for any version from the ",[14,811,815],{"href":812,"rel":813},"https:\u002F\u002Fgithub.com\u002FCodedWords\u002Fplexus-releases\u002Freleases",[814],"nofollow","releases page"," and run it over your existing install.",[10,818,819,820,822],{},"Installed? Head to ",[14,821,469],{"href":468}," to add a repository and run your first session.",{"title":309,"searchDepth":310,"depth":310,"links":824},[825,826,827,828,829,830],{"id":520,"depth":310,"text":521},{"id":551,"depth":310,"text":552},{"id":611,"depth":310,"text":612},{"id":695,"depth":310,"text":696},{"id":731,"depth":310,"text":732},{"id":768,"depth":310,"text":769},"Download and install Plexus on macOS, Linux, or Windows.",{},{"title":492,"description":831},"docs\u002Finstall","T1fi_Xcsxo8lq5zEI9hWyBmFVQDTH6Z0ZqInGNYHN20",{"id":837,"title":756,"body":838,"description":1022,"extension":323,"group":482,"icon":1023,"meta":1024,"navTitle":756,"navigation":328,"order":316,"path":755,"seo":1025,"stem":1026,"__hash__":1027},"docs\u002Fdocs\u002Frequirements.md",{"type":7,"value":839,"toc":1015},[840,843,847,853,859,868,893,899,903,909,913,938,942,948,952,1010],[10,841,842],{},"Plexus drives the Claude Code CLI on top of Git, so both must be on your machine — a couple of optional tools unlock the rest.",[32,844,846],{"id":845},"claude-code-cli","Claude Code CLI",[10,848,849,850,852],{},"Plexus runs every session through the Claude Code CLI; it does not bundle its own agent. Install Claude Code and confirm the ",[23,851,751],{}," command works in a terminal:",[526,854,857],{"className":855,"code":856,"language":668,"meta":309},[666],"claude --help\n",[23,858,856],{"__ignoreMap":309},[10,860,861,862,864,865,867],{},"Plexus finds ",[23,863,751],{}," on your ",[23,866,738],{}," at startup, so a standard install needs no configuration. There's no API key to enter — your existing Claude Code authentication is handed through to each session.",[118,869,870],{"tone":120},[10,871,872,873,875,876,879,880,882,883,886,887,889,890,18],{},"If Plexus can't find ",[23,874,751],{},", set an explicit path in ",[40,877,878],{},"Settings → Agent → Claude program path"," (the ",[23,881,760],{}," setting) and point it at the actual executable. This is common on Windows, where Claude Code installs as an npm shim (",[23,884,885],{},"claude.cmd",") or through Volta and isn't on the ",[23,888,738],{}," Plexus sees — for example ",[23,891,892],{},"C:\\Users\\me\\AppData\\Roaming\\npm\\claude.cmd",[10,894,895,896,898],{},"See ",[14,897,165],{"href":164}," for where this lives.",[32,900,902],{"id":901},"git","Git",[10,904,905,906,908],{},"Git must be installed and on your ",[23,907,738],{},". Plexus uses it to detect repositories, create and remove worktrees, switch branches, and compute diffs. Any standard Git install satisfies this.",[32,910,912],{"id":911},"git-providers-for-pull-requests","Git providers (for pull requests)",[10,914,915,916,919,920,923,924,927,928,931,932,935,936,18],{},"Pull-request features — opening PRs, reading status, and checking CI — need a connected git provider, either ",[40,917,918],{},"GitHub or Bitbucket",". There's nothing to install: open ",[40,921,922],{},"Settings → Git providers"," and click ",[40,925,926],{},"Connect",", then approve the one-click sign-in in your browser. The ",[23,929,930],{},"gh"," CLI is ",[40,933,934],{},"not"," required. Everything else (sessions, editing, local Git) works without connecting. See ",[14,937,765],{"href":764},[32,939,941],{"id":940},"notify-send-linux-optional","notify-send (Linux, optional)",[10,943,944,945,947],{},"On Linux, Plexus uses ",[23,946,687],{}," for native desktop notifications — for instance when an agent needs your input. Without it, Plexus falls back to its in-app notifications, so it's purely optional. macOS and Windows use their native notification systems and need nothing extra.",[32,949,951],{"id":950},"supported-platforms","Supported platforms",[557,953,954,967],{},[560,955,956],{},[563,957,958,961,964],{},[566,959,960],{},"OS",[566,962,963],{},"Architectures",[566,965,966],{},"Notes",[572,968,969,979,995],{},[563,970,971,973,976],{},[577,972,552],{},[577,974,975],{},"Apple Silicon (aarch64), Intel (x86_64)",[577,977,978],{},"Native builds for both",[563,980,981,983,986],{},[577,982,612],{},[577,984,985],{},"x86_64",[577,987,988,989,991,992,994],{},"AppImage and ",[23,990,618],{},"; ",[23,993,687],{}," optional",[563,996,997,999,1001],{},[577,998,696],{},[577,1000,985],{},[577,1002,1003,1004,1007,1008],{},"NSIS ",[23,1005,1006],{},"-setup.exe"," installer; npm\u002FVolta shims supported via ",[23,1009,760],{},[10,1011,1012,1013,18],{},"Ready to get it running? See ",[14,1014,462],{"href":461},{"title":309,"searchDepth":310,"depth":310,"links":1016},[1017,1018,1019,1020,1021],{"id":845,"depth":310,"text":846},{"id":901,"depth":310,"text":902},{"id":911,"depth":310,"text":912},{"id":940,"depth":310,"text":941},{"id":950,"depth":310,"text":951},"What you need installed for Plexus and its features.","Check",{},{"title":756,"description":1022},"docs\u002Frequirements","VlR9yEJ1W1eGzKXBLRC1CHBvq76P-QmjDyNYptexJa0",{"id":1029,"title":469,"body":1030,"description":1457,"extension":323,"group":482,"icon":1458,"meta":1459,"navTitle":469,"navigation":328,"order":1460,"path":468,"seo":1461,"stem":1462,"__hash__":1463},"docs\u002Fdocs\u002Fgetting-started.md",{"type":7,"value":1031,"toc":1444},[1032,1035,1049,1053,1062,1066,1084,1093,1096,1100,1103,1135,1138,1142,1148,1171,1174,1178,1188,1204,1213,1221,1224,1228,1234,1257,1266,1270,1281,1297,1301,1304,1324,1336,1339,1343,1346,1396,1409,1413],[10,1033,1034],{},"Add a repository, create a session, and watch Claude Code go to work — your first run, end to end.",[10,1036,1037,1038,1040,1041,1043,1044,1046,1047,18],{},"This walkthrough assumes Plexus is already installed and that the Claude Code CLI and ",[23,1039,901],{}," are on your ",[23,1042,738],{},". If not, start with ",[14,1045,462],{"href":461}," and ",[14,1048,756],{"href":755},[32,1050,1052],{"id":1051},"launch-plexus","Launch Plexus",[10,1054,1055,1056,1059,1060,18],{},"Open the app. The left sidebar already holds a ",[40,1057,1058],{},"Default"," workspace, so you're never staring at an empty tree. A workspace is just a grouping for related repositories — rename it or add more whenever you like. For the full hierarchy behind workspaces, projects, and sessions, see ",[14,1061,372],{"href":371},[32,1063,1065],{"id":1064},"add-a-repository","Add a repository",[10,1067,1068,1069,1071,1072,1075,1076,1079,1080,1083],{},"A project is a single git repository. Hover the ",[40,1070,1058],{}," workspace row, open its ",[40,1073,1074],{},"⋯"," menu, and choose ",[40,1077,1078],{},"Add repository…",". (An empty workspace also shows an inline ",[40,1081,1082],{},"+ Add repository"," button.)",[10,1085,1086],{},[54,1087],{"alt":1088,"height":1089,"src":1090,"title":1091,"width":1092},"The Add repository button on the Default workspace row",248,"\u002Fdocs\u002Fgetting-started\u002Fadd-repository-button.png","Start from the Default workspace's Add repository button.",431,[10,1094,1095],{},"The dialog offers three ways to add a repository — pick whichever fits:",[132,1097,1099],{"id":1098},"from-a-local-folder","From a local folder",[10,1101,1102],{},"Point Plexus at a git repository already on your machine.",[1104,1105,1106,1123],"ol",{},[259,1107,1108,1109,1112,1113,1116],{},"Pick a folder in the native picker. If the folder isn't a git repository, Plexus offers to run ",[23,1110,1111],{},"git init"," for you.",[1114,1115],"br",{},[54,1117],{"alt":1118,"height":1119,"src":1120,"title":1121,"width":1122},"The Add a repository dialog with a Choose folder button",240,"\u002Fdocs\u002Fgetting-started\u002Fadd-repository-choose-folder.png","Choose the repository folder on disk.",461,[259,1124,1125,1126,1128],{},"Enter a project name and confirm.",[1114,1127],{},[54,1129],{"alt":1130,"height":1131,"src":1132,"title":1133,"width":1134},"The Add a repository dialog showing the repository folder and project name fields",320,"\u002Fdocs\u002Fgetting-started\u002Fadd-repository-details.png","Name the project, then Add project.",494,[10,1136,1137],{},"The folder on disk is never moved or modified — Plexus just points at it.",[132,1139,1141],{"id":1140},"from-a-connected-provider","From a connected provider",[10,1143,1144,1145,1147],{},"If you've connected GitHub or Bitbucket under ",[14,1146,922],{"href":764},", search your repositories and clone the one you want — no URL to copy.",[1104,1149,1150,1153,1164],{},[259,1151,1152],{},"Search your repositories — your own, ones you collaborate on, and your organizations' — across every provider you've connected, and select one.",[259,1154,1155,1156,1159,1160,1163],{},"Choose a ",[40,1157,1158],{},"parent folder"," on disk. Plexus clones into a ",[23,1161,1162],{},"\u003Crepo-name>"," subfolder of it; the folder name defaults to the repository name and is editable.",[259,1165,1166,1167,1170],{},"A live progress bar shows the clone's percentage and current phase, with a ",[40,1168,1169],{},"Cancel"," button if you change your mind. When it finishes, the cloned repository is registered as a project just like a local folder.",[10,1172,1173],{},"Private repositories authenticate automatically using the connection Plexus already holds — the token stays on your device, and the clone talks to GitHub or Bitbucket directly.",[132,1175,1177],{"id":1176},"from-a-url","From a URL",[10,1179,1180,1181,229,1184,1187],{},"Paste any ",[23,1182,1183],{},"https",[23,1185,1186],{},"ssh"," git URL to clone it.",[1104,1189,1190,1193,1198],{},[259,1191,1192],{},"Paste the repository URL.",[259,1194,1155,1195,1197],{},[40,1196,1158],{},", adjusting the destination folder name if you like (it defaults to the repository name).",[259,1199,1200,1201,1203],{},"Watch the same live progress bar with ",[40,1202,1169],{},", then Plexus registers the clone as a project.",[10,1205,1206,1208,1209,1212],{},[23,1207,1186],{}," URLs and public repositories use your own local git setup — the keys and credentials ",[23,1210,1211],{},"git clone"," would use.",[118,1214,1215],{},[10,1216,1217,1218,1220],{},"Plexus remembers the last ",[40,1219,1158],{}," you cloned into and offers it as the default next time.",[10,1222,1223],{},"However you add it, the project appears in the tree under the workspace.",[32,1225,1227],{"id":1226},"create-a-session","Create a session",[10,1229,1230,1231,1233],{},"A session is a named Claude Code conversation. On the project row, open the ",[40,1232,1074],{}," menu and pick one of:",[256,1235,1236,1251],{},[259,1237,1238,1241,1242,1244],{},[40,1239,1240],{},"New session…"," — name the session and choose a base branch (a smart default is pre-selected). Plexus cuts a fresh worktree and feature branch from that base, keeping the work isolated from your main checkout.",[1114,1243],{},[54,1245],{"alt":1246,"height":1247,"src":1248,"title":1249,"width":1250},"The New session dialog with a Name field and a Base branch dropdown",305,"\u002Fdocs\u002Fgetting-started\u002Fnew-session-dialog.png","Name the session and pick a base branch, then Create.",407,[259,1252,1253,1256],{},[40,1254,1255],{},"Start session on root tree"," — name the session only, with no base-branch picker. It runs directly in the project's root working tree and starts immediately. Good for quick edits.",[118,1258,1259],{},[10,1260,1261,1262,18],{},"Each standard session is a fully isolated git worktree on its own branch. Run a refactor, a bug fix, and a docs pass side by side — none of them can touch each other's files. More in ",[14,1263,1265],{"href":1264},"\u002Fdocs\u002Fsessions","Sessions & worktrees",[32,1267,1269],{"id":1268},"start-the-agent","Start the agent",[10,1271,1272,1273,1276,1277,1280],{},"By default, both root-tree and standard sessions launch the moment you create them — a short \"Starting…\" spinner walks through the stages (creating the worktree, running any setup hooks, then starting the agent) before Claude Code appears in the ",[40,1274,1275],{},"Agent"," tab. Prefer to start standard sessions yourself? Click ",[40,1278,1279],{},"Start"," in the Agent tab.",[118,1282,1283],{},[10,1284,1285,1286,1289,1290,1293,1294,1296],{},"That auto-start is ",[23,1287,1288],{},"session.autoStart"," — ",[40,1291,1292],{},"on by default",". Turn it off in ",[14,1295,165],{"href":164}," to create standard sessions stopped and start them by hand.",[32,1298,1300],{"id":1299},"send-your-first-prompt","Send your first prompt",[10,1302,1303],{},"In the Agent tab, type a prompt and press Enter. Watch the activity dot on the session row:",[256,1305,1306,1312,1318],{},[259,1307,1308,1311],{},[40,1309,1310],{},"green",", pulsing — the agent is working,",[259,1313,1314,1317],{},[40,1315,1316],{},"amber"," — it's waiting for your input or approval,",[259,1319,1320,1323],{},[40,1321,1322],{},"gray"," — idle.",[10,1325,1326,1327,1331,1332,1335],{},"These same indicators surface on the ",[14,1328,1330],{"href":1329},"\u002Fdocs\u002Fdashboard","Dashboard",", so you can track several sessions at once. See ",[14,1333,1334],{"href":394},"Session status"," for what each state means.",[217,1337],{":rows":1338},"[[\"Enter\",\"Submit your prompt to the agent\"],[\"⇧Enter\",\"Insert a newline without submitting\"],[\"⌃C\",\"Interrupt the agent mid-turn\"]]",[32,1340,1342],{"id":1341},"explore-the-tabs","Explore the tabs",[10,1344,1345],{},"While the agent works, switch between the per-session tabs:",[557,1347,1348,1358],{},[560,1349,1350],{},[563,1351,1352,1355],{},[566,1353,1354],{},"Tab",[566,1356,1357],{},"What it shows",[572,1359,1360,1369,1378,1387],{},[563,1361,1362,1366],{},[577,1363,1364],{},[40,1365,1275],{},[577,1367,1368],{},"The live Claude Code terminal.",[563,1370,1371,1375],{},[577,1372,1373],{},[40,1374,296],{},[577,1376,1377],{},"A focused diff of the changes the agent has made.",[563,1379,1380,1384],{},[577,1381,1382],{},[40,1383,421],{},[577,1385,1386],{},"The session's working tree as a file browser.",[563,1388,1389,1393],{},[577,1390,1391],{},[40,1392,902],{},[577,1394,1395],{},"Branch status, commits, and staging.",[10,1397,1398,1399,91,1401,91,1404,98,1407,18],{},"Read more about each: the ",[14,1400,76],{"href":75},[14,1402,1403],{"href":295},"Review tab",[14,1405,1406],{"href":420},"Explorer tab",[14,1408,412],{"href":330},[32,1410,1412],{"id":1411},"next-steps","Next steps",[256,1414,1415,1420,1431,1437],{},[259,1416,1417,1418,18],{},"Understand the model in ",[14,1419,372],{"href":371},[259,1421,1422,1423,1426,1427,18],{},"Get gitignored files like ",[23,1424,1425],{},".env"," into worktrees with ",[14,1428,1430],{"href":1429},"\u002Fdocs\u002Fworktrees","Worktrees",[259,1432,1433,1434,18],{},"Wrap up by opening a ",[14,1435,1436],{"href":203},"pull request",[259,1438,1439,1440,1443],{},"Learn every shortcut on the ",[14,1441,1442],{"href":241},"Shortcuts"," page.",{"title":309,"searchDepth":310,"depth":310,"links":1445},[1446,1447,1452,1453,1454,1455,1456],{"id":1051,"depth":310,"text":1052},{"id":1064,"depth":310,"text":1065,"children":1448},[1449,1450,1451],{"id":1098,"depth":316,"text":1099},{"id":1140,"depth":316,"text":1141},{"id":1176,"depth":316,"text":1177},{"id":1226,"depth":310,"text":1227},{"id":1268,"depth":310,"text":1269},{"id":1299,"depth":310,"text":1300},{"id":1341,"depth":310,"text":1342},{"id":1411,"depth":310,"text":1412},"Add a repository and run your first agent session.","Rocket",{},4,{"title":469,"description":1457},"docs\u002Fgetting-started","oADsYcSErD98O8Ya2-C0hgNbD3IvB4MUC9qB97y5lIk",{"id":1465,"title":1466,"body":1467,"description":1756,"extension":323,"group":482,"icon":1757,"meta":1758,"navTitle":372,"navigation":328,"order":1759,"path":371,"seo":1760,"stem":1761,"__hash__":1762},"docs\u002Fdocs\u002Fconcepts.md","Core concepts",{"type":7,"value":1468,"toc":1744},[1469,1472,1476,1479,1533,1536,1546,1560,1565,1568,1582,1604,1607,1622,1631,1635,1646,1650,1653,1673,1679,1683,1686,1706,1715,1719,1726],[10,1470,1471],{},"Plexus nests your work in a three-tier hierarchy and gives every session two independent status indicators — learn both and you can navigate the whole app.",[32,1473,1475],{"id":1474},"the-hierarchy","The hierarchy",[10,1477,1478],{},"Everything lives in the same order, outermost to innermost, and you see it in the left sidebar tree: expand a workspace to reveal its projects, expand a project to reveal its sessions.",[557,1480,1481,1494],{},[560,1482,1483],{},[563,1484,1485,1488,1491],{},[566,1486,1487],{},"Tier",[566,1489,1490],{},"What it is",[566,1492,1493],{},"Holds",[572,1495,1496,1509,1520],{},[563,1497,1498,1503,1506],{},[577,1499,1500],{},[40,1501,1502],{},"Workspace",[577,1504,1505],{},"A named group of related projects",[577,1507,1508],{},"Projects",[563,1510,1511,1515,1518],{},[577,1512,1513],{},[40,1514,352],{},[577,1516,1517],{},"Exactly one git repository",[577,1519,360],{},[563,1521,1522,1527,1530],{},[577,1523,1524],{},[40,1525,1526],{},"Session",[577,1528,1529],{},"One git worktree wrapping one named Claude Code session",[577,1531,1532],{},"The agent, the working tree, the branch",[132,1534,1502],{"id":1535},"workspace",[10,1537,1538,1539,1542,1543,1545],{},"A workspace is a named bucket for grouping projects — one per client, team, or area of your work. There is always exactly one ",[40,1540,1541],{},"default"," workspace, marked with a star and auto-selected on launch. On first run Plexus creates a ",[23,1544,1058],{}," workspace, so the tree is never empty.",[10,1547,1548,1549,1046,1552,1555,1556,1559],{},"Grouping related projects is also where shared configuration pays off: both ",[14,1550,1551],{"href":164},"settings",[14,1553,1554],{"href":430},"hooks"," cascade ",[40,1557,1558],{},"Global → Workspace → Project",", so a workspace is the natural place to set defaults once for similar repos — a common Create hook that installs dependencies, the files copied into each new worktree, auto-start behavior — and let every project inside inherit them, overriding only where one repo differs.",[118,1561,1562],{},[10,1563,1564],{},"You can't delete the last workspace or the current default — set a different workspace as default first.",[132,1566,352],{"id":1567},"project",[10,1569,1570,1571,1573,1574,1577,1578,1581],{},"A project is exactly one git repository registered with Plexus. Adding a project points Plexus at a folder on disk; if it isn't a git repo yet, Plexus offers to run ",[23,1572,1111],{}," for you. Clicking a project's row in the sidebar opens the ",[40,1575,1576],{},"project view"," — a Dashboard tab listing the project's sessions and a Git tab with a full ",[14,1579,1580],{"href":16},"git client"," on the repository's main checkout. Removing a project tears down its sessions but leaves the repository on disk untouched.",[10,1583,1584,1585,1588,1589,1591,1592,1595,1596,1599,1600,1603],{},"You can also ",[40,1586,1587],{},"archive"," a whole project from its ",[23,1590,1074],{}," menu — the project and all of its sessions disappear from the tree but stay restorable, the same way archiving works for a single session. When you archive, Plexus stops every session's agent and asks one question: keep each session's worktree on disk (so a restore is instant and sessions stay resumable), or ",[40,1593,1594],{},"tear down worktrees"," to reclaim disk — running each session's teardown hooks and removing its worktree, optionally with its branch. Either way the project's settings and hooks are preserved. Archived projects live in the ",[40,1597,1598],{},"Archived"," drawer (the button at the bottom of the sidebar), where you can ",[40,1601,1602],{},"Restore"," one or delete it permanently. Your git repository on disk is never touched.",[132,1605,1526],{"id":1606},"session",[10,1608,1609,1610,1613,1614,1617,1618,1621],{},"A session is the unit of work — think ",[40,1611,1612],{},"one session = one feature",". When you start one, Plexus cuts a dedicated git ",[40,1615,1616],{},"worktree"," off a base branch you choose, on its own ",[23,1619,1620],{},"plexus\u002F\u003Cname>"," branch, and launches a named Claude Code conversation inside it. Because each session has its own worktree, sessions in the same project run in parallel without stepping on each other's files.",[10,1623,1624,1625,1627,1628,1630],{},"Not every task needs a whole worktree, though. When you just want a quick edit or review, choose ",[40,1626,1255],{}," to run a session directly in the project's root working tree — no base-branch picker and no isolation, so it launches immediately. Reach for it for fast, throwaway work, and use a standard session when you want the change isolated. See ",[14,1629,1265],{"href":1264}," for the full lifecycle and base-branch options.",[32,1632,1634],{"id":1633},"the-two-status-indicators","The two status indicators",[10,1636,1637,1638,1641,1642,1645],{},"Every session row in the tree and the ",[14,1639,1640],{"href":1329},"dashboard"," carries two indicators that are ",[40,1643,1644],{},"orthogonal"," — they answer different questions and change independently. A session can be idle with an open (green) PR, or working with no PR yet, in any combination.",[132,1647,1649],{"id":1648},"activity","Activity",[10,1651,1652],{},"A small dot shows what the agent is doing right now:",[256,1654,1655,1661,1667],{},[259,1656,1657,1660],{},[40,1658,1659],{},"Working"," — emerald, pulsing. The agent is actively processing a turn.",[259,1662,1663,1666],{},[40,1664,1665],{},"Waiting"," — amber. The agent needs your input or approval.",[259,1668,1669,1672],{},[40,1670,1671],{},"Idle"," — gray. Nothing in flight.",[10,1674,1675,1676,1678],{},"Plexus tracks this automatically through activity hooks installed into each session. See ",[14,1677,1334],{"href":394}," for details, including how to reset a stuck dot.",[132,1680,1682],{"id":1681},"branch-pr-state","Branch \u002F PR state",[10,1684,1685],{},"A branch icon shows where the work stands in the pull-request lifecycle:",[256,1687,1688,1694,1700],{},[259,1689,1690,1693],{},[40,1691,1692],{},"Gray"," — no pull request yet.",[259,1695,1696,1699],{},[40,1697,1698],{},"Green"," — an open pull request exists.",[259,1701,1702,1705],{},[40,1703,1704],{},"Purple"," — the pull request has been merged.",[10,1707,1708,1709,1712,1713,18],{},"In the dashboard, click the PR icon to open the pull request in your browser. Plexus supports ",[40,1710,1711],{},"GitHub and Bitbucket"," — see ",[14,1714,765],{"href":764},[32,1716,1718],{"id":1717},"warm-sessions","Warm sessions",[10,1720,1721,1722,1725],{},"Switching between sessions is instant because Plexus keeps recently-used sessions ",[40,1723,1724],{},"warm"," — their terminal and agent process stay live in the background even while you're looking at another session. A capped number stay warm at once (default 8); exceed the cap and the least-recently-used session is quietly cooled. A cooled session isn't gone — its worktree and conversation are preserved, and switching back resumes it automatically.",[10,1727,1728,1729,1732,1733,1736,1737,368,1739,1743],{},"That cap is the ",[23,1730,1731],{},"session.maxWarm"," setting, so you can tune it to your hardware: raise it on a powerful machine to keep more sessions instant, or lower it on a modest one to save memory — each warm session keeps a live agent and terminal process resident. Set it to ",[23,1734,1735],{},"0"," for no limit. Adjust it in ",[14,1738,165],{"href":164},[14,1740,1742],{"href":1741},"\u002Fdocs\u002Farchitecture","Architecture"," for how warm sessions work under the hood.",{"title":309,"searchDepth":310,"depth":310,"links":1745},[1746,1751,1755],{"id":1474,"depth":310,"text":1475,"children":1747},[1748,1749,1750],{"id":1535,"depth":316,"text":1502},{"id":1567,"depth":316,"text":352},{"id":1606,"depth":316,"text":1526},{"id":1633,"depth":310,"text":1634,"children":1752},[1753,1754],{"id":1648,"depth":316,"text":1649},{"id":1681,"depth":316,"text":1682},{"id":1717,"depth":310,"text":1718},"Workspaces, projects, sessions, worktrees, and the status indicators.","Boxes",{},5,{"title":1466,"description":1756},"docs\u002Fconcepts","h4vjx5kQ7hdM-Ws4Vz6XbmN7UO8WqEnQ7SXTQ5CN-f4",{"id":1764,"title":1742,"body":1765,"description":1974,"extension":323,"group":482,"icon":1975,"meta":1976,"navTitle":1742,"navigation":328,"order":1977,"path":1741,"seo":1978,"stem":1979,"__hash__":1980},"docs\u002Fdocs\u002Farchitecture.md",{"type":7,"value":1766,"toc":1967},[1767,1770,1774,1785,1788,1792,1805,1814,1818,1827,1831,1834,1910,1927,1936,1940,1964],[10,1768,1769],{},"Plexus is a native desktop app that wraps the real Claude Code CLI, with a Vue frontend and a Rust backend that does the heavy lifting.",[32,1771,1773],{"id":1772},"native-not-a-browser-tab","Native, not a browser tab",[10,1775,1776,1777,1782,1783,18],{},"Plexus ships as a ",[14,1778,1781],{"href":1779,"rel":1780},"https:\u002F\u002Ftauri.app",[814],"Tauri"," desktop app: a lightweight Vue UI driving a Rust backend. The backend owns everything slow or system-level — PTY terminals, git operations, file IO, and provider calls — so the interface stays responsive while agents and shells run underneath it. You install a signed build, not a web app; see ",[14,1784,462],{"href":461},[10,1786,1787],{},"Choosing Tauri over Electron was deliberate. An Electron app bundles its own copy of Chromium and runs the app's logic in JavaScript on a single main thread — so its memory footprint is heavy from the start and tends to creep up as features pile on, and the more you ask of it at once (many live sessions, terminals, and git operations in parallel) the more that one thread becomes the bottleneck. It's felt most on modest or older hardware. Plexus instead pairs a lightweight system-webview UI with a multithreaded Rust backend, keeping the heavy, concurrent work off the UI thread so the app stays fast as your session count climbs.",[32,1789,1791],{"id":1790},"local-first-by-design","Local-first by design",[10,1793,1794,1795,1797,1798,1800,1801,1804],{},"Your code, sessions, and credentials never leave your machine. Plexus drives the ",[23,1796,751],{}," CLI that you already have on your ",[23,1799,738],{},", so it runs on ",[40,1802,1803],{},"your"," Claude subscription rather than calling a hosted API behind your back.",[118,1806,1807],{},[10,1808,1809,1810,18],{},"Settings, session state, and history live in a local database on your machine — there is no Plexus account and no server-side config. Secrets are stored in your OS keychain. See ",[14,1811,1813],{"href":1812},"\u002Fdocs\u002Fsecrets","Secrets",[32,1815,1817],{"id":1816},"only-the-active-session-is-mounted","Only the active session is mounted",[10,1819,1820,1821,1823,1824,1826],{},"Plexus can run many sessions in parallel, but it only mounts the UI for the one you're looking at. Idle sessions stay ",[40,1822,1724],{}," in the background — their agent and worktree are alive and processing — so switching between them is instant and nothing loses its place. See ",[14,1825,372],{"href":371}," for how sessions, worktrees, and projects fit together.",[32,1828,1830],{"id":1829},"the-window-at-a-glance","The window at a glance",[10,1832,1833],{},"The app is one window with a few fixed regions:",[557,1835,1836,1846],{},[560,1837,1838],{},[563,1839,1840,1843],{},[566,1841,1842],{},"Region",[566,1844,1845],{},"What lives there",[572,1847,1848,1861,1874,1895],{},[563,1849,1850,1855],{},[577,1851,1852],{},[40,1853,1854],{},"Title bar",[577,1856,1857,1858,1860],{},"The Plexus mark, the ",[14,1859,165],{"href":164}," button, and the theme toggle (Light → Dark → System)",[563,1862,1863,1868],{},[577,1864,1865],{},[40,1866,1867],{},"Left tree",[577,1869,1870,1871,1873],{},"Projects and their sessions, plus the ",[14,1872,1330],{"href":1329}," and archived items",[563,1875,1876,1881],{},[577,1877,1878],{},[40,1879,1880],{},"Center",[577,1882,1883,1884,1886,1887,91,1889,91,1891,91,1893],{},"The active ",[14,1885,1606],{"href":1264}," — a tabbed view: ",[14,1888,1275],{"href":75},[14,1890,296],{"href":295},[14,1892,421],{"href":420},[14,1894,902],{"href":330},[563,1896,1897,1902],{},[577,1898,1899],{},[40,1900,1901],{},"Bottom",[577,1903,1904,1905,1909],{},"A collapsible ",[14,1906,1908],{"href":1907},"\u002Fdocs\u002Fterminal","terminal"," panel rooted in the session's worktree",[10,1911,1912,1913,1916,1917,1919,1920,1923,1924,18],{},"Switch tabs with ",[23,1914,1915],{},"⌘1","–",[23,1918,25],{},", toggle the terminal with ",[23,1921,1922],{},"⌘J",", and toggle the dashboard with ",[23,1925,1926],{},"⌘0",[118,1928,1929],{},[10,1930,1931,1933,1934,18],{},[23,1932,29],{},"\u002FMod is Cmd on macOS and Ctrl on Windows\u002FLinux. The full set lives in ",[14,1935,242],{"href":241},[32,1937,1939],{"id":1938},"what-the-backend-handles","What the backend handles",[256,1941,1942,1948,1955],{},[259,1943,1944,1947],{},[40,1945,1946],{},"Terminals"," — each session and scratch shell runs in a real PTY, so interactive tools and TUIs work exactly as they would in your own terminal.",[259,1949,1950,1952,1953,18],{},[40,1951,902],{}," — worktrees, branches, diffs, rebase, merge, and squash are native git operations, not reimplementations. See ",[14,1954,1430],{"href":1429},[259,1956,1957,1960,1961,1963],{},[40,1958,1959],{},"Providers"," — Plexus launches and supervises the ",[23,1962,751],{}," process for each session and streams its output to the UI.",[10,1965,1966],{},"The result is a thin client over fast native plumbing: the UI is just a view, and the work happens close to your filesystem.",{"title":309,"searchDepth":310,"depth":310,"links":1968},[1969,1970,1971,1972,1973],{"id":1772,"depth":310,"text":1773},{"id":1790,"depth":310,"text":1791},{"id":1816,"depth":310,"text":1817},{"id":1829,"depth":310,"text":1830},{"id":1938,"depth":310,"text":1939},"How Plexus is built — a thin, local-first Tauri desktop app.","Package",{},6,{"title":1742,"description":1974},"docs\u002Farchitecture","UInh6s24PnaePPfxk6zgULchHqvd9OARKxJx4zHS52c",{"id":1982,"title":1330,"body":1983,"description":2277,"extension":323,"group":2278,"icon":2279,"meta":2280,"navTitle":1330,"navigation":328,"order":2281,"path":1329,"seo":2282,"stem":2283,"__hash__":2284},"docs\u002Fdocs\u002Fdashboard.md",{"type":7,"value":1984,"toc":2267},[1985,1988,1996,2000,2014,2017,2068,2075,2079,2102,2111,2115,2125,2131,2176,2179,2183,2186,2190,2206,2210,2217,2221,2248,2250],[10,1986,1987],{},"The Global Dashboard is one live table of every session across all your workspaces and projects — current activity and pull-request state, at a glance.",[10,1989,1990,1991,1995],{},"It shows your active work only: archived sessions, and the sessions of an ",[14,1992,1994],{"href":1993},"\u002Fdocs\u002Fconcepts#project","archived project",", drop out of the table (and the header counts) until you restore them.",[32,1997,1999],{"id":1998},"open-the-dashboard","Open the dashboard",[10,2001,21,2002,2004,2005,2007,2008,2010,2011,2013],{},[23,2003,1926],{},", or click the ",[40,2006,1330],{}," button in the left sidebar. (",[23,2009,29],{}," is Cmd on macOS, Ctrl on Windows and Linux.) Press ",[23,2012,1926],{}," or click the button again to toggle it off and return to the session view.",[10,2015,2016],{},"The right pane switches to a session table with these columns:",[557,2018,2019,2029],{},[560,2020,2021],{},[563,2022,2023,2026],{},[566,2024,2025],{},"Column",[566,2027,2028],{},"Shows",[572,2030,2031,2039,2046,2053,2061],{},[563,2032,2033,2036],{},[577,2034,2035],{},"State",[577,2037,2038],{},"The activity dot — working, waiting, or idle",[563,2040,2041,2043],{},[577,2042,1526],{},[577,2044,2045],{},"The session name",[563,2047,2048,2050],{},[577,2049,352],{},[577,2051,2052],{},"The project the session belongs to",[563,2054,2055,2058],{},[577,2056,2057],{},"Branch",[577,2059,2060],{},"The session's worktree branch",[563,2062,2063,2065],{},[577,2064,1502],{},[577,2066,2067],{},"The workspace the project lives in",[10,2069,2070,2071,2074],{},"Each row carries the same indicators as the navigation tree — a pulsing activity dot and a PR badge. See ",[14,2072,2073],{"href":394},"Status & indicators"," for what every color and icon means.",[32,2076,2078],{"id":2077},"summary-counts","Summary counts",[10,2080,2081,2082,2085,2086,2089,2090,2093,2094,2097,2098,2101],{},"A header above the table totals every session by state: green ",[40,2083,2084],{},"working"," (agents producing output), amber ",[40,2087,2088],{},"waiting"," (sessions that need your input), and gray ",[40,2091,2092],{},"idle"," (started sessions with no active turn), plus green ",[40,2095,2096],{},"open"," and purple ",[40,2099,2100],{},"merged"," pull-request counts.",[118,2103,2104],{},[10,2105,2106,2107,2110],{},"The counts always reflect ",[40,2108,2109],{},"all"," sessions across the whole app, even when you filter the table below to a single workspace — so the header tells you what's happening everywhere while you focus the list on one area.",[32,2112,2114],{"id":2113},"filter-and-sort","Filter and sort",[10,2116,84,2117,2120,2121,2124],{},[40,2118,2119],{},"Filter by workspace"," dropdown defaults to ",[40,2122,2123],{},"All workspaces","; pick a workspace name to narrow the table to its sessions. Only the table is filtered — the summary counts stay global.",[10,2126,84,2127,2130],{},[40,2128,2129],{},"Sort sessions"," dropdown reorders the table:",[557,2132,2133,2143],{},[560,2134,2135],{},[563,2136,2137,2140],{},[566,2138,2139],{},"Mode",[566,2141,2142],{},"Order",[572,2144,2145,2153,2161,2168],{},[563,2146,2147,2150],{},[577,2148,2149],{},"Needs input first",[577,2151,2152],{},"Waiting, then working, then idle (the default)",[563,2154,2155,2158],{},[577,2156,2157],{},"Recently active",[577,2159,2160],{},"Most recent activity first",[563,2162,2163,2165],{},[577,2164,1502],{},[577,2166,2167],{},"By workspace, then project, then session",[563,2169,2170,2173],{},[577,2171,2172],{},"Name",[577,2174,2175],{},"Alphabetical by session name",[10,2177,2178],{},"Your sort choice is remembered while the app is open and resets to the default the next time you launch Plexus.",[32,2180,2182],{"id":2181},"jump-to-a-session","Jump to a session",[10,2184,2185],{},"Click anywhere on a row to focus that session: Plexus switches to the session view, selects the session, and expands its project and workspace in the sidebar tree. The one exception is the PR badge — clicking it opens the pull request in your browser instead.",[32,2187,2189],{"id":2188},"the-project-dashboard","The project dashboard",[10,2191,2192,2193,2195,2196,2198,2199,2201,2202,2205],{},"The same table exists scoped to a single project: click a project's row in the sidebar tree to open the ",[14,2194,1576],{"href":16},", whose ",[40,2197,1330],{}," tab lists only that project's sessions — the same columns and live indicators, summary counts for just this project, and the same sort modes (minus ",[154,2200,1502],{},", which is meaningless within one project). A ",[40,2203,2204],{},"New session"," button sits in the header, so starting the next piece of work never leaves the view. As everywhere else, archived sessions are excluded.",[32,2207,2209],{"id":2208},"empty-state","Empty state",[10,2211,2212,2213,2216],{},"Before you've created any sessions, the dashboard shows a centered ",[40,2214,2215],{},"No sessions yet"," message explaining that sessions from across your workspaces and projects appear here with live activity and PR state. Your first session shows up automatically once you create it.",[32,2218,2220],{"id":2219},"adding-repositories","Adding repositories",[10,2222,2223,2224,1075,2226,2228,2229,2231,2232,2235,2236,2239,2240,2243,2244,2247],{},"Projects come from the navigation tree, not the dashboard table: hover a workspace, open its ",[40,2225,1074],{},[40,2227,1078],{}," (empty workspaces show an inline ",[40,2230,1082],{},"). You can add a project from a ",[40,2233,2234],{},"local folder",", by ",[40,2237,2238],{},"searching a connected GitHub or Bitbucket account"," and cloning a repository, or by ",[40,2241,2242],{},"cloning a git URL"," — the two clone flows show a live progress bar and register the result as a project. See ",[14,2245,1065],{"href":2246},"\u002Fdocs\u002Fgetting-started#add-a-repository"," for the full walkthrough.",[32,2249,283],{"id":282},[256,2251,2252,2257,2262],{},[259,2253,2254,2256],{},[14,2255,469],{"href":468}," — add your first repository and run a session",[259,2258,2259,2261],{},[14,2260,2073],{"href":394}," — what the activity dots and PR badges mean",[259,2263,2264,2266],{},[14,2265,242],{"href":241}," — the full shortcut reference",{"title":309,"searchDepth":310,"depth":310,"links":2268},[2269,2270,2271,2272,2273,2274,2275,2276],{"id":1998,"depth":310,"text":1999},{"id":2077,"depth":310,"text":2078},{"id":2113,"depth":310,"text":2114},{"id":2181,"depth":310,"text":2182},{"id":2188,"depth":310,"text":2189},{"id":2208,"depth":310,"text":2209},{"id":2219,"depth":310,"text":2220},{"id":282,"depth":310,"text":283},"The bird's-eye view — every session across all workspaces.","Working with projects","LayoutGrid",{},10,{"title":1330,"description":2277},"docs\u002Fdashboard","3JwjzPBKMAYUhAT4t_ptSQIf9ndLFs-ZjlK-jVL2Fvg",{"id":2286,"title":17,"body":2287,"description":3060,"extension":323,"group":2278,"icon":3061,"meta":3062,"navTitle":3063,"navigation":328,"order":3064,"path":16,"seo":3065,"stem":3066,"__hash__":3067},"docs\u002Fdocs\u002Fproject-git.md",{"type":7,"value":2288,"toc":3042},[2289,2296,2304,2308,2319,2329,2332,2339,2343,2356,2360,2383,2386,2390,2403,2430,2437,2503,2510,2524,2528,2537,2551,2554,2573,2590,2604,2608,2649,2671,2691,2695,2789,2793,2809,2819,2831,2835,2841,2846,2850,2853,2863,2869,2882,2887,2891,2894,2901,2904,2958,2981,2989,2993,3004,3014,3016],[10,2290,2291,2292,2295],{},"The project view puts a full git client on your repository's ",[40,2293,2294],{},"main checkout"," — a commit graph with branches, tags, and stashes, plus pull, push, staging, context-menu branch surgery, and in-app conflict resolution.",[10,2297,2298,2299,2301,2302,30],{},"This is the project-level counterpart to the session's ",[14,2300,412],{"href":330},": that one manages a single session's worktree branch, while this one manages the repository itself. Throughout this page ",[23,2303,29],{},[32,2305,2307],{"id":2306},"open-the-project-view","Open the project view",[10,2309,2310,2311,2314,2315,2318],{},"Click a ",[40,2312,2313],{},"project row"," in the left sidebar. This opens the project view and expands the project's sessions — it never collapses them. To collapse or expand a project without opening it, click the small ",[40,2316,2317],{},"chevron"," on the row instead; the two are separate targets, so the chevron never opens the view.",[10,2320,2321,2322,2324,2325,2328],{},"The header shows the project's name and repository path, a ",[40,2323,2204],{}," button, and an ",[40,2326,2327],{},"×"," to close the view. Below it sit two tabs:",[217,2330],{":rows":2331},"[[\"⌘1\",\"Switch to the Dashboard tab\"],[\"⌘2\",\"Switch to the Git tab\"]]",[10,2333,2334,2335,2338],{},"These share their default combos with the session tab shortcuts — a session and a project are never in view at the same time, so they don't conflict, and each pair is ",[14,2336,2337],{"href":241},"rebindable"," on its own. Plexus remembers which tab you left open per project.",[32,2340,2342],{"id":2341},"the-dashboard-tab","The Dashboard tab",[10,2344,2345,2346,2349,2350,2352,2353,18],{},"The Dashboard tab is the ",[14,2347,2348],{"href":1329},"global dashboard's"," session table scoped to this one project: every unarchived session with its live activity dot, branch, and PR badge, per-project summary counts in the header, the same sort modes, and a ",[40,2351,2204],{}," button. Click a row to jump to that session. See ",[14,2354,1330],{"href":2355},"\u002Fdocs\u002Fdashboard#the-project-dashboard",[32,2357,2359],{"id":2358},"the-git-tab","The Git tab",[10,2361,2362,2363,2366,2367,2370,2371,2374,2375,2378,2379,18],{},"The Git tab is laid out in three resizable panes: the ",[40,2364,2365],{},"refs panel"," on the left (branches, remotes, worktrees, stashes, tags), the ",[40,2368,2369],{},"commit graph"," in the center, and a ",[40,2372,2373],{},"detail pane"," on the right showing whichever commit — or your uncommitted work — is selected. A toolbar with the branch switcher and sync actions runs across the top. Diffs never squeeze into the detail pane: clicking a file there opens its diff ",[40,2376,2377],{},"full-width"," in place of the refs panel and graph — see ",[14,2380,2382],{"href":2381},"#the-detail-pane","The detail pane",[10,2384,2385],{},"Everything operates on the project's primary checkout — the folder you registered as the project — never on a session's worktree. Plexus refreshes the tab automatically after its own operations and whenever you return to the window, so git activity from an outside terminal shows up too; the toolbar's refresh button forces a reload any time.",[32,2387,2389],{"id":2388},"the-commit-graph","The commit graph",[10,2391,2392,2393,91,2396,2399,2400,2402],{},"The center pane draws the repository's full history as a lane graph, GitKraken-style: colored lanes trace each branch line — running unbroken through the merges that join them — and each commit renders as a dot with the author's avatar inside, ringed in the lane's color. Merge commits stay small hollow dots. The commit's subject fills the row, with a compact relative age (",[23,2394,2395],{},"2h",[23,2397,2398],{},"3d",") on the right edge. The graph is virtualized and extends itself as you scroll — deep histories load in pages automatically, with no ",[154,2401,46],{}," button to press.",[10,2404,2405,2406,2409,2410,2413,2414,2417,2418,2421,2422,2425,2426,2429],{},"Branch and tag ",[40,2407,2408],{},"labels"," sit in a fixed column on the graph's left edge, each tied to its commit's dot by a thin connector line in the branch's color. A branch gets ",[40,2411,2412],{},"one label"," wherever it lives, with presence icons telling you where: a ",[40,2415,2416],{},"computer"," icon when the branch exists locally, a ",[40,2419,2420],{},"cloud"," icon when it exists on a remote, and both together when local and remote point at the same commit — hover the label for the full remote-qualified names. A branch that exists only on a remote shows the bare branch name with just the cloud icon, so a glance still tells you whether a tip is only on your machine, only on the remote, or both. The checked-out branch's label is highlighted with a check mark, and tags keep their tag icon. A row with several refs shows the first label and folds the rest into a ",[23,2423,2424],{},"+N"," overflow. ",[40,2427,2428],{},"Double-click a branch label to check the branch out"," — a remote label with no local branch yet creates a local tracking branch first; a remote label whose local branch already exists switches to that local branch and fast-forwards it to the remote (a pull), leaving it untouched if the two have diverged. Either way it matches checking the branch out from the refs panel.",[10,2431,2432,2433,2436],{},"Branch labels can also be ",[40,2434,2435],{},"dragged onto one another",": drop one branch's label on another's and a menu offers the actions that fit that pair. Tags can't be dragged, and a drop with nothing to offer simply does nothing.",[256,2438,2439,2445,2454,2478,2494],{},[259,2440,2441,2444],{},[40,2442,2443],{},"Fast-forward"," the dragged branch to the target — offered when the dragged branch is local; it refuses cleanly if the two have diverged.",[259,2446,2447,2449,2450,2453],{},[40,2448,187],{}," the dragged branch to the target's ",[40,2451,2452],{},"remote branch"," — offered when the dragged branch is local and the target exists on a remote; it pushes your commits onto that remote branch even though the names differ. The push is never forced — it refuses if the remote branch has commits the dragged branch doesn't.",[259,2455,2456,2459,2460,2463,2464,2468,2469,2472,2473,2477],{},[40,2457,2458],{},"Merge"," the other branch into the current one, or ",[40,2461,2462],{},"rebase"," the current branch onto the other — offered when either side of the pair is the checked-out branch (git can only merge or rebase the checkout). Both use the same confirm dialogs as the ",[14,2465,2467],{"href":2466},"#context-menus","context menus",": merge offers ",[23,2470,2471],{},"--no-ff",", and conflicts flip the tab into ",[14,2474,2476],{"href":2475},"#conflict-resolution","conflict resolution"," as usual.",[259,2479,2480,2483,2484,109,2487,109,2490,2493],{},[40,2481,2482],{},"Reset"," the current branch to the target's tip (",[40,2485,2486],{},"Soft",[40,2488,2489],{},"Mixed",[40,2491,2492],{},"Hard",") — offered only when you drag the checked-out branch itself; a hard reset keeps its typed confirmation.",[259,2495,2496,2499,2500,2502],{},[40,2497,2498],{},"Start a pull request"," from the dragged branch's remote counterpart to the target's — offered when both branches exist on the same remote. A small dialog asks for a title (required) and an optional description, then Plexus creates the pull request on your provider — GitHub today — using the same authentication as the session-level ",[14,2501,204],{"href":203}," flow, and the success toast links to the new PR. Unlike the session flow, there's no AI-drafted description here.",[10,2504,2505,2506,18],{},"Operations that change the working tree ride the usual ",[14,2507,2509],{"href":2508},"#the-busy-checkout-guard","busy-checkout guard",[10,2511,84,2512,2514,2515,2519,2520,2523],{},[40,2513,81],{}," row is pinned at the top with a live count of changed files — click it to open the ",[14,2516,2518],{"href":2517},"#stage-and-commit","staging pane",". An empty repository shows ",[40,2521,2522],{},"No commits yet","; the row for uncommitted work still works, so you can stage and make the first commit from here.",[132,2525,2527],{"id":2526},"author-avatars","Author avatars",[10,2529,2530,2531,2536],{},"Avatars come from ",[14,2532,2535],{"href":2533,"rel":2534},"https:\u002F\u002Fgravatar.com",[814],"Gravatar",", matched by a one-way SHA-256 hash of each commit author's email — the address itself is never sent, results are cached on disk, and authors without a Gravatar get locally-drawn initials on a stable color.",[118,2538,2539],{},[10,2540,2541,2542,2545,2546,2548,2549,18],{},"Avatar lookups are the only network requests this tab makes beyond your git remotes. Turn them off with the global ",[23,2543,2544],{},"git.avatars.gravatar"," setting and Plexus renders initials only, with no request at all — see ",[14,2547,165],{"href":164}," and the ",[14,2550,517],{"href":516},[32,2552,2382],{"id":2553},"the-detail-pane",[10,2555,2556,2557,2560,2561,2564,2565,2568,2569,2572],{},"Selecting a commit fills the right pane with a ",[40,2558,2559],{},"header"," — the author's avatar, the sha, the commit's parents, and a changed-file count — above the list of ",[40,2562,2563],{},"changed files",", switchable between a flat ",[40,2566,2567],{},"List"," and a folder ",[40,2570,2571],{},"Tree",". Selecting a commit never opens a diff by itself.",[10,2574,2575,2578,2579,2581,2582,2585,2586,2589],{},[40,2576,2577],{},"Click a file"," and its diff opens ",[40,2580,2377],{},", replacing the refs panel and commit graph; the detail pane stays put on the right, so you can step through the commit's files without losing your place. Close the diff with its ",[40,2583,2584],{},"✕"," or press ",[40,2587,2588],{},"Escape"," to return to the graph.",[10,2591,2592,2593,2595,2596,2599,2600,2603],{},"Selecting ",[40,2594,81],{}," works the same way: the detail pane holds the ",[14,2597,2598],{"href":2517},"staging lists and commit composer",", and a clicked file's diff — or a conflicted file's ",[14,2601,2602],{"href":2475},"resolve pane"," — takes the full-width spot while you keep staging and committing from the right.",[32,2605,2607],{"id":2606},"the-refs-panel","The refs panel",[10,2609,2610,2611,2614,2615,2618,2619,2621,2622,91,2624,98,2626,2629,2630,2633,2634,1046,2637,2640,2641,2644,2645,2648],{},"The left panel lists every ref in collapsible sections, each with a count: ",[40,2612,2613],{},"Local"," branches, one section per ",[40,2616,2617],{},"remote"," (e.g. ",[23,2620,191],{},"), ",[40,2623,1430],{},[40,2625,101],{},[40,2627,2628],{},"Tags",". Names containing ",[23,2631,2632],{},"\u002F"," nest into folders, so ",[23,2635,2636],{},"feature\u002Flogin",[23,2638,2639],{},"feature\u002Fsearch"," group under ",[23,2642,2643],{},"feature",". The ",[40,2646,2647],{},"Filter refs…"," box at the top narrows every section at once.",[10,2650,2651,2652,2655,2656,2632,2659,2662,2663,2665,2666,2668,2669,18],{},"Clicking a branch or tag jumps the graph to its commit; ",[40,2653,2654],{},"double-clicking a branch checks it out"," (a remote branch with no local copy gets a local tracking branch first; one that already has a local branch switches to it and fast-forwards it to the remote). Local branch rows also carry the sync state against their upstream: ",[23,2657,2658],{},"↑",[23,2660,2661],{},"↓"," ahead\u002Fbehind counts, plus a ",[40,2664,2420],{}," icon when the branch is fully on its remote or a ",[40,2667,2416],{}," icon when its latest commits exist only locally. The Worktrees section lists the repository's linked worktrees and their branches — with Plexus, that's typically one per ",[14,2670,1606],{"href":1264},[10,2672,2673,2674,2677,2678,91,2681,98,2683,2686,2687,2690],{},"Hovering a ",[40,2675,2676],{},"stash"," row reveals ",[40,2679,2680],{},"Apply",[40,2682,181],{},[40,2684,2685],{},"Drop"," actions. Drop asks for a second click (the button flips to ",[154,2688,2689],{},"Drop?"," for a moment) instead of a dialog.",[32,2692,2694],{"id":2693},"the-toolbar","The toolbar",[256,2696,2697,2711,2756,2773,2783],{},[259,2698,2699,2702,2703,2706,2707,2710],{},[40,2700,2701],{},"Branch switcher"," — shows the checked-out branch (or a short commit id with a ",[23,2704,2705],{},"detached"," badge). Open it to filter and check out another local branch, or pick ",[40,2708,2709],{},"Create branch…"," to branch from the current head, optionally checking it out immediately.",[259,2712,2713,2716,2717,2720,2721,91,2724,98,2727,2644,2730,2733,2734,2737,2738,109,2741,109,2744,109,2747,2749,2750,2752,2753,2755],{},[40,2714,2715],{},"Pull"," — a split button. The main click runs your default action; the arrow opens the full menu: ",[40,2718,2719],{},"Fetch all"," (all remotes, pruning deleted branches), ",[40,2722,2723],{},"Pull (fast-forward if possible)",[40,2725,2726],{},"Pull (fast-forward only)",[40,2728,2729],{},"Pull (rebase)",[40,2731,2732],{},"Default action"," picker in the same menu saves your choice for this project — it's the ",[23,2735,2736],{},"git.pull.defaultMode"," setting (",[23,2739,2740],{},"fetchAll",[23,2742,2743],{},"ff",[23,2745,2746],{},"ffOnly",[23,2748,2462],{},", default ",[23,2751,2743],{},"), so you can also set it globally in ",[14,2754,165],{"href":164},". Pull disables with an explanatory tooltip when there's nothing it could do — no remotes, a detached HEAD, or a branch with no upstream.",[259,2757,2758,2760,2761,2632,2763,2765,2766,2769,2770,2772],{},[40,2759,187],{}," — pushes the current branch to its upstream, with ",[23,2762,2658],{},[23,2764,2661],{}," ahead\u002Fbehind counts alongside. If the branch has no upstream yet, a ",[40,2767,2768],{},"Publish branch?"," prompt offers to push it to ",[23,2771,191],{}," and set the upstream in one go. Pushes are never forced — if you amended or reset a branch that was already pushed, git will reject the push and you'll need to resolve that outside Plexus, by design.",[259,2774,2775,109,2777,2779,2780,18],{},[40,2776,174],{},[40,2778,181],{}," — stash all changes including untracked files, or pop the newest stash. Individual stashes are managed from the ",[14,2781,2365],{"href":2782},"#the-refs-panel",[259,2784,2785,2788],{},[40,2786,2787],{},"Refresh"," — force-reload the graph, refs, and status.",[32,2790,2792],{"id":2791},"stage-and-commit","Stage and commit",[10,2794,2795,2796,2798,2799,91,2801,98,2803,2805,2806,18],{},"Select ",[40,2797,81],{}," (the pinned top row) to open the staging pane. Files group into ",[40,2800,90],{},[40,2802,94],{},[40,2804,97],{}," sections with per-file and per-section stage\u002Funstage buttons; clicking a file opens its working-tree diff in the ",[14,2807,2808],{"href":2381},"full-width view",[10,2810,2811,2812,109,2815,2818],{},"Inside a diff, every hunk carries its own ",[40,2813,2814],{},"Stage hunk",[40,2816,2817],{},"Unstage hunk"," button, so you can split one file across several commits. Untracked files are the exception — they have no hunks yet and stage as a whole.",[10,2820,2821,2822,2824,2825,2827,2828,2830],{},"The composer below takes a summary and an optional description. The ",[40,2823,151],{}," button drafts both from the staged diff (tune it with the ",[23,2826,160],{}," setting), and ",[40,2829,135],{}," lands the staged files.",[132,2832,2834],{"id":2833},"amend","Amend",[10,2836,2837,2838,2840],{},"The composer's ",[40,2839,2834],{}," switch rewrites the head commit instead of creating a new one: toggling it on prefills the message from the current head (unless you've already typed), and an amend may be message-only — no staged files required.",[118,2842,2843],{"tone":120},[10,2844,2845],{},"Amending a commit that's already on the remote rewrites published history — the composer warns you when the head commit has been pushed, because the next push will be rejected as a non-fast-forward.",[32,2847,2849],{"id":2848},"context-menus","Context menus",[10,2851,2852],{},"Right-click gives each surface its own menu. Destructive entries always confirm before running.",[10,2854,2855,2858,2859,2862],{},[40,2856,2857],{},"Local branches"," (refs panel): Checkout · Create branch here… · Pull \u002F Push · Merge into the current branch… · Rebase the current branch onto this… · Set upstream… · Rename… · Delete (local, or local ",[40,2860,2861],{},"and"," remote in one go) · Copy branch name \u002F sha · Create tag here…. Deleting or renaming a branch that belongs to a session warns you first, naming the session.",[10,2864,2865,2868],{},[40,2866,2867],{},"Remote branches",": Checkout as local branch (creating the local tracking branch, or switching to an existing one and fast-forwarding it to the remote) · Fast-forward the current branch to this (offered when it's the current branch's upstream) · Merge into the current branch… · Rebase the current branch onto this… · Delete from the remote….",[10,2870,2871,2874,2875,109,2877,109,2879,2881],{},[40,2872,2873],{},"Commit rows"," (graph): Create branch here… · Create tag here… · Cherry-pick commit · Revert commit · Reset the current branch to this commit (",[40,2876,2486],{},[40,2878,2489],{},[40,2880,2492],{}," — a hard reset discards work, so it demands a typed confirmation) · Copy sha \u002F short sha \u002F subject.",[10,2883,2884,2886],{},[40,2885,2628],{},": Push to a remote · Delete · Copy name \u002F sha.",[32,2888,2890],{"id":2889},"conflict-resolution","Conflict resolution",[10,2892,2893],{},"A merge, rebase, cherry-pick, revert, pull, or stash pop that hits conflicts doesn't fail — the tab switches into conflict mode and lets you resolve everything in place.",[10,2895,2896,2897,2900],{},"An amber ",[40,2898,2899],{},"banner"," appears under the toolbar naming the operation and counting the conflicted files remaining. While it's up, the toolbar and branch switcher are disabled and the view stays on your uncommitted changes, where conflicted files are listed in their own section.",[10,2902,2903],{},"Each conflicted file offers three ways out:",[256,2905,2906,2915,2949],{},[259,2907,2908,109,2911,2914],{},[40,2909,2910],{},"Ours",[40,2912,2913],{},"Theirs"," on the file row — take one side whole, no questions asked. (Binary or very large files resolve this way only.)",[259,2916,2917,2920,2921,2923,2924,1046,2927,2930,2931,91,2934,788,2937,2940,2941,2944,2945,2948],{},[40,2918,2919],{},"Hunk picker"," — click the file and its resolve pane opens in the ",[14,2922,2808],{"href":2381},", each conflict shown as side-by-side ",[154,2925,2926],{},"ours",[154,2928,2929],{},"theirs"," cards, labeled with where each side came from. Pick ",[40,2932,2933],{},"Take ours",[40,2935,2936],{},"Take theirs",[40,2938,2939],{},"Take both"," per conflict; once every conflict has a choice, ",[40,2942,2943],{},"Apply resolution"," writes the file, and the default-on ",[40,2946,2947],{},"Mark resolved after applying"," switch stages it in the same step.",[259,2950,2951,2954,2955,18],{},[40,2952,2953],{},"Edit file"," — switch the picker to a full editor to resolve the markers by hand, then ",[40,2956,2957],{},"Save & mark resolved",[10,2959,2960,2961,91,2964,91,2967,91,2970,788,2973,2976,2977,2980],{},"When no conflicted files remain, the banner's action button finishes the operation — ",[40,2962,2963],{},"Commit merge",[40,2965,2966],{},"Continue rebase",[40,2968,2969],{},"Continue cherry-pick",[40,2971,2972],{},"Continue revert",[40,2974,2975],{},"Done"," for a stash pop (which then drops the now-applied stash). A rebase that spans several commits may stop again on the next conflict; the banner simply stays up with the new file list. ",[40,2978,2979],{},"Abort"," (with a confirmation) backs the whole operation out and restores your working tree — a popped stash survives an abort.",[118,2982,2983],{},[10,2984,2985,2986,2988],{},"A conflicting stash ",[40,2987,2680],{}," is the one case with nothing to continue or abort: the stash is kept either way, so there's no banner — just resolve the conflicted files and stage them, and you're done.",[32,2990,2992],{"id":2991},"the-busy-checkout-guard","The busy-checkout guard",[10,2994,2995,2996,2999,3000,3003],{},"Sessions ",[14,2997,2998],{"href":1264},"started on the root tree"," run their agent directly in the same checkout this tab operates on. If such a session's agent is running, any operation that would change the working tree — checkout, pull, merge, rebase, reset, revert, cherry-pick, stash apply\u002Fpop, and continuing or aborting a conflict — is stopped first with an ",[40,3001,3002],{},"\"An agent session is running on this checkout\""," dialog naming the session.",[10,3005,3006,3007,3009,3010,3013],{},"That's a guard, not a wall: ",[40,3008,1169],{}," leaves everything untouched, while ",[40,3011,3012],{},"Continue anyway"," runs the operation regardless — do that only when you're sure the agent won't trip over files changing underneath it. Operations that never touch the working tree — fetch, push, staging, committing, and tag work — are never blocked.",[32,3015,283],{"id":282},[256,3017,3018,3023,3028,3037],{},[259,3019,3020,3022],{},[14,3021,327],{"href":330}," — the per-session git tab for a worktree branch.",[259,3024,3025,3027],{},[14,3026,1330],{"href":1329}," — the global session table; the project view scopes it down.",[259,3029,3030,1289,3032,91,3034,3036],{},[14,3031,165],{"href":164},[23,3033,2736],{},[23,3035,2544],{},", and the AI commit prompt.",[259,3038,3039,3041],{},[14,3040,242],{"href":241}," — the project tab bindings.",{"title":309,"searchDepth":310,"depth":310,"links":3043},[3044,3045,3046,3047,3050,3051,3052,3053,3056,3057,3058,3059],{"id":2306,"depth":310,"text":2307},{"id":2341,"depth":310,"text":2342},{"id":2358,"depth":310,"text":2359},{"id":2388,"depth":310,"text":2389,"children":3048},[3049],{"id":2526,"depth":316,"text":2527},{"id":2553,"depth":310,"text":2382},{"id":2606,"depth":310,"text":2607},{"id":2693,"depth":310,"text":2694},{"id":2791,"depth":310,"text":2792,"children":3054},[3055],{"id":2833,"depth":316,"text":2834},{"id":2848,"depth":310,"text":2849},{"id":2889,"depth":310,"text":2890},{"id":2991,"depth":310,"text":2992},{"id":282,"depth":310,"text":283},"A full git client on the project's main checkout — commit graph, branches, staging, and conflict resolution.","GitGraph",{},"Git GUI",11,{"title":17,"description":3060},"docs\u002Fproject-git","sD3hOTeEJ07IVxH4Iqh8iPhJFWgrS_VvmgjyMm-e_Pc",{"id":3069,"title":1265,"body":3070,"description":3372,"extension":323,"group":324,"icon":3373,"meta":3374,"navTitle":360,"navigation":328,"order":3375,"path":1264,"seo":3376,"stem":3377,"__hash__":3378},"docs\u002Fdocs\u002Fsessions.md",{"type":7,"value":3071,"toc":3361},[3072,3075,3079,3094,3100,3103,3106,3118,3122,3125,3128,3137,3141,3173,3188,3200,3206,3210,3216,3264,3271,3282,3286,3296,3339],[10,3073,3074],{},"A session is one named Claude Code agent running in its own git worktree on its own branch — the atomic unit of work in Plexus.",[32,3076,3078],{"id":3077},"creating-a-session","Creating a session",[10,3080,536,3081,3083,3084,3086,3087,3090,3091,18],{},[23,3082,1074],{}," menu on a project row in the tree and choose ",[40,3085,2204],{},". Give it a name (required) and pick a ",[40,3088,3089],{},"base branch"," — Plexus preselects a smart default (the repo's default branch, or whatever is currently checked out) and lists both local and remote branches. Click ",[40,3092,3093],{},"Create",[10,3095,3096,3097,3099],{},"When the session starts, Plexus cuts a fresh git worktree, branches a new ",[23,3098,1620],{}," branch off the base (deduplicated if that name is taken), and mints a named Claude Code conversation inside it. The session owns that branch for its lifetime, so any number of sessions per project run independently without stepping on each other's files.",[10,3101,3102],{},"Two sessions in the same project can share a display name — the underlying branch gets a unique suffix so they never collide.",[132,3104,1255],{"id":3105},"start-session-on-root-tree",[10,3107,3108,3109,3111,3112,3114,3115,18],{},"When you just want a quick edit or review without a separate worktree, open the project's ",[23,3110,1074],{}," menu and choose ",[40,3113,1255],{},". There's no base-branch picker — the session runs directly in the project's root working tree and launches immediately. Because root-tree sessions share that one working directory, use them for fast, throwaway work and reach for a standard session when you want isolation. More on layout in ",[14,3116,3117],{"href":1429},"Worktrees & environment",[32,3119,3121],{"id":3120},"lifecycle","Lifecycle",[10,3123,3124],{},"A session is just metadata until you start it. The agent process is killed when you stop it, but the worktree, branch, and conversation persist — so a stopped session is always resumable.",[217,3126],{":rows":3127},"[[\"Start\",\"Cut the worktree, run create + run hooks, and launch the agent on a fresh branch.\"],[\"Resume\",\"Reattach the same conversation to a stopped session and pick up where it left off.\"],[\"Stop\",\"End the agent process but keep the worktree, branch, and transcript intact.\"],[\"Archive\",\"Hide the session in the archived drawer, fully restorable, nothing removed from disk.\"]]",[10,3129,3130,3131,3133,3134,3136],{},"By default a standard session launches the moment it's created — ",[23,3132,1288],{}," defaults to on. Turn it off (project, workspace, or global scope) to have new sessions wait for you to click ",[40,3135,1279],{},". Root-tree sessions always launch on create.",[132,3138,3140],{"id":3139},"start-stop-resume","Start, stop, resume",[10,3142,3143,3144,3146,3147,3149,3150,3153,3154,91,3157,3160,3161,3164,3165,3168,3169,3172],{},"Select a session and click ",[40,3145,1279],{}," in the ",[14,3148,1275],{"href":75}," tab. A ",[40,3151,3152],{},"Starting…"," spinner shows the live stage — ",[154,3155,3156],{},"Creating worktree…",[154,3158,3159],{},"Running \u003Chook>…",", then ",[154,3162,3163],{},"Starting agent…"," — before the terminal takes over. Click ",[40,3166,3167],{},"Stop"," to end the agent; if Claude Code exits on its own (you run ",[23,3170,3171],{},"\u002Fexit",", or it crashes), the session drops to stopped automatically.",[10,3174,3175,3176,3179,3180,3183,3184,3187],{},"Click ",[40,3177,3178],{},"Resume"," to restart a stopped session. Plexus verifies the worktree still exists, re-runs your ",[23,3181,3182],{},"run"," hooks, and reattaches the ",[40,3185,3186],{},"same"," conversation — your prior transcript and context are intact.",[118,3189,3190],{},[10,3191,3192,3193,3196,3197,3199],{},"Sessions survive closing and reopening Plexus. Live agents don't, so on launch every previously running session is reconciled to ",[40,3194,3195],{},"stopped"," — but its pinned conversation id is kept, so the next ",[40,3198,3178],{}," reattaches exactly as if the app never closed.",[10,3201,3202,3203,3205],{},"The colored dot on each tree row tells you what needs you — working, waiting, or idle. See ",[14,3204,2073],{"href":394}," for the full breakdown.",[32,3207,3209],{"id":3208},"archive-vs-remove","Archive vs. remove",[10,3211,3212,3213,3215],{},"Plexus gives you two ways to retire a session, and they are not the same. Reach both from the per-row ",[23,3214,1074],{}," menu.",[557,3217,3218,3231],{},[560,3219,3220],{},[563,3221,3222,3225,3228],{},[566,3223,3224],{},"Action",[566,3226,3227],{},"What it does",[566,3229,3230],{},"Reversible?",[572,3232,3233,3250],{},[563,3234,3235,3241,3247],{},[577,3236,3237,3240],{},[40,3238,3239],{},"Archive"," (soft)",[577,3242,3243,3244,3246],{},"Hides the session in the ",[40,3245,1598],{}," drawer but keeps its worktree, branch, and transcript.",[577,3248,3249],{},"Yes — unarchive to restore it.",[563,3251,3252,3258,3261],{},[577,3253,3254,3257],{},[40,3255,3256],{},"Remove"," (hard)",[577,3259,3260],{},"Runs teardown hooks, removes the worktree and (optionally) its branch, and drops the session row.",[577,3262,3263],{},"No — it's permanent.",[10,3265,3266,3267,3270],{},"Removal is best-effort and idempotent: if a ",[14,3268,3269],{"href":430},"teardown hook"," fails, or the worktree or branch was already deleted out of band, removal still completes. Root-tree sessions have no separate worktree, so removing them skips worktree removal.",[10,3272,84,3273,3275,3276,3278,3279,3281],{},[40,3274,1598],{}," drawer — opened from the button at the bottom of the sidebar — lists archived sessions alongside archived projects, each with ",[40,3277,1602],{}," and permanent-delete actions. You can archive a whole ",[14,3280,1567],{"href":1993}," the same way you archive a session.",[132,3283,3285],{"id":3284},"teardown-mode","Teardown mode",[10,3287,84,3288,3291,3292,3295],{},[23,3289,3290],{},"teardownMode"," setting controls what ",[40,3293,3294],{},"Remove session…"," actually does:",[557,3297,3298,3308],{},[560,3299,3300],{},[563,3301,3302,3305],{},[566,3303,3304],{},"Value",[566,3306,3307],{},"Behavior",[572,3309,3310,3320,3329],{},[563,3311,3312,3317],{},[577,3313,3314],{},[23,3315,3316],{},"delete",[577,3318,3319],{},"Hard-delete immediately (the default).",[563,3321,3322,3326],{},[577,3323,3324],{},[23,3325,1587],{},[577,3327,3328],{},"Archive instead of deleting.",[563,3330,3331,3336],{},[577,3332,3333],{},[23,3334,3335],{},"prompt",[577,3337,3338],{},"Ask each time whether to archive or delete.",[118,3340,3341],{"tone":120},[10,3342,3343,3344,3346,3347,3349,3350,3352,3353,229,3355,3357,3358,3360],{},"With the default ",[23,3345,3290],{}," of ",[23,3348,3316],{},", removing a session tears down its worktree ",[40,3351,2861],{}," deletes its branch (a checkbox in the confirmation, on by default). Switch to ",[23,3354,1587],{},[23,3356,3335],{}," in ",[14,3359,165],{"href":164}," if you want a safer default.",{"title":309,"searchDepth":310,"depth":310,"links":3362},[3363,3366,3369],{"id":3077,"depth":310,"text":3078,"children":3364},[3365],{"id":3105,"depth":316,"text":1255},{"id":3120,"depth":310,"text":3121,"children":3367},[3368],{"id":3139,"depth":316,"text":3140},{"id":3208,"depth":310,"text":3209,"children":3370},[3371],{"id":3284,"depth":316,"text":3285},"A session is one agent in its own git worktree on its own branch.","Bot",{},20,{"title":1265,"description":3372},"docs\u002Fsessions","pKYxLoXvqKOTG061ooLiJqBa_QxtN5fgXUV-C9Cf5Y4",{"id":3380,"title":3381,"body":3382,"description":3611,"extension":323,"group":324,"icon":1649,"meta":3612,"navTitle":395,"navigation":328,"order":3613,"path":394,"seo":3614,"stem":3615,"__hash__":3616},"docs\u002Fdocs\u002Fstatus.md","Status & notifications",{"type":7,"value":3383,"toc":3602},[3384,3387,3391,3394,3417,3430,3442,3450,3454,3457,3492,3495,3504,3508,3519,3523,3537,3541,3551,3564,3569,3573,3580,3586,3594],[10,3385,3386],{},"Every session row carries two indicators — an activity dot and a branch\u002FPR icon — so you can tell at a glance what the agent is doing and where its branch stands.",[32,3388,3390],{"id":3389},"the-activity-dot","The activity dot",[10,3392,3393],{},"A colored dot sits next to each session and tracks what the agent is doing right now:",[256,3395,3396,3401,3406,3412],{},[259,3397,3398,3400],{},[40,3399,1659],{}," — emerald, with a live pulse. The agent is mid-turn: thinking, running tools, editing files.",[259,3402,3403,3405],{},[40,3404,1665],{}," — amber. The turn finished, or the agent is paused on you — a question, a permission prompt, or a plan waiting for your approval. It's your turn.",[259,3407,3408,3411],{},[40,3409,3410],{},"Delegating"," — sky blue, with a gentle pulse. The turn finished and it's your turn, but the agent left subagents running in the background — work it kicked off with the Task tool and didn't wait for. The main agent is free for you to prompt while the delegated work continues.",[259,3413,3414,3416],{},[40,3415,1671],{}," — gray. The session is stopped, or running with nothing in flight.",[10,3418,3419,3420,3422,3423,3426,3427,3429],{},"The dot is driven by Claude Code's own lifecycle events, bridged back over a private loopback channel — so it follows what the agent is really doing rather than guessing. When a session starts, Plexus installs a small set of activity hooks into the session's working directory. The dot flips to ",[40,3421,2088],{}," the instant a turn ends, and also when the agent pauses for a plan approval or a multiple-choice question — so a session that needs you never sits there looking busy. When a turn ends with background subagents still running, it shows ",[40,3424,3425],{},"delegating"," instead, and settles back to ",[40,3428,2088],{}," once they finish.",[10,3431,3432,3433,3435,3436,3438,3439,3441],{},"Only the session's own agent moves its dot. Opening another ",[23,3434,751],{}," in the same folder — in the built-in terminal, an outside shell, or one the agent spawns itself — won't repaint a working session's status. And the dot self-heals: if it reads idle while the agent is demonstrably paused on a plan or question, Plexus flips it to ",[40,3437,2088],{}," within a couple of seconds; if it reads idle mid-task, it flips back to ",[40,3440,2084],{}," as soon as the agent's transcript shows fresh activity.",[118,3443,3444],{},[10,3445,3446,3447,3449],{},"The indicator stays accurate across the whole ",[14,3448,1640],{"href":1329},", so you can watch several sessions at once and see exactly which one wants attention without opening each one.",[32,3451,3453],{"id":3452},"the-branch-pr-icon","The branch \u002F PR icon",[10,3455,3456],{},"A second icon shows the git state of the session's branch, color-coded by pull request status:",[557,3458,3459,3469],{},[560,3460,3461],{},[563,3462,3463,3466],{},[566,3464,3465],{},"Color",[566,3467,3468],{},"Meaning",[572,3470,3471,3478,3485],{},[563,3472,3473,3475],{},[577,3474,1692],{},[577,3476,3477],{},"Branch only — no open PR (or the PR was closed without merging).",[563,3479,3480,3482],{},[577,3481,1698],{},[577,3483,3484],{},"An open pull request exists for this branch.",[563,3486,3487,3489],{},[577,3488,1704],{},[577,3490,3491],{},"The pull request has been merged.",[10,3493,3494],{},"Hover the icon for details, including the aggregate CI status (pending \u002F passing \u002F failing) for the PR's head commit. When the icon is green or purple, click it to open the pull request in your browser.",[10,3496,3497,3498,3500,3501,3503],{},"Plexus refreshes PR status automatically — when you focus the window, on a periodic poll, and whenever the agent finishes a turn — so the color stays current as a review progresses. See ",[14,3499,204],{"href":203}," for creating and managing PRs, and ",[14,3502,765],{"href":764}," to connect GitHub or Bitbucket.",[32,3505,3507],{"id":3506},"getting-notified","Getting notified",[10,3509,3510,3511,3513,3514,3516,3517,18],{},"When a session moves to ",[40,3512,2088],{},", Plexus can alert you even if its window is minimized or you're focused on another session. A move to ",[40,3515,3425],{}," stays quiet — the agent only handed work to background subagents, so you're not being asked for anything yet; the alert waits for the real finish, when those subagents drain and the dot settles to ",[40,3518,2088],{},[132,3520,3522],{"id":3521},"desktop-notifications","Desktop notifications",[10,3524,3525,3526,3529,3530,3533,3534,3536],{},"A native OS notification names the session and what it needs. Controlled by ",[23,3527,3528],{},"notifications.desktop",", which is ",[40,3531,3532],{},"on"," by default. On Linux, pop-ups use ",[23,3535,687],{}," when available — install it if notifications don't appear.",[132,3538,3540],{"id":3539},"sound","Sound",[10,3542,3543,3544,3529,3547,3550],{},"An optional brief two-note chime plays when a session needs input. It's synthesized in memory — no audio files. Controlled by ",[23,3545,3546],{},"notifications.sound",[40,3548,3549],{},"off"," by default; a preview button lets you play the chime and confirm your audio works.",[10,3552,3553,3554,3557,3558,3560,3561,18],{},"Prefer your own sound? Set a ",[40,3555,3556],{},"custom sound"," under global Settings → Notifications. Plexus copies the file you pick into its own data folder, so it stays on your machine and keeps working even if you move or delete the original — and the ",[23,3559,3546],{}," toggle still decides whether it plays. See the ",[14,3562,3563],{"href":164},"Settings reference",[10,3565,3566,3567,18],{},"Both settings are session-scoped, so you can tune which sessions are allowed to interrupt you. Toggle them in the Settings notifications section — see the ",[14,3568,3563],{"href":164},[32,3570,3572],{"id":3571},"resetting-a-stuck-activity-dot","Resetting a stuck activity dot",[10,3574,3575,3576,3579],{},"Because the dot follows Claude Code's hooks, it can occasionally stick on the wrong state. The usual cause is pressing ",[23,3577,3578],{},"Esc"," to interrupt a turn — Claude Code fires no hook for that, so the dot keeps its previous value.",[10,3581,3582,3583,3585],{},"To clear it, open the session's ",[40,3584,1074],{}," menu and choose to reset its status. The dot flips to idle (gray) immediately. This only changes the visual indicator — it doesn't touch Claude's actual session or conversation.",[10,3587,3588,3589,229,3591,3593],{},"A reset on a genuinely stuck dot sticks. If you reset a session whose agent is actually still busy, the self-healing described above kicks in: the dot returns to ",[40,3590,2084],{},[40,3592,2088],{}," once the agent's activity proves the reset was premature — so a mistaken reset can't hide a live agent.",[118,3595,3596],{"tone":120},[10,3597,3598,3599,3601],{},"If the dot stops updating entirely rather than sticking on one value, the activity hooks may need repair. From the same ",[40,3600,1074],{}," menu, reinstall the hooks — the operation is idempotent and safe to repeat.",{"title":309,"searchDepth":310,"depth":310,"links":3603},[3604,3605,3606,3610],{"id":3389,"depth":310,"text":3390},{"id":3452,"depth":310,"text":3453},{"id":3506,"depth":310,"text":3507,"children":3607},[3608,3609],{"id":3521,"depth":316,"text":3522},{"id":3539,"depth":316,"text":3540},{"id":3571,"depth":310,"text":3572},"Activity dots, PR colors, and alerts when a session needs you.",{},21,{"title":3381,"description":3611},"docs\u002Fstatus","fl5FnydGEvasmKd_4QWlihK5UDWp9jjsBiq-pZuCdaw",{"id":3618,"title":3619,"body":3620,"description":3825,"extension":323,"group":324,"icon":3826,"meta":3827,"navTitle":1275,"navigation":328,"order":3828,"path":75,"seo":3829,"stem":3830,"__hash__":3831},"docs\u002Fdocs\u002Fagent.md","The Agent tab",{"type":7,"value":3621,"toc":3817},[3622,3625,3631,3635,3638,3641,3673,3680,3684,3691,3694,3697,3746,3750,3764,3768,3774,3778,3789,3797,3799],[10,3623,3624],{},"The Agent tab is the wrapped Claude Code terminal at the heart of every session — type prompts, watch the agent work, and drive its interactive UI in real time.",[10,3626,3627,3628,3630],{},"It's the default view when you open a session (",[23,3629,1915],{},"). It runs the Claude Code CLI inside the session's worktree and streams its output live, exactly as the agent produces it. Switch away and come back — the terminal stays warm and rehydrates with its full scrollback intact.",[32,3632,3634],{"id":3633},"sending-prompts","Sending prompts",[10,3636,3637],{},"Click the terminal to focus it, then type as you would in any terminal. Claude Code's own slash commands and interactive prompts work as normal.",[217,3639],{":rows":3640},"[[\"Enter\",\"Submit the current prompt to Claude Code\"],[\"⇧Enter\",\"Insert a newline instead of submitting — for multi-line prompts\"],[\"⌘C\",\"Copy the selected text to the clipboard\"],[\"⌘V\",\"Paste the clipboard (text or an image) into the prompt\"],[\"⌃C\",\"Interrupt the agent (Ctrl+C when no text is selected)\"]]",[118,3642,3643],{},[10,3644,3645,3647,3648,3651,3652,3655,3656,3658,3659,109,3662,3665,3666,3668,3669,3672],{},[23,3646,29],{}," means Cmd on macOS and Ctrl on Windows and Linux. ",[23,3649,3650],{},"⌘C"," copies the selection and ",[23,3653,3654],{},"⌘V"," pastes. On Windows and Linux those are the ",[40,3657,3186],{}," ",[23,3660,3661],{},"Ctrl+C",[23,3663,3664],{},"Ctrl+V",": ",[23,3667,3661],{}," copies only when text is selected and otherwise interrupts the agent, so ",[23,3670,3671],{},"⌃C"," still interrupts whenever nothing is selected.",[10,3674,3675,3676,3679],{},"Pasting when the clipboard holds an ",[40,3677,3678],{},"image"," — a screenshot, or an image copied from another app — drops it straight into the prompt as an attachment, so you can ask Claude Code about it without saving a file first.",[32,3681,3683],{"id":3682},"rich-input","Rich input",[10,3685,3686,3687,3690],{},"For longer prompts, open the rich input — a dedicated multi-line compose box at the bottom of the tab. Toggle it with ",[23,3688,3689],{},"⌘I",". While it's focused it keeps the keyboard, so the terminal won't steal your keystrokes; focus returns to the terminal after you submit or close the box.",[10,3692,3693],{},"Need more room? Drag the divider between the terminal and the compose box to resize it — the terminal reflows to fit, and the height you pick is remembered across sessions and restarts.",[10,3695,3696],{},"Two settings tune it:",[557,3698,3699,3710],{},[560,3700,3701],{},[563,3702,3703,3706,3708],{},[566,3704,3705],{},"Setting",[566,3707,1058],{},[566,3709,3227],{},[572,3711,3712,3724],{},[563,3713,3714,3719,3721],{},[577,3715,3716],{},[23,3717,3718],{},"richInput.openByDefault",[577,3720,3549],{},[577,3722,3723],{},"Show the compose box automatically instead of starting collapsed",[563,3725,3726,3731,3733],{},[577,3727,3728],{},[23,3729,3730],{},"richInput.autoSend",[577,3732,3549],{},[577,3734,3735,3736,3738,3739,3742,3743,3745],{},"When off, ",[23,3737,144],{}," pastes the composed text into the terminal so you can review before pressing ",[23,3740,3741],{},"Enter","; when on, ",[23,3744,144],{}," sends it immediately",[32,3747,3749],{"id":3748},"rewind","Rewind",[10,3751,3752,3753,3756,3757,3759,3760,3763],{},"When ",[23,3754,3755],{},"agent.rewindControl"," is on (the default), a ",[40,3758,3749],{}," control appears on the tab. It opens Claude Code's ",[23,3761,3762],{},"\u002Frewind"," checkpoint picker, letting you roll the conversation — and the file edits made since a checkpoint — back to an earlier point. Turn the setting off to hide the button.",[32,3765,3767],{"id":3766},"dragging-files-in","Dragging files in",[10,3769,3770,3771,3773],{},"Drag a file or folder from your OS file manager and drop it anywhere on the terminal. Plexus inserts the item's absolute path at the cursor, quoted only when the path needs it. No newline is added, so you can drag a file in mid-sentence to reference it before pressing ",[23,3772,3741],{},". A highlight ring marks the terminal under the cursor while you drag.",[32,3775,3777],{"id":3776},"permissions","Permissions",[10,3779,3780,3781,3784,3785,3788],{},"By default ",[23,3782,3783],{},"agent.skipPermissions"," is on, which launches Claude Code with ",[23,3786,3787],{},"--dangerously-skip-permissions",". The agent then runs autonomously — ideal for parallel, hands-off sessions.",[118,3790,3791],{"tone":120},[10,3792,3793,3794,3796],{},"Turn ",[23,3795,3783],{}," off (globally, or per workspace or project) if you'd rather have the agent stop and ask before sensitive actions. Because it decides how the agent launches, it's resolved at session start.",[32,3798,283],{"id":282},[256,3800,3801,3807,3812],{},[259,3802,3803,3806],{},[14,3804,3805],{"href":1907},"The terminal"," — the bottom panel's plain scratch shells, separate from the wrapped agent",[259,3808,3809,3811],{},[14,3810,242],{"href":241}," — the full, customizable shortcut list",[259,3813,3814,3816],{},[14,3815,165],{"href":164}," — every Agent-tab setting and its default",{"title":309,"searchDepth":310,"depth":310,"links":3818},[3819,3820,3821,3822,3823,3824],{"id":3633,"depth":310,"text":3634},{"id":3682,"depth":310,"text":3683},{"id":3748,"depth":310,"text":3749},{"id":3766,"depth":310,"text":3767},{"id":3776,"depth":310,"text":3777},{"id":282,"depth":310,"text":283},"Talk to Claude Code in the wrapped agent terminal.","Sparkles",{},22,{"title":3619,"description":3825},"docs\u002Fagent","O_gKLlfdVyeG_W3Iv9nb909MyaKLo7WqxBhxKiK8Ats",{"id":3833,"title":3834,"body":3835,"description":4117,"extension":323,"group":324,"icon":4118,"meta":4119,"navTitle":421,"navigation":328,"order":4120,"path":420,"seo":4121,"stem":4122,"__hash__":4123},"docs\u002Fdocs\u002Fexplorer.md","Explorer & editor",{"type":7,"value":3836,"toc":4109},[3837,3846,3849,3855,3859,3866,3877,3887,3891,3899,3910,3915,3920,3923,3930,3976,3982,3986,4002,4045,4048,4052,4089,4092,4096,4099],[10,3838,3839,3840,1289,3843,3845],{},"The Explorer tab is a file browser and code editor scoped to the session's git worktree. Switch to it with ",[23,3841,3842],{},"⌘3",[23,3844,29],{}," is Cmd on macOS, Ctrl on Windows and Linux.",[10,3847,3848],{},"The tab splits into two resizable panes: a file tree on the left and a Monaco editor on the right.",[10,3850,3851],{},[54,3852],{"alt":3853,"src":3854},"The Explorer tab: the worktree file tree on the left, the Monaco editor with an open file on the right.","\u002Fdocs\u002Fexplorer.png",[32,3856,3858],{"id":3857},"browse-the-file-tree","Browse the file tree",[10,3860,3861,3862,3865],{},"The left pane lists everything in the session's worktree. Folders appear first, then files in case-insensitive alphabetical order, and the ",[23,3863,3864],{},".git"," folder is hidden.",[256,3867,3868,3871,3874],{},[259,3869,3870],{},"Click a folder row to expand it. Contents load lazily on first expand — you'll see a brief spinner — then stay cached so re-expanding is instant.",[259,3872,3873],{},"The cache refreshes quietly in the background after agent turns and git operations, so the tree keeps up with the changes the agent makes without a manual refresh.",[259,3875,3876],{},"Click a file to open it in the editor; its worktree-relative path shows in the editor toolbar.",[10,3878,3879,3880,3882,3883,3886],{},"The tree is read-only: there are no New File or Delete actions. New files come from saving to a path in the editor (the parent folder must already exist); deletion is done from a ",[14,3881,1908],{"href":1907}," or your usual tools. If no session is started yet, the tree shows ",[40,3884,3885],{},"No worktree yet"," — start the session to populate it.",[32,3888,3890],{"id":3889},"edit-and-save-files","Edit and save files",[10,3892,3893,3894,3898],{},"Open a file and type to edit it. Syntax highlighting is automatic, detected from the filename and extension — the editor covers around 90 languages (see ",[14,3895,3897],{"href":3896},"#supported-languages","Supported languages"," below).",[10,3900,3901,3902,3905,3906,3909],{},"When you have unsaved changes, a small amber dot appears next to the file path in the toolbar. Save with ",[23,3903,3904],{},"⌘S"," or the ",[40,3907,3908],{},"Save"," button. If a read or save fails, a red error bar explains why.",[118,3911,3912],{"tone":120},[10,3913,3914],{},"Unsaved edits live only in memory. If you switch files or close the app without saving, the changes are lost — there is no auto-save.",[10,3916,3917,3918,18],{},"If you click another file while the current one has unsaved changes, a confirmation dialog asks whether to discard them — cancel to keep editing. The editor's colors follow the app's light\u002Fdark theme and update the moment you change it in ",[14,3919,165],{"href":164},[32,3921,3897],{"id":3922},"supported-languages",[10,3924,3925,3926,3929],{},"Highlighting comes from the Monaco engine the editor is built on, which bundles around 90 languages. Plexus picks the right one automatically from the filename and extension — files like ",[23,3927,3928],{},"Dockerfile"," are matched by name, no extension needed — so you never set a language by hand.",[557,3931,3932,3942],{},[560,3933,3934],{},[563,3935,3936,3939],{},[566,3937,3938],{},"Category",[566,3940,3941],{},"Languages",[572,3943,3944,3952,3960,3968],{},[563,3945,3946,3949],{},[577,3947,3948],{},"Web & markup",[577,3950,3951],{},"HTML, CSS, SCSS, Less, JavaScript, TypeScript, Vue, JSON, GraphQL, XML, Markdown, Pug, Handlebars",[563,3953,3954,3957],{},[577,3955,3956],{},"Systems & compiled",[577,3958,3959],{},"C, C++, C#, Rust, Go, Swift, Objective-C, WGSL",[563,3961,3962,3965],{},[577,3963,3964],{},"JVM & scripting",[577,3966,3967],{},"Java, Kotlin, Scala, Python, Ruby, PHP, Perl, Lua, R, Dart, Elixir, Clojure, F#, Julia",[563,3969,3970,3973],{},[577,3971,3972],{},"Shell, data & config",[577,3974,3975],{},"Shell \u002F Bash, PowerShell, Batch, Dockerfile, YAML, TOML, INI, HCL, Protobuf, SQL (MySQL, PostgreSQL, Redshift)",[10,3977,3978,3979,3981],{},"The table covers the common ones; the full set is whatever Monaco ships. A file Monaco doesn't recognize opens as plain text — still fully editable, just without coloring. The ",[14,3980,296],{"href":295}," tab highlights a focused subset of these in its diffs.",[32,3983,3985],{"id":3984},"preview-markdown","Preview Markdown",[10,3987,3988,3989,91,3992,91,3995,91,3998,4001],{},"Open a Markdown file (",[23,3990,3991],{},".md",[23,3993,3994],{},".markdown",[23,3996,3997],{},".mdown",[23,3999,4000],{},".mkd",") and three view buttons appear above the editor:",[557,4003,4004,4013],{},[560,4005,4006],{},[563,4007,4008,4011],{},[566,4009,4010],{},"View",[566,4012,2028],{},[572,4014,4015,4025,4035],{},[563,4016,4017,4022],{},[577,4018,4019],{},[40,4020,4021],{},"Source",[577,4023,4024],{},"The raw Markdown",[563,4026,4027,4032],{},[577,4028,4029],{},[40,4030,4031],{},"Preview",[577,4033,4034],{},"The rendered HTML",[563,4036,4037,4042],{},[577,4038,4039],{},[40,4040,4041],{},"Split",[577,4043,4044],{},"Source on the left, live preview on the right",[10,4046,4047],{},"In Split view the preview reflects your unsaved edits as you type, so you see the rendered result before saving. Relative links and images resolve against the worktree, and external links open in your browser. The view resets to Source when you open a different file.",[32,4049,4051],{"id":4050},"limits-and-unsupported-files","Limits and unsupported files",[557,4053,4054,4064],{},[560,4055,4056],{},[563,4057,4058,4061],{},[566,4059,4060],{},"Situation",[566,4062,4063],{},"What you see",[572,4065,4066,4078],{},[563,4067,4068,4071],{},[577,4069,4070],{},"File larger than 1 MB",[577,4072,4073,4074,4077],{},"A ",[40,4075,4076],{},"File too large"," notice with the byte size, instead of the editor",[563,4079,4080,4083],{},[577,4081,4082],{},"Binary file (contains null bytes)",[577,4084,4073,4085,4088],{},[40,4086,4087],{},"Binary file"," notice — it can't be shown or edited",[10,4090,4091],{},"These limits keep the editor responsive and apply to the Markdown preview as well.",[32,4093,4095],{"id":4094},"layout","Layout",[10,4097,4098],{},"Drag the divider between the tree and the editor to resize the panes, and the divider between editor and preview in Split view. Pane sizes are remembered between visits.",[118,4100,4101],{},[10,4102,4103,4104,4106,4107,18],{},"The Explorer is for browsing and quick edits. To direct the agent doing the work, use the ",[14,4105,76],{"href":75},"; to review and stage the resulting changes, use the ",[14,4108,412],{"href":330},{"title":309,"searchDepth":310,"depth":310,"links":4110},[4111,4112,4113,4114,4115,4116],{"id":3857,"depth":310,"text":3858},{"id":3889,"depth":310,"text":3890},{"id":3922,"depth":310,"text":3897},{"id":3984,"depth":310,"text":3985},{"id":4050,"depth":310,"text":4051},{"id":4094,"depth":310,"text":4095},"Browse the worktree and edit files in the built-in editor.","FileText",{},23,{"title":3834,"description":4117},"docs\u002Fexplorer","KW9anD1UjH3yigPvs9UnnLcaB46nir3MMnDXEc20tgk",{"id":4125,"title":4126,"body":4127,"description":4678,"extension":323,"group":324,"icon":4679,"meta":4680,"navTitle":296,"navigation":328,"order":4681,"path":295,"seo":4682,"stem":4683,"__hash__":4684},"docs\u002Fdocs\u002Freview.md","Review & diffs",{"type":7,"value":4128,"toc":4663},[4129,4132,4136,4155,4158,4164,4168,4209,4212,4216,4225,4230,4232,4235,4455,4461,4465,4490,4496,4508,4512,4521,4525,4531,4535,4546,4551,4560,4573,4577,4583,4611,4624,4628,4631,4640,4642],[10,4130,4131],{},"The Review tab is a PR-style diff of a session's worktree against its base branch, where you leave inline comments the agent acts on.",[32,4133,4135],{"id":4134},"the-diff-view","The diff view",[10,4137,4138,4139,4142,4143,4146,4147,4150,4151,4154],{},"The header shows the base ref and totals — ",[23,4140,4141],{},"15 changed files vs. origin\u002Fmain"," with a green ",[23,4144,4145],{},"+234"," \u002F red ",[23,4148,4149],{},"-56"," count across the whole diff. When the base branch has an upstream, Plexus compares against the remote-tracking ref (",[23,4152,4153],{},"origin\u002F\u003Cbase>",") so the view mirrors a pull request; a purely-local base compares against the local ref.",[10,4156,4157],{},"The tab is a resizable split: a file list on the left, the selected file's diff on the right. Drag the divider to set your width — it's remembered between sessions.",[10,4159,4160],{},[54,4161],{"alt":4162,"src":4163},"The Review tab: the list of changed files on the left, a unified diff of the selected file on the right.","\u002Fdocs\u002Freview.png",[132,4165,4167],{"id":4166},"file-list","File list",[10,4169,4170,4171,4174,4175,4178,4179,4182,4183,4186,4187,4190,4191,2632,4194,4197,4198,4200,4201,4204,4205,4208],{},"Each row shows the change type (",[23,4172,4173],{},"A"," added, ",[23,4176,4177],{},"M"," modified, ",[23,4180,4181],{},"D"," deleted, ",[23,4184,4185],{},"R"," renamed, ",[23,4188,4189],{},"C"," copied), the path, its ",[23,4192,4193],{},"+",[23,4195,4196],{},"-"," line counts, and a badge for any open comments. Untracked files appear marked ",[23,4199,4173],{}," so you can review new files alongside tracked ones. Toggle the sidebar header between a flat ",[40,4202,4203],{},"list"," (with dimmed directory paths) and a directory ",[40,4206,4207],{},"tree"," — switching is instant and keeps your selection.",[10,4210,4211],{},"Click a file to load its diff.",[132,4213,4215],{"id":4214},"hunks","Hunks",[10,4217,4218,4219,4222,4223,18],{},"Each file renders as unified-diff hunks — a ",[23,4220,4221],{},"@@"," header, old- and new-side line numbers, and context, added (green), and deleted (red) lines. Lines are syntax-highlighted and upgrade from plain text to colored tokens once the grammar loads, so the view never blocks — see ",[14,4224,3897],{"href":3896},[118,4226,4227],{},[10,4228,4229],{},"Binary files and files over the size limits (512 KB or 5000 changed lines) show a placeholder instead of a preview. They still appear in the list with their stats.",[32,4231,3897],{"id":3922},[10,4233,4234],{},"The diff view highlights the file types below. Anything else — including a grammar that hasn't finished loading yet — stays readable as plain text.",[557,4236,4237,4247],{},[560,4238,4239],{},[563,4240,4241,4244],{},[566,4242,4243],{},"Language",[566,4245,4246],{},"File types",[572,4248,4249,4261,4271,4281,4291,4301,4311,4324,4337,4346,4356,4366,4376,4389,4399,4409,4422,4432,4442],{},[563,4250,4251,4253],{},[577,4252,4189],{},[577,4254,4255,91,4258],{},[23,4256,4257],{},".c",[23,4259,4260],{},".h",[563,4262,4263,4266],{},[577,4264,4265],{},"C++",[577,4267,4268],{},[23,4269,4270],{},".cpp",[563,4272,4273,4276],{},[577,4274,4275],{},"CSS",[577,4277,4278],{},[23,4279,4280],{},".css",[563,4282,4283,4286],{},[577,4284,4285],{},"Go",[577,4287,4288],{},[23,4289,4290],{},".go",[563,4292,4293,4296],{},[577,4294,4295],{},"HTML",[577,4297,4298],{},[23,4299,4300],{},".html",[563,4302,4303,4306],{},[577,4304,4305],{},"Java",[577,4307,4308],{},[23,4309,4310],{},".java",[563,4312,4313,4316],{},[577,4314,4315],{},"JavaScript",[577,4317,4318,91,4321],{},[23,4319,4320],{},".js",[23,4322,4323],{},".jsx",[563,4325,4326,4329],{},[577,4327,4328],{},"JSON",[577,4330,4331,91,4334],{},[23,4332,4333],{},".json",[23,4335,4336],{},".jsonc",[563,4338,4339,4342],{},[577,4340,4341],{},"Markdown",[577,4343,4344],{},[23,4345,3991],{},[563,4347,4348,4351],{},[577,4349,4350],{},"Python",[577,4352,4353],{},[23,4354,4355],{},".py",[563,4357,4358,4361],{},[577,4359,4360],{},"Rust",[577,4362,4363],{},[23,4364,4365],{},".rs",[563,4367,4368,4371],{},[577,4369,4370],{},"SCSS",[577,4372,4373],{},[23,4374,4375],{},".scss",[563,4377,4378,4381],{},[577,4379,4380],{},"Shell",[577,4382,4383,91,4386],{},[23,4384,4385],{},".sh",[23,4387,4388],{},".bash",[563,4390,4391,4394],{},[577,4392,4393],{},"SQL",[577,4395,4396],{},[23,4397,4398],{},".sql",[563,4400,4401,4404],{},[577,4402,4403],{},"TOML",[577,4405,4406],{},[23,4407,4408],{},".toml",[563,4410,4411,4414],{},[577,4412,4413],{},"TypeScript",[577,4415,4416,91,4419],{},[23,4417,4418],{},".ts",[23,4420,4421],{},".tsx",[563,4423,4424,4427],{},[577,4425,4426],{},"Vue",[577,4428,4429],{},[23,4430,4431],{},".vue",[563,4433,4434,4437],{},[577,4435,4436],{},"XML",[577,4438,4439],{},[23,4440,4441],{},".xml",[563,4443,4444,4447],{},[577,4445,4446],{},"YAML",[577,4448,4449,91,4452],{},[23,4450,4451],{},".yaml",[23,4453,4454],{},".yml",[10,4456,4457,4458,4460],{},"The editor in the ",[14,4459,421],{"href":420}," tab recognizes many more languages; the diff view focuses on this set.",[32,4462,4464],{"id":4463},"inline-comments","Inline comments",[10,4466,4467,4468,4471,4472,4475,4476,4479,4480,91,4483,98,4486,4489],{},"Hover a diff line and click the comment button to open the composer, type your note, and click ",[40,4469,4470],{},"Add",". Comments anchor to a specific line on the old or new side (GitHub convention) and appear in a thread below it. Each shows its author — ",[40,4473,4474],{},"User"," for ones you wrote, or ",[40,4477,4478],{},"Plexus Review Agent"," for AI-inserted ones — plus ",[40,4481,4482],{},"Edit",[40,4484,4485],{},"Resolve",[40,4487,4488],{},"Delete"," actions. Resolving strikes the comment through and drops it from the file's badge count.",[10,4491,4492],{},[54,4493],{"alt":4494,"src":4495},"The inline comment composer open on a diff line, with a note typed and the Cancel and Add buttons below.","\u002Fdocs\u002Freview-comment.png",[10,4497,4498,4499,4502,4503,1046,4505,4507],{},"Comments are advisory context: if the agent edits a file, line numbers can drift, but your comments stay editable. If an edit removes a file from the diff entirely, its comments become orphaned — a banner at the top lists them by ",[23,4500,4501],{},"file:line"," with ",[40,4504,4485],{},[40,4506,4488],{}," buttons so you can tidy up.",[32,4509,4511],{"id":4510},"send-comments-to-the-agent","Send comments to the agent",[10,4513,4514,4515,4518,4519,548],{},"With unresolved comments open, the header shows a ",[40,4516,4517],{},"Send N comments to agent"," button. Clicking it formats every open comment into one prompt and writes it to the running agent, where Claude reads it as input on its next turn and iterates. The session must be running with a live agent — if it's stopped, start it first (see ",[14,4520,1275],{"href":75},[32,4522,4524],{"id":4523},"ai-review","AI review",[10,4526,3175,4527,4530],{},[40,4528,4529],{},"Run AI review"," to hand the diff to a headless Claude instance that reviews it for bugs, security issues, and risky changes, then posts inline comments as the Plexus Review Agent. A spinner shows while it runs (seconds to a minute); when it finishes, a banner reports how many comments were added. Treat them like your own — edit, resolve, or send them to the interactive agent.",[132,4532,4534],{"id":4533},"customize-the-review-prompt","Customize the review prompt",[10,4536,4537,4538,4541,4542,4545],{},"The brief the reviewer follows is fully yours. The ",[23,4539,4540],{},"git.review.prompt"," setting ",[154,4543,4544],{},"is"," the review instruction — it decides what the model looks for and how to weigh it. The default reads:",[10,4547,4548],{},[154,4549,4550],{},"You are a senior engineer reviewing this pull request diff. Flag correctness bugs, security issues, and risky changes as concise, actionable inline comments. Do not rewrite the code.",[10,4552,4553,4554,4557,4558,548],{},"Replace it with whatever fits: focus on your project's conventions, ignore a class of issue, enforce a style guide, or even ask for the comments in another language. Set it once globally for every repository, or override it per ",[14,4555,4556],{"href":371},"workspace or project"," so each codebase gets its own reviewer (see ",[14,4559,165],{"href":164},[118,4561,4562],{},[10,4563,4564,4565,4568,4569,4572],{},"You never have to spell out a response format. Plexus wraps your prompt with the diff — every line tagged with its file, side, and line number — and a strict output contract, then turns the model's reply into comments anchored to the exact lines. Your prompt decides ",[154,4566,4567],{},"what"," gets reviewed; Plexus guarantees ",[154,4570,4571],{},"how"," the results come back, so a custom prompt can't misplace or break comments. If a reply ever comes back malformed, it retries once automatically.",[32,4574,4576],{"id":4575},"review-and-fix-cycle","Review-and-fix cycle",[10,4578,84,4579,4582],{},[40,4580,4581],{},"Review and fix cycle"," automates the whole loop unattended: it runs an AI review, spawns a separate headless agent to apply the fixes, waits for it to finish, then re-reviews — repeating until the review finds no issues or it hits the round limit.",[256,4584,4585,4591,4602],{},[259,4586,4587,4590],{},[40,4588,4589],{},"Consent (once per repository)."," The first run for a repository opens a dialog explaining that the cycle runs an unattended, non-sandboxed agent that can edit files without approval. Confirm to proceed; each repository is treated independently.",[259,4592,4593,4596,4597,229,4599,18],{},[40,4594,4595],{},"Activity warning."," If the interactive agent still looks mid-turn, a dialog warns the two agents could conflict in the same worktree. The signal is best-effort, so you can ",[40,4598,1169],{},[40,4600,4601],{},"Start anyway",[259,4603,4604,4607,4608,4610],{},[40,4605,4606],{},"Status strip."," While the cycle runs, a strip below the file list shows the current round and phase (reviewing or fixing), then the terminal result. A ",[40,4609,3167],{}," button halts it gracefully at any time.",[118,4612,4613],{"tone":120},[10,4614,4615,4616,4619,4620,4623],{},"The cycle stops after ",[23,4617,4618],{},"reviewCycle.maxRounds"," rounds (default ",[23,4621,4622],{},"10","). It requires a session worktree and refuses to run on root-tree sessions, so it never edits your project's real checkout.",[32,4625,4627],{"id":4626},"refreshing-the-diff","Refreshing the diff",[10,4629,4630],{},"Returning to a session renders the Review tab instantly from cache while it revalidates in the background, so edits that landed while you were away heal automatically. The cache also invalidates when an agent turn finishes or you run a git operation, keeping the diff in sync without any action from you.",[10,4632,3175,4633,4635,4636,4639],{},[40,4634,2787],{}," to force a guaranteed-fresh fetch from disk. If the base branch has an upstream, Refresh also runs a ",[23,4637,4638],{},"git fetch"," to pull the latest remote base before comparing.",[32,4641,283],{"id":282},[256,4643,4644,4649,4654],{},[259,4645,4646,4648],{},[14,4647,902],{"href":330}," — stage, commit, and run git operations on the worktree.",[259,4650,4651,4653],{},[14,4652,204],{"href":203}," — open and manage GitHub PRs from a session.",[259,4655,4656,1289,4658,91,4660,4662],{},[14,4657,165],{"href":164},[23,4659,4540],{},[23,4661,4618],{},", and more.",{"title":309,"searchDepth":310,"depth":310,"links":4664},[4665,4669,4670,4671,4672,4675,4676,4677],{"id":4134,"depth":310,"text":4135,"children":4666},[4667,4668],{"id":4166,"depth":316,"text":4167},{"id":4214,"depth":316,"text":4215},{"id":3922,"depth":310,"text":3897},{"id":4463,"depth":310,"text":4464},{"id":4510,"depth":310,"text":4511},{"id":4523,"depth":310,"text":4524,"children":4673},[4674],{"id":4533,"depth":316,"text":4534},{"id":4575,"depth":310,"text":4576},{"id":4626,"depth":310,"text":4627},{"id":282,"depth":310,"text":283},"See exactly what an agent changed and iterate via inline comments.","GitPullRequestArrow",{},24,{"title":4126,"description":4678},"docs\u002Freview","5muhGvObv2NTRyt3lo9fPTFV46-oOR_xu_pjhljYoWU",{"id":4,"title":5,"body":4686,"description":322,"extension":323,"group":324,"icon":325,"meta":4867,"navTitle":327,"navigation":328,"order":329,"path":330,"seo":4868,"stem":332,"__hash__":333},{"type":7,"value":4687,"toc":4856},[4688,4692,4698,4700,4706,4708,4712,4722,4724,4736,4744,4752,4754,4760,4770,4772,4780,4792,4794,4798,4800,4808,4814,4816,4820,4834,4836,4838],[10,4689,12,4690,18],{},[14,4691,17],{"href":16},[10,4693,21,4694,26,4696,30],{},[23,4695,25],{},[23,4697,29],{},[32,4699,35],{"id":34},[10,4701,38,4702,43,4704,47],{},[40,4703,42],{},[40,4705,46],{},[10,4707,50],{},[10,4709,4710],{},[54,4711],{"alt":56,"src":57},[10,4713,60,4714,64,4716,68,4718,72,4720,77],{},[40,4715,63],{},[23,4717,67],{},[23,4719,71],{},[14,4721,76],{"href":75},[32,4723,81],{"id":80},[10,4725,84,4726,87,4728,91,4730,91,4732,98,4734,102],{},[40,4727,81],{},[40,4729,90],{},[40,4731,94],{},[40,4733,97],{},[40,4735,101],{},[10,4737,105,4738,109,4740,113,4742,116],{},[40,4739,108],{},[40,4741,112],{},[40,4743,108],{},[118,4745,4746],{"tone":120},[10,4747,123,4748,127,4750,130],{},[23,4749,126],{},[14,4751,76],{"href":75},[132,4753,135],{"id":134},[10,4755,138,4756,141,4758,145],{},[40,4757,135],{},[23,4759,144],{},[10,4761,148,4762,152,4764,157,4766,161,4768,18],{},[40,4763,151],{},[154,4765,156],{},[23,4767,160],{},[14,4769,165],{"href":164},[132,4771,169],{"id":168},[10,4773,4774,175,4776,178,4778,182],{},[40,4775,174],{},[40,4777,101],{},[40,4779,181],{},[10,4781,4782,188,4784,192,4786,196,4788,200,4790,18],{},[40,4783,187],{},[23,4785,191],{},[23,4787,195],{},[23,4789,199],{},[14,4791,204],{"href":203},[32,4793,208],{"id":207},[10,4795,211,4796,215],{},[40,4797,214],{},[217,4799],{":rows":219},[10,4801,222,4802,229,4806,233],{},[154,4803,225,4804],{},[23,4805,228],{},[154,4807,232],{},[118,4809,4810],{},[10,4811,238,4812,243],{},[14,4813,242],{"href":241},[132,4815,247],{"id":246},[10,4817,250,4818,254],{},[40,4819,253],{},[256,4821,4822,4826,4830],{},[259,4823,4824,264],{},[40,4825,263],{},[259,4827,4828,270],{},[40,4829,269],{},[259,4831,4832,276],{},[40,4833,275],{},[10,4835,279],{},[32,4837,283],{"id":282},[256,4839,4840,4844,4848,4852],{},[259,4841,4842,290],{},[14,4843,17],{"href":16},[259,4845,4846,297],{},[14,4847,296],{"href":295},[259,4849,4850,302],{},[14,4851,204],{"href":203},[259,4853,4854,307],{},[14,4855,242],{"href":241},{"title":309,"searchDepth":310,"depth":310,"links":4857},[4858,4859,4863,4866],{"id":34,"depth":310,"text":35},{"id":80,"depth":310,"text":81,"children":4860},[4861,4862],{"id":134,"depth":316,"text":135},{"id":168,"depth":316,"text":169},{"id":207,"depth":310,"text":208,"children":4864},[4865],{"id":246,"depth":316,"text":247},{"id":282,"depth":310,"text":283},{},{"title":5,"description":322},{"id":4870,"title":204,"body":4871,"description":5055,"extension":323,"group":324,"icon":5056,"meta":5057,"navTitle":204,"navigation":328,"order":5058,"path":203,"seo":5059,"stem":5060,"__hash__":5061},"docs\u002Fdocs\u002Fpull-requests.md",{"type":7,"value":4872,"toc":5046},[4873,4876,4885,4889,4899,4902,4906,4923,4929,4933,4940,4944,4951,4955,4958,4992,4999,5007,5011,5018,5041],[10,4874,4875],{},"Open a pull request straight from a session's branch and watch its status — open, merged, or closed, plus CI — without leaving Plexus.",[118,4877,4878],{},[10,4879,4880,4881,1712,4883,18],{},"GitHub and Bitbucket are both supported. Connect either one from ",[40,4882,922],{},[14,4884,765],{"href":764},[32,4886,4888],{"id":4887},"before-you-start","Before you start",[10,4890,4891,4892,923,4894,4896,4897,18],{},"PR features need a connected git provider. Open ",[40,4893,922],{},[40,4895,926],{}," for GitHub or Bitbucket — a one-click sign-in, no CLI required. Plexus stores the resulting token in your OS keychain and talks to the provider directly from your machine; the token is never sent to us. See ",[14,4898,765],{"href":764},[10,4900,4901],{},"A session also has to be on a named feature branch with at least one commit beyond its base. Sessions on the project's main branch can't open a PR.",[32,4903,4905],{"id":4904},"create-a-pull-request","Create a pull request",[1104,4907,4908,4916,4919],{},[259,4909,4910,4911,3111,4913,18],{},"On the session row, open the ",[40,4912,1074],{},[40,4914,4915],{},"Create PR",[259,4917,4918],{},"Fill in the title, an optional description, and an optional base branch.",[259,4920,3175,4921,18],{},[40,4922,3093],{},[10,4924,4925,4926,4928],{},"Plexus pushes the branch to ",[23,4927,191],{},", opens the PR on your provider (GitHub or Bitbucket), and the session's branch icon turns green.",[132,4930,4932],{"id":4931},"a-dirty-worktree","A dirty worktree",[10,4934,4935,4936,4939],{},"If the worktree has uncommitted changes when you create a PR, Plexus doesn't fail — it shows a commit-then-PR dialog. Enter a commit message (or accept the default ",[23,4937,4938],{},"WIP on \u003Cbranch>","), and Plexus commits, pushes, and opens the PR in one flow.",[132,4941,4943],{"id":4942},"auto-generate-the-title-and-description","Auto-generate the title and description",[10,4945,4946,4947,4950],{},"Turn on ",[23,4948,4949],{},"git.pr.autoGenerateDescription"," (default off) to have the agent draft the PR title and description from the diff when the dialog opens. It spends an AI turn, and you can still edit the draft before submitting.",[32,4952,4954],{"id":4953},"track-pr-status","Track PR status",[10,4956,4957],{},"Once a PR exists, the branch icon next to the session reflects its state at a glance:",[557,4959,4960,4969],{},[560,4961,4962],{},[563,4963,4964,4967],{},[566,4965,4966],{},"Icon color",[566,4968,3468],{},[572,4970,4971,4978,4985],{},[563,4972,4973,4975],{},[577,4974,1692],{},[577,4976,4977],{},"No PR (or the PR was closed without merging)",[563,4979,4980,4982],{},[577,4981,1698],{},[577,4983,4984],{},"PR is open",[563,4986,4987,4989],{},[577,4988,1704],{},[577,4990,4991],{},"PR is merged",[10,4993,4994,4995,4998],{},"Hover the icon for details, including the aggregate ",[40,4996,4997],{},"CI status"," (pending, passing, or failing) from the provider's checks (GitHub check runs \u002F Bitbucket pipelines). Click a green or purple icon to open the PR in your browser.",[10,5000,5001,5002,5004,5005,18],{},"Status is polled automatically — when you focus the window, on a periodic refresh, and when the agent finishes a turn. You can also refresh on demand from the session ",[40,5003,1074],{}," menu. CI status updates alongside the PR, so a very fast pipeline may briefly show \"pending\" until the next refresh. For how the branch and activity indicators relate, see ",[14,5006,1334],{"href":394},[32,5008,5010],{"id":5009},"after-the-pr-is-created","After the PR is created",[10,5012,5013,5014,5017],{},"Two optional behaviors keep ",[14,5015,5016],{"href":1264},"sessions"," tidy as PRs progress:",[256,5019,5020,5029],{},[259,5021,5022,1289,5025,5028],{},[40,5023,5024],{},"Auto-rename from PR title",[23,5026,5027],{},"session.autoRenameOnPr"," (default on) keeps the session name in sync with the PR title. The underlying git branch keeps its original name.",[259,5030,5031,1289,5034,5037,5038,5040],{},[40,5032,5033],{},"Auto-teardown on merge",[23,5035,5036],{},"git.teardownOnMerge"," (default off) tears the session down when Plexus detects its PR has merged. It honors your ",[23,5039,3290],{}," setting, so it archives or deletes per your configuration.",[10,5042,5043,5044,18],{},"Configure all of these in ",[14,5045,165],{"href":164},{"title":309,"searchDepth":310,"depth":310,"links":5047},[5048,5049,5053,5054],{"id":4887,"depth":310,"text":4888},{"id":4904,"depth":310,"text":4905,"children":5050},[5051,5052],{"id":4931,"depth":316,"text":4932},{"id":4942,"depth":316,"text":4943},{"id":4953,"depth":310,"text":4954},{"id":5009,"depth":310,"text":5010},"Open GitHub and Bitbucket pull requests and track their status from Plexus.","Github",{},26,{"title":204,"description":5055},"docs\u002Fpull-requests","3Zh5sRvHLBCCMOBec5ongJTKFVJHDNCe8gEO3UCOcDg",{"id":5063,"title":5064,"body":5065,"description":5321,"extension":323,"group":324,"icon":5322,"meta":5323,"navTitle":5064,"navigation":328,"order":5324,"path":1907,"seo":5325,"stem":5326,"__hash__":5327},"docs\u002Fdocs\u002Fterminal.md","Terminal",{"type":7,"value":5066,"toc":5313},[5067,5072,5076,5081,5084,5096,5100,5103,5118,5124,5131,5134,5138,5157,5184,5188,5195,5264,5289,5293,5300,5303,5307],[10,5068,5069,5070,18],{},"Every session gets a bottom panel of plain shells rooted in its worktree — separate from the wrapped agent on the ",[14,5071,76],{"href":75},[32,5073,5075],{"id":5074},"open-and-close-the-panel","Open and close the panel",[10,5077,21,5078,5080],{},[23,5079,1922],{}," from any tab to show or hide the bottom terminal panel. The first shell spawns automatically the moment the panel opens, as long as the session has a worktree.",[10,5082,5083],{},"Collapsing the panel hides the terminals but keeps their processes alive — a long-running build or watch keeps going while the panel is closed, and reopening re-attaches you to the full scrollback.",[118,5085,5086],{},[10,5087,5088,5090,5091,5093,5094,18],{},[23,5089,29],{}," means Cmd on macOS and Ctrl on Windows\u002FLinux. Rebind the toggle under Keybindings in ",[14,5092,165],{"href":164},"; see ",[14,5095,242],{"href":241},[32,5097,5099],{"id":5098},"run-multiple-shells","Run multiple shells",[10,5101,5102],{},"The panel is a tab strip, so you can keep several shells open at once:",[256,5104,5105,5110,5113],{},[259,5106,3175,5107,5109],{},[23,5108,4193],{}," to add a new terminal tab.",[259,5111,5112],{},"Click a tab's name to rename it inline.",[259,5114,148,5115,5117],{},[23,5116,2327],{}," on a tab to close that shell.",[10,5119,5120],{},[54,5121],{"alt":5122,"src":5123},"The terminal panel's tab strip with two shells open, the plus button to add another, and a close button on each tab.","\u002Fdocs\u002Fterminal.png",[10,5125,5126,5127,5130],{},"Each tab is an independent login shell with its own scrollback, started in the session's worktree directory. Use them to check ",[23,5128,5129],{},"git status",", run tests, tail logs, or poke at the codebase while the agent works on the Agent tab.",[10,5132,5133],{},"These shells belong to the session, not the agent. Stopping or tearing down a session kills its scratch shells; switching to another session leaves them running so nothing in flight is interrupted.",[32,5135,5137],{"id":5136},"copy-and-paste","Copy and paste",[10,5139,5140,5141,5143,5144,5146,5147,5150,5151,5153,5154,5156],{},"Select text with the mouse and copy it with ",[23,5142,3650],{},", then paste with ",[23,5145,3654],{},". This works in the scratch shells and in the wrapped ",[14,5148,5149],{"href":75},"agent terminal",". In the agent terminal, ",[23,5152,3654],{}," also pastes an ",[40,5155,3678],{}," from the clipboard — a screenshot, say — straight into the prompt as an attachment.",[118,5158,5159],{},[10,5160,5161,5162,5164,5165,5167,5168,5171,5172,5175,5176,109,5178,5180,5181,5183],{},"On Windows and Linux ",[23,5163,3650],{}," is ",[23,5166,3661],{},": it copies ",[40,5169,5170],{},"only when text is selected"," and otherwise sends the interrupt (",[23,5173,5174],{},"SIGINT",") to whatever is running — so one key keeps both behaviors. On macOS, ",[23,5177,3650],{},[23,5179,3654],{}," copy and paste while ",[23,5182,3661],{}," always interrupts.",[32,5185,5187],{"id":5186},"choose-which-shell-to-run","Choose which shell to run",[10,5189,5190,5191,5194],{},"The shell Plexus spawns is controlled by ",[23,5192,5193],{},"terminal.shell",", a global setting that applies to your machine rather than per scope. The options depend on your platform:",[557,5196,5197,5205],{},[560,5198,5199],{},[563,5200,5201,5203],{},[566,5202,3304],{},[566,5204,3307],{},[572,5206,5207,5226,5251],{},[563,5208,5209,5215],{},[577,5210,5211,5214],{},[23,5212,5213],{},"auto"," (default)",[577,5216,5217,5218,5221,5222,5225],{},"Uses ",[23,5219,5220],{},"$SHELL"," on macOS\u002FLinux, or ",[23,5223,5224],{},"cmd.exe"," on Windows",[563,5227,5228,5231],{},[577,5229,5230],{},"Platform shells",[577,5232,5233,5234,91,5236,91,5239,5242,5243,91,5245,91,5248],{},"macOS\u002FLinux: ",[23,5235,668],{},[23,5237,5238],{},"zsh",[23,5240,5241],{},"sh",". Windows: ",[23,5244,5224],{},[23,5246,5247],{},"powershell.exe",[23,5249,5250],{},"pwsh.exe",[563,5252,5253,5258],{},[577,5254,5255],{},[23,5256,5257],{},"custom",[577,5259,5260,5261],{},"Runs the executable you point at with ",[23,5262,5263],{},"terminal.shellPath",[10,5265,5266,5267,5270,5271,5273,5274,5276,5277,5279,5280,229,5283,5286,5287,18],{},"To use a shell that isn't listed — ",[23,5268,5269],{},"fish",", say, or Git Bash on Windows — set ",[23,5272,5193],{}," to ",[23,5275,5257],{}," and put the full path in ",[23,5278,5263],{},", such as ",[23,5281,5282],{},"\u002Fusr\u002Fbin\u002Ffish",[23,5284,5285],{},"C:\\Program Files\\Git\\bin\\bash.exe",". Both keys live under Terminal in ",[14,5288,165],{"href":164},[32,5290,5292],{"id":5291},"drag-files-in-from-your-os","Drag files in from your OS",[10,5294,5295,5296,5299],{},"Drag a file or folder from your file manager (Finder, Explorer, Nautilus, and the like) and drop it onto any terminal. Plexus inserts the absolute path at the cursor, shell-quoted only when it needs to be — a plain name stays bare, while a path with spaces or special characters is single-quoted. No newline is added, so you can build up a command (for example ",[23,5297,5298],{},"cat "," then drop a file) before pressing Enter. A highlight ring shows which terminal will receive the drop.",[10,5301,5302],{},"This works on the agent terminal too, not just scratch shells.",[32,5304,5306],{"id":5305},"theme","Theme",[10,5308,5309,5310,5312],{},"Open terminals follow the app theme. Switch between light and dark mode in ",[14,5311,165],{"href":164}," and every shell re-colors in place — no reload, no lost scrollback.",{"title":309,"searchDepth":310,"depth":310,"links":5314},[5315,5316,5317,5318,5319,5320],{"id":5074,"depth":310,"text":5075},{"id":5098,"depth":310,"text":5099},{"id":5136,"depth":310,"text":5137},{"id":5186,"depth":310,"text":5187},{"id":5291,"depth":310,"text":5292},{"id":5305,"depth":310,"text":5306},"A free shell in the worktree, open from any tab.","MonitorDot",{},27,{"title":5064,"description":5321},"docs\u002Fterminal","R92pEwgNEWfYzQ9T-9PGP7KESxwkC65iYne-XpaMUZA",{"id":5329,"title":5330,"body":5331,"description":5697,"extension":323,"group":5698,"icon":5699,"meta":5700,"navTitle":431,"navigation":328,"order":5701,"path":430,"seo":5702,"stem":5703,"__hash__":5704},"docs\u002Fdocs\u002Fhooks.md","Lifecycle hooks",{"type":7,"value":5332,"toc":5687},[5333,5336,5340,5351,5406,5421,5425,5428,5446,5453,5457,5464,5517,5524,5528,5535,5557,5568,5574,5578,5610,5614,5629,5637,5648,5652,5661,5663],[10,5334,5335],{},"Hooks are your own shell scripts that Plexus runs at key moments in a session's life, so every new worktree starts ready to work.",[32,5337,5339],{"id":5338},"the-three-events","The three events",[10,5341,5342,5343,5346,5347,5350],{},"A hook is attached to one lifecycle event. Each hook has a name and a multi-line command, run through ",[23,5344,5345],{},"sh -c"," on macOS and Linux or ",[23,5348,5349],{},"cmd.exe \u002FC"," on Windows — write it as a small script, not just a single line.",[557,5352,5353,5366],{},[560,5354,5355],{},[563,5356,5357,5360,5363],{},[566,5358,5359],{},"Event",[566,5361,5362],{},"When it fires",[566,5364,5365],{},"Typical use",[572,5367,5368,5380,5393],{},[563,5369,5370,5374,5377],{},[577,5371,5372],{},[40,5373,3093],{},[577,5375,5376],{},"A new session worktree is created",[577,5378,5379],{},"Install dependencies, scaffold local config, warm caches",[563,5381,5382,5387,5390],{},[577,5383,5384],{},[40,5385,5386],{},"Run",[577,5388,5389],{},"The agent starts or resumes",[577,5391,5392],{},"Start a dev server, tail a log, kick off a watcher",[563,5394,5395,5400,5403],{},[577,5396,5397],{},[40,5398,5399],{},"Teardown",[577,5401,5402],{},"A session is torn down",[577,5404,5405],{},"Stop background processes, clean up scratch resources",[118,5407,5408],{"tone":120},[10,5409,5410,5411,5413,5414,91,5417,5420],{},"Hooks run on your machine with your permissions, your full ",[23,5412,738],{},", and your toolchain. Only enable repo-committed hooks from repos you trust. Plexus strips Anthropic credentials (",[23,5415,5416],{},"ANTHROPIC_API_KEY",[23,5418,5419],{},"ANTHROPIC_AUTH_TOKEN",") from a hook's environment, but everything else is reachable.",[32,5422,5424],{"id":5423},"where-hooks-are-defined","Where hooks are defined",[10,5426,5427],{},"Hooks live at three levels, and lower levels inherit from higher ones:",[256,5429,5430,5436,5441],{},[259,5431,5432,5435],{},[40,5433,5434],{},"Global"," — apply to every workspace, project, and session.",[259,5437,5438,5440],{},[40,5439,1502],{}," — apply to every project in that workspace.",[259,5442,5443,5445],{},[40,5444,352],{}," — apply to every session in that project.",[10,5447,5448,5449,5452],{},"Sessions never define their own hooks; they always inherit the composed plan from their project. To change what a session runs, edit its project-level hooks. Open ",[40,5450,5451],{},"Settings → Hooks",", pick a scope, then pick the Create \u002F Run \u002F Teardown event tab to edit that combination.",[32,5454,5456],{"id":5455},"composition-modes","Composition modes",[10,5458,5459,5460,5463],{},"A non-global level doesn't just add its hooks to the inherited ones — it declares a ",[40,5461,5462],{},"combine mode"," that says how its hooks join what it inherits.",[557,5465,5466,5475],{},[560,5467,5468],{},[563,5469,5470,5472],{},[566,5471,2139],{},[566,5473,5474],{},"Effect",[572,5476,5477,5487,5497,5507],{},[563,5478,5479,5484],{},[577,5480,5481],{},[40,5482,5483],{},"Override",[577,5485,5486],{},"Discard all inherited hooks; only this level's hooks run (the managed built-in still runs — see below).",[563,5488,5489,5494],{},[577,5490,5491],{},[40,5492,5493],{},"Before",[577,5495,5496],{},"Run this level's hooks ahead of the inherited ones.",[563,5498,5499,5504],{},[577,5500,5501,5214],{},[40,5502,5503],{},"After",[577,5505,5506],{},"Run this level's hooks behind the inherited ones.",[563,5508,5509,5514],{},[577,5510,5511],{},[40,5512,5513],{},"Parallel",[577,5515,5516],{},"Run this level's hooks concurrently, alongside the rest.",[10,5518,5519,5520,5523],{},"Set the mode from the ",[40,5521,5522],{},"Combine mode"," dropdown on each event tab at the workspace or project scope.",[32,5525,5527],{"id":5526},"resolution-and-execution-order","Resolution and execution order",[10,5529,5530,5531,5534],{},"Plexus resolves the plan top-down — ",[40,5532,5533],{},"global → workspace → project"," — applying each level's combine mode. The resulting plan then runs in four phases, always in this order:",[1104,5536,5537,5542,5547,5552],{},[259,5538,5539,5541],{},[40,5540,5493],{}," — sequential. A non-zero exit can abort the launch (see below).",[259,5543,5544,5546],{},[40,5545,3224],{}," — the event's managed built-in (for Create, the copy-paths step).",[259,5548,5549,5551],{},[40,5550,5513],{}," — concurrent, best-effort. A failure here never aborts.",[259,5553,5554,5556],{},[40,5555,5503],{}," — sequential, and always runs.",[10,5558,5559,5560,5563,5564,5567],{},"Within the ",[40,5561,5562],{},"Hooks defined here"," list, use the up\u002Fdown controls to set the order of your own hooks at that level. The live ",[40,5565,5566],{},"Resolved plan"," preview shows the final four-phase plan exactly as it will run — every hook, its source badge (Global \u002F Workspace \u002F Project \u002F Built-in \u002F From repo), and whether it's enabled. This is the fastest way to confirm inheritance did what you expect. Toggle any hook off without deleting it; disabled hooks stay in the list and appear dimmed in the preview.",[10,5569,5570],{},[54,5571],{"alt":5572,"src":5573},"The Hooks settings panel: the Create \u002F Run \u002F Teardown event tabs, the global Hooks defined here list with reorder, toggle, edit, and delete controls, the New hook form, and the live Resolved plan preview showing the Before and Action phases.","\u002Fdocs\u002Fhooks.png",[32,5575,5577],{"id":5576},"the-managed-copy-paths-built-in","The managed copy-paths built-in",[10,5579,5580,5581,5583,5584,5586,5587,5589,5590,5593,5594,1046,5597,5600,5601,91,5603,5606,5607,5609],{},"On the ",[40,5582,3093],{}," event, Plexus runs a managed built-in that copies configured files into the new worktree — this is how gitignored files like ",[23,5585,1425],{}," reach the session. It lives in the ",[40,5588,3224],{}," phase and is ",[40,5591,5592],{},"immune to Override",": even a project that overrides every inherited hook still gets the copy-paths step. Configure it with ",[23,5595,5596],{},"worktree.copyEnabled",[23,5598,5599],{},"worktree.copyPaths"," (default ",[23,5602,1425],{},[23,5604,5605],{},".env.local",") — see ",[14,5608,1430],{"href":1429}," for the full path rules.",[32,5611,5613],{"id":5612},"repo-committed-hooks","Repo-committed hooks",[10,5615,5616,5617,5620,5621,5624,5625,5628],{},"A team can share hooks by committing them to the repo at ",[23,5618,5619],{},".plexus\u002Fhooks.json",". The file maps each event to an ordered array of ",[23,5622,5623],{},"{ name, command }"," entries; ",[23,5626,5627],{},"command"," may be multi-line and may call a repo script.",[526,5630,5635],{"className":5631,"code":5633,"language":5634,"meta":309},[5632],"language-json","{\n  \"create\": [\n    { \"name\": \"Install deps\", \"command\": \"pnpm install\" },\n    { \"name\": \"Setup\", \"command\": \"set -e\\nbash .plexus\u002Fhooks\u002Fsetup.sh\" }\n  ],\n  \"run\": [],\n  \"teardown\": []\n}\n","json",[23,5636,5633],{"__ignoreMap":309},[10,5638,5639,5640,5643,5644,5647],{},"When this manifest is present and ",[23,5641,5642],{},"hooks.repoScriptsEnabled"," (default on) is true, its hooks replace the app-managed project hooks — so cloning the repo is enough for a teammate to get the same setup. Plexus shows a \"Repo hooks active\" banner with a ",[40,5645,5646],{},"Run repo-committed hooks"," toggle on the Project scope; turn it off to fall back to the app-managed hooks without deleting the file. If the manifest fails to parse, the error is surfaced in the editor and Plexus falls back to the app-managed hooks rather than breaking the session.",[32,5649,5651],{"id":5650},"aborting-on-failure","Aborting on failure",[10,5653,5654,5657,5658,5660],{},[23,5655,5656],{},"hooks.abortOnFailure"," (default on) stops a session launch if a ",[40,5659,3093],{}," hook in the before or action phase exits non-zero — so you never get a half-set-up worktree. Run and teardown hooks never abort the lifecycle. Override the setting to make Create hooks non-blocking.",[32,5662,283],{"id":282},[256,5664,5665,5670,5675],{},[259,5666,5667,5669],{},[14,5668,1430],{"href":1429}," — the copy-paths built-in and environment-file rules.",[259,5671,5672,5674],{},[14,5673,1813],{"href":1812}," — how Plexus stores credentials in the OS keystore.",[259,5676,5677,5679,5680,1046,5683,5686],{},[14,5678,165],{"href":164}," — every ",[23,5681,5682],{},"hooks.*",[23,5684,5685],{},"worktree.*"," key and its default.",{"title":309,"searchDepth":310,"depth":310,"links":5688},[5689,5690,5691,5692,5693,5694,5695,5696],{"id":5338,"depth":310,"text":5339},{"id":5423,"depth":310,"text":5424},{"id":5455,"depth":310,"text":5456},{"id":5526,"depth":310,"text":5527},{"id":5576,"depth":310,"text":5577},{"id":5612,"depth":310,"text":5613},{"id":5650,"depth":310,"text":5651},{"id":282,"depth":310,"text":283},"Run your own scripts on session create, run, and teardown.","Automation","RefreshCw",{},30,{"title":5330,"description":5697},"docs\u002Fhooks","Eig9a1zJBTftCUdtiD09PAEKu5PUsFTbXFK2VS-VHJo",{"id":5706,"title":5707,"body":5708,"description":5948,"extension":323,"group":5698,"icon":5949,"meta":5950,"navTitle":5951,"navigation":328,"order":5952,"path":1429,"seo":5953,"stem":5954,"__hash__":5955},"docs\u002Fdocs\u002Fworktrees.md","Worktrees & env files",{"type":7,"value":5709,"toc":5937},[5710,5713,5717,5720,5726,5739,5743,5754,5758,5769,5774,5778,5781,5821,5829,5833,5851,5857,5868,5872,5875,5898,5912,5914],[10,5711,5712],{},"Every off-main session runs in its own git worktree, and Plexus copies the env files it needs in as the worktree is created.",[32,5714,5716],{"id":5715},"where-worktrees-live","Where worktrees live",[10,5718,5719],{},"When you start a session, Plexus cuts a git worktree from the base branch you picked. By default it lands at:",[526,5721,5724],{"className":5722,"code":5723,"language":531},[529],"\u003Cproject>\u002Fworktrees\u002F\u003Csession-name>\n",[23,5725,5723],{"__ignoreMap":309},[10,5727,5728,5729,5600,5732,5735,5736,5738],{},"The subfolder comes from ",[23,5730,5731],{},"worktree.location",[23,5733,5734],{},"worktrees","); the session name is slugified and appended automatically. The value is always a relative path under the project root — it can never escape it. Root-tree sessions don't get a worktree; they run directly in the project's root working tree. See ",[14,5737,360],{"href":1264}," for the full lifecycle.",[132,5740,5742],{"id":5741},"auto-gitignore","Auto-gitignore",[10,5744,5745,5746,5749,5750,5753],{},"When a worktree is created inside the repo, Plexus adds its parent folder to the repo's ",[23,5747,5748],{},".gitignore"," so worktree contents never surface as untracked changes. This is ",[23,5751,5752],{},"worktree.autoGitignore"," (default on). Leave it on unless you're managing the ignore entry yourself.",[32,5755,5757],{"id":5756},"why-env-files-need-copying","Why env files need copying",[10,5759,5760,5761,1046,5763,5765,5766,5768],{},"A fresh worktree is a clean checkout — it holds only tracked files. Anything gitignored, most importantly ",[23,5762,1425],{},[23,5764,5605],{},", is ",[40,5767,934],{}," carried over. A dev server or test runner that reads those files would break the moment the agent runs it inside the worktree.",[10,5770,5771,5772,18],{},"So as each worktree is created, Plexus copies the paths you configure into it — regardless of ",[23,5773,5748],{},[32,5775,5777],{"id":5776},"copying-paths-into-worktrees","Copying paths into worktrees",[10,5779,5780],{},"Two settings control the copy:",[557,5782,5783,5793],{},[560,5784,5785],{},[563,5786,5787,5789,5791],{},[566,5788,3705],{},[566,5790,1058],{},[566,5792,3227],{},[572,5794,5795,5806],{},[563,5796,5797,5801,5803],{},[577,5798,5799],{},[23,5800,5596],{},[577,5802,3532],{},[577,5804,5805],{},"Whether to copy any paths into a new worktree",[563,5807,5808,5812,5818],{},[577,5809,5810],{},[23,5811,5599],{},[577,5813,5814,91,5816],{},[23,5815,1425],{},[23,5817,5605],{},[577,5819,5820],{},"The files and folders to copy",[10,5822,5823,5824,1046,5826,5828],{},"Out of the box, ",[23,5825,1425],{},[23,5827,5605],{}," land in every new session worktree.",[132,5830,5832],{"id":5831},"adding-paths","Adding paths",[1104,5834,5835,5841,5848],{},[259,5836,5837,5838,5840],{},"Open ",[14,5839,165],{"href":164}," and go to the Worktrees category.",[259,5842,5843,5844,5847],{},"Make sure ",[40,5845,5846],{},"Copy files into new worktrees"," is on.",[259,5849,5850],{},"Add each file or folder you want copied to the paths list, using the add\u002Fremove controls.",[10,5852,5853],{},[54,5854],{"alt":5855,"src":5856},"The Worktrees settings panel: the worktree folder field, the auto-gitignore and copy-into-new-worktrees toggles, and the paths-to-copy list with .env, .env.local, vendor\u002F, and node_modules entries plus add and remove controls.","\u002Fdocs\u002Fworktrees.png",[10,5858,5859,5860,5863,5864,5867],{},"Paths are relative to the project root and copied as-is whether or not git tracks them; folders are copied recursively. Common additions are ",[23,5861,5862],{},".env.development",", a local ",[23,5865,5866],{},"config\u002F"," folder, or service-account credentials that live outside version control. Like any setting, these layer per scope — set a baseline globally and override it for one project.",[132,5869,5871],{"id":5870},"path-safety","Path safety",[10,5873,5874],{},"Plexus validates every copy path so a worktree can't be corrupted or used to escape the repo:",[256,5876,5877,5884,5889,5892],{},[259,5878,5879,5880,5883],{},"Absolute paths and ",[23,5881,5882],{},".."," traversal are rejected.",[259,5885,5886,5888],{},[23,5887,18],{}," and empty entries are rejected.",[259,5890,5891],{},"Symlinks are skipped — a top-level symlink copies nothing, and symlinks inside a copied folder are skipped — so the copy can't leak files from outside the repo.",[259,5893,5894,5895,5897],{},"Missing sources are silently skipped, so a path that doesn't exist in a given project won't fail the launch. A path that disappears mid-copy — e.g. a tool rewriting ",[23,5896,1425],{}," at that instant — is skipped the same way rather than failing the launch. A genuine error (an unreadable file, a full disk) still stops the launch, but the message names the exact path so you know what to fix.",[118,5899,5900],{"tone":120},[10,5901,5902,5903,5905,5906,5908,5909,18],{},"Plexus does ",[40,5904,934],{}," auto-assign or remap dev-server ports. If two sessions' dev servers bind the same port, that conflict is yours to resolve — read a port from the ",[23,5907,1425],{}," you copy in, or set one from a ",[14,5910,5911],{"href":430},"hook",[32,5913,283],{"id":282},[256,5915,5916,5921,5929],{},[259,5917,5918,5920],{},[14,5919,431],{"href":430}," — run your own scripts at create, run, and teardown; the copy-paths step is a built-in that runs during create.",[259,5922,5923,5925,5926,5928],{},[14,5924,1813],{"href":1812}," — keep API keys in your OS keystore instead of committing or copying them through ",[23,5927,1425],{}," files.",[259,5930,5931,5933,5934,5936],{},[14,5932,165],{"href":164}," — the full list of ",[23,5935,5685],{}," keys and their defaults.",{"title":309,"searchDepth":310,"depth":310,"links":5938},[5939,5942,5943,5947],{"id":5715,"depth":310,"text":5716,"children":5940},[5941],{"id":5741,"depth":316,"text":5742},{"id":5756,"depth":310,"text":5757},{"id":5776,"depth":310,"text":5777,"children":5944},[5945,5946],{"id":5831,"depth":316,"text":5832},{"id":5870,"depth":316,"text":5871},{"id":282,"depth":310,"text":283},"Where session worktrees live and how to get .env files into them.","FolderGit2",{},"Worktrees & env",31,{"title":5707,"description":5948},"docs\u002Fworktrees","PaE5VHhJ2-eePk4oPh2Ost2HVf4E3jeI5xlzePef2ZU",{"id":5957,"title":1813,"body":5958,"description":6089,"extension":323,"group":5698,"icon":6090,"meta":6091,"navTitle":1813,"navigation":328,"order":6092,"path":1812,"seo":6093,"stem":6094,"__hash__":6095},"docs\u002Fdocs\u002Fsecrets.md",{"type":7,"value":5959,"toc":6083},[5960,5963,5967,5970,6005,6009,6023,6026,6030,6041,6049,6058,6066,6068],[10,5961,5962],{},"Plexus keeps sensitive values out of plaintext config by storing them in your operating system's keystore.",[32,5964,5966],{"id":5965},"where-secrets-live","Where secrets live",[10,5968,5969],{},"Secrets are written to the native credential store for your platform — never to Plexus's own config, database, or logs.",[557,5971,5972,5982],{},[560,5973,5974],{},[563,5975,5976,5979],{},[566,5977,5978],{},"Platform",[566,5980,5981],{},"Backing store",[572,5983,5984,5991,5998],{},[563,5985,5986,5988],{},[577,5987,552],{},[577,5989,5990],{},"Keychain",[563,5992,5993,5995],{},[577,5994,696],{},[577,5996,5997],{},"Credential Manager",[563,5999,6000,6002],{},[577,6001,612],{},[577,6003,6004],{},"Secret Service (freedesktop keyring)",[32,6006,6008],{"id":6007},"write-only-by-design","Write-only by design",[10,6010,6011,6012,6015,6016,6019,6020,6022],{},"Secrets support three operations: ",[40,6013,6014],{},"set"," a value, ",[40,6017,6018],{},"check"," whether one exists, and ",[40,6021,3316],{}," it. There is deliberately no read-back. Once a secret is stored, the interface can only confirm that a value is present or absent — it can never display, copy, or return it.",[10,6024,6025],{},"This is a security boundary, not a missing feature. Values stay inside the backend and the OS keystore; they never cross into the UI. To change a stored secret, set it again with a new value. To retire one, delete it.",[32,6027,6029],{"id":6028},"how-hooks-use-secrets","How hooks use secrets",[10,6031,6032,6033,6035,6036,6038,6039,548],{},"Your ",[14,6034,1554],{"href":430}," run as shell commands, so they read whatever they need from their own environment and from the worktree — including environment files brought in by ",[23,6037,5599],{}," (see ",[14,6040,1265],{"href":1429},[10,6042,6043,6044,1046,6046,6048],{},"To protect your credentials, Plexus scrubs its own sensitive environment before spawning any hook child process. The Anthropic credentials Plexus uses to run Claude Code — ",[23,6045,5416],{},[23,6047,5419],{}," — are always stripped, even if a hook tries to set them itself. This is automatic and unconditional.",[10,6050,6051,6052,91,6054,6057],{},"Hooks otherwise inherit a normal environment (your ",[23,6053,738],{},[23,6055,6056],{},"HOME",", and toolchain), so they can run the tools they need without ever seeing your agent credentials.",[118,6059,6060],{"tone":120},[10,6061,6062,6063,6065],{},"Repo-committed hooks in ",[23,6064,5619],{}," run with the same shell access you have. Treat a project's hooks as code you are about to execute: review them before enabling repo hooks on a repository you don't trust.",[32,6067,283],{"id":282},[256,6069,6070,6075],{},[259,6071,6072,6074],{},[14,6073,431],{"href":430}," — what runs, when, and in what order",[259,6076,6077,6079,6080,6082],{},[14,6078,1265],{"href":1429}," — copy gitignored files like ",[23,6081,1425],{}," into each session",{"title":309,"searchDepth":310,"depth":310,"links":6084},[6085,6086,6087,6088],{"id":5965,"depth":310,"text":5966},{"id":6007,"depth":310,"text":6008},{"id":6028,"depth":310,"text":6029},{"id":282,"depth":310,"text":283},"Store secrets in your OS keychain for use by hooks.","KeyRound",{},32,{"title":1813,"description":6089},"docs\u002Fsecrets","c6OVgKhTeuP-VNEb5RXQqTgyWh-OuODrh7j4ZBD9DNo",{"id":6097,"title":6098,"body":6099,"description":6199,"extension":323,"group":6200,"icon":6201,"meta":6202,"navTitle":6203,"navigation":328,"order":6204,"path":764,"seo":6205,"stem":6206,"__hash__":6207},"docs\u002Fdocs\u002Fconnections.md","Connecting a git provider",{"type":7,"value":6100,"toc":6194},[6101,6111,6115,6122,6133,6137,6147,6163,6174,6178,6185],[10,6102,6103,6104,1046,6107,6110],{},"Plexus opens and tracks pull requests directly on ",[40,6105,6106],{},"GitHub",[40,6108,6109],{},"Bitbucket",". Connecting a provider is a one-click sign-in — no CLI to install, no personal access tokens to paste.",[32,6112,6114],{"id":6113},"connect-a-provider","Connect a provider",[10,6116,5837,6117,923,6119,6121],{},[40,6118,922],{},[40,6120,926],{}," next to GitHub or Bitbucket. Your browser opens the provider's normal authorization screen; approve it and you're returned to Plexus, connected. The status line shows the account you're signed in as.",[118,6123,6124],{},[10,6125,6126,6127,6130,6131,18],{},"Once a provider is connected you can also ",[40,6128,6129],{},"search your repositories and clone one"," straight into a new project — the same on-device token authenticates private clones. See ",[14,6132,1065],{"href":2246},[32,6134,6136],{"id":6135},"where-your-token-lives-what-leaves-your-device","Where your token lives — what leaves your device",[10,6138,6139,6140,6143,6144,6146],{},"Plexus uses a small ",[40,6141,6142],{},"managed sign-in service"," we run in the EU. When you connect, the provider hands back a short-lived authorization ",[40,6145,23],{},"; Plexus sends only that code to the service, which holds the OAuth app secret and exchanges it for your access token.",[118,6148,6149],{},[10,6150,6151,6154,6155,6158,6159,6162],{},[40,6152,6153],{},"The token is returned to your device and stored in your operating system's keychain — we don't keep it."," From then on, Plexus talks to GitHub or Bitbucket ",[40,6156,6157],{},"directly from your machine","; your repository names, code, and pull-request contents ",[40,6160,6161],{},"never pass through our servers",". Because the token lives locally, PR features keep working offline after you've signed in.",[10,6164,6165,6166,6169,6170,6173],{},"This is the managed ",[40,6167,6168],{},"connection"," service only — a broker, not a proxy. It is separate from the anonymous ",[14,6171,6172],{"href":164},"usage analytics"," Plexus collects, and neither one sends us Your Content.",[32,6175,6177],{"id":6176},"disconnect","Disconnect",[10,6179,3175,6180,3357,6182,6184],{},[40,6181,6177],{},[40,6183,922],{}," to remove the stored token from your keychain. You can reconnect any time.",[10,6186,6187,6188,6191,6192,18],{},"Next: ",[14,6189,6190],{"href":203},"open and track pull requests",". For how connections relate to what data leaves your device, see our ",[14,6193,517],{"href":516},{"title":309,"searchDepth":310,"depth":310,"links":6195},[6196,6197,6198],{"id":6113,"depth":310,"text":6114},{"id":6135,"depth":310,"text":6136},{"id":6176,"depth":310,"text":6177},"Connect GitHub or Bitbucket with one click so Plexus can open and track pull requests.","Integrations","PlugZap",{},"Git providers",40,{"title":6098,"description":6199},"docs\u002Fconnections","zJjmWAkt8d7OHoM5NaVUF1mJFCaLw9VucmPlavCotRo",{"id":6209,"title":165,"body":6210,"description":7184,"extension":323,"group":7185,"icon":165,"meta":7186,"navTitle":165,"navigation":328,"order":7187,"path":164,"seo":7188,"stem":7189,"__hash__":7190},"docs\u002Fdocs\u002Fsettings.md",{"type":7,"value":6211,"toc":7166},[6212,6215,6219,6222,6228,6239,6247,6260,6264,6298,6311,6315,6328,6342,6345,6347,6363,6366,6378,6381,6483,6486,6627,6630,6676,6707,6715,6718,6859,6872,6874,6955,6970,6972,7031,7034,7084,7087,7110,7141,7144],[10,6213,6214],{},"Plexus runs zero-config — every setting has a sensible default, so you only open Settings when you want to change one.",[32,6216,6218],{"id":6217},"layered-settings","Layered settings",[10,6220,6221],{},"Settings cascade through four layers, broadest to narrowest:",[526,6223,6226],{"className":6224,"code":6225,"language":531},[529],"Global  →  Workspace  →  Project  →  Session\n",[23,6227,6225],{"__ignoreMap":309},[10,6229,6230,6231,6234,6235,6238],{},"Each layer ",[40,6232,6233],{},"inherits"," from the one above until you ",[40,6236,6237],{},"override"," the value there — a more-specific layer always wins, and if no layer sets a value the built-in default applies. So you set a default once globally, override it for a single workspace, and override it again for one project inside that workspace.",[10,6240,6241,6242,91,6244,6246],{},"A session inherits its effective values from its owning project. Settings that govern how a session is created or started — ",[23,6243,1288],{},[23,6245,3783],{}," — are decided before the session exists, so they always resolve from the project layer, never the session itself.",[118,6248,6249],{},[10,6250,6251,6252,6255,6256,5093,6258,18],{},"Settings live inside Plexus (the Settings UI, backed by Plexus's own store). There is no ",[23,6253,6254],{},".plexus.toml"," file to edit. Repo-committed lifecycle hooks are the one exception — those live in ",[23,6257,5619],{},[14,6259,431],{"href":430},[32,6261,6263],{"id":6262},"the-settings-ui","The Settings UI",[10,6265,6266,6267,91,6270,91,6272,91,6275,91,6278,91,6280,91,6282,91,6284,91,6287,91,6290,6293,6294,1712,6296,18],{},"Open global Settings to edit defaults that apply everywhere. Rows are grouped into categories — ",[40,6268,6269],{},"General",[40,6271,1275],{},[40,6273,6274],{},"Notifications",[40,6276,6277],{},"Git & PRs",[40,6279,6203],{},[40,6281,431],{},[40,6283,1430],{},[40,6285,6286],{},"Performance",[40,6288,6289],{},"Privacy",[40,6291,6292],{},"Keybindings"," — so you can find a setting without scrolling a flat list. Connecting GitHub or Bitbucket lives under ",[40,6295,6203],{},[14,6297,765],{"href":764},[10,6299,6300,6301,91,6303,6306,6307,6310],{},"Every row shows a badge for where its current value comes from: ",[23,6302,1058],{},[23,6304,6305],{},"Inherited from"," a parent layer, or ",[23,6308,6309],{},"Set here",". When a row is set at the layer you're viewing, a reset button (↺) appears next to its control — click it to clear the override and fall back to the inherited or default value.",[132,6312,6314],{"id":6313},"overriding-at-a-workspace-or-project","Overriding at a workspace or project",[10,6316,6317,6318,6320,6321,6323,6324,6327],{},"Open a scope's settings from the ",[40,6319,165],{}," entry in its ",[23,6322,1074],{}," menu (or its dashboard node). At these scopes each category carries an ",[40,6325,6326],{},"Override parent settings"," toggle:",[256,6329,6330,6336],{},[259,6331,6332,6335],{},[40,6333,6334],{},"Off"," — every row is read-only and shows the value it inherits, and from where. This is the default, so a new workspace or project changes nothing.",[259,6337,6338,6341],{},[40,6339,6340],{},"On"," — the rows become editable; anything you change is an override applied to this scope and everything inside it.",[10,6343,6344],{},"Turning the toggle back off unsets every override in that category at this layer. Some settings are global-only — the terminal shell, the agent path, diagnostics, usage analytics, and all keybindings — and don't appear on workspace or project pages, because they describe the machine, not a scope.",[132,6346,5306],{"id":5305},[10,6348,6349,6350,91,6353,98,6356,6359,6360,6362],{},"Switch between ",[40,6351,6352],{},"light",[40,6354,6355],{},"dark",[40,6357,6358],{},"system"," from the title bar. The choice applies app-wide, including the ",[14,6361,421],{"href":420}," editor.",[32,6364,3563],{"id":6365},"settings-reference",[10,6367,6368,6371,6372,6374,6375,6377],{},[23,6369,6370],{},"Scope"," is the narrowest layer a key can be set at: ",[154,6373,352],{}," means global → workspace → project (sessions inherit from their project); ",[154,6376,5434],{}," means per-machine only.",[132,6379,6269],{"id":6380},"general",[557,6382,6383,6396],{},[560,6384,6385],{},[563,6386,6387,6390,6392,6394],{},[566,6388,6389],{},"Key",[566,6391,3227],{},[566,6393,1058],{},[566,6395,6370],{},[572,6397,6398,6423,6444,6462],{},[563,6399,6400,6404,6417,6421],{},[577,6401,6402],{},[23,6403,3290],{},[577,6405,6406,6407,6409,6410,91,6412,788,6414,6416],{},"What ",[40,6408,3294],{}," does: ",[23,6411,3316],{},[23,6413,1587],{},[23,6415,3335],{}," each time",[577,6418,6419],{},[23,6420,3316],{},[577,6422,352],{},[563,6424,6425,6429,6438,6442],{},[577,6426,6427],{},[23,6428,5193],{},[577,6430,6431,6432,6434,6435,6437],{},"Shell for the bottom terminal and in-app installers (",[23,6433,5213],{},", a named shell, or ",[23,6436,5257],{},")",[577,6439,6440],{},[23,6441,5213],{},[577,6443,5434],{},[563,6445,6446,6450,6457,6460],{},[577,6447,6448],{},[23,6449,5263],{},[577,6451,6452,6453,5164,6455],{},"Full path to the shell when ",[23,6454,5193],{},[23,6456,5257],{},[577,6458,6459],{},"empty",[577,6461,5434],{},[563,6463,6464,6469,6476,6481],{},[577,6465,6466],{},[23,6467,6468],{},"diagnostics.enabled",[577,6470,6471,6472,6475],{},"Write a timestamped ",[23,6473,6474],{},"plexus-diag.log"," for troubleshooting (applies live)",[577,6477,6478],{},[23,6479,6480],{},"false",[577,6482,5434],{},[132,6484,1275],{"id":6485},"agent",[557,6487,6488,6500],{},[560,6489,6490],{},[563,6491,6492,6494,6496,6498],{},[566,6493,6389],{},[566,6495,3227],{},[566,6497,1058],{},[566,6499,6370],{},[572,6501,6502,6521,6544,6560,6577,6592,6611],{},[563,6503,6504,6508,6514,6519],{},[577,6505,6506],{},[23,6507,3783],{},[577,6509,6510,6511,6513],{},"Launch Claude Code with ",[23,6512,3787],{}," so it runs autonomously",[577,6515,6516],{},[23,6517,6518],{},"true",[577,6520,352],{},[563,6522,6523,6527,6538,6542],{},[577,6524,6525],{},[23,6526,3755],{},[577,6528,6529,6530,6532,6533,6535,6536,6437],{},"Show the ",[40,6531,3749],{}," control on the ",[14,6534,1275],{"href":75}," tab (Claude Code's ",[23,6537,3762],{},[577,6539,6540],{},[23,6541,6518],{},[577,6543,352],{},[563,6545,6546,6550,6556,6558],{},[577,6547,6548],{},[23,6549,760],{},[577,6551,6552,6553,6555],{},"Full path to the ",[23,6554,751],{}," executable when it isn't on the GUI's PATH",[577,6557,6459],{},[577,6559,5434],{},[563,6561,6562,6566,6571,6575],{},[577,6563,6564],{},[23,6565,1288],{},[577,6567,6568,6569],{},"Auto-launch a brand-new session's agent instead of waiting for ",[40,6570,1279],{},[577,6572,6573],{},[23,6574,6518],{},[577,6576,352],{},[563,6578,6579,6583,6586,6590],{},[577,6580,6581],{},[23,6582,3718],{},[577,6584,6585],{},"Open the multi-line compose box automatically on a running session",[577,6587,6588],{},[23,6589,6480],{},[577,6591,352],{},[563,6593,6594,6598,6605,6609],{},[577,6595,6596],{},[23,6597,3730],{},[577,6599,6600,6601,6604],{},"Make ",[23,6602,6603],{},"Mod+Enter"," send the composed prompt instead of just pasting it",[577,6606,6607],{},[23,6608,6480],{},[577,6610,352],{},[563,6612,6613,6618,6621,6625],{},[577,6614,6615],{},[23,6616,6617],{},"summary.enabled",[577,6619,6620],{},"Show the AI session-summary sidebar (each refresh spends a turn)",[577,6622,6623],{},[23,6624,6480],{},[577,6626,352],{},[132,6628,6274],{"id":6629},"notifications",[557,6631,6632,6644],{},[560,6633,6634],{},[563,6635,6636,6638,6640,6642],{},[566,6637,6389],{},[566,6639,3227],{},[566,6641,1058],{},[566,6643,6370],{},[572,6645,6646,6661],{},[563,6647,6648,6652,6655,6659],{},[577,6649,6650],{},[23,6651,3528],{},[577,6653,6654],{},"Show a native desktop notification when a session needs you",[577,6656,6657],{},[23,6658,6518],{},[577,6660,1526],{},[563,6662,6663,6667,6670,6674],{},[577,6664,6665],{},[23,6666,3546],{},[577,6668,6669],{},"Play a chime when a session needs you (a preview button lets you test it)",[577,6671,6672],{},[23,6673,6480],{},[577,6675,1526],{},[10,6677,6678,6681,6682,688,6685,91,6688,91,6691,91,6694,91,6697,6700,6701,6703,6704,6706],{},[40,6679,6680],{},"Custom sound."," By default the chime is synthesized in-app, but you can replace it with your own audio file under global Settings → Notifications → ",[40,6683,6684],{},"Custom sound",[23,6686,6687],{},".wav",[23,6689,6690],{},".mp3",[23,6692,6693],{},".ogg",[23,6695,6696],{},".flac",[23,6698,6699],{},".m4a",", and more, up to 5 MB). Plexus copies the file you pick into its own data folder, so it stays on your machine and keeps working even if you move or delete the original; ",[40,6702,3256],{}," reverts to the built-in chime. This is a machine-wide choice (not per scope), and the per-session ",[23,6705,3546],{}," toggle still decides whether any sound plays.",[118,6708,6709],{},[10,6710,6711,6712,6714],{},"On Linux, desktop notifications use ",[23,6713,687],{}," — install it if alerts don't appear.",[132,6716,6277],{"id":6717},"git-prs",[557,6719,6720,6732],{},[560,6721,6722],{},[563,6723,6724,6726,6728,6730],{},[566,6725,6389],{},[566,6727,3227],{},[566,6729,1058],{},[566,6731,6370],{},[572,6733,6734,6749,6764,6781,6798,6815,6841],{},[563,6735,6736,6740,6743,6747],{},[577,6737,6738],{},[23,6739,4949],{},[577,6741,6742],{},"Draft the PR title and description from the diff via Claude",[577,6744,6745],{},[23,6746,6480],{},[577,6748,352],{},[563,6750,6751,6755,6758,6762],{},[577,6752,6753],{},[23,6754,5027],{},[577,6756,6757],{},"Keep a session's name in sync with its PR title (the branch keeps its slug)",[577,6759,6760],{},[23,6761,6518],{},[577,6763,352],{},[563,6765,6766,6770,6775,6779],{},[577,6767,6768],{},[23,6769,5036],{},[577,6771,6772,6773,6437],{},"Auto-tear-down a session when its PR is detected merged (honors ",[23,6774,3290],{},[577,6776,6777],{},[23,6778,6480],{},[577,6780,352],{},[563,6782,6783,6787,6793,6796],{},[577,6784,6785],{},[23,6786,4540],{},[577,6788,6789,6790,6792],{},"Instruction Claude follows when reviewing a diff on the ",[14,6791,296],{"href":295}," tab",[577,6794,6795],{},"senior-engineer prompt",[577,6797,352],{},[563,6799,6800,6804,6810,6813],{},[577,6801,6802],{},[23,6803,160],{},[577,6805,6806,6807,6809],{},"Instruction Claude follows when drafting a commit message (the session and ",[14,6808,1567],{"href":16}," Git tabs' AI button)",[577,6811,6812],{},"imperative-subject prompt",[577,6814,352],{},[563,6816,6817,6821,6835,6839],{},[577,6818,6819],{},[23,6820,2736],{},[577,6822,84,6823,6826,6827,91,6829,91,6831,788,6833],{},[14,6824,6825],{"href":16},"project Git client's"," default Pull action: ",[23,6828,2740],{},[23,6830,2743],{},[23,6832,2746],{},[23,6834,2462],{},[577,6836,6837],{},[23,6838,2743],{},[577,6840,352],{},[563,6842,6843,6847,6853,6857],{},[577,6844,6845],{},[23,6846,2544],{},[577,6848,6849,6850],{},"Fetch commit-author avatars from Gravatar in the ",[14,6851,6852],{"href":16},"project Git client",[577,6854,6855],{},[23,6856,6518],{},[577,6858,5434],{},[10,6860,6861,6863,6864,6866,6867,6869,6870,18],{},[23,6862,2736],{}," is also settable from the Pull button's own menu — its ",[40,6865,2732],{}," picker saves the choice for that project. ",[23,6868,2544],{}," is a per-machine privacy switch: when on, Plexus queries Gravatar with a one-way SHA-256 hash of each commit author's email (never the address itself) and caches the results on disk; turned off, no request is made at all and the graph shows locally-drawn initials instead. See the ",[14,6871,517],{"href":516},[132,6873,1430],{"id":5734},[557,6875,6876,6888],{},[560,6877,6878],{},[563,6879,6880,6882,6884,6886],{},[566,6881,6389],{},[566,6883,3227],{},[566,6885,1058],{},[566,6887,6370],{},[572,6889,6890,6905,6923,6938],{},[563,6891,6892,6896,6899,6903],{},[577,6893,6894],{},[23,6895,5731],{},[577,6897,6898],{},"Subfolder under the project root for new worktrees (session name appended)",[577,6900,6901],{},[23,6902,5734],{},[577,6904,352],{},[563,6906,6907,6911,6917,6921],{},[577,6908,6909],{},[23,6910,5752],{},[577,6912,6913,6914,6916],{},"Add the worktree parent to the repo's ",[23,6915,5748],{}," when it's inside the repo",[577,6918,6919],{},[23,6920,6518],{},[577,6922,352],{},[563,6924,6925,6929,6932,6936],{},[577,6926,6927],{},[23,6928,5596],{},[577,6930,6931],{},"Copy configured paths into each new worktree on create",[577,6933,6934],{},[23,6935,6518],{},[577,6937,352],{},[563,6939,6940,6944,6947,6953],{},[577,6941,6942],{},[23,6943,5599],{},[577,6945,6946],{},"Files\u002Ffolders (relative to the project root) to copy into a new worktree",[577,6948,6949,91,6951],{},[23,6950,1425],{},[23,6952,5605],{},[577,6954,352],{},[118,6956,6957],{},[10,6958,6959,6961,6962,6964,6965,6967,6968,18],{},[23,6960,5596],{}," + ",[23,6963,5599],{}," are how gitignored files like ",[23,6966,1425],{}," reach a fresh worktree. See ",[14,6969,3117],{"href":1429},[132,6971,431],{"id":1554},[557,6973,6974,6986],{},[560,6975,6976],{},[563,6977,6978,6980,6982,6984],{},[566,6979,6389],{},[566,6981,3227],{},[566,6983,1058],{},[566,6985,6370],{},[572,6987,6988,7013],{},[563,6989,6990,6994,7007,7011],{},[577,6991,6992],{},[23,6993,5656],{},[577,6995,6996,6997,7000,7001,2632,7003,7006],{},"Abort the lifecycle when a ",[23,6998,6999],{},"create"," hook exits non-zero (",[23,7002,3182],{},[23,7004,7005],{},"teardown"," never abort)",[577,7008,7009],{},[23,7010,6518],{},[577,7012,352],{},[563,7014,7015,7019,7025,7029],{},[577,7016,7017],{},[23,7018,5642],{},[577,7020,7021,7022,7024],{},"Run repo-committed hooks from ",[23,7023,5619],{}," instead of app-managed ones",[577,7026,7027],{},[23,7028,6518],{},[577,7030,352],{},[132,7032,6286],{"id":7033},"performance",[557,7035,7036,7048],{},[560,7037,7038],{},[563,7039,7040,7042,7044,7046],{},[566,7041,6389],{},[566,7043,3227],{},[566,7045,1058],{},[566,7047,6370],{},[572,7049,7050,7069],{},[563,7051,7052,7056,7062,7067],{},[577,7053,7054],{},[23,7055,1731],{},[577,7057,7058,7059,7061],{},"Cap on warm (live) sessions before the least-recently-used idle one is evicted; ",[23,7060,1735],{}," = unlimited",[577,7063,7064],{},[23,7065,7066],{},"8",[577,7068,352],{},[563,7070,7071,7075,7078,7082],{},[577,7072,7073],{},[23,7074,4618],{},[577,7076,7077],{},"Maximum review → fix rounds before a cycle stops on its own",[577,7079,7080],{},[23,7081,4622],{},[577,7083,352],{},[132,7085,6289],{"id":7086},"privacy",[10,7088,7089,7090,7092,7093,7096,7097,7100,7101,7103,7104,7107,7108,18],{},"Plexus sends ",[40,7091,512],{}," usage analytics — coarse operating system, app version, and a ",[40,7094,7095],{},"daily-rotating salted hash"," of your install so we can count daily active users without ever linking you across days. It never includes your code, file paths, prompts, or repository names, it's ",[40,7098,7099],{},"stored in the EU",", and it's ",[40,7102,1292],{},". Turn it off any time with ",[23,7105,7106],{},"analytics.enabled",". Full detail is in our ",[14,7109,517],{"href":516},[557,7111,7112,7124],{},[560,7113,7114],{},[563,7115,7116,7118,7120,7122],{},[566,7117,6389],{},[566,7119,3227],{},[566,7121,1058],{},[566,7123,6370],{},[572,7125,7126],{},[563,7127,7128,7132,7135,7139],{},[577,7129,7130],{},[23,7131,7106],{},[577,7133,7134],{},"Send anonymous usage analytics (coarse OS + app version + a daily-rotating install hash; never your code, paths, or repo names)",[577,7136,7137],{},[23,7138,6518],{},[577,7140,5434],{},[132,7142,6292],{"id":7143},"keybindings",[10,7145,7146,7147,7150,7151,7154,7155,7158,7159,7162,7163,7165],{},"All ",[23,7148,7149],{},"keybinding.*"," settings are global-only strings. ",[23,7152,7153],{},"Mod"," matches ",[40,7156,7157],{},"Cmd"," on macOS and ",[40,7160,7161],{},"Ctrl"," on Windows\u002FLinux. Rebind, reset, or unbind each in the Keybindings category — see ",[14,7164,242],{"href":241}," for the full set and their defaults.",{"title":309,"searchDepth":310,"depth":310,"links":7167},[7168,7169,7173],{"id":6217,"depth":310,"text":6218},{"id":6262,"depth":310,"text":6263,"children":7170},[7171,7172],{"id":6313,"depth":316,"text":6314},{"id":5305,"depth":316,"text":5306},{"id":6365,"depth":310,"text":3563,"children":7174},[7175,7176,7177,7178,7179,7180,7181,7182,7183],{"id":6380,"depth":316,"text":6269},{"id":6485,"depth":316,"text":1275},{"id":6629,"depth":316,"text":6274},{"id":6717,"depth":316,"text":6277},{"id":5734,"depth":316,"text":1430},{"id":1554,"depth":316,"text":431},{"id":7033,"depth":316,"text":6286},{"id":7086,"depth":316,"text":6289},{"id":7143,"depth":316,"text":6292},"Layered settings, and the ones worth knowing.","Reference",{},50,{"title":165,"description":7184},"docs\u002Fsettings","rDzCxQPF_-wMBkHPa5ffsjnpsnyHjEeEoXuS9Dd1ooI",{"id":7192,"title":242,"body":7193,"description":7348,"extension":323,"group":7185,"icon":7349,"meta":7350,"navTitle":1442,"navigation":328,"order":7351,"path":241,"seo":7352,"stem":7353,"__hash__":7354},"docs\u002Fdocs\u002Fshortcuts.md",{"type":7,"value":7194,"toc":7340},[7195,7198,7211,7215,7218,7221,7227,7230,7233,7237,7240,7244,7250,7253,7263,7267,7270,7274,7280,7283,7287,7306,7309,7327,7334],[10,7196,7197],{},"Plexus is keyboard-driven: switch tabs, toggle panels, drive the agent, and run git operations without leaving the keyboard.",[118,7199,7200],{},[10,7201,7202,7204,7205,7207,7208,7210],{},[23,7203,29],{}," is the platform command modifier — ",[40,7206,7157],{}," on macOS, ",[40,7209,7161],{}," on Windows and Linux. Every shortcut below uses it the same way.",[32,7212,7214],{"id":7213},"tabs","Tabs",[10,7216,7217],{},"Jump straight to any tab in the active session. These fire app-wide, even while the terminal is focused.",[217,7219],{":rows":7220},"[[\"⌘1\",\"Switch to the Agent tab\"],[\"⌘2\",\"Switch to the Review tab\"],[\"⌘3\",\"Switch to the Explorer tab\"],[\"⌘4\",\"Switch to the Git tab\"]]",[10,7222,7223,7224,7226],{},"In the ",[14,7225,1576],{"href":16}," the same chords drive its two tabs:",[217,7228],{":rows":7229},"[[\"⌘1\",\"Switch to the project Dashboard tab\"],[\"⌘2\",\"Switch to the project Git tab\"]]",[10,7231,7232],{},"The project pair are separate, independently rebindable actions that share their default combos with the session pair. That's deliberate and safe: a session and a project are never in view at once, so Plexus routes the chord to whichever is active and doesn't count the overlap as a conflict.",[32,7234,7236],{"id":7235},"panels-views","Panels & views",[217,7238],{":rows":7239},"[[\"⌘J\",\"Toggle the terminal panel\"],[\"⌘0\",\"Toggle the dashboard\"]]",[32,7241,7243],{"id":7242},"agent-input","Agent input",[10,7245,7246,7247,7249],{},"Drive the ",[14,7248,1275],{"href":75}," tab from the prompt box.",[217,7251],{":rows":7252},"[[\"⌘I\",\"Toggle the rich (multi-line) input\"],[\"Enter\",\"Submit the prompt to the agent\"],[\"⇧Enter\",\"Insert a newline without submitting\"],[\"⌘C\",\"Copy the selected terminal text\"],[\"⌘V\",\"Paste the clipboard into the prompt\"],[\"⌃C\",\"Interrupt the running agent (when no text is selected)\"]]",[10,7254,7255,7256,5164,7258,7260,7261,18],{},"On Windows and Linux, ",[23,7257,3650],{},[23,7259,3661],{}," — it copies when text is selected and otherwise interrupts. Copy and paste work the same way in the bottom ",[14,7262,1908],{"href":1907},[32,7264,7266],{"id":7265},"editor","Editor",[217,7268],{":rows":7269},"[[\"⌘S\",\"Save the open file in the editor\"]]",[32,7271,7273],{"id":7272},"git-operations","Git operations",[10,7275,7276,7277,7279],{},"Reshape the session branch from anywhere — these fire even while the agent terminal is focused. They're destructive, so each carries two modifiers, and when you trigger one while typing in a terminal or input Plexus asks you to confirm before it rewrites the branch. See ",[14,7278,327],{"href":330}," for what they do.",[217,7281],{":rows":7282},"[[\"⌘⌥R\",\"Rebase the branch onto its base\"],[\"⌘⌥M\",\"Merge the base branch into the current branch\"],[\"⌘⌥S\",\"Squash the branch's commits\"]]",[32,7284,7286],{"id":7285},"customizing-shortcuts","Customizing shortcuts",[10,7288,7289,7290,7293,7294,7297,7298,7301,7302,7305],{},"Every binding above is editable under ",[40,7291,7292],{},"Settings → Keybindings",". Click a row to ",[40,7295,7296],{},"record"," a new combo — Plexus reads the physical key, so layout and Option-composed glyphs never garble it. You can also ",[40,7299,7300],{},"reset"," a binding to its default or ",[40,7303,7304],{},"unbind"," it entirely (leaving the action with no shortcut).",[10,7307,7308],{},"Two rules keep recordings safe:",[256,7310,7311,7314],{},[259,7312,7313],{},"Every binding needs at least one modifier, so a single keystroke can't fire an action while you work.",[259,7315,7316,7317,7319,7320,7323,7324,7326],{},"The destructive git ops require ",[40,7318,214],{}," modifiers — a near-bare chord like ",[23,7321,7322],{},"⇧S"," or a reflexive ",[23,7325,3904],{}," won't trigger a rebase, merge, or squash.",[10,7328,7329,7330,7333],{},"Plexus flags ",[40,7331,7332],{},"conflicts"," when two actions share a combo. Every shortcut — navigation and git ops alike — fires while you're typing in a terminal or input, so the two-modifier rule above is what keeps a stray keystroke from triggering a rebase, merge, or squash mid-edit — and if one does fire while you're typing, Plexus confirms before rewriting the branch.",[10,7335,7336,7337,7339],{},"Bindings persist globally — see ",[14,7338,165],{"href":164}," for how scopes and overrides work.",{"title":309,"searchDepth":310,"depth":310,"links":7341},[7342,7343,7344,7345,7346,7347],{"id":7213,"depth":310,"text":7214},{"id":7235,"depth":310,"text":7236},{"id":7242,"depth":310,"text":7243},{"id":7265,"depth":310,"text":7266},{"id":7272,"depth":310,"text":7273},{"id":7285,"depth":310,"text":7286},"Plexus is keyboard-driven — almost every action has a shortcut.","Keyboard",{},51,{"title":242,"description":7348},"docs\u002Fshortcuts","xUUXxYTfGf5jSJ2-OMzoQcbjrlu2xYAJqVcCVeneb1k",1783292792885]