|
| 1 | +name: "Tabnine: Code Review" |
| 2 | +on: |
| 3 | + pull_request: |
| 4 | + types: [opened, synchronize, ready_for_review] |
| 5 | + |
| 6 | +jobs: |
| 7 | + code-review: |
| 8 | + runs-on: ubuntu-latest |
| 9 | + timeout-minutes: 30 # Prevent runaway jobs |
| 10 | + # Only run on certain conditions |
| 11 | + if: github.actor != 'dependabot[bot]' && github.actor != 'github-actions[bot]' && github.actor != 'TabnineCLI@tabnine.com' |
| 12 | + permissions: |
| 13 | + contents: read |
| 14 | + pull-requests: write |
| 15 | + steps: |
| 16 | + - name: Checkout repository |
| 17 | + uses: actions/checkout@v4 |
| 18 | + with: |
| 19 | + fetch-depth: 0 |
| 20 | + ref: ${{ github.event.pull_request.head.sha }} |
| 21 | + |
| 22 | + - name: Install Tabnine CLI |
| 23 | + timeout-minutes: 10 |
| 24 | + run: | |
| 25 | + export TABNINE_HOST=https://console.tabnine.com |
| 26 | + |
| 27 | + # Download installer first, verify, then execute |
| 28 | + curl -fsSL "$TABNINE_HOST/update/cli/installer.mjs" -o installer.mjs |
| 29 | +
|
| 30 | + node installer.mjs "$TABNINE_HOST" |
| 31 | +
|
| 32 | + # Verify installation succeeded |
| 33 | + if [ ! -f ~/.local/bin/tabnine ]; then |
| 34 | + echo "Error: Tabnine CLI installation failed" |
| 35 | + exit 1 |
| 36 | + fi |
| 37 | + |
| 38 | + - name: Configure git |
| 39 | + run: | |
| 40 | + git config user.name "Tabnine CLI Agent" |
| 41 | + git config user.email "TabnineCLI@tabnine.com" |
| 42 | +
|
| 43 | + - name: Configure Tabnine Auth & Settings |
| 44 | + env: |
| 45 | + TABNINE_KEY: ${{ secrets.TABNINE_KEY }} |
| 46 | + run: | |
| 47 | + # Validate TABNINE_KEY secret |
| 48 | + if [ -z "$TABNINE_KEY" ]; then |
| 49 | + echo "Error: Required authentication secret is not configured" |
| 50 | + exit 1 |
| 51 | + fi |
| 52 | + |
| 53 | + mkdir -p ~/.tabnine/agent |
| 54 | + |
| 55 | + # Write Settings |
| 56 | + cat << 'EOF' > ~/.tabnine/agent/settings.json |
| 57 | + { |
| 58 | + "general": { |
| 59 | + "tabnineHost": "https://console.tabnine.com" |
| 60 | + }, |
| 61 | + "security": { |
| 62 | + "auth": { |
| 63 | + "selectedType": "tabnine-personal" |
| 64 | + } |
| 65 | + } |
| 66 | + } |
| 67 | + EOF |
| 68 | + |
| 69 | + # Write Credentials securely with error handling |
| 70 | + if ! printf "%s" "$TABNINE_KEY" > ~/.tabnine/agent/tabnine_creds.json; then |
| 71 | + echo "Error: Failed to write credentials" |
| 72 | + exit 1 |
| 73 | + fi |
| 74 | + |
| 75 | + chmod 600 ~/.tabnine/agent/tabnine_creds.json |
| 76 | +
|
| 77 | + - name: Authenticate GitHub CLI |
| 78 | + run: | |
| 79 | + gh auth login --with-token <<< ${{ github.token }} |
| 80 | +
|
| 81 | + - name: Code Review |
| 82 | + timeout-minutes: 25 |
| 83 | + run: | |
| 84 | + ~/.local/bin/tabnine -y -p "## 1. Persona & Context |
| 85 | + You are a Senior Software Engineer performing a rigorous code review for the this project. |
| 86 | + Your goal is to ensure the codebase remains high-quality, maintainable, and secure. |
| 87 | +
|
| 88 | + ## 2. Environment & Tools |
| 89 | + You are running in a GitHub Actions CI environment with full access to the shell and the pre-authenticated 'gh' CLI. |
| 90 | + - Repository: ${{ github.repository }} |
| 91 | + - PR Number: ${{ github.event.pull_request.number }} |
| 92 | + - PR Head SHA: ${{ github.event.pull_request.head.sha }} |
| 93 | + - PR Base SHA: ${{ github.event.pull_request.base.sha }} |
| 94 | +
|
| 95 | + ## 3. Operational Procedure |
| 96 | +
|
| 97 | + ### Phase A: Understanding the Change |
| 98 | + 1. Execute 'gh pr view --json title,body,comments' to understand the intent. |
| 99 | + 2. Execute 'gh pr diff' to examine the implementation. |
| 100 | +
|
| 101 | + ### Phase B: Check Existing Comments |
| 102 | + 1. Get existing comments: 'gh pr view --json comments' |
| 103 | + 2. If a previously reported issue appears fixed, reply with a resolved comment. |
| 104 | +
|
| 105 | + ### Phase C: Engineering Audit |
| 106 | + Evaluate the code against these Software Engineering pillars: |
| 107 | +
|
| 108 | + **Correctness & Logic**: Does the code solve the problem? Are there edge cases, off-by-one errors, or race conditions? |
| 109 | +
|
| 110 | + **Maintainability & Readability**: Are names self-explanatory? Is the code simple and modular? Are complex parts documented? |
| 111 | +
|
| 112 | + **Security & Reliability**: Are inputs sanitized? Are secrets exposed? Does error handling fail safely? |
| 113 | +
|
| 114 | + **Performance**: Are there unnecessary allocations or blocking operations? |
| 115 | +
|
| 116 | + **Project Specifics**: Cross-platform paths (Windows/Linux), backward compatibility with config files. |
| 117 | +
|
| 118 | + ## 4. Comment Value Threshold (CRITICAL FILTER) |
| 119 | + |
| 120 | + Before posting ANY comment, it MUST pass ALL of these criteria: |
| 121 | +
|
| 122 | + **DO comment if the issue:** |
| 123 | + - Introduces a bug, security vulnerability, or data loss risk |
| 124 | + - Breaks backward compatibility or cross-platform support |
| 125 | + - Causes performance regression or memory leak |
| 126 | + - Violates critical project patterns (e.g., error handling, path handling) |
| 127 | + - Makes the code significantly harder to maintain or debug |
| 128 | +
|
| 129 | + **DO NOT comment on:** |
| 130 | + - Style preferences unless they harm readability (e.g., variable naming is fine unless truly confusing) |
| 131 | + - Minor optimizations that don't impact real-world performance |
| 132 | + - Suggestions to 'improve' code that is already clear and working |
| 133 | + - Nitpicks about formatting, spacing, or trivial refactoring opportunities |
| 134 | + - Personal preferences about code structure when existing approach is valid |
| 135 | + - Educational comments explaining what the code does (assume the author understands their code) |
| 136 | +
|
| 137 | + **Golden Rule**: If removing your comment would NOT increase the risk of bugs, security issues, or maintenance problems, DO NOT POST IT. |
| 138 | +
|
| 139 | + ### Phase D: Inline Comments |
| 140 | + |
| 141 | + For each potential issue from Phase C: |
| 142 | + 1. Apply the Comment Value Threshold filter above |
| 143 | + 2. If it passes the filter, verify: |
| 144 | + - The file exists in the diff output |
| 145 | + - The line number is within changed lines |
| 146 | + - No duplicate feedback exists on nearby lines |
| 147 | + 3. Only then submit the comment |
| 148 | +
|
| 149 | + Submit inline comments using: |
| 150 | +
|
| 151 | + For SINGLE-LINE comments: |
| 152 | + gh api --method POST -H 'Accept: application/vnd.github+json' /repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/comments -f body='YOUR_COMMENT' -f commit_id='${{ github.event.pull_request.head.sha }}' -f path='FILE_PATH' -F line=LINE_NUMBER -f side='RIGHT' |
| 153 | +
|
| 154 | + For MULTI-LINE comments: |
| 155 | + gh api --method POST -H 'Accept: application/vnd.github+json' /repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/comments -f body='YOUR_COMMENT' -f commit_id='${{ github.event.pull_request.head.sha }}' -f path='FILE_PATH' -F start_line=START_LINE_NUMBER -f start_side='RIGHT' -F line=END_LINE_NUMBER -f side='RIGHT' |
| 156 | +
|
| 157 | + **Code Suggestions**: Use GitHub's suggestion syntax ONLY when the fix is clear, unambiguous, and replaces 10 or fewer lines: |
| 158 | + ```suggestion |
| 159 | + // Your replacement code |
| 160 | + ``` |
| 161 | +
|
| 162 | + For larger changes or context-dependent fixes, provide guidance as a regular comment without the suggestion block. |
| 163 | +
|
| 164 | + ### Phase E: Final Summary |
| 165 | + After submitting inline comments (or if zero comments were posted), post a holistic summary: |
| 166 | +
|
| 167 | + gh pr review --comment -b 'YOUR_SUMMARY' |
| 168 | +
|
| 169 | + Your summary must: |
| 170 | + - Acknowledge what the PR accomplishes |
| 171 | + - Note any critical issues found (or state 'No critical issues identified') |
| 172 | + - Be concise |
| 173 | +
|
| 174 | + ## 5. Tone Guidelines |
| 175 | + - Constructive: Suggest improvements or alternatives. |
| 176 | + - Objective: Focus on code, not author. |
| 177 | + - Professional: Use clear, concise language. |
| 178 | + - High Signal: Only comment when it genuinely helps prevent problems." |
0 commit comments