Skip to content

feat: 支持会话级 Skill 选择与隔离(inherit / none / selected) #541

Description

@asteroida123

feat: 支持会话级 Skill 选择与隔离(inherit / none / selected)

背景

Codeg 目前已经支持统一管理多个 Coding Agent 的 Skills,也支持 Global / Project 两种 Skill scope。

但当前 Skill 的启用方式仍然主要是 Agent 全局级别

Agent
  ↓
Global / Project Skills
  ↓
该 Agent 的所有 Session 都能看到

随着安装的 Skills 越来越多,这种方式会带来几个问题:

  1. 无关 Skill 会进入当前任务上下文

    • 很多任务只需要少量 Skills。
    • 例如修复一个 Rust bug 时,可能只希望启用 debugging / rust-review,而不希望 frontend、browser、slides、office 等 Skills 同时参与。
  2. Skill 过多会增加上下文和 Agent 决策负担

    • Codex 本身在 Skill 数量较多时已经会提示 Skill descriptions 因 context budget 被压缩,并建议禁用不需要的 Skills。
    • 因此 Skill 管理除了“安装了哪些”,还需要解决“当前任务允许哪些”。
  3. 不同 Session 无法拥有不同能力集合

    • 同一个 Codex / Claude Code 同时运行多个 Session 时,理想状态应该允许:
Session A
Skills: debugging

Session B
Skills: frontend-design + browser-testing

Session C
Skills: none

这些 Session 应该可以同时运行且互不影响,而不是共同修改 Agent 的全局 Skill 目录。

建议

为 Session 增加一个明确的 Skill Policy:

inherit
none
selected

1. inherit

保持当前默认行为:

Global Skills
+
Project Skills

这是默认值,确保现有用户行为完全不变。

2. none

当前 Session 不加载任何用户 Global / Project Skills。

需要做到真正隔离,而不是仅仅在 Prompt 中告诉 Agent:

Do not use skills

Agent 本次 Session 应实际无法发现或调用这些 Skills。

3. selected

当前 Session 只加载明确选择的 Skills,例如:

Selected Skills:

✓ debugging
✓ rust-review
□ frontend-design
□ browser-testing
□ slides

即使其他 Skills 已经全局安装,本 Session 也不应该看到它们。

期望的用户体验

在创建/运行 Session 时提供一个轻量的 Skills 入口:

Agent       Codex
Model       GPT-5.x
Effort      High

Skills      Inherit ▼

展开后:

○ Inherit defaults
○ No skills
● Select skills

  ✓ debugging
  ✓ rust-review
  □ frontend-design
  □ browser-testing

普通用户无需修改任何设置,默认仍然是 inherit

只有有需要时才配置当前 Session。

关键要求

Session 级隔离

最重要的要求是:

不通过临时修改 Agent 全局 Skill 目录来实现。

例如不能使用:

启动 Session A
→ 删除 ~/.codex/skills 中部分链接
→ Session A 运行
→ 再恢复

这种方案无法支持并发 Session。

下面这种场景应该能够正常工作:

Codex Session A
selected = [skill-a]

Codex Session B
selected = [skill-b]

Codex Session C
none

三个 Session 同时运行时:

A 只能看到 skill-a
B 只能看到 skill-b
C 看不到用户 Skills

彼此不能产生污染。

建议的实现边界

建议把这个能力放在 Session Runtime / Agent Adapter 层,而不是写成某个特定功能的特殊逻辑。

抽象可以类似:

SessionSkillPolicy
  ├── Inherit
  ├── None
  └── Selected(Vec<SkillId>)
          │
          ▼
   Skill Runtime Adapter
          │
          ▼
      Agent Launch

不同 Agent 可以根据自身原生机制实现。

例如部分 Agent 已经具备类似能力:

Pi
→ --no-skills
→ --skill <path>

Kimi
→ --skills-dir

OpenCode
→ skill permission allow / deny

OpenClaw
→ skills allowlist

DeepSeek Harness
→ includeDefaultRoots=false
→ customSkillDirs

Hermes
→ HERMES_HOME / skills config

其他 Agent 可以通过独立配置目录、Session runtime environment 等方式逐步适配。

不要求第一版一次支持所有 Agent。

可以增加类似:

SkillIsolationSupport
  ├── Native
  ├── Adapted
  └── Unsupported

对于暂时无法可靠隔离的 Agent,UI 明确显示不支持即可。

与现有 Codeg Skill 管理的关系

当前的:

~/.codeg/skills/

仍然可以继续作为统一的 Skill Registry / Source of Truth

区别只是:

当前:

Codeg Skill Store
      ↓
Agent Global Skill Dir
      ↓
所有 Session

未来可以支持:

Codeg Skill Store
      ↓
Session Skill Resolver
      ↓
Session-specific Runtime
      ↓
Agent

Global Skill 设置则可以理解为默认能力集合。

为什么这不只是一个特殊场景需求

这个能力对正常 Coding Agent 使用同样有价值:

  • 大量安装 Skills 后减少无关上下文;
  • 降低 Skill 错误触发;
  • 为不同任务提供不同能力集合;
  • 更容易控制 Agent 行为;
  • 多 Session 并行时拥有独立能力配置;
  • 后续可以与 Task / Todo / Automation 等功能复用。

从用户视角来看,Skill 管理最终不应该只有:

“这个 Agent 安装了哪些 Skills?”

还应该能回答:

“这个任务允许它使用哪些 Skills?”

建议的第一阶段范围

V1 可以只实现:

  • inherit
  • none
  • selected
  • 至少支持 1~2 个主流 Agent
  • Session 并发隔离
  • Session 创建后保存 Skill Policy,恢复会话时保持一致

暂时不需要同时扩展:

  • MCP / Tools Profile
  • Prompt Profile
  • Arena
  • Eval
  • Capability Profile

这些能力未来都可以建立在同一个 Session Runtime abstraction 上。

Acceptance Criteria

  • 新 Session 默认使用 inherit,现有行为不变
  • none 模式下 Agent 实际无法发现用户 Global / Project Skills
  • selected 模式下 Agent 只看到用户明确选择的 Skills
  • 两个相同 Agent 的 Session 可以并发使用不同 Skill 集合
  • Session Skill 配置不能通过修改 Agent 全局 Skill 目录实现
  • Session 恢复后仍保持原来的 Skill Policy
  • 不支持 Session Skill isolation 的 Agent 有明确 capability/fallback 提示

Related

本 Issue 更关注:

Session 运行时到底暴露哪些 Skills,以及不同 Session 之间的 Skill 隔离。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions