feat(task-worktree): 桥接 DSH worktree 插件——补共享联接、锁归属 pw:<name>、修释放不掉

诉求最初是升级 dsh-task-worktree:实测已装 0.4.6 = npm dist-tags.latest,无需升级;
真正的缺口是本仓 skill 看不见插件建的树(.dsh-worktrees/),故按用户追加指令把两套
系统接起来。回收方向刻意不打通:本 skill 永不删插件的树。

脚本 task_worktree.py:新增 plugin 子命令 list/adopt/unadopt,事实源是 git worktree
list(不是插件 manifest,免得被绕过);adopt 只补缺失的 .venv 与 simulator/SDL2
联接,已有联接跳过、实体目录绝不碰;锁归属用 pw:<name> 前缀;new 顺带提示另有 N 棵
插件树、不占活跃上限 3。
一并修一处真 bug:lock release --bench-pass 在任务无台账时先 EnvError 退出、锁释放
不掉,导致每个任务的 done 收口连坐失败;现在改为警告后仍然释放。

keil-build:default_lock_task() 增加 .dsh-worktrees/ 反推分支,插件树内的构建归属
pw:<name> 而不是兜底的 build-cli(主树行为未变,本次 @build 实测仍走 build-cli)。

.gitignore 预先忽略 .dsh-worktrees/,让插件的 ensureIgnored() 找到同一字面量、不再
改写这份受控文件。check_doc_links / check_layer_deps / gen_refgraph 三处扫描面同步
排除:仓里再放一份仓会让 doc-links 假红、并让生成的配图字节漂移到 generated-fresh。

文档:并行任务工作树方案新增 §3.4 两套系统边界对照;SKILL.md 加 §F 共存一节,同时把
§B 从 53 行压到 29 行(净 +39,用户此前在飞的改写已 rebase 保留、未被覆盖)。

验证:@build 0 错误 0 警告;scripts/ci_local.py 48 根提交期钩子与 gitlint 全绿;
check_doc_links --all --sections-strict 通过(2596 章节引用、无法判定 0);id-check-new
通过;改动文件字节体检无 BOM、CRLF 与 U+FFFD。桥接行为在临时 scratch 仓端到端跑过
(adopt 建两个 reparse、unadopt 只摘联接、pw 锁取放、缺台账也能释放、越界 name 退 2)。
This commit is contained in:
2026-10-29 07:50:05 +08:00
parent 5f69f38dfd
commit 21c68521ff
9 changed files with 593 additions and 85 deletions
+2
View File
@@ -51,6 +51,8 @@ SKIP_PARTS = ("node_modules", ".venv", ".git", "build", "obj", "__pycache__",
".workbuddy-ai", # 本地记忆/会话数据,非项目文档
".mnemon", # 同上:记忆工具的版本快照目录,已 .gitignore
"ci-artifacts", # 本地临时/草稿目录,已 .gitignore,不是项目文档
".dsh-worktrees", # DSH worktree 插件在**仓库内**建的任务树(整份仓库的副本,
# 扫它等于把同一篇文档按别人的任务状态判一遍——假红 + 白跑)
"docs/芯片手册") # 外部数据手册转录,非项目自有文档,链接形态不受控
# Markdown 链接:[text](target)。目标须以「非空白、非右括号」构成,
+2 -1
View File
@@ -65,7 +65,8 @@ def tracked_files():
except Exception: # noqa: BLE001
files = []
for root, dirs, names in os.walk(REPO):
dirs[:] = [d for d in dirs if d not in (".git", ".venv", "build")];
dirs[:] = [d for d in dirs if d not in
(".git", ".venv", "build", ".dsh-worktrees")];
for n in names:
files.append(os.path.relpath(os.path.join(root, n), REPO).replace(os.sep, "/"))
return files