Agent skill
firebase-development:validate
Review Firebase code against security model and best practices. Validates firebase.json structure, firestore.rules patterns, functions architecture, authentication implementation, test coverage, and emulator configuration.
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/development/firebase-developmentvalidate
SKILL.md
Firebase Code Validation
Overview
This sub-skill guides you through validating existing Firebase code against proven patterns and security best practices. It handles:
- Checking firebase.json structure (hosting, emulators, functions)
- Reviewing firestore.rules for helper functions and security patterns
- Validating functions architecture matches chosen pattern consistently
- Verifying authentication implementation (API keys or Firebase Auth)
- Checking all files have ABOUTME comments
- Reviewing test coverage (unit + integration tests)
- Validating error handling uses proper result format
- Verifying emulator configuration completeness
- Checking hosting rewrites follow API patterns
- Identifying security vulnerabilities or pattern violations
The workflow uses TodoWrite to track 9 steps from configuration validation to security review.
When This Sub-Skill Applies
Use this sub-skill when:
- Conducting code review of Firebase project
- Auditing security implementation
- Checking if project follows Firebase best practices
- Preparing for production deployment
- User says: "review firebase", "check firebase", "validate", "audit firebase", "look at firebase code"
Do not use for:
- Initial project setup (use @firebase-development/project-setup)
- Adding new features (use @firebase-development/add-feature)
- Debugging active errors (use @firebase-development/debug)
Integration with Superpowers Skills
This sub-skill can integrate with superpowers:requesting-code-review for additional validation:
Integration Pattern:
- Firebase validate sub-skill performs Firebase-specific validation (patterns, security, configuration)
- Optionally invoke superpowers:requesting-code-review for broader code quality review
- Superpowers provides general code quality, maintainability, test coverage analysis
When to Escalate to Superpowers:
- Need general code quality review beyond Firebase patterns
- Want architectural feedback on TypeScript code organization
- Need test quality assessment beyond coverage numbers
Firebase validate is sufficient for:
- Firebase configuration validation
- Security rules review
- Firebase-specific pattern compliance
- Authentication implementation review
Reference Patterns
All patterns are documented in the main @firebase-development skill. This sub-skill validates code against those patterns.
Key Sections Referenced:
- Multi-Hosting Setup: site: vs target: vs single-with-rewrites validation
- Authentication: API key format, Firebase Auth roles, middleware patterns
- Functions Architecture: Express vs domain-grouped vs individual consistency
- Security Model: Server-write-only vs client-write-validated rules
- Firestore Rules Patterns: Helper functions, diff().affectedKeys(), role lookups
- Emulator Configuration: singleProjectMode, UI enabled, port settings
- Modern Tooling: TypeScript, vitest, biome, ABOUTME comments
- Testing Requirements: Unit + integration test coverage
TodoWrite Workflow
This sub-skill creates a TodoWrite checklist with 9 steps. Follow the checklist to systematically validate your Firebase project.
Step 1: Check firebase.json Structure
- Content: Check firebase.json for completeness and consistency
- ActiveForm: Checking firebase.json for completeness and consistency
Actions:
Read the firebase.json file and validate its structure:
Required Sections:
hosting- Must be present (can be array or object)functions- Should specify source directory and runtimefirestore- Should specify rules and indexes filesemulators- Should be configured for local development
Hosting Validation:
Check which pattern is used and validate it:
-
If using site: based (multiple sites):
bash# Verify sites exist firebase hosting:sites:list- Each hosting entry should have
sitefield - Site names should match Firebase Console sites
- Rewrites should point to valid functions
- Each hosting entry should have
-
If using target: based:
bash# Check .firebaserc for target mappings cat .firebaserc | grep targets- Each hosting entry should have
targetfield - Targets should be mapped in
.firebaserc - If using predeploy hooks, validate build scripts exist
- Each hosting entry should have
-
If using single hosting:
- Should have
sourceorpublicfield - Rewrites should reference existing functions
- Check if project would benefit from multiple sites
- Should have
Functions Validation:
{
"functions": {
"source": "functions",
"runtime": "nodejs20",
"predeploy": ["npm --prefix \"$RESOURCE_DIR\" run lint", "npm --prefix \"$RESOURCE_DIR\" run build"]
}
}
Check:
sourcepoints to functions directoryruntimematches package.json engines.nodepredeployincludes lint and build steps
Firestore Validation:
{
"firestore": {
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
}
}
Check:
- Rules file exists and is readable
- Indexes file exists (even if empty array)
Storage Validation (if using):
{
"storage": {
"rules": "storage.rules"
}
}
Mark issues found:
- Missing sections
- Invalid file paths
- Inconsistent hosting pattern
- Missing predeploy hooks
Step 2: Validate Emulator Configuration
- Content: Validate emulator settings in firebase.json
- ActiveForm: Validating emulator settings in firebase.json
Actions:
Check emulators configuration matches best practices:
Required Configuration:
{
"emulators": {
"auth": { "port": 9099 },
"functions": { "port": 5001 },
"firestore": { "port": 8080 },
"hosting": { "port": 5000 },
"ui": { "enabled": true, "port": 4000 },
"singleProjectMode": true
}
}
Critical Checks:
singleProjectMode: true- ESSENTIAL for emulators to work togetherui.enabled: true- ESSENTIAL for debugging- All services project uses have emulator entries
- Ports don't conflict with common services
If using target-based hosting:
{
"emulators": {
"hosting": [
{"target": "main", "port": 5000},
{"target": "api", "port": 5002}
]
}
}
Check:
- All hosting targets have emulator ports
- Ports are sequential and don't conflict
Mark issues found:
- Missing
singleProjectMode: true - UI not enabled
- Missing emulator entries for services in use
- Port conflicts (check with
lsof -i :PORT)
Step 3: Review Firestore Rules Structure
- Content: Review firestore.rules for helper functions and security patterns
- ActiveForm: Reviewing firestore.rules for helper functions and security patterns
Actions:
Read firestore.rules and validate against patterns:
Required Structure:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Helper functions at top
function isAuthenticated() {
return request.auth != null;
}
function isOwner(userId) {
return isAuthenticated() && request.auth.uid == userId;
}
// Collection rules
// Default deny at bottom
match /{document=**} {
allow read, write: if false;
}
}
}
Pattern Validation:
-
Helper Function Extraction:
- Are repeated conditions extracted into helper functions?
- Examples:
isAuthenticated(),isOwner(),isAdmin(),isTeamMember() - Functions should be at top of rules file
-
Security Model Consistency:
- Check if using server-write-only OR client-write-validated
- Server-write-only: All collections should have
allow write: if false; - Client-write: Must use
diff().affectedKeys().hasOnly([...])validation
-
Authentication Patterns:
- If using API keys: Server-write-only model required
- If using Firebase Auth: Check role-based helpers (
isAdmin(),isModerator()) - Verify user role lookups:
get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role
-
Collection Group Support:
- If using
collectionGroup()queries in code, check formatch /{path=**}/collection/{id}rules - Example: Sessions subcollection accessible via collection group
- If using
-
Field-Level Validation (client-write):
javascriptallow update: if request.auth != null && request.resource.data.diff(resource.data).affectedKeys() .hasOnly(['displayName', 'bio', 'photoURL']);- Check sensitive fields are protected (role, admin, balance, etc.)
-
Default Deny:
- Rules file MUST end with:
match /{document=**} { allow read, write: if false; } - This catches any unmatched paths
- Rules file MUST end with:
Mark issues found:
- No helper functions (copy-pasted logic)
- Mixed security models within same collection
- Missing default deny rule
- Sensitive fields not protected in client-write rules
- Missing collection group rules for subcollections
- No authentication checks
Step 4: Validate Functions Architecture Consistency
- Content: Verify functions follow chosen architecture pattern consistently
- ActiveForm: Verifying functions follow chosen architecture pattern consistently
Actions:
Identify the architecture pattern in use and validate consistency:
Step 1: Identify Pattern
Check functions/src/index.ts (or index.js):
-
Express App Pattern:
typescriptimport express from 'express'; const app = express(); // ... routes ... export const apiName = onRequest(app); -
Domain-Grouped Pattern:
typescriptexport * from './posts'; export * from './journal'; export * from './admin'; -
Individual Files Pattern:
javascriptconst { upload } = require('./functions/upload'); exports.upload = upload;
Step 2: Validate Consistency
For Express Pattern:
- All routes should be in
/toolsor/routesdirectory - Middleware should be in
/middlewaredirectory - Should have health check endpoint:
app.get('/health', ...) - Authentication middleware should be applied consistently
- CORS should be configured:
app.use(cors({ origin: true }))
Check file structure:
ls functions/src/
# Expected: index.ts, middleware/, tools/, services/, shared/
For Domain-Grouped Pattern:
- Each domain file should contain related functions
- Domain boundaries should be clear (posts, journal, admin, etc.)
index.tsshould only re-export, no logic- Shared code in
/shareddirectory
Check exports:
grep "export const" functions/src/*.ts
# Should see multiple exports per domain file
For Individual Files Pattern:
- Each function in separate file under
/functionsdirectory index.jsimports and re-exports all functions- Minimal shared code
Check structure:
ls functions/functions/
# Should see one file per function
Cross-Pattern Validation:
- Don't mix patterns (e.g., some Express routes + some individual files)
- If project has grown, suggest migration path
- Check if current pattern still serves project needs
Mark issues found:
- Mixed architecture patterns
- Files in wrong directories
- Missing middleware for Express pattern
- Missing health check endpoint
- Inconsistent exports
Step 5: Check Authentication Implementation
- Content: Verify authentication follows chosen pattern correctly
- ActiveForm: Verifying authentication follows chosen pattern correctly
Actions:
Identify authentication approach and validate implementation:
Step 1: Identify Auth Pattern
Check for:
- Custom API Keys: Look for
middleware/apiKeyGuard.tsor similar - Firebase Auth: Look for
request.auth.uidchecks in functions - Both: Project may use both patterns
Step 2: Validate API Key Implementation
If using API keys:
// middleware/apiKeyGuard.ts should exist
Check middleware:
- Validates key format (e.g.,
ooo_*,bot_*,meme_*) - Uses
collectionGroup('apiKeys')query - Checks
active: trueflag - Attaches
userIdto request object - Returns 401 for invalid keys
Check Firestore structure:
# In Emulator UI or production, verify collection structure
/users/{userId}/apiKeys/{keyId}
Fields should include:
keyId: string(the actual API key)userId: string(owner)active: booleancreatedAt: timestamp
Check usage:
// Express routes should use middleware
app.post('/endpoint', apiKeyGuard, async (req, res) => {
const userId = req.userId; // Set by middleware
// ...
});
Step 3: Validate Firebase Auth Implementation
If using Firebase Auth:
Check functions:
// Should check request.auth
if (!request.auth) {
return { success: false, message: 'Not authenticated' };
}
const userId = request.auth.uid;
Check role-based access:
// Should look up user role
const userDoc = await admin.firestore().collection('users').doc(userId).get();
const role = userDoc.data()?.role;
if (role !== 'admin') {
return { success: false, message: 'Insufficient permissions' };
}
Check Firestore rules match:
function isAdmin() {
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin';
}
Step 4: Check Client-Side Auth Configuration
If project has hosting with client app:
Check hosting/lib/firebase.ts (or similar):
// Should connect to auth emulator in development
if (process.env.NODE_ENV === 'development') {
connectAuthEmulator(auth, 'http://127.0.0.1:9099');
}
Check environment variables:
# hosting/.env.local should have
NEXT_PUBLIC_FIREBASE_API_KEY=...
NEXT_PUBLIC_USE_EMULATORS=true
Mark issues found:
- No authentication checks in sensitive functions
- API key format validation missing
activeflag not checked- No userId attachment to request
- Firebase Auth role lookups missing
- Client-side emulator connection missing
- Environment variables not documented
Step 6: Verify All Files Have ABOUTME Comments
- Content: Check all TypeScript files start with ABOUTME comments
- ActiveForm: Checking all TypeScript files start with ABOUTME comments
Actions:
Validate ABOUTME comment pattern across codebase:
Required Pattern:
// ABOUTME: Brief description of what this file does
// ABOUTME: Second line with additional context
import { something } from 'somewhere';
// ... rest of file
Check all TypeScript files:
# Find all .ts files
find functions/src -name "*.ts" -not -path "*/node_modules/*"
# Check for ABOUTME comments
grep -L "ABOUTME:" functions/src/**/*.ts
Files without ABOUTME comments are violations.
Common Locations:
functions/src/index.ts- Main entry pointfunctions/src/middleware/*.ts- Middleware filesfunctions/src/tools/*.tsorroutes/*.ts- Route handlersfunctions/src/services/*.ts- Service layerfunctions/src/shared/*.ts- Shared utilitiesfunctions/src/*.ts- Domain files (if domain-grouped)
Example Good ABOUTME Comments:
// ABOUTME: Main entry point for Firebase Functions - exports MCP endpoint with tool routing
// ABOUTME: Configures Express app with authentication, CORS, and health check
// ABOUTME: Post creation, reading, and management functions
// ABOUTME: Includes API endpoints and real-time triggers
// ABOUTME: API key validation middleware for Express routes
// ABOUTME: Queries apiKeys collection group and attaches userId to request
// ABOUTME: Vitest configuration for Firebase Cloud Functions testing
// ABOUTME: Configures Node.js test environment with TypeScript support and coverage settings
Mark issues found:
- List files missing ABOUTME comments
- Note: Test files can optionally skip ABOUTME if file purpose is obvious from test name
Step 7: Review Test Coverage
- Content: Check unit and integration test coverage exists
- ActiveForm: Checking unit and integration test coverage exists
Actions:
Validate testing standards are met:
Required Test Types:
-
Unit Tests:
- Location:
functions/src/__tests__/**/*.test.ts - Purpose: Test handlers, utilities, validators in isolation
- Run:
npm test - Should not require emulators
- Location:
-
Integration Tests:
- Location:
functions/src/__tests__/emulator/**/*.test.ts - Purpose: Test complete workflows with real Firebase
- Run:
npm run test:emulator - Require emulators running
- Location:
Check Configuration:
vitest.config.ts should exist:
export default defineConfig({
test: {
environment: 'node',
globals: true,
include: ['**/__tests__/**/*.test.ts'],
exclude: ['**/node_modules/**', '**/lib/**', '**/__tests__/emulator/**'],
coverage: {
provider: 'v8',
reporter: ['text', 'lcov', 'html'],
},
},
});
vitest.emulator.config.ts should exist:
export default defineConfig({
test: {
include: ['**/__tests__/emulator/**/*.test.ts'],
testTimeout: 30000,
},
});
Check package.json scripts:
{
"scripts": {
"test": "vitest run",
"test:emulator": "vitest run --config vitest.emulator.config.ts",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage"
}
}
Run Tests and Check Results:
# Run unit tests
npm test
# Check coverage
npm run test:coverage
Coverage Expectations:
- Unit tests: 60%+ coverage
- All new features should have tests
- Critical business logic should have high coverage
Validate Test Quality:
- Tests actually assert behavior (not just "it runs without error")
- Tests use proper setup/teardown
- Tests are independent (can run in any order)
- Integration tests use real emulator data
- Tests clean up after themselves
Check for Common Issues:
- Tests that always pass (no real assertions)
- Tests marked as
it.skiporit.todo - Tests with hardcoded production data
- Tests that don't clean up Firestore data
Mark issues found:
- Missing unit tests for handlers
- Missing integration tests for workflows
- Test coverage below 60%
- No vitest configuration files
- Tests that don't actually validate behavior
- Integration tests not using emulators
Step 8: Validate Error Handling and Response Format
- Content: Verify all handlers use proper result format with error handling
- ActiveForm: Verifying all handlers use proper result format with error handling
Actions:
Check all function handlers follow proper error handling patterns:
Required Response Format:
// Success response
return { success: true, message: 'Operation completed', data: result };
// Error response
return { success: false, message: 'Error description' };
For Express Routes:
app.post('/endpoint', apiKeyGuard, async (req, res) => {
try {
// Validation
if (!req.body.requiredField) {
res.status(400).json({ success: false, message: 'Missing required field' });
return;
}
// Business logic
const result = await doSomething();
// Success response
res.status(200).json({ success: true, message: 'Success', data: result });
} catch (error) {
console.error('Error in endpoint:', error);
res.status(500).json({ success: false, message: 'Internal server error' });
}
});
For Callable Functions:
export const myFunction = onCall(async (request) => {
try {
// Auth check
if (!request.auth) {
return { success: false, message: 'Not authenticated' };
}
// Validation
if (!request.data.requiredField) {
return { success: false, message: 'Missing required field' };
}
// Business logic
const result = await doSomething();
return { success: true, message: 'Success', data: result };
} catch (error) {
console.error('Error in myFunction:', error);
return { success: false, message: 'Internal server error' };
}
});
Validation Checklist:
-
All handlers wrapped in try-catch:
- No unhandled promise rejections
- Errors logged with console.error
- Generic error messages for users (don't leak implementation details)
-
Consistent response format:
- Always include
success: boolean - Always include
message: string - Include
dataonly on success (optional)
- Always include
-
Proper HTTP status codes (Express):
- 200 for success
- 400 for validation errors
- 401 for authentication errors
- 403 for authorization errors
- 500 for internal errors
-
Input validation:
- Check required fields exist
- Validate data types
- Validate ranges/formats
- Return clear error messages
-
Authentication checks:
- Check auth before business logic
- Return 401 for missing auth
- Return 403 for insufficient permissions
Search for Anti-Patterns:
# Functions without try-catch
grep -A 30 "export const.*onRequest\|onCall" functions/src/**/*.ts | grep -v "try {"
# Raw error throws without wrapping
grep "throw new Error" functions/src/**/*.ts
# Missing success field in responses
grep "res.json\|return {" functions/src/**/*.ts | grep -v "success:"
Mark issues found:
- Handlers without try-catch blocks
- Inconsistent response format
- Missing error logging
- Raw errors exposed to clients
- No input validation
- Authentication checks missing
Step 9: Review Security and Production Readiness
- Content: Final security review and production deployment checks
- ActiveForm: Reviewing security and production deployment checks
Actions:
Perform final security audit and deployment readiness check:
Security Checklist:
-
Environment Variables:
bash# Check .gitignore includes grep ".env" .gitignore grep ".env.local" .gitignore # Verify no secrets in code grep -r "apiKey.*=.*\"" functions/src/ grep -r "password.*=.*\"" functions/src/ -
Firestore Rules Production Safety:
- No
allow read, write: if true;except for truly public data - No commented-out security checks
- All helper functions tested
- Collection group rules present if using collectionGroup queries
- No
-
API Key Security (if using):
- Keys stored in
/users/{userId}/apiKeyssubcollection activeflag enforced- Keys have proper prefix for project
- No keys hardcoded in client or functions code
- Keys stored in
-
Firebase Auth Security (if using):
- Role field protected (can't be set by client)
- Admin role restricted properly
- Token validation implemented
- Client SDK properly configured
-
Function Security:
- No admin SDK code exposed to client
- Sensitive operations check authentication
- Rate limiting considered for public endpoints
- CORS configured (not
origin: '*'in production)
Production Readiness Checklist:
-
Dependencies:
bash# Check for vulnerabilities cd functions && npm audit # Check for outdated packages npm outdated -
Build and Deploy Scripts:
bash# Verify build works cd functions && npm run build # Verify lint passes npm run lint # Verify tests pass npm test npm run test:emulator -
Firebase Configuration:
.firebaserchas correct project IDfirebase.jsonhas production-ready settings- Hosting sites created in Firebase Console
- Function runtime matches package.json engines
-
Indexes:
bash# Check firestore.indexes.json exists and is non-empty if using complex queries cat firestore.indexes.json -
Monitoring and Logging:
- Functions have meaningful console.log statements
- Errors logged with context
- Consider Cloud Functions logging level
-
Cost Awareness:
- Reviewed Cloud Functions invocation patterns
- Considered cold start impact
- Evaluated server-write-only vs client-write trade-offs
- Set up billing alerts in Firebase Console
Deployment Testing Plan:
# 1. Test in emulators
firebase emulators:start
# 2. Deploy to preview channel (hosting only)
firebase hosting:channel:deploy preview
# 3. Deploy functions to production
firebase deploy --only functions
# 4. Deploy rules carefully
firebase deploy --only firestore:rules
# 5. Deploy hosting
firebase deploy --only hosting
Mark issues found:
- Secrets exposed in code or git
- Insecure Firestore rules
- Failed security checks
- Missing production configuration
- Vulnerabilities in dependencies
- Tests failing
- Missing indexes for complex queries
Validation Checklists by Pattern
Multi-Hosting Pattern Validation
Site-Based Pattern:
- All sites exist in Firebase Console (
firebase hosting:sites:list) - Each hosting entry has unique
sitefield - No predeploy hooks (not supported with site:)
- Rewrites reference existing functions
- Emulator configuration has hosting port (single port for all sites)
Target-Based Pattern:
- All targets mapped in
.firebaserc - Target mappings match firebase.json entries
- Predeploy hooks reference valid build scripts
- Build scripts execute successfully
- Emulator configuration has per-target ports
- .firebaserc committed to git
Single-Hosting Pattern:
- Has
sourceorpublicfield - Rewrites configured for function routes
- Consider if project would benefit from multiple sites
Authentication Pattern Validation
API Key Pattern:
- Middleware validates key format with project prefix
- Uses
collectionGroup('apiKeys')query - Checks
active: trueflag - Attaches
userIdto request object - Returns 401 for invalid keys
- Firestore rules allow server-write-only for apiKeys
- Keys stored as
/users/{userId}/apiKeys/{keyId}
Firebase Auth Pattern:
- Functions check
request.auth.uid - User roles stored in
/users/{userId} - Firestore rules have role-based helpers
- Client-side connects to auth emulator in development
- Environment variables configured correctly
- Role field protected from client writes
Both Patterns:
- Clear separation between API key routes and Firebase Auth routes
- Documentation explains which auth method for which use case
- No confusion in authentication checks
Security Model Validation
Server-Write-Only:
- All collections have
allow write: if false; - Read rules appropriate for data sensitivity
- Helper functions used for reusable logic
- Default deny rule at end
- Functions use admin SDK for writes
- No client-side write attempts in code
Client-Write with Validation:
- All write rules use
diff().affectedKeys().hasOnly([...]) - Sensitive fields (role, balance, etc.) protected
- Authentication checked in all write rules
- Ownership validated (userId matches)
- Helper functions extract repeated logic
- Default deny rule at end
- Rules tested in emulator Rules Playground
Trigger Keywords
This sub-skill activates when user says:
- "review firebase code"
- "check firebase setup"
- "validate firebase project"
- "audit firebase security"
- "look at firebase configuration"
- "review firestore rules"
- "check firebase.json"
- "validate authentication"
Common Issues Found During Validation
-
Missing singleProjectMode in emulators:
- Symptom: Emulators don't communicate with each other
- Fix: Add
"singleProjectMode": trueto emulators config
-
No default deny rule:
- Symptom: Unmatched paths are accessible
- Fix: Add
match /{document=**} { allow read, write: if false; }at end
-
Mixed architecture patterns:
- Symptom: Some Express routes + some individual function files
- Fix: Migrate to consistent pattern
-
Missing ABOUTME comments:
- Symptom: Files have no documentation header
- Fix: Add 2-line ABOUTME comment to every .ts file
-
No integration tests:
- Symptom: Only unit tests exist
- Fix: Add emulator tests for critical workflows
-
Inconsistent response format:
- Symptom: Some functions return data directly, others use {success, message}
- Fix: Standardize all responses to {success, message, data?}
-
No error handling:
- Symptom: Functions not wrapped in try-catch
- Fix: Add try-catch and proper error responses
-
Secrets in code:
- Symptom: API keys or passwords hardcoded
- Fix: Move to environment variables, update .gitignore
-
Client-write without validation:
- Symptom: Firestore rules allow updates without field restrictions
- Fix: Add diff().affectedKeys().hasOnly([...]) validation
-
No authentication checks:
- Symptom: Sensitive functions don't check auth
- Fix: Add request.auth.uid check or apiKeyGuard middleware
Reference Main Skill Patterns
All validation is performed against patterns documented in @firebase-development:
- Multi-Hosting Setup: Refer to main skill for site: vs target: vs single-with-rewrites
- Authentication: Refer to main skill for API key and Firebase Auth patterns
- Functions Architecture: Refer to main skill for Express, domain-grouped, individual patterns
- Security Model: Refer to main skill for server-write-only vs client-write-validated
- Firestore Rules Patterns: Refer to main skill for helper functions, diff(), role lookups
- Emulator Development: Refer to main skill for configuration and workflow
- Modern Tooling: Refer to main skill for TypeScript, vitest, biome standards
- Testing Requirements: Refer to main skill for unit + integration expectations
Completion Criteria
Validation is complete when:
- All 9 TodoWrite steps marked completed
- firebase.json validated against chosen patterns
- Emulator configuration complete with singleProjectMode
- Firestore rules reviewed for security patterns
- Functions architecture consistent throughout
- Authentication implementation validated
- All files have ABOUTME comments
- Test coverage meets requirements (unit + integration)
- Error handling follows {success, message, data?} format
- Security review passed with no critical issues
- Production readiness checklist completed
Output:
- Summary document of findings
- List of issues categorized by severity (critical, important, nice-to-have)
- Recommendations for remediation
- Confirmation that project follows Firebase best practices
Didn't find tool you were looking for?