@dayinxisheng/skillctl 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/LICENSE +21 -0
- package/README.md +147 -0
- package/dist/commands/activate.d.ts +9 -0
- package/dist/commands/activate.d.ts.map +1 -0
- package/dist/commands/activate.js +62 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/all-list.d.ts +5 -0
- package/dist/commands/all-list.d.ts.map +1 -0
- package/dist/commands/all-list.js +22 -0
- package/dist/commands/all-list.js.map +1 -0
- package/dist/commands/config.d.ts +5 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +16 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deactivate.d.ts +9 -0
- package/dist/commands/deactivate.d.ts.map +1 -0
- package/dist/commands/deactivate.js +41 -0
- package/dist/commands/deactivate.js.map +1 -0
- package/dist/commands/import.d.ts +6 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +32 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +48 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/locate.d.ts +5 -0
- package/dist/commands/locate.d.ts.map +1 -0
- package/dist/commands/locate.js +37 -0
- package/dist/commands/locate.js.map +1 -0
- package/dist/commands/set-repo.d.ts +6 -0
- package/dist/commands/set-repo.d.ts.map +1 -0
- package/dist/commands/set-repo.js +19 -0
- package/dist/commands/set-repo.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +25 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +184 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config-manager.d.ts +34 -0
- package/dist/lib/config-manager.d.ts.map +1 -0
- package/dist/lib/config-manager.js +77 -0
- package/dist/lib/config-manager.js.map +1 -0
- package/dist/lib/link-handler.d.ts +37 -0
- package/dist/lib/link-handler.d.ts.map +1 -0
- package/dist/lib/link-handler.js +114 -0
- package/dist/lib/link-handler.js.map +1 -0
- package/dist/lib/skill-manager.d.ts +49 -0
- package/dist/lib/skill-manager.d.ts.map +1 -0
- package/dist/lib/skill-manager.js +215 -0
- package/dist/lib/skill-manager.js.map +1 -0
- package/dist/types/index.d.ts +60 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/errors.d.ts +25 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +46 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/output.d.ts +14 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +61 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/platform.d.ts +17 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +39 -0
- package/dist/utils/platform.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill 管理器 - 核心业务逻辑
|
|
3
|
+
*/
|
|
4
|
+
import { readdir } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { getHomeDir, getCwd } from '../utils/platform.js';
|
|
7
|
+
import { isSymlink, resolveLink, createLink, removeLink, pathExists, isDirectory, validateLink, } from './link-handler.js';
|
|
8
|
+
import { InvalidSkillError } from '../utils/errors.js';
|
|
9
|
+
import { getRepository } from './config-manager.js';
|
|
10
|
+
// 缓存仓库路径,避免重复读取配置
|
|
11
|
+
let cachedRepoPath = null;
|
|
12
|
+
/**
|
|
13
|
+
* 获取仓库路径(带缓存)
|
|
14
|
+
*/
|
|
15
|
+
async function getRepositoryPath() {
|
|
16
|
+
if (cachedRepoPath === null) {
|
|
17
|
+
cachedRepoPath = await getRepository();
|
|
18
|
+
}
|
|
19
|
+
return cachedRepoPath || '/github/skills';
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 获取激活目录路径
|
|
23
|
+
*/
|
|
24
|
+
export function getActiveDir(scope) {
|
|
25
|
+
if (scope === 'user') {
|
|
26
|
+
return join(getHomeDir(), '.claude', 'skills');
|
|
27
|
+
}
|
|
28
|
+
return join(getCwd(), '.claude', 'skills');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 获取项目 skills 目录
|
|
32
|
+
*/
|
|
33
|
+
export async function getProjectSkillsDir() {
|
|
34
|
+
const repoPath = await getRepositoryPath();
|
|
35
|
+
return join(repoPath, 'skills');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 获取 skill 源路径(项目中的实际位置)
|
|
39
|
+
*/
|
|
40
|
+
export async function getSkillSourcePath(skillName) {
|
|
41
|
+
const skillsDir = await getProjectSkillsDir();
|
|
42
|
+
return join(skillsDir, skillName);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 验证 skill 是否有效
|
|
46
|
+
*/
|
|
47
|
+
export async function validateSkill(skillName) {
|
|
48
|
+
const skillPath = await getSkillSourcePath(skillName);
|
|
49
|
+
if (!pathExists(skillPath)) {
|
|
50
|
+
return { valid: false, reason: 'Skill 目录不存在' };
|
|
51
|
+
}
|
|
52
|
+
if (!isDirectory(skillPath)) {
|
|
53
|
+
return { valid: false, reason: '路径不是目录' };
|
|
54
|
+
}
|
|
55
|
+
// 检查是否包含 SKILL.md 或类似文件
|
|
56
|
+
const files = await readdir(skillPath);
|
|
57
|
+
const hasSkillFile = files.some((f) => f.toLowerCase() === 'skill.md' || (f.toLowerCase().endsWith('.md') && f.toLowerCase().startsWith('skill')));
|
|
58
|
+
if (!hasSkillFile) {
|
|
59
|
+
return { valid: false, reason: '缺少 SKILL.md 文件' };
|
|
60
|
+
}
|
|
61
|
+
return { valid: true };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 检查 skill 是否已激活
|
|
65
|
+
*/
|
|
66
|
+
export async function isSkillActive(skillName, scope) {
|
|
67
|
+
const activeDir = getActiveDir(scope);
|
|
68
|
+
const linkPath = join(activeDir, skillName);
|
|
69
|
+
if (!isSymlink(linkPath)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const skillSource = await getSkillSourcePath(skillName);
|
|
73
|
+
return validateLink(linkPath, skillSource);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 激活单个 skill
|
|
77
|
+
*/
|
|
78
|
+
export async function activateSkill(skillName, scope) {
|
|
79
|
+
// 验证 skill
|
|
80
|
+
const validation = await validateSkill(skillName);
|
|
81
|
+
if (!validation.valid) {
|
|
82
|
+
throw new InvalidSkillError(`${skillName}: ${validation.reason}`);
|
|
83
|
+
}
|
|
84
|
+
// 检查是否已激活
|
|
85
|
+
if (await isSkillActive(skillName, scope)) {
|
|
86
|
+
return; // 已激活,直接返回
|
|
87
|
+
}
|
|
88
|
+
const skillSource = await getSkillSourcePath(skillName);
|
|
89
|
+
const linkPath = join(getActiveDir(scope), skillName);
|
|
90
|
+
// 检查目标路径是否被占用
|
|
91
|
+
if (pathExists(linkPath) && !isSymlink(linkPath)) {
|
|
92
|
+
throw new InvalidSkillError(`目标路径已存在且不是链接: ${linkPath}`);
|
|
93
|
+
}
|
|
94
|
+
await createLink(skillSource, linkPath);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 停用单个 skill
|
|
98
|
+
*/
|
|
99
|
+
export async function deactivateSkill(skillName, scope) {
|
|
100
|
+
const linkPath = join(getActiveDir(scope), skillName);
|
|
101
|
+
if (!isSymlink(linkPath)) {
|
|
102
|
+
return; // 未激活,直接返回
|
|
103
|
+
}
|
|
104
|
+
await removeLink(linkPath);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 获取所有可用的 skills
|
|
108
|
+
*/
|
|
109
|
+
export async function getAllSkills() {
|
|
110
|
+
const skillsDir = await getProjectSkillsDir();
|
|
111
|
+
if (!pathExists(skillsDir) || !isDirectory(skillsDir)) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
const entries = await readdir(skillsDir, { withFileTypes: true });
|
|
115
|
+
const skills = [];
|
|
116
|
+
for (const entry of entries) {
|
|
117
|
+
if (entry.isDirectory()) {
|
|
118
|
+
// 验证是否为有效 skill
|
|
119
|
+
const validation = await validateSkill(entry.name);
|
|
120
|
+
if (validation.valid) {
|
|
121
|
+
skills.push(entry.name);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return skills.sort();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 获取 skills 状态
|
|
129
|
+
*/
|
|
130
|
+
export async function getSkillsStatus() {
|
|
131
|
+
const allSkills = await getAllSkills();
|
|
132
|
+
const status = [];
|
|
133
|
+
for (const skillName of allSkills) {
|
|
134
|
+
status.push({
|
|
135
|
+
name: skillName,
|
|
136
|
+
userActivated: await isSkillActive(skillName, 'user'),
|
|
137
|
+
projectActivated: await isSkillActive(skillName, 'project'),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return status;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* 获取已激活的 skills
|
|
144
|
+
*/
|
|
145
|
+
export async function getActiveSkills(scope) {
|
|
146
|
+
const activeDir = getActiveDir(scope);
|
|
147
|
+
const links = [];
|
|
148
|
+
if (!pathExists(activeDir) || !isDirectory(activeDir)) {
|
|
149
|
+
return links;
|
|
150
|
+
}
|
|
151
|
+
const entries = await readdir(activeDir, { withFileTypes: true });
|
|
152
|
+
for (const entry of entries) {
|
|
153
|
+
const linkPath = join(activeDir, entry.name);
|
|
154
|
+
if (isSymlink(linkPath)) {
|
|
155
|
+
const target = resolveLink(linkPath);
|
|
156
|
+
links.push({
|
|
157
|
+
name: entry.name,
|
|
158
|
+
path: linkPath,
|
|
159
|
+
target,
|
|
160
|
+
isSymlink: true,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
else if (entry.isDirectory()) {
|
|
164
|
+
links.push({
|
|
165
|
+
name: entry.name,
|
|
166
|
+
path: linkPath,
|
|
167
|
+
isSymlink: false,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return links.sort((a, b) => a.name.localeCompare(b.name));
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 定位 skill(在多个位置搜索)
|
|
175
|
+
*/
|
|
176
|
+
export async function locateSkill(skillName) {
|
|
177
|
+
const results = [];
|
|
178
|
+
// 搜索 user 级别
|
|
179
|
+
const userDir = getActiveDir('user');
|
|
180
|
+
const userPath = join(userDir, skillName);
|
|
181
|
+
if (pathExists(userPath)) {
|
|
182
|
+
results.push({
|
|
183
|
+
name: skillName,
|
|
184
|
+
path: userPath,
|
|
185
|
+
scope: 'user',
|
|
186
|
+
isSymlink: isSymlink(userPath),
|
|
187
|
+
target: isSymlink(userPath) ? resolveLink(userPath) : undefined,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
// 搜索 project 级别
|
|
191
|
+
const projectDir = getActiveDir('project');
|
|
192
|
+
const projectPath = join(projectDir, skillName);
|
|
193
|
+
if (pathExists(projectPath)) {
|
|
194
|
+
results.push({
|
|
195
|
+
name: skillName,
|
|
196
|
+
path: projectPath,
|
|
197
|
+
scope: 'project',
|
|
198
|
+
isSymlink: isSymlink(projectPath),
|
|
199
|
+
target: isSymlink(projectPath) ? resolveLink(projectPath) : undefined,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// 搜索项目 skills 目录
|
|
203
|
+
const skillsDir = await getProjectSkillsDir();
|
|
204
|
+
const skillsPath = join(skillsDir, skillName);
|
|
205
|
+
if (pathExists(skillsPath) && results.length === 0) {
|
|
206
|
+
results.push({
|
|
207
|
+
name: skillName,
|
|
208
|
+
path: skillsPath,
|
|
209
|
+
scope: 'repository',
|
|
210
|
+
isSymlink: false,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return results;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=skill-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/lib/skill-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills 管理工具 - 类型定义
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 作用域类型
|
|
6
|
+
*/
|
|
7
|
+
export type Scope = 'user' | 'project';
|
|
8
|
+
/**
|
|
9
|
+
* Skill 状态信息
|
|
10
|
+
*/
|
|
11
|
+
export interface SkillStatus {
|
|
12
|
+
name: string;
|
|
13
|
+
userActivated: boolean;
|
|
14
|
+
projectActivated: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 配置文件结构
|
|
18
|
+
*/
|
|
19
|
+
export interface SkillctlConfig {
|
|
20
|
+
repository?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 命令选项接口
|
|
24
|
+
*/
|
|
25
|
+
export interface ActivateOptions {
|
|
26
|
+
scope: Scope;
|
|
27
|
+
all: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface DeactivateOptions {
|
|
30
|
+
scope: Scope;
|
|
31
|
+
all: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface ImportOptions {
|
|
34
|
+
scope: Scope;
|
|
35
|
+
}
|
|
36
|
+
export interface LocateOptions {
|
|
37
|
+
scope?: Scope;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 链接信息
|
|
41
|
+
*/
|
|
42
|
+
export interface LinkInfo {
|
|
43
|
+
name: string;
|
|
44
|
+
path: string;
|
|
45
|
+
target?: string;
|
|
46
|
+
isSymlink: boolean;
|
|
47
|
+
scope?: 'user' | 'project' | 'repository';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Skill 验证结果
|
|
51
|
+
*/
|
|
52
|
+
export interface SkillValidationResult {
|
|
53
|
+
valid: boolean;
|
|
54
|
+
reason?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 平台类型
|
|
58
|
+
*/
|
|
59
|
+
export type Platform = 'windows' | 'macos' | 'linux' | 'unknown';
|
|
60
|
+
//# 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;AAEH;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自定义错误类
|
|
3
|
+
*/
|
|
4
|
+
export declare class SkillctlError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class SkillNotFoundError extends SkillctlError {
|
|
8
|
+
constructor(skillName: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class SkillAlreadyActiveError extends SkillctlError {
|
|
11
|
+
constructor(skillName: string, scope: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class ConfigError extends SkillctlError {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
export declare class LinkError extends SkillctlError {
|
|
17
|
+
constructor(message: string);
|
|
18
|
+
}
|
|
19
|
+
export declare class DirectoryNotFoundError extends SkillctlError {
|
|
20
|
+
constructor(path: string);
|
|
21
|
+
}
|
|
22
|
+
export declare class InvalidSkillError extends SkillctlError {
|
|
23
|
+
constructor(path: string);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,aAAa;gBACvC,SAAS,EAAE,MAAM;CAI9B;AAED,qBAAa,uBAAwB,SAAQ,aAAa;gBAC5C,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAI7C;AAED,qBAAa,WAAY,SAAQ,aAAa;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,SAAU,SAAQ,aAAa;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,sBAAuB,SAAQ,aAAa;gBAC3C,IAAI,EAAE,MAAM;CAIzB;AAED,qBAAa,iBAAkB,SAAQ,aAAa;gBACtC,IAAI,EAAE,MAAM;CAIzB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自定义错误类
|
|
3
|
+
*/
|
|
4
|
+
export class SkillctlError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'SkillctlError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class SkillNotFoundError extends SkillctlError {
|
|
11
|
+
constructor(skillName) {
|
|
12
|
+
super(`Skill 不存在: ${skillName}`);
|
|
13
|
+
this.name = 'SkillNotFoundError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class SkillAlreadyActiveError extends SkillctlError {
|
|
17
|
+
constructor(skillName, scope) {
|
|
18
|
+
super(`Skill 已激活: ${skillName} (${scope})`);
|
|
19
|
+
this.name = 'SkillAlreadyActiveError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class ConfigError extends SkillctlError {
|
|
23
|
+
constructor(message) {
|
|
24
|
+
super(`配置错误: ${message}`);
|
|
25
|
+
this.name = 'ConfigError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class LinkError extends SkillctlError {
|
|
29
|
+
constructor(message) {
|
|
30
|
+
super(`链接操作失败: ${message}`);
|
|
31
|
+
this.name = 'LinkError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export class DirectoryNotFoundError extends SkillctlError {
|
|
35
|
+
constructor(path) {
|
|
36
|
+
super(`目录不存在: ${path}`);
|
|
37
|
+
this.name = 'DirectoryNotFoundError';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class InvalidSkillError extends SkillctlError {
|
|
41
|
+
constructor(path) {
|
|
42
|
+
super(`无效的 skill: ${path}`);
|
|
43
|
+
this.name = 'InvalidSkillError';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IACnD,YAAY,SAAiB;QAC3B,KAAK,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,aAAa;IACxD,YAAY,SAAiB,EAAE,KAAa;QAC1C,KAAK,CAAC,cAAc,SAAS,KAAK,KAAK,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,aAAa;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,aAAa;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IACvD,YAAY,IAAY;QACtB,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD,YAAY,IAAY;QACtB,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 输出工具 - 使用 chalk 实现彩色输出
|
|
3
|
+
*/
|
|
4
|
+
export declare function printHeader(title: string): void;
|
|
5
|
+
export declare function printSuccess(message: string): void;
|
|
6
|
+
export declare function printError(message: string): void;
|
|
7
|
+
export declare function printInfo(message: string): void;
|
|
8
|
+
export declare function printWarning(message: string): void;
|
|
9
|
+
export declare function printKeyValue(key: string, value: string): void;
|
|
10
|
+
export declare function printLink(name: string, target?: string): void;
|
|
11
|
+
export declare function printStatusItem(skill: string, userStatus: string, projectStatus: string): void;
|
|
12
|
+
export declare function formatPath(path: string, homeDir: string): string;
|
|
13
|
+
export declare function printTable(headers: string[], rows: string[][]): void;
|
|
14
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAK/C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE9D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAM7D;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,GACpB,IAAI,CAIN;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAuBpE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/**
|
|
3
|
+
* 输出工具 - 使用 chalk 实现彩色输出
|
|
4
|
+
*/
|
|
5
|
+
export function printHeader(title) {
|
|
6
|
+
const line = '━'.repeat(60);
|
|
7
|
+
console.log(chalk.cyan(line));
|
|
8
|
+
console.log(chalk.cyan(` ${title}`));
|
|
9
|
+
console.log(chalk.cyan(line));
|
|
10
|
+
}
|
|
11
|
+
export function printSuccess(message) {
|
|
12
|
+
console.log(`${chalk.green('✓')} ${message}`);
|
|
13
|
+
}
|
|
14
|
+
export function printError(message) {
|
|
15
|
+
console.error(`${chalk.red('✗')} ${message}`);
|
|
16
|
+
}
|
|
17
|
+
export function printInfo(message) {
|
|
18
|
+
console.log(`${chalk.blue('ℹ')} ${message}`);
|
|
19
|
+
}
|
|
20
|
+
export function printWarning(message) {
|
|
21
|
+
console.log(`${chalk.yellow('⚠')} ${message}`);
|
|
22
|
+
}
|
|
23
|
+
export function printKeyValue(key, value) {
|
|
24
|
+
console.log(` ${chalk.cyan(key)}: ${value}`);
|
|
25
|
+
}
|
|
26
|
+
export function printLink(name, target) {
|
|
27
|
+
if (target) {
|
|
28
|
+
console.log(` ${chalk.green(name)} ${chalk.gray('→')} ${target}`);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
console.log(` ${chalk.green(name)}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function printStatusItem(skill, userStatus, projectStatus) {
|
|
35
|
+
console.log(`${skill.padEnd(20)} ${userStatus.padEnd(10)} ${projectStatus.padEnd(10)}`);
|
|
36
|
+
}
|
|
37
|
+
export function formatPath(path, homeDir) {
|
|
38
|
+
return path.replace(homeDir, '~');
|
|
39
|
+
}
|
|
40
|
+
export function printTable(headers, rows) {
|
|
41
|
+
const colWidths = headers.map((h, i) => {
|
|
42
|
+
const maxInRows = Math.max(...rows.map((r) => (r[i] || '').length));
|
|
43
|
+
return Math.max(h.length, maxInRows);
|
|
44
|
+
});
|
|
45
|
+
// 打印表头
|
|
46
|
+
const headerLine = headers
|
|
47
|
+
.map((h, i) => h.padEnd(colWidths[i]))
|
|
48
|
+
.join(' ');
|
|
49
|
+
console.log(chalk.cyan(headerLine));
|
|
50
|
+
// 打印分隔线
|
|
51
|
+
const separator = colWidths.map((w) => '─'.repeat(w)).join(' ');
|
|
52
|
+
console.log(chalk.gray(separator));
|
|
53
|
+
// 打印数据行
|
|
54
|
+
for (const row of rows) {
|
|
55
|
+
const line = row
|
|
56
|
+
.map((c, i) => (c || '').padEnd(colWidths[i]))
|
|
57
|
+
.join(' ');
|
|
58
|
+
console.log(line);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Platform } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 平台检测工具
|
|
4
|
+
*/
|
|
5
|
+
export declare function detectPlatform(): Platform;
|
|
6
|
+
export declare function isWindows(): boolean;
|
|
7
|
+
export declare function isMacOS(): boolean;
|
|
8
|
+
export declare function isLinux(): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* 获取 home 目录
|
|
11
|
+
*/
|
|
12
|
+
export declare function getHomeDir(): string;
|
|
13
|
+
/**
|
|
14
|
+
* 获取当前工作目录
|
|
15
|
+
*/
|
|
16
|
+
export declare function getCwd(): string;
|
|
17
|
+
//# sourceMappingURL=platform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C;;GAEG;AAEH,wBAAgB,cAAc,IAAI,QAAQ,CAazC;AAED,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,MAAM,CAE/B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as os from 'node:os';
|
|
2
|
+
/**
|
|
3
|
+
* 平台检测工具
|
|
4
|
+
*/
|
|
5
|
+
export function detectPlatform() {
|
|
6
|
+
const platform = os.platform();
|
|
7
|
+
switch (platform) {
|
|
8
|
+
case 'win32':
|
|
9
|
+
return 'windows';
|
|
10
|
+
case 'darwin':
|
|
11
|
+
return 'macos';
|
|
12
|
+
case 'linux':
|
|
13
|
+
return 'linux';
|
|
14
|
+
default:
|
|
15
|
+
return 'unknown';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function isWindows() {
|
|
19
|
+
return detectPlatform() === 'windows';
|
|
20
|
+
}
|
|
21
|
+
export function isMacOS() {
|
|
22
|
+
return detectPlatform() === 'macos';
|
|
23
|
+
}
|
|
24
|
+
export function isLinux() {
|
|
25
|
+
return detectPlatform() === 'linux';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 获取 home 目录
|
|
29
|
+
*/
|
|
30
|
+
export function getHomeDir() {
|
|
31
|
+
return os.homedir();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 获取当前工作目录
|
|
35
|
+
*/
|
|
36
|
+
export function getCwd() {
|
|
37
|
+
return process.cwd();
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B;;GAEG;AAEH,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE/B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,cAAc,EAAE,KAAK,SAAS,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,cAAc,EAAE,KAAK,OAAO,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,cAAc,EAAE,KAAK,OAAO,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dayinxisheng/skillctl",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Claude Skills 管理工具 - 管理 Claude Skills 的激活状态和项目归档",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"skillctl": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"test": "vitest",
|
|
14
|
+
"test:ui": "vitest --ui",
|
|
15
|
+
"test:coverage": "vitest --coverage",
|
|
16
|
+
"lint": "eslint src --ext .ts",
|
|
17
|
+
"lint:fix": "eslint src --ext .ts --fix",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"claude",
|
|
22
|
+
"skills",
|
|
23
|
+
"cli",
|
|
24
|
+
"management",
|
|
25
|
+
"symlink"
|
|
26
|
+
],
|
|
27
|
+
"author": "hrjlab",
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"chalk": "^5.3.0",
|
|
31
|
+
"commander": "^12.1.0",
|
|
32
|
+
"ora": "^8.1.1"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^22.10.5",
|
|
36
|
+
"@typescript-eslint/eslint-plugin": "^8.19.1",
|
|
37
|
+
"@typescript-eslint/parser": "^8.19.1",
|
|
38
|
+
"@vitest/ui": "^2.1.8",
|
|
39
|
+
"eslint": "^9.17.0",
|
|
40
|
+
"typescript": "^5.7.2",
|
|
41
|
+
"vitest": "^2.1.8"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=18.0.0"
|
|
45
|
+
},
|
|
46
|
+
"files": [
|
|
47
|
+
"dist",
|
|
48
|
+
"README.md",
|
|
49
|
+
"LICENSE"
|
|
50
|
+
],
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public"
|
|
53
|
+
}
|
|
54
|
+
}
|