plugins/plugin-dev/skills/migrating-gemini-extensions/SKILL.md
Convert a Gemini CLI extension into a Claude Code plugin, preserving functionality and backwards compatibility. Use when the user wants to migrate/port a Gemini extension to Claude Code, convert gemini-extension.json to plugin.json, adapt GEMINI.md context or Gemini tools/hooks, or mentions "gemini-extension.json", "GEMINI.md", or "migrate Gemini".
npx skillsauth add pleaseai/claude-code-plugins migrating-gemini-extensionsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Preserve functionality while adopting Claude Code best practices. Keep gemini-extension.json for
backwards compatibility.
gemini-extension.json, any context file (e.g. GEMINI.md),
commands, MCP servers/tools, custom scripts.plugin-name/
├── .claude-plugin/
│ └── plugin.json # NEW: Claude manifest (source of truth)
├── gemini-extension.json # KEEP: backwards compatibility
├── skills/ # NEW (preferred): convert context → a skill
├── commands/ # optional: convert context → commands
├── hooks/
│ ├── hooks.json # if you keep SessionStart context loading
│ └── scripts/ # ADAPT: update paths to ${CLAUDE_PLUGIN_ROOT}
└── README.md # UPDATE: add Claude install instructions
gemini-extension.json → .claude-plugin/plugin.json:
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "plugin-name",
"version": "1.0.0",
"description": "Description",
"author": { "name": "...", "url": "https://github.com/..." },
"homepage": "...",
"repository": "...",
"license": "MIT",
"keywords": ["..."]
}
Preferred: turn GEMINI.md into a skills/<name>/SKILL.md with frontmatter describing when it
should activate. This loads only when relevant instead of every session. See
../plugin-authoring/references/best-practices.md for why skills beat SessionStart hooks.
Legacy alternative — SessionStart hook (only if you must load context every session):
{
"description": "Load usage instructions at session start",
"hooks": {
"SessionStart": [
{ "matcher": "startup",
"hooks": [ { "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/hooks/context.sh", "timeout": 10 } ] }
]
}
}
#!/usr/bin/env bash
set -euo pipefail
CONTEXT_FILE="${CLAUDE_PLUGIN_ROOT}/hooks/CONTEXT.md"
if [ -f "$CONTEXT_FILE" ]; then
jq -n --arg context "$(cat "$CONTEXT_FILE")" \
'{ "hookSpecificOutput": { "hookEventName": "SessionStart", "additionalContext": $context } }'
fi
Then chmod +x hooks/context.sh.
Gemini tools → inline mcpServers (or .mcp.json):
{
"mcpServers": {
"server-name": {
"command": "npx",
"args": ["-y", "@package/name"],
"env": { "API_KEY": "${PLUGIN_API_KEY:-}" }
}
}
}
Key changes: ${CLAUDE_PLUGIN_ROOT} for local paths, ${VAR:-} for optional env vars, npx -y for
npm packages.
Add a Claude Code install section to the README (marketplace add + /plugin install ...) and keep
the Gemini CLI section for backwards compatibility.
claude --debug, /plugin list, run the plugin's components.gemini ext list..claude-plugin/plugin.json; keep gemini-extension.json.${CLAUDE_PLUGIN_ROOT}; migrate MCP config.${CLAUDE_PLUGIN_ROOT}, or command missing.commands/ nested in .claude-plugin/ instead of at root.docs/lessons-learned/context7.md — a complete migration example.tools
Creates durable, resumable workflows using Vercel's Workflow SDK. Use when building workflows that need to survive restarts, pause for external events, retry on failure, or coordinate multi-step operations over time. Triggers on mentions of "workflow", "durable functions", "resumable", "workflow sdk", "queue", "event", "push", "subscribe", or step-based orchestration.
tools
Install and configure Vercel Workflow SDK before it exists in node_modules. Use when the user asks to "install workflow", "set up workflow", "add durable workflows", "configure workflow sdk", or "init workflow" for Next.js, Express, Hono, Fastify, NestJS, Nitro, Nuxt, Astro, SvelteKit, or Vite.
tools
Migrates Temporal, Inngest, Trigger.dev, and AWS Step Functions workflows to the Workflow SDK. Use when porting Activities, Workers, Signals, step.run(), step.waitForEvent(), Trigger.dev tasks / wait.forToken / triggerAndWait, ASL JSON state machines, Task/Choice/Wait/Parallel states, task tokens, or child workflows.
tools
Use when building UIs leveraging the WordPress Design System (WPDS) and its components, tokens, patterns, etc.