Skip to content

feat(claim): 多根工作区下可选地允许从链接根认领任务 - #62

Merged
cloader merged 3 commits into
cloader:devfrom
reysonk:feat/claim-from-linked-roots
Oct 25, 2026
Merged

cloader merged 3 commits into
cloader:devfrom
reysonk:feat/claim-from-linked-roots

Conversation

@reysonk

@reysonk reysonk commented Oct 25, 2026 •

Copy link
Copy Markdown

改了什么?

多根工作区(multi-root workspace)下的认领边界:

  • 之前认领任务时只比较 callerWsId === task.workspaceId,所以当额外的 workspace 根目录(多根插件挂上来的项目 B)里存在任务时,cwd 属于项目 A 的会话无法认领,只能创建/评论。
  • 新增看板设置 allowClaimFromLinkedRoots(默认关闭,保持原有行为)。打开后,认领门禁额外接受“任务项目属于该会话已链接的 workspace 根目录”的情况;任务本身仍归属它原来的项目,其它逻辑不变。
  • host 侧新增可选依赖 ToolDeps.linkedRoots(cwd),由 src/index.ts 从可选服务 multiRootScope.scopeOf(cwd) 取得(即 dsh-plugin-multi-root-workspace)。服务不存在、抛错或返回 undefined 时一律降级为「只认主根」——老版本 DSH 行为不变。
  • 设置项以英文标签暴露在 Settings → General:Allow claiming from linked workspace roots,描述说明只放开认领、不放开创建/移动,并提示需安装多根插件。中英文案均已加。
  • 认领失败的错误文案在开关打开时补上“or one of its linked workspace roots”。

改动文件:

  • src/shared/protocol.ts — BoardSettings.allowClaimFromLinkedRoots + 校验 + allowClaimFromLinkedRootsOf()
  • src/shared/api.ts — UpdateSettingsBody 增加该字段
  • src/host/tools.ts — ToolDeps.linkedRoots、callerClaimScope()、认领门禁改造
  • src/index.ts — 从 multiRootScope 取链接根目录
  • src/client/board/SettingsModal.tsx — 开关 UI
  • src/client/i18n/en.ts、zh.ts — 文案
  • tests/multiroot-claim.spec.ts — 新增 7 个用例;tests/client.spec.ts — 设置基线期望更新

如何验证?

npx tsc --noEmit          # 0 errors
npx vitest run            # 580 passed (44 files)
npx vitest run tests/multiroot-claim.spec.ts   # 7 passed

新增用例覆盖:

  1. 开关关闭(默认)+ 只有链接根 → 拒绝 workspace_mismatch(回归保护)
  2. 开关打开 + 任务项目是链接根 → 认领成功,claimedBy 是本会话
  3. 开关打开 + 任务项目既非主根也非链接根 → 拒绝
  4. 开关打开 + 主根本身匹配 → 照旧成功
  5. 开关打开 + 没有多根服务(linkedRoots 未注入)→ 仅主根可用
  6. linkedRoots 抛错 → 降级,不 500
  7. 认领错误文案只在开关打开时提及 linked roots

真实环境核对:dsh-plugin-multi-root-workspace 0.1.10 的公开 API scopeOf(primaryRoot) 返回该 cwd 的追加根目录,本补丁正是用它(ctx.get('multiRootScope'),服务缺失即降级),并在本机 DSH 的 @deepseek-ai/dsh-workspace 里核对了 resolveByPath() 的返回形状。端到端(真机安装本补丁后在看板上认领相邻项目任务)尚未执行——需要先由本机安装补丁版本。

端到端已在真机验证(2026-10-25)

本补丁安装到本地 DSH 后实测通过:主根 D:\LLM\Nord(会话 cwd),追加根 D:\DEV\mqtt_hm(另一项目),多根插件 0.1.10。开关打开后,cwd 属于 Nord 的会话成功认领了归属 mqtt_hm 项目的卡片(todo → in_progress,版本号按 CAS 递增),并继续在同一会话里完成:加评论、勾选验收清单、提交执行报告、in_progress → in_review。开关关闭时同一操作仍被 workspace_mismatch 拒绝——开关确实起作用,不是旁路。

