From 19a50a8dd86ffcc602165701aa15981a53b822b8 Mon Sep 17 00:00:00 2001 From: "Kai (Tam Nhu) Tran" <61256810+kaitranntt@users.noreply.github.com> Date: Thu, 7 May 2026 13:06:03 -0400 Subject: [PATCH] feat: deprecate GitHub Copilot compatibility surfaces (#1196) --- README.md | 3 ++- docs/project-overview-pdr.md | 14 +++++------ docs/project-roadmap.md | 7 +++--- docs/system-architecture/provider-flows.md | 14 +++++------ src/cliproxy/provider-capabilities.ts | 2 +- src/commands/command-catalog.ts | 4 +-- src/commands/copilot-command.ts | 8 +++++- src/commands/help-command.ts | 2 +- src/config/loader/yaml-serializer.ts | 9 ++++--- src/config/schemas/copilot-cursor.ts | 4 +-- src/config/schemas/unified-config.ts | 2 +- ui/src/components/layout/app-sidebar.tsx | 6 ++++- ui/src/components/setup/wizard/constants.ts | 1 - ui/src/lib/i18n.ts | 28 ++++++++++++++++++--- ui/src/pages/copilot.tsx | 18 +++++++++++++ 15 files changed, 87 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 93577d2a..20b04f81 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,8 @@ CCS gives you one stable command surface while letting you switch between: - multiple runtimes such as Claude Code, Factory Droid, and Codex CLI - multiple Claude subscriptions and isolated account contexts -- OAuth providers like Codex, Copilot, Kiro, Claude, Qwen, Kimi, and more +- OAuth providers like Codex, Kiro, Claude, Qwen, Kimi, and more, with legacy + Copilot compatibility for existing setups - API and local-model profiles like GLM, Kimi, OpenRouter, Ollama, llama.cpp, Novita, and Alibaba Coding Plan diff --git a/docs/project-overview-pdr.md b/docs/project-overview-pdr.md index 14c87e4e..d4e6449c 100644 --- a/docs/project-overview-pdr.md +++ b/docs/project-overview-pdr.md @@ -1,6 +1,6 @@ # CCS Product Development Requirements (PDR) -Last Updated: 2026-04-08 +Last Updated: 2026-05-07 ## Product Overview @@ -31,7 +31,7 @@ Developers using Claude Code face these challenges: CCS provides: 1. **Multi-Account Claude**: Isolated instances via `CLAUDE_CONFIG_DIR` -2. **OAuth Providers**: Zero-config Gemini, Codex, Antigravity, Copilot, Kiro (ghcp) integration +2. **OAuth Providers**: Zero-config Gemini, Codex, Antigravity, Kiro, and other active OAuth integrations, with deprecated Copilot compatibility for existing setups 3. **AI Providers**: Dedicated CLIProxy dashboard for Gemini, Codex, Claude, Vertex, and OpenAI-compatible API-key families 4. **API Profiles**: GLM, Kimi, OpenRouter, any Anthropic-compatible API 5. **Visual Dashboard**: React SPA for configuration management @@ -68,8 +68,8 @@ CCS provides: - Share commands, skills, agents across accounts ### FR-003: OAuth Provider Integration -- Support Gemini, Codex, Antigravity, Copilot, Kiro (ghcp) OAuth flows -- Browser-based authentication (Authorization Code flow for most, Device Code for ghcp) +- Support Gemini, Codex, Antigravity, Kiro, and deprecated Copilot compatibility OAuth flows +- Browser-based authentication (Authorization Code flow for most, Device Code for ghcp compatibility) - Token caching and refresh ### FR-004: API Profile Management @@ -273,7 +273,7 @@ CCS provides: ### v7.2 Release (Complete) - [x] Kiro (AWS) OAuth provider support via CLIProxyAPIPlus -- [x] GitHub Copilot (ghcp) OAuth provider via Device Code flow +- [x] GitHub Copilot (ghcp) OAuth provider via Device Code flow (deprecated compatibility) - [x] Authorization Code flow for Kiro (port 9876) - [x] Device Code flow for ghcp (no local port needed) @@ -334,8 +334,8 @@ CCS provides: ### External Services - Anthropic Claude API - Google Gemini API -- GitHub Codex/Copilot API -- GitHub Copilot (ghcp - Device Code OAuth) +- GitHub Codex API +- GitHub Copilot (ghcp - deprecated Device Code OAuth compatibility) - AWS Kiro (Authorization Code OAuth) - Z.AI GLM API - OpenRouter API diff --git a/docs/project-roadmap.md b/docs/project-roadmap.md index 76e0ff07..2e9441d1 100644 --- a/docs/project-roadmap.md +++ b/docs/project-roadmap.md @@ -22,7 +22,7 @@ All major modularization work is complete. The codebase evolved from monolithic | 8 | Auth Monitor | `monitoring/auth-monitor/` (465->8 files) | | 9 | Test Infrastructure | 1407 tests, 90% coverage | | 10 | Remote CLIProxy | `proxy-config-resolver.ts`, `remote-proxy-client.ts` | -| 11 | Kiro + ghcp Providers | OAuth support via CLIProxyAPIPlus (v7.2) | +| 11 | Kiro + legacy ghcp Providers | OAuth support via CLIProxyAPIPlus (v7.2) | | 12 | Hybrid Quota Management | `quota-manager.ts`, `quota-fetcher.ts` (v7.14) | | 13 | Docker Support | `docker/` directory with Dockerfile, Compose, entrypoint | | 14 | Image Analysis Hook | Vision proxying via CLIProxy transformers (v7.34) | @@ -41,6 +41,7 @@ All major modularization work is complete. The codebase evolved from monolithic ### Recent Fixes +- **2026-05-07**: **#1103** GitHub Copilot is now treated as a deprecated compatibility bridge. The dashboard moves Copilot out of the active Identity & Access section and into Deprecated, quick setup no longer offers `ghcp` for new onboarding, CLI/help/config copy marks Copilot as deprecated, and existing `ccs copilot` / `ghcp` compatibility paths remain available for current setups. - **2026-05-07**: **#1189** Headless settings-profile delegation now preserves native Claude passthrough args without a Claude flag allowlist. Explicit `--channels` values reach Claude Code, future native flags can carry multiple adjacent values, malformed CCS-owned flags no longer swallow the next native flag, and `--prompt=` routes through headless delegation consistently with `--prompt `. - **2026-05-03**: **#1172** Local CLIProxy config generation now keeps the CPAMC management dashboard aligned with backend selection. `backend: original` points to the upstream dashboard, `backend: plus` points to the CCS-maintained CPAMC fork, `cliproxy.management_panel_repository` lets advanced users override the panel repository, and stale generated configs are regenerated when the expected panel source changes. - **2026-04-30**: **#1153** Native Claude launches now accept session-scoped `--effort low|medium|high|xhigh|max` overrides through CCS without mutating global Claude settings. CCS validates invalid or missing effort values before spawning Claude, normalizes accepted values, keeps default headless `-p/--prompt` launches on native Claude instead of delegation parsing, and preserves CLIProxy/Codex/Droid effort aliases. @@ -214,7 +215,7 @@ worktrees: - **#158**: Fix AGY OAuth flow - **#157**: ~~Add Kiro auth support from CLIProxyAPIPlus~~ **COMPLETE** (v7.2) -- GitHub Copilot (ghcp) Device Code flow **COMPLETE** (v7.2) +- GitHub Copilot (ghcp) Device Code flow **COMPLETE** (v7.2, now deprecated compatibility) - Hybrid quota management **COMPLETE** (v7.14) --- @@ -225,7 +226,7 @@ worktrees: |-----------|--------|--------| | Modularization (Phases 1-9) | COMPLETE | - | | Remote CLIProxy Support (#142) | COMPLETE | v7.1 | -| Kiro + GitHub Copilot OAuth (#157) | COMPLETE | v7.2 | +| Kiro + GitHub Copilot OAuth (#157) | COMPLETE, Copilot now deprecated compatibility | v7.2 | | Hybrid Quota Management | COMPLETE | v7.14 | | Docker Support (PR #345) | COMPLETE | v7.23 | | Image Analysis Hook | COMPLETE | v7.34 | diff --git a/docs/system-architecture/provider-flows.md b/docs/system-architecture/provider-flows.md index 46a3bce9..3a6f8d41 100644 --- a/docs/system-architecture/provider-flows.md +++ b/docs/system-architecture/provider-flows.md @@ -14,7 +14,7 @@ CLIProxyAPI is a local OAuth proxy binary that enables seamless integration with ### Local Backend Choice -CCS defaults to the original `router-for-me/CLIProxyAPI` backend because it is the stable MIT upstream. The `plus` backend is an explicit opt-in path that downloads the community-maintained `kaitranntt/CLIProxyAPIPlus` fork for providers that still require Plus-only support, such as Kiro, GitHub Copilot, Cursor, GitLab, CodeBuddy, and Kilo. CCS does not silently downgrade `backend: plus` to `original`; users choose that backend deliberately when they need those providers. +CCS defaults to the original `router-for-me/CLIProxyAPI` backend because it is the stable MIT upstream. The `plus` backend is an explicit opt-in path that downloads the community-maintained `kaitranntt/CLIProxyAPIPlus` fork for providers that still require Plus-only support, such as Kiro, Cursor, GitLab, CodeBuddy, Kilo, and deprecated GitHub Copilot compatibility. CCS does not silently downgrade `backend: plus` to `original`; users choose that backend deliberately when they need those providers. Generated local CLIProxy configs also keep the management dashboard aligned with the selected backend. `backend: original` uses upstream CPAMC (`router-for-me/Cli-Proxy-API-Management-Center`), while `backend: plus` uses the CCS-maintained dashboard fork (`kaitranntt/Cli-Proxy-API-Management-Center`). Advanced users can override the generated `remote-management.panel-github-repository` value by setting `cliproxy.management_panel_repository` in `~/.ccs/config.yaml`; CCS will regenerate stale local CLIProxy configs when the expected dashboard repository changes. @@ -40,7 +40,7 @@ Generated local CLIProxy configs also keep the management dashboard aligned with | | - Callback to localhost:PORT | | | +---> Device Code Flow (no port needed) - | - GitHub Copilot (ghcp) + | - GitHub Copilot (ghcp, deprecated compatibility) | - User enters code at github.com/login/device | - Polls for token completion | | @@ -73,7 +73,7 @@ Generated local CLIProxy configs also keep the management dashboard aligned with +---> GitHub (Codex) +---> Antigravity (AGY) +---> AWS Kiro (Claude-powered) - +---> GitHub Copilot (ghcp) + +---> GitHub Copilot (ghcp, deprecated compatibility) +---> OpenAI-compatible endpoints ``` @@ -85,7 +85,7 @@ Generated local CLIProxy configs also keep the management dashboard aligned with | Codex | `codex` | Authorization Code | 9876 | CLIProxyAPI | | Antigravity | `agy` | Authorization Code | 9876 | CLIProxyAPI | | Kiro (AWS) | `kiro` | Method-aware (default: Device Code) | 9876 | CLIProxyAPIPlus fork | -| GitHub Copilot | `ghcp` | Device Code | none | CLIProxyAPIPlus fork | +| GitHub Copilot (deprecated) | `ghcp` | Device Code | none | CLIProxyAPIPlus fork | | Cursor | `cursor` | Browser URL polling | none | CLIProxyAPIPlus fork | ### Codex Duplicate-Email Account Identity @@ -299,7 +299,7 @@ When CCS detects exhaustion and a healthy fallback exists, it temporarily pauses | | - Claude: policy limits endpoint | | - Codex: ChatGPT usage windows | | - Gemini CLI: Code Assist quota buckets - | | - GitHub Copilot: copilot_internal/user snapshots + | | - GitHub Copilot: copilot_internal/user snapshots (deprecated compatibility) | | | +---> Detect tier (free/paid/unknown) | | @@ -391,7 +391,7 @@ function selectBestAccount(accounts: AccountInfo[]): AccountInfo | null { ### OAuth Providers - Device Code Flow -**Providers**: GitHub Copilot (ghcp) +**Providers**: GitHub Copilot (ghcp, deprecated compatibility) Provider identity note: - Providers that do not expose a reliable email no longer require a manual nickname during first auth. @@ -591,7 +591,7 @@ Image Analysis Hook enables vision model proxying through CLIProxy with automati | Codex | ✓ | Via CCS ImageAnalysis provider route | | Antigravity | ✓ | Via CCS ImageAnalysis provider route | | Kiro | ✓ | Via mapped CCS provider route when configured | -| Copilot | ✓ | Via mapped ghcp provider route | +| Copilot | ✓ | Deprecated compatibility route via mapped ghcp provider | | GLM/Kimi | ✓ | Via explicit or fallback backend mapping | --- diff --git a/src/cliproxy/provider-capabilities.ts b/src/cliproxy/provider-capabilities.ts index d473d13f..1d020d77 100644 --- a/src/cliproxy/provider-capabilities.ts +++ b/src/cliproxy/provider-capabilities.ts @@ -100,7 +100,7 @@ export const PROVIDER_CAPABILITIES: Record'); console.log(''); diff --git a/src/commands/help-command.ts b/src/commands/help-command.ts index 20fd265a..014df452 100644 --- a/src/commands/help-command.ts +++ b/src/commands/help-command.ts @@ -290,7 +290,7 @@ export async function handleHelpCommand(writeLine: HelpWriter = console.log): Pr { name: 'ccs proxy --help', summary: 'Deep help for the OpenAI-compatible local proxy' }, { name: 'ccs docker --help', summary: 'Deep help for Docker deployment commands' }, { name: 'ccs cursor --help', summary: 'Deep help for Cursor runtime/admin commands' }, - { name: 'ccs copilot --help', summary: 'Deep help for GitHub Copilot commands' }, + { name: 'ccs copilot --help', summary: 'Deep help for deprecated GitHub Copilot commands' }, ], writeLine ); diff --git a/src/config/loader/yaml-serializer.ts b/src/config/loader/yaml-serializer.ts index e9106c4c..0365899b 100644 --- a/src/config/loader/yaml-serializer.ts +++ b/src/config/loader/yaml-serializer.ts @@ -162,11 +162,14 @@ export function generateYamlWithComments(config: UnifiedConfig): string { lines.push(''); } - // Copilot section (GitHub Copilot proxy) + // Copilot section (deprecated GitHub Copilot compatibility bridge) if (config.copilot) { lines.push('# ----------------------------------------------------------------------------'); - lines.push('# Copilot: GitHub Copilot API proxy (via copilot-api)'); - lines.push('# Uses your existing GitHub Copilot subscription with Claude Code.'); + lines.push('# Copilot: Deprecated GitHub Copilot compatibility bridge (via copilot-api)'); + lines.push( + '# Existing local setups remain available, but prefer Codex or another active provider.' + ); + lines.push('# GitHub usage-based Copilot billing begins June 1, 2026.'); lines.push('#'); lines.push('# !! DISCLAIMER - USE AT YOUR OWN RISK !!'); lines.push('# This uses an UNOFFICIAL reverse-engineered API.'); diff --git a/src/config/schemas/copilot-cursor.ts b/src/config/schemas/copilot-cursor.ts index e0b33fbb..761e4b64 100644 --- a/src/config/schemas/copilot-cursor.ts +++ b/src/config/schemas/copilot-cursor.ts @@ -2,7 +2,7 @@ * Copilot and Cursor IDE integration configuration types and defaults. * * Covers: - * - CopilotConfig: GitHub Copilot proxy integration (strictly opt-in) + * - CopilotConfig: deprecated GitHub Copilot proxy compatibility (strictly opt-in) * - CursorConfig: Cursor IDE proxy daemon */ @@ -13,7 +13,7 @@ export type CopilotAccountType = 'individual' | 'business' | 'enterprise'; /** * Copilot API configuration. - * Enables GitHub Copilot subscription usage via copilot-api proxy. + * Enables deprecated GitHub Copilot compatibility via copilot-api proxy. * Strictly opt-in - disabled by default. * * !! DISCLAIMER - USE AT YOUR OWN RISK !! diff --git a/src/config/schemas/unified-config.ts b/src/config/schemas/unified-config.ts index 78726c46..5290ccc0 100644 --- a/src/config/schemas/unified-config.ts +++ b/src/config/schemas/unified-config.ts @@ -68,7 +68,7 @@ export interface UnifiedConfig { global_env?: GlobalEnvConfig; /** Cross-profile continuity inheritance mapping */ continuity?: ContinuityConfig; - /** Copilot API configuration (GitHub Copilot proxy) */ + /** Copilot API configuration (deprecated GitHub Copilot compatibility bridge) */ copilot?: CopilotConfig; /** Cursor IDE configuration (Cursor proxy daemon) */ cursor?: CursorConfig; diff --git a/ui/src/components/layout/app-sidebar.tsx b/ui/src/components/layout/app-sidebar.tsx index a50ee9e4..2812b501 100644 --- a/ui/src/components/layout/app-sidebar.tsx +++ b/ui/src/components/layout/app-sidebar.tsx @@ -102,7 +102,6 @@ function buildNavGroups(t: (key: string) => string): SidebarGroupDef[] { { path: '/cliproxy/control-panel', icon: Gauge, label: t('nav.controlPanel') }, ], }, - { path: '/copilot', icon: Github, label: t('nav.githubCopilot') }, { path: '/accounts', icon: Users, @@ -126,6 +125,11 @@ function buildNavGroups(t: (key: string) => string): SidebarGroupDef[] { { title: t('nav.deprecated'), items: [ + { + path: '/copilot', + icon: Github, + label: `${t('nav.githubCopilot')} (${t('nav.deprecated')})`, + }, { path: '/legacy/cursor', iconSrc: '/assets/sidebar/cursor.svg', diff --git a/ui/src/components/setup/wizard/constants.ts b/ui/src/components/setup/wizard/constants.ts index 50a2c1ca..f40b591e 100644 --- a/ui/src/components/setup/wizard/constants.ts +++ b/ui/src/components/setup/wizard/constants.ts @@ -25,7 +25,6 @@ const WIZARD_PROVIDER_ORDER: CLIProxyProvider[] = [ 'iflow', 'kilo', 'kiro', - 'ghcp', ]; export const PROVIDERS: ProviderOption[] = WIZARD_PROVIDER_ORDER.map((id) => ({ diff --git a/ui/src/lib/i18n.ts b/ui/src/lib/i18n.ts index c0a05780..4a6a2f03 100644 --- a/ui/src/lib/i18n.ts +++ b/ui/src/lib/i18n.ts @@ -1278,7 +1278,12 @@ const resources = { }, copilotPage: { title: 'Copilot', - subtitle: 'GitHub Copilot proxy', + subtitle: 'Deprecated GitHub Copilot compatibility bridge', + deprecatedBadge: 'Deprecated', + deprecationTitle: 'Deprecated compatibility bridge', + deprecationItem1: 'GitHub usage-based Copilot billing begins June 1, 2026', + deprecationItem2: 'Existing local setups remain available for compatibility', + deprecationItem3: 'Prefer Codex or another active provider for new work', setup: 'Setup', auth: 'Auth', daemon: 'Daemon', @@ -3813,7 +3818,12 @@ const resources = { }, copilotPage: { title: 'Copilot', - subtitle: 'GitHub Copilot 代理', + subtitle: '已弃用的 GitHub Copilot 兼容桥接', + deprecatedBadge: '已弃用', + deprecationTitle: '已弃用的兼容桥接', + deprecationItem1: 'GitHub Copilot 用量计费将于 2026 年 6 月 1 日开始', + deprecationItem2: '现有本地配置仍可作为兼容路径继续使用', + deprecationItem3: '新的配置请优先使用 Codex 或其他活跃提供商', setup: '安装', auth: '认证', daemon: '守护进程', @@ -6396,7 +6406,12 @@ const resources = { }, copilotPage: { title: 'Copilot', - subtitle: 'Proxy GitHub Copilot', + subtitle: 'Cầu nối tương thích GitHub Copilot đã ngừng ưu tiên', + deprecatedBadge: 'Đã ngừng ưu tiên', + deprecationTitle: 'Cầu nối tương thích đã ngừng ưu tiên', + deprecationItem1: 'GitHub Copilot bắt đầu tính phí theo mức dùng từ 2026-06-01', + deprecationItem2: 'Thiết lập cục bộ hiện có vẫn được giữ cho tương thích', + deprecationItem3: 'Thiết lập mới nên dùng Codex hoặc nhà cung cấp còn hoạt động', setup: 'Cài đặt', auth: 'Xác thực', daemon: 'Daemon', @@ -9004,7 +9019,12 @@ const resources = { }, copilotPage: { title: 'Copilot', - subtitle: 'GitHub Copilot プロキシ', + subtitle: '非推奨の GitHub Copilot 互換ブリッジ', + deprecatedBadge: '非推奨', + deprecationTitle: '非推奨の互換ブリッジ', + deprecationItem1: 'GitHub Copilot の従量課金は 2026-06-01 に開始されます', + deprecationItem2: '既存のローカル設定は互換用として引き続き利用できます', + deprecationItem3: '新規設定では Codex または他の有効なプロバイダーを優先してください', setup: 'セットアップ', auth: '認証', daemon: 'デーモン', diff --git a/ui/src/pages/copilot.tsx b/ui/src/pages/copilot.tsx index 23a58578..d8841e1a 100644 --- a/ui/src/pages/copilot.tsx +++ b/ui/src/pages/copilot.tsx @@ -125,6 +125,9 @@ export function CopilotPage() {

{t('copilotPage.title')}

+ + {t('copilotPage.deprecatedBadge')} +