feat: deprecate GitHub Copilot compatibility surfaces (#1196)

This commit is contained in:
Kai (Tam Nhu) Tran
2026-05-07 13:06:03 -04:00
committed by GitHub
parent e2974ede44
commit 19a50a8dd8
15 changed files with 87 additions and 35 deletions
+2 -1
View File
@@ -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
+7 -7
View File
@@ -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
+4 -3
View File
@@ -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=<text>` routes through headless delegation consistently with `--prompt <text>`.
- **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 |
+7 -7
View File
@@ -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 |
---
+1 -1
View File
@@ -100,7 +100,7 @@ export const PROVIDER_CAPABILITIES: Record<CLIProxyProvider, ProviderCapabilitie
},
ghcp: {
displayName: 'GitHub Copilot (OAuth)',
description: 'GitHub Copilot via OAuth',
description: 'Deprecated GitHub Copilot compatibility via OAuth',
oauthFlow: 'device_code',
callbackPort: null,
callbackProviderName: 'copilot',
+2 -2
View File
@@ -129,7 +129,7 @@ export const ROOT_COMMAND_CATALOG: readonly RootCommandEntry[] = [
},
{
name: 'copilot',
summary: 'Run or manage the GitHub Copilot bridge',
summary: 'Run or manage the deprecated GitHub Copilot bridge',
group: 'runtime',
visibility: 'public',
},
@@ -198,7 +198,7 @@ export const BUILTIN_PROVIDER_SHORTCUTS: readonly ShortcutEntry[] = CLIPROXY_PRO
qwen: 'Qwen Code via CLIProxy OAuth',
iflow: 'iFlow via CLIProxy OAuth',
kiro: 'Kiro via CLIProxy OAuth',
ghcp: 'GitHub Copilot via CLIProxy OAuth',
ghcp: 'Deprecated GitHub Copilot via CLIProxy OAuth',
claude: 'Claude via CLIProxy OAuth',
kimi: 'Kimi via CLIProxy OAuth',
cursor: 'Cursor via CLIProxy OAuth',
+7 -1
View File
@@ -73,7 +73,13 @@ function printCopilotWarnings(messages: string[]): void {
* Show help for copilot commands.
*/
function handleHelp(): number {
console.log('GitHub Copilot Integration');
console.log('GitHub Copilot Integration (deprecated)');
console.log('');
console.log(
warn(
'Deprecated: GitHub usage-based Copilot billing begins June 1, 2026. Existing local setups remain available for compatibility; prefer Codex or another active provider for new work.'
)
);
console.log('');
console.log('Usage: ccs copilot <subcommand>');
console.log('');
+1 -1
View File
@@ -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
);
+6 -3
View File
@@ -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.');
+2 -2
View File
@@ -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 !!
+1 -1
View File
@@ -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;
+5 -1
View File
@@ -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',
@@ -25,7 +25,6 @@ const WIZARD_PROVIDER_ORDER: CLIProxyProvider[] = [
'iflow',
'kilo',
'kiro',
'ghcp',
];
export const PROVIDERS: ProviderOption[] = WIZARD_PROVIDER_ORDER.map((id) => ({
+24 -4
View File
@@ -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: 'デーモン',
+18
View File
@@ -125,6 +125,9 @@ export function CopilotPage() {
<div className="flex items-center gap-2">
<Github className="w-5 h-5 text-primary" />
<h1 className="font-semibold">{t('copilotPage.title')}</h1>
<span className="rounded border border-amber-300 bg-amber-100 px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-amber-800 dark:border-amber-900/60 dark:bg-amber-950/40 dark:text-amber-200">
{t('copilotPage.deprecatedBadge')}
</span>
</div>
<Button
variant="ghost"
@@ -145,6 +148,21 @@ export function CopilotPage() {
<LoadingSidebar />
) : (
<div className="p-3 space-y-4">
{/* Deprecation Banner */}
<div className="rounded-md border border-amber-500/50 bg-amber-500/15 p-3 space-y-1.5">
<div className="flex items-center gap-2">
<AlertTriangle className="h-4 w-4 text-amber-600 dark:text-amber-400 shrink-0" />
<span className="text-xs font-semibold text-amber-800 dark:text-amber-200">
{t('copilotPage.deprecationTitle')}
</span>
</div>
<ul className="text-[11px] text-amber-700 dark:text-amber-300 space-y-0.5 pl-6 list-disc">
<li>{t('copilotPage.deprecationItem1')}</li>
<li>{t('copilotPage.deprecationItem2')}</li>
<li>{t('copilotPage.deprecationItem3')}</li>
</ul>
</div>
{/* Warning Banner - Disclaimer */}
<div className="rounded-md border border-yellow-500/50 bg-yellow-500/15 p-3 space-y-1.5">
<div className="flex items-center gap-2">