来源:improve-codebase-architecture 架构审查(2026-07-20)。本 issue 作为记录,尚未经过 /grilling 决策树细化。
推荐强度:Worth exploring · 依赖类别:in-process
Files
src/main/deepagent/skill-manager.ts · 66 symbols
src/main/deepagent/skills-runtime/skill-sources.ts · 35 symbols
src/main/deepagent/skills-runtime/cdf-skills-runtime.ts · skill-prompt.ts · skill-metadata.ts
src/main/deepagent/static-skill-package.ts · 13 symbols
Problem
要回答“这个 Conversation 能看到哪些 Skill?”需要在两个目录的 7 个文件之间跳转;skill-manager.ts 把 CRUD、目录解析、内建注册和 frontmatter 解析混在一起。一个 Skill 要穿过许多薄层(source plan → catalog resolve → prompt render → manager → materialize → 薄包装)。
Solution
一个深的 SkillsCatalog,拥有 discovery、resolution、snapshot 与 view-building;runtime-assembly 向它索取已解析集合 + prompt;CRUD 也经由同一模块。
Wins
locality :解析类 bug 集中在一处
leverage :一个接口服务 runtime、settings、snapshots
Conversation Skill Snapshot 逻辑集中
skill-manager 接口大幅收缩
备注
候选 01 收拢后会为本候选解锁——Skill 接线目前就嵌在 Agent Run 装配簇中。
Spec(/to-spec 调研补充,2026-07-26)
调研结论:问题仍然存在,且已解锁 ——备注中的前置「候选 01」(#199 装配收拢)已落地,Skill 接线现集中在装配模块,正是本候选期望的消费方形态。
散落的具体证据:isGlobalSkillSourceKind 类型守卫在快照捕获与 skills-runtime 两处重复实现;Skill source label 映射(Built-in / Project / Nested / Global / Managed)在 skill-manager 与 skills-runtime 各写一份;Conversation Skill Snapshot 捕获自行拼装 source plan → catalog resolve → Scene 过滤三步;slash command 收集器绕过任何接口直接调用底层目录 helper。当前 7 个消费方(IPC 处理器、Scene 曝光策略、快照捕获、运行时装配、Agent 工具、上下文聚合、command 收集器)各自从 2–3 个供应文件拼装所需能力。
Problem Statement
维护者要回答"这个 Conversation 能看到哪些 Skill?",必须在两个目录的 7 个文件之间追踪:source plan 如何铺(built-in / project / nested / additional / user global / enterprise)、catalog 如何 resolve 与 shadow、Scene Skill Exposure 如何过滤、快照如何冻结、prompt 如何渲染、Settings 视图如何构建。任何解析类 bug(优先级、遮蔽、Scene 过滤、缓存失效)可能出在其中任意一层,且同一判断逻辑存在多份拷贝,改一处漏一处。
Solution
建立一个深的 Skill Catalog 模块作为"哪些 Skill 存在、对谁可见"这一问题的唯一回答者。它拥有 discovery(source plan + 缓存/失效)、resolution(catalog resolve + shadowing + Scene Skill Exposure 过滤)、Conversation Skill Snapshot 的捕获与冻结目录重建、Settings 视图构建,以及物理 Skill 的 CRUD。运行时装配向它索取已解析集合 + prompt;快照持久化层向它索取捕获结果;slash command 收集器与 Agent 工具改走同一接口。frontmatter 解析、prompt 渲染等保留为模块内部实现文件,但对外接口收敛为一个。
User Stories
作为 CDF 维护者,我想让"这个 Conversation 能看到哪些 Skill"由一个模块回答,以便解析类 bug(优先级、遮蔽、Scene 过滤)只需要在一处定位与修复。
作为 CDF 维护者,我想删除重复的 source-kind 判断与 source label 映射,以便新增一种 Skill 来源时只改一处。
作为代码代理(AFK agent),我想通过 Skill Catalog 一个接口理解 Skill 的完整生命周期(发现→解析→曝光→快照→渲染→CRUD),不再重建 7 文件的心智地图。
作为 CDF 用户,我希望 Conversation 创建时冻结的 Conversation Skill Snapshot 行为完全不变:后续 Scene Skill Exposure 变更只影响新 Conversation,Agent Skill Preload 仍只能从快照内选择(CONTEXT.md 契约不变)。
作为 CDF 用户,我希望 Settings 中的 Skill 列表(含遮蔽提示、来源标签、可编辑性、资源文件)展示与操作行为完全不变。
作为 CDF 用户,我希望 Skill 的新建、导入、删除行为不变,且写入后缓存正确失效、列表即时刷新。
作为 CDF 用户,我希望 Scene 对 Global Skill 的曝光规则不变(Built-in 走策展默认、user-global 默认全 Scene、Project Skill 无曝光控制,ADR-0069 不变)。
作为 CDF 用户,我希望系统提示词中的 Skills System 段落(渐进披露、Preloaded Skills)逐字节不变,保持 prompt-cache 稳定。
作为 CDF 维护者,我希望运行时装配、上下文聚合、slash command 收集、Agent 工具这些消费方都改为向 Skill Catalog 索取,不再直连底层目录 helper。
作为 CDF 维护者,我希望 Built-in Skill 的注册、pin 与 materialization(含第三方改编的许可证声明)继续由本模块统一持有(ADR-0067 不变)。
作为测试作者,我想主要在 Skill Catalog 接口上测试解析、遮蔽、曝光、快照行为,用临时目录构造 Skill 树,不断言内部分层。
作为 CDF 维护者,我希望收拢后 skill-manager 的公开导出面大幅收缩,防止未来消费方再次绕层。
Implementation Decisions
一个公开模块 :Skill Catalog 拥有 discovery、resolution、snapshot capture、view building、CRUD、Built-in 注册与 materialization。frontmatter 解析与 prompt 渲染保留为内部实现文件(深模块 ≠ 单文件),不再从包外导入。
接口面 (按能力描述,非最终签名):解析目录(项目 + Scene → 已解析条目集,含遮蔽信息);Settings 视图(项目级与产品级 Global 两种);捕获 Conversation Skill Snapshot;从冻结快照重建运行时目录并渲染 prompt(含 preload keys);保存/导入/删除物理 Skill;Built-in 注册查询。
数据库边界 :Skill Catalog 只依赖文件系统与配置,不接触 SQLite。Conversation Skill Snapshot 的持久化(sessions 表读写、legacy 一次性捕获)留在现有快照持久化模块,由它调用 Catalog 的捕获接口。
策略注入 :Scene Skill Exposure 过滤器仍由曝光策略模块提供、以谓词注入 Catalog(保持 ADR-0069 的策略归属,Catalog 不内联 Scene 策略表)。
去重 :source-kind 分类守卫与 source label 映射收敛为单份,放在共享 Skill 类型旁或 Catalog 内部,两个现有拷贝删除。
消费方迁移 :运行时装配(Architecture review 01 — Collapse the Agent Run assembly god-file #199 后的装配模块)、上下文聚合、IPC 处理器、command 收集器、Agent 工具全部改走 Catalog 接口;command 收集器不再直接拿 built-in 目录与 scope path。
零行为变更 :解析优先级、遮蔽规则、缓存 TTL 与失效时机、prompt 文本、共享类型(快照条目、视图类型)与 IPC 契约全部不变。
许可证声明 :deepagents 改编的 prompt 渲染文件保留其 MIT 许可注释与改编说明。
Testing Decisions
好的测试只验证外部行为:给定磁盘上的 Skill 目录树 + Scene + 配置,断言解析结果、遮蔽关系、快照条目、prompt 输出、视图字段;不断言内部调用层次。
主测试面收敛到 Skill Catalog 接口;现有 source plan / catalog resolve 的行为测试(临时目录构造多来源 Skill 树的写法)整体迁移或保留为内部实现测试——保留标准:测的是真实解析行为而非层间转发。
frontmatter 解析与 prompt 渲染的现有测试保留(真实行为)。
快照持久化模块的测试继续走"内存 SQLite + 捕获一次性"的现有写法,只把捕获部分换成 Catalog 接口。
先例:现有 skill-sources、skill-manager、cdf-skills-runtime、skill-metadata、skill-prompt 各测试文件。
验证:pnpm test 覆盖 deepagent skill 全簇 + 快照 + ipc-handlers + commands;关键回归项为快照冻结语义与 prompt 字节稳定。
Out of Scope
Further Notes
Files
src/main/deepagent/skill-manager.ts· 66 symbolssrc/main/deepagent/skills-runtime/skill-sources.ts· 35 symbolssrc/main/deepagent/skills-runtime/cdf-skills-runtime.ts·skill-prompt.ts·skill-metadata.tssrc/main/deepagent/static-skill-package.ts· 13 symbolsProblem
要回答“这个 Conversation 能看到哪些 Skill?”需要在两个目录的 7 个文件之间跳转;
skill-manager.ts把 CRUD、目录解析、内建注册和 frontmatter 解析混在一起。一个 Skill 要穿过许多薄层(source plan → catalog resolve → prompt render → manager → materialize → 薄包装)。Solution
一个深的
SkillsCatalog,拥有 discovery、resolution、snapshot 与 view-building;runtime-assembly 向它索取已解析集合 + prompt;CRUD 也经由同一模块。Wins
备注
候选 01 收拢后会为本候选解锁——Skill 接线目前就嵌在 Agent Run 装配簇中。
Spec(/to-spec 调研补充,2026-07-26)
Problem Statement
维护者要回答"这个 Conversation 能看到哪些 Skill?",必须在两个目录的 7 个文件之间追踪:source plan 如何铺(built-in / project / nested / additional / user global / enterprise)、catalog 如何 resolve 与 shadow、Scene Skill Exposure 如何过滤、快照如何冻结、prompt 如何渲染、Settings 视图如何构建。任何解析类 bug(优先级、遮蔽、Scene 过滤、缓存失效)可能出在其中任意一层,且同一判断逻辑存在多份拷贝,改一处漏一处。
Solution
建立一个深的 Skill Catalog 模块作为"哪些 Skill 存在、对谁可见"这一问题的唯一回答者。它拥有 discovery(source plan + 缓存/失效)、resolution(catalog resolve + shadowing + Scene Skill Exposure 过滤)、Conversation Skill Snapshot 的捕获与冻结目录重建、Settings 视图构建,以及物理 Skill 的 CRUD。运行时装配向它索取已解析集合 + prompt;快照持久化层向它索取捕获结果;slash command 收集器与 Agent 工具改走同一接口。frontmatter 解析、prompt 渲染等保留为模块内部实现文件,但对外接口收敛为一个。
User Stories
Implementation Decisions
Testing Decisions
pnpm test覆盖 deepagent skill 全簇 + 快照 + ipc-handlers + commands;关键回归项为快照冻结语义与 prompt 字节稳定。Out of Scope
Further Notes