@skrupellose/code-helper 0.1.0 → 0.1.1
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 +83 -14
- package/dist/checks.js +2 -1
- package/dist/checks.js.map +1 -1
- package/dist/cli.d.ts +54 -0
- package/dist/cli.js +1181 -141
- package/dist/cli.js.map +1 -1
- package/dist/completion.d.ts +42 -0
- package/dist/completion.js +226 -0
- package/dist/completion.js.map +1 -0
- package/dist/constants.js +14 -7
- package/dist/constants.js.map +1 -1
- package/dist/hooks.d.ts +35 -0
- package/dist/hooks.js +400 -0
- package/dist/hooks.js.map +1 -0
- package/dist/init.d.ts +6 -0
- package/dist/init.js +77 -18
- package/dist/init.js.map +1 -1
- package/dist/skills.d.ts +45 -5
- package/dist/skills.js +300 -21
- package/dist/skills.js.map +1 -1
- package/dist/templates.d.ts +3 -2
- package/dist/templates.js +201 -33
- package/dist/templates.js.map +1 -1
- package/dist/terminal-ui.d.ts +5 -0
- package/dist/terminal-ui.js +21 -4
- package/dist/terminal-ui.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/workflows.js +50 -8
- package/dist/workflows.js.map +1 -1
- package/package.json +1 -1
package/dist/skills.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { OperationResult } from "./types.js";
|
|
2
2
|
/**
|
|
3
3
|
* 当前支持的项目级 skill 注册目标。
|
|
4
|
-
* codex 写入 `.agents/skills`,claudecode 写入 `.claude/skills`。
|
|
4
|
+
* codex 写入 `.agents/skills`,claudecode 写入 `.claude/skills`,githubcopilot 写入 `.github/skills`。
|
|
5
5
|
*/
|
|
6
|
-
export type SkillRegistrationTarget = "codex" | "claudecode";
|
|
6
|
+
export type SkillRegistrationTarget = "codex" | "claudecode" | "githubcopilot";
|
|
7
7
|
/**
|
|
8
8
|
* 单个项目级 skill 的注册状态。
|
|
9
9
|
* CLI 用它展示当前项目是否已经注册 code-helper skills。
|
|
@@ -14,14 +14,40 @@ export interface SkillRegistrationStatus {
|
|
|
14
14
|
path: string;
|
|
15
15
|
registered: boolean;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* skills doctor 的检查结果。
|
|
19
|
+
* warning 用于可改进项,error 用于会导致 skill 无法被识别的结构问题。
|
|
20
|
+
*/
|
|
21
|
+
export interface SkillDoctorIssue {
|
|
22
|
+
level: "error" | "warning";
|
|
23
|
+
code: string;
|
|
24
|
+
message: string;
|
|
25
|
+
path: string;
|
|
26
|
+
suggestion: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* skills audit 的推荐项。
|
|
30
|
+
* 该结构只输出建议,不直接修改项目文件。
|
|
31
|
+
*/
|
|
32
|
+
export interface SkillAuditRecommendation {
|
|
33
|
+
priority: "high" | "medium" | "low";
|
|
34
|
+
code: string;
|
|
35
|
+
message: string;
|
|
36
|
+
suggestion: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 返回当前支持的项目级 skills 注册目标。
|
|
40
|
+
* 调用方拿到副本,避免外部修改模块内的稳定顺序。
|
|
41
|
+
*/
|
|
42
|
+
export declare function listSupportedSkillRegistrationTargets(): SkillRegistrationTarget[];
|
|
17
43
|
/**
|
|
18
44
|
* 注册 code-helper 内置 skills 到当前项目。
|
|
19
|
-
*
|
|
45
|
+
* 注册结果按目标写入对应项目级 skills 目录,只影响当前项目。
|
|
20
46
|
*/
|
|
21
47
|
export declare function registerProjectSkills(projectRoot: string, target?: SkillRegistrationTarget): Promise<OperationResult[]>;
|
|
22
48
|
/**
|
|
23
49
|
* 取消注册 code-helper 项目级 skills。
|
|
24
|
-
*
|
|
50
|
+
* 只删除各目标目录下的 `code-helper-*` 受控目录,不触碰用户自己的 skills。
|
|
25
51
|
*/
|
|
26
52
|
export declare function unregisterProjectSkills(projectRoot: string, target?: SkillRegistrationTarget): Promise<OperationResult[]>;
|
|
27
53
|
/**
|
|
@@ -36,6 +62,20 @@ export declare function listProjectSkillRegistrations(projectRoot: string, targe
|
|
|
36
62
|
export declare function parseSkillRegistrationTargets(value: string | undefined): SkillRegistrationTarget[];
|
|
37
63
|
/**
|
|
38
64
|
* 根据当前项目实际入口文件推断需要注册的 agent 工具。
|
|
39
|
-
* 根目录已有 AGENTS.md
|
|
65
|
+
* 根目录已有 AGENTS.md、CLAUDE.md 或 GitHub Copilot 入口时,以这些文件作为实际使用状态;完全没有入口文件时返回空数组,由调用方决定交互选择或保守跳过。
|
|
40
66
|
*/
|
|
41
67
|
export declare function resolveSkillRegistrationTargets(projectRoot: string): Promise<SkillRegistrationTarget[]>;
|
|
68
|
+
/**
|
|
69
|
+
* 检查当前项目 skills 的结构和质量。
|
|
70
|
+
* 该函数只做静态检查,不执行任何 skill 中的脚本或命令。
|
|
71
|
+
*/
|
|
72
|
+
export declare function runSkillsDoctor(projectRoot: string): Promise<SkillDoctorIssue[]>;
|
|
73
|
+
/**
|
|
74
|
+
* 根据当前项目状态给出 skills 管理建议。
|
|
75
|
+
* audit 只输出建议,避免在用户未确认时自动安装或注册更多内容。
|
|
76
|
+
*/
|
|
77
|
+
export declare function runSkillsAudit(projectRoot: string): Promise<SkillAuditRecommendation[]>;
|
|
78
|
+
/**
|
|
79
|
+
* 返回面向用户展示的 agent 工具名称。
|
|
80
|
+
*/
|
|
81
|
+
export declare function formatSkillRegistrationTargetName(target: SkillRegistrationTarget): string;
|
package/dist/skills.js
CHANGED
|
@@ -7,7 +7,7 @@ import { getSkillTemplates } from "./templates.js";
|
|
|
7
7
|
* 所有支持的注册目标。
|
|
8
8
|
* 显式传入 all 时才会使用完整列表,避免默认行为误注册未使用的 agent 工具。
|
|
9
9
|
*/
|
|
10
|
-
const ALL_SKILL_REGISTRATION_TARGETS = ["codex", "claudecode"];
|
|
10
|
+
const ALL_SKILL_REGISTRATION_TARGETS = ["codex", "claudecode", "githubcopilot"];
|
|
11
11
|
/**
|
|
12
12
|
* code-helper 内置 skill 到项目级目录的映射。
|
|
13
13
|
* directoryName 使用 skill frontmatter 中的 name,便于不同 agent 工具直接识别。
|
|
@@ -24,6 +24,10 @@ const CODE_HELPER_SKILL_REGISTRATIONS = [
|
|
|
24
24
|
{
|
|
25
25
|
templateFileName: "document-archive.SKILL.md",
|
|
26
26
|
directoryName: "code-helper-document-archive"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
templateFileName: "completion-review.SKILL.md",
|
|
30
|
+
directoryName: "code-helper-completion-review"
|
|
27
31
|
}
|
|
28
32
|
];
|
|
29
33
|
/**
|
|
@@ -36,15 +40,27 @@ const CODEX_PROJECT_SKILLS_DIRECTORY = ".agents/skills";
|
|
|
36
40
|
* 该目录只影响当前项目,不会注册到用户全局 `~/.claude/skills`。
|
|
37
41
|
*/
|
|
38
42
|
const CLAUDE_CODE_PROJECT_SKILLS_DIRECTORY = ".claude/skills";
|
|
43
|
+
/**
|
|
44
|
+
* GitHub Copilot Agent Skills 项目级目录。
|
|
45
|
+
* 该目录遵循 GitHub 当前 skills 目录约定,只在当前仓库内生效。
|
|
46
|
+
*/
|
|
47
|
+
const GITHUB_COPILOT_PROJECT_SKILLS_DIRECTORY = ".github/skills";
|
|
48
|
+
/**
|
|
49
|
+
* 返回当前支持的项目级 skills 注册目标。
|
|
50
|
+
* 调用方拿到副本,避免外部修改模块内的稳定顺序。
|
|
51
|
+
*/
|
|
52
|
+
export function listSupportedSkillRegistrationTargets() {
|
|
53
|
+
return [...ALL_SKILL_REGISTRATION_TARGETS];
|
|
54
|
+
}
|
|
39
55
|
/**
|
|
40
56
|
* 注册 code-helper 内置 skills 到当前项目。
|
|
41
|
-
*
|
|
57
|
+
* 注册结果按目标写入对应项目级 skills 目录,只影响当前项目。
|
|
42
58
|
*/
|
|
43
59
|
export async function registerProjectSkills(projectRoot, target = "codex") {
|
|
44
60
|
assertSupportedTarget(target);
|
|
45
61
|
const config = await loadConfig(projectRoot);
|
|
46
62
|
if (!config.features.skillRegistration.enabled) {
|
|
47
|
-
throw new Error("Skills
|
|
63
|
+
throw new Error("管理项目 Skills 功能已关闭,请先执行 `code-helper features enable skillRegistration`。");
|
|
48
64
|
}
|
|
49
65
|
const operations = [];
|
|
50
66
|
const templates = getSkillTemplates();
|
|
@@ -67,14 +83,14 @@ export async function registerProjectSkills(projectRoot, target = "codex") {
|
|
|
67
83
|
operations.push({
|
|
68
84
|
path: targetPath,
|
|
69
85
|
action: existing === undefined ? "created" : "updated",
|
|
70
|
-
message: `已注册 ${
|
|
86
|
+
message: `已注册 ${formatSkillRegistrationTargetName(target)} 项目级 skill`
|
|
71
87
|
});
|
|
72
88
|
}
|
|
73
89
|
return operations;
|
|
74
90
|
}
|
|
75
91
|
/**
|
|
76
92
|
* 取消注册 code-helper 项目级 skills。
|
|
77
|
-
*
|
|
93
|
+
* 只删除各目标目录下的 `code-helper-*` 受控目录,不触碰用户自己的 skills。
|
|
78
94
|
*/
|
|
79
95
|
export async function unregisterProjectSkills(projectRoot, target = "codex") {
|
|
80
96
|
assertSupportedTarget(target);
|
|
@@ -95,7 +111,7 @@ export async function unregisterProjectSkills(projectRoot, target = "codex") {
|
|
|
95
111
|
operations.push({
|
|
96
112
|
path: targetDirectory,
|
|
97
113
|
action: "updated",
|
|
98
|
-
message: `已取消注册 ${
|
|
114
|
+
message: `已取消注册 ${formatSkillRegistrationTargetName(target)} 项目级 skill`
|
|
99
115
|
});
|
|
100
116
|
}
|
|
101
117
|
const targetRoot = getProjectSkillsDirectory(target);
|
|
@@ -132,29 +148,115 @@ export function parseSkillRegistrationTargets(value) {
|
|
|
132
148
|
if (value === "claudecode" || value === "claude-code" || value === "claude") {
|
|
133
149
|
return ["claudecode"];
|
|
134
150
|
}
|
|
151
|
+
if (value === "githubcopilot" || value === "github-copilot" || value === "copilot" || value === "github") {
|
|
152
|
+
return ["githubcopilot"];
|
|
153
|
+
}
|
|
135
154
|
if (value === "all") {
|
|
136
155
|
return [...ALL_SKILL_REGISTRATION_TARGETS];
|
|
137
156
|
}
|
|
138
|
-
throw new Error(`不支持的 skills 注册目标:${value}。当前支持 codex、claudecode 或 all。`);
|
|
157
|
+
throw new Error(`不支持的 skills 注册目标:${value}。当前支持 codex、claudecode、githubcopilot 或 all。`);
|
|
139
158
|
}
|
|
140
159
|
/**
|
|
141
160
|
* 根据当前项目实际入口文件推断需要注册的 agent 工具。
|
|
142
|
-
* 根目录已有 AGENTS.md
|
|
161
|
+
* 根目录已有 AGENTS.md、CLAUDE.md 或 GitHub Copilot 入口时,以这些文件作为实际使用状态;完全没有入口文件时返回空数组,由调用方决定交互选择或保守跳过。
|
|
143
162
|
*/
|
|
144
163
|
export async function resolveSkillRegistrationTargets(projectRoot) {
|
|
145
164
|
const agentsExists = (await readTextIfExists(projectPath(projectRoot, "AGENTS.md"))) !== undefined;
|
|
146
165
|
const claudeExists = (await readTextIfExists(projectPath(projectRoot, "CLAUDE.md"))) !== undefined;
|
|
166
|
+
const copilotInstructionsExists = (await readTextIfExists(projectPath(projectRoot, ".github/copilot-instructions.md"))) !== undefined;
|
|
167
|
+
const copilotSkillsExists = (await directoryExists(projectPath(projectRoot, ".github/skills")));
|
|
147
168
|
const targets = [];
|
|
148
|
-
if (agentsExists
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
169
|
+
if (agentsExists) {
|
|
170
|
+
targets.push("codex");
|
|
171
|
+
}
|
|
172
|
+
if (claudeExists) {
|
|
173
|
+
targets.push("claudecode");
|
|
174
|
+
}
|
|
175
|
+
if (copilotInstructionsExists || copilotSkillsExists) {
|
|
176
|
+
targets.push("githubcopilot");
|
|
177
|
+
}
|
|
178
|
+
return targets;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* 检查当前项目 skills 的结构和质量。
|
|
182
|
+
* 该函数只做静态检查,不执行任何 skill 中的脚本或命令。
|
|
183
|
+
*/
|
|
184
|
+
export async function runSkillsDoctor(projectRoot) {
|
|
185
|
+
const issues = [];
|
|
186
|
+
for (const target of ALL_SKILL_REGISTRATION_TARGETS) {
|
|
187
|
+
issues.push(...(await checkCodeHelperRegistration(projectRoot, target)));
|
|
188
|
+
issues.push(...(await checkSkillDirectory(projectRoot, target)));
|
|
189
|
+
}
|
|
190
|
+
return issues;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* 根据当前项目状态给出 skills 管理建议。
|
|
194
|
+
* audit 只输出建议,避免在用户未确认时自动安装或注册更多内容。
|
|
195
|
+
*/
|
|
196
|
+
export async function runSkillsAudit(projectRoot) {
|
|
197
|
+
const recommendations = [];
|
|
198
|
+
const inferredTargets = await resolveSkillRegistrationTargets(projectRoot);
|
|
199
|
+
const allStatuses = (await Promise.all(ALL_SKILL_REGISTRATION_TARGETS.map((target) => listProjectSkillRegistrations(projectRoot, target)))).flat();
|
|
200
|
+
const registeredTargets = new Set(allStatuses.filter((status) => status.registered).map((status) => status.target));
|
|
201
|
+
const hasUserRules = await directoryExists(projectPath(projectRoot, "code-helper-docs/user-rules"));
|
|
202
|
+
const hasPlanDocs = await directoryExists(projectPath(projectRoot, "code-helper-docs/plan-doc"));
|
|
203
|
+
const hasArchiveDocs = await directoryExists(projectPath(projectRoot, "code-helper-docs/plan-doc/archive")) ||
|
|
204
|
+
await directoryExists(projectPath(projectRoot, "code-helper-docs/result-doc/archive")) ||
|
|
205
|
+
await directoryExists(projectPath(projectRoot, "code-helper-docs/status-doc/archive"));
|
|
206
|
+
for (const target of inferredTargets) {
|
|
207
|
+
if (!registeredTargets.has(target)) {
|
|
208
|
+
recommendations.push({
|
|
209
|
+
priority: "high",
|
|
210
|
+
code: "missing-inferred-registration",
|
|
211
|
+
message: `${formatSkillRegistrationTargetName(target)} 是当前项目已识别的 agent 工具,但尚未注册 code-helper skills。`,
|
|
212
|
+
suggestion: `运行 \`code-helper skills register ${target}\` 注册对应项目级 skills。`
|
|
213
|
+
});
|
|
154
214
|
}
|
|
155
|
-
return targets;
|
|
156
215
|
}
|
|
157
|
-
|
|
216
|
+
if (hasUserRules && !isSkillRegistered(allStatuses, "code-helper-memory-tuning")) {
|
|
217
|
+
recommendations.push({
|
|
218
|
+
priority: "high",
|
|
219
|
+
code: "missing-memory-skill",
|
|
220
|
+
message: "项目已经使用专题规则目录,但缺少项目记忆优化 skill 注册。",
|
|
221
|
+
suggestion: "运行 `code-helper skills register`,让 agent 能自动发现记忆维护规则。"
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
if (hasPlanDocs && !isSkillRegistered(allStatuses, "code-helper-plan-workbench")) {
|
|
225
|
+
recommendations.push({
|
|
226
|
+
priority: "medium",
|
|
227
|
+
code: "missing-plan-skill",
|
|
228
|
+
message: "项目已经使用计划文档目录,但缺少项目计划管理 skill 注册。",
|
|
229
|
+
suggestion: "运行 `code-helper skills register`,让大型需求拆分时自动读取计划管理规则。"
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
if (hasArchiveDocs && !isSkillRegistered(allStatuses, "code-helper-document-archive")) {
|
|
233
|
+
recommendations.push({
|
|
234
|
+
priority: "medium",
|
|
235
|
+
code: "missing-archive-skill",
|
|
236
|
+
message: "项目已经使用归档目录,但缺少文档归档 skill 注册。",
|
|
237
|
+
suggestion: "运行 `code-helper skills register`,让 agent 能识别 archive 中的已结束任务。"
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
const doctorIssues = await runSkillsDoctor(projectRoot);
|
|
241
|
+
const warningCount = doctorIssues.filter((issue) => issue.level === "warning").length;
|
|
242
|
+
const errorCount = doctorIssues.filter((issue) => issue.level === "error").length;
|
|
243
|
+
if (errorCount > 0 || warningCount > 0) {
|
|
244
|
+
recommendations.push({
|
|
245
|
+
priority: errorCount > 0 ? "high" : "low",
|
|
246
|
+
code: "doctor-has-findings",
|
|
247
|
+
message: `skills doctor 发现 ${errorCount} 个错误和 ${warningCount} 个提醒。`,
|
|
248
|
+
suggestion: "运行 `code-helper skills doctor` 查看具体路径和修复建议。"
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
if (recommendations.length === 0) {
|
|
252
|
+
recommendations.push({
|
|
253
|
+
priority: "low",
|
|
254
|
+
code: "skills-healthy",
|
|
255
|
+
message: "当前项目 skills 注册和基础结构没有发现明显缺口。",
|
|
256
|
+
suggestion: "后续引入新 agent 工具或新增长期规则后,再运行 `code-helper skills audit` 复查。"
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
return recommendations;
|
|
158
260
|
}
|
|
159
261
|
/**
|
|
160
262
|
* 返回项目级 SKILL.md 绝对路径。
|
|
@@ -167,21 +269,33 @@ function getSkillFilePath(projectRoot, target, directoryName) {
|
|
|
167
269
|
* 这个函数让公开 API 即使传入非字面量字符串也能得到明确错误。
|
|
168
270
|
*/
|
|
169
271
|
function assertSupportedTarget(target) {
|
|
170
|
-
if (target !== "codex" && target !== "claudecode") {
|
|
171
|
-
throw new Error(`不支持的 skills 注册目标:${target}。当前支持 codex 或
|
|
272
|
+
if (target !== "codex" && target !== "claudecode" && target !== "githubcopilot") {
|
|
273
|
+
throw new Error(`不支持的 skills 注册目标:${target}。当前支持 codex、claudecode 或 githubcopilot。`);
|
|
172
274
|
}
|
|
173
275
|
}
|
|
174
276
|
/**
|
|
175
277
|
* 返回不同 agent 工具的项目级 skills 目录。
|
|
176
278
|
*/
|
|
177
279
|
function getProjectSkillsDirectory(target) {
|
|
178
|
-
|
|
280
|
+
if (target === "codex") {
|
|
281
|
+
return CODEX_PROJECT_SKILLS_DIRECTORY;
|
|
282
|
+
}
|
|
283
|
+
if (target === "claudecode") {
|
|
284
|
+
return CLAUDE_CODE_PROJECT_SKILLS_DIRECTORY;
|
|
285
|
+
}
|
|
286
|
+
return GITHUB_COPILOT_PROJECT_SKILLS_DIRECTORY;
|
|
179
287
|
}
|
|
180
288
|
/**
|
|
181
289
|
* 返回面向用户展示的 agent 工具名称。
|
|
182
290
|
*/
|
|
183
|
-
function
|
|
184
|
-
|
|
291
|
+
export function formatSkillRegistrationTargetName(target) {
|
|
292
|
+
if (target === "codex") {
|
|
293
|
+
return "Codex";
|
|
294
|
+
}
|
|
295
|
+
if (target === "claudecode") {
|
|
296
|
+
return "Claude Code";
|
|
297
|
+
}
|
|
298
|
+
return "GitHub Copilot";
|
|
185
299
|
}
|
|
186
300
|
/**
|
|
187
301
|
* 删除空目录。
|
|
@@ -198,4 +312,169 @@ async function removeEmptyDirectory(path) {
|
|
|
198
312
|
// 目录不存在或不可删除时不处理,取消注册不应影响用户文件。
|
|
199
313
|
}
|
|
200
314
|
}
|
|
315
|
+
/**
|
|
316
|
+
* 检查 code-helper 管理的 skill 是否缺失或过期。
|
|
317
|
+
*/
|
|
318
|
+
async function checkCodeHelperRegistration(projectRoot, target) {
|
|
319
|
+
const issues = [];
|
|
320
|
+
const templates = getSkillTemplates();
|
|
321
|
+
for (const registration of CODE_HELPER_SKILL_REGISTRATIONS) {
|
|
322
|
+
const template = templates.find((item) => item.fileName === registration.templateFileName);
|
|
323
|
+
const skillPath = getSkillFilePath(projectRoot, target, registration.directoryName);
|
|
324
|
+
const existing = await readTextIfExists(skillPath);
|
|
325
|
+
if (existing === undefined) {
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
if (template !== undefined && existing !== template.content) {
|
|
329
|
+
issues.push({
|
|
330
|
+
level: "warning",
|
|
331
|
+
code: "outdated-code-helper-skill",
|
|
332
|
+
message: `${formatSkillRegistrationTargetName(target)} 中的 ${registration.directoryName} 与当前内置模板不一致。`,
|
|
333
|
+
path: skillPath,
|
|
334
|
+
suggestion: `运行 \`code-helper skills register ${target}\` 刷新 code-helper 管理的 skill。`
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return issues;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* 检查指定 agent skills 目录下的所有 SKILL.md。
|
|
342
|
+
*/
|
|
343
|
+
async function checkSkillDirectory(projectRoot, target) {
|
|
344
|
+
const issues = [];
|
|
345
|
+
const skillsRoot = projectPath(projectRoot, getProjectSkillsDirectory(target));
|
|
346
|
+
const entries = await readDirectoryIfExists(skillsRoot);
|
|
347
|
+
if (entries === undefined) {
|
|
348
|
+
return issues;
|
|
349
|
+
}
|
|
350
|
+
for (const entry of entries) {
|
|
351
|
+
const skillPath = join(skillsRoot, entry, "SKILL.md");
|
|
352
|
+
const content = await readSkillDocumentIfExists(skillPath);
|
|
353
|
+
if (content === undefined) {
|
|
354
|
+
issues.push({
|
|
355
|
+
level: "error",
|
|
356
|
+
code: "missing-skill-md",
|
|
357
|
+
message: `${formatSkillRegistrationTargetName(target)} skill 目录缺少 SKILL.md:${entry}`,
|
|
358
|
+
path: join(skillsRoot, entry),
|
|
359
|
+
suggestion: "补齐 SKILL.md,或删除空的 skill 目录。"
|
|
360
|
+
});
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
issues.push(...checkSkillDocument(target, entry, skillPath, content));
|
|
364
|
+
}
|
|
365
|
+
return issues;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* 检查单个 SKILL.md 的基本结构。
|
|
369
|
+
*/
|
|
370
|
+
function checkSkillDocument(target, directoryName, skillPath, content) {
|
|
371
|
+
const issues = [];
|
|
372
|
+
const frontmatter = parseSkillFrontmatter(content);
|
|
373
|
+
if (frontmatter === undefined) {
|
|
374
|
+
issues.push({
|
|
375
|
+
level: "error",
|
|
376
|
+
code: "missing-frontmatter",
|
|
377
|
+
message: `${formatSkillRegistrationTargetName(target)} skill 缺少 YAML frontmatter:${directoryName}`,
|
|
378
|
+
path: skillPath,
|
|
379
|
+
suggestion: "在文件开头补充包含 name 和 description 的 frontmatter。"
|
|
380
|
+
});
|
|
381
|
+
return issues;
|
|
382
|
+
}
|
|
383
|
+
if (frontmatter.name === undefined || frontmatter.name.trim() === "") {
|
|
384
|
+
issues.push({
|
|
385
|
+
level: "error",
|
|
386
|
+
code: "missing-skill-name",
|
|
387
|
+
message: `${formatSkillRegistrationTargetName(target)} skill 缺少 name:${directoryName}`,
|
|
388
|
+
path: skillPath,
|
|
389
|
+
suggestion: "在 frontmatter 中补充稳定的 name 字段。"
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
else if (frontmatter.name !== directoryName) {
|
|
393
|
+
issues.push({
|
|
394
|
+
level: "warning",
|
|
395
|
+
code: "skill-name-directory-mismatch",
|
|
396
|
+
message: `${formatSkillRegistrationTargetName(target)} skill 的 name 与目录名不一致:${directoryName}`,
|
|
397
|
+
path: skillPath,
|
|
398
|
+
suggestion: "优先保持目录名与 frontmatter name 一致,降低不同 agent 工具识别差异。"
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
if (frontmatter.description === undefined || frontmatter.description.trim().length < 20) {
|
|
402
|
+
issues.push({
|
|
403
|
+
level: "warning",
|
|
404
|
+
code: "weak-skill-description",
|
|
405
|
+
message: `${formatSkillRegistrationTargetName(target)} skill 的 description 过短或缺失:${directoryName}`,
|
|
406
|
+
path: skillPath,
|
|
407
|
+
suggestion: "补充包含触发场景、输入条件和输出目标的 description。"
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
if (!content.includes("## ")) {
|
|
411
|
+
issues.push({
|
|
412
|
+
level: "warning",
|
|
413
|
+
code: "missing-skill-sections",
|
|
414
|
+
message: `${formatSkillRegistrationTargetName(target)} skill 缺少二级标题结构:${directoryName}`,
|
|
415
|
+
path: skillPath,
|
|
416
|
+
suggestion: "至少补充目标、适用场景、流程或边界规则等小节,便于 agent 按需读取。"
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
return issues;
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* 解析 skill frontmatter 中的 name 和 description。
|
|
423
|
+
* 这里只做轻量解析,避免为了静态检查引入 YAML 依赖。
|
|
424
|
+
*/
|
|
425
|
+
function parseSkillFrontmatter(content) {
|
|
426
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---/u.exec(content);
|
|
427
|
+
if (match === null) {
|
|
428
|
+
return undefined;
|
|
429
|
+
}
|
|
430
|
+
const result = {};
|
|
431
|
+
for (const line of match[1].split(/\r?\n/u)) {
|
|
432
|
+
const field = /^(name|description):\s*(.*)$/u.exec(line);
|
|
433
|
+
if (field !== null) {
|
|
434
|
+
result[field[1]] = field[2].trim();
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return result;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* 判断某个 code-helper skill 是否已经至少在一个目标中注册。
|
|
441
|
+
*/
|
|
442
|
+
function isSkillRegistered(statuses, name) {
|
|
443
|
+
return statuses.some((status) => status.name === name && status.registered);
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* 安全判断目录是否存在。
|
|
447
|
+
*/
|
|
448
|
+
async function directoryExists(path) {
|
|
449
|
+
return (await readDirectoryIfExists(path)) !== undefined;
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* 安全读取目录;目录不存在或不是目录时返回 undefined。
|
|
453
|
+
*/
|
|
454
|
+
async function readDirectoryIfExists(path) {
|
|
455
|
+
try {
|
|
456
|
+
return await readdir(path);
|
|
457
|
+
}
|
|
458
|
+
catch (error) {
|
|
459
|
+
if (typeof error === "object" && error !== null && "code" in error && (error.code === "ENOENT" || error.code === "ENOTDIR")) {
|
|
460
|
+
return undefined;
|
|
461
|
+
}
|
|
462
|
+
throw error;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* 安全读取单个 SKILL.md。
|
|
467
|
+
* skills 根目录下混入普通文件时,`目录名/SKILL.md` 会触发 ENOTDIR,这里把它归为结构缺失问题。
|
|
468
|
+
*/
|
|
469
|
+
async function readSkillDocumentIfExists(path) {
|
|
470
|
+
try {
|
|
471
|
+
return await readTextIfExists(path);
|
|
472
|
+
}
|
|
473
|
+
catch (error) {
|
|
474
|
+
if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOTDIR") {
|
|
475
|
+
return undefined;
|
|
476
|
+
}
|
|
477
|
+
throw error;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
201
480
|
//# sourceMappingURL=skills.js.map
|
package/dist/skills.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/templates.d.ts
CHANGED
|
@@ -21,12 +21,13 @@ export declare function getSkillTemplates(): Array<{
|
|
|
21
21
|
content: string;
|
|
22
22
|
}>;
|
|
23
23
|
/**
|
|
24
|
-
* 返回可选
|
|
25
|
-
*
|
|
24
|
+
* 返回可选 hook 模板。
|
|
25
|
+
* Git hooks 和 Agent hooks 分别受不同功能开关控制,避免概念混用。
|
|
26
26
|
*/
|
|
27
27
|
export declare function getHookTemplates(): Array<{
|
|
28
28
|
fileName: string;
|
|
29
29
|
content: string;
|
|
30
|
+
feature: FeatureKey;
|
|
30
31
|
}>;
|
|
31
32
|
/**
|
|
32
33
|
* 判断功能是否启用。
|