t2a mcp
by isnotry
README.md
# TaskToAgent · 本地任务看板
**简体中文** | [English](README.en.md)





> 人和 agent 写在同一块本地看板上:任务分七列流转,谁认领、做到哪一步、卡在哪里,一眼看清。

---
## 它是什么
一个**本地优先**的任务看板,用 `t2a` 命令行快速增删改查,配合网页看板可视化操作,两端读写同一份 SQLite 数据库。**零外部依赖**,不联网、不登录,数据全在你自己机器上。设计目标是让 AI agent 也能用同一套机制接任务:认领、续租、写日志、交付产出,全部有结构化的接口。
## 特性
- **零外部依赖** —— 只用 Node 内置模块,无需 `npm install` 即可启动,构建产物已随仓库提交。
- **本地存储** —— 数据落在本地 SQLite 文件(默认 `~/.t2a/t2a.db`),不联网、不依赖任何云服务。
- **中英双语界面** —— 设置菜单里一键切换,偏好记在浏览器本地;首次打开按浏览器语言自动选择。
- **双端互通** —— 命令行与网页看板读写同一份数据库,任一边改动,另一边立即可见。
- **七列看板** —— 灵感区 → 待办 → 进行中 → 阻塞 → 待验收 → 已完成 → 存档,面板内可直接添加、拖动。
- **原子认领** —— `task next` 用单条 `UPDATE ... WHERE` 完成认领,多个 agent 同时抢也不会拿到同一条任务。
- **租约心跳** —— 认领默认带 30 分钟租约,长任务定期 `heartbeat` 续租;到期自动回收回待办并留下系统日志。
- **依赖编排** —— 支持任务依赖 DAG(等 A 完成才能做 B),加边时自动检测环,`ready` 只列出可开工任务。
- **结构化输出** —— 所有命令支持 `--json`,统一返回 `{"ok":true,"data":...}`;语义化退出码让 agent 不解析文本即可分支。
- **MCP server** —— `t2a mcp` 以 stdio JSON-RPC 暴露 22 个工具,支持 MCP 的 agent 可直接调用,不用拼命令。
- **审计与备份** —— 所有写操作记入 `events` 审计流水,`t2a db backup` 做自包含快照。
## 快速开始
### 环境要求
存储用 Node 内置的 `node:sqlite`,**要求 Node.js >= 22.13**(22.12 实测报 `ERR_UNKNOWN_BUILTIN_MODULE`)。跑不起来先自检:
```bash
node bin/t2a doctor
```
### 本地使用
```bash
# 网页看板(默认 http://127.0.0.1:3979)
npm run web
# 命令行
node bin/t2a help
```
## 界面说明
顶栏右侧一排图标,从左到右依次是搜索、新建任务、设置。**设置**菜单把偏好收在一处:
| 位置 | 选项 | 作用 |
|---|---|---|
| 设置菜单 | 主题 | 浅色 / 深色,跟随系统偏好 |
| 设置菜单 | 界面语言 | 简体中文 / English,切换后整页立即重绘 |
| 设置菜单 | 任务列表展现形式 | 竖版看板(状态列并排,适合宽屏)/ 横版分组(整行可点,手机更顺手) |
| 设置菜单 | 数据同步 | 显示最近一次同步时间,说明刷新策略 |
| 侧栏 | 看板列表 | 点名称切换看板,箭头就地展开该看板的任务 |
| 任务卡片 | 整卡 | 展开任务详情:产出、执行日志、认领人与租约 |
界面语言的选择存在浏览器本地(`t2a-lang`),只影响这一台设备;命令行输出仍是中文。
## 命令行速查
**看板与任务**
| 命令 | 说明 |
|---|---|
| `t2a project list` | 列出所有看板(含任务数) |
| `t2a project add <名称> [--desc <描述>]` | 新建看板 |
| `t2a task add <标题> --project <名称> [--content] [--status] [--priority]` | 加一条任务 |
| `t2a task add --project <名称> --batch` | 从 stdin 批量加多条(agent 最常用) |
| `t2a task list [--project] [--status]` | 列出任务 |
| `t2a task search <关键词>` | 模糊搜索(编号 / 标题 / 内容 / 项目名,多关键词按 AND) |
| `t2a task update <id> [--title] [--content] [--status]` | 修改 |
| `t2a task remove <id> --yes` | 删除(`--yes` 必填,无 TTY 时不阻塞) |
| `t2a report [--project P] [--out <文件>]` | 把任务 + 日志 + 产出导成 Markdown |
**agent 联动**
| 命令 | 说明 |
|---|---|
| `t2a task next [--project P] [--lease 30m]` | 取下一个可开工任务并原子认领 |
| `t2a task start <id>` | 「开始做这条」= 认领 + 置为进行中 |
| `t2a task claim <id> [--agent A]` | 认领指定任务;被他人持有返回 `CONFLICT`(退出码 3) |
| `t2a task heartbeat <id> [--lease 30m]` | 续租;未认领时等价于 `claim` |
| `t2a task release <id>` | 放弃任务,回到待办 |
| `t2a task done <id> --result "产出"` | 标记完成并留存产出 |
| `t2a task fail <id> --error "原因" [--max 3]` | 失败计数;未达上限回待办重试,超限转 `blocked` |
| `t2a task dep add <id> --on <依赖id>` | 设置依赖(自动防环) |
| `t2a task ready [--project P]` | 列出可开工任务(只观察,不认领) |
**审计与维护**
| 命令 | 说明 |
|---|---|
| `t2a doctor` | 环境自检:Node 版本 / 数据库 / 网页服务 / 前端产物 |
| `t2a events [--kind] [--task] [--actor] [--limit 50]` | 审计流水(新的在前) |
| `t2a db backup [--out <目录>]` | 数据库快照 |
| `t2a agent [--json]` | 打印内置上手指南(`--json` 出机读版) |
| `t2a mcp` | 以 MCP server 模式运行(stdio JSON-RPC) |
## 状态与退出码
看板七个列对应一个 `status` 值:
| status | 看板列 | 含义 |
|---|---|---|
| `idea` | 灵感区 | 还没想清楚,先记下来 |
| `todo` | 待办 | 排上了,未开始 |
| `doing` | 进行中 | 有人认领正在做 |
| `blocked` | 阻塞 | 卡住,等人工或外部条件 |
| `review` | 待验收 | 做完了,等人确认 |
| `done` | 已完成 | 验收通过 |
| `archive` | 存档 | 收起来,不在视野里 |
退出码是给 agent 用的,**不必解析文本即可分支**:
| 退出码 | 含义 | 建议动作 |
|---|---|---|
| `0` | 成功 | 继续 |
| `1` | 业务错误 | 读 `error.code` 决定 |
| `2` | 暂无任务 | 正常结束本轮 |
| `3` | 认领冲突 | 换一条任务 |
| `4` | 用法错误 | 修正命令 |
| `5` | 缺少 `--yes` | 补上确认标志 |
常见 `code`:`NO_TASK` `CONFLICT` `DEP_NOT_READY` `NOT_FOUND` `USAGE` `CONFIRM_REQUIRED` `INVALID_DEP` `EXISTS`。
## 环境变量
| 变量 | 作用 | 默认 |
|---|---|---|
| `T2A_DB` | 指定数据库文件路径 | `~/.t2a/t2a.db` |
| `T2A_PROJECT` | 默认看板(省去 `--project`) | 无 / 首个项目 |
| `T2A_AGENT` | 默认 agent 身份 | `agent` |
| `T2A_PORT` | 网页服务端口 | `3979` |
| `T2A_HOST` | 网页服务监听地址 | `127.0.0.1`(仅本机) |
> `TASKCLI_*` 是历史名称(项目原名 `taskcli`),仍被识别但优先级低于 `T2A_*`,老脚本无需修改。
## agent 接入
支持 MCP 的客户端直接配 server,不用拼 shell:
```bash
node bin/t2a mcp --print-config
```
协议 `2024-11-05`,stdio JSON-RPC,暴露 22 个工具:`project_list/add`、`task_list/show/search/add/update`、`task_next/claim/heartbeat/release/done/fail`、`task_log/logs`、`task_deps/dep_add/dep_rm`、`task_ready`、`task_assign`、`task_report`、`events`。完整约定见 [AGENT.md](AGENT.md)。
不支持 MCP 也可以用 CLI,一次标准循环:
```bash
export T2A_AGENT=codebuddy
t2a task next --json # 取任务(自动认领 + 置为进行中)
t2a task log 12 "定位到问题在 src/db.js:88"
t2a task heartbeat 12 --lease 30m
t2a task done 12 --result "已修复并补测试"
```
**agent 身份由服务端配置决定**,不采信 agent 自报的名字;填错了会自动纠正:
```bash
t2a config set agent workbuddy
t2a config alias codebuddy workbuddy
```
## 数据与隐私
数据只存在本机,不上传任何地方,页面也没有第三方统计。存储位置与作用:
| 位置 | 内容 | 说明 |
|---|---|---|
| `~/.t2a/t2a.db` | 看板、任务、日志、审计事件 | 默认位置,可用 `T2A_DB` 改 |
| `~/.t2a/config.json` | 默认 agent 身份与别名 | 权限 600 |
`.db` 文件已列入 `.gitignore`,不会被误提交。给每个 agent 单独开一个库即可隔离:`T2A_DB=/path/to/agent.db t2a task list`。
网页服务默认只监听 `127.0.0.1`。确需局域网访问时用 `T2A_HOST=0.0.0.0 npm run web`,**注意没有任何鉴权**,仅在可信网络里这么做。
## 目录结构
```text
TaskToAgent/
├── bin/t2a # CLI 入口(可执行)
├── src/
│ ├── brand.js # 品牌与路径解析(T2A_* 优先、TASKCLI_* 兼容)
│ ├── config.js # 默认 agent 身份 + 错误名自动纠正
│ ├── db.js # 建表 + 认领/租约/依赖等协作原语(node:sqlite)
│ ├── report.js # 任务与项目报告、产物汇总
│ ├── agent-guide.js # 内置 agent 上手指南
│ ├── sqlite-guard.js# Node 版本前置检查(给友好报错而非模块堆栈)
│ ├── cli.js # CLI 全部命令逻辑
│ └── mcp.js # MCP server(stdio JSON-RPC,零依赖)
├── AGENT.md # agent 接入约定(MCP 配置 / 标准循环 / 规矩)
├── web/
│ ├── server.js # 零依赖 http 服务:REST API + 托管前端
│ ├── dist/ # 前端构建产物(已提交,开箱即用)
│ └── ui/ # 前端源码(Vite + React + Arco Design)
│ └── src/i18n.jsx # 中英双语文案字典与语言切换
├── docs/ # README 配图
└── package.json
```
## 开发说明
改后端直接改 `src/` 下对应文件,无需构建。改前端需要重新构建并提交产物:
```bash
cd web/ui && npm install && npm run build
```
前端产物落在 `web/dist`,**已提交到仓库**,所以别人 clone 下来直接 `npm run web` 就能用,不必装前端依赖。
## 浏览器支持
网页看板是构建后的现代浏览器应用,需要支持 `fetch` 与 CSS Grid 的版本(Chrome / Edge / Firefox / Safari 近两年版本均可)。命令行与 MCP 不依赖浏览器。界面是响应式布局,窄屏下七列可横向滚动。
## 许可
[MIT](LICENSE) © 2026 isnotry
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues