A CLAUDE.md is just a markdown file at the root of your repo. Copy the content below into your own project's CLAUDE.md to give your agent the same context.
npx versuz@latest install darrenhinde-openagentscontrol --kind=claude-mdcurl -o CLAUDE.md https://raw.githubusercontent.com/darrenhinde/OpenAgentsControl/HEAD/CLAUDE.md# Migrating from OAC to Claude Code
> Convert OpenAgents Control agents to Claude Code's `.claude/` directory format
## Overview
Export to Claude Code format when you want to use your agents with Claude Code IDE. Claude Code supports subagents (`.claude/agents/*.md`), Skills (`.claude/skills/`), and hooks, making it a feature-rich target with good OAC compatibility.
## Prerequisites
| Requirement | Version | Notes |
|-------------|---------|-------|
| Node.js | >= 18 | Required for CLI |
| @openagents-control/compatibility-layer | Latest | Install via npm |
| Claude Code | Any | Target platform |
```bash
npm install -g @openagents-control/compatibility-layer
```
## Quick Migration
```bash
# Single agent conversion
oac-compat convert agent.md -f claude -o .claude/
# Convert with verbose output
oac-compat convert agent.md -f claude -o .claude/ --verbose
# Validate before converting
oac-compat validate --target claude agent.md
```
## Step-by-Step Manual Migration
### 1. OAC Agent Structure
Typical OAC agent with full features:
```yaml
---
name: DocWriter
description: Documentation authoring agent
mode: subagent
temperature: 0.2
model: claude-sonnet-4
tools:
read: true
write: true
edit: true
bash: false
permission:
bash:
"*": "deny"
edit:
"**/*.md": "allow"
"**/*.env*": "deny"
skills:
- context-manager
- task-management
hooks:
- event: PreToolUse
matchers: ["edit"]
commands:
- type: command
command: "echo 'Editing file...'"
maxSteps: 50
---
# DocWriter
> Mission: Create and update documentation
## Rules
1. Always follow project documentation standards
2. Use concise, example-driven writing
3. Propose changes before implementing
```
### 2. Claude Code Structure
Equivalent `.claude/agents/DocWriter.md` format:
```yaml
---
name: "DocWriter"
description: "Documentation authoring agent"
tools: "Read, Write, Edit"
model: "claude-sonnet-4-20250514"
permissionMode: "default"
skills: ["context-manager", "task-management"]
hooks: {"PreToolUse": [{"matcher": "edit", "hooks": [{"type": "command", "command": "echo 'Editing file...'"}]}]}
---
# DocWriter
> Mission: Create and update documentation
## Rules
1. Always follow project documentation standards
2. Use concise, example-driven writing
3. Propose changes before implementing
```
### 3. Key Differences
| Aspect | OAC | Claude Code |
|--------|-----|-------------|
| File format | Markdown + YAML frontmatter | Markdown + YAML frontmatter |
| File location | `.opencode/agent/*.md` | `.claude/agents/*.md` (subagents) or `.claude/config.json` (primary) |
| Multiple agents | Supported | Supported (as subagents) |
| Permissions | Granular (allow/deny/ask per path) | Binary (permissionMode) |
| Skills | Full system | Supported (`.claude/skills/`) |
| Hooks | Full system | Supported (PreToolUse, PostToolUse, etc.) |
| Contexts | Referenced files | Converted to Skills |
| Temperature | Supported | Not supported |
| maxSteps | Supported | Not supported |
### 4. Feature Mapping
| OAC Feature | Claude Code Equivalent | Notes |
|-------------|------------------------|-------|
| `frontmatter.name` | `name` in frontmatter | Direct mapping |
| `frontmatter.description` | `description` in frontmatter | Direct mapping |
| `frontmatter.model` | `model` in frontmatter | Model name converted |
| `frontmatter.temperature` | N/A | Not supported - warning emitted |
| `frontmatter.mode` | File location | `primary` → `config.json`, `subagent` → `agents/*.md` |
| `frontmatter.tools` | `tools` in frontmatter | Converted to comma-separated string |
| `frontmatter.permission` | `permissionMode` | Degraded to binary mode |
| `frontmatter.skills` | `skills` array | Direct mapping |
| `frontmatter.hooks` | `hooks` object | Converted to Claude format |
| `frontmatter.maxSteps` | N/A | Not supported - warning emitted |
| `contexts` | `.claude/skills/` | Converted to skill files |
| `systemPrompt` | Body content | Direct mapping |
### 5. Model Name Mapping
| OAC Model | Claude Code Model |
|-----------|-------------------|
| `claude-sonnet-4` | `claude-sonnet-4-20250514` |
| `claude-opus-4` | `claude-opus-4` |
| `claude-haiku-4` | `claude-haiku-4` |
| Other models | `sonnet` (default alias) |
## Common Patterns
### Pattern 1: Basic Subagent
**Before (OAC):**
```yaml
---
name: CodeReviewer
description: Reviews code for quality
mode: subagent
tools:
read: true
grep: true
glob: true
---
# Code Reviewer
Review code for:
- Code style consistency
- Potential bugs
- Performance issues
```
**After (Claude Code `.claude/agents/CodeReviewer.md`):**
```yaml
---
name: "CodeReviewer"
description: "Reviews code for quality"
tools: "Read, Grep, Glob"
---
# Code Reviewer
Review code for:
- Code style consistency
- Potential bugs
- Performance issues
```
### Pattern 2: Primary Agent with Hooks
**Before (OAC):**
```yaml
---
name: MainAgent
description: Primary development agent
mode: primary
model: claude-opus-4
hooks:
- event: PreToolUse
matchers: ["bash"]
commands:
- type: command
command: "echo 'Running bash command...'"
- event: PostToolUse
matchers: ["write"]
commands:
- type: command
command: "npm run lint"
---
# Main Agent
Primary agent for development tasks.
```
**After (Claude Code `.claude/config.json`):**
```json
{
"name": "MainAgent",
"description": "Primary development agent",
"systemPrompt": "# Main Agent\n\nPrimary agent for development tasks.",
"model": "claude-opus-4",
"hooks": {
"PreToolUse": [
{
"matcher": "bash",
"hooks": [
{ "type": "command", "command": "echo 'Running bash command...'" }
]
}
],
"PostToolUse": [
{
"matcher": "write",
"hooks": [
{ "type": "command", "command": "npm run lint" }
]
}
]
}
}
```
### Pattern 3: Agent with Contexts (→ Skills)
**Before (OAC):**
```yaml
---
name: StyleGuide
description: Enforces code style
mode: subagent
---
# Style Guide Agent
Follow the project style guide.
```
With `contexts`:
```json
[
{ "path": ".opencode/context/style-guide.md", "priority": "critical", "description": "Project style guidelines" }
]
```
**After (Claude Code):**
`.claude/agents/StyleGuide.md`:
```yaml
---
name: "StyleGuide"
description: "Enforces code style"
skills: ["style-guide"]
---
# Style Guide Agent
Follow the project style guide.
```
`.claude/skills/style-guide/SKILL.md`:
```yaml
---
name: style-guide
description: Project style guidelines
---
# style-guide
This skill provides context from: `.opencode/context/style-guide.md`
Priority: critical
Load the full context file for detailed information:
```bash
cat .opencode/context/style-guide.md
```
```
### Pattern 4: Agent with Granular Permissions
**Before (OAC):**
```yaml
---
name: SecureWriter
description: Writes files with restrictions
mode: subagent
permission:
edit:
"src/**/*.ts": "allow"
"**/*.env*": "deny"
bash:
"*": "deny"
---
# Secure Writer
Write TypeScript files only. Never access secrets.
```
**After (Claude Code `.claude/agents/SecureWriter.md`):**
```yaml
---
name: "SecureWriter"
description: "Writes files with restrictions"
permissionMode: "default"
---
# Secure Writer
Write TypeScript files only. Never access secrets.
## Permission Notes
> **Warning**: Granular OAC permissions were degraded to `permissionMode: default`.
> Original restrictions:
> - edit: Only `src/**/*.ts` allowed
> - edit: `**/*.env*` denied
> - bash: Completely denied
>
> Enforce these manually.
```
## Limitations
### Features Lost in Conversion
| Feature | Impact | Workaround |
|---------|--------|------------|
| **temperature** | Not supported | Use creativity settings in Claude Code |
| **maxSteps** | Not supported | Claude Code manages internally |
| **Granular permissions** | Degraded to `permissionMode` | Document restrictions in prompt |
### Permission Mode Mapping
| OAC Permission Pattern | Claude `permissionMode` |
|------------------------|------------------------|
| All `"allow"` / `true` | `bypassPermissions` |
| All `"deny"` / `false` | `dontAsk` |
| Contains `"ask"` | `default` |
| Mixed/complex rules | `default` (with warning) |
### Conversion Warnings
The converter emits warnings for:
```
⚠️ Agent name is required for Claude Code
⚠️ Agent description is required for Claude Code
⚠️ temperature not supported in Claude Code (value: 0.2)
⚠️ maxSteps not supported in Claude Code (value: 50)
⚠️ granular permissions degraded: allow/deny/ask per operation → binary permissionMode (default/acceptEdits/dontAsk/bypassPermissions)
⚠️ Complex permission rules degraded to 'default' permissionMode. Claude Code does not support granular allow/deny/ask per operation.
```
### What's Preserved
- Agent name and description
- Model selection (with name mapping)
- System prompt content
- Tool access list
- Skills references
- Hooks (full conversion)
- Contexts (converted to Skills)
## Validation
### Verify Conversion Success
```bash
# 1. Run conversion with verbose output
oac-compat convert agent.md -f claude -o .claude/ --verbose
# 2. Check for warnings
# Review any warnings about degraded features
# 3. Validate output files exist
ls -la .claude/
ls -la .claude/agents/
ls -la .claude/skills/
# 4. Test in Claude Code
# Open project in Claude Code and verify agent behavior
```
### Manual Verification Checklist
- [ ] `.claude/config.json` created (for primary agents)
- [ ] `.claude/agents/*.md` created (for subagents)
- [ ] `.claude/skills/` created (if contexts present)
- [ ] Agent name and description present in frontmatter
- [ ] Model setting correct (with Claude naming)
- [ ] System prompt content complete
- [ ] Tools list includes expected tools
- [ ] Skills references match generated skill files
- [ ] Hooks converted correctly (if applicable)
- [ ] Warnings reviewed and addressed
### Programmatic Validation
```typescript
import { ClaudeAdapter, loadAgent } from '@openagents-control/compatibility-layer';
async function validateConversion() {
const agent = await loadAgent('./agent.md');
const adapter = new ClaudeAdapter();
// Check capabilities
const caps = adapter.getCapabilities();
console.log('Claude Code capabilities:', caps);
// Output: { supportsSkills: true, supportsHooks: true, supportsTemperature: false, ... }
// Validate conversion
const warnings = adapter.validateConversion(agent);
if (warnings.length > 0) {
console.log('Conversion warnings:', warnings);
}
// Convert
const result = await adapter.fromOAC(agent);
if (result.success) {
console.log('Conversion successful!');
console.log('Output files:', result.configs.map(c => c.fileName));
// Output: ['.claude/agents/MyAgent.md', '.claude/skills/context-skill/SKILL.md']
console.log('Warnings:', result.warnings);
} else {
console.error('Conversion failed:', result.errors);
}
}
```
## Troubleshooting
### Common Issues
#### "Agent name is required" warning
**Cause**: OAC agent doesn't have a `name` in frontmatter.
**Solution**: Add name to your OAC agent:
```yaml
---
name: MyAgent
description: My agent description
---
```
#### Temperature setting ignored
**Cause**: Claude Code doesn't support temperature control.
**Solution**: No direct equivalent. Claude Code manages creativity internally. Remove temperature from your expectations or use Claude Code's built-in settings.
#### maxSteps not available
**Cause**: Claude Code doesn't expose step limits.
**Solution**: No workaround - Claude Code manages execution internally.
#### Permissions not enforced granularly
**Cause**: Claude Code only supports `permissionMode` (binary modes).
**Solution**: Document permission restrictions in your system prompt:
```
# IMPORTANT RESTRICTIONS
- Only edit files in src/ directory
- Never access .env files
- Do not run bash commands without approval
```
Or accept the degraded `permissionMode`:
- `default` - Prompts for permission
- `acceptEdits` - Auto-accepts edits
- `dontAsk` - Auto-denies
- `bypassPermissions` - Full access
#### Skills not loading in Claude Code
**Cause**: Skills must be in `.claude/skills/{name}/SKILL.md` format.
**Solution**: Verify the skill directory structure:
```
.claude/
skills/
my-skill/
SKILL.md # Must be named SKILL.md
```
#### Hooks not triggering
**Cause**: Hook format mismatch or unsupported event.
**Solution**: Verify hooks use supported events:
- `PreToolUse` - Before tool execution
- `PostToolUse` - After tool execution
- `PermissionRequest` - On permission prompt
- `AgentStart` - Agent session start
- `AgentEnd` - Agent session end
Check hook format in converted file:
```json
{
"hooks": {
"PreToolUse": [
{
"matcher": "bash",
"hooks": [{ "type": "command", "command": "echo 'test'" }]
}
]
}
}
```
## Next Steps
- [Claude → OAC Migration](./claude-to-oac.md) - Import Claude Code configurations
- [OAC → Cursor Migration](./oac-to-cursor.md) - Convert to Cursor format
- [Feature Capabilities Matrix](../feature-matrices/capabilities-overview.md) - Full feature comparison
- [Claude Code Documentation](https://code.claude.com/docs) - Official Claude Code docs