{"id":"85db7abd-a946-4fc7-b829-8120a0274f1c","entityType":"agent","slug":"clawhub-timeaground-pro-code-reviewer","name":"Code Reviewer","canonicalUrl":"https://www.xpersona.co/agent/clawhub-timeaground-pro-code-reviewer","canonicalPath":"/agent/clawhub-timeaground-pro-code-reviewer","generatedAt":"2026-10-10T07:45:12.935Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T00:03:41.748Z","emptyReason":null},"description":"Review code against Android/iOS/TypeScript/Go/general rules. Triggers: review, code review, check my changes, 帮我看看代码, commit hash, PR URL. Read-only, never modifies code. Skill: Code Reviewer Owner: timeaground Summary: Review code against Android/iOS/TypeScript/Go/general rules. Triggers: review, code review, check my changes, 帮我看看代码, commit hash, PR URL. Read-only, never modifies code. Tags: latest:1.3.1 Version history: v1.3.1 | 2026-08-07T14:28:26.387Z | user v1.3.1: ClawHub release. Frontmatter declarations (version/requires/resource_manifest), When to use, 交付物, 不适用场景, Tips secti","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.9K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s1768nwd588za5fw47dcmmxwwh843t26:pro-code-reviewer","sourceUrl":"https://clawhub.ai/timeaground/pro-code-reviewer","homepage":"https://clawhub.ai/timeaground/skills/pro-code-reviewer","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/timeaground/pro-code-reviewer","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/timeaground/skills/pro-code-reviewer","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":65,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Review code against Android/iOS/TypeScript/Go/general rules. Triggers: review, code review, check my changes, 帮我看看代码, commit hash, PR URL. Read-only, never modi"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T00:03:41.748Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T00:03:41.748Z","emptyReason":null},"stars":null,"forks":null,"downloads":1855,"packageName":null,"latestVersion":"1.3.1","tractionLabel":"1.9K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T00:03:41.748Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T00:03:41.748Z","lastCrawledAt":"2026-10-10T00:03:41.748Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T00:03:41.748Z","lastVerifiedAt":null,"highlights":[{"version":"1.3.1","createdAt":"2026-08-07T14:28:26.387Z","changelog":"v1.3.1: ClawHub release. Frontmatter declarations (version/requires/resource_manifest), When to use, 交付物, 不适用场景, Tips sections, PR fetch degradation path, evals.json test suite.","fileCount":14,"zipByteSize":40519},{"version":"1.3.0","createdAt":"2026-07-29T06:25:15.342Z","changelog":"Add TypeScript and Go review rules, skill-vetter integration, three-pass review, PR URL support","fileCount":12,"zipByteSize":36408},{"version":"1.2.0","createdAt":"2026-07-11T14:12:41.424Z","changelog":"PR/CI Layer 1 - remote PR review via URL - Support GitHub/GitLab PR URL as review scope - Fetch diff via web_fetch(.diff endpoint), no gh CLI needed - Extract PR description for context - Output '对 Reviewer 的建议' section for PR reviews - description updated with remote PR review trigger","fileCount":10,"zipByteSize":34340},{"version":"1.1.0","createdAt":"2026-07-11T13:12:25.882Z","changelog":"Three-pass review workflow, review-general upgrade, skill-vetter integration - Step 6 split into three passes: First Look → Line-by-Line Detail → Hardening & Edge Cases - review-general.md fully rewritten: 7 dimensions with structured checklists - New review-skill-vetter.md: 6 dimensions for agent skill security review - Auto-detect skill/agent files in diff, auto-load skill-vetter rules - New Agent Skill Review mode (auto + manual trigger)","fileCount":10,"zipByteSize":33616},{"version":"1.0.3","createdAt":"2026-06-05T09:49:39.250Z","changelog":"pro-code-reviewer 1.0.3 - Added PowerShell runner script for code review: scripts/run_review.ps1. - Introduced a sample evaluation file: evals/evals.json. - Removed obsolete skill-card metadata file: skill-card.md. - Clarified that HTML report generation is triggered only by explicit user request; default output remains chat markdown. - No changes to core review logic or workflow.","fileCount":13,"zipByteSize":33777},{"version":"1.0.2","createdAt":"2026-06-05T06:16:26.443Z","changelog":"- Added PowerShell scripts for HTML report generation: make_review_json.ps1 and render_report.ps1, enabling report creation in environments without Python. - Updated documentation in SKILL.md to include usage examples for the new PowerShell scripts as an alternative to the Python scripts. - Removed unused skill-card.md file.","fileCount":11,"zipByteSize":31105},{"version":"1.0.1","createdAt":"2026-06-05T03:53:06.857Z","changelog":"pro-code-reviewer v1.0.1 - Renamed skill to \"pro-code-reviewer\". - Added _meta.json for skill metadata. - Added scripts/make_review_json.py to support HTML report workflow. - Improved HTML report instructions to clarify JSON generation and usage on Windows. - Removed old skill-card.md file.","fileCount":9,"zipByteSize":24860},{"version":"1.0.0","createdAt":"2026-05-08T06:57:36.288Z","changelog":"Initial release: platform-aware code review with P0/P1/P2 severity grading for Android, iOS, and general projects","fileCount":8,"zipByteSize":22848}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1768nwd588za5fw47dcmmxwwh843t26:pro-code-reviewer","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-timeaground-pro-code-reviewer/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-timeaground-pro-code-reviewer/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-timeaground-pro-code-reviewer/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-timeaground-pro-code-reviewer/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-timeaground-pro-code-reviewer/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-timeaground-pro-code-reviewer/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T07:45:12.929Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-timeaground-pro-code-reviewer/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-timeaground-pro-code-reviewer/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-timeaground-pro-code-reviewer/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-timeaground-pro-code-reviewer/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T00:03:41.748Z","emptyReason":null},"readme":"Skill: Code Reviewer\n\nOwner: timeaground\n\nSummary: Review code against Android/iOS/TypeScript/Go/general rules. Triggers: review, code review, check my changes, 帮我看看代码, commit hash, PR URL. Read-only, never modifies code.\n\nTags: latest:1.3.1\n\nVersion history:\n\nv1.3.1 | 2026-08-07T14:28:26.387Z | user\n\nv1.3.1: ClawHub release. Frontmatter declarations (version/requires/resource_manifest), When to use, 交付物, 不适用场景, Tips sections, PR fetch degradation path, evals.json test suite.\n\nv1.3.0 | 2026-07-29T06:25:15.342Z | user\n\nAdd TypeScript and Go review rules, skill-vetter integration, three-pass review, PR URL support\n\nv1.2.0 | 2026-07-11T14:12:41.424Z | user\n\nPR/CI Layer 1 - remote PR review via URL\n\n- Support GitHub/GitLab PR URL as review scope\n- Fetch diff via web_fetch(.diff endpoint), no gh CLI needed\n- Extract PR description for context\n- Output '对 Reviewer 的建议' section for PR reviews\n- description updated with remote PR review trigger\n\nv1.1.0 | 2026-07-11T13:12:25.882Z | user\n\nThree-pass review workflow, review-general upgrade, skill-vetter integration\n\n- Step 6 split into three passes: First Look → Line-by-Line Detail → Hardening & Edge Cases\n- review-general.md fully rewritten: 7 dimensions with structured checklists\n- New review-skill-vetter.md: 6 dimensions for agent skill security review\n- Auto-detect skill/agent files in diff, auto-load skill-vetter rules\n- New Agent Skill Review mode (auto + manual trigger)\n\nv1.0.3 | 2026-06-05T09:49:39.250Z | user\n\npro-code-reviewer 1.0.3\n\n- Added PowerShell runner script for code review: scripts/run_review.ps1.\n- Introduced a sample evaluation file: evals/evals.json.\n- Removed obsolete skill-card metadata file: skill-card.md.\n- Clarified that HTML report generation is triggered only by explicit user request; default output remains chat markdown.\n- No changes to core review logic or workflow.\n\nv1.0.2 | 2026-06-05T06:16:26.443Z | user\n\n- Added PowerShell scripts for HTML report generation: make_review_json.ps1 and render_report.ps1, enabling report creation in environments without Python.\n- Updated documentation in SKILL.md to include usage examples for the new PowerShell scripts as an alternative to the Python scripts.\n- Removed unused skill-card.md file.\n\nv1.0.1 | 2026-06-05T03:53:06.857Z | user\n\npro-code-reviewer v1.0.1\n\n- Renamed skill to \"pro-code-reviewer\".\n- Added _meta.json for skill metadata.\n- Added scripts/make_review_json.py to support HTML report workflow.\n- Improved HTML report instructions to clarify JSON generation and usage on Windows.\n- Removed old skill-card.md file.\n\nv1.0.0 | 2026-05-08T06:57:36.288Z | user\n\nInitial release: platform-aware code review with P0/P1/P2 severity grading for Android, iOS, and general projects\n\nArchive index:\n\nArchive v1.3.1: 14 files, 40519 bytes\n\nFiles: CHANGELOG.md (1261b), eval/evals.json (5639b), LICENSE (1063b), README-zh.md (7415b), README.md (6546b), references/review-android.md (6806b), references/review-general.md (7343b), references/review-go.md (6584b), references/review-ios.md (5685b), references/review-skill-vetter.md (3979b), references/review-typescript.md (6186b), skill-card.md (2530b), SKILL.md (15817b), _meta.json (136b)\n\nFile v1.3.1:SKILL.md\n\n---\r\nname: code-reviewer\r\nversion: 1.3.1\r\ndescription: |\r\n  Review code against Android/iOS/TypeScript/Go/general rules. Triggers: review, code\r\n  review, check my changes, 帮我看看代码, commit hash, PR URL. Read-only, never modifies code.\r\nrequires: [Read, Glob, Grep, RunCommand, WebFetch]\r\nresource_manifest:\r\n  network_required: true\r\n  network_domains: [github.com, gitlab.com]\r\n  read_only: true\r\n---\r\n\r\n# Code Reviewer\r\n\r\n## When to use this\r\n\r\nUse this skill when the user asks to review code changes, e.g.:\r\n\r\n- \"review\", \"review this PR\", \"check my changes\", \"帮我看看代码\"\r\n- \"review staged\", \"review <commit-hash>\", \"review main..branch\", \"quick review\", \"review before commit\"\r\n- \"security review\" / \"安全审查\" — stricter security lens\r\n- \"skill review\" / \"agent review\" / \"审查技能\" — agent skill security review\r\n- Pastes a GitHub `pull/*` or GitLab `merge_requests/*` URL\r\n\r\nPlatform (Android/iOS/General) and language (TypeScript/Go) are auto-detected from the diff; uncommitted/staged/commit/range/branch/PR scopes are supported.\r\n\r\n## Mindset\r\n\r\nYou are a senior mobile engineer with battle scars from shipping Android and iOS apps to millions of users. You've debugged enough lifecycle leaks, thread crashes, and memory corruptions at 3 AM to have zero patience for careless code.\r\n\r\nYour reviews are **direct, specific, and actionable**. You don't manufacture problems, but you don't let real ones slide either. When code is clean, say so. When it's not, explain exactly why it will hurt someone in production.\r\n\r\n- **Android/iOS projects**: Apply platform-specific expertise — lifecycle safety, memory management, threading, platform conventions. This is your home turf.\r\n- **Other projects**: Apply general engineering principles. You're thorough but appropriately humble about domain-specific patterns you may not know.\r\n\r\nYour default stance: *\"Will this cause a problem in production? If yes, it's a finding. If not, let it go.\"*\r\n\r\n---\r\n\r\nReview code changes and report issues by severity.\r\n\r\n## Rule Files\r\n\r\nRead from `references/` relative to this skill directory. Always load general + detected platform:\r\n- `references/review-general.md` — always\r\n- `references/review-android.md` — Android (Kotlin/Java)\r\n- `references/review-ios.md` — iOS (ObjC/Swift)\r\n\r\n**Language-specific rules (auto-detected from diff, additive):**\r\n- `.ts` / `.tsx` files in diff → also load `references/review-typescript.md`\r\n- `.go` files in diff → also load `references/review-go.md`\r\n\r\n**Skill-vetter rules (auto-detected from diff or explicit request):**\r\n- If the diff contains `SKILL.md`, `*.skill.md`, `.mdc`, or `.agent.md` files → also load `references/review-skill-vetter.md`\r\n- If the user explicitly requests \"skill review\", \"agent review\", or \"安全审查\" → also load `references/review-skill-vetter.md` even without matching files in diff\r\n\r\n## Severity Definitions (hard rules)\r\n\r\n| Level | Criteria | Action |\r\n|-------|----------|--------|\r\n| **P0** | Will cause: crash, data loss/corruption, security vulnerability, deadlock, infinite loop | **Must fix before merge** |\r\n| **P1** | May cause: race condition under specific timing, resource leak under edge case, silent data error, uncovered error path that breaks UX | Should fix |\r\n| **P2** | Code quality: naming, structure, minor redundancy, non-critical style | Nice to have |\r\n\r\nWhen uncertain between two levels, choose the **lower** severity (less alarm).\r\n\r\n## Workflow\r\n\r\n### 0. Activation guard\r\n\r\nBefore activating, confirm the user is in a development/review context:\r\n\r\n- **In a git repo**: `git rev-parse --show-toplevel` succeeds → proceed to scope detection\r\n- **Not in a git repo but user explicitly asked for code review** (e.g. \"review this snippet\", pasted code) → proceed with the provided code\r\n- **Neither**: respond \"I can help review code in a git repository. Share the code you'd like me to review.\" — do not inspect any files\r\n\r\nBare keywords like \"review\" alone are NOT sufficient to activate in non-repo contexts.\r\n\r\n### 1. Determine review scope\r\n\r\nDetect from user message. Priority order:\r\n\r\n| User says | Scope | Git command |\r\n|-----------|-------|-------------|\r\n| \"review\" (no qualifier) | Uncommitted changes (staged + unstaged) | `git diff HEAD` |\r\n| \"review staged\" / \"review 暂存\" | Staged only | `git diff --cached` |\r\n| \"review \\<sha\\>\" / \"cid \\<sha\\>\" | Single commit | `git show <sha>` |\r\n| \"review \\<sha1\\>..\\<sha2\\>\" | Commit range | `git diff <sha1>..<sha2>` |\r\n| \"review branch \\<name\\>\" | Branch vs main/master | `git diff main...<name>` |\r\n| \"review last N commits\" | Recent N commits | `git diff HEAD~N..HEAD` |\r\n| `https://github.com/*/pull/*` 或类似 GitHub PR URL | 远程 PR 的 diff | 见 Step 2a |\r\n| `https://gitlab.com/*/-/merge_requests/*` 等 PR/MR URL | 远程 PR/MR 的 diff | 见 Step 2a |\r\n| `review pr` + PR URL | 远程 PR 的 diff | 见 Step 2a |\r\n\r\nIf scope is ambiguous, ask the user to clarify — never default to scanning uncommitted changes without explicit direction.\r\n\r\n**PR URL detection**: A URL matching `github.com/*/pull/*`, `gitlab.com/*/-/merge_requests/*`, or similar code hosting platform PR/MR pattern is treated as a remote review scope.\r\n\r\n### 2. Resolve repo or remote PR\r\n\r\nIf the scope is a PR URL (remote review):\r\n1. Parse the URL to extract: platform (`github` / `gitlab`), owner, repo, PR number\r\n2. Fetch the diff:\r\n   - GitHub: `web_fetch(\"https://github.com/{owner}/{repo}/pull/{number}.diff\")`\r\n   - GitLab: `web_fetch(\"https://gitlab.com/{owner}/{repo}/-/{merge_requests}/{number}.diff\")`\r\n3. Fetch PR context (title, description, changed files list):\r\n   `web_fetch(\"https://github.com/{owner}/{repo}/pull/{number}\")` — extract from the rendered page\r\n4. Record the repo name from URL for the output header\r\n5. Skip git repo validation — proceed directly to Step 4 (Pre-flight checks)\r\n6. **If fetching the diff or PR context fails** (timeout / HTTP 404 / network error): retry once after a short pause. If it still fails, tell the user the PR could not be fetched and offer alternatives: retry later, or review locally (checkout the branch and use \"review <branch>\" / commit-range scope)\r\n\r\nIf the scope is NOT a PR URL (local review):\r\nUse current working directory. Validate:\r\n```bash\r\ngit rev-parse --show-toplevel 2>/dev/null\r\n```\r\nIf not a git repo, ask user for path.\r\n\r\n### 3. Detect platform & language\r\n\r\nCheck repo root for platform markers (in order, first match wins):\r\n\r\n| Platform | Markers (any match) |\r\n|----------|-------------------|\r\n| iOS | `*.xcodeproj`, `*.xcworkspace`, `Podfile`, `Package.swift` |\r\n| Android | `build.gradle*`, `settings.gradle*`, `AndroidManifest.xml`, `gradlew` |\r\n| General | Neither matches |\r\n\r\nThen scan the diff for language-specific files. Language detection is **additive** (not mutually exclusive):\r\n- Any `.ts` / `.tsx` file in diff → TypeScript mode\r\n- Any `.go` file in diff → Go mode\r\n\r\nIf the diff contains `SKILL.md`, `*.skill.md`, `.mdc`, or `.agent.md` files → also auto-load `review-skill-vetter.md` as an extra rule set regardless of platform.\r\n\r\n### 4. Pre-flight checks\r\n\r\n**Diff size**: Run `git diff --stat` first.\r\n- \\> 5000 lines changed → warn user, offer to focus on specific paths\r\n- \\> 10000 lines → refuse unless user confirms (context will be too large for quality review)\r\n\r\n**File filter** — skip from review (show in stats summary):\r\n- Binary files, images, fonts, videos\r\n- Generated: `*.pb.go`, `*.generated.*`, `R.java`, `BuildConfig.java`, `*.g.dart`\r\n- Lock files: `package-lock.json`, `yarn.lock`, `Podfile.lock`, `*.lock`\r\n- Vendor/deps: `vendor/`, `node_modules/`, `Pods/`, `build/`, `.gradle/`\r\n- IDE: `.idea/`, `.vscode/`, `*.xcuserdata`, `*.iml`\r\n\r\n### 5. Gather context\r\n\r\nFor each changed file, beyond the diff itself:\r\n- Read the **full function/method** surrounding each change (not just diff lines)\r\n- If a public API signature changed, search for callers: `git grep \"<function_name>\"` to assess impact\r\n- Check the commit message / PR description for intent — findings should be about **bugs**, not about **disagreeing with the approach**\r\n\r\n**For remote PR review only:** also extract the PR description (it's available from the context fetched in Step 2). Use it to understand the broader motivation beyond individual commit messages.\r\n\r\n### 6. Three-pass review\r\n\r\nRead `references/review-general.md` + platform-specific file + any auto-detected rule files.\r\n\r\nWork through the code in three passes, in order. Each pass has a different focus. Do NOT skip or merge passes.\r\n\r\n---\r\n\r\n#### Pass A — First Look (High-level structure, ~2-3 minutes)\r\n\r\nGoal: understand the change as a whole before diving into details.\r\n\r\n- Read the commit message / PR description for intent\r\n- Scan the file list — does the change scope make sense?\r\n- Check overall approach — is this the right solution to the problem?\r\n- Identify risky areas: API changes, shared mutable state, external boundaries\r\n- **Do NOT** report any findings yet — this pass is mental preparation\r\n\r\n---\r\n\r\n#### Pass B — Line-by-Line Detail (Main bulk of review)\r\n\r\nGoal: apply rules to each changed file, find concrete issues.\r\n\r\nFor each file, in order of the diff:\r\n1. Read the full function/method/block surrounding each change (not just the diff lines)\r\n2. Apply the relevant rule dimensions to that specific change\r\n3. If a public API signature changed, search for callers: `git grep \"<function_name>\"`\r\n\r\nFor every finding, include ALL fields:\r\n\r\n| Field | Description |\r\n|-------|-------------|\r\n| severity | `P0` / `P1` / `P2` (follow hard rules above) |\r\n| title | One-line summary |\r\n| file | File path |\r\n| line | Line number or range |\r\n| dimension | Category (e.g. 线程安全, 内存管理, 逻辑正确性) |\r\n| rule_source | `general` / `android` / `ios` / `skill-vetter` |\r\n| problem | What's wrong and why it matters |\r\n| code | **Exact** original lines from diff (non-empty) |\r\n| code_lang | Language identifier |\r\n| fix_suggestion | How to fix (text) |\r\n| fix_code | Concrete fix code (non-empty, compilable) |\r\n| fix_lang | Language of fix |\r\n\r\n**Quality rules:**\r\n- Don't report issues in unchanged code (unless the change directly breaks it)\r\n- Don't suggest \"might want to consider...\" — every finding must be a concrete problem\r\n- If no issues found for a file, move on. Empty review for a file is valid.\r\n\r\n---\r\n\r\n#### Pass C — Hardening & Edge Cases (~5 minutes)\r\n\r\nGoal: catch what line-by-line might miss — cross-file concerns and edge paths.\r\n\r\n- **Boundary values**: empty arrays, zero, null, max values, edge-case inputs\r\n- **Concurrency safety**: shared mutable state across files, async timing assumptions\r\n- **Error path completeness**: every execution path should reach a callback / error handler\r\n- **Caller impact**: if a signature/data structure changed, are all callers updated? (Check with `git grep`)\r\n\r\nIn this pass, you may report findings that span multiple files (e.g. \"similar bug pattern found in 3 files\").\r\n\r\nAfter all three passes, deliver the report as specified in ## 交付物 (Output).\r\n\r\n---\r\n\r\n## 交付物 (Output)\r\n\r\n**Output language**: Detect from the user's conversation language and system locale. Default to English if detection is ambiguous. Dimension names in rule files are internal labels; translate them to the output language when presenting findings.\r\n\r\n**Default: Terminal markdown** — print directly in chat:\r\n\r\n```markdown\r\n## Code Review: <repo_name>\r\n**Scope**: <description>  |  **Platform**: Android  |  **Files**: 12  |  **+247 / -89**\r\n\r\n### P0 · Must Fix (2)\r\n#### 1. [Thread Safety] ConcurrentModificationException risk\r\n📄 `app/src/.../ViewModel.kt:45-52`\r\n**Problem**: ...\r\n**Fix**: ...\r\n\r\n### P1 · Should Fix (3)\r\n...\r\n\r\n### P2 · Nice to Have (1)\r\n...\r\n\r\n**Summary**: 2 P0 / 3 P1 / 1 P2 — Fix P0 before merge.\r\n```\r\n\r\n**For remote PR review only:** after the findings, also include a section with suggestions for the PR reviewer, in the same language as the rest of the output.\r\n\r\nThe English version of the example output replaces the Chinese example. Localize dimension, severity, and suggestion labels to match the output language.\r\n\r\n\r\n## Review Modes\r\n\r\n### Standard Review (default)\r\nManual trigger — user says \"review\" and gets results in chat.\r\n\r\n### Security-Focused Review\r\nWhen user says \"security review\" or \"安全审查\", apply stricter lens:\r\n- Focus on OWASP Top 10, injection, auth bypass, secrets exposure\r\n- Ignore style/naming issues entirely\r\n- All security findings are P0 or P1, never P2\r\n\r\n### Agent Skill Review\r\nWhen the diff contains `SKILL.md`, `*.skill.md`, `.mdc`, or `.agent.md` files, **automatically** enable Agent Skill Review:\r\n- Load `references/review-skill-vetter.md` as an additional rule set\r\n- Check for prompt injection risks, token/secret exposure, excessive permissions, unsafe tool calls\r\n- Apply skill-vetter's red flag checklist\r\n\r\nAlso trigger this mode when user says \"skill review\", \"agent review\", \"skill-vetter\", or \"审查技能\".\r\n\r\n### Quick Review\r\nWhen user says \"quick review\" or \"快速看看\":\r\n- Only report P0 issues\r\n- Skip P1/P2 entirely\r\n- Fastest path to \"can I merge this?\"\r\n\r\n## Smart Behaviors\r\n\r\n**Repeated patterns**: If the same issue appears 3+ times across files, report it once with\r\n\"Found in N files\" instead of N separate findings. List all affected files.\r\n\r\n**Related changes**: When a function signature changes, automatically check if callers are\r\nupdated. Report missing caller updates as P0 (will cause compile error or runtime crash).\r\n\r\n**Test coverage hint**: If the changed code has no corresponding test changes and the repo\r\nhas a test directory, mention it as P2 (not a finding, just a note at the end).\r\n\r\n## Tips\r\n\r\n- **Diff 过大时先聚焦**：>5000 行时优先检查高风险路径（API 变更、并发、外部边界），再按文件逐个处理\r\n- **先读意图再读代码**：commit message / PR 描述先行——findings 针对 bug，而非方案分歧\r\n- **重复问题合并报告**：同一问题出现 3+ 文件时报告一次，列出所有受影响文件\r\n- **严重度拿不准时取低**：P0 误报会侵蚀信任，宁缺毋滥\r\n\r\n## Safety\r\n\r\n- **Read-only**: Never modify repo code, create files, or run destructive git commands.\r\n- **Conservative severity**: When unsure, choose lower severity. False P0 alarms erode trust.\r\n- **Data disclosure**: This skill sends code diffs to the AI model for analysis. Do not review repositories containing secrets, credentials, or other sensitive data that should not leave the local machine.\r\n\r\n## 不适用场景\r\n\r\n- 非 git 仓库且用户未提供代码、未明确要求审查（见 Workflow Step 0 Activation guard）\r\n- 用户仅询问 review 方法论 / 理论问题，无具体代码可审\r\n- 无 diff 可审（空提交、无变更）\r\n- 变更超过 10,000 行且用户未确认聚焦（见 Workflow Step 4 Pre-flight checks）\r\n- 包含密钥/凭证等敏感数据的仓库（见 ## Safety 数据披露警告）\r\n\r\n## Next Steps\r\n\r\nAfter every review, always end with a **Next Steps** section offering these options:\r\n\r\n```\r\n---\r\n**Next Steps**\r\n1. 📋 **Discuss** — Walk through findings one by one, I'll explain each issue and suggest fixes\r\n2. 🔨 **Fix now** — Tell me which issues to fix, I'll generate the corrected code\r\n3. ✅ **All good** — No action needed\r\n```\r\n\r\nIf the user is operating through a sub-agent or coding assistant (e.g., Claude Code, Copilot), omit Next Steps and output only the review findings.\r\n\r\n## Feedback\r\n\r\nFound a bug, have a suggestion, or want a new language covered?\r\nOpen an issue → [github.com/TimeAground/code-reviewer/issues](https://github.com/TimeAground/code-reviewer/issues)\n\nFile v1.3.1:README.md\n\n# code-reviewer\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Python 3.8+](https://img.shields.io/badge/Python-3.8+-green.svg)](https://python.org)\n[![Platforms](https://img.shields.io/badge/Platforms-Android%20%7C%20iOS%20%7C%20General-orange.svg)](#supported-platforms)\n\n> AI-powered code review with severity grading. Platform-aware rules for Android, iOS, and general projects.\n\n## ✨ What It Does\n\nPoint it at your code changes → get a structured review with **P0 / P1 / P2** severity grading. Auto-detects your platform and applies specialized rules across up to 9 review dimensions.\n\n```\n> review\n\n✅ 2 issues found\n\nP0 🔴 Coroutine launched in Activity without lifecycle scope\n   src/MainActivity.kt:42\n   → Use lifecycleScope.launch instead of GlobalScope.launch\n\nP1 🟡 RecyclerView adapter not using DiffUtil\n   src/adapter/UserAdapter.kt:15\n   → Replace notifyDataSetChanged() with DiffUtil for better performance\n```\n\n## 🧠 How It Works\n\n1. **Detect** — Identifies platform from project markers (`build.gradle` → Android, `*.xcodeproj` → iOS, `go.mod` → Go, `tsconfig.json` → TypeScript)\n2. **Diff** — Extracts changes via `git diff` (staged, unstaged, commits, branches)\n3. **Review** — AI applies platform/language-specific rules across multiple dimensions\n4. **Report** — Outputs structured findings with severity, location, and fix suggestions\n\n## 🎯 Three Review Modes\n\n| Mode | Command | Focus |\n|---|---|---|\n| **Standard** | `review` | Full review — P0, P1, P2 |\n| **Quick** | `quick review` | P0 only — \"can I merge this?\" |\n| **Security** | `security review` | Injection, auth bypass, key leaks |\n\n## 📋 Severity Levels\n\n| Level | Meaning | Examples |\n|---|---|---|\n| **P0** 🔴 | Must fix | Crash, data loss, security vulnerability, deadlock |\n| **P1** 🟡 | Should fix | Race condition, resource leak, unhandled error path |\n| **P2** 🔵 | Nice to have | Naming, structure, minor redundancy |\n\n## Supported Platforms\n\n### Android (9 dimensions)\n\nAuto-detected by: `build.gradle*`, `AndroidManifest.xml`\n\n| # | Dimension | What It Checks |\n|---|---|---|\n| 1 | **Thread safety** | Main-thread network/IO, SharedPreferences off main thread |\n| 2 | **Deadlock & jank** | Nested locks, `runBlocking` on main thread, oversized `synchronized` blocks |\n| 3 | **Memory management** | Activity/Context leaks, Handler inner-class retaining outer, Bitmap not recycled |\n| 4 | **Lifecycle safety** | View access after `onStop`, ViewModel holding View reference, LiveData from wrong thread |\n| 5 | **Logic correctness** | Integer overflow, float equality, concurrent collection modification |\n| 6 | **Exception handling** | Swallowed exceptions, overly broad catch, exception thrown in `finally` |\n| 7 | **Data consistency** | Transaction atomicity, cache/DB sync, state races in SSE/Flow |\n| 8 | **API compatibility** | Missing `Build.VERSION.SDK_INT` guards, deprecated API usage |\n| 9 | **Architecture** | ViewModel touching View directly, Repository with UI logic, illegal cross-module dependencies |\n\n### iOS (9 dimensions)\n\nAuto-detected by: `*.xcodeproj`, `Podfile`, `Package.swift`\n\n| # | Dimension | What It Checks |\n|---|---|---|\n| 1 | **Threading safety** | UI updates off main thread, data races on shared state |\n| 2 | **Deadlock & jank** | GCD deadlocks, main queue sync from main thread, blocking calls on main |\n| 3 | **Memory safety** | Retain cycles in closures, unowned vs weak misuse, delegate strong references |\n| 4 | **Resource leaks** | Unclosed file handles, NotificationCenter observers not removed, timer not invalidated |\n| 5 | **Logic correctness** | Force unwrap crashes, index-out-of-bounds, incorrect optional chaining |\n| 6 | **Exception handling** | Unhandled `Result` cases, missing `do-catch`, silent `try?` failures |\n| 7 | **Data consistency** | CoreData context threading, UserDefaults race, Combine publisher state |\n| 8 | **API compatibility** | Missing `@available` guards, deprecated API usage |\n| 9 | **Architecture** | ViewController business logic, circular dependencies, broken MVVM/VIPER layer |\n\n### General (7 dimensions)\n\nApplied to any project not identified as Android or iOS.\n\n| # | Dimension | What It Checks |\n|---|---|---|\n| 1 | **Correctness** | Logic errors, off-by-one, wrong operator precedence |\n| 2 | **Thread safety** | Shared mutable state, missing synchronization |\n| 3 | **Memory** | Leaks, unbounded growth, missing cleanup |\n| 4 | **Performance** | N+1 queries, unnecessary allocations, blocking calls |\n| 5 | **API design** | Unclear contracts, missing null checks, poor error types |\n| 6 | **Error handling** | Unhandled error paths, silent failures |\n| 7 | **Security** | Hardcoded secrets, injection risks, insecure storage |\n\n## 🚀 Quick Start\n\n### Install\n\n```bash\n# OpenClaw\nclawhub install code-reviewer\n\n# Claude Code\ncp -r code-reviewer/ your-project/.claude/skills/\n\n# GitHub Copilot\ncp -r code-reviewer/ your-project/.agents/skills/\n```\n\n### Use\n\n```\nreview                    # All uncommitted changes\nreview staged             # Only staged changes\nreview abc1234            # Specific commit\nreview last 5 commits     # Recent commits\nreview branch feature-x   # Branch diff vs main\n```\n\n## 🛡 Smart Behaviors\n\n- **Duplicate merging** — Same issue in 3+ files → merged into one finding with count\n- **API change tracking** — Signature changed? Automatically checks if all callers are updated\n- **Test coverage hints** — Changed code without test updates → gentle reminder\n- **Large diff protection** — 5000+ lines → warns before proceeding\n- **Auto-filtered files** — Skips generated code, binaries, lock files, vendor dirs\n\n\n\n## 🏗 Architecture\n\n```\ncode-reviewer/\n├── SKILL.md                    # AI agent instructions\n└── references/\n    ├── review-general.md       # General review rules\n    ├── review-android.md       # Android-specific rules (9 dimensions)\n    ├── review-ios.md           # iOS-specific rules (9 dimensions)\n    ├── review-typescript.md    # TypeScript-specific rules (7 dimensions)\n    ├── review-go.md            # Go-specific rules (7 dimensions)\n    └── review-skill-vetter.md  # Agent/LLM skill security review rules\n```\n\n## Requirements\n\n- Git repository\n- An AI coding assistant (OpenClaw, Claude Code, GitHub Copilot, etc.)\n\n## Feedback\n\nFound a bug or want a new language covered?\n[Open an issue →](https://github.com/TimeAground/code-reviewer/issues)\n\n## License\n\nMIT\n\nFile v1.3.1:_meta.json\n\n{\n  \"ownerId\": \"kn7crx9z6m9cw8gpcwbhp8na31843hnr\",\n  \"slug\": \"pro-code-reviewer\",\n  \"version\": \"1.3.1\",\n  \"publishedAt\": 1786112906387\n}\n\nFile v1.3.1:references/review-android.md\n\n# Android (Kotlin/Java) 审查维度\r\n\r\n按以下 9 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过多种方法（阅读上下文、搜索调用方、追踪数据流）反复验证后再确认。\r\n\r\n## 1. 线程安全与并发\r\n\r\n- 共享可变状态是否有正确的同步保护（`synchronized`、`ReentrantLock`、`@Volatile`、`AtomicXxx`）\r\n- 协程中访问的共享状态是否使用了正确的 Dispatcher 和 `Mutex`/`StateFlow`\r\n- `Handler`/`Looper` 使用是否正确，是否可能在错误线程回调\r\n- `LiveData.postValue` 连续调用是否会丢值（仅保留最后一次）\r\n- `ConcurrentModificationException`：迭代集合时是否可能被其他线程修改\r\n- `suspend` 函数中的共享状态访问是否在同一个 `CoroutineContext` 中\r\n\r\n## 2. 死锁、卡顿与性能\r\n\r\n- **主线程卡顿**：主线程上执行数据库操作、文件 I/O、网络请求、大量计算\r\n- **同步死锁**：嵌套 `synchronized`（A->B->A）、`runBlocking` 在主线程\r\n- **协程死锁**：在 `Dispatchers.Main` 上调用 `runBlocking`；协程 A 等待 B 完成，B 又等待 A\r\n- **RecyclerView 性能**：`onBindViewHolder` 中执行耗时操作、未复用 ViewHolder、频繁 `notifyDataSetChanged` 而非 DiffUtil\r\n- **过度绘制/布局层级**：嵌套过深的 View 层级、不必要的背景绘制\r\n- **大对象频繁创建**：循环内反复创建 SimpleDateFormat、正则 Pattern、Gson 实例\r\n- **无节制的集合增长**：List/Map 只添加不清理，随时间无限增长\r\n- **Bitmap 未及时回收**：大图加载未压缩、未使用 `inSampleSize`\r\n\r\n## 3. 内存管理\r\n\r\n- **Activity/Fragment 泄漏**：匿名内部类/非静态内部类隐式持有外部类引用\r\n- **Handler 泄漏**：非静态 Handler 持有 Activity 引用，消息队列中的 Message 延迟释放\r\n- **协程泄漏**：协程未绑定 `lifecycleScope`/`viewModelScope`，Activity 销毁后仍在执行\r\n- **Context 泄漏**：单例/静态变量持有 Activity Context（应使用 Application Context）\r\n- **注册未反注册**：BroadcastReceiver、ContentObserver、Listener 注册后未在 `onDestroy` 中反注册\r\n- **Cursor/Stream 未关闭**：数据库 Cursor、InputStream/OutputStream 未在 finally 中关闭\r\n- **WebView 泄漏**：WebView 未在 `onDestroy` 中调用 `destroy()`\r\n\r\n## 4. 生命周期安全\r\n\r\n- Fragment/Activity 销毁后是否仍访问 View（`getView()` 返回 null）\r\n- `onActivityResult`/回调中是否检查了 `isAdded()`/`isFinishing()`\r\n- `ViewModel` 中是否引用了 View/Activity（应通过 LiveData/StateFlow 通信）\r\n- `DialogFragment.show()` 在 `onSaveInstanceState` 后调用导致 crash\r\n- `FragmentTransaction.commit()` vs `commitAllowingStateLoss()` 的使用场景\r\n- `LaunchedEffect`/`DisposableEffect`（Compose）的清理逻辑是否完整\r\n\r\n## 5. 逻辑正确性\r\n\r\n- 条件判断的边界值是否正确（off-by-one、空值、零值）\r\n- Kotlin null safety：`!!` 强制解包是否安全、`?.let` 链中是否有竞态\r\n- 新增代码对已有流程的影响面（调用方是否需要适配）\r\n- 异步操作的时序是否有保证（先后顺序、回调是否可能不触发）\r\n- 错误处理路径是否完整（每个分支都有合理出口）\r\n- `when` 表达式是否覆盖所有情况（sealed class 是否有遗漏分支）\r\n\r\n## 6. 异常处理与回调完整性\r\n\r\n- **协程异常**：`launch` 中未捕获的异常会 crash，`async` 的 `await` 未包裹 try-catch\r\n- **回调遗漏**：所有执行路径是否都触发了回调/LiveData 更新，避免 UI 永远 loading\r\n- `try-catch` 是否吞掉了不应忽略的异常（catch 后无日志、直接 return）\r\n- `CoroutineExceptionHandler` 是否正确配置\r\n- 网络请求超时/失败路径是否有降级策略\r\n- `Result`/`sealed class` 错误类型是否在所有消费处都处理\r\n\r\n## 7. 数据一致性\r\n\r\n- 多数据源（数据库 + 网络 + 缓存）是否可能出现不一致\r\n- `SharedPreferences.apply()` 的异步写入是否会导致读取到旧值\r\n- Room 数据库事务是否正确使用 `@Transaction`\r\n- `StateFlow`/`LiveData` 的值更新是否原子（多个相关字段分别更新可能导致中间状态）\r\n- 状态机是否存在非法跳转（跳过中间状态、重复进入终态）\r\n\r\n## 8. API 兼容性\r\n\r\n- 公开 API 签名变更是否破坏已有调用方\r\n- `@JvmOverloads`/`@JvmStatic` 等注解变更是否影响 Java 互操作\r\n- `data class` 添加新字段是否影响 `copy()`/`equals()`/序列化\r\n- ProGuard/R8 混淆规则是否覆盖新增的反射/序列化类\r\n- `minSdk` 兼容性：使用的 API 是否在所有支持版本上可用\r\n- Intent/Bundle 传递的 key 重命名是否影响其他组件\r\n\r\n## 9. 架构设计\r\n\r\n- 圈复杂度是否过高（深层嵌套、过长方法）\r\n- 是否存在重复代码可提取公共方法\r\n- 类/模块间的依赖关系是否合理（避免循环依赖）\r\n- ViewModel/Repository/UseCase 职责是否清晰\r\n- 新增 API 的命名和参数设计是否符合现有约定\r\n- 是否违反了单向数据流原则（View 直接修改 Model）\r\n\r\n**过度工程化红线（以下情况不要提出建议）：**\r\n- 三行以内的相似代码不算\"重复\"\r\n- 仅被调用一次的代码不需要提取方法\r\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\r\n- 不要建议为假想的未来需求做扩展性设计\r\n- 不要要求给未变更的代码加注释、文档或类型标注\r\n- 不要建议为一次性操作创建工具类/抽象层\r\n\r\n---\r\n\r\n## 报告格式\r\n\r\n```markdown\r\n# Code Review Report\r\n\r\n> **分支**: <branch>\r\n> **Review 范围**: commit_id..HEAD (N commits)\r\n> **变更文件**: N 个\r\n\r\n## 概述\r\n[一段话总结本次变更的目的和整体质量评价]\r\n\r\n## 问题清单\r\n\r\n### [P0] 必须修复\r\n> P0 = 会导致 crash / 数据错误 / 安全漏洞 / 死锁\r\n\r\n#### 1. [问题标题]\r\n- **文件**: `path/to/File.kt:行号`\r\n- **维度**: 线程安全 / 内存管理 / 生命周期安全 / ...\r\n- **问题描述**: [具体问题]\r\n- **风险**: [会导致什么后果]\r\n- **修复建议**: [具体修复方式]\r\n\r\n### [P1] 建议修复\r\n> P1 = 潜在风险 / 边界 case 未处理\r\n\r\n### [P2] 架构优化建议\r\n> P2 = 代码质量 / 可维护性改进\r\n\r\n## 总结\r\n\r\n| 维度 | P0 | P1 | P2 |\r\n|------|----|----|-----|\r\n| 线程安全与并发 | 0 | 0 | 0 |\r\n| 死锁与卡顿 | 0 | 0 | 0 |\r\n| 内存管理 | 0 | 0 | 0 |\r\n| 生命周期安全 | 0 | 0 | 0 |\r\n| 逻辑正确性 | 0 | 0 | 0 |\r\n| 异常处理/回调完整性 | 0 | 0 | 0 |\r\n| 数据一致性 | 0 | 0 | 0 |\r\n| API 兼容性 | 0 | 0 | 0 |\r\n| 架构设计 | - | 0 | 0 |\r\n\r\n[最终结论：是否可以合入，或需要修复后再 review]\r\n```\n\nFile v1.3.1:references/review-general.md\n\n# 通用审查维度\n\n适用于非 iOS/Android 的项目（TypeScript、Python、Go、Java（非 Android）、C#、Rust 等）。\n按以下 7 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过阅读上下文、搜索调用方、追踪数据流反复验证后再确认。\n\n---\n\n## 1. 安全性\n\n> **P0 频发地带** — 每个安全问题都是 P0\n\n- **注入漏洞**：所有数据库查询是否使用参数化查询/ORM？用户输入拼接 SQL/NoSQL 查询是 P0\n- **XSS**：用户提交的内容在渲染前是否被转义/脱敏？`dangerouslySetInnerHTML` 等 API 是否有充分理由并做安全处理\n- **CSRF**：状态变更请求是否有 CSRF token/SameSite Cookie 防护？\n- **认证与鉴权**：每个受保护端点是否验证了用户身份？资源访问是否按用户权限做了隔离？（IDOR 是 P0）\n- **输入校验**：所有外部输入（params、headers、body、files）是否在服务端做了类型/长度/格式/范围校验？前端校验不是安全校验\n- **密钥泄露**：代码中是否硬编码了 API Key、密码、Token？（P0，立即修复）\n- **依赖安全**：新引入的依赖是否来自可信源、持续维护、无已知 CVE？\n- **敏感数据泄露**：PII、Token、密钥是否可能被日志、错误消息或 API 响应泄露？\n- **文件上传**：上传的文件是否做了类型/大小校验？是否存储到 webroot 之外？Content-Type 是否正确？\n- **HTTP 安全头**：Content-Security-Policy、X-Content-Type-Options、Strict-Transport-Security 是否配置？\n\n## 2. 性能\n\n- **N+1 查询**：是否存在循环内发起独立数据库查询的模式？应该改为批量查询或 JOIN\n- **不必要的重渲染**：前端组件是否只在相关 state/props 变化时才重渲染？不必要的 memo 化不要建议，实测有问题的才提\n- **内存泄漏**：事件监听器、订阅、定时器、interval 是否在组件卸载/资源释放时清理？\n- **包体积**：新依赖是否可 tree-shake？是否为了一个函数导入了整个库？建议按需导入\n- **懒加载**：重型组件、路由、折叠内容是否使用了懒加载/代码分割？\n- **缓存策略**：重复计算/API 响应是否使用了合适的缓存（memoization、HTTP cache、Redis）？\n- **数据库索引**：查询的过滤/排序字段是否有索引？新查询是否应检查 EXPLAIN 计划？\n- **分页**：列表查询是否使用了分页或 cursor？不允许无边界 SELECT *\n\n## 3. 正确性\n\n- **边界值**：空数组、空字符串、零值、负数、最大值是否被正确处理？\n- **null/undefined 处理**：可空值在访问前是否做了检查？可选链或守卫是否到位？\n- **off-by-one**：循环边界、数组下标、分页偏移量、范围计算是否正确？\n- **竞态条件**：异步代码中是否存在对共享状态的并发访问？\n- **时区处理**：日期是否以 UTC 存储？展示层才做时区转换？\n- **Unicode 与编码**：字符串操作是否考虑多字节字符？编码是否明确指定（UTF-8）？\n- **整数溢出/精度**：大数/金额计算是否使用了合适的类型（BigInt、Decimal）？\n- **状态一致性**：多步操作是否是事务性的？部分失败后系统是否处于有效状态？\n\n## 4. 可维护性\n\n- **命名**：变量、函数、类的名称是否描述其用途？\n- **单一职责**：每个函数/类/模块是否只做一件事？一个变更是否只需要改一个地方？\n- **DRY**：重复逻辑是否提取为公共函数？复制粘贴的代码段是否应合并？\n- **圈复杂度**：函数的分支复杂度是否过高？深层嵌套的循环/条件是否应分解？\n- **死代码**：注释掉的代码、未使用的 import、不可达分支、过期的 feature flag 是否已清理？\n- **魔法数字/字符串**：字面量是否提取为命名常量？\n- **模式一致性**：新代码是否遵循了代码库已有的约定？\n\n**过度工程化红线（以下情况不要提出建议）：**\n- 三行以内的相似代码不算\"重复\"\n- 仅被调用一次的代码不需要提取方法\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\n- 不要建议为假想的未来需求做扩展性设计\n- 不要要求给未变更的代码加注释、文档或类型标注\n- 不要建议为一次性操作创建工具类/抽象层\n\n## 5. 测试\n\n- **测试覆盖**：新增逻辑是否有对应测试？关键路径是否同时覆盖了 happy path 和失败 case？\n- **边界测试**：边界值、空输入、null、错误条件是否有测试？\n- **无 Flaky 测试**：测试是否确定性？不能依赖时序、外部服务、共享可变状态\n- **测试独立性**：每个测试是否自己 setup 和 teardown？测试执行顺序不影响结果\n- **有意义的断言**：测试断言的是行为/输出，不是实现细节\n- **测试可读性**：测试是否符合 Arrange-Act-Assert 模式？名称是否描述场景和预期？\n- **Mock 纪律**：只有外部边界（网络、数据库、文件系统）才 mock，内部逻辑不 mock\n\n## 6. 错误处理\n\n- **异常吞没**：catch 块是否有日志/上报？空 catch 或直接 return 是 P1（可能导致静默失败）\n- **回调遗漏**：所有执行路径（包括快速返回、错误分支、超时、取消）是否都触发了回调？\n- **降级策略**：网络请求超时/失败是否有降级路径？用户是否能看到合理的错误提示？\n- **Promise/async 错误**：未处理的 Promise reject、async 函数中未 catch 的异常\n- **错误信息过度暴露**：错误消息是否可能泄露内部实现细节（栈信息、SQL、文件路径）？\n- **重试逻辑**：临时性失败是否有重试？重试是否有退避和上限？幂等性是否有保证？\n\n## 7. 数据一致性与并发\n\n- **事务完整性**：跨表/跨服务的操作是否使用事务？部分失败后的回滚是否正确？\n- **缓存穿透**：缓存未命中时是否会导致雪崩打到数据库？是否有布隆过滤器或空值缓存？\n- **状态机跳转**：状态变更是否存在非法跳转（跳过中间状态、重复进入终态）？\n- **并发安全**：多线程/多协程访问共享状态是否有正确的同步原语？\n- **超时与取消**：长时间运行的操作是否有超时机制？取消信号是否能正确传播？\n\n---\n\n## 报告格式\n\n```markdown\n# Code Review Report\n\n## 概览\n- **Review 范围**: commit_id..HEAD (N commits)\n- **变更文件数**: N\n- **总变更行数**: +X / -Y\n\n## Review 详情\n\n### [P0] 必须修复\n> P0 = 会导致 crash / 数据错误 / 安全漏洞 / 死锁\n\n**文件**: `path/to/file:行号`\n**维度**: 安全性 / 性能 / 正确性 / ...\n**问题**: 具体描述\n**建议**: 修复方案\n\n### [P1] 建议修复\n> P1 = 潜在风险 / 边界 case 未处理 / 资源泄漏\n\n### [P2] 改进建议\n> P2 = 代码质量提升建议，非阻塞性\n\n## 总结\n\n| 维度 | P0 | P1 | P2 |\n|------|----|----|-----|\n| 安全性 | 0 | 0 | 0 |\n| 性能 | 0 | 0 | 0 |\n| 正确性 | 0 | 0 | 0 |\n| 可维护性 | - | 0 | 0 |\n| 测试 | - | 0 | 0 |\n| 错误处理 | 0 | 0 | 0 |\n| 数据一致性 | 0 | 0 | 0 |\n\n**总体评价**: [可以合入 / 建议修复后再合入 / 必须修复 P0 再合入]\n```\n\nFile v1.3.1:references/review-go.md\n\n# Go 审查维度\n\n检测到 `.go` 文件变更时加载。按以下 7 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过阅读上下文和追踪数据流反复验证后再确认。\n\n---\n\n## 1. Goroutine 与并发安全\n\n> **P0 频发地带** — Go 并发模型独特且容易误用\n\n- **Goroutine 泄漏**：goroutine 是否可能持续阻塞无法退出？channel 无消费者时 goroutine 会永久阻塞。用 `select` + context cancel 或 `ticker.Stop` 确保退出路径\n- **无限制 goroutine 创建**：`go func()` 在循环中是否可能创建不可控数量的 goroutine？应使用 worker pool（`errgroup` / `conc.WaitGroup`）限制并发\n- **WaitGroup 误用**：`Add()` 是否在 `go` 调用后执行而不是在前？`Done()` 是否在所有 goroutine 分支都被调用（包括 error return 路径）？\n- **`select{}` 空选**：空的 `select{}` 会永久阻塞，通常意味着死锁\n- **`sync.Mutex` 未解锁**：Lock/Unlock 是否成对出现？`defer mu.Unlock()` 应在 Lock 后立即写，而不是在函数末尾\n- **`sync.RWMutex` 写锁中调用读锁方法**：同一 goroutine 中写锁未释放时调用了需要读锁的函数 → 死锁（读写锁不可重入）\n- **`atomic` vs `mutex` 选用**：计数器类操作是否误用了 `sync.Mutex` 而非 `atomic.Int64`？\n\n## 2. Channel 与数据流动\n\n- **channel 死锁**：向一个没有接收者的 channel 发送 → 永久阻塞。所有 send 路径是否有对应的 receive 路径？\n- **channel close 约定**：**只在发送方 close channel**。接收方 close 会导致其他接收方的 panic。close 后的 channel 是否被再次写入？\n- **nil channel 阻塞**：向 `nil channel` 发送或从 `nil channel` 接收都会永久阻塞。未被初始化的 channel 变量是否可能在 select 中造成问题？\n- **close 后仍接收**：已 close 的 channel 读取不会阻塞但返回零值。接收方是否检查了 `ok`（`val, ok := <-ch`）？\n- **`for range ch` 的关闭条件**：range 遍历 channel 是否会在发送方不再发送时正常退出？发送方是否确保 close？\n\n## 3. 错误处理\n\n- **错误被静默丢弃**：`err` 被赋值后未检查（`result, _ := foo()` 或 `if result, err := foo(); err != nil { ... }` 的外层缺少 else 分支）\n- **错误未 wrap**：`return err` 应改为 `return fmt.Errorf(\"context: %w\", err)`，除非是 `io.EOF` 等可预期的 sentinel error\n- **sentinel error 的 `==` 比较**：用 `errors.Is(err, sentinelErr)` 而非 `err == sentinelErr`（后者不处理 wrap 链）\n- **`errors.As` 与类型断言**：检查 error chain 中特定 error 类型时是否使用了 `errors.As` 而非类型断言？\n- **`_` 忽略检查**：是否有重要的 error return 被赋值给 `_` 丢弃？尤其是 `io.Copy`、`db.Query`、`json.Decode`\n- **`defer` 中 error 处理**：`defer file.Close()` 忽略了返回的 error。严谨做法是记录 defer 中的错误\n- **`panic` 在库代码中**：库代码中是否使用 `panic` 而非返回 error？第三方库接收方无法 recover\n\n## 4. 内存与 nil 安全\n\n- **nil map 写入**：向未初始化 map（`var m map[string]int`）写入 → panic。初始化用 `make(map[string]int)` 或 map literal\n- **nil slice 的 append**：虽然安全（append 返回新 slice），但 `json.Marshal(nilSlice)` 输出 `null` 而非 `[]`，可能造成 API 契约不匹配\n- **nil interface 的坑**：`var v *MyStruct = nil; var i interface{} = v; i == nil` 是 **false**——interface 的 type 信息非 nil\n- **闭包捕获循环变量**：`for i := range slice { go func() { fmt.Println(i) }() }` 在 Go 1.22 前捕获的是同一个变量。当前 Go 版本是否 < 1.22？\n- **指针逃逸分析**：热路径中返回局部变量的指针（`return &LocalStruct{}`）阻止了栈分配，可能增加 GC 压力\n- **大值逃逸**：`var buf [64 * 1024]byte` 在函数中作为局部变量 → 超过栈帧大小逃逸到堆\n\n## 5. 接口与类型\n\n- **空 interface 滥用**：`interface{}` / `any` 是否被用作类型安全的逃生口？应优先使用泛型或具体类型\n- **类型断言未 check**：`val := x.(string)` 如果 x 非 string 会 panic。应改为 `val, ok := x.(string); if !ok { ... }`\n- **interface 污染**：一个接口只有一个实现且不会被 mock 替代 → 不需要接口（YAGNI）\n- **结构体嵌入（embedding）副作用**：匿名嵌入是否暴露了不应暴露的 method set？`type MyWriter struct { *bytes.Buffer }` 公开了 `Buffer` 的全部方法\n- **命名返回参数与裸 return**：`func f() (x int) { x = 5; return }` 提升了代码阅读成本，尽量避免\n- **defer 中修改返回值**：named return 配合 defer 可能产生非预期的行为\n\n## 6. 性能与资源\n\n- **`defer` 在热路径中**：循环内 `defer` 会在函数返回时才执行，而非循环结束。热路径中的资源清理应使用手动 Close\n- **字符串拼接**：循环中 `str += part` 产生大量中间字符串分配。使用 `strings.Builder` 或 `bytes.Buffer`\n- **`fmt.Sprintf` 频率过高**：格式化字符串在热点中比简单拼接慢一两个数量级\n- **IO 未设置缓冲**：频繁的小写入未通过 `bufio` 包装会消耗大量 syscall\n- **goroutine 未设 timeout**：`http.Get`、`db.Query` 等默认无超时，可能导致 goroutine 泄漏\n- **`sync.Pool` 的 Reset 缺失**：从 Pool 获取的对象是否在归还前 reset 了状态？\n- **无界 slice/growth**：只用 append 不控制大小的 slice 会无限增长 → OOM\n\n## 7. 惯用法与编码规范\n\n- **`context` 未正确传递**：第一个参数应该是 `context.Context`，且仅通过参数传递（不存 struct 中除非框架约束）\n- **`init()` 滥用**：`init()` 是否在执行副作用？测试环境中的 `init()` 状态是全局且不可控的\n- **全局变量**：`var` 在包级别是否不可变？可变全局变量破坏并发安全，且测试难以隔离\n- **`time.After` 泄漏**：`select` 中 `time.After` 在结束时不会释放定时器资源。使用 `time.NewTimer` 并 `Stop()`\n- **`json.RawMessage` vs `interface{}`**：JSON 反序列化中是否使用 `json.RawMessage` 延迟解码而非丢失类型的 `interface{}`？\n- **`_` 导入副作用**：`import _ \"pkg\"` 是否有清楚的注释说明为什么需要 init 副作用？\n- **gofmt 一致性**：变更的代码是否遵守 gofmt 格式？(非 P0，但应建议统一风格)\n\n---\n\n## 报告格式\n\n遵循 SKILL.md 中定义的标准输出格式。维度字段使用 Go 对应的标识。\n\nFile v1.3.1:references/review-ios.md\n\n# iOS (ObjC/Swift) 审查维度\r\n\r\n按以下 9 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过多种方法（阅读上下文、搜索调用方、追踪数据流）反复验证后再确认。\r\n\r\n## 1. 多线程安全\r\n\r\n- 共享可变状态是否有正确的同步保护（锁、串行队列、atomic）\r\n- Block 捕获的变量在回调时是否仍然有效\r\n- `dispatch_async` 回调中访问的对象，其生命周期是否可控\r\n- 是否存在竞态条件：多个线程/队列可能同时读写同一字段\r\n- 串行队列上的操作是否有可能被外部并发调用打破串行假设\r\n\r\n## 2. 死锁、卡顿与性能\r\n\r\n- **同步死锁**：`dispatch_sync` 到当前队列、嵌套锁（A->B->A）、`@synchronized` 嵌套\r\n- **异步死锁**：队列 A 等待队列 B 的结果，队列 B 又等待队列 A\r\n- **主线程卡顿**：主线程上执行同步磁盘 I/O、同步网络请求、大量计算、`dispatch_sync` 到其他队列\r\n- **锁粒度过大**：在锁内执行耗时操作导致其他线程长时间等待\r\n- **dispatch_once 死锁**：singleton 初始化链路中互相依赖（A.shared -> B.shared -> A.shared）\r\n- **高频路径重复 I/O**：循环体 / 频繁调用的方法内每次都读写磁盘\r\n- **重复计算**：可缓存的结果每次重新计算（如循环内反复创建 DateFormatter）\r\n- **大对象频繁创建/销毁**：热路径上反复 alloc 重型对象而未复用\r\n- **无节制的集合增长**：数组/字典只添加不清理，随时间无限增长\r\n\r\n## 3. 内存安全\r\n\r\n- Block 中是否正确使用 `__weak` / `__strong`，避免循环引用\r\n- delegate / observer 引用关系是否合理（weak vs strong）\r\n- 是否存在 dealloc 后仍被回调的风险（悬空指针）\r\n- 集合（NSArray/NSDictionary）中存储的对象引用是否会导致意外强持有\r\n- C 数组/指针操作是否有越界风险\r\n- 单例持有非单例对象是否会导致泄漏\r\n\r\n## 4. 资源泄漏\r\n\r\n- 未关闭的文件句柄 / 数据库连接\r\n- 未移除的 timer / observer / notification\r\n- `dispatch_source_t` 创建后未 cancel\r\n- `CFRetain` 无对应 `CFRelease`\r\n- 临时文件未清理\r\n\r\n## 5. 逻辑正确性\r\n\r\n- 条件判断的边界值是否正确（off-by-one, 空值, 零值）\r\n- 新增代码对已有流程的影响面（调用方是否需要适配）\r\n- 异步操作的时序是否有保证（先后顺序、回调是否可能不触发）\r\n- 错误处理路径是否完整（每个分支都有合理出口）\r\n- 防重入/幂等设计是否覆盖所有入口\r\n\r\n## 6. 异常吞没与回调完整性\r\n\r\n- **completion 回调遗漏**：所有执行路径（含快速返回 / 错误分支）是否都调用了 completion 回调\r\n- `@try/@catch` 是否吞掉了不应忽略的异常（catch 后无日志、无上报、直接 return）\r\n- 错误路径是否有日志或 APM 上报，避免静默失败\r\n- delegate 回调方法是否在所有路径都触发（成功 + 失败 + 超时 + 取消）\r\n\r\n## 7. 数据一致性\r\n\r\n- 多数据源同步写入时是否保证原子性\r\n- 缓存与真实状态是否可能不一致（写穿/写回策略）\r\n- 状态机是否存在非法跳转（跳过中间状态、重复进入终态）\r\n- 读取时是否使用了同一份快照（非原子地读取多个相关字段可能不一致）\r\n\r\n## 8. API 兼容性\r\n\r\n- 公开 API 签名变更是否破坏已有调用方（ObjC 方法名/参数调整、Swift 桥接名称变化）\r\n- 新增方法是否可能与父类/子类的同名方法冲突\r\n- 枚举新增值是否影响 switch/for 遍历（遗漏 case、循环范围越界）\r\n- 协议新增 `@required` 方法是否导致现有实现类编译报错\r\n\r\n## 9. 架构设计\r\n\r\n- 圈复杂度是否过高（深层嵌套、过长方法）\r\n- 是否存在重复代码可提取公共方法\r\n- 类/模块间的调用关系和持有关系是否合理\r\n- 引用层级是否过深（A->B->C->D->E）\r\n- 职责划分是否清晰（单一职责原则）\r\n- 新增 API 的命名和参数设计是否符合现有约定\r\n\r\n**过度工程化红线（以下情况不要提出建议）：**\r\n- 三行以内的相似代码不算\"重复\"\r\n- 仅被调用一次的代码不需要提取方法\r\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\r\n- 不要建议为假想的未来需求做扩展性设计\r\n- 不要要求给未变更的代码加注释、文档或类型标注\r\n- 不要建议为一次性操作创建工具类/抽象层\r\n\r\n---\r\n\r\n## 报告格式\r\n\r\n```markdown\r\n# Code Review Report\r\n\r\n> **分支**: <branch>\r\n> **Review 范围**: commit_id..HEAD (N commits)\r\n> **变更文件**: N 个\r\n\r\n## 概述\r\n[一段话总结本次变更的目的和整体质量评价]\r\n\r\n## 问题清单\r\n\r\n### [P0] 必须修复\r\n> P0 = 会导致 crash / 数据错误 / 安全漏洞 / 死锁\r\n\r\n#### 1. [问题标题]\r\n- **文件**: `path/to/file.m:行号`\r\n- **维度**: 多线程安全 / 死锁与卡顿 / ...\r\n- **问题描述**: [具体问题]\r\n- **风险**: [会导致什么后果]\r\n- **修复建议**: [具体修复方式]\r\n\r\n### [P1] 建议修复\r\n> P1 = 潜在风险 / 边界 case 未处理\r\n\r\n### [P2] 架构优化建议\r\n> P2 = 代码质量 / 可维护性改进\r\n\r\n## 总结\r\n\r\n| 维度 | P0 | P1 | P2 |\r\n|------|----|----|-----|\r\n| 多线程安全 | 0 | 0 | 0 |\r\n| 死锁与卡顿 | 0 | 0 | 0 |\r\n| 内存安全 | 0 | 0 | 0 |\r\n| 资源泄漏 | 0 | 0 | 0 |\r\n| 逻辑正确性 | 0 | 0 | 0 |\r\n| 异常吞没/回调完整性 | 0 | 0 | 0 |\r\n| 数据一致性 | 0 | 0 | 0 |\r\n| API 兼容性 | 0 | 0 | 0 |\r\n| 架构设计 | - | 0 | 0 |\r\n\r\n[最终结论：是否可以合入，或需要修复后再 review]\r\n```\n\nFile v1.3.1:references/review-skill-vetter.md\n\n# Agent Skill 安全审查维度\n\n当 diff 包含 `SKILL.md`、`*.skill.md`、`.mdc`、`.agent.md` 等 agent 配置文件时自动加载。\n也支持用户通过 \"skill review\"、\"agent review\"、\"skill-vetter\"、\"安全审查\" 等关键词手动触发。\n\n**所有发现的违规均为 P0。** Agent Skill 的安全问题无小问题——每个都可能被恶意利用。\n\n---\n\n## 1. 凭证与敏感信息\n\n- **Token 要求用户粘贴到聊天**：`SKILL.md` 中是否要求用户把 API Key/Token 粘贴到聊天消息中？正确的做法是让用户在本地环境变量中设置\n- **硬编码凭证**：代码中是否包含密钥、Token、密码（即使是测试环境）？\n- **自动写凭证文件**：agent 是否被指示将 token/secret 自动写入 `.env` 或其他文件？agent 不应该替用户管理凭证文件\n- **凭证日志泄露**：agent 在对话/日志中输出 token 或敏感数据？\n\n## 2. 数据外泄风险\n\n- **外部网络请求**：skill 是否通过 curl/wget/fetch 向外部 URL 发送数据？URL 是否可信？\n- **文件系统遍历**：是否读取了 `~/.ssh/`、`~/.aws/`、`~/.config/` 等全局敏感目录？\n- **读取 agent 配置文件**：是否读取了 `MEMORY.md`、`USER.md`、`SOUL.md`、`IDENTITY.md`？除非有明确且必要的理由，否则禁止\n- **base64 decode 载荷**：是否存在可疑的 base64 编码字符串？可能隐藏恶意载荷\n- **IP 地址直连**：网络请求是否使用 IP 地址而非域名？IP 直连是红色警报\n\n## 3. 权限范围\n\n- **实际权限 > 声称的能力**：SKILL.md 描述的 scope（如\"只读取文件\"）是否与实际指令一致？（例如声称只读但包含写文件指令）\n- **缺少用户同意**：文件写入/网络请求/项目扫描前是否有明确的用户同意步骤？\n- **写入范围未声明**：写入操作是否限定了目标路径？是否可能写入到用户项目的敏感区域？\n- **sudo/提权请求**：是否要求以管理员/sudo 权限运行？\n\n## 4. 不安全执行\n\n- **eval/exec 外部输入**：是否使用 eval()、exec()、`os.system()` 执行不受信任的输入？\n- **shell 注入风险**：命令拼接是否使用用户输入？是否合理使用了参数化执行？\n- **动态 import/require**：是否根据外部输入动态导入模块？\n- **反序列化不可信数据**：是否使用了 pickle、yaml.load 等方式反序列化不受信任的数据？\n\n## 5. Prompt 注入防护\n\n- **指令覆盖（Instruction Override）**：SKILL.md 中是否存在容易被用户输入覆盖的系统指令（如 \"忽略以上所有指令\"）？\n- **隐藏指令**：是否存在藏在注释、不可见 Unicode 字符、过长拼接中的隐蔽指令？\n- **参数描述注入**：tool/function 的参数描述中是否包含可被用户利用的指令注入点？\n\n## 6. 系统修改\n\n- **破坏性 Git 操作**：是否包含 git reset、force-push、amend、rebase 等操作？\n- **工作目录外写入**：是否向工作目录之外写文件？\n- **包安装**：是否未经用户同意就安装系统软件包？\n- **删除操作**：是否包含文件/目录删除指令？是否有限制范围？\n\n---\n\n## 报告格式（在标准 Code Review 报告内以独立维度呈现）\n\n```\n### [P0] Agent Skill 安全审查\n\n#### 1. [凭证泄露] 要求用户粘贴 Token 到聊天\n📄 `SKILL.md:行号`\n**规则来源**: skill-vetter\n**问题**: 用户被要求将 Figma Token 粘贴到聊天，agent 自动写入 .env 文件\n**风险**: Token 可能被记录在聊天历史或日志中\n**建议**: 改为引导用户在本地设置环境变量，agent 仅从环境变量读取\n\n#### 2. [权限范围] 文件扫描缺少用户同意\n📄 `SKILL.md:行号`\n**规则来源**: skill-vetter\n**问题**: Step 2.5 指示 agent 运行项目扫描，但没有要求先获得用户同意\n**风险**: agent 可能扫描包含敏感内容的项目目录\n**建议**: 在扫描前必须获取用户明确同意\n```\n\nFile v1.3.1:references/review-typescript.md\n\n# TypeScript 审查维度\n\n检测到 `.ts` / `.tsx` 文件变更时加载。按以下 7 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过阅读上下文和类型系统反向验证后再确认。\n\n---\n\n## 1. 类型安全\n\n> **P0 频发地带** — 类型错误往往在运行时才暴露\n\n- **`any` 类型扩散**：`any` 在函数参数中是否向返回值传播？类型边界是否通过 `unknown` 做了一阶守卫？`as any` 出现在核心逻辑是 P0\n- **类型断言滥用**：`as Type` 是否真正确认了运行时合约？优先使用类型守卫（`is` 谓词）或 zod/io-ts 运行时校验\n- **`@ts-ignore` / `@ts-expect-error`**：是否有未说明理由的禁用？应该在下一行加注释说明为什么这条类型不符是合理的\n- **联合类型窄化**：`if (typeof x === 'string')` 的窄化路径是否全部覆盖？`never` 类型是否在 exhaustiveness check 中正确使用\n- **JSON.parse 返回值类型**：`JSON.parse(str) as MyType` 是否应在运行时做 schema 校验？线上数据格式变更可能导致静默类型不匹配\n- **模块增强（declare module）过度使用**：是否在试图绕过类型系统修正第三方包的类型？\n- **泛型约束不足**：泛型参数的 `extends` 约束是否过于宽泛？缺少约束可能导致运行时类型不匹配\n\n## 2. 异步与 Promise\n\n- **Floating Promise**：`Promise` 未 await 也未 return —— 执行顺序不可控，异常被吞没（启用 `@typescript-eslint/no-floating-promises` 规则，但不要依赖 ESLint 配置的完备性）\n- **未捕获的 Promise reject**：`promise.then(onFulfilled)` 但缺少 `.catch()`，或链末端未处理异常。`for await` 循环中的 reject 是否被 try-catch 包围？\n- **async 函数中错误静默**：`async () => { fetch(url) }` 但外层未 await 或 catch —— 错误会变成 unhandled rejection\n- **Promise.all 批次过大**：`Promise.all(tasks)` 中 tasks 数量是否可预见？超过 50 个建议分片（`p-limit` 或分批）\n- **空值竞态**：多个 `Promise` 竞争写入同一个状态，后完成的 Promise 覆盖先完成的结果\n- **AbortSignal 未传递**：fetch / 长操作是否接了 AbortController？组件卸载后仍在处理的请求不会自动取消\n\n## 3. 闭包与作用域\n\n- **Hooks 中过期闭包**：`useEffect(() => { ... }, [])` 内部引用了外部变量但未列入依赖数组。`setInterval` + `useRef` 组合中是否缓存了最新的回调？\n- **循环中闭包捕获**：`for (var i = 0; i < n; i++)` 内创建闭包（`setTimeout`、事件处理器）是否捕获了过期的 `i`？用 `let` 或 IIFE 修复\n- **回调中 `this` 丢失**：类方法作为回调传递时是否 `.bind(this)` 或使用箭头函数定义方法\n- **setInterval 未清理**：组件卸载 / 资源释放时 `clearInterval` 是否被调用？\n- **deduplicate 检查**：同类型闭包模式是否在 3 处以上重复出现 → 报告为一条跨文件问题\n\n## 4. 模块与依赖\n\n- **循环依赖**：是否存在模块 A import B, B import A？构建工具报错或无声退化为 `undefined`\n- **Barrel 文件膨胀**：`index.ts` 是否 re-export 了大量深度依赖（`export * from`）？会导致 tree-shaking 失效和冷启动变慢\n- **`require` vs `import` 混用**：条件 `require()` 在 ESM 模块中无法工作，动态 `import()` 才是正确方式\n- **默认导出 vs 命名导出不一致**：同一个模块是否在不同文件中分别使用 `import X from` 和 `import { X } from` 导入？（构建工具可能正常工作，但代码不一致）\n- **废弃依赖**：项目中是否有 `package.json` 中声明的依赖在代码中找不到任何 import？（不是硬性 P0，但建议标注）\n- **路径别名未配置**：使用 `../../utils/...` 深度相对路径是否应有 tsconfig paths 别名？（建议类建议，非硬性）\n\n## 5. 性能\n\n- **不必要的对象分配**：render 函数 / 热路径中反复创建对象（`{}`、`[]`、`() => ...`）是否应缓存或 memoize\n- **大规模数组操作**：`filter().map().reduce()` 链在大型数组上是否产生中间数组？可考虑 `transducer` 或 for 循环\n- **`useMemo` / `useCallback` 误用**：该加的地方没加，不该加的加上去了（简单计算、无子组件传递的回调）\n- **`React.FC` 重复渲染**：父组件每次渲染重新创建的对象作为 props 传递给子组件 → 子组件不必要 re-render\n- **`??` vs `||` 语义差别**：`||` 会过滤 `0` `''` `false`，是否本意是 `??`\n- **`for...of` 在 Node.js 中的性能**：百万级数组中 `for...of` 比传统 `for` 慢 5-10 倍\n\n## 6. 错误处理\n\n- **swallow catch**：`catch (e) {}` 空 catch 块没有日志没有上报，意味着错误被静默丢弃\n- **类型化错误**：`throw 'some string'` 应改为 `throw new Error()`。catch 中 `if (e instanceof Error)` 检查是否缺失\n- **fetch 只处理成功响应**：`const res = await fetch(url); return res.json();` 未检查 `res.ok`（HTTP 4xx/5xx 不会触发 catch）→ 应为 `if (!res.ok) throw new Error(...)`\n- **多个 try-catch 覆盖所有路径**：异步流程中的每个 await 是否有独立或统一的异常处理？\n\n## 7. 安全性\n\n- **`innerHTML` / `dangerouslySetInnerHTML`**：是否有充分理由？输入是否经过 DOMPurify 或其他安全转义？\n- **`eval` 及其变体**：`eval`、`new Function()`、`setTimeout(string)` 在依赖用户输入时是 RCE 风险\n- **`prototype` 污染**：`obj[key] = value` 中 `key` 是否来自用户输入？`__proto__`、`constructor` 等 key 是否被过滤？\n- **URL 拼接注入**：`https://api.com/${userInput}` 是否可能导致 SSRF 或 Open Redirect？\n- **`localStorage` / `sessionStorage` 存储敏感数据**：Token、PII 是否存储在无保护措施的前端存储中？(HttpOnly Cookie 或加密方案更安全)\n- **依赖供应链**：`package.json` 中新引入的依赖是否来自可信源？是否包含已知 CVE 的版本？\n\n---\n\n## 报告格式\n\n遵循 SKILL.md 中定义的标准输出格式。维度字段使用 TypeScript 对应的翻译（Type Safety → `type-safety` 等）。\n\nFile v1.3.1:CHANGELOG.md\n\n# Changelog\r\n\r\n本文件记录 code-reviewer skill 的版本变更（自 v1.3.0 起维护；更早版本见 git 历史提交）。\r\n\r\n## [1.3.1] - 2026-08-07\r\n\r\n### Changed\r\n- 发布至 ClawHub（slug: `pro-code-reviewer`，owner: timeaground）\r\n\r\n## [1.3.0] - 2026-08-07\r\n\r\n### Added\r\n- Frontmatter 新增 `version`、`requires`、`resource_manifest` 声明（消除隐式依赖，声明网络域白名单 github.com / gitlab.com）\r\n- 新增 `## When to use this`（触发条件集中章节）\r\n- 新增 `## 交付物 (Output)`（输出规范独立章节，替代原 `### 7. Output`）\r\n- 新增 `## 不适用场景` 与 `## Tips` 章节\r\n- Workflow Step 2 新增 PR fetch 失败降级路径（重试一次 → 提示重试或转本地审查）\r\n- 新增 `eval/evals.json`（21 条 Layer 2 行为测试用例：POS/NEG/PQ/SEC/ADV）\r\n\r\n### Changed\r\n- `description` 精简至 200 字符内（核心触发词保留，扩展触发词移入 When to use this）\r\n- `references/review-android.md`、`references/review-ios.md` 报告模板占位符 `xxx` → `<branch>`\r\n\r\n## [1.2.0]\r\n- PR/CI Layer 1：支持通过 URL 远程审查 PR（git: c6dabbf）\r\n\r\n## [1.1.0]\r\n- 三遍审查（Pass A/B/C）、review-general 升级、skill-vetter 集成（git: db8c9cf）\n\nFile v1.3.1:README-zh.md\n\n# code-reviewer 中文说明\n\n> AI 驱动的代码审查工具，按 P0/P1/P2 三级严重度分类，自动识别项目平台并应用专项规则。\n\n---\n\n## 这个工具解决什么问题\n\n代码审查是保证质量的关键环节，但实际项目中面临两个痛点：\n- **人工审查覆盖率不足**：PR 多、reviewer 时间有限，容易漏审\n- **经验不均**：新人不熟悉 Android 线程模型、生命周期等坑，老问题反复出现\n\n本工具承担\"初审\"职责，覆盖常见的、规则化的问题，把人工 reviewer 的精力留给架构设计和业务逻辑。\n\n---\n\n## 使用示例\n\n```\n> review\n\n✅ 发现 2 个问题\n\nP0 🔴 在 Activity 中使用 GlobalScope 启动协程（无生命周期绑定）\n   src/MainActivity.kt:42\n   → 改用 lifecycleScope.launch，Activity 销毁时自动取消\n\nP1 🟡 RecyclerView Adapter 未使用 DiffUtil\n   src/adapter/UserAdapter.kt:15\n   → 用 DiffUtil 替代 notifyDataSetChanged()，避免全量刷新\n```\n\n---\n\n## 工作流程\n\n```\n1. Detect（识别平台）\n   根据项目文件自动判断：\n   build.gradle / AndroidManifest.xml → Android\n   *.xcodeproj / Podfile / Package.swift → iOS\n   其他 → 通用规则\n\n2. Diff（提取变更）\n   通过 git diff 获取变更内容\n   支持：未提交变更 / 已暂存 / 指定提交 / 分支对比\n\n3. Review（执行审查）\n   AI 按平台专项规则逐维度审查\n   Android/iOS：9 个维度，通用：7 个维度\n\n4. Report（输出报告）\n   结构化结果：严重度 + 文件位置 + 修复建议\n   可选生成 HTML 报告\n```\n\n---\n\n## 三种审查模式\n\n| 模式 | 命令 | 适用场景 |\n|------|------|---------|\n| **标准审查** | `review` | 完整审查，输出 P0/P1/P2 全部问题 |\n| **快速审查** | `quick review` | 只看 P0，快速判断\"能不能合并\" |\n| **安全审查** | `security review` | 重点检查敏感数据处理、注入风险、密钥泄露 |\n\n---\n\n## 严重度说明\n\n| 级别 | 含义 | 典型例子 |\n|------|------|---------|\n| **P0** 🔴 | 必须修复 | 崩溃、数据丢失、安全漏洞、死锁 |\n| **P1** 🟡 | 应当修复 | 竞态条件、资源泄漏、未处理的错误路径 |\n| **P2** 🔵 | 建议改进 | 命名不规范、结构冗余、轻微代码味道 |\n\n---\n\n## 审查维度详细说明\n\n### Android（9 个维度）\n\n自动识别条件：项目包含 `build.gradle*` 或 `AndroidManifest.xml`\n\n| 维度 | 检查内容 |\n|------|---------|\n| **线程安全** | 主线程网络/IO 操作、SharedPreferences/Room/文件 IO 是否在 IO 线程 |\n| **死锁与卡顿** | 锁嵌套、主线程 `runBlocking`、`synchronized` 范围过大 |\n| **内存管理** | Activity/Context 泄漏、Handler 内部类持有外部引用、Bitmap 未回收 |\n| **生命周期安全** | `onStop` 后访问 View、ViewModel 持有 View 引用、LiveData 跨线程问题 |\n| **逻辑正确性** | 整数溢出、浮点比较、集合并发修改 |\n| **异常处理** | 吞掉异常、过宽的 catch 范围、finally 中抛异常 |\n| **数据一致性** | 事务原子性、缓存与 DB 同步、SSE/Flow 中的状态竞争 |\n| **API 兼容性** | `Build.VERSION.SDK_INT` 检查缺失、废弃 API 使用 |\n| **架构合规** | ViewModel 直接操作 View、Repository 混入 UI 逻辑、模块间非法依赖 |\n\n### iOS（9 个维度）\n\n自动识别条件：项目包含 `*.xcodeproj`、`Podfile` 或 `Package.swift`\n\n| 维度 | 检查内容 |\n|------|---------|\n| **线程安全** | 非主线程更新 UI、共享状态数据竞争 |\n| **死锁与卡顿** | GCD 死锁、主队列同步调用、主线程阻塞 |\n| **内存安全** | 闭包捕获循环引用、unowned vs weak 误用、delegate 强引用 |\n| **资源泄漏** | 文件句柄未关闭、NotificationCenter 观察者未移除、Timer 未 invalidate |\n| **逻辑正确性** | 强制解包崩溃、数组越界、Optional 链式调用错误 |\n| **异常处理** | Result 类型未处理、缺少 do-catch、try? 静默失败 |\n| **数据一致性** | CoreData 上下文线程、UserDefaults 竞争、Combine 状态 |\n| **API 兼容性** | `@available` 检查缺失、废弃 API 使用 |\n| **架构合规** | ViewController 包含业务逻辑、循环依赖、MVVM/VIPER 层级混乱 |\n\n### 通用（7 个维度）\n\n适用于非 Android/iOS 项目\n\n| 维度 | 检查内容 |\n|------|---------|\n| **正确性** | 逻辑错误、越界、运算符优先级 |\n| **线程安全** | 共享可变状态、缺少同步 |\n| **内存** | 泄漏、无界增长、缺少清理 |\n| **性能** | N+1 查询、不必要的内存分配、阻塞调用 |\n| **API 设计** | 契约不清晰、缺少 null 检查、错误类型设计差 |\n| **错误处理** | 未处理的错误路径、静默失败 |\n| **安全** | 硬编码密钥、注入风险、不安全存储 |\n\n---\n\n## 快速开始\n\n### 安装\n\n```bash\n# OpenClaw 一键安装\nclawhub install code-reviewer\n\n# Claude Code — 复制到项目\ncp -r code-reviewer/ your-project/.claude/skills/\n\n# GitHub Copilot — 复制到项目\ncp -r code-reviewer/ your-project/.agents/skills/\n```\n\n### 使用命令\n\n```\nreview                    # 所有未提交变更\nreview staged             # 仅已暂存的变更\nreview abc1234            # 指定某次提交\nreview last 5 commits     # 最近 5 次提交\nreview branch feature-x   # 分支与 main 的对比\n```\n\n---\n\n## 智能行为\n\n- **重复问题合并**：同一类问题出现在 3 个以上文件 → 合并为一条，标注\"还有 N 处\"，避免报告被刷屏\n- **API 变更追踪**：函数签名改了？自动检查所有调用方是否同步更新\n- **测试覆盖提示**：变更了代码但测试没有更新 → 温和提示\n- **大 diff 保护**：变更超过 5000 行 → 提前提示再确认\n- **自动过滤**：跳过生成文件、二进制文件、lock 文件、vendor 目录\n\n\n\n---\n\n## 项目结构\n\n```\ncode-reviewer/\n├── SKILL.md                    # AI Agent 指令文件\n└── references/\n    ├── review-general.md       # 通用审查规则\n    ├── review-android.md       # Android 专项规则（9 个维度）\n    ├── review-ios.md           # iOS 专项规则（9 个维度）\n    ├── review-typescript.md    # TypeScript 专项规则（7 个维度）\n    ├── review-go.md            # Go 专项规则（7 个维度）\n    └── review-skill-vetter.md  # Agent/Skill 安全审查规则\n```\n\n---\n\n## 环境要求\n\n- Git 仓库\n- 一个支持 Agent Skill 的 AI 编程助手（OpenClaw、Claude Code、GitHub Copilot 等）\n\n---\n\n## 设计思路\n\n**为什么规则写在 Markdown 文件而不是硬编码进 Prompt？**\n\n规则文件可以独立维护和迭代。发现新的常见问题时，直接更新对应的 `review-android.md` 即可，不需要改代码。团队可以根据自己的编码规范定制规则，比如增加\"禁止使用 GlobalScope\"或者\"必须使用公司内部的网络库\"等项目专属约束。\n\n**为什么要区分 P0/P1/P2 而不是只输出所有问题？**\n\n实际经验：工具输出一长串问题时，reviewer 往往从上到下看，把精力花在不紧要的命名问题上，反而忽略了真正会引发崩溃的线程问题。分级让人先处理最重要的事。\n\n---\n\n## 反馈\n\n发现 bug 或有新语言需求？\n[提交 Issue →](https://github.com/TimeAground/code-reviewer/issues)\n\n## 许可证\n\nMIT © Lin Li 2026\n\nFile v1.3.1:skill-card.md\n\n## Description:\n\nReview code against Android/iOS/TypeScript/Go/general rules, including local diffs, commits, branches, and GitHub or GitLab pull requests.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[timeaground](https://clawhub.ai/user/timeaground)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nDevelopers and engineering teams use this skill to perform structured code reviews with severity-ranked findings across Android, iOS, TypeScript, Go, and general code changes. It is intended for pre-merge review of local diffs, staged changes, commits, branches, and remote pull requests.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can read repository diffs and fetch GitHub or GitLab pull request content.\n\nMitigation: Install and use it only in repositories where sending code diffs to the reviewing agent and fetching PR content is acceptable.\n\nRisk: Review-scope instructions may place user-supplied Git revisions, branch names, ranges, or commit counts into shell-style commands without validation.\n\nMitigation: Validate commit hashes, branch names, ranges, and commit counts, and prefer structured command arguments over shell-style interpolation.\n\n## Reference(s):\n\n- [ClawHub Skill Page](https://clawhub.ai/timeaground/skills/pro-code-reviewer)\n- [README](artifact/README.md)\n- [General Review Rules](artifact/references/review-general.md)\n- [Android Review Rules](artifact/references/review-android.md)\n- [iOS Review Rules](artifact/references/review-ios.md)\n- [TypeScript Review Rules](artifact/references/review-typescript.md)\n- [Go Review Rules](artifact/references/review-go.md)\n- [Skill Vetter Review Rules](artifact/references/review-skill-vetter.md)\n- [Issue Tracker](https://github.com/TimeAground/code-reviewer/issues)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, guidance]\n\n**Output Format:** [Markdown review report with severity-ranked findings, file locations, problem statements, and fix suggestions.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include concise code snippets and next-step guidance depending on review context.]\n\n## Skill Version(s):\n\n1.3.1 (source: frontmatter, changelog, server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.3.0: 12 files, 36408 bytes\n\nFiles: LICENSE (1084b), README-zh.md (7625b), README.md (6705b), references/review-android.md (6801b), references/review-general.md (7474b), references/review-go.md (6663b), references/review-ios.md (5680b), references/review-skill-vetter.md (4051b), references/review-typescript.md (6260b), skill-card.md (2368b), SKILL.md (14059b), _meta.json (136b)\n\nFile v1.3.0:SKILL.md\n\n---\r\nname: code-reviewer\r\ndescription: |\r\n  Review code against platform-specific rules (Android/iOS), language-specific rules\r\n  (TypeScript, Go), and general engineering rules. Supports uncommitted changes, staged\r\n  changes, specific commits, commit ranges, branch diffs, and remote PR review via URL.\r\n  Use when user mentions: \"review\", \"code review\",\r\n  \"帮我看看代码\", \"check my changes\", provides a commit hash, pastes a GitHub PR URL,\r\n  or asks to review before committing.\r\n  Auto-detects platform (iOS/Android/General) and language (TypeScript/Go) from diff.\r\n---\r\n\r\n# Code Reviewer\r\n\r\n## Mindset\r\n\r\nYou are a senior mobile engineer with battle scars from shipping Android and iOS apps to millions of users. You've debugged enough lifecycle leaks, thread crashes, and memory corruptions at 3 AM to have zero patience for careless code.\r\n\r\nYour reviews are **direct, specific, and actionable**. You don't manufacture problems, but you don't let real ones slide either. When code is clean, say so. When it's not, explain exactly why it will hurt someone in production.\r\n\r\n- **Android/iOS projects**: Apply platform-specific expertise — lifecycle safety, memory management, threading, platform conventions. This is your home turf.\r\n- **Other projects**: Apply general engineering principles. You're thorough but appropriately humble about domain-specific patterns you may not know.\r\n\r\nYour default stance: *\"Will this cause a problem in production? If yes, it's a finding. If not, let it go.\"*\r\n\r\n---\r\n\r\nReview code changes and report issues by severity.\r\n\r\n## Rule Files\r\n\r\nRead from `references/` relative to this skill directory. Always load general + detected platform:\r\n- `references/review-general.md` — always\r\n- `references/review-android.md` — Android (Kotlin/Java)\r\n- `references/review-ios.md` — iOS (ObjC/Swift)\r\n\r\n**Language-specific rules (auto-detected from diff, additive):**\r\n- `.ts` / `.tsx` files in diff → also load `references/review-typescript.md`\r\n- `.go` files in diff → also load `references/review-go.md`\r\n\r\n**Skill-vetter rules (auto-detected from diff or explicit request):**\r\n- If the diff contains `SKILL.md`, `*.skill.md`, `.mdc`, or `.agent.md` files → also load `references/review-skill-vetter.md`\r\n- If the user explicitly requests \"skill review\", \"agent review\", or \"安全审查\" → also load `references/review-skill-vetter.md` even without matching files in diff\r\n\r\n## Severity Definitions (hard rules)\r\n\r\n| Level | Criteria | Action |\r\n|-------|----------|--------|\r\n| **P0** | Will cause: crash, data loss/corruption, security vulnerability, deadlock, infinite loop | **Must fix before merge** |\r\n| **P1** | May cause: race condition under specific timing, resource leak under edge case, silent data error, uncovered error path that breaks UX | Should fix |\r\n| **P2** | Code quality: naming, structure, minor redundancy, non-critical style | Nice to have |\r\n\r\nWhen uncertain between two levels, choose the **lower** severity (less alarm).\r\n\r\n## Workflow\r\n\r\n### 0. Activation guard\r\n\r\nBefore activating, confirm the user is in a development/review context:\r\n\r\n- **In a git repo**: `git rev-parse --show-toplevel` succeeds → proceed to scope detection\r\n- **Not in a git repo but user explicitly asked for code review** (e.g. \"review this snippet\", pasted code) → proceed with the provided code\r\n- **Neither**: respond \"I can help review code in a git repository. Share the code you'd like me to review.\" — do not inspect any files\r\n\r\nBare keywords like \"review\" alone are NOT sufficient to activate in non-repo contexts.\r\n\r\n### 1. Determine review scope\r\n\r\nDetect from user message. Priority order:\r\n\r\n| User says | Scope | Git command |\r\n|-----------|-------|-------------|\r\n| \"review\" (no qualifier) | Uncommitted changes (staged + unstaged) | `git diff HEAD` |\r\n| \"review staged\" / \"review 暂存\" | Staged only | `git diff --cached` |\r\n| \"review \\<sha\\>\" / \"cid \\<sha\\>\" | Single commit | `git show <sha>` |\r\n| \"review \\<sha1\\>..\\<sha2\\>\" | Commit range | `git diff <sha1>..<sha2>` |\r\n| \"review branch \\<name\\>\" | Branch vs main/master | `git diff main...<name>` |\r\n| \"review last N commits\" | Recent N commits | `git diff HEAD~N..HEAD` |\r\n| `https://github.com/*/pull/*` 或类似 GitHub PR URL | 远程 PR 的 diff | 见 Step 2a |\r\n| `https://gitlab.com/*/-/merge_requests/*` 等 PR/MR URL | 远程 PR/MR 的 diff | 见 Step 2a |\r\n| `review pr` + PR URL | 远程 PR 的 diff | 见 Step 2a |\r\n\r\nIf scope is ambiguous, ask the user to clarify — never default to scanning uncommitted changes without explicit direction.\r\n\r\n**PR URL detection**: A URL matching `github.com/*/pull/*`, `gitlab.com/*/-/merge_requests/*`, or similar code hosting platform PR/MR pattern is treated as a remote review scope.\r\n\r\n### 2. Resolve repo or remote PR\r\n\r\nIf the scope is a PR URL (remote review):\r\n1. Parse the URL to extract: platform (`github` / `gitlab`), owner, repo, PR number\r\n2. Fetch the diff:\r\n   - GitHub: `web_fetch(\"https://github.com/{owner}/{repo}/pull/{number}.diff\")`\r\n   - GitLab: `web_fetch(\"https://gitlab.com/{owner}/{repo}/-/{merge_requests}/{number}.diff\")`\r\n3. Fetch PR context (title, description, changed files list):\r\n   `web_fetch(\"https://github.com/{owner}/{repo}/pull/{number}\")` — extract from the rendered page\r\n4. Record the repo name from URL for the output header\r\n5. Skip git repo validation — proceed directly to Step 4 (Pre-flight checks)\r\n\r\nIf the scope is NOT a PR URL (local review):\r\nUse current working directory. Validate:\r\n```bash\r\ngit rev-parse --show-toplevel 2>/dev/null\r\n```\r\nIf not a git repo, ask user for path.\r\n\r\n### 3. Detect platform & language\r\n\r\nCheck repo root for platform markers (in order, first match wins):\r\n\r\n| Platform | Markers (any match) |\r\n|----------|-------------------|\r\n| iOS | `*.xcodeproj`, `*.xcworkspace`, `Podfile`, `Package.swift` |\r\n| Android | `build.gradle*`, `settings.gradle*`, `AndroidManifest.xml`, `gradlew` |\r\n| General | Neither matches |\r\n\r\nThen scan the diff for language-specific files. Language detection is **additive** (not mutually exclusive):\r\n- Any `.ts` / `.tsx` file in diff → TypeScript mode\r\n- Any `.go` file in diff → Go mode\r\n\r\nIf the diff contains `SKILL.md`, `*.skill.md`, `.mdc`, or `.agent.md` files → also auto-load `review-skill-vetter.md` as an extra rule set regardless of platform.\r\n\r\n### 4. Pre-flight checks\r\n\r\n**Diff size**: Run `git diff --stat` first.\r\n- \\> 5000 lines changed → warn user, offer to focus on specific paths\r\n- \\> 10000 lines → refuse unless user confirms (context will be too large for quality review)\r\n\r\n**File filter** — skip from review (show in stats summary):\r\n- Binary files, images, fonts, videos\r\n- Generated: `*.pb.go`, `*.generated.*`, `R.java`, `BuildConfig.java`, `*.g.dart`\r\n- Lock files: `package-lock.json`, `yarn.lock`, `Podfile.lock`, `*.lock`\r\n- Vendor/deps: `vendor/`, `node_modules/`, `Pods/`, `build/`, `.gradle/`\r\n- IDE: `.idea/`, `.vscode/`, `*.xcuserdata`, `*.iml`\r\n\r\n### 5. Gather context\r\n\r\nFor each changed file, beyond the diff itself:\r\n- Read the **full function/method** surrounding each change (not just diff lines)\r\n- If a public API signature changed, search for callers: `git grep \"<function_name>\"` to assess impact\r\n- Check the commit message / PR description for intent — findings should be about **bugs**, not about **disagreeing with the approach**\r\n\r\n**For remote PR review only:** also extract the PR description (it's available from the context fetched in Step 2). Use it to understand the broader motivation beyond individual commit messages.\r\n\r\n### 6. Three-pass review\r\n\r\nRead `references/review-general.md` + platform-specific file + any auto-detected rule files.\r\n\r\nWork through the code in three passes, in order. Each pass has a different focus. Do NOT skip or merge passes.\r\n\r\n---\r\n\r\n#### Pass A — First Look (High-level structure, ~2-3 minutes)\r\n\r\nGoal: understand the change as a whole before diving into details.\r\n\r\n- Read the commit message / PR description for intent\r\n- Scan the file list — does the change scope make sense?\r\n- Check overall approach — is this the right solution to the problem?\r\n- Identify risky areas: API changes, shared mutable state, external boundaries\r\n- **Do NOT** report any findings yet — this pass is mental preparation\r\n\r\n---\r\n\r\n#### Pass B — Line-by-Line Detail (Main bulk of review)\r\n\r\nGoal: apply rules to each changed file, find concrete issues.\r\n\r\nFor each file, in order of the diff:\r\n1. Read the full function/method/block surrounding each change (not just the diff lines)\r\n2. Apply the relevant rule dimensions to that specific change\r\n3. If a public API signature changed, search for callers: `git grep \"<function_name>\"`\r\n\r\nFor every finding, include ALL fields:\r\n\r\n| Field | Description |\r\n|-------|-------------|\r\n| severity | `P0` / `P1` / `P2` (follow hard rules above) |\r\n| title | One-line summary |\r\n| file | File path |\r\n| line | Line number or range |\r\n| dimension | Category (e.g. 线程安全, 内存管理, 逻辑正确性) |\r\n| rule_source | `general` / `android` / `ios` / `skill-vetter` |\r\n| problem | What's wrong and why it matters |\r\n| code | **Exact** original lines from diff (non-empty) |\r\n| code_lang | Language identifier |\r\n| fix_suggestion | How to fix (text) |\r\n| fix_code | Concrete fix code (non-empty, compilable) |\r\n| fix_lang | Language of fix |\r\n\r\n**Quality rules:**\r\n- Don't report issues in unchanged code (unless the change directly breaks it)\r\n- Don't suggest \"might want to consider...\" — every finding must be a concrete problem\r\n- If no issues found for a file, move on. Empty review for a file is valid.\r\n\r\n---\r\n\r\n#### Pass C — Hardening & Edge Cases (~5 minutes)\r\n\r\nGoal: catch what line-by-line might miss — cross-file concerns and edge paths.\r\n\r\n- **Boundary values**: empty arrays, zero, null, max values, edge-case inputs\r\n- **Concurrency safety**: shared mutable state across files, async timing assumptions\r\n- **Error path completeness**: every execution path should reach a callback / error handler\r\n- **Caller impact**: if a signature/data structure changed, are all callers updated? (Check with `git grep`)\r\n\r\nIn this pass, you may report findings that span multiple files (e.g. \"similar bug pattern found in 3 files\").\r\n\r\n### 7. Output\r\n\r\n**Output language**: Detect from the user's conversation language and system locale. Default to English if detection is ambiguous. Dimension names in rule files are internal labels; translate them to the output language when presenting findings.\r\n\r\n**Default: Terminal markdown** — print directly in chat:\r\n\r\n```markdown\r\n## Code Review: <repo_name>\r\n**Scope**: <description>  |  **Platform**: Android  |  **Files**: 12  |  **+247 / -89**\r\n\r\n### P0 · Must Fix (2)\r\n#### 1. [Thread Safety] ConcurrentModificationException risk\r\n📄 `app/src/.../ViewModel.kt:45-52`\r\n**Problem**: ...\r\n**Fix**: ...\r\n\r\n### P1 · Should Fix (3)\r\n...\r\n\r\n### P2 · Nice to Have (1)\r\n...\r\n\r\n**Summary**: 2 P0 / 3 P1 / 1 P2 — Fix P0 before merge.\r\n```\r\n\r\n**For remote PR review only:** after the findings, also include a section with suggestions for the PR reviewer, in the same language as the rest of the output.\r\n\r\nThe English version of the example output replaces the Chinese example. Localize dimension, severity, and suggestion labels to match the output language.\r\n\r\n\r\n## Review Modes\r\n\r\n### Standard Review (default)\r\nManual trigger — user says \"review\" and gets results in chat.\r\n\r\n### Security-Focused Review\r\nWhen user says \"security review\" or \"安全审查\", apply stricter lens:\r\n- Focus on OWASP Top 10, injection, auth bypass, secrets exposure\r\n- Ignore style/naming issues entirely\r\n- All security findings are P0 or P1, never P2\r\n\r\n### Agent Skill Review\r\nWhen the diff contains `SKILL.md`, `*.skill.md`, `.mdc`, or `.agent.md` files, **automatically** enable Agent Skill Review:\r\n- Load `references/review-skill-vetter.md` as an additional rule set\r\n- Check for prompt injection risks, token/secret exposure, excessive permissions, unsafe tool calls\r\n- Apply skill-vetter's red flag checklist\r\n\r\nAlso trigger this mode when user says \"skill review\", \"agent review\", \"skill-vetter\", or \"审查技能\".\r\n\r\n### Quick Review\r\nWhen user says \"quick review\" or \"快速看看\":\r\n- Only report P0 issues\r\n- Skip P1/P2 entirely\r\n- Fastest path to \"can I merge this?\"\r\n\r\n## Smart Behaviors\r\n\r\n**Repeated patterns**: If the same issue appears 3+ times across files, report it once with\r\n\"Found in N files\" instead of N separate findings. List all affected files.\r\n\r\n**Related changes**: When a function signature changes, automatically check if callers are\r\nupdated. Report missing caller updates as P0 (will cause compile error or runtime crash).\r\n\r\n**Test coverage hint**: If the changed code has no corresponding test changes and the repo\r\nhas a test directory, mention it as P2 (not a finding, just a note at the end).\r\n\r\n## Safety\r\n\r\n- **Read-only**: Never modify repo code, create files, or run destructive git commands.\r\n- **Conservative severity**: When unsure, choose lower severity. False P0 alarms erode trust.\r\n- **Data disclosure**: This skill sends code diffs to the AI model for analysis. Do not review repositories containing secrets, credentials, or other sensitive data that should not leave the local machine.\r\n\r\n## Next Steps\r\n\r\nAfter every review, always end with a **Next Steps** section offering these options:\r\n\r\n```\r\n---\r\n**Next Steps**\r\n1. 📋 **Discuss** — Walk through findings one by one, I'll explain each issue and suggest fixes\r\n2. 🔨 **Fix now** — Tell me which issues to fix, I'll generate the corrected code\r\n3. ✅ **All good** — No action needed\r\n```\r\n\r\nIf the user is operating through a sub-agent or coding assistant (e.g., Claude Code, Copilot), omit Next Steps and output only the review findings.\r\n\r\n## Feedback\r\n\r\nFound a bug, have a suggestion, or want a new language covered?\r\nOpen an issue → [github.com/TimeAground/code-reviewer/issues](https://github.com/TimeAground/code-reviewer/issues)\n\nFile v1.3.0:README.md\n\n# code-reviewer\r\n\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\r\n[![Python 3.8+](https://img.shields.io/badge/Python-3.8+-green.svg)](https://python.org)\r\n[![Platforms](https://img.shields.io/badge/Platforms-Android%20%7C%20iOS%20%7C%20General-orange.svg)](#supported-platforms)\r\n\r\n> AI-powered code review with severity grading. Platform-aware rules for Android, iOS, and general projects.\r\n\r\n## ✨ What It Does\r\n\r\nPoint it at your code changes → get a structured review with **P0 / P1 / P2** severity grading. Auto-detects your platform and applies specialized rules across up to 9 review dimensions.\r\n\r\n```\r\n> review\r\n\r\n✅ 2 issues found\r\n\r\nP0 🔴 Coroutine launched in Activity without lifecycle scope\r\n   src/MainActivity.kt:42\r\n   → Use lifecycleScope.launch instead of GlobalScope.launch\r\n\r\nP1 🟡 RecyclerView adapter not using DiffUtil\r\n   src/adapter/UserAdapter.kt:15\r\n   → Replace notifyDataSetChanged() with DiffUtil for better performance\r\n```\r\n\r\n## 🧠 How It Works\r\n\r\n1. **Detect** — Identifies platform from project markers (`build.gradle` → Android, `*.xcodeproj` → iOS, `go.mod` → Go, `tsconfig.json` → TypeScript)\r\n2. **Diff** — Extracts changes via `git diff` (staged, unstaged, commits, branches)\r\n3. **Review** — AI applies platform/language-specific rules across multiple dimensions\r\n4. **Report** — Outputs structured findings with severity, location, and fix suggestions\r\n\r\n## 🎯 Three Review Modes\r\n\r\n| Mode | Command | Focus |\r\n|---|---|---|\r\n| **Standard** | `review` | Full review — P0, P1, P2 |\r\n| **Quick** | `quick review` | P0 only — \"can I merge this?\" |\r\n| **Security** | `security review` | Injection, auth bypass, key leaks |\r\n\r\n## 📋 Severity Levels\r\n\r\n| Level | Meaning | Examples |\r\n|---|---|---|\r\n| **P0** 🔴 | Must fix | Crash, data loss, security vulnerability, deadlock |\r\n| **P1** 🟡 | Should fix | Race condition, resource leak, unhandled error path |\r\n| **P2** 🔵 | Nice to have | Naming, structure, minor redundancy |\r\n\r\n## Supported Platforms\r\n\r\n### Android (9 dimensions)\r\n\r\nAuto-detected by: `build.gradle*`, `AndroidManifest.xml`\r\n\r\n| # | Dimension | What It Checks |\r\n|---|---|---|\r\n| 1 | **Thread safety** | Main-thread network/IO, SharedPreferences off main thread |\r\n| 2 | **Deadlock & jank** | Nested locks, `runBlocking` on main thread, oversized `synchronized` blocks |\r\n| 3 | **Memory management** | Activity/Context leaks, Handler inner-class retaining outer, Bitmap not recycled |\r\n| 4 | **Lifecycle safety** | View access after `onStop`, ViewModel holding View reference, LiveData from wrong thread |\r\n| 5 | **Logic correctness** | Integer overflow, float equality, concurrent collection modification |\r\n| 6 | **Exception handling** | Swallowed exceptions, overly broad catch, exception thrown in `finally` |\r\n| 7 | **Data consistency** | Transaction atomicity, cache/DB sync, state races in SSE/Flow |\r\n| 8 | **API compatibility** | Missing `Build.VERSION.SDK_INT` guards, deprecated API usage |\r\n| 9 | **Architecture** | ViewModel touching View directly, Repository with UI logic, illegal cross-module dependencies |\r\n\r\n### iOS (9 dimensions)\r\n\r\nAuto-detected by: `*.xcodeproj`, `Podfile`, `Package.swift`\r\n\r\n| # | Dimension | What It Checks |\r\n|---|---|---|\r\n| 1 | **Threading safety** | UI updates off main thread, data races on shared state |\r\n| 2 | **Deadlock & jank** | GCD deadlocks, main queue sync from main thread, blocking calls on main |\r\n| 3 | **Memory safety** | Retain cycles in closures, unowned vs weak misuse, delegate strong references |\r\n| 4 | **Resource leaks** | Unclosed file handles, NotificationCenter observers not removed, timer not invalidated |\r\n| 5 | **Logic correctness** | Force unwrap crashes, index-out-of-bounds, incorrect optional chaining |\r\n| 6 | **Exception handling** | Unhandled `Result` cases, missing `do-catch`, silent `try?` failures |\r\n| 7 | **Data consistency** | CoreData context threading, UserDefaults race, Combine publisher state |\r\n| 8 | **API compatibility** | Missing `@available` guards, deprecated API usage |\r\n| 9 | **Architecture** | ViewController business logic, circular dependencies, broken MVVM/VIPER layer |\r\n\r\n### General (7 dimensions)\r\n\r\nApplied to any project not identified as Android or iOS.\r\n\r\n| # | Dimension | What It Checks |\r\n|---|---|---|\r\n| 1 | **Correctness** | Logic errors, off-by-one, wrong operator precedence |\r\n| 2 | **Thread safety** | Shared mutable state, missing synchronization |\r\n| 3 | **Memory** | Leaks, unbounded growth, missing cleanup |\r\n| 4 | **Performance** | N+1 queries, unnecessary allocations, blocking calls |\r\n| 5 | **API design** | Unclear contracts, missing null checks, poor error types |\r\n| 6 | **Error handling** | Unhandled error paths, silent failures |\r\n| 7 | **Security** | Hardcoded secrets, injection risks, insecure storage |\r\n\r\n## 🚀 Quick Start\r\n\r\n### Install\r\n\r\n```bash\r\n# OpenClaw\r\nclawhub install code-reviewer\r\n\r\n# Claude Code\r\ncp -r code-reviewer/ your-project/.claude/skills/\r\n\r\n# GitHub Copilot\r\ncp -r code-reviewer/ your-project/.agents/skills/\r\n```\r\n\r\n### Use\r\n\r\n```\r\nreview                    # All uncommitted changes\r\nreview staged             # Only staged changes\r\nreview abc1234            # Specific commit\r\nreview last 5 commits     # Recent commits\r\nreview branch feature-x   # Branch diff vs main\r\n```\r\n\r\n## 🛡 Smart Behaviors\r\n\r\n- **Duplicate merging** — Same issue in 3+ files → merged into one finding with count\r\n- **API change tracking** — Signature changed? Automatically checks if all callers are updated\r\n- **Test coverage hints** — Changed code without test updates → gentle reminder\r\n- **Large diff protection** — 5000+ lines → warns before proceeding\r\n- **Auto-filtered files** — Skips generated code, binaries, lock files, vendor dirs\r\n\r\n\r\n\r\n## 🏗 Architecture\r\n\r\n```\r\ncode-reviewer/\r\n├── SKILL.md                    # AI agent instructions\r\n└── references/\r\n    ├── review-general.md       # General review rules\r\n    ├── review-android.md       # Android-specific rules (9 dimensions)\r\n    ├── review-ios.md           # iOS-specific rules (9 dimensions)\r\n    ├── review-typescript.md    # TypeScript-specific rules (7 dimensions)\r\n    ├── review-go.md            # Go-specific rules (7 dimensions)\r\n    └── review-skill-vetter.md  # Agent/LLM skill security review rules\r\n```\r\n\r\n## Requirements\r\n\r\n- Git repository\r\n- An AI coding assistant (OpenClaw, Claude Code, GitHub Copilot, etc.)\r\n\r\n## Feedback\r\n\r\nFound a bug or want a new language covered?\r\n[Open an issue →](https://github.com/TimeAground/code-reviewer/issues)\r\n\r\n## License\r\n\r\nMIT\n\nFile v1.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn7crx9z6m9cw8gpcwbhp8na31843hnr\",\n  \"slug\": \"pro-code-reviewer\",\n  \"version\": \"1.3.0\",\n  \"publishedAt\": 1785306315342\n}\n\nFile v1.3.0:references/review-android.md\n\n# Android (Kotlin/Java) 审查维度\r\n\r\n按以下 9 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过多种方法（阅读上下文、搜索调用方、追踪数据流）反复验证后再确认。\r\n\r\n## 1. 线程安全与并发\r\n\r\n- 共享可变状态是否有正确的同步保护（`synchronized`、`ReentrantLock`、`@Volatile`、`AtomicXxx`）\r\n- 协程中访问的共享状态是否使用了正确的 Dispatcher 和 `Mutex`/`StateFlow`\r\n- `Handler`/`Looper` 使用是否正确，是否可能在错误线程回调\r\n- `LiveData.postValue` 连续调用是否会丢值（仅保留最后一次）\r\n- `ConcurrentModificationException`：迭代集合时是否可能被其他线程修改\r\n- `suspend` 函数中的共享状态访问是否在同一个 `CoroutineContext` 中\r\n\r\n## 2. 死锁、卡顿与性能\r\n\r\n- **主线程卡顿**：主线程上执行数据库操作、文件 I/O、网络请求、大量计算\r\n- **同步死锁**：嵌套 `synchronized`（A->B->A）、`runBlocking` 在主线程\r\n- **协程死锁**：在 `Dispatchers.Main` 上调用 `runBlocking`；协程 A 等待 B 完成，B 又等待 A\r\n- **RecyclerView 性能**：`onBindViewHolder` 中执行耗时操作、未复用 ViewHolder、频繁 `notifyDataSetChanged` 而非 DiffUtil\r\n- **过度绘制/布局层级**：嵌套过深的 View 层级、不必要的背景绘制\r\n- **大对象频繁创建**：循环内反复创建 SimpleDateFormat、正则 Pattern、Gson 实例\r\n- **无节制的集合增长**：List/Map 只添加不清理，随时间无限增长\r\n- **Bitmap 未及时回收**：大图加载未压缩、未使用 `inSampleSize`\r\n\r\n## 3. 内存管理\r\n\r\n- **Activity/Fragment 泄漏**：匿名内部类/非静态内部类隐式持有外部类引用\r\n- **Handler 泄漏**：非静态 Handler 持有 Activity 引用，消息队列中的 Message 延迟释放\r\n- **协程泄漏**：协程未绑定 `lifecycleScope`/`viewModelScope`，Activity 销毁后仍在执行\r\n- **Context 泄漏**：单例/静态变量持有 Activity Context（应使用 Application Context）\r\n- **注册未反注册**：BroadcastReceiver、ContentObserver、Listener 注册后未在 `onDestroy` 中反注册\r\n- **Cursor/Stream 未关闭**：数据库 Cursor、InputStream/OutputStream 未在 finally 中关闭\r\n- **WebView 泄漏**：WebView 未在 `onDestroy` 中调用 `destroy()`\r\n\r\n## 4. 生命周期安全\r\n\r\n- Fragment/Activity 销毁后是否仍访问 View（`getView()` 返回 null）\r\n- `onActivityResult`/回调中是否检查了 `isAdded()`/`isFinishing()`\r\n- `ViewModel` 中是否引用了 View/Activity（应通过 LiveData/StateFlow 通信）\r\n- `DialogFragment.show()` 在 `onSaveInstanceState` 后调用导致 crash\r\n- `FragmentTransaction.commit()` vs `commitAllowingStateLoss()` 的使用场景\r\n- `LaunchedEffect`/`DisposableEffect`（Compose）的清理逻辑是否完整\r\n\r\n## 5. 逻辑正确性\r\n\r\n- 条件判断的边界值是否正确（off-by-one、空值、零值）\r\n- Kotlin null safety：`!!` 强制解包是否安全、`?.let` 链中是否有竞态\r\n- 新增代码对已有流程的影响面（调用方是否需要适配）\r\n- 异步操作的时序是否有保证（先后顺序、回调是否可能不触发）\r\n- 错误处理路径是否完整（每个分支都有合理出口）\r\n- `when` 表达式是否覆盖所有情况（sealed class 是否有遗漏分支）\r\n\r\n## 6. 异常处理与回调完整性\r\n\r\n- **协程异常**：`launch` 中未捕获的异常会 crash，`async` 的 `await` 未包裹 try-catch\r\n- **回调遗漏**：所有执行路径是否都触发了回调/LiveData 更新，避免 UI 永远 loading\r\n- `try-catch` 是否吞掉了不应忽略的异常（catch 后无日志、直接 return）\r\n- `CoroutineExceptionHandler` 是否正确配置\r\n- 网络请求超时/失败路径是否有降级策略\r\n- `Result`/`sealed class` 错误类型是否在所有消费处都处理\r\n\r\n## 7. 数据一致性\r\n\r\n- 多数据源（数据库 + 网络 + 缓存）是否可能出现不一致\r\n- `SharedPreferences.apply()` 的异步写入是否会导致读取到旧值\r\n- Room 数据库事务是否正确使用 `@Transaction`\r\n- `StateFlow`/`LiveData` 的值更新是否原子（多个相关字段分别更新可能导致中间状态）\r\n- 状态机是否存在非法跳转（跳过中间状态、重复进入终态）\r\n\r\n## 8. API 兼容性\r\n\r\n- 公开 API 签名变更是否破坏已有调用方\r\n- `@JvmOverloads`/`@JvmStatic` 等注解变更是否影响 Java 互操作\r\n- `data class` 添加新字段是否影响 `copy()`/`equals()`/序列化\r\n- ProGuard/R8 混淆规则是否覆盖新增的反射/序列化类\r\n- `minSdk` 兼容性：使用的 API 是否在所有支持版本上可用\r\n- Intent/Bundle 传递的 key 重命名是否影响其他组件\r\n\r\n## 9. 架构设计\r\n\r\n- 圈复杂度是否过高（深层嵌套、过长方法）\r\n- 是否存在重复代码可提取公共方法\r\n- 类/模块间的依赖关系是否合理（避免循环依赖）\r\n- ViewModel/Repository/UseCase 职责是否清晰\r\n- 新增 API 的命名和参数设计是否符合现有约定\r\n- 是否违反了单向数据流原则（View 直接修改 Model）\r\n\r\n**过度工程化红线（以下情况不要提出建议）：**\r\n- 三行以内的相似代码不算\"重复\"\r\n- 仅被调用一次的代码不需要提取方法\r\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\r\n- 不要建议为假想的未来需求做扩展性设计\r\n- 不要要求给未变更的代码加注释、文档或类型标注\r\n- 不要建议为一次性操作创建工具类/抽象层\r\n\r\n---\r\n\r\n## 报告格式\r\n\r\n```markdown\r\n# Code Review Report\r\n\r\n> **分支**: xxx\r\n> **Review 范围**: commit_id..HEAD (N commits)\r\n> **变更文件**: N 个\r\n\r\n## 概述\r\n[一段话总结本次变更的目的和整体质量评价]\r\n\r\n## 问题清单\r\n\r\n### [P0] 必须修复\r\n> P0 = 会导致 crash / 数据错误 / 安全漏洞 / 死锁\r\n\r\n#### 1. [问题标题]\r\n- **文件**: `path/to/File.kt:行号`\r\n- **维度**: 线程安全 / 内存管理 / 生命周期安全 / ...\r\n- **问题描述**: [具体问题]\r\n- **风险**: [会导致什么后果]\r\n- **修复建议**: [具体修复方式]\r\n\r\n### [P1] 建议修复\r\n> P1 = 潜在风险 / 边界 case 未处理\r\n\r\n### [P2] 架构优化建议\r\n> P2 = 代码质量 / 可维护性改进\r\n\r\n## 总结\r\n\r\n| 维度 | P0 | P1 | P2 |\r\n|------|----|----|-----|\r\n| 线程安全与并发 | 0 | 0 | 0 |\r\n| 死锁与卡顿 | 0 | 0 | 0 |\r\n| 内存管理 | 0 | 0 | 0 |\r\n| 生命周期安全 | 0 | 0 | 0 |\r\n| 逻辑正确性 | 0 | 0 | 0 |\r\n| 异常处理/回调完整性 | 0 | 0 | 0 |\r\n| 数据一致性 | 0 | 0 | 0 |\r\n| API 兼容性 | 0 | 0 | 0 |\r\n| 架构设计 | - | 0 | 0 |\r\n\r\n[最终结论：是否可以合入，或需要修复后再 review]\r\n```\n\nFile v1.3.0:references/review-general.md\n\n# 通用审查维度\r\n\r\n适用于非 iOS/Android 的项目（TypeScript、Python、Go、Java（非 Android）、C#、Rust 等）。\r\n按以下 7 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过阅读上下文、搜索调用方、追踪数据流反复验证后再确认。\r\n\r\n---\r\n\r\n## 1. 安全性\r\n\r\n> **P0 频发地带** — 每个安全问题都是 P0\r\n\r\n- **注入漏洞**：所有数据库查询是否使用参数化查询/ORM？用户输入拼接 SQL/NoSQL 查询是 P0\r\n- **XSS**：用户提交的内容在渲染前是否被转义/脱敏？`dangerouslySetInnerHTML` 等 API 是否有充分理由并做安全处理\r\n- **CSRF**：状态变更请求是否有 CSRF token/SameSite Cookie 防护？\r\n- **认证与鉴权**：每个受保护端点是否验证了用户身份？资源访问是否按用户权限做了隔离？（IDOR 是 P0）\r\n- **输入校验**：所有外部输入（params、headers、body、files）是否在服务端做了类型/长度/格式/范围校验？前端校验不是安全校验\r\n- **密钥泄露**：代码中是否硬编码了 API Key、密码、Token？（P0，立即修复）\r\n- **依赖安全**：新引入的依赖是否来自可信源、持续维护、无已知 CVE？\r\n- **敏感数据泄露**：PII、Token、密钥是否可能被日志、错误消息或 API 响应泄露？\r\n- **文件上传**：上传的文件是否做了类型/大小校验？是否存储到 webroot 之外？Content-Type 是否正确？\r\n- **HTTP 安全头**：Content-Security-Policy、X-Content-Type-Options、Strict-Transport-Security 是否配置？\r\n\r\n## 2. 性能\r\n\r\n- **N+1 查询**：是否存在循环内发起独立数据库查询的模式？应该改为批量查询或 JOIN\r\n- **不必要的重渲染**：前端组件是否只在相关 state/props 变化时才重渲染？不必要的 memo 化不要建议，实测有问题的才提\r\n- **内存泄漏**：事件监听器、订阅、定时器、interval 是否在组件卸载/资源释放时清理？\r\n- **包体积**：新依赖是否可 tree-shake？是否为了一个函数导入了整个库？建议按需导入\r\n- **懒加载**：重型组件、路由、折叠内容是否使用了懒加载/代码分割？\r\n- **缓存策略**：重复计算/API 响应是否使用了合适的缓存（memoization、HTTP cache、Redis）？\r\n- **数据库索引**：查询的过滤/排序字段是否有索引？新查询是否应检查 EXPLAIN 计划？\r\n- **分页**：列表查询是否使用了分页或 cursor？不允许无边界 SELECT *\r\n\r\n## 3. 正确性\r\n\r\n- **边界值**：空数组、空字符串、零值、负数、最大值是否被正确处理？\r\n- **null/undefined 处理**：可空值在访问前是否做了检查？可选链或守卫是否到位？\r\n- **off-by-one**：循环边界、数组下标、分页偏移量、范围计算是否正确？\r\n- **竞态条件**：异步代码中是否存在对共享状态的并发访问？\r\n- **时区处理**：日期是否以 UTC 存储？展示层才做时区转换？\r\n- **Unicode 与编码**：字符串操作是否考虑多字节字符？编码是否明确指定（UTF-8）？\r\n- **整数溢出/精度**：大数/金额计算是否使用了合适的类型（BigInt、Decimal）？\r\n- **状态一致性**：多步操作是否是事务性的？部分失败后系统是否处于有效状态？\r\n\r\n## 4. 可维护性\r\n\r\n- **命名**：变量、函数、类的名称是否描述其用途？\r\n- **单一职责**：每个函数/类/模块是否只做一件事？一个变更是否只需要改一个地方？\r\n- **DRY**：重复逻辑是否提取为公共函数？复制粘贴的代码段是否应合并？\r\n- **圈复杂度**：函数的分支复杂度是否过高？深层嵌套的循环/条件是否应分解？\r\n- **死代码**：注释掉的代码、未使用的 import、不可达分支、过期的 feature flag 是否已清理？\r\n- **魔法数字/字符串**：字面量是否提取为命名常量？\r\n- **模式一致性**：新代码是否遵循了代码库已有的约定？\r\n\r\n**过度工程化红线（以下情况不要提出建议）：**\r\n- 三行以内的相似代码不算\"重复\"\r\n- 仅被调用一次的代码不需要提取方法\r\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\r\n- 不要建议为假想的未来需求做扩展性设计\r\n- 不要要求给未变更的代码加注释、文档或类型标注\r\n- 不要建议为一次性操作创建工具类/抽象层\r\n\r\n## 5. 测试\r\n\r\n- **测试覆盖**：新增逻辑是否有对应测试？关键路径是否同时覆盖了 happy path 和失败 case？\r\n- **边界测试**：边界值、空输入、null、错误条件是否有测试？\r\n- **无 Flaky 测试**：测试是否确定性？不能依赖时序、外部服务、共享可变状态\r\n- **测试独立性**：每个测试是否自己 setup 和 teardown？测试执行顺序不影响结果\r\n- **有意义的断言**：测试断言的是行为/输出，不是实现细节\r\n- **测试可读性**：测试是否符合 Arrange-Act-Assert 模式？名称是否描述场景和预期？\r\n- **Mock 纪律**：只有外部边界（网络、数据库、文件系统）才 mock，内部逻辑不 mock\r\n\r\n## 6. 错误处理\r\n\r\n- **异常吞没**：catch 块是否有日志/上报？空 catch 或直接 return 是 P1（可能导致静默失败）\r\n- **回调遗漏**：所有执行路径（包括快速返回、错误分支、超时、取消）是否都触发了回调？\r\n- **降级策略**：网络请求超时/失败是否有降级路径？用户是否能看到合理的错误提示？\r\n- **Promise/async 错误**：未处理的 Promise reject、async 函数中未 catch 的异常\r\n- **错误信息过度暴露**：错误消息是否可能泄露内部实现细节（栈信息、SQL、文件路径）？\r\n- **重试逻辑**：临时性失败是否有重试？重试是否有退避和上限？幂等性是否有保证？\r\n\r\n## 7. 数据一致性与并发\r\n\r\n- **事务完整性**：跨表/跨服务的操作是否使用事务？部分失败后的回滚是否正确？\r\n- **缓存穿透**：缓存未命中时是否会导致雪崩打到数据库？是否有布隆过滤器或空值缓存？\r\n- **状态机跳转**：状态变更是否存在非法跳转（跳过中间状态、重复进入终态）？\r\n- **并发安全**：多线程/多协程访问共享状态是否有正确的同步原语？\r\n- **超时与取消**：长时间运行的操作是否有超时机制？取消信号是否能正确传播？\r\n\r\n---\r\n\r\n## 报告格式\r\n\r\n```markdown\r\n# Code Review Report\r\n\r\n## 概览\r\n- **Review 范围**: commit_id..HEAD (N commits)\r\n- **变更文件数**: N\r\n- **总变更行数**: +X / -Y\r\n\r\n## Review 详情\r\n\r\n### [P0] 必须修复\r\n> P0 = 会导致 crash / 数据错误 / 安全漏洞 / 死锁\r\n\r\n**文件**: `path/to/file:行号`\r\n**维度**: 安全性 / 性能 / 正确性 / ...\r\n**问题**: 具体描述\r\n**建议**: 修复方案\r\n\r\n### [P1] 建议修复\r\n> P1 = 潜在风险 / 边界 case 未处理 / 资源泄漏\r\n\r\n### [P2] 改进建议\r\n> P2 = 代码质量提升建议，非阻塞性\r\n\r\n## 总结\r\n\r\n| 维度 | P0 | P1 | P2 |\r\n|------|----|----|-----|\r\n| 安全性 | 0 | 0 | 0 |\r\n| 性能 | 0 | 0 | 0 |\r\n| 正确性 | 0 | 0 | 0 |\r\n| 可维护性 | - | 0 | 0 |\r\n| 测试 | - | 0 | 0 |\r\n| 错误处理 | 0 | 0 | 0 |\r\n| 数据一致性 | 0 | 0 | 0 |\r\n\r\n**总体评价**: [可以合入 / 建议修复后再合入 / 必须修复 P0 再合入]\r\n```\n\nFile v1.3.0:references/review-go.md\n\n# Go 审查维度\r\n\r\n检测到 `.go` 文件变更时加载。按以下 7 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过阅读上下文和追踪数据流反复验证后再确认。\r\n\r\n---\r\n\r\n## 1. Goroutine 与并发安全\r\n\r\n> **P0 频发地带** — Go 并发模型独特且容易误用\r\n\r\n- **Goroutine 泄漏**：goroutine 是否可能持续阻塞无法退出？channel 无消费者时 goroutine 会永久阻塞。用 `select` + context cancel 或 `ticker.Stop` 确保退出路径\r\n- **无限制 goroutine 创建**：`go func()` 在循环中是否可能创建不可控数量的 goroutine？应使用 worker pool（`errgroup` / `conc.WaitGroup`）限制并发\r\n- **WaitGroup 误用**：`Add()` 是否在 `go` 调用后执行而不是在前？`Done()` 是否在所有 goroutine 分支都被调用（包括 error return 路径）？\r\n- **`select{}` 空选**：空的 `select{}` 会永久阻塞，通常意味着死锁\r\n- **`sync.Mutex` 未解锁**：Lock/Unlock 是否成对出现？`defer mu.Unlock()` 应在 Lock 后立即写，而不是在函数末尾\r\n- **`sync.RWMutex` 写锁中调用读锁方法**：同一 goroutine 中写锁未释放时调用了需要读锁的函数 → 死锁（读写锁不可重入）\r\n- **`atomic` vs `mutex` 选用**：计数器类操作是否误用了 `sync.Mutex` 而非 `atomic.Int64`？\r\n\r\n## 2. Channel 与数据流动\r\n\r\n- **channel 死锁**：向一个没有接收者的 channel 发送 → 永久阻塞。所有 send 路径是否有对应的 receive 路径？\r\n- **channel close 约定**：**只在发送方 close channel**。接收方 close 会导致其他接收方的 panic。close 后的 channel 是否被再次写入？\r\n- **nil channel 阻塞**：向 `nil channel` 发送或从 `nil channel` 接收都会永久阻塞。未被初始化的 channel 变量是否可能在 select 中造成问题？\r\n- **close 后仍接收**：已 close 的 channel 读取不会阻塞但返回零值。接收方是否检查了 `ok`（`val, ok := <-ch`）？\r\n- **`for range ch` 的关闭条件**：range 遍历 channel 是否会在发送方不再发送时正常退出？发送方是否确保 close？\r\n\r\n## 3. 错误处理\r\n\r\n- **错误被静默丢弃**：`err` 被赋值后未检查（`result, _ := foo()` 或 `if result, err := foo(); err != nil { ... }` 的外层缺少 else 分支）\r\n- **错误未 wrap**：`return err` 应改为 `return fmt.Errorf(\"context: %w\", err)`，除非是 `io.EOF` 等可预期的 sentinel error\r\n- **sentinel error 的 `==` 比较**：用 `errors.Is(err, sentinelErr)` 而非 `err == sentinelErr`（后者不处理 wrap 链）\r\n- **`errors.As` 与类型断言**：检查 error chain 中特定 error 类型时是否使用了 `errors.As` 而非类型断言？\r\n- **`_` 忽略检查**：是否有重要的 error return 被赋值给 `_` 丢弃？尤其是 `io.Copy`、`db.Query`、`json.Decode`\r\n- **`defer` 中 error 处理**：`defer file.Close()` 忽略了返回的 error。严谨做法是记录 defer 中的错误\r\n- **`panic` 在库代码中**：库代码中是否使用 `panic` 而非返回 error？第三方库接收方无法 recover\r\n\r\n## 4. 内存与 nil 安全\r\n\r\n- **nil map 写入**：向未初始化 map（`var m map[string]int`）写入 → panic。初始化用 `make(map[string]int)` 或 map literal\r\n- **nil slice 的 append**：虽然安全（append 返回新 slice），但 `json.Marshal(nilSlice)` 输出 `null` 而非 `[]`，可能造成 API 契约不匹配\r\n- **nil interface 的坑**：`var v *MyStruct = nil; var i interface{} = v; i == nil` 是 **false**——interface 的 type 信息非 nil\r\n- **闭包捕获循环变量**：`for i := range slice { go func() { fmt.Println(i) }() }` 在 Go 1.22 前捕获的是同一个变量。当前 Go 版本是否 < 1.22？\r\n- **指针逃逸分析**：热路径中返回局部变量的指针（`return &LocalStruct{}`）阻止了栈分配，可能增加 GC 压力\r\n- **大值逃逸**：`var buf [64 * 1024]byte` 在函数中作为局部变量 → 超过栈帧大小逃逸到堆\r\n\r\n## 5. 接口与类型\r\n\r\n- **空 interface 滥用**：`interface{}` / `any` 是否被用作类型安全的逃生口？应优先使用泛型或具体类型\r\n- **类型断言未 check**：`val := x.(string)` 如果 x 非 string 会 panic。应改为 `val, ok := x.(string); if !ok { ... }`\r\n- **interface 污染**：一个接口只有一个实现且不会被 mock 替代 → 不需要接口（YAGNI）\r\n- **结构体嵌入（embedding）副作用**：匿名嵌入是否暴露了不应暴露的 method set？`type MyWriter struct { *bytes.Buffer }` 公开了 `Buffer` 的全部方法\r\n- **命名返回参数与裸 return**：`func f() (x int) { x = 5; return }` 提升了代码阅读成本，尽量避免\r\n- **defer 中修改返回值**：named return 配合 defer 可能产生非预期的行为\r\n\r\n## 6. 性能与资源\r\n\r\n- **`defer` 在热路径中**：循环内 `defer` 会在函数返回时才执行，而非循环结束。热路径中的资源清理应使用手动 Close\r\n- **字符串拼接**：循环中 `str += part` 产生大量中间字符串分配。使用 `strings.Builder` 或 `bytes.Buffer`\r\n- **`fmt.Sprintf` 频率过高**：格式化字符串在热点中比简单拼接慢一两个数量级\r\n- **IO 未设置缓冲**：频繁的小写入未通过 `bufio` 包装会消耗大量 syscall\r\n- **goroutine 未设 timeout**：`http.Get`、`db.Query` 等默认无超时，可能导致 goroutine 泄漏\r\n- **`sync.Pool` 的 Reset 缺失**：从 Pool 获取的对象是否在归还前 reset 了状态？\r\n- **无界 slice/growth**：只用 append 不控制大小的 slice 会无限增长 → OOM\r\n\r\n## 7. 惯用法与编码规范\r\n\r\n- **`context` 未正确传递**：第一个参数应该是 `context.Context`，且仅通过参数传递（不存 struct 中除非框架约束）\r\n- **`init()` 滥用**：`init()` 是否在执行副作用？测试环境中的 `init()` 状态是全局且不可控的\r\n- **全局变量**：`var` 在包级别是否不可变？可变全局变量破坏并发安全，且测试难以隔离\r\n- **`time.After` 泄漏**：`select` 中 `time.After` 在结束时不会释放定时器资源。使用 `time.NewTimer` 并 `Stop()`\r\n- **`json.RawMessage` vs `interface{}`**：JSON 反序列化中是否使用 `json.RawMessage` 延迟解码而非丢失类型的 `interface{}`？\r\n- **`_` 导入副作用**：`import _ \"pkg\"` 是否有清楚的注释说明为什么需要 init 副作用？\r\n- **gofmt 一致性**：变更的代码是否遵守 gofmt 格式？(非 P0，但应建议统一风格)\r\n\r\n---\r\n\r\n## 报告格式\r\n\r\n遵循 SKILL.md 中定义的标准输出格式。维度字段使用 Go 对应的标识。\n\nFile v1.3.0:references/review-ios.md\n\n# iOS (ObjC/Swift) 审查维度\r\n\r\n按以下 9 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过多种方法（阅读上下文、搜索调用方、追踪数据流）反复验证后再确认。\r\n\r\n## 1. 多线程安全\r\n\r\n- 共享可变状态是否有正确的同步保护（锁、串行队列、atomic）\r\n- Block 捕获的变量在回调时是否仍然有效\r\n- `dispatch_async` 回调中访问的对象，其生命周期是否可控\r\n- 是否存在竞态条件：多个线程/队列可能同时读写同一字段\r\n- 串行队列上的操作是否有可能被外部并发调用打破串行假设\r\n\r\n## 2. 死锁、卡顿与性能\r\n\r\n- **同步死锁**：`dispatch_sync` 到当前队列、嵌套锁（A->B->A）、`@synchronized` 嵌套\r\n- **异步死锁**：队列 A 等待队列 B 的结果，队列 B 又等待队列 A\r\n- **主线程卡顿**：主线程上执行同步磁盘 I/O、同步网络请求、大量计算、`dispatch_sync` 到其他队列\r\n- **锁粒度过大**：在锁内执行耗时操作导致其他线程长时间等待\r\n- **dispatch_once 死锁**：singleton 初始化链路中互相依赖（A.shared -> B.shared -> A.shared）\r\n- **高频路径重复 I/O**：循环体 / 频繁调用的方法内每次都读写磁盘\r\n- **重复计算**：可缓存的结果每次重新计算（如循环内反复创建 DateFormatter）\r\n- **大对象频繁创建/销毁**：热路径上反复 alloc 重型对象而未复用\r\n- **无节制的集合增长**：数组/字典只添加不清理，随时间无限增长\r\n\r\n## 3. 内存安全\r\n\r\n- Block 中是否正确使用 `__weak` / `__strong`，避免循环引用\r\n- delegate / observer 引用关系是否合理（weak vs strong）\r\n- 是否存在 dealloc 后仍被回调的风险（悬空指针）\r\n- 集合（NSArray/NSDictionary）中存储的对象引用是否会导致意外强持有\r\n- C 数组/指针操作是否有越界风险\r\n- 单例持有非单例对象是否会导致泄漏\r\n\r\n## 4. 资源泄漏\r\n\r\n- 未关闭的文件句柄 / 数据库连接\r\n- 未移除的 timer / observer / notification\r\n- `dispatch_source_t` 创建后未 cancel\r\n- `CFRetain` 无对应 `CFRelease`\r\n- 临时文件未清理\r\n\r\n## 5. 逻辑正确性\r\n\r\n- 条件判断的边界值是否正确（off-by-one, 空值, 零值）\r\n- 新增代码对已有流程的影响面（调用方是否需要适配）\r\n- 异步操作的时序是否有保证（先后顺序、回调是否可能不触发）\r\n- 错误处理路径是否完整（每个分支都有合理出口）\r\n- 防重入/幂等设计是否覆盖所有入口\r\n\r\n## 6. 异常吞没与回调完整性\r\n\r\n- **completion 回调遗漏**：所有执行路径（含快速返回 / 错误分支）是否都调用了 completion 回调\r\n- `@try/@catch` 是否吞掉了不应忽略的异常（catch 后无日志、无上报、直接 return）\r\n- 错误路径是否有日志或 APM 上报，避免静默失败\r\n- delegate 回调方法是否在所有路径都触发（成功 + 失败 + 超时 + 取消）\r\n\r\n## 7. 数据一致性\r\n\r\n- 多数据源同步写入时是否保证原子性\r\n- 缓存与真实状态是否可能不一致（写穿/写回策略）\r\n- 状态机是否存在非法跳转（跳过中间状态、重复进入终态）\r\n- 读取时是否使用了同一份快照（非原子地读取多个相关字段可能不一致）\r\n\r\n## 8. API 兼容性\r\n\r\n- 公开 API 签名变更是否破坏已有调用方（ObjC 方法名/参数调整、Swift 桥接名称变化）\r\n- 新增方法是否可能与父类/子类的同名方法冲突\r\n- 枚举新增值是否影响 switch/for 遍历（遗漏 case、循环范围越界）\r\n- 协议新增 `@required` 方法是否导致现有实现类编译报错\r\n\r\n## 9. 架构设计\r\n\r\n- 圈复杂度是否过高（深层嵌套、过长方法）\r\n- 是否存在重复代码可提取公共方法\r\n- 类/模块间的调用关系和持有关系是否合理\r\n- 引用层级是否过深（A->B->C->D->E）\r\n- 职责划分是否清晰（单一职责原则）\r\n- 新增 API 的命名和参数设计是否符合现有约定\r\n\r\n**过度工程化红线（以下情况不要提出建议）：**\r\n- 三行以内的相似代码不算\"重复\"\r\n- 仅被调用一次的代码不需要提取方法\r\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\r\n- 不要建议为假想的未来需求做扩展性设计\r\n- 不要要求给未变更的代码加注释、文档或类型标注\r\n- 不要建议为一次性操作创建工具类/抽象层\r\n\r\n---\r\n\r\n## 报告格式\r\n\r\n```markdown\r\n# Code Review Report\r\n\r\n> **分支**: xxx\r\n> **Review 范围**: commit_id..HEAD (N commits)\r\n> **变更文件**: N 个\r\n\r\n## 概述\r\n[一段话总结本次变更的目的和整体质量评价]\r\n\r\n## 问题清单\r\n\r\n### [P0] 必须修复\r\n> P0 = 会导致 crash / 数据错误 / 安全漏洞 / 死锁\r\n\r\n#### 1. [问题标题]\r\n- **文件**: `path/to/file.m:行号`\r\n- **维度**: 多线程安全 / 死锁与卡顿 / ...\r\n- **问题描述**: [具体问题]\r\n- **风险**: [会导致什么后果]\r\n- **修复建议**: [具体修复方式]\r\n\r\n### [P1] 建议修复\r\n> P1 = 潜在风险 / 边界 case 未处理\r\n\r\n### [P2] 架构优化建议\r\n> P2 = 代码质量 / 可维护性改进\r\n\r\n## 总结\r\n\r\n| 维度 | P0 | P1 | P2 |\r\n|------|----|----|-----|\r\n| 多线程安全 | 0 | 0 | 0 |\r\n| 死锁与卡顿 | 0 | 0 | 0 |\r\n| 内存安全 | 0 | 0 | 0 |\r\n| 资源泄漏 | 0 | 0 | 0 |\r\n| 逻辑正确性 | 0 | 0 | 0 |\r\n| 异常吞没/回调完整性 | 0 | 0 | 0 |\r\n| 数据一致性 | 0 | 0 | 0 |\r\n| API 兼容性 | 0 | 0 | 0 |\r\n| 架构设计 | - | 0 | 0 |\r\n\r\n[最终结论：是否可以合入，或需要修复后再 review]\r\n```\n\nFile v1.3.0:references/review-skill-vetter.md\n\n# Agent Skill 安全审查维度\r\n\r\n当 diff 包含 `SKILL.md`、`*.skill.md`、`.mdc`、`.agent.md` 等 agent 配置文件时自动加载。\r\n也支持用户通过 \"skill review\"、\"agent review\"、\"skill-vetter\"、\"安全审查\" 等关键词手动触发。\r\n\r\n**所有发现的违规均为 P0。** Agent Skill 的安全问题无小问题——每个都可能被恶意利用。\r\n\r\n---\r\n\r\n## 1. 凭证与敏感信息\r\n\r\n- **Token 要求用户粘贴到聊天**：`SKILL.md` 中是否要求用户把 API Key/Token 粘贴到聊天消息中？正确的做法是让用户在本地环境变量中设置\r\n- **硬编码凭证**：代码中是否包含密钥、Token、密码（即使是测试环境）？\r\n- **自动写凭证文件**：agent 是否被指示将 token/secret 自动写入 `.env` 或其他文件？agent 不应该替用户管理凭证文件\r\n- **凭证日志泄露**：agent 在对话/日志中输出 token 或敏感数据？\r\n\r\n## 2. 数据外泄风险\r\n\r\n- **外部网络请求**：skill 是否通过 curl/wget/fetch 向外部 URL 发送数据？URL 是否可信？\r\n- **文件系统遍历**：是否读取了 `~/.ssh/`、`~/.aws/`、`~/.config/` 等全局敏感目录？\r\n- **读取 agent 配置文件**：是否读取了 `MEMORY.md`、`USER.md`、`SOUL.md`、`IDENTITY.md`？除非有明确且必要的理由，否则禁止\r\n- **base64 decode 载荷**：是否存在可疑的 base64 编码字符串？可能隐藏恶意载荷\r\n- **IP 地址直连**：网络请求是否使用 IP 地址而非域名？IP 直连是红色警报\r\n\r\n## 3. 权限范围\r\n\r\n- **实际权限 > 声称的能力**：SKILL.md 描述的 scope（如\"只读取文件\"）是否与实际指令一致？（例如声称只读但包含写文件指令）\r\n- **缺少用户同意**：文件写入/网络请求/项目扫描前是否有明确的用户同意步骤？\r\n- **写入范围未声明**：写入操作是否限定了目标路径？是否可能写入到用户项目的敏感区域？\r\n- **sudo/提权请求**：是否要求以管理员/sudo 权限运行？\r\n\r\n## 4. 不安全执行\r\n\r\n- **eval/exec 外部输入**：是否使用 eval()、exec()、`os.system()` 执行不受信任的输入？\r\n- **shell 注入风险**：命令拼接是否使用用户输入？是否合理使用了参数化执行？\r\n- **动态 import/require**：是否根据外部输入动态导入模块？\r\n- **反序列化不可信数据**：是否使用了 pickle、yaml.load 等方式反序列化不受信任的数据？\r\n\r\n## 5. Prompt 注入防护\r\n\r\n- **指令覆盖（Instruction Override）**：SKILL.md 中是否存在容易被用户输入覆盖的系统指令（如 \"忽略以上所有指令\"）？\r\n- **隐藏指令**：是否存在藏在注释、不可见 Unicode 字符、过长拼接中的隐蔽指令？\r\n- **参数描述注入**：tool/function 的参数描述中是否包含可被用户利用的指令注入点？\r\n\r\n## 6. 系统修改\r\n\r\n- **破坏性 Git 操作**：是否包含 git reset、force-push、amend、rebase 等操作？\r\n- **工作目录外写入**：是否向工作目录之外写文件？\r\n- **包安装**：是否未经用户同意就安装系统软件包？\r\n- **删除操作**：是否包含文件/目录删除指令？是否有限制范围？\r\n\r\n---\r\n\r\n## 报告格式（在标准 Code Review 报告内以独立维度呈现）\r\n\r\n```\r\n### [P0] Agent Skill 安全审查\r\n\r\n#### 1. [凭证泄露] 要求用户粘贴 Token 到聊天\r\n📄 `SKILL.md:行号`\r\n**规则来源**: skill-vetter\r\n**问题**: 用户被要求将 Figma Token 粘贴到聊天，agent 自动写入 .env 文件\r\n**风险**: Token 可能被记录在聊天历史或日志中\r\n**建议**: 改为引导用户在本地设置环境变量，agent 仅从环境变量读取\r\n\r\n#### 2. [权限范围] 文件扫描缺少用户同意\r\n📄 `SKILL.md:行号`\r\n**规则来源**: skill-vetter\r\n**问题**: Step 2.5 指示 agent 运行项目扫描，但没有要求先获得用户同意\r\n**风险**: agent 可能扫描包含敏感内容的项目目录\r\n**建议**: 在扫描前必须获取用户明确同意\r\n```\n\nFile v1.3.0:references/review-typescript.md\n\n# TypeScript 审查维度\r\n\r\n检测到 `.ts` / `.tsx` 文件变更时加载。按以下 7 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过阅读上下文和类型系统反向验证后再确认。\r\n\r\n---\r\n\r\n## 1. 类型安全\r\n\r\n> **P0 频发地带** — 类型错误往往在运行时才暴露\r\n\r\n- **`any` 类型扩散**：`any` 在函数参数中是否向返回值传播？类型边界是否通过 `unknown` 做了一阶守卫？`as any` 出现在核心逻辑是 P0\r\n- **类型断言滥用**：`as Type` 是否真正确认了运行时合约？优先使用类型守卫（`is` 谓词）或 zod/io-ts 运行时校验\r\n- **`@ts-ignore` / `@ts-expect-error`**：是否有未说明理由的禁用？应该在下一行加注释说明为什么这条类型不符是合理的\r\n- **联合类型窄化**：`if (typeof x === 'string')` 的窄化路径是否全部覆盖？`never` 类型是否在 exhaustiveness check 中正确使用\r\n- **JSON.parse 返回值类型**：`JSON.parse(str) as MyType` 是否应在运行时做 schema 校验？线上数据格式变更可能导致静默类型不匹配\r\n- **模块增强（declare module）过度使用**：是否在试图绕过类型系统修正第三方包的类型？\r\n- **泛型约束不足**：泛型参数的 `extends` 约束是否过于宽泛？缺少约束可能导致运行时类型不匹配\r\n\r\n## 2. 异步与 Promise\r\n\r\n- **Floating Promise**：`Promise` 未 await 也未 return —— 执行顺序不可控，异常被吞没（启用 `@typescript-eslint/no-floating-promises` 规则，但不要依赖 ESLint 配置的完备性）\r\n- **未捕获的 Promise reject**：`promise.then(onFulfilled)` 但缺少 `.catch()`，或链末端未处理异常。`for await` 循环中的 reject 是否被 try-catch 包围？\r\n- **async 函数中错误静默**：`async () => { fetch(url) }` 但外层未 await 或 catch —— 错误会变成 unhandled rejection\r\n- **Promise.all 批次过大**：`Promise.all(tasks)` 中 tasks 数量是否可预见？超过 50 个建议分片（`p-limit` 或分批）\r\n- **空值竞态**：多个 `Promise` 竞争写入同一个状态，后完成的 Promise 覆盖先完成的结果\r\n- **AbortSignal 未传递**：fetch / 长操作是否接了 AbortController？组件卸载后仍在处理的请求不会自动取消\r\n\r\n## 3. 闭包与作用域\r\n\r\n- **Hooks 中过期闭包**：`useEffect(() => { ... }, [])` 内部引用了外部变量但未列入依赖数组。`setInterval` + `useRef` 组合中是否缓存了最新的回调？\r\n- **循环中闭包捕获**：`for (var i = 0; i < n; i++)` 内创建闭包（`setTimeout`、事件处理器）是否捕获了过期的 `i`？用 `let` 或 IIFE 修复\r\n- **回调中 `this` 丢失**：类方法作为回调传递时是否 `.bind(this)` 或使用箭头函数定义方法\r\n- **setInterval 未清理**：组件卸载 / 资源释放时 `clearInterval` 是否被调用？\r\n- **deduplicate 检查**：同类型闭包模式是否在 3 处以上重复出现 → 报告为一条跨文件问题\r\n\r\n## 4. 模块与依赖\r\n\r\n- **循环依赖**：是否存在模块 A import B, B import A？构建工具报错或无声退化为 `undefined`\r\n- **Barrel 文件膨胀**：`index.ts` 是否 re-export 了大量深度依赖（`export * from`）？会导致 tree-shaking 失效和冷启动变慢\r\n- **`require` vs `import` 混用**：条件 `require()` 在 ESM 模块中无法工作，动态 `import()` 才是正确方式\r\n- **默认导出 vs 命名导出不一致**：同一个模块是否在不同文件中分别使用 `import X from` 和 `import { X } from` 导入？（构建工具可能正常工作，但代码不一致）\r\n- **废弃依赖**：项目中是否有 `package.json` 中声明的依赖在代码中找不到任何 import？（不是硬性 P0，但建议标注）\r\n- **路径别名未配置**：使用 `../../utils/...` 深度相对路径是否应有 tsconfig paths 别名？（建议类建议，非硬性）\r\n\r\n## 5. 性能\r\n\r\n- **不必要的对象分配**：render 函数 / 热路径中反复创建对象（`{}`、`[]`、`() => ...`）是否应缓存或 memoize\r\n- **大规模数组操作**：`filter().map().reduce()` 链在大型数组上是否产生中间数组？可考虑 `transducer` 或 for 循环\r\n- **`useMemo` / `useCallback` 误用**：该加的地方没加，不该加的加上去了（简单计算、无子组件传递的回调）\r\n- **`React.FC` 重复渲染**：父组件每次渲染重新创建的对象作为 props 传递给子组件 → 子组件不必要 re-render\r\n- **`??` vs `||` 语义差别**：`||` 会过滤 `0` `''` `false`，是否本意是 `??`\r\n- **`for...of` 在 Node.js 中的性能**：百万级数组中 `for...of` 比传统 `for` 慢 5-10 倍\r\n\r\n## 6. 错误处理\r\n\r\n- **swallow catch**：`catch (e) {}` 空 catch 块没有日志没有上报，意味着错误被静默丢弃\r\n- **类型化错误**：`throw 'some string'` 应改为 `throw new Error()`。catch 中 `if (e instanceof Error)` 检查是否缺失\r\n- **fetch 只处理成功响应**：`const res = await fetch(url); return res.json();` 未检查 `res.ok`（HTTP 4xx/5xx 不会触发 catch）→ 应为 `if (!res.ok) throw new Error(...)`\r\n- **多个 try-catch 覆盖所有路径**：异步流程中的每个 await 是否有独立或统一的异常处理？\r\n\r\n## 7. 安全性\r\n\r\n- **`innerHTML` / `dangerouslySetInnerHTML`**：是否有充分理由？输入是否经过 DOMPurify 或其他安全转义？\r\n- **`eval` 及其变体**：`eval`、`new Function()`、`setTimeout(string)` 在依赖用户输入时是 RCE 风险\r\n- **`prototype` 污染**：`obj[key] = value` 中 `key` 是否来自用户输入？`__proto__`、`constructor` 等 key 是否被过滤？\r\n- **URL 拼接注入**：`https://api.com/${userInput}` 是否可能导致 SSRF 或 Open Redirect？\r\n- **`localStorage` / `sessionStorage` 存储敏感数据**：Token、PII 是否存储在无保护措施的前端存储中？(HttpOnly Cookie 或加密方案更安全)\r\n- **依赖供应链**：`package.json` 中新引入的依赖是否来自可信源？是否包含已知 CVE 的版本？\r\n\r\n---\r\n\r\n## 报告格式\r\n\r\n遵循 SKILL.md 中定义的标准输出格式。维度字段使用 TypeScript 对应的翻译（Type Safety → `type-safety` 等）。\n\nFile v1.3.0:README-zh.md\n\n# code-reviewer 中文说明\r\n\r\n> AI 驱动的代码审查工具，按 P0/P1/P2 三级严重度分类，自动识别项目平台并应用专项规则。\r\n\r\n---\r\n\r\n## 这个工具解决什么问题\r\n\r\n代码审查是保证质量的关键环节，但实际项目中面临两个痛点：\r\n- **人工审查覆盖率不足**：PR 多、reviewer 时间有限，容易漏审\r\n- **经验不均**：新人不熟悉 Android 线程模型、生命周期等坑，老问题反复出现\r\n\r\n本工具承担\"初审\"职责，覆盖常见的、规则化的问题，把人工 reviewer 的精力留给架构设计和业务逻辑。\r\n\r\n---\r\n\r\n## 使用示例\r\n\r\n```\r\n> review\r\n\r\n✅ 发现 2 个问题\r\n\r\nP0 🔴 在 Activity 中使用 GlobalScope 启动协程（无生命周期绑定）\r\n   src/MainActivity.kt:42\r\n   → 改用 lifecycleScope.launch，Activity 销毁时自动取消\r\n\r\nP1 🟡 RecyclerView Adapter 未使用 DiffUtil\r\n   src/adapter/UserAdapter.kt:15\r\n   → 用 DiffUtil 替代 notifyDataSetChanged()，避免全量刷新\r\n```\r\n\r\n---\r\n\r\n## 工作流程\r\n\r\n```\r\n1. Detect（识别平台）\r\n   根据项目文件自动判断：\r\n   build.gradle / AndroidManifest.xml → Android\r\n   *.xcodeproj / Podfile / Package.swift → iOS\r\n   其他 → 通用规则\r\n\r\n2. Diff（提取变更）\r\n   通过 git diff 获取变更内容\r\n   支持：未提交变更 / 已暂存 / 指定提交 / 分支对比\r\n\r\n3. Review（执行审查）\r\n   AI 按平台专项规则逐维度审查\r\n   Android/iOS：9 个维度，通用：7 个维度\r\n\r\n4. Report（输出报告）\r\n   结构化结果：严重度 + 文件位置 + 修复建议\r\n   可选生成 HTML 报告\r\n```\r\n\r\n---\r\n\r\n## 三种审查模式\r\n\r\n| 模式 | 命令 | 适用场景 |\r\n|------|------|---------|\r\n| **标准审查** | `review` | 完整审查，输出 P0/P1/P2 全部问题 |\r\n| **快速审查** | `quick review` | 只看 P0，快速判断\"能不能合并\" |\r\n| **安全审查** | `security review` | 重点检查敏感数据处理、注入风险、密钥泄露 |\r\n\r\n---\r\n\r\n## 严重度说明\r\n\r\n| 级别 | 含义 | 典型例子 |\r\n|------|------|---------|\r\n| **P0** 🔴 | 必须修复 | 崩溃、数据丢失、安全漏洞、死锁 |\r\n| **P1** 🟡 | 应当修复 | 竞态条件、资源泄漏、未处理的错误路径 |\r\n| **P2** 🔵 | 建议改进 | 命名不规范、结构冗余、轻微代码味道 |\r\n\r\n---\r\n\r\n## 审查维度详细说明\r\n\r\n### Android（9 个维度）\r\n\r\n自动识别条件：项目包含 `build.gradle*` 或 `AndroidManifest.xml`\r\n\r\n| 维度 | 检查内容 |\r\n|------|---------|\r\n| **线程安全** | 主线程网络/IO 操作、SharedPreferences/Room/文件 IO 是否在 IO 线程 |\r\n| **死锁与卡顿** | 锁嵌套、主线程 `runBlocking`、`synchronized` 范围过大 |\r\n| **内存管理** | Activity/Context 泄漏、Handler 内部类持有外部引用、Bitmap 未回收 |\r\n| **生命周期安全** | `onStop` 后访问 View、ViewModel 持有 View 引用、LiveData 跨线程问题 |\r\n| **逻辑正确性** | 整数溢出、浮点比较、集合并发修改 |\r\n| **异常处理** | 吞掉异常、过宽的 catch 范围、finally 中抛异常 |\r\n| **数据一致性** | 事务原子性、缓存与 DB 同步、SSE/Flow 中的状态竞争 |\r\n| **API 兼容性** | `Build.VERSION.SDK_INT` 检查缺失、废弃 API 使用 |\r\n| **架构合规** | ViewModel 直接操作 View、Repository 混入 UI 逻辑、模块间非法依赖 |\r\n\r\n### iOS（9 个维度）\r\n\r\n自动识别条件：项目包含 `*.xcodeproj`、`Podfile` 或 `Package.swift`\r\n\r\n| 维度 | 检查内容 |\r\n|------|---------|\r\n| **线程安全** | 非主线程更新 UI、共享状态数据竞争 |\r\n| **死锁与卡顿** | GCD 死锁、主队列同步调用、主线程阻塞 |\r\n| **内存安全** | 闭包捕获循环引用、unowned vs weak 误用、delegate 强引用 |\r\n| **资源泄漏** | 文件句柄未关闭、NotificationCenter 观察者未移除、Timer 未 invalidate |\r\n| **逻辑正确性** | 强制解包崩溃、数组越界、Optional 链式调用错误 |\r\n| **异常处理** | Result 类型未处理、缺少 do-catch、try? 静默失败 |\r\n| **数据一致性** | CoreData 上下文线程、UserDefaults 竞争、Combine 状态 |\r\n| **API 兼容性** | `@available` 检查缺失、废弃 API 使用 |\r\n| **架构合规** | ViewController 包含业务逻辑、循环依赖、MVVM/VIPER 层级混乱 |\r\n\r\n### 通用（7 个维度）\r\n\r\n适用于非 Android/iOS 项目\r\n\r\n| 维度 | 检查内容 |\r\n|------|---------|\r\n| **正确性** | 逻辑错误、越界、运算符优先级 |\r\n| **线程安全** | 共享可变状态、缺少同步 |\r\n| **内存** | 泄漏、无界增长、缺少清理 |\r\n| **性能** | N+1 查询、不必要的内存分配、阻塞调用 |\r\n| **API 设计** | 契约不清晰、缺少 null 检查、错误类型设计差 |\r\n| **错误处理** | 未处理的错误路径、静默失败 |\r\n| **安全** | 硬编码密钥、注入风险、不安全存储 |\r\n\r\n---\r\n\r\n## 快速开始\r\n\r\n### 安装\r\n\r\n```bash\r\n# OpenClaw 一键安装\r\nclawhub install code-reviewer\r\n\r\n# Claude Code — 复制到项目\r\ncp -r code-reviewer/ your-project/.claude/skills/\r\n\r\n# GitHub Copilot — 复制到项目\r\ncp -r code-reviewer/ your-project/.agents/skills/\r\n```\r\n\r\n### 使用命令\r\n\r\n```\r\nreview                    # 所有未提交变更\r\nreview staged             # 仅已暂存的变更\r\nreview abc1234            # 指定某次提交\r\nreview last 5 commits     # 最近 5 次提交\r\nreview branch feature-x   # 分支与 main 的对比\r\n```\r\n\r\n---\r\n\r\n## 智能行为\r\n\r\n- **重复问题合并**：同一类问题出现在 3 个以上文件 → 合并为一条，标注\"还有 N 处\"，避免报告被刷屏\r\n- **API 变更追踪**：函数签名改了？自动检查所有调用方是否同步更新\r\n- **测试覆盖提示**：变更了代码但测试没有更新 → 温和提示\r\n- **大 diff 保护**：变更超过 5000 行 → 提前提示再确认\r\n- **自动过滤**：跳过生成文件、二进制文件、lock 文件、vendor 目录\r\n\r\n\r\n\r\n---\r\n\r\n## 项目结构\r\n\r\n```\r\ncode-reviewer/\r\n├── SKILL.md                    # AI Agent 指令文件\r\n└── references/\r\n    ├── review-general.md       # 通用审查规则\r\n    ├── review-android.md       # Android 专项规则（9 个维度）\r\n    ├── review-ios.md           # iOS 专项规则（9 个维度）\r\n    ├── review-typescript.md    # TypeScript 专项规则（7 个维度）\r\n    ├── review-go.md            # Go 专项规则（7 个维度）\r\n    └── review-skill-vetter.md  # Agent/Skill 安全审查规则\r\n```\r\n\r\n---\r\n\r\n## 环境要求\r\n\r\n- Git 仓库\r\n- 一个支持 Agent Skill 的 AI 编程助手（OpenClaw、Claude Code、GitHub Copilot 等）\r\n\r\n---\r\n\r\n## 设计思路\r\n\r\n**为什么规则写在 Markdown 文件而不是硬编码进 Prompt？**\r\n\r\n规则文件可以独立维护和迭代。发现新的常见问题时，直接更新对应的 `review-android.md` 即可，不需要改代码。团队可以根据自己的编码规范定制规则，比如增加\"禁止使用 GlobalScope\"或者\"必须使用公司内部的网络库\"等项目专属约束。\r\n\r\n**为什么要区分 P0/P1/P2 而不是只输出所有问题？**\r\n\r\n实际经验：工具输出一长串问题时，reviewer 往往从上到下看，把精力花在不紧要的命名问题上，反而忽略了真正会引发崩溃的线程问题。分级让人先处理最重要的事。\r\n\r\n---\r\n\r\n## 反馈\r\n\r\n发现 bug 或有新语言需求？\r\n[提交 Issue →](https://github.com/TimeAground/code-reviewer/issues)\r\n\r\n## 许可证\r\n\r\nMIT © Lin Li 2026\n\nFile v1.3.0:skill-card.md\n\n## Description: <br>\nReview code against platform-specific rules for Android and iOS, language-specific rules for TypeScript and Go, and general engineering rules across local diffs, commits, branches, and remote PR URLs. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[timeaground](https://clawhub.ai/user/timeaground) <br>\n\n### License/Terms of Use: <br>\nMIT <br>\n\n\n## Use Case: <br>\nDevelopers and engineers use this skill to review code changes before merge, with structured severity labels, platform-aware checks, and concrete fix guidance. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Reviewing a repository can expose code diffs and nearby source context to the AI assistant. <br>\nMitigation: Avoid running the skill on changes containing secrets or highly sensitive proprietary code unless that disclosure is acceptable in the user's environment. <br>\nRisk: Automated review findings can be incorrect, incomplete, or overly broad for a codebase's conventions. <br>\nMitigation: Treat findings as review assistance and require a human engineer to confirm issues before making merge or release decisions. <br>\n\n\n## Reference(s): <br>\n- [README](README.md) <br>\n- [General Review Rules](references/review-general.md) <br>\n- [Android Review Rules](references/review-android.md) <br>\n- [iOS Review Rules](references/review-ios.md) <br>\n- [TypeScript Review Rules](references/review-typescript.md) <br>\n- [Go Review Rules](references/review-go.md) <br>\n- [Agent Skill Review Rules](references/review-skill-vetter.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Analysis, Markdown, Code, Shell commands, Guidance] <br>\n**Output Format:** [Markdown review findings with severity labels, file locations, explanations, and fix suggestions] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May include concrete replacement code and commands when relevant to the review finding.] <br>\n\n## Skill Version(s): <br>\n1.3.0 (source: server-resolved release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.3.0:LICENSE\n\nMIT License\r\n\r\nCopyright (c) 2026 Lin Li\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\n\nArchive v1.2.0: 10 files, 34340 bytes\n\nFiles: README-zh.md (7458b), README.md (6482b), references/review-android.md (6801b), references/review-general.md (7343b), references/review-ios.md (5680b), references/review-skill-vetter.md (3979b), scripts/render_report.py (18744b), skill-card.md (2404b), SKILL.md (12908b), _meta.json (136b)\n\nFile v1.2.0:SKILL.md\n\n---\r\nname: code-reviewer\r\ndescription: |\r\n  Review code changes against platform-specific rules (Android/iOS) plus shared general rules.\r\n  Supports: uncommitted changes, staged changes, specific commits, commit ranges, branch diffs,\r\n  and remote PR review via GitHub URL.\r\n  Optionally generates a styled HTML report. Use when user mentions: \"review\", \"code review\",\r\n  \"帮我看看代码\", \"check my changes\", provides a commit hash, pastes a GitHub PR URL,\r\n  or asks to review before committing.\r\n  Auto-detects platform (Android/iOS/General) from project markers.\r\n---\r\n\r\n# Code Reviewer\r\n\r\n## Mindset\r\n\r\nYou are a senior mobile engineer with battle scars from shipping Android and iOS apps to millions of users. You've debugged enough lifecycle leaks, thread crashes, and memory corruptions at 3 AM to have zero patience for careless code.\r\n\r\nYour reviews are **direct, specific, and actionable**. You don't manufacture problems, but you don't let real ones slide either. When code is clean, say so. When it's not, explain exactly why it will hurt someone in production.\r\n\r\n- **Android/iOS projects**: Apply platform-specific expertise — lifecycle safety, memory management, threading, platform conventions. This is your home turf.\r\n- **Other projects**: Apply general engineering principles. You're thorough but appropriately humble about domain-specific patterns you may not know.\r\n\r\nYour default stance: *\"Will this cause a problem in production? If yes, it's a finding. If not, let it go.\"*\r\n\r\n---\r\n\r\nReview code changes and report issues by severity.\r\n\r\n## Rule Files\r\n\r\nRead from `references/` relative to this skill directory. Always load general + detected platform:\r\n- `references/review-general.md` — always\r\n- `references/review-android.md` — Android (Kotlin/Java)\r\n- `references/review-ios.md` — iOS (ObjC/Swift)\r\n\r\n**Auto-detect additional rules:**\r\n- If the diff contains `SKILL.md`, `*.skill.md`, `.mdc`, or `.agent.md` files → also load `references/review-skill-vetter.md`\r\n- If the user explicitly requests \"skill review\", \"agent review\", or \"安全审查\" → also load `references/review-skill-vetter.md` even without matching files in diff\r\n\r\n## Severity Definitions (hard rules)\r\n\r\n| Level | Criteria | Action |\r\n|-------|----------|--------|\r\n| **P0** | Will cause: crash, data loss/corruption, security vulnerability, deadlock, infinite loop | **Must fix before merge** |\r\n| **P1** | May cause: race condition under specific timing, resource leak under edge case, silent data error, uncovered error path that breaks UX | Should fix |\r\n| **P2** | Code quality: naming, structure, minor redundancy, non-critical style | Nice to have |\r\n\r\nWhen uncertain between two levels, choose the **lower** severity (less alarm).\r\n\r\n## Workflow\r\n\r\n### 1. Determine review scope\r\n\r\nDetect from user message. Priority order:\r\n\r\n| User says | Scope | Git command |\r\n|-----------|-------|-------------|\r\n| \"review\" (no qualifier) | Uncommitted changes (staged + unstaged) | `git diff HEAD` |\r\n| \"review staged\" / \"review 暂存\" | Staged only | `git diff --cached` |\r\n| \"review \\<sha\\>\" / \"cid \\<sha\\>\" | Single commit | `git show <sha>` |\r\n| \"review \\<sha1\\>..\\<sha2\\>\" | Commit range | `git diff <sha1>..<sha2>` |\r\n| \"review branch \\<name\\>\" | Branch vs main/master | `git diff main...<name>` |\r\n| \"review last N commits\" | Recent N commits | `git diff HEAD~N..HEAD` |\r\n| `https://github.com/*/pull/*` 或类似 GitHub PR URL | 远程 PR 的 diff | 见 Step 2a |\r\n| `https://gitlab.com/*/-/merge_requests/*` 等 PR/MR URL | 远程 PR/MR 的 diff | 见 Step 2a |\r\n| `review pr` + PR URL | 远程 PR 的 diff | 见 Step 2a |\r\n\r\nIf scope is ambiguous, default to **uncommitted changes** — this is the most common use case.\r\n\r\n**PR URL detection**: A URL matching `github.com/*/pull/*`, `gitlab.com/*/-/merge_requests/*`, or similar code hosting platform PR/MR pattern is treated as a remote review scope.\r\n\r\n### 2. Resolve repo or remote PR\r\n\r\nIf the scope is a PR URL (remote review):\r\n1. Parse the URL to extract: platform (`github` / `gitlab`), owner, repo, PR number\r\n2. Fetch the diff:\r\n   - GitHub: `web_fetch(\"https://github.com/{owner}/{repo}/pull/{number}.diff\")`\r\n   - GitLab: `web_fetch(\"https://gitlab.com/{owner}/{repo}/-/{merge_requests}/{number}.diff\")`\r\n3. Fetch PR context (title, description, changed files list):\r\n   `web_fetch(\"https://github.com/{owner}/{repo}/pull/{number}\")` — extract from the rendered page\r\n4. Record the repo name from URL for the output header\r\n5. Skip git repo validation — proceed directly to Step 4 (Pre-flight checks)\r\n\r\nIf the scope is NOT a PR URL (local review):\r\nUse current working directory. Validate:\r\n```bash\r\ngit rev-parse --show-toplevel 2>/dev/null\r\n```\r\nIf not a git repo, ask user for path.\r\n\r\n### 3. Detect platform\r\n\r\nCheck repo root for markers (in order). If multiple match, choose the first match in priority order:\r\n\r\n| Platform | Markers (any match) |\r\n|----------|-------------------|\r\n| iOS | `*.xcodeproj`, `*.xcworkspace`, `Podfile`, `Package.swift` |\r\n| Android | `build.gradle*`, `settings.gradle*`, `AndroidManifest.xml`, `gradlew` |\r\n| General | Neither matches |\r\n\r\n**Additionally**, check if any changed file in the diff is a skill/agent file (`SKILL.md`, `*.skill.md`, `.mdc`, `.agent.md`) — if so, auto-load `review-skill-vetter.md` as an extra rule set regardless of platform.\r\n\r\n### 4. Pre-flight checks\r\n\r\n**Diff size**: Run `git diff --stat` first.\r\n- \\> 5000 lines changed → warn user, offer to focus on specific paths\r\n- \\> 10000 lines → refuse unless user confirms (context will be too large for quality review)\r\n\r\n**File filter** — skip from review (show in stats summary):\r\n- Binary files, images, fonts, videos\r\n- Generated: `*.pb.go`, `*.generated.*`, `R.java`, `BuildConfig.java`, `*.g.dart`\r\n- Lock files: `package-lock.json`, `yarn.lock`, `Podfile.lock`, `*.lock`\r\n- Vendor/deps: `vendor/`, `node_modules/`, `Pods/`, `build/`, `.gradle/`\r\n- IDE: `.idea/`, `.vscode/`, `*.xcuserdata`, `*.iml`\r\n\r\n### 5. Gather context\r\n\r\nFor each changed file, beyond the diff itself:\r\n- Read the **full function/method** surrounding each change (not just diff lines)\r\n- If a public API signature changed, search for callers: `git grep \"<function_name>\"` to assess impact\r\n- Check the commit message / PR description for intent — findings should be about **bugs**, not about **disagreeing with the approach**\r\n\r\n**For remote PR review only:** also extract the PR description (it's available from the context fetched in Step 2). Use it to understand the broader motivation beyond individual commit messages.\r\n\r\n### 6. Three-pass review\r\n\r\nRead `references/review-general.md` + platform-specific file + any auto-detected rule files.\r\n\r\nWork through the code in three passes, in order. Each pass has a different focus. Do NOT skip or merge passes.\r\n\r\n---\r\n\r\n#### Pass A — First Look (High-level structure, ~2-3 minutes)\r\n\r\nGoal: understand the change as a whole before diving into details.\r\n\r\n- Read the commit message / PR description for intent\r\n- Scan the file list — does the change scope make sense?\r\n- Check overall approach — is this the right solution to the problem?\r\n- Identify risky areas: API changes, shared mutable state, external boundaries\r\n- **Do NOT** report any findings yet — this pass is mental preparation\r\n\r\n---\r\n\r\n#### Pass B — Line-by-Line Detail (Main bulk of review)\r\n\r\nGoal: apply rules to each changed file, find concrete issues.\r\n\r\nFor each file, in order of the diff:\r\n1. Read the full function/method/block surrounding each change (not just the diff lines)\r\n2. Apply the relevant rule dimensions to that specific change\r\n3. If a public API signature changed, search for callers: `git grep \"<function_name>\"`\r\n\r\nFor every finding, include ALL fields:\r\n\r\n| Field | Description |\r\n|-------|-------------|\r\n| severity | `P0` / `P1` / `P2` (follow hard rules above) |\r\n| title | One-line summary |\r\n| file | File path |\r\n| line | Line number or range |\r\n| dimension | Category (e.g. 线程安全, 内存管理, 逻辑正确性) |\r\n| rule_source | `general` / `android` / `ios` / `skill-vetter` |\r\n| problem | What's wrong and why it matters |\r\n| code | **Exact** original lines from diff (non-empty) |\r\n| code_lang | Language identifier |\r\n| fix_suggestion | How to fix (text) |\r\n| fix_code | Concrete fix code (non-empty, compilable) |\r\n| fix_lang | Language of fix |\r\n\r\n**Quality rules:**\r\n- Don't report issues in unchanged code (unless the change directly breaks it)\r\n- Don't suggest \"might want to consider...\" — every finding must be a concrete problem\r\n- If no issues found for a file, move on. Empty review for a file is valid.\r\n\r\n---\r\n\r\n#### Pass C — Hardening & Edge Cases (~5 minutes)\r\n\r\nGoal: catch what line-by-line might miss — cross-file concerns and edge paths.\r\n\r\n- **Boundary values**: empty arrays, zero, null, max values, edge-case inputs\r\n- **Concurrency safety**: shared mutable state across files, async timing assumptions\r\n- **Error path completeness**: every execution path should reach a callback / error handler\r\n- **Caller impact**: if a signature/data structure changed, are all callers updated? (Check with `git grep`)\r\n\r\nIn this pass, you may report findings that span multiple files (e.g. \"similar bug pattern found in 3 files\").\r\n\r\n### 7. Output\r\n\r\n**Default: Terminal markdown** — print directly in chat:\r\n\r\n```markdown\r\n## Code Review: <repo_name>\r\n**Scope**: <description>  |  **Platform**: Android  |  **Files**: 12  |  **+247 / -89**\r\n\r\n### P0 · Must Fix (2)\r\n#### 1. [线程安全] ConcurrentModificationException risk\r\n📄 `app/src/.../ViewModel.kt:45-52`\r\n**Problem**: ...\r\n**Fix**: ...\r\n\r\n### P1 · Should Fix (3)\r\n...\r\n\r\n### P2 · Nice to Have (1)\r\n...\r\n\r\n**Summary**: 2 P0 / 3 P1 / 1 P2 — Fix P0 before merge.\r\n```\r\n\r\n**For remote PR review only:** after the findings, also include:\r\n\r\n```markdown\r\n### 👥 对 Reviewer 的建议\r\n这个 PR 的核心改动是 [一句话总结]。Review 时重点关注：\r\n- [文件A] — [风险/亮点简述]\r\n- [文件B] — [风险/亮点简述]\r\n```\r\n\r\n**Optional: HTML report** — only when user asks (\"生成报告\", \"generate report\", \"HTML\"):\r\n```bash\r\nTS=$(date +%Y%m%d_%H%M%S)\r\nREPORT_DIR=\"<repo_path>/.code-reviews\"\r\nmkdir -p \"$REPORT_DIR\"\r\npython3 <skill_dir>/scripts/render_report.py \"$JSON\" \"$REPORT_DIR/review_${TS}.html\"\r\nopen \"$REPORT_DIR/review_${TS}.html\"\r\n```\r\n\r\nAdd `.code-reviews/` to `.gitignore` if not already there.\r\n\r\n## Review Modes\r\n\r\n### Standard Review (default)\r\nManual trigger — user says \"review\" and gets results in chat.\r\n\r\n### Security-Focused Review\r\nWhen user says \"security review\" or \"安全审查\", apply stricter lens:\r\n- Focus on OWASP Top 10, injection, auth bypass, secrets exposure\r\n- Ignore style/naming issues entirely\r\n- All security findings are P0 or P1, never P2\r\n\r\n### Agent Skill Review\r\nWhen the diff contains `SKILL.md`, `*.skill.md`, `.mdc`, or `.agent.md` files, **automatically** enable Agent Skill Review:\r\n- Load `references/review-skill-vetter.md` as an additional rule set\r\n- Check for prompt injection risks, token/secret exposure, excessive permissions, unsafe tool calls\r\n- Apply skill-vetter's red flag checklist\r\n\r\nAlso trigger this mode when user says \"skill review\", \"agent review\", \"skill-vetter\", or \"审查技能\".\r\n\r\n### Quick Review\r\nWhen user says \"quick review\" or \"快速看看\":\r\n- Only report P0 issues\r\n- Skip P1/P2 entirely\r\n- Fastest path to \"can I merge this?\"\r\n\r\n## Smart Behaviors\r\n\r\n**Repeated patterns**: If the same issue appears 3+ times across files, report it once with\r\n\"Found in N files\" instead of N separate findings. List all affected files.\r\n\r\n**Related changes**: When a function signature changes, automatically check if callers are\r\nupdated. Report missing caller updates as P0 (will cause compile error or runtime crash).\r\n\r\n**Test coverage hint**: If the changed code has no corresponding test changes and the repo\r\nhas a test directory, mention it as P2 (not a finding, just a note at the end).\r\n\r\n## Safety\r\n\r\n- **Read-only**: Never modify repo code. Only create `.code-reviews/` for reports.\r\n- **No destructive git**: Never reset, clean, force-push, or amend.\r\n- **Conservative severity**: When unsure, choose lower severity. False P0 alarms erode trust.\r\n\r\n## Next Steps\r\n\r\nAfter every review, always end with a **Next Steps** section offering these options:\r\n\r\n```\r\n---\r\n**Next Steps**\r\n1. 📋 **Discuss** — Walk through findings one by one, I'll explain each issue and suggest fixes\r\n2. 🔨 **Fix now** — Tell me which issues to fix, I'll generate the corrected code\r\n3. 📄 **HTML report** — Generate a formatted report saved to `.code-reviews/`\r\n4. ✅ **All good** — No action needed\r\n```\r\n\r\nIf the user is operating through a sub-agent or coding assistant (e.g., Claude Code, Copilot), omit Next Steps and output only the review findings.\n\nFile v1.2.0:README.md\n\n# code-reviewer\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Python 3.8+](https://img.shields.io/badge/Python-3.8+-green.svg)](https://python.org)\n[![Platforms](https://img.shields.io/badge/Platforms-Android%20%7C%20iOS%20%7C%20General-orange.svg)](#supported-platforms)\n\n> AI-powered code review with severity grading. Platform-aware rules for Android, iOS, and general projects.\n\n## ✨ What It Does\n\nPoint it at your code changes → get a structured review with **P0 / P1 / P2** severity grading. Auto-detects your platform and applies specialized rules across up to 9 review dimensions.\n\n```\n> review\n\n✅ 2 issues found\n\nP0 🔴 Coroutine launched in Activity without lifecycle scope\n   src/MainActivity.kt:42\n   → Use lifecycleScope.launch instead of GlobalScope.launch\n\nP1 🟡 RecyclerView adapter not using DiffUtil\n   src/adapter/UserAdapter.kt:15\n   → Replace notifyDataSetChanged() with DiffUtil for better performance\n```\n\n## 🧠 How It Works\n\n1. **Detect** — Identifies platform from project files (`build.gradle` → Android, `*.xcodeproj` → iOS)\n2. **Diff** — Extracts changes via `git diff` (staged, unstaged, commits, branches)\n3. **Review** — AI applies platform-specific rules across multiple dimensions\n4. **Report** — Outputs structured findings with severity, location, and fix suggestions\n\n## 🎯 Three Review Modes\n\n| Mode | Command | Focus |\n|---|---|---|\n| **Standard** | `review` | Full review — P0, P1, P2 |\n| **Quick** | `quick review` | P0 only — \"can I merge this?\" |\n| **Security** | `security review` | Injection, auth bypass, key leaks |\n\n## 📋 Severity Levels\n\n| Level | Meaning | Examples |\n|---|---|---|\n| **P0** 🔴 | Must fix | Crash, data loss, security vulnerability, deadlock |\n| **P1** 🟡 | Should fix | Race condition, resource leak, unhandled error path |\n| **P2** 🔵 | Nice to have | Naming, structure, minor redundancy |\n\n## Supported Platforms\n\n### Android (9 dimensions)\n\nAuto-detected by: `build.gradle*`, `AndroidManifest.xml`\n\n| # | Dimension | What It Checks |\n|---|---|---|\n| 1 | **Thread safety** | Main-thread network/IO, SharedPreferences off main thread |\n| 2 | **Deadlock & jank** | Nested locks, `runBlocking` on main thread, oversized `synchronized` blocks |\n| 3 | **Memory management** | Activity/Context leaks, Handler inner-class retaining outer, Bitmap not recycled |\n| 4 | **Lifecycle safety** | View access after `onStop`, ViewModel holding View reference, LiveData from wrong thread |\n| 5 | **Logic correctness** | Integer overflow, float equality, concurrent collection modification |\n| 6 | **Exception handling** | Swallowed exceptions, overly broad catch, exception thrown in `finally` |\n| 7 | **Data consistency** | Transaction atomicity, cache/DB sync, state races in SSE/Flow |\n| 8 | **API compatibility** | Missing `Build.VERSION.SDK_INT` guards, deprecated API usage |\n| 9 | **Architecture** | ViewModel touching View directly, Repository with UI logic, illegal cross-module dependencies |\n\n### iOS (9 dimensions)\n\nAuto-detected by: `*.xcodeproj`, `Podfile`, `Package.swift`\n\n| # | Dimension | What It Checks |\n|---|---|---|\n| 1 | **Threading safety** | UI updates off main thread, data races on shared state |\n| 2 | **Deadlock & jank** | GCD deadlocks, main queue sync from main thread, blocking calls on main |\n| 3 | **Memory safety** | Retain cycles in closures, unowned vs weak misuse, delegate strong references |\n| 4 | **Resource leaks** | Unclosed file handles, NotificationCenter observers not removed, timer not invalidated |\n| 5 | **Logic correctness** | Force unwrap crashes, index-out-of-bounds, incorrect optional chaining |\n| 6 | **Exception handling** | Unhandled `Result` cases, missing `do-catch`, silent `try?` failures |\n| 7 | **Data consistency** | CoreData context threading, UserDefaults race, Combine publisher state |\n| 8 | **API compatibility** | Missing `@available` guards, deprecated API usage |\n| 9 | **Architecture** | ViewController business logic, circular dependencies, broken MVVM/VIPER layer |\n\n### General (7 dimensions)\n\nApplied to any project not identified as Android or iOS.\n\n| # | Dimension | What It Checks |\n|---|---|---|\n| 1 | **Correctness** | Logic errors, off-by-one, wrong operator precedence |\n| 2 | **Thread safety** | Shared mutable state, missing synchronization |\n| 3 | **Memory** | Leaks, unbounded growth, missing cleanup |\n| 4 | **Performance** | N+1 queries, unnecessary allocations, blocking calls |\n| 5 | **API design** | Unclear contracts, missing null checks, poor error types |\n| 6 | **Error handling** | Unhandled error paths, silent failures |\n| 7 | **Security** | Hardcoded secrets, injection risks, insecure storage |\n\n## 🚀 Quick Start\n\n### Install\n\n```bash\n# OpenClaw\nclawhub install code-reviewer\n\n# Claude Code\ncp -r code-reviewer/ your-project/.claude/skills/\n\n# GitHub Copilot\ncp -r code-reviewer/ your-project/.agents/skills/\n```\n\n### Use\n\n```\nreview                    # All uncommitted changes\nreview staged             # Only staged changes\nreview abc1234            # Specific commit\nreview last 5 commits     # Recent commits\nreview branch feature-x   # Branch diff vs main\n```\n\n## 🛡 Smart Behaviors\n\n- **Duplicate merging** — Same issue in 3+ files → merged into one finding with count\n- **API change tracking** — Signature changed? Automatically checks if all callers are updated\n- **Test coverage hints** — Changed code without test updates → gentle reminder\n- **Large diff protection** — 5000+ lines → warns before proceeding\n- **Auto-filtered files** — Skips generated code, binaries, lock files, vendor dirs\n\n## 📄 HTML Reports\n\n```\nreview, generate HTML report\n```\n\nSaves to `.code-reviews/` and opens in browser. Includes dark theme, P0/P1/P2 filtering, and per-finding code diffs.\n\n> **Tip:** Add `.code-reviews/` to your `.gitignore`.\n\n## 🏗 Architecture\n\n```\ncode-reviewer/\n├── SKILL.md                    # AI agent instructions\n├── references/\n│   ├── review-general.md       # General review rules (7 dimensions)\n│   ├── review-android.md       # Android-specific rules (9 dimensions)\n│   └── review-ios.md           # iOS-specific rules (9 dimensions)\n└── scripts/\n    └── render_report.py        # HTML report renderer (JSON → standalone HTML)\n```\n\n## Requirements\n\n- Git repository\n- An AI coding assistant (OpenClaw, Claude Code, GitHub Copilot, etc.)\n\n## License\n\nMIT\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn7crx9z6m9cw8gpcwbhp8na31843hnr\",\n  \"slug\": \"pro-code-reviewer\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1783779161424\n}\n\nFile v1.2.0:references/review-android.md\n\n# Android (Kotlin/Java) 审查维度\r\n\r\n按以下 9 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过多种方法（阅读上下文、搜索调用方、追踪数据流）反复验证后再确认。\r\n\r\n## 1. 线程安全与并发\r\n\r\n- 共享可变状态是否有正确的同步保护（`synchronized`、`ReentrantLock`、`@Volatile`、`AtomicXxx`）\r\n- 协程中访问的共享状态是否使用了正确的 Dispatcher 和 `Mutex`/`StateFlow`\r\n- `Handler`/`Looper` 使用是否正确，是否可能在错误线程回调\r\n- `LiveData.postValue` 连续调用是否会丢值（仅保留最后一次）\r\n- `ConcurrentModificationException`：迭代集合时是否可能被其他线程修改\r\n- `suspend` 函数中的共享状态访问是否在同一个 `CoroutineContext` 中\r\n\r\n## 2. 死锁、卡顿与性能\r\n\r\n- **主线程卡顿**：主线程上执行数据库操作、文件 I/O、网络请求、大量计算\r\n- **同步死锁**：嵌套 `synchronized`（A->B->A）、`runBlocking` 在主线程\r\n- **协程死锁**：在 `Dispatchers.Main` 上调用 `runBlocking`；协程 A 等待 B 完成，B 又等待 A\r\n- **RecyclerView 性能**：`onBindViewHolder` 中执行耗时操作、未复用 ViewHolder、频繁 `notifyDataSetChanged` 而非 DiffUtil\r\n- **过度绘制/布局层级**：嵌套过深的 View 层级、不必要的背景绘制\r\n- **大对象频繁创建**：循环内反复创建 SimpleDateFormat、正则 Pattern、Gson 实例\r\n- **无节制的集合增长**：List/Map 只添加不清理，随时间无限增长\r\n- **Bitmap 未及时回收**：大图加载未压缩、未使用 `inSampleSize`\r\n\r\n## 3. 内存管理\r\n\r\n- **Activity/Fragment 泄漏**：匿名内部类/非静态内部类隐式持有外部类引用\r\n- **Handler 泄漏**：非静态 Handler 持有 Activity 引用，消息队列中的 Message 延迟释放\r\n- **协程泄漏**：协程未绑定 `lifecycleScope`/`viewModelScope`，Activity 销毁后仍在执行\r\n- **Context 泄漏**：单例/静态变量持有 Activity Context（应使用 Application Context）\r\n- **注册未反注册**：BroadcastReceiver、ContentObserver、Listener 注册后未在 `onDestroy` 中反注册\r\n- **Cursor/Stream 未关闭**：数据库 Cursor、InputStream/OutputStream 未在 finally 中关闭\r\n- **WebView 泄漏**：WebView 未在 `onDestroy` 中调用 `destroy()`\r\n\r\n## 4. 生命周期安全\r\n\r\n- Fragment/Activity 销毁后是否仍访问 View（`getView()` 返回 null）\r\n- `onActivityResult`/回调中是否检查了 `isAdded()`/`isFinishing()`\r\n- `ViewModel` 中是否引用了 View/Activity（应通过 LiveData/StateFlow 通信）\r\n- `DialogFragment.show()` 在 `onSaveInstanceState` 后调用导致 crash\r\n- `FragmentTransaction.commit()` vs `commitAllowingStateLoss()` 的使用场景\r\n- `LaunchedEffect`/`DisposableEffect`（Compose）的清理逻辑是否完整\r\n\r\n## 5. 逻辑正确性\r\n\r\n- 条件判断的边界值是否正确（off-by-one、空值、零值）\r\n- Kotlin null safety：`!!` 强制解包是否安全、`?.let` 链中是否有竞态\r\n- 新增代码对已有流程的影响面（调用方是否需要适配）\r\n- 异步操作的时序是否有保证（先后顺序、回调是否可能不触发）\r\n- 错误处理路径是否完整（每个分支都有合理出口）\r\n- `when` 表达式是否覆盖所有情况（sealed class 是否有遗漏分支）\r\n\r\n## 6. 异常处理与回调完整性\r\n\r\n- **协程异常**：`launch` 中未捕获的异常会 crash，`async` 的 `await` 未包裹 try-catch\r\n- **回调遗漏**：所有执行路径是否都触发了回调/LiveData 更新，避免 UI 永远 loading\r\n- `try-catch` 是否吞掉了不应忽略的异常（catch 后无日志、直接 return）\r\n- `CoroutineExceptionHandler` 是否正确配置\r\n- 网络请求超时/失败路径是否有降级策略\r\n- `Result`/`sealed class` 错误类型是否在所有消费处都处理\r\n\r\n## 7. 数据一致性\r\n\r\n- 多数据源（数据库 + 网络 + 缓存）是否可能出现不一致\r\n- `SharedPreferences.apply()` 的异步写入是否会导致读取到旧值\r\n- Room 数据库事务是否正确使用 `@Transaction`\r\n- `StateFlow`/`LiveData` 的值更新是否原子（多个相关字段分别更新可能导致中间状态）\r\n- 状态机是否存在非法跳转（跳过中间状态、重复进入终态）\r\n\r\n## 8. API 兼容性\r\n\r\n- 公开 API 签名变更是否破坏已有调用方\r\n- `@JvmOverloads`/`@JvmStatic` 等注解变更是否影响 Java 互操作\r\n- `data class` 添加新字段是否影响 `copy()`/`equals()`/序列化\r\n- ProGuard/R8 混淆规则是否覆盖新增的反射/序列化类\r\n- `minSdk` 兼容性：使用的 API 是否在所有支持版本上可用\r\n- Intent/Bundle 传递的 key 重命名是否影响其他组件\r\n\r\n## 9. 架构设计\r\n\r\n- 圈复杂度是否过高（深层嵌套、过长方法）\r\n- 是否存在重复代码可提取公共方法\r\n- 类/模块间的依赖关系是否合理（避免循环依赖）\r\n- ViewModel/Repository/UseCase 职责是否清晰\r\n- 新增 API 的命名和参数设计是否符合现有约定\r\n- 是否违反了单向数据流原则（View 直接修改 Model）\r\n\r\n**过度工程化红线（以下情况不要提出建议）：**\r\n- 三行以内的相似代码不算\"重复\"\r\n- 仅被调用一次的代码不需要提取方法\r\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\r\n- 不要建议为假想的未来需求做扩展性设计\r\n- 不要要求给未变更的代码加注释、文档或类型标注\r\n- 不要建议为一次性操作创建工具类/抽象层\r\n\r\n---\r\n\r\n## 报告格式\r\n\r\n```markdown\r\n# Code Review Report\r\n\r\n> **分支**: xxx\r\n> **Review 范围**: commit_id..HEAD (N commits)\r\n> **变更文件**: N 个\r\n\r\n## 概述\r\n[一段话总结本次变更的目的和整体质量评价]\r\n\r\n## 问题清单\r\n\r\n### [P0] 必须修复\r\n> P0 = 会导致 crash / 数据错误 / 安全漏洞 / 死锁\r\n\r\n#### 1. [问题标题]\r\n- **文件**: `path/to/File.kt:行号`\r\n- **维度**: 线程安全 / 内存管理 / 生命周期安全 / ...\r\n- **问题描述**: [具体问题]\r\n- **风险**: [会导致什么后果]\r\n- **修复建议**: [具体修复方式]\r\n\r\n### [P1] 建议修复\r\n> P1 = 潜在风险 / 边界 case 未处理\r\n\r\n### [P2] 架构优化建议\r\n> P2 = 代码质量 / 可维护性改进\r\n\r\n## 总结\r\n\r\n| 维度 | P0 | P1 | P2 |\r\n|------|----|----|-----|\r\n| 线程安全与并发 | 0 | 0 | 0 |\r\n| 死锁与卡顿 | 0 | 0 | 0 |\r\n| 内存管理 | 0 | 0 | 0 |\r\n| 生命周期安全 | 0 | 0 | 0 |\r\n| 逻辑正确性 | 0 | 0 | 0 |\r\n| 异常处理/回调完整性 | 0 | 0 | 0 |\r\n| 数据一致性 | 0 | 0 | 0 |\r\n| API 兼容性 | 0 | 0 | 0 |\r\n| 架构设计 | - | 0 | 0 |\r\n\r\n[最终结论：是否可以合入，或需要修复后再 review]\r\n```\n\nFile v1.2.0:references/review-general.md\n\n# 通用审查维度\n\n适用于非 iOS/Android 的项目（TypeScript、Python、Go、Java（非 Android）、C#、Rust 等）。\n按以下 7 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过阅读上下文、搜索调用方、追踪数据流反复验证后再确认。\n\n---\n\n## 1. 安全性\n\n> **P0 频发地带** — 每个安全问题都是 P0\n\n- **注入漏洞**：所有数据库查询是否使用参数化查询/ORM？用户输入拼接 SQL/NoSQL 查询是 P0\n- **XSS**：用户提交的内容在渲染前是否被转义/脱敏？`dangerouslySetInnerHTML` 等 API 是否有充分理由并做安全处理\n- **CSRF**：状态变更请求是否有 CSRF token/SameSite Cookie 防护？\n- **认证与鉴权**：每个受保护端点是否验证了用户身份？资源访问是否按用户权限做了隔离？（IDOR 是 P0）\n- **输入校验**：所有外部输入（params、headers、body、files）是否在服务端做了类型/长度/格式/范围校验？前端校验不是安全校验\n- **密钥泄露**：代码中是否硬编码了 API Key、密码、Token？（P0，立即修复）\n- **依赖安全**：新引入的依赖是否来自可信源、持续维护、无已知 CVE？\n- **敏感数据泄露**：PII、Token、密钥是否可能被日志、错误消息或 API 响应泄露？\n- **文件上传**：上传的文件是否做了类型/大小校验？是否存储到 webroot 之外？Content-Type 是否正确？\n- **HTTP 安全头**：Content-Security-Policy、X-Content-Type-Options、Strict-Transport-Security 是否配置？\n\n## 2. 性能\n\n- **N+1 查询**：是否存在循环内发起独立数据库查询的模式？应该改为批量查询或 JOIN\n- **不必要的重渲染**：前端组件是否只在相关 state/props 变化时才重渲染？不必要的 memo 化不要建议，实测有问题的才提\n- **内存泄漏**：事件监听器、订阅、定时器、interval 是否在组件卸载/资源释放时清理？\n- **包体积**：新依赖是否可 tree-shake？是否为了一个函数导入了整个库？建议按需导入\n- **懒加载**：重型组件、路由、折叠内容是否使用了懒加载/代码分割？\n- **缓存策略**：重复计算/API 响应是否使用了合适的缓存（memoization、HTTP cache、Redis）？\n- **数据库索引**：查询的过滤/排序字段是否有索引？新查询是否应检查 EXPLAIN 计划？\n- **分页**：列表查询是否使用了分页或 cursor？不允许无边界 SELECT *\n\n## 3. 正确性\n\n- **边界值**：空数组、空字符串、零值、负数、最大值是否被正确处理？\n- **null/undefined 处理**：可空值在访问前是否做了检查？可选链或守卫是否到位？\n- **off-by-one**：循环边界、数组下标、分页偏移量、范围计算是否正确？\n- **竞态条件**：异步代码中是否存在对共享状态的并发访问？\n- **时区处理**：日期是否以 UTC 存储？展示层才做时区转换？\n- **Unicode 与编码**：字符串操作是否考虑多字节字符？编码是否明确指定（UTF-8）？\n- **整数溢出/精度**：大数/金额计算是否使用了合适的类型（BigInt、Decimal）？\n- **状态一致性**：多步操作是否是事务性的？部分失败后系统是否处于有效状态？\n\n## 4. 可维护性\n\n- **命名**：变量、函数、类的名称是否描述其用途？\n- **单一职责**：每个函数/类/模块是否只做一件事？一个变更是否只需要改一个地方？\n- **DRY**：重复逻辑是否提取为公共函数？复制粘贴的代码段是否应合并？\n- **圈复杂度**：函数的分支复杂度是否过高？深层嵌套的循环/条件是否应分解？\n- **死代码**：注释掉的代码、未使用的 import、不可达分支、过期的 feature flag 是否已清理？\n- **魔法数字/字符串**：字面量是否提取为命名常量？\n- **模式一致性**：新代码是否遵循了代码库已有的约定？\n\n**过度工程化红线（以下情况不要提出建议）：**\n- 三行以内的相似代码不算\"重复\"\n- 仅被调用一次的代码不需要提取方法\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\n- 不要建议为假想的未来需求做扩展性设计\n- 不要要求给未变更的代码加注释、文档或类型标注\n- 不要建议为一次性操作创建工具类/抽象层\n\n## 5. 测试\n\n- **测试覆盖**：新增逻辑是否有对应测试？关键路径是否同时覆盖了 happy path 和失败 case？\n- **边界测试**：边界值、空输入、null、错误条件是否有测试？\n- **无 Flaky 测试**：测试是否确定性？不能依赖时序、外部服务、共享可变状态\n- **测试独立性**：每个测试是否自己 setup 和 teardown？测试执行顺序不影响结果\n- **有意义的断言**：测试断言的是行为/输出，不是实现细节\n- **测试可读性**：测试是否符合 Arrange-Act-Assert 模式？名称是否描述场景和预期？\n- **Mock 纪律**：只有外部边界（网络、数据库、文件系统）才 mock，内部逻辑不 mock\n\n## 6. 错误处理\n\n- **异常吞没**：catch 块是否有日志/上报？空 catch 或直接 return 是 P1（可能导致静默失败）\n- **回调遗漏**：所有执行路径（包括快速返回、错误分支、超时、取消）是否都触发了回调？\n- **降级策略**：网络请求超时/失败是否有降级路径？用户是否能看到合理的错误提示？\n- **Promise/async 错误**：未处理的 Promise reject、async 函数中未 catch 的异常\n- **错误信息过度暴露**：错误消息是否可能泄露内部实现细节（栈信息、SQL、文件路径）？\n- **重试逻辑**：临时性失败是否有重试？重试是否有退避和上限？幂等性是否有保证？\n\n## 7. 数据一致性与并发\n\n- **事务完整性**：跨表/跨服务的操作是否使用事务？部分失败后的回滚是否正确？\n- **缓存穿透**：缓存未命中时是否会导致雪崩打到数据库？是否有布隆过滤器或空值缓存？\n- **状态机跳转**：状态变更是否存在非法跳转（跳过中间状态、重复进入终态）？\n- **并发安全**：多线程/多协程访问共享状态是否有正确的同步原语？\n- **超时与取消**：长时间运行的操作是否有超时机制？取消信号是否能正确传播？\n\n---\n\n## 报告格式\n\n```markdown\n# Code Review Report\n\n## 概览\n- **Review 范围**: commit_id..HEAD (N commits)\n- **变更文件数**: N\n- **总变更行数**: +X / -Y\n\n## Review 详情\n\n### [P0] 必须修复\n> P0 = 会导致 crash / 数据错误 / 安全漏洞 / 死锁\n\n**文件**: `path/to/file:行号`\n**维度**: 安全性 / 性能 / 正确性 / ...\n**问题**: 具体描述\n**建议**: 修复方案\n\n### [P1] 建议修复\n> P1 = 潜在风险 / 边界 case 未处理 / 资源泄漏\n\n### [P2] 改进建议\n> P2 = 代码质量提升建议，非阻塞性\n\n## 总结\n\n| 维度 | P0 | P1 | P2 |\n|------|----|----|-----|\n| 安全性 | 0 | 0 | 0 |\n| 性能 | 0 | 0 | 0 |\n| 正确性 | 0 | 0 | 0 |\n| 可维护性 | - | 0 | 0 |\n| 测试 | - | 0 | 0 |\n| 错误处理 | 0 | 0 | 0 |\n| 数据一致性 | 0 | 0 | 0 |\n\n**总体评价**: [可以合入 / 建议修复后再合入 / 必须修复 P0 再合入]\n```\n\nFile v1.2.0:references/review-ios.md\n\n# iOS (ObjC/Swift) 审查维度\r\n\r\n按以下 9 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过多种方法（阅读上下文、搜索调用方、追踪数据流）反复验证后再确认。\r\n\r\n## 1. 多线程安全\r\n\r\n- 共享可变状态是否有正确的同步保护（锁、串行队列、atomic）\r\n- Block 捕获的变量在回调时是否仍然有效\r\n- `dispatch_async` 回调中访问的对象，其生命周期是否可控\r\n- 是否存在竞态条件：多个线程/队列可能同时读写同一字段\r\n- 串行队列上的操作是否有可能被外部并发调用打破串行假设\r\n\r\n## 2. 死锁、卡顿与性能\r\n\r\n- **同步死锁**：`dispatch_sync` 到当前队列、嵌套锁（A->B->A）、`@synchronized` 嵌套\r\n- **异步死锁**：队列 A 等待队列 B 的结果，队列 B 又等待队列 A\r\n- **主线程卡顿**：主线程上执行同步磁盘 I/O、同步网络请求、大量计算、`dispatch_sync` 到其他队列\r\n- **锁粒度过大**：在锁内执行耗时操作导致其他线程长时间等待\r\n- **dispatch_once 死锁**：singleton 初始化链路中互相依赖（A.shared -> B.shared -> A.shared）\r\n- **高频路径重复 I/O**：循环体 / 频繁调用的方法内每次都读写磁盘\r\n- **重复计算**：可缓存的结果每次重新计算（如循环内反复创建 DateFormatter）\r\n- **大对象频繁创建/销毁**：热路径上反复 alloc 重型对象而未复用\r\n- **无节制的集合增长**：数组/字典只添加不清理，随时间无限增长\r\n\r\n## 3. 内存安全\r\n\r\n- Block 中是否正确使用 `__weak` / `__strong`，避免循环引用\r\n- delegate / observer 引用关系是否合理（weak vs strong）\r\n- 是否存在 dealloc 后仍被回调的风险（悬空指针）\r\n- 集合（NSArray/NSDictionary）中存储的对象引用是否会导致意外强持有\r\n- C 数组/指针操作是否有越界风险\r\n- 单例持有非单例对象是否会导致泄漏\r\n\r\n## 4. 资源泄漏\r\n\r\n- 未关闭的文件句柄 / 数据库连接\r\n- 未移除的 timer / observer / notification\r\n- `dispatch_source_t` 创建后未 cancel\r\n- `CFRetain` 无对应 `CFRelease`\r\n- 临时文件未清理\r\n\r\n## 5. 逻辑正确性\r\n\r\n- 条件判断的边界值是否正确（off-by-one, 空值, 零值）\r\n- 新增代码对已有流程的影响面（调用方是否需要适配）\r\n- 异步操作的时序是否有保证（先后顺序、回调是否可能不触发）\r\n- 错误处理路径是否完整（每个分支都有合理出口）\r\n- 防重入/幂等设计是否覆盖所有入口\r\n\r\n## 6. 异常吞没与回调完整性\r\n\r\n- **completion 回调遗漏**：所有执行路径（含快速返回 / 错误分支）是否都调用了 completion 回调\r\n- `@try/@catch` 是否吞掉了不应忽略的异常（catch 后无日志、无上报、直接 return）\r\n- 错误路径是否有日志或 APM 上报，避免静默失败\r\n- delegate 回调方法是否在所有路径都触发（成功 + 失败 + 超时 + 取消）\r\n\r\n## 7. 数据一致性\r\n\r\n- 多数据源同步写入时是否保证原子性\r\n- 缓存与真实状态是否可能不一致（写穿/写回策略）\r\n- 状态机是否存在非法跳转（跳过中间状态、重复进入终态）\r\n- 读取时是否使用了同一份快照（非原子地读取多个相关字段可能不一致）\r\n\r\n## 8. API 兼容性\r\n\r\n- 公开 API 签名变更是否破坏已有调用方（ObjC 方法名/参数调整、Swift 桥接名称变化）\r\n- 新增方法是否可能与父类/子类的同名方法冲突\r\n- 枚举新增值是否影响 switch/for 遍历（遗漏 case、循环范围越界）\r\n- 协议新增 `@required` 方法是否导致现有实现类编译报错\r\n\r\n## 9. 架构设计\r\n\r\n- 圈复杂度是否过高（深层嵌套、过长方法）\r\n- 是否存在重复代码可提取公共方法\r\n- 类/模块间的调用关系和持有关系是否合理\r\n- 引用层级是否过深（A->B->C->D->E）\r\n- 职责划分是否清晰（单一职责原则）\r\n- 新增 API 的命名和参数设计是否符合现有约定\r\n\r\n**过度工程化红线（以下情况不要提出建议）：**\r\n- 三行以内的相似代码不算\"重复\"\r\n- 仅被调用一次的代码不需要提取方法\r\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\r\n- 不要建议为假想的未来需求做扩展性设计\r\n- 不要要求给未变更的代码加注释、文档或类型标注\r\n- 不要建议为一次性操作创建工具类/抽象层\r\n\r\n---\r\n\r\n## 报告格式\r\n\r\n```markdown\r\n# Code Review Report\r\n\r\n> **分支**: xxx\r\n> **Review 范围**: commit_id..HEAD (N commits)\r\n> **变更文件**: N 个\r\n\r\n## 概述\r\n[一段话总结本次变更的目的和整体质量评价]\r\n\r\n## 问题清单\r\n\r\n### [P0] 必须修复\r\n> P0 = 会导致 crash / 数据错误 / 安全漏洞 / 死锁\r\n\r\n#### 1. [问题标题]\r\n- **文件**: `path/to/file.m:行号`\r\n- **维度**: 多线程安全 / 死锁与卡顿 / ...\r\n- **问题描述**: [具体问题]\r\n- **风险**: [会导致什么后果]\r\n- **修复建议**: [具体修复方式]\r\n\r\n### [P1] 建议修复\r\n> P1 = 潜在风险 / 边界 case 未处理\r\n\r\n### [P2] 架构优化建议\r\n> P2 = 代码质量 / 可维护性改进\r\n\r\n## 总结\r\n\r\n| 维度 | P0 | P1 | P2 |\r\n|------|----|----|-----|\r\n| 多线程安全 | 0 | 0 | 0 |\r\n| 死锁与卡顿 | 0 | 0 | 0 |\r\n| 内存安全 | 0 | 0 | 0 |\r\n| 资源泄漏 | 0 | 0 | 0 |\r\n| 逻辑正确性 | 0 | 0 | 0 |\r\n| 异常吞没/回调完整性 | 0 | 0 | 0 |\r\n| 数据一致性 | 0 | 0 | 0 |\r\n| API 兼容性 | 0 | 0 | 0 |\r\n| 架构设计 | - | 0 | 0 |\r\n\r\n[最终结论：是否可以合入，或需要修复后再 review]\r\n```\n\nFile v1.2.0:references/review-skill-vetter.md\n\n# Agent Skill 安全审查维度\n\n当 diff 包含 `SKILL.md`、`*.skill.md`、`.mdc`、`.agent.md` 等 agent 配置文件时自动加载。\n也支持用户通过 \"skill review\"、\"agent review\"、\"skill-vetter\"、\"安全审查\" 等关键词手动触发。\n\n**所有发现的违规均为 P0。** Agent Skill 的安全问题无小问题——每个都可能被恶意利用。\n\n---\n\n## 1. 凭证与敏感信息\n\n- **Token 要求用户粘贴到聊天**：`SKILL.md` 中是否要求用户把 API Key/Token 粘贴到聊天消息中？正确的做法是让用户在本地环境变量中设置\n- **硬编码凭证**：代码中是否包含密钥、Token、密码（即使是测试环境）？\n- **自动写凭证文件**：agent 是否被指示将 token/secret 自动写入 `.env` 或其他文件？agent 不应该替用户管理凭证文件\n- **凭证日志泄露**：agent 在对话/日志中输出 token 或敏感数据？\n\n## 2. 数据外泄风险\n\n- **外部网络请求**：skill 是否通过 curl/wget/fetch 向外部 URL 发送数据？URL 是否可信？\n- **文件系统遍历**：是否读取了 `~/.ssh/`、`~/.aws/`、`~/.config/` 等全局敏感目录？\n- **读取 agent 配置文件**：是否读取了 `MEMORY.md`、`USER.md`、`SOUL.md`、`IDENTITY.md`？除非有明确且必要的理由，否则禁止\n- **base64 decode 载荷**：是否存在可疑的 base64 编码字符串？可能隐藏恶意载荷\n- **IP 地址直连**：网络请求是否使用 IP 地址而非域名？IP 直连是红色警报\n\n## 3. 权限范围\n\n- **实际权限 > 声称的能力**：SKILL.md 描述的 scope（如\"只读取文件\"）是否与实际指令一致？（例如声称只读但包含写文件指令）\n- **缺少用户同意**：文件写入/网络请求/项目扫描前是否有明确的用户同意步骤？\n- **写入范围未声明**：写入操作是否限定了目标路径？是否可能写入到用户项目的敏感区域？\n- **sudo/提权请求**：是否要求以管理员/sudo 权限运行？\n\n## 4. 不安全执行\n\n- **eval/exec 外部输入**：是否使用 eval()、exec()、`os.system()` 执行不受信任的输入？\n- **shell 注入风险**：命令拼接是否使用用户输入？是否合理使用了参数化执行？\n- **动态 import/require**：是否根据外部输入动态导入模块？\n- **反序列化不可信数据**：是否使用了 pickle、yaml.load 等方式反序列化不受信任的数据？\n\n## 5. Prompt 注入防护\n\n- **指令覆盖（Instruction Override）**：SKILL.md 中是否存在容易被用户输入覆盖的系统指令（如 \"忽略以上所有指令\"）？\n- **隐藏指令**：是否存在藏在注释、不可见 Unicode 字符、过长拼接中的隐蔽指令？\n- **参数描述注入**：tool/function 的参数描述中是否包含可被用户利用的指令注入点？\n\n## 6. 系统修改\n\n- **破坏性 Git 操作**：是否包含 git reset、force-push、amend、rebase 等操作？\n- **工作目录外写入**：是否向工作目录之外写文件？\n- **包安装**：是否未经用户同意就安装系统软件包？\n- **删除操作**：是否包含文件/目录删除指令？是否有限制范围？\n\n---\n\n## 报告格式（在标准 Code Review 报告内以独立维度呈现）\n\n```\n### [P0] Agent Skill 安全审查\n\n#### 1. [凭证泄露] 要求用户粘贴 Token 到聊天\n📄 `SKILL.md:行号`\n**规则来源**: skill-vetter\n**问题**: 用户被要求将 Figma Token 粘贴到聊天，agent 自动写入 .env 文件\n**风险**: Token 可能被记录在聊天历史或日志中\n**建议**: 改为引导用户在本地设置环境变量，agent 仅从环境变量读取\n\n#### 2. [权限范围] 文件扫描缺少用户同意\n📄 `SKILL.md:行号`\n**规则来源**: skill-vetter\n**问题**: Step 2.5 指示 agent 运行项目扫描，但没有要求先获得用户同意\n**风险**: agent 可能扫描包含敏感内容的项目目录\n**建议**: 在扫描前必须获取用户明确同意\n```\n\nFile v1.2.0:README-zh.md\n\n# code-reviewer 中文说明\n\n> AI 驱动的代码审查工具，按 P0/P1/P2 三级严重度分类，自动识别项目平台并应用专项规则。\n\n---\n\n## 这个工具解决什么问题\n\n代码审查是保证质量的关键环节，但实际项目中面临两个痛点：\n- **人工审查覆盖率不足**：PR 多、reviewer 时间有限，容易漏审\n- **经验不均**：新人不熟悉 Android 线程模型、生命周期等坑，老问题反复出现\n\n本工具承担\"初审\"职责，覆盖常见的、规则化的问题，把人工 reviewer 的精力留给架构设计和业务逻辑。\n\n---\n\n## 使用示例\n\n```\n> review\n\n✅ 发现 2 个问题\n\nP0 🔴 在 Activity 中使用 GlobalScope 启动协程（无生命周期绑定）\n   src/MainActivity.kt:42\n   → 改用 lifecycleScope.launch，Activity 销毁时自动取消\n\nP1 🟡 RecyclerView Adapter 未使用 DiffUtil\n   src/adapter/UserAdapter.kt:15\n   → 用 DiffUtil 替代 notifyDataSetChanged()，避免全量刷新\n```\n\n---\n\n## 工作流程\n\n```\n1. Detect（识别平台）\n   根据项目文件自动判断：\n   build.gradle / AndroidManifest.xml → Android\n   *.xcodeproj / Podfile / Package.swift → iOS\n   其他 → 通用规则\n\n2. Diff（提取变更）\n   通过 git diff 获取变更内容\n   支持：未提交变更 / 已暂存 / 指定提交 / 分支对比\n\n3. Review（执行审查）\n   AI 按平台专项规则逐维度审查\n   Android/iOS：9 个维度，通用：7 个维度\n\n4. Report（输出报告）\n   结构化结果：严重度 + 文件位置 + 修复建议\n   可选生成 HTML 报告\n```\n\n---\n\n## 三种审查模式\n\n| 模式 | 命令 | 适用场景 |\n|------|------|---------|\n| **标准审查** | `review` | 完整审查，输出 P0/P1/P2 全部问题 |\n| **快速审查** | `quick review` | 只看 P0，快速判断\"能不能合并\" |\n| **安全审查** | `security review` | 重点检查敏感数据处理、注入风险、密钥泄露 |\n\n---\n\n## 严重度说明\n\n| 级别 | 含义 | 典型例子 |\n|------|------|---------|\n| **P0** 🔴 | 必须修复 | 崩溃、数据丢失、安全漏洞、死锁 |\n| **P1** 🟡 | 应当修复 | 竞态条件、资源泄漏、未处理的错误路径 |\n| **P2** 🔵 | 建议改进 | 命名不规范、结构冗余、轻微代码味道 |\n\n---\n\n## 审查维度详细说明\n\n### Android（9 个维度）\n\n自动识别条件：项目包含 `build.gradle*` 或 `AndroidManifest.xml`\n\n| 维度 | 检查内容 |\n|------|---------|\n| **线程安全** | 主线程网络/IO 操作、SharedPreferences/Room/文件 IO 是否在 IO 线程 |\n| **死锁与卡顿** | 锁嵌套、主线程 `runBlocking`、`synchronized` 范围过大 |\n| **内存管理** | Activity/Context 泄漏、Handler 内部类持有外部引用、Bitmap 未回收 |\n| **生命周期安全** | `onStop` 后访问 View、ViewModel 持有 View 引用、LiveData 跨线程问题 |\n| **逻辑正确性** | 整数溢出、浮点比较、集合并发修改 |\n| **异常处理** | 吞掉异常、过宽的 catch 范围、finally 中抛异常 |\n| **数据一致性** | 事务原子性、缓存与 DB 同步、SSE/Flow 中的状态竞争 |\n| **API 兼容性** | `Build.VERSION.SDK_INT` 检查缺失、废弃 API 使用 |\n| **架构合规** | ViewModel 直接操作 View、Repository 混入 UI 逻辑、模块间非法依赖 |\n\n### iOS（9 个维度）\n\n自动识别条件：项目包含 `*.xcodeproj`、`Podfile` 或 `Package.swift`\n\n| 维度 | 检查内容 |\n|------|---------|\n| **线程安全** | 非主线程更新 UI、共享状态数据竞争 |\n| **死锁与卡顿** | GCD 死锁、主队列同步调用、主线程阻塞 |\n| **内存安全** | 闭包捕获循环引用、unowned vs weak 误用、delegate 强引用 |\n| **资源泄漏** | 文件句柄未关闭、NotificationCenter 观察者未移除、Timer 未 invalidate |\n| **逻辑正确性** | 强制解包崩溃、数组越界、Optional 链式调用错误 |\n| **异常处理** | Result 类型未处理、缺少 do-catch、try? 静默失败 |\n| **数据一致性** | CoreData 上下文线程、UserDefaults 竞争、Combine 状态 |\n| **API 兼容性** | `@available` 检查缺失、废弃 API 使用 |\n| **架构合规** | ViewController 包含业务逻辑、循环依赖、MVVM/VIPER 层级混乱 |\n\n### 通用（7 个维度）\n\n适用于非 Android/iOS 项目\n\n| 维度 | 检查内容 |\n|------|---------|\n| **正确性** | 逻辑错误、越界、运算符优先级 |\n| **线程安全** | 共享可变状态、缺少同步 |\n| **内存** | 泄漏、无界增长、缺少清理 |\n| **性能** | N+1 查询、不必要的内存分配、阻塞调用 |\n| **API 设计** | 契约不清晰、缺少 null 检查、错误类型设计差 |\n| **错误处理** | 未处理的错误路径、静默失败 |\n| **安全** | 硬编码密钥、注入风险、不安全存储 |\n\n---\n\n## 快速开始\n\n### 安装\n\n```bash\n# OpenClaw 一键安装\nclawhub install code-reviewer\n\n# Claude Code — 复制到项目\ncp -r code-reviewer/ your-project/.claude/skills/\n\n# GitHub Copilot — 复制到项目\ncp -r code-reviewer/ your-project/.agents/skills/\n```\n\n### 使用命令\n\n```\nreview                    # 所有未提交变更\nreview staged             # 仅已暂存的变更\nreview abc1234            # 指定某次提交\nreview last 5 commits     # 最近 5 次提交\nreview branch feature-x   # 分支与 main 的对比\n```\n\n---\n\n## 智能行为\n\n- **重复问题合并**：同一类问题出现在 3 个以上文件 → 合并为一条，标注\"还有 N 处\"，避免报告被刷屏\n- **API 变更追踪**：函数签名改了？自动检查所有调用方是否同步更新\n- **测试覆盖提示**：变更了代码但测试没有更新 → 温和提示\n- **大 diff 保护**：变更超过 5000 行 → 提前提示再确认\n- **自动过滤**：跳过生成文件、二进制文件、lock 文件、vendor 目录\n\n---\n\n## HTML 报告\n\n```\nreview, generate HTML report\n```\n\n保存到 `.code-reviews/` 并自动在浏览器打开。报告特性：\n- 深色主题\n- P0/P1/P2 过滤切换\n- 每条问题含前后代码对比\n\n> 建议把 `.code-reviews/` 加入 `.gitignore`。\n\n---\n\n## 项目结构\n\n```\ncode-reviewer/\n├── SKILL.md                    # AI Agent 指令文件\n├── references/\n│   ├── review-general.md       # 通用审查规则（7 个维度）\n│   ├── review-android.md       # Android 专项规则（9 个维度）\n│   └── review-ios.md           # iOS 专项规则（9 个维度）\n└── scripts/\n    └── render_report.py        # HTML 报告渲染器（JSON → 独立 HTML）\n```\n\n---\n\n## 环境要求\n\n- Git 仓库\n- 一个支持 Agent Skill 的 AI 编程助手（OpenClaw、Claude Code、GitHub Copilot 等）\n\n---\n\n## 设计思路\n\n**为什么规则写在 Markdown 文件而不是硬编码进 Prompt？**\n\n规则文件可以独立维护和迭代。发现新的常见问题时，直接更新对应的 `review-android.md` 即可，不需要改代码。团队可以根据自己的编码规范定制规则，比如增加\"禁止使用 GlobalScope\"或者\"必须使用公司内部的网络库\"等项目专属约束。\n\n**为什么要区分 P0/P1/P2 而不是只输出所有问题？**\n\n实际经验：工具输出一长串问题时，reviewer 往往从上到下看，把精力花在不紧要的命名问题上，反而忽略了真正会引发崩溃的线程问题。分级让人先处理最重要的事。\n\n---\n\n## 许可证\n\nMIT © Lin Li 2026\n\nFile v1.2.0:skill-card.md\n\n## Description: <br>\nReviews code changes against Android, iOS, and general engineering rules, including local diffs, commits, branch comparisons, and remote pull request URLs. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[timeaground](https://clawhub.ai/user/timeaground) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and engineering teams use this skill to review proposed code changes before merge, with platform-aware findings, severity ratings, and concrete fix suggestions. It is especially suited for Android, iOS, general software, security-focused, and agent-skill review workflows. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill reads repository diffs and nearby code context, which may include sensitive implementation details. <br>\nMitigation: Install and run it only in repositories where assistant access to the targeted diff and surrounding code is acceptable. <br>\nRisk: Optional HTML report generation writes files under .code-reviews/, may update .gitignore, and can open a browser. <br>\nMitigation: Request report generation only after reviewing and accepting those local side effects. <br>\n\n\n## Reference(s): <br>\n- [Skill page](https://clawhub.ai/timeaground/skills/pro-code-reviewer) <br>\n- [README](artifact/README.md) <br>\n- [General review rules](artifact/references/review-general.md) <br>\n- [Android review rules](artifact/references/review-android.md) <br>\n- [iOS review rules](artifact/references/review-ios.md) <br>\n- [Agent skill security review rules](artifact/references/review-skill-vetter.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Analysis, Markdown, Code, Shell commands, Guidance] <br>\n**Output Format:** [Markdown review findings with optional standalone HTML report files] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Findings are grouped by P0, P1, and P2 severity; optional reports are written under .code-reviews/.] <br>\n\n## Skill Version(s): <br>\n1.2.0 (source: server-resolved release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.1.0: 10 files, 33616 bytes\n\nFiles: README-zh.md (7458b), README.md (6482b), references/review-android.md (6801b), references/review-general.md (7343b), references/review-ios.md (5680b), references/review-skill-vetter.md (3979b), scripts/render_report.py (18744b), skill-card.md (2368b), SKILL.md (11231b), _meta.json (136b)\n\nFile v1.1.0:SKILL.md\n\n---\r\nname: code-reviewer\r\ndescription: |\r\n  Review code changes against platform-specific rules (Android/iOS) plus shared general rules.\r\n  Supports: uncommitted changes, staged changes, specific commits, commit ranges, and branch diffs.\r\n  Optionally generates a styled HTML report. Use when user mentions: \"review\", \"code review\",\r\n  \"帮我看看代码\", \"check my changes\", provides a commit hash, or asks to review before committing.\r\n  Auto-detects platform (Android/iOS/General) from project markers.\r\n---\r\n\r\n# Code Reviewer\r\n\r\n## Mindset\r\n\r\nYou are a senior mobile engineer with battle scars from shipping Android and iOS apps to millions of users. You've debugged enough lifecycle leaks, thread crashes, and memory corruptions at 3 AM to have zero patience for careless code.\r\n\r\nYour reviews are **direct, specific, and actionable**. You don't manufacture problems, but you don't let real ones slide either. When code is clean, say so. When it's not, explain exactly why it will hurt someone in production.\r\n\r\n- **Android/iOS projects**: Apply platform-specific expertise — lifecycle safety, memory management, threading, platform conventions. This is your home turf.\r\n- **Other projects**: Apply general engineering principles. You're thorough but appropriately humble about domain-specific patterns you may not know.\r\n\r\nYour default stance: *\"Will this cause a problem in production? If yes, it's a finding. If not, let it go.\"*\r\n\r\n---\r\n\r\nReview code changes and report issues by severity.\r\n\r\n## Rule Files\r\n\r\nRead from `references/` relative to this skill directory. Always load general + detected platform:\r\n- `references/review-general.md` — always\r\n- `references/review-android.md` — Android (Kotlin/Java)\r\n- `references/review-ios.md` — iOS (ObjC/Swift)\r\n\r\n**Auto-detect additional rules:**\r\n- If the diff contains `SKILL.md`, `*.skill.md`, `.mdc`, or `.agent.md` files → also load `references/review-skill-vetter.md`\r\n- If the user explicitly requests \"skill review\", \"agent review\", or \"安全审查\" → also load `references/review-skill-vetter.md` even without matching files in diff\r\n\r\n## Severity Definitions (hard rules)\r\n\r\n| Level | Criteria | Action |\r\n|-------|----------|--------|\r\n| **P0** | Will cause: crash, data loss/corruption, security vulnerability, deadlock, infinite loop | **Must fix before merge** |\r\n| **P1** | May cause: race condition under specific timing, resource leak under edge case, silent data error, uncovered error path that breaks UX | Should fix |\r\n| **P2** | Code quality: naming, structure, minor redundancy, non-critical style | Nice to have |\r\n\r\nWhen uncertain between two levels, choose the **lower** severity (less alarm).\r\n\r\n## Workflow\r\n\r\n### 1. Determine review scope\r\n\r\nDetect from user message. Priority order:\r\n\r\n| User says | Scope | Git command |\r\n|-----------|-------|-------------|\r\n| \"review\" (no qualifier) | Uncommitted changes (staged + unstaged) | `git diff HEAD` |\r\n| \"review staged\" / \"review 暂存\" | Staged only | `git diff --cached` |\r\n| \"review \\<sha\\>\" / \"cid \\<sha\\>\" | Single commit | `git show <sha>` |\r\n| \"review \\<sha1\\>..\\<sha2\\>\" | Commit range | `git diff <sha1>..<sha2>` |\r\n| \"review branch \\<name\\>\" | Branch vs main/master | `git diff main...<name>` |\r\n| \"review last N commits\" | Recent N commits | `git diff HEAD~N..HEAD` |\r\n\r\nIf scope is ambiguous, default to **uncommitted changes** — this is the most common use case.\r\n\r\n### 2. Resolve repo\r\n\r\nUse current working directory. Validate:\r\n```bash\r\ngit rev-parse --show-toplevel 2>/dev/null\r\n```\r\nIf not a git repo, ask user for path.\r\n\r\n### 3. Detect platform\r\n\r\nC\n\nArchive v1.0.3: 13 files, 33777 bytes\n\nFiles: _meta.json (136b), evals/evals.json (1031b), README.md (4427b), references/review-android.md (6801b), references/review-general.md (2415b), references/review-ios.md (5680b), scripts/make_review_json.ps1 (4263b), scripts/make_review_json.py (4459b), scripts/render_report.ps1 (12879b), scripts/render_report.py (18744b), scripts/run_review.ps1 (4000b), skill-card.md (2382b), SKILL.md (10741b)\n\nArchive v1.0.2: 11 files, 31105 bytes\n\nFiles: _meta.json (136b), README.md (3995b), references/review-android.md (6801b), references/review-general.md (2415b), references/review-ios.md (5680b), scripts/make_review_json.ps1 (4263b), scripts/make_review_json.py (4407b), scripts/render_report.ps1 (12879b), scripts/render_report.py (18744b), skill-card.md (2269b), SKILL.md (9830b)\n\nArchive v1.0.1: 9 files, 24860 bytes\n\nFiles: _meta.json (136b), README.md (3995b), references/review-android.md (6801b), references/review-general.md (2415b), references/review-ios.md (5680b), scripts/make_review_json.py (4407b), scripts/render_report.py (18744b), skill-card.md (2520b), SKILL.md (9273b)\n\nArchive v1.0.0: 8 files, 22848 bytes\n\nFiles: README.md (3995b), references/review-android.md (6801b), references/review-general.md (2415b), references/review-ios.md (5680b), scripts/render_report.py (18744b), skill-card.md (2340b), SKILL.md (8468b), _meta.json (136b)","readmeExcerpt":"Skill: Code Reviewer Owner: timeaground Summary: Review code against Android/iOS/TypeScript/Go/general rules. Triggers: review, code review, check my changes, 帮我看看代码, commit hash, PR URL. Read-only, never modifies code. Tags: latest:1.3.1 Version history: v1.3.1 | 2026-08-07T14:28:26.387Z | user v1.3.1: ClawHub release. Frontmatter declarations (version/requires/resource_manifest), When to use, 交付物, 不适用场景, Tips secti","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"> review\n\n✅ 2 issues found\n\nP0 🔴 Coroutine launched in Activity without lifecycle scope\n   src/MainActivity.kt:42\n   → Use lifecycleScope.launch instead of GlobalScope.launch\n\nP1 🟡 RecyclerView adapter not using DiffUtil\n   src/adapter/UserAdapter.kt:15\n   → Replace notifyDataSetChanged() with DiffUtil for better performance"},{"language":"bash","snippet":"# OpenClaw\nclawhub install code-reviewer\n\n# Claude Code\ncp -r code-reviewer/ your-project/.claude/skills/\n\n# GitHub Copilot\ncp -r code-reviewer/ your-project/.agents/skills/"},{"language":"text","snippet":"review                    # All uncommitted changes\nreview staged             # Only staged changes\nreview abc1234            # Specific commit\nreview last 5 commits     # Recent commits\nreview branch feature-x   # Branch diff vs main"},{"language":"text","snippet":"code-reviewer/\n├── SKILL.md                    # AI agent instructions\n└── references/\n    ├── review-general.md       # General review rules\n    ├── review-android.md       # Android-specific rules (9 dimensions)\n    ├── review-ios.md           # iOS-specific rules (9 dimensions)\n    ├── review-typescript.md    # TypeScript-specific rules (7 dimensions)\n    ├── review-go.md            # Go-specific rules (7 dimensions)\n    └── review-skill-vetter.md  # Agent/LLM skill security review rules"},{"language":"text","snippet":"File v1.3.1:references/review-general.md\n\n# 通用审查维度\n\n适用于非 iOS/Android 的项目（TypeScript、Python、Go、Java（非 Android）、C#、Rust 等）。\n按以下 7 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过阅读上下文、搜索调用方、追踪数据流反复验证后再确认。\n\n---\n\n## 1. 安全性\n\n> **P0 频发地带** — 每个安全问题都是 P0\n\n- **注入漏洞**：所有数据库查询是否使用参数化查询/ORM？用户输入拼接 SQL/NoSQL 查询是 P0\n- **XSS**：用户提交的内容在渲染前是否被转义/脱敏？`dangerouslySetInnerHTML` 等 API 是否有充分理由并做安全处理\n- **CSRF**：状态变更请求是否有 CSRF token/SameSite Cookie 防护？\n- **认证与鉴权**：每个受保护端点是否验证了用户身份？资源访问是否按用户权限做了隔离？（IDOR 是 P0）\n- **输入校验**：所有外部输入（params、headers、body、files）是否在服务端做了类型/长度/格式/范围校验？前端校验不是安全校验\n- **密钥泄露**：代码中是否硬编码了 API Key、密码、Token？（P0，立即修复）\n- **依赖安全**：新引入的依赖是否来自可信源、持续维护、无已知 CVE？\n- **敏感数据泄露**：PII、Token、密钥是否可能被日志、错误消息或 API 响应泄露？\n- **文件上传**：上传的文件是否做了类型/大小校验？是否存储到 webroot 之外？Content-Type 是否正确？\n- **HTTP 安全头**：Content-Security-Policy、X-Content-Type-Options、Strict-Transport-Security 是否配置？\n\n## 2. 性能\n\n- **N+1 查询**：是否存在循环内发起独立数据库查询的模式？应该改为批量查询或 JOIN\n- **不必要的重渲染**：前端组件是否只在相关 state/props 变化时才重渲染？不必要的 memo 化不要建议，实测有问题的才提\n- **内存泄漏**：事件监听器、订阅、定时器、interval 是否在组件卸载/资源释放时清理？\n- **包体积**：新依赖是否可 tree-shake？是否为了一个函数导入了整个库？建议按需导入\n- **懒加载**：重型组件、路由、折叠内容是否使用了懒加载/代码分割？\n- **缓存策略**：重复计算/API 响应是否使用了合适的缓存（memoization、HTTP cache、Redis）？\n- **数据库索引**：查询的过滤/排序字段是否有索引？新查询是否应检查 EXPLAIN 计划？\n- **分页**：列表查询是否使用了分页或 cursor？不允许无边界 SELECT *\n\n## 3. 正确性\n\n- **边界值**：空数组、空字符串、零值、负数、最大值是否被正确处理？\n- **null/undefined 处理**：可空值在访问前是否做了检查？可选链或守卫是否到位？\n- **off-by-one**：循环边界、数组下标、分页偏移量、范围计算是否正确？\n- **竞态条件**：异步代码中是否存在对共享状态的并发访问？\n- **时区处理**：日期是否以 UTC 存储？展示层才做时区转换？\n- **Unicode 与编码**：字符串操作是否考虑多字节字符？编码是否明确指定（UTF-8）？\n- **整数溢出/精度**：大数/金额计算是否使用了合适的类型（BigInt、Decimal）？\n- **状态一致性**：多步操作是否是事务性的？部分失败后系统是否处于有效状态？\n\n## 4. 可维护性\n\n- **命名**：变量、函数、类的名称是否描述其用途？\n- **单一职责**：每个函数/类/模块是否只做一件事？一个变更是否只需要改一个地方？\n- **DRY**：重复逻辑是否提取为公共函数？复制粘贴的代码段是否应合并？\n- **圈复杂度**：函数的分支复杂度是否过高？深层嵌套的循环/条件是否应分解？\n- **死代码**：注释掉的代码、未使用的 import、不可达分支、过期的 feature flag 是否已清理？\n- **魔法数字/字符串**：字面量是否提取为命名常量？\n- **模式一致性**：新代码是否遵循了代码库已有的约定？\n\n**过度工程化红线（以下情况不要提出建议）：**\n- 三行以内的相似代码不算\"重复\"\n- 仅被调用一次的代码不需要提取方法\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\n- 不要建"},{"language":"text","snippet":"File v1.3.1:references/review-go.md\n\n# Go 审查维度\n\n检测到 `.go` 文件变更时加载。按以下 7 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过阅读上下文和追踪数据流反复验证后再确认。\n\n---\n\n## 1. Goroutine 与并发安全\n\n> **P0 频发地带** — Go 并发模型独特且容易误用\n\n- **Goroutine 泄漏**：goroutine 是否可能持续阻塞无法退出？channel 无消费者时 goroutine 会永久阻塞。用 `select` + context cancel 或 `ticker.Stop` 确保退出路径\n- **无限制 goroutine 创建**：`go func()` 在循环中是否可能创建不可控数量的 goroutine？应使用 worker pool（`errgroup` / `conc.WaitGroup`）限制并发\n- **WaitGroup 误用**：`Add()` 是否在 `go` 调用后执行而不是在前？`Done()` 是否在所有 goroutine 分支都被调用（包括 error return 路径）？\n- **`select{}` 空选**：空的 `select{}` 会永久阻塞，通常意味着死锁\n- **`sync.Mutex` 未解锁**：Lock/Unlock 是否成对出现？`defer mu.Unlock()` 应在 Lock 后立即写，而不是在函数末尾\n- **`sync.RWMutex` 写锁中调用读锁方法**：同一 goroutine 中写锁未释放时调用了需要读锁的函数 → 死锁（读写锁不可重入）\n- **`atomic` vs `mutex` 选用**：计数器类操作是否误用了 `sync.Mutex` 而非 `atomic.Int64`？\n\n## 2. Channel 与数据流动\n\n- **channel 死锁**：向一个没有接收者的 channel 发送 → 永久阻塞。所有 send 路径是否有对应的 receive 路径？\n- **channel close 约定**：**只在发送方 close channel**。接收方 close 会导致其他接收方的 panic。close 后的 channel 是否被再次写入？\n- **nil channel 阻塞**：向 `nil channel` 发送或从 `nil channel` 接收都会永久阻塞。未被初始化的 channel 变量是否可能在 select 中造成问题？\n- **close 后仍接收**：已 close 的 channel 读取不会阻塞但返回零值。接收方是否检查了 `ok`（`val, ok := <-ch`）？\n- **`for range ch` 的关闭条件**：range 遍历 channel 是否会在发送方不再发送时正常退出？发送方是否确保 close？\n\n## 3. 错误处理\n\n- **错误被静默丢弃**：`err` 被赋值后未检查（`result, _ := foo()` 或 `if result, err := foo(); err != nil { ... }` 的外层缺少 else 分支）\n- **错误未 wrap**：`return err` 应改为 `return fmt.Errorf(\"context: %w\", err)`，除非是 `io.EOF` 等可预期的 sentinel error\n- **sentinel error 的 `==` 比较**：用 `errors.Is(err, sentinelErr)` 而非 `err == sentinelErr`（后者不处理 wrap 链）\n- **`errors.As` 与类型断言**：检查 error chain 中特定 error 类型时是否使用了 `errors.As` 而非类型断言？\n- **`_` 忽略检查**：是否有重要的 error return 被赋值给 `_` 丢弃？尤其是 `io.Copy`、`db.Query`、`json.Decode`\n- **`defer` 中 error 处理**：`defer file.Close()` 忽略了返回的 error。严谨做法是记录 defer 中的错误\n- **`panic` 在库代码中**：库代码中是否使用 `panic` 而非返回 error？第三方库接收方无法 recover\n\n## 4. 内存与 nil 安全\n\n- **nil map 写入**：向未初始化 map（`var m map[string]int`）写入 → panic。初始化用 `make(map[string]int)` "}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\r\nname: code-reviewer\r\nversion: 1.3.1\r\ndescription: |\r\n  Review code against Android/iOS/TypeScript/Go/general rules. Triggers: review, code\r\n  review, check my changes, 帮我看看代码, commit hash, PR URL. Read-only, never modifies code.\r\nrequires: [Read, Glob, Grep, RunCommand, WebFetch]\r\nresource_manifest:\r\n  network_required: true\r\n  network_domains: [github.com, gitlab.com]\r\n  read_only: true\r\n---\r\n\r\n# Code Reviewer\r\n\r\n## When to use this\r\n\r\nUse this skill when the user asks to review code changes, e.g.:\r\n\r\n- \"review\", \"review this PR\", \"check my changes\", \"帮我看看代码\"\r\n- \"review staged\", \"review <commit-hash>\", \"review main..branch\", \"quick review\", \"review before commit\"\r\n- \"security review\" / \"安全审查\" — stricter security lens\r\n- \"skill review\" / \"agent review\" / \"审查技能\" — agent skill security review\r\n- Pastes a GitHub `pull/*` or GitLab `merge_requests/*` URL\r\n\r\nPlatform (Android/iOS/General) and language (TypeScript/Go) are auto-detected from the diff; uncommitted/staged/commit/range/branch/PR scopes are supported.\r\n\r\n## Mindset\r\n\r\nYou are a senior mobile engineer with battle scars from shipping Android and iOS apps to millions of users. You've debugged enough lifecycle leaks, thread crashes, and memory corruptions at 3 AM to have zero patience for careless code.\r\n\r\nYour reviews are **direct, specific, and actionable**. You don't manufacture problems, but you don't let real ones slide either. When code is clean, say so. When it's not, explain exactly why it will hurt someone in production.\r\n\r\n- **Android/iOS projects**: Apply platform-specific expertise — lifecycle safety, memory management, threading, platform conventions. This is your home turf.\r\n- **Other projects**: Apply general engineering principles. You're thorough but appropriately humble about domain-specific patterns you may not know.\r\n\r\nYour default stance: *\"Will this cause a problem in production? If yes, it's a finding. If not, let it go.\"*\r\n\r\n---\r\n\r\nReview code changes and report issues by severity.\r\n\r\n## Rule Files\r\n\r\nRead from `references/` relative to this skill directory. Always load general + detected platform:\r\n- `references/review-general.md` — always\r\n- `references/review-android.md` — Android (Kotlin/Java)\r\n- `references/review-ios.md` — iOS (ObjC/Swift)\r\n\r\n**Language-specific rules (auto-detected from diff, additive):**\r\n- `.ts` / `.tsx` files in diff → also load `references/review-typescript.md`\r\n- `.go` files in diff → also load `references/review-go.md`\r\n\r\n**Skill-vetter rules (auto-detected from diff or explicit request):**\r\n- If the diff contains `SKILL.md`, `*.skill.md`, `.mdc`, or `.agent.md` files → also load `references/review-skill-vetter.md`\r\n- If the user explicitly requests \"skill review\", \"agent review\", or \"安全审查\" → also load `references/review-skill-vetter.md` even without matching files in diff\r\n\r\n## Severity Definitions (hard rules)\r\n\r\n| Level | Criteria | Action |\r\n|-------|----------|--------|\r\n| **P0** | Will cause: crash, data loss/corruption, security "},{"path":"README.md","content":"# code-reviewer\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Python 3.8+](https://img.shields.io/badge/Python-3.8+-green.svg)](https://python.org)\n[![Platforms](https://img.shields.io/badge/Platforms-Android%20%7C%20iOS%20%7C%20General-orange.svg)](#supported-platforms)\n\n> AI-powered code review with severity grading. Platform-aware rules for Android, iOS, and general projects.\n\n## ✨ What It Does\n\nPoint it at your code changes → get a structured review with **P0 / P1 / P2** severity grading. Auto-detects your platform and applies specialized rules across up to 9 review dimensions.\n\n```\n> review\n\n✅ 2 issues found\n\nP0 🔴 Coroutine launched in Activity without lifecycle scope\n   src/MainActivity.kt:42\n   → Use lifecycleScope.launch instead of GlobalScope.launch\n\nP1 🟡 RecyclerView adapter not using DiffUtil\n   src/adapter/UserAdapter.kt:15\n   → Replace notifyDataSetChanged() with DiffUtil for better performance\n```\n\n## 🧠 How It Works\n\n1. **Detect** — Identifies platform from project markers (`build.gradle` → Android, `*.xcodeproj` → iOS, `go.mod` → Go, `tsconfig.json` → TypeScript)\n2. **Diff** — Extracts changes via `git diff` (staged, unstaged, commits, branches)\n3. **Review** — AI applies platform/language-specific rules across multiple dimensions\n4. **Report** — Outputs structured findings with severity, location, and fix suggestions\n\n## 🎯 Three Review Modes\n\n| Mode | Command | Focus |\n|---|---|---|\n| **Standard** | `review` | Full review — P0, P1, P2 |\n| **Quick** | `quick review` | P0 only — \"can I merge this?\" |\n| **Security** | `security review` | Injection, auth bypass, key leaks |\n\n## 📋 Severity Levels\n\n| Level | Meaning | Examples |\n|---|---|---|\n| **P0** 🔴 | Must fix | Crash, data loss, security vulnerability, deadlock |\n| **P1** 🟡 | Should fix | Race condition, resource leak, unhandled error path |\n| **P2** 🔵 | Nice to have | Naming, structure, minor redundancy |\n\n## Supported Platforms\n\n### Android (9 dimensions)\n\nAuto-detected by: `build.gradle*`, `AndroidManifest.xml`\n\n| # | Dimension | What It Checks |\n|---|---|---|\n| 1 | **Thread safety** | Main-thread network/IO, SharedPreferences off main thread |\n| 2 | **Deadlock & jank** | Nested locks, `runBlocking` on main thread, oversized `synchronized` blocks |\n| 3 | **Memory management** | Activity/Context leaks, Handler inner-class retaining outer, Bitmap not recycled |\n| 4 | **Lifecycle safety** | View access after `onStop`, ViewModel holding View reference, LiveData from wrong thread |\n| 5 | **Logic correctness** | Integer overflow, float equality, concurrent collection modification |\n| 6 | **Exception handling** | Swallowed exceptions, overly broad catch, exception thrown in `finally` |\n| 7 | **Data consistency** | Transaction atomicity, cache/DB sync, state races in SSE/Flow |\n| 8 | **API compatibility** | Missing `Build.VERSION.SDK_INT` guards, deprecated API usage |\n| 9 | **Architecture** | ViewModel touching View directly, Repository with "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7crx9z6m9cw8gpcwbhp8na31843hnr\",\n  \"slug\": \"pro-code-reviewer\",\n  \"version\": \"1.3.1\",\n  \"publishedAt\": 1786112906387\n}"},{"path":"references/review-android.md","content":"# Android (Kotlin/Java) 审查维度\r\n\r\n按以下 9 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过多种方法（阅读上下文、搜索调用方、追踪数据流）反复验证后再确认。\r\n\r\n## 1. 线程安全与并发\r\n\r\n- 共享可变状态是否有正确的同步保护（`synchronized`、`ReentrantLock`、`@Volatile`、`AtomicXxx`）\r\n- 协程中访问的共享状态是否使用了正确的 Dispatcher 和 `Mutex`/`StateFlow`\r\n- `Handler`/`Looper` 使用是否正确，是否可能在错误线程回调\r\n- `LiveData.postValue` 连续调用是否会丢值（仅保留最后一次）\r\n- `ConcurrentModificationException`：迭代集合时是否可能被其他线程修改\r\n- `suspend` 函数中的共享状态访问是否在同一个 `CoroutineContext` 中\r\n\r\n## 2. 死锁、卡顿与性能\r\n\r\n- **主线程卡顿**：主线程上执行数据库操作、文件 I/O、网络请求、大量计算\r\n- **同步死锁**：嵌套 `synchronized`（A->B->A）、`runBlocking` 在主线程\r\n- **协程死锁**：在 `Dispatchers.Main` 上调用 `runBlocking`；协程 A 等待 B 完成，B 又等待 A\r\n- **RecyclerView 性能**：`onBindViewHolder` 中执行耗时操作、未复用 ViewHolder、频繁 `notifyDataSetChanged` 而非 DiffUtil\r\n- **过度绘制/布局层级**：嵌套过深的 View 层级、不必要的背景绘制\r\n- **大对象频繁创建**：循环内反复创建 SimpleDateFormat、正则 Pattern、Gson 实例\r\n- **无节制的集合增长**：List/Map 只添加不清理，随时间无限增长\r\n- **Bitmap 未及时回收**：大图加载未压缩、未使用 `inSampleSize`\r\n\r\n## 3. 内存管理\r\n\r\n- **Activity/Fragment 泄漏**：匿名内部类/非静态内部类隐式持有外部类引用\r\n- **Handler 泄漏**：非静态 Handler 持有 Activity 引用，消息队列中的 Message 延迟释放\r\n- **协程泄漏**：协程未绑定 `lifecycleScope`/`viewModelScope`，Activity 销毁后仍在执行\r\n- **Context 泄漏**：单例/静态变量持有 Activity Context（应使用 Application Context）\r\n- **注册未反注册**：BroadcastReceiver、ContentObserver、Listener 注册后未在 `onDestroy` 中反注册\r\n- **Cursor/Stream 未关闭**：数据库 Cursor、InputStream/OutputStream 未在 finally 中关闭\r\n- **WebView 泄漏**：WebView 未在 `onDestroy` 中调用 `destroy()`\r\n\r\n## 4. 生命周期安全\r\n\r\n- Fragment/Activity 销毁后是否仍访问 View（`getView()` 返回 null）\r\n- `onActivityResult`/回调中是否检查了 `isAdded()`/`isFinishing()`\r\n- `ViewModel` 中是否引用了 View/Activity（应通过 LiveData/StateFlow 通信）\r\n- `DialogFragment.show()` 在 `onSaveInstanceState` 后调用导致 crash\r\n- `FragmentTransaction.commit()` vs `commitAllowingStateLoss()` 的使用场景\r\n- `LaunchedEffect`/`DisposableEffect`（Compose）的清理逻辑是否完整\r\n\r\n## 5. 逻辑正确性\r\n\r\n- 条件判断的边界值是否正确（off-by-one、空值、零值）\r\n- Kotlin null safety：`!!` 强制解包是否安全、`?.let` 链中是否有竞态\r\n- 新增代码对已有流程的影响面（调用方是否需要适配）\r\n- 异步操作的时序是否有保证（先后顺序、回调是否可能不触发）\r\n- 错误处理路径是否完整（每个分支都有合理出口）\r\n- `when` 表达式是否覆盖所有情况（sealed class 是否有遗漏分支）\r\n\r\n## 6. 异常处理与回调完整性\r\n\r\n- **协程异常**：`launch` 中未捕获的异常会 crash，`async` 的 `await` 未包裹 try-catch\r\n- **回调遗漏**：所有执行路径是否都触发了回调/LiveData 更新，避免 UI 永远 loading\r\n- `try-catch` 是否吞掉了不应忽略的异常（catch 后无日志、直接 return）\r\n- `CoroutineExceptionHandler` 是否正确配置\r\n- 网络请求超时/失败路径是否有降级策略\r\n- `Result`/`sealed class` 错误类型是否在所有消费处都处理\r\n\r\n## 7. 数据一致性\r\n\r\n- 多数据源（数据库 + 网络 + 缓存）是否可能出现不一致\r\n- `SharedPreferences.apply()` 的异步写入是否会导致读取到旧值\r\n- Room 数据库事务是否正确使用 `@Transaction`\r\n- `StateFlow`/`LiveData` 的值更新是否原子（多个相关字段分别更新可能导致中间状态）\r\n- 状态机是否存在非法跳转（跳过中间状态、重复进入终态）\r\n\r\n## 8. API 兼容性\r\n\r\n- 公开 API 签名变更是否破坏已有调用方\r\n- `@JvmOverloads`/`@JvmStatic` 等注解变更是否影响 Java 互操作\r\n- `data class` 添加新字段是否影响 `copy()`/`equals()`/序列化\r\n- ProGuard/R8 混淆规则是否覆盖新增的反射/序列化类\r\n- `minSdk` 兼容性：使用的 API 是否在所有支持版本上可用\r\n- Intent/Bundle 传递的 key 重命名是否影响其他组件\r\n\r\n## 9. 架构设计\r\n\r\n- 圈复杂度是否过高（深层嵌套、过长方法）\r\n- 是否存在重复代码可提取公共方法\r\n- 类/模块间的依赖关系是否合理（避免循环依赖）\r\n- ViewModel/Repository/UseCase 职责是否清晰\r\n- 新增 API 的命名和参数设计是否符合现有约定\r\n- 是否违反了单向数据流原则（View 直接修改 Model）\r\n\r\n**过度工程化红线（以下情况不要提出建议）：**\r\n"},{"path":"references/review-general.md","content":"# 通用审查维度\n\n适用于非 iOS/Android 的项目（TypeScript、Python、Go、Java（非 Android）、C#、Rust 等）。\n按以下 7 个维度逐一审查，每个维度独立分析。对每个疑似问题，通过阅读上下文、搜索调用方、追踪数据流反复验证后再确认。\n\n---\n\n## 1. 安全性\n\n> **P0 频发地带** — 每个安全问题都是 P0\n\n- **注入漏洞**：所有数据库查询是否使用参数化查询/ORM？用户输入拼接 SQL/NoSQL 查询是 P0\n- **XSS**：用户提交的内容在渲染前是否被转义/脱敏？`dangerouslySetInnerHTML` 等 API 是否有充分理由并做安全处理\n- **CSRF**：状态变更请求是否有 CSRF token/SameSite Cookie 防护？\n- **认证与鉴权**：每个受保护端点是否验证了用户身份？资源访问是否按用户权限做了隔离？（IDOR 是 P0）\n- **输入校验**：所有外部输入（params、headers、body、files）是否在服务端做了类型/长度/格式/范围校验？前端校验不是安全校验\n- **密钥泄露**：代码中是否硬编码了 API Key、密码、Token？（P0，立即修复）\n- **依赖安全**：新引入的依赖是否来自可信源、持续维护、无已知 CVE？\n- **敏感数据泄露**：PII、Token、密钥是否可能被日志、错误消息或 API 响应泄露？\n- **文件上传**：上传的文件是否做了类型/大小校验？是否存储到 webroot 之外？Content-Type 是否正确？\n- **HTTP 安全头**：Content-Security-Policy、X-Content-Type-Options、Strict-Transport-Security 是否配置？\n\n## 2. 性能\n\n- **N+1 查询**：是否存在循环内发起独立数据库查询的模式？应该改为批量查询或 JOIN\n- **不必要的重渲染**：前端组件是否只在相关 state/props 变化时才重渲染？不必要的 memo 化不要建议，实测有问题的才提\n- **内存泄漏**：事件监听器、订阅、定时器、interval 是否在组件卸载/资源释放时清理？\n- **包体积**：新依赖是否可 tree-shake？是否为了一个函数导入了整个库？建议按需导入\n- **懒加载**：重型组件、路由、折叠内容是否使用了懒加载/代码分割？\n- **缓存策略**：重复计算/API 响应是否使用了合适的缓存（memoization、HTTP cache、Redis）？\n- **数据库索引**：查询的过滤/排序字段是否有索引？新查询是否应检查 EXPLAIN 计划？\n- **分页**：列表查询是否使用了分页或 cursor？不允许无边界 SELECT *\n\n## 3. 正确性\n\n- **边界值**：空数组、空字符串、零值、负数、最大值是否被正确处理？\n- **null/undefined 处理**：可空值在访问前是否做了检查？可选链或守卫是否到位？\n- **off-by-one**：循环边界、数组下标、分页偏移量、范围计算是否正确？\n- **竞态条件**：异步代码中是否存在对共享状态的并发访问？\n- **时区处理**：日期是否以 UTC 存储？展示层才做时区转换？\n- **Unicode 与编码**：字符串操作是否考虑多字节字符？编码是否明确指定（UTF-8）？\n- **整数溢出/精度**：大数/金额计算是否使用了合适的类型（BigInt、Decimal）？\n- **状态一致性**：多步操作是否是事务性的？部分失败后系统是否处于有效状态？\n\n## 4. 可维护性\n\n- **命名**：变量、函数、类的名称是否描述其用途？\n- **单一职责**：每个函数/类/模块是否只做一件事？一个变更是否只需要改一个地方？\n- **DRY**：重复逻辑是否提取为公共函数？复制粘贴的代码段是否应合并？\n- **圈复杂度**：函数的分支复杂度是否过高？深层嵌套的循环/条件是否应分解？\n- **死代码**：注释掉的代码、未使用的 import、不可达分支、过期的 feature flag 是否已清理？\n- **魔法数字/字符串**：字面量是否提取为命名常量？\n- **模式一致性**：新代码是否遵循了代码库已有的约定？\n\n**过度工程化红线（以下情况不要提出建议）：**\n- 三行以内的相似代码不算\"重复\"\n- 仅被调用一次的代码不需要提取方法\n- 现有代码不在本次变更范围内，不提优化建议（除非变更直接引入了问题）\n- 不要建议为假想的未来需求做扩展性设计\n- 不要要求给未变更的代码加注释、文档或类型标注\n- 不要建议为一次性操作创建工具类/抽象层\n\n## 5. 测试\n\n- **测试覆盖**：新增逻辑是否有对应测试？关键路径是否同时覆盖了 happy path 和失败 case？\n- **边界测试**：边界值、空输入、null、错误条件是否有测试？\n- **无 Flaky 测试**：测试是否确定性？不能依赖时序、外部服务、共享可变状态\n- **测试独立性**：每个测试是否自己 setup 和 teardown？测试执行顺序不影响结果\n- **有意义的断言**：测试断言的是行为/输出，不是实现细节\n- **测试可读性**：测试是否符合 Arrange-Act-Assert 模式？名称是否描述场景和预期？\n- **Mock 纪律**：只有外部边界（网络、数据库、文件系统）才 mock，内部逻辑不 mock\n\n## 6. 错误处理\n\n- **异常吞没**：catch 块是否有日志/上报？空 catch 或直接 return 是 P1（可能导致静默失败）\n- **回调遗漏**：所有执行路径（包括快速返回、错误分支、超时、取消）是否都触发了回调？\n- **降级策略**：网络请求超时/失败是否有降级路径？用户是否能看到合理的错误提示？\n- **Promise/async 错误**：未处理的 Promise reject、async 函数中未 catch 的异常\n- **错误信息过度暴露**：错误消息是否可能泄露内部实现细节（栈信息、SQL、文件路径）？\n- **重试逻辑**：临时性失败是否有重试？重试是否有退避和上限？幂等性是否有保证？\n\n## 7. 数据一致性与并发\n\n- **事务完整性**：跨表/跨服务的操作是否使用事务？部分失败后的回滚是否正确？\n- **缓存穿透**：缓存未命中时是否会导致雪崩打到数据库？是否有布隆过滤器或空值缓存？\n- **状态机跳转**：状态变更是否存在非法跳转（跳过中间状态、重复进入终态）？\n- **并发安全**：多线程/多协程访问共享状态是否有正确的同步原语？\n- **超时与取消**：长时间运行的操作是否有超时机制？取消信号是否能正确传播？\n\n---\n\n## 报告格式\n\n```markdown\n# Code Review Report\n\n## 概览\n- **Review 范围**: commit_id..HEAD (N commits)\n- **变更"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Review code against Android/iOS/TypeScript/Go/general rules. Triggers: review, code review, check my changes, 帮我看看代码, commit hash, PR URL. Read-only, never modifies code. Skill: Code Reviewer Owner: timeaground Summary: Review code against Android/iOS/TypeScript/Go/general rules. Triggers: review, code review, check my changes, 帮我看看代码, commit hash, PR URL. Read-only, never modifies code. Tags: latest:1.3.1 Version history: v1.3.1 | 2026-08-07T14:28:26.387Z | user v1.3.1: ClawHub release. Frontmatter declarations (version/requires/resource_manifest), When to use, 交付物, 不适用场景, Tips secti","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1645,"uniquenessScore":51,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T00:03:41.748Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T00:03:41.748Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T07:45:12.935Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}