{"_id":"@ageflow/testing","_rev":"10-916853dc979badf8c1c9b48301e89131","name":"@ageflow/testing","dist-tags":{"latest":"0.3.8"},"versions":{"0.1.0":{"name":"@ageflow/testing","version":"0.1.0","_id":"@ageflow/testing@0.1.0","maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"dist":{"shasum":"23ad587f19713a15b301f5f8dde60f5ab9297211","tarball":"https://registry.npmjs.org/@ageflow/testing/-/testing-0.1.0.tgz","fileCount":10,"integrity":"sha512-+MH6f4Faz40S00dCMvaev+kRI05be8Gk55h8UR2exenC154OUI4dD8sN/WYL+HAcng4e0hlG+0cVVE+xzLfwkg==","signatures":[{"sig":"MEQCICodprzFXDabKXpXNyO/L48u3izDVr8UAF06UJLrY6DUAiARfZFd9YrCeBagOgx5lia6j6Lll3Jpjo9oW0tNtvIjdA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58436},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"eae9a8649a06fea53d806b347241c2855d71a6ba","private":false,"scripts":{"lint":"biome check src/","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neftedollar","email":"oildollar@gmail.com"},"_npmVersion":"11.11.0","directories":{},"_nodeVersion":"25.8.1","dependencies":{"@ageflow/core":"workspace:*","@ageflow/executor":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vitest":"^2.1.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/testing_0.1.0_1776288866401_0.5386388980797971","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@ageflow/testing","version":"0.2.0","keywords":["ai","agents","workflow","llm","dsl","typescript","claude","openai","multi-agent"],"license":"MIT","_id":"@ageflow/testing@0.2.0","maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"homepage":"https://github.com/Neftedollar/ageflow/tree/master/agentflow/packages/testing","bugs":{"url":"https://github.com/Neftedollar/ageflow/issues"},"dist":{"shasum":"d61758494151c36a0001db11ae05bda84db3d3bc","tarball":"https://registry.npmjs.org/@ageflow/testing/-/testing-0.2.0.tgz","fileCount":11,"integrity":"sha512-EM064b2woDN5hdGkVidr7UsPki7NjsOXyQIlEK7qCZ2UCy7QTwj3B39rEA2cJdjnRYOaVzOB9MqgxmYkJEs2Kg==","signatures":[{"sig":"MEYCIQCxMYHg8nBBpD+kfRQSG+1anhlVJIh5tSbIZ/FxtnJNFgIhAM62Q9lP07+kUxwi9lMo2sPUaraJ93jMnmNW0AoBnAu1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":61969},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c9ec02fd33cba8108a1255623ba329097acfe908","private":false,"scripts":{"lint":"biome check src/","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neftedollar","email":"oildollar@gmail.com"},"repository":{"url":"git+https://github.com/Neftedollar/ageflow.git","type":"git"},"_npmVersion":"11.11.0","description":"Test harness for ageflow workflows — mock agents, inspect call counts, no API calls needed","directories":{},"_nodeVersion":"25.8.1","dependencies":{"@ageflow/core":"workspace:*","@ageflow/executor":"workspace:*"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vitest":"^2.1.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/testing_0.2.0_1776330804193_0.15105753817050305","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@ageflow/testing","version":"0.3.0","keywords":["ai","agents","workflow","llm","dsl","typescript","claude","openai","multi-agent"],"license":"MIT","_id":"@ageflow/testing@0.3.0","maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"homepage":"https://github.com/Neftedollar/ageflow/tree/master/packages/testing","bugs":{"url":"https://github.com/Neftedollar/ageflow/issues"},"dist":{"shasum":"0608199f0a2667e32264d8ac3a09e3901fb72de9","tarball":"https://registry.npmjs.org/@ageflow/testing/-/testing-0.3.0.tgz","fileCount":19,"integrity":"sha512-RDfPEcJgTgYoYj9jnT70EeuiSzsjYOs0Gar78OL5zUwKxj4Cvzbb/A8W8hYMyW3ChbPazGu8hfcKhaQTvqU8zA==","signatures":[{"sig":"MEYCIQCRVOo2lGc2Evr/K8vALXrAdDFmz3PMdU7exM3Taiy1ogIhANmUsfwfQdTBPleTfE43Ipqu2oO5U8/TChhJXZlV378u","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100583},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f055450765c4b4f8e6a06d3bcedb2e337395adb8","private":false,"scripts":{"lint":"biome check src/","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neftedollar","email":"oildollar@gmail.com"},"repository":{"url":"git+https://github.com/Neftedollar/ageflow.git","type":"git"},"_npmVersion":"11.11.0","description":"Test harness for ageflow workflows — mock agents, inspect call counts, no API calls needed","directories":{},"_nodeVersion":"25.8.1","dependencies":{"@ageflow/core":"workspace:*","@ageflow/executor":"workspace:*","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vitest":"^2.1.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/testing_0.3.0_1776377995447_0.3767435947375044","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@ageflow/testing","version":"0.3.2","keywords":["ai","agents","workflow","llm","dsl","typescript","claude","openai","multi-agent"],"license":"MIT","_id":"@ageflow/testing@0.3.2","maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"homepage":"https://github.com/Neftedollar/ageflow/tree/master/packages/testing","bugs":{"url":"https://github.com/Neftedollar/ageflow/issues"},"dist":{"shasum":"31d18e74fef524448a82d0dddd96fdd4460db0df","tarball":"https://registry.npmjs.org/@ageflow/testing/-/testing-0.3.2.tgz","fileCount":23,"integrity":"sha512-qg/LsBWd/89QS1NC/U8FN+wNIBpJst8WTgXz+VIwNSdtktt3jFeG3V1Q1RheEy7QZr6oSGXJpDine10hVB0k3A==","signatures":[{"sig":"MEUCIQDVOIkNFTuGr+2jYUcSifnQE27+5SCIMi5sS310NYAfFQIgcxolkG+p8NFANGboxjJab9tlwgbEa1PZY33B7DaoEL8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114610},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"67e25292e8f64b4c7643f1ac12164e771122c632","private":false,"scripts":{"lint":"biome check src/","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neftedollar","email":"oildollar@gmail.com"},"repository":{"url":"git+https://github.com/Neftedollar/ageflow.git","type":"git"},"_npmVersion":"11.11.0","description":"Test harness for ageflow workflows — mock agents, inspect call counts, no API calls needed","directories":{},"_nodeVersion":"25.8.1","dependencies":{"@ageflow/core":"^0.3.2","@ageflow/executor":"^0.3.2","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vitest":"^2.1.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/testing_0.3.2_1776395158871_0.3475701219793521","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@ageflow/testing","version":"0.3.3","keywords":["ai","agents","workflow","llm","dsl","typescript","claude","openai","multi-agent"],"license":"MIT","_id":"@ageflow/testing@0.3.3","maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"homepage":"https://github.com/Neftedollar/ageflow/tree/master/packages/testing","bugs":{"url":"https://github.com/Neftedollar/ageflow/issues"},"dist":{"shasum":"8ca07cc895bd6c1e84d9bacd3a1818a058ad8166","tarball":"https://registry.npmjs.org/@ageflow/testing/-/testing-0.3.3.tgz","fileCount":23,"integrity":"sha512-ZBMohnhjn7MnK7U6TTLz0ss/1TJXwTsiC8MSo5+iTksPeNAq5yjDJzq7HihPbRVveqn/QpJhb6CGc7ExCCZLLQ==","signatures":[{"sig":"MEUCIFAyNVpXee/LWClCJ/6Wpiwwv/eF8Ls2wPDUmLMrMZhaAiEA10WoYYpBaweDgWAscFRtgBEbkzGoJILlTQDe1Alvxo0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114430},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"private":false,"scripts":{"lint":"biome check src/","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neftedollar","email":"oildollar@gmail.com"},"repository":{"url":"git+https://github.com/Neftedollar/ageflow.git","type":"git"},"_npmVersion":"11.11.0","description":"Test harness for ageflow workflows — mock agents, inspect call counts, no API calls needed","directories":{},"_nodeVersion":"25.8.1","dependencies":{"@ageflow/core":"^0.4.3","@ageflow/executor":"^0.4.3","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vitest":"^2.1.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/testing_0.3.3_1776415462907_0.8080559580366264","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@ageflow/testing","version":"0.3.4","keywords":["ai","agents","workflow","llm","dsl","typescript","claude","openai","multi-agent"],"license":"MIT","_id":"@ageflow/testing@0.3.4","maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"homepage":"https://github.com/Neftedollar/ageflow/tree/master/packages/testing","bugs":{"url":"https://github.com/Neftedollar/ageflow/issues"},"dist":{"shasum":"5ad083e6c0e0ea216ce1499f061c11e5418809b3","tarball":"https://registry.npmjs.org/@ageflow/testing/-/testing-0.3.4.tgz","fileCount":19,"integrity":"sha512-RpNrBQpfwR6rMjvk+XjmKnT2dk+XdyFvcg94UxM8CKyEFRnRmJaw2N2l3kw0dc6+nwYq3RlDD1x8WV/rWjTiAw==","signatures":[{"sig":"MEQCIHZ5FzhnO9C0OfHAyFSyRQtlAfEkuiEV1W1YIbgVTHC6AiAQCmH1Fly/tenY6BsskVbIebNWwlax1YaaK4geGrgNsA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100587},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"private":false,"scripts":{"lint":"biome check src/","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neftedollar","email":"oildollar@gmail.com"},"repository":{"url":"git+https://github.com/Neftedollar/ageflow.git","type":"git"},"_npmVersion":"11.11.0","description":"Test harness for ageflow workflows — mock agents, inspect call counts, no API calls needed","directories":{},"_nodeVersion":"25.8.1","dependencies":{"@ageflow/core":"^0.5.0","@ageflow/executor":"^0.5.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vitest":"^2.1.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/testing_0.3.4_1776422111981_0.36458460106745605","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@ageflow/testing","version":"0.3.5","keywords":["ai","agents","workflow","llm","dsl","typescript","claude","openai","multi-agent"],"license":"MIT","_id":"@ageflow/testing@0.3.5","maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"homepage":"https://github.com/Neftedollar/ageflow/tree/master/packages/testing","bugs":{"url":"https://github.com/Neftedollar/ageflow/issues"},"dist":{"shasum":"4b0019934514883901c01f4d84354b62bb2bc211","tarball":"https://registry.npmjs.org/@ageflow/testing/-/testing-0.3.5.tgz","fileCount":19,"integrity":"sha512-didFHTJELbRTESj2kIADChC3QJZ1FJmRVGONObr8hnJR3zAuF7AFxMchUktetSYrDOnUL3rCVFEkL2MkdtX/9A==","signatures":[{"sig":"MEYCIQDfVFNqgu8yvXk6lOxkM3AHPZdhuEbQsmMxgwiosylQcgIhALZxO9KU/ijLaHucH8xcZUtvnzIcuF3Qs6j+0iF8nSp7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100587},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"private":false,"scripts":{"lint":"biome check src/","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neftedollar","email":"oildollar@gmail.com"},"repository":{"url":"git+https://github.com/Neftedollar/ageflow.git","type":"git"},"_npmVersion":"11.11.0","description":"Test harness for ageflow workflows — mock agents, inspect call counts, no API calls needed","directories":{},"_nodeVersion":"25.8.1","dependencies":{"@ageflow/core":"^0.6.0","@ageflow/executor":"^0.6.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vitest":"^2.1.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/testing_0.3.5_1776434948663_0.6828893190037659","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@ageflow/testing","version":"0.3.6","keywords":["ai","agents","workflow","llm","dsl","typescript","claude","openai","multi-agent"],"license":"MIT","_id":"@ageflow/testing@0.3.6","maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"homepage":"https://github.com/Neftedollar/ageflow/tree/master/packages/testing","bugs":{"url":"https://github.com/Neftedollar/ageflow/issues"},"dist":{"shasum":"72cd9259c998942852954c7708418408b846d30e","tarball":"https://registry.npmjs.org/@ageflow/testing/-/testing-0.3.6.tgz","fileCount":19,"integrity":"sha512-AhhfBkyY3RX6YDycOvCt1fDDvc4YJ2bBA6I8vnX5uZX2B6Gr/+aFrMw7wd6m/vcnf0qOMVk3Fd1NCSPn5hQK/w==","signatures":[{"sig":"MEQCIGteSJCdUnVfhKTq5+4eJeGMf4VAsIahz17wr+9cPujVAiBqiK8e/rZK02EbVFDqcWggNqFVE7zJ2edPSNwcCyfdDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101095},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"private":false,"scripts":{"lint":"biome check src/","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neftedollar","email":"oildollar@gmail.com"},"repository":{"url":"git+https://github.com/Neftedollar/ageflow.git","type":"git"},"_npmVersion":"11.11.0","description":"Test harness for ageflow workflows — mock agents, inspect call counts, no API calls needed","directories":{},"_nodeVersion":"25.8.1","dependencies":{"@ageflow/core":"^0.6.0","@ageflow/executor":"^0.6.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vitest":"^2.1.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/testing_0.3.6_1776457214946_0.6551496284516245","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@ageflow/testing","version":"0.3.7","keywords":["ai","agents","workflow","llm","dsl","typescript","claude","openai","multi-agent"],"license":"MIT","_id":"@ageflow/testing@0.3.7","maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"homepage":"https://github.com/Neftedollar/ageflow/tree/master/packages/testing","bugs":{"url":"https://github.com/Neftedollar/ageflow/issues"},"dist":{"shasum":"d4b69e0ca135b6dff1567e06a5de88e7e623a8b3","tarball":"https://registry.npmjs.org/@ageflow/testing/-/testing-0.3.7.tgz","fileCount":19,"integrity":"sha512-EVRoZVwLP1nPsmPHJup/BIYJY5ZXwd+QAbT6ngIq4FSz3qK9JYFMuzRnjS6uPSJMZeAtpHxQhFeKC0h/VvXFfA==","signatures":[{"sig":"MEUCIGPaGI72BurM4pfBUPkwBvbj5ltDoUSsztG7N3VXH9KIAiEAtgoGHyz3bPT91cMWDo2emBeTbbKypuW/jKEYgi0iPW4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102140},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"private":false,"scripts":{"lint":"biome check src/","test":"vitest run","build":"tsc","typecheck":"tsc --noEmit"},"_npmUser":{"name":"neftedollar","email":"oildollar@gmail.com"},"repository":{"url":"git+https://github.com/Neftedollar/ageflow.git","type":"git"},"_npmVersion":"11.11.0","description":"Test harness for ageflow workflows — mock agents, inspect call counts, no API calls needed","directories":{},"_nodeVersion":"25.8.1","dependencies":{"@ageflow/core":"^0.6.0","@ageflow/executor":"^0.6.0","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.23.0","vitest":"^2.1.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/testing_0.3.7_1776465217715_0.6471811804722145","host":"s3://npm-registry-packages-npm-production"}},"0.3.8":{"name":"@ageflow/testing","version":"0.3.8","description":"Test harness for ageflow workflows — mock agents, inspect call counts, no API calls needed","homepage":"https://github.com/Neftedollar/ageflow/tree/master/packages/testing","type":"module","private":false,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc","typecheck":"tsc --noEmit","test":"vitest run","lint":"biome check src/"},"dependencies":{"@ageflow/core":"^0.6.0","@ageflow/executor":"^0.7.0","@modelcontextprotocol/sdk":"^1.0.0"},"devDependencies":{"@types/node":"^22.0.0","vitest":"^2.1.0","zod":"^3.23.0"},"repository":{"type":"git","url":"git+https://github.com/Neftedollar/ageflow.git"},"keywords":["ai","agents","workflow","llm","dsl","typescript","claude","openai","multi-agent"],"license":"MIT","_id":"@ageflow/testing@0.3.8","bugs":{"url":"https://github.com/Neftedollar/ageflow/issues"},"_nodeVersion":"25.8.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-9vWSgo0sB1Mbot+3bX4pl1ZvKYFexFT8AISg9JjvRnu+4B1l/qQCgGOBHr+CRZSXe6jIxeoCSq0RtDsxNRQsZg==","shasum":"4d034e325992fb02a8b69e14907a11b36b1c89d8","tarball":"https://registry.npmjs.org/@ageflow/testing/-/testing-0.3.8.tgz","fileCount":23,"unpackedSize":115983,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIH1xMpYQWvY6Cn/8dMOMeUjcCONXvRsf6gSxfn2ciJIVAiB9oSlTpqLQWl0BjwIaUIEF9V80oTInJFDCpdHlAen3Bw=="}]},"_npmUser":{"name":"neftedollar","email":"oildollar@gmail.com"},"directories":{},"maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/testing_0.3.8_1776473886520_0.3953015105343227"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-15T21:34:26.308Z","modified":"2026-04-18T00:58:06.818Z","0.1.0":"2026-04-15T21:34:26.618Z","0.2.0":"2026-04-16T09:13:24.330Z","0.3.0":"2026-04-16T22:19:55.597Z","0.3.2":"2026-04-17T03:05:58.998Z","0.3.3":"2026-04-17T08:44:23.036Z","0.3.4":"2026-04-17T10:35:12.116Z","0.3.5":"2026-04-17T14:09:08.810Z","0.3.6":"2026-04-17T20:20:15.091Z","0.3.7":"2026-04-17T22:33:37.903Z","0.3.8":"2026-04-18T00:58:06.691Z"},"bugs":{"url":"https://github.com/Neftedollar/ageflow/issues"},"license":"MIT","homepage":"https://github.com/Neftedollar/ageflow/tree/master/packages/testing","keywords":["ai","agents","workflow","llm","dsl","typescript","claude","openai","multi-agent"],"repository":{"type":"git","url":"git+https://github.com/Neftedollar/ageflow.git"},"description":"Test harness for ageflow workflows — mock agents, inspect call counts, no API calls needed","maintainers":[{"name":"neftedollar","email":"oildollar@gmail.com"}],"readme":"# @ageflow/testing\n\n[![npm](https://img.shields.io/npm/v/@ageflow/testing)](https://www.npmjs.com/package/@ageflow/testing)\n\nTest harness for [ageflow](../../README.md) workflows. Mock agents return predetermined responses — no CLI installed, no API calls, tests run in milliseconds.\n\n## Install\n\n```bash\nbun add -D @ageflow/testing\n```\n\n## Quick example\n\n```ts\nimport { createTestHarness } from \"@ageflow/testing\";\nimport { describe, expect, it } from \"vitest\";\nimport myWorkflow from \"./workflow.js\";\n\ndescribe(\"my workflow\", () => {\n  it(\"runs end-to-end with mocked agents\", async () => {\n    const harness = createTestHarness(myWorkflow);\n\n    harness.mockAgent(\"analyze\", {\n      issues: [{ id: \"1\", file: \"src/app.ts\", description: \"unused var\" }],\n    });\n    harness.mockAgent(\"fix\", { patch: \"- const x\\n+ const _x\" });\n\n    const result = await harness.run();\n\n    expect(result.outputs[\"fix\"]).toEqual({ patch: \"- const x\\n+ const _x\" });\n  });\n});\n```\n\n## API\n\n### `createTestHarness(workflow)`\n\nReturns a `TestHarness` for the given workflow definition.\n\n```ts\nconst harness = createTestHarness(workflow);\n```\n\n### `harness.mockAgent(taskName, response)`\n\nRegister a mock response for a task. Three forms:\n\n```ts\n// Always return the same response\nharness.mockAgent(\"classify\", { label: \"positive\", confidence: 0.97 });\n\n// Return different responses on successive calls\nharness.mockAgent(\"fix\", [\n  { patch: \"attempt 1\" },  // call 1\n  { patch: \"attempt 2\" },  // call 2 — last element repeats if exhausted\n]);\n\n// Simulate a failure (triggers retry logic)\nharness.mockAgent(\"validate\", { throws: new Error(\"syntax error\") });\n```\n\n### `harness.run(input?)`\n\nRun the workflow with all mocked runners. Returns `WorkflowResult`.\n\n```ts\nconst result = await harness.run();\n// result.outputs[\"taskName\"] — typed output of each task\n```\n\nPass an input if your workflow expects one:\n\n```ts\nconst result = await harness.run({ repo: \"my-org/my-repo\" });\n```\n\n### `harness.getTask(name)`\n\nInspect call statistics after `run()`:\n\n```ts\nconst stats = harness.getTask(\"fix\");\n// stats.callCount  — total spawn calls (includes retried attempts)\n// stats.retryCount — how many times the task was retried\n// stats.outputs    — all successful outputs, in call order\n```\n\n## Testing loops\n\nLoops call inner tasks repeatedly. Use an array mock to return different responses per iteration:\n\n```ts\nharness.mockAgent(\"eval\", [\n  { satisfied: false },  // iteration 1 — keep looping\n  { satisfied: false },  // iteration 2\n  { satisfied: true },   // iteration 3 — loop exits\n]);\n```\n\n## Testing HITL workflows\n\nThe harness bypasses HITL checkpoints by default (auto-approves). To override:\n\n```ts\nconst harness = createTestHarness({\n  ...myWorkflow,\n  hooks: {\n    onCheckpoint: async (taskName) => {\n      // return false to simulate rejection\n      return taskName !== \"deploy\";\n    },\n  },\n});\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}