nd
Drive the running notedeck from the command line via the `nd` CLI (crates/nd_cli) — list its tools and call any of them over its local socket, or spawn a Dave session, e.g. open a headway card or agen
SKILL.md.claude/skills/nd/SKILL.md
GitHubnd: notedeck's tools from a shell
nd talks to the running notedeck over its per-user socket
(notedeck_ipc::socket_path(), overridden by $NOTEDECK_SOCKET). Every run
fetches the tool list from the app, so it always matches what's running and
there's nothing to keep in sync. Source: crates/nd_cli.
Running it
cargo run -q -p nd_cli -- tools # or the built target/debug/nd
Commands
nd tools [--json] [<pattern>]— every tool, grouped by category, markeddata/uiandro(read-only). A pattern filters by name, title or description (smart-case regex).nd tools <name>— one tool's description and its arguments.nd call <name> [key=value…]— call a tool. Values are coerced by the tool's schema (string, number, true/false, JSON for object/array). A wrong or missing key fails before anything is sent, listing the arguments. A tool whose only required argument is a string takes it bare:nd call open agentium:<word-id>.--json '<object>'or--json-file <path|->passes the arguments as one object instead.nd mcp [--ui] [--read-only]— a stdio MCP server:tools/listandtools/callgo to the socket, one connection each, so it can start before notedeck. Only data tools are exposed unless--ui;--read-onlykeeps only tools that change nothing. A hidden tool can't be called by name. Register it withclaude mcp add notedeck -- nd mcp.nd spawn [--json] [<dir>]— open a Dave session in<dir>(default the current directory, resolved and checked locally) and focus it, starting Dave if it isn't open. PrintsSpawned session <id>, or the bare id with--json. It callsdave_spawn_session;agentium spawnis the relay one for other hosts.nd --version— nd's version, and the running notedeck's.nd <cmd> --help,nd help options— per-command pages, exit codes.
Examples
nd call open headway:notedeck/balcony-warm-action
nd call open agentium:evolve-rule-carry
nd call open reference=agentium:evolve-rule-carry msg="rebase onto master"
nd call headway_open_review_queue
nd call headway_show_card --json '{"card":"headway:notedeck/balcony-warm-action"}'
Output and exit codes
- Data prints as JSON on stdout (indented on a terminal, one line in a pipe), exit 0.
- A UI tool that acted on the window prints nothing, exit 0.
- A tool error goes to stderr, exit 1 (also for a bad command line).
- No notedeck listening:
notedeck isn't running (no socket at …), exit 2.
A headless notedeck (--headless) refuses UI tools whose answer is a window
action. Tests must point NOTEDECK_SOCKET at a short temp path (a Unix socket
path must fit in ~100 bytes), never the user's real socket.