代码自动机
具有会话召回功能的终端代理编码工具。它与任何 openai兼容的API (DeepSeek默认),具有全屏TUI和 每个终端有多个实时会话。
会话
coda 在一个终端上保持多个对话同时打开。每一个
会话流独立:从繁忙会话和繁忙会话之间切换
反应不断累积,然后切换回去看它。
coda 从一个 新会话,光标已经在输入- a中
保存的会话永远不会为您打开。您之前的会话是一个按键
:新闻 ← (或 Ctrl+R)打开拾取器,和 Esc 返回到
新会话。选择器有一个文本提示符:
- 输入消息并按“Enter” →开始一个全新的会话 消息作为它的第一回合。
- 类型
/command并按Enter键 →运行该命令(/help,/rename, ),而不是开始一个会话。中报告了一个未知的命令 Picker, Picker保持开着,你可以修复它。 - 按Enter键,不输入任何内容 →打开以。突出显示的会话
↑/↓。 Ctrl+X删除突出显示的会话;Alt+R重命名它。- 输入并 不 过滤列表-使用
↑/↓穿过它。
在选择器中,每个可打印的键都是新会话消息的文本;否
字母是一种快捷方式,所以信息可以以任何字符开头。删除和
Rename是修饰词和弦 Ctrl+X 和 Alt+R,所以它们不会碰撞
打字。
| 关键 | 行动 |
|---|---|
Enter | 发送当前的线路,或者,在转弯中,将其折叠到运行的转弯中 |
← | 空输入:打开拾取器·非空:向左移动光标 |
→ / Home / End | 移动光标 |
Ctrl+A / Ctrl+E | 跳到行首/行尾 |
Backspace / Delete | 删除光标之前/下面的内容 |
Ctrl+W / Alt+Backspace | 删除前一个单词 |
Alt+D | 删除下一个单词 |
Ctrl+U / Ctrl+K | 删除到行首/行尾 |
Alt+B / Alt+F | 向后/向前移动一个单词 |
↑ / ↓ | 滚动文本一行 |
PgUp / PgDn | 滚动文本一页 |
| 鼠标滚轮 | 卷轴抄本(每个缺口3行) |
End (滚动) | 跳转回最新的输出 |
Ctrl+R | 打开会话选择器 |
| 类型 (选择) | Enter 开始一个 新 会话使用该文本(不过滤列表)。一个 /command 而是运行命令 |
↑ / ↓ (选择) | 完成会话 |
Enter 没有任何输入 | 开放 重点环节 |
Ctrl+X (选择) | 删除 重点环节 |
Alt+R (选择) | 重命名 重点环节 |
Esc (选择) | 关闭选择器 |
Alt+R | 重命名当前会话(Enter保存,Esc取消) |
Ctrl+V | 附加剪贴板图像(仅限图像的剪贴板;参见 图片) |
Ctrl+T | 新会话 |
Ctrl+X | 关闭当前会话 |
Ctrl+C | 退出 |
/help | 显示命令和键引用 |
/quit · /exit | 退出(与输入相同) quit / exit;会话被保存) |
会话以JSON格式保存在 ~/.coda/sessions/ (模式 600),并重新装入
下次你开始的时候 coda。
打开选择器将重新读取该目录,因此会话开始、重命名或 删除在 另一个终端 这里也显示:新会话被添加, 重命名和新消息被拾取,会话在其他地方被删除 消失。在这个终端中仍然运行一个回合的会话被留下 单独来看——它的飞行中输出还没有写入,因此它将遭受重创。
选择器总是按最近更新的先排序,所以两个终端列表 他们可以以相同的顺序看到会话。这是一场尚未结束的会议 已使用的会话不在磁盘上(空会话不会保存),因此它只出现在 启动它的终端,直到它发出第一条消息。
你打开的会话是 锁 只要这个终端在上面,所以a
第二终端不能打开同一会话并覆盖您的工作。锁
是咨询-小 <id>.lock 文件放在会话旁边,用
心跳, coda 运行-并在您切换时释放,关闭
会话,或者退出。默认情况下 coda 会不会一直不开会议
另一个终端保存它,并告诉哪个进程保存它;这就是防丢失
默认,因为一个会话的两个写入器会静默地相互覆盖。一个锁
由崩溃的终端所留下的,它自己就失效了(一个死进程)
同一台机器,或者不同机器之间的心跳时间超过30秒)
自动接管。
滚动回
长答案和工具输出滚动过可见窗口。 coda 使
整个会议记录并滚动浏览
- 鼠标滚轮 -每个缺口滚动几行文本。
↑/↓-一行一行;PgUp/PgDn-一页。End-返回最新的输出。
页眉显示 ▲ scrolled back N 当你读历史的时候。滚动是
独立于流:仍在到达的回复继续追加到
的时候,您可以读取之前的输出
模特还在写作。
coda 启用终端鼠标报告(SGR), 1000+1006),所以
车轮滚动 它的 文字记录-整个会议,而不仅仅是发生了什么
出现在屏幕上。这样做的代价是终端会停止转动自己的轮子
滚动和拖拽选择 coda 是开放的;持有 Shift 而
拖动以选择和复制文本,这是Windows中标准的逃生舱口
终端和大多数其他仿真器。鼠标报告在退出时关闭,
包括 Ctrl+C 和 SIGTERM。
如果拖动选择对你来说比滚轮更重要,禁用鼠标 完全不同的报告:
export CODA_MOUSE=off
coda 然后就不用管鼠标了——终端自带的拖拽选择和滚轮
滚动像往常一样工作-并且文本被滚动 ↑/↓,
PgUp/PgDn, End 代替。这是终端发生故障时的修复
不遵守Shift-to-select,或者当Shift-drag选择不可靠时。
coda 还重新绘制它的框架,而不是擦除屏幕上的每一个
渲染。每帧有一个全屏擦除,并且有一个流回复
每个数据块——让终端没有东西可以滚动。屏幕清空一次
在启动时;之后每一帧就地覆盖,最后一帧
在退出时留在屏幕上,因此它留在终端自己的回滚中。
重命名会话
会话以其第一条消息命名。要重命名它,按 Alt+R
在聊天视图中-或键入 /rename -输入行变成标题
编辑器,预先填充当前标题。打字 /rename Some title 重命名
直接写,不需要编辑。在会话选择器中, Alt+R 重命名的
当前在列表中突出显示的会话。
- 输入 节省了。 Esc 取消并保留旧标题。
←/→,Home/End,Backspace和往常一样Ctrl+A/Ctrl+E/Ctrl+W和Alt+B/Alt+F/Alt+D编辑键在编辑时都可以工作。- 清除标题并按Enter键将其返回到自动标题设置,因此下一个 消息再次命名会话。
新标题立即写入磁盘,并显示在页眉和目录中 选择器。
安装
npm install -g code-automaton
包被命名为 code-automaton,但它安装的命令是 coda:
coda --version
coda --help
您需要一个API密钥。将它导出到shell中,或者放在 .env 文件:
export CODA_API_KEY=sk-...
.env 是可选的,从当前目录中读取,然后从
项目的根。 coda 解析它自己-没有什么 source 也没有
dotenv-cli 需要的。环境中已经设置的变量总是有效的,所以
导出的密钥优先于 .env。
这个 -g 事项: npm install code-automaton 只链接 coda
命令为 ./node_modules/.bin/,这不在你的 PATH。
开发
从克隆中,安装依赖并直接从TypeScript运行
源, tsx 动态编译,所以没有构建步骤:
npm install
cp .env.example .env # then put your CODA_API_KEY in .env
npm run dev
通过传递CLI标志 --:
npm run dev -- --help
npm run dev -- --version
全局安装的 coda 运行 编译 输出 dist/,这
仅在构建时刷新:
npm run build
node dist/index.js
所以 npm run dev 立即反映您的编辑和 coda 不-重建
在通过global命令测试更改之前。
操纵急转弯
当一个转弯是运行-这与工具调用,可以是一个时间-按压
输入 不为以后的文本排队。它把它折成一个弯
消息被附加到对话中,因为完整的历史记录是
在代理循环的每一步都重新发送,模型在下一步看到它,
通常在工具调用之间。在文字记录中显示为 (mid-turn) …。
这意味着你可以打断一个长 bash 命令或重定向多步骤
不等待任务完成。这是尽最大努力而不是放弃:
如果模型已经形成了最终的答案,引导会在之后到达
它。要完全停止一个回合,关闭会话(Ctrl+X)或重新开始
(Ctrl+T).
图片
将截图附加到消息中,模型可以对此进行推理:
| 输入 | 它是做什么的 |
|---|---|
| Ctrl + V | 如果剪贴板包含图像而没有文本,则附加剪贴板图像 |
/paste | 附加剪贴板图像,而不考虑附带的任何文本 |
/image <path> | 附加图像文件(png, jpeg, webp, gif;(最大5 MB) |
Ctrl+V仅在剪贴板为纯图像时触发,因此普通文本可以粘贴
仍然到达终点站。剪贴板可以保存图像 和 〇立即发短信
从电子表格或浏览器图像中复制图表及其源URL -
在这种情况下,文本粘贴获胜。使用 /paste 当你想要图像的时候。
携带图像的消息被路由到视觉模型;其他的都去了 到文本模型。两者都是单独配置的(参见 配置),所以 纯文本设置保持工作不变。
附件作为类存储在会话中 [image: path] 占位符,而
而不是图像字节:否则1 MB的屏幕截图会放1.4 MB的base64
到每个会话文件中。当会话被重新加载时,文件被重新读取,所以a
移动或删除的图像降级为占位符。
剪贴板访问仅限wsdl,因为Windows终端无法传递图像
数据通过标准输入到程序中——从剪贴板中读取
Windows侧通过PowerShell。在macOS/Linux上使用 /image <path>。
工具
read_file-读取文件write_file-创建/覆盖文件edit_file-替换字符串的第一次出现list_dir-列出目录bash-执行shell命令
命令
斜杠命令被输入到输入中,然后用Enter键发送。
| 命令 | 它是做什么的 |
|---|---|
/help, /? | 将命令和键引用打印到抄本中 |
/quit, /exit | 退出 coda 保存会话。和打字一样 quit / exit,或 Ctrl+C |
/paste | 附加剪贴板图像(参见 图片) |
/image <path> | 附加一个映像文件(参见 图片) |
/rename <title> | 重命名当前会话。如果没有标题,则打开交互式标题编辑器(与 Alt+R) |
以…开头的一行 / 但是名字没有已知的命令 不 送到
模型。而不是 coda 报告 unknown command: … 在笔录和树叶中
您的文本在输入,以便您可以纠正它(或按 Esc 清除它)。这
保持打字错误 /quti 从被解释为提示。一个光秃秃的 / 在其
Own是豁免的,并作为普通文本发送(例如粘贴的绝对路径)。
配置
| Env var | 默认的 |
|---|---|
CODA_API_KEY | (必需的;退回到 DEEPSEEK_API_KEY, OPENAI_API_KEY,然后 ANTHROPIC_API_KEY) |
CODA_BASE_URL | https://api.deepseek.com (也读 DEEPSEEK_BASE_URL / OPENAI_BASE_URL) |
CODA_MODEL | deepseek-chat (也读 DEEPSEEK_MODEL / OPENAI_MODEL) |
CODA_SESSIONS_DIR | ~/.coda/sessions (也读老年人的书 DSC_SESSIONS_DIR) |
CODA_MOUSE | on -设置为 off 将鼠标选择留给终端(请参阅 滚动回) |
CODA_VISION_MODEL | 的价值 CODA_MODEL |
CODA_VISION_BASE_URL | 的价值 CODA_BASE_URL |
CODA_VISION_API_KEY | 的价值 CODA_API_KEY |
这个 CODA_VISION_* 变量选择用于包含的消息的模型
的形象。他们回到了他们的文本对应物,但没有视觉的模型
支持将默默地忽略图像而不是错误-所以设置它们
如果附上截图,则明确显示。
如果没有找到API密钥, coda 退出,并显示解释该变量的错误
它寻找的名字。
注意: ANTHROPIC_BASE_URL 是故意 不 阅读。Anthropic-shaped url
(如。 https://api.deepseek.com/anthropic)不兼容openai,也不会
失败;只有 关键 是从 ANTHROPIC_API_KEY,所以和an配对
显式的 CODA_BASE_URL 如果你依靠那个退路。
释放
版本由CI在版本标签上分级,然后手工批准。 main 是
受保护,所以版本碰撞必须通过拉请求着陆-直接
git push 来 main 被存储库规则拒绝,并且在
碰撞被合并将指向不在分支上的提交。订单
下面让两者保持一致:
# 1. Bump the version on a branch (npm version also builds dist/).
npm version patch # or minor / major — commits 1.4.3 + tags locally
git switch -c chore/release-$(node -p "require('./package.json').version")
git push -u origin chore/release-$(node -p "require('./package.json').version")
# 2. Open a PR and merge it. Do NOT squash: that rewrites the commit the
# local version tag points at. Use a merge commit or fast-forward.
gh pr create --fill && gh pr merge --merge
# 3. Now push the tag, once its commit is on main.
git switch main && git pull --ff-only
git push origin v$(node -p "require('./package.json').version")
CI构建,检查标记是否匹配 package.json对藏物进行烟熏测试
运行 npm stage publish --provenance. 它还创建了一个GitHub版本。
,然后审批阶段版本 npm web UI (账户→分期 包)。这种批准是2FA的存在证明,所以它仍然是手动的 这就是CI令牌不需要2FA绕过的原因。一旦批准,标记放行 最新的:
gh release edit v1.4.3 --latest # substitute the version just released
这个发布是用 --latest=false 因为舞台剧不是
可安装;“Latest”应该遵循npm实际提供的内容。
在决定重用版本号之前,请检查 版本 端点, 顶层包文档被缓存,可能会延迟:
curl -s https://registry.npmjs.org/code-automaton/<version>
许可证
MIT -见 许可证。