Skip to content

feat(skills): 可选内置 run_skill_script —— 无 MCP 也能跑技能自带脚本(默认关 / allowlist / HITL) #9

Description

@EpisodeYu

背景

标准 Agent Skill 现在不只含 prompt,还普遍带 scripts/ / references/ / assets/(如 Anthropic 官方 skill-creatorpdfdocxxlsxpptx)。

产物目前的 SKILL 支持:

  • L1 发现注入 + L2 read_skill 读正文:内置、自包含。
  • L1/L2 已带技能目录绝对路径(commit 57c7ed9),相对引用 scripts/x 可解析。
  • L3 跑脚本 / 读资源:完全依赖产物装有文件/shell 工具,而唯一来源是 MCP(Desktop Commander)

实测结论(mimo-v2.5-pro + 真实 skill-creator):skills.enabledmcp 关闭时,read_skill 只能给"正文+目录",技能脚本/资源够不着,L3 形同虚设。也就是说"完全支持 Skill"目前隐含一个硬前提:必须开 MCP + 装 Desktop Commander(Node 系、需联网首装)。

提议

harness/skills.py(仅 skills.enabled 时生成)加一个极薄、默认关、走 allowlist + HITL 的内置工具 run_skill_script,让产物不依赖 MCP 也能跑技能自带脚本——补齐 L3 的"脚本"半边。资源读取(references/assets)L2 的 read_skill 思路可另配一个 read_skill_file(只读、低风险),本 issue 先聚焦脚本执行。

设计草图(待评审)

@registry.tool(name="run_skill_script", risk=HIGH, ...)
def run_skill_script(skill: str, script: str, args: list[str] | None = None) -> str:
    # 1) 经 discover_skills 解析 skill -> 限定在已配置 skills.dirs 内(skill 不存在则拒)
    # 2) script 相对技能目录解析后 .resolve(),断言仍在技能目录内(挡 ../ 逃逸)
    # 3) subprocess 跑,cwd=技能目录,带 timeout,stdout/stderr 截断(复用工具结果截断口径)
    # 4) 返回退出码 + 截断后的输出
  • 风险姿态:risk=HIGH → 默认不在 allowlist、confirm: high 下逐次 HITL、非交互 fail-closed——与 DC shell 同级。
  • :只用 stdlib subprocess;skills.enabled=false 时零痕迹;不进默认核心依赖。
  • 路径围栏:只能跑"已发现技能目录"内的脚本,../ 逃逸拒绝(这是工具自身的输入校验,非安全边界——真隔离仍靠 Docker)。

需要人拍板的点(命中 CLAUDE.md §6)

  1. 定位红线软化:slice-6 §0 明确"基线能力全来自 MCP、产物不自写实用 built-in"。本工具是产物自写的脚本执行 built-in,虽默认关 + 仅 skills 下生成,仍是对该定位的有意松动 —— 要不要做、是否只在 skills.enabled 下、是否标注为 skills 专属(只跑技能目录内脚本、不做通用 shell),需签字。
  2. 解释器范围:只支持 .py(走当前 sys.executable,覆盖 Anthropic 文档系技能的绝大多数),还是也支持 .sh/任意可执行?倾向先只 .py,shell 仍交给 MCP,保持薄。
  3. 与"安全面":新增本机任意(技能目录内)脚本执行面,文档需同步"勿对公网暴露 / 本地可信"口径(同 DC/MCP 管理面)。

退出门禁(验收)

  • skills.enabled 才生成;默认不在 allowlist、risk=HIGH;skills.enabled=false 零痕迹。
  • 单测:路径围栏(../ 逃逸 / 未知 skill 拒绝)、超时、输出截断。
  • golden/mock:把它 allowlist 后,MCP 全关的产物仍能用 run_skill_script 跑通一个技能自带的 trivial 脚本并拿到输出。
  • skills.py 仍守 ~60–130 行薄预算(本工具约 +40 行,可能逼近上限,超则停问人,见 CLAUDE.md §6.8)。
  • ReadLints clean;文档同步(slice-6 + overview §6 技能行 + 产物 README/AGENTS 安全面口径)。

参考

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestfeature新功能 / feature work

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions