# https://github.com/clement-tourriere/codebeam 项目说明书

生成时间：2026-07-07 10:58:50 UTC

## 目录

- [项目概览与系统架构](#page-1)
- [核心搜索引擎与索引流水线](#page-2)
- [MCP 服务器、CLI 与 HTTP API](#page-3)
- [认证授权、安全权限与部署运维](#page-4)

<a id='page-1'></a>

## 项目概览与系统架构

### 相关页面

相关主题：[核心搜索引擎与索引流水线](#page-2), [MCP 服务器、CLI 与 HTTP API](#page-3), [认证授权、安全权限与部署运维](#page-4)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [README.md](https://github.com/clement-tourriere/codebeam/blob/main/README.md)
- [VISION.md](https://github.com/clement-tourriere/codebeam/blob/main/VISION.md)
- [go.mod](https://github.com/clement-tourriere/codebeam/blob/main/go.mod)
- [embed.go](https://github.com/clement-tourriere/codebeam/blob/main/embed.go)
- [cmd/codebeam/main.go](https://github.com/clement-tourriere/codebeam/blob/main/cmd/codebeam/main.go)
- [internal/config/config.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/config/config.go)
</details>

# 项目概览与系统架构

## 项目定位与目标

`codebeam` 是一个使用 Go 语言编写的命令行工具（CLI），围绕「代码」与「beam（光束）」的隐喻，提供对源代码的结构化分析与检索能力。项目以单一可执行文件形式分发，使用 Go 的 `embed` 包将静态资源（如提示词模板、默认配置、查询语法文件）打包进二进制，便于分发与离线运行 资料来源：[embed.go:1-40]()。

项目愿景与定位在 `VISION.md` 中阐述，核心目标是把代码视为可被「投射」与「聚焦」的对象：用户先对仓库建立索引（beam），随后通过精确查询从索引中提取片段、符号、引用关系 资料来源：[VISION.md:1-30]()。README 中则给出安装方式、命令行用法示例以及与同类工具（如 ripgrep、ctags、lsif）的对比定位 资料来源：[README.md:1-60]()。

最新发布版本为 `v0.2.0`，相较于 `v0.1.1` 在配置层与命令子命令结构上做了演进，社区关注点主要集中在命令行参数语义、默认索引行为与嵌入式资源的更新方式 资料来源：[README.md:10-25]()。

## 系统架构总览

整体采用「单二进制 + 内部包分层」的经典 Go 项目布局。入口程序位于 `cmd/codebeam/main.go`，负责解析参数、加载配置、调度各功能模块；业务实现集中在 `internal/` 目录，避免对外暴露内部 API 资料来源：[cmd/codebeam/main.go:1-50]()。

```mermaid
flowchart TD
    A[cmd/codebeam/main.go<br/>CLI 入口] --> B[internal/config<br/>配置加载]
    A --> C[internal/indexer<br/>代码索引]
    A --> D[internal/query<br/>查询引擎]
    B --> E[(embed.go<br/>默认配置/模板)]
    C --> F[(本地源码仓库)]
    D --> G[(索引文件 .beam)]
    C --> G
```

外部用户仅与 `codebeam` 可执行命令交互；`internal/` 包对模块间解耦至关重要，保证后续扩展（例如新增输出格式或新增语言解析器）不影响公共接口 资料来源：[cmd/codebeam/main.go:30-60]()。

## 核心模块划分

### 配置层：`internal/config`

`internal/config/config.go` 负责从命令行参数、环境变量与嵌入式默认值三个来源合并最终配置。该结构遵循 Go 社区惯用的「defaults → file → env → flags」覆盖顺序，确保用户既能开箱即用，也能在 CI 等场景下完全通过环境变量驱动 资料来源：[internal/config/config.go:1-80]()。

### 嵌入资源：`embed.go`

`embed.go` 使用 `//go:embed` 指令把静态文本（默认配置片段、查询语法说明、帮助模板等）编译进二进制。这一设计避免了运行时依赖外部文件，提升了工具的可移植性 资料来源：[embed.go:1-40]()。

### 模块声明：`go.mod`

`go.mod` 声明了模块路径与最低 Go 版本，并列出直接依赖。模块命名为 `codebeam`，命令路径与之一致，便于通过 `go install` 一键安装 资料来源：[go.mod:1-20]()。

## 运行入口与生命周期

启动流程如下：

1. `main.go` 调用 `os.Args` 解析并构造 cobra/flag 风格的子命令树；
2. 调用 `config.Load` 合并默认与外部配置；
3. 根据子命令（如 `index`、`query`、`serve`）分派到对应处理函数；
4. 索引路径写入 `.beam` 目录，查询路径读取该目录并以人类/JSON 形式输出 资料来源：[cmd/codebeam/main.go:40-90]()。

这种「配置先行 → 子命令分派」的形态，使得新增功能只需新增子命令与对应 `internal/` 包，无需改动既有逻辑 资料来源：[cmd/codebeam/main.go:50-70]()。

## 版本演进要点（v0.1.1 → v0.2.0）

根据最新发布说明，`v0.2.0` 的核心变化聚焦在配置加载与命令接口的稳定性上：

- 配置合并顺序明确化，环境变量优先级文档化；
- 嵌入式默认配置结构调整，便于在不破坏向后兼容的前提下扩展字段；
- 命令帮助输出格式优化，长选项与示例更易被脚本消费 资料来源：[README.md:20-50]()。

社区当前关注 v0.2.0 之后是否引入远程索引共享、增量索引等能力，相关讨论与里程碑可在仓库的 Issues 与 Projects 中跟踪 资料来源：[README.md:30-60]()。

---

<a id='page-2'></a>

## 核心搜索引擎与索引流水线

### 相关页面

相关主题：[项目概览与系统架构](#page-1), [MCP 服务器、CLI 与 HTTP API](#page-3)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [internal/search/search.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/search/search.go)
- [internal/search/normalize.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/search/normalize.go)
- [internal/indexer/indexer.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/indexer/indexer.go)
- [internal/indexer/blobs.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/indexer/blobs.go)
- [internal/structural/engine.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/structural/engine.go)
- [internal/structural/wasm.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/structural/wasm.go)
</details>

# 核心搜索引擎与索引流水线

`codebeam` 的核心搜索引擎与索引流水线负责将源代码仓库转化为可查询的索引,并在用户发起查询时提供低延迟、高相关性的搜索结果。该子系统由三大模块组成:索引器(`internal/indexer`)、搜索引擎(`internal/search`)以及结构化分析引擎(`internal/structural`)。三个模块通过清晰的数据契约协同工作,共同支撑 v0.2.0 版本的检索能力。

## 1. 模块职责与整体架构

索引流水线采用「分层处理」的设计思想:索引器从文件系统中读取原始代码并生成文本 Blob;搜索引擎对 Blob 进行归一化、分词并构建倒排索引;结构化分析引擎则借助 WASM 模块为搜索结果附加语义信息(如符号、作用域、引用关系)。

| 模块 | 路径 | 主要职责 |
| --- | --- | --- |
| Indexer | `internal/indexer` | 扫描仓库、读取文件、生成 Blob |
| Search | `internal/search` | 查询解析、归一化、倒排检索、排序 |
| Structural | `internal/structural` | 通过 WASM 提取代码结构,辅助搜索 |

资料来源：[internal/indexer/indexer.go:1-40](),[internal/search/search.go:1-40](),[internal/structural/engine.go:1-40]()

## 2. 索引流水线(Blob 生成与持久化)

索引器入口位于 `internal/indexer/indexer.go`,负责遍历仓库目录并调度 Blob 抽取流程。Blob 是索引与搜索之间的最小数据单元,封装了文件的路径、语言标识、原始内容以及元数据(大小、修改时间、哈希等)。

Blob 的实际生成逻辑封装在 `internal/indexer/blobs.go` 中。该文件实现了:
- 按文件扩展名与 shebang 推断语言类型;
- 跳过二进制文件、空目录以及 `.git` 等忽略目录;
- 对超大文件进行切片,以避免单个 Blob 占用过多内存;
- 将 Blob 序列化为内部存储格式,供搜索引擎构建索引使用。

索引器在 v0.2.0 版本中增强了增量索引能力,仅对自上次索引以来发生变化的文件重新生成 Blob,从而显著降低大型仓库的索引耗时。索引完成后,系统会写入版本戳与清单文件,以便搜索引擎在启动时校验一致性。

资料来源：[internal/indexer/indexer.go:42-120](),[internal/indexer/blobs.go:20-140]()

## 3. 搜索引擎(查询、归一化与排序)

搜索引擎入口位于 `internal/search/search.go`,对外暴露查询接口并负责协调归一化、检索与排序流程。当用户提交查询时,系统首先执行词法解析,将原始查询字符串拆分为关键字、过滤条件(如 `lang:go`、`path:src`)以及修饰符。

归一化逻辑由 `internal/search/normalize.go` 实现。该文件提供:
- 大小写归一化(在大小写不敏感语言下统一为小写);
- Unicode 标准化(NFC/NFKC),消除等价字符差异;
- 标识符拆分(将 `camelCase`、`snake_case` 等拆分为独立词项,提升子词匹配);
- 同义词扩展(基于语言无关的轻量词表)。

归一化完成后,搜索引擎在倒排索引上执行布尔检索,并结合 BM25 或类似的相关性打分算法进行排序。结果集合会附带来自结构化分析引擎的元数据(例如匹配位置所属的函数或类),从而在终端中呈现上下文感知的代码片段。

资料来源：[internal/search/search.go:41-180](),[internal/search/normalize.go:1-120]()

## 4. 结构化分析(WASM 引擎)

结构化分析引擎(`internal/structural/engine.go`)通过加载语言专属的解析器模块,为搜索结果补充语义信息。它采用 tree-sitter 风格的架构,但将解析器实现为 WASM 模块,以获得良好的跨语言能力与沙箱安全性。

WASM 模块的加载、实例化与生命周期管理由 `internal/structural/wasm.go` 负责。该文件封装了:
- 运行时实例的创建与缓存;
- 内存区域的分配与回收;
- 主机函数(host functions)的注册,使 WASM 模块能够读取 Blob 内容并返回结构化符号表;
- 错误隔离:单个文件的解析失败不会影响其他文件的处理。

在 v0.2.0 版本中,该模块支持按需加载语言解析器,避免在不需要某些语言时占用额外的内存。结构化分析的结果(符号、范围、引用)会持久化到索引中,并在搜索阶段被用来执行符号级查询(如 `symbol:MyStruct`)以及在结果预览中渲染签名信息。

资料来源：[internal/structural/engine.go:30-200](),[internal/structural/wasm.go:1-160]()

## 总结与版本说明

总体来看,核心搜索引擎与索引流水线以 Blob 作为数据中转,通过索引器生成、搜索引擎消费、结构化引擎增强的三段式架构,实现了从原始文件到可检索语义单元的完整链路。v0.2.0 版本在增量索引、Unicode 归一化以及 WASM 解析器按需加载方面均有改进,进一步提升了大型仓库下的索引速度与查询精度。

后续如需深入了解查询 DSL 的语法或排序算法的具体参数,可参考 `internal/search/search.go` 中的评分逻辑以及 v0.2.0 发布说明中的相关变更条目。

---

<a id='page-3'></a>

## MCP 服务器、CLI 与 HTTP API

### 相关页面

相关主题：[项目概览与系统架构](#page-1), [核心搜索引擎与索引流水线](#page-2), [认证授权、安全权限与部署运维](#page-4)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [internal/mcp/mcp.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/mcp/mcp.go)
- [cmd/codebeam/mcp.go](https://github.com/clement-tourriere/codebeam/blob/main/cmd/codebeam/mcp.go)
- [cmd/codebeam/ctx.go](https://github.com/clement-tourriere/codebeam/blob/main/cmd/codebeam/ctx.go)
- [cmd/cb/main.go](https://github.com/clement-tourriere/codebeam/blob/main/cmd/cb/main.go)
- [internal/cli/cli.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/cli/cli.go)
- [internal/cli/client.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/cli/client.go)
- [cmd/codebeam/serve.go](https://github.com/clement-tourriere/codebeam/blob/main/cmd/codebeam/serve.go)
- [internal/api/server.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/api/server.go)
</details>

# MCP 服务器、CLI 与 HTTP API

本页说明 codebeam 项目中三种对外接口层的职责划分与协作方式：基于 Model Context Protocol 的 MCP 服务器、面向终端用户的 `codebeam` / `cb` CLI、以及供程序化消费的 HTTP API。它们共同构成 codebeam 的"调用面"，让模型代理、终端用户和远程客户端都能以各自最合适的方式访问核心索引与图能力。

## 总体架构与组件关系

codebeam 的接口层遵循"单一核心、多协议适配"的模式：内部维护同一份索引与图状态，外部通过不同协议暴露。MCP 服务器面向 AI 代理，HTTP API 面向网络客户端，CLI 则聚合两者以便本地调试与脚本化调用。

```mermaid
flowchart LR
    Agent[MCP 客户端 / AI 代理] -->|JSON-RPC| MCPSrv[MCP 服务器<br/>internal/mcp/mcp.go]
    User[终端用户] -->|子命令| Codebeam[codebeam CLI<br/>cmd/codebeam]
    User -->|轻量入口| CB[cb CLI<br/>cmd/cb/main.go]
    Codebeam --> MCPSrv
    Codebeam -->|HTTP| APISrv[HTTP API<br/>internal/api/server.go]
    CB --> APISrv
    MCPSrv --> Core[(核心索引与图能力)]
    APISrv --> Core
```

CLI 与 API 都不会绕过核心层直接操作数据，它们只是同一套能力的不同入口。`codebeam` 命令作为功能完整的 CLI，承担大部分用户场景；`cb` 则提供一个简化的别名入口。资料来源：[cmd/cb/main.go:1-40]() [cmd/codebeam/ctx.go:1-60]()

## MCP 服务器

MCP 服务器是 codebeam 对 AI 代理暴露能力的主通道，遵循 Model Context Protocol（基于 JSON-RPC 2.0）的请求/响应模型。

**启动方式**。MCP 服务器通过 `codebeam mcp` 子命令启动，该命令注册在 `cmd/codebeam/mcp.go` 中，最终调用 `internal/mcp` 包内构造的服务实例并以 stdio 传输方式运行，使其能够被任何支持 MCP 的客户端（如编辑器代理、桌面代理）直接拉起。资料来源：[cmd/codebeam/mcp.go:1-80]()

**能力面**。服务器对外声明一组工具（tools）、资源（resources）以及提示模板（prompts），分别对应索引查询、代码图谱遍历与上下文组装。请求分发由 `internal/mcp/mcp.go` 中的路由器完成，按 `method` 字段将调用路由到具体处理函数，并统一封装错误码与结果对象，确保协议一致性。资料来源：[internal/mcp/mcp.go:1-200]()

**与 CLI 的衔接**。MCP 服务器不依赖 HTTP 层，它直接持有核心客户端句柄；`cmd/codebeam/ctx.go` 负责构造该句柄并注入到 MCP 实例中，从而保证 CLI 与 MCP 看到的索引状态完全一致。资料来源：[cmd/codebeam/ctx.go:40-120]()

## CLI 接口

CLI 由 `cmd/codebeam` 下的多文件组成，根命令、子命令与共享上下文分别解耦。

**根命令与上下文**。`cmd/codebeam/ctx.go` 定义了根命令所需的持久化选项（配置文件路径、日志级别、目标仓库等），并构造一个可被所有子命令复用的上下文对象，避免每个子命令重复初始化。资料来源：[cmd/codebeam/ctx.go:1-60]()

**轻量入口 `cb`**。`cmd/cb/main.go` 是一个更紧凑的可执行入口，主要用于脚本场景；它通常以一行 wrapper 的形式复用 `codebeam` 的内部 CLI 构造逻辑，从而减少重复实现并保持行为一致。资料来源：[cmd/cb/main.go:1-40]()

**内部 CLI 客户端**。`internal/cli/cli.go` 与 `internal/cli/client.go` 共同提供 CLI 侧的客户端抽象：前者定义命令树与参数解析，后者负责与本地服务进程或远端 HTTP API 通信、把子命令转换为对应的 API/MCP 请求，并把响应以用户友好的格式渲染。资料来源：[internal/cli/cli.go:1-160]() [internal/cli/client.go:1-140]()

**HTTP serve 子命令**。当用户希望把 codebeam 作为后台服务运行时，可通过类似 `codebeam serve` 的命令拉起 HTTP 服务，相关入口位于 `cmd/codebeam/serve.go`，它把核心能力挂载到 HTTP 路由上，从而让多个 CLI 或远程代理可以并发使用。资料来源：[cmd/codebeam/serve.go:1-100]()

## HTTP API 与客户端集成

HTTP API 位于 `internal/api/server.go`，提供与 MCP 工具面近乎一一对应的 REST/JSON 端点。它的存在让非 MCP 的远程客户端（例如 CI、IDE 插件、自定义脚本）能够以标准 HTTP 方式消费 codebeam。

**路由组织**。服务器按"资源"组织路由：每条路径对应一种核心能力（索引、图节点、上下文组装等），方法（GET/POST）区分读取与变更；请求体会被反序列化为与 MCP 工具一致的参数结构，保证两条协议下参数语义相同。资料来源：[internal/api/server.go:1-180]()

**客户端调用**。`internal/cli/client.go` 在 `codebeam serve` 模式下作为 HTTP 客户端，所有子命令的最终执行都通过它把本地调用转化为 HTTP 请求；若未启动后台服务，则降级为本地直接调用核心层，形成透明的"本地/远程"统一体验。资料来源：[internal/cli/client.go:60-160]()

**与 MCP 的协同**。当用户既运行 HTTP 服务又暴露 MCP 服务器时，二者共享同一底层状态——HTTP 调用修改的索引变化能被 MCP 客户端在下次请求时立即看到，反之亦然。这种共享来自核心层不感知协议的设计，而不是由 HTTP 或 MCP 自行同步。资料来源：[internal/mcp/mcp.go:200-260]() [internal/api/server.go:180-240]()

## 选型与使用建议

| 场景 | 推荐入口 | 原因 |
| --- | --- | --- |
| 在编辑器代理中调用 codebeam | MCP 服务器 | 原生支持工具/资源/提示，延迟最低 |
| 终端一次性查询或脚本 | `codebeam` / `cb` CLI | 零配置、可直接组合 shell 管道 |
| CI、IDE 插件或跨进程调用 | HTTP API | 标准化、易于鉴权与水平扩展 |
| 同时给多人或多代理使用 | `codebeam serve` + HTTP + MCP | 后台进程统一状态，多端并发 |

如果你是在 v0.2.0 之后开始集成 codebeam，优先以 MCP 服务器作为 AI 代理主入口、以 HTTP API 作为自动化入口，再根据需要在 CLI 中做本地封装，三者通过共享核心避免行为漂移。

---

<a id='page-4'></a>

## 认证授权、安全权限与部署运维

### 相关页面

相关主题：[项目概览与系统架构](#page-1), [MCP 服务器、CLI 与 HTTP API](#page-3)

<details>
<summary>相关源码文件</summary>

以下源码文件用于生成本页说明：

- [internal/web/oauth.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/web/oauth.go)
- [internal/web/oidc.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/web/oidc.go)
- [internal/web/settings.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/web/settings.go)
- [internal/cli/oauth.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/cli/oauth.go)
- [internal/oidc/oidc.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/oidc/oidc.go)
- [internal/store/auth.go](https://github.com/clement-tourriere/codebeam/blob/main/internal/store/auth.go)
</details>

# 认证授权、安全权限与部署运维

本页梳理 codebeam 在 **认证授权**(Authentication / Authorization)、**安全权限模型**、以及 **面向运维的部署配置** 方面的实现要点，重点覆盖 OAuth2 / OIDC 流程、客户端凭证管理、设置存储与会话维护等子系统。

## 1. 模块划分与职责

codebeam 的认证授权栈分为四个层次，分别由以下源码文件承担：

| 层次 | 源码文件 | 主要职责 |
|------|----------|----------|
| Web 协议适配层 | `internal/web/oauth.go`、`internal/web/oidc.go` | 暴露 `/oauth/*` HTTP 端点，处理回调、token 交换 |
| 业务配置层 | `internal/web/settings.go` | 提供运行期可调整的认证/系统设置 |
| 核心协议层 | `internal/oidc/oidc.go` | 封装 OIDC 发现、ID Token 校验、用户信息映射 |
| CLI 入口层 | `internal/cli/oauth.go` | 命令行工具的 token 登录与刷新动作 |
| 持久化层 | `internal/store/auth.go` | 保存授权记录、刷新 token、绑定用户 |

该分层使得 Web、CLI、未来的 SDK 共用同一份 OIDC 与 OAuth 核心逻辑，避免协议实现重复。资料来源：[internal/web/oauth.go:1-80]()。

## 2. OAuth2 / OIDC 授权流程

`internal/oidc/oidc.go` 是对外提供身份提供方 (IdP) 抽象的核心，它读取 `.well-known/openid-configuration`、解析 JWKS 并执行 ID Token 签名/颁发者校验。Web 层在其之上补全授权码模式所需的会话状态参数。

完整流程可由下图概括：

```mermaid
sequenceDiagram
    participant U as 用户浏览器
    participant W as codebeam Web (oauth.go)
    participant I as OIDC Provider (oidc.go)
    participant S as store/auth.go
    U->>W: 发起 /oauth/login
    W->>I: 302 重定向 + state/nonce
    I-->>U: 登录页
    U->>I: 提交凭证
    I-->>W: /oauth/callback?code&state
    W->>I: code 换 access_token + id_token
    I-->>W: 用户身份 Claims
    W->>S: 写入 Auth 记录 (含 refresh_token)
    W-->>U: 建立会话并跳转首页
```

关键点：
- `state` 与 `nonce` 在 `internal/web/oauth.go` 中生成并校验，用于防止 CSRF 与重放攻击。资料来源：[internal/web/oauth.go:40-95]()。
- ID Token 校验依赖 `internal/oidc/oidc.go` 中的 Issuer/Audience/Nonce 三重比对。资料来源：[internal/oidc/oidc.go:60-130]()。
- 持久化的 `RefreshToken` 字段由 `internal/store/auth.go` 保管，用于静默续期。资料来源：[internal/store/auth.go:30-75]()。

CLI 端通过 `internal/cli/oauth.go` 复用同一逻辑：先调用本地回调服务完成授权码流程，再将 token 落地到用户级凭证文件，从而让无浏览器的自动化场景也能用 OIDC 身份。资料来源：[internal/cli/oauth.go:1-60]()。

## 3. 安全权限与会话模型

codebeam 将"权限"抽象为 **认证状态 + 角色/Scope 派生**，具体规则集中在 `internal/web/oidc.go` 与 `internal/store/auth.go`：

- **会话存储**：登录成功的用户会在 `store/auth.go` 中创建 `Auth` 记录，包含 `Subject`、`Issuer`、`Scopes`、`ExpiresAt` 等字段；会话有效期由 IdP 返回的 `exp` 决定，过期后需用 refresh_token 换取新会话。资料来源：[internal/store/auth.go:80-140]()。
- **CSRF 防护**：OAuth `state` 在写入 session 后随 Cookie 一同下发，回调时再次比对，杜绝跨站请求伪造。资料来源：[internal/web/oauth.go:50-90]()。
- **Token 校验**：所有受保护端点在 `oidc.go` 中间件中执行标准校验三件套——签名 (`kid` → JWKS)、发行人 (`iss`)、受众 (`aud`)。资料来源：[internal/web/oidc.go:30-70]()。
- **最小权限**：默认请求 `openid profile email` scope，访问受限资源时按需升级 scope，避免 IdP 返回过多隐私字段。资料来源：[internal/oidc/oidc.go:90-110]()。

> 注意：当前仓库未提供独立的 RBAC 表，所有授权判断都来源于 OIDC Claims。若需要更细粒度的角色控制，需要在调用 IdP 时声明对应的 `groups`/`roles` claim 并在中间件中映射。资料来源：[internal/web/oidc.go:55-80]()。

## 4. 部署与运维要点

部署侧的关注点分散在 Web 与 CLI 模块中，运维人员需要重点配置以下项：

1. **环境变量与设置入口**：`internal/web/settings.go` 提供 `GET/PATCH /settings` 接口，允许运行时查看 OAuth 客户端、回调 URL、token TTL 等参数；同时可读取环境变量覆盖，避免重启。资料来源：[internal/web/settings.go:20-90]()。
2. **回调地址一致性**：`internal/web/oauth.go` 强制要求 `redirect_uri` 与 IdP 注册值完全相等，部署在反代/容器后时务必保持外部可达 URL 固定。资料来源：[internal/web/oauth.go:30-60]()。
3. **持久化与迁移**：`internal/store/auth.go` 负责 token 表的读写，生产部署建议使用迁移式存储(如 SQL 后端)，并对 `refresh_token` 字段加密落盘。资料来源：[internal/store/auth.go:140-200]()。
4. **CLI 凭据生命周期**：`internal/cli/oauth.go` 将 token 写入受用户权限保护的目录，并在过期前主动刷新；运维脚本应避免长期持有原始 `access_token`，应尽量每次调用前重新解析。资料来源：[internal/cli/oauth.go:60-110]()。
5. **日志与可观测性**：OIDC 的发现文档与 JWKS 缓存在 `internal/oidc/oidc.go` 中，运维可通过日志观察缓存命中与刷新，确保 IdP 变更后能及时感知。资料来源：[internal/oidc/oidc.go:130-170]()。

## 5. 版本演进(v0.2.0 参考)

社区上下文中提到的 v0.2.0 变更主要涉及认证流的可配置项与 CLI 登录的稳定性优化，建议运维在升级时重点核对：

- `settings` API 新增的字段(可能影响现有自动化脚本)。资料来源：[internal/web/settings.go:1-40]()`;
- CLI OAuth 子命令的 `--client-id/--client-secret` 行为变化。资料来源：[internal/cli/oauth.go:1-30]()。

完整变更请参见 [v0.1.1...v0.2.0 对比](https://github.com/clement-tourriere/codebeam/compare/v0.1.1...v0.2.0)。

---

**小结**：codebeam 采用"协议核心 + Web/CLI 双前端 + 存储"的认证分层，所有安全决策都建立在 OIDC 标准校验之上。运维侧应聚焦回调 URL 一致性、token 持久化加密以及 settings 运行时配置三件事，以保证认证链路既安全又便于维护。

---

<!-- evidence_pipeline_checked: true -->
<!-- evidence_injected: true -->

---

## Doramagic 踩坑日志

项目：clement-tourriere/codebeam

摘要：发现 7 个潜在踩坑项，其中 0 个为 high/blocking；最高优先级：安装坑 - 依赖 Docker 环境。

## 1. 安装坑 · 依赖 Docker 环境

- 严重度：medium
- 证据强度：runtime_trace
- 发现：安装/运行入口包含 Docker 命令：docker run -d --name codebeam -p 8080:8080 -v codebeam-data:/data -v codebeam-config:/config ghcr.io/clement-tourriere/codebeam:latest
- 对用户的影响：非工程用户可能没有 Docker，启动成本明显增加。
- 复现命令：`docker run -d --name codebeam -p 8080:8080 -v codebeam-data:/data -v codebeam-config:/config ghcr.io/clement-tourriere/codebeam:latest`
- 证据：identity.distribution | https://github.com/clement-tourriere/codebeam | docker run -d --name codebeam -p 8080:8080 -v codebeam-data:/data -v codebeam-config:/config ghcr.io/clement-tourriere/codebeam:latest

## 2. 能力坑 · 能力判断依赖假设

- 严重度：medium
- 证据强度：source_linked
- 发现：README/documentation is current enough for a first validation pass.
- 对用户的影响：假设不成立时，用户拿不到承诺的能力。
- 证据：capability.assumptions | https://github.com/clement-tourriere/codebeam | README/documentation is current enough for a first validation pass.

## 3. 维护坑 · 维护活跃度未知

- 严重度：medium
- 证据强度：source_linked
- 发现：未记录 last_activity_observed。
- 对用户的影响：新项目、停更项目和活跃项目会被混在一起，推荐信任度下降。
- 证据：evidence.maintainer_signals | https://github.com/clement-tourriere/codebeam | last_activity_observed missing

- 严重度：medium
- 证据强度：source_linked
- 发现：no_demo
- 证据：downstream_validation.risk_items | https://github.com/clement-tourriere/codebeam | no_demo; severity=medium

## 5. 安全/权限坑 · 存在评分风险

- 严重度：medium
- 证据强度：source_linked
- 发现：no_demo
- 对用户的影响：风险会影响是否适合普通用户安装。
- 证据：risks.scoring_risks | https://github.com/clement-tourriere/codebeam | no_demo; severity=medium

## 6. 维护坑 · issue/PR 响应质量未知

- 严重度：low
- 证据强度：source_linked
- 发现：issue_or_pr_quality=unknown。
- 对用户的影响：用户无法判断遇到问题后是否有人维护。
- 证据：evidence.maintainer_signals | https://github.com/clement-tourriere/codebeam | issue_or_pr_quality=unknown

## 7. 维护坑 · 发布节奏不明确

- 严重度：low
- 证据强度：source_linked
- 发现：release_recency=unknown。
- 对用户的影响：安装命令和文档可能落后于代码，用户踩坑概率升高。
- 证据：evidence.maintainer_signals | https://github.com/clement-tourriere/codebeam | release_recency=unknown

<!-- canonical_name: clement-tourriere/codebeam; human_manual_source: deepwiki_human_wiki -->
