@biggora/claude-plugins 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/README.md +11 -4
  2. package/package.json +1 -1
  3. package/registry/registry.json +319 -244
  4. package/specs/coding.md +24 -0
  5. package/specs/pod.md +2 -0
  6. package/src/skills/captcha/README.md +221 -0
  7. package/src/skills/captcha/SKILL.md +355 -0
  8. package/src/skills/captcha/references/captcha-types.md +254 -0
  9. package/src/skills/captcha/references/services.md +172 -0
  10. package/src/skills/captcha/references/stealth.md +238 -0
  11. package/src/skills/captcha/scripts/solve_captcha.py +323 -0
  12. package/src/skills/captcha/scripts/solve_image_grid.py +350 -0
  13. package/src/skills/google-merchant-api/SKILL.md +581 -0
  14. package/src/skills/google-merchant-api/references/accounts.md +247 -0
  15. package/src/skills/google-merchant-api/references/content-api-legacy.md +216 -0
  16. package/src/skills/google-merchant-api/references/datasources.md +233 -0
  17. package/src/skills/google-merchant-api/references/inventories.md +201 -0
  18. package/src/skills/google-merchant-api/references/migration.md +267 -0
  19. package/src/skills/google-merchant-api/references/products.md +316 -0
  20. package/src/skills/google-merchant-api/references/promotions.md +201 -0
  21. package/src/skills/google-merchant-api/references/reports.md +240 -0
  22. package/src/skills/lv-aggregators-api/SKILL.md +113 -0
  23. package/src/skills/lv-aggregators-api/references/integration-guide.md +368 -0
  24. package/src/skills/lv-aggregators-api/references/kurpirkt.md +103 -0
  25. package/src/skills/lv-aggregators-api/references/salidzini.md +122 -0
  26. package/src/skills/tailwindcss-best-practices/SKILL.md +180 -0
  27. package/src/skills/tailwindcss-best-practices/references/best-practices-utility-patterns.md +87 -0
  28. package/src/skills/tailwindcss-best-practices/references/core-installation.md +109 -0
  29. package/src/skills/tailwindcss-best-practices/references/core-preflight.md +200 -0
  30. package/src/skills/tailwindcss-best-practices/references/core-responsive.md +163 -0
  31. package/src/skills/tailwindcss-best-practices/references/core-source-detection.md +114 -0
  32. package/src/skills/tailwindcss-best-practices/references/core-theme.md +108 -0
  33. package/src/skills/tailwindcss-best-practices/references/core-utility-classes.md +59 -0
  34. package/src/skills/tailwindcss-best-practices/references/core-variants.md +204 -0
  35. package/src/skills/tailwindcss-best-practices/references/effects-form-controls.md +76 -0
  36. package/src/skills/tailwindcss-best-practices/references/effects-mask.md +91 -0
  37. package/src/skills/tailwindcss-best-practices/references/effects-scroll-snap.md +59 -0
  38. package/src/skills/tailwindcss-best-practices/references/effects-text-shadow.md +78 -0
  39. package/src/skills/tailwindcss-best-practices/references/effects-transition-animation.md +80 -0
  40. package/src/skills/tailwindcss-best-practices/references/effects-visibility-interactivity.md +82 -0
  41. package/src/skills/tailwindcss-best-practices/references/features-content-detection.md +175 -0
  42. package/src/skills/tailwindcss-best-practices/references/features-custom-styles.md +203 -0
  43. package/src/skills/tailwindcss-best-practices/references/features-dark-mode.md +137 -0
  44. package/src/skills/tailwindcss-best-practices/references/features-functions-directives.md +241 -0
  45. package/src/skills/tailwindcss-best-practices/references/features-upgrade.md +160 -0
  46. package/src/skills/tailwindcss-best-practices/references/layout-aspect-ratio.md +39 -0
  47. package/src/skills/tailwindcss-best-practices/references/layout-columns.md +80 -0
  48. package/src/skills/tailwindcss-best-practices/references/layout-display.md +110 -0
  49. package/src/skills/tailwindcss-best-practices/references/layout-flexbox.md +112 -0
  50. package/src/skills/tailwindcss-best-practices/references/layout-grid.md +87 -0
  51. package/src/skills/tailwindcss-best-practices/references/layout-height.md +97 -0
  52. package/src/skills/tailwindcss-best-practices/references/layout-inset.md +103 -0
  53. package/src/skills/tailwindcss-best-practices/references/layout-logical-properties.md +92 -0
  54. package/src/skills/tailwindcss-best-practices/references/layout-margin.md +126 -0
  55. package/src/skills/tailwindcss-best-practices/references/layout-min-max-sizing.md +63 -0
  56. package/src/skills/tailwindcss-best-practices/references/layout-object-fit-position.md +64 -0
  57. package/src/skills/tailwindcss-best-practices/references/layout-overflow.md +57 -0
  58. package/src/skills/tailwindcss-best-practices/references/layout-padding.md +77 -0
  59. package/src/skills/tailwindcss-best-practices/references/layout-position.md +85 -0
  60. package/src/skills/tailwindcss-best-practices/references/layout-tables.md +67 -0
  61. package/src/skills/tailwindcss-best-practices/references/layout-width.md +102 -0
  62. package/src/skills/tailwindcss-best-practices/references/transform-base.md +68 -0
  63. package/src/skills/tailwindcss-best-practices/references/transform-rotate.md +70 -0
  64. package/src/skills/tailwindcss-best-practices/references/transform-scale.md +83 -0
  65. package/src/skills/tailwindcss-best-practices/references/transform-skew.md +62 -0
  66. package/src/skills/tailwindcss-best-practices/references/transform-translate.md +77 -0
  67. package/src/skills/tailwindcss-best-practices/references/typography-font-text.md +142 -0
  68. package/src/skills/tailwindcss-best-practices/references/typography-list-style.md +65 -0
  69. package/src/skills/tailwindcss-best-practices/references/typography-text-align.md +60 -0
  70. package/src/skills/tailwindcss-best-practices/references/visual-background.md +76 -0
  71. package/src/skills/tailwindcss-best-practices/references/visual-border.md +108 -0
  72. package/src/skills/tailwindcss-best-practices/references/visual-effects.md +111 -0
  73. package/src/skills/tailwindcss-best-practices/references/visual-svg.md +82 -0
  74. package/src/skills/test-mobile-app/SKILL.md +11 -6
  75. package/src/skills/test-mobile-app/scripts/analyze_apk.py +15 -4
  76. package/src/skills/test-mobile-app/scripts/check_environment.py +5 -5
  77. package/src/skills/test-mobile-app/scripts/run_tests.py +1 -1
  78. package/src/skills/test-web-ui/SKILL.md +264 -84
  79. package/src/skills/test-web-ui/scripts/discover.py +25 -12
  80. package/src/skills/test-web-ui/scripts/run_tests.py +3 -2
  81. package/src/skills/vite-best-practices/SKILL.md +115 -0
  82. package/src/skills/vite-best-practices/references/build-and-ssr.md +255 -0
  83. package/src/skills/vite-best-practices/references/core-config.md +231 -0
  84. package/src/skills/vite-best-practices/references/core-features.md +222 -0
  85. package/src/skills/vite-best-practices/references/core-plugin-api.md +294 -0
  86. package/src/skills/vite-best-practices/references/environment-api.md +108 -0
  87. package/src/skills/vite-best-practices/references/rolldown-migration.md +242 -0
  88. package/codex-cli-workspace/iteration-1/benchmark.json +0 -122
  89. package/codex-cli-workspace/iteration-1/eval-1-ci-integration/eval_metadata.json +0 -13
  90. package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/grading.json +0 -52
  91. package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/outputs/response.md +0 -163
  92. package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/timing.json +0 -5
  93. package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/grading.json +0 -58
  94. package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/outputs/response.md +0 -151
  95. package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/timing.json +0 -5
  96. package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/eval_metadata.json +0 -13
  97. package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/grading.json +0 -52
  98. package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -86
  99. package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/timing.json +0 -5
  100. package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/grading.json +0 -58
  101. package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -164
  102. package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/timing.json +0 -5
  103. package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/eval_metadata.json +0 -13
  104. package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/grading.json +0 -52
  105. package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/outputs/response.md +0 -130
  106. package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/timing.json +0 -5
  107. package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/grading.json +0 -64
  108. package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/outputs/response.md +0 -209
  109. package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/timing.json +0 -5
  110. package/codex-cli-workspace/iteration-1/review.html +0 -1325
  111. package/gemini-cli-workspace/iteration-1/benchmark.json +0 -86
  112. package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/eval_metadata.json +0 -37
  113. package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/grading.json +0 -37
  114. package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/outputs/response.md +0 -401
  115. package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/timing.json +0 -5
  116. package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/grading.json +0 -37
  117. package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/outputs/response.md +0 -405
  118. package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/timing.json +0 -5
  119. package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/eval_metadata.json +0 -37
  120. package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/grading.json +0 -37
  121. package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -212
  122. package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/timing.json +0 -5
  123. package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/grading.json +0 -37
  124. package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -427
  125. package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/timing.json +0 -5
  126. package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/eval_metadata.json +0 -32
  127. package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/grading.json +0 -32
  128. package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/outputs/response.md +0 -171
  129. package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/timing.json +0 -5
  130. package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/grading.json +0 -32
  131. package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/outputs/response.md +0 -199
  132. package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/timing.json +0 -5
  133. package/gemini-cli-workspace/iteration-1/review.html +0 -1325
  134. package/gemini-cli-workspace/iteration-2/benchmark.json +0 -173
  135. package/gemini-cli-workspace/iteration-2/benchmark.md +0 -28
  136. package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/eval_metadata.json +0 -37
  137. package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/grading.json +0 -37
  138. package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/outputs/response.md +0 -195
  139. package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/timing.json +0 -5
  140. package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/grading.json +0 -37
  141. package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/outputs/response.md +0 -377
  142. package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/timing.json +0 -5
  143. package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/eval_metadata.json +0 -37
  144. package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/grading.json +0 -37
  145. package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -127
  146. package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/timing.json +0 -5
  147. package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/grading.json +0 -37
  148. package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -164
  149. package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/timing.json +0 -5
  150. package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/eval_metadata.json +0 -32
  151. package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/grading.json +0 -32
  152. package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/outputs/response.md +0 -91
  153. package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/timing.json +0 -5
  154. package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/grading.json +0 -32
  155. package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/outputs/response.md +0 -112
  156. package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/timing.json +0 -5
  157. package/gemini-cli-workspace/iteration-2/eval-viewer.html +0 -1325
  158. package/screen-recording-workspace/evals.json +0 -41
  159. package/screen-recording-workspace/iteration-1/benchmark.json +0 -102
  160. package/screen-recording-workspace/iteration-1/eval-0-fullscreen/eval_metadata.json +0 -31
  161. package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/grading.json +0 -11
  162. package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/outputs/demo.mp4 +0 -0
  163. package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/timing.json +0 -5
  164. package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/grading.json +0 -11
  165. package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/outputs/demo.mp4 +0 -0
  166. package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/timing.json +0 -5
  167. package/screen-recording-workspace/iteration-1/eval-1-region-audio/eval_metadata.json +0 -31
  168. package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/grading.json +0 -11
  169. package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/outputs/region_capture.mp4 +0 -0
  170. package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/timing.json +0 -5
  171. package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/grading.json +0 -11
  172. package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/outputs/region_capture.mp4 +0 -0
  173. package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/timing.json +0 -5
  174. package/screen-recording-workspace/iteration-1/eval-2-python-fallback/eval_metadata.json +0 -31
  175. package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/grading.json +0 -11
  176. package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/outputs/fallback_recording.mp4 +0 -0
  177. package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/timing.json +0 -5
  178. package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/grading.json +0 -11
  179. package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/outputs/fallback_recording.mp4 +0 -0
  180. package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/outputs/record_screen.py +0 -67
  181. package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/timing.json +0 -5
  182. package/screen-recording-workspace/iteration-1/review.html +0 -1325
  183. package/src/skills/codex-cli/evals/evals.json +0 -47
  184. package/src/skills/gemini-cli/evals/evals.json +0 -46
  185. package/src/skills/tm-search/evals/evals.json +0 -23
