docs(tasks): switch to full-scope token and document agent MCP setup

窄权限 token 实测无法移动 kanban bucket(POST /projects/{p}/views/{v}/
buckets/{b}/tasks 返回 401,bucket 操作需要 project 级权限),导致
TODO / DOING / BLOCKED 的状态流转 agent 无法驱动。权衡后改用全量 token,
代价已在 T-008 方案第 5 节写明:任何配置此 MCP 的 agent 都持有该实例的
完整读写权,且 apiurl 走 http 公网 DDNS,token 明文过网。

AGENTS.md 增加各家 agent 的 MCP 配置片段(Claude Code 的 .mcp.json 与
Codex CLI 的 ~/.codex/config.toml),统一指向 scripts/vikunja-mcp.sh,
并明确任何配置文件内不得内联凭据——token 只存在于 vikunja.env。

看板卡片已归位:Doing #15,Done #12/#13/#14。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
QiuSW
2026-08-03 17:14:00 +08:00
co-authored by Claude Opus 5
parent 9198134d0b
commit ed489bd13e
2 changed files with 22 additions and 4 deletions
+18 -1
View File
@@ -89,7 +89,24 @@ cmbuyer 是一个自动化采购系统:**采购服务**(网页端,`admin/`
在 diff 里只呈现为「导出内容更新」,审计链就断了。
只读任务内容不需要接入 Vikunja——导出产物就在仓库里,`git clone` 即可。只有写状态和
执行记录才需要配置 MCP(`.mcp.json` → `scripts/vikunja-mcp.sh`,凭据见 `vikunja.env.example`)。
执行记录才需要配置 MCP。
各家 agent 指向**同一个包装脚本**,不要各写各的:
```jsonc
// Claude Code:仓库内 .mcp.json(已配置,无需重复)
{ "mcpServers": { "vikunja": { "type": "stdio", "command": "./scripts/vikunja-mcp.sh" } } }
```
```toml
# Codex CLI:~/.codex/config.toml
[mcp_servers.vikunja]
command = "/mnt/d/chengma/cmbuyer/scripts/vikunja-mcp.sh"
```
**任何配置都不得内联凭据。** 脚本自己按 `$VIKUNJA_ENV_FILE` → 仓库根 `vikunja.env` →
家目录的顺序读取,token 只存在于 `vikunja.env`(已 gitignore,样例见 `vikunja.env.example`)。
把 token 写进 agent 配置文件等于把它复制到一个没人在看的地方。
Vikunja 不可达时按 `degraded_mode` 处理:继续手头任务,不领新任务,不写远端。
+4 -3
View File
@@ -25,7 +25,7 @@ write_paths:
- docs/tasks/_template.md
---
<!-- BEGIN VIKUNJA EXPORT id=15 synced=2026-08-03T09:06:06Z sha256=93a5d6cfabfbf36355835c9ef8d83e1501c13ce3b59562be1eaeadcb80bbdcb2 -->
<!-- BEGIN VIKUNJA EXPORT id=15 synced=2026-08-03T09:13:45Z sha256=12b35fc74d559e5b15884fd223785c35ef08fa1750042d442dbb888e9ceb059b -->
## 问题 / 背景
多 agent 并行时任务文档会互相覆盖。已观测到的事实:T-005 与 T-006 同时为 `DOING`,
@@ -124,7 +124,7 @@ Vikunja 自动创建的英文名,不为了对齐中文表述去动 API:
- 版本写死的理由:上游改工具名或行为会直接改变 agent 行为,与 `CLAUDE.md` 「交付产物新旧以 SHA-256 判断」同源,不接受静默升级。
- 凭据文件 `vikunja.env` 放仓库根目录,比照既有 `gitea.env` 模式加入 `.gitignore`; 同时提交 `vikunja.env.example`。脚本按 `$VIKUNJA_ENV_FILE` → 仓库根 → 家目录顺序 查找,便于其他 agent 换路径。
- `.mcp.json` 的 `command` 改为仓库内相对路径,使配置不绑定某台机器的家目录。
- **签发窄权限 token**:当前 token 权限为全量,任何配置了此 MCP 的 agent 都能执行 `projects_delete`。须在 Vikunja 后台另签一个只覆盖 tasks、comments、labels 读写的 token 供 agent 使用,管理操作保留给人工 token。此步只能人工完成。
- **token 权限:采用全量 token**(2026-08-03 决定)。曾试过只覆盖 tasks / comments / labels 的窄 token,实测 `POST /projects/{p}/views/{v}/buckets/{b}/tasks` 返回 401——bucket 操作需要 project 级权限,导致 `TODO` / `DOING` / `BLOCKED` 三者的状态流转 agent 无法驱动,与方案第 1 节「状态用 Kanban bucket 表达」直接冲突。权衡后取全量 token。**代价必须记录**:任何配置了此 MCP 的 agent 都持有对该 Vikunja 实例的完整读写权,包含 `projects_delete`;且 `apiurl` 是 `http://` 走公网 DDNS,token 明文过网。凭据只允许存放在 `vikunja.env`,不得内联进任何 agent 配置文件。
### 6. 门禁 `scripts/validate_agent_context.py`
@@ -169,7 +169,8 @@ Vikunja 网络,服务不可达时连校验都做不了:
- 导出产物行尾为 LF;连续执行两次导出,第二次无文件变更(幂等)。
- 重启 Claude Code 后 `claude mcp list` 显示 vikunja 为 Connected,`.mcp.json` 使用 相对路径且在另一家目录下同样可用。
- `git status` 确认 `vikunja.env` 未被跟踪,`vikunja.env.example` 已提交。
- **人工待办(未完成前不得标 `DONE`)**:在 Vikunja 后台签发窄权限 token 并替换 `vikunja.env`;确认看板视图可用。
- 看板视图可用,卡片位置与 `status` 一致:`Doing` 放 #15,`Done` 放 #12 / #13 / #14。
- 各家 agent 的 MCP 配置片段写入 `AGENTS.md`,统一指向 `scripts/vikunja-mcp.sh`,配置文件内不出现凭据。
## 执行记录