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.
- package/README.md +124 -0
- package/bin/itengits.js +3 -0
- package/dist/api/auth.d.ts +29 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +93 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/client.d.ts +13 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +79 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/skills.d.ts +28 -0
- package/dist/api/skills.d.ts.map +1 -0
- package/dist/api/skills.js +99 -0
- package/dist/api/skills.js.map +1 -0
- package/dist/commands/auth.d.ts +6 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +72 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/skill.d.ts +6 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +264 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +85 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/auth.d.ts +7 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +61 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/config.d.ts +18 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +44 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/file.d.ts +21 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +98 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +36 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path.d.ts +28 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +88 -0
- package/dist/utils/path.js.map +1 -0
- package/package.json +66 -0
package/README.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# iTengits CLI
|
|
2
|
+
|
|
3
|
+
Tengits Skill Market 的命令行工具,用于快速安装 Claude Code 技能。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g itengits
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 快速开始
|
|
12
|
+
|
|
13
|
+
### 1. 登录
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
itengits auth login
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 2. 安装技能
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# 基本用法
|
|
23
|
+
itengits skill add "web-view" --author "username" --scope project
|
|
24
|
+
|
|
25
|
+
# 完整参数
|
|
26
|
+
itengits skill add "web-view" \
|
|
27
|
+
--author "username" \
|
|
28
|
+
--scope project \
|
|
29
|
+
--type claude \
|
|
30
|
+
--server http://localhost:8000 \
|
|
31
|
+
--force
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 命令
|
|
35
|
+
|
|
36
|
+
### 认证命令
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
itengits auth login # 登录
|
|
40
|
+
itengits auth logout # 退出登录
|
|
41
|
+
itengits auth status # 查看登录状态
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 技能命令
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
itengits skill add <skill> # 安装技能
|
|
48
|
+
itengits skill list [keyword] # 列出技能
|
|
49
|
+
itengits skill remove <skill> # 移除技能
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 参数说明
|
|
53
|
+
|
|
54
|
+
| 参数 | 说明 | 可选值 | 默认值 |
|
|
55
|
+
|------|------|--------|--------|
|
|
56
|
+
| `--author` | 技能作者用户名 | 字符串 | 必需 |
|
|
57
|
+
| `--scope` | 安装作用域 | `project` / `global` | `project` |
|
|
58
|
+
| `--type` | 技能类型 | `claude` / `iflow` | `claude` |
|
|
59
|
+
| `--server` | 服务器地址 | URL | 配置文件中的值 |
|
|
60
|
+
| `--force` | 强制覆盖 | 标志 | 否 |
|
|
61
|
+
|
|
62
|
+
## 安装路径
|
|
63
|
+
|
|
64
|
+
| scope + type | 安装路径 |
|
|
65
|
+
|--------------|----------|
|
|
66
|
+
| project + claude | `./.claude/skills/claude/{skill-name}/` |
|
|
67
|
+
| project + iflow | `./.claude/skills/iflow/{skill-name}/` |
|
|
68
|
+
| global + claude | `~/.claude/skills/claude/{skill-name}/` |
|
|
69
|
+
| global + iflow | `~/.claude/skills/iflow/{skill-name}/` |
|
|
70
|
+
|
|
71
|
+
## 配置
|
|
72
|
+
|
|
73
|
+
配置文件位置:`~/.config/configstore/itengits.json`
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"server": "http://localhost:8000",
|
|
78
|
+
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|
79
|
+
"tokenExpiresAt": 1704902400000
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 故障排除
|
|
84
|
+
|
|
85
|
+
### Token 过期
|
|
86
|
+
|
|
87
|
+
如果提示认证已过期,请重新登录:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
itengits auth login
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 连接服务器失败
|
|
94
|
+
|
|
95
|
+
检查服务器地址是否正确,或使用 `--server` 参数指定:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
itengits skill add "web-view" --author "username" --server https://api.example.com
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 权限不足
|
|
102
|
+
|
|
103
|
+
如果遇到权限问题,尝试:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Linux/Mac
|
|
107
|
+
sudo itengits skill add "web-view" --author "username"
|
|
108
|
+
|
|
109
|
+
# Windows(以管理员身份运行)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 技术细节
|
|
113
|
+
|
|
114
|
+
- **包名**:itengits
|
|
115
|
+
- **Node 版本要求**:>= 16.0.0
|
|
116
|
+
- **Token 有效期**:24小时(自动检测过期)
|
|
117
|
+
|
|
118
|
+
## 许可证
|
|
119
|
+
|
|
120
|
+
MIT
|
|
121
|
+
|
|
122
|
+
## 作者
|
|
123
|
+
|
|
124
|
+
Tengits Team
|
package/bin/itengits.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ApiClient } from './client';
|
|
2
|
+
/**
|
|
3
|
+
* 认证 API
|
|
4
|
+
* 处理登录、退出登录和 token 验证
|
|
5
|
+
*/
|
|
6
|
+
export declare class AuthApi {
|
|
7
|
+
private client;
|
|
8
|
+
constructor(client: ApiClient);
|
|
9
|
+
/**
|
|
10
|
+
* 用户名密码登录
|
|
11
|
+
*/
|
|
12
|
+
login(username: string, password: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* 检查 token 是否有效
|
|
15
|
+
*/
|
|
16
|
+
checkToken(): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* 退出登录
|
|
19
|
+
*/
|
|
20
|
+
logout(): void;
|
|
21
|
+
/**
|
|
22
|
+
* 获取当前登录状态
|
|
23
|
+
*/
|
|
24
|
+
getStatus(): {
|
|
25
|
+
loggedIn: boolean;
|
|
26
|
+
username?: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAKrC;;;GAGG;AACH,qBAAa,OAAO;IACN,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,SAAS;IAErC;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC9D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IA4BpC;;OAEG;IACH,MAAM,IAAI,IAAI;IAMd;;OAEG;IACH,SAAS,IAAI;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;CAOtD"}
|
package/dist/api/auth.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthApi = void 0;
|
|
4
|
+
const config_1 = require("../utils/config");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
6
|
+
/**
|
|
7
|
+
* 认证 API
|
|
8
|
+
* 处理登录、退出登录和 token 验证
|
|
9
|
+
*/
|
|
10
|
+
class AuthApi {
|
|
11
|
+
constructor(client) {
|
|
12
|
+
this.client = client;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 用户名密码登录
|
|
16
|
+
*/
|
|
17
|
+
async login(username, password) {
|
|
18
|
+
console.log('[DEBUG AuthApi.login] 开始登录,username:', username);
|
|
19
|
+
console.log('[DEBUG AuthApi.login] config 对象:', config_1.config);
|
|
20
|
+
console.log('[DEBUG AuthApi.login] config.get 类型:', typeof config_1.config.get);
|
|
21
|
+
console.log('[DEBUG AuthApi.login] config.set 类型:', typeof config_1.config.set);
|
|
22
|
+
try {
|
|
23
|
+
const response = await this.client.getClient().post('/api/v1/auth/login/json', { username, password });
|
|
24
|
+
if (response.data.success && response.data.data) {
|
|
25
|
+
const { access_token, expires_in } = response.data.data;
|
|
26
|
+
// 计算过期时间(当前时间 + 有效期 - 5分钟缓冲)
|
|
27
|
+
const expiresAt = Date.now() + (expires_in * 1000) - (5 * 60 * 1000);
|
|
28
|
+
// 保存 token 和过期时间
|
|
29
|
+
console.log('[DEBUG AuthApi.login] 准备保存 token');
|
|
30
|
+
config_1.config.set('token', access_token);
|
|
31
|
+
config_1.config.set('tokenExpiresAt', expiresAt);
|
|
32
|
+
console.log('[DEBUG AuthApi.login] token 已保存');
|
|
33
|
+
logger_1.logger.success('登录成功');
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
throw new Error('登录失败');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.log('[DEBUG AuthApi.login] 登录错误:', error);
|
|
41
|
+
logger_1.logger.error('登录失败,请检查用户名和密码');
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 检查 token 是否有效
|
|
47
|
+
*/
|
|
48
|
+
async checkToken() {
|
|
49
|
+
const token = config_1.config.get('token');
|
|
50
|
+
const expiresAt = config_1.config.get('tokenExpiresAt');
|
|
51
|
+
if (!token) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
// 检查是否过期(提前5分钟判断过期)
|
|
55
|
+
if (expiresAt && Date.now() > expiresAt) {
|
|
56
|
+
logger_1.logger.warn('Token 已过期,请重新登录');
|
|
57
|
+
config_1.config.set('token', undefined);
|
|
58
|
+
config_1.config.set('tokenExpiresAt', undefined);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
// 验证 token 是否有效(调用 /me 接口)
|
|
62
|
+
try {
|
|
63
|
+
await this.client.getClient().get('/api/v1/auth/me');
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
logger_1.logger.warn('Token 无效,请重新登录');
|
|
68
|
+
config_1.config.set('token', undefined);
|
|
69
|
+
config_1.config.set('tokenExpiresAt', undefined);
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 退出登录
|
|
75
|
+
*/
|
|
76
|
+
logout() {
|
|
77
|
+
config_1.config.set('token', undefined);
|
|
78
|
+
config_1.config.set('tokenExpiresAt', undefined);
|
|
79
|
+
logger_1.logger.success('已退出登录');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 获取当前登录状态
|
|
83
|
+
*/
|
|
84
|
+
getStatus() {
|
|
85
|
+
const token = config_1.config.get('token');
|
|
86
|
+
return {
|
|
87
|
+
loggedIn: !!token,
|
|
88
|
+
username: token ? '已登录' : undefined
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.AuthApi = AuthApi;
|
|
93
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AxiosInstance } from 'axios';
|
|
2
|
+
/**
|
|
3
|
+
* API 客户端基类
|
|
4
|
+
* 处理 HTTP 请求、认证和错误拦截
|
|
5
|
+
*/
|
|
6
|
+
export declare class ApiClient {
|
|
7
|
+
private client;
|
|
8
|
+
private server;
|
|
9
|
+
constructor(server?: string);
|
|
10
|
+
getClient(): AxiosInstance;
|
|
11
|
+
getServerUrl(): string;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAA0C,MAAM,OAAO,CAAC;AAIrF;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,CAAC,EAAE,MAAM;IA8D3B,SAAS,IAAI,aAAa;IAI1B,YAAY,IAAI,MAAM;CAGvB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
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.ApiClient = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const config_1 = require("../utils/config");
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
10
|
+
/**
|
|
11
|
+
* API 客户端基类
|
|
12
|
+
* 处理 HTTP 请求、认证和错误拦截
|
|
13
|
+
*/
|
|
14
|
+
class ApiClient {
|
|
15
|
+
constructor(server) {
|
|
16
|
+
// 命令行参数优先于配置文件
|
|
17
|
+
this.server = server || config_1.config.get('server') || 'http://localhost:8000';
|
|
18
|
+
this.client = axios_1.default.create({
|
|
19
|
+
baseURL: this.server,
|
|
20
|
+
timeout: 30000, // 30秒超时
|
|
21
|
+
headers: {
|
|
22
|
+
'Content-Type': 'application/json'
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
// 请求拦截器:添加认证头
|
|
26
|
+
this.client.interceptors.request.use((requestConfig) => {
|
|
27
|
+
const token = config_1.config.get('token');
|
|
28
|
+
if (token && typeof token === 'string') {
|
|
29
|
+
requestConfig.headers.Authorization = `Bearer ${token}`;
|
|
30
|
+
}
|
|
31
|
+
return requestConfig;
|
|
32
|
+
}, (error) => Promise.reject(error));
|
|
33
|
+
// 响应拦截器:统一错误处理
|
|
34
|
+
this.client.interceptors.response.use((response) => response, (error) => {
|
|
35
|
+
if (error.response) {
|
|
36
|
+
// 服务器返回错误响应
|
|
37
|
+
const status = error.response.status;
|
|
38
|
+
const data = error.response.data;
|
|
39
|
+
if (status === 401) {
|
|
40
|
+
logger_1.logger.error('认证失败,请重新登录');
|
|
41
|
+
logger_1.logger.info('运行: itengits auth login');
|
|
42
|
+
// 清除无效的 token
|
|
43
|
+
config_1.config.set('token', undefined);
|
|
44
|
+
config_1.config.set('tokenExpiresAt', undefined);
|
|
45
|
+
}
|
|
46
|
+
else if (status === 404) {
|
|
47
|
+
logger_1.logger.error('资源不存在');
|
|
48
|
+
}
|
|
49
|
+
else if (status === 500) {
|
|
50
|
+
logger_1.logger.error('服务器错误,请稍后重试');
|
|
51
|
+
}
|
|
52
|
+
else if (data && data.detail) {
|
|
53
|
+
logger_1.logger.error(data.detail);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
logger_1.logger.error(`请求失败 (${status})`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else if (error.request) {
|
|
60
|
+
// 请求已发出但没有收到响应
|
|
61
|
+
logger_1.logger.error('无法连接到服务器');
|
|
62
|
+
logger_1.logger.info(`服务器地址: ${this.server}`);
|
|
63
|
+
logger_1.logger.info('请检查服务器是否运行,或使用 --server 参数指定服务器地址');
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
logger_1.logger.error(error.message);
|
|
67
|
+
}
|
|
68
|
+
return Promise.reject(error);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
getClient() {
|
|
72
|
+
return this.client;
|
|
73
|
+
}
|
|
74
|
+
getServerUrl() {
|
|
75
|
+
return this.server;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.ApiClient = ApiClient;
|
|
79
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ApiClient } from './client';
|
|
2
|
+
import { Skill } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* 技能 API
|
|
5
|
+
* 处理技能搜索、详情和下载
|
|
6
|
+
*/
|
|
7
|
+
export declare class SkillsApi {
|
|
8
|
+
private client;
|
|
9
|
+
constructor(client: ApiClient);
|
|
10
|
+
/**
|
|
11
|
+
* 搜索技能(支持名称或ID)
|
|
12
|
+
*/
|
|
13
|
+
search(keyword: string): Promise<Skill[]>;
|
|
14
|
+
/**
|
|
15
|
+
* 按名称和作者搜索技能
|
|
16
|
+
* 由于后端 API 可能不支持 author_id 参数,这里先按名称搜索,然后在结果中过滤
|
|
17
|
+
*/
|
|
18
|
+
searchByNameAndAuthor(skillName: string, author: string): Promise<Skill[]>;
|
|
19
|
+
/**
|
|
20
|
+
* 下载技能 ZIP 文件
|
|
21
|
+
*/
|
|
22
|
+
downloadSkill(skillId: number, outputPath: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* 获取技能详情
|
|
25
|
+
*/
|
|
26
|
+
getSkillDetail(skillId: number): Promise<Skill | null>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/api/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAkB,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjD;;;GAGG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,SAAS;IAErC;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAgC/C;;;OAGG;IACG,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAiBhF;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBvE;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;CAc7D"}
|
|
@@ -0,0 +1,99 @@
|
|
|
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.SkillsApi = void 0;
|
|
7
|
+
const logger_1 = require("../utils/logger");
|
|
8
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
9
|
+
/**
|
|
10
|
+
* 技能 API
|
|
11
|
+
* 处理技能搜索、详情和下载
|
|
12
|
+
*/
|
|
13
|
+
class SkillsApi {
|
|
14
|
+
constructor(client) {
|
|
15
|
+
this.client = client;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 搜索技能(支持名称或ID)
|
|
19
|
+
*/
|
|
20
|
+
async search(keyword) {
|
|
21
|
+
try {
|
|
22
|
+
// 尝试按 ID 搜索
|
|
23
|
+
const id = parseInt(keyword);
|
|
24
|
+
if (!isNaN(id)) {
|
|
25
|
+
try {
|
|
26
|
+
const response = await this.client.getClient().get(`/api/v1/skills/${id}`);
|
|
27
|
+
if (response.data.success && response.data.data) {
|
|
28
|
+
return [response.data.data];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
// ID 搜索失败,尝试按名称搜索
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// 按名称搜索
|
|
36
|
+
const response = await this.client.getClient().get('/api/v1/skills', { params: { search: keyword, size: 10 } });
|
|
37
|
+
if (response.data.success && response.data.data) {
|
|
38
|
+
return response.data.data.items;
|
|
39
|
+
}
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger_1.logger.error('搜索技能失败');
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 按名称和作者搜索技能
|
|
49
|
+
* 由于后端 API 可能不支持 author_id 参数,这里先按名称搜索,然后在结果中过滤
|
|
50
|
+
*/
|
|
51
|
+
async searchByNameAndAuthor(skillName, author) {
|
|
52
|
+
try {
|
|
53
|
+
// 先按名称搜索
|
|
54
|
+
const skills = await this.search(skillName);
|
|
55
|
+
// 在结果中按作者过滤
|
|
56
|
+
const filtered = skills.filter(skill => skill.author?.username?.toLowerCase() === author.toLowerCase());
|
|
57
|
+
return filtered;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
logger_1.logger.error('搜索技能失败');
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 下载技能 ZIP 文件
|
|
66
|
+
*/
|
|
67
|
+
async downloadSkill(skillId, outputPath) {
|
|
68
|
+
try {
|
|
69
|
+
const response = await this.client.getClient().get(`/api/v1/skills/${skillId}/download`, {
|
|
70
|
+
responseType: 'arraybuffer',
|
|
71
|
+
// 下载大文件时增加超时时间
|
|
72
|
+
timeout: 60000
|
|
73
|
+
});
|
|
74
|
+
await fs_extra_1.default.writeFile(outputPath, response.data);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
logger_1.logger.error('下载技能失败');
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 获取技能详情
|
|
83
|
+
*/
|
|
84
|
+
async getSkillDetail(skillId) {
|
|
85
|
+
try {
|
|
86
|
+
const response = await this.client.getClient().get(`/api/v1/skills/${skillId}`);
|
|
87
|
+
if (response.data.success && response.data.data) {
|
|
88
|
+
return response.data.data;
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
logger_1.logger.error('获取技能详情失败');
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.SkillsApi = SkillsApi;
|
|
99
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/api/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+D1D"}
|
|
@@ -0,0 +1,72 @@
|
|
|
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.registerAuthCommand = registerAuthCommand;
|
|
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("../utils/logger");
|
|
12
|
+
/**
|
|
13
|
+
* 注册认证命令
|
|
14
|
+
*/
|
|
15
|
+
function registerAuthCommand(program) {
|
|
16
|
+
const authCmd = program.command('auth');
|
|
17
|
+
authCmd
|
|
18
|
+
.command('login')
|
|
19
|
+
.description('登录到 Tengits Skill Market')
|
|
20
|
+
.action(async () => {
|
|
21
|
+
try {
|
|
22
|
+
const answers = await inquirer_1.default.prompt([
|
|
23
|
+
{
|
|
24
|
+
type: 'input',
|
|
25
|
+
name: 'username',
|
|
26
|
+
message: '用户名:',
|
|
27
|
+
validate: (input) => input.length > 0 || '用户名不能为空'
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
type: 'password',
|
|
31
|
+
name: 'password',
|
|
32
|
+
message: '密码:',
|
|
33
|
+
mask: '*',
|
|
34
|
+
validate: (input) => input.length > 0 || '密码不能为空'
|
|
35
|
+
}
|
|
36
|
+
]);
|
|
37
|
+
const spinner = (0, ora_1.default)('正在登录...').start();
|
|
38
|
+
const client = new client_1.ApiClient();
|
|
39
|
+
const authApi = new auth_1.AuthApi(client);
|
|
40
|
+
await authApi.login(answers.username, answers.password);
|
|
41
|
+
spinner.succeed('登录成功');
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
logger_1.logger.error('登录失败');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
authCmd
|
|
49
|
+
.command('logout')
|
|
50
|
+
.description('退出登录')
|
|
51
|
+
.action(() => {
|
|
52
|
+
const authApi = new auth_1.AuthApi(new client_1.ApiClient());
|
|
53
|
+
authApi.logout();
|
|
54
|
+
});
|
|
55
|
+
authCmd
|
|
56
|
+
.command('status')
|
|
57
|
+
.description('查看登录状态')
|
|
58
|
+
.action(async () => {
|
|
59
|
+
const client = new client_1.ApiClient();
|
|
60
|
+
const authApi = new auth_1.AuthApi(client);
|
|
61
|
+
const isValid = await authApi.checkToken();
|
|
62
|
+
if (isValid) {
|
|
63
|
+
logger_1.logger.success('已登录');
|
|
64
|
+
logger_1.logger.info(`服务器: ${client.getServerUrl()}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
logger_1.logger.warn('未登录');
|
|
68
|
+
logger_1.logger.info('运行: itengits auth login');
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":";;;;;AAUA,kDA+DC;AAxED,wDAAgC;AAChC,8CAAsB;AACtB,0CAA0C;AAC1C,sCAAsC;AACtC,4CAAyC;AAEzC;;GAEG;AACH,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAExC,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACpC;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS;iBAC3D;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ;iBAC1D;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;YAEvC,MAAM,MAAM,GAAG,IAAI,kBAAS,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,MAAM,CAAC,CAAC;YAEpC,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAExD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,MAAM,CAAC;SACnB,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,IAAI,kBAAS,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,QAAQ,CAAC;SACrB,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,IAAI,kBAAS,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,MAAM,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAE3C,IAAI,OAAO,EAAE,CAAC;YACZ,eAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACtB,eAAM,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,eAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,eAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC3D"}
|