Date: 2026-02-15
Status: Architecture Design
Branch: feature/oac-package-refactor
Priority: CRITICAL - Foundation for v2.0
Transform agent management from markdown-based to JSON-configured, type-safe, multi-IDE compatible system with single source of truth.
โ Markdown agents are hard to parse and validate
โ No type safety or schema validation
โ Difficult to extract metadata programmatically
โ Can't easily query agent properties
โ Version management is manual
โ Hard to convert between IDE formats
โ Duplication across IDEs (OpenCode, Claude, Cursor)
โ
Single source of truth - .opencode/ contains universal format
โ
JSON config + Markdown prompts - Separation of concerns
โ
Type-safe - Full TypeScript interfaces
โ
Queryable - Easy filtering and searching
โ
Validatable - JSON Schema validation
โ
Versionable - Semantic versioning built-in
โ
Convertible - Transform to any IDE format
โ
Multi-IDE - Apply to OpenCode, Claude, Cursor, Windsurf
.opencode/ โ UNIVERSAL FORMAT (source of truth)
โโโ agents/
โ โโโ core/
โ โ โโโ openagent/
โ โ โ โโโ agent.json โ Configuration (metadata, permissions, tools)
โ โ โ โโโ prompt.md โ Prompt content (human-readable)
โ โ โ โโโ system.md โ System instructions (optional)
โ โ โ โโโ examples.md โ Examples (optional)
โ โ โโโ opencoder/
โ โ โโโ agent.json
โ โ โโโ prompt.md
โ โ
โ โโโ subagents/
โ โ โโโ code-reviewer/
โ โ โ โโโ agent.json
โ โ โ โโโ prompt.md
โ โ โโโ test-engineer/
โ โ โโโ agent.json
โ โ โโโ prompt.md
โ โ
โ โโโ manifest.json โ Registry of all agents
โ
โโโ context/ โ Context files (unchanged)
โโโ skills/ โ Skills (unchanged)
โโโ tools/ โ MCP tools (unchanged)
โโโ config.json โ Main OAC config
โ OAC CLI converts/applies โ
โโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโฌโโโโโโโโโโโโ
โ OpenCode โ Claude Code โ Cursor โ Windsurf โ
โ (native) โ (convert) โ (flatten)โ (flatten) โ
โโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโดโโโโโโโโโโโโ
// packages/core/src/types/agent.ts
export interface AgentConfig {
// Metadata
$schema: string;
version: string;
id: string;
name: string;
description: string;
category: 'core' | 'subagent' | 'specialist' | 'meta';
// Agent behavior
mode: 'primary' | 'subagent' | 'tool';
model?: string;
// Prompt configuration
prompt: {
file?: string; // Path to prompt file (e.g., "./prompt.md")
inline?: string; // Inline prompt (for simple agents)
system?: string; // System instructions file
examples?: string; // Examples file
temperature?: number;
maxTokens?: number;
};
// Permissions (approval gates)
permissions: {
bash?: PermissionLevel;
write?: PermissionLevel;
edit?: PermissionLevel;
read?: PermissionLevel;
task?: PermissionLevel;
[key: string]: PermissionLevel | undefined;
};
// Tools (MCP)
tools: {
[toolName: string]: boolean | ToolConfig;
};
// Skills
skills?: string[];
// Plugins
plugins?: string[];
// Context files (@ notation)
context?: string[];
// Dependencies
dependencies?: {
agents?: string[];
subagents?: string[];
skills?: string[];
tools?: string[];
};
// IDE Compatibility
compatibility: {
opencode: CompatibilityLevel;
claude: CompatibilityLevel;
cursor: CompatibilityLevel;
windsurf: CompatibilityLevel;
[ide: string]: CompatibilityLevel;
};
// Metadata
author?: string;
license?: string;
repository?: string;
tags?: string[];
}
export type PermissionLevel = 'allow' | 'approve' | 'deny';
export type CompatibilityLevel = 'full' | 'partial' | 'none';
export interface ToolConfig {
enabled: boolean;
config?: Record<string, any>;
}
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["$schema", "version", "id", "name", "mode", "prompt", "permissions", "tools", "compatibility"],
"properties": {
"$schema": {
"type": "string",
"const": "https://openagents.dev/schemas/agent-v2.json"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+$"
},
"id": {
"type": "string",
"pattern": "^[a-z0-9-]+$"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"category": {
"type": "string",
"enum": ["core", "subagent", "specialist", "meta"]
},
"mode": {
"type": "string",
"enum": ["primary", "subagent", "tool"]
},
"model": {
"type": "string"
},
"prompt": {
"type": "object",
"properties": {
"file": { "type": "string" },
"inline": { "type": "string" },
"system": { "type": "string" },
"examples": { "type": "string" },
"temperature": { "type": "number", "minimum": 0, "maximum": 2 },
"maxTokens": { "type": "number", "minimum": 1 }
}
},
"permissions": {
"type": "object",
"additionalProperties": {
"type": "string",
"enum": ["allow", "approve", "deny"]
}
},
"tools": {
"type": "object",
"additionalProperties": {
"oneOf": [
{ "type": "boolean" },
{
"type": "object",
"properties": {
"enabled": { "type": "boolean" },
"config": { "type": "object" }
}
}
]
}
},
"compatibility": {
"type": "object",
"required": ["opencode", "claude", "cursor", "windsurf"],
"properties": {
"opencode": { "type": "string", "enum": ["full", "partial", "none"] },
"claude": { "type": "string", "enum": ["full", "partial", "none"] },
"cursor": { "type": "string", "enum": ["full", "partial", "none"] },
"windsurf": { "type": "string", "enum": ["full", "partial", "none"] }
}
}
}
}
.opencode/agents/core/openagent/agent.json:
{
"$schema": "https://openagents.dev/schemas/agent-v2.json",
"version": "2.0.0",
"id": "openagent",
"name": "OpenAgent",
"description": "Meta orchestration agent for complex workflows",
"category": "core",
"mode": "primary",
"model": "anthropic/claude-sonnet-4-20250514",
"prompt": {
"file": "./prompt.md",
"system": "./system.md",
"examples": "./examples.md",
"temperature": 0.7,
"maxTokens": 8000
},
"permissions": {
"bash": "approve",
"write": "approve",
"edit": "approve",
"read": "allow",
"task": "approve",
"glob": "allow",
"grep": "allow"
},
"tools": {
"bash": true,
"read": true,
"write": true,
"edit": true,
"task": true,
"glob": true,
"grep": true,
"todowrite": true,
"todoread": true
},
"skills": [
"task-management",
"context-discovery"
],
"plugins": [],
"context": [
"@core/standards/code-quality",
"@core/workflows/task-delegation",
"@core/workflows/code-review"
],
"dependencies": {
"subagents": [
"task-manager",
"context-scout",
"coder-agent",
"code-reviewer",
"test-engineer",
"doc-writer"
],
"skills": [
"task-management"
],
"tools": [
"bash",
"read",
"write",
"edit",
"task"
]
},
"compatibility": {
"opencode": "full",
"claude": "full",
"cursor": "partial",
"windsurf": "partial"
},
"author": "NextSystems",
"license": "MIT",
"repository": "https://github.com/nextsystems/openagents-control",
"tags": [
"orchestration",
"meta",
"planning",
"delegation"
]
}
.opencode/agents/core/openagent/prompt.md:
You are OpenAgent, a meta orchestration agent for complex workflows.
## Your Role
You coordinate complex tasks by:
1. Analyzing user requests
2. Breaking down into subtasks
3. Delegating to specialist agents
4. Validating results
5. Completing the workflow
## Key Principles
- Always use ContextScout before execution
- Request approval before bash/write/edit/task
- Stop on test failures
- Maintain clear communication
## Workflow
[Stage 1: Analyze]
- Classify task type and complexity
- Use ContextScout for discovery
[Stage 2: Plan]
- Present plan and get approval
- Identify context needed
[Stage 3: Execute]
- Load context
- Execute or delegate
- Track progress
[Stage 4: Validate]
- Run tests
- Stop on failure
- Report results
[Stage 5: Complete]
- Update docs
- Summarize changes
- Confirm satisfaction
.opencode/agents/subagents/code-reviewer/agent.json:
{
"$schema": "https://openagents.dev/schemas/agent-v2.json",
"version": "1.0.0",
"id": "code-reviewer",
"name": "CodeReviewer",
"description": "Reviews code for best practices and potential issues",
"category": "subagent",
"mode": "subagent",
"model": "anthropic/claude-sonnet-4-20250514",
"prompt": {
"file": "./prompt.md",
"temperature": 0.3,
"maxTokens": 4000
},
"permissions": {
"bash": "deny",
"write": "deny",
"edit": "deny",
"read": "allow",
"glob": "allow",
"grep": "allow"
},
"tools": {
"read": true,
"glob": true,
"grep": true
},
"skills": [],
"plugins": [],
"context": [
"@core/standards/code-quality",
"@core/standards/security-patterns",
"@core/workflows/code-review"
],
"dependencies": {
"tools": ["read", "glob", "grep"]
},
"compatibility": {
"opencode": "full",
"claude": "full",
"cursor": "partial",
"windsurf": "partial"
},
"author": "NextSystems",
"license": "MIT",
"tags": [
"code-review",
"quality",
"security"
]
}
.opencode/agents/subagents/code-reviewer/prompt.md:
You are CodeReviewer, a specialist in code quality and security.
## Your Role
Review code for:
- Security vulnerabilities
- Performance issues
- Best practices violations
- Maintainability concerns
- Code smells
## Review Process
1. Read the code files
2. Analyze against standards
3. Identify issues by severity
4. Provide actionable recommendations
5. Suggest improvements
## Output Format
**Critical Issues**: Security vulnerabilities, data loss risks
**High Priority**: Performance problems, major code smells
**Medium Priority**: Best practice violations
**Low Priority**: Style improvements, minor optimizations
Always provide specific line numbers and code examples.
// packages/core/src/agent/converters/opencode.ts
export class OpenCodeConverter {
convert(config: AgentConfig): string {
const openCodeConfig = {
$schema: "https://opencode.ai/config.json",
agent: {
[config.id]: {
mode: config.mode,
model: config.model,
prompt: config.prompt.file
? `{file:${config.prompt.file}}`
: config.prompt.inline,
tools: this.convertTools(config.tools),
permissions: config.permissions
}
}
};
return JSON.stringify(openCodeConfig, null, 2);
}
private convertTools(tools: Record<string, boolean | any>): Record<string, boolean> {
const result: Record<string, boolean> = {};
for (const [name, value] of Object.entries(tools)) {
result[name] = typeof value === 'boolean' ? value : value.enabled;
}
return result;
}
}
// packages/core/src/agent/converters/claude.ts
export class ClaudeConverter {
convert(config: AgentConfig): string {
// Claude uses similar format but doesn't support skills/plugins
const claudeConfig = {
agent: {
[config.id]: {
mode: config.mode,
model: config.model,
prompt: config.prompt.content || config.prompt.inline,
tools: this.filterSupportedTools(config.tools),
permissions: config.permissions
}
}
};
return JSON.stringify(claudeConfig, null, 2);
}
private filterSupportedTools(tools: Record<string, boolean | any>): Record<string, boolean> {
// Claude only supports: bash, read, write, edit, glob, grep
const supported = ['bash', 'read', 'write', 'edit', 'glob', 'grep'];
const result: Record<string, boolean> = {};
for (const [name, value] of Object.entries(tools)) {
if (supported.includes(name)) {
result[name] = typeof value === 'boolean' ? value : value.enabled;
}
}
return result;
}
}
// packages/core/src/agent/converters/cursor.ts
export class CursorConverter {
convert(config: AgentConfig): string {
// Cursor uses plain text .cursorrules
let rules = `# ${config.name}\n\n`;
rules += `${config.description}\n\n`;
// Add prompt content (flattened)
if (config.prompt.content) {
rules += this.flattenPrompt(config.prompt.content);
}
// Add permissions as rules
rules += '\n\n## Permissions\n\n';
for (const [tool, level] of Object.entries(config.permissions)) {
rules += `- ${tool}: ${level}\n`;
}
return rules;
}
private flattenPrompt(content: string): string {
// Remove complex sections, keep simple instructions
let result = content;
// Remove frontmatter
result = result.replace(/^---[\s\S]*?---\n/m, '');
// Remove complex sections
const sectionsToRemove = ['Workflow', 'Examples', 'Advanced'];
for (const section of sectionsToRemove) {
const regex = new RegExp(`## ${section}[\\s\\S]*?(?=##|$)`, 'gi');
result = result.replace(regex, '');
}
return result.trim();
}
}
# Convert agent to specific IDE format
oac convert openagent --to=opencode
oac convert openagent --to=claude
oac convert openagent --to=cursor
# Convert all agents
oac convert --all --to=opencode
# Output to file
oac convert openagent --to=opencode --output=.opencode/config.json
# Dry run (show output without writing)
oac convert openagent --to=cursor --dry-run
# Validate agent config against schema
oac validate openagent
# Validate all agents
oac validate --all
# Check IDE compatibility
oac validate openagent --ide=cursor
# Verbose output
oac validate openagent --verbose
# Apply agent to IDE (auto-convert)
oac apply openagent --ide=opencode
oac apply openagent --ide=claude
oac apply openagent --ide=cursor
# Apply all agents
oac apply --all --ide=opencode
# Apply with profile
oac apply --profile=developer --ide=opencode
# Dry run
oac apply openagent --ide=cursor --dry-run
# Force overwrite
oac apply openagent --ide=opencode --force
# Create new agent interactively
oac create agent
# Create from template
oac create agent --template=subagent --name=my-reviewer
# Create with wizard
oac create agent --wizard
# Show agent info
oac info openagent
# Show compatibility matrix
oac info openagent --compatibility
# Show dependencies
oac info openagent --dependencies
# Show all metadata
oac info openagent --full
// Full TypeScript support
import { AgentConfig } from '@oac/types';
const config: AgentConfig = {
// IDE autocomplete works!
id: 'my-agent',
name: 'MyAgent',
mode: 'subagent',
// TypeScript validates everything
permissions: {
bash: 'approve', // โ
Valid
write: 'invalid' // โ Type error!
}
};
// Find all agents that use bash
const bashAgents = agents.filter(a => a.tools.bash === true);
// Find agents compatible with Cursor
const cursorAgents = agents.filter(a => a.compatibility.cursor !== 'none');
// Find all subagents
const subagents = agents.filter(a => a.mode === 'subagent');
// Find agents by category
const coreAgents = agents.filter(a => a.category === 'core');
# Validate against JSON schema
oac validate openagent
# Output:
# โ
Valid agent config
# โ
All required fields present
# โ
Permissions valid (allow/approve/deny)
# โ
Tools valid
# โ
Compatibility matrix complete
# โ
Version format valid (2.0.0)
{
"version": "2.0.0",
"compatibility": {
"oac": ">=0.8.0",
"opencode": ">=1.0.0"
}
}
// Convert to any format
const openCodeConfig = converterRegistry.convert(agentConfig, 'opencode');
const claudeConfig = converterRegistry.convert(agentConfig, 'claude');
const cursorRules = converterRegistry.convert(agentConfig, 'cursor');
// All from single source!
agent.json โ Configuration (machine-readable, type-safe)
prompt.md โ Content (human-readable, editable)
system.md โ System instructions (optional)
examples.md โ Examples (optional)
// VS Code autocomplete
{
"id": "my-agent",
"mode": "sub" // โ Autocomplete suggests: "subagent"
"permissions": {
"bash": "app" // โ Autocomplete suggests: "approve"
}
}
Goal: Build JSON config system and converters
packages/core/src/types/agent.ts)packages/core/src/schemas/agent-v2.json)packages/core/src/agent/loader.ts)Deliverables:
Goal: Implement CLI for convert/validate/apply
oac convert command
--to flag (opencode, claude, cursor)--output flag--dry-run flag--all flagoac validate command
oac apply command
--force flag--dry-run flagoac info command
Deliverables:
Goal: Migrate existing markdown agents to JSON config
scripts/migrate-agents.ts)
Deliverables:
Goal: Comprehensive testing of new system
Deliverables:
Goal: Complete documentation for new system
Deliverables:
Goal: Deprecate old markdown format
Deliverables:
packages/core/src/types/agent.tspackages/core/src/schemas/agent-v2.jsonpackages/core/src/agent/loader.tspackages/core/src/agent/converters/opencode.tspackages/core/src/agent/converters/claude.tspackages/core/src/agent/converters/cursor.tspackages/core/src/agent/converters/windsurf.tspackages/core/src/agent/converters/registry.tspackages/core/src/cli/convert.tspackages/core/src/cli/validate.tspackages/core/src/cli/apply.tspackages/core/src/cli/info.tsscripts/migrate-agents.ts---
id: openagent
name: OpenAgent
type: orchestrator
---
# OpenAgent
You are OpenAgent...
## Tools
- bash (approve)
- write (approve)
- edit (approve)
## Skills
- task-management
## Context
- .opencode/context/core/standards/code-quality.md
Problems:
agent.json:
{
"id": "openagent",
"name": "OpenAgent",
"mode": "primary",
"prompt": { "file": "./prompt.md" },
"permissions": {
"bash": "approve",
"write": "approve",
"edit": "approve"
},
"tools": {
"bash": true,
"write": true,
"edit": true
},
"skills": ["task-management"],
"context": ["@core/standards/code-quality"]
}
prompt.md:
You are OpenAgent...
Benefits:
feature/json-config-systemStatus: Ready for implementation
Estimated Timeline: 6 weeks
Risk Level: Low (backward compatible during migration)
Impact: High (foundation for all future features)
Last Updated: 2026-02-15
Next Review: After Phase 1 completion