Used to create a new agent. Used when a user wants to create a new agent
npx skills add https://github.com/majiayu000/claude-skill-registry --skill Agent Creating
Invoked when the user requests to create a new agent or subagent
When requested to create a new skill, follow these steps:
.claude/agents with the agent name xyz.md (ex: "stripe-implementor" or "code-reviewer")docs/convexGuidelines.mdcode-reviewer.md
name: code-reviewer
description: Expert code review specialist. Proactively reviews code for quality, security, and maintainability. Use immediately after writing or modifying code.
tools: Read, Grep, Glob, Bash
model: inherit
You are a senior code reviewer ensuring high standards of code quality and security.
When invoked:
Review checklist:
Provide feedback organized by priority:
Include specific examples of how to fix issues.
name: Nano-banana-editor
description: Implement an image editor powered by Google Gemini image model. Use this when implementing an AI image editor into app
model: inherit
color: blue
Prevent these exact errors when implementing AI image editing in React Native + Convex.
WILL ERROR: TS7022: 'editImageWithGemini' implicitly has type 'any'
// ❌ This breaks
export const editImageWithGemini = action({
args: { userId: v.string() },
handler: async (ctx, { userId }) => {
// ✅ This works
export const editImageWithGemini = action({
args: { userId: v.string() },
handler: async (ctx, { userId }): Promise<{ success: boolean; versionId?: any }> => {
WILL ERROR: [404 Not Found] models/gemini-2.5-flash-image is not found
// ❌ This breaks
model: 'gemini-2.5-flash-image'
// ✅ This works
model: 'gemini-2.5-flash-image-preview'
WILL ERROR: ReferenceError: Buffer is not defined
// ❌ This breaks
const base64 = Buffer.from(arrayBuffer).toString('base64');
const imageBuffer = Buffer.from(base64Data, 'base64');
// ✅ This works - chunked conversion
const uint8Array = new Uint8Array(arrayBuffer);
let binaryString = '';
const chunkSize = 8192;
for (let i = 0; i < uint8Array.length; i += chunkSize) {
const chunk = uint8Array.slice(i, i + chunkSize);
binaryString += String.fromCharCode.apply(null, Array.from(chunk));
}
const base64 = btoa(binaryString);
// For base64 to blob
const binaryString = atob(base64Data);
const uint8Array = new Uint8Array(binaryString.length);
for (let i = 0; i < binaryString.length; i++) {
uint8Array[i] = binaryString.charCodeAt(i);
}
const blob = new Blob([uint8Array], { type: 'image/jpeg' });
WILL ERROR: RangeError: Maximum call stack size exceeded
// ❌ This breaks with large images
const base64 = btoa(String.fromCharCode(...uint8Array));
// ✅ This works - use chunked processing from #3 above
WILL ERROR: Unsupported URL scheme -- http and https are supported (scheme was data)
// ❌ This breaks
const response = await fetch(sourceImageUrl); // fails if data: URL
// ✅ This works
if (sourceImageUrl.startsWith('data:')) {
const base64Match = sourceImageUrl.match(/^data:image\/[^;]+;base64,(.+)$/);
if (!base64Match) throw new Error('Invalid data URL format');
base64Data = base64Match[1];
} else {
const response = await fetch(sourceImageUrl);
if (!response.ok) throw new Error(`Failed to fetch: ${response.statusText}`);
// ... convert to base64 using chunked method
}
WILL ERROR: Value is too large (1.76 MiB > maximum size 1 MiB)
// ❌ This breaks - data URLs are huge
await ctx.db.insert("projects", {
originalImageUrl: asset.uri, // data: URL = several MB
});
// Frontend passes data URL to mutation
const projectId = await createProject({
originalImageUrl: asset.uri, // BREAKS!
});
// ✅ This works - only storage IDs in database
// Backend generates URL from storage ID
const imageUrl = await ctx.storage.getUrl(originalImageId);
await ctx.db.insert("projects", {
originalImageId: storageId, // small ID
originalImageUrl: imageUrl, // generated URL
});
// Frontend only passes storage ID
const projectId = await createProject({
originalImageId: storageId, // WORKS!
});
: Promise<Type> to all Convex action handlersgemini-2.5-flash-image-preview (with -preview suffix)Buffer - use chunked btoa/atob with 8KB chunksimageUrl.startsWith('data:') before fetchCreate new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
Replace with description of the skill and when Claude should use it.
Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies
This skill should be used when the user wants to "create a skill", "add a skill to plugin", "write a new skill", "improve skill description", "organize skill content", or needs guidance on skill structure, progressive disclosure, or skill development best practices for Claude Code plugins.
Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.
Use when creating new skills, editing existing skills, or verifying skills work before deployment
Take majiayu000/agent creating from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.