Skip to content

用 ReviewKind 类型收敛 review/check 契约和 start_review 入参校验 #55

Description

@ghbvf

现状

全量 review 发现 review/check 模式在跨层契约中是裸字符串:

  • src-tauri/src/model.rs:19 Candidate.kind: String
  • src-tauri/src/model.rs:67 PullRequestView.kind: String
  • src-tauri/src/review/session.rs:61 SessionInfo.kind: String
  • src-tauri/src/review/engine.rs:18 ReviewEngine::start(... kind: &str)
  • src-tauri/src/review/commands.rs:57 Tauri command start_review 接收 kind: String 并直接传入 engine。
  • src-tauri/src/review/session.rs:431 的 skill_command 对非 "check" 全部默认为 review。
  • src/types.ts:9、src/review/api.ts:26、src/review/useReviewStore.ts:223 也都是 string。

同时 command 边界没有拒绝 pr_number == 0 或非法 kind,非法状态可进入 session/registry UI。

三维根因

  • 代码:字符串约定靠注释维护,非法值在后端被静默降级。
  • 架构:这是跨 Rust/TS、ledger、session、engine trait 的契约,但没有类型载体。
  • 历史:初期只有两个模式,直接用字符串实现;后续 auto-dispatch/session/ledger 扩展后,字符串扩散到多个边界。

影响

  • 拼写错误或外部 IPC 非法参数无法在类型层发现。
  • session 列表可显示非法 kind,但实际执行的是 review,UI 和行为不一致。
  • 新增模式时容易遗漏 ledger/session/frontend 等调用点。

修复方向

  • 最小方案:在 start_review command 边界拒绝 pr_number == 0 和非 review/check kind。
  • 彻底方案:引入 Rust ReviewKind enum,serde pin 为 "review" | "check";TS 增加 type ReviewKind = "review" | "check"。
  • 重构方案:让 Candidate、PullRequestView、SessionInfo、ledger event、ReviewEngine trait 全部使用 ReviewKind,并补 serde golden + API wrapper tests。

Files

  • src-tauri/src/model.rs:19
  • src-tauri/src/model.rs:67
  • src-tauri/src/review/engine.rs:18
  • src-tauri/src/review/commands.rs:57
  • src-tauri/src/review/session.rs:61
  • src-tauri/src/review/session.rs:431
  • src/types.ts:9
  • src/review/api.ts:26
  • src/review/useReviewStore.ts:223

Source

Discovered via full-project review with 6 subagents on 2026-06-17.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions