happyplum/workskills

long-running-process

当确认当前运行环境是 Windows + PowerShell,且需要启动或排查长运行进程、等待端口/health endpoint、按 RunId 停止残留、或执行可能超时的构建命令时使用。

Quelltext ansehen

Verwendung

  1. Installationsbefehl kopieren und das Quellpaket vor der Installation in der eigenen Agentenumgebung prüfen.
  2. Benötigte Werkzeuge, Zugangsdaten und Hosts im Original prüfen.
  3. Eingabe und gewünschtes Ergebnis beschreiben und die Ausgabe mit den Quellen abgleichen.
npx skills add https://github.com/happyplum/workskills --skill long-running-process

Vor dem Start

  • Die Installation umfasst weder Modellabo noch API-Kontingent oder Dateizugriffsrechte.
  • Sterne und Installationen zeigen Aktivität, keine unabhängige Qualitäts- oder Sicherheitsprüfung.
Originales Skill-Dokument

Aus dem Quell-Repository gerendert; Überschriften, Beispiele, Code, Tabellen, Links und Bilder bleiben erhalten.

长运行进程安全启动(Windows)

概述

OpenCode shell 在 Windows 上跑 PowerShell,并有可配置超时;超时会 taskkill /T /F 杀命令树。当前执行链通常不能自动降级重试。

核心风险:

  • 无界轮询(while 无上限)→ 命令永不返回 → 被平台杀死
  • 在 OpenCode shell 内用 Start-Process 启长运行进程 → 子进程可能继承 pipe → Node close 不触发
  • WMI 启动的应用是 detached 的:wait-ready 失败或 shell 超时后,app 仍可能存活。无 RunId ownership 时会变成 unmanaged orphan

推荐模型:WMI → ASCII-only cmd launcher(仅含 pwsh/supervisor/config 的 ASCII 路径)→ PowerShell supervisor → ProcessStartInfo.ArgumentList 启应用(AppPid)。用户参数与 Unicode 工作目录只在 UTF-8 JSON config 中。ControlPid 为 cmd 树根。State:%TEMP%\opencode-long-running\<RunId>.json。

范围:Windows(PowerShell 7+)应用进程(dev server、构建、watcher)。浏览器自动化工具进程不在范围。Unix/macOS 不在范围。

与恢复 skill:中断后续派前须证明旧 writer 已停且残留可复用/已停;应用侧 stop/cleanup 由本 skill 脚本完成。

强制规则

#规则验证
1禁止无界等待:内部等待必须有 MaxWait;且 MaxWait + cleanup margin < 本次显式 outer timeout循环有上限;outer timeout 显式且更大
2长运行后台不得在 OpenCode shell 内 `Start-Process`:用 start-background.ps1(WMI → ASCII launcher → supervisor + ArgumentList).cmd 仅含 ASCII 路径、无用户参数;输出含 RunId/ControlPid/AppPid/State
3就绪检查独立、有界、失败 exit 1:与 start 分两个 tool call;有 RunId 时 listener 必须属于该 control 树wait-ready -RunId;外来占端口 → 失败
4可能长跑的 shell 必须显式 `timeout`(ms):不依赖平台默认值写预算;默认/最大值以当前 tool schema 为准,skill 不固化易漂移数字调用带 timeout=;与 MaxWait 一致可算
5端口占用不得默认成功:start 前占用 → fail;ready 必须 ownership;cleanup 多 listener → 拒绝见脚本 exit 1 文案
6停止走 RunId:非端口 watcher 也必须能 stop-background -RunId;禁止只记 PID 文本当契约state 文件存在且 stop 后树消失

超时预算(无版本断言)

  • 唯一稳定式:inner MaxWait + cleanup margin < 本次调用显式 outer timeout
  • 冷启动选足够大的 MaxWait(按项目经验),不要抄已过时的「默认 120s」表当真理
  • 参考量级(非硬编码 SLA):Vite 热 ~数秒~30s;Next 冷可到 ~60s;Cargo 冷可到数分钟——以本次 outer timeout 能盖住为准

脚本

路径:<skill-dir>/scripts/(skill location 见加载信息)。

启动 + 就绪 + 停止

powershell
# 1. 启动(独立 shell tool call;CommandArgs 用数组)
& <skill-dir>/scripts/start-background.ps1 -Pm pnpm.cmd -CommandArgs @('dev') -Port 3000 -Dir 'C:\proj' -LogPrefix dev
# 2. 就绪(独立 call;用返回的 RunId)
& <skill-dir>/scripts/wait-ready.ps1 -RunId <RunId> -MaxWait 60
# 可选 health:
# & <skill-dir>/scripts/wait-ready.ps1 -RunId <RunId> -MaxWait 60 -HealthUrl http://localhost:3000/
# 3. 停止
& <skill-dir>/scripts/stop-background.ps1 -RunId <RunId>

