Groundwork

Reference

Command catalog: the repo's aliases, helper commands, and daily moves.

This is the "what command was that again?" page. The same catalog is available in the terminal with groundwork-help, so the help follows you even when the docs are not open.

Terminal help
groundwork-help show everything
groundwork-help update filter commands
groundwork-help git show Git helpers
groundwork-help project show scaffolders
groundwork-help context show AI context helpers

Why Groundwork has a package.json

Groundwork is still a macOS/chezmoi project, not a JavaScript application. Its first-run, applied commands, diagnostics, and canonical validator continue to work without a project install. The root package.json is deliberately dependency-free metadata for repository contributors: it pins the Node and pnpm authorities and provides consistent toolchain audit wrappers.

Repo-maintenance commands still live as direct scripts under scripts/ and tools/; for example, CI and humans run scripts/validate-groundwork, which invokes the dependency-free Node checker directly before any pnpm wrapper is needed. The empty lockfile proves the declared package-manager contract reproducibly; it does not move bootstrap, chezmoi apply, update-all, or installed user commands behind pnpm install.

The ownership rule is simple: a command that performs work in child processes lives in ~/.local/bin; a shell function is reserved for work that must change the current shell, such as cd, an export, or activation. Self-updating commands split in two: update-all is a stable launcher that synchronizes Groundwork and then hands the same invocation to the freshly applied runner, groundwork-update-run, which holds the actual update stages. A fix delivered by the sync therefore governs the rest of that same invocation, and the launcher itself never needs to change.

A separate hand-written man page would duplicate the same command contract in a third place. Groundwork follows the modern CLI layers instead: every substantial helper owns complete -h/--help output, groundwork-help provides searchable offline discovery across helpers, and this site teaches the larger workflow. If Groundwork later grows into a stable multi-command suite, its man pages should be generated from that command definition rather than maintained separately.

Daily Groundwork commands

