itengits 1.0.0

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 (51) hide show
  1. package/README.md +124 -0
  2. package/bin/itengits.js +3 -0
  3. package/dist/api/auth.d.ts +29 -0
  4. package/dist/api/auth.d.ts.map +1 -0
  5. package/dist/api/auth.js +93 -0
  6. package/dist/api/auth.js.map +1 -0
  7. package/dist/api/client.d.ts +13 -0
  8. package/dist/api/client.d.ts.map +1 -0
  9. package/dist/api/client.js +79 -0
  10. package/dist/api/client.js.map +1 -0
  11. package/dist/api/skills.d.ts +28 -0
  12. package/dist/api/skills.d.ts.map +1 -0
  13. package/dist/api/skills.js +99 -0
  14. package/dist/api/skills.js.map +1 -0
  15. package/dist/commands/auth.d.ts +6 -0
  16. package/dist/commands/auth.d.ts.map +1 -0
  17. package/dist/commands/auth.js +72 -0
  18. package/dist/commands/auth.js.map +1 -0
  19. package/dist/commands/skill.d.ts +6 -0
  20. package/dist/commands/skill.d.ts.map +1 -0
  21. package/dist/commands/skill.js +264 -0
  22. package/dist/commands/skill.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +37 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/types/index.d.ts +85 -0
  28. package/dist/types/index.d.ts.map +1 -0
  29. package/dist/types/index.js +6 -0
  30. package/dist/types/index.js.map +1 -0
  31. package/dist/utils/auth.d.ts +7 -0
  32. package/dist/utils/auth.d.ts.map +1 -0
  33. package/dist/utils/auth.js +61 -0
  34. package/dist/utils/auth.js.map +1 -0
  35. package/dist/utils/config.d.ts +18 -0
  36. package/dist/utils/config.d.ts.map +1 -0
  37. package/dist/utils/config.js +44 -0
  38. package/dist/utils/config.js.map +1 -0
  39. package/dist/utils/file.d.ts +21 -0
  40. package/dist/utils/file.d.ts.map +1 -0
  41. package/dist/utils/file.js +98 -0
  42. package/dist/utils/file.js.map +1 -0
  43. package/dist/utils/logger.d.ts +14 -0
  44. package/dist/utils/logger.d.ts.map +1 -0
  45. package/dist/utils/logger.js +36 -0
  46. package/dist/utils/logger.js.map +1 -0
  47. package/dist/utils/path.d.ts +28 -0
  48. package/dist/utils/path.d.ts.map +1 -0
  49. package/dist/utils/path.js +88 -0
  50. package/dist/utils/path.js.map +1 -0
  51. package/package.json +66 -0
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerSkillCommand = registerSkillCommand;
40
+ const inquirer_1 = __importDefault(require("inquirer"));
41
+ const ora_1 = __importDefault(require("ora"));
42
+ const client_1 = require("../api/client");
43
+ const skills_1 = require("../api/skills");
44
+ const path_1 = require("../utils/path");
45
+ const file_1 = require("../utils/file");
46
+ const logger_1 = require("../utils/logger");
47
+ const auth_1 = require("../utils/auth");
48
+ /**
49
+ * 注册技能命令
50
+ */
51
+ function registerSkillCommand(program) {
52
+ const skillCmd = program.command('skill');
53
+ // skill add 命令
54
+ skillCmd
55
+ .command('add <skill>')
56
+ .description('安装技能(支持技能名称)')
57
+ .requiredOption('--author <username>', '技能作者用户名')
58
+ .option('--scope <scope>', '安装作用域', 'project')
59
+ .option('--type <type>', '技能类型', 'claude')
60
+ .option('--server <url>', '服务器地址')
61
+ .option('--force', '强制覆盖已存在的技能')
62
+ .action(async (skillIdentifier, options) => {
63
+ await handleSkillAdd(skillIdentifier, options);
64
+ });
65
+ // skill list 命令
66
+ skillCmd
67
+ .command('list [keyword]')
68
+ .description('列出技能(可选搜索关键词)')
69
+ .option('--server <url>', '服务器地址')
70
+ .action(async (keyword = '', options) => {
71
+ await handleSkillList(keyword, options);
72
+ });
73
+ // skill remove 命令
74
+ skillCmd
75
+ .command('remove <skill>')
76
+ .description('移除已安装的技能')
77
+ .option('--scope <scope>', '作用域', 'project')
78
+ .option('--type <type>', '技能类型', 'claude')
79
+ .action(async (skillName, options) => {
80
+ await handleSkillRemove(skillName, options);
81
+ });
82
+ }
83
+ /**
84
+ * 处理技能添加命令
85
+ */
86
+ async function handleSkillAdd(skillIdentifier, options) {
87
+ let spinner;
88
+ try {
89
+ // 1. 验证参数
90
+ if (!options.author) {
91
+ logger_1.logger.error('--author 参数是必需的');
92
+ logger_1.logger.info('用法: itengits skill add <skill> --author <username>');
93
+ process.exit(1);
94
+ }
95
+ if (!['project', 'global'].includes(options.scope)) {
96
+ logger_1.logger.error('--scope 必须是 project 或 global');
97
+ process.exit(1);
98
+ }
99
+ if (!['claude', 'iflow'].includes(options.type)) {
100
+ logger_1.logger.error('--type 必须是 claude 或 iflow');
101
+ process.exit(1);
102
+ }
103
+ // 2. 确保用户已登录(自动触发登录流程)
104
+ const loggedIn = await (0, auth_1.ensureLoggedIn)(options.server);
105
+ if (!loggedIn) {
106
+ logger_1.logger.error('登录失败,无法继续操作');
107
+ process.exit(1);
108
+ }
109
+ // 3. 初始化 API 客户端
110
+ const client = new client_1.ApiClient(options.server);
111
+ const skillsApi = new skills_1.SkillsApi(client);
112
+ // 4. 搜索技能(按名称和作者)
113
+ spinner = (0, ora_1.default)(`搜索技能: ${skillIdentifier} (作者: ${options.author})...`).start();
114
+ const skills = await skillsApi.searchByNameAndAuthor(skillIdentifier, options.author);
115
+ if (skills.length === 0) {
116
+ spinner.fail('未找到匹配的技能');
117
+ logger_1.logger.info('请检查技能名称和作者用户名,或访问技能市场查看');
118
+ process.exit(1);
119
+ }
120
+ spinner.succeed(`找到 ${skills.length} 个匹配技能`);
121
+ // 5. 选择技能(如果有多个结果)
122
+ let selectedSkill;
123
+ if (skills.length === 1) {
124
+ selectedSkill = skills[0];
125
+ spinner = (0, ora_1.default)(`选择技能: ${selectedSkill.name}`).start();
126
+ spinner.succeed();
127
+ }
128
+ else {
129
+ const { skillId } = await inquirer_1.default.prompt([
130
+ {
131
+ type: 'list',
132
+ name: 'skillId',
133
+ message: '找到多个匹配技能,请选择:',
134
+ choices: skills.map(skill => ({
135
+ name: `${skill.name} - ${skill.description.substring(0, 50)}...`,
136
+ value: skill.id
137
+ }))
138
+ }
139
+ ]);
140
+ selectedSkill = skills.find(s => s.id === skillId);
141
+ }
142
+ // 6. 确定目标目录
143
+ const targetDir = path_1.PathManager.getSkillTargetDir(options);
144
+ // 7. 确保目标目录存在
145
+ await path_1.PathManager.ensureDir(targetDir);
146
+ // 8. 检查是否已存在
147
+ const canProceed = await file_1.FileManager.ensureTargetDirectory(targetDir, selectedSkill.name, options.force || false);
148
+ if (!canProceed) {
149
+ process.exit(0);
150
+ }
151
+ // 9. 创建临时目录
152
+ const tempDir = path_1.PathManager.getTempDir();
153
+ await path_1.PathManager.ensureDir(tempDir);
154
+ const zipPath = `${tempDir}/${selectedSkill.name}.zip`;
155
+ // 10. 下载技能
156
+ spinner = (0, ora_1.default)('下载技能...').start();
157
+ try {
158
+ await skillsApi.downloadSkill(selectedSkill.id, zipPath);
159
+ spinner.succeed('下载完成');
160
+ }
161
+ catch (error) {
162
+ spinner.fail('下载失败');
163
+ await file_1.FileManager.cleanup(zipPath);
164
+ process.exit(1);
165
+ }
166
+ // 11. 解压技能到技能名称的子目录
167
+ spinner = (0, ora_1.default)('解压技能...').start();
168
+ // 获取实际的解压目标目录(包含技能名称)
169
+ const extractedDir = path_1.PathManager.getSkillExtractedDir(targetDir, selectedSkill.name);
170
+ try {
171
+ await file_1.FileManager.extractZip(zipPath, extractedDir);
172
+ spinner.succeed('解压完成');
173
+ }
174
+ catch (error) {
175
+ spinner.fail('解压失败');
176
+ await file_1.FileManager.cleanup(zipPath);
177
+ process.exit(1);
178
+ }
179
+ // 12. 清理临时文件
180
+ await file_1.FileManager.cleanup(zipPath);
181
+ // 13. 显示成功信息
182
+ logger_1.logger.success('技能安装成功');
183
+ logger_1.logger.info(`技能名称: ${selectedSkill.name}`);
184
+ logger_1.logger.info(`安装位置: ${path_1.PathManager.getSkillExtractedDir(targetDir, selectedSkill.name)}`);
185
+ logger_1.logger.info(`作用域: ${options.scope}`);
186
+ logger_1.logger.info(`类型: ${options.type}`);
187
+ }
188
+ catch (error) {
189
+ logger_1.logger.error('安装失败');
190
+ console.error(error);
191
+ process.exit(1);
192
+ }
193
+ }
194
+ /**
195
+ * 处理技能列表命令
196
+ */
197
+ async function handleSkillList(keyword, options) {
198
+ try {
199
+ // 确保用户已登录(自动触发登录流程)
200
+ const loggedIn = await (0, auth_1.ensureLoggedIn)(options.server);
201
+ if (!loggedIn) {
202
+ logger_1.logger.error('登录失败,无法继续操作');
203
+ process.exit(1);
204
+ }
205
+ const client = new client_1.ApiClient(options.server);
206
+ const skillsApi = new skills_1.SkillsApi(client);
207
+ // 搜索技能
208
+ const spinner = (0, ora_1.default)('搜索技能...').start();
209
+ const skills = await skillsApi.search(keyword || '');
210
+ spinner.stop();
211
+ if (skills.length === 0) {
212
+ logger_1.logger.info('未找到技能');
213
+ return;
214
+ }
215
+ // 显示技能列表
216
+ console.log('\n找到以下技能:\n');
217
+ skills.forEach((skill, index) => {
218
+ console.log(`${index + 1}. ${skill.name}`);
219
+ console.log(` 描述: ${skill.description.substring(0, 80)}...`);
220
+ console.log(` 作者: ${skill.author?.username || '未知'}`);
221
+ console.log(` ID: ${skill.id}`);
222
+ console.log(` 下载次数: ${skill.download_count}`);
223
+ console.log('');
224
+ });
225
+ }
226
+ catch (error) {
227
+ logger_1.logger.error('获取技能列表失败');
228
+ process.exit(1);
229
+ }
230
+ }
231
+ /**
232
+ * 处理技能移除命令
233
+ */
234
+ async function handleSkillRemove(skillName, options) {
235
+ try {
236
+ const targetDir = path_1.PathManager.getSkillTargetDir(options);
237
+ const extractedDir = path_1.PathManager.getSkillExtractedDir(targetDir, skillName);
238
+ const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
239
+ if (!(await fs.pathExists(extractedDir))) {
240
+ logger_1.logger.error('技能不存在');
241
+ logger_1.logger.info(`路径: ${extractedDir}`);
242
+ process.exit(1);
243
+ }
244
+ const { confirm } = await inquirer_1.default.prompt([
245
+ {
246
+ type: 'confirm',
247
+ name: 'confirm',
248
+ message: `确认移除技能: ${extractedDir}?`,
249
+ default: false
250
+ }
251
+ ]);
252
+ if (!confirm) {
253
+ logger_1.logger.info('取消操作');
254
+ return;
255
+ }
256
+ await fs.remove(extractedDir);
257
+ logger_1.logger.success('技能已移除');
258
+ }
259
+ catch (error) {
260
+ logger_1.logger.error('移除技能失败');
261
+ process.exit(1);
262
+ }
263
+ }
264
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const auth_1 = require("./commands/auth");
6
+ const skill_1 = require("./commands/skill");
7
+ const config_1 = require("./utils/config");
8
+ const program = new commander_1.Command();
9
+ // CLI 基本信息
10
+ program
11
+ .name('itengits')
12
+ .description('Tengits Skill Market CLI - Claude Code 技能安装工具')
13
+ .version('1.0.0');
14
+ // 显示当前配置(调试用)
15
+ program
16
+ .command('config')
17
+ .description('显示当前配置')
18
+ .option('--show-server', '显示服务器地址')
19
+ .action((options) => {
20
+ if (options.showServer) {
21
+ console.log(`服务器地址: ${config_1.config.get('server')}`);
22
+ }
23
+ else {
24
+ console.log('当前配置:');
25
+ console.log(JSON.stringify(config_1.config.getAll(), null, 2));
26
+ }
27
+ });
28
+ // 注册子命令
29
+ (0, auth_1.registerAuthCommand)(program);
30
+ (0, skill_1.registerSkillCommand)(program);
31
+ // 解析命令行参数
32
+ program.parse(process.argv);
33
+ // 如果没有提供任何参数,显示帮助
34
+ if (!process.argv.slice(2).length) {
35
+ program.outputHelp();
36
+ }
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAAsD;AACtD,4CAAwD;AACxD,2CAAwC;AAExC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,WAAW;AACX,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,cAAc;AACd,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,QAAQ,CAAC;KACrB,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC;KAClC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;IAClB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,UAAU,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,eAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,QAAQ;AACR,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;AAC7B,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;AAE9B,UAAU;AACV,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5B,kBAAkB;AAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * API 响应类型定义
3
+ */
4
+ export interface AuthResponse {
5
+ success: boolean;
6
+ message: string;
7
+ data: {
8
+ access_token: string;
9
+ token_type: string;
10
+ expires_in: number;
11
+ user: UserInfo;
12
+ };
13
+ }
14
+ export interface UserInfo {
15
+ id: number;
16
+ username: string;
17
+ email?: string;
18
+ role?: string;
19
+ }
20
+ export interface Skill {
21
+ id: number;
22
+ name: string;
23
+ description: string;
24
+ category?: {
25
+ id: number;
26
+ name: string;
27
+ };
28
+ tags: Array<{
29
+ id: number;
30
+ name: string;
31
+ }>;
32
+ author?: {
33
+ id: number;
34
+ username: string;
35
+ };
36
+ project_url?: string;
37
+ doc_url?: string;
38
+ logo_url?: string;
39
+ file_path?: string;
40
+ file_size?: number;
41
+ download_count: number;
42
+ view_count: number;
43
+ is_active: boolean;
44
+ created_at: string;
45
+ updated_at: string;
46
+ }
47
+ export interface SkillsResponse {
48
+ success: boolean;
49
+ data: {
50
+ items: Skill[];
51
+ total: number;
52
+ page: number;
53
+ size: number;
54
+ };
55
+ }
56
+ export interface SkillDetailResponse {
57
+ success: boolean;
58
+ data: Skill;
59
+ }
60
+ /**
61
+ * 配置类型定义
62
+ */
63
+ export interface CliConfig {
64
+ server: string;
65
+ token?: string;
66
+ tokenExpiresAt?: number;
67
+ }
68
+ /**
69
+ * CLI 选项类型定义
70
+ */
71
+ export interface SkillAddOptions {
72
+ author: string;
73
+ scope: 'project' | 'global';
74
+ type: 'claude' | 'iflow';
75
+ server?: string;
76
+ force?: boolean;
77
+ }
78
+ export interface SkillListOptions {
79
+ server?: string;
80
+ }
81
+ export interface SkillRemoveOptions {
82
+ scope: 'project' | 'global';
83
+ type: 'claude' | 'iflow';
84
+ }
85
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ,CAAC;KAChB,CAAC;CACH;AAGD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QACJ,KAAK,EAAE,KAAK,EAAE,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAGD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,KAAK,CAAC;CACb;AAED;;GAEG;AAGH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AAGH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC1B"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * API 响应类型定义
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 确保用户已登录,如果未登录则自动触发登录流程
3
+ * @param serverUrl 服务器地址(可选)
4
+ * @returns Promise<boolean> 登录是否成功
5
+ */
6
+ export declare function ensureLoggedIn(serverUrl?: string): Promise<boolean>;
7
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmDzE"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ensureLoggedIn = ensureLoggedIn;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const client_1 = require("../api/client");
10
+ const auth_1 = require("../api/auth");
11
+ const logger_1 = require("./logger");
12
+ /**
13
+ * 确保用户已登录,如果未登录则自动触发登录流程
14
+ * @param serverUrl 服务器地址(可选)
15
+ * @returns Promise<boolean> 登录是否成功
16
+ */
17
+ async function ensureLoggedIn(serverUrl) {
18
+ console.log('[DEBUG] ensureLoggedIn 开始,serverUrl:', serverUrl);
19
+ const client = new client_1.ApiClient(serverUrl);
20
+ const authApi = new auth_1.AuthApi(client);
21
+ console.log('[DEBUG] authApi 实例:', authApi);
22
+ console.log('[DEBUG] authApi 类型:', typeof authApi);
23
+ // 检查登录状态
24
+ const spinner = (0, ora_1.default)('检查登录状态...').start();
25
+ const isLoggedIn = await authApi.checkToken();
26
+ if (isLoggedIn) {
27
+ spinner.succeed('已登录');
28
+ return true;
29
+ }
30
+ spinner.fail('未登录');
31
+ logger_1.logger.info('需要登录才能继续操作');
32
+ // 自动触发登录流程
33
+ try {
34
+ const answers = await inquirer_1.default.prompt([
35
+ {
36
+ type: 'input',
37
+ name: 'username',
38
+ message: '用户名:',
39
+ validate: (input) => input.length > 0 || '用户名不能为空'
40
+ },
41
+ {
42
+ type: 'password',
43
+ name: 'password',
44
+ message: '密码:',
45
+ mask: '*',
46
+ validate: (input) => input.length > 0 || '密码不能为空'
47
+ }
48
+ ]);
49
+ console.log('[DEBUG] 用户输入完成,准备登录');
50
+ const loginSpinner = (0, ora_1.default)('正在登录...').start();
51
+ await authApi.login(answers.username, answers.password);
52
+ loginSpinner.succeed('登录成功');
53
+ return true;
54
+ }
55
+ catch (error) {
56
+ console.log('[DEBUG] 登录错误:', error);
57
+ logger_1.logger.error('登录失败');
58
+ return false;
59
+ }
60
+ }
61
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":";;;;;AAWA,wCAmDC;AA9DD,wDAAgC;AAChC,8CAAsB;AACtB,0CAA0C;AAC1C,sCAAsC;AACtC,qCAAkC;AAElC;;;;GAIG;AACI,KAAK,UAAU,cAAc,CAAC,SAAkB;IACrD,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,SAAS,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,MAAM,CAAC,CAAC;IAEpC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,OAAO,CAAC,CAAC;IAEnD,SAAS;IACT,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE9C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,eAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAE1B,WAAW;IACX,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;YACpC;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS;aAC3D;YACD;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ;aAC1D;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,IAAA,aAAG,EAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;QAE5C,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxD,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACpC,eAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 配置管理器
3
+ * 使用 configstore 管理持久化配置
4
+ */
5
+ export declare class ConfigManager {
6
+ private config;
7
+ constructor();
8
+ get(key: string): any;
9
+ set(key: string, value: any): void;
10
+ getAll(): any;
11
+ clear(): void;
12
+ /**
13
+ * 获取配置文件路径(用于调试)
14
+ */
15
+ getConfigPath(): string;
16
+ }
17
+ export declare const config: ConfigManager;
18
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAc;;IAQ5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG;IAIrB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAIlC,MAAM,IAAI,GAAG;IAIb,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,aAAa,IAAI,MAAM;CAKxB;AAED,eAAO,MAAM,MAAM,eAAsB,CAAC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.config = exports.ConfigManager = void 0;
7
+ const configstore_1 = __importDefault(require("configstore"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const CONFIG_NAME = 'itengits';
11
+ /**
12
+ * 配置管理器
13
+ * 使用 configstore 管理持久化配置
14
+ */
15
+ class ConfigManager {
16
+ constructor() {
17
+ this.config = new configstore_1.default(CONFIG_NAME, {
18
+ server: 'http://localhost:8000'
19
+ });
20
+ }
21
+ get(key) {
22
+ return this.config.get(key);
23
+ }
24
+ set(key, value) {
25
+ this.config.set(key, value);
26
+ }
27
+ getAll() {
28
+ return this.config.all;
29
+ }
30
+ clear() {
31
+ this.config.clear();
32
+ }
33
+ /**
34
+ * 获取配置文件路径(用于调试)
35
+ */
36
+ getConfigPath() {
37
+ const homeDir = os_1.default.homedir();
38
+ const configDir = path_1.default.join(homeDir, '.config');
39
+ return path_1.default.join(configDir, `configstore/${CONFIG_NAME}.json`);
40
+ }
41
+ }
42
+ exports.ConfigManager = ConfigManager;
43
+ exports.config = new ConfigManager();
44
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAsC;AACtC,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,WAAW,GAAG,UAAU,CAAC;AAE/B;;;GAGG;AACH,MAAa,aAAa;IAGxB;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,qBAAW,CAAC,WAAW,EAAE;YACzC,MAAM,EAAE,uBAAuB;SAChC,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAU;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,aAAa;QACX,MAAM,OAAO,GAAG,YAAE,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAChD,OAAO,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,WAAW,OAAO,CAAC,CAAC;IACjE,CAAC;CACF;AAjCD,sCAiCC;AAEY,QAAA,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 文件管理器
3
+ * 处理文件解压、清理和冲突检测
4
+ */
5
+ export declare class FileManager {
6
+ /**
7
+ * 解压 ZIP 文件到目标目录
8
+ * 自动处理 ZIP 内的根目录结构
9
+ */
10
+ static extractZip(zipPath: string, targetDir: string): Promise<void>;
11
+ /**
12
+ * 清理临时文件
13
+ */
14
+ static cleanup(filePath: string): Promise<void>;
15
+ /**
16
+ * 确保目标目录不存在或已确认覆盖
17
+ * 返回 true 表示可以继续安装,false 表示取消安装
18
+ */
19
+ static ensureTargetDirectory(targetDir: string, skillName: string, force: boolean): Promise<boolean>;
20
+ }
21
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,qBAAa,WAAW;IACtB;;;OAGG;WACU,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC1E;;OAEG;WACU,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD;;;OAGG;WACU,qBAAqB,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,OAAO,CAAC;CA8BpB"}