Practical Guide: Building OpenClaw Skills with Claude Code
Step-by-step tutorial: How to use Claude Code's efficient development workflow to create powerful Skills for OpenClaw. From project setup to testing and deployment, a complete developer guide.
Introduction: Why Combine Claude Code with OpenClaw?
OpenClaw provides a powerful Agent platform, but developing Skills takes time. Claude Code provides efficient AI-assisted development experience.
Both combined = Faster & Better Skills Development Workflow.
This article will guide you through:
- ✅ Environment setup
- ✅ Creating your first Skill
- ✅ Testing & debugging
- ✅ Deployment & publishing
- ✅ Best practices
Step 1: Prepare Development Environment
1.1 Install Required Tools
# Install Node.js (recommend 20+)
nvm install 20
nvm use 20
# Install Claude Code CLI
npm install -g @anthropic-ai/claude-code
# Install pnpm (OpenClaw uses it)
npm install -g pnpm
1.2 Clone OpenClaw Project
# Fork OpenClaw to your GitHub
# Then clone your fork
git clone https://github.com/YOUR_USERNAME/openclaw.git
cd openclaw
# Install dependencies
pnpm install
# Setup development environment
cp .env.example .env
# Edit .env, add necessary API keys
1.3 Setup Git Hooks
# OpenClaw uses Git hooks to ensure code quality
./scripts/setup-git-hooks.js
Step 2: Create Skill with Claude Code
2.1 Quick Start with skill-creator
# In OpenClaw root directory
claude -p "/skill-creator"
# Claude Code will guide you:
# 1. Skill name
# 2. Feature description
# 3. Required tools
# 4. Trigger conditions
Interactive Example:
🤖 Describe the skill you want to create:
💬 I want to create a skill that automatically analyzes GitHub repo's tech stack
and generates visualized reports.
🤖 Analyzing requirements...
Suggested skill name: tech-stack-analyzer
Suggested tools:
- GitHub API (fetch repo info)
- Parser (analyze package.json/requirements.txt)
- Report Generator (generate report)
Confirm generation? [Y/n]
2.2 Manual Skill Structure Creation
cd skills
mkdir tech-stack-analyzer
cd tech-stack-analyzer
Use Claude Code to generate skeleton:
claude -p "
Create OpenClaw skill structure:
skill: tech-stack-analyzer
description: Analyze GitHub repo tech stack and generate report
tools:
- fetch-repo-info
- analyze-dependencies
- generate-report
Please generate complete skill.ts and manifest.json
"
Step 3: Implement Core Skill Functionality
3.1 Define Skill Manifest
skills/tech-stack-analyzer/manifest.json:
{
"name": "tech-stack-analyzer",
"version": "1.0.0",
"description": "Analyze GitHub repo tech stack and generate visualized report",
"author": "Your Name <your.email@example.com>",
"license": "MIT",
"skills": {
"analyze_repo": {
"description": "Analyze specified GitHub repo's tech stack",
"parameters": {
"owner": {
"type": "string",
"description": "Repo owner (username or org)",
"required": true
},
"repo": {
"type": "string",
"description": "Repository name",
"required": true
}
},
"tools": [
"github:fetch-repo",
"parser:dependencies",
"reporter:generate"
]
}
},
"tools": [
{
"name": "github:fetch-repo",
"description": "Fetch repo info from GitHub API"
},
{
"name": "parser:dependencies",
"description": "Parse dependency files"
},
{
"name": "reporter:generate",
"description": "Generate Markdown report"
}
]
}
3.2 Implement Skill Logic
Use Claude Code to assist implementation:
claude -p "
Implement tech-stack-analyzer skill:
Requirements:
1. Use GitHub API to fetch repo info
2. Support parsing files:
- package.json (Node.js)
- requirements.txt (Python)
- go.mod (Go)
- Cargo.toml (Rust)
- pom.xml (Java)
3. Generate tech stack report including:
- Primary languages
- Framework list
- Dependency count
- License info
Please:
- Use TypeScript
- Complete error handling
- Add type definitions
- Follow OpenClaw conventions
"
Claude Code will generate:
skills/tech-stack-analyzer/skill.ts:
import { Skill, Tool, Context } from '@openclaw/sdk';
interface TechStack {
languages: string[];
frameworks: string[];
dependencies: {
total: number;
direct: number;
dev: number;
};
license: string;
}
export const techStackAnalyzer: Skill = {
name: 'tech-stack-analyzer',
description: 'Analyze GitHub repo tech stack',
async analyzeRepo(
context: Context,
params: { owner: string; repo: string }
): Promise<TechStack> {
const { owner, repo } = params;
// 1. Fetch repo info from GitHub
const repoInfo = await context.tools['github:fetch-repo']({
owner,
repo
});
// 2. Detect language
const languages = detectLanguages(repoInfo);
// 3. Analyze dependencies
const dependencies = await analyzeDependencies(
context,
repoInfo.defaultBranch
);
// 4. Extract license
const license = repoInfo.license?.key || 'Unknown';
return {
languages,
frameworks: extractFrameworks(dependencies),
dependencies,
license
};
}
};
Step 4: Test Skill
4.1 Generate Tests with Claude Code
claude -p "
Generate tests for tech-stack-analyzer skill:
Test scenarios:
1. Successful analysis of Node.js repo
2. Successful analysis of Python repo
3. Handling private repo (requires auth)
4. Handling non-existent repo
5. Handling repo without dependency files
Please use:
- Vitest (OpenClaw's testing framework)
- Mock external APIs
- Cover edge cases
"
Generated test file skill.test.ts:
import { describe, it, expect, vi } from 'vitest';
import { techStackAnalyzer } from './skill';
describe('tech-stack-analyzer', () => {
it('should analyze Node.js repo', async () => {
const mockContext = {
tools: {
'github:fetch-repo': vi.fn().mockResolvedValue({
language: 'TypeScript',
languages: { TypeScript: 80, JavaScript: 20 },
license: { key: 'MIT' },
defaultBranch: 'main'
})
}
};
const result = await techStackAnalyzer.analyzeRepo(
mockContext as any,
{ owner: 'facebook', repo: 'react' }
);
expect(result.languages).toContain('TypeScript');
expect(result.license).toBe('MIT');
});
// ... more tests
});
4.2 Run Tests
# In skill directory
pnpm test
# Or use watch mode
pnpm test:watch
# Check coverage
pnpm test:coverage
4.3 Debug with Claude Code
# If tests fail
claude -p "
Debug this test failure:
[Paste test error message]
Please:
1. Analyze error cause
2. Provide fix suggestions
3. Generate fixed code
"
Step 5: Local Testing
5.1 Start OpenClaw Dev Environment
# In OpenClaw root directory
pnpm dev
# This will start:
# - Core services
# - Web UI (http://localhost:3000)
# - WebSocket connections
# - Hot reload
5.2 Test Skill
# Use OpenClaw CLI to test
npx openclaw skill test tech-stack-analyzer \
--owner facebook \
--repo react
# Or use Web UI
# http://localhost:3000/skills/tech-stack-analyzer
Step 6: Optimization & Refinement
6.1 Add Type Safety
claude -p "
Add complete type definitions for tech-stack-analyzer:
Please use:
- TypeScript strict mode
- Interface definitions for all inputs/outputs
- Generic types for multiple repo types
- Zod runtime validation
"
6.2 Add Documentation
claude -p "
Generate skill documentation:
Include:
1. README.md (usage instructions)
2. API.md (API documentation)
3. EXAMPLES.md (usage examples)
4. CONTRIBUTING.md (contribution guide)
Follow OpenClaw documentation standards
"
Step 7: Deploy to Production
7.1 Docker Deployment
# Build Docker image
docker build -t openclaw-tech-stack-analyzer .
# Test run
docker run -d \
-p 3000:3000 \
-env GITHUB_TOKEN=$GITHUB_TOKEN \
openclaw-tech-stack-analyzer
7.2 Cloud Deploy (Render)
# Use Claude Code to generate Render config
claude -p "
Generate Render.com deployment config:
Requirements:
- Auto-deploy from GitHub
- Environment variable configuration
- Health check
- Log collection
"
Best Practices
Development Workflow
graph LR
A[Requirements] --> B[Claude Code Design]
B --> C[Implement]
C --> D[Test]
D --> E{Pass?}
E -->|No| F[Claude Code Debug]
F --> C
E -->|Yes| G[Review]
G --> H[Deploy]
H --> I[Monitor]
Error Handling
// ✅ Good error handling
async function analyzeRepo(owner: string, repo: string) {
try {
const info = await fetchRepoInfo(owner, repo);
return processInfo(info);
} catch (error) {
if (error instanceof NotFoundError) {
throw new SkillError(
`Repository ${owner}/${repo} not found`,
'NOT_FOUND'
);
}
throw new SkillError(
'Failed to analyze repository',
'UNKNOWN_ERROR',
{ originalError: error }
);
}
}
Common Issues
Q1: Skill Won’t Load?
Checklist:
# 1. Check manifest.json syntax
cat manifest.json | jq .
# 2. Check TypeScript compilation
pnpm build
# 3. View logs
tail -f logs/openclaw.log
Q2: GitHub API Rate Limits?
Solution:
// Use authentication to increase limits
const token = process.env.GITHUB_TOKEN;
const headers = {
'Authorization': `token ${token}`,
'Accept': 'application/vnd.github.v3+json'
};
// Implement exponential backoff
async function fetchWithRetry(url: string, retries = 3) {
for (let i = 0; i < retries; i++) {
try {
return await fetch(url, { headers });
} catch (error) {
if (i === retries - 1) throw error;
await sleep(Math.pow(2, i) * 1000);
}
}
}
Resources
Official Resources
Learning Resources
Summary
Development Workflow Recap
1. Environment Setup → Install tools
2. Create Skill → Claude Code assisted
3. Implement Functionality → TDD development
4. Test Debug → Vitest + Claude Code
5. Optimize Complete → Types, docs, performance
6. Deploy Publish → Docker / Cloud
7. Maintain Continuously → CI/CD + monitoring
Key Takeaways
✅ Efficient Development: Claude Code accelerates 3-5x ✅ Quality Assurance: TDD + automated testing ✅ Best Practices: Follow OpenClaw standards ✅ Continuous Improvement: Monitoring & feedback loop
Start building your first OpenClaw Skill now!
Chinese Translation: 實戰指南:用 Claude Code 開發 OpenClaw Skills