Files
workbuddy_skills/session-mechanism/scripts/board-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

53 lines
2.7 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 -*-
"""看板启动器(无控制台)—— 🔴 计划任务的**看板载体**只许指向本文件,⛔ 不许直接指 `board.py`。
🔴🔴 2026-10-05 **为什么必须要有这个启动器**(本轮实测踩到的坑,P0-72):
我一度把看板任务的动作写成 **`pythonw.exe board.py --serve 20099`**(直起)——
结果看板**崩溃重启循环、20099 从没绑上**。抓现场输出看到真因:
`⚠️ collabd:未找到部署配置(COLLABD_CONFIG 未设,且 <scripts>\\.workbuddy\\collab\\collabd.config.json 不存在)`
` ⇒ 已拒跑`
`board.py` 顶层用 `COLLABD_CONFIG` 定位配置(它要 `import collabd.py`,而 collabd 要配置);
计划任务的**动作里没有 env 字段** ⇒ 这个变量必须由**启动器在进程内设好**。
⇒ 正解=启动器(本文件):`pythonw.exe board-launch.py`,env 在 Python 进程内设。
⚠️ **看板是全局共用一份**(用户拍板)⇒ 它的配置**固定指向主工作区**(`DSH_WS_ROOT`)那份,
⛔ 不随工作区变。主工作区由 `roots.env` 的 `DSH_WS_ROOT` 决定,兜底写死 ai1net-dsh-server。
"""
import os
import sys
# 🔴 主工作区根 —— 看板配置的真源(与 `roots.env` 的 `DSH_WS_ROOT` 同口径)
WS = os.environ.get("DSH_WS_ROOT") or r"E:\ProgramData\AIProject\ai1net-dsh-server"
WS = WS.replace("/", "\\")
HERE = os.path.dirname(os.path.abspath(__file__))
BOARD = os.path.join(HERE, "board.py")
PORT = os.environ.get("DSH_BOARD_PORT") or "20099"
CFG = os.path.join(WS, ".workbuddy", "collab", "collabd.config.json")
os.environ["COLLABD_CONFIG"] = CFG
os.environ.setdefault("CODEBUDDY_CONFIG_DIR", r"E:\ProgramData\.workbuddy")
os.environ["PYTHONIOENCODING"] = "utf-8"
os.environ["PYTHONUNBUFFERED"] = "1"
# 🔴 `pythonw.exe` 下 `sys.stdout/stderr` 可能是 `None` ⇒ 任何 `print` 都会 `AttributeError` 秒退。
# ⇒ 先把两个流兜到日志文件,再看板自己去跑(它内部也有 reconfigure 兜底)。
LOG = os.path.join(WS, "tmp", "board-serve.err.log")
try:
_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
# 🔴 用 `runpy.run_path`(⛔ 不用 `exec`):`runpy` 会把 `__name__`/`__file__`/`sys.path[0]` 都
# 按"真在跑那个脚本"设好 ⇒ `board.py` 顶部的 `_sm_load_roots()`(靠 `__file__` 找 `roots.env`)与
# 命令行分发(它自己读 `sys.argv`)全对。(旧故障记录:`exec` 版从 `System32` 起 rc=1 零输出。)
import runpy
sys.argv = [BOARD, "--serve", str(PORT)]
runpy.run_path(BOARD, run_name="__main__")