{"_id":"@adhd/apigen-core-client","_rev":"11-d9a3849d1fd1b30ca6ff787fc447e28e","name":"@adhd/apigen-core-client","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"@adhd/apigen-core-client","version":"0.1.0","_id":"@adhd/apigen-core-client@0.1.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"eedf44604dc4e5b1c69d4695569fe1045a63609c","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.1.0.tgz","fileCount":23,"integrity":"sha512-MbWdvKJyqXJto6OZlYXCA80NOYMbkx8h3c10B9dD8BJLB0W7ClokdmA0udLW40D6KNDy398TPJYPQWl1WoUSYQ==","signatures":[{"sig":"MEUCIQDRos9paS8yUp1UE55q69HFd1UwDU7FV7Xz0CAZnS92XAIgKzlvYrUeQcgA5K9aitQxa94JapIweRv/yMjzxGb9QBU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153685},"main":"./index.js","module":"./index.mjs","gitHead":"36e7fe6e3b1dd5a9356fb1dab93d9eb1746df8b0","typings":"./index.d.ts","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"> The core apigen engine — TypeScript source → JSON Schema extraction, composition, and the plugin contract every apigen target implements.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-core-client_0.1.0_1784686879324_0.7892935407778712","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@adhd/apigen-core-client","version":"0.1.1","_id":"@adhd/apigen-core-client@0.1.1","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"87b305e6731d6668f709cb05e4da5fb9f75dddbb","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.1.1.tgz","fileCount":23,"integrity":"sha512-DxpqbGcm206NRmRbWMeqMpLwzGbi3IKwDY5isK2K7sXkbqCnLUD5Ih8lWxO9kbuIFHnTlBTZr4dYi8lSofoIzw==","signatures":[{"sig":"MEUCIQCTI4J/nIaZbFF5Wa0E4dhdt4g+vlanGGABco3CzU4tqwIgcYnmn007+r5ZVytlPN+3LTjnKoP2neL6YL47gUePwt4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":164863},"main":"./index.js","module":"./index.mjs","gitHead":"afca4fc9097845a32a9e371ce6cd1252cbc0be6b","typings":"./index.d.ts","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"> The core apigen engine — TypeScript source → JSON Schema extraction, composition, the plugin contract, and the programmatic API for running live servers without code generation.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-core-client_0.1.1_1784773898814_0.30250990746425654","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@adhd/apigen-core-client","version":"0.1.2","_id":"@adhd/apigen-core-client@0.1.2","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"2e3d74dce42d94920093fb7e90b035d0012076dd","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.1.2.tgz","fileCount":23,"integrity":"sha512-i3mBureNp1o2eNHFYwMRgrzZJIKvxe9MtIeYyJXr3vAth0vvSKuxY+xVsaerhRXsgGGQoJX8DuEofKC2UQXdYg==","signatures":[{"sig":"MEYCIQDZbD8O5iztC/weWxrqZC2FU2dtnC5Hh0hNCS/Euq8sHAIhAKjmHIUBLWjjmtWb8rREg+6beoaJeLe0tE5f0ELn/elP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":165357},"main":"./index.js","module":"./index.mjs","gitHead":"eb0fd170825539850ae91a64393f8a8f376d8c7b","typings":"./index.d.ts","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"> The core apigen engine — TypeScript source → JSON Schema extraction, composition, the plugin contract, and the programmatic API for running live servers without code generation.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.0.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-core-client_0.1.2_1784831115223_0.803561697330127","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@adhd/apigen-core-client","version":"0.1.3","_id":"@adhd/apigen-core-client@0.1.3","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"62c000a8aca7a74f23b297aecdaa8cb2bf236982","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.1.3.tgz","fileCount":23,"integrity":"sha512-Oz/YhTvYH8NmbY+mfmuFfWmINhait3CKv5Ij4GZ24TknOdUUAQcYnEK7p3S06QGCOkQIFbSRjQ9LA73jiBbu1g==","signatures":[{"sig":"MEQCIFBsjCfkS5nRn9v+IcDGbwrpe6B86embF34mu/cyQOCMAiAUiRUSMMO5cLEko1qyWAk0KpuwK+nMGiA5CvxdnsU57Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168076},"main":"./index.js","module":"./index.mjs","gitHead":"60d30f61a52a3cb55285346e534382df02258264","typings":"./index.d.ts","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"> The core apigen engine — TypeScript source → JSON Schema extraction, composition, the plugin contract, and the programmatic API for running live servers without code generation.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.0.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-core-client_0.1.3_1784934752256_0.3225130464040169","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@adhd/apigen-core-client","version":"0.1.4","_id":"@adhd/apigen-core-client@0.1.4","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"a701c5390f92fe1bf1a0eb597b9d1aecb89169a4","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.1.4.tgz","fileCount":23,"integrity":"sha512-WMhkKkZEfY64Ylt20C2Xh50LBoFVp8+x2Rq6fpG8LOHbmUEWQqk4eFk2vNVOmpo1NvezRiPahBz/JNOYoLPCwA==","signatures":[{"sig":"MEUCIB8DKR1lp2IvQlL56TZ4P5ZfJhL+xX0qNyDd1WdGxYPCAiEA/m9I6ZzsVTXRrx3jG4b8qHY2cZSlyRyYfMT8nkx+mVc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168076},"main":"./index.js","module":"./index.mjs","gitHead":"4a55390e41abde59d4b6c1f420851503ff727386","typings":"./index.d.ts","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"> The core apigen engine — TypeScript source → JSON Schema extraction, composition, the plugin contract, and the programmatic API for running live servers without code generation.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.0.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-core-client_0.1.4_1784937235099_0.03891526342236862","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@adhd/apigen-core-client","version":"0.1.5","_id":"@adhd/apigen-core-client@0.1.5","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"320ef9c9cd57ddf045887db8742e64f63aef5616","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.1.5.tgz","fileCount":24,"integrity":"sha512-nGPsSD4hMdOpvmYmPDpcYOSMfpXk472isXnCoTuaidOsg8nzMr/lFrrRjPmoXgJTmSigLf1hGx0ny1A0O30W9Q==","signatures":[{"sig":"MEYCIQC/AN00ch0W4guNkqFFh8Z6CQHIa1HM33uOZZ+Q3dbEzQIhAPU+ympuAh9/0SMRWoFGwsjTCIUk9RuECOeqTPmeNeaM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175541},"main":"./index.js","module":"./index.mjs","gitHead":"b0c95afe7acf5dac87cc9d5ad3f0e291c184bdc5","typings":"./index.d.ts","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"> The core apigen engine — TypeScript source → JSON Schema extraction, composition, the plugin contract, and the programmatic API for running live servers without code generation.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.0.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-core-client_0.1.5_1785008873023_0.4747595206409818","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@adhd/apigen-core-client","version":"0.2.0","_id":"@adhd/apigen-core-client@0.2.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"344d7980947ff425ffdac99ccdfb8b84a4f21c27","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.2.0.tgz","fileCount":24,"integrity":"sha512-4Owm5QdBlFFIify78615EQqFmjwXHKCPeAZi4DmxOP60RkF1aVLge/bfcpO1pK2J610XqSzE+2ACM7U9nCjFlA==","signatures":[{"sig":"MEQCIHGvEwYgLlxg7Tz97VL+vJXOR0SaYMLG6Q9jiLmYKwk8AiAYGJXz/McKuQbuWVqQSPYzozM8ls+oFcBkIPG1AmCj+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175541},"main":"./index.js","module":"./index.mjs","gitHead":"1dbc0638f8eb1b7c961bc9359def6f4425da5c15","typings":"./index.d.ts","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"> The core apigen engine — TypeScript source → JSON Schema extraction, composition, the plugin contract, and the programmatic API for running live servers without code generation.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-core-client_0.2.0_1785136499739_0.9332683309654926","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@adhd/apigen-core-client","version":"0.2.1","_id":"@adhd/apigen-core-client@0.2.1","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"c3f182c668a560c0caca2fba8a9b72dd41e076be","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.2.1.tgz","fileCount":25,"integrity":"sha512-nFoUE+ocfbIXC8ri8y9pcvpOzj05QkhI37Sqt1fDsapjbw7ZZbS5QwahtXmI1ZfJ4Hpvh9M5yHUgQWwUl/hDWA==","signatures":[{"sig":"MEUCIQCbIaW/6fYWYLkfJZuaKEXpVwcJdcb5Hl9xUutbX8qgMQIgI79wymmF02cdUNAh62i542Xd2Bp43WT9QWnv+4OxOJk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193850},"main":"./index.js","module":"./index.mjs","gitHead":"ecb6695cd4d5b19b334cd27975ad61f1a100fb25","typings":"./index.d.ts","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"> The core apigen engine — TypeScript source → JSON Schema extraction, composition, the plugin contract, and the programmatic API for running live servers without code generation.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-core-client_0.2.1_1785204920146_0.7275018022927502","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@adhd/apigen-core-client","version":"0.2.2","_id":"@adhd/apigen-core-client@0.2.2","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"f08c88f9f50fa09d3908c696768cfddecb7412e6","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.2.2.tgz","fileCount":25,"integrity":"sha512-leCbDlHewwn8+1ro9czZpFRRbAu7awMqbBss7RJiEm+rRnGSuG3KFMNK/dorQkzHTEYdBFfsBqZoCR6DUE/DNw==","signatures":[{"sig":"MEYCIQDF/Ebnu8v3zalpaXnWvaOPGTzouFOPxdoHemBcF1w9vgIhAJsE1lWeqOTChh33y/OMkJQ3/L/sUJvgBpOuGPuLSReP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194421},"main":"./index.js","module":"./index.mjs","gitHead":"35ecbc8a788f13903c5e421e4c511010ed24b11f","typings":"./index.d.ts","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"> The core apigen engine — TypeScript source → JSON Schema extraction, composition, the plugin contract, and the programmatic API for running live servers without code generation.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-core-client_0.2.2_1785433149297_0.7236760817657886","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@adhd/apigen-core-client","version":"0.3.0","_id":"@adhd/apigen-core-client@0.3.0","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"dist":{"shasum":"c96e6bbbee09c514471be6c3ae82461c832feb6b","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.3.0.tgz","fileCount":27,"integrity":"sha512-2sncgz/dER1APRsik1SZa3ANGt5v547xlCRMlRDdgQE7Lc4Yll80TtYqwng/E5OazBrEetc+TA7VZap6F7RWsw==","signatures":[{"sig":"MEUCIQDndAkEIjG74pDrlhHuu6MxyaRNJZO+5xCSQ9l5yPN5BwIgYw0OqlZeUsuGHgezDipNZT1kYJDAWD+Eag8kqiKaXeU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":210856},"main":"./index.js","module":"./index.mjs","gitHead":"7edc5d58575a24fb9695bb3474d3e169f20eac58","typings":"./index.d.ts","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"_npmVersion":"11.6.2","description":"> The core apigen engine — TypeScript source → JSON Schema extraction, composition, the plugin contract, and the programmatic API for running live servers without code generation.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/apigen-core-client_0.3.0_1786144563769_0.4176752158673085","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"_id":"@adhd/apigen-core-client@0.3.1","bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"dist":{"shasum":"a0fa1bc41b66fdae8860c348885696d837847f2b","tarball":"https://registry.npmjs.org/@adhd/apigen-core-client/-/apigen-core-client-0.3.1.tgz","fileCount":29,"integrity":"sha512-P+6ROKNt4b4UFecxhf+Eo2vprwQoLY6tMYkId/q3Oh1zHJPtIAg7maZ5pymoz07M1W1sc9k+VKWTXM3T+uSy1g==","signatures":[{"sig":"MEUCIHCUK+lhpqezHpISWRQJntu/C6N0c/o+EERyHLbmN2SLAiEAptmnHRxxeV1mepSJDZkFgd5FgbyBWqIOCECX+LqLWj0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFCzDR6boQVUODQolMVuQXAfF+aMZvSlfbMPp3MNwJXuAiEAqsx1TXf1lbevB8+n8KeLZG+UVt3SIvo2ZRYnllWf8lY="}],"unpackedSize":221669},"main":"./index.js","name":"@adhd/apigen-core-client","module":"./index.mjs","license":"MIT","typings":"./index.d.ts","version":"0.3.1","_npmUser":{"name":"pseudosky","email":"skywinston.sk@gmail.com"},"homepage":"https://github.com/PseudoSky/adhd/tree/main/packages/apigen/apigen-core-client#readme","keywords":["openapi","typescript","codegen","json-schema","swagger","api","code-first","mcp","grpc","schema"],"repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git","directory":"packages/apigen/apigen-core-client"},"_npmVersion":"11.6.2","description":"Code-first API generation - derive JSON Schemas from TypeScript types and live-mount to HTTP, MCP, CLI, OpenAPI, Python, and Java with zero codegen","directories":{},"maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"_nodeVersion":"24.11.1","dependencies":{"pino":"10.3.1","ts-morph":"^23.0.0","typescript":"^6.0.3","ts-json-schema-generator":"^2.3.0","@adhd/apigen-base-logical":"^0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/apigen-core-client_0.3.1_1790266711074_0.8835522373427711"}}},"time":{"created":"2026-07-22T02:21:19.147Z","modified":"2026-09-24T16:18:31.375Z","0.1.0":"2026-07-22T02:21:19.458Z","0.1.1":"2026-07-23T02:31:38.936Z","0.1.2":"2026-07-23T18:25:15.437Z","0.1.3":"2026-07-24T23:12:32.409Z","0.1.4":"2026-07-24T23:53:55.232Z","0.1.5":"2026-07-25T19:47:53.153Z","0.2.0":"2026-07-27T07:14:59.897Z","0.2.1":"2026-07-28T02:15:20.283Z","0.2.2":"2026-07-30T17:39:09.461Z","0.3.0":"2026-08-07T23:16:03.922Z","0.3.1":"2026-09-24T16:18:31.173Z"},"description":"Code-first API generation - derive JSON Schemas from TypeScript types and live-mount to HTTP, MCP, CLI, OpenAPI, Python, and Java with zero codegen","maintainers":[{"name":"pseudosky","email":"skywinston.sk@gmail.com"}],"readme":"# @adhd/apigen-core-client\n\n> The core apigen engine — TypeScript source → JSON Schema extraction, composition, the plugin contract, and the programmatic API for running live servers without code generation.\n\n`@adhd/apigen-core-client` reads TypeScript source files, derives JSON Schemas for each exported function's parameters and return type, composes them with middleware-contributed envelope fields, and provides the `OutputPlugin` contract that every plugin implements. It's the library you import when you want to **use apigen programmatically** — start MCP servers, Fastify HTTP services, or CLI tools directly from your Node.js code, without the CLI.\n\nPart of [apigen](../README.md). See the [apigen spec](../../../docs/apigen/SPEC.md) for the full architecture.\n\n---\n\n## Two paths: CLI or library\n\napigen serves two audiences through the same engine. Which one are you?\n\n| You want to… | Use the CLI | Use this library |\n|---|---|---|\n| Start a server with one command, no code | `npx @adhd/apigen-cli run --source ./api.ts --type mcp --opt transport=sse` | — |\n| Generate a deployable project to disk | `npx @adhd/apigen-cli generate --source ./api.ts --type api-fastify --out-dir ./out` | — |\n| Embed a live server in your own Node.js process | — | `mcpPlugin.run({…})` from `@adhd/apigen-plugin-mcp` |\n| Build a custom deploy pipeline with lifecycles | — | `extract()` → `composeSchemas()` → `plugin.run({ signal })` |\n| Create a custom output plugin | Combined CLI + library | `OutputPlugin` / `Plugin` interface |\n| Serve a multi-language polyglot front | `npx @adhd/apigen-cli serve --source ./api.ts --source ./api.py --port 8080` | — (this is a CLI-only orchestration) |\n\n**The CLI is a thin wrapper** — every `apigen run --source ./api.ts --type mcp` call internally does exactly what you'd write in five lines of library code:\n\n| CLI command | Library equivalent |\n|---|---|\n| `apigen run --source ./api.ts --type mcp` | `mcpPlugin.run({ packages: [{ id, schemas, importPath: './api.ts', fns: mod }] })` |\n| `apigen run --source ./api.ts --type api-fastify --use health --use logger` | `apiFastifyPlugin.run({ packages: [...], options: { usePlugins: [healthPlugin, loggerPlugin] } })` |\n| `apigen run --source ./api.ts --type mcp --opt transport=sse --opt port=3100` | `mcpPlugin.run({ packages: [...], options: { transport: 'sse', port: 3100 } })` |\n| `apigen generate --source ./api.ts --type jsonschema --out-dir ./schema` | `jsonschemaPlugin.generate({ packages: [...], outputDir: './schema' })` |\n\n**The rest of this document focuses on the library path.** See the [CLI README](../../../entrypoint/apigen-cli/README.md) for CLI usage, or the [How-To: Running Servers](./docs/how-to/running-servers.md) for a step-by-step walkthrough.\n\n---\n\n## Install\n\n```bash\nnpm install @adhd/apigen-core-client\n# Plus the plugins you want to run:\nnpm install @adhd/apigen-plugin-mcp @adhd/apigen-plugin-api-fastify @adhd/apigen-plugin-openapi\n```\n\nAll packages are published to npm with `access: public`.\n\n## Quickstart\n\nExtract canonical operation descriptors from a TypeScript file, then compose them with middleware envelope fields:\n\n```ts\nimport { extract, composeSchemas, generateSchemas } from '@adhd/apigen-core-client';\n\n// v2 extraction — walk a source file and produce Operation[] descriptors\nconst ops = await extract({ sourceFile: './src/api.ts' });\n// ops[0].id === 'api/getUser'\n// ops[0].kind === 'action'\n// ops[0].input  === { type: 'object', properties: { id: { type: 'string' } }, required: ['id'] }\n\n// v1 schema extraction — JSON Schema per exported function\nconst gen = await generateSchemas({ sourceFile: './src/api.ts' });\n\n// Compose with middleware envelope fields\nconst composed = composeSchemas(gen, [\n  { id: 'auth', envelope: { session: { type: 'string' } } }\n]);\n// composed.getUser.input.properties.data.properties.id.type === 'string'\n// composed.getUser.input.properties.session.type === 'string'\n```\n\nReal output from `composeSchemas` with an auth middleware — the `data` wrapper is always present, even for zero-param functions:\n\n```ts\nimport { composeSchemas } from '@adhd/apigen-core-client';\n\nconst composed = composeSchemas(\n  {\n    metadata: { namespace: 'demo', phase: '' },\n    schemas: {\n      getUser: {\n        input: { type: 'object', properties: { id: { type: 'string' } }, required: ['id'] },\n        output: { type: 'object', properties: { name: { type: 'string' } } }\n      },\n      ping: {\n        input: { type: 'object', properties: {} },\n        output: { type: 'string' }\n      }\n    }\n  },\n  [{ id: 'auth', envelope: { session: { type: 'string' } } }]\n);\n```\n\n```\n// => composed.getUser.input.properties.data.properties.id.type === 'string'\n// => composed.getUser.input.properties.session.type === 'string'\n// => composed.ping.input.properties.data.properties is {}  (zero-param → empty data wrapper)\n// => composed.ping.input.required === ['session', 'data']   (data always required)\n```\n\nSource-language routing identifies file languages for polyglot pipelines:\n\n```ts\nimport { tokenize, languageOfSource, sourcesForPlugin } from '@adhd/apigen-core-client';\n\ntokenize('humanizeBytes');    // => ['humanize', 'bytes']\ntokenize('SOME_CONST');       // => ['some', 'const']\n\nlanguageOfSource('src/api.ts');   // => 'ts'\nlanguageOfSource('src/api.py');   // => 'py'\nlanguageOfSource('README.md');    // => undefined\n\nsourcesForPlugin({ language: 'ts' }, ['src/api.ts', 'src/api.py', 'README.md']);\n// => ['src/api.ts']\n```\n\n---\n\n## Run Servers Programmatically\n\nThe core use case for the library path: **extract operations from your TypeScript source, then start a live server — no code generation, no CLI.**\n\nEvery plugin with a `run()` method receives a `RunInput` with three things: the composed schemas (for routing and validation), the live function references (your actual module imports), and an `AbortSignal` for graceful shutdown. The `run()` starts the server and returns a `Promise<void>` that resolves when the signal fires.\n\n### Start an MCP server (SSE transport)\n\n```ts\nimport { extract, composeSchemas } from '@adhd/apigen-core-client';\nimport { mcpPlugin } from '@adhd/apigen-plugin-mcp';\n\n// A function — no framework imports, no decorators, no annotations\n// (this lives in, say, services/api.ts)\nexport async function greet(name: string): Promise<string> {\n  return `hello, ${name}!`;\n}\n```\n\n```ts\nimport { extract, composeSchemas } from '@adhd/apigen-core-client';\nimport { mcpPlugin } from '@adhd/apigen-plugin-mcp';\n\nasync function startMcp(sourceFile: string) {\n  // 1. Extract operations from your TypeScript source\n  const ops = await extract({ sourceFile, namespace: 'demo' });\n\n  // 2. Build generated schemas (one per exported function)\n  const generated = {\n    metadata: { namespace: 'demo', phase: '' },\n    schemas: Object.fromEntries(\n      ops.filter(o => o.kind === 'action').map(op => [\n        op.path[op.path.length - 1].raw,\n        { input: op.input, output: op.output, hasCtx: op.hasCtx, 'x-apigen-safe': op.safe },\n      ])\n    ),\n  };\n\n  // 3. Compose with middleware envelope (empty for this example)\n  const schemas = composeSchemas(generated, []);\n\n  // 4. Import the source to get live function references\n  const mod = await import(sourceFile);\n\n  // 5. Start the MCP server — no codegen, live dispatch\n  const abort = new AbortController();\n  process.on('SIGINT', () => abort.abort());\n\n  await mcpPlugin.run!({\n    packages: [{\n      id: 'demo',\n      schemas,\n      importPath: sourceFile,\n      fns: mod,           // your actual exported functions\n      createClient: async () => ({}),\n    }],\n    outputDir: '',\n    options: {\n      transport: 'sse',   // stdio | sse | streaming-http\n      port: 3100,\n      host: '0.0.0.0',\n      // Override tool descriptions per function (optional):\n      // toolDescriptions: { greet: 'Say hello to a user' },\n    },\n    signal: abort.signal,\n    operations: ops,      // needed for --use mount plugins\n  });\n}\n```\n\nThe MCP server is now live at `http://localhost:3100/sse` with `POST /messages?sessionId=...`. Every exported function in your source is an MCP tool — callable from Claude Desktop, Cursor, or any MCP host. **Equivalent CLI command:** `apigen run --source <file> --type mcp --opt transport=sse --opt port=3100`\n\n### Start a Fastify HTTP server (with OpenAPI docs)\n\nAdd the OpenAPI plugin as a `--use` mount plugin — it contributes a `GET /_meta/openapi` endpoint that serves a live OpenAPI 3.1 document derived from your operations at request time.\n\n```ts\nimport { extract, composeSchemas } from '@adhd/apigen-core-client';\nimport { apiFastifyPlugin } from '@adhd/apigen-plugin-api-fastify';\nimport { openapiPlugin } from '@adhd/apigen-plugin-openapi';\nimport { healthPlugin } from '@adhd/apigen-plugin-health';\nimport { loggerPlugin } from '@adhd/apigen-plugin-logger';\n\nasync function startFastify(sourceFile: string) {\n  const ops = await extract({ sourceFile, namespace: 'api' });\n  const generated = {\n    metadata: { namespace: 'api', phase: '' },\n    schemas: Object.fromEntries(\n      ops.filter(o => o.kind === 'action').map(op => [\n        op.path[op.path.length - 1].raw,\n        { input: op.input, output: op.output, hasCtx: op.hasCtx, 'x-apigen-safe': op.safe },\n      ])\n    ),\n  };\n  const schemas = composeSchemas(generated, []);\n  const mod = await import(sourceFile);\n\n  const abort = new AbortController();\n  process.on('SIGINT', () => abort.abort());\n\n  await apiFastifyPlugin.run!({\n    packages: [{\n      id: 'api',\n      schemas,\n      importPath: sourceFile,\n      fns: mod,\n      createClient: async () => ({}),\n    }],\n    outputDir: '',\n    options: {\n      port: 3200,\n      host: '0.0.0.0',\n      routePrefix: '',\n      // Mount plugins contributed as HTTP routes:\n      usePlugins: [openapiPlugin, healthPlugin, loggerPlugin],\n      // Per-plugin options:\n      // useOptions: { openapi: { title: 'My API', version: '1.0.0' } },\n    },\n    signal: abort.signal,\n    operations: ops,\n  });\n}\n```\n\nAfter startup:\n- `GET /api/greet?name=ada` — safe operations are GET (query params)\n- `POST /api/greet` — unsafe operations use `{\"data\":{…}}` body\n- `GET /_meta/health` — contributed by `healthPlugin`\n- `GET /_meta/openapi` — contributed by `openapiPlugin`, serves a live OpenAPI 3.1 spec\n\n**Equivalent CLI command:** `apigen run --source <file> --type api-fastify --opt port=3200 --use openapi --use health --use logger`\n\n### Run both servers side by side\n\n```ts\nasync function startAll(sourceFile: string) {\n  const ops = await extract({ sourceFile, namespace: 'svc' });\n  const generated = {\n    metadata: { namespace: 'svc', phase: '' },\n    schemas: Object.fromEntries(\n      ops.filter(o => o.kind === 'action').map(op => [\n        op.path[op.path.length - 1].raw,\n        { input: op.input, output: op.output, hasCtx: op.hasCtx, 'x-apigen-safe': op.safe },\n      ])\n    ),\n  };\n  const schemas = composeSchemas(generated, []);\n  const mod = await import(sourceFile);\n  const pkg = [{\n    id: 'svc',\n    schemas,\n    importPath: sourceFile,\n    fns: mod,\n    createClient: async () => ({}),\n  }];\n\n  const abort = new AbortController();\n  process.on('SIGINT', () => abort.abort());\n\n  await Promise.all([\n    mcpPlugin.run!({ packages: pkg, outputDir: '', options: { transport: 'sse', port: 3100 }, signal: abort.signal, operations: ops }),\n    apiFastifyPlugin.run!({ packages: pkg, outputDir: '', options: { port: 3200, usePlugins: [openapiPlugin, healthPlugin] }, signal: abort.signal, operations: ops }),\n  ]);\n}\n```\n\nOne source file, two servers, both live from the same import.\n\n### Integrate with your deploy system\n\nBecause `run()` returns a `Promise<void>` that resolves on `signal.abort`, you can wrap it in any lifecycle model — containers, process managers, custom mesh registrations.\n\n```ts\nexport async function deployService(config: {\n  source: string;\n  port: number;\n  type: 'mcp' | 'api-fastify';\n}) {\n  const ops = await extract({ sourceFile: config.source, namespace: 'deploy' });\n  /* build schemas, import module — same pattern as above */\n\n  const plugin = config.type === 'mcp' ? mcpPlugin : apiFastifyPlugin;\n  const opts = config.type === 'mcp'\n    ? { transport: 'sse', port: config.port }\n    : { port: config.port, usePlugins: [openapiPlugin, healthPlugin] };\n\n  const abort = new AbortController();\n  // Your deployer hook: register with service mesh, health probe, etc.\n  const server = plugin.run!({ packages, outputDir: '', options: opts, signal: abort.signal });\n  return { abort, running: server }; // call abort.abort() to stop gracefully\n}\n```\n\n### Options reference for `run()`\n\nThe `options` object in `RunInput` accepts plugin-specific keys. Here are the common ones:\n\n| Key | Plugin(s) | Type | Default | Description |\n|-----|-----------|------|---------|-------------|\n| `transport` | `mcp` | `'stdio' \\| 'sse' \\| 'streaming-http'` | `'stdio'` | MCP transport protocol |\n| `port` | `mcp` (HTTP), `api-fastify` | `number` | `3000` | Listen port |\n| `host` | All | `string` | `'127.0.0.1'` | Bind address |\n| `routePrefix` | `api-fastify` | `string` | `''` | Path prefix before `/<ns>/<fn>` |\n| `usePlugins` | All `run()` targets | `Plugin[]` | `[]` | Layer/mount/envelope plugins to compose |\n| `toolDescriptions` | `mcp` | `Record<string, string>` | `{}` | Per-tool description overrides |\n\n### Plugin cheat sheet\n\n| Plugin | Package | `run()` | `generate()` | What it builds |\n|--------|---------|---------|--------------|----------------|\n| `mcpPlugin` | `@adhd/apigen-plugin-mcp` | ✓ | ✓ | MCP server (stdio/SSE/streaming-http) |\n| `apiFastifyPlugin` | `@adhd/apigen-plugin-api-fastify` | ✓ | ✓ | Fastify HTTP server |\n| `apiExpressPlugin` | `@adhd/apigen-plugin-api-express` | ✓ | ✓ | Express HTTP server |\n| `cliPlugin` | `@adhd/apigen-plugin-cli-output` | ✓ | ✓ | Commander CLI tool |\n| `jsonschemaPlugin` | `@adhd/apigen-plugin-jsonschema` | — | ✓ | JSON Schema files |\n| `openapiPlugin` | `@adhd/apigen-plugin-openapi` | — | — | Mount: `GET /_meta/openapi` |\n| `healthPlugin` | `@adhd/apigen-plugin-health` | — | — | Mount: `GET /_meta/health` |\n| `loggerPlugin` | `@adhd/apigen-plugin-logger` | — | — | Layer: per-operation logging |\n\n> See the [How-To: Running Servers](./docs/how-to/running-servers.md) for a complete walkthrough with all three transports and deployment patterns.\n\n## Features\n\n### v2 Symbol-Based Extraction\n\n`extract()` walks a TypeScript source module and produces canonical `Operation[]` descriptors — one per exported function, const, or class member. Handles the full six-shape export matrix:\n\n- **Named function exports** — `export function foo(…)`\n- **Named const/arrow exports** — `export const foo = (…) => …`\n- **Named-object exports** — `export const api = { foo, bar }`\n- **Default-export named functions** — `export default function foo(…)`\n- **Anonymous default exports** — `export default () => …` (id synthesized from filename)\n- **CJS source** — `module.exports = { foo, bar }`\n\nEach operation carries an `id` derived deterministically from `namespace/path`, a `kind` (action / query / constructor / instance-method), JSON Schema 2020-12 `input` and `output`, and optional `typeText` for same-host sugar.\n\n```ts\nimport { extract } from '@adhd/apigen-core-client';\n\nconst ops = await extract({ sourceFile: './src/api.ts', namespace: 'myapi' });\nfor (const op of ops) {\n  console.log(`${op.id}  kind=${op.kind}  async=${op.async}  safe=${op.safe}`);\n}\n```\n\n### Two-Tier Extraction Caching\n\nBuilding a TypeScript program (parsing lib.d.ts + type-checking) is the dominant cost. Two cache layers eliminate redundant work:\n\n- **Per-run `ExtractionSession`** — pass one session to every `extract` / `generateSchemas` / `extractClasses` call and they share one ts-morph Project per tsconfig, one schema generator per file, and memoized `(file, typeText)` schemas. `dispose()` releases the run.\n\n- **Persistent process-lifetime tier** — Projects and generators are reused across sessions in the same process (watch/serve rebuilds, test loops), version-checked by mtime+size. The generator cache is LRU-capped (`APIGEN_PROGRAM_CACHE`, default 8 entries; each is a full TS program, ~100–200 MB). Set to `0` to disable persistence.\n\n```ts\nimport { createExtractionSession, extract, generateSchemas } from '@adhd/apigen-core-client';\n\nconst session = createExtractionSession();\n// => session.stats === { projectsBuilt: 0, generatorsBuilt: 0, schemaCacheHits: 0, schemaCacheMisses: 0 }\n\ntry {\n  const ops = await extract({ sourceFile: './src/api.ts', session });\n  // session.stats.projectsBuilt is now 1 (first Project construction)\n  const gen = await generateSchemas({ sourceFile: './src/api.ts', session });\n  // session.stats.generatorsBuilt === 1, schemaCacheHits > 0 — pure cache hits\n} finally {\n  session.dispose();\n}\n```\n\n**Important:** Do **not** parallelize `buildSchema` loops — the work is synchronous CPU under an async signature, and morph-walk mutates the shared SourceFile, so `Promise.all` gains nothing and can race.\n\n### Mount capability: Synthetic operations and batch fan-out\n\nMount plugins add synthetic operations to your server — both simple mounts like `GET /_meta/health` and complex features like batch bulk fan-out. The batch plugin demonstrates the pattern:\n\n```ts\nimport { buildBatchMountedOperations } from '@adhd/apigen-core-client';\n\n// Derive one _batch/<kind> mount per distinct operation kind\nconst batchMounts = buildBatchMountedOperations(descriptor, { exclude: ['catalog/delete'] });\n// => [\n//   { id: '_batch/query', kind: 'query', input: { oneOf: [...] }, output: { ... } },\n//   { id: '_batch/action', kind: 'action', input: { oneOf: [...] }, output: { ... } }\n// ]\n```\n\nThe batch feature provides:\n- `groupBatchableOperationsByKind()` — group operations by kind (query vs. action)\n- `buildBatchKindSchema()` — build discriminated-union input/output schemas for one kind\n- `buildBatchMountedOperations()` — emit one synthetic mount per distinct kind\n- `syntheticOp()` — shared helper to build synthetic operation shapes\n\nSee [apigen-plugin-batch](../../packages/apigen/apigen-plugin-batch) for the host-specific wiring.\n\n### v2 Plugin Capability Interface\n\nThe `Plugin` interface (SPEC §7.1) declares four orthogonal capabilities — a plugin implements only what it needs:\n\n| Capability | Purpose | Example |\n|-----------|---------|---------|\n| `target` | Project descriptor to transport/format (codegen) or host functions in-process (serve) | MCP server, Fastify HTTP server, proto client |\n| `layer` | Wrap all operations in the onion (middleware) | Logger, auth, rate-limiting |\n| `mount` | Add synthetic operations | `/meta/openapi`, `/meta/health`, batch fan-out |\n| `envelope` | Declare transport-agnostic side-channel fields (request/response headers, metadata) | Session tokens, request IDs |\n\nThe `MountCapability.operations()` method receives an optional `hostBridge` parameter carrying the actual invoker and option schemas — enabling mounts like batch to route directly to real operations without a separate dispatch layer.\n\n```ts\nimport type { Plugin } from '@adhd/apigen-core-client';\n\n// A minimal logger layer plugin\nexport default {\n  id: 'logger',\n  capabilities: {\n    layer: {\n      layer: async (call, next) => {\n        const t = Date.now();\n        console.error(`→ ${call.operation.id}`);\n        try {\n          const r = await next();\n          console.error(`← ${call.operation.id} ${Date.now() - t}ms`);\n          return r;\n        } catch (e) {\n          console.error(`✗ ${call.operation.id}`);\n          throw e;\n        }\n      },\n    },\n  },\n} satisfies Plugin;\n```\n\nAll transports (`http`, `grpc`, `mcp`, `cli`) share the same `Call` / `Next` / `Result` / `Chunk` contract. The v1 `OutputPlugin` interface coexists — migrate by wrapping `generate(PluginInput)` in a `TargetCapability.generate(Descriptor)`.\n\n### Schema Pipeline: generateSchemas + composeSchemas\n\n`generateSchemas` supports three mutually exclusive extraction modes:\n\n- **`named`** (default) — per-function schemas for all exported functions\n- **`default`** — treat the default export as the sole function\n- **`named-object`** — extract from `export const api = { … }` by object name\n\nThe first parameter named `ctx` is excluded from the schema by name-match only (`ctx-name-only` invariant) and recorded via `hasCtx` so dispatch can re-inject it.\n\n`composeSchemas` folds middleware envelope fields into the composed `input`, always wrapping domain params in a `data: {}` wrapper. Override a middleware per-function with `false` to suppress its contribution.\n\n### Polyglot Source-Language Routing\n\nWhen `apigen serve` watches a directory containing multiple host languages, the source-language helpers route each file to the correct plugin:\n\n```ts\nimport { languageOfSource, pluginConsumesSource, sourcesForPlugin } from '@adhd/apigen-core-client';\n\nlanguageOfSource('src/api.py');                          // => 'py'\npluginConsumesSource({ language: 'py' }, 'src/api.py');  // => true\npluginConsumesSource({ language: 'ts' }, 'src/api.py');  // => false\n\nsourcesForPlugin({ language: 'ts' }, ['src/api.ts', 'src/utils.mts', 'src/api.py']);\n// => ['src/api.ts', 'src/utils.mts']\n```\n\nRecognized extensions: `.ts/.tsx/.mts/.cts` → `ts`, `.py` → `py`, `.rs` → `rust`, `.go` → `go`, `.java` → `java`. Plugins without an explicit `language` default to `'ts'`.\n\n### Class Extraction\n\n`extractClasses()` extracts exported class members per SPEC §10:\n- **Static methods** — always extracted as `kind: 'action'`\n- **Constructor** — opt-in via `includeInstances: true`, emits `kind: 'constructor'` with `instanceId` output\n- **Instance methods** — opt-in, emit `kind: 'instance-method'` with `instanceId` envelope\n- Private/protected members are skipped; `_`-prefixed methods are skipped (SPEC §3 opt-out ladder)\n\n## Module Map\n\n| Module | Purpose | Key Exports |\n|--------|---------|-------------|\n| [Extract](./docs/reference/extract.md) | v2 symbol-based extraction | `extract()`, `tokenize()`, `ExtractOptions` |\n| [Schemas](./docs/reference/schemas.md) | Schema generation & composition | `generateSchemas()`, `composeSchemas()`, `GenerateSchemasOptions`, `ComposedSchemas` |\n| [Plugin](./docs/reference/plugin.md) | v1 & v2 Plugin contracts | `Plugin`, `OutputPlugin`, `TargetCapability`, `LayerCapability`, `MountCapability`, `EnvelopeCapability`, `syntheticOp()` |\n| [Extraction Session](./docs/reference/session.md) | Per-run caching | `createExtractionSession()`, `clearPersistentProjectCache()`, `ExtractionSession` |\n| [Extract Classes](./docs/reference/extract-classes.md) | Class export extraction | `extractClasses()`, `ExtractClassesOptions` |\n| [Source Language](./docs/reference/source-language.md) | Polyglot file routing | `languageOfSource()`, `sourcesForPlugin()`, `pluginConsumesSource()` |\n| [Batch Fan-Out](./docs/reference/batch.md) | Bulk operation dispatch schemas | `groupBatchableOperationsByKind()`, `buildBatchKindSchema()`, `buildBatchMountedOperations()`, `BatchMountOptions`, `BatchKindSchema`, `BatchKindOperation` |\n| [Descriptor](./docs/reference/descriptor.md) | Canonical types | `Operation`, `Segment`, `JSONSchema`, `TypeText`, `OperationKind` |\n\n## How-To Guides\n\n- [Writing Source Files for apigen](./docs/how-to/writing-source-files.md) — How to structure your TypeScript source: naming, exports, types, and what makes a good API surface\n- [Running Servers Programmatically](./docs/how-to/running-servers.md) — Start MCP, Fastify, or Express servers from your own Node.js process\n- [End-to-End Extraction Pipeline](./docs/how-to/extraction-pipeline.md) — From source file to composed schemas\n- [Building apigen Plugins](./docs/how-to/building-plugins.md) — v1 OutputPlugin and v2 Plugin development\n\n## Develop\n\n```bash\nnpx nx build apigen-core-client\nnpx nx test  apigen-core-client\n```\n\n## License\n\nMIT — see [LICENSE](./LICENSE).\n","readmeFilename":"README.md","homepage":"https://github.com/PseudoSky/adhd/tree/main/packages/apigen/apigen-core-client#readme","keywords":["openapi","typescript","codegen","json-schema","swagger","api","code-first","mcp","grpc","schema"],"repository":{"url":"git+https://github.com/PseudoSky/adhd.git","type":"git","directory":"packages/apigen/apigen-core-client"},"bugs":{"url":"https://github.com/PseudoSky/adhd/issues"},"license":"MIT"}