# pi-codex-session

在 [pi](https://github.com/earendil-works/pi) 中输入 `@` 按**标题**模糊匹配本机 Codex CLI 会话，选中后插入引用，并通过配套 skill 读取该会话的上下文。

> 仓库地址: https://github.com/toosean/pi-codex-session

## 功能

- **`@` 标题模糊匹配**：输入 `@测试环境` 即可匹配到标题含"测试环境"的 Codex 会话（如「梳理测试环境接入要求」）
- **排除已归档**：默认只匹配未归档（`archived=0`）的会话
- **最近优先**：空输入时展示最近更新的会话；匹配结果按更新时间辅助排序
- **插入引用 + 自动读取**：选中后插入 `[@标题](codex://threads/<id>)`，配套 `codex-session` skill 指导模型解析 rollout 文件、提取会话上下文（标题、工作目录、git 分支、用户提问、最终总结）

## 安装

```bash
# 方式一：npm 包（推荐）
pi install npm:pi-codex-session

# 方式二：Git 仓库
pi install git:github.com/toosean/pi-codex-session
```

或手动放置：

```bash
# 扩展
cp extensions/codex-session-autocomplete.ts ~/.pi/agent/extensions/
# skill
cp -r skills/codex-session ~/.pi/agent/skills/
```

然后在 pi 中执行 `/reload` 生效。

## 自动发布

包通过 GitHub Actions + npm [Trusted Publishing (OIDC)](https://docs.npmjs.com/trusted-publishers/) 自动发布到 npm，不需要 token 或 2FA。

发布新版：

```bash
npm version patch    # 或 minor / major
npm publish --dry-run # 可选：本地预览
git push origin main --tags
```

推送 `v*` tag（或在 GitHub 页面手动触发 `publish-npm` workflow）后自动发布。

## 在 npm 上的包

- 包名: [`pi-codex-session`](https://www.npmjs.com/package/pi-codex-session)
- 画廊: [pi.dev/packages](https://pi.dev/packages)

## 使用

1. 在 pi 输入框输入 `@` 加关键词（如 `@测试环境`）
2. 从候选列表中选择会话（↑↓ 移动，Enter 确认）
3. 输入框自动插入：

   ```
   [@梳理测试环境接入要求](codex://threads/019fc30b-668e-79c1-a426-84c8acbd56e6) 请用 codex-session skill 读取该会话的上下文
   ```

4. 模型会调用 `codex-session` skill 读取对应会话的 rollout 文件，提取并总结上下文

## 工作原理

| 组件 | 位置 | 职责 |
|---|---|---|
| 扩展 | `extensions/codex-session-autocomplete.ts` | `@` 触发补全，读取 Codex 会话元数据并模糊匹配标题 |
| skill | `skills/codex-session/SKILL.md` | 指导模型定位 rollout 文件、解析 JSONL、输出结构化摘要 |

### 数据源

扩展按优先级读取：

1. `~/.codex/state_5.sqlite` → `threads` 表（主数据源，含标题/工作目录/git 分支/更新时间，用 Node 内置 `node:sqlite` 读取，零外部依赖）
2. `~/.codex/session_index.jsonl`（兜底）

### 匹配与过滤

- 只匹配 `archived = 0` 且标题非空的会话
- 使用 `fuzzyFilter` 按标题模糊匹配
- 结果按 `updated_at` 倒序展示

## 文件结构

```
pi-codex-session/
├── README.md
├── package.json          # pi 包 manifest（pi-package）
├── extensions/
│   └── codex-session-autocomplete.ts
└── skills/
    └── codex-session/
        └── SKILL.md
```

## 开发

```bash
# 本地验证数据层（sqlite 读取 + fuzzy 匹配）
node --experimental-strip-types extensions/codex-session-autocomplete.ts
```

## License

MIT