该方法的已知限制

  1. 依赖多根插件 + 目录已注册:目标项目目录必须先用 /workspace-folders add 挂成本会话的追加根。仅在 DSH 里打开过该文件夹、未注册成 workspace 时,scopeOf() 返回空,认领照旧被拒。
  2. 只放开认领,不放开创建:taskboard_create 仍要求 cwd 主根就是目标项目;传相邻项目的 workspaceId 或路径会报 unknown workspaceId。相邻项目的卡片只能在“主根就是该项目”的窗口里新建,或改用该项目的会话。
  3. 卡片归属不变:任务仍留在原项目板上,执行记录、隔离目录、git 仓库都按原项目的工作区决定;会话在另一个主根里干活时,构建产物与 git 操作落在追加根目录中,路径要自己核对。
  4. 静默降级:服务名 multiRootScope 是多根插件的约定;插件改名/改接口、或版本与 DSH 不匹配(README 兼容表,插件不启动)时,本补丁不报错,只退化成“只认主根”——表面现象就是“又认领不了”。
  5. 追加根只有只读权限时:认领仍会成功(门禁只看路径可见性),但后续写入/构建会被文件沙箱拒绝;--read-only 挂载不适合作为认领场景(按插件 README 的权限模型推断,未实测)。
  6. 必须开开关:默认关闭即保持旧行为;看板设置里的 defaultWorkspaceId 与此无关,只影响 GUI 默认显示哪个项目。

关联 Issue(可选)

无。需求来自日常使用:多根工作区下想直接认领相邻项目的卡片,而不是必须另开一个 cwd 在该项目里的会话。

Alexandr Kirichenko and others added 3 commits October 25, 2026 20:16
A session whose cwd is project A could not claim a task of project B even
when B was attached to that session as an extra workspace root: the claim
gate only compared callerWsId with task.workspaceId.

Add a board setting `allowClaimFromLinkedRoots` (default off). When it is
on, the claim gate additionally accepts the task's project if it is one of
the workspace roots linked to the calling session; the host passes
`ToolDeps.linkedRoots(cwd)`, which resolves the extra roots of the session
whose cwd is that directory (multi-root workspace plugin: scopeOf(cwd)).

The setting is exposed as "Allow claiming from linked workspace roots" in
Settings -> General (EN + ZH), and the claim gate's error message mentions
the linked-roots case. A task keeps its own project; nothing else changes.
@cloader

cloader commented Oct 25, 2026 •

Copy link
Copy Markdown
Owner

感谢你提供多根工作区认领的实现和真机验证。在你的版本基础上,已补充以下完善:

  1. 更新 Agent 工作协议:明确 allowClaimFromLinkedRoots 开启且目标项目为会话已挂载关联工作区时,可以跨主根认领;读写、构建和 Git 操作须使用任务所属项目目录,并遵守会话已有权限。
  2. 调整中英文设置提示:说明这是整个看板的设置、默认关闭、依赖多根工作区插件,服务不可用时退回主根认领规则。
  3. 新增回归测试:覆盖协议中的有条件例外、错误文案随开关变化,以及通过已注册项目 ID 或目录跨项目创建任务。

另补充澄清原说明中的创建边界:当前 taskboard_create 原本即可接受已注册项目 ID 或可解析为项目的目录路径,没有要求会话主根与目标项目一致。unknown workspaceId 表示目标项目无法解析,需要检查注册状态和路径;这次设置改变的是认领门禁,创建规则保持原样。

本次 Windows 本地类型检查、host/client 完整构建及全量测试通过(44 个测试文件、583 个测试)。修订提交 c073b03 的 GitHub CI 也已通过。你在原 PR 中报告的真机端到端操作,本次未独立复现。

@cloader
cloader merged commit 6e8b44f into cloader:dev Oct 25, 2026
1 check passed
@reysonk

reysonk commented Oct 25, 2026

Copy link
Copy Markdown
Author

Thank u!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants