Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
fce063e
Explanding out contributor guidelines (#3)
joehan Feb 11, 2026
62cf00e
update claude plugin marketplace command to use the new repo (#2)
charlotteliang Feb 11, 2026
60ef4b7
add kiro power (#4)
charlotteliang Feb 11, 2026
771cef2
update license (#8)
charlotteliang Feb 12, 2026
88c0f8e
Adding a token counting script (#11)
joehan Feb 19, 2026
b0f9e40
Next -> Main (#16)
joehan Feb 20, 2026
11db8e9
Adding a Cursor plugin (#13)
joehan Feb 20, 2026
2720ebc
Add theme to GCLI extension (#17)
joehan Feb 20, 2026
c66a8c0
Remove curl|bash (#18)
joehan Feb 24, 2026
77cd16a
Update SKILL.md to remove references to 2.5 and instead use `latest`.…
christhompsongoogle Feb 25, 2026
e67411e
feat: Add sync job for genkit-ai/skills (#23)
ssbushi Mar 10, 2026
16b47b6
Change to use `npx` to invoke Firebase CLI (#26)
chkuang-g Mar 10, 2026
b5085bf
use pat for cla reasons (#29)
morganchen12 Mar 10, 2026
1287aca
fix: update workflow title and committer details (#33)
ssbushi Mar 11, 2026
06797c1
Move the local environment setup to a new skill + MCP setup (#31)
chkuang-g Mar 11, 2026
87575fe
fix: Add reviewers to sync-genkit-skills workflow (#35)
ssbushi Mar 11, 2026
c33c1db
chore: sync updated skills (#34)
google-oss-bot Mar 11, 2026
7a30158
Update skill names in security rules documentation (#37)
cmoiccool Mar 12, 2026
3c37179
Support Agent Skills for Firestore Enterprise with Native Mode (#27)
pl04351820 Mar 12, 2026
720d3ba
update the skill verification instruction (#38)
chkuang-g Mar 12, 2026
c4fcaab
chore: sync updated skills (#39)
google-oss-bot Mar 13, 2026
afbce83
gemini-3-pro-preview --> gemini-3.1-pro-preview (#40)
thatfiredev Mar 18, 2026
b3f78f3
Refine `firebase-local-env-setup` instructions for agents (#41)
chkuang-g Mar 18, 2026
3beaec8
Update `firebase-basics` skills (#42)
chkuang-g Mar 18, 2026
3f55d5a
Update `firebase-basics` skill and `firebase-local-env-setup` skill (…
chkuang-g Mar 19, 2026
861027a
Split out python sdk content (#45)
joehan Mar 19, 2026
da81537
Fixing up Cursor plugin format (#46)
joehan Mar 19, 2026
fcf78b8
docs: Improve local installation instructions (#47)
peterfriese Mar 24, 2026
cddbcd5
adjusting cursor plugin to reflect skills and mcp setup path correctl…
charlotteliang Mar 26, 2026
83ee3be
Add new skills logo (#51)
joehan Mar 26, 2026
893a3f2
re-organize claude plugins (#54)
charlotteliang Mar 27, 2026
bec78e7
Moving battlehardened AI studio prompt into skills (#53)
joehan Mar 27, 2026
0643b13
Merge `firebase-local-env-setup` skills into `firebase-basics` (#56)
chkuang-g Mar 30, 2026
babd65e
Change all `firebase` CLI reference to use `npx firebase-tools` (#61)
chkuang-g Apr 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,13 @@
"name": "firebase",
"description": "Official Claude plugin for Firebase. Manage projects, add backend services, develop AI features, deploy & host apps, and more",
"category": "development",
"tags": ["firebase", "backend", "database", "cloud-services"],
"source": "./claude-plugins/firebase"
"tags": [
"firebase",
"backend",
"database",
"cloud-services"
],
"source": "./"
}
]
}
}
30 changes: 30 additions & 0 deletions .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"name": "firebase",
"displayName": "Firebase",
"version": "1.0.1",
"description": "The official Firebase Cursor plugin. Prototype, build, and run modern apps with Firebase's backend and AI infrastructure.",
"author": {
"name": "Firebase",
"email": "firebase-support@google.com",
"url": "https://firebase.google.com"
},
"license": "Apache-2.0",
"keywords": [
"firebase",
"cursor",
"skills",
"mcp",
"firestore",
"hosting",
"auth",
"storage",
"ailogic",
"backend",
"cloud-services"
],
"skills": "./skills/",
"mcpServers": "./.mcp.json",
"logo": "./assets/firebase_logo.svg",
"homepage": "https://github.com/firebase/agent-skills",
"repository": "https://github.com/firebase/agent-skills"
}
30 changes: 30 additions & 0 deletions .github/scripts/prune-skills.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/bin/bash
set -e

# Script to prune deleted Genkit skills
# Usage: ./prune-skills.sh

echo "🧹 Pruning deleted Genkit skills..."

for skill_dir in firebase-skills/skills/*; do
[ -d "$skill_dir" ] || continue
skill_name=$(basename "$skill_dir")
skill_md="$skill_dir/SKILL.md"

# Check if this skill is managed by Genkit
if [ -f "$skill_md" ]; then
# We use yq to check the metadata.
# The '|| echo false' handles cases where the field is missing or yq fails.
is_managed=$(yq -f extract '.metadata["genkit-managed"] == true' "$skill_md" 2>/dev/null || echo false)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The yq command uses the -f flag with extract, which instructs yq to read the filter expression from a file named extract. This file is not present in the repository. If you intended to pass the filter string directly, the -f extract part should be removed.

Suggested change
is_managed=$(yq -f extract '.metadata["genkit-managed"] == true' "$skill_md" 2>/dev/null || echo false)
is_managed=$(yq '.metadata["genkit-managed"] == true' "$skill_md" 2>/dev/null || echo false)


if [ "$is_managed" = "true" ]; then
# If managed by Genkit but not in source, delete it
if [ ! -d "genkit-skills/skills/$skill_name" ]; then
echo "🗑️ Pruning deleted skill: $skill_name"
rm -rf "$skill_dir"
fi
fi
fi
done

echo "✅ Pruning complete."
30 changes: 30 additions & 0 deletions .github/scripts/sync-skills.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/bin/bash
set -e

# Script to sync and tag Genkit skills
# Usage: ./sync-skills.sh

echo "🔄 Syncing skills from Genkit repo..."

for skill_dir in genkit-skills/skills/*; do
[ -d "$skill_dir" ] || continue
skill_name=$(basename "$skill_dir")
dest_dir="firebase-skills/skills/$skill_name"

echo "📦 Syncing $skill_name..."

# Clean destination to ensure exact sync (remove old files)
if [ -d "$dest_dir" ]; then
rm -rf "$dest_dir"
fi
mkdir -p "$dest_dir"

# Copy new files
cp -r "$skill_dir/"* "$dest_dir/"

# Mark as managed by Genkit using yq
# The -i flag edits in place, -f process runs the filter
yq -i -f process '.metadata["genkit-managed"] = true' "$dest_dir/SKILL.md"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Similar to the prune script, the -f process flag instructs yq to look for a file named process containing the filter, which is missing. To apply the filter string directly, remove these flags.

Suggested change
yq -i -f process '.metadata["genkit-managed"] = true' "$dest_dir/SKILL.md"
yq -i '.metadata["genkit-managed"] = true' "$dest_dir/SKILL.md"

done

echo "✅ Sync complete."
50 changes: 50 additions & 0 deletions .github/workflows/sync-genkit-skills.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: Sync Genkit Skills

on:
schedule:
# Runs at 9:00 AM EST (14:00 UTC) on weekdays (Monday-Friday)
- cron: '0 14 * * 1-5'
workflow_dispatch: # For manual trigger

permissions:
# Permission for writing commits and creating PRs is given through
# the bot account PAT.
contents: read

jobs:
sync:
environment: genkit skills automerger cron
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout firebase/agent-skills
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
path: firebase-skills

- name: Checkout genkit-ai/skills
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
repository: genkit-ai/skills
path: genkit-skills

# Identifies skills managed by Genkit that have been deleted from the source repo
# and removes them from this repo.
- name: Prune Deleted Genkit Skills
run: firebase-skills/.github/scripts/prune-skills.sh

# Copies skills from Genkit repo, tags them with metadata, and handles updates.
# Note: Uses 'yq' which is pre-installed on GitHub ubuntu-latest runners.
- name: Sync & Tag Skills
run: firebase-skills/.github/scripts/sync-skills.sh

- name: Create Pull Request
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8
with:
path: firebase-skills
commit-message: "chore: sync updated skills"
title: "chore: 🤖 Sync updated skills from Genkit"
branch: "sync-skills"
committer: Google Open Source Bot <firebase-oss-bot@google.com>
reviewers: joehan, ssbushi
token: ${{ secrets.OSS_BOT_AUTOMERGER_PAT }}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules/
.DS_Store
*.log
17 changes: 17 additions & 0 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"mcpServers": {
"firebase": {
"command": "npx",
"args": [
"-y",
"firebase-tools@latest",
"mcp",
"--dir",
"."
],
"env": {
"IS_FIREBASE_MCP": "true"
}
}
}
}
18 changes: 18 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,24 @@ This project follows

## Contribution process

### main and next branches

This repo has 2 protected branches, `main` and `next`. `main` is the default branch, and most users will use the skills here. `next` is used for development and will contain new skills and improvements that are being staged for release.

If you are making an incremental improvement to an existing skill, point your PR to the `main` branch.

If you are adding a new skill, adding support for a new platform or making a significant change to an existing skill, point your PR to the `next` branch.

### Testing skills

To test out your skill, you can install it from a branch using the 'skills' CLI tool:

```bash
npx skills add https://github.com/firebase/skills/tree/<branch-name>
```

We also have an automated eval pipeline set up in [firebase-tools](https://github.com/firebase/firebase-tools/tree/main/scripts/agent-evals) that is set up to pull content from this repo and run it against a set of test cases. You should add your own test cases there for your skill, both to check activation on the prompts you expect to trigger it, and to check that agents succeed on the tasks you expect it to help with.

### Code reviews

All submissions, including submissions by project members, require review. We
Expand Down
37 changes: 34 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# Firebase Agent Skills
<h1 align="center">
<img src="assets/firebase-agent-skills_logo.svg" width="48" alt="Logo" style="vertical-align: middle; margin-right: 10px;">
Firebase Agent Skills
</h1>


A collection of skills for AI coding agents, to help them understand and work with Firebase more effectively.

Expand Down Expand Up @@ -27,7 +31,7 @@ gemini extensions install https://github.com/firebase/skills
1. Add the Firebase marketplace for Claude plugins:

```bash
claude plugin marketplace add firebase/firebase-tools
claude plugin marketplace add firebase/skills
```

Install the Claude plugin for Firebase:
Expand All @@ -50,7 +54,34 @@ claude plugin marketplace list
git clone https://github.com/firebase/skills.git
```

2. Copy the contents of the `skills` directory to the appropriate location for your AI tool.
2. Copy the contents of the `skills` directory to the appropriate location for your AI tool. Common locations include:
- **Cursor**: `.cursor/rules/`
- **Windsurf**: `.windsurfrules/`
- **GitHub Copilot**: `.github/copilot-instructions.md` (or project-specific instruction files)

### Option 5: Local Path via Agent Skills CLI

The `skills` CLI also supports installing skills from a local directory. If you have cloned this repository, you can add skills by pointing the CLI to your local folder:

```bash
npx skills add /path/to/your/local/firebase-skills/skills
```

If you make changes to the local skills repository and want to update your project with the new changes, you can update them by running:

```bash
npx skills experimental_install
```

### Option 6: Local Development (Live Symlinking)

If you are actively contributing to or developing these skills, using `npx skills add` or copying files means you have to manually update them every time you make a change. Instead, use a symlink so that changes in your local clone are immediately reflected in your test project.

For example, to test with Cursor:

```bash
ln -s /path/to/firebase-skills/skills /path/to/your/test-project/.cursor/rules
```

## 🤝 Contributing

Expand Down
15 changes: 15 additions & 0 deletions assets/firebase-agent-skills_logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions assets/firebase_logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 0 additions & 12 deletions claude-plugins/firebase/.mcp.json

This file was deleted.

1 change: 0 additions & 1 deletion claude-plugins/firebase/skills

This file was deleted.

36 changes: 35 additions & 1 deletion gemini-extension.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,39 @@
"IS_GEMINI_CLI_EXTENSION": "true"
}
}
}
},
"themes": [
{
"name": "firebase-default-dark",
"type": "custom",
"background": {
"primary": "#212121",
"diff": {
"added": "green",
"removed": "red"
}
},
"text": {
"primary": "#E8E8E8",
"secondary": "#A6A6A6",
"link": "#7CACF8",
"accent": "#0B57D0",
"response": "#7CACF8"
},
"status": {
"success": "#6DD58C",
"warning": "#FFB300",
"error": "#E46962"
},
"border": {
"default": "#2F3032",
"focused": "#2F3032"
},
"ui": {
"comment": "#DD2C00",
"symbol": "#2F3032",
"gradient": ["#FFC400", "#FF9100", "#DD2C00"]
}
}
]
}
Loading