session-mechanism:解析不到文档库根时如实报错留痕(第 11 条禁令)
⚠️ 这批改动**不是本次会话写的**,是本机协作机制里别的会话留在工作区的;我按用户「就可以提交仓库」
的授权一并入库,提交前只做了语法校验 —— 三个 py 过 `py_compile`,`handoff-guard.sh` 过 `bash -n`。
- `install.py` `write_roots()`:`DSH_DOCS_ROOT` 解析不到时,原行为是**整行不生成、不报错、不留痕**
⇒ 锁类脚本读不到该键 ⇒ `handoff-guard.sh` 回落到技能包自己的 `scripts/` ⇒ 锁根落进技能包
(另一台机器实测已在 `<技能包>/scripts/05-交接单/.locks` 长出一把锁)。现改为**如实报错 + 留痕**,
并写明「本区确实没有 dsh 文档库时就写本工作区根」这条出路。
- `collabd.py` / `hooks/lock-guard-hook.py` / `lock/handoff-guard.sh`:同批配套(68 增 / 12 删)。
This commit is contained in:
1 parent
f2d07b47ad
commit
22799fc9c2
4 files changed
+68
-12
No files matched your search
@@ -11,8 +11,8 @@ lock-guard-hook.py — 「无锁不许改库」的强制钩子(WorkBuddy PreTo
|
||||
作用域(**刻意收窄:对其他项目零影响**)
|
||||
────────────
|
||||
仅当 `Write` / `Edit` 的目标路径落在下列根之内,才做锁判定;其余一律放行:
|
||||
· 文档库 <DSH_DOCS_ROOT>(默认 E:\\ProgramData\\AIProject\\ai1net-dsh-server\\dsh-server-docs)
|
||||
· 代码库 <DSH_CODE_REPO>(默认 D:\\github\\dsh_shenxian)
|
||||
· 文档库 <DSH_DOCS_ROOT>(取自本包 `env/roots.env`,由 `install.py` 生成)
|
||||
· 代码库 <DSH_CODE_REPO>(默认=文档库的上一级)
|
||||
⚠️ 例外:路径中含 `.workbuddy` 目录段的一律放行 —— 会话记忆 / 自动化工作数据属“运行态数据”,不是“仓库内容”。(2026-09-13 实测:「代码仓三方同步(DSH)」自动化写自己的 memory/*.md 时被本钩子 deny,属误伤)
|
||||
|
||||
判据
|
||||
@@ -69,9 +69,26 @@ except Exception:
|
||||
sys.stderr.write('[env] 无法导入 _env.py ⇒ 环境定位不可信\n')
|
||||
raise
|
||||
|
||||
# ⚠️ 文档库根:env/roots.env 优先;末位兜底**故意保留字面量** —— 锁守卫一旦静默解析不到,
|
||||
# 就会"看起来在守、其实没守"(比指错更危险)。换机器请让 install.py 写 roots.env。
|
||||
DOCS_ROOT = os.environ.get("DSH_DOCS_ROOT") or r"D:\github\dsh_shenxian\dsh-server-docs"
|
||||
# ⚠️ 文档库根:env/roots.env 优先。
|
||||
# 🔴 2026-10-15 改(用户令「包内代码不许留盘符字面量」· 第 11 条禁令):
|
||||
# 删掉原末位兜底 `or r"D:\github\..."`。它自以为在防「静默没守」,实际制造两个更坏的后果 ——
|
||||
# ① 那个盘符是**本机写死的**,换机器或文档库搬家后该目录不存在 ⇒ 照样「看起来在守、其实没守」
|
||||
# (D 盘那台实测:兜底路径不存在,锁守卫静默放行);
|
||||
# ② 与本包第 11 条禁令直接冲突。
|
||||
# ✅ 现行:解析不到 ⇒ **如实报错 + 留痕 + 放行**(fail-open,⛔ 不拦用户提交),⛔ 不猜路径。
|
||||
DOCS_ROOT = (os.environ.get("DSH_DOCS_ROOT") or "").strip()
|
||||
if not DOCS_ROOT:
|
||||
try:
|
||||
_lg = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "logs",
|
||||
"lock-guard.err.log")
|
||||
_lg = os.path.normpath(_lg)
|
||||
os.makedirs(os.path.dirname(_lg), exist_ok=True)
|
||||
with open(_lg, "a", encoding="utf-8", errors="replace") as _f:
|
||||
_f.write("[%s] ⛔ 锁守卫取不到 `DSH_DOCS_ROOT`(env/roots.env 缺该键)⇒ 本轮**放行**"
|
||||
"(fail-open)。⛔ 未回落到猜的盘符。\n" % time.strftime("%Y-%m-%d %H:%M:%S"))
|
||||
except Exception:
|
||||
pass
|
||||
sys.exit(0)
|
||||
# ⛔ 不留盘符:代码库=文档库的上一级(`<repo>/dsh-server-docs` 的约定)
|
||||
CODE_REPO = os.environ.get("DSH_CODE_REPO") or (os.path.dirname(DOCS_ROOT) if DOCS_ROOT else "")
|
||||
LOCK_DIR = os.path.join(DOCS_ROOT, "05-交接单", ".exec-lock")
|
||||
|
||||
Reference in new issue
Block a user