Files
ccs/src/commands/version-command.ts
T
Tam Nhu Tran 60d6bbd027 fix(config): migrate all hardcoded paths to getCcsDir() and improve validation
- Replace os.homedir() + '.ccs' with getCcsDir() across 14 instances in 13 files:
  version-command, model-config, openrouter-catalog, config-checks, disk-cache,
  aggregator, auth-middleware, shell-completion, shared-manager, recovery-manager,
  auto-repair, delegation-validator, claude-dir-installer, cliproxy executor
- Add isDirectory() validation for --config-dir argument in ccs.ts
- Make detectCloudSyncPath() case-insensitive for cloud provider matching
- Fix help-command.ts to use dynamic dirDisplay for all path references
- Add 5 new tests: setGlobalConfigDir precedence, relative path resolution,
  reset behavior, getCcsDirSource with --config-dir, case-insensitive detection
- Clean up unused os imports after migration
2026-02-11 11:15:08 +07:00

86 lines
2.8 KiB
TypeScript

/**
* Version Command Handler
*
* Handle --version command for CCS.
*/
import * as path from 'path';
import * as fs from 'fs';
import { initUI, header, subheader, color, warn } from '../utils/ui';
import { getActiveConfigPath, getCcsDir } from '../utils/config-manager';
import { getVersion } from '../utils/version';
/**
* Handle version command
*/
export async function handleVersionCommand(): Promise<void> {
await initUI();
console.log(header(`CCS (Claude Code Switch) v${getVersion()}`));
console.log('');
console.log(subheader('Installation:'));
const installLocation = process.argv[1] || '(not found)';
console.log(` ${color('Location:'.padEnd(17), 'info')} ${installLocation}`);
const ccsDir = getCcsDir();
console.log(` ${color('CCS Directory:'.padEnd(17), 'info')} ${ccsDir}`);
const configPath = getActiveConfigPath();
console.log(` ${color('Config:'.padEnd(17), 'info')} ${configPath}`);
const profilesJson = path.join(ccsDir, 'profiles.json');
console.log(` ${color('Profiles:'.padEnd(17), 'info')} ${profilesJson}`);
// Delegation status
const delegationSessionsPath = path.join(ccsDir, 'delegation-sessions.json');
const delegationConfigured = fs.existsSync(delegationSessionsPath);
const readyProfiles: string[] = [];
// Check for profiles with valid API keys
for (const profile of ['glm', 'kimi']) {
const settingsPath = path.join(ccsDir, `${profile}.settings.json`);
if (fs.existsSync(settingsPath)) {
try {
const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
const apiKey = settings.env?.ANTHROPIC_AUTH_TOKEN;
if (apiKey && !apiKey.match(/YOUR_.*_API_KEY_HERE/) && !apiKey.match(/sk-test.*/)) {
readyProfiles.push(profile);
}
} catch (_error) {
// Invalid JSON, skip
}
}
}
const hasValidApiKeys = readyProfiles.length > 0;
const delegationEnabled = delegationConfigured || hasValidApiKeys;
if (delegationEnabled) {
console.log(` ${color('Delegation:'.padEnd(17), 'info')} Enabled`);
} else {
console.log(` ${color('Delegation:'.padEnd(17), 'info')} Not configured`);
}
console.log('');
if (readyProfiles.length > 0) {
console.log(subheader('Delegation Ready:'));
console.log(
` ${color('[OK]', 'warning')} ${readyProfiles.join(', ')} profiles are ready for delegation`
);
console.log('');
} else if (delegationEnabled) {
console.log(subheader('Delegation Ready:'));
console.log(warn('Delegation configured but no valid API keys found'));
console.log('');
}
console.log(`${subheader('Documentation:')} ${color('https://docs.ccs.kaitran.ca', 'path')}`);
console.log(`${subheader('License:')} MIT`);
console.log('');
console.log(color("Run 'ccs --help' for usage information", 'command'));
process.exit(0);
}