diff --git a/.github/workflows/ai-review.yml b/.github/workflows/ai-review.yml index 9e0a7f53..0334ab36 100644 --- a/.github/workflows/ai-review.yml +++ b/.github/workflows/ai-review.yml @@ -21,7 +21,8 @@ on: required: true type: string -# Cancel in-progress runs for same PR (safe now since auto-trigger is only on opened) +# Simple concurrency: one review per PR at a time +# With track_progress disabled, no bot comments are posted during review concurrency: group: ai-review-${{ github.event.pull_request.number || github.event.issue.number || github.event.inputs.pr_number }} cancel-in-progress: true @@ -92,7 +93,7 @@ jobs: anthropic_api_key: ${{ secrets.CLIPROXY_API_KEY }} github_token: ${{ steps.app-token.outputs.token }} path_to_claude_code_executable: /home/github-runner/.local/bin/claude - track_progress: ${{ github.event_name != 'workflow_dispatch' }} + track_progress: false # Disabled - no progress comments, just final review prompt: | ultrathink diff --git a/CHANGELOG.md b/CHANGELOG.md index c70b543e..ae9db056 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ +## [7.18.3](https://github.com/kaitranntt/ccs/compare/v7.18.2...v7.18.3) (2026-01-13) + +### Bug Fixes + +* **ci:** simplify AI review workflow by disabling progress tracking ([4ef2d48](https://github.com/kaitranntt/ccs/commit/4ef2d4848cf12d197ba1f8cd5dac66b55c82c8be)) +* **ci:** simplify AI review workflow by disabling progress tracking ([#323](https://github.com/kaitranntt/ccs/issues/323)) ([39b37ca](https://github.com/kaitranntt/ccs/commit/39b37caa892f8b723f003c8ed0c6d8f2fe96d799)) + +## [7.18.2](https://github.com/kaitranntt/ccs/compare/v7.18.1...v7.18.2) (2026-01-13) + +### Bug Fixes + +* **ci:** isolate concurrency groups by comment author ([3163509](https://github.com/kaitranntt/ccs/commit/316350905233d776968f53732974a77997513f24)) +* **ci:** isolate concurrency groups by comment author ([#322](https://github.com/kaitranntt/ccs/issues/322)) ([1d33012](https://github.com/kaitranntt/ccs/commit/1d33012b4e5ad02bac63f9b559f64c3efdf26044)) + +## [7.18.1](https://github.com/kaitranntt/ccs/compare/v7.18.0...v7.18.1) (2026-01-13) + +### Bug Fixes + +* **ci:** add explicit instruction to post review as PR comment ([85f6bc0](https://github.com/kaitranntt/ccs/commit/85f6bc07d44f54673163ad4fed6045a37ccabad0)) +* **ci:** exclude bot comments from triggering AI review ([ce70617](https://github.com/kaitranntt/ccs/commit/ce70617ee94645399ba05af581240a696ca9cfed)) +* **ci:** prevent self-cancelling AI review workflow ([120aca4](https://github.com/kaitranntt/ccs/commit/120aca466d646ee1c770b2712a0d2742d5dd62d6)) +* **ci:** prevent self-cancelling AI review workflow ([#321](https://github.com/kaitranntt/ccs/issues/321)) ([fa1899f](https://github.com/kaitranntt/ccs/commit/fa1899f4611d570b2a8bf5e1a5342d5392466263)) +* **delegation:** improve profile discovery and CI workflow ([#310](https://github.com/kaitranntt/ccs/issues/310)) ([affdaea](https://github.com/kaitranntt/ccs/commit/affdaead80c3635f49ef562cac81bde8db0cab23)) +* **delegation:** only check profiles defined in config.yaml ([0075248](https://github.com/kaitranntt/ccs/commit/0075248273e2d4912c4e277deebd6e668c5b3466)) +* **doctor:** use dynamic profile discovery for delegation check ([f88ad8e](https://github.com/kaitranntt/ccs/commit/f88ad8e78198302f68ee0b420075d704ab01d8ff)) +* **ui:** improve sidebar navigation for collapsible menu items ([12b68f9](https://github.com/kaitranntt/ccs/commit/12b68f9f136c3529ac976eaec9e8903b43185e89)) +* **ui:** improve sidebar navigation for collapsible menu items ([#313](https://github.com/kaitranntt/ccs/issues/313)) ([e2e2ecd](https://github.com/kaitranntt/ccs/commit/e2e2ecda3c1948fb90f9b47b1e31782ef30cc31f)) + ## [7.18.0](https://github.com/kaitranntt/ccs/compare/v7.17.0...v7.18.0) (2026-01-08) ### Features diff --git a/CLAUDE.md b/CLAUDE.md index 4142f8dc..5404a1a4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -109,10 +109,14 @@ bun run validate # Step 3: Final check (must pass) | Command | Help Handler Location | |---------|----------------------| | `ccs --help` | `src/commands/help-command.ts` | +| `ccs api --help` | `src/commands/api-command.ts` → `showHelp()` | +| `ccs cleanup --help` | `src/commands/cleanup-command.ts` → `printHelp()` | | `ccs cliproxy --help` | `src/commands/cliproxy-command.ts` → `showHelp()` | -| `ccs auth --help` | `src/commands/auth-command.ts` | -| `ccs api --help` | `src/commands/api-command.ts` | -| `ccs copilot --help` | `src/commands/copilot-command.ts` | +| `ccs config --help` | `src/commands/config-command.ts` → `showHelp()` | +| `ccs copilot --help` | `src/commands/copilot-command.ts` → `handleHelp()` | +| `ccs doctor --help` | `src/commands/doctor-command.ts` → `showHelp()` | +| `ccs migrate --help` | `src/commands/migrate-command.ts` → `printMigrateHelp()` | +| `ccs setup --help` | `src/commands/setup-command.ts` → `showHelp()` | **Note:** `lib/ccs` and `lib/ccs.ps1` are bootstrap wrappers only—they delegate to Node.js and contain no help text. diff --git a/package.json b/package.json index 7b639c2c..1f1a7d67 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kaitranntt/ccs", - "version": "7.18.0-dev.5", + "version": "7.18.3-dev.1", "description": "Claude Code Switch - Instant profile switching between Claude Sonnet 4.5 and GLM 4.6", "keywords": [ "cli", diff --git a/src/ccs.ts b/src/ccs.ts index bcfb2cc9..ca9c10d4 100644 --- a/src/ccs.ts +++ b/src/ccs.ts @@ -340,8 +340,8 @@ async function main(): Promise { // Special case: doctor command if (firstArg === 'doctor' || firstArg === '--doctor') { - const shouldFix = args.includes('--fix') || args.includes('-f'); - await handleDoctorCommand(shouldFix); + const restArgs = args.slice(args.indexOf(firstArg) + 1); + await handleDoctorCommand(restArgs); return; } diff --git a/src/commands/doctor-command.ts b/src/commands/doctor-command.ts index 6f4c7c65..5c4c9580 100644 --- a/src/commands/doctor-command.ts +++ b/src/commands/doctor-command.ts @@ -4,22 +4,80 @@ * Handle doctor command for CCS. */ +import { initUI, header, dim, color, subheader } from '../utils/ui'; + +/** + * Show help for doctor command + */ +function showHelp(): void { + console.log(''); + console.log(header('ccs doctor')); + console.log(''); + console.log(' Run health diagnostics on CCS installation.'); + console.log(''); + + console.log(subheader('Usage:')); + console.log(` ${color('ccs doctor', 'command')} [options]`); + console.log(''); + + console.log(subheader('Options:')); + console.log(` ${color('--fix, -f', 'command')} Attempt to auto-fix detected issues`); + console.log(` ${color('--help, -h', 'command')} Show this help message`); + console.log(''); + + console.log(subheader('Checks performed:')); + console.log(` ${dim('-')} Config files (config.yaml, config.json)`); + console.log(` ${dim('-')} CLIProxy installation and process status`); + console.log(` ${dim('-')} OAuth port availability (8085, 1455, 51121)`); + console.log(` ${dim('-')} Symlink integrity (shared settings)`); + console.log(` ${dim('-')} Profile configuration validity`); + console.log(''); + + console.log(subheader('Auto-fix capabilities:')); + console.log(` ${dim('-')} Kill zombie CLIProxy processes`); + console.log(` ${dim('-')} Free blocked OAuth callback ports`); + console.log(` ${dim('-')} Regenerate outdated CLIProxy config`); + console.log(` ${dim('-')} Restore broken shared settings symlinks`); + console.log(''); + + console.log(subheader('Examples:')); + console.log( + ` $ ${color('ccs doctor', 'command')} ${dim('# Run diagnostics (read-only)')}` + ); + console.log( + ` $ ${color('ccs doctor --fix', 'command')} ${dim('# Run diagnostics and fix issues')}` + ); + console.log(''); + + console.log(subheader('Exit codes:')); + console.log(` ${color('0', 'command')} All checks passed`); + console.log(` ${color('1', 'command')} One or more checks failed`); + console.log(''); +} + /** * Handle doctor command - * @param shouldFix - If true, attempt to fix detected issues + * @param args - Command line arguments */ -export async function handleDoctorCommand(shouldFix = false): Promise { +export async function handleDoctorCommand(args: string[]): Promise { + await initUI(); + + if (args.includes('--help') || args.includes('-h')) { + showHelp(); + return; + } + + const shouldFix = args.includes('--fix') || args.includes('-f'); + const DoctorModule = await import('../management/doctor'); const Doctor = DoctorModule.default; const doctor = new Doctor(); await doctor.runAllChecks(); - // Attempt to fix issues if --fix flag provided if (shouldFix) { await doctor.fixIssues(); } - // Exit with error code if unhealthy process.exit(doctor.isHealthy() ? 0 : 1); }