{"_id":"@aditya-borkar/utils","_rev":"9-645fcc67217b0be01ea419841fc4c435","name":"@aditya-borkar/utils","dist-tags":{"latest":"0.6.3"},"versions":{"0.1.0":{"name":"@aditya-borkar/utils","version":"0.1.0","author":{"name":"Aditya Borkar"},"license":"MIT","_id":"@aditya-borkar/utils@0.1.0","maintainers":[{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"}],"bin":{"utils":"src/index.ts"},"dist":{"shasum":"ac3b39012c8f15ff86955a45cd999db73f821eef","tarball":"https://registry.npmjs.org/@aditya-borkar/utils/-/utils-0.1.0.tgz","fileCount":22,"integrity":"sha512-JIUHY8d4GTIhHHMAUuGVChpRAPTQFQOGVD19aClIdRvHceIKb1Q8IsmfBTtcMH2CovHGXOZTMJp6cjJ/DN7ACw==","signatures":[{"sig":"MEQCIGR+T/rswgAavTAeMhjEVYsLyMfYUAea4H8n4ORFnmkeAiAEEX4PvoELXLEiF9nkxKAKKiZ3ca58d87yNf7+Ga9mRg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25481},"gitHead":"248ae6229748031953f7546f41a6ed1d3856f2a5","private":false,"scripts":{"lint":"biome check --fix","release":"changeset publish && jsr publish","version":"changeset version","type-check":"tsc --noEmit"},"_npmUser":{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"},"_npmVersion":"10.9.3","description":"Utilities for daily developer work.","directories":{},"_nodeVersion":"22.20.0","dependencies":{"bytes":"^3.1.2","chalk":"^5.6.2","ignore":"^7.0.5","arktype":"^2.1.23","commander":"^14.0.1","cli-table3":"^0.6.5","@biomejs/biome":"^2.2.6"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","@types/bun":"^1.3.0","@types/bytes":"^3.1.5","@changesets/cli":"^2.29.7"},"peerDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/utils_0.1.0_1760631693746_0.8918521175863134","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aditya-borkar/utils","version":"0.2.0","author":{"name":"Aditya Borkar"},"license":"MIT","_id":"@aditya-borkar/utils@0.2.0","maintainers":[{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"}],"bin":{"utils":"src/index.ts"},"dist":{"shasum":"8b53e308eea0ee4f26661055370a0e69b3c15cc2","tarball":"https://registry.npmjs.org/@aditya-borkar/utils/-/utils-0.2.0.tgz","fileCount":22,"integrity":"sha512-bghWVvSLwhTjK65JuGfwLCfzg/YiQ+65dwBIx1slqH3fl4dcGel4nF72DCNYfhsfGTgfoS4BUieCaWKZZJTxSg==","signatures":[{"sig":"MEUCIAmAm/3zit86AeW4Gl2Q9ZwV0Rkpn56yOWoy81MOqZcjAiEA4q69GEzCYsPyfEAm0lYLMCUy0JyeCORuztZmobOzalI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25480},"gitHead":"716953ea55a5fc7345cc67e147346286017fe458","private":false,"scripts":{"lint":"biome check --fix","release":"changeset publish && jsr publish","version":"changeset version","type-check":"tsc --noEmit"},"_npmUser":{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"},"_npmVersion":"10.9.3","description":"Utilities for daily developer work.","directories":{},"_nodeVersion":"22.20.0","dependencies":{"bytes":"^3.1.2","chalk":"^5.6.2","ignore":"^7.0.5","arktype":"^2.1.23","commander":"^14.0.1","cli-table3":"^0.6.5","@biomejs/biome":"^2.2.6"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","@types/bun":"^1.3.0","@types/bytes":"^3.1.5","@changesets/cli":"^2.29.7"},"peerDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/utils_0.2.0_1760632118044_0.5832234335078339","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@aditya-borkar/utils","version":"0.3.0","author":{"name":"Aditya Borkar"},"license":"MIT","_id":"@aditya-borkar/utils@0.3.0","maintainers":[{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"}],"bin":{"utils":"src/index.ts"},"dist":{"shasum":"773a5d6a5fa3f37bad93983e1bb7213debd36601","tarball":"https://registry.npmjs.org/@aditya-borkar/utils/-/utils-0.3.0.tgz","fileCount":22,"integrity":"sha512-VnoG04Q1G2ecksof8xx+rrGZB4BuGIFxQqL6Guc5NfIFv9rfIXmlysUCnrYR0KrBcGixC4+MqH1G+U6wRmHtFA==","signatures":[{"sig":"MEYCIQDbpNCGzmrHhKDIiZPNNVqJwX8a+sPvHPUWthFU8/tVJAIhANkg8nfWBqsPIhID3lt6bduTHUBWrCWyqAmkprNZezVV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25441},"gitHead":"cf129a7da0293aee8795732e35cfd12a77831a4a","private":false,"scripts":{"lint":"biome check --fix","release":"changeset publish && jsr publish","version":"changeset version","type-check":"tsc --noEmit"},"_npmUser":{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"},"_npmVersion":"10.9.3","description":"Utilities for daily developer work.","directories":{},"_nodeVersion":"22.20.0","dependencies":{"bytes":"^3.1.2","chalk":"^5.6.2","ignore":"^7.0.5","arktype":"^2.1.23","commander":"^14.0.1","cli-table3":"^0.6.5","@biomejs/biome":"^2.2.6"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","@types/bun":"^1.3.0","@types/bytes":"^3.1.5","@changesets/cli":"^2.29.7"},"peerDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/utils_0.3.0_1760632312714_0.9591401112133255","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@aditya-borkar/utils","version":"0.4.0","author":{"name":"Aditya Borkar"},"license":"MIT","_id":"@aditya-borkar/utils@0.4.0","maintainers":[{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"}],"bin":{"utils":"src/index.ts"},"dist":{"shasum":"9ccf0c4fab418999e39285d3a9e93b83c8befd82","tarball":"https://registry.npmjs.org/@aditya-borkar/utils/-/utils-0.4.0.tgz","fileCount":22,"integrity":"sha512-FS8Ika/bwe3qn/i4M6n0f6+X/QtDhFkE1vqWe86Mcuf6GQQAAvmPudpKjUZkuVFMZ+bY9fDIa9GRgH+NWleaxQ==","signatures":[{"sig":"MEQCICbyO09aPdDsU8cbxWIfsIpu43ibV+y0l0qcMD07uBxSAiB8n8mPfR8RMLekQzcGofAYpV3I3CMdxNAn6C3ucJT9Zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25495},"gitHead":"ad8f18c8a89b73affb94d3fbbc91126432c3c602","private":false,"scripts":{"lint":"biome check --fix","release":"changeset publish && jsr publish","version":"changeset version","type-check":"tsc --noEmit"},"_npmUser":{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"},"_npmVersion":"10.9.3","description":"Utilities for daily developer work.","directories":{},"_nodeVersion":"22.20.0","dependencies":{"bytes":"^3.1.2","chalk":"^5.6.2","ignore":"^7.0.5","arktype":"^2.1.23","commander":"^14.0.1","cli-table3":"^0.6.5","@biomejs/biome":"^2.2.6"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","@types/bun":"^1.3.0","@types/bytes":"^3.1.5","@changesets/cli":"^2.29.7"},"peerDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/utils_0.4.0_1760632857981_0.2992846138845695","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@aditya-borkar/utils","version":"0.5.0","author":{"name":"Aditya Borkar"},"license":"MIT","_id":"@aditya-borkar/utils@0.5.0","maintainers":[{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"}],"bin":{"lab":"src/index.ts","ablab":"src/index.ts"},"dist":{"shasum":"9e0d9e11a67e49431f341309d22c4773611b1b0d","tarball":"https://registry.npmjs.org/@aditya-borkar/utils/-/utils-0.5.0.tgz","fileCount":47,"integrity":"sha512-HQqcCtQ1ld+zvV5phhF7LjbRt/DTKDY4UaQANsFDD4RX3XbgGvjha8h2IZK0nDgUB858+Rd7IOlrhhFWBllA9Q==","signatures":[{"sig":"MEUCIQDNHLa1G9y4WqMF5se3qO7Tih1hWBvpNXl8Zrr/10yzEwIgbcOyl7jXsobUsAQDaz7Lc7cOw+5gUjCT4XNhFsn7g8s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90135},"exports":{"./sdk":"./src/sdk/index.ts"},"gitHead":"36be5dc910ba66f860d7f2a30a74a707a552c76c","private":false,"scripts":{"dev":"bun run src/index.ts","lint":"biome check --fix","release":"changeset publish && jsr publish","version":"changeset version","type-check":"tsc --noEmit"},"_npmUser":{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"},"_npmVersion":"11.6.2","description":"Utilities for daily developer work.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"bun":"^1.3.6","ora":"^9.0.0","zod":"^4.3.5","open":"^11.0.0","pino":"^9.0.0","bytes":"^3.1.2","chalk":"^5.6.2","listr":"^0.14.3","dotenv":"^17.2.3","ignore":"^7.0.5","inquirer":"^13.2.0","commander":"^14.0.2","deepmerge":"^4.3.1","dockerode":"^4.0.9","tty-table":"^5.0.0","cli-table3":"^0.6.5","cloudflare":"^5.2.0","pino-pretty":"^11.0.0","@infisical/sdk":"^4.0.6","pretty-print-json":"^3.0.6"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","ioredis":"^5.9.2","@types/bun":"^1.3.6","@types/bytes":"^3.1.5","@types/listr":"^0.14.10","@biomejs/biome":"^2.3.11","@changesets/cli":"^2.29.8","@types/dockerode":"^4.0.0"},"peerDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/utils_0.5.0_1768794734709_0.9834677607767588","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@aditya-borkar/utils","version":"0.6.0","author":{"name":"Aditya Borkar"},"license":"MIT","_id":"@aditya-borkar/utils@0.6.0","maintainers":[{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"}],"bin":{"lab":"dist/index.js","ablab":"dist/index.js"},"dist":{"shasum":"dc21f6feb9bcddb4f4b559f06fe35941334b0a78","tarball":"https://registry.npmjs.org/@aditya-borkar/utils/-/utils-0.6.0.tgz","fileCount":10,"integrity":"sha512-7gPOBhu+gjohTRhIqLY/1+0c0/4jdOhI5FMrNhe57yu1cBvzdCZgV+BjuAb3k1OikYIYTh0maACOzH96TOvTSg==","signatures":[{"sig":"MEUCIQCSac1WG5GezlmBDzG7AWCjJo3JzF1xVRqQ1g89L8zS/QIgQlJqiTi/+Z6r7sc9GjcWXKvrcpquMFGCeLb2e/eFoWk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20091812},"exports":{"./sdk":"./dist/sdk/index.js"},"gitHead":"7bf784885e2a26d7e14b950fcd7c46e410ddb7c8","private":false,"scripts":{"dev":"bun run src/index.ts","lint":"biome check --fix","build":"bun run scripts/build.ts","release":"changeset publish && jsr publish","version":"changeset version","type-check":"tsc --noEmit","npm-release":"changeset publish"},"_npmUser":{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"},"_npmVersion":"11.6.2","description":"Utilities for daily developer work.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"bun":"^1.3.6","ora":"^9.0.0","zod":"^4.3.5","open":"^11.0.0","pino":"^10.2.0","chalk":"^5.6.2","dotenv":"^17.2.3","ignore":"^7.0.5","inquirer":"^13.2.0","commander":"^14.0.2","deepmerge":"^4.3.1","dockerode":"^4.0.9","tty-table":"^5.0.0","cloudflare":"^5.2.0","pino-pretty":"^13.1.3","@infisical/sdk":"^4.0.6"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","@types/bun":"^1.3.6","@biomejs/biome":"^2.3.11","@changesets/cli":"^2.29.8","@types/dockerode":"^4.0.0"},"peerDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/utils_0.6.0_1768800958299_0.5253979311485246","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@aditya-borkar/utils","version":"0.6.1","author":{"name":"Aditya Borkar"},"license":"MIT","_id":"@aditya-borkar/utils@0.6.1","maintainers":[{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"}],"bin":{"lab":"dist/index.js","ablab":"dist/index.js"},"dist":{"shasum":"d0e2d10116e2d47756780801e40d60cc72e36bcf","tarball":"https://registry.npmjs.org/@aditya-borkar/utils/-/utils-0.6.1.tgz","fileCount":10,"integrity":"sha512-ib+QseB/UZROy8VwwKdgVerR6TXj/KiD8UJMEWjtaEBZBQEimos6T6VAypQoqvRctpijP2q264JTsAHcvVp6Mw==","signatures":[{"sig":"MEQCIEn7WwYfn22gFTngWMTcmvnZC+R+WYDu4fq2o0bEIRI4AiA/ikPjwLx7FZ/WKo7cNHeM+p/pZ/5NTA/Jc4M97k+uDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25658377},"exports":{"./sdk":"./dist/sdk/index.js"},"gitHead":"bcb25eb0376a8a644b474e0a0eb4ad6db399c81c","private":false,"scripts":{"dev":"bun run src/index.ts","lint":"biome check --fix","build":"bun run scripts/build.ts","release":"changeset publish && jsr publish","version":"changeset version","type-check":"tsc --noEmit","npm-release":"changeset publish"},"_npmUser":{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"},"_npmVersion":"11.6.2","description":"Utilities for daily developer work.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"bun":"^1.3.6","ora":"^9.0.0","zod":"^4.3.5","open":"^11.0.0","pino":"^10.2.0","chalk":"^5.6.2","dotenv":"^17.2.3","ignore":"^7.0.5","inquirer":"^13.2.0","commander":"^14.0.2","deepmerge":"^4.3.1","dockerode":"^4.0.9","tty-table":"^5.0.0","cloudflare":"^5.2.0","pino-pretty":"^13.1.3","@infisical/sdk":"^4.0.6"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","@types/bun":"^1.3.6","@biomejs/biome":"^2.3.11","@changesets/cli":"^2.29.8","@types/dockerode":"^4.0.0"},"peerDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/utils_0.6.1_1768801510501_0.607515192852351","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@aditya-borkar/utils","version":"0.6.2","author":{"name":"Aditya Borkar"},"license":"MIT","_id":"@aditya-borkar/utils@0.6.2","maintainers":[{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"}],"bin":{"lab":"dist/index","ablab":"dist/index"},"dist":{"shasum":"a5f792d0288012c64fe58d5e6975ee66e56b6023","tarball":"https://registry.npmjs.org/@aditya-borkar/utils/-/utils-0.6.2.tgz","fileCount":9,"integrity":"sha512-AeOVzWveQGdZfQX7kK31A/uIf16gHReMj5Bwerm8JTNm3BhbI9E5U66VqkZnixkzLFY2K+kgv5kEIGFk0muzfw==","signatures":[{"sig":"MEUCIHqu6kzuViArUQwneHRlvPuQb83uFXgcFgJT463QIqawAiEAkqJkPzDCbp8cZyZpsj3c8aXrjo4z1JRRAFC4HhMRFuo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23400269},"exports":{"./sdk":"./dist/sdk/index"},"gitHead":"3188d8aec06c4ae86217b12f22f2f01f73d3c99a","private":false,"scripts":{"dev":"bun run src/index.ts","lint":"biome check --fix","build":"bun run scripts/build.ts","release":"changeset publish && jsr publish","version":"changeset version","type-check":"tsc --noEmit","npm-release":"changeset publish"},"_npmUser":{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"},"_npmVersion":"11.6.2","description":"Utilities for daily developer work.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"bun":"^1.3.6","ora":"^9.0.0","zod":"^4.3.5","open":"^11.0.0","pino":"^10.2.0","chalk":"^5.6.2","dotenv":"^17.2.3","ignore":"^7.0.5","inquirer":"^13.2.0","commander":"^14.0.2","deepmerge":"^4.3.1","dockerode":"^4.0.9","tty-table":"^5.0.0","cloudflare":"^5.2.0","pino-pretty":"^13.1.3","@infisical/sdk":"^4.0.6"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.5","@types/bun":"^1.3.6","typescript":"^5.9.3","@biomejs/biome":"^2.3.11","@changesets/cli":"^2.29.8","@types/dockerode":"^4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/utils_0.6.2_1768803078517_0.033711721923167515","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"author":{"name":"Aditya Borkar"},"bin":{"ablab":"dist/index","lab":"dist/index"},"dependencies":{"@infisical/sdk":"^4.0.6","bun":"^1.3.6","chalk":"^5.6.2","cloudflare":"^5.2.0","commander":"^14.0.2","deepmerge":"^4.3.1","dockerode":"^4.0.9","dotenv":"^17.2.3","ignore":"^7.0.5","inquirer":"^13.2.0","open":"^11.0.0","ora":"^9.0.0","pino":"^10.2.0","pino-pretty":"^13.1.3","tty-table":"^5.0.0","zod":"^4.3.5"},"description":"Utilities for daily developer work.","devDependencies":{"@biomejs/biome":"^2.3.11","@changesets/cli":"^2.29.8","@types/bun":"^1.3.6","@types/dockerode":"^4.0.0","jsr":"^0.13.5","typescript":"^5.9.3"},"exports":{"./sdk":"./dist/sdk/index"},"license":"MIT","name":"@aditya-borkar/utils","private":false,"scripts":{"build":"bun run scripts/build.ts","dev":"bun run src/index.ts","lint":"biome check --fix","npm-release":"changeset publish","release":"changeset publish && jsr publish","type-check":"tsc --noEmit","version":"changeset version"},"version":"0.6.3","gitHead":"3188d8aec06c4ae86217b12f22f2f01f73d3c99a","_id":"@aditya-borkar/utils@0.6.3","_nodeVersion":"24.3.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-NTKU4uk/o5Fa0bcXm+iZh171fVYMzEcyB9qomHm7BvO7fvOecFNJ65jJV33a4aLjyn6qm9iu9og6F79y7rhAKA==","shasum":"020deb3be360942ac92b8bc6732f1b71596e71a6","tarball":"https://registry.npmjs.org/@aditya-borkar/utils/-/utils-0.6.3.tgz","fileCount":9,"unpackedSize":23400269,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCXV5y8z7ZxIkI8B+bgbkN/XJfZOCbSpa/mc7z01Kl21AIhAOVs6J6m70DamMndUSZBMW15Dp0s6rxtLFqCCrxSf7aQ"}]},"_npmUser":{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"},"directories":{},"maintainers":[{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/utils_0.6.3_1768895090010_0.10248665570613391"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-16T16:21:33.574Z","modified":"2026-01-20T07:44:50.393Z","0.1.0":"2025-10-16T16:21:33.941Z","0.2.0":"2025-10-16T16:28:38.253Z","0.3.0":"2025-10-16T16:31:52.898Z","0.4.0":"2025-10-16T16:40:58.166Z","0.5.0":"2026-01-19T03:52:14.846Z","0.6.0":"2026-01-19T05:35:58.585Z","0.6.1":"2026-01-19T05:45:10.804Z","0.6.2":"2026-01-19T06:11:18.797Z","0.6.3":"2026-01-20T07:44:50.272Z"},"author":{"name":"Aditya Borkar"},"license":"MIT","description":"Utilities for daily developer work.","maintainers":[{"name":"adityaborkar","email":"aditya.borkar.programs+npm@gmail.com"}],"readme":"# Developer productivity utilities for your terminal\n\n## Features\n\n┌─────────────────┬─────────────────────────────────────────┐\n│ 🗄️  Databases   │ CockroachDB, Postgres, Redis via Docker │\n│ 🌐 Tunnels      │ Cloudflare Tunnel management           │\n│ 🔐 Secrets      │ Infisical-based secret management      │\n│ 📁 Repos        │ Scan, create git repositories          │\n│ ⚙️  Config      │ Manage your CLI configuration          │\n│ 📦 SDK          │ Exportable SDK for Infisical           │\n└─────────────────┴─────────────────────────────────────────┘\n\n## Installation\n\n```bash\n# Via JSR\nbunx jsr add @aditya-borkar/utils\n\n# Via npm\nnpm install -g @aditya-borkar/utils\n```\n\n## Usage\n\n```bash\nlab              # Show help (or 'utils' if installed locally)\n```\n\n### Database Management 🗄️\n\n```bash\nlab db start cockroach    # Start CockroachDB container\nlab db stop postgres      # Stop Postgres container\nlab db list               # List all databases\nlab db create postgres mydb   # Create new Postgres database\nlab db delete redis test  # Delete database\n```\n\n**Supported Databases:**\n\n- `cockroach` — CockroachDB (ports: 26257, 8080)\n- `postgres` — PostgreSQL (ports: 5432)\n- `redis` — Redis (ports: 6379)\n\n### Cloudflare Tunnel Management 🌐\n\n```bash\nlab tunnel list           # List all tunnel routes\nlab tunnel create         # Create a new route (interactive)\nlab tunnel delete         # Delete routes (interactive)\n```\n\nTunnel commands automatically manage DNS records via Cloudflare API. See [Cloudflare Setup](#cloudflare-tunnel-setup) below for configuration.\n\n### Secret Management 🔐\n\n```bash\nlab secrets list          # List all secrets\nlab secrets set KEY=VALUE # Set secret values\nlab secrets show KEY      # Show a secret value\nlab secrets remove KEY    # Remove a secret\nlab secrets clear         # Clear all secrets\n```\n\nSecrets are managed via an Infisical Docker container.\n\n### Repository Management 📁\n\n```bash\nlab repo                  # Scan current dir for git repos\nlab repo ~/code           # Scan specific folder\nlab repo create myapp     # Create new repository\n```\n\nThe scanner shows:\n- Git status (🟢 clean, 🟡 dirty, 🔴 no remote)\n- Remote sync status (ahead/behind)\n- Repository size\n- Staleness indicator (repos not updated in 7+ days)\n\n### Configuration ⚙️\n\n```bash\nlab config show           # Display current configuration\nlab config open           # Open config in default editor\n```\n\nConfiguration location: `~/.config/aditya-borkar.utils/config.json`\n\n## Cloudflare Tunnel Setup\n\nTo use tunnel management, you need to configure Cloudflare credentials:\n\n### 1. Create a Tunnel\n\n1. Go to [Cloudflare Zero Trust Dashboard](https://one.dash.cloudflare.com/)\n2. Navigate to **Access > Tunnels**\n3. Click \"Create a tunnel\"\n4. Choose your tunnel name (e.g., `ablab-tunnel`)\n5. Copy the **Tunnel ID** from the installation command\n\n### 2. Get API Token\n\n1. Go to [Cloudflare API Tokens](https://dash.cloudflare.com/profile/api-tokens)\n2. Click \"Create Token\"\n3. Use the \"Edit Cloudflare Tunnels\" template or create a custom token with:\n   - **Account** > **Cloudflare Tunnel** > **Edit**\n   - **Zone** > **DNS** > **Edit**\n4. Copy the API token\n\n### 3. Get Account ID\n\nFound in the right sidebar of your Cloudflare dashboard, or in the URL when viewing your account.\n\n### 4. Configure in `lab`\n\n```bash\nlab config open\n```\n\nAdd to your config:\n\n```json\n{\n  \"cloudflare\": {\n    \"api_token\": \"your_api_token_here\",\n    \"account_id\": \"your_account_id_here\",\n    \"tunnel_id\": \"your_tunnel_id_here\"\n  }\n}\n```\n\n### 5. Use Tunnel Commands\n\n```bash\nlab tunnel create    # Prompts for hostname (e.g., app.example.com)\n                     # and service (e.g., http://localhost:3000)\n\nlab tunnel delete    # Interactive selection of routes to delete\n\nlab tunnel list      # Shows all configured routes\n```\n\n**What happens:**\n- `create` adds a route and creates a CNAME DNS record automatically\n- `delete` removes routes and their associated DNS records\n- `list` shows all hostname → service mappings\n\n## SDK\n\nThe package exports an SDK for Infisical integration:\n\n```typescript\nimport { loadEnv } from \"@aditya-borkar/utils/sdk\"\n\n// Load secrets from Infisical into process.env\nawait loadEnv()\n```\n\nRequires `.env` with:\n- `ABLAB_PROJECT_ID` — Your Infisical project ID\n- `ABLAB_ENV` — Environment name (e.g., \"dev\", \"prod\")\n\n## Tech Stack\n\n- **Runtime:** Bun\n- **Language:** TypeScript (strict mode)\n- **CLI:** Commander.js\n- **Validation:** Zod\n- **Containers:** Docker (dockerode)\n- **Cloudflare:** cloudflare npm package\n- **Secrets:** Infisical SDK\n\n## Development\n\n```bash\nbun install              # Install dependencies\nbun run dev              # Run CLI in development\nbun run lint             # Lint with Biome (auto-fix)\nbun run type-check       # TypeScript type checking\n```\n\n## Project Structure\n\n```\nsrc/\n├── index.ts          # CLI entry point (shebang)\n├── commands/         # Command implementations\n│   ├── db.*.ts      # Database commands\n│   ├── repo.*.ts    # Repository management\n│   ├── secrets.*.ts # Secret management\n│   ├── tunnel.*.ts  # Tunnel management\n│   ├── config.*.ts  # Configuration commands\n│   └── start.ts     # Start all services\n├── logic/            # Business logic\n│   └── cloudflare.ts # Cloudflare API integration\n├── lib/              # Core utilities\n│   ├── console.ts    # Styled console output\n│   ├── config.ts    # Configuration system\n│   ├── docker.ts    # Docker container management\n│   ├── logger.ts    # Logging utilities\n│   └── state.ts     # Runtime state\n├── services/         # Docker service definitions\n│   ├── cockroach.ts # CockroachDB service\n│   ├── postgres.ts  # Postgres service\n│   ├── redis.ts     # Redis service\n│   └── infisical.ts # Infisical service\n└── sdk/              # Exportable SDK\n    └── index.ts     # Infisical env loader\n```\n\n## License\n\nMIT © Aditya Borkar\n","readmeFilename":"README.md"}