OpenWriterControle/packages/compatibility-layer/docs/migration-guides/oac-to-claude.md
Alexander Daza ca2e35c30b
feat(lint): resolve all ESLint errors and complete compatibility layer (Issue #141) (#176)
* feat: implement compatibility layer foundation (Issue #141)

- Add TypeScript project setup with strict mode and Vitest
- Implement 20+ Zod validation schemas for OpenAgent format
- Create BaseAdapter abstract class with template method pattern
- Add context documentation for compatibility layer workflow
- Setup ESLint, TypeScript, and test configuration

Phase 1 Foundation: 50% complete (subtasks 01-03)
Related: #141

* feat: implement AgentLoader with TypeScript (Issue #141)

- Add AgentLoader class for loading OAC agent files
- Implement parseFrontmatter() for YAML extraction
- Add extractSections() for markdown parsing (skills, examples, commands, workflow)
- Create custom error classes: AgentLoadError, FrontmatterParseError, ValidationError
- Support single file and recursive directory loading
- Add metadata merging from agent-metadata.json
- Export convenience functions: loadAgent(), loadAgents()
- Full Zod schema validation with descriptive error messages
- 386 lines, type-safe with strict mode

Phase 1 Foundation: 66.7% complete (subtask 04/06)
Related: #141

* feat: implement AdapterRegistry with TypeScript (Issue #141)

- Add AdapterRegistry class for managing tool adapters
- Implement type-safe registration with Map<string, BaseAdapter>
- Add alias support for adapter names (case-insensitive)
- Create custom error class: AdapterRegistryError
- Implement methods: register(), get(), list(), has(), getAll(), unregister(), clear()
- Add capability-based adapter discovery: getCapabilities(), findByFeature()
- Export singleton registry instance and convenience functions
- Support lazy loading of built-in adapters (placeholder for Phase 2)
- 416 lines, fully type-safe with strict mode

Features:
- Duplicate registration prevention
- Alias conflict detection
- O(1) adapter lookup
- Sorted adapter listings
- Comprehensive JSDoc documentation

Phase 1 Foundation: 83.3% complete (subtask 05/06)
Related: #141

* feat: create main entry point index.ts (Issue #141)

- Add comprehensive barrel exports for public API
- Export all Zod schemas and TypeScript types
- Export AgentLoader class and convenience functions
- Export AdapterRegistry, singleton, and helpers
- Export error classes: AgentLoadError, FrontmatterParseError, ValidationError, AdapterRegistryError
- Export BaseAdapter for custom adapter creation
- Add package VERSION constant
- Include JSDoc documentation with usage examples
- Organized exports by category (types, core, adapters)
- 168 lines with comprehensive documentation

All exports:
- Types: All Zod schemas and inferred TypeScript types
- Core: AgentLoader, AdapterRegistry, registry singleton
- Adapters: BaseAdapter abstract class
- Errors: All custom error classes
- Utilities: Convenience functions (loadAgent, getAdapter, etc.)

Phase 1 Foundation: 100% COMPLETE! 🎉 (6/6 subtasks)
Related: #141

* feat: implement ClaudeAdapter with bidirectional conversion (Issue #141)

- Implement ClaudeAdapter extending BaseAdapter
- Support toOAC() conversion from Claude Code format to OAC
- Support fromOAC() conversion from OAC to Claude Code format
- Handle .claude/config.json for primary agents
- Handle .claude/agents/*.md for subagents with YAML frontmatter
- Map Claude Skills system to/from OAC contexts
- Map hooks (PreToolUse, PostToolUse, etc.) bidirectionally
- Degrade granular OAC permissions to Claude permissionMode
- Add warnings for unsupported features (temperature, maxSteps)
- Export ClaudeAdapter from main index.ts

Capabilities:
- supportsMultipleAgents: true
- supportsSkills: true
- supportsHooks: true
- supportsGranularPermissions: false (binary only)
- supportsTemperature: false
- Model ID mapping (claude-sonnet-4 <-> claude-sonnet-4-20250514)
- Tool access mapping (OAC ToolAccess <-> Claude tools array)

Subtask: compatibility-layer-141-07
Phase: 2 (Adapters Migration)

* feat: implement CursorAdapter with single-file format support (Issue #141)

- Implement CursorAdapter extending BaseAdapter
- Support toOAC() conversion from .cursorrules to OAC
- Support fromOAC() conversion from OAC to .cursorrules format
- Handle single-file limitation (no multiple agents)
- Implement mergeAgents() for combining multiple OAC agents
- Parse optional YAML frontmatter in .cursorrules
- Inline context files into .cursorrules content
- Add comprehensive warnings for lost features

Key limitations:
- supportsMultipleAgents: false (single .cursorrules file)
- supportsSkills: false (must inline content)
- supportsHooks: false (not supported by Cursor)
- supportsGranularPermissions: false (binary only)
- supportsTemperature: true (limited support)

Features:
- Model ID mapping (gpt-4, claude-3-opus, etc.)
- Tool access parsing and generation
- Context file inlining with references
- Multi-agent merge capability
- Frontmatter parsing for metadata

Export CursorAdapter from main index.ts

Subtask: compatibility-layer-141-08
Phase: 2 (Adapters Migration)

* feat: implement WindsurfAdapter with bidirectional conversion (Issue #141)

- Add WindsurfAdapter.ts (514 lines) extending BaseAdapter
- Support bidirectional OAC ↔ Windsurf JSON conversion
- Implement toOAC() for Windsurf config → OpenAgent parsing
- Implement fromOAC() for OpenAgent → Windsurf config generation
- Add temperature ↔ creativity setting mapping (low/medium/high)
- Add model ID mapping (claude-sonnet-4 ↔ claude-4-sonnet)
- Support multi-agent configuration via .windsurf/agents/
- Support context files via .windsurf/context/
- Implement binary permission mapping with degradation warnings
- Add priority level normalization (critical/high/medium/low → high/low)
- Export WindsurfAdapter in index.ts
- All adapters now complete: Claude, Cursor, Windsurf
- Compilation successful: 0 errors, 0 warnings

Phase 2 (Adapters): 50% complete (3/6 subtasks)
Total progress: 28.13% (9/32 subtasks)
Code stats: 3,333 lines TypeScript (Foundation + Adapters)

* docs: add compatibility layer context files and progress tracking (Issue #141)

- Add baseadapter-implementation.md with detailed adapter pattern and testing examples
- Add compatibility-layer-development.md with development workflow and best practices
- Add compatibility-layer-adapters.md lookup table with adapter specifications
- Add compatibility-layer-progress.md tracking Phase 1 completion and Phase 2 status
- Add compatibility-learnings.md documenting implementation learnings
- Update compatibility-layer.md with latest architecture insights

These context files support Phase 2 adapter unit testing and future adapter development.

* test: implement comprehensive unit tests for ClaudeAdapter (Issue #141 - Subtask 10)

Implemented 80 test cases covering:
- toOAC() parsing of config.json and agent.md (YAML frontmatter)
- fromOAC() conversion to config.json and agent.md formats
- Capabilities and feature validation
- Model, tool, skill, hook, and permission mapping
- Skill generation from contexts
- Edge cases and error handling
- Roundtrip conversion validation

Coverage achieved:
- 96.32% statements (target: 80%+) ✅
- 100% functions (target: 80%+) ✅
- 82.14% branches (target: 75%+) ✅

All test cases follow AAA pattern (Arrange-Act-Assert) and test standards
from .opencode/context/core/standards/test-coverage.md

* test: implement comprehensive unit tests for CursorAdapter (Issue #141 - Subtask 11)

Implemented 78 test cases covering:
- toOAC() parsing of plain .cursorrules and YAML frontmatter
- fromOAC() conversion to .cursorrules format
- Capabilities and feature validation
- Agent merging (CURSOR-SPECIFIC - unique feature)
- Model, tool mapping
- Context inlining
- Temperature and configuration handling
- Edge cases and error handling
- Roundtrip conversion validation

Coverage achieved:
- 98.55% statements (target: 80%+) ✅
- 100% functions (target: 80%+) ✅
- 89.65% branches (target: 75%+) ✅

Key test areas:
- Plain text .cursorrules parsing (no frontmatter)
- YAML frontmatter parsing with type coercion
- Agent merging (single, two, three+ agents)
- Tool union and temperature MAX behavior
- Context inlining with proper formatting
- Model mapping (Cursor ↔ OAC)

All test cases follow AAA pattern and test standards.

* test: implement comprehensive unit tests for WindsurfAdapter (Issue #141 - Subtask 12)

* feat: implement Phase 3 mappers and translation engine with tests (Issue #141)

- Add ToolMapper: maps tool names between OAC and Claude/Cursor/Windsurf
- Add PermissionMapper: translates granular to binary permissions
- Add ModelMapper: maps AI model IDs between platforms
- Add ContextMapper: maps context file paths between platforms
- Add CapabilityMatrix: feature compatibility analysis across platforms
- Add TranslationEngine: orchestrates all mappers for complete translation

Test coverage:
- ToolMapper: 100% statements, 100% branches
- PermissionMapper: 98% statements, 96% branches
- ModelMapper: 99% statements, 90% branches
- ContextMapper: 97% statements, 94% branches
- CapabilityMatrix: 99% statements, 96% branches
- TranslationEngine: 99% statements, 93% branches

Total: 485 tests passing (249 new tests added)

* docs: update Issue #141 context files to reflect Phase 3 completion

- Update progress from 28% to 59.4% (19/32 subtasks)
- Mark Phases 1-3 as complete (Foundation, Adapters, Mappers)
- Update code stats: 5,799 source lines, 6,322 test lines
- Add test coverage metrics: 485 tests, 97-100% on Phase 3
- Update structure with all implemented files
- Add executive summary for token-efficient context loading
- Document next steps: Phase 4 CLI implementation

* docs(context): harvest Claude Code docs and fix MVI compliance (Phase 1)

- Harvest external Claude Code documentation into context system:
  - hooks-system, agent-skills, subagents-system concepts
  - hook-events, skill-metadata, builtin-subagents lookups
  - Example files for hooks, skills, and subagents
  - Plugin architecture and migration guides

- Fix 6 critical MVI violations (files > 200 lines):
  - Split adding-agent.md → adding-agent-basics.md + adding-agent-testing.md
  - Split adding-skill.md → 3 files (basics, implementation, example)
  - Split task-delegation.md → 3 files (basics, specialists, caching)
  - Split external-libraries.md → 3 files (workflow, scenarios, faq)
  - Split design-assets.md → 4 files (images, icons, fonts, cdn)
  - Split navigation-design.md → 2 files (basics, templates)

- Update navigation files with new references
- Remove consumed source docs from to-be-consumed/

Total: 17 new files created, 6 large files replaced, 5 source docs consumed

* docs(context): MVI compliance Phase 2 - split large workflow and UI files

Split 3 large files into MVI-compliant modules (< 200 lines each):

- design-iteration.md (1058 lines) → 9 files:
  - design-iteration-overview.md (overview, when to use)
  - design-iteration-plan-file.md (mandatory plan template)
  - design-iteration-stage-layout.md (Stage 1)
  - design-iteration-stage-theme.md (Stage 2)
  - design-iteration-stage-animation.md (Stage 3)
  - design-iteration-stage-implementation.md (Stage 4)
  - design-iteration-visual-content.md (Image Specialist)
  - design-iteration-best-practices.md (quality, troubleshooting)
  - design-iteration-plan-iterations.md (managing iterations)

- animation-patterns.md (753 lines) → 6 files:
  - animation-basics.md (fundamentals, timing, easing)
  - animation-components.md (buttons, cards, modals)
  - animation-chat.md (message, typing animations)
  - animation-loading.md (skeleton, spinner, progress)
  - animation-forms.md (focus, validation, scroll)
  - animation-advanced.md (recipes, best practices)

- premium-dark-ui-quick-start.md (638 lines) → 4 files:
  - premium-dark-ui-colors.md (palette, typography, spacing)
  - premium-dark-ui-components.md (core building blocks)
  - premium-dark-ui-layouts.md (hero, features, CTA)
  - premium-dark-ui-advanced.md (animations, accessibility)

Updated navigation files with new references.

* feat(cli): implement CLI scaffolding with Commander.js (Issue #141 - Subtask 20)

- Add src/cli/index.ts: CLI entry point with convert, validate, migrate, info commands
- Add src/cli/types.ts: TypeScript type definitions for CLI options
- Add src/cli/utils.ts: Logging, spinner, and formatting utilities
- Add "type": "module" to package.json for ESM support
- Global options: --verbose, --quiet, --output-format (json|text)
- Commands are placeholders pending implementation in subtasks 21-24

* feat(cli): implement convert command with full format support (Issue #141 - Subtask 21)

- Add src/cli/commands/convert.ts: Complete convert command implementation
- Auto-detect input format from file path and content
- Support bidirectional conversion: OAC <-> Cursor/Claude/Windsurf
- Output to stdout by default, file with --output flag
- Display warnings for feature loss during conversion
- Enable registerBuiltInAdapters in AdapterRegistry
- Add public constructors to all adapters (CursorAdapter, ClaudeAdapter, WindsurfAdapter)
- Fix ESM imports: add .js extensions to all relative imports across codebase

All 485 tests passing.

* feat(cli): implement validate and info commands (Issue #141 - Subtasks 22, 24)

- validate: Checks agent compatibility with target format
  - Reports compatibility score (0-100%)
  - Lists preserved/degraded/lost features
  - Provides suggestions for unsupported features
  - Exit codes: 0=compatible, 1=partial, 2=incompatible
  - Supports --strict and --output-format json

- info: Displays tool capabilities and feature parity
  - Shows feature matrix for all platforms
  - Detailed view for single platform
  - Platform comparison with --compare
  - Documentation links
  - Supports --output-format json

* feat(cli): implement migrate command and add migration guides (Issue #141)

- Add migrate command for full project migration with batch conversion
- Support --dry-run, --force, and --out-dir options
- Generate migration reports with success/failure summaries
- Preserve directory structure in output

Documentation:
- Add 5 migration guides (cursor↔oac, claude↔oac, oac→windsurf)
- Add comprehensive feature-matrices.md with platform comparisons
- Document lossless vs lossy conversion impacts

Completes subtasks: 23, 26, 27, 28, 29, 30, 31

* test(cli): add comprehensive integration tests for all CLI commands (Issue #141)

- Add convert.test.ts with 23 tests for format conversions
- Add validate.test.ts with 21 tests for compatibility validation
- Add migrate.test.ts with 25 tests for batch migration
- Add info.test.ts with 30 tests for capability queries
- Add test fixtures for OAC, Cursor, and Claude formats
- Fix empty directory warning in migrate command

All 584 tests passing with full coverage of CLI modules.

Completes subtask 25

* docs: update README with comprehensive CLI and API documentation (Issue #141)

- Add complete CLI command reference with all options
- Add programmatic API usage examples
- Add feature parity matrix summary
- Add links to all migration guides
- Add architecture overview
- Add custom adapter creation guide

Completes subtask 32 - Feature #141 fully implemented

* docs: add visual examples and format improvements to README

- Add Cursor IDE screenshot (contextscout-cursor.png)
- Add Claude Code validation screenshot (claude-code-validation.png)
- Format code examples with consistent double quotes
- Align feature parity matrix table
- Add .cursorrules and bun.lock to .gitignore

* fix(lint): resolve all ESLint errors in compatibility layer

- Remove async from methods with no await expressions (toOAC, fromOAC, loadFromFile)
- Wrap Promise-returning methods with Promise.resolve/reject
- Fix unsafe type assertions (replace 'as any' with proper type validation)
- Add missing getConfigPath() method to WindsurfAdapter
- Validate AgentCategory enum values before assignment
- Fix return type compatibility issues

All 584 tests passing, 0 ESLint errors (7 acceptable warnings for missing callback return types)

* chore: update package.json author and contributors metadata

- Update author from string to object format with name and GitHub URL
- Add Alexander Daza as contributor with email and GitHub profile
- Maintain npm package.json standard format for author/contributors fields
2026-02-06 00:08:14 +00:00

546 lines
13 KiB
Markdown

# 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