Files
workbuddy_skills/session-mechanism/scripts/supervise-launch.py
T
admin 19101acd65 init: workbuddy_skills 重建,仅收录 session-mechanism
- 按用户指示清空原有 25 技能内容,只提交 session-mechanism(57 文件)
- 附 .gitignore(产物 + 本机凭据)
- 令牌明文已脱敏(历史 .neodata_token 与 pitfalls 引用均不入库)
- 本提交为孤儿提交(父提交为空),历史自此重新开始
2026-10-05 14:13:24 +08:00

50 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""常驻启动器(无控制台)—— 🔴 计划任务的**常驻载体**指向本文件,⛔ 不许直起 `collabd.py`。
🔴🔴 2026-10-05 **为什么必须要有这个启动器**(本轮实测踩到的坑,P0-73):
新形态(计划任务 → `pythonw.exe` → `collabd.py --supervise`)**直起**时,
任务环境里**没有 `CODEBUDDY_CONFIG_DIR`** —— 旧看守 `start-supervise.ps1` 里那句
`$env:CODEBUDDY_CONFIG_DIR = "E:\\ProgramData\\.workbuddy"`
在我改成两层形态时**被丢掉了** ⇒ 后果:
· `_wb_db()` 落到 `~/.workbuddy/workbuddy.db`(**0 字节空库**)⇒
· `_all_sessions_idle()` 每轮报 **`no such table: sessions`** ⇒ 闸② 恒判"有会话在跑"
· ⇒ **检查会话再也不建**(实测日志 36 次读库失败,最后一次成功建排期停在 11:54)。
⚠️ 为什么有的区没炸:那区的 `collabd.config.json` 里 `host_db` **写死了绝对路径**(兜住了)。
⇒ **两种兜底都要有**:启动器设 env(通用)+ 配置可写 `host_db`(单区保险)。
🔴 用 `runpy.run_path`(⛔ 不用 `exec`):`runpy` 会把 `__name__`/`__file__`/`sys.path[0]`
都按"真在跑那个脚本"设好 ⇒ `collabd.py` 顶部的 `_sm_load_roots()` 靠 `__file__` 找 `roots.env`
与命令行分发(它自己读 `sys.argv`)全对。
"""
import os
import sys
# 🔴 启动器所在目录即本区 `.workbuddy/collab`(由 init_workspace 分发到各区)
HERE = os.path.dirname(os.path.abspath(__file__))
CB = os.path.join(HERE, "collabd.py")
CFG = os.path.join(HERE, "collabd.config.json")
# 🔴 活动环境目录(宿主库所在)—— 这是**旧看守里有、新形态里被我漏掉**的那一条。
os.environ.setdefault("CODEBUDDY_CONFIG_DIR", r"E:\ProgramData\.workbuddy")
os.environ["COLLABD_CONFIG"] = CFG
os.environ["PYTHONIOENCODING"] = "utf-8"
os.environ["PYTHONUNBUFFERED"] = "1"
# 🔴 `pythonw.exe` 下 `sys.stdout/stderr` 可能是 `None` ⇒ 任何 `print` 都会 `AttributeError` 秒退。
LOG = os.path.join(HERE, "logs", "_supervise-launch.log")
try:
os.makedirs(os.path.dirname(LOG), exist_ok=True)
_f = open(LOG, "a", encoding="utf-8", errors="replace")
except Exception:
_f = None
if _f is not None:
if sys.stdout is None:
sys.stdout = _f
if sys.stderr is None:
sys.stderr = _f
import runpy
sys.argv = [CB, "--supervise"]
runpy.run_path(CB, run_name="__main__")