cicy-code 是一个本地优先的多 agent 开发工作区。
它把 tmux worker、WebTTY、React 工作区、code-server 代理、OpenClaw 网关、shared workspace API、runtime/machines API、skill 市场、npm 启动器以及一组本地 Go skills(hosttools / skill 管理 / STT / TTS)收在同一个仓库里。
这份 README 只描述当前代码状态。
- 本地开发主入口:
python3 dev.py - 正式构建入口:
./build.sh - 后端主入口:
api/mgr/main.go - 前端主入口:
app/src/App.tsx - 主工作区组件:
app/src/components/Workspace.tsx - 版本号源头:
npm/package.json - cicy 状态根:
~/cicy-ai - 运行时日志根:
~/logs - Docker home 挂载根:
~/docker-homes
cicy-code/
├── app/ React + Vite 前端
├── api/ Go 后端、WebTTY、ttyd 资产、manager 运行时
│ ├── mgr/ 主程序与业务路由(~90 个 .go 文件)
│ ├── server/ WebTTY HTTP/WebSocket 服务
│ ├── webtty/ WebTTY 协议实现
│ ├── js/ 终端前端静态资源源码
│ ├── code-server-extension/ code-server / VS Code 扩展源码与 vsix
│ └── resources/ 后端静态资源
├── npm/ npm 发布包与启动器
├── skills/ 本地 Go skill 工具链 + 各类 SKILL.md
│ ├── cmd/ cicy-hosttools / cicy-skills / cicy-skillsd / stt / tts
│ ├── internal/ agentgen, bundle, config, hosttools, registry, voice
│ ├── cicy-code bash CLI:调当前节点的 cicy-code 后端
│ ├── cicy-master python CLI:管理 ~/Private/cicy-node.json 节点表
│ ├── cicy-todo/ 每工作区 todo 列表 skill(前端 Todo tab 对端)
│ ├── proxy_ssh/ ssh 子代理 skill 脚本
│ ├── us-spot-dev/, hk-spot-dev/, us-spot-proxy/ spot/dev 节点 provisioning
│ ├── cf/ install-worker for Cloudflare Worker dev
│ ├── docker/ skill 测试用的 base/google-smoke Dockerfile
│ ├── configs/ 示例配置
│ ├── migrations/ SKILL_REGISTRY / SKILL_DEV_GUIDE 等迁移文档
│ ├── legacy/ 历史 markdown skill 资料
│ └── dist/ 本地构建产物(cicy-hosttools 等二进制)
├── docs/ 当前文档与历史记录
├── dev.py 本地开发入口
├── build.sh 标准构建入口
├── versions.json 基础镜像与静态资源版本
└── Makefile 常用别名
cd ~/projects/cicy-code
python3 dev.pydev.py 当前会:
- 读取
~/cicy-ai/global.json - 停掉占用
8008的旧cicy-code - 刷新 ttyd 嵌入资产
- 同步版本号
- 执行
./build.sh build <platform> - 后台启动
api/cicy-code --public --dev - tail
.dev-logs/cicy-code.log
默认端口:
- API:
8008 - Vite:
8022 - code-server:
8002
改了代码后必须重跑 python3 dev.py 重建(前端嵌入 + Go 编译都靠它),单跑 go build ./mgr/ 会跳过嵌入步骤。
前端:
cd app
npm ci
npm run dev后端:
cd api
go run ./mgr/ --dev --public--dev 下,后端把非 API 请求反代到 http://127.0.0.1:8022。
一键安装(自动选最近 registry,推荐)
curl -fsSL https://r2.deepfetch.de5.net/code | shinstall.sh 会探测 registry.npmmirror.com 与 registry.npmjs.org 的延迟,
从最快的源全局安装 —— 国内自动落到 npmmirror,海外落到 npmjs,无需手动 --registry。
手动安装
# 海外
npm install -g cicy-code
# 国内(npmmirror 缓存二进制,不走 GitHub)
npm install -g cicy-code --registry=https://registry.npmmirror.com
# 临时跑一次
npx cicy-code主包 cicy-code 只是一个 launcher(几 KB),二进制按平台拆成 4 个子包:
cicy-code 主包,bin/cicy-code.js → require.resolve 平台子包并 exec
├─ cicy-code-darwin-arm64 (os:darwin cpu:arm64)
├─ cicy-code-darwin-x64 (os:darwin cpu:x64)
├─ cicy-code-linux-x64 (os:linux cpu:x64)
└─ cicy-code-linux-arm64 (os:linux cpu:arm64)
npm 按 os/cpu 字段只装匹配当前机器的那个子包(~30MB),其余跳过 ——
不走 GitHub、不需 postinstall 下载、npmmirror 直接缓存二进制。
发布用 npm/publish-all.sh <npm-version> [gh-tag]:从对应 GitHub release
的资产拉 4 个平台二进制,生成并发布 4 个子包 + 主包(共 5 个)。子包先发,
主包后发,保证 optionalDependencies 可解析。
# 本地开发
python3 dev.py
# 仅刷新 ttyd 嵌入资产
python3 dev.py --ttydAssets
# 前端热更新
cd app && npm run dev
# 后端 dev 模式
cd api && go run ./mgr/ --dev --public
# Go 测试
cd api && go test ./...
# 构建当前平台
./build.sh build
# 构建所有平台
./build.sh all
# 构建 Docker runtime 镜像
./build.sh docker <tag>
# 构建 Docker base 镜像
./build.sh docker-base <tag>
# 构建本地 skill 二进制(cicy-hosttools / cicy-skills / stt / tts ...)
cd skills && make build-local-binaries
# 安装 skill 命令到 ~/.local/bin
cd skills && make install-local-climake dev-api 当前只是 go run ./mgr/,不带 --dev --public;调试 Vite 代理时请直接用上面的显式命令。
标准构建入口是 build.sh,不是直接 go build ./mgr/。
build.sh 当前会:
- 同步版本号
- 复制
api/resources到api/mgr/resources - 复制
.tmux.conf与.cicy_tmux.conf到api/mgr/ - 构建
app/dist(除非SKIP_NPM=1) - 刷新
api/server/asset.go(除非SKIP_TTYD_ASSET=1) - 复制
app/dist到api/mgr/ui - 最后再编译
api/mgr
只直接执行 go build ./mgr/ 会跳过这些嵌入步骤。
主入口是 api/mgr/main.go。当前路由前缀包括:
/api/auth/*/api/proxy/*、/api/proxy-ssh/*/api/frp-server/*(status / lifecycle / connections / clients / logs)/api/panes、/api/tmux/*/api/chat/*、/api/poll、/api/stt、/api/tts/api/code-server/*/api/stats/*、/api/queue/*/api/agents/*、/api/workers/*/api/groups/*、/api/pair/api/nodes、/api/machines/*/api/runtime/*/api/shared-workspace/*、/api/collab/*/api/skills/*、/api/skill-market/*、/api/skill-config/*/api/settings/*、/api/system/*、/api/utils/*/api/openclaw/*、/api/ai-gateway/*、/api/providers/*、/api/cicy/*/api/im/*、/api/tg/*、/api/notify/*、/api/correctEnglish、/api/file-exists/api/todo/*/api/desktop/*/code/*、/ttyd/*
关键文件:
api/mgr/setup.go:环境检查、worker 初始化、code-server 启动、agent catalogapi/mgr/tmux.go:pane 生命周期、tmux send、agent 启动脚本api/mgr/chatbus.go:聊天 WebSocket、poll 数据、client 间广播api/mgr/runtime.go:runtime instance/session/task/artifactapi/mgr/machines.go:机器列表、同步、配置落盘api/mgr/shared_workspace.go、api/mgr/collab.go:文件式协作层api/mgr/skills.go、api/mgr/skill_market*.go:skill 注册表与市场 APIapi/mgr/frp_server_handlers.go:FRP server 抽屉式管理(脱敏,不暴露 config 原文)api/mgr/gateway_reply_callback.go、gateway_reply_text.go、gateway_chat_history.go、gateway_cicy_tools.go:跨 agent reply、结构化 reply/history 工具api/mgr/ai_gateway_*.go:OpenClaw / DeepSeek / Codex / Claude provider 适配api/mgr/stt.go、api/mgr/tts.go:语音转写 / 合成代理api/mgr/todo.go:/api/todo/*,对应cicy-todoCLI 与前端 Todo tabapi/mgr/im*.go、im_telegram.go、im_wechat.go、im_reply_hook.go:即时通讯桥接api/mgr/proxy.go、api/mgr/ai_gateway.go:代理与通用 AI 网关(/api/ai-gateway/*)api/mgr/openclaw_gateway.go:OpenClaw(🦞 IM agent)专属网关(/api/openclaw/*,微信会话/provider 代理)api/mgr/ui.go:内嵌 UI 或 Vite 反代api/mgr/paths.go:cicy 状态根 + 运行时路径常量
api/server:终端 HTTP/WebSocket 服务api/webtty:协议层api/js:浏览器端终端资产源码
如果改的是 api/js/src/*,还需要:
cd api && make assetapp/src/App.tsx:入口与 hash 路由切换app/src/components/Workspace.tsx:主工作区、agent stack、code-server、team panel、skills、Todo、WebSocket 状态app/src/components/TodoPanel.tsx:todo tab(与cicy-todoskill 同源数据)app/src/components/layout/FrpServerManagerDialog.tsx:FRP server 抽屉app/src/components/layout/ProxySshManagerDialog.tsx:proxy_ssh / CiCy SSH 抽屉app/src/components/audit/、app/src/components/dev/、app/src/components/im/:审计 / dev 控制 / IM 桥app/src/services/api.ts:统一 API 客户端app/src/config.ts:前端版本号、API base、路径辅助函数
前端视图当前主要有:
desktopworkspaceaudit(部分接口仍未在api/mgr/main.go注册,属于残留面)
skills/ 现在是一个独立 Go module(github.com/cicy-ai/cicy-skills),构建出几个二进制:
| 二进制 | 用途 |
|---|---|
cicy-hosttools |
argv[0] 分发的 host 工具集合:frp-server / frp-client / cicy-mihomo / cf-tunnel / cf / globalApiToken / email / aliyun-cli / ssh-list / agent-editor / tg / gpt / gemini-ask / gemini-vision / mysql-exec / cping / cicy-agent 等 |
cicy-skills |
skill 安装 / 卸载 / 列表 CLI(前端 skill 市场后端) |
cicy-skillsd |
常驻 daemon(marketplace 后台事件) |
stt |
调 Cloudflare Workers AI Whisper 的语音转写 CLI |
tts |
文本转语音 CLI |
internal/registry/:所有 skill 用init()注册进同一张表,避免在 bundle / agentgen / 前端三处重复登记(见skills/migrations/SKILL_REGISTRY.md)internal/hosttools/:每个 host 工具一个文件(frp.go、mihomo.go、cf_tunnel.go、cf_api.go、google.go、ssh.go、email.go、aliyun.go)internal/bundle/:聚合 SKILL.md / 资源到分发包internal/agentgen/:根据 SKILL.md 与 registry 生成 agent 的 skill 目录internal/voice/、internal/voicecmd/:语音管线公共逻辑internal/skills/:扫描已安装 skill
frp-server / frp-client 包装器现在只看 ~/cicy-ai/db/frps.toml / ~/cicy-ai/db/frpc.toml,不再支持 FRP_SERVER_CONFIG / FRP_CLIENT_CONFIG 环境变量(保留 --config <path> 显式覆写)。日志统一进 ~/logs/frps.log / ~/logs/frpc.log。
npm/bin/cicy-code.js:npm 启动器,按os-archrequire.resolve 平台子包二进制并 execnpm/publish-all.sh:从 GitHub release 资产打包并发布 4 个平台子包 + 主包npm/install.sh:延迟路由 bootstrap(探测最近 registry 后全局安装),托管在 R2/codeapi/code-server-extension/:发送文件路径给当前 agent 的扩展源码,配套cicy-code-server-bridge-0.0.4.vsix
pane 是核心运行单位,典型 ID 形态:
w-1001w-1001:main.0
builtinAgents catalog(来自 api/mgr/setup.go):
claude— Claudecodex— Codexopencode— OpenCodecursor— Cursorkiro-cli— Kiro CLIcopilot— GitHub Copilotopenclaw— OpenClawhermes— Hermes Agentcicy-claude— CiCy
非 lab 模式(默认)只允许 claude / codex / opencode(nonLabAllowedBuiltinAgents),lab 模式才会暴露整套 catalog。
当前事实:
python3 dev.py默认 dev agent 是claude- 首个内置 worker 是
w-1001(primaryWorkerPaneID = w-1001:main.0) --agents=all时按 builtinAgents 顺序从端口10001起递增分配- 前端创建对话框以非 lab 允许列表为准
App.tsx 仍保留前端兜底:登录后若 w-1001 不存在,会尝试创建一个 hermes pane,是 UI 侧补救逻辑,不是主启动链路默认值。
~/cicy-ai 仅保留 cicy 自身状态和内置 skill:
~/cicy-ai/global.json~/cicy-ai/db/(敏感配置:frps.toml、frpc.toml、mihomo.yaml、google.json、cf.json等,均 chmod 600)~/cicy-ai/.cicy/~/cicy-ai/workers/~/cicy-ai/projects/~/cicy-ai/skills/(用户本地 skill)~/cicy-ai/shared-workspace/~/cicy-ai/cicy-node.json
commit 7b9cffa 之后,运行时产物搬出 ~/cicy-ai,分开管理:
~/logs/— 所有运行时日志(skills install、code-server、tmux send/trace、agent install 日志、frps.log、translate-cache 等)~/docker-homes/— Docker home mount 目标(之前是~/cicy-ai/docker-homes)
- 后端 runtime 默认文件:
~/cicy-ai/cicy-node.json- 来自
api/mgr/paths.go api/mgr/machines.go读写
- 来自
- skills CLI 默认文件:
~/Private/cicy-node.jsonskills/cicy-api与skills/cicy-master默认值- 可用
CICY_NODES_FILE改写
如果希望 skills 与后端同一份:
export CICY_NODES_FILE=~/cicy-ai/cicy-node.jsonPORT、CS_PORT、SQLITE_PATHCICY_API_TOKEN、CICY_API_KEY、CICY_API_URL、CICY_ANTHROPIC_URLCICY_DEFAULT_OPENCODE_MODEL、CICY_DEFAULT_CLAUDE_MODEL、CICY_CODEX_MODEL、CICY_OPENCLAW_MODELCICY_RUNTIME_KIND、CICY_RUNTIME_MODE、CICY_RUNTIME_API_ONLYCICY_PUBLIC_URL、CICY_MASTER_URL、CICY_MASTER_TOKENCICY_TEAM_TOKEN、CICY_TEAMCENTER_URL
其中:
CICY_RUNTIME_MODE=api-only或CICY_RUNTIME_API_ONLY=1会让部分 tmux/desktop 接口返回not_supported_in_api_only_runtimeCICY_MASTER_URL/CICY_MASTER_TOKEN/CICY_PUBLIC_URL会触发 managed runtime 的自注册路径
/api/skill-market/* 是 UI 侧的 skill 安装/卸载入口;/api/skill-config/* 暴露每个 skill 的状态卡。
注册侧靠 skills/internal/registry/,每个 skill 在自己的 init() 里 Register(Skill{...}),bundle、agent SKILL.md 生成、前端列表都从这一张表读。生产链路(feat(skill-market): wire production install/uninstall flow):
- UI 选 skill →
/api/skill-market/install - 后端调
cicy-skills install <name> cicy-skills把所需文件 link 到~/.local/bin/、~/.claude/skills/<name>/等- agent 启动时
agentgen按当前已安装的 skill 列表生成 SKILL.md
已落地的 skill 示例:google(多用户 OAuth)、email(Resend)、aliyun-cli、frp-server / frp-client、cf / cf-tunnel、cicy-mihomo、proxy_ssh(重命名 CiCy SSH)、ssh-list、cicy-todo。
仓库仍保留完整 Docker 与 managed runtime 能力:
api/Dockerfile.runtimeapi/Dockerfile.runtime.base./build.sh docker <tag>./build.sh docker-base <tag>python3 dev.py --dockerpython3 dev.py --dockerBuildpython3 dev.py --cloudRunpython3 dev.py --cloudRunList
python3 dev.py --dockerBuild 当前还会先做 CDN 资产构建与 COS 上传,再 push runtime 镜像,并更新 ~/cicy-ai/global.json -> images.runtime*。
Docker 容器的 host home 现在挂到 ~/docker-homes/<container-name>(默认值,见 dev.py:1518)。
api/code-server-extension 提供两个用户动作:
- 资源管理器右键:发送路径给当前 agent
- 编辑器右键:发送当前文档 / 选区给当前 agent
它通过:
POST /api/code-server/send-path
与当前页面所属的 cicy-code 后端通信。
当前代码与历史文档相比,至少有这几处需要按代码为准:
- 状态根分裂:
~/cicy-ai(状态 + skills)、~/logs(运行时日志)、~/docker-homes(Docker home mount) - builtinAgents 是 9 个;非 lab 模式只暴露
claude / codex / opencode这 3 个 - 默认 dev agent 是
claude,不是一组固定的四 agent 启动模版 - 机器配置文件后端 (
~/cicy-ai/cicy-node.json) 与 skills (~/Private/cicy-node.json) 默认路径仍不一致 - FRP server / client 配置已硬编码到
~/cicy-ai/db/;老的FRP_*_CONFIG环境变量已删 - skills 是独立 Go module,构建 / 安装走
skills/Makefile,不是api/那条链 - 前端仍保留 audit 页面与
/api/audit/*调用,但api/mgr/main.go没有注册这些路由
- 本地开发先用
python3 dev.py - 需要前端热更新时,再开一个
cd app && npm run dev - 改
api/js后执行cd api && make asset - 改
skills/(hosttools / SKILL.md)后cd skills && make build-local-binaries - 正式构建走
./build.sh - 节点注册表管理走
skills/cicy-master - 节点 API 调用走
skills/cicy-api(原skills/cicy-code,5/30 重命名避免与 cicy-code 二进制撞名)
MIT