Output Styles

Output Styles 模块实现了 Claude Code 的 AI 响应风格定制系统。它从项目级(.claude/output-styles/*.md)和用户级(~/.claude/output-styles/*.md)目录加载 Markdown 风格文件,解析 frontmatter 元数据(name、description、keep-coding-instructions),将文件内容作为风格提示词注入 AI 响应生成。支持项目级覆盖用户级、插件风格扩展、以及编码指令保留控制。

职责与设计理念

职责说明

输出风格系统,从 Markdown 文件加载可定制的 AI 响应风格

设计理念

风格即 Markdown——用最自然的格式(Markdown + frontmatter)定义 AI 的表达方式。用户不需要学习 API,只需要写一个 .md 文件就能定制 AI 的输出风格。

架构决策

为什么用 Markdown 文件而不是 JSON/YAML 配置?

Markdown + frontmatter 作为风格定义格式

风格的核心是"提示词"——一段自然语言文本。Markdown 是最自然的载体,frontmatter 提供结构化元数据。用户可以用任何文本编辑器创建风格,无需学习配置语法。

⚖️ Markdown 解析比 JSON 慢,但 memoize 缓存消除了重复解析的开销。

文件清单

文件名 用途
loadOutputStylesDir.ts 风格加载器,从多级目录扫描并解析 Markdown 风格文件

使用场景

项目根目录有 .claude/output-styles/concise.md

自动加载为可选风格,用户可在 /config 中切换

keep-coding-instructions: true

风格提示词与默认编码指令合并,而非替换,保留代码生成能力

依赖关系

无外部模块依赖

关键代码片段

输出风格加载

const getOutputStyleDirStyles = memoize(
  async (cwd: string): Promise<OutputStyleConfig[]> => {
    const markdownFiles = await loadMarkdownFilesForSubdir(
      'output-styles', cwd
    )
    return markdownFiles.map(({ frontmatter, content, source }) => ({
      name: frontmatter['name'] || styleName,
      description: frontmatter['description'],
      prompt: content.trim(),
      source,
      keepCodingInstructions: parseBoolFlag(
        frontmatter['keep-coding-instructions']
      ),
    }))
  }
)

Markdown + frontmatter → OutputStyleConfig,memoize 缓存避免重复 I/O