happyplum/workskills

long-running-process

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

ソースを見る

使い方

  1. インストールコマンドをコピーし、自分の環境へ導入する前にソースを確認します。
  2. 必要なツール、認証情報、対応環境を原文で確認します。
  3. 入力と成果物を指定し、出力を資料と照合します。
npx skills add https://github.com/happyplum/workskills --skill long-running-process

開始前の確認

  • 導入にはモデル契約、API枠、ファイルへのアクセス許可は含まれません。
  • スター数や導入数は活動の指標であり、独立した品質・安全性試験ではありません。
リポジトリの原文

見出し、例、コード、表、リンク、参照画像を含む原文を表示しています。

长运行进程安全启动(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 工作目录
同じリポジトリから

関連する Skills

すべての Skills
happyplum
コミュニティ

audit-loop

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

導入数
1
GitHub Stars
1
更新日
10月8日
happyplum
コミュニティ

deep-thinking

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

導入数
1
GitHub Stars
1
更新日
10月8日
happyplum
コミュニティ

linearize-commits

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

導入数
1
GitHub Stars
1
更新日
10月8日
happyplum
コミュニティ

opencode-subagent-log-triage

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

導入数
1
GitHub Stars
1
更新日
10月8日