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
|
@@ -0,0 +1,98 @@
|
|
|
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.FileManager = void 0;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const extract_zip_1 = __importDefault(require("extract-zip"));
|
|
10
|
+
const path_2 = require("./path");
|
|
11
|
+
const logger_1 = require("./logger");
|
|
12
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
13
|
+
/**
|
|
14
|
+
* 文件管理器
|
|
15
|
+
* 处理文件解压、清理和冲突检测
|
|
16
|
+
*/
|
|
17
|
+
class FileManager {
|
|
18
|
+
/**
|
|
19
|
+
* 解压 ZIP 文件到目标目录
|
|
20
|
+
* 自动处理 ZIP 内的根目录结构
|
|
21
|
+
*/
|
|
22
|
+
static async extractZip(zipPath, targetDir) {
|
|
23
|
+
try {
|
|
24
|
+
// 先解压到临时目录
|
|
25
|
+
const tempExtractDir = path_1.default.join(path_1.default.dirname(zipPath), 'temp_extract');
|
|
26
|
+
await fs_extra_1.default.remove(tempExtractDir); // 清理可能存在的旧临时目录
|
|
27
|
+
await (0, extract_zip_1.default)(zipPath, { dir: path_1.default.resolve(tempExtractDir) });
|
|
28
|
+
// 检查解压后的内容
|
|
29
|
+
const files = await fs_extra_1.default.readdir(tempExtractDir);
|
|
30
|
+
// 如果只有一个文件/目录,并且是目录,则提取其内部内容
|
|
31
|
+
if (files.length === 1) {
|
|
32
|
+
const singleItem = path_1.default.join(tempExtractDir, files[0]);
|
|
33
|
+
const stat = await fs_extra_1.default.stat(singleItem);
|
|
34
|
+
if (stat.isDirectory()) {
|
|
35
|
+
// ZIP 内只有一个根目录,将其内容移动到目标目录
|
|
36
|
+
await fs_extra_1.default.copy(singleItem, targetDir);
|
|
37
|
+
await fs_extra_1.default.remove(tempExtractDir);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// 否则,直接移动所有内容到目标目录
|
|
42
|
+
await fs_extra_1.default.copy(tempExtractDir, targetDir);
|
|
43
|
+
await fs_extra_1.default.remove(tempExtractDir);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
logger_1.logger.error('解压文件失败');
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 清理临时文件
|
|
52
|
+
*/
|
|
53
|
+
static async cleanup(filePath) {
|
|
54
|
+
try {
|
|
55
|
+
if (await fs_extra_1.default.pathExists(filePath)) {
|
|
56
|
+
await fs_extra_1.default.remove(filePath);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
logger_1.logger.warn(`清理临时文件失败: ${filePath}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 确保目标目录不存在或已确认覆盖
|
|
65
|
+
* 返回 true 表示可以继续安装,false 表示取消安装
|
|
66
|
+
*/
|
|
67
|
+
static async ensureTargetDirectory(targetDir, skillName, force) {
|
|
68
|
+
const extractedDir = path_2.PathManager.getSkillExtractedDir(targetDir, skillName);
|
|
69
|
+
if (await fs_extra_1.default.pathExists(extractedDir)) {
|
|
70
|
+
if (force) {
|
|
71
|
+
logger_1.logger.info(`覆盖现有技能: ${extractedDir}`);
|
|
72
|
+
await fs_extra_1.default.remove(extractedDir);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const { overwrite } = await inquirer_1.default.prompt([
|
|
77
|
+
{
|
|
78
|
+
type: 'confirm',
|
|
79
|
+
name: 'overwrite',
|
|
80
|
+
message: `技能已存在于 ${extractedDir},是否覆盖?`,
|
|
81
|
+
default: false
|
|
82
|
+
}
|
|
83
|
+
]);
|
|
84
|
+
if (overwrite) {
|
|
85
|
+
await fs_extra_1.default.remove(extractedDir);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
logger_1.logger.info('取消安装');
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.FileManager = FileManager;
|
|
98
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日志工具类
|
|
3
|
+
* 提供彩色的终端输出
|
|
4
|
+
*/
|
|
5
|
+
export declare class Logger {
|
|
6
|
+
success(message: string): void;
|
|
7
|
+
error(message: string): void;
|
|
8
|
+
warn(message: string): void;
|
|
9
|
+
info(message: string): void;
|
|
10
|
+
debug(message: string): void;
|
|
11
|
+
blank(): void;
|
|
12
|
+
}
|
|
13
|
+
export declare const logger: Logger;
|
|
14
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5B,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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.logger = exports.Logger = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
/**
|
|
9
|
+
* 日志工具类
|
|
10
|
+
* 提供彩色的终端输出
|
|
11
|
+
*/
|
|
12
|
+
class Logger {
|
|
13
|
+
success(message) {
|
|
14
|
+
console.log(chalk_1.default.green('✓'), message);
|
|
15
|
+
}
|
|
16
|
+
error(message) {
|
|
17
|
+
console.error(chalk_1.default.red('✗'), message);
|
|
18
|
+
}
|
|
19
|
+
warn(message) {
|
|
20
|
+
console.warn(chalk_1.default.yellow('⚠'), message);
|
|
21
|
+
}
|
|
22
|
+
info(message) {
|
|
23
|
+
console.log(chalk_1.default.blue('ℹ'), message);
|
|
24
|
+
}
|
|
25
|
+
debug(message) {
|
|
26
|
+
if (process.env.DEBUG) {
|
|
27
|
+
console.log(chalk_1.default.gray('_debug_:'), message);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
blank() {
|
|
31
|
+
console.log('');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.Logger = Logger;
|
|
35
|
+
exports.logger = new Logger();
|
|
36
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B;;;GAGG;AACH,MAAa,MAAM;IACjB,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,KAAK;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF;AA1BD,wBA0BC;AAEY,QAAA,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { SkillAddOptions, SkillRemoveOptions } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* 路径管理器
|
|
4
|
+
* 处理跨平台路径逻辑
|
|
5
|
+
*/
|
|
6
|
+
export declare class PathManager {
|
|
7
|
+
/**
|
|
8
|
+
* 获取技能安装目标目录
|
|
9
|
+
*/
|
|
10
|
+
static getSkillTargetDir(options: SkillAddOptions | SkillRemoveOptions): string;
|
|
11
|
+
/**
|
|
12
|
+
* 获取技能解压后的具体目录
|
|
13
|
+
*/
|
|
14
|
+
static getSkillExtractedDir(targetDir: string, skillName: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* 确保目录存在,不存在则创建
|
|
17
|
+
*/
|
|
18
|
+
static ensureDir(dirPath: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* 检查技能是否已存在
|
|
21
|
+
*/
|
|
22
|
+
static skillExists(targetDir: string, skillName: string): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* 获取临时下载目录
|
|
25
|
+
*/
|
|
26
|
+
static getTempDir(): string;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE/D;;;GAGG;AACH,qBAAa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,kBAAkB,GAAG,MAAM;IAS/E;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAMzE;;OAEG;WACU,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD;;OAEG;WACU,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMhF;;OAEG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM;CAG5B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
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.PathManager = void 0;
|
|
40
|
+
const path_1 = __importDefault(require("path"));
|
|
41
|
+
const os_1 = __importDefault(require("os"));
|
|
42
|
+
/**
|
|
43
|
+
* 路径管理器
|
|
44
|
+
* 处理跨平台路径逻辑
|
|
45
|
+
*/
|
|
46
|
+
class PathManager {
|
|
47
|
+
/**
|
|
48
|
+
* 获取技能安装目标目录
|
|
49
|
+
*/
|
|
50
|
+
static getSkillTargetDir(options) {
|
|
51
|
+
const baseDir = options.scope === 'global'
|
|
52
|
+
? path_1.default.join(os_1.default.homedir(), '.claude', 'skills')
|
|
53
|
+
: path_1.default.join(process.cwd(), '.claude', 'skills');
|
|
54
|
+
// 不再添加 type 子目录,直接返回 baseDir
|
|
55
|
+
return baseDir;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 获取技能解压后的具体目录
|
|
59
|
+
*/
|
|
60
|
+
static getSkillExtractedDir(targetDir, skillName) {
|
|
61
|
+
// 从技能名称中移除 .zip 后缀(如果存在)
|
|
62
|
+
const cleanName = skillName.replace(/\.zip$/i, '');
|
|
63
|
+
return path_1.default.join(targetDir, cleanName);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 确保目录存在,不存在则创建
|
|
67
|
+
*/
|
|
68
|
+
static async ensureDir(dirPath) {
|
|
69
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
|
|
70
|
+
await fs.ensureDir(dirPath);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 检查技能是否已存在
|
|
74
|
+
*/
|
|
75
|
+
static async skillExists(targetDir, skillName) {
|
|
76
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs-extra')));
|
|
77
|
+
const extractedDir = this.getSkillExtractedDir(targetDir, skillName);
|
|
78
|
+
return fs.pathExists(extractedDir);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 获取临时下载目录
|
|
82
|
+
*/
|
|
83
|
+
static getTempDir() {
|
|
84
|
+
return path_1.default.join(os_1.default.tmpdir(), 'itengits');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.PathManager = PathManager;
|
|
88
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwB;AACxB,4CAAoB;AAGpB;;;GAGG;AACH,MAAa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,OAA6C;QACpE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,KAAK,QAAQ;YACxC,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC;YAC9C,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAElD,6BAA6B;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,oBAAoB,CAAC,SAAiB,EAAE,SAAiB;QAC9D,yBAAyB;QACzB,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnD,OAAO,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAe;QACpC,MAAM,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;QACpC,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,SAAiB;QAC3D,MAAM,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACrE,OAAO,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU;QACf,OAAO,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC;CACF;AA7CD,kCA6CC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "itengits",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Tengits Skill Market CLI - Claude Code 技能安装工具",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"itengits": "./bin/itengits.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"bin"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "ts-node src/index.ts",
|
|
16
|
+
"prepublishOnly": "npm run build",
|
|
17
|
+
"test": "jest",
|
|
18
|
+
"test:watch": "jest --watch",
|
|
19
|
+
"lint": "eslint src --ext .ts",
|
|
20
|
+
"publish:npm": "npm publish --registry https://registry.npmjs.org"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"claude",
|
|
24
|
+
"claude-code",
|
|
25
|
+
"skills",
|
|
26
|
+
"cli",
|
|
27
|
+
"tengits"
|
|
28
|
+
],
|
|
29
|
+
"author": "Tengits",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"axios": "^1.6.2",
|
|
33
|
+
"chalk": "^5.3.0",
|
|
34
|
+
"commander": "^11.1.0",
|
|
35
|
+
"configstore": "^6.0.0",
|
|
36
|
+
"extract-zip": "^2.0.1",
|
|
37
|
+
"fs-extra": "^11.2.0",
|
|
38
|
+
"inquirer": "^9.2.12",
|
|
39
|
+
"ora": "^7.0.1"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/configstore": "^6.0.2",
|
|
43
|
+
"@types/fs-extra": "^11.0.4",
|
|
44
|
+
"@types/inquirer": "^9.0.7",
|
|
45
|
+
"@types/jest": "^29.5.11",
|
|
46
|
+
"@types/node": "^20.10.5",
|
|
47
|
+
"@typescript-eslint/eslint-plugin": "^6.15.0",
|
|
48
|
+
"@typescript-eslint/parser": "^6.15.0",
|
|
49
|
+
"eslint": "^8.56.0",
|
|
50
|
+
"jest": "^29.7.0",
|
|
51
|
+
"ts-jest": "^29.1.1",
|
|
52
|
+
"ts-node": "^10.9.2",
|
|
53
|
+
"typescript": "^5.3.3"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=16.0.0"
|
|
57
|
+
},
|
|
58
|
+
"repository": {
|
|
59
|
+
"type": "git",
|
|
60
|
+
"url": "https://github.com/your-org/tengits-skill-market.git"
|
|
61
|
+
},
|
|
62
|
+
"bugs": {
|
|
63
|
+
"url": "https://github.com/your-org/tengits-skill-market/issues"
|
|
64
|
+
},
|
|
65
|
+
"homepage": "https://github.com/your-org/tengits-skill-market#readme"
|
|
66
|
+
}
|