重开仓库内容:改推五个技能(browser-harness / humanizer / humanizer-zh / product-planning / session-mechanism)
按授权清空原有内容后重新提交(原 oil-ui-pro 一并移出,可从历史恢复)。 browser-harness 剔除 .venv 等运行环境;根 .gitignore 补记 .venv/ 与 node_modules/。
This commit is contained in:
1 parent
9a152a1952
commit
777f7fe5d0
240 files changed
+52518
-4409
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user