-
Notifications
You must be signed in to change notification settings - Fork 4
CLI Extensions
Extensions are the features Edith can turn on and off: panel tabs, menu bar
items, and the things that run in the background. Each one is a single boolean
in Edith's shared preferences, and ed extensions is the registry in front of
those booleans. They get their own verbs rather than living only under
ed config because turning one on can need a macOS permission Edith has not
been granted yet, and because the registry knows the readable name, the group
and the permission list that a bare key does not.
Everything here reads and writes
UserDefaults(suiteName: "com.pulkit.edith.shared"), so all four commands work
whether or not Edith is running. A write posts settingsChanged, so a running
app picks the change up live and a closed one picks it up the next time it
launches. Nothing in this group waits on the app, and nothing in it can exit 4.
| Command | What it does |
|---|---|
ed extensions |
Runs ls, which is the default subcommand |
ed extensions ls |
Every extension, its group, and whether it is on. list is an alias |
ed extensions enable <id> |
Turns one on, and names on stderr any required permission still missing |
ed extensions disable <id> |
Turns one off |
ed extensions info <id> |
Describes one: name, summary, key, group, state, permissions |
ExtensionRegistry.entries in EdithKit is the single list every command here
walks, and its order is the order ls prints. Fifteen entries, in this order:
| ID | Name | Group | What it does |
|---|---|---|---|
usage |
Agent Usage | Agent | Claude and Codex limits, usage stats, and alerts |
herdr |
Herdr | Agent | Live Herdr sessions on this Mac and your SSH machines |
system |
System | System | Running apps, prevent sleep, and the keyboard-cleaning lock |
machines |
Machines | System | Your other computers over SSH: stats, files, Docker, and a terminal |
companion |
Companion | Agent | Your notes, voice memos and activity, remembered and searchable |
systemStats |
CPU & Memory in menu bar | System | Live CPU and memory readout as a menu bar item |
micMute |
Mic Mute | System | Mute every microphone system-wide with ⌘⇧M or the menu bar icon |
lidAwake |
Lid Awake | System | Keeps this Mac running with the lid shut, on battery and unplugged |
music |
Music | Media | Plays your local music folder, with media keys |
calendar |
Calendar | Media | Shows your schedule in the panel and the app |
notchShelf |
Notch Shelf | Media | File shelf, now playing, camera, and alerts around the notch |
clipboard |
Clipboard | Utilities | Clipboard history with instant paste |
focusDim |
Focus Dim | Utilities | Dims everything behind your active app |
presenter |
Presenter | Utilities | Blurs sensitive numbers while sharing your screen |
colorPicker |
Color Picker | Utilities | System loupe on a hotkey, sampled color to your clipboard |
The same fifteen, with what each one is made of. Key is the preference the app
reads, and the key ed config writes for the same feature. Featured marks the
six the welcome tour shows before you ask it for all of them.
| ID | Key | Featured | Required permissions | Optional permissions | Required tools |
|---|---|---|---|---|---|
usage |
tabUsageEnabled |
yes | none | notifications |
claude, codex
|
herdr |
tabHerdrEnabled |
yes | none | none | none |
system |
tabSystemEnabled |
yes | none |
accessibility, inputMonitoring
|
none |
machines |
tabMachinesEnabled |
yes | none | notifications |
none |
companion |
tabCompanionEnabled |
no | none | none | none |
systemStats |
menuBarSystemStats |
no | none | none | none |
micMute |
micMuteEnabled |
no | none | none | none |
lidAwake |
lidAwakeEnabled |
no | none | none | none |
music |
tabMusicEnabled |
no | none | none | yt-dlp |
calendar |
tabCalendarEnabled |
no | calendar |
none | none |
notchShelf |
notchShelfEnabled |
yes | none |
bluetooth, camera, automation
|
none |
clipboard |
clipboardEnabled |
yes | none | accessibility |
none |
focusDim |
focusDimEnabled |
no | screenRecording |
none | none |
presenter |
presenterEnabled |
no | screenRecording |
none | none |
colorPicker |
colorPickerEnabled |
no | screenRecording |
none | none |
The JSON form also exposes the platform capability registry. Capabilities are not permission ids. They say which implementation an extension requires from the current platform, and which missing implementations merely degrade it:
| ID | Required capabilities | Optional capabilities |
|---|---|---|
usage |
usageCollection |
notifications |
herdr |
herdrSessions |
none |
system |
runningApplications |
preventSleep, inputSuppression
|
machines |
machineManagement |
notifications |
companion |
companionService |
none |
systemStats |
systemMetrics |
none |
micMute |
microphoneControl |
globalShortcuts |
lidAwake |
preventSleep |
none |
music |
localMusicPlayback |
mediaControls |
calendar |
calendarEvents |
none |
notchShelf |
fileShelf |
bluetoothMonitoring, cameraPreview, externalMediaControl
|
clipboard |
clipboardHistory |
globalPaste, globalShortcuts
|
focusDim |
windowDimming |
none |
presenter |
screenShareDetection |
none |
colorPicker |
screenColorSampling |
globalShortcuts |
An id is matched exactly and case-insensitively against the ID column first,
then against the Key column, so ed extensions info clipboard,
ed extensions info CLIPBOARD and ed extensions info clipboardEnabled are the
same command. There is no prefix matching here: unlike a machine name, clip
fails with the full list of ids rather than guessing.
| Code | When |
|---|---|
| 0 | the extension was listed, described, enabled or disabled, including when enable had to warn about a missing permission |
| 2 | the command line was wrong: an unknown flag, or enable, disable or info with no id |
| 3 | no extension matches the id you named, by id or by defaults key |
Nothing in this group produces 1 or 4. There is no app to be unavailable and no failure mode between "the id exists" and "the boolean is written".
- The state
lsandinforeport isobject(forKey:) as? Bool ?? false, so a key that has never been written reads as off.ed config getanswers the same question from the catalogue's fallback instead, which istruefortabUsageEnabledandtabSystemEnabled, so on a Mac where Edith has never run those two disagree. Upgrading from an older Edith writes a concrete value for all fifteen keys on the next launch and they agree again; a fresh install only writes the keys you turn on, so an untouchedtabUsageEnabledkeeps disagreeing until something writes it. - Every extension is also an ordinary
ed configboolean, and both paths write the same key in the same store and post the samesettingsChanged.ed config set clipboardEnabled trueanded extensions enable clipboardleave identical state; only the second one knows to mention Accessibility. Related settings sit in that extension's own config group, soed config ls --group clipboardand--group notch,--group focusdimor--group colorpickergive you the rest of the knobs. - The permission check reads what the app last mirrored into preferences, not
live TCC state, because a command line process cannot read another
application's grants. If a note names a permission you know you have already
granted, run
ed permissions refreshand try again. -
bluetoothandautomationare granted by macOS on first use and have no mirrored key, so they are always reported as not granted. That is why they appear only as optional permissions, onnotchShelf, and never inmissingRequiredPermissions. -
requiredToolsis reported verbatim from the registry. The app's provisioning sheet filters that list by whether the tool is currently wanted, which dropscodexwhilecodexLimitsEnabledis off;eddoes not filter, sousagealways lists bothclaudeandcodex. - Ordering is stable and worth relying on: the array
--jsonemits follows the registry's own order, and only the keys inside each object are sorted, which is why the output diffs cleanly between runs. - Enabling from
eddoes not stamp theextensionPermissionsSeen.<id>marker the Extensions pane writes when you flip a switch there. The pane still reads it, butExtensionPermissionFlow.decisionignores the value, so the two paths still end up equivalent. - The
lsrenderer flattens tabs and newlines to spaces and drops control characters, so a row is always one line, and the last column is never padded.
-
ed permissionsfor granting what an extension needs -
ed configfor the settings an extension exposes once it is on -
ed toolsfor the command line toolsrequiredToolsnames - 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