无端口的 watcher/构建长任务:省略 -Port,仅用 RunId 生命周期。

脚本用途关键参数
start-background.ps1WMI supervisor 启动;写 RunId state-Pm -CommandArgs [-Port] -Dir -LogPrefix
wait-ready.ps1有界 ready;-RunId 时校验 listener 归属-MaxWait [-RunId] [-Port] [-HealthUrl]
stop-background.ps1按 RunId taskkill 树并验证-RunId [-RequirePortFree]
capture-timed.ps1限时捕获后杀树(smoke)-Exe -CommandArgs -TimeoutSec -LogPrefix [-Dir]
cleanup-port.ps1无 RunId 时按端口+RequireMatch 清理;多 listener 拒绝-Port -RequireMatch
classify-failure.ps1读 stderr 粗分类-LogPath
common.ps1 / supervisor-run.ps1内部原语;不要直接当业务入口—
cleanup-port 的 -RequireMatch 必须是绝对项目路径或唯一标记,禁止 node/pnpm 裸名。优先 stop-background -RunId。

State 目录:%TEMP%\opencode-long-running\<RunId>.json(含 ControlPid、AppPid、WorkDir、Port、日志路径)。

反例

❌✅
无界 while { Start-Sleep 1 }wait-ready -MaxWait N
端口已监听就 exit 0无 RunId 归属证明则失败
OpenCode shell 内 Start-Process 挂 dev serverstart-background.ps1
ASCII .cmd + 拼接 CommandArgsArgumentList + UTF-8 config
只保存 "PID: 1234" 跨 session 再杀使用 RunId state + stop-background
ready 超时后不经 stop 再 start先 stop/cleanup 或证明旧进程可复用
依赖 skill 写死的「默认 120s」算预算每次显式 outer timeout + MaxWait

平台事实(易变 — 以运行时为准)

项说明
范围Windows,PowerShell 7+
shell 默认/最大 timeout读当前 bash/shell tool schema;本 skill 不写死毫秒数
超时 killtaskkill /pid … /T /F
detached 语义WMI 子树不因 wait-ready 的 exit 1 而自动消失
编码路径与参数经 JSON/ArgumentList,支持 Unicode 工作目录
aus demselben Repository

Weitere Skills

Alle Skills
happyplum
Community

audit-loop

当用户说「审计循环」「循环审计」「audit loop」「温链复审」「审查修复循环」,或要求「审查→修复→再审查直到子代理审计通过」的迭代验证流程时必须加载。编排只读审查子代理对指定对象(提交区间、文件、实现或计划)做循环审计:审查→修复→温链续审→再修复,直至审查子代理明确无误通过。用户点名了子代理(如 oracle、metis、momus 等)就直接用;只说「进行审计循环」未点名时先从最近对话推断并向用户确认;绝不把负责执行 task 的子代理当作审计者。

Installationen
1
GitHub Stars
1
Aktualisiert
8. Okt.
happyplum
Community

deep-thinking

当用户使用 ult、启用 ulw,或明确要求"深度思考""帮忙思考""帮我思考""超级思考""深度分析"时加载。默认常驻普通模式;本 skill 仅在上述触发条件满足时激活,覆盖简洁优先原则。

Installationen
1
GitHub Stars
1
Aktualisiert
8. Okt.
happyplum
Community

linearize-commits

线性化整理 git 提交历史——合并细碎的修正提交、控制颗粒度以支持按提交粒度回退、保留原始开发者的作者归属、不跳过项目 git hooks、把每条提交信息规范为 type(scope): 中文描述;整理后可选并入指定分支(未指定时默认为主干)。当用户要求「合并到主干」「合并到某个分支」「线性化合并」「rebase 到 main/master」「整理/压缩/squash 提交历史」「分支合并前清理历史」时必须加载;纯整理不带合并时同样加载——如「整理一下这个分支的提交」「重写某个 hash 之后的历史」「squash 最近几个提交」「整理已经推送的分支(可 force-push)」;即使用户只说「把这个分支合到 main / 合回主干」也应加载,因为历史整理是合并前的必要步骤。普通单次提交、只读 log 查询不触发。

Installationen
1
GitHub Stars
1
Aktualisiert
8. Okt.
happyplum
Community

opencode-subagent-log-triage

当 OpenCode 子代理、子会话、工具调用、后台任务或 Playwright 浏览器检查看起来卡住时使用——尤其是用户提供 session ID、子会话标题、工具描述、worktree 路径,或要求在决定是否终止进程前检查 OpenCode 本地日志/会话数据时。也用于执行会话审计与追溯:某次开发「费时费钱」、统计成本与 token、重建父子会话树、盘点某计划派了哪些子代理、找出最贵/最慢的会话时。

Installationen
1
GitHub Stars
1
Aktualisiert
8. Okt.