diff --git a/LICENSE b/LICENSE index 3778c69..8722f40 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ MIT License Copyright (c) 2026 codex-with-chatgpt contributors -Copyright (c) 2026 Claude to Codex contributors +Copyright (c) 2026 Chat to Codex contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.id.md b/README.id.md index 9edf14d..c6e9ca0 100644 --- a/README.id.md +++ b/README.id.md @@ -1,4 +1,4 @@ -# Claude to Codex (C2C) +# Chat to Codex (C2C) [English](README.md) | **Bahasa Indonesia** | [简体中文](README.zh-CN.md) @@ -42,8 +42,8 @@ Semua capability yang tersedia untuk Claude bersifat read-only. Workspace didaft Persyaratan: Node.js ≥ 20, `git`, `cloudflared`, dan Claude Web dengan dukungan custom connector. ```bash -git clone https://github.com/willio/claude-to-codex.git -cd claude-to-codex +git clone https://github.com/willio/chat-to-codex.git +cd chat-to-codex pnpm install pnpm build node bin/c2c.js install # systemwide install: ~/.c2c (app + state + launcher) @@ -52,8 +52,8 @@ node bin/c2c.js install # systemwide install: ~/.c2c (app + state + launcher) Install Codex skill: ```bash -mkdir -p ~/.codex/skills/claude-to-codex -cp skill/SKILL.md ~/.codex/skills/claude-to-codex/ +mkdir -p ~/.codex/skills/chat-to-codex +cp skill/SKILL.md ~/.codex/skills/chat-to-codex/ ``` ### Hubungkan Claude @@ -178,7 +178,7 @@ Untuk kompatibilitas, `doctor --json` menggunakan `connectorRepair` sebagai fiel ## Kompatibilitas -Claude to Codex berawal dari ide dan arsitektur `codex-with-chatgpt`, kemudian berkembang menjadi implementasi independen. +Chat to Codex berawal dari ide dan arsitektur `codex-with-chatgpt`, kemudian berkembang menjadi implementasi independen. Arsitektur saat ini menggunakan satu connector Claude pada level instalasi untuk melayani banyak workspace Codex yang didaftarkan secara lokal. @@ -215,11 +215,11 @@ docs/ architecture, protocol, security and migration ## Credits -Claude to Codex dibangun di atas ide dan arsitektur dari [codex-with-chatgpt](https://github.com/XiaoDuoYa/codex-with-chatgpt) karya [@XiaoDuoYa](https://github.com/XiaoDuoYa). +Chat to Codex dibangun di atas ide dan arsitektur dari [codex-with-chatgpt](https://github.com/XiaoDuoYa/codex-with-chatgpt) karya [@XiaoDuoYa](https://github.com/XiaoDuoYa). Project ini kemudian berkembang menjadi implementasi independen untuk Claude Web, dengan tetap menjaga atribusi untuk karya upstream dan copyright MIT-nya di [LICENSE](LICENSE). -Claude to Codex adalah project komunitas dan tidak terafiliasi atau didukung oleh Anthropic maupun OpenAI. +Chat to Codex adalah project komunitas dan tidak terafiliasi atau didukung oleh Anthropic maupun OpenAI. ## License diff --git a/README.md b/README.md index 7216428..39b8b66 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# Claude to Codex (C2C) +# Chat to Codex (C2C) **English** | [Bahasa Indonesia](README.id.md) | [简体中文](README.zh-CN.md) -Use Claude Web to plan, reason, and review. Let Codex execute — connected through a secure, read-only MCP bridge. +Bring your AI chat sessions to Codex. Claude Web, ChatGPT, or any chat that speaks remote MCP plans, reasons, and reviews — Codex executes, connected through a secure, read-only MCP bridge. **No Claude API key. No reverse proxy.** Claude connects to an OAuth-protected remote MCP endpoint and reads only the workspace data it needs. @@ -13,6 +13,14 @@ Use Claude Web to plan, reason, and review. Let Codex execute — connected thro Based on [codex-with-chatgpt](https://github.com/XiaoDuoYa/codex-with-chatgpt). +## Multiple chat brains + +One installation serves several AI chats at once. Connect Claude Web, +ChatGPT (Plus — Developer mode → Connectors → Create → paste the `/mcp` +URL → OAuth → pairing code), or both: each holds its own token against +the installation and reads the same registered workspaces. None of them +can write, execute, or commit — Codex stays the only hands. + ## How it works ```text @@ -42,8 +50,8 @@ Every Claude-facing capability is read-only. Workspaces are registered locally b Requirements: Node.js ≥ 20, `git`, `cloudflared`, and Claude Web with custom connector support. ```bash -git clone https://github.com/willio/claude-to-codex.git -cd claude-to-codex +git clone https://github.com/willio/chat-to-codex.git +cd chat-to-codex pnpm install pnpm build node bin/c2c.js install # systemwide install: ~/.c2c (app + state + launcher) @@ -52,8 +60,8 @@ node bin/c2c.js install # systemwide install: ~/.c2c (app + state + launcher) Install the Codex skill: ```bash -mkdir -p ~/.codex/skills/claude-to-codex -cp skill/SKILL.md ~/.codex/skills/claude-to-codex/ +mkdir -p ~/.codex/skills/chat-to-codex +cp skill/SKILL.md ~/.codex/skills/chat-to-codex/ ``` ### Connect Claude — once @@ -103,6 +111,8 @@ c2c broker tunnel choose --mode named --zone A stable endpoint is recommended for the single connector you keep in Claude. Quick Tunnels remain useful for development and temporary testing. +Advanced: failover profiles. `--profile ` runs an isolated installation (own state, identity, connector) under `~/.c2c/profiles//` — e.g. a second Claude account on `c2c --profile backup broker start --tunnel`. + ## The loop ```text @@ -182,7 +192,7 @@ For compatibility, `doctor --json` exposes the canonical `connectorRepair` field ## Compatibility -Claude to Codex began from the ideas and architecture of `codex-with-chatgpt` and has since evolved into an independent implementation. +Chat to Codex began from the ideas and architecture of `codex-with-chatgpt` and has since evolved into an independent implementation. The current architecture uses one installation-level Claude connector serving multiple locally registered Codex workspaces. @@ -219,11 +229,11 @@ docs/ architecture, protocol, security and migration ## Credits -Claude to Codex builds on the original idea and architecture of [codex-with-chatgpt](https://github.com/XiaoDuoYa/codex-with-chatgpt) by [@XiaoDuoYa](https://github.com/XiaoDuoYa). +Chat to Codex builds on the original idea and architecture of [codex-with-chatgpt](https://github.com/XiaoDuoYa/codex-with-chatgpt) by [@XiaoDuoYa](https://github.com/XiaoDuoYa). The project has since diverged into an independent Claude Web implementation, while preserving attribution to the upstream work and its MIT copyright in [LICENSE](LICENSE). -Claude to Codex is an unofficial community project and is not affiliated with or endorsed by Anthropic or OpenAI. +Chat to Codex is an unofficial community project and is not affiliated with or endorsed by Anthropic or OpenAI. ## License diff --git a/README.zh-CN.md b/README.zh-CN.md index d185bb7..9981608 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,8 +1,8 @@ -# Claude to Codex (C2C) +# Chat to Codex (C2C) [English](README.md) | [Bahasa Indonesia](README.id.md) | **简体中文** -> Claude 负责思考,Codex 负责执行。 +> 把你的 AI 聊天会话带到 Codex。 ## 这是什么 @@ -30,8 +30,8 @@ Claude 不会获得写文件、删除文件、执行任意命令或提交代码 ## 安装 ```bash -git clone https://github.com/willio/claude-to-codex.git ~/claude-to-codex -cd ~/claude-to-codex +git clone https://github.com/willio/chat-to-codex.git ~/chat-to-codex +cd ~/chat-to-codex corepack pnpm install corepack pnpm build ``` diff --git a/docs/architecture.md b/docs/architecture.md index b14797c..340fc2c 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -30,7 +30,7 @@ ## Principles -- **Claude thinks. Codex works.** The bridge never re-implements a coding harness. +- **Bring your AI chat sessions to Codex.** The bridge never re-implements a coding harness. - **Conversation = control plane**: tiny `[C2C]` state messages (< 1 KB). - **MCP = data plane**: Claude pulls files/diffs/search results itself. - **Read-only by design**: no write/exec tools exist in V1 at all. diff --git a/docs/protocol.md b/docs/protocol.md index d3eddf4..a405d8d 100644 --- a/docs/protocol.md +++ b/docs/protocol.md @@ -40,7 +40,7 @@ GOAL: Implement dark mode. INSTRUCTION: -Inspect the connected workspace through Claude to Codex MCP. +Inspect the connected workspace through Chat to Codex MCP. Create an implementation plan for Codex. ``` @@ -171,7 +171,7 @@ Codex owns execution. You own high-level reasoning, planning and review. You have access to the current local workspace through the -"Claude to Codex" MCP connector. +"Chat to Codex" MCP connector. Rules: diff --git a/package.json b/package.json index aff269b..d2dfdfd 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "claude-to-codex", + "name": "chat-to-codex", "version": "0.1.0", "description": "Claude thinks. Codex works. Use Claude Web as the planning and review brain while keeping the Codex harness.", "type": "module", diff --git a/skill/SKILL.md b/skill/SKILL.md index 2e86f34..405b30e 100644 --- a/skill/SKILL.md +++ b/skill/SKILL.md @@ -1,16 +1,16 @@ --- -name: claude-to-codex +name: chat-to-codex description: > - Use Claude Web as the planning and review brain for Codex coding sessions while Codex keeps execution ownership. + Bring your AI chat sessions (Claude Web, ChatGPT) to Codex as the planning and review brain while Codex keeps execution ownership. --- -# Claude to Codex +# Chat to Codex -Claude thinks. Codex works. +Bring your AI chat sessions to Codex. ## Core boundary -- Claude may read the current workspace only through the C2C MCP connector. +- The chat brain (Claude Web, ChatGPT) may read the current workspace only through the C2C MCP connector. - Codex owns file edits, shell commands, git operations, tests, recovery, and all other mutation. - Never add a general-purpose write or command-execution MCP tool. - Never paste file contents, diffs, or long logs into Claude when Claude can retrieve them through MCP. diff --git a/src/broker/server.ts b/src/broker/server.ts index a837337..58327ac 100644 --- a/src/broker/server.ts +++ b/src/broker/server.ts @@ -24,7 +24,7 @@ import { import { WorkspaceRegistry, RegistryError } from "../workspaces/registry.js"; import { SessionRegistry } from "../workspaces/sessions.js"; -export const CONNECTOR_DISPLAY_NAME = "Claude to Codex"; +export const CONNECTOR_DISPLAY_NAME = "Chat to Codex"; export interface BrokerOptions { /** Defaults to the standard C2C state dir. */ diff --git a/src/cli/index.ts b/src/cli/index.ts index f4143d1..a861cad 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -159,7 +159,7 @@ async function ensureBridgeAndTunnel( program .name("c2c") - .description(`${PRODUCT_NAME} — Claude thinks. Codex works.`) + .description(`${PRODUCT_NAME} — Bring your AI chat sessions to Codex.`) .version(VERSION, "-v, --version") .option("--profile ", "operate an isolated installation (~/.c2c/profiles/)") .hook("preAction", () => { @@ -1162,7 +1162,7 @@ planCmd program .command("install") - .description("Install Claude to Codex systemwide under ~/.c2c: app, state migration, launcher, skill") + .description("Install Chat to Codex systemwide under ~/.c2c: app, state migration, launcher, skill") .option("--json", "machine-readable output", false) .action(async (opts: { json: boolean }) => { try { @@ -1214,7 +1214,7 @@ program } // 4. Codex skill - const skillDir = path.join(os.homedir(), ".codex", "skills", "claude-to-codex"); + const skillDir = path.join(os.homedir(), ".codex", "skills", "chat-to-codex"); fs.mkdirSync(skillDir, { recursive: true, mode: 0o755 }); fs.copyFileSync(path.join(appRoot, "skill", "SKILL.md"), path.join(skillDir, "SKILL.md")); diff --git a/src/config/endpoint.ts b/src/config/endpoint.ts index a9e38e1..f131c34 100644 --- a/src/config/endpoint.ts +++ b/src/config/endpoint.ts @@ -14,7 +14,7 @@ export const CHATGPT_PLUGINS_URL = CONNECTOR_SETTINGS_URL; /** @deprecated Use CREATE_CONNECTOR_URL. */ export const CHATGPT_CREATE_CONNECTOR_URL = CREATE_CONNECTOR_URL; -export const DEFAULT_CONNECTOR_NAME = "Claude to Codex"; +export const DEFAULT_CONNECTOR_NAME = "Chat to Codex"; export interface LastEndpoint { workspaceId: string; diff --git a/src/config/paths.ts b/src/config/paths.ts index 2c936c4..27a1e92 100644 --- a/src/config/paths.ts +++ b/src/config/paths.ts @@ -2,7 +2,7 @@ import os from "node:os"; import path from "node:path"; import fs from "node:fs"; -// The directory name predates the product rename to "Claude to Codex (C2C)" +// The directory name predates the product rename to "Chat to Codex (C2C)" // and is kept as an identifier so existing installations keep their state. export const STATE_DIR_NAME = "codex-with-claude"; export const LEGACY_STATE_DIR_NAME = "codex-with-chatgpt"; diff --git a/src/version.ts b/src/version.ts index dab0c6f..88dc51d 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1,3 +1,3 @@ export const VERSION = "0.1.0"; export const SERVICE_NAME = "c2c-bridge"; -export const PRODUCT_NAME = "Claude to Codex"; +export const PRODUCT_NAME = "Chat to Codex"; diff --git a/tests/endpoint.test.ts b/tests/endpoint.test.ts index 0d50e42..2636b81 100644 --- a/tests/endpoint.test.ts +++ b/tests/endpoint.test.ts @@ -25,8 +25,8 @@ describe("connectorAction", () => { it("updates when the old address was reclaimed", () => { expect(connectorAction("https://old.trycloudflare.com/mcp", "https://new.trycloudflare.com/mcp")).toBe("update"); - expect(reclaimUserMessage("Claude to Codex")).toContain("Claude"); - expect(reclaimUserMessage("Claude to Codex")).toContain("remove"); + expect(reclaimUserMessage("Chat to Codex")).toContain("Claude"); + expect(reclaimUserMessage("Chat to Codex")).toContain("remove"); }); it("does nothing without a next URL", () => { @@ -40,7 +40,7 @@ describe("connectorNameFor", () => { connectorNameFor({ workspaceName: "EchoMind", workspaceId: "abc123abc123", - previousName: "Claude to Codex", + previousName: "Chat to Codex", hadEndpointBefore: true, }) ).toBe(DEFAULT_CONNECTOR_NAME); @@ -63,7 +63,7 @@ describe("connectorNameFor", () => { workspaceId: "def456def456", hadEndpointBefore: false, }) - ).toBe("Claude to Codex · Landing"); + ).toBe("Chat to Codex · Landing"); }); it("points connector management at Claude Web", () => { diff --git a/tests/helpers.ts b/tests/helpers.ts index 96bbefa..2b511e4 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -51,7 +51,7 @@ export function git(dir: string, ...args: string[]): string { export function makeGitRepo(dir: string): void { git(dir, "init", "-b", "main"); - write(dir, "hello.txt", "Hello from Claude to Codex!\n"); + write(dir, "hello.txt", "Hello from Chat to Codex!\n"); write(dir, "src/index.ts", "export const answer = 42;\n"); git(dir, "add", "."); git(dir, "commit", "-m", "initial commit"); diff --git a/tests/mcp-integration.test.ts b/tests/mcp-integration.test.ts index 9881961..e9c6be6 100644 --- a/tests/mcp-integration.test.ts +++ b/tests/mcp-integration.test.ts @@ -88,7 +88,7 @@ describe("MCP tools over Streamable HTTP", () => { it("read_file returns hello.txt", async () => { const result = await client.callTool({ name: "read_file", arguments: { path: "hello.txt" } }); const file = jsonOf<{ content: string; totalLines: number }>(result); - expect(file.content).toContain("Hello from Claude to Codex!"); + expect(file.content).toContain("Hello from Chat to Codex!"); }); it("read_file denies .env with ACCESS_DENIED_SENSITIVE_FILE and no content", async () => {