CLI 与深链
在“设置 → Shell → Aster CLI”安装 aster 后,可从 Shell 控制工作区:
aster open ~/project --title API
aster view README.md --right
aster edit Sources/App.swift --new-window
aster jump project
aster learn ~/project
aster ignore ~/Downloads
aster pane capture --lines 100 --format json
aster pane send-text 'npm test\n'
aster pane run -- npm test
aster pane exec --format json -- git status --shortopen/view/edit/jump/learn/ignore/capture 是只读或工作区动作;pane send/run/exec 必须先在“设置 → 控制 → IPC”开启“允许发送输入”,SSH 或 sudo 等敏感会话还需单独开启“允许敏感会话”。aster://learn?... 深链只处理有界目录学习请求;ssh:// 只预填命令,不自动执行。
安装的 aster 是指向 Aster.app 内 aster-cli 的符号链接:优先放在 /usr/local/bin,不可写时放 ~/.local/bin(请确认它在 PATH 里)。旧版本写入的 sh 脚本会被自动替换;如果那个位置已经有一个不是 Aster 安装的 aster,安装会拒绝覆盖并提示。CLI 通过当前用户专属的本地 socket(默认 ~/Library/Application Support/Aster/Control/aster.sock,仅本人可连;HOME 路径过长时回退到 $TMPDIR/aster-control.sock)与应用通信,不监听网络端口。Aster 的终端里会注入 ASTER_SOCKET_PATH 指向实际路径;要让应用监听别处,可在启动 Aster 前设置 ASTER_CONTROL_SOCKET_PATH(绝对路径),CLI 侧也可用 --socket <path> 或 ASTER_SOCKET_PATH 显式指定;Aster 没有运行时它会在后台拉起应用并等待最多 5 秒,仍连不上则以退出码 69 结束。运行 aster --help 查看完整语法,aster --version 查看版本。
在 Aster 的终端里,aster 还能查看和控制其它 pane 与 Agent:
aster session snapshot # 所有窗口 / 标签 / pane
aster agent list # 正在运行的 Agent 及状态
aster agent read w1:p2 --lines 40 # 读某个 Agent 的屏幕
aster agent prompt w1:p2 "跑一下测试" --wait # 提交 prompt 并等它空闲
aster pane read --current --source recent
aster pane send-text --pane w1:p3 'npm test' --enter
aster pane wait-output w1:p3 --match "passed" --timeout 60000
aster pane split --current --direction down # 在当前 pane 下方拆出新 pane,打印它的 ID
aster pane close w1:p3 # 关闭 pane;标签里只剩它时连标签一起关
aster tab new --cwd ~/project # 新建标签并切过去,打印标签和 pane 的 ID
aster tab focus w1:t2 # 切到某个标签
aster tab rename w1:t2 "build" # 固定标签名;--clear 恢复自动标题
aster tab close w1:t2 # 关闭整个标签
aster events subscribe --kind pane.agent_status_changed
aster notification show "构建完成" --body "全部通过"
aster session terminals # 后台受管终端及其真实状态
aster session detach --current # 分离:后台任务继续运行
aster session end w1:p3 # 结束:终止该受管终端的后台进程pane split、pane close、tab new、tab close 会启动或结束进程,和发送输入一样要先开启“允许发送输入”;它们不弹确认框,直接执行(有未保存文档时仍会提示保存)。pane close 和 tab close 必须写明目标或 --current。tab 命令里的目标可以写标签 ID,也可以写标签里任意一个 pane 的 ID。
远程 TUI 客户端
在远端 SSH shell 中运行完整终端客户端(需要远端已安装 aster-session):
aster-session ui <state-parent> <session-name> # 交互模式
aster-session ui <state-parent> <session-name> --observe # 只读观察
aster-session ui --remote <ssh-target> --session <name> # 远端入口(通过 SSH)
aster-session ui --remote <ssh-target> --session <name> --observe # 远端只读--remote 模式从本机 SSH 到远端运行 TUI,无需手动 ssh 再执行命令。目标以 -- 隔离、远端命令做 POSIX 引用,防止 Shell 二次解释。
快捷键(Ctrl+B 前缀):
| 按键 | 动作 |
|---|---|
| Ctrl+B q / d | 分离(退出 TUI,后台任务继续) |
| Ctrl+B n | 下一个标签 |
| Ctrl+B p | 上一个标签 |
| Ctrl+B o | 下一个窗格 |
| Ctrl+B w | 下一个工作区 |
| Ctrl+B c | 新建标签 |
| Ctrl+B % | 水平分屏 |
| Ctrl+B " | 垂直分屏 |
| Ctrl+B x | 关闭当前窗格 |
| Ctrl+B Ctrl+B | 发送字面 Ctrl+B |
| Ctrl+B ? | 显示帮助 |
TUI 底部状态栏显示当前位置(工作区 > 标签 [窗格/总数])。40×20 以下的窄屏使用缩略布局。
session terminals/detach/end 只对受管终端有效。受管终端是运行在后台会话服务里的终端:关闭窗口或退出 Aster 只是「分离」,里面的任务继续运行,下次打开会重新附加到同一个进程;只有「结束」才会终止它。同一个终端同一时刻只能由一个 Aster 窗口输入:同时开着两个 Aster 时,后打开的那个会显示「已分离」,点「重新附加」就把控制权接过来,原来那个转为「已分离」,需要时同样点「重新附加」拿回来。从打包 App 启动时,全新终端默认走受管路径(后台 aster-session 服务);环境变量 ASTER_SESSION_BINARY 与 ASTER_SESSION_STATE_DIR 可覆盖二进制位置和状态目录。旧布局中未迁移的非受管终端保持原样。普通本地终端不受影响,对普通 pane 执行这两个命令会直接报错,不会结束它的 Shell。菜单「文件 → 分离受管终端 / 结束受管终端 / 把布局托管到后台…」提供同样的动作。后台服务更新时,普通替换会先停止服务再冷恢复;实验性 live handoff(实时交接)可在不终止终端进程的情况下传递 PTY 所有权,但该功能仍处于实验阶段,暂不通过用户界面暴露。
pane 与 Agent 用短 ID 引用(w1 窗口、w1:t2 标签、w1:p5 pane),也可用 Agent 名或 --current(当前 pane,来自环境变量 ASTER_PANE_ID)。agent、events、notification 命令只在 Aster 自己的终端里可用(环境变量 ASTER_ENV=1),在别的终端里需要显式加 --allow-outside。写入类命令与 pane send/run/exec 受同一套 IPC 开关约束;--json 输出原始结果,出错时 stderr 打印 {"code":"…","message":"…"} 并以退出码 1 结束。