@@ -1,377 +0,0 @@
1
- # Setting Up Gemini CLI for Automated PR Reviews in GitHub Actions
2
-
3
- ## Overview
4
-
5
- This guide covers how to configure Gemini CLI in a GitHub Actions CI/CD pipeline to automatically review pull requests, using an API key from GitHub Secrets and structured JSON output for parsing.
6
-
7
- ## Prerequisites
8
-
9
- 1. A Google AI API key (from Google AI Studio)
10
- 2. The API key stored as a GitHub Actions secret (e.g., `GEMINI_API_KEY`)
11
- 3. A GitHub repository with pull requests to review
12
-
13
- ## Step 1: Store Your API Key in GitHub Secrets
14
-
15
- 1. Go to your repository on GitHub
16
- 2. Navigate to **Settings > Secrets and variables > Actions**
17
- 3. Click **New repository secret**
18
- 4. Name it `GEMINI_API_KEY` and paste your API key
19
- 5. Click **Add secret**
20
-
21
- ## Step 2: Create the GitHub Actions Workflow
22
-
23
- Create a file at `.github/workflows/gemini-pr-review.yml`:
24
-
25
- ```yaml
26
- name: Gemini PR Review
27
-
28
- on:
29
- pull_request:
30
- types: [opened, synchronize, reopened]
31
-
32
- permissions:
33
- contents: read
34
- pull-requests: write
35
-
36
- jobs:
37
- review:
38
- runs-on: ubuntu-latest
39
- steps:
40
- - name: Checkout code
41
- uses: actions/checkout@v4
42
- with:
43
- fetch-depth: 0
44
-
45
- - name: Setup Node.js
46
- uses: actions/setup-node@v4
47
- with:
48
- node-version: '20'
49
-
50
- - name: Install Gemini CLI
51
- run: npm install -g @google/gemini-cli
52
-
53
- - name: Get PR diff
54
- id: diff
55
- run: |
56
- git diff origin/${{ github.base_ref }}...HEAD > pr_diff.txt
57
- echo "diff_size=$(wc -c < pr_diff.txt)" >> $GITHUB_OUTPUT
58
-
59
- - name: Run Gemini Review
60
- id: review
61
- env:
62
- GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
63
- run: |
64
- DIFF_CONTENT=$(cat pr_diff.txt)
65
-
66
- # Create the prompt requesting structured JSON output
67
- cat > review_prompt.txt << 'PROMPT_EOF'
68
- You are a code reviewer. Analyze the following PR diff and provide your review as a JSON object with this exact structure:
69
-
70
- {
71
- "summary": "Brief overall summary of the changes",
72
- "risk_level": "low|medium|high",
73
- "issues": [
74
- {
75
- "severity": "critical|warning|suggestion",
76
- "file": "path/to/file",
77
- "line": 0,
78
- "description": "Description of the issue",
79
- "suggestion": "Suggested fix"
80
- }
81
- ],
82
- "positives": ["List of good practices observed"],
83
- "approved": true
84
- }
85
-
86
- Respond ONLY with valid JSON, no markdown fences, no extra text.
87
-
88
- Here is the diff:
89
- PROMPT_EOF
90
-
91
- # Append the diff content
92
- cat pr_diff.txt >> review_prompt.txt
93
-
94
- # Run Gemini CLI with the prompt
95
- # Use --json flag if available, otherwise parse text output
96
- REVIEW_OUTPUT=$(gemini -p "$(cat review_prompt.txt)" 2>/dev/null || true)
97
-
98
- # Save raw output for debugging
99
- echo "$REVIEW_OUTPUT" > review_output.json
100
-
101
- # Validate JSON
102
- if echo "$REVIEW_OUTPUT" | jq . > /dev/null 2>&1; then
103
- echo "valid_json=true" >> $GITHUB_OUTPUT
104
- else
105
- echo "valid_json=false" >> $GITHUB_OUTPUT
106
- # Try to extract JSON from the response (in case of markdown fences)
107
- REVIEW_OUTPUT=$(echo "$REVIEW_OUTPUT" | sed -n '/^{/,/^}/p' | head -1)
108
- echo "$REVIEW_OUTPUT" > review_output.json
109
- fi
110
-
111
- - name: Parse and Post Review
112
- if: always()
113
- uses: actions/github-script@v7
114
- with:
115
- script: |
116
- const fs = require('fs');
117
-
118
- let review;
119
- try {
120
- const rawOutput = fs.readFileSync('review_output.json', 'utf8');
121
- // Strip markdown code fences if present
122
- const cleaned = rawOutput
123
- .replace(/```json\n?/g, '')
124
- .replace(/```\n?/g, '')
125
- .trim();
126
- review = JSON.parse(cleaned);
127
- } catch (e) {
128
- console.log('Failed to parse review JSON:', e.message);
129
- // Post a fallback comment
130
- await github.rest.issues.createComment({
131
- owner: context.repo.owner,
132
- repo: context.repo.repo,
133
- issue_number: context.issue.number,
134
- body: '## Gemini Review\n\n_Review output could not be parsed as JSON. Raw output saved as artifact._'
135
- });
136
- return;
137
- }
138
-
139
- // Build the review comment
140
- let body = `## Gemini PR Review\n\n`;
141
- body += `**Summary:** ${review.summary}\n\n`;
142
- body += `**Risk Level:** ${review.risk_level}\n\n`;
143
-
144
- if (review.issues && review.issues.length > 0) {
145
- body += `### Issues Found (${review.issues.length})\n\n`;
146
- for (const issue of review.issues) {
147
- const emoji = issue.severity === 'critical' ? '🔴' :
148
- issue.severity === 'warning' ? '🟡' : '🔵';
149
- body += `${emoji} **${issue.severity.toUpperCase()}** - \`${issue.file}\``;
150
- if (issue.line) body += ` (line ${issue.line})`;
151
- body += `\n`;
152
- body += `> ${issue.description}\n`;
153
- if (issue.suggestion) {
154
- body += `> **Suggestion:** ${issue.suggestion}\n`;
155
- }
156
- body += `\n`;
157
- }
158
- } else {
159
- body += `### No Issues Found\n\n`;
160
- }
161
-
162
- if (review.positives && review.positives.length > 0) {
163
- body += `### Positives\n\n`;
164
- for (const positive of review.positives) {
165
- body += `- ${positive}\n`;
166
- }
167
- body += `\n`;
168
- }
169
-
170
- body += `---\n_Automated review by Gemini CLI_`;
171
-
172
- await github.rest.issues.createComment({
173
- owner: context.repo.owner,
174
- repo: context.repo.repo,
175
- issue_number: context.issue.number,
176
- body: body
177
- });
178
-
179
- - name: Upload Review Artifact
180
- if: always()
181
- uses: actions/upload-artifact@v4
182
- with:
183
- name: gemini-review
184
- path: review_output.json
185
- retention-days: 7
186
- ```
187
-
188
- ## Step 3: Alternative Approach Using the Gemini API Directly (More Reliable for JSON)
189
-
190
- If you want more control over structured output, you can call the Gemini API directly with `curl` instead of relying on the CLI. This gives you access to the `response_mime_type` parameter for guaranteed JSON:
191
-
192
- ```yaml
193
- - name: Run Gemini Review via API
194
- id: review
195
- env:
196
- GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
197
- run: |
198
- DIFF_CONTENT=$(cat pr_diff.txt | jq -Rs .)
199
-
200
- # Build the API request with structured output
201
- cat > request.json << EOF
202
- {
203
- "contents": [{
204
- "parts": [{
205
- "text": "You are a code reviewer. Analyze this PR diff and provide a review.\n\nDiff:\n${DIFF_CONTENT}"
206
- }]
207
- }],
208
- "generationConfig": {
209
- "responseMimeType": "application/json",
210
- "responseSchema": {
211
- "type": "object",
212
- "properties": {
213
- "summary": { "type": "string" },
214
- "risk_level": { "type": "string", "enum": ["low", "medium", "high"] },
215
- "issues": {
216
- "type": "array",
217
- "items": {
218
- "type": "object",
219
- "properties": {
220
- "severity": { "type": "string", "enum": ["critical", "warning", "suggestion"] },
221
- "file": { "type": "string" },
222
- "line": { "type": "integer" },
223
- "description": { "type": "string" },
224
- "suggestion": { "type": "string" }
225
- },
226
- "required": ["severity", "file", "description"]
227
- }
228
- },
229
- "positives": {
230
- "type": "array",
231
- "items": { "type": "string" }
232
- },
233
- "approved": { "type": "boolean" }
234
- },
235
- "required": ["summary", "risk_level", "issues", "approved"]
236
- }
237
- }
238
- }
239
- EOF
240
-
241
- # Call the Gemini API
242
- curl -s "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_API_KEY}" \
243
- -H 'Content-Type: application/json' \
244
- -d @request.json \
245
- -o api_response.json
246
-
247
- # Extract the text content from the API response
248
- jq -r '.candidates[0].content.parts[0].text' api_response.json > review_output.json
249
- ```
250
-
251
- ## Step 4: Handling Large Diffs
252
-
253
- For large PRs, you may hit token limits. Add a truncation step:
254
-
255
- ```yaml
256
- - name: Prepare diff (truncated if needed)
257
- run: |
258
- # Limit diff to ~100KB to stay within token limits
259
- if [ $(wc -c < pr_diff.txt) -gt 100000 ]; then
260
- head -c 100000 pr_diff.txt > pr_diff_truncated.txt
261
- echo -e "\n\n[DIFF TRUNCATED - showing first 100KB]" >> pr_diff_truncated.txt
262
- mv pr_diff_truncated.txt pr_diff.txt
263
- fi
264
- ```
265
-
266
- ## Key Configuration Notes
267
-
268
- ### Authentication
269
-
270
- - Gemini CLI uses the `GEMINI_API_KEY` environment variable for authentication
271
- - In GitHub Actions, pass it via `env:` from secrets -- never hardcode it
272
-
273
- ### Structured JSON Output
274
-
275
- There are two approaches for getting structured JSON:
276
-
277
- 1. **Prompt-based** (CLI approach): Ask the model to return JSON in your prompt. Less reliable but simpler. Include "Respond ONLY with valid JSON" in your prompt.
278
-
279
- 2. **Schema-based** (API approach): Use `responseMimeType: "application/json"` with a `responseSchema` in the API request. This guarantees valid JSON output conforming to your schema. This is the more reliable approach for CI/CD pipelines.
280
-
281
- ### Parsing the Output
282
-
283
- Always include fallback handling when parsing JSON from LLM output:
284
-
285
- ```bash
286
- # Strip potential markdown code fences
287
- CLEAN_JSON=$(echo "$RAW_OUTPUT" | sed 's/^```json//; s/^```//; /^$/d')
288
-
289
- # Validate with jq
290
- if echo "$CLEAN_JSON" | jq . > /dev/null 2>&1; then
291
- echo "Valid JSON"
292
- else
293
- echo "Invalid JSON - falling back"
294
- fi
295
- ```
296
-
297
- ### Cost and Rate Limiting
298
-
299
- - Consider adding rate limiting or caching to avoid excessive API calls
300
- - Use `concurrency` in your workflow to prevent parallel runs:
301
-
302
- ```yaml
303
- concurrency:
304
- group: gemini-review-${{ github.event.pull_request.number }}
305
- cancel-in-progress: true
306
- ```
307
-
308
- ### Security Considerations
309
-
310
- - Never log or echo the API key in workflow output
311
- - Use `pull_requests: write` permission (minimum required)
312
- - Consider limiting the workflow to specific file types or paths:
313
-
314
- ```yaml
315
- on:
316
- pull_request:
317
- paths:
318
- - '**.js'
319
- - '**.ts'
320
- - '**.py'
321
- ```
322
-
323
- ## Complete Minimal Example
324
-
325
- For a quick start, here is the simplest possible setup:
326
-
327
- ```yaml
328
- name: Gemini Review
329
- on:
330
- pull_request:
331
- types: [opened, synchronize]
332
-
333
- permissions:
334
- contents: read
335
- pull-requests: write
336
-
337
- jobs:
338
- review:
339
- runs-on: ubuntu-latest
340
- steps:
341
- - uses: actions/checkout@v4
342
- with:
343
- fetch-depth: 0
344
-
345
- - name: Setup and Review
346
- env:
347
- GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
348
- run: |
349
- npm install -g @google/gemini-cli
350
- DIFF=$(git diff origin/${{ github.base_ref }}...HEAD)
351
- REVIEW=$(gemini -p "Review this code diff. Return JSON with keys: summary (string), issues (array of {severity, file, description}), approved (boolean). Only output JSON. Diff: $DIFF")
352
- echo "$REVIEW" > review.json
353
-
354
- - name: Post Comment
355
- uses: actions/github-script@v7
356
- with:
357
- script: |
358
- const fs = require('fs');
359
- const raw = fs.readFileSync('review.json', 'utf8');
360
- const clean = raw.replace(/```json\n?/g, '').replace(/```\n?/g, '').trim();
361
- let review;
362
- try { review = JSON.parse(clean); } catch(e) {
363
- return github.rest.issues.createComment({
364
- ...context.repo, issue_number: context.issue.number,
365
- body: '## Gemini Review\nFailed to parse output.'
366
- });
367
- }
368
- let body = `## Gemini Review\n**Summary:** ${review.summary}\n\n`;
369
- if (review.issues?.length) {
370
- body += review.issues.map(i => `- **${i.severity}** \`${i.file}\`: ${i.description}`).join('\n');
371
- } else { body += 'No issues found.'; }
372
- await github.rest.issues.createComment({
373
- ...context.repo, issue_number: context.issue.number, body
374
- });
375
- ```
376
-
377
- This setup will automatically run Gemini CLI on every PR, parse the structured JSON review, and post the results as a PR comment.
@@ -1,5 +0,0 @@
1
- {
2
- "total_tokens": 59322,
3
- "duration_ms": 67990,
4
- "total_duration_seconds": 68.0
5
- }
@@ -1,37 +0,0 @@
1
- {
2
- "eval_id": 2,
3
- "eval_name": "mcp-server-config",
4
- "prompt": "I need to connect a custom MCP server I built in Python to gemini cli. The server needs an API key from my environment. Also I want to restrict which tools it can expose. How do I configure this?",
5
- "assertions": [
6
- {
7
- "id": "correct-settings-location",
8
- "text": "Points to ~/.gemini/settings.json or project-level settings.json",
9
- "type": "content_check"
10
- },
11
- {
12
- "id": "shows-mcp-config-structure",
13
- "text": "Shows mcpServers config with command, args fields",
14
- "type": "content_check"
15
- },
16
- {
17
- "id": "env-var-dollar-pattern",
18
- "text": "Shows $VAR pattern for environment variable references in env field",
19
- "type": "content_check"
20
- },
21
- {
22
- "id": "tool-filtering",
23
- "text": "Explains includeTools and/or excludeTools for restricting exposed tools",
24
- "type": "content_check"
25
- },
26
- {
27
- "id": "security-note",
28
- "text": "Mentions security considerations (trust field, not hardcoding keys, etc.)",
29
- "type": "content_check"
30
- },
31
- {
32
- "id": "python-command-correct",
33
- "text": "Uses correct Python command (python/python3) in the command field for the MCP server",
34
- "type": "accuracy_check"
35
- }
36
- ]
37
- }
@@ -1,37 +0,0 @@
1
- {
2
- "eval_id": 2,
3
- "eval_name": "mcp-server-config",
4
- "config": "with_skill",
5
- "expectations": [
6
- {
7
- "text": "Points to ~/.gemini/settings.json or project-level settings.json",
8
- "passed": true,
9
- "evidence": "Opens with: 'Add your server to ~/.gemini/settings.json (global) or <project>/.gemini/settings.json (project-scoped)'"
10
- },
11
- {
12
- "text": "Shows mcpServers config with command, args fields",
13
- "passed": true,
14
- "evidence": "Full JSON config block with mcpServers containing command, args, cwd, env, timeout, trust, includeTools"
15
- },
16
- {
17
- "text": "Shows $VAR pattern for environment variable references in env field",
18
- "passed": true,
19
- "evidence": "Shows \"API_KEY\": \"$MY_API_KEY\" pattern and explains the dollar-sign prefix syntax"
20
- },
21
- {
22
- "text": "Explains includeTools and/or excludeTools for restricting exposed tools",
23
- "passed": true,
24
- "evidence": "Dedicated section explaining both includeTools (whitelist) and excludeTools (blacklist) with examples"
25
- },
26
- {
27
- "text": "Mentions security considerations (trust field, not hardcoding keys, etc.)",
28
- "passed": true,
29
- "evidence": "Explains trust field (default false, requires confirmation), warns never to hardcode secrets, mentions automatic redaction of env vars"
30
- },
31
- {
32
- "text": "Uses correct Python command (python/python3) in the command field for the MCP server",
33
- "passed": true,
34
- "evidence": "Uses \"command\": \"python\" consistently across examples"
35
- }
36
- ]
37
- }
@@ -1,127 +0,0 @@
1
- # Connecting a Custom Python MCP Server to Gemini CLI
2
-
3
- ## Configuration
4
-
5
- Add your server to `~/.gemini/settings.json` (global) or `<project>/.gemini/settings.json` (project-scoped) under the `mcpServers` key:
6
-
7
- ```json
8
- {
9
- "mcpServers": {
10
- "myPythonServer": {
11
- "command": "python",
12
- "args": ["-m", "my_mcp_server"],
13
- "cwd": "./mcp_tools",
14
- "env": {
15
- "API_KEY": "$MY_API_KEY"
16
- },
17
- "timeout": 15000,
18
- "trust": false,
19
- "includeTools": ["tool_a", "tool_b"]
20
- }
21
- }
22
- }
23
- ```
24
-
25
- ## Breakdown of each field
26
-
27
- | Field | Purpose |
28
- |---|---|
29
- | `command` | The executable to run. Use `"python"` (or `"python3"` depending on your system). |
30
- | `args` | Arguments passed to the command. Use `["-m", "my_mcp_server"]` to run as a module, or `["./path/to/server.py"]` to run a script directly. |
31
- | `cwd` | Optional working directory for the server process. |
32
- | `env` | Environment variables passed to the server. Use the `"$VAR_NAME"` syntax to reference variables from your shell environment rather than hardcoding secrets. |
33
- | `timeout` | Connection timeout in milliseconds. Defaults to 600000 (10 minutes). Set lower (e.g., 15000) for servers that should start quickly. |
34
- | `trust` | When `false` (the default), Gemini CLI will prompt you for confirmation before executing tools from this server. Set to `true` only for servers you fully control and trust. |
35
- | `includeTools` | A whitelist array. Only the tools listed here will be exposed to Gemini. All other tools from the server are hidden. |
36
- | `excludeTools` | A blacklist array. The listed tools are hidden; everything else is exposed. |
37
-
38
- Use `includeTools` or `excludeTools`, not both. `includeTools` is the safer choice when you want to tightly restrict what the model can call.
39
-
40
- ## Passing the API key securely
41
-
42
- Never hardcode secrets in `settings.json`. Instead, set the variable in your shell environment:
43
-
44
- ```bash
45
- export MY_API_KEY="sk-your-actual-key"
46
- ```
47
-
48
- Then reference it with the dollar-sign prefix in the config:
49
-
50
- ```json
51
- "env": {
52
- "API_KEY": "$MY_API_KEY"
53
- }
54
- ```
55
-
56
- Gemini CLI automatically redacts environment variable values that match patterns like `*TOKEN*`, `*SECRET*`, `*KEY*` from MCP process output, so your key will not leak into logs.
57
-
58
- You can also store the variable in `~/.gemini/.env` or `<project>/.gemini/.env` and it will be loaded automatically.
59
-
60
- ## Restricting exposed tools
61
-
62
- To allow only specific tools (whitelist approach):
63
-
64
- ```json
65
- "includeTools": ["query_data", "list_items"]
66
- ```
67
-
68
- To block specific tools while allowing everything else (blacklist approach):
69
-
70
- ```json
71
- "excludeTools": ["delete_all", "admin_reset"]
72
- ```
73
-
74
- ## Verifying the connection
75
-
76
- After configuring, start Gemini CLI and check the server status:
77
-
78
- ```bash
79
- gemini
80
- ```
81
-
82
- Then inside the interactive session:
83
-
84
- ```
85
- /mcp list
86
- /mcp status
87
- ```
88
-
89
- You can also manage servers from the command line:
90
-
91
- ```bash
92
- gemini mcp list
93
- gemini mcp remove myPythonServer
94
- ```
95
-
96
- ## Invoking your server's tools
97
-
98
- In the interactive session, reference the server by name with the `@` prefix:
99
-
100
- ```
101
- @myPythonServer query all active users
102
- ```
103
-
104
- Gemini CLI will route the request to the appropriate tool exposed by your MCP server.
105
-
106
- ## Complete example
107
-
108
- Assuming your Python MCP server is at `./tools/my_server.py` and exposes tools named `search`, `fetch_details`, and `delete_record`, and you only want to allow `search` and `fetch_details`:
109
-
110
- ```json
111
- {
112
- "mcpServers": {
113
- "myPythonServer": {
114
- "command": "python",
115
- "args": ["./tools/my_server.py"],
116
- "env": {
117
- "API_KEY": "$MY_API_KEY"
118
- },
119
- "timeout": 15000,
120
- "trust": false,
121
- "includeTools": ["search", "fetch_details"]
122
- }
123
- }
124
- }
125
- ```
126
-
127
- This configuration starts the Python server, passes the API key from your environment, sets a 15-second connection timeout, requires confirmation prompts for tool calls, and only exposes the `search` and `fetch_details` tools to Gemini.
@@ -1,5 +0,0 @@
1
- {
2
- "total_tokens": 66522,
3
- "duration_ms": 47343,
4
- "total_duration_seconds": 47.3
5
- }
@@ -1,37 +0,0 @@
1
- {
2
- "eval_id": 2,
3
- "eval_name": "mcp-server-config",
4
- "config": "without_skill",
5
- "expectations": [
6
- {
7
- "text": "Points to ~/.gemini/settings.json or project-level settings.json",
8
- "passed": true,
9
- "evidence": "States '~/.gemini/settings.json' (global) and '.gemini/settings.json' (project-level)"
10
- },
11
- {
12
- "text": "Shows mcpServers config with command, args fields",
13
- "passed": true,
14
- "evidence": "Full JSON config with mcpServers, command, args, env, cwd, timeout, includeTools"
15
- },
16
- {
17
- "text": "Shows $VAR pattern for environment variable references in env field",
18
- "passed": true,
19
- "evidence": "Shows both $MY_API_KEY and ${ANOTHER_ENV_VAR} syntax with explanation"
20
- },
21
- {
22
- "text": "Explains includeTools and/or excludeTools for restricting exposed tools",
23
- "passed": true,
24
- "evidence": "Dedicated sections for both includeTools (allowlist) and excludeTools (blocklist) with examples and precedence rules"
25
- },
26
- {
27
- "text": "Mentions security considerations (trust field, not hardcoding keys, etc.)",
28
- "passed": true,
29
- "evidence": "Mentions trust field, automatic redaction, env variable security note about trusted declarations"
30
- },
31
- {
32
- "text": "Uses correct Python command (python/python3) in the command field for the MCP server",
33
- "passed": true,
34
- "evidence": "Uses \"command\": \"python\" consistently, also shows uv-based FastMCP alternative"
35
- }
36
- ]
37
- }