diff --git a/.claude/review-prompt.md b/.claude/review-prompt.md new file mode 100644 index 0000000..da5b004 --- /dev/null +++ b/.claude/review-prompt.md @@ -0,0 +1,22 @@ +请审查当前 Pull Request 的代码改动。改动内容在仓库根目录的 `pr.diff` 文件里——请先用 Read 读取它。 + +结合本仓库的 CLAUDE.md(项目约定、构建/测试方式)和 .claude/skills/ 下的技能,对本次 diff 做代码审查。 + +直接输出 Markdown 审查结论,不要任何前言。格式: + +## 🔍 审查结论 + +### 严重问题(必须修复) +- 按 `文件:行号` 说明问题与建议 + +### 建议改进 +- ... + +### 测试与验证建议 +- 应补充的测试或手动验证步骤 + +要求: +1. 只针对 diff 的真实改动,不要凭空臆测未改动的代码。 +2. 每条结论都给出 文件路径与行号,便于定位。 +3. 区分"必须修复"与"可选建议",减少噪音。 +4. 若 diff 只是文档/配置等无害改动,直接说明无需改动。 diff --git a/.claude/skills/build-and-test.md b/.claude/skills/build-and-test.md new file mode 100644 index 0000000..e5a817a --- /dev/null +++ b/.claude/skills/build-and-test.md @@ -0,0 +1,17 @@ +--- +name: build-and-test +description: 构建本项目并运行测试套件,用于在改动后验证是否破坏功能。当用户要求"跑测试 / 构建验证 / 确认没破坏"时使用。 +--- + +# 构建并测试 + +按以下顺序在本项目里执行验证: + +1. 安装依赖:`` +2. 构建:`` +3. 运行测试:`` + +规则: +- 任意一步失败时,先读错误信息,定位到本次 diff 相关的代码。 +- 给出修复建议(被要求时再直接改代码)。 +- 不要把环境/网络类错误误判为代码缺陷。 diff --git a/.gitea/workflows/ai-review.yml b/.gitea/workflows/ai-review.yml new file mode 100644 index 0000000..06ee1d3 --- /dev/null +++ b/.gitea/workflows/ai-review.yml @@ -0,0 +1,62 @@ +# AI 代码审查:每次 PR 触发,用 Claude Code 调用智谱 GLM(glm-5.2) 审查 diff, +# 并把结论评论到 PR。走 GLM 的 Anthropic 兼容端点,无需访问 Anthropic 官方。 +name: AI Code Review +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + review: + runs-on: ubuntu-latest + env: + # 关键:把 Claude Code 指向智谱 GLM 的 Anthropic 兼容端点(已验证可用) + ANTHROPIC_BASE_URL: https://open.bigmodel.cn/api/anthropic + ANTHROPIC_API_KEY: ${{ secrets.ZHIPU_API_KEY }} + ANTHROPIC_MODEL: glm-5.2 + CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1" # 关闭遥测,避免访问被墙地址 + DISABLE_AUTOUPDATER: "1" + IS_SANDBOX: "1" # CI 容器以 root 运行,需此项才能用 --dangerously-skip-permissions + steps: + - name: 检出代码 + # 手动克隆,避免从 github.com 下载 actions/checkout(内网不可达) + env: + REVIEW_PAT: ${{ secrets.REVIEW_PAT }} + run: | + git clone "http://oauth2:${REVIEW_PAT}@gitea:3000/${{ gitea.repository }}.git" . + git checkout "${{ gitea.event.pull_request.head.ref }}" + + - name: 生成 PR diff + run: | + BASE="${{ gitea.event.pull_request.base.ref }}" + git fetch origin "$BASE" + git diff "origin/$BASE...HEAD" > pr.diff + echo "diff 行数: $(wc -l < pr.diff)" + + - name: 安装 Claude Code + run: npm install -g @anthropic-ai/claude-code --registry=https://registry.npmmirror.com + + - name: 运行 AI 审查 + # Claude Code 会自动读取本仓库 CLAUDE.md 与 .claude/skills/* + run: | + claude -p "$(cat .claude/review-prompt.md)" \ + --model glm-5.2 \ + --output-format text \ + --dangerously-skip-permissions \ + --max-turns 15 > review.md || true + + - name: 把审查结论评论到 PR + env: + REVIEW_PAT: ${{ secrets.REVIEW_PAT }} + API: ${{ vars.MAIN_API }} + REPO: ${{ gitea.repository }} + PR: ${{ gitea.event.pull_request.number }} + run: | + if [ -s review.md ]; then + BODY=$(node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>process.stdout.write(JSON.stringify({body:d})))' < review.md) + curl -fsS -X POST "$API/repos/$REPO/issues/$PR/comments" \ + -H "Authorization: token $REVIEW_PAT" \ + -H "Content-Type: application/json" \ + -d "$BODY" + else + echo "review.md 为空,跳过评论" + fi diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..23b7278 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,26 @@ +# CLAUDE.md + +> 本文件会被 Claude Code(本地开发 + CI 中的 AI 审查)自动读取,用于理解本项目。 +> 建议在本仓库里运行 `/init` 自动生成更完整版本,再按需补充。 + +## 项目简介 + + +## 技术栈 + + +## 目录结构 + + +## 构建与运行 + + +## 测试 + + +## 代码规范与约定 +