Liskin — 面向开发者的自主编程 Agent

TypeScript Node.js pnpm Hono SQLite
React Vite TailwindCSS Zustand SWR Radix UI
vitest oxlint tsup Prettier

## 一、关于 Liskin Liskin 是一款专注研发提效的 Coding Agent。产品目前提供 IDE 插件,web和 CLI 多种形态,主要解决的是通用编程 Agent 在大型代码库里反复暴露的几个老问题: - 看不懂代码库。通用 Agent 对大型工程缺乏全局认知,回答经常跑偏,开发者只能不停追问、手动补约束。 - 其次是生成的代码不合规范,常常偏离业务逻辑或 UI 标准,存在幻觉,设计稿还原得也不理想。 - 复杂任务接不住——单轮 Agent 既缺上下文也缺工具,跨模块、多步骤的活难以完成。 - 质量缺乏反馈,代码写完没有客观评估,开发者对产出好坏没有把握。 ## 二、相对业界主流 Agent 的技术创新 ### 深度代码检索 Liskin 用 Code RAG 配合基于 LSP AST 的代码索引做跨文件检索,把准确的上下文主动喂给模型,而不是让模型盲猜,也省去了开发者手动粘贴代码片段的环节。这套检索能力后续计划做 MCP 化,作为标准工具服务对外开放。 ### 单 Agent 全程上下文与无痕微压缩 主流的多 Agent 编排有一个共性缺陷,Liskin 早期的 Subagent 串联也踩过这个坑:每个子 Agent 各自维护记忆,切换时上下文就断了。 Liskin 换了思路,借鉴 Claude Skills 的渐进式披露,以及 Manus、Claude Code 的微压缩机制,让单个 Agent 在一次任务里全程保持完整上下文,只在阶段之间做无痕微压缩。这样既压住了上下文膨胀,又保住了对话的连续性。实测显示,引入渐进式加载后 Token 消耗下降约 50%,平均任务完成时间缩短约 50%,指令遵循度提升约 7%。这条路线与 Cursor、Trae 的多 Agent 编排有明显区别。 ### 双模式 + Auto 智能路由 业界产品大多用一个 Agent 应对所有任务,比如 Cursor 的单 Agent、Windsurf 的 Cascade 全自动流。Liskin 走的是另一条路:把深度规划和快速执行拆成两个独立的执行模式,二者在 LLM 选型、Prompt 策略、工具集和上下文管理上完全分开,而每个模式内部仍由单个 Agent 全程持有上下文。 上层的 Auto 路由会根据任务复杂度和需求明确度自动分发——复杂的架构性任务交给深度规划,明确的单点修改交给快速执行。这样"PRD 到架构拆解"和"即时 Bugfix"这两类差异极大的任务都能稳定接住,而不是拿同一套配置硬扛到底。 ### 架构创新与云端-本地协同 产品以一个统一内核为中心,对外提供 Web、CLI、IDE 插件乃至移动端 App 等多种客户端,开发者在任意终端都能随时开工。再通过 MCP 打通 GitHub、Vercel、Cloudflare 等开发与部署链路,把研发流程串成一个闭环。 这套架构的关键在于内核与外壳解耦。同一份内核代码靠不同的 KernelClient 适配多端——CLI 走 InProcessKernelClient,Web 走 HttpSseKernelClient,未来 IDE 走 JsonRpcKernelClient;而 Claude Code 的 VSCode 扩展和 CLI 是两条相对独立的实现路径。内核并不知道自己是被 CLI、Web 还是 IDE 调用的——LLMPort、ToolPort、StorePort 三个端口接口让内核只跟抽象契约打交道,换模型、换工具来源、换存储后端,都不必改动内核代码。这个设计便于日后的插件化扩展 新增Sandbox,路径白名单加命令黑名单,再配合 auto/ask/deny 三档确认策略,权限粒度比 Claude Code 更细。 ### Harness 框架支撑长程任务自迭代 Harness 是 Liskin 专为复杂长程任务设计的执行框架。它把任务拆成可中断、可恢复、可审计的节点序列,用 Markdown 文件落盘记录意图、阶段、闸门和完成状态。借助它,Agent 在多轮执行中能够始终对齐目标,即便中途中断,也能从断点精确接回。其长任务可中断、可恢复、可审计,状态落盘在 `.liskin/harness/` 目录,这是 Claude Code 目前没有的机制。 ### 评测驱动迭代 Liskin 建立了一套系统化的 Agent 评测机制,并把行为日志结构化成 RLHF/DPO 训练数据,形成 post-coding 数据飞轮。依托评测持续发现并改进 System Prompt、链路、工具和模型上的问题。 ### 在建能力 D2C 是当前的核心抓手,配合 AGENTS.md 的项目级规范注入和 Harness 真相文档,把业务规则与 UI 标准显式传给模型,不再依赖模型自行揣摩。围绕落地链路,还在推进 GitHub CI/CD、Vercel、Cloudflare 等平台从 SCM 研发到上线部署的全流程集成,以及基于 ContextDB 的上下文管理集成和文档形式的 stage 管理。 ## 三、与 Claude Code / Trae / Cursor 的对比 | 维度 | Claude Code | Liskin | | ----------- | ----------------------------------- | ---------------------------------------------- | | 多端支持 | 本地 CLI / VSCode 扩展 | CLI + Web + IDE 插件,共用同一 daemon | | Provider | 仅 Anthropic API | 原生支持多 Provider 热切换 | | 上下文工程 | 系统 Prompt + 项目记忆 | 同样支持 AGENTS.md,外加 Harness 工程基础设施 | | 工具系统 | 内置工具(Bash/Read/Write/Edit 等) | 内置 fs/shell + Sandbox 防护 + 可扩展 ToolPort | | 多 Provider | 仅 Anthropic 模型 | 动态 Provider 路由,Web UI 切换,配置持久化 | 当然,Claude Code 在 System Prompt 与工具链的打磨、PR/Issue 评论和 CI 集成等企业协作能力上更为成熟,这些是 Liskin 后续需要补齐的方向。 --- # 架构设计 Kernel ↔ Client 内核(Agent 状态机 + 工具 + 模型适配)与调用方(CLI / Web / IDE)进行解耦 内核不感知调用内核的对象,越靠内的层越稳定。 四层单向依赖的架构 ```mermaid flowchart TB %% 样式定义 classDef l4 fill:#eff6ff,stroke:#3b82f6,stroke-width:1.5px,color:#1e3a8a classDef trans fill:#f5f3ff,stroke:#8b5cf6,stroke-width:1.5px,color:#4c1d95 classDef proto fill:#fffbeb,stroke:#f59e0b,stroke-width:1.5px,stroke-dasharray: 5 5,color:#92400e classDef l3l2 fill:#ecfdf5,stroke:#10b981,stroke-width:1.5px,color:#064e3b classDef l1 fill:#f8fafc,stroke:#64748b,stroke-width:2px,color:#0f172a subgraph L4["L4 接入层"] direction LR Clients["CLI, Web, IDE Plugin"]:::l4 end subgraph Transport["传输适配"] Server["Hono Server
packages/server"]:::trans end subgraph Protocol["协议边界"] Proto["KernelClient / Op / EventMsg"]:::proto end subgraph L3["L3 模型适配"] LLM["LLMProvider → LLMPort
packages/llm"]:::l3l2 end subgraph L2["L2 工具/执行"] Tools["ToolRegistry + Sandbox
packages/tools"]:::l3l2 end subgraph L1["L1 内核"] Core["runAgent + 状态机
packages/core"]:::l1 end %% 数据流向与依赖 Clients ==>|"KernelClient 接口"| Server Server --> Proto Proto --> LLM Proto --> Tools LLM --> Core Tools --> Core style L4 fill:transparent,stroke:#3b82f6,stroke-width:2px style L1 fill:#f1f5f9,stroke:#64748b,stroke-width:2px ``` | 包 | 层 | 职责 | | ----------------- | --- | ---------------------------------------------------------------------------------- | | `packages/core` | L1 | Agent 状态机、主循环、Op/EventMsg 协议、KernelClient 接口 | | `packages/tools` | L2 | 工具注册 + 沙箱(路径白名单/危险命令拦截)、fs.read/fs.write/shell.exec | | `packages/llm` | L3 | LLMProvider 接口 + OpenAI 兼容适配器(已验证 GLM5.2) | | `packages/server` | L4 | Hono daemon,HTTP/SSE + SQLite 持久化 | | `client/` | L4 | CLI 入口:agent serve(daemon)、agent exec(headless)、agent chat(交互式 REPL) | | `web/` | L4 | React + Vite + Tailwind 前端(待重写为时间线渲染) | --- ### 依赖边界 通过 `dependency-cruiser` 强制执行单向依赖规则:`core` 不依赖 `tools/llm/server`,`tools` 不依赖 `llm/server`,依此类推。任何反向 import 在 `pnpm deps:check` 阶段直接阻塞。 ### 前端 | 类别 | 选型 | 用途 | | ---------- | ----------------------------------------- | --------------------------------------------------- | | 框架 | React + TypeScript | SPA,Vite 构建 | | 路由 | react-router | 客户端路由,非 Next 文件路由 | | 远端状态 | SWR | 请求缓存、重试、revalidate | | 本地状态 | Zustand | 跨组件共享,替代 Redux | | 局部状态 | React hooks + ahooks | 页面/组件级交互 | | 样式 | TailwindCSS + cva + clsx + tailwind-merge | 原子化 + 变体管理 | | 无样式组件 | Radix UI | Dialog、Select、Tooltip 等 | | 业务组件 | HeroUI | 快速搭建(待 React 19 + Tailwind 4 升级后深度启用) | | 动画 | Framer Motion | 过渡与手势 | | 通知 | Sonner | Toast 通知 | ### 编辑与内容渲染 | 类别 | 选型 | | ---------- | ----------------------------------------- | | Markdown | react-markdown + remark-gfm + rehype 系列 | | 图表 | mermaid | | 代码编辑 | monaco-editor + @monaco-editor/react | | 节点流程图 | reactflow | --- ## 快速开始 ### 前置 - Node ≥ 20、pnpm 9 - 一个 LLM API Key(OpenAI 兼容协议;) ```bash # 克隆代码仓库 git clone https://github.com/Zhongye1/liskin.git pnpm install pnpm -r run build cp .env.example .env # 编辑 .env,填入 OPENAI_API_KEY(填入你的 API 地址和模型) ``` ### 3) 跑任务(agent exec,in-process,无 daemon) ```bash ./scripts/dev.sh exec "用 matplotlib 画个柱状图存到 output/bar.png 并写 README 附图" # 指定工作目录与最大轮数 ./scripts/dev.sh exec "..." --cwd /tmp/my-task --max-turns 30 ``` `agent exec` 用 `InProcessKernelClient` 直连内核,auto 批准工具,实时渲染事件流到终端,跑完即退出。事件流包含 `Token`(流式文本)、`ToolCall`/`ToolProgress`/`ToolResult`(工具调用 + 实时 stdout/stderr)、`TurnEnd`(回合结束)。 ### 4) 交互式 REPL(agent chat,in-process,无 daemon) ```bash # 最简启动(确认策略默认 ask) pnpm run cli ./scripts/dev.sh chat # 指定模型和自定义 system prompt ./scripts/dev.sh chat --model gpt-4o --system "你是 Python 专家" # 关闭工具确认(全自动执行) ./scripts/dev.sh chat --confirm auto # 不持久化(退出即丢会话) ./scripts/dev.sh chat --no-save # 恢复之前保存的会话 ./scripts/dev.sh chat --resume # 使用第三方 API ./scripts/dev.sh chat --base-url https://api.openrouter.ai/v1 --model anthropic/claude-sonnet-4 ``` `agent chat` 同样用 `InProcessKernelClient` 直连内核,与 `exec` 共享同一套渲染函数。核心差异: - **多轮对话**:readline REPL 循环,持续交互直到 `/exit` - **工具确认**:默认 `ask`,终端内联 `[y/n]` 问询(可用 `--confirm auto` 关闭) - **持久化**:默认存到 `~/.liskin/chat-sessions.sqlite`,`--resume` 恢复 - **中断**:Ctrl-C 中断当前 turn 回到 prompt(不同于 exec 直接退出) REPL 内置命令: | 命令 | 作用 | | ----------- | ---------------- | | `/exit` | 退出 REPL | | `/help` | 打印帮助信息 | | `/sessions` | 列出已保存的会话 | ### 5) 启动全栈(agent serve + web) ```bash ./scripts/dev.sh # 构建 + 启动 server(8787) + web(5173) ./scripts/dev.sh --no-build # 跳过构建 ./scripts/dev.sh stop # 停止 ./scripts/dev.sh logs # 看日志 ./scripts/dev.sh watch # 并行 tsup watch(core/tools/llm/server/client) 开发用 ``` ### CLI ```bash # headless 一次性任务(已验证闭环) agent exec --model opensource/glm5.2 --base-url https://api.openai.com/v1 \ --cwd /tmp/task "你的任务" # 起 daemon(给 Web 用) agent serve --port 8787 --cwd /your/workspace --cors http://localhost:5173 ``` # 当前进度 Phase 0 已闭环。五个核心包全部可构建、可测试,端到端通路已验证。 ### 已交付 **M0 — monorepo 骨架。** pnpm workspace 立起五个包,共享 tsconfig,dependency-cruiser 守住架构红线,oxlint/prettier/commitlint 工具链完整。 **M1 — Agent Core 状态机。** `runAgent` 异步生成器驱动主循环:idle → streaming → awaiting_tool → awaiting_user → done。`LLMPort` / `ToolPort` / `StorePort` 三个端口接口定义在内核中,具体实现在外层注入。`HarnessPort` 接口预留,NoopHarness 占位。6 个单测覆盖纯对话、工具回灌、确认门、maxTurns 保护、错误传播、取消信号。 **M2 — OpenAI Provider。** `OpenAIProvider implements LLMPort`,覆盖 SSE 流式解析、按 index 增量拼接 tool_call、Msg/ToolDef ↔ OpenAI 协议互转、错误归一化(API 错误 / 网络错误 / 流异常 / 取消)。`createProvider` 工厂函数支持动态路由。30 个单测。 **M3 — 工具系统 + 沙箱。** `ToolRegistry implements ToolPort`,zod schema 校验。内置 `fs.read`(行号范围)、`fs.write`(diff 预览)、`shell.exec`(sh -c 管道)。Sandbox 三层:路径白名单(防路径穿越)、命令黑名单(9 条危险模式)、确认策略(auto/ask/deny)。`ConfirmRequiredError` 携带 callId 支持外部确认回灌。40 个单测。 **M4 — 接入层 + CLI + Web。** `packages/server`:Hono daemon,POST /v1/chat SSE 端点,SQLite 持久化。动态 Provider 路由,Web UI 可配置多服务商、热切换、API key 掩码。`client/`:CLI 入口,`agent serve` 启 daemon,`agent exec` 一次性任务。`web/`:React 前端,SSE AgentEvent 消费,工具调用面板,确认弹窗,ProviderSettings 配置面板。 **累计**:88 个测试(14 个文件),全仓 typecheck / build / lint / deps:check 通过。 ### 遗留 `server/`(Go + Gin + faasrouter + Thrift IDL)暂时搁置,Phase 2 后端需时开始进行评估。 --- ## 接下来的工作 按优先级排列,每条支线相互独立,可按需切入。 ### 1. 收尾清理 - 前端 MVP 样式优化 - 清掉未使用的依赖(@radix-ui 部分组件、ahooks、axios、swr、usehooks-ts) - bundle 拆分:react-markdown / highlight.js 改用 dynamic import,消除 614KB chunk - 修复 lint-staged 在部分环境下的 stash-restore 异常 ### 2. MCP 协议支持 Phase 1 价值最大的一项。接入 Model Context Protocol,让 agent 能消费外部工具和数据源(stdio 和 HTTP 两种 transport)。内核的 `ToolPort` 已为此预留接口——MCP 客户端只需作为 `ToolPort` 的另一个实现注入,内核零改动。 ### 3. 多 Provider 扩展 当前 LLM 层只有 OpenAI 兼容适配器。`LLMPort` 接口天然支持新增 Anthropic 等 Provider。`dynamic-llm.ts` 已有骨架,主要是 `packages/llm` 内加适配器实现。 ### 4. 项目记忆 让 agent 读取并遵守项目根目录的 `AGENTS.md` 约定文件。内容按层级组织:根目录放全局规范(架构、编码规范、Agent 路由决策树),业务目录放模块知识。记忆文件只描述"在哪查、怎么查",不存易变数据。 ### 5. 终端 UI 增强 `agent chat` 交互式 REPL 已交付(Phase 1,基于 Node readline 原生实现,零新依赖)。后续增强方向:ANSI 光标控制(流式输出时隐藏光标、spinner 动画)、输入历史(readline history 持久化)、多行输入(粘贴代码块)。不引入 Ink/React 等重型 TUI 框架,保持 CLI 轻量。 ### 6. Harness 框架 将 `NoopHarness` 替换为 `MarkdownHarness`:复杂任务自动在 `.liskin/harness/active/` 下创建 Markdown 任务文档,记录用户意图、待办节点、已完成节点、闸门、控制状态。每个工具调用闭环后落盘节点结果。目标:任务中断能续跑、长任务可审计、执行过程可回溯。 ### 7. 沙箱执行加固 - `--sandbox` 标志,接入 OS 级隔离(Linux bubblewrap / macOS sandbox-exec) - 写/删文件前的 diff 预览 - 撤销栈 --- ## 阶段路线图 ### Phase 0(已完成) 单体本地 Agent 跑通端到端:用户对话 → 模型流式输出 → 工具调用 → 沙箱确认 → 执行 → 结果回灌 → 继续对话 → 完成。 Web UI、CLI、Hono daemon 全部到位。 ### Phase 1(当前阶段) 目标:终端常驻可用,覆盖 80% 日常编码需求。 1. **Agent Loop 完善**:Read → Plan → Act → Verify 循环,工具集扩展(read_file、write_file、run_shell、list_files、grep、edit) 2. **沙箱隔离**:OS 级机制(Landlock/seccomp)限制文件系统和网络访问,默认最小权限,按需扩展 3. **项目感知**:读取 `AGENTS.md` 和项目配置文件,构建指令链,让 Agent 理解项目结构和约定 4. **审批机制**:多级审批(只读→需确认→全自动),可编程 hook 系统拦截生命周期事件 5. **工具协议标准化**:MCP 客户端消费外部工具,工具 schema 以 JSON Schema 传给模型,支持 stdio 和 HTTP 两种 transport 6. **上下文管理**:自动压缩(compaction),session 持久化和恢复,上下文健康度监控 ### Phase 2 7. **可观测性**:结构化日志(JSONL session transcripts),OpenTelemetry Tracing,Token 用量计量 8. **多 Agent 协作**:子 Agent 定义(TOML),并行执行 + 结果聚合,MCP Server 模式(自身也能被其他 agent 调用) ### Phase 3+ 9. **后端网关**:Key 托管、多用户、审计、限流(激活 `server/` Go 代码) 10. **IDE 插件**:VSCode / JetBrains 插件,连接同一个 `agent serve` daemon 11. **工作流编排**:多 Agent DAG 执行。设计文档明确警告——不要把 Agent 多步骤误当成工作流引擎,不要把 Harness 当 DAG 节点。 --- ## 其他 参考资料: 构建AGENT 一般roadmap Step 1:确定 Agent Loop 实现 Read → Plan → Act → Verify 循环 给模型配备工具:read_file、write_file、run_shell、list_files Step 2:沙箱隔离 用 OS 级机制(Landlock/seccomp/Seatbelt)限制文件系统和网络 默认最小权限,按需扩展 Step 3:项目感知 读取 AGENTS.md/ 项目配置文件 构建指令链(instruction chain) Step 4:审批机制 实现多级审批模式(从只读到全自动) 提供可编程的 hook 系统拦截生命周期事件 Step 5:工具协议 实现 MCP 客户端(消费外部工具) 将工具 schema 作为 JSON schema 传给模型 支持 stdio 和 HTTP 传输 Step 6:上下文管理 实现自动压缩(compaction) 支持 session 持久化和恢复 监控上下文健康度 Step 7:可观测性 结构化日志(JSONL session transcripts) Tracing(OpenTelemetry 导出) Token 计量 Step 8:多代理扩展 子代理定义(TOML 格式) 并行执行 + 结果聚合 MCP Server 模式(让自己也能被其他 agent 调用)