{"_id":"@charlie-labs/oclif-plugin-helpers","_rev":"18-42cb198035f069bf30842fea950a66c9","name":"@charlie-labs/oclif-plugin-helpers","dist-tags":{"latest":"0.4.0"},"versions":{"0.0.3":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.0.3","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.0.3","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"cf2172f628be611698014700aa24de618d81ec9d","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.0.3.tgz","fileCount":5,"integrity":"sha512-fcbDlHHD0hYhmxXKBhjf+9fYLLpQDHRWbZIhLWMFK1sMZqYte+gfIyhPwqSNxs/stt0LbqSC/vldkNvtXHrYiA==","signatures":[{"sig":"MEYCIQCP/yvmOdqA71csvCwioAhnDCP6yIBOo1/+hG3RgkALjAIhAMqJfJJTyEP8Gpqkl90HPzxh3lwfiXm0lzZr5dxbvlfu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1662},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"27a7e9a1844d5642f037ec2e7f587c2316beae03","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"10.8.2","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","dependencies":{},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@dexaai/config":"latest"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.0.3_1755974264135_0.1616856035673615","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.1.0","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.1.0","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"123fb15e6ea2baa5142318f2f191dc8bdb756bd6","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.1.0.tgz","fileCount":18,"integrity":"sha512-0qyek3+88biGyd3fJm4Xy+Su9CFV6NRbbULaoFML3sdh0FMdWq4O84mql/DEotpaXRbQaTn233lE0civoyVOyA==","signatures":[{"sig":"MEUCIH1ksF7pRHV77RI0GbgeKjDQI2v20jLCOSoC9kJBWl8TAiEAnVqqnaSpdKNF34Od2O/Eg+q48cMdzpFROwCQJE39I1A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35115},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"e21da070d36c7e4ffa89fe1985deea7cad129a5a","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"10.8.2","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@oclif/core":"^4.5.2","@dexaai/config":"latest"},"peerDependencies":{"@oclif/core":"^4.5.2"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.1.0_1756049244043_0.4115422334216179","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.1.2","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.1.2","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"4f3ee04f0745e41c93000fc0376fecae9f05fe3e","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.1.2.tgz","fileCount":18,"integrity":"sha512-fBD3+KIpx0VLfep5QOQi1SnYFdPQEWZ6zN9+/cqwu1dC8utCp6zYG5bmwPau0QHbL4rP+iDcpmuxYuYRaa5q0w==","signatures":[{"sig":"MEUCIHfwavnxlUIUJOFzEnPIEg9dkzB+foQXjW2pL+heCZZLAiEA3hX4et6J1/it1HBeg+f+X16nqCtILRJ1ifGm4yIV4gY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35573},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"9052594616e878d121e52d32f9ec0b77df9b6054","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"10.8.2","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@oclif/core":"^4.5.2","@dexaai/config":"latest"},"peerDependencies":{"@oclif/core":"^4.5.2"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.1.2_1756053275204_0.9952664067950809","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.2.0","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.2.0","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"a0af898ce626e265176ceb6f39f7061546b8163a","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.2.0.tgz","fileCount":34,"integrity":"sha512-RZiO8jDbD88k8DxQ6BkTKegdGribrfCdPTcm3A52C4c6IkNALOEDFrVZwlMMTJKuxUvP1MUuFEDbX90NjSOCqA==","signatures":[{"sig":"MEUCIQCkiS5CSqwqFrkwYvUT15sTFfvj/gpXdTAfFvIAHrwpFAIgVf1bGnKSXUcN05D3lvUUg6AK0bkM1rqp6MWIiPhaXEQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74990},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"c3463b00e95e5885608560ef09374a2aa64c7335","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"10.9.2","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zod":"^3.25.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@oclif/core":"^4.5.2","@dexaai/config":"latest"},"peerDependencies":{"zod":">=3 <4","@oclif/core":"^4.5.2"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.2.0_1757029662886_0.7754421202687785","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.2.1","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.2.1","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"b1f189ad5a39b6ced54fa0225db6ad981d3315ef","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.2.1.tgz","fileCount":34,"integrity":"sha512-HDxPitRb4N+7Dj10CbT82bAEwu6OsvGWhLfXm0xy2JwIzJ6DkpXIunj4aLD+fFeXD0v8Ju+Z/Hn1xe++Gwx7qQ==","signatures":[{"sig":"MEQCIG7KYxHQUbfOfIi39eKXwiYMkQMDbQsD0vXPRUG52y3gAiArNdeq+DhW/uSLrgdtdWUeNxpBEEjKGrR6a5oBzxgv+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88634},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"bb11f91e6f8cdbdf8c950b8dc0ab8bc2d0b05952","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"10.9.2","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zod":"^3.25.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@oclif/core":"^4.5.2","@dexaai/config":"latest"},"peerDependencies":{"zod":">=3 <4","@oclif/core":"^4.5.2"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.2.1_1757118312998_0.2270486873369506","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.2.2","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.2.2","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"9ce47bcd5d24931c571f7a134216756d4a1eb9d5","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.2.2.tgz","fileCount":34,"integrity":"sha512-TkocOf1JSJ6Fj9PrvxV5d+29S5I4d6qbAyoVR4R8m8EnGNIoror6Hl2zB8Fq/kFJp33rYlNtCO5EHQfG543O+A==","signatures":[{"sig":"MEUCIQDyzVe8RNVRBd1oD/C1nmvhZ9TxpWVjeYWm0XIpqJId9QIgCDxP5pT+xmb7b5t412I7WDqqn6CCqm/QBeIIH+RFams=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":95464},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"48c19d15dc6b8b051df34dafd0f95cd6fbbb00db","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"10.9.2","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zod":"^3.25.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@oclif/core":"^4.5.2","@dexaai/config":"latest"},"peerDependencies":{"zod":">=3 <4","@oclif/core":"^4.5.2"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.2.2_1757534706417_0.03474967951542918","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.2.3","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.2.3","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"987f131a011bf806530b736b2c89d1b43c938f7b","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.2.3.tgz","fileCount":34,"integrity":"sha512-LkzGjheIaLn4C4As+J1Jak6UY2OTOaomBP7ByuuvpClt1STRG1Alt8+uSuHe8JKBqRKsdhQpbywcsAWWIhHIjg==","signatures":[{"sig":"MEUCIEG6YLLi/7157vIvs5/9UpUe5gfOHrt+RChFvLhhSlqbAiEAybg9ENewAXUrUFrz1VC4DppHDsT1q/zMiFhSQeFukOU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109586},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"971f76b4766fb68b61b8474b83ed4b46f8cf5f73","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"10.9.2","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zod":"^3.25.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@oclif/core":"^4.5.2","@dexaai/config":"latest"},"peerDependencies":{"zod":">=3 <4","@oclif/core":"^4.5.2"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.2.3_1757704580867_0.49269826107261183","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.2.4","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.2.4","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"e16044e2909a8ebc3b3044e9a688b2143645e9f3","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.2.4.tgz","fileCount":34,"integrity":"sha512-mOSSbs+BItjeonafBdbzf61VsmoOmdXHst41DCMviQZCRCpHkWhskYxKahFFI+knBM5rBQwZKrRLb+/A3Tdx0g==","signatures":[{"sig":"MEYCIQDFIN050tNhstj+ri3+AiaUB+hKWVzOezjK+MKmU3tDOAIhANycgeIIVFiWFnNtRXtLsPFGqwPmjtpeg8omyjvzk8LN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":110744},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"e999294cd763fa4dd613a4f166add6bf8d619fe6","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"10.9.2","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zod":"^3.25.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@oclif/core":"^4.5.2","@dexaai/config":"latest"},"peerDependencies":{"zod":">=3 <4","@oclif/core":"^4.5.2"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.2.4_1757730927528_0.3879276704731156","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.2.5","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.2.5","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"2f784f2d6ea2ae75e9564c1ec26a2130089ed2e1","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.2.5.tgz","fileCount":34,"integrity":"sha512-r2xmSMt6+OXBab+eWnfU/+kEkG+mvBOiXgmOMSQLkZZmr6TJXzccmpSM+pSJPGtehKd39K8rMIaAAS/YwV4fwg==","signatures":[{"sig":"MEUCIQDG35OEWAQ0r6MpLXpAUijtN7o6tnRFFaskUYRvu+Ah6wIgBkco+4lNKiAU4+Wdg9z7xSOdhj33ZDNh0TSAKF61Me0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":111720},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2789630dea3da8798cac6117dfda49a9d4b99dd6","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"10.9.2","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zod":"^3.25.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@oclif/core":"^4.5.2","@dexaai/config":"latest"},"peerDependencies":{"zod":">=3 <4","@oclif/core":"^4.5.2"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.2.5_1757961314653_0.6999699629336891","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.3.0","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.3.0","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"b7c1c0adf829b67e5b27c69b037335780c546769","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.3.0.tgz","fileCount":34,"integrity":"sha512-mBtsYnIdvAqIO2UO8iAPVzRBG8jhmA3MMuxLYgi/f7cwQBKUwDKG8AK8Co0p68/mDZuoW9ouq2zM0jq6L4odUw==","signatures":[{"sig":"MEYCIQDVcB+ohstuOvIsZcojt1h3DU1IsevAtB070qsW4arAKwIhAMtiPxdb0jk6T+TgQBFf5ZEIFiYNpqiNsbICuz6nb5DD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115634},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"0444ede454c16ea96034339a323fc4961baf2d7b","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"10.9.2","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zod":"^3.25.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@oclif/core":"^4.5.2","@dexaai/config":"latest"},"peerDependencies":{"zod":">=3 <4","@oclif/core":"^4.5.2"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.3.0_1758066204087_0.9666829682848335","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@charlie-labs/oclif-plugin-helpers","version":"0.3.1","license":"UNLICENSED","_id":"@charlie-labs/oclif-plugin-helpers@0.3.1","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"}],"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"np":{"testScript":"ci"},"dist":{"shasum":"b5beea141ff75a3a00a16003d24e25e3d487fa84","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.3.1.tgz","fileCount":34,"integrity":"sha512-zNe0UkDLUuRTM5MDxoN/zTBfp8540Ob3/f8RQ0CIjTIIozYUxs9aL+MM27aHws1Xx9Ma2DGlh9mAoQdO107BJw==","signatures":[{"sig":"MEUCIQC84ef7C+yu3gqOOte89AuJhpk5GyP1ZGPKSI4fmV9ouwIgCmCUWyPePnyMBUF6IqgVlASbHTa3Yh6MnCLjFS0tiWY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116492},"main":"./dist/index.cjs","type":"module","zshy":"./src/index.ts","types":"./dist/index.d.cts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"08af637afd55764a262439847acbec84509fffc9","scripts":{"ci":"bun run typecheck && bun run lint && bun run test","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","test":"bun test","build":"bun run --bun zshy","clean":"rm -rf node_modules","release":"np","typecheck":"tsc --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},"prettier":"@dexaai/config/prettier","repository":{"url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git","type":"git"},"_npmVersion":"11.12.1","description":"Shared oclif helpers for errors, logging, JSON support, etc.","directories":{},"sideEffects":false,"_nodeVersion":"24.15.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.2.20","devDependencies":{"np":"^10.2.0","zod":"^3.25.0","zshy":"^0.3.5","eslint":"^9","prettier":"^3","@types/bun":"^1","typescript":"^5","@oclif/core":"4.10.6","@dexaai/config":"latest"},"peerDependencies":{"zod":">=3 <4","@oclif/core":"^4.5.2"},"_npmOperationalInternal":{"tmp":"tmp/oclif-plugin-helpers_0.3.1_1780766706976_0.6384480419528522","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@charlie-labs/oclif-plugin-helpers","description":"Shared oclif helpers for errors, logging, JSON support, etc.","version":"0.4.0","type":"module","license":"UNLICENSED","repository":{"type":"git","url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git"},"sideEffects":false,"zshy":"./src/index.ts","scripts":{"build":"bun run --bun zshy","ci":"bun run typecheck && bun run lint && bun run test && bun run build && bun run check:package-types","clean":"rm -rf node_modules","fix":"eslint --fix --quiet . ; prettier --write --log-level=silent .","lint":"eslint . && prettier --check .","prepublishOnly":"bun run build","release":"np","test":"bun test","typecheck":"tsc --noEmit","check:package-types":"tsc --project type-tests/package-consumer/tsconfig.json"},"prettier":"@dexaai/config/prettier","np":{"testScript":"ci"},"publishConfig":{"access":"public"},"engines":{"node":">=18"},"peerDependencies":{"@oclif/core":"^4.5.2","zod":"^4.4.3"},"devDependencies":{"@dexaai/config":"latest","@oclif/core":"4.10.6","@types/bun":"^1","eslint":"^9","np":"^10.2.0","prettier":"^3","typescript":"^5","zod":"4.4.3","zshy":"^0.3.5"},"packageManager":"bun@1.2.20","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.cts","exports":{".":{"types":"./dist/index.d.cts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"4035eb8b6212c13082faf48e9034da40e221ab12","_id":"@charlie-labs/oclif-plugin-helpers@0.4.0","bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-XwMTTgRUDPJ+O911q8nQN1ddOIbaId2O1BwbOtwINLFk60pkxwiorryORHVpQLJPjXvPgKOpKmVIrRB9hyO96g==","shasum":"5bddbbfe5a26d81435b782047ceccca8c257da30","tarball":"https://registry.npmjs.org/@charlie-labs/oclif-plugin-helpers/-/oclif-plugin-helpers-0.4.0.tgz","fileCount":34,"unpackedSize":119174,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHV5/ixeAYUhyxtTU2zybrFgT50eJCWnlhJHgHMVUR8jAiB9gOJJByk/t6/R4/37nvK5Nfk8+/JLhkSjyE6M4U17Lg=="}]},"_npmUser":{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},"directories":{},"maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/oclif-plugin-helpers_0.4.0_1783271871925_0.15652688089572053"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-23T18:37:44.054Z","modified":"2026-07-05T17:17:52.187Z","0.0.3":"2025-08-23T18:37:44.337Z","0.1.0":"2025-08-24T15:27:24.235Z","0.1.2":"2025-08-24T16:34:35.414Z","0.2.0":"2025-09-04T23:47:43.081Z","0.2.1":"2025-09-06T00:25:13.175Z","0.2.2":"2025-09-10T20:05:06.634Z","0.2.3":"2025-09-12T19:16:21.059Z","0.2.4":"2025-09-13T02:35:27.732Z","0.2.5":"2025-09-15T18:35:14.825Z","0.3.0":"2025-09-16T23:43:24.305Z","0.3.1":"2026-06-06T17:25:07.118Z","0.4.0":"2026-07-05T17:17:52.062Z"},"bugs":{"url":"https://github.com/charlie-labs/oclif-plugin-helpers/issues"},"license":"UNLICENSED","homepage":"https://github.com/charlie-labs/oclif-plugin-helpers#readme","repository":{"type":"git","url":"git+https://github.com/charlie-labs/oclif-plugin-helpers.git"},"description":"Shared oclif helpers for errors, logging, JSON support, etc.","maintainers":[{"name":"rileytomasek","email":"riley.tomasek@gmail.com"},{"name":"ryan-charlielabs","email":"ryan@charlielabs.ai"}],"readme":"# @charlie-labs/oclif-plugin-helpers\n\n[![npm version](https://img.shields.io/npm/v/%40charlie-labs%2Foclif-plugin-helpers?logo=npm&label=npm)](https://www.npmjs.com/package/@charlie-labs/oclif-plugin-helpers)\n\nShared helpers to standardize error handling and output behavior across multiple oclif CLIs.\n\n- Shared error classes with stable static exit codes and string codes\n- Robust unknown → exit-code mapper (`errorToExitCode`)\n- A `BaseCommand` that centralizes `--json` gating, minimal error JSON shaping, stderr-only logging helpers, and a TSV printer\n- Optional `handle()` for `bin/run` catch chains to conform exit codes\n- Optional `finally` hook that conservatively sets `process.exitCode` when an error occurred\n\n## Installation\n\nThis package is publicly published on the npm registry as `@charlie-labs/oclif-plugin-helpers` and expects oclif v4.\n\n- Public npm: [npmjs.com/package/@charlie-labs/oclif-plugin-helpers](https://www.npmjs.com/package/@charlie-labs/oclif-plugin-helpers)\n\n- Peer dependency: `@oclif/core@^4.5.2`\n- Node: `>=18` (per this package’s `engines` field)\n\n```bash\n# npm\nnpm install @charlie-labs/oclif-plugin-helpers @oclif/core@^4.5.2\n\n# bun\nbun add @charlie-labs/oclif-plugin-helpers @oclif/core@^4.5.2\n```\n\n## Overview / Mission\n\nA reusable place to make multiple CLIs behave the same way when errors happen and when users request JSON:\n\n- Error classes include a static `exitCode` and a string `code` for stability across boundaries.\n- `errorToExitCode(err)` maps any thrown value to a stable exit code using a resilient precedence order.\n- `BaseCommand` is the primary integration point: it enables `--json` for all commands, shapes error JSON, suppresses logs under `--json`, and provides stderr-only logging helpers plus a TSV printer.\n- `handle()` can be used in `bin/run` to conform exit codes for errors that bypass `Command.catch()`.\n- An optional `finally` hook exists to set `process.exitCode` only when no other layer has set it.\n\n## Quick Start\n\nExtend `BaseCommand` and implement `execute(ctx)` (do not override `run()`). Destructure only what you need from `ctx` — `{ parsed }`, `{ deps }`, or `{ parsed, deps }`. If you don’t need the context at all, accept it as an unused parameter: `execute(_ctx)`. When your command defines flags, build a manifest with `defineFlags(...)` and install it via `static override flags = super.registerManifest(manifest);`. Commands without flags can skip that line entirely; they fall back to an empty manifest. Use `logInfo`/`logWarn` for stderr-only logs and `printRows` for TSV content. Under `--json`, logs are suppressed and `printRows` is a no-op. The `BaseCommand` generic is kwargs‑style and order‑free: supply a union of tags — `CfgFlags<typeof manifest> | Result<T> | Deps<D>` — and specify only what you need.\n\n```ts\nimport { BaseCommand } from '@charlie-labs/oclif-plugin-helpers';\nimport type { Result } from '@charlie-labs/oclif-plugin-helpers';\n\nexport default class Demo extends BaseCommand<Result<{ id: string }>> {\n  // `--json` is enabled for all subclasses via BaseCommand\n  protected async execute(_ctx) {\n    this.logInfo('Fetching record…'); // stderr-only; suppressed under --json\n\n    // pretend we looked something up\n    const record = { id: 'rec_123' } as const;\n\n    // TSV output (stdout). No-op under --json\n    this.printRows([\n      ['id', 'name'],\n      ['123', 'example'],\n    ]);\n\n    return record;\n  }\n}\n```\n\n## JSON mode and error JSON shape\n\nAll subclasses of `BaseCommand` automatically support oclif’s built-in `--json` flag. When `--json` is set:\n\n- Non-content logs are suppressed (`logInfo`/`logWarn` don’t write)\n- `printRows()` is a no-op\n- Errors are rendered as minimal, stable JSON using `toErrorJson(err)`\n\nExact error JSON shape:\n\n```ts\n{\n  error: {\n    type: string;\n    message: string;\n    exitCode: number;\n    meta?: {\n      code?: string;\n      status?: number;\n      retryable?: boolean;\n    };\n  };\n}\n```\n\n- `type` is derived from `err.name` (or constructor name)\n- `message` is concise and always present\n- `exitCode` is computed by `errorToExitCode`\n- `meta` includes optional hints when available: string error `code`, HTTP `status`, and `retryable` (based on common transport failures via `isRetryableNetworkError`)\n\n## Exit code mapping\n\n`errorToExitCode(err)` resolves a stable process exit code using this order:\n\n1. `err.exitCode` (instance)\n2. `err.constructor.exitCode` (static)\n3. `err.code` (string)\n4. `err.name`\n5. `instanceof` checks\n6. default `1`\n\nProvided error classes and their static exit codes:\n\n- `ValidationError` → 2 (code: `EVALIDATION`)\n- `NotFoundError` → 3 (code: `ERESOURCE_NOT_FOUND`)\n- `ConflictError` → 4 (code: `ECONFLICT`)\n- `UnauthorizedError` → 5 (code: `EUNAUTHORIZED`)\n- `RateLimitedError` → 6 (code: `ERATELIMIT`)\n- `ServiceUnavailableError` → 7 (code: `ESVCUNAVAILABLE`)\n- `CanceledError` → 8 (code: `ECANCELED`)\n- `ApiRequestError` → 1 (code: `EAPI`)\n\n## Public API reference\n\nAll symbols below are exported from `@charlie-labs/oclif-plugin-helpers` (via `src/index.ts`).\n\n### Classes (errors)\n\n- `ValidationError`\n- `NotFoundError`\n- `ConflictError`\n- `UnauthorizedError`\n- `RateLimitedError`\n- `ServiceUnavailableError`\n- `CanceledError`\n- `ApiRequestError`\n\n### Functions\n\n- `errorToExitCode(err: unknown): number`\n- `isRetryableNetworkError(err: unknown): boolean`\n\n### FlagManifest (v1)\n\nA tiny framework to define oclif flags alongside Zod 4 schemas, compose them into a manifest, and parse the oclif flag bag into fully typed domain values with optional cross-flag validation. This package requires Zod `^4.4.3`.\n\nPublic surface (concise):\n\n```ts\nimport { Flags, type Command } from '@oclif/core';\nimport { z } from 'zod';\nimport {\n  defineFlags,\n  type FlagSchema,\n  type FlagManifest,\n  zDateYYYYMMDD,\n  zStringList,\n  zPositiveInt,\n  zOrderDir,\n  zMultiEnum,\n  CommonFlags,\n} from '@charlie-labs/oclif-plugin-helpers';\n\n// Build a manifest from inline flag schemas (preferred pattern)\nconst statusValues = ['started', 'completed', 'error'] as const;\nexport const manifest = defineFlags({\n  status: {\n    oclif: Flags.option({\n      options: statusValues,\n      multiple: true,\n      delimiter: ',',\n      description: 'Multi-select; repeats and/or comma-separated',\n    })(),\n    schema: zMultiEnum(statusValues),\n  },\n  start: {\n    oclif: Flags.string({ description: 'Inclusive (YYYY-MM-DD, UTC)' }),\n    schema: zDateYYYYMMDD.optional(),\n  },\n  end: {\n    oclif: Flags.string({ description: 'Exclusive (YYYY-MM-DD, UTC)' }),\n    schema: zDateYYYYMMDD.optional(),\n  },\n  limit: {\n    oclif: Flags.integer({\n      description: 'Positive integer (10000 max)',\n      default: 100,\n    }),\n    schema: zPositiveInt({ default: 100, max: 10_000 }),\n  },\n})\n  .withValidation((schema) =>\n    schema.superRefine(({ start, end }, ctx) => {\n      if (start && end && !(start < end))\n        ctx.addIssue({\n          code: z.ZodIssueCode.custom,\n          message: 'end must be after start',\n          path: ['end'],\n        });\n    })\n  )\n  .withPredicate(\n    'start < end',\n    ({ start, end }) => !start || !end || start < end,\n    {\n      path: ['end'],\n      message: 'end must be after start',\n    }\n  );\n\n// oclif command usage (preferred)\nimport { BaseCommand } from '@charlie-labs/oclif-plugin-helpers';\nimport type { CfgFlags, ExecCtxOf } from '@charlie-labs/oclif-plugin-helpers';\n\nexport class MyCmd extends BaseCommand<CfgFlags<typeof manifest>> {\n  static override flags = super.registerManifest(manifest);\n\n  protected override async execute({ parsed }: ExecCtxOf<this>) {\n    // use typed flags\n  }\n}\n```\n\nIncluded atoms:\n\n- `zDateYYYYMMDD`: parse `YYYY-MM-DD` into `Date` at UTC midnight\n- `zStringList`: parse `string | number | (string|number)[] | undefined` (repeat/comma) → de-duplicated `string[]` (undefined normalizes to `[]`)\n- `zMultiEnum(values)`: normalize repeat/comma inputs and validate against provided enum values\n- `zPositiveInt({ max?, default? })`\n- `zOrderDir` (`'asc'|'desc'`)\n- `zDateComparator`: parse a single comparator string like \">=2025-01-01\" or \"> 2025-01-01\" to `{ op: 'gte'|'gt'|'lte'|'lt'|'eq', date: Date }` (UTC midnight)\n- `zDateComparatorList`: alias for `zStringList.pipe(z.array(zDateComparator))` — accepts repeat/comma inputs, returns `DateComparator[]`, and normalizes `undefined` to `[]`\n\nNotes\n\n- Inline schemas are the primary path. For optional dates, use `zDateYYYYMMDD.optional()`.\n- When using a default with `zPositiveInt({ default: N, ... })`, define the same default on the oclif flag to keep behavior consistent between oclif and Zod parsing.\n\nConvenience: `CommonFlags` exports ready-made `start`, `end`, `limit`, `order`, and a sample `status` multi-enum.\n\n### Date comparator examples\n\n```ts\nimport { Flags } from '@oclif/core';\nimport {\n  defineFlags,\n  zDateComparator,\n  zDateComparatorList,\n} from '@charlie-labs/oclif-plugin-helpers';\n\nexport const manifest = defineFlags({\n  created: {\n    oclif: Flags.string({\n      description: '>, >=, <, <=, = followed by YYYY-MM-DD (UTC)',\n    }),\n    schema: zDateComparator.optional(),\n  },\n  updated: {\n    oclif: Flags.string({\n      multiple: true,\n      delimiter: ',',\n      description:\n        '>, >=, <, <=, = followed by YYYY-MM-DD (UTC). Repeat or comma-separate',\n    }),\n    schema: zDateComparatorList,\n  },\n});\n```\n\n### BaseCommand\n\n- `class BaseCommand<Cfg>` where `Cfg` is a union of order‑free tags you pick from:\n  - `CfgFlags<typeof manifest>` — enables typed `parsed` flags in `execute(...)`\n  - `Result<T>` — declares the return type of `run()/execute()` (defaults to `unknown`)\n  - `Deps<D>` — declares the dependency object type used by DI helpers\n- `static enableJsonFlag = true`\n- `static get manifest(): FlagManifest<Defs, AnyZodType>` — returns the manifest registered on the concrete subclass (defaults to an empty manifest). Call `static override flags = super.registerManifest(manifest);` to install your manifest and expose its oclif flags to help output and parsing.\n- `protected execute(ctx)` — pick only what you need by destructuring:\n  - `execute({ parsed })`\n  - `execute({ deps })`\n  - `execute({ parsed, deps })`\n    If you don’t need the context, accept it as `execute(_ctx)`.\n    When no `CfgFlags<>` tag is present, `ctx.parsed` is typed as `Record<string, never>`. When a `Deps<>` tag is present, `ctx.deps` is typed as `D | undefined`; without a `Deps<>` tag, `ctx.deps` is `undefined`.\n- Dependency injection (resolution order in `run()`): test override → `static buildDeps(parsed)` → `protected get deps()`\n  - `static buildDeps(parsed): D | Promise<D | undefined> | undefined` — override on your subclass to construct deps from flags. The override is fully typed to your `Cfg` via a polymorphic `this` parameter, so `parsed` is `ParsedOf<typeof manifest>` and the return type is your `D`. If you mark it `async`, the return type becomes `Promise<D | undefined>`.\n  - `protected get deps(): D | undefined` — instance fallback when `buildDeps` isn’t used\n    - Note: this getter is typed to your `Deps<D>` tag. If you previously returned a broader type, narrow it to `D`.\n  - `static setTestDeps(deps: D)` — test-only override used first when present (one‑shot; cleared after use)\n  - `static clearTestDeps()` — clears any previously set test override (useful in custom harnesses)\n- `async run(): Promise<T>` — provided by `BaseCommand` and final in practice (where `T` is the type you supplied via `Result<T>` in `Cfg`)\n- Helpers (no-op under `--json`):\n  - `protected logInfo(msg: string): void` — stderr-only\n  - `protected logWarn(msg: string): void` — stderr-only\n  - `protected printRows(rows: (string | string[])[], options?: { header?: string[] }): void` — stdout TSV\n- Error shaping:\n  - `protected toErrorJson(err: unknown)` — returns the JSON shape shown above (used automatically by oclif in JSON mode)\n\n#### `Cfg` combinations (type-only examples)\n\nBelow are short, type-only class declarations that show common ways to configure `BaseCommand<Cfg>` using the `CfgFlags<>`, `Result<>`, and `Deps<>` tags. These intentionally omit method bodies and focus on the type surface.\n\n```ts\nimport { BaseCommand } from '@charlie-labs/oclif-plugin-helpers';\nimport type {\n  CfgFlags,\n  Result,\n  Deps,\n  AnyZodType,\n  FlagManifest,\n  Defs,\n} from '@charlie-labs/oclif-plugin-helpers';\n\n// For these standalone examples, use a type-only stub for `manifest` with the correct generic shape.\ndeclare const manifest: FlagManifest<Defs, AnyZodType>;\n\n// 1) Deps-only (no flags; implicit output type = unknown)\nexport class DepsOnly extends BaseCommand<Deps<{ source: string }>> {}\n\n// 2) Result + Deps (no flags)\nexport class ResultAndDeps extends BaseCommand<\n  | Deps<{ client: { request: (s: string) => Promise<unknown> } }>\n  | Result<number>\n> {}\n\n// 3) Flags + Result (no deps)\nexport class FlagsAndResult extends BaseCommand<\n  CfgFlags<typeof manifest> | Result<string>\n> {\n  static override flags = super.registerManifest(manifest);\n}\n\n// 3a) Flags-only (no deps; implicit output type = unknown)\nexport class FlagsOnly extends BaseCommand<CfgFlags<typeof manifest>> {\n  static override flags = super.registerManifest(manifest);\n}\n\n// 4) Flags + Deps + Result (all three)\nexport class FlagsDepsResult extends BaseCommand<\n  CfgFlags<typeof manifest> | Deps<{ db: unknown }> | Result<void>\n> {\n  static override flags = super.registerManifest(manifest);\n}\n```\n\n#### Notes\n\n- When you omit `Result<T>`, the command’s output type defaults to `unknown`.\n- When you omit `CfgFlags<>`, `ctx.parsed` in `execute(ctx)` is `Record<string, never>`.\n- When you omit `Deps<>`, `ctx.deps` is `undefined`.\n\n### Other\n\n- `handle(err: unknown): Promise<void>` — drop-in for `bin/run` catch chains\n\n## Optional integration points\n\n### `handle()` in a bin script\n\nUse `handle()` to ensure exit codes conform to the mapper even when errors bypass `Command.catch()`:\n\n```ts\n// bin/run (snippet)\nimport { handle } from '@charlie-labs/oclif-plugin-helpers';\nimport { run } from '@oclif/core';\n\nawait run(void 0, import.meta.url).catch(handle);\n```\n\n### Finally hook\n\nThis package includes an optional `finally` hook at `src/hooks/finally/report.ts` that only sets `process.exitCode` if an error occurred and the exit code wasn’t set yet. It does not print anything. This is a conservative last resort layer.\n\n## Examples\n\n### 1) Command with JSON gating, stderr logs, and TSV output\n\n```ts\nimport { BaseCommand } from '@charlie-labs/oclif-plugin-helpers';\nimport type { Result } from '@charlie-labs/oclif-plugin-helpers';\n\nexport default class ListProjects extends BaseCommand<Result<void>> {\n  protected async execute(_ctx) {\n    this.logInfo('Listing projects');\n    this.printRows(\n      [\n        ['p_123', 'Acme'],\n        ['p_456', 'Beta'],\n      ],\n      { header: ['id', 'name'] }\n    );\n  }\n}\n```\n\n### 2) Throwing a provided error → mapped exit code\n\n```ts\nimport {\n  BaseCommand,\n  ValidationError,\n} from '@charlie-labs/oclif-plugin-helpers';\nimport type { CfgFlags, Result } from '@charlie-labs/oclif-plugin-helpers';\nimport { defineFlags } from '@charlie-labs/oclif-plugin-helpers/flags';\n\nconst noFlags = defineFlags({} as const);\n\nexport default class Create extends BaseCommand<\n  CfgFlags<typeof noFlags> | Result<void>\n> {\n  protected async execute(_ctx) {\n    const name = '';\n    if (!name) throw new ValidationError('`name` is required'); // exit 2\n  }\n}\n```\n\n### 3) Mapping an unknown error yourself\n\n```ts\nimport { errorToExitCode } from '@charlie-labs/oclif-plugin-helpers';\n\ntry {\n  // … your code …\n} catch (err) {\n  process.exitCode = errorToExitCode(err);\n}\n```\n\n### 4) `bin/run` catch chain\n\n```ts\nimport { handle } from '@charlie-labs/oclif-plugin-helpers';\nimport { run } from '@oclif/core';\n\nawait run(void 0, import.meta.url).catch(handle);\n```\n\n## Compatibility and requirements\n\n- Peer: `@oclif/core@^4.5.2`\n- Node: `>=18`\n\n## Repository meta\n\n- Package: `@charlie-labs/oclif-plugin-helpers`\n- Published: public on npm (`publishConfig.access: \"public\"`)\n- License: `UNLICENSED`\n- Spec: Issue #1 — “Initial Spec”\n","readmeFilename":"README.md"}