@wengine-ai/claude-code-router 2.0.54 → 2.0.56

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.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/dist/README.md +763 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +1193 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/index.html +225 -0
  7. package/dist/index.js +1539 -0
  8. package/dist/package.json +31 -0
  9. package/dist/tiktoken_bg.wasm +0 -0
  10. package/dist/utils/activateCommand.d.ts +4 -0
  11. package/dist/utils/activateCommand.js +24 -0
  12. package/dist/utils/activateCommand.js.map +1 -0
  13. package/dist/utils/claudeSettings.d.ts +12 -0
  14. package/dist/utils/claudeSettings.js +188 -0
  15. package/dist/utils/claudeSettings.js.map +1 -0
  16. package/dist/utils/codeCommand.d.ts +13 -0
  17. package/dist/utils/codeCommand.js +88 -0
  18. package/dist/utils/codeCommand.js.map +1 -0
  19. package/dist/utils/createEnvVariables.d.ts +5 -0
  20. package/dist/utils/createEnvVariables.js +83 -0
  21. package/dist/utils/createEnvVariables.js.map +1 -0
  22. package/dist/utils/index.d.ts +15 -0
  23. package/dist/utils/index.js +271 -0
  24. package/dist/utils/index.js.map +1 -0
  25. package/dist/utils/installCommand.d.ts +9 -0
  26. package/dist/utils/installCommand.js +47 -0
  27. package/dist/utils/installCommand.js.map +1 -0
  28. package/dist/utils/modelSelector.d.ts +1 -0
  29. package/dist/utils/modelSelector.js +402 -0
  30. package/dist/utils/modelSelector.js.map +1 -0
  31. package/dist/utils/preset/commands.d.ts +8 -0
  32. package/dist/utils/preset/commands.js +267 -0
  33. package/dist/utils/preset/commands.js.map +1 -0
  34. package/dist/utils/preset/export.d.ts +11 -0
  35. package/dist/utils/preset/export.js +97 -0
  36. package/dist/utils/preset/export.js.map +1 -0
  37. package/dist/utils/preset/index.d.ts +8 -0
  38. package/dist/utils/preset/index.js +32 -0
  39. package/dist/utils/preset/index.js.map +1 -0
  40. package/dist/utils/preset/install-github.d.ts +13 -0
  41. package/dist/utils/preset/install-github.js +161 -0
  42. package/dist/utils/preset/install-github.js.map +1 -0
  43. package/dist/utils/preset/install.d.ts +19 -0
  44. package/dist/utils/preset/install.js +239 -0
  45. package/dist/utils/preset/install.js.map +1 -0
  46. package/dist/utils/processCheck.d.ts +17 -0
  47. package/dist/utils/processCheck.js +161 -0
  48. package/dist/utils/processCheck.js.map +1 -0
  49. package/dist/utils/prompt/schema-input.d.ts +26 -0
  50. package/dist/utils/prompt/schema-input.js +183 -0
  51. package/dist/utils/prompt/schema-input.js.map +1 -0
  52. package/dist/utils/status.d.ts +1 -0
  53. package/dist/utils/status.js +28 -0
  54. package/dist/utils/status.js.map +1 -0
  55. package/dist/utils/statusline.d.ts +61 -0
  56. package/dist/utils/statusline.js +924 -0
  57. package/dist/utils/statusline.js.map +1 -0
  58. package/dist/utils/update.d.ts +18 -0
  59. package/dist/utils/update.js +74 -0
  60. package/dist/utils/update.js.map +1 -0
  61. package/package.json +25 -4
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ /**
3
+ * Preset command handler CLI layer
4
+ * Handles CLI interactions, core logic is in the shared package
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ var __importDefault = (this && this.__importDefault) || function (mod) {
40
+ return (mod && mod.__esModule) ? mod : { "default": mod };
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.handlePresetCommand = handlePresetCommand;
44
+ const fs = __importStar(require("fs/promises"));
45
+ const path = __importStar(require("path"));
46
+ const json5_1 = __importDefault(require("json5"));
47
+ const export_1 = require("./export");
48
+ const install_1 = require("./install");
49
+ const claude_code_router_shared_1 = require("@wengine-ai/claude-code-router-shared");
50
+ // ANSI color codes
51
+ const RESET = "\x1B[0m";
52
+ const GREEN = "\x1B[32m";
53
+ const YELLOW = "\x1B[33m";
54
+ const BOLDCYAN = "\x1B[1m\x1B[36m";
55
+ const BOLDYELLOW = "\x1B[1m\x1B[33m";
56
+ const DIM = "\x1B[2m";
57
+ /**
58
+ * List local presets
59
+ */
60
+ async function listPresets() {
61
+ const presetsDir = path.join(claude_code_router_shared_1.HOME_DIR, 'presets');
62
+ try {
63
+ await fs.access(presetsDir);
64
+ }
65
+ catch {
66
+ console.log('\nNo presets directory found.');
67
+ console.log(`\nCreate your first preset with: ${GREEN}ccr preset export <name>${RESET}\n`);
68
+ return;
69
+ }
70
+ const entries = await fs.readdir(presetsDir, { withFileTypes: true });
71
+ const presetDirs = entries.filter(e => e.isDirectory() && !e.name.startsWith('.')).map(e => e.name);
72
+ if (presetDirs.length === 0) {
73
+ console.log('\nNo presets found.');
74
+ console.log(`\nInstall a preset with: ${GREEN}ccr preset install <file>${RESET}\n`);
75
+ return;
76
+ }
77
+ console.log(`\n${BOLDCYAN}Available presets:${RESET}\n`);
78
+ for (const dirName of presetDirs) {
79
+ const presetDir = path.join(presetsDir, dirName);
80
+ try {
81
+ const manifestPath = path.join(presetDir, 'manifest.json');
82
+ const content = await fs.readFile(manifestPath, 'utf-8');
83
+ const manifest = json5_1.default.parse(content);
84
+ // Extract metadata fields from manifest
85
+ const { Providers, Router, PORT, HOST, API_TIMEOUT_MS, PROXY_URL, LOG, LOG_LEVEL, StatusLine, NON_INTERACTIVE_MODE, ...metadata } = manifest;
86
+ const name = metadata.name || dirName;
87
+ const description = metadata.description || '';
88
+ const author = metadata.author || '';
89
+ const version = metadata.version;
90
+ // Display preset name
91
+ if (version) {
92
+ console.log(`${GREEN}•${RESET} ${BOLDCYAN}${name}${RESET} (v${version})`);
93
+ }
94
+ else {
95
+ console.log(`${GREEN}•${RESET} ${BOLDCYAN}${name}${RESET}`);
96
+ }
97
+ // Display description
98
+ if (description) {
99
+ console.log(` ${description}`);
100
+ }
101
+ // Display author
102
+ if (author) {
103
+ console.log(` ${DIM}by ${author}${RESET}`);
104
+ }
105
+ console.log('');
106
+ }
107
+ catch (error) {
108
+ console.log(`${YELLOW}•${RESET} ${dirName}`);
109
+ console.log(` ${DIM}(Error reading preset)${RESET}\n`);
110
+ }
111
+ }
112
+ }
113
+ /**
114
+ * Delete preset
115
+ */
116
+ async function deletePreset(name) {
117
+ const presetsDir = path.join(claude_code_router_shared_1.HOME_DIR, 'presets');
118
+ // Validate preset name (prevent path traversal)
119
+ if (!name || name.includes('..') || name.includes('/') || name.includes('\\')) {
120
+ console.error(`\n${YELLOW}Error:${RESET} Invalid preset name.\n`);
121
+ process.exit(1);
122
+ }
123
+ const presetDir = path.join(presetsDir, name);
124
+ try {
125
+ // Recursively delete entire directory
126
+ await fs.rm(presetDir, { recursive: true, force: true });
127
+ console.log(`\n${GREEN}✓${RESET} Preset "${name}" deleted.\n`);
128
+ }
129
+ catch (error) {
130
+ if (error.code === 'ENOENT') {
131
+ console.error(`\n${YELLOW}Error:${RESET} Preset "${name}" not found.\n`);
132
+ }
133
+ else {
134
+ console.error(`\n${YELLOW}Error:${RESET} ${error.message}\n`);
135
+ }
136
+ process.exit(1);
137
+ }
138
+ }
139
+ /**
140
+ * Show preset information
141
+ */
142
+ async function showPresetInfo(name) {
143
+ try {
144
+ const preset = await (0, install_1.loadPreset)(name);
145
+ const config = preset.config;
146
+ const metadata = preset.metadata;
147
+ console.log(`\n${BOLDCYAN}═══════════════════════════════════════════════${RESET}`);
148
+ if (metadata?.name) {
149
+ console.log(`${BOLDCYAN}Preset: ${RESET}${metadata.name}`);
150
+ }
151
+ else {
152
+ console.log(`${BOLDCYAN}Preset: ${RESET}${name}`);
153
+ }
154
+ console.log(`${BOLDCYAN}═══════════════════════════════════════════════${RESET}\n`);
155
+ if (metadata?.version)
156
+ console.log(`${BOLDCYAN}Version:${RESET} ${metadata.version}`);
157
+ if (metadata?.description)
158
+ console.log(`${BOLDCYAN}Description:${RESET} ${metadata.description}`);
159
+ if (metadata?.author)
160
+ console.log(`${BOLDCYAN}Author:${RESET} ${metadata.author}`);
161
+ const keywords = metadata?.keywords;
162
+ if (keywords && keywords.length > 0) {
163
+ console.log(`${BOLDCYAN}Keywords:${RESET} ${keywords.join(', ')}`);
164
+ }
165
+ console.log(`\n${BOLDCYAN}Configuration:${RESET}`);
166
+ if (config.Providers) {
167
+ console.log(` Providers: ${config.Providers.length}`);
168
+ }
169
+ if (config.Router) {
170
+ console.log(` Router rules: ${Object.keys(config.Router).length}`);
171
+ }
172
+ if (config.provider) {
173
+ console.log(` Provider: ${config.provider}`);
174
+ }
175
+ if (preset.schema && preset.schema.length > 0) {
176
+ console.log(`\n${BOLDYELLOW}Required inputs:${RESET}`);
177
+ for (const input of preset.schema) {
178
+ const label = input.label || input.id;
179
+ const prompt = input.prompt || '';
180
+ console.log(` - ${label}${prompt ? ` ${DIM}(${prompt})${RESET}` : ''}`);
181
+ }
182
+ }
183
+ console.log('');
184
+ }
185
+ catch (error) {
186
+ console.error(`\n${YELLOW}Error:${RESET} ${error.message}\n`);
187
+ process.exit(1);
188
+ }
189
+ }
190
+ /**
191
+ * Handle preset commands
192
+ */
193
+ async function handlePresetCommand(args) {
194
+ const subCommand = args[0];
195
+ switch (subCommand) {
196
+ case 'export':
197
+ const presetName = args[1];
198
+ if (!presetName) {
199
+ console.error('\nError: Preset name is required\n');
200
+ console.error('Usage: ccr preset export <name> [--output <path>] [--description <text>] [--author <name>] [--tags <tags>]\n');
201
+ process.exit(1);
202
+ }
203
+ // Parse options
204
+ const options = {};
205
+ for (let i = 2; i < args.length; i++) {
206
+ if (args[i] === '--output' && args[i + 1]) {
207
+ options.output = args[++i];
208
+ }
209
+ else if (args[i] === '--description' && args[i + 1]) {
210
+ options.description = args[++i];
211
+ }
212
+ else if (args[i] === '--author' && args[i + 1]) {
213
+ options.author = args[++i];
214
+ }
215
+ else if (args[i] === '--tags' && args[i + 1]) {
216
+ options.tags = args[++i];
217
+ }
218
+ else if (args[i] === '--include-sensitive') {
219
+ options.includeSensitive = true;
220
+ }
221
+ }
222
+ await (0, export_1.exportPresetCli)(presetName, options);
223
+ break;
224
+ case 'install':
225
+ const source = args[1];
226
+ if (!source) {
227
+ console.error('\nError: Preset source is required\n');
228
+ console.error('Usage: ccr preset install <file | url | name>\n');
229
+ process.exit(1);
230
+ }
231
+ await (0, install_1.installPresetCli)(source, {});
232
+ break;
233
+ case 'list':
234
+ await listPresets();
235
+ break;
236
+ case 'delete':
237
+ case 'rm':
238
+ case 'remove':
239
+ const deleteName = args[1];
240
+ if (!deleteName) {
241
+ console.error('\nError: Preset name is required\n');
242
+ console.error('Usage: ccr preset delete <name>\n');
243
+ process.exit(1);
244
+ }
245
+ await deletePreset(deleteName);
246
+ break;
247
+ case 'info':
248
+ const infoName = args[1];
249
+ if (!infoName) {
250
+ console.error('\nError: Preset name is required\n');
251
+ console.error('Usage: ccr preset info <name>\n');
252
+ process.exit(1);
253
+ }
254
+ await showPresetInfo(infoName);
255
+ break;
256
+ default:
257
+ console.error(`\nError: Unknown preset command "${subCommand}"\n`);
258
+ console.error('Available commands:');
259
+ console.error(' ccr preset export <name> Export current configuration as a preset');
260
+ console.error(' ccr preset install <source> Install a preset from file, URL, or registry');
261
+ console.error(' ccr preset list List installed presets');
262
+ console.error(' ccr preset info <name> Show preset information');
263
+ console.error(' ccr preset delete <name> Delete a preset\n');
264
+ process.exit(1);
265
+ }
266
+ }
267
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/utils/preset/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Preset export functionality CLI layer
3
+ * Handles CLI interactions, core logic is in shared package
4
+ */
5
+ import { ExportOptions } from '@wengine-ai/claude-code-router-shared';
6
+ /**
7
+ * Export preset configuration (CLI version, with interaction)
8
+ * @param presetName Preset name
9
+ * @param options Export options
10
+ */
11
+ export declare function exportPresetCli(presetName: string, options?: ExportOptions): Promise<void>;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ /**
3
+ * Preset export functionality CLI layer
4
+ * Handles CLI interactions, core logic is in shared package
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.exportPresetCli = exportPresetCli;
8
+ const prompts_1 = require("@inquirer/prompts");
9
+ const index_1 = require("../index");
10
+ const claude_code_router_shared_1 = require("@wengine-ai/claude-code-router-shared");
11
+ // ANSI color codes
12
+ const RESET = "\x1B[0m";
13
+ const GREEN = "\x1B[32m";
14
+ const BOLDGREEN = "\x1B[1m\x1B[32m";
15
+ const YELLOW = "\x1B[33m";
16
+ const BOLDCYAN = "\x1B[1m\x1B[36m";
17
+ /**
18
+ * Export preset configuration (CLI version, with interaction)
19
+ * @param presetName Preset name
20
+ * @param options Export options
21
+ */
22
+ async function exportPresetCli(presetName, options = {}) {
23
+ try {
24
+ console.log(`\n${BOLDCYAN}═══════════════════════════════════════════════${RESET}`);
25
+ console.log(`${BOLDCYAN} Preset Export${RESET}`);
26
+ console.log(`${BOLDCYAN}═══════════════════════════════════════════════${RESET}\n`);
27
+ // 1. Read current configuration
28
+ const config = await (0, index_1.readConfigFile)();
29
+ // 2. Interactively ask for metadata if not provided via command line
30
+ if (!options.description) {
31
+ try {
32
+ options.description = await (0, prompts_1.input)({
33
+ message: 'Description (optional):',
34
+ default: '',
35
+ });
36
+ }
37
+ catch {
38
+ // User cancelled, use default value
39
+ options.description = '';
40
+ }
41
+ }
42
+ if (!options.author) {
43
+ try {
44
+ options.author = await (0, prompts_1.input)({
45
+ message: 'Author (optional):',
46
+ default: '',
47
+ });
48
+ }
49
+ catch {
50
+ options.author = '';
51
+ }
52
+ }
53
+ if (!options.tags) {
54
+ try {
55
+ const keywordsInput = await (0, prompts_1.input)({
56
+ message: 'Keywords (comma-separated, optional):',
57
+ default: '',
58
+ });
59
+ options.tags = keywordsInput || '';
60
+ }
61
+ catch {
62
+ options.tags = '';
63
+ }
64
+ }
65
+ // 3. Call core export functionality
66
+ const result = await (0, claude_code_router_shared_1.exportPreset)(presetName, config, options);
67
+ // 4. Display summary
68
+ console.log(`\n${BOLDGREEN}✓ Preset exported successfully${RESET}\n`);
69
+ console.log(`${BOLDCYAN}Location:${RESET} ${result.presetDir}\n`);
70
+ console.log(`${BOLDCYAN}Summary:${RESET}`);
71
+ console.log(` - Providers: ${result.sanitizedConfig.Providers?.length || 0}`);
72
+ console.log(` - Router rules: ${Object.keys(result.sanitizedConfig.Router || {}).length}`);
73
+ if (!options.includeSensitive) {
74
+ console.log(` - Sensitive fields sanitized: ${YELLOW}${result.sanitizedCount}${RESET}`);
75
+ }
76
+ // Display metadata
77
+ if (result.metadata.description) {
78
+ console.log(`\n${BOLDCYAN}Description:${RESET} ${result.metadata.description}`);
79
+ }
80
+ if (result.metadata.author) {
81
+ console.log(`${BOLDCYAN}Author:${RESET} ${result.metadata.author}`);
82
+ }
83
+ if (result.metadata.keywords && result.metadata.keywords.length > 0) {
84
+ console.log(`${BOLDCYAN}Keywords:${RESET} ${result.metadata.keywords.join(', ')}`);
85
+ }
86
+ // Display sharing tips
87
+ console.log(`\n${BOLDCYAN}To share this preset:${RESET}`);
88
+ console.log(` 1. Share the directory: ${result.presetDir}`);
89
+ console.log(` 2. Upload to GitHub Gist or your repository`);
90
+ console.log(` 3. Others can install with: ${GREEN}ccr preset install <directory>${RESET}\n`);
91
+ }
92
+ catch (error) {
93
+ console.error(`\n${YELLOW}Error exporting preset:${RESET} ${error.message}`);
94
+ throw error;
95
+ }
96
+ }
97
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/utils/preset/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 预设功能 CLI 层
3
+ * 导出所有预设相关的功能和类型
4
+ */
5
+ export * from '@wengine-ai/claude-code-router-shared';
6
+ export { exportPresetCli } from './export';
7
+ export { installPresetCli, applyPresetCli } from './install';
8
+ export { handlePresetCommand } from './commands';
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /**
3
+ * 预设功能 CLI 层
4
+ * 导出所有预设相关的功能和类型
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.handlePresetCommand = exports.applyPresetCli = exports.installPresetCli = exports.exportPresetCli = void 0;
22
+ // 从 shared 包重新导出类型和核心功能
23
+ __exportStar(require("@wengine-ai/claude-code-router-shared"), exports);
24
+ // 导出 CLI 特定的功能(带交互)
25
+ var export_1 = require("./export");
26
+ Object.defineProperty(exports, "exportPresetCli", { enumerable: true, get: function () { return export_1.exportPresetCli; } });
27
+ var install_1 = require("./install");
28
+ Object.defineProperty(exports, "installPresetCli", { enumerable: true, get: function () { return install_1.installPresetCli; } });
29
+ Object.defineProperty(exports, "applyPresetCli", { enumerable: true, get: function () { return install_1.applyPresetCli; } });
30
+ var commands_1 = require("./commands");
31
+ Object.defineProperty(exports, "handlePresetCommand", { enumerable: true, get: function () { return commands_1.handlePresetCommand; } });
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/preset/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,wBAAwB;AACxB,wEAAsD;AAEtD,oBAAoB;AACpB,mCAA2C;AAAlC,yGAAA,eAAe,OAAA;AACxB,qCAA6D;AAApD,2GAAA,gBAAgB,OAAA;AAAE,yGAAA,cAAc,OAAA;AACzC,uCAAiD;AAAxC,+GAAA,mBAAmB,OAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Install preset from GitHub marketplace by preset name
3
+ */
4
+ import { type PresetFile } from '@wengine-ai/claude-code-router-shared';
5
+ /**
6
+ * Install preset from marketplace by preset name
7
+ * @param presetName Preset name (must exist in marketplace)
8
+ * @returns Object containing installed preset name and PresetFile
9
+ */
10
+ export declare function installPresetFromMarket(presetName: string): Promise<{
11
+ name: string;
12
+ preset: PresetFile;
13
+ }>;
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /**
3
+ * Install preset from GitHub marketplace by preset name
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.installPresetFromMarket = installPresetFromMarket;
43
+ const fs = __importStar(require("fs/promises"));
44
+ const claude_code_router_shared_1 = require("@wengine-ai/claude-code-router-shared");
45
+ const adm_zip_1 = __importDefault(require("adm-zip"));
46
+ // ANSI color codes
47
+ const RESET = "\x1B[0m";
48
+ const GREEN = "\x1B[32m";
49
+ const BOLDCYAN = "\x1B[1m\x1B[36m";
50
+ const BOLDYELLOW = "\x1B[1m\x1B[33m";
51
+ /**
52
+ * Parse GitHub repository URL or name
53
+ * Supports:
54
+ * - owner/repo (short format)
55
+ * - github.com/owner/repo
56
+ * - https://github.com/owner/repo
57
+ * - https://github.com/owner/repo.git
58
+ * - git@github.com:owner/repo.git
59
+ */
60
+ function parseGitHubRepo(input) {
61
+ const match = input.match(/(?:github\.com[:/]|^)([^/]+)\/([^/\s#]+?)(?:\.git)?$/);
62
+ if (!match) {
63
+ return null;
64
+ }
65
+ const [, owner, repoName] = match;
66
+ return { owner, repoName };
67
+ }
68
+ /**
69
+ * Load preset from ZIP file
70
+ */
71
+ async function loadPresetFromZip(zipFile) {
72
+ const zip = new adm_zip_1.default(zipFile);
73
+ // First try to find manifest.json in root directory
74
+ let entry = zip.getEntry('manifest.json');
75
+ // If not in root, try to find in subdirectories (handle GitHub repo archive structure)
76
+ if (!entry) {
77
+ const entries = zip.getEntries();
78
+ // Find any manifest.json file
79
+ entry = entries.find(e => e.entryName.includes('manifest.json')) || null;
80
+ }
81
+ if (!entry) {
82
+ throw new Error('Invalid preset file: manifest.json not found');
83
+ }
84
+ const manifest = JSON.parse(entry.getData().toString('utf-8'));
85
+ return (0, claude_code_router_shared_1.manifestToPresetFile)(manifest);
86
+ }
87
+ /**
88
+ * Install preset from marketplace by preset name
89
+ * @param presetName Preset name (must exist in marketplace)
90
+ * @returns Object containing installed preset name and PresetFile
91
+ */
92
+ async function installPresetFromMarket(presetName) {
93
+ // Check if preset is in the marketplace
94
+ console.log(`${BOLDCYAN}Checking marketplace...${RESET}`);
95
+ const marketPreset = await (0, claude_code_router_shared_1.findMarketPresetByName)(presetName);
96
+ if (!marketPreset) {
97
+ throw new Error(`Preset '${presetName}' not found in marketplace. ` +
98
+ `Please check the available presets at: https://github.com/claude-code-router/presets`);
99
+ }
100
+ console.log(`${GREEN}✓${RESET} Found in marketplace\n`);
101
+ // Get repository from market preset
102
+ if (!marketPreset.repo) {
103
+ throw new Error(`Preset '${presetName}' does not have repository information`);
104
+ }
105
+ // Parse GitHub repository URL
106
+ const githubRepo = parseGitHubRepo(marketPreset.repo);
107
+ if (!githubRepo) {
108
+ throw new Error(`Invalid repository format: ${marketPreset.repo}`);
109
+ }
110
+ const { owner, repoName } = githubRepo;
111
+ // Use preset name from market (or the preset's id)
112
+ const installedPresetName = marketPreset.name || presetName;
113
+ // Check if already installed BEFORE downloading
114
+ if (await (0, claude_code_router_shared_1.isPresetInstalled)(installedPresetName)) {
115
+ throw new Error(`Preset '${installedPresetName}' is already installed.\n` +
116
+ `To delete and reinstall, use: ccr preset delete ${installedPresetName}\n` +
117
+ `To reconfigure without deleting, use: ccr preset install ${installedPresetName}`);
118
+ }
119
+ // Download GitHub repository ZIP file
120
+ console.log(`${BOLDCYAN}Downloading preset...${RESET}`);
121
+ const downloadUrl = `https://github.com/${owner}/${repoName}/archive/refs/heads/main.zip`;
122
+ const tempFile = await (0, claude_code_router_shared_1.downloadPresetToTemp)(downloadUrl);
123
+ console.log(`${GREEN}✓${RESET} Downloaded\n`);
124
+ try {
125
+ // Load preset to validate structure
126
+ console.log(`${BOLDCYAN}Validating preset...${RESET}`);
127
+ const preset = await loadPresetFromZip(tempFile);
128
+ console.log(`${GREEN}✓${RESET} Valid\n`);
129
+ // Double-check if already installed (in case of race condition)
130
+ if (await (0, claude_code_router_shared_1.isPresetInstalled)(installedPresetName)) {
131
+ throw new Error(`Preset '${installedPresetName}' was installed while downloading. ` +
132
+ `Please try again.`);
133
+ }
134
+ // Extract to target directory
135
+ console.log(`${BOLDCYAN}Installing preset...${RESET}`);
136
+ const targetDir = (0, claude_code_router_shared_1.getPresetDir)(installedPresetName);
137
+ await (0, claude_code_router_shared_1.extractPreset)(tempFile, targetDir);
138
+ console.log(`${GREEN}✓${RESET} Installed\n`);
139
+ // Read manifest and add repo information
140
+ const manifest = await (0, claude_code_router_shared_1.readManifestFromDir)(targetDir);
141
+ // Add repo information to manifest
142
+ manifest.repository = marketPreset.repository;
143
+ if (marketPreset.url) {
144
+ manifest.source = marketPreset.url;
145
+ }
146
+ // Save updated manifest
147
+ await (0, claude_code_router_shared_1.saveManifest)(installedPresetName, manifest);
148
+ // Return preset name and PresetFile for further configuration
149
+ return { name: installedPresetName, preset };
150
+ }
151
+ finally {
152
+ // Clean up temp file
153
+ try {
154
+ await fs.unlink(tempFile);
155
+ }
156
+ catch {
157
+ // Ignore cleanup errors
158
+ }
159
+ }
160
+ }
161
+ //# sourceMappingURL=install-github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-github.js","sourceRoot":"","sources":["../../../src/utils/preset/install-github.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Preset installation functionality CLI layer
3
+ * Handles CLI interactions, core logic is in the shared package
4
+ */
5
+ import { loadPreset as loadPresetShared, MergeStrategy, PresetFile } from '@wengine-ai/claude-code-router-shared';
6
+ export { loadPresetShared as loadPreset };
7
+ /**
8
+ * Apply preset to configuration
9
+ * @param presetName Preset name
10
+ * @param preset Preset object
11
+ */
12
+ export declare function applyPresetCli(presetName: string, preset: PresetFile): Promise<void>;
13
+ /**
14
+ * Install preset (main entry point)
15
+ */
16
+ export declare function installPresetCli(source: string, options?: {
17
+ strategy?: MergeStrategy;
18
+ name?: string;
19
+ }): Promise<void>;