{"_id":"@open330/oac","_rev":"34-2fff33591449b8bf041256fcae0a0a6f","name":"@open330/oac","dist-tags":{"latest":"2026.222.2"},"versions":{"2026.4.3":{"name":"@open330/oac","version":"2026.4.3","license":"MIT","_id":"@open330/oac@2026.4.3","maintainers":[{"name":"jiunbae","email":"maytryark@gmail.com"}],"homepage":"https://github.com/Open330/open-agent-contribution","bugs":{"url":"https://github.com/Open330/open-agent-contribution/issues"},"bin":{"oac":"dist/cli/index.js"},"dist":{"shasum":"94ed9ed723934a478c9c9e964a42012eeca18bfa","tarball":"https://registry.npmjs.org/@open330/oac/-/oac-2026.4.3.tgz","fileCount":53,"integrity":"sha512-lK3wJH2IDnF7XCZ1S+dh0ecy6QReDLDwyNPtKBABjljCynpSB8vtGSMQpUSloHLg9+4cE0yf6HgtLzMm0ThnbQ==","signatures":[{"sig":"MEUCIFNlChaemKdNvB4qYkNtx7a35xtxqVjUvo9RHRoxsziMAiEAxiUhjW2W7UlOLTWS8eT4Q/9JADJTffCapEn9qR0qNGA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1153626},"main":"./dist/core/index.js","type":"module","_from":"file:open330-oac-2026.4.3.tgz","types":"./dist/core/index.d.ts","engines":{"node":">=24.0.0"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","clean":"rm -rf dist coverage","format":"biome format --write .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","dev:dashboard":"tsx src/dashboard/dev.ts","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"jiunbae","email":"maytryark@gmail.com"},"_resolved":"/private/var/folders/cl/zbgqzjr545xc74y2vw25flwr0000gn/T/68cf7d4ddc7345a8d3f4598755806cdb/open330-oac-2026.4.3.tgz","_integrity":"sha512-lK3wJH2IDnF7XCZ1S+dh0ecy6QReDLDwyNPtKBABjljCynpSB8vtGSMQpUSloHLg9+4cE0yf6HgtLzMm0ThnbQ==","deprecated":"DEPRECATED: Wrong CalVer month. Use @open330/oac@2026.2.5 instead (correct February version).","repository":{"url":"git+https://github.com/Open330/open-agent-contribution.git","type":"git"},"_npmVersion":"11.7.0","description":"Open Agent Contribution - automate open source contributions with AI agents","directories":{},"_nodeVersion":"25.4.0","dependencies":{"ora":"^8.1.1","zod":"^3.24.2","chalk":"^5.4.1","execa":"^9.5.2","react":"^19.0.0","fastify":"^5.2.1","p-queue":"^8.1.0","recharts":"^2.15.1","tiktoken":"^1.0.18","commander":"^13.1.0","react-dom":"^19.0.0","cli-table3":"^0.6.5","simple-git":"^3.27.0","@xterm/xterm":"^5.5.0","@fastify/cors":"^10.0.2","@octokit/rest":"^21.1.1","eventemitter3":"^5.0.1","@fastify/static":"^8.1.0","@inquirer/prompts":"^6.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.0.0","@types/react":"^19.0.0","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.12","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oac_2026.4.3_1771417857317_0.45677170687620916","host":"s3://npm-registry-packages-npm-production"}},"2026.2.5":{"name":"@open330/oac","version":"2026.2.5","license":"MIT","_id":"@open330/oac@2026.2.5","maintainers":[{"name":"jiunbae","email":"maytryark@gmail.com"}],"homepage":"https://github.com/open330/open-agent-contribution","bugs":{"url":"https://github.com/open330/open-agent-contribution/issues"},"bin":{"oac":"dist/cli/index.js"},"dist":{"shasum":"117b6c52040fe56f007cc95c26b703629a9dc626","tarball":"https://registry.npmjs.org/@open330/oac/-/oac-2026.2.5.tgz","fileCount":56,"integrity":"sha512-TwwVHLJafyOVfr6NxqJJVIoQz+iy7Y6D+792kZYZFB8GCSr6Ls72PDa1bo1lhm2hIEyAKcNN0SYZPdgo/sffEQ==","signatures":[{"sig":"MEUCIQDFU1PuuuY6T3j1SBBWmG1hURdkGApoht0mbFZSZl1ODQIgUkFdEet1cEGoemDGYmyPUrrJzYSM6kt7isNsT4Cytlk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1223065},"main":"./dist/core/index.js","type":"module","_from":"file:open330-oac-2026.2.5.tgz","types":"./dist/core/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","clean":"rm -rf dist coverage","format":"biome format --write .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","dev:dashboard":"tsx src/dashboard/dev.ts","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"jiunbae","email":"maytryark@gmail.com"},"_resolved":"/private/var/folders/cl/zbgqzjr545xc74y2vw25flwr0000gn/T/b4de5d12354fb2aff0efa0952c11703c/open330-oac-2026.2.5.tgz","_integrity":"sha512-TwwVHLJafyOVfr6NxqJJVIoQz+iy7Y6D+792kZYZFB8GCSr6Ls72PDa1bo1lhm2hIEyAKcNN0SYZPdgo/sffEQ==","repository":{"url":"git+https://github.com/open330/open-agent-contribution.git","type":"git"},"_npmVersion":"11.7.0","description":"Open Agent Contribution - automate open source contributions with AI agents","directories":{},"_nodeVersion":"25.4.0","dependencies":{"ora":"^8.1.1","zod":"^3.24.2","chalk":"^5.4.1","execa":"^9.5.2","react":"^19.0.0","fastify":"^5.2.1","p-queue":"^8.1.0","recharts":"^2.15.1","tiktoken":"^1.0.18","commander":"^13.1.0","react-dom":"^19.0.0","cli-table3":"^0.6.5","simple-git":"^3.27.0","@xterm/xterm":"^5.5.0","@fastify/cors":"^10.0.2","@octokit/rest":"^21.1.1","eventemitter3":"^5.0.1","@fastify/static":"^8.1.0","@inquirer/prompts":"^6.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.0.0","@types/react":"^19.0.0","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.12","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oac_2026.2.5_1771574278129_0.19120690974736743","host":"s3://npm-registry-packages-npm-production"}},"2026.220.1":{"name":"@open330/oac","version":"2026.220.1","license":"MIT","_id":"@open330/oac@2026.220.1","maintainers":[{"name":"jiunbae","email":"maytryark@gmail.com"}],"homepage":"https://github.com/open330/open-agent-contribution","bugs":{"url":"https://github.com/open330/open-agent-contribution/issues"},"bin":{"oac":"dist/cli/index.js"},"dist":{"shasum":"8fffe6fc8198f061e449620a303aa342c991667c","tarball":"https://registry.npmjs.org/@open330/oac/-/oac-2026.220.1.tgz","fileCount":56,"integrity":"sha512-z77R0V5o20S0wXZ8uj2/SGRnPvsmFO/dZWVUTPKXM5mUrIk0iud9vVxQ2mH3/yyYb/ku1aqdA36AVO49XDRfrw==","signatures":[{"sig":"MEUCIQDzhg1fLYC5w8SaZp6o28vqC+/lARYkmJZ2DXNfLgVQVwIgWaxN4wzb62oiuodpTPoBHVG9bOThhetr5bxFNYUPzkg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1228063},"main":"./dist/core/index.js","type":"module","types":"./dist/core/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"gitHead":"da6dae28ec5f127e9cbc314af0fec312f2c2d128","scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","clean":"rm -rf dist coverage","format":"biome format --write .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","dev:dashboard":"tsx src/dashboard/dev.ts","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm build && pnpm test"},"_npmUser":{"name":"jiunbae","email":"maytryark@gmail.com"},"repository":{"url":"git+https://github.com/open330/open-agent-contribution.git","type":"git"},"_npmVersion":"11.7.0","description":"Open Agent Contribution - automate open source contributions with AI agents","directories":{},"_nodeVersion":"25.4.0","dependencies":{"ora":"^8.1.1","zod":"^3.24.2","chalk":"^5.4.1","execa":"^9.5.2","react":"^19.0.0","fastify":"^5.2.1","p-queue":"^8.1.0","recharts":"^2.15.1","tiktoken":"^1.0.18","commander":"^13.1.0","react-dom":"^19.0.0","cli-table3":"^0.6.5","simple-git":"^3.27.0","@xterm/xterm":"^5.5.0","@fastify/cors":"^10.0.2","@octokit/rest":"^21.1.1","eventemitter3":"^5.0.1","@fastify/static":"^8.1.0","@inquirer/prompts":"^6.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.4","devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.0.0","@types/react":"^19.0.0","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.12","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oac_2026.220.1_1771577920882_0.34781547280882563","host":"s3://npm-registry-packages-npm-production"}},"2026.220.2":{"name":"@open330/oac","version":"2026.220.2","license":"MIT","_id":"@open330/oac@2026.220.2","maintainers":[{"name":"jiunbae","email":"maytryark@gmail.com"}],"homepage":"https://github.com/open330/open-agent-contribution","bugs":{"url":"https://github.com/open330/open-agent-contribution/issues"},"bin":{"oac":"dist/cli/index.js"},"dist":{"shasum":"e4224b0f1581c136a6546c9be1577a29ecfab6b6","tarball":"https://registry.npmjs.org/@open330/oac/-/oac-2026.220.2.tgz","fileCount":56,"integrity":"sha512-AxYkKAnFlTchXi8JpJYMFvHKj0Ob9WSYVX86ZPoq25A/nFjoNn0/2+4HKNmbgHE3D/WFuUhcI4w1KGM6KMANMg==","signatures":[{"sig":"MEUCIBZkKCimJwD5BqLUWb/rYMaK2dIDvfM3Ub1PSrkoZvx9AiEAmyIqJR36chuBZkJFHuutF0B1FKNMCSyJ9DLhVYGnEQA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1243024},"main":"./dist/core/index.js","type":"module","types":"./dist/core/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"gitHead":"cb8f78ed779863594fa2671a505aec3861ce96d4","scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","clean":"rm -rf dist coverage","format":"biome format --write .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","dev:dashboard":"tsx src/dashboard/dev.ts","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm build && pnpm test"},"_npmUser":{"name":"jiunbae","email":"maytryark@gmail.com"},"repository":{"url":"git+https://github.com/open330/open-agent-contribution.git","type":"git"},"_npmVersion":"11.7.0","description":"Open Agent Contribution - automate open source contributions with AI agents","directories":{},"_nodeVersion":"25.4.0","dependencies":{"ora":"^8.1.1","zod":"^3.24.2","chalk":"^5.4.1","execa":"^9.5.2","react":"^19.0.0","fastify":"^5.2.1","p-queue":"^8.1.0","recharts":"^2.15.1","tiktoken":"^1.0.18","commander":"^13.1.0","react-dom":"^19.0.0","cli-table3":"^0.6.5","simple-git":"^3.27.0","@xterm/xterm":"^5.5.0","@fastify/cors":"^10.0.2","@octokit/rest":"^21.1.1","eventemitter3":"^5.0.1","@fastify/static":"^8.1.0","@inquirer/prompts":"^6.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.4","devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.0.0","@types/react":"^19.0.0","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.12","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oac_2026.220.2_1771677601346_0.5830633701757695","host":"s3://npm-registry-packages-npm-production"}},"2026.221.0":{"name":"@open330/oac","version":"2026.221.0","license":"MIT","_id":"@open330/oac@2026.221.0","maintainers":[{"name":"jiunbae","email":"maytryark@gmail.com"}],"homepage":"https://github.com/open330/open-agent-contribution","bugs":{"url":"https://github.com/open330/open-agent-contribution/issues"},"bin":{"oac":"dist/cli/index.js"},"dist":{"shasum":"c21c23c95cf860006d40645393dff63c9c2d751d","tarball":"https://registry.npmjs.org/@open330/oac/-/oac-2026.221.0.tgz","fileCount":56,"integrity":"sha512-Uvw2OJcU9RabezQ+oHO2w4hdjWZzqrdFD7wEQxCYADjD3TyqOtlx8GOlujl/dzla2C9rU5mlLuCipz6BrT42KQ==","signatures":[{"sig":"MEUCIQDKvqArzMH0plmFBrPeLmfkaPVwz5uo/XsN2OFMQ1OBnwIgDIanu4B1mGBIah5Omw+/JEBEGESLH3Ri65HpC7jWydo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1248584},"main":"./dist/core/index.js","type":"module","_from":"file:open330-oac-2026.221.0.tgz","types":"./dist/core/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","clean":"rm -rf dist coverage","format":"biome format --write .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","dev:dashboard":"tsx src/dashboard/dev.ts","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"jiunbae","email":"maytryark@gmail.com"},"_resolved":"/private/var/folders/cl/zbgqzjr545xc74y2vw25flwr0000gn/T/948b81081c3ccef1633182062cc57f22/open330-oac-2026.221.0.tgz","_integrity":"sha512-Uvw2OJcU9RabezQ+oHO2w4hdjWZzqrdFD7wEQxCYADjD3TyqOtlx8GOlujl/dzla2C9rU5mlLuCipz6BrT42KQ==","repository":{"url":"git+https://github.com/open330/open-agent-contribution.git","type":"git"},"_npmVersion":"11.9.0","description":"Open Agent Contribution - automate open source contributions with AI agents","directories":{},"_nodeVersion":"25.6.1","dependencies":{"ora":"^8.1.1","zod":"^3.24.2","chalk":"^5.4.1","execa":"^9.5.2","react":"^19.0.0","fastify":"^5.2.1","p-queue":"^8.1.0","recharts":"^2.15.1","tiktoken":"^1.0.18","commander":"^13.1.0","react-dom":"^19.0.0","cli-table3":"^0.6.5","simple-git":"^3.27.0","@xterm/xterm":"^5.5.0","@fastify/cors":"^10.0.2","@octokit/rest":"^21.1.1","eventemitter3":"^5.0.1","@fastify/static":"^8.1.0","@inquirer/prompts":"^6.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.0.0","@types/react":"^19.0.0","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.12","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oac_2026.221.0_1771693404159_0.1477054362673793","host":"s3://npm-registry-packages-npm-production"}},"2026.221.1":{"name":"@open330/oac","version":"2026.221.1","license":"MIT","_id":"@open330/oac@2026.221.1","maintainers":[{"name":"jiunbae","email":"maytryark@gmail.com"}],"homepage":"https://github.com/open330/open-agent-contribution","bugs":{"url":"https://github.com/open330/open-agent-contribution/issues"},"bin":{"oac":"dist/cli/index.js"},"dist":{"shasum":"f8926ab931af252c85407121aa63c74fd0b24a90","tarball":"https://registry.npmjs.org/@open330/oac/-/oac-2026.221.1.tgz","fileCount":56,"integrity":"sha512-lQd9kgAxjokNNaCmyqlKJty7iF01q8sycw2qoM6d2LZPzSruu7EIbLgR8ru7e/EhTRlhLzmLkbJAHxi+kNIZ7w==","signatures":[{"sig":"MEYCIQDR8fkcvDogGuqLjtertzy4q2y/OewTBfnuNhOwnUygIgIhAMRY96Rx13nK4gssQHUdvrA/skummOaSFxR6PNMW6anM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1249599},"main":"./dist/core/index.js","type":"module","types":"./dist/core/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"gitHead":"3b9ab1df7007700bf913dd257df15b43c5cd8c1a","scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","clean":"rm -rf dist coverage","format":"biome format --write .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","dev:dashboard":"tsx src/dashboard/dev.ts","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm build && pnpm test"},"_npmUser":{"name":"jiunbae","email":"maytryark@gmail.com"},"repository":{"url":"git+https://github.com/open330/open-agent-contribution.git","type":"git"},"_npmVersion":"11.9.0","description":"Open Agent Contribution - automate open source contributions with AI agents","directories":{},"_nodeVersion":"25.6.1","dependencies":{"ora":"^8.1.1","zod":"^3.24.2","chalk":"^5.4.1","execa":"^9.5.2","react":"^19.0.0","fastify":"^5.2.1","p-queue":"^8.1.0","recharts":"^2.15.1","tiktoken":"^1.0.18","commander":"^13.1.0","react-dom":"^19.0.0","cli-table3":"^0.6.5","simple-git":"^3.27.0","@xterm/xterm":"^5.5.0","@fastify/cors":"^10.0.2","@octokit/rest":"^21.1.1","eventemitter3":"^5.0.1","@fastify/static":"^8.1.0","@inquirer/prompts":"^6.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.4","devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.0.0","@types/react":"^19.0.0","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.12","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oac_2026.221.1_1771694053697_0.05359075568511118","host":"s3://npm-registry-packages-npm-production"}},"2026.221.2":{"name":"@open330/oac","version":"2026.221.2","license":"MIT","_id":"@open330/oac@2026.221.2","maintainers":[{"name":"jiunbae","email":"maytryark@gmail.com"}],"homepage":"https://github.com/open330/open-agent-contribution","bugs":{"url":"https://github.com/open330/open-agent-contribution/issues"},"bin":{"oac":"dist/cli/index.js"},"dist":{"shasum":"d0a6616850c4c9ae661aced472f761a276b706a5","tarball":"https://registry.npmjs.org/@open330/oac/-/oac-2026.221.2.tgz","fileCount":56,"integrity":"sha512-6BubmQphb/GYyEQC4u9McZV+5Usp+75BCrgewRM7UmxYi6Nt85Zn9yRWA7+iZWV35Jq9eIFO5v6IVP0vVDYF5w==","signatures":[{"sig":"MEQCIFcJjpP9SkOzSYC39XxgfFciUyMffFyT/F/Yk+LWQU9OAiAoX4F1JHT9eysOdyq9Wx/WfutoM/MJvuUndyw8Ik7Snw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1251588},"main":"./dist/core/index.js","type":"module","types":"./dist/core/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"gitHead":"4202f2ce6eb220a95fa6cecbc03e31b2de038e4e","scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","clean":"rm -rf dist coverage","format":"biome format --write .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","dev:dashboard":"tsx src/dashboard/dev.ts","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm build && pnpm test"},"_npmUser":{"name":"jiunbae","email":"maytryark@gmail.com"},"repository":{"url":"git+https://github.com/open330/open-agent-contribution.git","type":"git"},"_npmVersion":"11.9.0","description":"Open Agent Contribution - automate open source contributions with AI agents","directories":{},"_nodeVersion":"25.6.1","dependencies":{"ora":"^8.1.1","zod":"^3.24.2","chalk":"^5.4.1","execa":"^9.5.2","react":"^19.0.0","fastify":"^5.2.1","p-queue":"^8.1.0","recharts":"^2.15.1","tiktoken":"^1.0.18","commander":"^13.1.0","react-dom":"^19.0.0","cli-table3":"^0.6.5","simple-git":"^3.27.0","@xterm/xterm":"^5.5.0","@fastify/cors":"^10.0.2","@octokit/rest":"^21.1.1","eventemitter3":"^5.0.1","@fastify/static":"^8.1.0","@inquirer/prompts":"^6.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@9.15.4","devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.0.0","@types/react":"^19.0.0","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.12","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oac_2026.221.2_1771696967109_0.5376419925580151","host":"s3://npm-registry-packages-npm-production"}},"2026.222.1":{"name":"@open330/oac","version":"2026.222.1","license":"MIT","_id":"@open330/oac@2026.222.1","maintainers":[{"name":"jiunbae","email":"maytryark@gmail.com"}],"homepage":"https://github.com/open330/open-agent-contribution","bugs":{"url":"https://github.com/open330/open-agent-contribution/issues"},"bin":{"oac":"dist/cli/index.js"},"dist":{"shasum":"0d5aea607e84120b2e92c16f9a15e0f94693e3ea","tarball":"https://registry.npmjs.org/@open330/oac/-/oac-2026.222.1.tgz","fileCount":56,"integrity":"sha512-QjbnKEoo/EOws2BawVGnbOCwPfdLPSSEOM/RChdS6UZ2kSZeGp7EByypnfy2ISPOqKMSalJSY9tID+sx/8xpow==","signatures":[{"sig":"MEUCIQDQUHeYOQFgWJiMZXZMOTUd4stN0+YwqrWuotDATYJyRAIgIOAFSWowMiB7iA5WPxmu4Um2x2xZr0xy/5pYDp0j+ys=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1254383},"main":"./dist/core/index.js","type":"module","_from":"file:open330-oac-2026.222.1.tgz","types":"./dist/core/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.js"}},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsup","clean":"rm -rf dist coverage","format":"biome format --write .","lint:fix":"biome check --write .","typecheck":"tsc --noEmit","dev:dashboard":"tsx src/dashboard/dev.ts","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"jiunbae","email":"maytryark@gmail.com"},"_resolved":"/private/var/folders/cl/zbgqzjr545xc74y2vw25flwr0000gn/T/e7355c181593a484e824d119d519a692/open330-oac-2026.222.1.tgz","_integrity":"sha512-QjbnKEoo/EOws2BawVGnbOCwPfdLPSSEOM/RChdS6UZ2kSZeGp7EByypnfy2ISPOqKMSalJSY9tID+sx/8xpow==","repository":{"url":"git+https://github.com/open330/open-agent-contribution.git","type":"git"},"_npmVersion":"11.9.0","description":"Open Agent Contribution - automate open source contributions with AI agents","directories":{},"_nodeVersion":"25.6.1","dependencies":{"ora":"^8.1.1","zod":"^3.24.2","chalk":"^5.4.1","execa":"^9.5.2","react":"^19.0.0","fastify":"^5.2.1","p-queue":"^8.1.0","recharts":"^2.15.1","tiktoken":"^1.0.18","commander":"^13.1.0","react-dom":"^19.0.0","cli-table3":"^0.6.5","simple-git":"^3.27.0","@xterm/xterm":"^5.5.0","@fastify/cors":"^10.0.2","@octokit/rest":"^21.1.1","eventemitter3":"^5.0.1","@fastify/static":"^8.1.0","@inquirer/prompts":"^6.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.3.6","vitest":"^3.0.5","typescript":"^5.7.3","@types/node":"^22.0.0","@types/react":"^19.0.0","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.12","@types/react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/oac_2026.222.1_1771744522368_0.9700497103656252","host":"s3://npm-registry-packages-npm-production"}},"2026.222.2":{"name":"@open330/oac","version":"2026.222.2","description":"Open Agent Contribution - automate open source contributions with AI agents","license":"MIT","repository":{"type":"git","url":"git+https://github.com/open330/open-agent-contribution.git"},"homepage":"https://github.com/open330/open-agent-contribution","bugs":{"url":"https://github.com/open330/open-agent-contribution/issues"},"type":"module","main":"./dist/core/index.js","types":"./dist/core/index.d.ts","bin":{"oac":"dist/cli/index.js"},"exports":{".":{"import":"./dist/core/index.js","types":"./dist/core/index.d.ts"}},"publishConfig":{"access":"public"},"engines":{"node":">=20.0.0"},"dependencies":{"@fastify/cors":"^10.0.2","@fastify/static":"^8.1.0","@inquirer/prompts":"^6.0.0","@octokit/rest":"^21.1.1","@xterm/xterm":"^5.5.0","chalk":"^5.4.1","cli-table3":"^0.6.5","commander":"^13.1.0","eventemitter3":"^5.0.1","execa":"^9.5.2","fastify":"^5.2.1","ora":"^8.1.1","p-queue":"^8.1.0","react":"^19.0.0","react-dom":"^19.0.0","recharts":"^2.15.1","simple-git":"^3.27.0","tiktoken":"^1.0.18","zod":"^3.24.2"},"devDependencies":{"@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.12","@types/node":"^22.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0","tsup":"^8.3.6","tsx":"^4.19.0","typescript":"^5.7.3","vitest":"^3.0.5"},"scripts":{"build":"tsup","test":"vitest run","test:coverage":"vitest run --coverage","lint":"biome check .","lint:fix":"biome check --write .","format":"biome format --write .","typecheck":"tsc --noEmit","dev:dashboard":"tsx src/dashboard/dev.ts","clean":"rm -rf dist coverage"},"_id":"@open330/oac@2026.222.2","_integrity":"sha512-R8FwXGgl4ik7hjRboAzSMEtFe+UtV6B+ksf4SySlSNBOpYOqFVxHKxr2n7TuCX3Q7hoisG0aa1bUIoAgO1yoag==","_resolved":"/private/var/folders/cl/zbgqzjr545xc74y2vw25flwr0000gn/T/ecf5f15933529900c5ab8cbdb0aaa83b/open330-oac-2026.222.2.tgz","_from":"file:open330-oac-2026.222.2.tgz","_nodeVersion":"25.6.1","_npmVersion":"11.9.0","dist":{"integrity":"sha512-R8FwXGgl4ik7hjRboAzSMEtFe+UtV6B+ksf4SySlSNBOpYOqFVxHKxr2n7TuCX3Q7hoisG0aa1bUIoAgO1yoag==","shasum":"afdb914bda8bad5508f25443730057ec0c90422b","tarball":"https://registry.npmjs.org/@open330/oac/-/oac-2026.222.2.tgz","fileCount":56,"unpackedSize":1302686,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBH11UwkwizR5sT03gfaO+Hp6ptOBZkh2FrHAtWC+vkCAiAOz4LCry39DFZzak7pS2Vc/2Xin4RRYkgwpekB2iTd1A=="}]},"_npmUser":{"name":"jiunbae","email":"maytryark@gmail.com"},"directories":{},"maintainers":[{"name":"jiunbae","email":"maytryark@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/oac_2026.222.2_1772253373538_0.6179004536509438"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-17T09:31:45.593Z","modified":"2026-02-28T04:36:13.954Z","2026.2.17":"2026-02-17T09:31:45.900Z","2026.3.0":"2026-02-17T11:03:10.009Z","2026.3.1":"2026-02-17T11:22:11.259Z","2026.3.2":"2026-02-17T11:31:32.427Z","2026.3.3":"2026-02-17T12:05:53.310Z","2026.3.4":"2026-02-17T12:22:05.523Z","2026.3.5":"2026-02-17T12:45:55.269Z","2026.3.6":"2026-02-17T13:02:33.689Z","2026.4.0":"2026-02-17T13:22:43.457Z","2026.4.1":"2026-02-17T14:49:20.607Z","2026.4.2":"2026-02-17T16:16:31.071Z","2026.4.3":"2026-02-18T12:30:57.526Z","2026.4.4":"2026-02-20T07:46:30.560Z","2026.2.5":"2026-02-20T07:57:58.387Z","2026.220.1":"2026-02-20T08:58:41.055Z","2026.220.2":"2026-02-21T12:40:01.567Z","2026.221.0":"2026-02-21T17:03:24.454Z","2026.221.1":"2026-02-21T17:14:13.987Z","2026.221.2":"2026-02-21T18:02:47.315Z","2026.222.1":"2026-02-22T07:15:22.537Z","2026.222.2":"2026-02-28T04:36:13.816Z"},"bugs":{"url":"https://github.com/open330/open-agent-contribution/issues"},"license":"MIT","homepage":"https://github.com/open330/open-agent-contribution","repository":{"type":"git","url":"git+https://github.com/open330/open-agent-contribution.git"},"description":"Open Agent Contribution - automate open source contributions with AI agents","maintainers":[{"name":"jiunbae","email":"maytryark@gmail.com"}],"readme":"<div align=\"center\">\n\n```\n                                 ___    _    ____\n                                / _ \\  / \\  / ___|\n                               | | | |/ _ \\| |\n                               | |_| / ___ \\ |___\n                                \\___/_/   \\_\\____|\n\n              O P E N   A G E N T   C O N T R I B U T I O N\n```\n\n**Put your spare AI tokens to work. Contribute to open source — automatically.**\n\n[![npm](https://img.shields.io/npm/v/@open330/oac?label=npm&color=CB3837&logo=npm)](https://www.npmjs.com/package/@open330/oac)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Node.js](https://img.shields.io/badge/Node.js-%3E%3D20-339933?logo=node.js&logoColor=white)](https://nodejs.org/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.7+-3178C6?logo=typescript&logoColor=white)](https://typescriptlang.org/)\n\n[Getting Started](#-getting-started) · [How It Works](#-how-it-works) · [Commands](#commands) · [Configuration](#configuration) · [Concurrency & Multi-User Safety](#concurrency--multi-user-safety) · [For Maintainers](#for-maintainers-target-repos) · [Architecture](#architecture) · [Contributing](#contributing)\n\n</div>\n\n---\n\n<div><img src=\"https://quickstart-for-agents.vercel.app/api/header.svg?theme=opencode&logo=OAC&title=Use+leftover+AI+tokens+to+auto-contribute+to+open+source+repos&font=inter\" width=\"100%\" /></div>\n\n```\nYou are an AI agent working on Open Agent Contribution (OAC), a CLI tool that\nuses spare AI agent tokens to automatically scan repos, discover tasks, and\nsubmit pull requests via Claude Code or Codex.\nClone https://github.com/Open330/open-agent-contribution and help improve\nscanners, execution pipelines, or add new agent provider adapters.\n```\n\n## The Problem\n\nYou pay for AI agent tokens every month. Claude Code, Codex, OpenCode — they all come with token budgets. But most days, you don't use them all. Those leftover tokens? **Wasted.**\n\nMeanwhile, thousands of open source repos have TODOs nobody finishes, lint warnings nobody fixes, tests nobody writes, and issues nobody picks up.\n\n## The Solution\n\n**OAC** bridges the gap. Point it at a repo, and it will:\n\n1. **Scan** the codebase for actionable tasks (TODOs, lint issues, missing tests, open GitHub issues)\n2. **Estimate** token costs and pick tasks that fit your remaining budget\n3. **Execute** the work using your AI agent of choice — in parallel, sandboxed environments\n4. **Submit** pull requests, link issues, and track every contribution\n\n```bash\n# Install globally\nnpm install -g @open330/oac\n\n# That's it. One command.\noac run --repo facebook/react --tokens 50000\n\n# Or run without installing\nnpx @open330/oac run --repo facebook/react --tokens unlimited\n```\n\n```\n  ✔ Resolved facebook/react\n  ✔ Repository ready at ~/.oac/cache/repos/facebook/react\n  ✔ Analyzed 12 modules, 847 files, 23 findings\n  ✔ Created 4 epic(s)\n  ✔ Epic token estimation completed\n  [oac] Selected 3 epic(s) for execution, 1 deferred.\n\n  ✔ Improve test coverage for reconciler (1/3)\n      PR #1847: https://github.com/facebook/react/pull/1847\n  ✔ Fix lint warnings in scheduler (2/3)\n      PR #1848: https://github.com/facebook/react/pull/1848\n  ✔ Address TODO comments (3/3)\n      PR #1849: https://github.com/facebook/react/pull/1849\n\n  Run Summary (Epic Mode)\n    Epics completed: 3/3\n    PRs created:     3\n    Tokens used:     38,420 / 50,000\n    Duration:        8m 42s\n```\n\n---\n\n## Features\n\n| | Feature | Description |\n|---|---------|-------------|\n| **Scan** | Task Discovery | Finds TODOs, lint issues, test gaps, dead code, and open GitHub issues |\n| **Budget** | Token Estimation | Per-provider token counting with knapsack-optimized task selection |\n| **Run** | Parallel Execution | Run 2-3 agents simultaneously in isolated git worktrees |\n| **Retry** | Resume Failed | `--retry-failed` re-runs only tasks that failed in the previous run |\n| **Ship** | PR Automation | Creates PRs with timeout protection, links issues, notifies webhooks |\n| **Track** | Contribution Logs | Git-native audit trail in `.oac/` — who contributed what, with how many tokens |\n| **Rank** | Leaderboard | See who's recycling the most tokens across your team |\n| **Explain** | Task Inspector | `oac explain <id>` shows why a task was selected and what the agent will do |\n| **Complete** | Shell Integration | Tab-completion for bash, zsh, and fish shells |\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n- **Node.js** >= 20 (see `engines` in package.json)\n- **git** installed\n- At least one AI agent CLI: [Claude Code](https://claude.ai/code), [Codex](https://github.com/openai/codex), or [OpenCode](https://github.com/opencode-ai/opencode)\n\n### Install\n\n```bash\n# From npm (recommended)\nnpm install -g @open330/oac\n\n# Or use without installing\nnpx @open330/oac --help\n\n# From source (for contributors)\ngit clone https://github.com/Open330/open-agent-contribution.git\ncd open-agent-contribution\npnpm install\npnpm build\n```\n\n### Setup\n\n```bash\n# Interactive setup wizard\noac init\n\n# Or quick start without wizard\noac init --minimal --repo owner/repo\n```\n\n```\n   ___    _    ____\n  / _ \\  / \\  / ___|\n | | | |/ _ \\| |\n | |_| / ___ \\ |___\n  \\___/_/   \\_\\____|\n\n Welcome to Open Agent Contribution.\n Let's put your spare tokens to work.\n\n? Select your AI providers: › Claude Code, Codex CLI\n? Monthly token budget for OAC: › 100000\n? Add your first repo (owner/repo): › facebook/react\n\n✔ Config written to oac.config.ts\n✔ Created .oac/ tracking directory\nReady! Run 'oac doctor' to verify or 'oac run' to start.\n```\n\n### Verify\n\n```bash\noac doctor\n```\n\n```\n  Environment Check\n  ─────────────────\n  [✔] Node.js     v24.0.0\n  [✔] git         v2.43.0\n  [✔] GitHub Auth  gh authenticated as @jiun\n  [✔] Claude CLI   v1.0.16\n  [✘] Codex CLI    not found\n\n  4/5 checks passed\n```\n\n---\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `oac init` | Interactive setup wizard — creates `oac.config.ts` (`--minimal` for quick start) |\n| `oac doctor` | Verify environment (Node, git, agents, auth) |\n| `oac analyze` | Deep codebase analysis — builds module context, groups findings into epics |\n| `oac scan` | Quick task discovery — finds actionable items without building full context |\n| `oac plan` | Show execution plan with token budget breakdown |\n| `oac run` (alias: `oac r`) | **Primary command.** Full pipeline: analyze → plan → execute → PR → track |\n| `oac status` | Show running/recent job status |\n| `oac log` | View contribution history |\n| `oac leaderboard` | Show contribution rankings |\n| `oac completion` | Generate shell tab-completion scripts (bash/zsh/fish) |\n| `oac explain <id>` | Show why a task/epic was selected and what the agent will do |\n\n### `oac analyze` — Deep Codebase Analysis\n\n```bash\noac analyze --repo owner/repo [--force] [--format table|json]\n```\n\nBuilds a full codebase map (modules, files, exports, dependencies), runs all scanners, groups findings into epics, and persists everything to `.oac/context/`. The analysis is cached — subsequent runs only re-analyze changed files (incremental via `git diff`).\n\n### `oac run` — The Main Event\n\n```bash\noac run \\\n  --repo owner/repo \\       # Target repository\n  --tokens 50000 \\          # Token budget (or \"unlimited\")\n  --provider claude-code \\  # AI agent to use (claude-code or codex)\n  --concurrency 2 \\         # Parallel agents (default: 2)\n  --mode new-pr \\           # Create PRs (or: direct-commit)\n  --dry-run \\               # Preview without executing (with colored diff)\n  --quiet \\                 # Suppress spinner/progress output (for CI)\n  --retry-failed            # Re-run only previously failed tasks\n\n# Run with unlimited budget\noac run --repo owner/repo --tokens unlimited --provider codex\n\n# Auto-analyzes if no context exists (or use --force to re-analyze)\n# Shorthand alias: oac r\n```\n\n**Exit Codes:**\n\n| Code | Meaning |\n|------|---------|\n| `0` | All tasks/epics completed successfully (or dry-run) |\n| `1` | Unexpected / unhandled error |\n| `2` | Configuration or validation error |\n| `3` | All selected tasks/epics failed |\n| `4` | Partial success — some tasks succeeded, others failed |\n\n### `oac scan` — Quick Task Discovery\n\n```bash\noac scan --repo owner/repo --format table\n```\n\n```\n┌─────────┬──────────────────────────────────┬────────┬──────────┬────────────┐\n│ ID      │ Title                            │ Source │ Priority │ Complexity │\n├─────────┼──────────────────────────────────┼────────┼──────────┼────────────┤\n│ a1b2c3  │ Fix unused import in utils.ts    │ lint   │ 85       │ trivial    │\n│ d4e5f6  │ TODO: Add input validation       │ todo   │ 72       │ simple     │\n│ g7h8i9  │ Missing tests for Parser class   │ test   │ 68       │ moderate   │\n│ j0k1l2  │ Remove dead code in legacy/      │ dead   │ 45       │ simple     │\n│ #142    │ Fix date formatting bug          │ issue  │ 91       │ moderate   │\n└─────────┴──────────────────────────────────┴────────┴──────────┴────────────┘\n  5 tasks discovered\n```\n\n---\n\n## Configuration\n\nOAC uses a TypeScript config file:\n\n```typescript\n// oac.config.ts\nimport { defineConfig } from \"@open330/oac\";\n\nexport default defineConfig({\n  repos: [\"facebook/react\", \"vercel/next.js\"],\n\n  execution: {\n    provider: \"claude-code\",  // or \"codex\"\n    concurrency: 2,\n    mode: \"new-pr\",\n    taskTimeout: 300,\n    tokenBudget: 100_000,     // or \"unlimited\"\n  },\n\n  discovery: {\n    scanners: {\n      lint: true,\n      todo: true,\n      testGap: true,\n    },\n    issueLabels: [\"good-first-issue\", \"help-wanted\", \"bug\"],\n  },\n\n  analyze: {\n    autoAnalyze: true,         // auto-analyze before run\n    staleAfterMs: 86_400_000,  // re-analyze after 24h\n  },\n});\n```\n\n> 📖 **Full reference**: See [docs/config-reference.md](docs/config-reference.md) for every option, type, default, and constraint — auto-generated from the Zod schema.\n\n---\n\n## Concurrency & Multi-User Safety\n\nWhen multiple OAC instances run against the same repository simultaneously (e.g., several team members running `oac run` at the same time), there is a risk of duplicate PRs targeting the same issue. OAC prevents this with a **2-layer guard system** that checks for existing OAC pull requests at two critical points in the pipeline.\n\n```\n  Instance A                          Instance B\n  ─────────                           ─────────\n  oac run                             oac run\n      │                                   │\n      ▼                                   ▼\n  ┌──────────────┐                   ┌──────────────┐\n  │  Layer 1     │                   │  Layer 1     │\n  │  Discovery   │ ◄── Both scan ──►│  Discovery   │\n  │  PR check    │     GitHub PRs    │  PR check    │\n  └──────┬───────┘                   └──────┬───────┘\n         │                                  │\n    Issue #42 not                      Issue #42 not\n    claimed → keep                     claimed → keep\n         │                                  │\n         ▼                                  ▼\n    (analyze, plan,                    (analyze, plan,\n     execute...)                        execute...)\n         │                                  │\n         ▼                                  ▼\n  ┌──────────────┐                   ┌──────────────┐\n  │  Layer 3     │                   │  Layer 3     │\n  │  Pre-PR      │                   │  Pre-PR      │\n  │  guard       │                   │  guard       │\n  └──────┬───────┘                   └──────┬───────┘\n         │                                  │\n    No OAC PR yet                     Instance A's PR\n    → create PR ✔                     now exists → skip ✘\n```\n\n### Layer 1: Discovery-Time Filtering\n\nDuring task discovery, the GitHub Issues scanner fetches all open PRs whose title starts with `[OAC]` and extracts the issue numbers they reference (via `Fixes #N`, `Closes #N`, or `Resolves #N` in the PR body). Any issue that already has a matching OAC PR is filtered out of the task list entirely — the agent never even attempts work on it.\n\n- **When:** Runs at the start of every `oac run`, during the scan phase\n- **Effect:** Issues with existing OAC PRs are excluded from the task list\n- **Failure mode:** Fail-open — if the GitHub API is unreachable, no issues are filtered out and the pipeline continues normally\n\n### Layer 3: Pre-PR Guard\n\nEven after Layer 1, a race condition is possible: two instances might discover the same issue before either has created a PR. Layer 3 closes this gap by performing a second check immediately before pushing the branch and creating the PR. If another OAC PR for the same issue now exists, the PR creation is skipped.\n\n- **When:** Runs after code execution and diff validation, just before `git push` and PR creation\n- **Effect:** Skips PR creation if a duplicate OAC PR is detected, avoiding wasted pushes\n- **Failure mode:** Fail-open — if the check fails, the PR is created anyway (better to create a possible duplicate than to silently discard completed work)\n\n### How OAC PRs Are Identified\n\nBoth layers use the same detection logic:\n1. Fetch up to 100 most recently updated open PRs from the target repository\n2. Filter to PRs whose title starts with **`[OAC]`**\n3. Scan the PR body for **`Fixes #N`**, **`Closes #N`**, or **`Resolves #N`**\n4. Match the extracted issue number against the current task's linked issue\n\n### Best Practices for Teams\n\n- **No configuration needed.** The guards are always active — there is nothing to enable or disable.\n- **Stagger start times slightly** (even 30 seconds apart) to give Layer 1 the best chance of catching duplicates before any work begins.\n- **Use a shared config** (`oac.config.ts`) with the same `issueLabels` filter so all instances target the same pool of issues and the guards can detect overlaps.\n- **Check `oac log`** after runs to see if any tasks were skipped due to duplicate detection.\n- **Don't worry about edge cases.** Both layers are fail-open by design — in the worst case, a duplicate PR is created, which is easy to close manually. No work is ever silently lost.\n\n---\n\n## For Maintainers (Target Repos)\n\nIf you are the repository owner receiving OAC contributions, treat contribution rules as\n**repository-owned policy** (in the target repo), not contributor-local config.\n\n### Ownership Model\n\n- **Target repo owns scope and rules**: keep allowed areas, constraints, and acceptance criteria in the target repository.\n- **Contributors own runtime choices**: provider, token budget, and local execution environment stay in each contributor's `oac.config.ts`.\n- **Why this split works**: maintainers can evolve policy in git history, reviewers can audit intent, and contributors cannot silently bypass project rules.\n\n### Recommended Structure (in the target repo)\n\n```text\n.context/\n  plans/\n    README.md                 # contribution policy and workflow\n    ISSUE-123.md              # task-specific plan (one issue = one plan)\n    ISSUE-456.md\n```\n\n### Plan Template (`.context/plans/ISSUE-123.md`)\n\n```markdown\n# ISSUE-123 - Improve contribution intake\n\n## Scope\n- Allowed paths: `src/discovery/**`, `README.md`\n- Forbidden paths: `package.json`, `.github/workflows/**`\n\n## Must\n- Keep backward compatibility for existing config keys\n- Add/adjust tests for changed behavior\n- Keep PR title format: `[OAC] ...`\n\n## Must Not\n- No breaking CLI flag changes\n- No unrelated refactors\n\n## Acceptance Criteria\n- `pnpm lint`, `pnpm typecheck`, `pnpm test` all pass\n- PR body links this issue and summarizes user impact\n- Reviewer can validate behavior with one command sequence\n\n## Notes for Agent\n- Prefer minimal, surgical changes\n- If ambiguous, choose the safest non-breaking path\n```\n\n### Add a Maintainer Section to Your Target Repo README\n\nUse this snippet in repos that want to receive OAC contributions:\n\n````markdown\n## AI Contribution Policy (OAC)\n\nThis repository accepts contributions generated by Open Agent Contribution (OAC).\n\n- Before running OAC, read `.context/plans/README.md` and the relevant `ISSUE-*.md` plan.\n- Work outside allowed paths will be rejected in review.\n- PRs must include issue linkage and pass lint/typecheck/tests.\n\nRecommended command:\n\n```bash\noac run --repo <owner/repo>\n```\n````\n\n### Systematic Intake Workflow\n\n1. **Maintainer prepares issues**\n   - Create actionable issues and add labels such as `oac-ready`, `documentation`, `good-first-issue`.\n   - Add or update `.context/plans/ISSUE-<number>.md` for each issue you want agents to pick up.\n2. **Contributor scopes discovery**\n   - In contributor `oac.config.ts`, set `discovery.issueLabels` to maintainer labels (for example, `\"oac-ready\"`).\n3. **OAC executes with duplicate guards**\n   - Layer 1 + Layer 3 prevent most duplicate PRs across concurrent contributors.\n4. **Maintainer reviews against plan**\n   - Check diff vs `Scope`, `Must`, `Must Not`, and acceptance criteria in the issue plan document.\n\n### Current Behavior Note\n\nToday, OAC does not hard-fail when `.context/plans/*` is missing. The recommended production pattern is:\n\n- maintain plan documents in the target repo,\n- require issue/PR linkage,\n- and enforce policy at review or CI level.\n\n---\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────┐\n│                   oac CLI / Dashboard                │\n└────────────────────────┬────────────────────────────┘\n                         │\n              ┌──────────▼──────────┐\n              │    Core Engine       │\n              │  (Event Bus + Config)│\n              └──┬──┬──┬──┬──┬──┬──┘\n                 │  │  │  │  │  │\n    ┌────────────┘  │  │  │  │  └────────────┐\n    │               │  │  │  │               │\n┌───▼───┐  ┌───────▼──▼──▼───────┐  ┌───────▼───────┐\n│ Repo  │  │  Discovery → Budget  │  │   Tracking    │\n│Select │  │  → Execution         │  │  (.oac/ logs) │\n└───────┘  └─────────┬───────────┘  └───────────────┘\n                     │\n              ┌──────▼──────┐\n              │  Completion  │\n              │ (PR + Issue) │\n              └──────┬──────┘\n                     │\n           ┌─────────▼─────────┐\n           │   GitHub / Linear  │\n           │   / Jira           │\n           └───────────────────┘\n```\n\n### Modules\n\nPublished as a single package `@open330/oac`:\n\n| Module | Path | Description |\n|--------|------|-------------|\n| Core | `src/core/` | Event bus, config (Zod), types, errors, memory pressure monitoring |\n| Repo | `src/repo/` | GitHub repo resolution, shallow cloning, metadata cache |\n| Discovery | `src/discovery/` | Codebase analyzer (streaming for large files), epic grouper, backlog, scanners (lint, TODO, test-gap, GitHub issues) |\n| Budget | `src/budget/` | Token estimation (tiktoken), complexity analysis, execution planner, resettable counters |\n| Execution | `src/execution/` | Agent adapters (Claude Code, Codex), worktree sandbox, worker |\n| Completion | `src/completion/` | PR creation (Octokit) with timeout protection, diff validation, issue linking |\n| Tracking | `src/tracking/` | Contribution logs, leaderboard, JSON schema |\n| CLI | `src/cli/` | 11 commands: init, doctor, analyze, scan, plan, run, status, log, leaderboard, completion, explain. Run module decomposed into 8 focused sub-modules |\n\n### Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| Runtime | Node.js 24+, TypeScript 5.7+, ESM |\n| Build | pnpm, tsup |\n| CLI | Commander.js, chalk, ora, cli-table3 |\n| Concurrency | p-queue for bounded parallelism, memory pressure monitoring |\n| Process | execa for child process management |\n| Git | simple-git, git worktrees for isolation |\n| GitHub | @octokit/rest |\n| AI Agents | Claude Code (`claude-code`), Codex CLI (`codex`) — pluggable via `AgentProvider` |\n| Dashboard | Fastify + embedded SPA with SSE streaming |\n| Quality | Vitest, Biome |\n\n---\n\n## Contribution Tracking\n\nEvery run creates a JSON log in `.oac/contributions/`:\n\n```\n.oac/\n├── contributions/\n│   ├── 2026-02-17-143052-jiun.json\n│   ├── 2026-02-17-151023-jiun.json\n│   └── 2026-02-18-091500-alice.json\n└── leaderboard.json\n```\n\nEach log records: who contributed, which tasks, tokens used, PRs created, and execution metrics. The leaderboard aggregates across all contributors.\n\n```bash\noac leaderboard\n```\n\n```\n  Contribution Leaderboard\n  ────────────────────────\n  #1  jiun     42 tasks   284,000 tokens   38 PRs merged\n  #2  alice    31 tasks   195,000 tokens   27 PRs merged\n  #3  bob      18 tasks   122,000 tokens   15 PRs merged\n```\n\n---\n\n## How It Works\n\nOAC uses a **context-first architecture**: it first deeply analyzes the codebase, then groups related findings into coherent **epics** (not tiny per-file tasks), and executes each epic as a single unit with full module context.\n\n```\nYou run `oac run`\n        │\n        ▼\n   ┌─────────┐     Shallow clone, cache metadata\n   │  Repo    │────────────────────────────────────┐\n   │  Select  │                                    │\n   └────┬─────┘                                    │\n        │                                          │\n        ▼                                          ▼\n   ┌─────────┐     Auto-detect src dir,      ┌──────────┐\n   │ Analyze │──── module map, exports, ────▶│ Context  │\n   └────┬────┘     LOC, dependencies         │ .oac/    │\n        │                                    └────┬─────┘\n        ▼                                         │\n   ┌─────────┐     TODO, lint, test-gap,     ┌────▼─────┐\n   │  Scan   │──── GitHub issues ──────────▶│ Findings │\n   └────┬────┘                              └────┬─────┘\n        │                                        │\n        ▼                                        ▼\n   ┌─────────┐     Group by module+type,     ┌──────────┐\n   │  Group  │──── create coherent units ──▶│  Epics   │\n   └────┬────┘     (1 PR per epic)           └────┬─────┘\n        │                                        │\n        ▼                                        ▼\n   ┌─────────┐     Per-epic estimation,      ┌──────────┐\n   │ Budget  │──── priority-based select ──▶│   Plan   │\n   └────┬────┘                              └────┬─────┘\n        │                                        │\n        ▼                                        ▼\n   ┌─────────┐     git worktree per epic    ┌──────────┐\n   │Execute  │──── with module context ────▶│ Results  │\n   └────┬────┘                              └────┬─────┘\n        │                                        │\n        ▼                                        ▼\n   ┌─────────┐     Validate diff,           ┌──────────┐\n   │Complete │──── create PR, link issue ──▶│   PRs    │\n   └────┬────┘                              └────┬─────┘\n        │                                        │\n        ▼                                        ▼\n   ┌─────────┐     .oac/contributions/      ┌──────────┐\n   │  Track  │──── JSON audit log ─────────▶│  Done!   │\n   └─────────┘     update backlog           └──────────┘\n```\n\n### Epic-Based Execution vs Per-Task\n\n| | Old (per-task) | New (epic-based) |\n|---|---|---|\n| Unit | 1 task = 1 file change | 1 epic = N related changes |\n| Context | Agent sees only target file | Agent sees full module context |\n| PR | 1 PR per file | 1 PR per epic (multi-file) |\n| Persistence | None — re-scans every run | Backlog persisted in `.oac/context/` |\n| Incremental | Full re-scan | Only re-analyzes git-changed files |\n\n---\n\n## Supported AI Agents\n\n| Agent | Status | Provider ID |\n|-------|--------|-------------|\n| [Claude Code](https://claude.ai/code) | Supported | `claude-code` |\n| [Codex CLI](https://github.com/openai/codex) | Supported | `codex` |\n| [OpenCode](https://github.com/opencode-ai/opencode) | Planned | `opencode` |\n| Custom | Implement `AgentProvider` interface | any string |\n\n### Adding a Custom Agent\n\n```typescript\nimport type { AgentProvider } from '@open330/oac-execution';\n\nexport class MyAgentAdapter implements AgentProvider {\n  readonly id = 'my-agent';\n  readonly name = 'My Custom Agent';\n\n  async checkAvailability() { /* ... */ }\n  execute(params) { /* ... */ }\n  async estimateTokens(params) { /* ... */ }\n  async abort(executionId) { /* ... */ }\n}\n```\n\n---\n\n## Roadmap\n\n- [x] **2026.2.17** — Core engine, CLI, 5 scanners, parallel execution, npm publish\n- [x] **2026.2.18** — Context-first architecture: codebase analyzer, epic grouper, incremental analysis, backlog persistence, enhanced prompts with module context\n- [x] **2026.4.x** — Claude Code + Codex CLI adapters, token usage reporting, auto-detect sourceDir\n- [x] **2026.4.x** — 9-wave quality cycle: performance fixes, UX polish, run module decomposition, shell completion, retry, exit codes, memory monitoring, streaming analysis, config reference docs\n- [ ] **Next** — OpenCode adapter, multi-agent routing, localhost dashboard, daemon mode\n- [ ] **Future** — Linear/Jira webhooks, plugin system, sparse checkout for monorepos\n\n---\n\n## Contributing\n\nWe welcome contributions! OAC is designed to contribute to repos — and it can contribute to itself too.\n\n```bash\n# Clone and setup\ngit clone https://github.com/Open330/open-agent-contribution.git\ncd open-agent-contribution\npnpm install\npnpm build\n\n# Run tests\npnpm test\n\n# Lint and format\npnpm lint\npnpm format\n\n# Or just let OAC contribute to itself\nnpx @open330/oac run --repo Open330/open-agent-contribution --tokens unlimited\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.\n\n---\n\n## Troubleshooting\n\n<details>\n<summary><strong>Agent not found / command not found</strong></summary>\n\nOAC dispatches work to external agents (`claude`, `codex`). Make sure the agent CLI is installed and on your `PATH`:\n\n```bash\n# Verify agents are reachable\noac doctor\n\n# Check individual agents\nwhich claude   # Claude Code\nwhich codex    # Codex CLI\n```\n\nIf `oac doctor` reports a missing agent, install it following the agent's own documentation, then re-run `oac doctor`.\n</details>\n\n<details>\n<summary><strong>Token budget exceeded / nothing was executed</strong></summary>\n\nThe planner reserves 10% of your budget as a safety margin. If every discovered task exceeds the effective budget, nothing will be selected.\n\n```bash\n# Check what would be selected\noac run --dry-run --repo owner/repo\n\n# Increase the budget\noac run --tokens 200000 --repo owner/repo\n\n# Or set it in oac.config.ts\nexport default defineConfig({\n  budget: { totalTokens: 200_000 },\n});\n```\n</details>\n\n<details>\n<summary><strong>Config file errors</strong></summary>\n\n```bash\n# Validate your config\noac doctor\n\n# Regenerate a minimal config\noac init --minimal --repo owner/repo\n```\n\nCommon issues:\n- Missing `repos` array — at least one repo is required.\n- Invalid provider ID — must be `\"claude-code\"` or `\"codex\"`.\n- `budget.totalTokens` must be a positive number.\n\nSee [docs/config-reference.md](docs/config-reference.md) for all options.\n</details>\n\n<details>\n<summary><strong>Permission denied / GitHub auth errors</strong></summary>\n\nOAC uses `gh` (GitHub CLI) for PR creation and issue access. Make sure you're authenticated:\n\n```bash\ngh auth status\ngh auth login   # if not authenticated\n```\n\nFor private repos, ensure your token has `repo` scope.\n</details>\n\n<details>\n<summary><strong>Sandbox / worktree errors</strong></summary>\n\nOAC creates git worktrees in a temporary directory for each task. If a previous run crashed, stale worktrees may remain:\n\n```bash\n# List worktrees\ngit worktree list\n\n# Clean up stale entries\ngit worktree prune\n```\n</details>\n\n---\n\n## Philosophy\n\n> **\"Don't let your tokens go to waste.\"**\n\nEvery month, developers around the world leave millions of AI tokens on the table. OAC turns that idle capacity into real open source contributions — automatically, safely, and transparently.\n\nNo hosted services. No data collection. No lock-in. Just your machine, your tokens, and your repos.\n\n---\n\n<div align=\"center\">\n\n**Built with spare tokens by the [Open330](https://github.com/Open330) community.**\n\n[Report Bug](https://github.com/Open330/open-agent-contribution/issues) · [Request Feature](https://github.com/Open330/open-agent-contribution/issues) · [Discussions](https://github.com/Open330/open-agent-contribution/discussions)\n\n</div>\n","readmeFilename":"README.md"}