Files
last30days-skill/docs/plans/2026-03-08-feat-gemini-cli-support-implementation-plan.md
T
Matt Van Horn 627947fc2c feat(plugin): publish as Claude Code marketplace plugin
Update .claude-plugin/marketplace.json and plugin.json to v2.9.5 with
full metadata. Add plugin install instructions to README as the
recommended install method. The repo root serves as both the marketplace
and the plugin - skills/last30days/SKILL.md (symlink) is discovered
automatically.

Users can now install with:
  /plugin marketplace add mvanhorn/last30days-skill
  /plugin install last30days@last30days-skill

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:09:33 -07:00

6.3 KiB

title, type, status, date, origin
title type status date origin
feat: Add Gemini CLI extension support feat completed 2026-03-08 docs/plans/2026-03-08-review-pr-53-gemini-cli-support-plan.md

feat: Add Gemini CLI Extension Support

Overview

Add Gemini CLI compatibility to last30days by cherry-picking the good parts from PR #53 (@alexferrari88) and fixing the implementation problems ourselves. Close PR #53 with a thank-you comment crediting the contributor.

Based on the review at docs/plans/2026-03-08-review-pr-53-gemini-cli-support-plan.md, we accept the concept but fix the approach to match our "one SKILL.md for all platforms" convention established during Codex compatibility work.

What We Take from PR #53

Component Source Changes Needed
gemini-extension.json PR #53 Fix settings format (array, not object), bump version to 2.9.5
Path resolution (for loop) PR #53 Take as-is, add to both SKILL.md and variants/open/SKILL.md
README.md install section PR #53 Take as-is

What We Skip from PR #53

Component Reason
skills/last30days/SKILL.md (693-line copy) Duplicate maintenance nightmare - use symlink instead
"or" tool name scattering in SKILL.md LLMs translate tool intent natively - clutters prompt
Gemini tool names in allowed-tools Gemini ignores allowed-tools; risks breaking Claude Code

Implementation Steps

1. Create gemini-extension.json (new file)

Based on PR #53 but with correct settings format (array per Gemini CLI docs) and v2.9.5 version.

{
  "name": "last30days-skill",
  "version": "2.9.5",
  "description": "Research a topic from the last 30 days across Reddit, X, YouTube, TikTok, Instagram, Hacker News, Polymarket, and the web.",
  "settings": [
    {
      "name": "Extension Directory",
      "description": "Extension installation directory (auto-set by Gemini CLI)",
      "envVar": "GEMINI_EXTENSION_DIR",
      "sensitive": false
    },
    {
      "name": "ScrapeCreators API Key",
      "description": "ScrapeCreators API Key for Reddit, TikTok, and Instagram search (required)",
      "envVar": "SCRAPECREATORS_API_KEY",
      "sensitive": true
    },
    {
      "name": "OpenAI API Key",
      "description": "OpenAI API Key - optional fallback for Reddit discovery",
      "envVar": "OPENAI_API_KEY",
      "sensitive": true
    },
    {
      "name": "xAI API Key",
      "description": "xAI API Key for X/Twitter search (optional)",
      "envVar": "XAI_API_KEY",
      "sensitive": true
    },
    {
      "name": "OpenRouter API Key",
      "description": "OpenRouter API Key (optional)",
      "envVar": "OPENROUTER_API_KEY",
      "sensitive": true
    },
    {
      "name": "Parallel AI API Key",
      "description": "Parallel AI API Key (optional)",
      "envVar": "PARALLEL_API_KEY",
      "sensitive": true
    },
    {
      "name": "Brave Search API Key",
      "description": "Brave Search API Key (optional)",
      "envVar": "BRAVE_API_KEY",
      "sensitive": true
    },
    {
      "name": "Apify API Token",
      "description": "Apify API Token (optional legacy)",
      "envVar": "APIFY_API_TOKEN",
      "sensitive": true
    },
    {
      "name": "Twitter AUTH_TOKEN",
      "description": "Twitter browser AUTH_TOKEN cookie for direct X search (optional)",
      "envVar": "AUTH_TOKEN",
      "sensitive": true
    },
    {
      "name": "Twitter CT0",
      "description": "Twitter browser CT0 cookie (optional, pair with AUTH_TOKEN)",
      "envVar": "CT0",
      "sensitive": true
    }
  ]
}
mkdir -p skills/last30days
ln -s ../../SKILL.md skills/last30days/SKILL.md

Gemini CLI discovers skills from skills/<name>/SKILL.md. Symlink ensures single source of truth - no drift, no duplicate maintenance. Git tracks symlinks natively on macOS/Linux (Gemini CLI's target platforms).

3. Add Gemini paths to SKILL.md for-loop (line ~172)

Add these 3 entries after "${CLAUDE_PLUGIN_ROOT:-}":

"${GEMINI_EXTENSION_DIR:-}" \
"$HOME/.gemini/extensions/last30days-skill" \
"$HOME/.gemini/extensions/last30days" \

4. Add same Gemini paths to variants/open/SKILL.md for-loop

Same 3 entries, same position.

5. Update README.md install section

Add Gemini CLI install before existing Claude Code section:

### Gemini CLI
\`\`\`bash
gemini extensions install https://github.com/mvanhorn/last30days-skill.git
\`\`\`

### Claude Code / Codex

6. Close PR #53 with credit

Post comment thanking @alexferrari88, explaining we incorporated their work with modifications, and close the PR. Credit them in the commit message.

Acceptance Criteria

  • gemini-extension.json exists with correct array-format settings
  • skills/last30days/SKILL.md is a symlink to ../../SKILL.md
  • Gemini path entries in SKILL.md for-loop (3 new entries)
  • Gemini path entries in variants/open/SKILL.md for-loop (3 new entries)
  • README.md has Gemini CLI install instructions
  • No changes to allowed-tools in any SKILL.md
  • No "or" tool name alternatives in any SKILL.md body
  • Claude Code still works (/last30days runs normally)
  • PR #53 closed with credit to @alexferrari88
  • Commit message credits @alexferrari88 as co-author

Confidence Assessment

High confidence. All changes are additive:

  • New file (gemini-extension.json) - zero conflict risk
  • Symlink (skills/last30days/SKILL.md) - zero conflict risk
  • 3 lines added to a for-loop - trivially safe, short-circuits on first match
  • README addition - simple text
  • No changes to SKILL.md content, allowed-tools, or Python scripts
  • No changes that could break existing Claude Code behavior

The only untested aspect is whether Gemini CLI correctly follows the symlink for skill discovery. If symlinks cause issues, fallback is a 2-line SKILL.md stub that imports the root (but this is unlikely - Gemini CLI runs on macOS/Linux where symlinks are native).

Sources