Claude-skill-registry ai-feature-template
Create new AI-powered features using xAI Grok. Use when user mentions "new AI feature", "add Grok", "create prompt", "AI analysis", or "generate with AI".
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/ai-feature-template" ~/.claude/skills/majiayu000-claude-skill-registry-ai-feature-template && rm -rf "$T"
manifest:
skills/data/ai-feature-template/SKILL.mdsafety · automated scan (low risk)
This is a pattern-based risk scan, not a security review. Our crawler flagged:
- references .env files
- references API keys
Always read a skill's source content before installing. Patterns alone don't mean the skill is malicious — but they warrant attention.
source content
Creating AI Features with xAI Grok
This project uses xAI's Grok model for AI-powered features with X (Twitter) search capabilities.
Instructions
-
Create API route at
app/api/<feature-name>/route.ts -
Use this template for Grok with X search:
import { NextRequest, NextResponse } from 'next/server'; const corsHeaders = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type', }; // Define your AI persona and instructions const systemPrompt = `You are [PERSONA NAME], a [ROLE DESCRIPTION]. Your task is to [WHAT TO DO] based on the X account data. Output Requirements: - [REQUIREMENT 1] - [REQUIREMENT 2] - [FORMAT INSTRUCTIONS] CRITICAL: Output ONLY the result. No preamble, no explanations.`; export async function OPTIONS() { return NextResponse.json(null, { headers: corsHeaders }); } export async function POST(req: NextRequest) { try { const { handle } = await req.json(); const HANDLE_REGEX = /^[a-zA-Z0-9_]{1,15}$/; if (!handle || !HANDLE_REGEX.test(handle)) { return NextResponse.json( { error: 'Invalid X handle format.' }, { status: 400, headers: corsHeaders } ); } const xaiApiKey = process.env.XAI_API_KEY; if (!xaiApiKey) { return NextResponse.json( { error: 'XAI_API_KEY not configured' }, { status: 500, headers: corsHeaders } ); } // Build 6-month date range for X search const today = new Date(); const toDate = today.toISOString().split('T')[0]; const sixMonthsAgo = new Date(today.getTime() - 182 * 24 * 60 * 60 * 1000); const fromDate = sixMonthsAgo.toISOString().split('T')[0]; const response = await fetch('https://api.x.ai/v1/chat/completions', { method: 'POST', headers: { Authorization: `Bearer ${xaiApiKey}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ // DO NOT CHANGE - grok-4-1-fast required for X search model: 'grok-4-1-fast', messages: [ { role: 'system', content: systemPrompt }, { role: 'user', content: `Analyze @${handle}'s posts and [SPECIFIC INSTRUCTION].`, }, ], search_parameters: { mode: 'on', sources: [{ type: 'x' }], from_date: fromDate, to_date: toDate, }, }), }); if (!response.ok) { const errorText = await response.text(); console.error('xAI API error:', response.status, errorText); return NextResponse.json( { error: `xAI API error: ${response.status}` }, { status: response.status, headers: corsHeaders } ); } const data = await response.json(); const result = data.choices?.[0]?.message?.content; if (!result) { return NextResponse.json( { error: 'No result generated' }, { status: 500, headers: corsHeaders } ); } return NextResponse.json({ result }, { headers: corsHeaders }); } catch (error) { console.error('Error:', error); return NextResponse.json( { error: error instanceof Error ? error.message : 'Unknown error' }, { status: 500, headers: corsHeaders } ); } }
- Add frontend handler in
:app/page.tsx
const handleNewFeature = async () => { setIsLoading(true); try { const response = await fetch('/api/feature-name', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ handle: normalizedHandle }), }); const data = await response.json(); if (!response.ok) throw new Error(data.error); setResult(data.result); toast.success('Generated!'); } catch (err) { toast.error('Failed'); } finally { setIsLoading(false); } };
Existing AI Prompts (Reference)
| Feature | Persona | Output |
|---|---|---|
| analyze-account | Art Director | 4-6 sentence image prompt |
| roast-account | Dr. Burn Notice | 300-400 word therapy letter |
| fbi-profile | FBI Analyst | Classified behavioral report |
Prompt Best Practices
- Define clear persona with voice/tone
- Specify exact output format and length
- Include "Output ONLY..." to prevent preamble
- Add examples for complex outputs
- Use "CRITICAL RULES" section for must-follow instructions
Examples
- "Create a horoscope generator" → New route with astrologer persona
- "Add personality summary" → New route with psychologist persona
Guardrails
- Always use
model for X search capabilitygrok-4-1-fast - Include 6-month date range for search parameters
- Never log or expose API keys
- Handle API errors gracefully with user-friendly messages
- Test prompts for safety/appropriateness before deploying