# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## 项目概述

codeg 是一个桌面应用，用于聚合和浏览本地 AI 编码代理的会话记录。它从多个代理（Claude Code、Codex、OpenCode）的本地文件系统中读取会话数据，统一格式后在 UI 中展示。

## 技术栈

- **桌面运行时**: Tauri 2（Rust 后端 + webview 前端）
- **前端**: Next.js 16（静态导出模式）+ React 19 + TypeScript（strict）
- **样式**: Tailwind CSS v4 + shadcn/ui（radix-maia 风格）
- **包管理器**: pnpm

## 开发命令

```bash
# 启动完整应用（Tauri + Next.js Turbopack 开发服务器）
pnpm tauri dev

# 仅启动前端
pnpm dev

# 构建前端（静态导出到 out/）
pnpm build

# 构建 Tauri 桌面应用
pnpm tauri build

# Lint 检查
pnpm eslint .

# Rust 检查（在 src-tauri/ 目录下执行）
cargo check
cargo clippy
cargo build
```

目前尚未配置测试框架。

## 架构

### Rust 后端（`src-tauri/src/`）

后端负责读取和解析本地文件系统上的代理会话文件：

- **`models/`** — 共享数据结构
- **`parsers/`** — 每个代理一个解析器
- **`commands/sessions.rs`** — 暴露给前端的 Tauri 命令

### 前端（`src/`）

- **`lib/types.ts`** — Rust 模型的 TypeScript 镜像。`AgentType` 为 `"claude_code" | "codex" | "open_code"`（snake_case，与 Rust serde 一致）
- **`lib/tauri.ts`** — 对每个 Tauri 命令的类型化 `invoke()` 封装
- **`app/`** — Next.js 页面，不使用动态路由
- **`components/`** — 项目组件
- **`components/ui/`** — shadcn 组件

### 数据流

前端调用 `invoke()` → Tauri 命令 → 解析器读取本地文件 → 返回 `SessionSummary[]` / `SessionDetail` → React 渲染

## 关键约束

- **仅支持静态导出**：`next.config.ts` 设置 `output: "export"`，不支持动态路由（`[param]`），必须使用查询参数替代
- **路径别名**：`@/*` 映射到 `./src/*`，导入写法为 `@/lib/utils`、`@/components/ui/button`
- **Rust serde 约定**：`AgentType` 序列化为 snake_case（`claude_code`、`open_code`）。Tauri 命令参数在 JS 侧使用 camelCase，Rust 侧使用 snake_case

## 代码风格

- Prettier：无分号、尾逗号（es5）、2 空格缩进、80 字符宽度
- ESLint：next/core-web-vitals + typescript + prettier
- TypeScript：strict 模式，启用 `noUnusedLocals` 和 `noUnusedParameters`
- Rust：2021 edition，使用 `thiserror` 定义错误类型
