بنقرة واحدة
Used to create a new agent. Used when a user wants to create a new agent
npx skills add https://github.com/seanchiuai/claude-web-template --skill code-reviewerانسخ والصق هذا الأمر في Claude Code لتثبيت المهارة
Used to create a new agent. Used when a user wants to create a new agent
npx skills add https://github.com/seanchiuai/claude-web-template --skill code-reviewerانسخ والصق هذا الأمر في Claude Code لتثبيت المهارة
Build Convex backends with queries, mutations, actions, HTTP endpoints, and schemas. Comprehensive guide for all Convex patterns and workflows.
Build Next.js applications with App Router, Server and Client Components, data fetching, routing, and TypeScript. Use when implementing Next.js pages, layouts, API routes, or React Server Components.
Install and customize shadcn/ui components with Tailwind CSS theming, variants, and styling. Use when adding UI components or customizing the design system.
Automatically deploys to Vercel production, uses Vercel MCP to fetch build logs, analyzes errors, fixes them, and retries until successful deployment. Use when deploying to production or fixing deployment issues.
Create new domain expert with expertise file and workflows. Use when adding new technology or domain area.
Generate prompt variations from templates. Use when creating new commands, skills, or workflows.
| name | Agent Creating |
| description | Used to create a new agent. Used when a user wants to create a new agent |
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.mdYou 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.
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 fetch