{"_id":"@caixiaoshun/claudex","_rev":"12-046f20b1f619eb84afadc1ce0240d16d","name":"@caixiaoshun/claudex","dist-tags":{"latest":"1.0.12"},"versions":{"1.0.1":{"name":"@caixiaoshun/claudex","version":"1.0.1","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.1","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"2d42c1c782e2573848448f97d678cc7c851bbfc1","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.1.tgz","fileCount":31,"integrity":"sha512-ooqVx7KfgVtFXSm3v7+PH3ilSnwWAe83k1+XdzKIXIkSGOPiuPOklw6VCyiwOmD8kM/qXiMrtxKkX95K4xycIg==","signatures":[{"sig":"MEUCIDj7NgEtXzI/tjzIwJmlB4AOZPmFjHw2+s+RTJxa6vvzAiEAzj15lA4PEXepeG9Mrw+KY+glBCyye1PlXybU2gNOyOA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":188448},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"00001b46044791a8f4028b463fc8cb102c878751","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.1","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.1_1773499519887_0.7206810445674994","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@caixiaoshun/claudex","version":"1.0.2","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.2","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"baf49cd13b6c7e52de807825a45a600df4ad9131","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.2.tgz","fileCount":31,"integrity":"sha512-umhLgoJH5FEytZYv1l6onWDTQzTXkqeHP0XZRC94+W0XVME+T5GBrYixPHgBWTrUjapbMmjKWijDwE5PbGKZBw==","signatures":[{"sig":"MEYCIQChOdcCDHx5Y/4Yt0gLBPCoufzz68WS+aJVn1gBVzXqTQIhAIlHvg4oS81rlupcZXZ3mrrrNSg2zee8iS9HhQV+yrpw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208962},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"dbaf7a11f38d1815921a83f49bb790b86f0a9732","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.2_1773543006011_0.7619276389517613","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@caixiaoshun/claudex","version":"1.0.3","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.3","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"451302c8f57d2ac993946e3bf8524ce27d83e5d5","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.3.tgz","fileCount":35,"integrity":"sha512-XgIt0GVu5o2kuHtWkCIA156eoK1Z5DDcOGNNLBdiAR/ZNvsK0fxqAWCWqIcNKQSG4rKhO7KXmlpQT9Udwqmrdw==","signatures":[{"sig":"MEYCIQD6RTzfldVuPkaRCLBI+/sg1ZdsECyyAy19VsDEy7rAxQIhAI1+C2kkKgGklrmHv0kM9B5gKa+9ruUqJt4f4jULlmj6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":222968},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"7445418b6e262124856ae2d3e164e1a90c4d227d","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.1","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.3_1773544357455_0.38270659990983735","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@caixiaoshun/claudex","version":"1.0.4","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.4","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"2e1420bab0f164c1a6d7c72f36d5b22c67f7174f","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.4.tgz","fileCount":35,"integrity":"sha512-mEg8MRnDhh2dlPG2i5ACgi+fNZLE791qdHnBtr/7Lt4vZNZjyyQCdEOvHArhrImIuUWOM4RYzd9G44snd+Qrkw==","signatures":[{"sig":"MEUCIGHvGsKV698NiDfnttuSLLFDHmRZx0HJ01U4dr/LerZzAiEAqQJx9lR7E3PdlggkefGq+XDqw3jDPHWZLXtK8Kg7r4I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":226467},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"52d3f0d2ede9b5709816fd49939a8814a0d191bb","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.4_1773546516755_0.04812100858894319","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@caixiaoshun/claudex","version":"1.0.5","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.5","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"cb1a19bd288e70073078d667b59386d6f8a3d2d1","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.5.tgz","fileCount":35,"integrity":"sha512-OYKpDj1eiW+Q0RWJnIQbiOmJ/JwWuLGcPoc9JMZZIU80M0KIljt2vjxqm/N0fa473Fy4DoHNzCTEi5LmE193PQ==","signatures":[{"sig":"MEQCIFls0eGqNI50tyhzYml5NjHjhBGYL86KDRtpI0AodWvqAiBROc5zeMj1+Vej8cKOjdcaRZa0sMBtUbH1CIboxT+jkA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":262969},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"855b27e35490a6dc48e5f751367530c7fc85488c","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.1","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.5_1773549759138_0.6870502349871623","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@caixiaoshun/claudex","version":"1.0.6","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.6","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"12302b78cdba1acdcf33d948218eca23ebd6fa84","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.6.tgz","fileCount":43,"integrity":"sha512-fXgBc2wg6sICfOevp40gGkRIB1+rtipC/JGS4rlJLxvkTq+CFtAHjzd1p1PpIH5HrVQPzb/md8Thyb5CBQOGpQ==","signatures":[{"sig":"MEYCIQDIROZI8o0i3tOnk7VX3c4s7cE2Na/lhdTQmYV7sbNOYQIhAKvLvqZnASgCZRQ37lATG2Xjed6U0mbddqaNnNu5mT5L","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":300325},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"35a0147846aeb20b1f5fe82abee52518088e78d1","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.1","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.6_1773551132082_0.40132470921376995","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@caixiaoshun/claudex","version":"1.0.7","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.7","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"0a44c30d327608d6b71aeaa0c6e699a06a72e34b","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.7.tgz","fileCount":43,"integrity":"sha512-jcy1BwVc32d6kTzdGm1bG9eHtZ96Rryf5HQ+C8AxwAFAkWVYpFWmT3b56ck78YgEPiZTBReR4IMRUxVnPg4DmA==","signatures":[{"sig":"MEUCICuIxlas2/IUYSG7YsV800VX8UruHQQYewjWihjb5xgSAiEAm3ygzrT7sZmPv9REKlDTMBmso+iku5+prdxKdU2MMo4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":289394},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"4ee26694e166efff0b1afe72f13786988e866f5a","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.1","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.7_1773553155515_0.4317765010742085","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@caixiaoshun/claudex","version":"1.0.8","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.8","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"db610dfec05475975de926965e83b7ae8b55383a","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.8.tgz","fileCount":43,"integrity":"sha512-jXE/J8oa3xw1BQSE5RlSm963Ow2aLYpBQ4T1HORZuhhD8+SCyMTBvfCj9E/K59t9MlXxsnvraMCcpWDBjTfoXQ==","signatures":[{"sig":"MEQCIF1erlME2og3SvEwGHNfuGjUrFDFsgG+/zaVJNrarfq+AiAXzBEHAjmNAbqYshlJpT1V+y4WFfHIVzgL3yfXAz8mVA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":318202},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"afa4876a857707303b901e2edca768a58767198c","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.1","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.8_1773553954140_0.8320171305164141","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@caixiaoshun/claudex","version":"1.0.9","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.9","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"3f41dcce06d34248571627ca1b31e1586eabdf5e","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.9.tgz","fileCount":43,"integrity":"sha512-lCspt85hpKJffQHGN/V5T/Mg7+KZtnaiDXtLtKuBkZSZrEd04xemFU7iFoLkz1tDdO7pIZiY0N5aGH7ks9y1+Q==","signatures":[{"sig":"MEUCIQCD0IFxovnnCD684EUwa2Kon8SEwJoSQX1Igc1MAK1qzwIgYaLU/6yvGVnmZNz+Kwr3Ahav9s6nhnAaUIR+wXQqSuw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":331494},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"02d4aba43165d4f82d0a14bb3aef83c2c9bd4714","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.9_1773554742999_0.14458281283740138","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"@caixiaoshun/claudex","version":"1.0.10","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.10","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"8a954619ff175eecb377fe4eab9fd052ec8a2bc4","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.10.tgz","fileCount":43,"integrity":"sha512-14VGaKAgwPjjIsYIoieZ8JaiV+MkyL3+flehJbxqzP3HDdi1FAMA0ooEED61DFEpaZ48mBhXp1/wo8dHWyLJLg==","signatures":[{"sig":"MEQCIBj5Q+K3XFheH22ptd1z8mPb8zVej8vGo/TLScUdpIAxAiA1MKKLvTwXw+2IWpuJYmOjpAQEE5unCq/quZ21lsDw8g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":340566},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ba8e188c842436a050aacfd16a313af5cdd7f90d","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.1","_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.10_1773555369252_0.4100515929456663","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"@caixiaoshun/claudex","version":"1.0.11","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","_id":"@caixiaoshun/claudex@1.0.11","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"bin":{"claudex":"dist/src/index.js"},"dist":{"shasum":"3ed7b0351de64f16cea843c2bf4b01edc51e458b","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.11.tgz","fileCount":47,"integrity":"sha512-zOwkgaObUrxJc9wt096Ib8QtmQMXdp3POzADGDPc/IhfsZnRYK48J1l51y+qax4Vz/KdjZiG8fW9qp0+sZhlHA==","signatures":[{"sig":"MEUCIHmKP5OGoIfxdyMV8QeD9To1gW/Jv80zJbT5TBafBWuHAiEAp7xOFsjfzQU1HHVbInrR+lrklzTJN0GzugEapuLWaIo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":402306},"main":"dist/src/index.js","types":"./dist/src/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"04164122bf0c4e7846e7170d56d2fbd0a4b6bbca","scripts":{"dev":"tsc --watch","lint":"tsc --noEmit","test":"npm run build && node --test dist/tests/*.test.js","build":"tsc","start":"node dist/src/index.js"},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"_npmVersion":"10.8.2","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","directories":{},"_nodeVersion":"20.20.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/claudex_1.0.11_1773577157252_0.7356023936472991","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"@caixiaoshun/claudex","version":"1.0.12","description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","main":"dist/src/index.js","bin":{"claudex":"dist/src/index.js"},"scripts":{"build":"tsc","start":"node dist/src/index.js","dev":"tsc --watch","test":"npm run build && node --test dist/tests/*.test.js","lint":"tsc --noEmit","test:live:e2e":"powershell -ExecutionPolicy Bypass -File scripts/run-live-e2e.ps1"},"keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"author":{"name":"caixiaoshun"},"license":"GPL-3.0","engines":{"node":">=18.0.0"},"devDependencies":{"@modelcontextprotocol/sdk":"^1.27.1","@types/node":"^25.5.0","typescript":"^5.9.3","zod":"^4.1.12"},"_id":"@caixiaoshun/claudex@1.0.12","gitHead":"11faf96b0259fd6eab898471c8581dded36d4d90","types":"./dist/src/index.d.ts","_nodeVersion":"20.20.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-a2rqTfZH7pbswARlZoFELukVEijI/OzJhsOlDs2BdUgEhi6GWkHIwHdJoLpxTvT5aO46hNUiDdZ/Sxcomi/G7w==","shasum":"f26d7cc2c8c24d09dc9e654e381a8c2080f0a74f","tarball":"https://registry.npmjs.org/@caixiaoshun/claudex/-/claudex-1.0.12.tgz","fileCount":47,"unpackedSize":432499,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIE9Pi12BsuWmER4nGmvU+5pQc07vNLEk8OuvIUb3wKEFAiEA0FwnTf9RO9ef8O+5AJk1SsOVoloI1pLMrnFYxQNZxx0="}]},"_npmUser":{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"},"directories":{},"maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/claudex_1.0.12_1774431788809_0.48162104657241156"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-14T14:45:19.793Z","modified":"2026-03-25T09:43:09.092Z","1.0.1":"2026-03-14T14:45:20.033Z","1.0.2":"2026-03-15T02:50:06.152Z","1.0.3":"2026-03-15T03:12:37.621Z","1.0.4":"2026-03-15T03:48:36.926Z","1.0.5":"2026-03-15T04:42:39.289Z","1.0.6":"2026-03-15T05:05:32.253Z","1.0.7":"2026-03-15T05:39:15.652Z","1.0.8":"2026-03-15T05:52:34.303Z","1.0.9":"2026-03-15T06:05:43.151Z","1.0.10":"2026-03-15T06:16:09.476Z","1.0.11":"2026-03-15T12:19:17.395Z","1.0.12":"2026-03-25T09:43:08.970Z"},"author":{"name":"caixiaoshun"},"license":"GPL-3.0","keywords":["claude","codex","chatgpt","proxy","anthropic","openai","ai","bridge"],"description":"Bridge Claude Code to ChatGPT Codex via local proxy — use your ChatGPT subscription with Claude Code","maintainers":[{"name":"caixiaoshun","email":"cs.shunzhang@foxmail.com"}],"readme":"<div align=\"center\">\n\n# ⚡ Claudex\n\n**Bridge Claude Code to ChatGPT Codex — use your ChatGPT subscription as the backend for Claude Code.**\n\n[![npm version](https://img.shields.io/npm/v/@caixiaoshun/claudex.svg)](https://www.npmjs.com/package/@caixiaoshun/claudex)\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n[![Node.js](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg)](https://nodejs.org/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue.svg)](https://www.typescriptlang.org/)\n\n</div>\n\n---\n\n## What is this?\n\n**Claudex** is a zero-dependency local proxy that lets you use [Claude Code](https://docs.anthropic.com/en/docs/claude-code) with your existing **ChatGPT Plus/Pro subscription** — no separate Anthropic API key needed.\n\nIt intercepts Claude Code's API requests (`POST /v1/messages` in Anthropic format), transforms them to the exact format the [Codex Responses API](https://chatgpt.com/backend-api/codex/responses) expects, and translates responses back to Anthropic format. Both streaming and non-streaming are fully supported.\n\n### Why?\n\n- You have a **ChatGPT Plus/Pro subscription** with Codex access included\n- You want to use **Claude Code's excellent CLI/IDE experience**\n- But Claude Code requires an **Anthropic API key** which costs extra\n- **Claudex bridges this gap** — one subscription, best of both worlds\n\n---\n\n## Installation\n\n```bash\nnpm install -g @caixiaoshun/claudex\n```\n\nOr clone and build from source:\n\n```bash\ngit clone https://github.com/caixiaoshun/claudex.git\ncd claudex\nnpm install\nnpm run build\n```\n\n---\n\n## Recent Updates\n\n- Startup logs now print the live Claude-to-GPT tier mapping directly, including an explicit `sonnet4.6 -> ...` line so it is obvious which GPT model Claude Code is really using.\n- The default `opus` / `sonnet` / `haiku` mapping has been refreshed to the current GPT-5.4 family: `gpt-5.4`, `gpt-5.4-mini`, and `gpt-5.4-nano`.\n- Dynamic model discovery is more reliable now: Claudex sends the Codex `client_version` hint when fetching `/codex/models`, and live discovery prefers GPT-5.4 family models before older Codex fallbacks.\n- Claude Code image inputs now work end to end. Anthropic image blocks are converted into Responses API `input_image` items for both remote URLs and base64 screenshots.\n- A real Windows Claude Code compatibility harness was added for live verification of print/json/stream mode, custom model overrides, `CLAUDE.md` memory, skills, slash commands, plugins, custom agents and subagents, todo/file workflows, hook triggering, MCP config/tools/resources/prompts, and session `resume` / `continue`.\n- Documentation was updated to reflect the refreshed mappings, the new startup visibility, the live compatibility audit, and the wider official Claude Code feature surface around automation and session handoff.\n\n---\n\n## Quick Start\n\n### Step 1: Bypass Claude Code Onboarding\n\nClaude Code requires onboarding to be completed. Run this once:\n\n```bash\nnode --eval \"\nconst fs = require('fs');\nconst path = require('path');\nconst file = path.join(require('os').homedir(), '.claude.json');\nlet config = {};\ntry { config = JSON.parse(fs.readFileSync(file, 'utf-8')); } catch {}\nconfig.hasCompletedOnboarding = true;\nfs.writeFileSync(file, JSON.stringify(config, null, 2));\nconsole.log('Onboarding bypassed');\n\"\n```\n\n### Step 2: Start the Claudex Proxy\n\n```bash\nclaudex\n```\n\nOn first run, your browser will open for ChatGPT OAuth login. After authorization, the proxy starts on port 4000 (default).\n\n### Step 3: Configure Claude Code\n\nSet these environment variables before running Claude Code:\n\n**macOS / Linux:**\n\n```bash\nexport ANTHROPIC_BASE_URL=http://localhost:4000\nexport ANTHROPIC_API_KEY=sk-ant-placeholder\n```\n\n**Windows (PowerShell):**\n\n```powershell\n$env:ANTHROPIC_BASE_URL = \"http://localhost:4000\"\n$env:ANTHROPIC_API_KEY = \"sk-ant-placeholder\"\n```\n\n**Windows (CMD):**\n\n```cmd\nset ANTHROPIC_BASE_URL=http://localhost:4000\nset ANTHROPIC_API_KEY=sk-ant-placeholder\n```\n\n### Step 4: Use Claude Code Normally\n\n```bash\nclaude \"Help me refactor this function\"\n```\n\nAll requests flow through the proxy to ChatGPT Codex.\n\n---\n\n## Credential Reuse\n\nIf you already have Codex CLI or opencode installed and logged in, you can skip the browser OAuth flow:\n\n```bash\nclaudex --reuse-codex\n```\n\nThis searches for existing credentials in:\n\n| Source | Path |\n|--------|------|\n| OpenAI Codex CLI | `~/.codex/auth.json` |\n| opencode | `~/.opencode/session.json` |\n| opencode v2 | `~/.opencode/auth/codex.json` |\n\nTo see which credential files are detected:\n\n```bash\nclaudex --list-sources\n```\n\n---\n\n## Windows E2E Verification\n\nTo validate a source checkout against a real Claude Code session on Windows:\n\n1. Build the project:\n\n```powershell\nnpm install\nnpm run build\n```\n\n2. Start the proxy with credential reuse and debug logging:\n\n```powershell\nclaudex --reuse-codex --debug\n```\n\n3. In a second PowerShell window, point Claude Code at the local proxy:\n\n```powershell\n$env:ANTHROPIC_BASE_URL = \"http://localhost:4000\"\n$env:ANTHROPIC_API_KEY = \"sk-ant-placeholder\"\n```\n\nIf Claude Code's local `WebFetch` tool fails on Windows with `unable to get local issuer certificate`, that is a local Node.js trust-store issue rather than a Claudex proxy issue. For a quick validation-only workaround, launch Claude Code with:\n\n```powershell\n$env:NODE_TLS_REJECT_UNAUTHORIZED = \"0\"\n```\n\nPrefer installing the correct enterprise/root certificate for a permanent fix.\n\n4. Run Claude Code and exercise the built-in tools with prompts such as:\n\n- `Run \"pwd\" and tell me the result.`\n- `Fetch https://example.com and summarize it.`\n- `Delegate a small subtask to another agent and return its summary.`\n- `Plan a small code change, ask me one multiple-choice clarification if needed, then exit plan mode for approval.`\n- `Create and maintain a todo list while doing a multi-step task.`\n- `Read a scratch file, make a small edit, and show the result.`\n\nSuccessful validation means the entire session completes with streamed output visible in Claude Code, tool results render normally, and the proxy debug log shows zero `Codex API error: 400` entries.\n\n---\n\n## Model Selection & Reasoning\n\n### Automatic Tier Mapping\n\nClaudex automatically maps Anthropic model names to the best available OpenAI model:\n\n| Claude Code sends | Claudex uses |\n|-------------------|--------------|\n| `claude-opus-*` | Highest capability (currently `gpt-5.4`) |\n| `claude-*-sonnet-*` | Balanced/default (currently `gpt-5.4-mini`) |\n| `claude-*-haiku-*` | Fastest/lightest (currently `gpt-5.4-nano`) |\n\nWhen live model discovery succeeds, Claudex prefers the current GPT-5.4 family first and then falls back to older Codex-specialized models only if those newer models are unavailable.\n\n### Override at Startup\n\n```bash\nclaudex --model gpt-5.4-mini --reasoning high\n```\n\n### Override via Environment Variables\n\n```bash\nCODEX_MODEL=gpt-5.4-mini CODEX_REASONING=high claudex\n```\n\n### Override at Runtime\n\n```bash\ncurl -X POST http://localhost:4000/claudex/config \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\": \"gpt-5.4-mini\", \"reasoning\": \"high\"}'\n```\n\n### Via Claude Code's `/model` Command\n\nUse the `claudex:<model>:<reasoning>` convention:\n\n```\n/model claudex:gpt-5.4-mini:high\n```\n\nThe reasoning parameter is optional:\n\n```\n/model claudex:gpt-5.4\n```\n\n### Reasoning Intensity Levels\n\n| Level | Description |\n|-------|-------------|\n| `low` | Minimal reasoning, fastest responses |\n| `medium` | Balanced reasoning (default if thinking is enabled) |\n| `high` | Maximum reasoning depth |\n\n---\n\n## Dynamic Model Discovery\n\nOn startup, Claudex fetches the live model list from the Codex API (`chatgpt.com/backend-api/codex/models`) and caches it. If the endpoint is unreachable, it falls back to a hardcoded default list.\n\n### View Available Models\n\n```bash\ncurl http://localhost:4000/claudex/models\n```\n\n### Refresh Model List\n\n```bash\n# Via API\ncurl -X POST http://localhost:4000/claudex/models/refresh\n\n# Via CLI\nclaudex --refresh-models\n```\n\n### Automatic Refresh\n\nModels are refreshed automatically every hour by default. Configure with:\n\n```bash\nCODEX_MODEL_REFRESH_INTERVAL=1800000 claudex  # 30 minutes\n```\n\nIf your network to `chatgpt.com` is flaky, you can also tune upstream response retries:\n\n```bash\nCODEX_API_FETCH_RETRIES=5 CODEX_API_FETCH_RETRY_DELAY_MS=1500 claudex\n```\n\n---\n\n## All API Endpoints\n\n| Method | Path | Description |\n|--------|------|-------------|\n| `POST` | `/v1/messages` | Anthropic Messages API proxy (main endpoint) |\n| `GET` | `/claudex/models` | List available Codex models and tier mapping |\n| `POST` | `/claudex/models/refresh` | Re-fetch the model list from Codex API |\n| `POST` | `/claudex/config` | Update runtime model/reasoning configuration |\n| `GET` | `/health` | Health check |\n\n### Examples\n\n```bash\n# Health check\ncurl http://localhost:4000/health\n\n# List models\ncurl http://localhost:4000/claudex/models\n\n# Refresh models\ncurl -X POST http://localhost:4000/claudex/models/refresh\n\n# Update config\ncurl -X POST http://localhost:4000/claudex/config \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"model\": \"gpt-5.4-mini\", \"reasoning\": \"medium\"}'\n\n# Send a message (Anthropic format)\ncurl -X POST http://localhost:4000/v1/messages \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-api-key: placeholder\" \\\n  -d '{\n    \"model\": \"claude-3-5-sonnet-20241022\",\n    \"max_tokens\": 1024,\n    \"messages\": [{\"role\": \"user\", \"content\": \"Hello!\"}]\n  }'\n```\n\n---\n\n## CLI Flags\n\n```\nUsage:\n  claudex [options]\n\nOptions:\n  -p, --port <port>              Port to listen on (default: 4000)\n  --model <model>                OpenAI model to use (e.g. gpt-5.4-mini)\n  --reasoning <low|medium|high>  Reasoning intensity level\n  --reuse-codex                  Import credentials from existing Codex/opencode install\n  --list-sources                 List detected external credential sources and exit\n  --refresh-models               Refresh the model list from the Codex API and exit\n  --debug                        Enable debug logging\n  -h, --help                     Show help message\n  -v, --version                  Show version\n```\n\n---\n\n## Environment Variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `CODEX_MODEL` | OpenAI model to use | Auto-mapped from Claude Code model |\n| `CODEX_REASONING` | Reasoning intensity (`low`, `medium`, `high`) | Auto |\n| `CODEX_API_ENDPOINT` | Override Codex API endpoint | `https://chatgpt.com/backend-api/codex/responses` |\n| `CODEX_MODEL_REFRESH_INTERVAL` | Model refresh interval in ms | `3600000` (1 hour) |\n| `PROXY_PORT` | Default port (overridden by `--port`) | `4000` |\n\n---\n\n## Architecture\n\n```\nClaude Code  →  POST /v1/messages (Anthropic format)\n     │\n     ▼\n  Claudex Proxy (localhost:4000)\n     │\n     ├─ Strip Anthropic-specific fields (betas, metadata, thinking, etc.)\n     ├─ Normalize tool schemas recursively at every nesting level\n     ├─ Convert tools: enforce backend-compatible required keys, force additionalProperties=false on object schemas, strict=true\n     ├─ Map model: opus→max, sonnet→balanced, haiku→mini\n     ├─ Build Codex request: model, instructions, input, tools, store=false\n     │\n     ▼\n  ChatGPT Codex API (chatgpt.com/backend-api/codex/responses)\n     │\n     ▼\n  Claudex converts response back to Anthropic format\n     │\n     ▼\n  Claude Code receives Anthropic-format response\n```\n\n### Key Implementation Details\n\n**Tool Schema Normalization:** Tool parameter schemas are normalized bottom-up at **every schema node** before forwarding to the Codex API. Claudex first recurses through nested `properties`, schema-valued `additionalProperties`, `items`, `anyOf`, rejected combinators such as `oneOf` / `allOf`, plus unsupported schema containers such as `patternProperties`, `$defs` / `definitions`, `not`, and conditionals (`if` / `then` / `else`), then repairs the current node. Missing `type` is inferred as `object` when `properties` exist, `array` when `items` exist, and `object` otherwise. At every object node with `properties`, `required` is normalized to the exact set of Codex-counted property keys: regular fields stay required, while pure record/map containers (object schemas that only expose schema-valued `additionalProperties`) and stripped empty object shells (for example, properties left behind after `oneOf` / `allOf` are removed) stay optional because Codex rejects them in `required`. `additionalProperties` is forced to `false` on every non-record object node. After normalization, only accepted JSON Schema keywords (`type`, `description`, `properties`, `required`, `additionalProperties`, `items`, `anyOf`, `enum`, `const`, `default`, `nullable`, `title`) are kept in the final payload. Unsupported fields such as `format`, `$schema`, `$id`, `$ref`, `examples`, `pattern`, `minLength`, `maxLength`, `contentEncoding`, `contentMediaType`, `patternProperties`, `$defs`, `definitions`, `if`, `then`, `else`, `oneOf`, and `allOf` are stripped before the request is sent.\n\n**Field Stripping:** Only whitelisted top-level fields are forwarded to Codex: `model`, `instructions`, `input`, `tools`, `tool_choice`, `parallel_tool_calls`, `reasoning`, `store`, `stream`, `include`, `service_tier`, `prompt_cache_key`, and `text`. Everything else is stripped before the request is sent.\n\n**Tool History Conversion:** Multi-turn Claude tool transcripts are converted into Codex-compatible top-level `input` items. Assistant `tool_use` blocks become standalone `function_call` items with a preserved `call_id`, and user `tool_result` blocks become standalone `function_call_output` items. Claudex intentionally omits `function_call.id` when replaying history, because Codex rejects Claude-style `call_*` IDs in that field.\n\n**SSE Streaming:** Claudex now always talks to Codex with `stream: true`, because the Codex backend rejects non-streaming requests. Anthropic streaming requests are forwarded as SSE, while Anthropic non-streaming requests are aggregated from the Codex SSE stream back into a normal JSON message. All Codex SSE event types are handled: `response.created`, `response.output_text.delta`, `response.output_text.done`, `response.output_item.added`, `response.output_item.done`, `response.completed`, `response.failed`, `response.incomplete`, `response.reasoning_summary_text.delta`, `response.reasoning_text.delta`, `response.reasoning_summary_part.added`.\n\n**Authentication:** Uses the same OAuth PKCE flow as opencode/Codex CLI. Token refresh is concurrent-safe — simultaneous expired-token requests share a single refresh promise.\n\n---\n\n## Project Structure\n\n```\nsrc/\n  index.ts       CLI entry point with all flags\n  server.ts      HTTP proxy server with route handling\n  converter.ts   Bidirectional Anthropic ↔ Codex format conversion\n  oauth.ts       OAuth PKCE flow with concurrent-safe token refresh\n  token.ts       Session persistence and external credential detection\n  models.ts      Dynamic model discovery and tier mapping\n  logger.ts      Structured console logging\ntests/\n  converter.test.ts  Format conversion tests\n  models.test.ts     Model discovery tests\n  token.test.ts      Credential parsing tests\n```\n\n---\n\n## Acknowledgments\n\n- [sst/opencode](https://github.com/sst/opencode) — Ground truth for Codex API integration\n- [openai/codex](https://github.com/openai/codex) — Codex API schema and SSE event types\n- [anthropics/claude-code](https://github.com/anthropics/claude-code) — Claude Code client\n- [cloverich/openclaw](https://github.com/cloverich/openclaw) — Cross-reference implementation\n\n---\n\n## License\n\n[GPL-3.0](LICENSE)\n","readmeFilename":"README.md"}