groundwork-helpShow the command catalog. Add a query to filter it.
groundwork-help --pickFuzzy-pick a command from the catalog with fzf; prints it and copies it to the clipboard when possible.
groundwork-docsOpen the complete local site from the Groundwork checkout chezmoi is actually using. It resolves both a visible ~/code/groundwork checkout and older ~/.local/share/chezmoi layouts, then prints the exact path instead of opening a browser on headless platforms.
update-allThe one normal machine-maintenance command. One portable lock serializes synchronization, apply, upgrades, and maintenance. It inventories every installed Homebrew formula and cask, binds pins to full-name formula metadata, and updates only exact outdated tokens through ordinary, checksummed self-updating, or safely verifiable latest-version lanes. The two greedy-aware lanes always carry explicit tokens; bare global --greedy is prohibited. Current privileged casks stay quiet, and cask upgrades match Homebrew's own default of quitting and reopening an app that declares a safe quit action; update-all --no-app-quit is the explicit one-run opt-out that defers each observed running cask instead and passes Homebrew's --no-quit guard at mutation time. It inventories Mac App Store apps through the reviewed mas 7.x JSON-object stream. Before each exact mutation, a real interactive terminal visibly establishes macOS authorization in the foreground terminal process group while a separate watchdog enforces its deadline; the mutation then runs without another prompt in its own process group under a conservative 30-minute backstop. Redirected, CI, or cron-style runs mark exact outdated IDs action-required instead of prompting. One app's authorization failure, timeout, or mutation failure does not suppress the next exact ID, and attempted, verified, remaining, timed-out, failed, action-required, and unexplained results stay distinct. Pinned, explicitly policy-declared vendor-covered, disabled, deprecated, manual/MDM-unresolved, deferred-running, and actual failure outcomes remain distinct. Review items do not suppress safe lanes or become false failures; failed inventory, mutation, or verification remains nonzero. After a successful macOS transaction releases its lock, the default-no interactive action center may call the separately locked ChatGPT adoption/removal helpers; redirected runs only print commands. Maintenance and action receipts share one invocation ID, and the action receipt binds the immutable maintenance receipt by filename and SHA-256. Package-manager maintenance, bounded Docker scratch cleanup, and the consent-gated Karabiner postflight retain their existing contracts. Arbitrary repository dependencies such as node_modules remain outside scope.
update-all --no-app-quitKeep every running application open instead of letting Homebrew quit it for an eligible cask upgrade during this invocation. Groundwork defers each observed running cask, passes Homebrew's --no-quit guard at mutation time, continues unrelated updates, and prints the exact rerun action.
groundwork-app-adopt <app>Separately inspect and consent to Homebrew's identical-artifact adoption for an explicitly mapped manual macOS app. groundwork-app-adopt --check <app> performs the complete nonmutating eligibility proof used before an outer prompt: status 0 means the requested Homebrew-owned state is already satisfied, status 3 means safe adoption is available but no mutation occurred, and any other nonzero status means eligibility was not proved. ChatGPT is the initial mapping. The command strictly verifies the code signature before reading the signing team, then verifies signature, bundle identity, executable, process state, ownership, and MDM state again after consent. It refuses symlinked paths or any force, uninstall, removal, reinstall, deletion, or zap behavior. After releasing its transaction lock, interactive update-all may invoke the helper only after a fresh status-3 check and literal default-no consent; noninteractive runs print the command only.
groundwork-app-remove <app>Separately inspect and consent to cleanup of an explicitly mapped legacy macOS app while preserving its current replacement. groundwork-app-remove --check <app> performs the complete nonmutating eligibility check used before an outer prompt: status 0 means the requested absent state is already satisfied, status 3 means safe removal is available but no mutation occurred, and any other nonzero status means eligibility was not proved. chatgpt-classic and codex-app are distinct mappings. The command holds the machine update lock, strictly verifies each code signature before reading its signing team, verifies bundle identity, executable, Homebrew ownership, exact app artifacts, and reviewed uninstall hooks before and after consent, and refuses running, MDM-managed, ambiguous, or changed state. A manual bundle moves to a collision-safe Trash path while preserving shared data; a Homebrew-owned target uses only its exact cask uninstall. It never uses --zap or removes shared Application Support, preferences, chats, credentials, or unrelated data. Interactive update-all may invoke the Classic mapping only after verified current ChatGPT ownership, a fresh status-3 check, and a second explicit default-no prompt; it never offers automatic codex-app cleanup.
update-all --skip-maintenanceExceptional fast refresh: synchronize and upgrade but skip package-manager and Docker scratch maintenance. It does not clear earlier pending work and returns nonzero if a previous maintenance failure still needs repair.
groundwork-cleanupAdvanced read-only report. It names every accepted pnpm store, its size, selected version, deterministic representative repository, and all other selectors, then separates custom roots, version conflicts, unavailable selections, and unmatched whole generations for owner review. It uses live canonical repository discovery without reading or writing the navigation cache and changes no persistent state.
groundwork-cleanup --yesRun supported Homebrew and npm maintenance without upgrading, plus trusted exact-pinned pnpm candidates when the machine-wide cadence or a pending repair says they are due.
groundwork-cleanup --yes --forceExceptional override: attempt normal Homebrew and npm maintenance and every eligible pnpm candidate immediately, ignoring pnpm cadence. Routine retries should use update-all, or groundwork-cleanup --yes when upgrades should not repeat. Observations are bounded; each mutating package-manager command has a process-tree deadline, heartbeat, cancellation path, durable failure record, and exact retry command.
groundwork-cleanup --yes --clear-pending <stage>Acknowledge one homebrew, npm, pnpm, or maintenance-helper reminder only when that manager was intentionally removed and the recorded work cannot be retried. It performs no cleanup and preserves a timestamped audit note.
groundwork-configureCanonical editor for mutable preferences and saved baseline answers, including environment role, stable-versus-preview release posture, Xcode beta, work machine, password manager, code directory, and identity. Xcode beta appears only while Xcode is enabled; disabling Xcode stages both fields in the receipt. It otherwise changes only what you pick, previews the dotfile diff, and applies only after confirmation — promoting the config atomically under a lock with a timestamped backup, then reconciling the selected desired state immediately. Plain chezmoi init only establishes or regenerates the bootstrap baseline.
groundwork-platformReport whether this environment is macOS, native Linux, WSL2, unsupported WSL1, an unverified WSL kernel, or unsupported.
groundwork-distro --familyOn Linux or WSL, report the distribution's bootstrap family without pretending a derivative is its parent. Run without the flag for the distribution's own ID.
groundwork-profile showShow the historical bootstrap seed, saved environment role, release posture, terminal multiplexer selection, Xcode and Xcode-beta status, resolved Chrome primary/fallback channel, whether this profile is headless, and the detected operating-system channel. Groundwork reports the OS channel and never changes the default-browser association.
groundwork-profile set current|previewFocused shortcut into groundwork-configure's preview-and-confirm transaction for release posture. Confirming applies the selected desired state immediately; update-all owns subsequent upgrades and maintenance.
groundwork-profile editOpen the chezmoi config when you need to review the stored role, preset, or another profile field directly. Prefer groundwork-configure for the guided setup-answer flow.
groundwork-yazi-config statusReport whether Yazi's effective yazi.toml is absent, exactly Groundwork-owned, changed, unowned, or non-regular. Read-only.
groundwork-yazi-config diffPreview the effective Yazi config against Groundwork's exact source template without changing either file.
groundwork-yazi-config editOpen Groundwork's exact Yazi source template through chezmoi. Run chezmoi apply afterward to apply the reviewed source.
groundwork-yazi-config remove --yesRemove only an unchanged yazi.toml that matches Groundwork's exact ownership receipt. Other Yazi files and user changes are preserved; chezmoi apply restores the managed file.
groundwork-muxStart the selected primary multiplexer. Herdr is primary for Herdr and Both; tmux is primary for tmux; None refuses. The command never aliases tmux and refuses automatic nesting.
groundwork-mux status --jsonPrint schema-versioned terminal-multiplexer state: desired managed packages, separately observed Herdr/tmux executable available values, primary and optional fallback, and disabled nesting. Selection never masquerades as installation proof.
groundwork-herdr-config status|diff|editInspect Groundwork's ownership, compare the applied Herdr config, or edit its exact chezmoi source.
groundwork-herdr-config remove --yesRemove only an unchanged, receipt-matching Groundwork Herdr config. The binary, sessions, and agent settings stay untouched.
groundwork-herdr-integrations statusShow Herdr's official integration status for agent session identity and recovery.
groundwork-herdr-integrations install --yesExplicitly install Herdr's official Claude Code and Codex hooks for agent tools found on this machine. This never runs during chezmoi apply.
groundwork-herdr-integrations uninstall --yesDelegate exact Claude Code/Codex hook removal to Herdr's supported integration lifecycle.
Ctrl+aThe shared Groundwork tmux/Herdr prefix. In Herdr, press d to detach, ? for active keybindings, [ for copy mode, g for lazygit, or use the pane and tab mnemonics on the Herdr page.
chezmoi diffPreview managed-file changes before applying them.
chezmoi applyApply this repo to your home directory.
chezmoi update --initPull the Groundwork repo and apply it. --init also refreshes the setup answers when new questions were added — answers you already gave are kept, only new questions are asked. This syncs config and installs newly declared tools; it does not request routine upgrades of already-installed tools, though Homebrew may update a dependency required by a new entry.
chezmoi edit ~/.zshrcEdit the source template for a managed file.
chezmoi cdJump into the Groundwork source repo.

AI context sharing

Use these when you want a chat app, reviewer, or second agent to see the exact files you chose, with each path attached to its contents. Keep the bundle small: copy the files that explain the question, not the whole repo.

copy-context AGENTS.md src testsCopy selected files or folders to the clipboard with path headers and contents.
copy-context --stdout src/foo.tsPrint the payload first so you can inspect what you are about to paste.
copy-context --paths-only docsCopy only the selected file list when you want to discuss scope before sharing contents.

Repository navigation

groundwork-reposTable of every Git repository discovered under your configured roots (~/.config/groundwork/repos.conf): branch, dirty/clean as symbol + word, ahead/behind, worktree marker, path. Discovery is dynamic — a fresh clone appears within the cache TTL (30 s), or immediately with --refresh, with no config edit. See Repository navigation.
groundwork-repos pickFuzzy-pick a discovered repository (fzf) with a live git-status preview, then open or reuse its lazygit tmux window. Inside tmux it becomes a window (also on Ctrla then ShiftR); outside, it creates or attaches the repos session.
groundwork-repos changedOpen one lazygit tmux window per repository with uncommitted work — the fastest way to see everything your agents left unreviewed (also on Ctrla then ShiftG).

Project scaffolders

new-project my-appCreate a starter repo with AGENTS.md, shared agent folders, editor settings, and ignored local/secrets files.
new-twelve-logCreate the Groundwork Twelve learning-log repo at ~/groundwork-log, make its first commit, and enter it. Pass a path to put it somewhere else.
groundwork-docker-build-scratch review . --rm-afterBuild and immediately remove a proof-only Docker image under the ephemeral-build contract. The wrapper owns the syntax nobody should hand-type: it applies dev.roost.ephemeral=true, generates the RFC 3339 dev.roost.built timestamp itself, tags <project>/scratch:<purpose> (project derived from the context, or --project), validates the purpose as a legal tag component, and prints the resulting image ID. Inside this repository, use scripts/verify-docker-image when the proof must run the image. Allowlisted docker build arguments go after -- (--file/-f, --target, --platform, --build-arg, --secret, --ssh, --no-cache, --pull, --progress; anything else is refused by name. See Platforms.
scripts/verify-docker-imageGroundwork repository verification transaction: build a uniquely tagged scratch image, run the complete tool smoke test in a named --rm container, remove the exact image ID through an EXIT/HUP/INT/TERM trap, and prove the expected tag was not retained or repointed. Build, run, Docker observations, and cleanup are bounded and require a trusted CLI against a verified local Unix endpoint. CI may pass --existing --purpose <purpose> only for a cache-built image carrying both lifecycle labels.
new-wiki ~/code/llm-wikiCreate a private knowledge wiki where sources live in raw/, an agent maintains wiki/, and Obsidian can browse the vault.
obsidian-plugins ~/code/llm-wikiInstall the Groundwork-managed Obsidian plugin set into a vault.

GitHub auth

gh auth loginSign in to GitHub for gh and HTTPS Git operations.
gh auth setup-gitConfigure gh as Git's HTTPS credential helper in an unmanaged Git config. Groundwork already renders the equivalent helper block, so this is normally unnecessary here.
groundwork-github-ssh statusProbe GitHub SSH on port 22 and ssh.github.com:443 with a bounded deadline, separating transport from authentication, and report which route git currently uses. Read-only.
groundwork-github-ssh enable-443Route github.com SSH via ssh.github.com:443 for networks that stall port 22. Shows the exact change, asks first (--yes for non-interactive), backs up ~/.ssh/config, and fingerprint-checks GitHub's published host keys. See Troubleshooting.
groundwork-github-ssh revert-443Remove the managed port-443 fallback — byte-exact when the config is unedited since enable, surgical otherwise. Backups are kept.

Dev runtimes

mise use node@24Pin a runtime/tool version in the current project.
mise upgradeUpgrade globally managed mise tools, including floating baselines such as Node LTS. Takes effect at your next prompt, even in already-open terminals.
pnpmPackage manager installed through mise for JavaScript projects.
pythonPython installed and versioned by mise. Avoid relying on macOS system Python.
uvFast Python package, project, script, tool, and virtualenv manager.

Git commands

git statusShow changed, staged, and untracked files.
git diffInspect unstaged changes before asking an agent to continue.
git add -pStage changes in reviewable chunks.
git commit -m "message"Commit the staged changes with a short message.
git show --statReview the latest commit summary.

Groundwork safety

chezmoi diffPreview what Groundwork would change before applying.
chezmoi applyApply the source repo to the home directory.
groundwork-restoreRestore the first-run backup of managed files and macOS defaults. Does not uninstall apps or undo Homebrew upgrades.
groundwork-doctorRead-only machine health report. Its default run covers the shell runtime, runtime release age, Node/pnpm ownership, selected browser, Karabiner compatibility and process memory on macOS, and Docker health and leftovers. A Karabiner snapshot at or above the shared 1024 MiB review threshold includes groundwork-karabiner-restart as the recommended action. It never deletes or changes anything.
groundwork-doctor --shellRun only the shell runtime section: managed zsh installed, registered, selected as login shell, and running here.
groundwork-doctor --runtimesFlag any mise-managed runtime that was adopted inside the five-day release floor. This closes a real gap: a cooldown only filters what you acquire — it never retires a version already on disk, so anything installed before the floor existed stays until something says so. It reads the release date from the tool's own backend rather than from mise's upgrade warning, which only appears when mise's version cache happens to be cold.
groundwork-doctor --karabinerRun only the Karabiner section already included by default. It reports the installed version against Groundwork's 16.1.0 compatibility floor, whether the current macOS major is in the vendor's documented support set, and the root Core Service PID, owner, elapsed time, RSS, Activity Monitor-style footprint, and compressed memory when available. Meeting the shared review threshold prints the exact restart command; one snapshot is explicitly not a growth rate or diagnosis.
groundwork-karabiner-restartRequest Karabiner's documented user-domain restart, wait at most ten seconds, and report success only after a different root Core Service PID appears. If the request or proof fails, use Karabiner's menu bar or Settings restart instead; the helper never manipulates private root launch daemons.
groundwork-doctor --dockerRun only the Docker section, including report-only detection of old unlabeled groundwork:test, *-test, review-*, verify-*, and spike-* tags that bypassed the scratch lifecycle. It never guesses that the documented runnable groundwork:latest image is disposable.
groundwork-doctor --node-toolchainReport who owns Node and pnpm on this machine. Groundwork's model is mise owns Node, Corepack owns pnpm, with Corepack selecting the version each repository pins in packageManager. The report checks the active Node, competing pnpm owners, a repository mise.toml that incorrectly declares pnpm, repository pins, nested-process agreement, and a configured pnpm global-tool directory outside PATH. It points project tools to pnpm add -D plus pnpm exec, and personal cross-project CLIs to mise's npm: backend with the five-day floor, without running pnpm setup.
groundwork-docker-tidyDry-run Docker tidy, by enumeration: every image labeled dev.roost.ephemeral=true is inspected individually and reported as eligible (its strict-parsed dev.roost.built label is past the 72-hour grace, it has exactly one tag in the scratch namespace */scratch:*, and no container — running or stopped — references it), retained (inside the grace window), protected (multiple tags, a non-scratch tag, or a container reference refuses deletion — a scratch image retagged groundwork:latest keeps its label, so the tag check is the backstop), or unverified (missing jq, or a missing or malformed build label — retained and explained, never "probably old"); exited containers carrying the label are judged by the same grace window against their CreatedAt. Automatic maintenance never untags a mutable name; it re-checks and deletes only the exact image ID without force. The label is the consent, so your real groundwork image, base images, and other projects' images are structurally out of reach — and dangling images and builder cache are daemon-wide state this command never touches. See Platforms for the ephemeral-build contract.
groundwork-docker-tidy --yesMaintenance-only retry for the eligible set: exited containers carrying the label whose CreatedAt is past the same 72-hour grace, then each eligible image. The helper owns the shared update lock, per-Docker-call and total-lane deadlines, durable pending state, fresh candidate re-checks, and explicit-ID deletion. A successful direct retry clears the reminder. update-all invokes the stricter canonical local-only --automatic mode with a fixed five-minute total budget.
groundwork-docker-tidy --yes --clear-pendingAcknowledge the Docker scratch reminder only after Docker was intentionally removed and the cleanup can no longer be retried. It performs no Docker query or deletion and preserves a timestamped audit note.
groundwork-docker-cache-tidyDry-run preview of the daemon-wide cleanup: stopped containers, dangling images, and builder cache from every project on this machine, not just Groundwork. That is exactly why it is a separate command — it says what it touches, and update-all and scheduled agent paths never invoke it.
groundwork-docker-cache-tidy --yesApply the daemon-wide cleanup through a trusted CLI against a verified local Unix endpoint, with per-operation and total deadlines: prune stopped containers and dangling images, and prune builder cache toward a 5 GB retention target. Remote daemon cleanup is refused. --keep-storage asks Docker to prune eligible cache for the selected builder while retaining a target — it does not guarantee total cache lands at or below the number. Never volumes, never tagged images.
groundwork-pnpm-store-tidySingle-directory pnpm diagnostic: report every sibling generation plus the pnpm version and store selected by the current directory. The automatic machine-maintenance path is update-all; use this narrower command when diagnosing one repository's selection.
groundwork-pnpm-store-tidy --yesRun pnpm store prune on the store selected by the current directory, with a measured before/after/reclaimed receipt. It re-checks the selection (store and pnpm version) immediately before pruning and refuses if either moved after the report — you authorize exactly the state you saw — and it refuses outright when a valid packageManager pin disagrees with the pnpm that actually resolved, because that is launcher drift to diagnose (groundwork-doctor --node-toolchain), not to prune under. Projects are not modified, and a pruned package re-downloads the next time something needs it. Other store generations are never touched: an older store (a v10 beside a selected v11) may be selected by another repository's packageManager field, so retiring one is a separate human decision after checking your repos.

The shell runtime

Provisional beyond Apple Silicon

Shell adoption and Ctrla then ShiftY are covered by automated tests and verified on Apple Silicon macOS. Intel macOS, native Linux, and WSL2 receipts are still being collected — and Groundwork's rule is that support follows verification, not intent — so treat those platforms as provisional for these two commands until the receipts land. Recovery (--revert) is designed to work regardless, including with Homebrew broken or missing.

Groundwork owns the interactive shell itself, not only its configuration. The zsh that runs your prompt, plugins, completions, and tmux integration is the one Homebrew installs, so it behaves the same on macOS, Linux, and WSL2 and update-all keeps it current along with everything else. Your operating system's own shell is never modified or removed — it stays as the recovery path.

Adopting it is a deliberate step, never something an apply does behind your back, because it changes your account's login-shell record and needs sudo to register the shell in /etc/shells. It also never replaces the shell process you are sitting in: new terminals pick it up, and the command prints an exec line if you want to switch the current one immediately.

Recovery is designed for the bad day. Adoption records the exact login shell you had first, so --revert restores that shell rather than guessing a platform default — and both --status and --revert work with Homebrew missing or broken, since that is precisely when you need them. Groundwork never modifies or removes your operating system's shell.

groundwork-shell-adoptMake Groundwork's Homebrew zsh your login shell: registers it in /etc/shells (idempotent, needs sudo), runs chsh, then verifies the account record actually changed.
groundwork-shell-adopt --statusReport the shell runtime state — managed zsh and version, the account's login shell, the $SHELL session value, the recorded previous shell, and /etc/shells registration — and change nothing.
groundwork-shell-adopt --revertRestore the login shell you had before adopting — the exact one, recorded at adoption, not a guessed default (on Linux that is often bash, not zsh). It deliberately works with Homebrew missing or broken, because that is the incident it exists for.
groundwork-shell-adopt --revert-to <shell>Restore a specific login shell, for the case where no previous one was recorded.

Shell aliases and search

llDetailed file listing with hidden files, Git status, and directories first.
ltHidden-inclusive tree view, two levels deep, honoring Git ignores and excluding .git internals.
lttHidden-inclusive tree view, three levels deep, honoring Git ignores and excluding .git internals.
lgOpen lazygit.
vim / viOpen Neovim.
catUse bat for syntax-highlighted file viewing.
z nameJump to a recent/frequent folder with zoxide.
CtrlRSearch shell history with Atuin.
atuin ai inlineRun Atuin's opt-in English-to-shell assistant after setup.
AltCFuzzy-pick a visible or hidden project folder while honoring ignores and excluding .git, preview it as a tree, and cd into it.
CtrlTFuzzy-pick visible or hidden project files while honoring ignores and excluding .git, preview with bat, and insert the chosen paths.
mkdir -p folderCreate a folder, including parent folders if needed.
pwd / open .Print the current folder / open it in Finder.
rg text / fd nameSearch file contents / find files by name.
rgh text / fdh nameSearch hidden and ordinary project paths while preserving ignore rules and excluding .git internals.
rga textDeliberately broaden read-only ripgrep inspection to hidden and ignored content while still excluding .git.
rgf [text]Search hidden and ordinary files while preserving ignore rules, fuzzy-pick results, preview with bat, and open the selected line.
yOpen Yazi with developer dotfiles initially visible; period toggles them, q quits into the browsed folder, and Q returns to the starting folder.
largest [path]Show the 50 largest files and folders under a path, then print a cleanup guide that routes each kind of result to its owning tool.
largest --files /Show only files on the startup filesystem. A complete macOS scan requires Full Disk Access for the terminal.
largest --folders ~Show only folders under your home folder. Add -n N to change the result count.

tmux commands

tmux new -s nameStart a named tmux session.
tmux attach -t nameAttach to an existing session.
tmuxp load .tmuxp.yamlStart a reusable project layout from a checked-in config file.
tmuxp freeze > .tmuxp.yamlCapture the current session as a starter layout config.
tmux-freshStart tmux without restoring the previous resurrect snapshot.
~/.config/tmux/plugins/tpm/bin/update_plugins allUpdate tmux plugins from a normal shell when TPM's tmux pane is hard to read.
Ctrla then ShiftYCopy the last completed command and its output into a tmux buffer (and the clipboard when supported), selected by semantic prompt marks; a platform + working-directory line is prepended so pasted output tells an agent where it ran. Review for secrets before pasting into an AI tool.
Ctrla then ShiftRRepo picker popup: fuzzy-search every repository discovered under your configured roots, preview its git status, and jump to (or open) its lazygit window. See tmux repo windows.
Ctrla then ShiftGOpen a lazygit window for every repository with uncommitted changes (groundwork-repos changed).
Ctrla then zZoom the active pane to fill the screen; press again to restore. The status line shows Z while zoomed — this is what happened if a pane suddenly took over the screen.
Ctrla then xClose the active pane. It asks first, because x sits next to z (zoom).
Ctrla then CtrlsSave a tmux-resurrect snapshot now.
Ctrla then CtrlrRestore the last tmux-resurrect snapshot.
Ctrla then ShiftUUpdate tmux plugins with TPM. Press Esc or Enter if the update pane does not repaint.
Ctrla then ShiftIInstall missing tmux plugins with TPM.
Ctrla then rReload the tmux config.
Ctrla then PRename the active pane.
Ctrla then ,Rename the active window.
Ctrla then &Close the current window and all panes inside it.
tmux kill-session -t nameEnd a named tmux session.
tmux kill-serverEnd every live tmux session; snapshots are separate.
Alth/j/k/lMove between tmux panes and Neovim splits with the same keys.

Mac and display commands

defaultbrowserList or set the macOS default browser. Groundwork installs Chrome but never changes this association.
browser-extensionsList or open the recommended extension links for Chrome.
raycast-extensionsList or open the recommended Raycast Store entries for browser bookmarks, tabs, Anybox, GitHub, Homebrew, project openers, and optional AI.
betterdisplaycliBetterDisplay's CLI for display automation.
open -a "Google Chrome"Open Chrome stable directly from the shell; use Raycast when you want to search.

Practice

1

Ask for help first

Run groundwork-help, then groundwork-help update, then groundwork-help project. Notice which commands are aliases, functions, keys, or real executables.

2

Trace one command

Run which groundwork-help, which new-project, and type update-all. That teaches where commands come from: installed scripts, shell functions, and aliases.