CLAUDE.md · git:20261102.a11d179 · 2026-11-02 · sha256 c573ddd3dbb84063

CLAUDE.md git:20261102.a11d179A

Immutable. This exact content never changes and is served at /api/v1/blob/c573ddd3dbb84063.

# Project Agent Guide / 项目 Agent 指南

本文件是仓库内 AI 协作规则的事实来源,面向 Claude Code、Codex 等 Agent。

## 范围

- 项目根目录:本仓库根目录。
- 运行时:Windows + TypeScript/Node.js + Playwright + Vitest。
- 主命令:`tsx scripts/run-auto-worker.ts`(轮询飞书多维表格队列)。
- 检查命令:`pnpm typecheck`、`pnpm test`。
- 用户文档:`README.md`、`docs/`。

## 安全

- 不要打印或提交 `.env`、飞书 Token、LLM API Key、浏览器 Cookie、Playwright 用户目录内容。
- `.env`、`.browser/`、`data/`、`logs/`、`cookies/` 是本地运行状态,必须留在 git 外。
- `.env.example` 只能放占位符。
- 除非用户明确要求本地调试,不要在日志里输出完整正文。

## 飞书字段契约(当前 16 个字段)

Worker 只写入以下 4 个字段:

```text
处理状态
知识库路径
处理时间
最近错误
```

其余字段由上游(Hermes/人工)维护,Worker 只读:

```text
收录日期
作品发布日期
原文链接
标题
备注
概述
二级标签
作者
去重ID
来源平台
三级标签
一级标签
```

- 字段白名单在 `src/worker/autoWorker.ts` 的 `BASE_FIELD_NAMES`;表结构变化时必须同步。
- `处理状态` 取值:`pending` / `processing` / `draft_ready` / `done` / `failed`。
- `来源平台` 仅支持:`抖音`、`B站`、`微信公众号`(别名 `公众号`)、`X`(别名 `Twitter`/`推特`)、`YouTube`(别名 `Youtube`/`油管`)。留空按 `抖音` 处理。
- 重试次数保存在本地 `data/tasks/<recordId>/stage.json` 的 `retryCount`,不写飞书。

## 平台能力

| 平台 | 能力 |
|---|---|
| 抖音 | 视频、图文(`/note/`);文章(`/article/`)代码支持但无真实样本;不支持 v.douyin.com 短链 |
| B站 | BV/av 链接、b23.tv 短链、视频下载 + ASR |
| 微信公众号 | `/s/` 参数型与路径型文章;图片归档 |
| X(推特) | status 链接、t.co 短链、纯数字 ID;图片、视频 |
| YouTube | `watch?v=`、`youtu.be`;官方字幕优先,无字幕转音频 ASR |

小红书未实现。

## 转写

- 主编排:`src/asr/asrOrchestrator.ts`。
- 优先 Qwen-ASR(`DASHSCOPE_API_KEY`),失败回退本地 faster-whisper large-v3。
- 本地脚本:`scripts/transcribe-faster-whisper.py`。
- 相关配置:`ASR_MODE`、`WHISPER_MODEL`、`WHISPER_DEVICE`、`WHISPER_COMPUTE_TYPE`、`TRANSCRIBE_PYTHON_PATH`。
- 无 GPU 时把 `WHISPER_DEVICE=cpu`、`WHISPER_COMPUTE_TYPE=int8`(未实测,需自行验证)。

## Obsidian

- vault 路径来自 `.env` 的 `OBSIDIAN_VAULT_PATH`,未配置时 Worker 启动即退出。
- 收件箱目录来自 `OBSIDIAN_INBOX_DIR`,默认 `000-Inbox\001-信息中心`。
- 平台子目录由 `OBSIDIAN_PLATFORM_DIR_MAP` 映射。
- 原子写入,SHA-256 相同则跳过;用户修改过内容则不覆盖。
- 图片归档到 `<平台>/_assets/<sha256(dedupeKey) 前 16 位>/`。

## 抖音采集规则

- 登录态由 `scripts/manual-login.ts` 保存到 `BROWSER_USER_DATA_DIR`(默认 `.browser/douyin`)。
- 媒体捕获在 `src/media/douyinMediaCapture.ts`;不得打印签名媒体直链、请求头、Cookie。
- 必须使用精确匹配的详情响应,失败时直接报错,不用页面媒体兜底。
- 限流:`src/media/douyinRateLimiter.ts`,120 次/小时,超限延后到下一轮。
- 下载后必须校验存在音轨。

## 代理

- 启动脚本依次读取:进程环境 → `.env` 的 `XXSJ_HTTPS_PROXY`/`XXSJ_HTTP_PROXY` → `.env` 的 `HTTPS_PROXY`/`HTTP_PROXY`。
- 都为空表示不设代理。
- 抖音、公众号、B站、飞书一般不需要代理;X、YouTube 通常需要。

## 验证

```powershell
pnpm typecheck
pnpm test
.\scripts\doctor.ps1
```