fd28f7e668
Wave 1 of agent definitions enhancement (PR #2299): Schema & Configuration: - Add agent_definitions field to oh-my-opencode config schema - Support list of file paths to .md or .json agent definition files - Add to PARTIAL_STRING_ARRAY_KEYS for Set-union merge semantics - Implement eager path resolution in loadPluginConfig() before merging Path Resolution: - Create resolve-agent-definition-paths.ts helper - User-level paths resolve from ~/.config/opencode/ (no containment) - Project-level paths resolve from project root (with containment check) - Homedir expansion, absolute/relative path handling JSON Agent Loader: - Create parseJsonAgentFile() for .json/.jsonc agent definitions - Validate required fields (name, prompt) - Support tools as string (comma-separated) or array - Map model via mapClaudeModelToOpenCode() - Comprehensive test suite (7 test cases, all passing) Type Extensions: - Extend AgentScope: add 'definition-file' and 'opencode-config' - Add AgentJsonDefinition interface for JSON agent schema All automated checks passing: - lsp_diagnostics clean on all changed files - json-agent-loader.test.ts: 7/7 passing - Full typecheck: zero new errors - QA evidence saved to .sisyphus/evidence/
23 lines
705 B
TypeScript
23 lines
705 B
TypeScript
import { homedir } from "os"
|
|
import { isAbsolute, resolve } from "path"
|
|
import { isWithinProject } from "./contains-path"
|
|
import { log } from "./logger"
|
|
|
|
export function resolveAgentDefinitionPaths(
|
|
paths: string[],
|
|
baseDir: string,
|
|
containmentDir: string | null
|
|
): string[] {
|
|
return paths.flatMap((p) => {
|
|
const expanded = p.startsWith("~/") ? p.replace(/^~\//, `${homedir()}/`) : p
|
|
const resolved = isAbsolute(expanded) ? expanded : resolve(baseDir, expanded)
|
|
|
|
if (containmentDir !== null && !isWithinProject(resolved, containmentDir)) {
|
|
log(`agent_definitions path rejected (outside project boundary): ${p} -> ${resolved}`)
|
|
return []
|
|
}
|
|
|
|
return [resolved]
|
|
})
|
|
}
|