@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.
- package/README.md +11 -4
- package/package.json +1 -1
- package/registry/registry.json +319 -244
- package/specs/coding.md +24 -0
- package/specs/pod.md +2 -0
- package/src/skills/captcha/README.md +221 -0
- package/src/skills/captcha/SKILL.md +355 -0
- package/src/skills/captcha/references/captcha-types.md +254 -0
- package/src/skills/captcha/references/services.md +172 -0
- package/src/skills/captcha/references/stealth.md +238 -0
- package/src/skills/captcha/scripts/solve_captcha.py +323 -0
- package/src/skills/captcha/scripts/solve_image_grid.py +350 -0
- package/src/skills/google-merchant-api/SKILL.md +581 -0
- package/src/skills/google-merchant-api/references/accounts.md +247 -0
- package/src/skills/google-merchant-api/references/content-api-legacy.md +216 -0
- package/src/skills/google-merchant-api/references/datasources.md +233 -0
- package/src/skills/google-merchant-api/references/inventories.md +201 -0
- package/src/skills/google-merchant-api/references/migration.md +267 -0
- package/src/skills/google-merchant-api/references/products.md +316 -0
- package/src/skills/google-merchant-api/references/promotions.md +201 -0
- package/src/skills/google-merchant-api/references/reports.md +240 -0
- package/src/skills/lv-aggregators-api/SKILL.md +113 -0
- package/src/skills/lv-aggregators-api/references/integration-guide.md +368 -0
- package/src/skills/lv-aggregators-api/references/kurpirkt.md +103 -0
- package/src/skills/lv-aggregators-api/references/salidzini.md +122 -0
- package/src/skills/tailwindcss-best-practices/SKILL.md +180 -0
- package/src/skills/tailwindcss-best-practices/references/best-practices-utility-patterns.md +87 -0
- package/src/skills/tailwindcss-best-practices/references/core-installation.md +109 -0
- package/src/skills/tailwindcss-best-practices/references/core-preflight.md +200 -0
- package/src/skills/tailwindcss-best-practices/references/core-responsive.md +163 -0
- package/src/skills/tailwindcss-best-practices/references/core-source-detection.md +114 -0
- package/src/skills/tailwindcss-best-practices/references/core-theme.md +108 -0
- package/src/skills/tailwindcss-best-practices/references/core-utility-classes.md +59 -0
- package/src/skills/tailwindcss-best-practices/references/core-variants.md +204 -0
- package/src/skills/tailwindcss-best-practices/references/effects-form-controls.md +76 -0
- package/src/skills/tailwindcss-best-practices/references/effects-mask.md +91 -0
- package/src/skills/tailwindcss-best-practices/references/effects-scroll-snap.md +59 -0
- package/src/skills/tailwindcss-best-practices/references/effects-text-shadow.md +78 -0
- package/src/skills/tailwindcss-best-practices/references/effects-transition-animation.md +80 -0
- package/src/skills/tailwindcss-best-practices/references/effects-visibility-interactivity.md +82 -0
- package/src/skills/tailwindcss-best-practices/references/features-content-detection.md +175 -0
- package/src/skills/tailwindcss-best-practices/references/features-custom-styles.md +203 -0
- package/src/skills/tailwindcss-best-practices/references/features-dark-mode.md +137 -0
- package/src/skills/tailwindcss-best-practices/references/features-functions-directives.md +241 -0
- package/src/skills/tailwindcss-best-practices/references/features-upgrade.md +160 -0
- package/src/skills/tailwindcss-best-practices/references/layout-aspect-ratio.md +39 -0
- package/src/skills/tailwindcss-best-practices/references/layout-columns.md +80 -0
- package/src/skills/tailwindcss-best-practices/references/layout-display.md +110 -0
- package/src/skills/tailwindcss-best-practices/references/layout-flexbox.md +112 -0
- package/src/skills/tailwindcss-best-practices/references/layout-grid.md +87 -0
- package/src/skills/tailwindcss-best-practices/references/layout-height.md +97 -0
- package/src/skills/tailwindcss-best-practices/references/layout-inset.md +103 -0
- package/src/skills/tailwindcss-best-practices/references/layout-logical-properties.md +92 -0
- package/src/skills/tailwindcss-best-practices/references/layout-margin.md +126 -0
- package/src/skills/tailwindcss-best-practices/references/layout-min-max-sizing.md +63 -0
- package/src/skills/tailwindcss-best-practices/references/layout-object-fit-position.md +64 -0
- package/src/skills/tailwindcss-best-practices/references/layout-overflow.md +57 -0
- package/src/skills/tailwindcss-best-practices/references/layout-padding.md +77 -0
- package/src/skills/tailwindcss-best-practices/references/layout-position.md +85 -0
- package/src/skills/tailwindcss-best-practices/references/layout-tables.md +67 -0
- package/src/skills/tailwindcss-best-practices/references/layout-width.md +102 -0
- package/src/skills/tailwindcss-best-practices/references/transform-base.md +68 -0
- package/src/skills/tailwindcss-best-practices/references/transform-rotate.md +70 -0
- package/src/skills/tailwindcss-best-practices/references/transform-scale.md +83 -0
- package/src/skills/tailwindcss-best-practices/references/transform-skew.md +62 -0
- package/src/skills/tailwindcss-best-practices/references/transform-translate.md +77 -0
- package/src/skills/tailwindcss-best-practices/references/typography-font-text.md +142 -0
- package/src/skills/tailwindcss-best-practices/references/typography-list-style.md +65 -0
- package/src/skills/tailwindcss-best-practices/references/typography-text-align.md +60 -0
- package/src/skills/tailwindcss-best-practices/references/visual-background.md +76 -0
- package/src/skills/tailwindcss-best-practices/references/visual-border.md +108 -0
- package/src/skills/tailwindcss-best-practices/references/visual-effects.md +111 -0
- package/src/skills/tailwindcss-best-practices/references/visual-svg.md +82 -0
- package/src/skills/test-mobile-app/SKILL.md +11 -6
- package/src/skills/test-mobile-app/scripts/analyze_apk.py +15 -4
- package/src/skills/test-mobile-app/scripts/check_environment.py +5 -5
- package/src/skills/test-mobile-app/scripts/run_tests.py +1 -1
- package/src/skills/test-web-ui/SKILL.md +264 -84
- package/src/skills/test-web-ui/scripts/discover.py +25 -12
- package/src/skills/test-web-ui/scripts/run_tests.py +3 -2
- package/src/skills/vite-best-practices/SKILL.md +115 -0
- package/src/skills/vite-best-practices/references/build-and-ssr.md +255 -0
- package/src/skills/vite-best-practices/references/core-config.md +231 -0
- package/src/skills/vite-best-practices/references/core-features.md +222 -0
- package/src/skills/vite-best-practices/references/core-plugin-api.md +294 -0
- package/src/skills/vite-best-practices/references/environment-api.md +108 -0
- package/src/skills/vite-best-practices/references/rolldown-migration.md +242 -0
- package/codex-cli-workspace/iteration-1/benchmark.json +0 -122
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/outputs/response.md +0 -163
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/grading.json +0 -58
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/outputs/response.md +0 -151
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -86
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/grading.json +0 -58
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -164
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/outputs/response.md +0 -130
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/grading.json +0 -64
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/outputs/response.md +0 -209
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/review.html +0 -1325
- package/gemini-cli-workspace/iteration-1/benchmark.json +0 -86
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/outputs/response.md +0 -401
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/outputs/response.md +0 -405
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -212
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -427
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/eval_metadata.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/outputs/response.md +0 -171
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/outputs/response.md +0 -199
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/review.html +0 -1325
- package/gemini-cli-workspace/iteration-2/benchmark.json +0 -173
- package/gemini-cli-workspace/iteration-2/benchmark.md +0 -28
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/outputs/response.md +0 -195
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/outputs/response.md +0 -377
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -127
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -164
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/eval_metadata.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/outputs/response.md +0 -91
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/outputs/response.md +0 -112
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-viewer.html +0 -1325
- package/screen-recording-workspace/evals.json +0 -41
- package/screen-recording-workspace/iteration-1/benchmark.json +0 -102
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/outputs/demo.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/outputs/demo.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/outputs/region_capture.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/outputs/region_capture.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/outputs/fallback_recording.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/outputs/fallback_recording.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/outputs/record_screen.py +0 -67
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/review.html +0 -1325
- package/src/skills/codex-cli/evals/evals.json +0 -47
- package/src/skills/gemini-cli/evals/evals.json +0 -46
- package/src/skills/tm-search/evals/evals.json +0 -23
package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/outputs/response.md
DELETED
|
@@ -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,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
|
-
}
|
package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/outputs/response.md
DELETED
|
@@ -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.
|
package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/grading.json
DELETED
|
@@ -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
|
-
}
|