重开仓库内容:改推五个技能(browser-harness / humanizer / humanizer-zh / product-planning / session-mechanism)

按授权清空原有内容后重新提交(原 oil-ui-pro 一并移出,可从历史恢复)。
browser-harness 剔除 .venv 等运行环境;根 .gitignore 补记 .venv/ 与 node_modules/。
This commit is contained in:
admin committed 2026-10-07 16:06:02 +08:00
1 parent 9a152a1952
commit 777f7fe5d0
240 files changed
+52518 -4409

No files matched your search

+58 -5
View File
@@ -67,6 +67,7 @@ HB_FRESH_S = 90 # 🔴 心跳新鲜阈值(与 `collabd.supervise_aliv
WORKSPACES = [
"E:/ProgramData/AIProject/ai1net-dsh-server",
"E:/ProgramData/AIProject/vibe-product",
"E:/ProgramData/AIProject/content_marketing_agent",
]
# 看板:全局只一条(⛔ 不是每区一条)
@@ -83,6 +84,7 @@ BOARD_PORT = 20099
KEEPALIVE_TASKS = { # 新形态:计划任务 → pythonw collabd.py --supervise
"E:/ProgramData/AIProject/ai1net-dsh-server": "collabd-keepalive-ai1net-dsh-server",
"E:/ProgramData/AIProject/vibe-product": "collabd-keepalive-vibe-product",
"E:/ProgramData/AIProject/content_marketing_agent": "collabd-keepalive-content_marketing_agent",
}
BOARD_TASK = "dsh-board-keepalive"
@@ -91,10 +93,16 @@ SCHED_TASKS = [
"collabd-supervise-ai1net-dsh-server",
"collabd-supervise-vibe-product",
"collabd-supervise-selftest",
# 🔴 2026-10-07 补:本区改名前的旧任务。它**动作指向已不存在的
# `.../agent-product/.workbuddy/collab/supervise-launch.py`**,状态恒 Ready
# ⇒ 到点必失败的静默死任务。先前漏网的原因=**本区不在 WORKSPACES 名单里**,
# 而本清单只列已知区 ⇒ 改名残留的旧任务谁都没扫到(判据盲区,同族见本期 memory)。
"collabd-supervise-agent-product",
"dsh-board-20099",
]
_OUT = None
ONLY_WS = None # 🔴 2026-10-07:非 None ⇒ 本次调用已用 `--ws` 收敛到单区(⛔ 跳过看板)
def _p(*a):
@@ -131,11 +139,24 @@ def _ps(script: str) -> str:
② **⛔ 更不许带 breakaway** —— 直接被拒;
③ ✅ 查询一律 **`creationflags=0`**。它是短命进程且 `capture_output` 走管道,
**不会弹窗**(弹窗来自"计划任务里跑控制台程序",不是这里)。
🔴🔴 2026-10-07 **订正上面 ③ 的后半句**:`creationflags=0` 仍会**闪窗**。
证据链:本机 `collabctl.py status` 由 `pythonw.exe` 起(⚠️ 本入口按章法就必须用 pythonw,
pythonw = GUI 子系统 ⇒ **父进程没有控制台**)⇒ 子进程 `powershell.exe` 是**控制台程序**
且**未带 `CREATE_NO_WINDOW`** ⇒ Windows 必须给它**新分配一个控制台** ⇒ **弹窗**。
实测读数:`collabctl.py status` 自报的进程清单里就挂着它自己那条
`powershell.exe <pid> -NoProfile -NonInteractive -Command "Get-CimInstance Win32_Process …"`。
✅ **修法=只加 `CREATE_NO_WINDOW`(0x08000000)** —— ⛔ 不带 `DETACHED`/`NEW_GROUP`
(那两样才是吞回显的元凶,见上面 ①/②);`capture_output` 走管道不受影响。
⚠️ 同族检查:`collabd.py` 的 4 处 powershell/netstat 调用**都已带** `0x08000000`,
**全族只有本函数漏了** ⇒ 收口口径=凡 spawn `powershell.exe`/`tasklist`/`netstat`
等**控制台程序**,一律补 `CREATE_NO_WINDOW`。
"""
try:
r = subprocess.run(
["powershell.exe", "-NoProfile", "-NonInteractive", "-Command", script],
capture_output=True, timeout=60, check=False, stdin=subprocess.DEVNULL)
capture_output=True, timeout=60, check=False, stdin=subprocess.DEVNULL,
creationflags=0x08000000) # CREATE_NO_WINDOW(⛔ 缺了会闪窗)
return (r.stdout or b"").decode("utf-8", "replace")
except Exception:
return ""
@@ -349,8 +370,14 @@ def _kill_pid(pid) -> bool:
def disable_tasks():
"""禁用**全部**相关任务:旧的(powershell 形态)+ 新的(keepalive 形态)+看板。"""
for t in list(SCHED_TASKS) + list(KEEPALIVE_TASKS.values()) + [BOARD_TASK]:
"""禁用**全部**旧形态任务 + 本轮涉及区的保活任务。⚠️ 带 `--ws` ⇒ ⛔ 不碰全局看板。
⚠️ **旧形态清单(`SCHED_TASKS`)不做区过滤,一律全禁**:它的语义就是「旧形态死名单」,
按名单逐条 `Disable-ScheduledTask`;不在册的区是 no-op(已经是 Disabled),
而在册的我方遗留任务(改名前的旧名)**必须**能被禁掉 —— 按区名后缀过滤会正好漏掉它
(`collabd-supervise-agent-product` 不以新工作区名结尾 ⇒ 过滤后一条都匹配不上)。
"""
for t in list(SCHED_TASKS) + list(KEEPALIVE_TASKS.values()) + ([] if ONLY_WS else [BOARD_TASK]):
_ps("Disable-ScheduledTask -TaskName '%s' -ErrorAction SilentlyContinue | Out-Null" % t)
@@ -400,7 +427,7 @@ def ensure_keepalive_tasks():
% (pyw, launcher, wd, task))
made.append(task)
_p(" ✓ 保活任务就绪:%s" % task)
if os.path.isfile(BOARD_PY):
if os.path.isfile(BOARD_PY) and not ONLY_WS:
# 🔴🔴 2026-10-05 修:看板**必须经启动器起**(`board-launch.py`),⛔ 不许直起 `board.py`。
# 直起 ⇒ 崩溃重启循环、20099 从没绑上。真因(抓到的现场输出):
# `⚠️ collabd:未找到部署配置(COLLABD_CONFIG 未设 …)⇒ 已拒跑`
@@ -432,7 +459,9 @@ def ensure_keepalive_tasks():
def trigger_tasks():
"""立刻触发当前处于启用态的相关任务(常驻本体自带单例让位,⛔ 不会叠加成两条)。"""
n = 0
for t in list(KEEPALIVE_TASKS.values()) + [BOARD_TASK]:
# ⚠️ 带 `--ws` ⇒ ⛔ 不碰全局看板任务(看板是共享件,不属任何单区)。
_ts = list(KEEPALIVE_TASKS.values()) + ([] if ONLY_WS else [BOARD_TASK])
for t in _ts:
st = _ps("(Get-ScheduledTask | Where-Object { $_.TaskName -eq '%s' }).State" % t).strip()
if st and st.lower() != "disabled":
_ps("Start-ScheduledTask -TaskName '%s' -ErrorAction SilentlyContinue | Out-Null" % t)
@@ -534,6 +563,30 @@ def main():
if i + 1 < len(args):
out = args[i + 1]
del args[i:i + 2]
# 🔴🔴 2026-10-07 新增:`--ws <工作区>` = 把作用面**收敛到一个工作区**。
# 动机:红线「⛔ 不许一区去起另一区」。原先 `on`/`ensure` 一律遍历全部 WORKSPACES +
# 顺带重建全局看板任务 ⇒ 在本区起常驻时**会顺手动别的区**(重建它们的任务/触发它们)。
# ⇒ 带 `--ws` 时:名单只留该区 + **跳过看板**(看板是全局共享件,不属任何单区)。
only = None
if "--ws" in args:
i = args.index("--ws")
if i + 1 < len(args):
only = args[i + 1].replace("\\", "/").rstrip("/").lower()
del args[i:i + 2]
_a = args[0] if args else "status"
if only is not None and _a not in ("status", "off", "on", "ensure", ""):
_a = "status"
if only is not None:
_keep = [w for w in WORKSPACES if w.replace("\\", "/").rstrip("/").lower() == only]
if not _keep:
print("⛔ --ws 不在管辖名单里:%s" % only)
print(" 名单:" + " | ".join(WORKSPACES))
return 2
global ONLY_WS
ONLY_WS = _keep[0]
WORKSPACES[:] = _keep
for _k in [k for k in KEEPALIVE_TASKS if k.lower() != only]:
del KEEPALIVE_TASKS[_k]
a = args[0] if args else "status"
global _OUT