feat: add native Gemini CLI extension packaging - #24
Conversation
📝 WalkthroughWalkthroughThe documentation now describes native Gemini CLI extension packaging, installation, commands, components, release status, verification guidance, and maintenance validation. The README identifies Gemini CLI as a supported environment and lists the extension manifest and bundled components. The code-reviewer agent no longer declares a capabilities metadata block. The changelog records both updates. Poem
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
🧪 Generate unit tests (beta)
✨ Simplify code
Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@DISTRIBUTION_CHANNELS.md`:
- Line 15: Align the Gemini CLI native extension status between
DISTRIBUTION_CHANNELS.md and the README installation guidance: either mark the
README repository-URL install section as pre-release, or update the Gemini
channel row after v1.2.0 is Latest and all required release work is complete.
In `@README.md`:
- Around line 119-120: Update the README table entry for commands/ to describe
shared review-command components rather than native commands for each product,
reflecting that Claude Code uses the command file while Gemini and Antigravity
use their respective adapters or conversion flows. Leave the agents/ entry
unchanged.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Central YAML (base), Organization UI (inherited)
Review profile: CHILL
Plan: Enterprise
Run ID: 6822b754-3031-4068-94cb-9def7cc33862
⛔ Files ignored due to path filters (2)
commands/coderabbit/review.tomlis excluded by!**/*.tomlgemini-extension.jsonis excluded by!**/*.json
📒 Files selected for processing (4)
CHANGELOG.mdDISTRIBUTION_CHANNELS.mdREADME.mdagents/code-reviewer.md
🔗 Linked repositories identified
CodeRabbit considers these linked repositories for cross-repo context during reviews:
coderabbitai/bitbucket(manual)
💤 Files with no reviewable changes (1)
- agents/code-reviewer.md
📜 Review details
⚠️ CI failures not shown inline (2)
GitHub Actions: Required approver / 0_verify.txt: feat: add native Gemini CLI extension packaging
Conclusion: failure
##[group]Run set -euo pipefail
�[36;1mset -euo pipefail�[0m
�[36;1m�[0m
�[36;1mowner="${REPOSITORY%%/*}"�[0m
�[36;1mrepo="${REPOSITORY#*/}"�[0m
�[36;1m�[0m
�[36;1mresponse="$(�[0m
�[36;1m gh api graphql \�[0m
�[36;1m -f owner="$owner" \�[0m
�[36;1m -f repo="$repo" \�[0m
�[36;1m -F number="$PR_NUMBER" \�[0m
�[36;1m -f query='�[0m
�[36;1m query($owner: String!, $repo: String!, $number: Int!) {�[0m
�[36;1m repository(owner: $owner, name: $repo) {�[0m
�[36;1m pullRequest(number: $number) {�[0m
�[36;1m isDraft�[0m
�[36;1m reviews(last: 100) {�[0m
�[36;1m nodes {�[0m
�[36;1m author {�[0m
�[36;1m login�[0m
�[36;1m }�[0m
�[36;1m commit {�[0m
�[36;1m oid�[0m
�[36;1m }�[0m
�[36;1m state�[0m
�[36;1m submittedAt�[0m
�[36;1m }�[0m
�[36;1m }�[0m
�[36;1m }�[0m
�[36;1m }�[0m
�[36;1m }�[0m
�[36;1m '�[0m
�[36;1m)"�[0m
�[36;1m�[0m
�[36;1mis_draft="$(jq -r '.data.repository.pullRequest.isDraft' <<<"$response")"�[0m
�[36;1mif [[ "$is_draft" == "true" ]]; then�[0m
�[36;1m echo "Draft PRs cannot merge; approver gate will run when ready for review."�[0m
�[36;1m exit 0�[0m
�[36;1mfi�[0m
�[36;1m�[0m
�[36;1mapproved_by="$(�[0m
�[36;1m jq -r \�[0m
�[36;1m --arg head "$HEAD_SHA" \�[0m
�[36;1m --argjson approvers "$(jq -Rc 'split(",")' <<<"$REQUIRED_APPROVERS")" \�[0m
�[36;1m '�[0m
�[36;1m .data.repository.pullRequest.reviews.nodes�[0m
�[36;1m | map(select((.author.login // "") as $login | $approvers | index($login)))�[0m
�[36;1m | sort_by(.author.login)�[0m
�[36;1m | group_by(.author.login)�[0m
�[36;1m | map(max_by(.submittedAt))�[0m
�[36;1m | map(select(.state == "APPROVED" and .commit.oid == $head))�[0m
�[36;1m | first.author.login // empty�[0m
�[36;1m ...
GitHub Actions: Required approver / verify: feat: add native Gemini CLI extension packaging
Conclusion: failure
##[group]Run set -euo pipefail
�[36;1mset -euo pipefail�[0m
�[36;1m�[0m
�[36;1mowner="${REPOSITORY%%/*}"�[0m
�[36;1mrepo="${REPOSITORY#*/}"�[0m
�[36;1m�[0m
�[36;1mresponse="$(�[0m
�[36;1m gh api graphql \�[0m
�[36;1m -f owner="$owner" \�[0m
�[36;1m -f repo="$repo" \�[0m
�[36;1m -F number="$PR_NUMBER" \�[0m
�[36;1m -f query='�[0m
�[36;1m query($owner: String!, $repo: String!, $number: Int!) {�[0m
�[36;1m repository(owner: $owner, name: $repo) {�[0m
�[36;1m pullRequest(number: $number) {�[0m
�[36;1m isDraft�[0m
�[36;1m reviews(last: 100) {�[0m
�[36;1m nodes {�[0m
�[36;1m author {�[0m
�[36;1m login�[0m
�[36;1m }�[0m
�[36;1m commit {�[0m
�[36;1m oid�[0m
�[36;1m }�[0m
�[36;1m state�[0m
�[36;1m submittedAt�[0m
�[36;1m }�[0m
�[36;1m }�[0m
�[36;1m }�[0m
�[36;1m }�[0m
�[36;1m }�[0m
�[36;1m '�[0m
�[36;1m)"�[0m
�[36;1m�[0m
�[36;1mis_draft="$(jq -r '.data.repository.pullRequest.isDraft' <<<"$response")"�[0m
�[36;1mif [[ "$is_draft" == "true" ]]; then�[0m
�[36;1m echo "Draft PRs cannot merge; approver gate will run when ready for review."�[0m
�[36;1m exit 0�[0m
�[36;1mfi�[0m
�[36;1m�[0m
�[36;1mapproved_by="$(�[0m
�[36;1m jq -r \�[0m
�[36;1m --arg head "$HEAD_SHA" \�[0m
�[36;1m --argjson approvers "$(jq -Rc 'split(",")' <<<"$REQUIRED_APPROVERS")" \�[0m
�[36;1m '�[0m
�[36;1m .data.repository.pullRequest.reviews.nodes�[0m
�[36;1m | map(select((.author.login // "") as $login | $approvers | index($login)))�[0m
�[36;1m | sort_by(.author.login)�[0m
�[36;1m | group_by(.author.login)�[0m
�[36;1m | map(max_by(.submittedAt))�[0m
�[36;1m | map(select(.state == "APPROVED" and .commit.oid == $head))�[0m
�[36;1m | first.author.login // empty�[0m
�[36;1m ...
🧰 Additional context used
🪛 LanguageTool
DISTRIBUTION_CHANNELS.md
[style] ~26-~26: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ckaged in-repo or publicly published. - When the Gemini manifest or bundled componen...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
🔇 Additional comments (4)
CHANGELOG.md (1)
9-10: LGTM!Also applies to: 21-21
DISTRIBUTION_CHANNELS.md (1)
3-3: LGTM!Also applies to: 26-26
README.md (2)
79-91: 🎯 Functional CorrectnessComplete the Gemini install smoke test before publishing this path.
The README presents
gemini extensions install https://github.com/coderabbitai/skillsas a working flow, but the PR notes that local install testing is incomplete because of Gemini trust-state requirements. Run the installation from a clean trust state and confirm thatgemini extensions listshows the extension and/coderabbit:reviewresolves tocommands/coderabbit/review.toml. Otherwise, mark this section as unverified.
8-9: LGTM!Also applies to: 121-122, 261-274
What changed
gemini-extension.jsonmanifest for native Gemini CLI installation./coderabbit:reviewcommand.capabilitiesfrontmatter so the sharedcode-revieweragent loads under Gemini's strict schema.Before → After
Before: CodeRabbit's portable Agent Skill could be installed for Gemini CLI, but
gemini extensions install https://github.com/coderabbitai/skillsfailed because the repository had no Gemini manifest. Gemini also ignored the Claude Markdown command and rejected the shared subagent metadata.After: The repository validates as a native Gemini CLI extension and exposes the existing skills, a branded
/coderabbit:reviewcommand, and the sharedcode-reviewersubagent. No separate Gemini repository, MCP server, hook, or backend path is introduced.Compatibility
code-reviewskill name unchanged;/coderabbit:reviewavoids Google's existing/code-reviewcommand surface.Validation
gemini extensions validate .— pass with Gemini CLI 0.40.0agy plugin validate .— pass: 2 skills, 1 agent, 2 converted commandsJSON and TOML parse checks — pass
git diff --check— passgemini extensions install https://github.com/coderabbitai/skills --ref nehal/gemini-cli-extension --consent --skip-settings— passgemini extensions list— pass: showedcoderabbit (1.2.0)and discovered both bundled skillsThe temporary extension install was removed after validation. Interactive
/coderabbit:reviewinvocation remains unverified because Gemini authentication was unavailable.Release gates
v1.2.0as Latest; the current Latest release,v1.1.1, predates this manifest, so the unqualified install command will not work until then.gemini-cli-extensionrepository topic after release if gallery discovery is desired.Summary by CodeRabbit
New Features
Documentation