内容分四块: 1、产品规划产出 —— MCN 短视频整合营销工作台的①段五份(1a 需求/1b 竞品/1c 画像/1d 策略/1e 场景)、②段两份(2a 功能/2b 布局)、③段界面(DESIGN.md 契约与令牌表 + mcn-workbench.html 原型 + 实测/会诊/审查三份 + 23 张闸门截图)。 2、开源竞品调研 —— 5 个内容工作台项目的取证原始件与 1b 系列分析文档。 3、参考资料 —— 竞品视频抽帧 1145 张 + 2 个源视频 + 功能点截图。 4、机制侧 —— 协作脚本与状态台账、工作区记忆日志、抽帧/OCR 脚本。 .gitignore 只排运行时日志、脚本备份副本与一次性探针输出,其余按原样入库。
50 lines
2.4 KiB
Python
50 lines
2.4 KiB
Python
# -*- 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__")
|