Skip to content

✨ 新增 sctl run / sctl logs:触发后台/定时脚本运行并读取脚本运行日志 - #17

Open
CodFrm wants to merge 11 commits into
mainfrom
feature/script-run-logs
Open

CodFrm wants to merge 11 commits into
mainfrom
feature/script-run-logs

Conversation

@CodFrm

@CodFrm CodFrm commented Nov 4, 2026 •

Copy link
Copy Markdown
Member

背景

sctl 无法触发脚本猫的后台/定时脚本运行,也读不到脚本运行日志。这两类脚本跑在 offscreen/sandbox 里,不是网页,sctl 也不能 attach 扩展页面(PAGE_NOT_AUTOMATABLE),所以 AI 代理写完这类脚本后只能请用户去脚本列表里人工查看。

Spec:docs/specs/2026-11-04-script-run-logs.md(本 PR 前两个提交)。

改动

  • 协议:新增 scripts.run、scripts.logs(peer scriptcat,无审批阻塞)。schemaVersion 保持 1.0.0:daemon 握手要求版本完全相等(conn.go:367),升版本会让旧版 ScriptCat 连不上,做法与 ✨ daemon 同时接入多个 ScriptCat 实例,修复普通与隐身进程互相顶替 (#14) #16 一致。protocol.md 中“scriptcat 定义会改变 schemaVersion”的说法已一并更正。生成给 ScriptCat 的 TS 不允许出现 level 子串,所以日志级别字段叫 severity。
  • CLI:
    • sctl run <uuid>:默认等待本次运行结束,--timeout 默认 60s、上限 240s;--no-wait 触发后立即返回。
    • sctl logs <uuid>:支持 --since(默认 1h)、--level(映射到 severity)、--text、--limit(默认 100,范围 1..1000)。
    • 脚本运行结果是 error 时仍以 exit 0 退出,退出码表不变。Ctrl-C 和断开都是 exit 2。
    • 旧版 ScriptCat 返回 METHOD_NOT_FOUND 时附带升级提示,提示文案放在 internal/cli/upgradehint,供 MCP 复用。
    • 脚本可控的文本经过 terminalSafe 转义后才输出到终端。
  • MCP:scripts_run / scripts_logs 的参数与 CLI 等价,不发“等待审批”进度,工具描述是静态文本。
  • 文档:cli.md、mcp.md、architecture.md、README(中英)、skills/sctl 已同步。threat-model.md 把这两个操作列入未门控能力,并记录维护者于 2026-11-04 接受的残余风险:持有控制 token 的进程可以反复触发已安装的后台脚本,并读到 GM_log 过的内容。
  • CI:SCRIPTCAT_REF 指向 ScriptCat 373a117c。

已知限制

  • ScriptCat 的运行状态事件没有运行 id。外部运行和编辑器“运行”或 cron 触发交叠时仍可能误认状态(ScriptCat 侧已标注,根治需要 sandbox 发出运行 id)。
  • 生产构建的 ScriptCat 不会把 GM_log 的 debug 级别写进日志库,run/logs 看不到 debug 日志。
  • MCP 参数越界时,报错信息里带有本机的 file:// 路径,来自 jsonschema 的错误格式。

关联

验证

base 2939485…head dc71bef,26 个文件。

  • go test ./... -race exit 0;make protocol-check exit 0;golangci-lint run ./... 0 issues。
  • 本地模拟 CI 的生成物字节比对:用旧的 SCRIPTCAT_REF 比对 exit 1,用 373a117c 比对 exit 0。
  • 真实验证(按 docs/verification.md):本分支构建的 daemon 隔离在 127.0.0.1:18643、使用临时 data dir,配对由 #1825 构建、在无头 Chromium 中运行的 ScriptCat。spec 的 18 项要求全部通过,包括:
    • complete、error、超时 running、--no-wait;
    • 页面脚本返回 INVALID_REQUEST,未知 uuid 返回 NOT_FOUND;
    • 各过滤条件和上下限,审计记录被排除且不含日志正文;
    • MCP 与 CLI 一致、没有审批进度;
    • Ctrl-C 和断开都是 exit 2,已触发的运行不被撤回;
    • 用 ScriptCat 基线 6c0459b8 构建的旧版收到 METHOD_NOT_FOUND 和升级提示,已有命令照常可用;
    • 多个实例在线时返回 SCRIPTCAT_AMBIGUOUS。
  • 尚未经过人工审查。

审查修复(2026-11-05)

  • 729a663 spec 修订:
    • run-in 不符立即返回 INVALID_REQUEST;
    • 排队时间计入超时;--no-wait 不排队;取消时放弃还在排队的运行;
    • 旧运行晚到的结束不得算作本次结果;日志字段编码容错;
    • MCP 运行等待期间发进度通知。
  • 62ef80d:
    • MCP scripts_run 等待期间发中性进度(“Waiting for the script run to end…”),避免客户端 60 秒左右超时;wait:false 和 scripts_logs 不发。
    • sctl run 被 Ctrl-C 时,提示运行可能已在 ScriptCat 中进行,不再说“已作废”。
    • run 的日志被截断时,提示改用 sctl logs <uuid> 查看完整记录。
    • 升级提示同时覆盖旧版 ScriptCat 和旧版 daemon 两种情况。
  • dc71bef:protocol.md、cli.md、mcp.md、skills/sctl 按修订后的 spec 更新。

验证(head dc71bef):

  • go test ./... -race exit 0(我修复后自己重跑的结果),golangci-lint 0 个问题,make protocol-check exit 0。
  • 与 ScriptCat #1825 3b0038f5 联合做了真实验证。
  • 生成文件没有改动,SCRIPTCAT_REF 不变。

CodFrm added a commit to scriptscat/scriptcat that referenced this pull request Nov 5, 2026
…间接办法

- dev-loop.md:新增 sctl run / sctl logs 用法与注意事项(只限后台/定时脚本、exit 0 看状态、不经审批但有真实副作用、
  手动运行不排重试、debug 级 GM_log 不入库、与编辑器运行或 cron 交叠可能误认),旧 sctl / 旧脚本猫的识别与回退
- background.md:删去无代码依据的「编辑器运行不同步值、菜单不触发」,改为与 sctl run 同一通路
- SKILL.md、api.md:GM_log 的 debug 级别在正式版不入库
- README 已知限制:依赖 scriptscat/sctl#17 与 #1825 的版本
- MCP scripts_run 等待期间周期发 progress(文案不提审批),wait:false 与 scripts_logs 不发
- sctl run 被 Ctrl-C 时说明运行可能已在 ScriptCat 中进行,不再说操作已作废
- run 结果日志被截断时提示 sctl logs <uuid>,不再指向 run 没有的筛选参数
- 升级提示同时覆盖旧版 ScriptCat 与旧版 sctl daemon
- 修正 error 状态行的悬空冒号与 --timeout 上限的写法
- 补日志表格终端转义与 --since 30m 的测试
- protocol.md/cli.md/mcp.md:run-in 不符、统一超时含排队、wait:false 不排队、取消放弃未触发的排队运行
- METHOD_NOT_FOUND 的来源改为 daemon 的能力检查,并补旧版 daemon 需重启的说明
- mcp.md:scripts_run 等待期间发 progress,如实描述其他 ScriptCat 工具的 progress
- 技能说明:logs 的 limit 语义(取最新 N 条、按旧到新打印)与 run-in 失败
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant