技术栈与架构
AgentDock CLI 的技术选型依据、已落地实现与分层架构设计。
技术栈与架构
已落地技术栈
以下组件已在
packages/cli中实际使用,均可在源码中验证。
| 组件 | 版本 | 在本项目中的角色 | 出处 |
|---|---|---|---|
| Bun | latest | 构建层:bun build 打包为单文件 Node.js 可执行文件 | github.com/oven-sh/bun |
| Citty | ^0.1.6 | 命令建模:子命令定义、flag schema、lazy 加载 | github.com/unjs/citty |
| Clack | ^0.9.1 | 人类交互层:@clack/prompts 提供 TTY 交互 UI | github.com/bombshell-dev/clack |
| MCP TypeScript SDK | ^1.0.0 | Agent 协议层:实现 MCP Stdio 服务器,暴露工具接口 | github.com/modelcontextprotocol/typescript-sdk |
| Changesets | workspace | 发布治理:语义版本管理与 CHANGELOG 生成 | github.com/changesets/changesets |
Giget(远程模板拉取)已在选型中,当前版本模板内置于 CLI npm 包,Giget 将在支持远程模板注册表时引入。
分层架构
CLI 的核心设计约束:Human / CI / Agent 三种消费者复用同一执行器核心,表面层完全可替换。
┌─────────────────────────────────────────────┐
│ 命令层 (Citty) │
│ src/commands/init.ts src/commands/mcp.ts │
│ - flag schema 定义 │
│ - 环境检测,分发到对应适配器 │
└───────────────┬─────────────────────────────┘
│
┌───────────┼────────────┐
▼ ▼ ▼
┌───────┐ ┌─────────┐ ┌──────────┐
│ Human │ │ Agent │ │ MCP │
│Adapter│ │ Adapter │ │ Adapter │
│(Clack)│ │ (JSON) │ │(Stdio) │
└───┬───┘ └────┬────┘ └────┬─────┘
└──────────┴────────────┘
│
┌───────────▼──────────┐
│ 执行器核心 │
│ src/core/scaffold │ ← 文件复制、版本检查
│ src/core/registry │ ← 模板注册表读取
└──────────────────────┘适配器职责
Human Adapter (src/adapters/human.ts)
- 仅在 TTY 环境下启动
- 使用 Clack 提供可取消的交互式流程
- 不包含业务逻辑,仅收集参数后调用核心
Agent Adapter (src/adapters/agent.ts)
- 在
--silent/--json/ 非 TTY 时启动 - 所有输出均为结构化 JSON(NDJSON 格式)
- 失败时输出错误对象 + 非零退出码,便于 CI/Agent 解析
MCP Adapter (src/adapters/mcp/)
- 实现 MCP Stdio 服务器规范
- 将
list_templates和scaffold_project投影为 MCP 工具 - AI Agent 可通过 MCP 客户端直接调用,无需解析命令行
为什么这样分层
无头优先(Headless-first)
执行器核心的设计不依赖 TTY,Human Adapter 是在核心之上的一层"外壳"。这意味着:
- 所有核心路径都可以在无 TTY 的 CI/Agent 环境中测试
- Clack 等交互库的升级/替换不影响核心逻辑
结构化输出作为协议
Agent Adapter 把 stdout 限定为可被机器稳定解析的 JSON 对象,而不是自然语言字符串。这遵循 gws CLI 的设计理念:把 CLI 当作机器协议接口,而不仅仅是交互工具。
同一能力多态投影
scaffold_project 这个核心能力,同时被投影为:
agentdock init(人类 flag 调用)agentdock init --json(Agent/CI 调用)- MCP 工具
scaffold_project(AI Agent 原生调用)
新增能力时,只需在核心实现一次,三种表面层自动具备。
参考出处
- Bun: github.com/oven-sh/bun
- Bun single-file executable: bun.com/docs/bundler/executables
- Citty: github.com/unjs/citty
- Clack: github.com/bombshell-dev/clack
- MCP TypeScript SDK: github.com/modelcontextprotocol/typescript-sdk
- Giget: github.com/unjs/giget
- Changesets: github.com/changesets/changesets