@kaitranntt/ccs 7.19.2 → 7.20.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ccs.js +6 -0
- package/dist/ccs.js.map +1 -1
- package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -1
- package/dist/cliproxy/cliproxy-executor.js +4 -1
- package/dist/cliproxy/cliproxy-executor.js.map +1 -1
- package/dist/cliproxy/quota-fetcher.d.ts +6 -3
- package/dist/cliproxy/quota-fetcher.d.ts.map +1 -1
- package/dist/cliproxy/quota-fetcher.js +61 -17
- package/dist/cliproxy/quota-fetcher.js.map +1 -1
- package/dist/cliproxy/quota-manager.d.ts +2 -2
- package/dist/cliproxy/quota-manager.d.ts.map +1 -1
- package/dist/cliproxy/quota-manager.js +7 -7
- package/dist/cliproxy/quota-manager.js.map +1 -1
- package/dist/commands/cliproxy-command.d.ts.map +1 -1
- package/dist/commands/cliproxy-command.js +7 -6
- package/dist/commands/cliproxy-command.js.map +1 -1
- package/dist/commands/config-auth/disable-command.d.ts +10 -0
- package/dist/commands/config-auth/disable-command.d.ts.map +1 -0
- package/dist/commands/config-auth/disable-command.js +64 -0
- package/dist/commands/config-auth/disable-command.js.map +1 -0
- package/dist/commands/config-auth/index.d.ts +14 -0
- package/dist/commands/config-auth/index.d.ts.map +1 -0
- package/dist/commands/config-auth/index.js +84 -0
- package/dist/commands/config-auth/index.js.map +1 -0
- package/dist/commands/config-auth/setup-command.d.ts +13 -0
- package/dist/commands/config-auth/setup-command.d.ts.map +1 -0
- package/dist/commands/config-auth/setup-command.js +121 -0
- package/dist/commands/config-auth/setup-command.js.map +1 -0
- package/dist/commands/config-auth/show-command.d.ts +10 -0
- package/dist/commands/config-auth/show-command.d.ts.map +1 -0
- package/dist/commands/config-auth/show-command.js +79 -0
- package/dist/commands/config-auth/show-command.js.map +1 -0
- package/dist/commands/config-auth/types.d.ts +25 -0
- package/dist/commands/config-auth/types.d.ts.map +1 -0
- package/dist/commands/config-auth/types.js +8 -0
- package/dist/commands/config-auth/types.js.map +1 -0
- package/dist/commands/config-command.d.ts.map +1 -1
- package/dist/commands/config-command.js +37 -1
- package/dist/commands/config-command.js.map +1 -1
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +5 -0
- package/dist/commands/help-command.js.map +1 -1
- package/dist/commands/persist-command.d.ts +12 -0
- package/dist/commands/persist-command.d.ts.map +1 -0
- package/dist/commands/persist-command.js +565 -0
- package/dist/commands/persist-command.js.map +1 -0
- package/dist/config/unified-config-loader.d.ts +6 -1
- package/dist/config/unified-config-loader.d.ts.map +1 -1
- package/dist/config/unified-config-loader.js +41 -1
- package/dist/config/unified-config-loader.js.map +1 -1
- package/dist/config/unified-config-types.d.ts +22 -0
- package/dist/config/unified-config-types.d.ts.map +1 -1
- package/dist/config/unified-config-types.js +12 -1
- package/dist/config/unified-config-types.js.map +1 -1
- package/dist/ui/assets/accounts-Be6b-nwn.js +1 -0
- package/dist/ui/assets/{alert-dialog-CnDvl5IB.js → alert-dialog-CM5u0JHs.js} +1 -1
- package/dist/ui/assets/api-mj8kMJz1.js +1 -0
- package/dist/ui/assets/{auth-section-DbZac9VD.js → auth-section-nFosGq6Z.js} +1 -1
- package/dist/ui/assets/{charts-CJC4bH8P.js → charts-BBPXh0Ar.js} +1 -1
- package/dist/ui/assets/cliproxy-DlHYA8zi.js +3 -0
- package/dist/ui/assets/{cliproxy-control-panel-CP-dhv4O.js → cliproxy-control-panel-wKdIZ6WV.js} +1 -1
- package/dist/ui/assets/{code-highlight-DKN39ySy.js → code-highlight-BRUf_pqB.js} +1 -1
- package/dist/ui/assets/{confirm-dialog-w5D52_lL.js → confirm-dialog-BcIEdkmr.js} +1 -1
- package/dist/ui/assets/copilot-CK7anGeR.js +4 -0
- package/dist/ui/assets/{form-utils-kUVlZZAO.js → form-utils-C-pVd1--.js} +1 -1
- package/dist/ui/assets/globalenv-section-BgoWz-A2.js +1 -0
- package/dist/ui/assets/{health-BaRdlHhs.js → health-Clpm6LpQ.js} +1 -1
- package/dist/ui/assets/icons-WqZToXEO.js +1 -0
- package/dist/ui/assets/{index-BuLI32Lk.js → index-B3Y_vbPs.js} +1 -1
- package/dist/ui/assets/index-C3Ezj6Tb.js +1 -0
- package/dist/ui/assets/index-CDRTPpUQ.js +47 -0
- package/dist/ui/assets/index-CNsISHN_.css +1 -0
- package/dist/ui/assets/{index-CAdQ23xy.js → index-fYt7TJz8.js} +1 -1
- package/dist/ui/assets/{notifications-dJQY2-U6.js → notifications-B2HqRBj7.js} +1 -1
- package/dist/ui/assets/{radix-ui-CBgg0XeO.js → radix-ui-CFOhsBGh.js} +4 -4
- package/dist/ui/assets/{react-vendor-B_CU-WTZ.js → react-vendor-CNOkPC89.js} +2 -2
- package/dist/ui/assets/shared-C95GV4af.js +1 -0
- package/dist/ui/assets/{switch-Kx7oj3ow.js → switch-CUS7UF_z.js} +1 -1
- package/dist/ui/assets/{tanstack-CxYN0q6L.js → tanstack-U3Rle5gh.js} +1 -1
- package/dist/ui/index.html +9 -9
- package/dist/web-server/index.d.ts.map +1 -1
- package/dist/web-server/index.js +5 -0
- package/dist/web-server/index.js.map +1 -1
- package/dist/web-server/middleware/auth-middleware.d.ts +27 -0
- package/dist/web-server/middleware/auth-middleware.d.ts.map +1 -0
- package/dist/web-server/middleware/auth-middleware.js +116 -0
- package/dist/web-server/middleware/auth-middleware.js.map +1 -0
- package/dist/web-server/routes/auth-routes.d.ts +7 -0
- package/dist/web-server/routes/auth-routes.d.ts.map +1 -0
- package/dist/web-server/routes/auth-routes.js +108 -0
- package/dist/web-server/routes/auth-routes.js.map +1 -0
- package/dist/web-server/routes/index.d.ts.map +1 -1
- package/dist/web-server/routes/index.js +3 -0
- package/dist/web-server/routes/index.js.map +1 -1
- package/package.json +6 -1
- package/dist/ui/assets/accounts-CJISzCiC.js +0 -1
- package/dist/ui/assets/api-DP559Tqr.js +0 -1
- package/dist/ui/assets/card-nbrHgs37.js +0 -1
- package/dist/ui/assets/cliproxy-ssaB44zs.js +0 -3
- package/dist/ui/assets/copilot-DsYQqfFs.js +0 -4
- package/dist/ui/assets/globalenv-section-Bli3PW-y.js +0 -1
- package/dist/ui/assets/icons-CZDQWWm2.js +0 -1
- package/dist/ui/assets/index-B7MyxZLG.js +0 -47
- package/dist/ui/assets/index-BX0IVNt5.css +0 -1
- package/dist/ui/assets/index-DIrZx85u.js +0 -1
- package/dist/ui/assets/shared-CNbeCoBd.js +0 -1
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Persist Command Handler
|
|
4
|
+
*
|
|
5
|
+
* Writes a profile's environment variables to ~/.claude/settings.json
|
|
6
|
+
* for native Claude Code usage (IDEs, extensions, etc.).
|
|
7
|
+
*
|
|
8
|
+
* Supports all profile types: API, CLIProxy, Copilot.
|
|
9
|
+
* Account-based profiles are not supported (use CLAUDE_CONFIG_DIR).
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.handlePersistCommand = void 0;
|
|
36
|
+
const fs = __importStar(require("fs"));
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
const ui_1 = require("../utils/ui");
|
|
40
|
+
const prompt_1 = require("../utils/prompt");
|
|
41
|
+
const profile_detector_1 = __importStar(require("../auth/profile-detector"));
|
|
42
|
+
const config_generator_1 = require("../cliproxy/config-generator");
|
|
43
|
+
const copilot_executor_1 = require("../copilot/copilot-executor");
|
|
44
|
+
const helpers_1 = require("../utils/helpers");
|
|
45
|
+
/** Parse command line arguments */
|
|
46
|
+
function parseArgs(args) {
|
|
47
|
+
const result = {};
|
|
48
|
+
for (let i = 0; i < args.length; i++) {
|
|
49
|
+
const arg = args[i];
|
|
50
|
+
if (arg === '--yes' || arg === '-y') {
|
|
51
|
+
result.yes = true;
|
|
52
|
+
}
|
|
53
|
+
else if (arg === '--help' || arg === '-h') {
|
|
54
|
+
// Will be handled in main function
|
|
55
|
+
}
|
|
56
|
+
else if (arg === '--list-backups') {
|
|
57
|
+
result.listBackups = true;
|
|
58
|
+
}
|
|
59
|
+
else if (arg === '--restore') {
|
|
60
|
+
// Check if next arg is a timestamp (not a flag)
|
|
61
|
+
const nextArg = args[i + 1];
|
|
62
|
+
if (nextArg && !nextArg.startsWith('-')) {
|
|
63
|
+
result.restore = nextArg;
|
|
64
|
+
i++; // Skip next arg
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
result.restore = true; // Use latest
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (!arg.startsWith('-') && !result.profile) {
|
|
71
|
+
result.profile = arg;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
/** Get Claude settings.json path */
|
|
77
|
+
function getClaudeSettingsPath() {
|
|
78
|
+
return path.join(os.homedir(), '.claude', 'settings.json');
|
|
79
|
+
}
|
|
80
|
+
/** Read existing Claude settings.json with validation */
|
|
81
|
+
function readClaudeSettings() {
|
|
82
|
+
const settingsPath = getClaudeSettingsPath();
|
|
83
|
+
try {
|
|
84
|
+
const content = fs.readFileSync(settingsPath, 'utf8');
|
|
85
|
+
// Handle empty file (0 bytes)
|
|
86
|
+
if (!content.trim()) {
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
const parsed = JSON.parse(content);
|
|
90
|
+
// Validate parsed value is a plain object (not array, null, or primitive)
|
|
91
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
92
|
+
throw new Error('settings.json must contain a JSON object, not an array or primitive');
|
|
93
|
+
}
|
|
94
|
+
return parsed;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
const nodeError = error;
|
|
98
|
+
if (nodeError.code === 'ENOENT') {
|
|
99
|
+
return {};
|
|
100
|
+
}
|
|
101
|
+
throw new Error(`Failed to parse settings.json: ${error.message}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Write settings back to settings.json
|
|
106
|
+
* Note: mode 0o600 only applies when creating a new file.
|
|
107
|
+
* Existing file permissions are preserved (acceptable behavior).
|
|
108
|
+
*/
|
|
109
|
+
function writeClaudeSettings(settings) {
|
|
110
|
+
const settingsPath = getClaudeSettingsPath();
|
|
111
|
+
// Security: Reject symlinks to prevent writing to unexpected locations
|
|
112
|
+
if (isSymlink(settingsPath)) {
|
|
113
|
+
throw new Error('settings.json is a symlink - refusing to write for security');
|
|
114
|
+
}
|
|
115
|
+
const dir = path.dirname(settingsPath);
|
|
116
|
+
if (!fs.existsSync(dir)) {
|
|
117
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
118
|
+
}
|
|
119
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', { mode: 0o600 });
|
|
120
|
+
}
|
|
121
|
+
/** Maximum number of backups to keep (oldest are deleted) */
|
|
122
|
+
const MAX_BACKUPS = 10;
|
|
123
|
+
/** Check if path is a symlink (security check) */
|
|
124
|
+
function isSymlink(filePath) {
|
|
125
|
+
try {
|
|
126
|
+
const stats = fs.lstatSync(filePath);
|
|
127
|
+
return stats.isSymbolicLink();
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** Create backup of settings.json with proper permissions and rotation */
|
|
134
|
+
function createBackup() {
|
|
135
|
+
const settingsPath = getClaudeSettingsPath();
|
|
136
|
+
if (!fs.existsSync(settingsPath)) {
|
|
137
|
+
throw new Error('No settings.json to backup');
|
|
138
|
+
}
|
|
139
|
+
// Security: Reject symlinks to prevent writing to unexpected locations
|
|
140
|
+
if (isSymlink(settingsPath)) {
|
|
141
|
+
throw new Error('settings.json is a symlink - refusing to backup for security');
|
|
142
|
+
}
|
|
143
|
+
const now = new Date();
|
|
144
|
+
const timestamp = now.getFullYear().toString() +
|
|
145
|
+
(now.getMonth() + 1).toString().padStart(2, '0') +
|
|
146
|
+
now.getDate().toString().padStart(2, '0') +
|
|
147
|
+
'_' +
|
|
148
|
+
now.getHours().toString().padStart(2, '0') +
|
|
149
|
+
now.getMinutes().toString().padStart(2, '0') +
|
|
150
|
+
now.getSeconds().toString().padStart(2, '0');
|
|
151
|
+
const backupPath = `${settingsPath}.backup.${timestamp}`;
|
|
152
|
+
fs.copyFileSync(settingsPath, backupPath);
|
|
153
|
+
// Security: Set restrictive permissions on backup (contains API keys)
|
|
154
|
+
fs.chmodSync(backupPath, 0o600);
|
|
155
|
+
// Cleanup: Rotate old backups (keep only MAX_BACKUPS)
|
|
156
|
+
cleanupOldBackups();
|
|
157
|
+
return backupPath;
|
|
158
|
+
}
|
|
159
|
+
/** Remove old backups keeping only MAX_BACKUPS most recent */
|
|
160
|
+
function cleanupOldBackups() {
|
|
161
|
+
const backups = getBackupFiles();
|
|
162
|
+
if (backups.length > MAX_BACKUPS) {
|
|
163
|
+
const toDelete = backups.slice(MAX_BACKUPS);
|
|
164
|
+
for (const backup of toDelete) {
|
|
165
|
+
try {
|
|
166
|
+
fs.unlinkSync(backup.path);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// Ignore deletion errors (file may be locked or already deleted)
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Get all backup files sorted by date (newest first) */
|
|
175
|
+
function getBackupFiles() {
|
|
176
|
+
const settingsPath = getClaudeSettingsPath();
|
|
177
|
+
const dir = path.dirname(settingsPath);
|
|
178
|
+
if (!fs.existsSync(dir)) {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
const backupPattern = /^settings\.json\.backup\.(\d{8}_\d{6})$/;
|
|
182
|
+
const files = fs
|
|
183
|
+
.readdirSync(dir)
|
|
184
|
+
.filter((f) => backupPattern.test(f))
|
|
185
|
+
.map((f) => {
|
|
186
|
+
const match = f.match(backupPattern);
|
|
187
|
+
if (!match)
|
|
188
|
+
return null;
|
|
189
|
+
const timestamp = match[1];
|
|
190
|
+
// Parse YYYYMMDD_HHMMSS
|
|
191
|
+
const year = parseInt(timestamp.slice(0, 4));
|
|
192
|
+
const month = parseInt(timestamp.slice(4, 6)) - 1;
|
|
193
|
+
const day = parseInt(timestamp.slice(6, 8));
|
|
194
|
+
const hour = parseInt(timestamp.slice(9, 11));
|
|
195
|
+
const min = parseInt(timestamp.slice(11, 13));
|
|
196
|
+
const sec = parseInt(timestamp.slice(13, 15));
|
|
197
|
+
return {
|
|
198
|
+
path: path.join(dir, f),
|
|
199
|
+
timestamp,
|
|
200
|
+
date: new Date(year, month, day, hour, min, sec),
|
|
201
|
+
};
|
|
202
|
+
})
|
|
203
|
+
.filter((f) => f !== null)
|
|
204
|
+
.sort((a, b) => b.date.getTime() - a.date.getTime()); // newest first
|
|
205
|
+
return files;
|
|
206
|
+
}
|
|
207
|
+
/** Mask API key for display (show first 4 and last 4 chars) */
|
|
208
|
+
function maskApiKey(key) {
|
|
209
|
+
if (key.length <= 12) {
|
|
210
|
+
return '****';
|
|
211
|
+
}
|
|
212
|
+
return `${key.slice(0, 4)}...${key.slice(-4)}`;
|
|
213
|
+
}
|
|
214
|
+
/** Resolve env vars for a profile */
|
|
215
|
+
async function resolveProfileEnvVars(profileName, profileResult) {
|
|
216
|
+
switch (profileResult.type) {
|
|
217
|
+
case 'settings': {
|
|
218
|
+
// API profile - load from settings file
|
|
219
|
+
let env = {};
|
|
220
|
+
if (profileResult.env) {
|
|
221
|
+
env = profileResult.env;
|
|
222
|
+
}
|
|
223
|
+
else if (profileResult.settingsPath) {
|
|
224
|
+
env = (0, profile_detector_1.loadSettingsFromFile)((0, helpers_1.expandPath)(profileResult.settingsPath));
|
|
225
|
+
}
|
|
226
|
+
if (Object.keys(env).length === 0) {
|
|
227
|
+
throw new Error(`Profile '${profileName}' has no env vars configured`);
|
|
228
|
+
}
|
|
229
|
+
return { env, profileType: 'API' };
|
|
230
|
+
}
|
|
231
|
+
case 'cliproxy': {
|
|
232
|
+
// CLIProxy profile - generate env vars
|
|
233
|
+
const provider = profileResult.provider || profileName;
|
|
234
|
+
const port = profileResult.port || config_generator_1.CLIPROXY_DEFAULT_PORT;
|
|
235
|
+
const env = (0, config_generator_1.getEffectiveEnvVars)(provider, port, profileResult.settingsPath);
|
|
236
|
+
return {
|
|
237
|
+
env,
|
|
238
|
+
profileType: 'CLIProxy',
|
|
239
|
+
warning: 'CLIProxy must be running for this profile to work',
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
case 'copilot': {
|
|
243
|
+
// Copilot profile - generate env vars
|
|
244
|
+
if (!profileResult.copilotConfig) {
|
|
245
|
+
throw new Error('Copilot configuration not found');
|
|
246
|
+
}
|
|
247
|
+
const env = (0, copilot_executor_1.generateCopilotEnv)(profileResult.copilotConfig);
|
|
248
|
+
return {
|
|
249
|
+
env,
|
|
250
|
+
profileType: 'Copilot',
|
|
251
|
+
warning: 'copilot-api daemon must be running for this profile to work',
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
case 'account': {
|
|
255
|
+
throw new Error(`Account profiles use CLAUDE_CONFIG_DIR isolation, not env vars.\n` +
|
|
256
|
+
`Use 'ccs ${profileName}' to run with this profile instead.`);
|
|
257
|
+
}
|
|
258
|
+
case 'default': {
|
|
259
|
+
throw new Error('Default profile has no env vars to persist.\n' +
|
|
260
|
+
'Specify a profile name: ccs persist <profile>');
|
|
261
|
+
}
|
|
262
|
+
default: {
|
|
263
|
+
throw new Error(`Unknown profile type: ${profileResult.type}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/** Handle --list-backups flag */
|
|
268
|
+
async function handleListBackups() {
|
|
269
|
+
await (0, ui_1.initUI)();
|
|
270
|
+
const backups = getBackupFiles();
|
|
271
|
+
if (backups.length === 0) {
|
|
272
|
+
console.log((0, ui_1.info)('No backups found'));
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
console.log((0, ui_1.header)('Available Backups'));
|
|
276
|
+
console.log('');
|
|
277
|
+
backups.forEach((b, i) => {
|
|
278
|
+
const dateStr = b.date.toLocaleString();
|
|
279
|
+
const marker = i === 0 ? (0, ui_1.color)(' (latest)', 'success') : '';
|
|
280
|
+
console.log(` ${(0, ui_1.color)(b.timestamp, 'command')} ${(0, ui_1.dim)(dateStr)}${marker}`);
|
|
281
|
+
});
|
|
282
|
+
console.log('');
|
|
283
|
+
console.log((0, ui_1.dim)('To restore: ccs persist --restore [timestamp]'));
|
|
284
|
+
}
|
|
285
|
+
/** Handle --restore [timestamp] flag */
|
|
286
|
+
async function handleRestore(timestamp, yes) {
|
|
287
|
+
await (0, ui_1.initUI)();
|
|
288
|
+
const backups = getBackupFiles();
|
|
289
|
+
if (backups.length === 0) {
|
|
290
|
+
console.log((0, ui_1.fail)('No backups found'));
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}
|
|
293
|
+
// Find backup to restore
|
|
294
|
+
let backup;
|
|
295
|
+
if (timestamp === true) {
|
|
296
|
+
// Use latest
|
|
297
|
+
backup = backups[0];
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
const found = backups.find((b) => b.timestamp === timestamp);
|
|
301
|
+
if (!found) {
|
|
302
|
+
console.log((0, ui_1.fail)(`Backup not found: ${timestamp}`));
|
|
303
|
+
console.log('');
|
|
304
|
+
console.log('Available backups:');
|
|
305
|
+
backups.slice(0, 5).forEach((b) => console.log(` ${b.timestamp}`));
|
|
306
|
+
process.exit(1);
|
|
307
|
+
}
|
|
308
|
+
backup = found;
|
|
309
|
+
}
|
|
310
|
+
console.log((0, ui_1.header)('Restore Backup'));
|
|
311
|
+
console.log('');
|
|
312
|
+
console.log(`Backup: ${(0, ui_1.color)(backup.timestamp, 'command')}`);
|
|
313
|
+
console.log(`Date: ${backup.date.toLocaleString()}`);
|
|
314
|
+
console.log('');
|
|
315
|
+
console.log((0, ui_1.warn)('This will replace ~/.claude/settings.json'));
|
|
316
|
+
console.log('');
|
|
317
|
+
if (!yes) {
|
|
318
|
+
const proceed = await prompt_1.InteractivePrompt.confirm('Proceed with restore?', { default: false });
|
|
319
|
+
if (!proceed) {
|
|
320
|
+
console.log((0, ui_1.info)('Cancelled'));
|
|
321
|
+
process.exit(0);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// Validate backup JSON integrity before restore
|
|
325
|
+
try {
|
|
326
|
+
const backupContent = fs.readFileSync(backup.path, 'utf8');
|
|
327
|
+
const parsed = JSON.parse(backupContent);
|
|
328
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
329
|
+
console.log((0, ui_1.fail)('Backup file is corrupted: not a valid JSON object'));
|
|
330
|
+
process.exit(1);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
console.log((0, ui_1.fail)(`Backup file is corrupted: ${error.message}`));
|
|
335
|
+
process.exit(1);
|
|
336
|
+
}
|
|
337
|
+
// Security: Reject symlink backup files
|
|
338
|
+
if (isSymlink(backup.path)) {
|
|
339
|
+
console.log((0, ui_1.fail)('Backup file is a symlink - refusing to restore for security'));
|
|
340
|
+
process.exit(1);
|
|
341
|
+
}
|
|
342
|
+
// Copy backup over settings.json
|
|
343
|
+
const settingsPath = getClaudeSettingsPath();
|
|
344
|
+
// Security: Reject symlink target
|
|
345
|
+
if (isSymlink(settingsPath)) {
|
|
346
|
+
console.log((0, ui_1.fail)('settings.json is a symlink - refusing to restore for security'));
|
|
347
|
+
process.exit(1);
|
|
348
|
+
}
|
|
349
|
+
fs.copyFileSync(backup.path, settingsPath);
|
|
350
|
+
console.log((0, ui_1.ok)(`Restored from backup: ${backup.timestamp}`));
|
|
351
|
+
}
|
|
352
|
+
/** Show help for persist command */
|
|
353
|
+
async function showHelp() {
|
|
354
|
+
await (0, ui_1.initUI)();
|
|
355
|
+
console.log((0, ui_1.header)('CCS Persist Command'));
|
|
356
|
+
console.log('');
|
|
357
|
+
console.log((0, ui_1.subheader)('Usage'));
|
|
358
|
+
console.log(` ${(0, ui_1.color)('ccs persist', 'command')} <profile> [options]`);
|
|
359
|
+
console.log(` ${(0, ui_1.color)('ccs persist', 'command')} --list-backups`);
|
|
360
|
+
console.log(` ${(0, ui_1.color)('ccs persist', 'command')} --restore [timestamp]`);
|
|
361
|
+
console.log('');
|
|
362
|
+
console.log((0, ui_1.subheader)('Description'));
|
|
363
|
+
console.log(" Writes a profile's environment variables directly to");
|
|
364
|
+
console.log(' ~/.claude/settings.json for native Claude Code usage.');
|
|
365
|
+
console.log('');
|
|
366
|
+
console.log(' This allows Claude Code to use the profile without CCS,');
|
|
367
|
+
console.log(' enabling compatibility with IDEs and extensions.');
|
|
368
|
+
console.log('');
|
|
369
|
+
console.log((0, ui_1.subheader)('Options'));
|
|
370
|
+
console.log(` ${(0, ui_1.color)('--yes, -y', 'command')} Skip confirmation prompts (auto-backup)`);
|
|
371
|
+
console.log(` ${(0, ui_1.color)('--help, -h', 'command')} Show this help message`);
|
|
372
|
+
console.log('');
|
|
373
|
+
console.log((0, ui_1.subheader)('Backup Management'));
|
|
374
|
+
console.log(` ${(0, ui_1.color)('--list-backups', 'command')} List available backup files`);
|
|
375
|
+
console.log(` ${(0, ui_1.color)('--restore', 'command')} Restore from the most recent backup`);
|
|
376
|
+
console.log(` ${(0, ui_1.color)('--restore <ts>', 'command')} Restore from specific backup (e.g., 20260110_205324)`);
|
|
377
|
+
console.log('');
|
|
378
|
+
console.log((0, ui_1.subheader)('Supported Profile Types'));
|
|
379
|
+
console.log(` ${(0, ui_1.color)('API profiles', 'command')} glm, glmt, kimi, custom API profiles`);
|
|
380
|
+
console.log(` ${(0, ui_1.color)('CLIProxy', 'command')} gemini, codex, agy, qwen, kiro, ghcp`);
|
|
381
|
+
console.log(` ${(0, ui_1.color)('Copilot', 'command')} copilot (requires copilot-api daemon)`);
|
|
382
|
+
console.log(` ${(0, ui_1.dim)('Account-based')} Not supported (uses CLAUDE_CONFIG_DIR)`);
|
|
383
|
+
console.log('');
|
|
384
|
+
console.log((0, ui_1.subheader)('Examples'));
|
|
385
|
+
console.log(` ${(0, ui_1.dim)('# Persist GLM profile')}`);
|
|
386
|
+
console.log(` ${(0, ui_1.color)('ccs persist glm', 'command')}`);
|
|
387
|
+
console.log('');
|
|
388
|
+
console.log(` ${(0, ui_1.dim)('# Persist with auto-confirmation')}`);
|
|
389
|
+
console.log(` ${(0, ui_1.color)('ccs persist gemini --yes', 'command')}`);
|
|
390
|
+
console.log('');
|
|
391
|
+
console.log(` ${(0, ui_1.dim)('# List all backups')}`);
|
|
392
|
+
console.log(` ${(0, ui_1.color)('ccs persist --list-backups', 'command')}`);
|
|
393
|
+
console.log('');
|
|
394
|
+
console.log(` ${(0, ui_1.dim)('# Restore latest backup')}`);
|
|
395
|
+
console.log(` ${(0, ui_1.color)('ccs persist --restore', 'command')}`);
|
|
396
|
+
console.log('');
|
|
397
|
+
console.log(` ${(0, ui_1.dim)('# Restore specific backup')}`);
|
|
398
|
+
console.log(` ${(0, ui_1.color)('ccs persist --restore 20260110_205324', 'command')}`);
|
|
399
|
+
console.log('');
|
|
400
|
+
console.log((0, ui_1.subheader)('Notes'));
|
|
401
|
+
console.log(' [i] CLIProxy profiles require the proxy to be running.');
|
|
402
|
+
console.log(' [i] Copilot profiles require copilot-api daemon.');
|
|
403
|
+
console.log(' [i] Backups are saved as ~/.claude/settings.json.backup.YYYYMMDD_HHMMSS');
|
|
404
|
+
console.log('');
|
|
405
|
+
}
|
|
406
|
+
/** Main persist command handler */
|
|
407
|
+
async function handlePersistCommand(args) {
|
|
408
|
+
// Check for help first
|
|
409
|
+
if (args.includes('--help') || args.includes('-h') || args.length === 0) {
|
|
410
|
+
await showHelp();
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
const parsedArgs = parseArgs(args);
|
|
414
|
+
// Handle --list-backups
|
|
415
|
+
if (parsedArgs.listBackups) {
|
|
416
|
+
await handleListBackups();
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
// Handle --restore
|
|
420
|
+
if (parsedArgs.restore) {
|
|
421
|
+
await handleRestore(parsedArgs.restore, parsedArgs.yes ?? false);
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
await (0, ui_1.initUI)();
|
|
425
|
+
if (!parsedArgs.profile) {
|
|
426
|
+
console.log((0, ui_1.fail)('Profile name is required'));
|
|
427
|
+
console.log('');
|
|
428
|
+
console.log('Usage:');
|
|
429
|
+
console.log(` ${(0, ui_1.color)('ccs persist <profile>', 'command')}`);
|
|
430
|
+
console.log('');
|
|
431
|
+
console.log('Run for help:');
|
|
432
|
+
console.log(` ${(0, ui_1.color)('ccs persist --help', 'command')}`);
|
|
433
|
+
process.exit(1);
|
|
434
|
+
}
|
|
435
|
+
// Detect profile
|
|
436
|
+
const detector = new profile_detector_1.default();
|
|
437
|
+
let profileResult;
|
|
438
|
+
try {
|
|
439
|
+
profileResult = detector.detectProfileType(parsedArgs.profile);
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
const err = error;
|
|
443
|
+
console.log((0, ui_1.fail)(`Profile not found: ${parsedArgs.profile}`));
|
|
444
|
+
console.log('');
|
|
445
|
+
if (err.availableProfiles) {
|
|
446
|
+
console.log(err.availableProfiles);
|
|
447
|
+
}
|
|
448
|
+
process.exit(1);
|
|
449
|
+
}
|
|
450
|
+
// Resolve env vars
|
|
451
|
+
let resolved;
|
|
452
|
+
try {
|
|
453
|
+
resolved = await resolveProfileEnvVars(parsedArgs.profile, profileResult);
|
|
454
|
+
}
|
|
455
|
+
catch (error) {
|
|
456
|
+
console.log((0, ui_1.fail)(error.message));
|
|
457
|
+
process.exit(1);
|
|
458
|
+
}
|
|
459
|
+
// Display what will be written
|
|
460
|
+
console.log((0, ui_1.header)(`Persist Profile: ${parsedArgs.profile}`));
|
|
461
|
+
console.log('');
|
|
462
|
+
console.log(`Profile type: ${(0, ui_1.color)(resolved.profileType, 'command')}`);
|
|
463
|
+
console.log('');
|
|
464
|
+
console.log('The following env vars will be written to ~/.claude/settings.json:');
|
|
465
|
+
console.log('');
|
|
466
|
+
// Display env vars (mask sensitive values)
|
|
467
|
+
const envKeys = Object.keys(resolved.env);
|
|
468
|
+
if (envKeys.length === 0) {
|
|
469
|
+
console.log((0, ui_1.fail)('Profile has no environment variables to persist'));
|
|
470
|
+
process.exit(1);
|
|
471
|
+
}
|
|
472
|
+
const maxKeyLen = Math.max(...envKeys.map((k) => k.length));
|
|
473
|
+
for (const [key, value] of Object.entries(resolved.env)) {
|
|
474
|
+
const paddedKey = key.padEnd(maxKeyLen + 2);
|
|
475
|
+
const displayValue = key.includes('TOKEN') || key.includes('KEY') || key.includes('SECRET')
|
|
476
|
+
? maskApiKey(value)
|
|
477
|
+
: value;
|
|
478
|
+
console.log(` ${(0, ui_1.color)(paddedKey, 'command')} = ${displayValue}`);
|
|
479
|
+
}
|
|
480
|
+
console.log('');
|
|
481
|
+
// Show warning if applicable
|
|
482
|
+
if (resolved.warning) {
|
|
483
|
+
console.log((0, ui_1.warn)(resolved.warning));
|
|
484
|
+
console.log('');
|
|
485
|
+
}
|
|
486
|
+
// Warning about modification
|
|
487
|
+
console.log((0, ui_1.warn)('This will modify ~/.claude/settings.json'));
|
|
488
|
+
console.log((0, ui_1.dim)(' Existing hooks and other settings will be preserved.'));
|
|
489
|
+
console.log('');
|
|
490
|
+
// Check if settings.json exists for backup
|
|
491
|
+
const settingsPath = getClaudeSettingsPath();
|
|
492
|
+
const settingsExist = fs.existsSync(settingsPath);
|
|
493
|
+
// Track backup path for error recovery guidance
|
|
494
|
+
let createdBackupPath = null;
|
|
495
|
+
// Backup prompt (unless --yes)
|
|
496
|
+
if (settingsExist) {
|
|
497
|
+
let createBackupFlag = parsedArgs.yes === true; // Auto-backup with --yes
|
|
498
|
+
if (!parsedArgs.yes) {
|
|
499
|
+
createBackupFlag = await prompt_1.InteractivePrompt.confirm('Create backup before modifying?', {
|
|
500
|
+
default: true,
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
if (createBackupFlag) {
|
|
504
|
+
try {
|
|
505
|
+
createdBackupPath = createBackup();
|
|
506
|
+
console.log((0, ui_1.ok)(`Backup created: ${createdBackupPath.replace(os.homedir(), '~')}`));
|
|
507
|
+
console.log('');
|
|
508
|
+
}
|
|
509
|
+
catch (error) {
|
|
510
|
+
console.log((0, ui_1.fail)(`Failed to create backup: ${error.message}`));
|
|
511
|
+
process.exit(1);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
// Proceed confirmation (unless --yes)
|
|
516
|
+
if (!parsedArgs.yes) {
|
|
517
|
+
const proceed = await prompt_1.InteractivePrompt.confirm('Proceed with persist?', { default: true });
|
|
518
|
+
if (!proceed) {
|
|
519
|
+
console.log((0, ui_1.info)('Cancelled'));
|
|
520
|
+
process.exit(0);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
// Read existing settings and merge
|
|
524
|
+
const existingSettings = readClaudeSettings();
|
|
525
|
+
// Validate existing env is an object (not array/primitive)
|
|
526
|
+
const rawEnv = existingSettings.env;
|
|
527
|
+
let existingEnv = {};
|
|
528
|
+
if (rawEnv !== undefined && rawEnv !== null) {
|
|
529
|
+
if (typeof rawEnv !== 'object' || Array.isArray(rawEnv)) {
|
|
530
|
+
console.log((0, ui_1.warn)('Existing env in settings.json is not an object - it will be replaced'));
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
existingEnv = rawEnv;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
const mergedSettings = {
|
|
537
|
+
...existingSettings,
|
|
538
|
+
env: {
|
|
539
|
+
...existingEnv,
|
|
540
|
+
...resolved.env,
|
|
541
|
+
},
|
|
542
|
+
};
|
|
543
|
+
// Write merged settings
|
|
544
|
+
try {
|
|
545
|
+
writeClaudeSettings(mergedSettings);
|
|
546
|
+
}
|
|
547
|
+
catch (error) {
|
|
548
|
+
console.log((0, ui_1.fail)(`Failed to write settings: ${error.message}`));
|
|
549
|
+
if (createdBackupPath) {
|
|
550
|
+
console.log('');
|
|
551
|
+
console.log((0, ui_1.info)(`A backup was created before this error:`));
|
|
552
|
+
console.log(` ${createdBackupPath.replace(os.homedir(), '~')}`);
|
|
553
|
+
console.log((0, ui_1.dim)(' To restore: ccs persist --restore'));
|
|
554
|
+
}
|
|
555
|
+
process.exit(1);
|
|
556
|
+
}
|
|
557
|
+
console.log('');
|
|
558
|
+
console.log((0, ui_1.ok)(`Profile '${parsedArgs.profile}' written to ~/.claude/settings.json`));
|
|
559
|
+
console.log('');
|
|
560
|
+
console.log((0, ui_1.info)('Claude Code will now use this profile by default.'));
|
|
561
|
+
console.log((0, ui_1.dim)(' To revert, restore the backup or edit settings.json manually.'));
|
|
562
|
+
console.log('');
|
|
563
|
+
}
|
|
564
|
+
exports.handlePersistCommand = handlePersistCommand;
|
|
565
|
+
//# sourceMappingURL=persist-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persist-command.js","sourceRoot":"","sources":["../../src/commands/persist-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Loads and saves the unified YAML configuration.
|
|
5
5
|
* Provides fallback to legacy JSON format for backward compatibility.
|
|
6
6
|
*/
|
|
7
|
-
import { UnifiedConfig, GlobalEnvConfig } from './unified-config-types';
|
|
7
|
+
import { UnifiedConfig, GlobalEnvConfig, DashboardAuthConfig } from './unified-config-types';
|
|
8
8
|
/**
|
|
9
9
|
* Get path to unified config.yaml
|
|
10
10
|
*/
|
|
@@ -98,4 +98,9 @@ export declare function getWebSearchConfig(): {
|
|
|
98
98
|
* Returns defaults if not configured.
|
|
99
99
|
*/
|
|
100
100
|
export declare function getGlobalEnvConfig(): GlobalEnvConfig;
|
|
101
|
+
/**
|
|
102
|
+
* Get dashboard_auth configuration with ENV var override.
|
|
103
|
+
* Priority: ENV vars > config.yaml > defaults
|
|
104
|
+
*/
|
|
105
|
+
export declare function getDashboardAuthConfig(): DashboardAuthConfig;
|
|
101
106
|
//# sourceMappingURL=unified-config-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unified-config-loader.d.ts","sourceRoot":"","sources":["../../src/config/unified-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EACL,aAAa,
|
|
1
|
+
{"version":3,"file":"unified-config-loader.d.ts","sourceRoot":"","sources":["../../src/config/unified-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EACL,aAAa,EASb,eAAe,EACf,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAMhC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,CAK1D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,GAAG,IAAI,CAuCxD;AAiJD;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,aAAa,CAUzD;AA+LD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAiC7D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAKlF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAGtD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE;QACV,MAAM,CAAC,EAAE,mBAAmB,CAAC;QAC7B,QAAQ,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,OAAO,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACnE,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,OAAO,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAChD,CAAC;IAEF,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD,CAqCA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAMpD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,mBAAmB,CAiB5D"}
|