diff --git a/README.md b/README.md index b9161b3b..1acd9d9d 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,10 @@ What it does: - **Agent skill.** An installable skill (Help ▸ Install Agent Skill…) teaches Claude Code or Codex the control model and the `agtermctl` commands, so an agent running inside agterm can build its own layout, run overlays, manage windows, and show images inline without you explaining the API. - **Agent status.** A coding agent reports its state (active, blocked, or completed) onto its session's row, so you can see which of many running agents needs you. Status hooks for Claude Code, Codex, Pi, OpenCode, and other agents install from Help ▸ Install Agent Status Hooks…. +A lot of "does it have X?" questions have the same answer: bind X yourself. A `command` line in `keymap.conf` turns any shell line into a key chord, and an overlay gives an interactive program a real terminal over the session, so a file manager, a git UI, or a database browser is one line away. Bigger workflows become scripts, which is what the [cookbook](cookbook/) collects. + +You are not meant to write those lines by hand. Install the agent skill (Help ▸ Install Agent Skill…) and ask the agent in your session for what you want, and it writes the line with the right syntax, targeting, and PATH handling. [Extend agterm](https://agterm.com/docs#extend) shows that, and teaches enough of the model to read and change what comes back. + For the real terminal work, rendering, VT parsing, and shell I/O, `agterm` embeds [Ghostty](https://ghostty.org)'s engine (libghostty); everything above is `agterm`'s own.  @@ -33,7 +37,7 @@ An agent's interactive prompt mid-session, with attention glyphs on the sessions  -A file manager in a floating overlay over the active session: +The yazi file manager in a floating overlay over the active session, from one `command` line in `keymap.conf`:  diff --git a/docs/backlog/edit-keymap-menu-hides-the-extension-mechanism.md b/docs/backlog/edit-keymap-menu-hides-the-extension-mechanism.md new file mode 100644 index 00000000..704f39d7 --- /dev/null +++ b/docs/backlog/edit-keymap-menu-hides-the-extension-mechanism.md @@ -0,0 +1,24 @@ +--- +worth: later +where: agterm/agtermApp+Menus.swift +added: 2026-08-20 +--- +# File ▸ Edit Keymap… does not read as "add features" + +The seeded `keymap.conf` is the best explanation of custom commands anywhere in the project. It documents +the `command` directive, the detached-no-TTY limit, the PATH rule, the context tokens, and ships the +`agtermctl session overlay open 'zsh -lc lazygit'` pattern (`agtermCore/Sources/agtermCore/ConfigPaths.swift:39-116`). +It is better than the public docs were before the `#extend` lesson, and a user reaches it only by opening +a menu item named after key configuration. + +Both menu entries name the mechanism rather than what it is for: `File ▸ Edit Keymap…` and +`Navigate ▸ Custom Commands`. A user looking for a file browser has no reason to open either. The docs +side of this is fixed (the lesson, the nav rename, the screenshot captions); the in-app affordance is not. + +Worth considering, none of it obviously right: wording that advertises extension rather than +configuration, a Help entry that points at the lesson, or seeding the palette with one commented example +so `Custom Commands` is not empty on a fresh install. All of it is AppKit/menu work whose cost should be +priced on its own, which is why it was kept out of the docs change. + +Surfaced while brainstorming the onboarding gap after a new user asked whether agterm has a file browser +and the answer turned out to be one keymap line. diff --git a/docs/backlog/seeded-lazygit-example-omits-target.md b/docs/backlog/seeded-lazygit-example-omits-target.md new file mode 100644 index 00000000..286e563e --- /dev/null +++ b/docs/backlog/seeded-lazygit-example-omits-target.md @@ -0,0 +1,29 @@ +--- +worth: later +where: agtermCore/Sources/agtermCore/ConfigPaths.swift:77 +added: 2026-08-20 +--- +# the seeded Lazygit example omits --target and can open its overlay elsewhere + +The starter `keymap.conf` ships: + +``` +command "Lazygit" ctrl+a>g agtermctl session overlay open 'zsh -lc lazygit' --socket "$AGT_SOCKET" +``` + +`TargetOptions.target` defaults to `active` (`agtermCore/Sources/agtermctlKit/Commands.swift:69`), and `active` +is resolved when the request reaches the server, not when the chord built its context. The custom command is +spawned detached and fire-and-forget (`agterm/Commands/CustomCommandRunner.swift:336`), so a session or window +switch between the keypress and delivery opens the overlay over whatever is selected by then. The command +reference already tells automated callers to pin it (`site/commands.html:379`), and a custom command has the +stable `$AGT_SESSION_ID` for exactly this. + +The fix is one flag: `--target "$AGT_SESSION_ID"`. The line is otherwise valid — `overlay open` does not +require a size flag, so omitting `--size-percent` correctly gives a full-size overlay. + +Worth doing because the `#extend` lesson now sends new users to **File ▸ Edit Keymap…**, where they read this +example next to the docs' pinned one and get two different answers. Kept out of the docs change (#PR) because +touching `ConfigPaths.swift` pulls in the full Swift gate run for a one-line seed-text improvement, and no +existing user is blocked by it. + +Found by codex while reviewing the paste lines in the `#extend` lesson. diff --git a/site/docs.html b/site/docs.html index 6dfa1273..dc5a5c3e 100644 --- a/site/docs.html +++ b/site/docs.html @@ -183,6 +183,7 @@ > Overview Install + Extend agterm
CONCEPTS Notifications Accessibility Customization + Custom commands & keys SCRIPTING agtermctl reference @@ -204,7 +208,6 @@ class="hv9" >Cookbook ↗ - Customizing keys Ghostty config Agent status @@ -551,6 +554,271 @@ + ++ agterm ships a small set of features on purpose. A great many of the tools you might wish it shipped are one line + in keymap.conf, and the line + stays short because three pieces do the work: a + command turns any shell line + into a named action on a key chord, an overlay gives an interactive program its own temporary terminal over the + session, and any CLI you already have fills that slot. agterm never needs to know what the program is. +
++ So “does agterm have a file browser?” has no yes-or-no answer. You bind the file browser you like, in + one line. The four steps below each add one building block. +
++ To edit the file yourself, open it with + File ▸ Edit Keymap… and apply your changes with + File ▸ Reload Keymap. +
+ ++ Read the line left to right: + command is the directive, the + quoted text is the name shown in the + Navigate ▸ Custom Commands palette, + ctrl+a>o is the chord that + fires it — Ctrl-A, then O — and everything after that is an ordinary shell line. The chord is + optional: leave it out and the action exists in the palette only. +
++ The building block is session context. Every custom command is handed the + session it fired from — its directory, name, id, and current selection — as + $AGT_* environment variables + and as {AGT_*} tokens + substituted into the line. That is what makes one binding work in every session instead of hard-coding a path. +
+ ++ The building block is the overlay. A custom command on its own runs detached + with no terminal, which suits launching a GUI app but kills a TUI at once, since it has nothing to draw on. An + overlay is a real terminal, so yazi, + lazygit, + htop and the rest behave + normally in it. It opens in the session's own working directory, and it disappears when the program exits, leaving + the shell underneath untouched. +
++ agtermctl is how the line asks + for that terminal: it is agterm's own command-line tool, and opening an overlay is one thing it can do. Step 3 + opens up the rest. +
++ --target "$AGT_SESSION_ID" is + worth understanding rather than copying. + agtermctl does not act on + agterm directly; it sends a request over a socket, and agterm resolves it on arrival. Without a target the request + means “whichever session is selected when this lands”, which is normally the one you pressed the chord + in — but not if you switched in between. The token pins it to the session that fired, so the overlay always + opens where you asked for it. +
+ ++ The building block is the control API. Overlays are one entry in a much + larger catalog: the same + agtermctl creates and renames + sessions, splits panes, moves windows, opens the native picker, reads a session's text back, and posts + notifications. Every state it sets it also reads back, which is what lets a script build a whole layout rather than + fire a single action. +
++ The extra flags are the same idea as + --target above, applied to + every axis this command can drift on. A bare + session new lands in + whichever window is frontmost and whichever workspace is current when the request arrives, and it selects the new + session; the ids pin all three to where the chord was pressed, and + --no-select leaves you where + you were. Keymap lines never wrap, so this one is long: one directive is always one line. +
++ Past a certain size the line becomes a script, and that is where the + cookbook starts: pick a + project from anywhere and open it in its own workspace, park a set of workspaces and bring them back later, or have + each tab resume its own agent conversation after a restart. Those are not one-liners, and the recipes do not + pretend otherwise. +
+ ++ This is the normal way to add things, not a shortcut for people who dislike config files. Install the agent skill + from Help ▸ Install Agent Skill…, then ask the agent running + in one of your sessions: +
++ The skill carries the keymap syntax, the full command catalog, the context tokens, and the PATH rule, so the agent + writes a working line instead of guessing at one. The skill is what makes the difference: an agent without it will + still answer, plausibly and wrongly. It is shown last rather than first because the three steps above are what let + you tell those two apart, and what let you change the line afterwards without asking again. +
+ ++ From here, Custom commands & keys has the full keymap syntax and + the bindable actions, the command reference lists every + agtermctl command with its + arguments, and the cookbook + collects worked recipes to copy and edit. +
++ agterm reads a user-editable, kitty-flavored keymap file at + ~/.config/agterm/keymap.conf. It rebinds built-in menu shortcuts and defines custom shell commands bound to keys (and listed in the action + palette). The file is optional — a commented starter is written on first launch, and the directory can be changed in + Settings ▸ Key Mapping. Three verbs; blank lines and + # comments are ignored. +
- Looking for the full list? Every command, with its arguments, return values, and errors, lives on the - Command reference → -
+ # rebind a built-in to a chord (mods joined by +)- agterm can be driven from a script over a local unix-domain socket through the companion CLI, - agtermctl. This is for - fire-and-forget scripting that manages workspaces and sessions, injects text, invokes control actions, and polls a - control-event feed for status and lifecycle changes. There is no terminal-output streaming. +
+ A chord is modifier words (ctrl, cmd, + opt, + shift) joined by + + and a base key (a single + character or tab/space/return/delete/left/right/up/down). A Shift-typed symbol is written + shift+<base> + (e.g. shift+/ for + ?, + shift+= for + +) — the base key, not the + shifted symbol. Custom commands may also use a leader sequence + (ctrl+a>g), and their chord + must include a modifier — a bare key can't shadow a plain terminal key.
-- To open a terminal at a directory without the CLI, - open -a agterm <path> — or - right-click a folder in Finder and choose Open With ▸ agterm. agterm adds a - session in that directory to the last-active window. This works when agterm is already running (its usual state); if it - isn't, launch agterm first, then run the command. The socket equivalent, and the way to place the session precisely, is - agtermctl session new --cwd <path>. +
+ global-hotkey takes exactly one + chord and binds it system-wide: it summons the quick terminal while any + application is frontmost, which no other binding here can do — the rest only fire while agterm has the keyboard. It + must carry a modifier, takes no alternatives and no leader sequence, and a second + global-hotkey line replaces the + first. macOS registers it by physical key position, so it keeps firing on a non-Latin layout. Because the system owns + it rather than agterm, it takes no part in the collision rules below. Note which side wins: the system-wide chord + takes the key even while agterm is in front, so binding one a menu item already uses means that menu shortcut stops + firing. It is unset unless you add the line: agterm ships no default because registering a chord takes it + from every other application on the Mac, and that is not a cost to impose on someone who may never summon + the panel from outside agterm. Spending it on the chord the in-app binding already uses is allowed and is + the way to get one shortcut that works everywhere — + global-hotkey ctrl+` + makes ⌃` summon the panel + from any application, at the price of that chord no longer reaching anything else.
-- Each command targets a session or workspace by its UUID, a unique prefix of that UUID (git-style), or the keyword - active (the selected session / - current workspace). --target - defaults to active, so the - current one rarely needs naming. --target/--workspace take an id, a - prefix, or active — never a - name. For workspaces, - active is the one a new session - lands in: a workspace you just created in the foreground, otherwise the selected session's, otherwise the last one. - A newly created workspace stays the target until the selection changes — to a different session or to none — - or until you delete it or hide it behind the workspace filter. - workspace select moves the - target to the workspace you name, an empty one included. So New Session (and - session new) right after - creating one lands in the new workspace rather than the one you came from. Mutating commands normally print the - affected id; batch - session close and - session move accept repeated - --target options and print the - number of sessions actually changed. Add - --json for the raw response, - or --socket PATH to override - the socket. The exit code is zero on success, non-zero on error. +
+ One binding can offer several alternatives, joined by + | inside a single token with no + spaces around it — + map cmd+t|ctrl+a>t toggle_scratch + fires the action from either, and a command + takes alternatives the same way. For a built-in, the first single-chord alternative the menu can carry becomes the menu + shortcut; every + other alternative, on either verb, is delivered by a key monitor and so must carry a modifier on its first chord. This + is also how a built-in gets a leader sequence, because a menu item holds exactly one key equivalent: + map ctrl+a>s toggle_split binds + the sequence and leaves the action with no menu shortcut at all — its shipped ⌘D is gone rather than kept, and free for + another action to claim. A typo in one alternative rejects the whole line, so a mistake can't hide behind a line that + half worked; an alternative that merely breaks a rule or collides with an existing binding drops on its own and its + siblings keep firing. If a line ends up binding nothing at all, the action simply keeps the shortcut it shipped with. +
++ Chords are written in Latin and keep working on a non-Latin keyboard layout. A layout that cannot type ASCII — + Russian, Greek, Hebrew, Arabic, Thai — resolves every chord by the physical key position, so + cmd+o still fires on the key + marked O even though it types щ. + A layout that can type ASCII binds what it types, so an alternative Latin layout keeps its own letter positions: on + Dvorak, cmd+o follows the O you + actually type.
- agtermctl pick reads nonblank - lines or a JSON array of - {id,label,subtitle?} objects - from stdin and opens agterm's fuzzy picker. It blocks by default and prints the picked, custom, or cancelled result as - bare JSON. Add --no-block to - get the picker id immediately, then use - pick result or - pick cancel. The target tree's - top-level pickPending field - carries that id while the picker waits. -
-- Typing matches item labels only; a subtitle is shown but never searched, so consequence text on one row cannot filter - out its safer neighbour. An empty query lists the items in the order they were supplied, so the caller's first item is - the one Return runs on open. - --query TEXT prefills the field - and filters immediately, which ranks by match score and therefore does not preserve that order. With - --allow-custom the item list may - be empty, which turns the picker into a plain text prompt: the custom row appears as soon as the query is nonblank, - whether prefilled by --query or - typed. An itemless call still reads stdin, so redirect it - (< /dev/null) or it blocks. -
+ toggle_fullscreen is the one + action with no menu item of its own. macOS adds an "Enter Full Screen" item to the View menu whenever that menu is + drawn, and nothing suppresses it, so an item of agterm's own would sit beside it as a duplicate. The binding (⌃⌘F by + default) is handled directly instead, which is why the menu entry advertises the system's Globe+F rather than your + chord. Both work, and rebinding + toggle_fullscreen changes the + chord as usual — it just won't show up next to that menu item. +
+ Tokens expand at fire time (also exported as + $AGT_* env vars on the spawned + process). A token is substituted raw into the shell line, so for content you + don't control — + {AGT_SELECTION}, and also + {AGT_SESSION_NAME}/{AGT_SESSION_PWD} + (a remote host can set these via OSC) — prefer the matching quoted env var, e.g. + "$AGT_SELECTION". +
+ Open the file with File ▸ Edit Keymap… (or the ⌃⇧P palette): it opens in a + 95% overlay running $VISUAL/$EDITOR + (falling back to vi) and + reloads on quit. Apply edits made elsewhere with + File ▸ Reload Keymap or + agtermctl keymap reload. A + malformed line never discards the rest — it surfaces in the diagnostics list in Settings ▸ Key Mapping while the good + lines still apply. +
++ To check what is actually bound, + agtermctl keymap list prints every + built-in with the binds it resolved to (the menu shortcut first, then any alternatives, joined with + |), the custom commands, + each diagnostic in full, and the key equivalents the menu + bar is really carrying. If a binding will not fire, compare the last two: an action whose chord no menu item holds is + usually a menu problem, not a keymap one. Only the menu shortcut can appear there — an alternative never does, and + neither do + undo_close (⌘Z) and + toggle_fullscreen (⌃⌘F), which a + key monitor delivers rather than a menu item. +
++ Looking for the full list? Every command, with its arguments, return values, and errors, lives on the + Command reference → +
++ agterm can be driven from a script over a local unix-domain socket through the companion CLI, + agtermctl. This is for + fire-and-forget scripting that manages workspaces and sessions, injects text, invokes control actions, and polls a + control-event feed for status and lifecycle changes. There is no terminal-output streaming. +
++ To open a terminal at a directory without the CLI, + open -a agterm <path> — or + right-click a folder in Finder and choose Open With ▸ agterm. agterm adds a + session in that directory to the last-active window. This works when agterm is already running (its usual state); if it + isn't, launch agterm first, then run the command. The socket equivalent, and the way to place the session precisely, is + agtermctl session new --cwd <path>. +
++ Each command targets a session or workspace by its UUID, a unique prefix of that UUID (git-style), or the keyword + active (the selected session / + current workspace). --target + defaults to active, so the + current one rarely needs naming. --target/--workspace take an id, a + prefix, or active — never a + name. For workspaces, + active is the one a new session + lands in: a workspace you just created in the foreground, otherwise the selected session's, otherwise the last one. + A newly created workspace stays the target until the selection changes — to a different session or to none — + or until you delete it or hide it behind the workspace filter. + workspace select moves the + target to the workspace you name, an empty one included. So New Session (and + session new) right after + creating one lands in the new workspace rather than the one you came from. Mutating commands normally print the + affected id; batch + session close and + session move accept repeated + --target options and print the + number of sessions actually changed. Add + --json for the raw response, + or --socket PATH to override + the socket. The exit code is zero on success, non-zero on error. +
+ ++ agtermctl pick reads nonblank + lines or a JSON array of + {id,label,subtitle?} objects + from stdin and opens agterm's fuzzy picker. It blocks by default and prints the picked, custom, or cancelled result as + bare JSON. Add --no-block to + get the picker id immediately, then use + pick result or + pick cancel. The target tree's + top-level pickPending field + carries that id while the picker waits. +
++ Typing matches item labels only; a subtitle is shown but never searched, so consequence text on one row cannot filter + out its safer neighbour. An empty query lists the items in the order they were supplied, so the caller's first item is + the one Return runs on open. + --query TEXT prefills the field + and filters immediately, which ranks by match score and therefore does not preserve that order. With + --allow-custom the item list may + be empty, which turns the picker into a plain text prompt: the custom row appears as soon as the query is nonblank, + whether prefilled by --query or + typed. An itemless call still reads stdin, so redirect it + (< /dev/null) or it blocks. +
+- It shares the overlay slot, so a second - hud replaces the first, - session overlay open replaces a - HUD, and ⌘W or - session overlay close takes one - down; a HUD over a running program is refused instead, because a message is replaceable and a program is - not. - session overlay result over a - HUD errors, and - session overlay resize accepts a - percent but refuses --full, - which would cover the session the message is about. - agtermctl tree --json reports - the panel as the session node's - hud object, with - overlay reading false beside it; - there is no event, so a script that needs the state polls the tree. -
- -- The cookbook collects - complete agtermctl - workflows, each in its own directory with a README and, where it needs one, its scripts: switching the sidebar to a - single project, closing a project's workspaces and bringing them back later, picking a path with - fzf and typing it into the - shell, and giving each tab its own Claude Code or Codex conversation across a restart. They are written to be copied - into your own setup and edited, not only read; - cookbook/CONTRIBUTING.md - has the rules for adding one. -
-- Recipes come from other people as well as the maintainer. Every one is reviewed before it is accepted, but they are - shell scripts you run on your own machine against your own sessions, and several close sessions or delete - workspaces, so read a recipe before you run it. -
- - - -- agterm reads a user-editable, kitty-flavored keymap file at - ~/.config/agterm/keymap.conf. It rebinds built-in menu shortcuts and defines custom shell commands bound to keys (and listed in the action - palette). The file is optional — a commented starter is written on first launch, and the directory can be changed in - Settings ▸ Key Mapping. Three verbs; blank lines and - # comments are ignored. -
-- A chord is modifier words (ctrl, cmd, - opt, - shift) joined by - + and a base key (a single - character or tab/space/return/delete/left/right/up/down). A Shift-typed symbol is written - shift+<base> - (e.g. shift+/ for - ?, - shift+= for - +) — the base key, not the - shifted symbol. Custom commands may also use a leader sequence - (ctrl+a>g), and their chord - must include a modifier — a bare key can't shadow a plain terminal key. -
-- global-hotkey takes exactly one - chord and binds it system-wide: it summons the quick terminal while any - application is frontmost, which no other binding here can do — the rest only fire while agterm has the keyboard. It - must carry a modifier, takes no alternatives and no leader sequence, and a second - global-hotkey line replaces the - first. macOS registers it by physical key position, so it keeps firing on a non-Latin layout. Because the system owns - it rather than agterm, it takes no part in the collision rules below. Note which side wins: the system-wide chord - takes the key even while agterm is in front, so binding one a menu item already uses means that menu shortcut stops - firing. It is unset unless you add the line: agterm ships no default because registering a chord takes it - from every other application on the Mac, and that is not a cost to impose on someone who may never summon - the panel from outside agterm. Spending it on the chord the in-app binding already uses is allowed and is - the way to get one shortcut that works everywhere — - global-hotkey ctrl+` - makes ⌃` summon the panel - from any application, at the price of that chord no longer reaching anything else. -
-- One binding can offer several alternatives, joined by - | inside a single token with no - spaces around it — - map cmd+t|ctrl+a>t toggle_scratch - fires the action from either, and a command - takes alternatives the same way. For a built-in, the first single-chord alternative the menu can carry becomes the menu - shortcut; every - other alternative, on either verb, is delivered by a key monitor and so must carry a modifier on its first chord. This - is also how a built-in gets a leader sequence, because a menu item holds exactly one key equivalent: - map ctrl+a>s toggle_split binds - the sequence and leaves the action with no menu shortcut at all — its shipped ⌘D is gone rather than kept, and free for - another action to claim. A typo in one alternative rejects the whole line, so a mistake can't hide behind a line that - half worked; an alternative that merely breaks a rule or collides with an existing binding drops on its own and its - siblings keep firing. If a line ends up binding nothing at all, the action simply keeps the shortcut it shipped with. + --text-color sets the text's + own color and + --background-color the panel's + backing, so the two halves are independent. + An update replaces the whole message, so + --detail, + --spinner and + --text-color have to be repeated + to survive it. The spinner takes a style — + --spinner-style bar|braille|circle|blocks|dot|none, + which turns it on by itself, with + dot blinking rather than + animating — and an update may switch style in place; + --background-color is the + exception, read once when the panel is created and kept — in the panel and in the read-back — across every + update, which is why an update does not take it at all.
- Chords are written in Latin and keep working on a non-Latin keyboard layout. A layout that cannot type ASCII — - Russian, Greek, Hebrew, Arabic, Thai — resolves every chord by the physical key position, so - cmd+o still fires on the key - marked O even though it types щ. - A layout that can type ASCII binds what it types, so an alternative Latin layout keeps its own letter positions: on - Dvorak, cmd+o follows the O you - actually type. + It shares the overlay slot, so a second + hud replaces the first, + session overlay open replaces a + HUD, and ⌘W or + session overlay close takes one + down; a HUD over a running program is refused instead, because a message is replaceable and a program is + not. + session overlay result over a + HUD errors, and + session overlay resize accepts a + percent but refuses --full, + which would cover the session the message is about. + agtermctl tree --json reports + the panel as the session node's + hud object, with + overlay reading false beside it; + there is no event, so a script that needs the state polls the tree.
- toggle_fullscreen is the one - action with no menu item of its own. macOS adds an "Enter Full Screen" item to the View menu whenever that menu is - drawn, and nothing suppresses it, so an item of agterm's own would sit beside it as a duplicate. The binding (⌃⌘F by - default) is handled directly instead, which is why the menu entry advertises the system's Globe+F rather than your - chord. Both work, and rebinding - toggle_fullscreen changes the - chord as usual — it just won't show up next to that menu item. -
- Tokens expand at fire time (also exported as - $AGT_* env vars on the spawned - process). A token is substituted raw into the shell line, so for content you - don't control — - {AGT_SELECTION}, and also - {AGT_SESSION_NAME}/{AGT_SESSION_PWD} - (a remote host can set these via OSC) — prefer the matching quoted env var, e.g. - "$AGT_SELECTION". -
-- Open the file with File ▸ Edit Keymap… (or the ⌃⇧P palette): it opens in a - 95% overlay running $VISUAL/$EDITOR + The cookbook collects + complete agtermctl + workflows, each in its own directory with a README and, where it needs one, its scripts: switching the sidebar to a + single project, closing a project's workspaces and bringing them back later, picking a path with + fzf and typing it into the + shell, and giving each tab its own Claude Code or Codex conversation across a restart. They are written to be copied + into your own setup and edited, not only read; + cookbook/CONTRIBUTING.md - (falling back to vi) and - reloads on quit. Apply edits made elsewhere with - File ▸ Reload Keymap or - agtermctl keymap reload. A - malformed line never discards the rest — it surfaces in the diagnostics list in Settings ▸ Key Mapping while the good - lines still apply. + has the rules for adding one.
-- To check what is actually bound, - agtermctl keymap list prints every - built-in with the binds it resolved to (the menu shortcut first, then any alternatives, joined with - |), the custom commands, - each diagnostic in full, and the key equivalents the menu - bar is really carrying. If a binding will not fire, compare the last two: an action whose chord no menu item holds is - usually a menu problem, not a keymap one. Only the menu shortcut can appear there — an alternative never does, and - neither do - undo_close (⌘Z) and - toggle_fullscreen (⌃⌘F), which a - key monitor delivers rather than a menu item. +
+ Recipes come from other people as well as the maintainer. Every one is reviewed before it is accepted, but they are + shell scripts you run on your own machine against your own sessions, and several close sessions or delete + workspaces, so read a recipe before you run it.
-