-
Notifications
You must be signed in to change notification settings - Fork 4
CLI Machines Workspace
ed machines workspace reads and writes the saved multi-pane layouts the app's
Workspace view shows. Reach for it when you want an arrangement of machines and
screens ready before the window opens, when a script should retarget a pane at
whichever machine it just built, or when you want to know what the window is
about to show without opening it.
A workspace is a named layout: an id, a tree of panes, the id of the focused
pane, and optionally the id of a maximized one. Several workspaces can be saved
at once and exactly one of them is current, which is the one the view opens on
and the one every pane verb here acts on unless --workspace names another.
A pane is one rectangle in that tree. It holds one or more tabs and
remembers which of them is selected. A tab is a target: one machine and one
screen. ed builds panes with exactly one tab, and it only ever reads or writes
the selected one; a pane with several tabs came from the app's tab strip, and
ed reports all of them but adds and removes none.
Panes are held together by splits. A split has an axis, horizontal or
vertical, an ordered list of children, and a ratio for each child. ed never
sets a ratio by hand: split gives the new pane an equal share and rescales its
siblings, and equalize levels every split in the tree.
A screen is what a pane draws. There are six, and every one of them is
accepted anywhere a --screen goes:
| Screen | What the pane shows |
|---|---|
overview |
The machine's overview: CPU, memory, disks, uptime. |
processes |
The process list. |
docker |
The Docker console: containers, images, volumes. |
terminal |
A terminal on the machine. |
files |
The Finder pane for that machine. |
tools |
The Tools tab: port forwards, snippets, services and power. |
Panes are numbered from 1 in the order the tree flattens: depth first, children in order, so left to right inside a horizontal split and top to bottom inside a vertical one. The number is a position rather than an id: every split inserts a pane into that order and pushes the rest along, every close takes one out, and splitting to the left of or above pane 1 makes the new pane pane 1.
Compare, before Compare, after `split 1 tuf --side bottom`
1 Asus TUF 7 overview 1 Asus TUF 7 overview
2 mini docker 2 Asus TUF 7 overview
3 mini docker
The whole set lives in one file,
~/Library/Application Support/Edith/machines/workspaces.json, holding the list
of layouts and the id of the current one. Nothing in this group talks to Edith
for its data, so every verb works whether or not the app is running. Each write
does post the app's machinesChanged notification afterwards, and a running
Edith does not use it to reload workspaces, which is the one thing worth reading
Notes and gotchas for before you script against a machine
that has Edith open.
| Command | What it does |
|---|---|
ed machines workspace |
Runs ed machines workspace ls, which is the default subcommand. |
ed machines workspace ls |
Lists the saved workspaces, their pane and machine counts, and which is current. |
ed machines workspace use <workspace> |
Makes one workspace the current one. |
ed machines workspace new <machines>... |
Builds a workspace with one pane per machine, tiled side by side. |
ed machines workspace rename <workspace> <name> |
Renames a workspace, leaving which one is current alone. |
ed machines workspace rm <workspace> |
Forgets a workspace. |
ed machines workspace panes |
Lists the panes in a workspace, what each shows, and which is focused. |
ed machines workspace split <pane> <machine> |
Splits a pane and points the new one at a machine and a screen. |
ed machines workspace close <pane> |
Closes a pane. |
ed machines workspace point <pane> [<machine>] |
Retargets a pane's selected tab without splitting anything. |
ed machines workspace equalize |
Evens out every split in the workspace. |
ed machines workspaces is the same group under a second name, and the verbs
carry aliases too: list for ls, remove for rm, and even for
equalize. ed machines workspace with nothing after it runs ls, including
its flags, so ed machines workspace --json is
ed machines workspace ls --json.
Five verbs take --workspace to act on a layout other than the current one:
panes, split, close, point and equalize. The three that operate on a
whole workspace, use, rename and rm, take it as a positional argument
instead, and new takes none because it is making one.
Lists every saved workspace.
Usage:
ed machines workspace ls [--json]
Options:
| Name | Type / values | Default | What it does |
|---|---|---|---|
--json |
flag | off | Emits one JSON document on stdout. |
There are no positional arguments and no filters: ls always prints the whole
file, in the order the layouts are stored rather than sorted.
--json shape, an array with one object per workspace:
[
{
"current": true,
"id": "A494FD58-CB43-4068-8325-655E86794590",
"machines": 2,
"name": "Compare",
"panes": 2
},
{
"current": false,
"id": "6C1D0E22-5A77-4B3E-9C48-2F0A7D5B4E31",
"machines": 1,
"name": "Asus TUF 7 x3",
"panes": 3
}
]id is the layout's UUID, which use, rename, rm and --workspace all
accept in place of the name. panes counts the rectangles; machines counts
the distinct machines across every tab of every pane, so a workspace with three
panes on one machine reports "panes": 3, "machines": 1. current is true for
exactly one row while any workspace exists.
Examples:
ed machines workspace ls
ed machines workspace --json
ed machines workspace ls --json | jq -r '.[] | select(.current).name'
The table is the same four columns with the last one unlabelled, holding
current on one row and nothing on the others:
$ ed machines workspace ls
NAME PANES MACHINES
Compare 2 2 current
Behaviour: ls reads the file, writes nothing, posts nothing, and needs neither
the main app nor the menu bar helper. An empty or missing file is not an error:
without --json it writes no workspaces are saved to stderr, leaves stdout
empty and exits 0, and with --json it prints [] and exits 0. ls and new
are the only verbs in this group that do not need a saved workspace already, so
use ls when you are probing rather than acting. An unreadable or undecodable
file decodes to an empty store, which is indistinguishable from never having
saved one.
Makes one workspace the current one.
Usage:
ed machines workspace use <workspace> [--json]
Arguments:
| Name | Type / values | Default | What it does |
|---|---|---|---|
<workspace> |
name, id, or unambiguous name prefix | required | Which workspace to switch to. Case-insensitive. |
Options:
| Name | Type / values | Default | What it does |
|---|---|---|---|
--json |
flag | off | Emits one JSON document on stdout. |
--json shape, the same object ls emits for one row, with current always
true because it just became so:
{
"current": true,
"id": "A494FD58-CB43-4068-8325-655E86794590",
"machines": 2,
"name": "Compare",
"panes": 2
}Examples:
ed machines workspace use Compare
ed machines workspace use comp
ed machines workspace use A494FD58-CB43-4068-8325-655E86794590
ed machines workspace use Compare --json
$ ed machines workspace use Compare
now showing Compare
Behaviour: use writes the current pointer and nothing else; the layout itself
is untouched. Names resolve in a fixed order: an exact case-insensitive name
first, then the id, then a unique case-insensitive name prefix. A prefix that
matches more than one workspace exits 3 and lists the matches rather than
guessing, and a name that matches none exits 3 with every known name as the
hint:
$ ed machines workspace use nope
error: no workspace called nope
hint: known: Compare
Running use when no workspaces are saved exits 4, because there is nothing to
switch to rather than something you named wrongly.
Builds a workspace with one pane per machine.
Usage:
ed machines workspace new <machines>... [--screen <screen>] [--name <name>] [--json]
Arguments:
| Name | Type / values | Default | What it does |
|---|---|---|---|
<machines>... |
one or more machine names, ssh aliases, ids or unambiguous prefixes | at least one required | Gives each named machine a pane, in the order you list them. |
Options:
| Name | Type / values | Default | What it does |
|---|---|---|---|
--screen |
overview, processes, docker, terminal, files, tools
|
overview |
What every pane shows. One value for the whole workspace; retarget individual panes afterwards with point. |
--name |
text | the machine names joined with +
|
What to call the workspace. |
--json |
flag | off | Emits one JSON document on stdout. |
The --screen help text in ed machines workspace new --help lists five
screens and omits tools; the value is accepted all the same, and the error
you get from a bad one lists all six.
--json shape, the new workspace, always current:
{
"current": true,
"id": "1F2C77B0-9A34-4C51-B0E7-6D9E42A31C08",
"machines": 2,
"name": "Asus TUF 7 + mini",
"panes": 2
}Examples:
ed machines workspace new tuf
ed machines workspace new tuf mini --screen terminal
ed machines workspace new tuf mini --name "Deploy" --screen docker
ed machines workspace new tuf tuf tuf --screen files --json
$ ed machines workspace new tuf mini --screen terminal
made Asus TUF 7 + mini with 2 pane(s)
Behaviour: new is the Workspace toolbar's Layout menu as a command. One
machine gives a single pane with no split at all; several give one horizontal
split with equal ratios, tiled left to right in the order you named them. Every
machine is resolved before anything is written, so an unknown or ambiguous name
exits 3 and no workspace is created.
The new workspace is appended to the file and becomes current, so new always
switches you. Names are not checked for uniqueness: making two workspaces called
Deploy leaves both in the file, and every later lookup by that name finds the
first one, which makes the second reachable only by its id. Pass --name if you
are scripting this.
Repeating a machine is allowed and gives it a pane each time, which is how you
get four panes on one machine, every one of them on the single --screen you
named until point sends them elsewhere. The machines count in the JSON
counts distinct machines, so that workspace reports four panes and one machine.
An empty machine list is caught by the parser and exits 2 with
Missing expected argument '<machines> ...'; the command's own guard behind it,
name at least one machine, exits 1 and is only reachable if the parser ever
lets an empty list through.
Renames a workspace.
Usage:
ed machines workspace rename <workspace> <name> [--json]
Arguments:
| Name | Type / values | Default | What it does |
|---|---|---|---|
<workspace> |
name, id, or unambiguous name prefix | required | Which workspace to rename. Case-insensitive. |
<name> |
text | required | The new name. Leading and trailing whitespace is trimmed. |
Options:
| Name | Type / values | Default | What it does |
|---|---|---|---|
--json |
flag | off | Emits one JSON document on stdout. |
--json shape, the renamed workspace:
{
"current": true,
"id": "A494FD58-CB43-4068-8325-655E86794590",
"machines": 2,
"name": "Fleet",
"panes": 2
}Examples:
ed machines workspace rename Compare Fleet
ed machines workspace rename comp "Two machines"
ed machines workspace rename A494FD58-CB43-4068-8325-655E86794590 Fleet --json
$ ed machines workspace rename Compare Fleet
renamed Compare to Fleet
Behaviour: rename changes the name and nothing else. It captures which
workspace is current before it writes and puts it back afterwards, so renaming a
workspace you are not using does not switch you to it, unlike new.
A name that is empty or only whitespace is refused and exits 1 with
a workspace needs a name. The old name is not freed for anything: the file
allows duplicates, so renaming one workspace onto another's name is accepted and
leaves you with two rows that resolve to the first.
The current field in the JSON is read from the stored pointer rather than the
effective one. When no workspace has ever been made current, ls shows the
first row as current and rename reports "current": false for that same row.
Run use once if you want the two to agree.
Forgets a workspace.
Usage:
ed machines workspace rm <workspace> [--json]
Arguments:
| Name | Type / values | Default | What it does |
|---|---|---|---|
<workspace> |
name, id, or unambiguous name prefix | required | Which workspace to delete. Case-insensitive. |
Options:
| Name | Type / values | Default | What it does |
|---|---|---|---|
--json |
flag | off | Emits one JSON document on stdout. |
There is no --yes guard here, unlike ed machines rm: this takes effect the
moment you run it.
--json shape, its own shape rather than the one the other whole-workspace
verbs share:
{
"remaining": 1,
"removed": "Compare"
}removed is the name of what went, and remaining is how many workspaces are
left in the file.
Examples:
ed machines workspace rm Compare
ed machines workspace rm comp --json
$ ed machines workspace rm Compare
removed Compare
Behaviour: rm deletes the layout outright. Nothing is moved to a trash and
there is no undo, so a workspace you built pane by pane is worth recreating with
a new plus a few splits rather than fetching back.
Removing the current workspace moves the pointer to whatever is now first in the
file; removing any other leaves the pointer alone. Removing the last one leaves
an empty store, at which point every verb except ls and new exits 4 until
you make one again.
Lists the panes in a workspace and what each one shows.
Usage:
ed machines workspace panes [--workspace <workspace>] [--json]
Options:
| Name | Type / values | Default | What it does |
|---|---|---|---|
--workspace |
name, id, or unambiguous name prefix | the current workspace | Which workspace to describe. |
--json |
flag | off | Emits one JSON document on stdout. |
There are no positional arguments.
--json shape, shared by panes, split, close, point and equalize, all
five of which print the workspace as it stands after they are done:
{
"panes": [
{
"focused": false,
"index": 1,
"tabs": [
{
"machine": "Asus TUF 7",
"screen": "overview",
"selected": true
}
]
},
{
"focused": true,
"index": 2,
"tabs": [
{
"machine": "mini",
"screen": "docker",
"selected": true
},
{
"machine": "mini",
"screen": "terminal",
"selected": false
}
]
}
],
"workspace": "Compare"
}index is the number every pane verb takes. focused marks the one pane the
window would have focused, and selected marks the one tab in each pane that is
showing. machine is the machine's display name looked up from the machine
list, not its id; a pane pointed at a machine that is no longer in the list
reads "machine": "removed machine" rather than disappearing.
Examples:
ed machines workspace panes
ed machines workspace panes --workspace Compare
ed machines workspace panes --json
ed machines workspace panes --json | jq -r '.panes[] | select(.focused).index'
The table is four columns: the pane number, an unlabelled focus column, the machine, and the screen. It prints one row per pane, showing the selected tab only, so a pane with three tabs still gets one line:
$ ed machines workspace panes
# MACHINE SHOWING
1 removed machine overview
2 focused Asus TUF 7 overview
Behaviour: panes reads two files, the workspaces and the machine list, and
writes neither. It needs no app. --workspace resolves exactly the way the
positional argument of use does, and naming one that does not exist exits 3.
With no workspaces saved at all it exits 4, --workspace or not.
removed machine in that transcript is the local Mac. The app can put a pane on
This Mac, which is not an entry in the machine list, so ed has no name for it
and reports it as removed. That is the state of a default workspace built by the
app, and there is no way to point a pane back at This Mac from ed.
Splits a pane in two and points the new one at a machine and a screen.
Usage:
ed machines workspace split <pane> <machine> [--side <side>] [--screen <screen>]
[--workspace <workspace>] [--json]
Arguments:
| Name | Type / values | Default | What it does |
|---|---|---|---|
<pane> |
integer, 1 to the pane count | required | Which pane to split, counting from 1 as panes numbers them. |
<machine> |
machine name, ssh alias, id or unambiguous prefix | required | What the new pane points at. |
Options:
| Name | Type / values | Default | What it does |
|---|---|---|---|
--side |
left, right, top, bottom
|
right |
Which side of the existing pane the new one goes on. left and right split horizontally, top and bottom vertically. |
--screen |
overview, processes, docker, terminal, files, tools
|
overview |
What the new pane shows. |
--workspace |
name, id, or unambiguous name prefix | the current workspace | Which workspace to split a pane in. |
--json |
flag | off | Emits one JSON document on stdout. |
--json shape: the workspace after the split, in the shape panes prints. The
new pane is the focused one.
Examples:
ed machines workspace split 1 mini
ed machines workspace split 1 mini --side bottom --screen terminal
ed machines workspace split 2 tuf --screen docker --workspace Fleet
ed machines workspace split 1 mini --json
$ ed machines workspace split 1 mini --side bottom --screen terminal
split pane 1 to the bottom; 3 panes now
Behaviour: this is the pane header's split menu, which offers Split Right and
Split Down and reuses the pane's own target; ed reaches all four sides and
makes you say what the new pane points at. The new pane carries exactly one
tab, on the machine and screen you named, and becomes the focused pane. Where
it lands depends on what is already there. If the pane you split already sits
in a split running along the same axis, the newcomer joins as a sibling: it
takes an equal share and every
existing sibling is scaled down to make room, so three panes in a row stay a row
rather than becoming a row containing a row. Otherwise the pane is replaced by a
fresh split of the two, half and half.
--side left and --side top insert before the pane you named, which means the
new pane takes that pane's number and everything after it shifts up by one. Read
panes again rather than assuming the number you split is still the same pane.
Nothing is written until every argument checks out, and they are checked in this order: the pane number, the machine, the side, then the screen. A bad pane number exits 3 and says how many the workspace has; an unknown machine exits 3 with the known machines in the hint; a bad side or screen exits 3 and lists the accepted values:
$ ed machines workspace split 7 tuf
error: there is no pane 7 in Compare
hint: it has 2, numbered from 1
$ ed machines workspace split 1 tuf --side sideways
error: no side called sideways
hint: sides: left, right, top, bottom
There is no cap on the number of panes and no check that a screen suits the
machine. --screen docker on a machine without Docker is accepted here and
fails later, in the pane, where the app's own tab menu would simply not have
offered it.
Closes a pane.
Usage:
ed machines workspace close <pane> [--workspace <workspace>] [--json]
Arguments:
| Name | Type / values | Default | What it does |
|---|---|---|---|
<pane> |
integer, 1 to the pane count | required | Which pane to close, counting from 1. |
Options:
| Name | Type / values | Default | What it does |
|---|---|---|---|
--workspace |
name, id, or unambiguous name prefix | the current workspace | Which workspace to close a pane in. |
--json |
flag | off | Emits one JSON document on stdout. |
There is no --yes guard: the pane goes the moment you run it, along with every
tab in it.
--json shape: the workspace after the close, in the shape panes prints.
Examples:
ed machines workspace close 3
ed machines workspace close 1 --workspace Fleet
ed machines workspace close 2 --json
$ ed machines workspace close 3
closed pane 3; 2 left
Behaviour: this is Close Pane in the same pane menu, which the app greys out on
a single-pane workspace. Closing a pane removes it from the tree and then tidies
the tree around it. A split left with one child collapses into that child, and
a split nested inside another on the same axis is flattened into it, with ratios
multiplied through so the panes that remain keep their relative sizes. The
practical effect is that pane numbers after a close are not simply the old ones
minus one; run panes again.
If the pane you closed was the focused one, focus moves to the first pane. If it was the maximized one, nothing is maximized any more.
The last pane cannot be closed, because a workspace with no panes has nothing to
draw. That check runs before the pane number is even looked at, so on a
single-pane workspace every close reports the same thing and exits 1,
including close 9:
$ ed machines workspace close 1
error: Compare has one pane left, and a workspace needs one
hint: remove the whole thing with `ed machines workspace rm`
Points a pane at a different machine, a different screen, or both, without splitting anything.
Usage:
ed machines workspace point <pane> [<machine>] [--screen <screen>]
[--workspace <workspace>] [--json]
Arguments:
| Name | Type / values | Default | What it does |
|---|---|---|---|
<pane> |
integer, 1 to the pane count | required | Which pane to retarget, counting from 1. |
<machine> |
machine name, ssh alias, id or unambiguous prefix | optional | The machine to point at. Leave it out to change only the screen. |
Options:
| Name | Type / values | Default | What it does |
|---|---|---|---|
--screen |
overview, processes, docker, terminal, files, tools
|
unchanged | The screen to show. Leave it out to change only the machine. |
--workspace |
name, id, or unambiguous name prefix | the current workspace | Which workspace the pane is in. |
--json |
flag | off | Emits one JSON document on stdout. |
At least one of <machine> and --screen is required. Giving neither exits 1:
$ ed machines workspace point 1
error: say a machine, a --screen, or both
--json shape: the workspace after the change, in the shape panes prints.
Examples:
ed machines workspace point 1 mini
ed machines workspace point 1 --screen terminal
ed machines workspace point 2 tuf --screen files
ed machines workspace point 1 mini --workspace Fleet --json
$ ed machines workspace point 2 tuf --screen files
pane 2 now shows files on Asus TUF 7
Behaviour: point is the Workspace tab strip's machine picker as a command. It
rewrites the selected tab of that pane in place, leaving the tree, the ratios,
the focus and every other tab exactly as they were. On a pane with several tabs
it changes only the one that is showing; there is no way to address the others
from ed.
The unchanged half really is left alone: point 1 mini keeps whatever screen
the pane was on, and point 1 --screen terminal keeps whatever machine it was
pointed at. The confirmation line is assembled from the parts you gave, so with
only a machine it reads pane 1 now shows on mini, with the gap where the
screen would have been.
The pane number is checked first, then the machine, then the screen, and nothing is written until all three are good. A bad screen exits 3 and names the six:
$ ed machines workspace point 1 --screen bogus
error: no screen called bogus
hint: screens: overview, processes, docker, terminal, files, tools
Evens out every split in a workspace.
Usage:
ed machines workspace equalize [--workspace <workspace>] [--json]
Options:
| Name | Type / values | Default | What it does |
|---|---|---|---|
--workspace |
name, id, or unambiguous name prefix | the current workspace | Which workspace to level. |
--json |
flag | off | Emits one JSON document on stdout. |
There are no positional arguments, and there is no way to equalize one split rather than all of them.
--json shape: the workspace, in the shape panes prints. The ratios it just
changed are not part of that document, so the JSON before and after are
identical.
Examples:
ed machines workspace equalize
ed machines workspace even
ed machines workspace equalize --workspace Fleet --json
$ ed machines workspace equalize
evened out 3 panes
Behaviour: equalize walks the tree and gives every child of every split an
equal share, which is the equal-square button in the Workspace toolbar. It is
the only verb here that touches ratios, and ratios are the only thing it
touches: no pane moves, nothing is retargeted, focus does not change.
A workspace whose root is a single pane has no split to level, so the command
does nothing to the layout and still reports evened out 1 panes. It writes the
file and posts the notification either way, so it is never a pure read even when
it changes nothing.
| Code | When this group produces it |
|---|---|
| 0 | The listing or the change succeeded. Also ls on an empty store, equalize on a single-pane workspace, and --help on the group or any verb. |
| 1 | The file could not be written, with the system's own description in the message. Also close on the last pane, rename to a blank name, point with neither a machine nor a --screen, and new with a machine list the parser let through empty. |
| 2 | The command line was wrong in ArgumentParser's own terms: an unknown flag, a missing <workspace>, <name>, <pane> or <machines>, or a <pane> that is not an integer. |
| 3 | Something you named does not exist: a workspace name or prefix that matches none or several, a pane number below 1 or above the count, a --screen or --side outside the accepted values, or a machine name that matches none or several. |
| 4 | No workspaces are saved at all, and the verb needs one. Every verb except ls and new produces this on an empty store. |
Exit 4 here never means the app is missing. Nothing in this group waits on
Edith, and the only thing that reports itself unavailable is an empty store,
which you fix with ed machines workspace new rather than by opening the app.
- A running Edith holds the workspace file in memory and does not reload it.
The Workspace view reads
workspaces.jsononce, when it is first built, and writes its whole in-memory store back on every change it makes. ThemachinesChangednotificationedposts after each write is observed by the machine list, not by the workspace model, so a layout built from the CLI while the app is open does not appear, and the app's next pane change saves its older copy over yours. Do CLI workspace work while Edith is closed, or quit and reopen it to pick up what you wrote. - The app's Layout menu replaces the whole file. Choosing Compare two machines,
Docker everywhere, Terminal grid, Files side by side or Single pane does not
add a workspace: it sets the saved list to exactly that one layout. Every
workspace
edsaved is gone at that point.ed machines workspace newbuilds the same kind of layout and appends it instead. - This Mac cannot be reached from here. The app's machine list starts with a
built-in local machine that is not in
machines.json, soMachineResolvernever finds it andpanesprintsremoved machinefor any pane pointing at it. A workspace the app built for you almost certainly contains one. -
toolsis a valid--screenonnew,splitandpoint, even though the help text fornew --screenlists only five values. The hint you get from a bad screen is generated from the enum and lists all six in their declared order:overview, processes, docker, terminal, files, tools. - Screen availability is not checked against the machine. The app hides
dockerfor a machine with no Docker daemon and offers onlyoverview,processes,filesandterminalfor This Mac;edaccepts anything and lets the pane deal with it. - Workspace names are not unique, and only
renamechecks one at all: it trims and refuses a blank, whilenew --namestores whatever you pass, whitespace included. Two workspaces can share a name; lookups take the first, so the second is addressable only by its id.ls --jsonis where you get ids. - Workspace lookup is name, then id, then unique prefix, and it is case-insensitive throughout. There is no ssh-alias step here, unlike machine lookup, because a workspace has only the one name.
- Which workspace is current is stored as an id, and an absent or dangling one
falls back to the first in the file.
lsshows that fallback as current;renamereports"current": falsefor it, because it reads the stored pointer rather than the effective one. Oneusemakes them agree. -
newswitches you to the workspace it made.useswitches you deliberately. Nothing else does:renamerestores the pointer it found, and the five pane verbs preserve it, so editing another workspace through--workspaceleaves you where you were. The one exception is a store that has never had a current workspace, where a pane edit makes the edited layout current. - Pane numbers are positions in a flattened tree, not ids, and both
splitandclosecan renumber panes other than the one you named. Anything that touches more than one pane should re-readpanesbetween steps, or work from the highest number down. -
edwrites one tab per pane and reads the selected tab only. Extra tabs come from the app, survive everything here, and show up inpanes --json. There is no verb to add, close, select or reorder a tab, and none to set focus or to maximize a pane;splitandclosemove focus as a side effect and that is the whole of it. - Every mutating verb rewrites the entire file atomically from what it just
read. Two
edprocesses editing different workspaces at the same moment leave only the later change, and a running app counts as a third writer. - The file on disk is compact JSON with keys in whatever order the encoder
produced. The pretty, alphabetically sorted documents
--jsonprints are generated fresh and are not what is stored, so do not diff one against the other. - The layout also carries a
maximizedpane id, whichednever sets and only ever clears, when the maximized pane is the one you close. Split ratios are the other stored value no--jsondocument reports:splitandequalizeset them in bulk, dragging a divider in the window sets one by hand, and nothing here reads them back to you. - Completion knows the verbs and the machine slots.
ed machines workspace <TAB>offers the ten subcommands, and the machine argument ofsplitandpointand the machine list ofnewcomplete against your machines. The workspace slots ofuse,renameandrmcomplete nothing, and neither do pane numbers or the values of--workspace,--screenand--side. Writing an option before the positionals, as insplit --screen docker 1 <TAB>, also costs you the machine completion, because the option's value is counted as a positional when the slot is worked out. -
--helpworks on the group and on all ten verbs, prints on stdout and exits 0.--versionis inherited from the root and works on any of them.
-
ed machines, for the machine list every pane points into, and for adding the machines you want panes for. -
ed machines filesanded machines docker, the command line forms of two of the screens a pane can show. - Running commands on a machine, which is the terminal screen's counterpart.
-
Conventions and contracts, for the exit code table and the
--jsonguarantee in full. -
All
edcommands.
Auto-generated from docs/, edit the docs in the repo, not the wiki.
CLI reference
Companion
- Deploy
- Concepts
- Concepts Memory
- Concepts Ingestion
- Concepts Search
- Concepts Chat
- Concepts Learning
- Concepts Brain
- Concepts Friend
- Hosts
- Stack
- Status
- Doctor
- Search
- Index
- Ingest
- Episodes
- Sync
- Observations
- Reflect
- Beliefs
- Ask
- Extract
- Claims
- Corroborate
- Runs
- Chat
- Conversations
- Forget
- Export
- Import
- Erase
- Wipe
- Episode
- Nightly
- Reason
- Personas
- Council
- Lenses
- Core
- Why
- Hypotheses
- Predictions
- Commitments
- Discrepancies
- Calibration
- Inquire
- Entities
- Eval
- Standup
- Machines
- Baselines
- Connectors
- Facts
- Correct
- Weekly
- Db
Guides