@kaitranntt/ccs 5.3.0 → 5.4.0-beta.2
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/VERSION +1 -1
- package/dist/auth/auth-commands.d.ts +5 -1
- package/dist/auth/auth-commands.d.ts.map +1 -1
- package/dist/auth/auth-commands.js +146 -99
- package/dist/auth/auth-commands.js.map +1 -1
- package/dist/auth/profile-detector.d.ts.map +1 -1
- package/dist/auth/profile-detector.js +12 -1
- package/dist/auth/profile-detector.js.map +1 -1
- package/dist/ccs.js +7 -7
- package/dist/ccs.js.map +1 -1
- package/dist/commands/api-command.d.ts +11 -0
- package/dist/commands/api-command.d.ts.map +1 -0
- package/dist/commands/{profile-command.js → api-command.js} +142 -106
- package/dist/commands/api-command.js.map +1 -0
- package/dist/commands/help-command.d.ts +1 -1
- package/dist/commands/help-command.d.ts.map +1 -1
- package/dist/commands/help-command.js +174 -88
- package/dist/commands/help-command.js.map +1 -1
- package/dist/delegation/delegation-handler.js +2 -2
- package/dist/delegation/delegation-handler.js.map +1 -1
- package/dist/delegation/headless-executor.d.ts.map +1 -1
- package/dist/delegation/headless-executor.js +7 -4
- package/dist/delegation/headless-executor.js.map +1 -1
- package/dist/delegation/result-formatter.d.ts +6 -25
- package/dist/delegation/result-formatter.d.ts.map +1 -1
- package/dist/delegation/result-formatter.js +77 -116
- package/dist/delegation/result-formatter.js.map +1 -1
- package/dist/management/doctor.d.ts.map +1 -1
- package/dist/management/doctor.js +127 -105
- package/dist/management/doctor.js.map +1 -1
- package/dist/types/utils.d.ts +43 -0
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/utils/error-manager.d.ts +9 -9
- package/dist/utils/error-manager.d.ts.map +1 -1
- package/dist/utils/error-manager.js +88 -92
- package/dist/utils/error-manager.js.map +1 -1
- package/dist/utils/helpers.d.ts +1 -0
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +12 -0
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/shell-executor.js +2 -2
- package/dist/utils/shell-executor.js.map +1 -1
- package/dist/utils/ui.d.ts +147 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +570 -0
- package/dist/utils/ui.js.map +1 -0
- package/package.json +5 -1
- package/scripts/postinstall.js +21 -4
- package/dist/commands/profile-command.d.ts +0 -11
- package/dist/commands/profile-command.d.ts.map +0 -1
- package/dist/commands/profile-command.js.map +0 -1
package/dist/utils/ui.js
ADDED
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Central UI Abstraction Layer
|
|
4
|
+
*
|
|
5
|
+
* Provides semantic, TTY-aware styling for CLI output.
|
|
6
|
+
* Wraps chalk, boxen, cli-table3, ora with consistent API.
|
|
7
|
+
*
|
|
8
|
+
* Constraints:
|
|
9
|
+
* - NO EMOJIS (ASCII only: [OK], [X], [!], [i])
|
|
10
|
+
* - TTY-aware (plain text in pipes/CI)
|
|
11
|
+
* - Respects NO_COLOR environment variable
|
|
12
|
+
*
|
|
13
|
+
* @module utils/ui
|
|
14
|
+
*/
|
|
15
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
18
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
19
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
|
+
}
|
|
21
|
+
Object.defineProperty(o, k2, desc);
|
|
22
|
+
}) : (function(o, m, k, k2) {
|
|
23
|
+
if (k2 === undefined) k2 = k;
|
|
24
|
+
o[k2] = m[k];
|
|
25
|
+
}));
|
|
26
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
27
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
28
|
+
}) : function(o, v) {
|
|
29
|
+
o["default"] = v;
|
|
30
|
+
});
|
|
31
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ui = exports.taskList = exports.isClaudeCodeContext = exports.sectionHeader = exports.hr = exports.subheader = exports.header = exports.spinner = exports.table = exports.infoBox = exports.errorBox = exports.box = exports.info = exports.warn = exports.fail = exports.ok = exports.dim = exports.bold = exports.gradientText = exports.color = exports.isInteractive = exports.initUI = void 0;
|
|
40
|
+
// Module cache for lazy loading
|
|
41
|
+
let chalkModule = null;
|
|
42
|
+
let boxenModule = null;
|
|
43
|
+
let gradientModule = null;
|
|
44
|
+
let oraModule = null;
|
|
45
|
+
let listrModule = null;
|
|
46
|
+
// Initialization state
|
|
47
|
+
let initialized = false;
|
|
48
|
+
// =============================================================================
|
|
49
|
+
// COLOR PALETTE (Professional cyan-to-blue)
|
|
50
|
+
// =============================================================================
|
|
51
|
+
const COLORS = {
|
|
52
|
+
primary: '#00ECFA', // Bright cyan
|
|
53
|
+
secondary: '#0099FF', // Sky blue
|
|
54
|
+
neutral: '#808080', // Gray
|
|
55
|
+
};
|
|
56
|
+
// =============================================================================
|
|
57
|
+
// INITIALIZATION
|
|
58
|
+
// =============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Initialize UI dependencies (call once at startup)
|
|
61
|
+
* Uses dynamic imports for ESM packages in CommonJS project
|
|
62
|
+
*/
|
|
63
|
+
async function initUI() {
|
|
64
|
+
if (initialized)
|
|
65
|
+
return;
|
|
66
|
+
try {
|
|
67
|
+
// Dynamic import for ESM-only packages
|
|
68
|
+
const [chalkImport, boxenImport, gradientImport, oraImport, listrImport] = await Promise.all([
|
|
69
|
+
Promise.resolve().then(() => __importStar(require('chalk'))),
|
|
70
|
+
Promise.resolve().then(() => __importStar(require('boxen'))),
|
|
71
|
+
Promise.resolve().then(() => __importStar(require('gradient-string'))),
|
|
72
|
+
Promise.resolve().then(() => __importStar(require('ora'))),
|
|
73
|
+
Promise.resolve().then(() => __importStar(require('listr2'))),
|
|
74
|
+
]);
|
|
75
|
+
chalkModule = chalkImport.default;
|
|
76
|
+
boxenModule = boxenImport.default;
|
|
77
|
+
gradientModule = gradientImport.default;
|
|
78
|
+
oraModule = oraImport.default;
|
|
79
|
+
listrModule = listrImport.Listr;
|
|
80
|
+
initialized = true;
|
|
81
|
+
}
|
|
82
|
+
catch (_e) {
|
|
83
|
+
// Fallback: UI works without colors if imports fail
|
|
84
|
+
console.error('[!] UI initialization failed, using plain text mode');
|
|
85
|
+
initialized = true;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.initUI = initUI;
|
|
89
|
+
// =============================================================================
|
|
90
|
+
// TTY & COLOR DETECTION
|
|
91
|
+
// =============================================================================
|
|
92
|
+
/**
|
|
93
|
+
* Check if colors should be used
|
|
94
|
+
* Respects NO_COLOR and FORCE_COLOR environment variables
|
|
95
|
+
*/
|
|
96
|
+
function useColors() {
|
|
97
|
+
// FORCE_COLOR overrides all checks
|
|
98
|
+
if (process.env.FORCE_COLOR)
|
|
99
|
+
return true;
|
|
100
|
+
// NO_COLOR disables colors
|
|
101
|
+
if (process.env.NO_COLOR)
|
|
102
|
+
return false;
|
|
103
|
+
// Otherwise, check if TTY
|
|
104
|
+
return !!process.stdout.isTTY;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if interactive mode (TTY + not CI)
|
|
108
|
+
*/
|
|
109
|
+
function isInteractive() {
|
|
110
|
+
return !!process.stdout.isTTY && !process.env.CI && !process.env.NO_COLOR;
|
|
111
|
+
}
|
|
112
|
+
exports.isInteractive = isInteractive;
|
|
113
|
+
// =============================================================================
|
|
114
|
+
// COLOR SYSTEM
|
|
115
|
+
// =============================================================================
|
|
116
|
+
/**
|
|
117
|
+
* Apply semantic color to text
|
|
118
|
+
*/
|
|
119
|
+
function color(text, semantic) {
|
|
120
|
+
if (!chalkModule || !useColors())
|
|
121
|
+
return text;
|
|
122
|
+
switch (semantic) {
|
|
123
|
+
case 'success':
|
|
124
|
+
return chalkModule.green.bold(text);
|
|
125
|
+
case 'error':
|
|
126
|
+
return chalkModule.red.bold(text);
|
|
127
|
+
case 'warning':
|
|
128
|
+
return chalkModule.yellow(text);
|
|
129
|
+
case 'info':
|
|
130
|
+
return chalkModule.cyan(text);
|
|
131
|
+
case 'dim':
|
|
132
|
+
return chalkModule.gray(text);
|
|
133
|
+
case 'primary':
|
|
134
|
+
return chalkModule.hex(COLORS.primary).bold(text);
|
|
135
|
+
case 'secondary':
|
|
136
|
+
return chalkModule.hex(COLORS.secondary)(text);
|
|
137
|
+
case 'command':
|
|
138
|
+
return chalkModule.yellow.bold(text);
|
|
139
|
+
case 'path':
|
|
140
|
+
return chalkModule.cyan.underline(text);
|
|
141
|
+
default:
|
|
142
|
+
return text;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.color = color;
|
|
146
|
+
/**
|
|
147
|
+
* Apply gradient to text (for headers)
|
|
148
|
+
* Uses cyan-to-blue gradient for professional look
|
|
149
|
+
*/
|
|
150
|
+
function gradientText(text) {
|
|
151
|
+
if (!gradientModule || !useColors())
|
|
152
|
+
return text;
|
|
153
|
+
return gradientModule([COLORS.primary, COLORS.secondary])(text);
|
|
154
|
+
}
|
|
155
|
+
exports.gradientText = gradientText;
|
|
156
|
+
/**
|
|
157
|
+
* Bold text
|
|
158
|
+
*/
|
|
159
|
+
function bold(text) {
|
|
160
|
+
if (!chalkModule || !useColors())
|
|
161
|
+
return text;
|
|
162
|
+
return chalkModule.bold(text);
|
|
163
|
+
}
|
|
164
|
+
exports.bold = bold;
|
|
165
|
+
/**
|
|
166
|
+
* Dim text
|
|
167
|
+
*/
|
|
168
|
+
function dim(text) {
|
|
169
|
+
if (!chalkModule || !useColors())
|
|
170
|
+
return text;
|
|
171
|
+
return chalkModule.dim(text);
|
|
172
|
+
}
|
|
173
|
+
exports.dim = dim;
|
|
174
|
+
// =============================================================================
|
|
175
|
+
// STATUS INDICATORS (ASCII only - NO EMOJIS)
|
|
176
|
+
// =============================================================================
|
|
177
|
+
/**
|
|
178
|
+
* Success indicator: [OK]
|
|
179
|
+
*/
|
|
180
|
+
function ok(message) {
|
|
181
|
+
return `${color('[OK]', 'success')} ${message}`;
|
|
182
|
+
}
|
|
183
|
+
exports.ok = ok;
|
|
184
|
+
/**
|
|
185
|
+
* Error indicator: [X]
|
|
186
|
+
*/
|
|
187
|
+
function fail(message) {
|
|
188
|
+
return `${color('[X]', 'error')} ${message}`;
|
|
189
|
+
}
|
|
190
|
+
exports.fail = fail;
|
|
191
|
+
/**
|
|
192
|
+
* Warning indicator: [!]
|
|
193
|
+
*/
|
|
194
|
+
function warn(message) {
|
|
195
|
+
return `${color('[!]', 'warning')} ${message}`;
|
|
196
|
+
}
|
|
197
|
+
exports.warn = warn;
|
|
198
|
+
/**
|
|
199
|
+
* Info indicator: [i]
|
|
200
|
+
*/
|
|
201
|
+
function info(message) {
|
|
202
|
+
return `${color('[i]', 'info')} ${message}`;
|
|
203
|
+
}
|
|
204
|
+
exports.info = info;
|
|
205
|
+
// =============================================================================
|
|
206
|
+
// BOX RENDERING
|
|
207
|
+
// =============================================================================
|
|
208
|
+
/**
|
|
209
|
+
* Fallback ASCII box renderer (when boxen not available)
|
|
210
|
+
*/
|
|
211
|
+
function renderAsciiBox(content, options) {
|
|
212
|
+
const lines = content.split('\n');
|
|
213
|
+
const maxLen = Math.max(...lines.map((l) => l.length), (options.title?.length || 0) + 4);
|
|
214
|
+
const width = maxLen + 4;
|
|
215
|
+
let result = '';
|
|
216
|
+
const padding = options.padding ?? 1;
|
|
217
|
+
// Top border with optional title
|
|
218
|
+
if (options.title) {
|
|
219
|
+
const titlePad = Math.floor((width - options.title.length - 4) / 2);
|
|
220
|
+
result +=
|
|
221
|
+
'+' +
|
|
222
|
+
'-'.repeat(titlePad) +
|
|
223
|
+
' ' +
|
|
224
|
+
options.title +
|
|
225
|
+
' ' +
|
|
226
|
+
'-'.repeat(width - titlePad - options.title.length - 4) +
|
|
227
|
+
'+\n';
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
result += '+' + '-'.repeat(width - 2) + '+\n';
|
|
231
|
+
}
|
|
232
|
+
// Padding top
|
|
233
|
+
for (let i = 0; i < padding; i++) {
|
|
234
|
+
result += '|' + ' '.repeat(width - 2) + '|\n';
|
|
235
|
+
}
|
|
236
|
+
// Content
|
|
237
|
+
for (const line of lines) {
|
|
238
|
+
const pad = width - line.length - 4;
|
|
239
|
+
result += '| ' + line + ' '.repeat(Math.max(0, pad)) + ' |\n';
|
|
240
|
+
}
|
|
241
|
+
// Padding bottom
|
|
242
|
+
for (let i = 0; i < padding; i++) {
|
|
243
|
+
result += '|' + ' '.repeat(width - 2) + '|\n';
|
|
244
|
+
}
|
|
245
|
+
// Bottom border
|
|
246
|
+
result += '+' + '-'.repeat(width - 2) + '+';
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Render content in a styled box
|
|
251
|
+
*/
|
|
252
|
+
function box(content, options = {}) {
|
|
253
|
+
if (!boxenModule) {
|
|
254
|
+
return renderAsciiBox(content, options);
|
|
255
|
+
}
|
|
256
|
+
const borderColor = useColors() ? options.borderColor || COLORS.primary : undefined;
|
|
257
|
+
return boxenModule(content, {
|
|
258
|
+
padding: options.padding ?? 1,
|
|
259
|
+
margin: options.margin ?? 0,
|
|
260
|
+
borderStyle: options.borderStyle || 'round',
|
|
261
|
+
borderColor,
|
|
262
|
+
title: options.title,
|
|
263
|
+
titleAlignment: options.titleAlignment || 'center',
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
exports.box = box;
|
|
267
|
+
/**
|
|
268
|
+
* Render error box (red border)
|
|
269
|
+
*/
|
|
270
|
+
function errorBox(content, title = 'ERROR') {
|
|
271
|
+
return box(content, {
|
|
272
|
+
title,
|
|
273
|
+
borderColor: 'red',
|
|
274
|
+
borderStyle: 'round',
|
|
275
|
+
padding: 1,
|
|
276
|
+
margin: 1,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
exports.errorBox = errorBox;
|
|
280
|
+
/**
|
|
281
|
+
* Render info box (primary color border)
|
|
282
|
+
*/
|
|
283
|
+
function infoBox(content, title) {
|
|
284
|
+
return box(content, {
|
|
285
|
+
title,
|
|
286
|
+
borderColor: COLORS.primary,
|
|
287
|
+
borderStyle: 'round',
|
|
288
|
+
padding: 1,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
exports.infoBox = infoBox;
|
|
292
|
+
// =============================================================================
|
|
293
|
+
// TABLE RENDERING
|
|
294
|
+
// =============================================================================
|
|
295
|
+
// cli-table3 is CommonJS, use dynamic import pattern
|
|
296
|
+
const Table = require('cli-table3');
|
|
297
|
+
/**
|
|
298
|
+
* Create styled table
|
|
299
|
+
*/
|
|
300
|
+
function table(rows, options = {}) {
|
|
301
|
+
// Build table configuration
|
|
302
|
+
const tableConfig = {
|
|
303
|
+
wordWrap: options.wordWrap ?? true,
|
|
304
|
+
chars: options.style === 'ascii'
|
|
305
|
+
? {
|
|
306
|
+
top: '-',
|
|
307
|
+
'top-mid': '+',
|
|
308
|
+
'top-left': '+',
|
|
309
|
+
'top-right': '+',
|
|
310
|
+
bottom: '-',
|
|
311
|
+
'bottom-mid': '+',
|
|
312
|
+
'bottom-left': '+',
|
|
313
|
+
'bottom-right': '+',
|
|
314
|
+
left: '|',
|
|
315
|
+
'left-mid': '+',
|
|
316
|
+
mid: '-',
|
|
317
|
+
'mid-mid': '+',
|
|
318
|
+
right: '|',
|
|
319
|
+
'right-mid': '+',
|
|
320
|
+
middle: '|',
|
|
321
|
+
}
|
|
322
|
+
: {
|
|
323
|
+
top: '─',
|
|
324
|
+
'top-mid': '┬',
|
|
325
|
+
'top-left': '┌',
|
|
326
|
+
'top-right': '┐',
|
|
327
|
+
bottom: '─',
|
|
328
|
+
'bottom-mid': '┴',
|
|
329
|
+
'bottom-left': '└',
|
|
330
|
+
'bottom-right': '┘',
|
|
331
|
+
left: '│',
|
|
332
|
+
'left-mid': '├',
|
|
333
|
+
mid: '─',
|
|
334
|
+
'mid-mid': '┼',
|
|
335
|
+
right: '│',
|
|
336
|
+
'right-mid': '┤',
|
|
337
|
+
middle: '│',
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
// Only add head if provided (cli-table3 requires head length to match rows)
|
|
341
|
+
if (options.head && options.head.length > 0) {
|
|
342
|
+
tableConfig.head = options.head.map((h) => color(h, 'primary'));
|
|
343
|
+
}
|
|
344
|
+
// Only add colWidths if provided
|
|
345
|
+
if (options.colWidths) {
|
|
346
|
+
tableConfig.colWidths = options.colWidths;
|
|
347
|
+
}
|
|
348
|
+
const tableInstance = new Table(tableConfig);
|
|
349
|
+
rows.forEach((row) => tableInstance.push(row));
|
|
350
|
+
return tableInstance.toString();
|
|
351
|
+
}
|
|
352
|
+
exports.table = table;
|
|
353
|
+
// =============================================================================
|
|
354
|
+
// SPINNER / PROGRESS
|
|
355
|
+
// =============================================================================
|
|
356
|
+
/**
|
|
357
|
+
* Create and start a spinner
|
|
358
|
+
* Falls back to plain text output in non-TTY environments
|
|
359
|
+
*/
|
|
360
|
+
async function spinner(options) {
|
|
361
|
+
const opts = typeof options === 'string' ? { text: options } : options;
|
|
362
|
+
const isEnabled = isInteractive();
|
|
363
|
+
// Lazy load ora if not already loaded
|
|
364
|
+
if (!oraModule && isEnabled) {
|
|
365
|
+
try {
|
|
366
|
+
oraModule = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
|
|
367
|
+
}
|
|
368
|
+
catch (_e) {
|
|
369
|
+
// Fallback to plain text
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
if (oraModule && isEnabled) {
|
|
373
|
+
const s = oraModule({
|
|
374
|
+
text: opts.text,
|
|
375
|
+
color: 'cyan',
|
|
376
|
+
prefixText: opts.prefixText,
|
|
377
|
+
isEnabled,
|
|
378
|
+
}).start();
|
|
379
|
+
return {
|
|
380
|
+
succeed: (msg) => s.succeed(msg || `${color('[OK]', 'success')} ${opts.text}`),
|
|
381
|
+
fail: (msg) => s.fail(msg || `${color('[X]', 'error')} ${opts.text}`),
|
|
382
|
+
warn: (msg) => s.warn(msg || `${color('[!]', 'warning')} ${opts.text}`),
|
|
383
|
+
info: (msg) => s.info(msg || `${color('[i]', 'info')} ${opts.text}`),
|
|
384
|
+
update: (text) => {
|
|
385
|
+
s.text = text;
|
|
386
|
+
},
|
|
387
|
+
stop: () => s.stop(),
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
// Fallback: plain text (non-TTY)
|
|
391
|
+
console.log(`[i] ${opts.text}...`);
|
|
392
|
+
return {
|
|
393
|
+
succeed: (msg) => console.log(ok(msg || opts.text)),
|
|
394
|
+
fail: (msg) => console.log(fail(msg || opts.text)),
|
|
395
|
+
warn: (msg) => console.log(warn(msg || opts.text)),
|
|
396
|
+
info: (msg) => console.log(info(msg || opts.text)),
|
|
397
|
+
update: (_text) => {
|
|
398
|
+
/* no-op in non-TTY */
|
|
399
|
+
},
|
|
400
|
+
stop: () => {
|
|
401
|
+
/* no-op */
|
|
402
|
+
},
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
exports.spinner = spinner;
|
|
406
|
+
// =============================================================================
|
|
407
|
+
// SECTION HEADERS
|
|
408
|
+
// =============================================================================
|
|
409
|
+
/**
|
|
410
|
+
* Print section header with optional gradient
|
|
411
|
+
*/
|
|
412
|
+
function header(text, useGradient = true) {
|
|
413
|
+
if (useGradient && useColors()) {
|
|
414
|
+
return gradientText(text);
|
|
415
|
+
}
|
|
416
|
+
return bold(text);
|
|
417
|
+
}
|
|
418
|
+
exports.header = header;
|
|
419
|
+
/**
|
|
420
|
+
* Print subsection header
|
|
421
|
+
*/
|
|
422
|
+
function subheader(text) {
|
|
423
|
+
return color(text, 'primary');
|
|
424
|
+
}
|
|
425
|
+
exports.subheader = subheader;
|
|
426
|
+
/**
|
|
427
|
+
* Print horizontal rule
|
|
428
|
+
*/
|
|
429
|
+
function hr(char = '─', width = 60) {
|
|
430
|
+
if (!useColors()) {
|
|
431
|
+
return '-'.repeat(width);
|
|
432
|
+
}
|
|
433
|
+
return dim(char.repeat(width));
|
|
434
|
+
}
|
|
435
|
+
exports.hr = hr;
|
|
436
|
+
/**
|
|
437
|
+
* Print section header with ═══ borders
|
|
438
|
+
* Format: ═══ Title ═══
|
|
439
|
+
*/
|
|
440
|
+
function sectionHeader(title) {
|
|
441
|
+
const border = '═══';
|
|
442
|
+
const headerText = `${border} ${title} ${border}`;
|
|
443
|
+
// Use gradient + bold for visual appeal
|
|
444
|
+
if (gradientModule && chalkModule && useColors()) {
|
|
445
|
+
return chalkModule.bold(gradientModule([COLORS.primary, COLORS.secondary])(headerText));
|
|
446
|
+
}
|
|
447
|
+
// Fallback to bold primary color
|
|
448
|
+
if (useColors() && chalkModule) {
|
|
449
|
+
return chalkModule.hex(COLORS.primary).bold(headerText);
|
|
450
|
+
}
|
|
451
|
+
return headerText;
|
|
452
|
+
}
|
|
453
|
+
exports.sectionHeader = sectionHeader;
|
|
454
|
+
// =============================================================================
|
|
455
|
+
// TASK LISTS (Listr2 Integration)
|
|
456
|
+
// =============================================================================
|
|
457
|
+
/**
|
|
458
|
+
* Detect if running inside Claude Code tool context
|
|
459
|
+
*
|
|
460
|
+
* Heuristics:
|
|
461
|
+
* - No TTY (stdout captured)
|
|
462
|
+
* - CI-like environment
|
|
463
|
+
* - CLAUDE_CODE env var set
|
|
464
|
+
*/
|
|
465
|
+
function isClaudeCodeContext() {
|
|
466
|
+
return (!process.stdout.isTTY ||
|
|
467
|
+
!!process.env.CI ||
|
|
468
|
+
!!process.env.CLAUDE_CODE ||
|
|
469
|
+
process.env.TERM === 'dumb');
|
|
470
|
+
}
|
|
471
|
+
exports.isClaudeCodeContext = isClaudeCodeContext;
|
|
472
|
+
/**
|
|
473
|
+
* Create a task list for progress display
|
|
474
|
+
* Uses Listr2 in TTY mode, falls back to spinners in non-TTY
|
|
475
|
+
*/
|
|
476
|
+
async function taskList(tasks, options = {}) {
|
|
477
|
+
// Lazy load Listr2 if not already loaded
|
|
478
|
+
if (!listrModule && isInteractive()) {
|
|
479
|
+
try {
|
|
480
|
+
const listr2 = await Promise.resolve().then(() => __importStar(require('listr2')));
|
|
481
|
+
listrModule = listr2.Listr;
|
|
482
|
+
}
|
|
483
|
+
catch (_e) {
|
|
484
|
+
// Fallback to sequential execution with spinners
|
|
485
|
+
return runTasksFallback(tasks);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
if (listrModule && isInteractive()) {
|
|
489
|
+
// Determine renderer based on context
|
|
490
|
+
// Use 'simple' in non-TTY, CI, or Claude Code context
|
|
491
|
+
const useSimple = isClaudeCodeContext();
|
|
492
|
+
const list = new listrModule(tasks.map((t) => ({
|
|
493
|
+
title: t.title,
|
|
494
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
495
|
+
task: async (ctx) => t.task(ctx),
|
|
496
|
+
skip: t.skip,
|
|
497
|
+
})), {
|
|
498
|
+
concurrent: options.concurrent ?? false,
|
|
499
|
+
renderer: useSimple ? 'simple' : 'default',
|
|
500
|
+
rendererOptions: {
|
|
501
|
+
showSubtasks: true,
|
|
502
|
+
collapseSubtasks: false,
|
|
503
|
+
},
|
|
504
|
+
});
|
|
505
|
+
return list.run({});
|
|
506
|
+
}
|
|
507
|
+
// Fallback: non-interactive or Listr2 not available
|
|
508
|
+
return runTasksFallback(tasks);
|
|
509
|
+
}
|
|
510
|
+
exports.taskList = taskList;
|
|
511
|
+
/**
|
|
512
|
+
* Fallback task runner (no Listr2)
|
|
513
|
+
* Uses spinners for sequential task execution
|
|
514
|
+
*/
|
|
515
|
+
async function runTasksFallback(tasks) {
|
|
516
|
+
const ctx = {};
|
|
517
|
+
for (const task of tasks) {
|
|
518
|
+
if (task.skip) {
|
|
519
|
+
const skipResult = task.skip();
|
|
520
|
+
if (skipResult) {
|
|
521
|
+
console.log(info(`${task.title} [skipped]`));
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
const spin = await spinner(task.title);
|
|
526
|
+
try {
|
|
527
|
+
await task.task(ctx);
|
|
528
|
+
spin.succeed();
|
|
529
|
+
}
|
|
530
|
+
catch (e) {
|
|
531
|
+
spin.fail(`${task.title}: ${e.message}`);
|
|
532
|
+
throw e;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
return ctx;
|
|
536
|
+
}
|
|
537
|
+
// =============================================================================
|
|
538
|
+
// UNIFIED EXPORT OBJECT
|
|
539
|
+
// =============================================================================
|
|
540
|
+
exports.ui = {
|
|
541
|
+
// Initialization
|
|
542
|
+
init: initUI,
|
|
543
|
+
isInteractive,
|
|
544
|
+
isClaudeCodeContext,
|
|
545
|
+
// Colors
|
|
546
|
+
color,
|
|
547
|
+
gradientText,
|
|
548
|
+
bold,
|
|
549
|
+
dim,
|
|
550
|
+
// Status indicators (ASCII only)
|
|
551
|
+
ok,
|
|
552
|
+
fail,
|
|
553
|
+
warn,
|
|
554
|
+
info,
|
|
555
|
+
// Containers
|
|
556
|
+
box,
|
|
557
|
+
errorBox,
|
|
558
|
+
infoBox,
|
|
559
|
+
table,
|
|
560
|
+
// Progress
|
|
561
|
+
spinner,
|
|
562
|
+
taskList,
|
|
563
|
+
// Headers
|
|
564
|
+
header,
|
|
565
|
+
subheader,
|
|
566
|
+
sectionHeader,
|
|
567
|
+
hr,
|
|
568
|
+
};
|
|
569
|
+
exports.default = exports.ui;
|
|
570
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kaitranntt/ccs",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.4.0-beta.2",
|
|
4
4
|
"description": "Claude Code Switch - Instant profile switching between Claude Sonnet 4.5 and GLM 4.6",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cli",
|
|
@@ -70,7 +70,11 @@
|
|
|
70
70
|
"postinstall": "node scripts/postinstall.js"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
+
"boxen": "^8.0.1",
|
|
74
|
+
"chalk": "^5.6.2",
|
|
73
75
|
"cli-table3": "^0.6.5",
|
|
76
|
+
"gradient-string": "^3.0.0",
|
|
77
|
+
"listr2": "^9.0.5",
|
|
74
78
|
"ora": "^9.0.0"
|
|
75
79
|
},
|
|
76
80
|
"devDependencies": {
|
package/scripts/postinstall.js
CHANGED
|
@@ -125,12 +125,14 @@ function createConfigFiles() {
|
|
|
125
125
|
// runs `ccs gemini` or `ccs codex` for first time (requires OAuth auth first)
|
|
126
126
|
const configPath = path.join(ccsDir, 'config.json');
|
|
127
127
|
if (!fs.existsSync(configPath)) {
|
|
128
|
+
// NOTE: No 'default' entry - when no profile specified, CCS passes through
|
|
129
|
+
// to Claude's native auth without --settings flag. This prevents env var
|
|
130
|
+
// pollution from affecting the default profile.
|
|
128
131
|
const config = {
|
|
129
132
|
profiles: {
|
|
130
133
|
glm: '~/.ccs/glm.settings.json',
|
|
131
134
|
glmt: '~/.ccs/glmt.settings.json',
|
|
132
|
-
kimi: '~/.ccs/kimi.settings.json'
|
|
133
|
-
default: '~/.claude/settings.json'
|
|
135
|
+
kimi: '~/.ccs/kimi.settings.json'
|
|
134
136
|
}
|
|
135
137
|
};
|
|
136
138
|
|
|
@@ -141,23 +143,38 @@ function createConfigFiles() {
|
|
|
141
143
|
|
|
142
144
|
console.log('[OK] Created config: ~/.ccs/config.json');
|
|
143
145
|
} else {
|
|
144
|
-
// Update existing config
|
|
146
|
+
// Update existing config (migration for older versions)
|
|
145
147
|
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
|
|
146
148
|
// Ensure profiles object exists
|
|
147
149
|
if (!config.profiles) {
|
|
148
150
|
config.profiles = {};
|
|
149
151
|
}
|
|
150
152
|
let configUpdated = false;
|
|
153
|
+
|
|
154
|
+
// Migration: Add glmt if missing (v3.x)
|
|
151
155
|
if (!config.profiles.glmt) {
|
|
152
156
|
config.profiles.glmt = '~/.ccs/glmt.settings.json';
|
|
153
157
|
configUpdated = true;
|
|
154
158
|
}
|
|
159
|
+
|
|
160
|
+
// Migration: Remove 'default' entry pointing to ~/.claude/settings.json (v5.4.0)
|
|
161
|
+
// This entry caused the default profile to pass --settings flag, which could
|
|
162
|
+
// pick up stale env vars (ANTHROPIC_BASE_URL) from previous profile sessions.
|
|
163
|
+
// Fix: Let CCS pass through to Claude's native auth without --settings flag.
|
|
164
|
+
if (config.profiles.default === '~/.claude/settings.json') {
|
|
165
|
+
delete config.profiles.default;
|
|
166
|
+
configUpdated = true;
|
|
167
|
+
console.log('[OK] Removed legacy default profile (now uses native Claude auth)');
|
|
168
|
+
}
|
|
169
|
+
|
|
155
170
|
// NOTE: gemini/codex profiles added on-demand, not during migration
|
|
156
171
|
if (configUpdated) {
|
|
157
172
|
const tmpPath = `${configPath}.tmp`;
|
|
158
173
|
fs.writeFileSync(tmpPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
|
|
159
174
|
fs.renameSync(tmpPath, configPath);
|
|
160
|
-
|
|
175
|
+
if (!config.profiles.glmt) {
|
|
176
|
+
console.log('[OK] Updated config with glmt profile');
|
|
177
|
+
}
|
|
161
178
|
} else {
|
|
162
179
|
console.log('[OK] Config exists: ~/.ccs/config.json (preserved)');
|
|
163
180
|
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Profile Command Handler
|
|
3
|
-
*
|
|
4
|
-
* Manages CCS profiles for custom API providers.
|
|
5
|
-
* Commands: create, list
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Main profile command router
|
|
9
|
-
*/
|
|
10
|
-
export declare function handleProfileCommand(args: string[]): Promise<void>;
|
|
11
|
-
//# sourceMappingURL=profile-command.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profile-command.d.ts","sourceRoot":"","sources":["../../src/commands/profile-command.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmYH;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BxE"}
|