{"_id":"@steipete/bird","_rev":"9-5ff2fbdc22745d0066f263f8ac99e602","name":"@steipete/bird","dist-tags":{"latest":"0.8.0"},"versions":{"0.1.0":{"name":"@steipete/bird","version":"0.1.0","_id":"@steipete/bird@0.1.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"}],"bin":{"bird":"dist/index.js"},"dist":{"shasum":"05f8cd53ce44c7e335c001d195b046e0aad874a6","tarball":"https://registry.npmjs.org/@steipete/bird/-/bird-0.1.0.tgz","fileCount":49,"integrity":"sha512-LH2zDow6pfOGw+k4/8IbKGkPE3nXrfD0OfoeT7WJHzvXvYaoZfxaVLKp7J4JJ2yfAWFwmS+mQ30Bffv8HR5R8A==","signatures":[{"sig":"MEYCIQCGNZ1Ee+ZtDSqb82uCSfOURMwU2HXdz/br5nFbT7CiBQIhAIeDNe7zMaUZiVoAWm44lTCzPX6k/SvHuC5Rp5GJN7EW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22540006},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"ddd9802a14ccded509a8a0e63887cfd68fa1ee0c","scripts":{"dev":"tsx src/index.ts","bird":"pnpm run build:dist && node dist/index.js","lint":"biome check .","test":"vitest run","build":"pnpm run build:dist && pnpm run build:binary","binary":"pnpm run build:binary","format":"biome format --write .","lint:fix":"biome check --write .","build:dist":"tsc","test:watch":"vitest","build:binary":"bun build --compile --minify src/index.ts --outfile bird","graphql:update":"tsx scripts/update-query-ids.ts"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"_npmVersion":"11.6.2","description":"CLI tool for tweeting and replying via Twitter/X GraphQL API","directories":{},"_nodeVersion":"25.2.1","dependencies":{"json5":"^2.2.3","kleur":"^4.1.5","devalue":"^5.6.1","commander":"^14.0.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.10","@vitest/coverage-v8":"4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/bird_0.1.0_1766227127624_0.4509245537171871","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@steipete/bird","version":"0.2.0","_id":"@steipete/bird@0.2.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"}],"bin":{"bird":"dist/index.js"},"dist":{"shasum":"75d1efd4570f321e9c5d09714adb7a16815995c4","tarball":"https://registry.npmjs.org/@steipete/bird/-/bird-0.2.0.tgz","fileCount":49,"integrity":"sha512-F1T6xr5QaO3Frsc3D7XGtsymSSzsg2sRPI41uVZITU/wr5OF/wFFUFzV2/+I+18mXP9MDW+m5bUqOKTfZZJN8A==","signatures":[{"sig":"MEUCIQDDd8GyAmPIjnDh+IIDtGHHW2QtFbM1vEIuTlvwmqZLJAIgJHlFSJuf3SLpQz7lFBO2Zy4onSOCs9/ijRr5oDknApA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":304636},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"9f38efc9bf7b9eec50cf5c2cd509763393d24071","scripts":{"dev":"tsx src/index.ts","bird":"pnpm run build:dist && node dist/index.js","lint":"biome check .","test":"vitest run","build":"pnpm run build:dist && pnpm run build:binary","binary":"pnpm run build:binary","format":"biome format --write .","lint:fix":"biome check --write .","build:dist":"tsc && node scripts/copy-dist-assets.js","test:watch":"vitest","build:binary":"BIRD_VERSION=$(node -p \"require('./package.json').version\") BIRD_GIT_SHA=$(git rev-parse --short=8 HEAD 2>/dev/null || true) bun build --compile --minify --env=BIRD_* src/index.ts --outfile bird","graphql:update":"tsx scripts/update-query-ids.ts"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"_npmVersion":"11.6.2","description":"CLI tool for tweeting and replying via Twitter/X GraphQL API","directories":{},"_nodeVersion":"25.2.1","dependencies":{"json5":"^2.2.3","kleur":"^4.1.5","devalue":"^5.6.1","commander":"^14.0.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.10","@vitest/coverage-v8":"4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/bird_0.2.0_1766778469603_0.3379995216948568","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@steipete/bird","version":"0.3.0","_id":"@steipete/bird@0.3.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"}],"bin":{"bird":"dist/index.js"},"dist":{"shasum":"fea15acdc999bde3361e7ddef1212754faf5a32f","tarball":"https://registry.npmjs.org/@steipete/bird/-/bird-0.3.0.tgz","fileCount":49,"integrity":"sha512-bEapZtfxSE12M1GVtsQV70ZP2EuDuZMTjQTm9N0rEAuE0RFGlGjs/Wkcdt7awyKshLR8LCmQ1OvdZJVvLPajoA==","signatures":[{"sig":"MEQCIAHF9g/FR+YgqpK5ZQwON581NYKZZ/OOP8qTtkJxeLzKAiAt5feh2olTGUJmktfldAhFipYNr5m6QyxgX/XncD/D5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":279611},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"67ed76b58fcd1640a9772e343ce5a82e5d80fc53","scripts":{"dev":"tsx src/index.ts","bird":"pnpm run build:dist && node dist/index.js","lint":"biome check .","test":"vitest run","build":"pnpm run build:dist && pnpm run build:binary","binary":"pnpm run build:binary","format":"biome format --write .","lint:fix":"biome check --write .","build:dist":"tsc && node scripts/copy-dist-assets.js","test:watch":"vitest","build:binary":"BIRD_VERSION=$(node -p \"require('./package.json').version\") BIRD_GIT_SHA=$(git rev-parse --short=8 HEAD 2>/dev/null || true) bun build --compile --minify --env=BIRD_* src/index.ts --outfile bird","graphql:update":"tsx scripts/update-query-ids.ts"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"_npmVersion":"11.6.2","description":"CLI tool for tweeting and replying via Twitter/X GraphQL API","directories":{},"_nodeVersion":"25.2.1","dependencies":{"json5":"^2.2.3","kleur":"^4.1.5","commander":"^14.0.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.10","@vitest/coverage-v8":"4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/bird_0.3.0_1766778755638_0.5612157298221969","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@steipete/bird","version":"0.4.0","_id":"@steipete/bird@0.4.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"}],"bin":{"bird":"dist/index.js"},"dist":{"shasum":"8eb57ed2c47d14d20869242094f507a1eef14da0","tarball":"https://registry.npmjs.org/@steipete/bird/-/bird-0.4.0.tgz","fileCount":49,"integrity":"sha512-DAsCTtKQaJGHz5FJL0L8i3dbV9waBGWbi0bvFQdF1CbASx4PwIlqXS62TuxdsGX9QLzkN7UyL0zEThRGN+Ie7Q==","signatures":[{"sig":"MEUCIQDsPhrz+dz84SrTG0ozV/HlNxJcK4ecsDRCNj2EqZr3pAIgA5cGhFpdoBYTPwyFVqtxE8zdrQ/k1jylb8C22op4rrk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":290060},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"c16726e9d8d77609e6ea2946bc0ad1ab540fb63f","scripts":{"dev":"tsx src/index.ts","bird":"pnpm run build:dist && node dist/index.js","lint":"biome check .","test":"vitest run","build":"pnpm run build:dist && pnpm run build:binary","binary":"pnpm run build:binary","format":"biome format --write .","lint:fix":"biome check --write .","build:dist":"tsc && node scripts/copy-dist-assets.js","test:watch":"vitest","build:binary":"BIRD_VERSION=$(node -p \"require('./package.json').version\") BIRD_GIT_SHA=$(git rev-parse --short=8 HEAD 2>/dev/null || true) bun build --compile --minify --env=BIRD_* src/index.ts --outfile bird","graphql:update":"tsx scripts/update-query-ids.ts"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"_npmVersion":"11.6.2","description":"CLI tool for tweeting and replying via Twitter/X GraphQL API","directories":{},"_nodeVersion":"25.2.1","dependencies":{"json5":"^2.2.3","kleur":"^4.1.5","commander":"^14.0.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.10","@vitest/coverage-v8":"4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/bird_0.4.0_1766785283568_0.9325928520616453","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@steipete/bird","version":"0.4.1","_id":"@steipete/bird@0.4.1","maintainers":[{"name":"steipete","email":"steipete@gmail.com"}],"bin":{"bird":"dist/index.js"},"dist":{"shasum":"cff4ec783bdd6b1eaac71f11efb6e0bcf960859d","tarball":"https://registry.npmjs.org/@steipete/bird/-/bird-0.4.1.tgz","fileCount":49,"integrity":"sha512-nmJ7rw0QhV8mMacTUpBsHPk0Q4zo1XaQByDx9/NYT600XqzwWeXOL2byLig7DEvCRsVV79jZ+OxraF4Sdbo+fg==","signatures":[{"sig":"MEYCIQCKkLrUv2Xh3wQBLDGSv0Z28pY+v2YX+yQlcI+jyYZXKAIhAIePhh5qt4KrU4GpyX9AzIuuIB6JLpsvl0KfQfJlwEf+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278186},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"gitHead":"34615de95dcd84b41636d89e3aef87508cb13ac6","scripts":{"dev":"tsx src/index.ts","bird":"pnpm run build:dist && node dist/index.js","lint":"pnpm run lint:biome && pnpm run lint:oxlint","test":"vitest run","build":"pnpm run build:dist && pnpm run build:binary","binary":"pnpm run build:binary","format":"biome format --write .","lint:fix":"pnpm run lint:biome:fix && pnpm run lint:oxlint:fix","build:dist":"tsc && node scripts/copy-dist-assets.js","lint:biome":"biome check .","test:watch":"vitest","lint:oxlint":"oxlint --type-aware --tsconfig tsconfig.oxlint.json --import-plugin --node-plugin --vitest-plugin --deny-warnings src tests scripts","build:binary":"BIRD_VERSION=$(node -p \"require('./package.json').version\") BIRD_GIT_SHA=$(git rev-parse --short=8 HEAD 2>/dev/null || true) bun build --compile --minify --env=BIRD_* src/index.ts --outfile bird","graphql:update":"tsx scripts/update-query-ids.ts","lint:biome:fix":"biome check --write .","lint:oxlint:fix":"oxlint --type-aware --tsconfig tsconfig.oxlint.json --import-plugin --node-plugin --vitest-plugin --deny-warnings --fix src tests scripts"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"_npmVersion":"11.6.2","description":"CLI tool for tweeting and replying via Twitter/X GraphQL API","directories":{},"_nodeVersion":"25.2.1","dependencies":{"json5":"^2.2.3","kleur":"^4.1.5","commander":"^14.0.2","@steipete/sweet-cookie":"0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.36.0","vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.10","oxlint-tsgolint":"^0.10.0","@vitest/coverage-v8":"4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/bird_0.4.1_1767208768567_0.515487838476983","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@steipete/bird","version":"0.5.1","_id":"@steipete/bird@0.5.1","maintainers":[{"name":"steipete","email":"steipete@gmail.com"}],"bin":{"bird":"dist/cli.js"},"dist":{"shasum":"954a3748cb3ee69395964350886e645b42a13abf","tarball":"https://registry.npmjs.org/@steipete/bird/-/bird-0.5.1.tgz","fileCount":145,"integrity":"sha512-zMp8yUmr5TxA1TwCdmTk3GDTFnyuk4hDvTF/OTsmh5aV/WRNc+oXwdyY+w4Y0B13ZwwSmewqTsxVH9sdd9e7Hw==","signatures":[{"sig":"MEUCIQDRG6NRD+o2r194cijG2ixln2dr+gLVnRs3sfdIDhfTtgIgamMFBQVR+KsuMCeuIBPy1XGKu1QidhLyvL7IgFl3u8Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":413749},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"42abae9c154d5d6b9e6ccc5c20b1a6e95062bd4d","scripts":{"dev":"tsx src/index.ts","bird":"pnpm run build:dist && node dist/cli.js","lint":"pnpm run lint:biome && pnpm run lint:oxlint","test":"vitest run","build":"pnpm run build:dist && pnpm run build:binary","binary":"pnpm run build:binary","format":"biome format --write .","lint:fix":"pnpm run lint:biome:fix && pnpm run lint:oxlint:fix","test:live":"pnpm run build:dist && BIRD_LIVE=1 vitest run --no-file-parallelism tests/live/live.test.ts","build:dist":"tsc && node scripts/copy-dist-assets.js","lint:biome":"biome check .","test:watch":"vitest","lint:oxlint":"oxlint --type-aware --tsconfig tsconfig.oxlint.json --import-plugin --node-plugin --vitest-plugin --deny-warnings src tests scripts","build:binary":"BIRD_VERSION=$(node -p \"require('./package.json').version\") BIRD_GIT_SHA=$(git rev-parse --short=8 HEAD 2>/dev/null || true) bun build --compile --minify --env=BIRD_* src/cli.ts --outfile bird","graphql:update":"tsx scripts/update-query-ids.ts","lint:biome:fix":"biome check --write .","lint:oxlint:fix":"oxlint --type-aware --tsconfig tsconfig.oxlint.json --import-plugin --node-plugin --vitest-plugin --deny-warnings --fix src tests scripts"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"_npmVersion":"11.6.2","description":"CLI tool for tweeting and replying via Twitter/X GraphQL API","directories":{},"_nodeVersion":"25.2.1","dependencies":{"json5":"^2.2.3","kleur":"^4.1.5","commander":"^14.0.2","@steipete/sweet-cookie":"0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.36.0","vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.10","oxlint-tsgolint":"^0.10.0","@vitest/coverage-v8":"4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/bird_0.5.1_1767286513058_0.2736281527310047","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@steipete/bird","version":"0.6.0","_id":"@steipete/bird@0.6.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"}],"bin":{"bird":"dist/cli.js"},"dist":{"shasum":"5c373acc16b0797a7386347fb3093bfd463df7bc","tarball":"https://registry.npmjs.org/@steipete/bird/-/bird-0.6.0.tgz","fileCount":170,"integrity":"sha512-+ak8Chc3eSkzhyTjtG4wfI+u2WNgXX5lsoigMd9oVa9A3+kF+UXzQjC5169dP4jaO4AkKk7BBx7lOeU+8TPVNw==","signatures":[{"sig":"MEUCIGb/84ckCz+wLEiqn5ue5KUwXmbakh88cdb5N2u4X4ZlAiEA4yfg13vVBx/fRRdIgtt1zeTG79MM91IExI5R54Md1Wk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":515266},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"9b5e575f92fab8b568039571a1d3819a219132dc","scripts":{"dev":"tsx src/index.ts","bird":"pnpm run build:dist && node dist/cli.js","lint":"pnpm run lint:biome && pnpm run lint:oxlint","test":"vitest run","build":"pnpm run build:dist && pnpm run build:binary","binary":"pnpm run build:binary","format":"biome format --write .","lint:fix":"pnpm run lint:biome:fix && pnpm run lint:oxlint:fix","test:live":"pnpm run build:dist && BIRD_LIVE=1 vitest run --no-file-parallelism tests/live/live.test.ts","build:dist":"tsc && node scripts/copy-dist-assets.js","lint:biome":"biome check .","test:watch":"vitest","lint:oxlint":"oxlint --type-aware --tsconfig tsconfig.oxlint.json --import-plugin --node-plugin --vitest-plugin --deny-warnings src tests scripts","build:binary":"BIRD_VERSION=$(node -p \"require('./package.json').version\") BIRD_GIT_SHA=$(git rev-parse --short=8 HEAD 2>/dev/null || true) bun build --compile --minify --env=BIRD_* src/cli.ts --outfile bird","graphql:update":"tsx scripts/update-query-ids.ts","lint:biome:fix":"biome check --write .","lint:oxlint:fix":"oxlint --type-aware --tsconfig tsconfig.oxlint.json --import-plugin --node-plugin --vitest-plugin --deny-warnings --fix src tests scripts"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"_npmVersion":"11.6.2","description":"CLI tool for tweeting and replying via Twitter/X GraphQL API","directories":{},"_nodeVersion":"25.2.1","dependencies":{"json5":"^2.2.3","kleur":"^4.1.5","commander":"^14.0.2","@steipete/sweet-cookie":"0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.36.0","vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.10","oxlint-tsgolint":"^0.10.0","@vitest/coverage-v8":"4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/bird_0.6.0_1767583620055_0.21101537913213275","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@steipete/bird","version":"0.7.0","_id":"@steipete/bird@0.7.0","maintainers":[{"name":"steipete","email":"steipete@gmail.com"}],"bin":{"bird":"dist/cli.js"},"dist":{"shasum":"3e638f0b8904b5fd139b550209584307494ea88d","tarball":"https://registry.npmjs.org/@steipete/bird/-/bird-0.7.0.tgz","fileCount":206,"integrity":"sha512-Dr/RmBT/MdcNzY/7GGD/B1LQYcw1DBCM3fetFBvxTDsmpPql8sGEJvX4ekmrZzPpSL3xHoMjYpvnh+62iasPYA==","signatures":[{"sig":"MEUCIDuWE3/jQhIqr1jJBVhYy+vfxXvVvSpWFWbDFc9j/yDlAiEAvyjw1sEDZmqoz1KD8RpLOm1qO9nb/1bsy0GV+ncCcyI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":716511},"main":"dist/index.js","pnpm":{"patchedDependencies":{"@steipete/sweet-cookie":"patches/@steipete__sweet-cookie.patch"}},"type":"module","types":"dist/index.d.ts","engines":{"node":">=22"},"gitHead":"e17cc222a96f29208599daf7c615e4a13b494049","scripts":{"dev":"tsx src/index.ts","bird":"pnpm run build:dist && node dist/cli.js","lint":"pnpm run lint:biome && pnpm run lint:oxlint","test":"vitest run","build":"pnpm run build:dist && pnpm run build:binary","binary":"pnpm run build:binary","format":"biome format --write .","lint:fix":"pnpm run lint:biome:fix && pnpm run lint:oxlint:fix","test:live":"pnpm run build:dist && BIRD_LIVE=1 vitest run --no-file-parallelism tests/live/live.test.ts","build:dist":"tsc && node scripts/copy-dist-assets.js","lint:biome":"biome check .","test:watch":"vitest","lint:oxlint":"oxlint --type-aware --tsconfig tsconfig.oxlint.json --import-plugin --node-plugin --vitest-plugin --deny-warnings src tests scripts","build:binary":"BIRD_VERSION=$(node -p \"require('./package.json').version\") BIRD_GIT_SHA=$(git rev-parse --short=8 HEAD 2>/dev/null || true) bun build --compile --minify --env=BIRD_* src/cli.ts --outfile bird","test:live:all":"pnpm run build:dist && BIRD_LIVE=1 vitest run --no-file-parallelism tests/live/live-all.test.ts","graphql:update":"tsx scripts/update-query-ids.ts","lint:biome:fix":"biome check --write .","lint:oxlint:fix":"oxlint --type-aware --tsconfig tsconfig.oxlint.json --import-plugin --node-plugin --vitest-plugin --deny-warnings --fix src tests scripts"},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"_npmVersion":"11.6.2","description":"CLI tool for tweeting and replying via Twitter/X GraphQL API","directories":{},"_nodeVersion":"25.2.0","dependencies":{"json5":"^2.2.3","kleur":"^4.1.5","commander":"^14.0.2","@steipete/sweet-cookie":"0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","oxlint":"^1.36.0","vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.10","oxlint-tsgolint":"^0.10.0","@vitest/coverage-v8":"4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/bird_0.7.0_1768211202181_0.7687592018234146","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@steipete/bird","version":"0.8.0","description":"CLI tool for tweeting and replying via Twitter/X GraphQL API","type":"module","main":"dist/index.js","types":"dist/index.d.ts","bin":{"bird":"dist/cli.js"},"scripts":{"build":"pnpm run build:dist && pnpm run build:binary","build:dist":"tsc && node scripts/copy-dist-assets.js","build:binary":"BIRD_VERSION=$(node -p \"require('./package.json').version\") BIRD_GIT_SHA=$(git rev-parse --short=8 HEAD 2>/dev/null || true) bun build --compile --minify --env=BIRD_* src/cli.ts --outfile bird","dev":"tsx src/index.ts","bird":"pnpm run build:dist && node dist/cli.js","test":"vitest run","test:watch":"vitest","test:live":"pnpm run build:dist && BIRD_LIVE=1 vitest run --no-file-parallelism tests/live/live.test.ts","test:live:all":"pnpm run build:dist && BIRD_LIVE=1 vitest run --no-file-parallelism tests/live/live-all.test.ts","lint":"pnpm run lint:biome && pnpm run lint:oxlint","lint:biome":"biome check .","lint:oxlint":"oxlint --type-aware --tsconfig tsconfig.oxlint.json --import-plugin --node-plugin --vitest-plugin --deny-warnings src tests scripts","lint:fix":"pnpm run lint:biome:fix && pnpm run lint:oxlint:fix","lint:biome:fix":"biome check --write .","lint:oxlint:fix":"oxlint --type-aware --tsconfig tsconfig.oxlint.json --import-plugin --node-plugin --vitest-plugin --deny-warnings --fix src tests scripts","format":"biome format --write .","binary":"pnpm run build:binary","graphql:update":"tsx scripts/update-query-ids.ts"},"dependencies":{"@steipete/sweet-cookie":"0.1.0","commander":"^14.0.2","json5":"^2.2.3","kleur":"^4.1.5"},"pnpm":{"patchedDependencies":{"@steipete/sweet-cookie":"patches/@steipete__sweet-cookie.patch"}},"devDependencies":{"@biomejs/biome":"^2.3.10","@types/node":"^25.0.3","@vitest/coverage-v8":"4.0.16","oxlint":"^1.36.0","oxlint-tsgolint":"^0.10.0","tsx":"^4.21.0","typescript":"^5.9.3","vitest":"^4.0.16"},"engines":{"node":">=22"},"gitHead":"6ae239383c0692b0dc96ea07de42d5b17d6ee2a3","_id":"@steipete/bird@0.8.0","_nodeVersion":"25.3.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-p7+a9a/olzf1Rxe56a51VMFoBlFQpFVosC5B8dB3rOT8UbSZ3Ey5eXCZoLDjKXDf8xKINvSmGtMAd3yjeE4Gcw==","shasum":"a32c34074c2799646b07bb8b25b379d59f57b870","tarball":"https://registry.npmjs.org/@steipete/bird/-/bird-0.8.0.tgz","fileCount":214,"unpackedSize":734908,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQClKq7DYsV5UMciYjoTdcrB6HDsxbxf1wV2V7MTN/ETUQIhAJA71JIUXRiyg7ig8Ii3chx04IgV+FXkfpbU0auPr4HP"}]},"_npmUser":{"name":"steipete","email":"steipete@gmail.com"},"directories":{},"maintainers":[{"name":"steipete","email":"steipete@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bird_0.8.0_1768807050046_0.5050229611728334"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-20T10:38:47.522Z","modified":"2026-01-19T07:17:30.336Z","0.1.0":"2025-12-20T10:38:48.322Z","0.2.0":"2025-12-26T19:47:49.819Z","0.3.0":"2025-12-26T19:52:35.802Z","0.4.0":"2025-12-26T21:41:23.746Z","0.4.1":"2025-12-31T19:19:28.752Z","0.5.1":"2026-01-01T16:55:13.213Z","0.6.0":"2026-01-05T03:27:00.217Z","0.7.0":"2026-01-12T09:46:42.355Z","0.8.0":"2026-01-19T07:17:30.221Z"},"description":"CLI tool for tweeting and replying via Twitter/X GraphQL API","maintainers":[{"name":"steipete","email":"steipete@gmail.com"}],"readme":"# bird 🐦 — fast X CLI for tweeting, replying, and reading\n\n`bird` is a fast X CLI for tweeting, replying, and reading via X/Twitter GraphQL (cookie auth).\n\n## Disclaimer\n\nThis project uses X/Twitter’s **undocumented** web GraphQL API (and cookie auth). X can change endpoints, query IDs,\nand anti-bot behavior at any time — **expect this to break without notice**.\n\n## Install\n\n```bash\nnpm install -g @steipete/bird\n# or\npnpm add -g @steipete/bird\n# or\nbun add -g @steipete/bird\n\n# one-shot (no install)\nbunx @steipete/bird whoami\n```\n\nHomebrew (macOS, prebuilt Bun binary):\n\n```bash\nbrew install steipete/tap/bird\n```\n\n## Quickstart\n\n```bash\n# Show the logged-in account\nbird whoami\n\n# Discover command help\nbird help whoami\n\n# Read a tweet (URL or ID)\nbird read https://x.com/user/status/1234567890123456789\nbird 1234567890123456789 --json\n\n# Thread + replies\nbird thread https://x.com/user/status/1234567890123456789\nbird replies 1234567890123456789\nbird replies 1234567890123456789 --max-pages 3 --json\nbird thread 1234567890123456789 --max-pages 3 --json\n\n# Search + mentions\nbird search \"from:steipete\" -n 5\nbird mentions -n 5\nbird mentions --user @steipete -n 5\n\n# User tweets (profile timeline)\nbird user-tweets @steipete -n 20\nbird user-tweets @steipete -n 50 --json\n\n# Bookmarks\nbird bookmarks -n 5\nbird bookmarks --folder-id 123456789123456789 -n 5 # https://x.com/i/bookmarks/\nbird bookmarks --all --json\nbird bookmarks --all --max-pages 2 --json\nbird bookmarks --include-parent --json\nbird unbookmark 1234567890123456789\nbird unbookmark https://x.com/user/status/1234567890123456789\n\n# Likes\nbird likes -n 5\n\n# News and trending topics (AI-curated from Explore tabs)\nbird news --ai-only -n 10\nbird news --sports -n 5\n\n# Lists\nbird list-timeline 1234567890 -n 20\nbird list-timeline https://x.com/i/lists/1234567890 --all --json\nbird list-timeline 1234567890 --max-pages 3 --json\n\n# Following (who you follow)\nbird following -n 20\nbird following --user 12345678 -n 10 # by user ID\n\n# Followers (who follows you)\nbird followers -n 20\nbird followers --user 12345678 -n 10 # by user ID\n\n# Refresh GraphQL query IDs cache (no rebuild)\nbird query-ids --fresh\n```\n\n## News & Trending\n\nFetch AI-curated news and trending topics from X's Explore page tabs:\n\n```bash\n# Fetch 10 news items from all tabs (default: For You, News, Sports, Entertainment)\nbird news -n 10\n\n# Fetch only AI-curated news (filters out regular trends)\nbird news --ai-only -n 20\n\n# Fetch from specific tabs\nbird news --news-only --ai-only -n 10\nbird news --sports -n 15\nbird news --entertainment --ai-only -n 5\n\n# Include related tweets for each news item\nbird news --with-tweets --tweets-per-item 3 -n 10\n\n# Combine multiple tab filters\nbird news --sports --entertainment -n 20\n\n# JSON output\nbird news --json -n 5\nbird news --json-full --ai-only -n 10 # includes raw API response\n```\n\nTab options (can be combined):\n- `--for-you` — Fetch from For You tab only\n- `--news-only` — Fetch from News tab only\n- `--sports` — Fetch from Sports tab only\n- `--entertainment` — Fetch from Entertainment tab only\n- `--trending-only` — Fetch from Trending tab only\n\nBy default, the command fetches from For You, News, Sports, and Entertainment tabs (Trending excluded to reduce noise). Headlines are automatically deduplicated across tabs.\n\n## Library\n\n`bird` can be used as a library (same GraphQL client as the CLI):\n\n```ts\nimport { TwitterClient, resolveCredentials } from '@steipete/bird';\n\nconst { cookies } = await resolveCredentials({ cookieSource: 'safari' });\nconst client = new TwitterClient({ cookies });\n\n// Search for tweets\nconst searchResult = await client.search('from:steipete', 50);\n\n// Fetch news and trending topics from all tabs (default: For You, News, Sports, Entertainment)\nconst newsResult = await client.getNews(10, { aiOnly: true });\n\n// Fetch from specific tabs with related tweets\nconst sportsNews = await client.getNews(10, {\n aiOnly: true,\n withTweets: true,\n tabs: ['sports', 'entertainment']\n});\n```\n\nAccount details (About profile):\n\n```ts\nconst aboutResult = await client.getUserAboutAccount('steipete');\nif (aboutResult.success && aboutResult.aboutProfile) {\n console.log(aboutResult.aboutProfile.accountBasedIn);\n}\n```\n\nFields:\n- `accountBasedIn`\n- `source`\n- `createdCountryAccurate`\n- `locationAccurate`\n- `learnMoreUrl`\n\n## Commands\n\n- `bird tweet \"\"` — post a new tweet.\n- `bird reply \"\"` — reply to a tweet using its ID or URL.\n- `bird help [command]` — show help (or help for a subcommand).\n- `bird query-ids [--fresh] [--json]` — inspect or refresh cached GraphQL query IDs.\n- `bird home [-n count] [--following] [--json] [--json-full]` — fetch your home timeline (For You) or Following feed.\n- `bird read [--json]` — fetch tweet content as text or JSON.\n- `bird [--json]` — shorthand for `read` when only a URL or ID is provided.\n- `bird replies [--all] [--max-pages n] [--cursor string] [--delay ms] [--json]` — list replies to a tweet.\n- `bird thread [--all] [--max-pages n] [--cursor string] [--delay ms] [--json]` — show the full conversation thread.\n- `bird search \"\" [-n count] [--all] [--max-pages n] [--cursor string] [--json]` — search for tweets matching a query; `--max-pages` requires `--all` or `--cursor`.\n- `bird mentions [-n count] [--user @handle] [--json]` — find tweets mentioning a user (defaults to the authenticated user).\n- `bird user-tweets <@handle> [-n count] [--cursor string] [--max-pages n] [--delay ms] [--json]` — get tweets from a user's profile timeline.\n- `bird bookmarks [-n count] [--folder-id id] [--all] [--max-pages n] [--cursor string] [--expand-root-only] [--author-chain] [--author-only] [--full-chain-only] [--include-ancestor-branches] [--include-parent] [--thread-meta] [--sort-chronological] [--json]` — list your bookmarked tweets (or a specific bookmark folder); expansion flags control thread context; `--max-pages` requires `--all` or `--cursor`.\n- `bird unbookmark ` — remove one or more bookmarks by tweet ID or URL.\n- `bird likes [-n count] [--all] [--max-pages n] [--cursor string] [--json] [--json-full]` — list your liked tweets; `--max-pages` requires `--all` or `--cursor`.\n- `bird news [-n count] [--ai-only] [--with-tweets] [--tweets-per-item n] [--for-you] [--news-only] [--sports] [--entertainment] [--trending-only] [--json]` — fetch news and trending topics from X's Explore tabs.\n- `bird trending` — alias for `news` command.\n- `bird lists [--member-of] [-n count] [--json]` — list your lists (owned or memberships).\n- `bird list-timeline [-n count] [--all] [--max-pages n] [--cursor string] [--json]` — get tweets from a list timeline; `--max-pages` implies `--all`.\n- `bird following [--user ] [-n count] [--cursor string] [--all] [--max-pages n] [--json]` — list users that you (or another user) follow; `--max-pages` requires `--all`.\n- `bird followers [--user ] [-n count] [--cursor string] [--all] [--max-pages n] [--json]` — list users that follow you (or another user); `--max-pages` requires `--all`.\n- `bird about <@handle> [--json]` — get account origin and location information for a user.\n- `bird whoami` — print which Twitter account your cookies belong to.\n- `bird check` — show which credentials are available and where they were sourced from.\n\nBookmarks flags:\n- `--expand-root-only`: expand threads only when the bookmark is a root tweet.\n- `--author-chain`: keep only the bookmarked author's connected self-reply chain.\n- `--author-only`: include all tweets from the bookmarked author within the thread.\n- `--full-chain-only`: keep the entire reply chain connected to the bookmarked tweet (all authors).\n- `--include-ancestor-branches`: include sibling branches for ancestors when using `--full-chain-only`.\n- `--include-parent`: include the direct parent tweet for non-root bookmarks.\n- `--thread-meta`: add thread metadata fields to each tweet.\n- `--sort-chronological`: sort output globally oldest to newest (default preserves bookmark order).\n\nGlobal options:\n- `--auth-token `: set the `auth_token` cookie manually.\n- `--ct0 `: set the `ct0` cookie manually.\n- `--cookie-source `: choose browser cookie source (repeatable; order matters).\n- `--chrome-profile `: Chrome profile name for cookie extraction (e.g., `Default`, `Profile 2`).\n- `--chrome-profile-dir `: Chrome/Chromium profile directory or cookie DB path for cookie extraction.\n- `--firefox-profile `: Firefox profile for cookie extraction.\n- `--cookie-timeout `: cookie extraction timeout for keychain/OS helpers (milliseconds).\n- `--timeout `: abort requests after the given timeout (milliseconds).\n- `--quote-depth `: max quoted tweet depth in JSON output (default: 1; 0 disables).\n- `--plain`: stable output (no emoji, no color).\n- `--no-emoji`: disable emoji output.\n- `--no-color`: disable ANSI colors (or set `NO_COLOR=1`).\n- `--media `: attach media file (repeatable, up to 4 images or 1 video).\n- `--alt `: alt text for the corresponding `--media` (repeatable).\n\n## Authentication (GraphQL)\n\nGraphQL mode uses your existing X/Twitter web session (no password prompt). It sends requests to internal\nX endpoints and authenticates via cookies (`auth_token`, `ct0`).\n\nWrite operations:\n- `tweet`/`reply` primarily use GraphQL (`CreateTweet`).\n- If GraphQL returns error `226` (“automated request”), `bird` falls back to the legacy `statuses/update.json` endpoint.\n\n`bird` resolves credentials in this order:\n\n1. CLI flags: `--auth-token`, `--ct0`\n2. Environment variables: `AUTH_TOKEN`, `CT0` (fallback: `TWITTER_AUTH_TOKEN`, `TWITTER_CT0`)\n3. Browser cookies via `@steipete/sweet-cookie` (override via `--cookie-source` order)\n\nBrowser cookie sources:\n- Safari: `~/Library/Cookies/Cookies.binarycookies` (fallback: `~/Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies`)\n- Chrome: `~/Library/Application Support/Google/Chrome//Cookies`\n- Firefox: `~/Library/Application Support/Firefox/Profiles//cookies.sqlite`\n - For Chromium variants (Arc/Brave/etc), pass a profile directory or cookie DB via `--chrome-profile-dir`.\n\n## Config (JSON5)\n\nConfig precedence: CLI flags > env vars > project config > global config.\n\n- Global: `~/.config/bird/config.json5`\n- Project: `./.birdrc.json5`\n\nExample `~/.config/bird/config.json5`:\n\n```json5\n{\n // Cookie source order for browser extraction (string or array)\n cookieSource: [\"firefox\", \"safari\"],\n chromeProfileDir: \"/path/to/Chromium/Profile\",\n firefoxProfile: \"default-release\",\n cookieTimeoutMs: 30000,\n timeoutMs: 20000,\n quoteDepth: 1\n}\n```\n\nEnvironment shortcuts:\n- `BIRD_TIMEOUT_MS`\n- `BIRD_COOKIE_TIMEOUT_MS`\n- `BIRD_QUOTE_DEPTH`\n\n## Output\n\n- `--json` prints raw tweet objects for read/replies/thread/search/mentions/user-tweets/bookmarks/likes.\n- When using `--json` with pagination (`--all`, `--cursor`, `--max-pages`, or for `user-tweets` when `-n > 20`), output is `{ tweets, nextCursor }`.\n- `read` returns full text for Notes and Articles when present.\n- Use `--plain` for stable, script-friendly output (no emoji, no color).\n\n### JSON Schema\n\nWhen using `--json`, tweet objects include:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | string | Tweet ID |\n| `text` | string | Full tweet text (includes Note/Article content when present) |\n| `author` | object | `{ username, name }` |\n| `authorId` | string? | Author's user ID |\n| `createdAt` | string | Timestamp |\n| `replyCount` | number | Number of replies |\n| `retweetCount` | number | Number of retweets |\n| `likeCount` | number | Number of likes |\n| `conversationId` | string | Thread conversation ID |\n| `inReplyToStatusId` | string? | Parent tweet ID (present if this is a reply) |\n| `quotedTweet` | object? | Embedded quote tweet (same schema; depth controlled by `--quote-depth`) |\n\nWhen using `--json` with `following`/`followers`, user objects include:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | string | User ID |\n| `username` | string | Username/handle |\n| `name` | string | Display name |\n| `description` | string? | User bio |\n| `followersCount` | number? | Followers count |\n| `followingCount` | number? | Following count |\n| `isBlueVerified` | boolean? | Blue verified flag |\n | `profileImageUrl` | string? | Profile image URL |\n | `createdAt` | string? | Account creation timestamp |\n\nWhen using `--json` with `news`/`trending`, news objects include:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `id` | string | Unique identifier for the news item |\n| `headline` | string | News headline or trend title |\n| `category` | string? | Category (e.g., \"AI · Technology\", \"Trending\", \"News\") |\n| `timeAgo` | string? | Relative time (e.g., \"2h ago\") |\n| `postCount` | number? | Number of posts |\n| `description` | string? | Item description |\n| `url` | string? | URL to the trend or news article |\n| `tweets` | array? | Related tweets (only when `--with-tweets` is used) |\n| `_raw` | object? | Raw API response (only when `--json-full` is used) |\n\n\n## Query IDs (GraphQL)\n\nX rotates GraphQL “query IDs” frequently. Each GraphQL operation is addressed as:\n\n- `operationName` (e.g. `TweetDetail`, `CreateTweet`)\n- `queryId` (rotating ID baked into X’s web client bundles)\n\n`bird` ships with a baseline mapping in `src/lib/query-ids.json` (copied into `dist/` on build). At runtime,\nit can refresh that mapping by scraping X’s public web client bundles and caching the result on disk.\n\nRuntime cache:\n- Default path: `~/.config/bird/query-ids-cache.json`\n- Override path: `BIRD_QUERY_IDS_CACHE=/path/to/file.json`\n- TTL: 24h (stale cache is still used, but marked “not fresh”)\n\nAuto-recovery:\n- On GraphQL `404` (query ID invalid), `bird` forces a refresh once and retries.\n- For `TweetDetail`/`SearchTimeline`, `bird` also rotates through a small set of known fallback IDs to reduce\n breakage while refreshing.\n\nRefresh on demand:\n\n```bash\nbird query-ids --fresh\n```\n\nExit codes:\n- `0`: success\n- `1`: runtime error (network/auth/etc)\n- `2`: invalid usage/validation (e.g. bad `--user` handle)\n\n## Version\n\n`bird --version` prints `package.json` version plus current git sha when available, e.g. `0.3.0 (3df7969b)`.\n\n## Media uploads\n\n- Attach media with `--media` (repeatable) and optional `--alt` per item.\n- Up to 4 images/GIFs, or 1 video (no mixing). Supported: jpg, jpeg, png, webp, gif, mp4, mov.\n- Images/GIFs + 1 video supported (uploads via Twitter legacy upload endpoint + cookies; video may take longer to process).\n\nExample:\n\n```bash\nbird tweet \"hi\" --media img.png --alt \"desc\"\n```\n\n## Development\n\n```bash\ncd ~/Projects/bird\npnpm install\npnpm run build # dist/ + bun binary\npnpm run build:dist # dist/ only\npnpm run build:binary\n\npnpm run dev tweet \"Test\"\npnpm run dev -- --plain check\npnpm test\npnpm run lint\n```\n\n## Notes\n\n- GraphQL uses internal X endpoints and can be rate limited (429).\n- Query IDs rotate; refresh at runtime with `bird query-ids --fresh` (or update the baked baseline via `pnpm run graphql:update`).\n","readmeFilename":"README.md"}