SuperAPI AI Directory

danteterm

Agents & models

View repository

Updated 10-15 22:35

About this skill

DanteTerm control via dsh

DanteTerm is Dante's fork of Wave Terminal (dandacompany/danteterm). The CLI is dsh (Wave's wsh renamed), environment variables are DANTETERM_*, and the AI sidebar has been removed, so wsh ai has no counterpart. Everything else maps one-to-one.

dsh is DanteTerm's CLI. It can create tabs, place blocks, type into other terminals, read their output, and open files or URLs in the right kind of block. That makes DanteTerm usable as a workspace an agent arranges and drives, not just a terminal.

Check these two things first

1. Running inside DanteTerm. dsh authenticates through DANTETERM_JWT, injected into shells DanteTerm starts. Outside a DanteTerm block every command fails.

[ -n "$DANTETERM_JWT" ] && echo "inside DanteTerm" || echo "not inside DanteTerm"

2. Version. Tab management, sendkeys, and block placement need v0.17.4+:

dsh tab list >/dev/null 2>&1 && echo "v0.17.4+" || echo "too old: no tab/sendkeys/placement"

If either check fails, say so instead of running commands that will fail one by one.

Delegating a task to another agent

The headline capability: open a block, run an agent CLI in it, hand it a task, collect the answer. Use the script rather than rebuilding the loop:

scripts/danteterm_delegate.py --agent claude --prompt "audit ./pkg for data races"
scripts/danteterm_delegate.py --agent codex --prompt-file task.md --tab work --position right --size 40
scripts/danteterm_delegate.py --agent claude --prompt "..." --keep      # leave the block open
scripts/danteterm_delegate.py --agent codex --prompt "..." --cwd ~/projects/myrepo

It creates the block, waits for its shell, launches the agent with the prompt as an argv argument, waits for completion, prints the answer to stdout, and closes the block.

Completion is detected by a shell redirect by default: the agent's non-interactive form runs with its output redirected to a file, then a marker is touched, and the script polls for the marker. The shell does the capturing, so nothing depends on the agent cooperating. --mode scrollback instead waits for the screen to stop changing — a heuristic, for agents with no non-interactive form.

Two things reliably break a delegation, both covered in the reference: using an agent's interactive form (claude '<prompt>' opens a TUI and hangs; it needs -p), and leaving the block in a directory the agent refuses to work in (pass --cwd).

Read references/agent-delegation.md before changing how delegation works, adding an agent, or debugging a run that hangs or returns noise. It covers why argv beats typing into the TUI, the tradeoffs of each completion mode, and fan-out.

Arranging the workspace

dsh tab create logs                 # new tab (comes up with one terminal)
dsh tab move logs 1                 # 1-based position in the tab bar
dsh tab rename 2 build
dsh tab delete logs                 # refuses the last tab without --close-window

dsh createblock term --target 1 --position right --size 30
dsh view ./report.md                # preview block (default placement; no --target/--position)
dsh createblock preview "file=$PWD/report.md" --target this --position right --size 50   # placed preview
dsh web open https://example.com    # web block
dsh run -- npm test                 # command in its own block

A new window cannot be created with dsh (as of 1.2.13). dsh --help has no window command, only dsh workspace 는 list . On macOS, if you trigger a second launch with open -n -a DanteTerm , the app's second-instance handler calls createNewDanteWindow and a new window appears (measured on 2026-10-12, danteapp.log 에 creating new window). The new window's windowId is not returned, and unnamed windows do not appear in dsh workspace list either, so verification is done with dsh dantepath log --tail or the System Events window count. I have requested that an official command be added to DanteTerm.

createblock preview 의 file= must be given as an absolute path. If you give a relative path, the block is created but the preview is a blank screen — the block does not know the cwd of the shell that called it (measured on 2026-09-25). dsh view resolves relative paths on its own, but createblock does not. If the path contains spaces, wrap the entire file=… in quotes.

Driving and reading another block

dsh sendkeys -b 2 --enter "npm run dev"     # text is literal, no escape processing
dsh sendkeys -b 2 --keys Up Enter           # named control keys
dsh sendkeys -b 2 --keys C-c
dsh sendkeys -b 2 --signal SIGINT
dsh termscrollback -b 2 --lastcommand       # read its output back

dsh sendkeys --help prints the full key-name table, which is generated from the same table the parser uses, so it cannot drift.

Addressing — where silent mistakes come from

Tabs take a number (1-based), an exact name, a uuid, or this. Blocks take a number, a uuid, view:N, or this.

Two traps worth knowing before writing any script:

  • this never crosses a tab. --tab X with a defaulted -b is rejected rather than quietly acting on the caller's own block.
  • Block numbers shift. They come from the layout's leaf order, so adding or closing a block renumbers the rest. Scripts should capture uuids.

Read references/addressing.md before writing a script that targets blocks or tabs by anything other than this. It also lists which commands lack --tab and the JSON shapes to parse.

Putting results where the user will see them

Prefer a block over scrollback for anything worth reading: write a markdown file and dsh view it, or open a URL in a web block. Use dsh badge or dsh notify to signal completion without stealing focus. (DanteTerm has no AI sidebar, so there is no dsh ai.)

Read references/output-to-danteterm.md for the block-type-by-content table, placement flags, and dsh setvar/dsh secret for state between commands.

The rest of the surface

dsh ssh / dsh wsl connect a terminal to a remote or WSL host; dsh file moves files between local and remote (dsh://user@host/path, or /~/ for the local machine from a remote block); dsh conn manages connections; dsh editconfig and dsh setconfig edit settings; dsh getmeta / dsh setmeta read and write block metadata.

Run dsh <command> --help for exact flags rather than guessing — the help is authoritative and several commands have flags that only exist on some of them.