session-mechanism:两个看板定名(会话看板 / 项目看板)+ 包内代码一律相对路径
用户令(两句,同一轮):
①「会话技能中 能用相对路径的都要用相对路径」
②「把会话的 项目目标看板 改成 项目看板,
项目看板 和 会话技能的任务看板 都重新命名 会话看板、项目看板」
## 一、改名:项目管理界面 → 项目看板
* 目录:boards/项目管理界面/ → boards/项目看板/(会话看板不变)
* 包内引用:路径性(3 行)+ 展示名(6 处,含 argparse description、启动横幅、
错误日志前缀、模块 docstring、页面 <title> 与 .brand)
* HTML 标题:<title>项目管理 · 执行任务</title> → <title>项目看板 · 执行任务</title>
## 二、相对路径(新立第 11 条禁令)
判据=「这个根能不能从『我自己的位置』推出来」:
* 能(本包自己的目录)⇒ 从 __file__ 上跳推导
* 不能(工作区根 / 配置目录 / 文档库根)⇒ 读本包 env/roots.env
* 推不出来 ⇒ 如实报错 + 留痕(⛔ 不许静默扫空)
落点(共 4 处代码级硬编码,全部清掉):
* boards/项目看板/project-board.py:新增 _sm_load_roots();
技能根改 HERE.parent.parent;WS_ROOTS 从 DSH_AIROOT 推导;
推不出根时打警告 + 写 logs/project-board.err.log(原为静默扫出 0 个项目)
* scripts/selftest.py:生产区定位改为扫 DSH_AIROOT 下兄弟区(⛔ 不写死区名);
两处测试假路径去掉盘符
⛔ 文档/注释里的绝对路径保持原样(举例、历史取证照写 —— 那是证据)。
## 验收
* 换机场景实测(技能包拷到 /tmp、不带 env/roots.env):
无任何配置 ⇒ 如实报错;只给 DSH_AIROOT ⇒ 正常扫到 4 个项目
* selftest --filter 看板:PASS 110 / FAIL 0(报告型 1 条不计入)
* 项目看板服务:pid 40776 · HTTP 200 · <title>项目看板 · 执行任务</title>
· /api/projects 出数据 · /healthz ok
* py_compile 三份改动文件全过
This commit is contained in:
1 parent
52566c79f9
commit
fe22f4cebe
5 files changed
+121
-19
No files matched your search
@@ -3112,7 +3112,10 @@ def t_ws_attribution():
|
||||
# ⛔ 弱锚点的危险:把 `attribution` 从源码里删掉但留个同名注释,它照样绿。
|
||||
_rep = {}
|
||||
try:
|
||||
_rep = ev.env_check("E:/ProgramData/__selftest_no_such_ws__")
|
||||
# 🔴 2026-10-14:传的是**故意不存在**的路径(验"读不出来要如实报")。
|
||||
# ⛔ 去掉盘符 —— 用纯名字即可,判据只关心"它读不出来",
|
||||
# 带盘符反而把这行读成"本机路径"(用户令:能用相对路径的都用相对路径)。
|
||||
_rep = ev.env_check("__selftest_no_such_ws__")
|
||||
except Exception as _e:
|
||||
R.append(("⛔ `env_check` 真跑失败(%r)⇒ 后三条判据无法验" % (_e,), False))
|
||||
_att = (_rep.get("attribution") or {}) if isinstance(_rep, dict) else {}
|
||||
@@ -3660,7 +3663,9 @@ def t_all_sessions_idle_execution_judge():
|
||||
m = imp()
|
||||
import sqlite3
|
||||
|
||||
WS_FAKE = "E:/__selftest_ws__"
|
||||
# 🔴 2026-10-14:假工作区路径**不带盘符** —— 它只用于内存库比对,
|
||||
# 盘符是噪音(用户令:能用相对路径的都用相对路径)。
|
||||
WS_FAKE = "__selftest_ws__"
|
||||
ME_FAKE = "aaaaaaaa-0000-4000-8000-000000000001"
|
||||
OTHER = "bbbbbbbb-0000-4000-8000-000000000002"
|
||||
DONE = "cccccccc-0000-4000-8000-000000000003"
|
||||
@@ -4122,8 +4127,23 @@ def t_execution_doc():
|
||||
_cands = []
|
||||
if os.environ.get("COLLABD_PROD_CONFIG"):
|
||||
_cands.append(Path(os.environ["COLLABD_PROD_CONFIG"]))
|
||||
_cands.append(Path(r"E:/ProgramData/AIProject/ai1net-dsh-server"
|
||||
r"/.workbuddy/collab/collabd.config.json"))
|
||||
# 🔴🔴 2026-10-14(用户令:「能用相对路径的都要用相对路径」):
|
||||
# 原来这里兜底**写死** `E:/ProgramData/AIProject/ai1net-dsh-server` ⇒ 换机必假红。
|
||||
# 改成**扫 `DSH_AIROOT` 下的兄弟区**(取第一个装了机制的)—— ⛔ 不写死某个区名:
|
||||
# 判据="哪个区是生产区"对本脚本没有意义,它只要一份**真实**的部署配置来读 `workspace`;
|
||||
# 写死区名反而把"换机后区名不同"这件事变成永久假红。
|
||||
# ⚠️ `DSH_AIROOT` 由 `env/roots.env` 提供(它自己就是"本机各不同的配置",正解)。
|
||||
_airo = (os.environ.get("DSH_AIROOT") or "").strip()
|
||||
if _airo:
|
||||
try:
|
||||
for _d in sorted(Path(_airo).iterdir()):
|
||||
if not _d.is_dir() or _d.name.startswith((".", "_")):
|
||||
continue
|
||||
_p = _d / ".workbuddy" / "collab" / "collabd.config.json"
|
||||
if _p.is_file():
|
||||
_cands.append(_p)
|
||||
except Exception:
|
||||
pass
|
||||
for _cand in _cands:
|
||||
try:
|
||||
_cfg = _j.loads(_cand.read_text(encoding="utf-8"))
|
||||
|
||||
Reference in new issue
Block a user