All notable changes to OAC (Open Agent Contribution) are documented here.
No unreleased changes.
Note: Versions
2026.3.xand2026.4.xwere published with an incorrect CalVer month. This release corrects the version to2026.2.5(year=2026, month=February, patch=5th iteration).
- fix: Config loader now matches
@open330/oacimport (previously only matched@open330/oac-core)
- feat: OpenCode adapter (
src/execution/agents/opencode.adapter.ts) - feat: Adapter registry replacing hard-coded switch (
src/execution/agents/registry.ts) - fix: 7 pre-existing typecheck errors resolved (
doctor.ts,explain.ts,init.ts,task.ts)
- security: Fixed shell injection in dashboard browser opener (replaced
execwithopenlibrary) - security: Sanitized branch names in
sandbox.tsagainst path traversal - security: Replaced
sh -cshell redirect withexecapiping ingithub-auth.ts - security: Added
AbortSignal.timeoutto all GitHub APIfetchcalls - security: SHA-pinned all CI/CD workflow actions
- refactor: Consolidated
truncate()andisRecord()intocore/utils.ts - refactor: Unified error normalization into shared
normalizeErrormodule - refactor: Extracted
AsyncEventQueueinto shared module for agent adapters - refactor: Created scanner factory to eliminate construction duplication
- chore: Annotated all 10 empty catch blocks with
// best-effortcomments - ci: Added
pnpm audit --prodto CI pipeline
- chore: Added
LICENSE,CHANGELOG.md,docs/to npmfilesarray - chore: Added
prepublishOnlyscript (pnpm build && pnpm test) - chore: Restored CI/CD workflows (SHA-pinned actions)
- chore: Lowered Node.js requirement from
>=24to>=20 - chore: Fixed repository URL in
package.json
- feat:
oac init --minimalfor quick, non-interactive setup - feat:
oac explain <task-id>command — inspect why a task/epic was selected - feat: Colored diff output in
--dry-runmode (source files, complexity, scanner) - docs: Comprehensive troubleshooting section in README
- perf: Streaming file reads in analyzer for large files (>1MB threshold)
- perf: Memory pressure monitoring — PQueue auto-throttles when heap usage exceeds 85%
- docs: Auto-generated config reference from Zod schema (
docs/config-reference.md) - docs: Added CHANGELOG
- chore: Temporarily removed CI/CD workflows during dev phase (
cb90214)
- feat:
oac ralias foroac run(power-user shortcut) - feat: Distinct exit codes for CI/CD integration:
0— all tasks succeeded or dry-run1— unhandled error2— config/validation error3— every task/epic failed4— partial success (some tasks failed)
- feat: Resettable token counters (
claudeCounter.reset(),codexCounter.reset()) for correctness in long-lived processes - feat: Progress percentages on long operations (file analysis, task estimation, epic execution)
- feat:
oac runnow performs the full scan → analyze → execute pipeline in one command - ux: Clarified distinction between
oac scan(discover tasks) andoac analyze(build context)
- refactor: Decomposed the 1,692-line
run.tsmonolith intosrc/cli/commands/run/with 8 focused modules:index.ts— command definition and option parsingpipeline.ts— top-level orchestrationepic.ts— epic-based execution flowtask.ts— single-task executionretry.ts—--retry-failedpipelineoutput.ts— summary rendering and JSON outputvalidation.ts— config and input validationtypes.ts— shared types, exit codes,ConfigError
- feat: PR creation timeout (prevents hanging on GitHub API issues)
- perf: Replaced hand-rolled
runWithConcurrencywithPQueuefor bounded parallelism - feat:
oac completioncommand for shell tab-completion (bash/zsh/fish) - feat:
--retry-failedflag to re-run only previously failed tasks
- ux: Usage examples in every
--helpscreen - feat: Global
--quietflag suppresses spinner/progress output (for CI pipelines) - ux: Failed task/epic details included in run summary
- perf: Parallelized epic execution pipeline with bounded concurrency
- refactor: Extracted 11 duplicated helper functions into
src/cli/helpers.ts - perf: Parallelized
analyzer.tsfile processing withPQueue - perf: Parallelized
todo-scanner.tsfile processing - chore: Removed dead
withTimeoututility
- fix:
withWorktreeLocknow correctly releases locks on error - perf: Bounded
Promise.allwithPQueueto prevent unbounded parallelism - perf: Replaced
child_process.spawnwithexecafor better error handling - feat: SIGINT handler for graceful shutdown
- fix: Removed simulation fallback that silently skipped real execution
- feat:
defineConfig()wrapper for type-safe config files - ux: Getting Started help text for first-time users