codex-skills-mcp 1.3.2 → 1.4.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 +61 -18
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +26 -14
- package/dist/index.js.map +1 -1
- package/dist/lib/logger.d.ts +36 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +143 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/protocol.d.ts +21 -0
- package/dist/lib/protocol.d.ts.map +1 -0
- package/dist/lib/protocol.js +30 -0
- package/dist/lib/protocol.js.map +1 -0
- package/dist/loader/index.d.ts +11 -0
- package/dist/loader/index.d.ts.map +1 -1
- package/dist/loader/index.js +27 -0
- package/dist/loader/index.js.map +1 -1
- package/dist/remote/github.d.ts +24 -0
- package/dist/remote/github.d.ts.map +1 -1
- package/dist/remote/github.js +91 -14
- package/dist/remote/github.js.map +1 -1
- package/dist/tools/diagnostics.d.ts +6 -0
- package/dist/tools/diagnostics.d.ts.map +1 -0
- package/dist/tools/diagnostics.js +115 -0
- package/dist/tools/diagnostics.js.map +1 -0
- package/dist/tools/list-categories.d.ts.map +1 -1
- package/dist/tools/list-categories.js +4 -3
- package/dist/tools/list-categories.js.map +1 -1
- package/dist/tools/list-skill-files.d.ts.map +1 -1
- package/dist/tools/list-skill-files.js +9 -5
- package/dist/tools/list-skill-files.js.map +1 -1
- package/dist/tools/load-skill-file.d.ts.map +1 -1
- package/dist/tools/load-skill-file.js +8 -4
- package/dist/tools/load-skill-file.js.map +1 -1
- package/dist/tools/plan-workflow.d.ts +2 -1
- package/dist/tools/plan-workflow.d.ts.map +1 -1
- package/dist/tools/plan-workflow.js +23 -16
- package/dist/tools/plan-workflow.js.map +1 -1
- package/dist/tools/read-skill.d.ts.map +1 -1
- package/dist/tools/read-skill.js +43 -7
- package/dist/tools/read-skill.js.map +1 -1
- package/dist/tools/search-skills.d.ts +2 -1
- package/dist/tools/search-skills.d.ts.map +1 -1
- package/dist/tools/search-skills.js +12 -8
- package/dist/tools/search-skills.js.map +1 -1
- package/dist/tools/skill-status.d.ts +5 -0
- package/dist/tools/skill-status.d.ts.map +1 -0
- package/dist/tools/skill-status.js +70 -0
- package/dist/tools/skill-status.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { withToolLogging, logEvent } from "../lib/logger.js";
|
|
2
3
|
export function registerListSkillFiles(server, searchEngine, loader) {
|
|
3
|
-
server.tool("list_skill_files", "List the file tree of a skill or a subdirectory within it. Use
|
|
4
|
+
server.tool("list_skill_files", "List the file tree of a skill or a subdirectory within it (structure only, no content). Use it to understand a large skill's layout before deciding which files to read. Verify the local cache is complete with skill_status before executing a skill.", {
|
|
4
5
|
skill_name: z.string().describe("Skill name, e.g. 'KrillinAI'"),
|
|
5
6
|
path: z.string().optional().default("").describe("Subdirectory path within the skill (default: root)"),
|
|
6
7
|
max_depth: z.number().optional().default(2).describe("Directory scan depth (default: 2)"),
|
|
7
|
-
}, async ({ skill_name, path, max_depth }) => {
|
|
8
|
+
}, async ({ skill_name, path, max_depth }) => withToolLogging("list_skill_files", { skill: skill_name, path, max_depth }, async () => {
|
|
8
9
|
const entry = searchEngine.findByName(skill_name);
|
|
9
10
|
if (!entry) {
|
|
11
|
+
logEvent("warn", "tool_error", { tool: "list_skill_files", skill: skill_name, error: "skill not found" });
|
|
10
12
|
return {
|
|
11
13
|
content: [
|
|
12
14
|
{
|
|
@@ -23,22 +25,24 @@ export function registerListSkillFiles(server, searchEngine, loader) {
|
|
|
23
25
|
content: [
|
|
24
26
|
{
|
|
25
27
|
type: "text",
|
|
26
|
-
text: `## ${skill_name}${path ? "/" + path : ""} file tree\n\n\`\`\`\n${treeStr}\n\`\`\`\n\nUse load_skill_file(skill_name, file_path) to read any file.`,
|
|
28
|
+
text: `## ${skill_name}${path ? "/" + path : ""} file tree\n\n\`\`\`\n${treeStr}\n\`\`\`\n\nUse load_skill_file(skill_name, file_path) to read any file; use skill_status to verify cache completeness before executing.`,
|
|
27
29
|
},
|
|
28
30
|
],
|
|
29
31
|
};
|
|
30
32
|
}
|
|
31
33
|
catch (err) {
|
|
34
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
35
|
+
logEvent("warn", "tool_error", { tool: "list_skill_files", skill: skill_name, error: message });
|
|
32
36
|
return {
|
|
33
37
|
content: [
|
|
34
38
|
{
|
|
35
39
|
type: "text",
|
|
36
|
-
text: `Error: ${
|
|
40
|
+
text: `Error: ${message}`,
|
|
37
41
|
},
|
|
38
42
|
],
|
|
39
43
|
};
|
|
40
44
|
}
|
|
41
|
-
});
|
|
45
|
+
}));
|
|
42
46
|
}
|
|
43
47
|
function formatFileTree(nodes, indent) {
|
|
44
48
|
const lines = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-skill-files.js","sourceRoot":"","sources":["../../src/tools/list-skill-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"list-skill-files.js","sourceRoot":"","sources":["../../src/tools/list-skill-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-skill-file.d.ts","sourceRoot":"","sources":["../../src/tools/load-skill-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"load-skill-file.d.ts","sourceRoot":"","sources":["../../src/tools/load-skill-file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,WAAW,GAClB,IAAI,CAgDN"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { withToolLogging, logEvent } from "../lib/logger.js";
|
|
2
3
|
export function registerLoadSkillFile(server, searchEngine, loader) {
|
|
3
|
-
server.tool("load_skill_file", "Read a specific file from
|
|
4
|
+
server.tool("load_skill_file", "STEP 4 support. Read a specific file from an ALREADY materialized skill's directory (call read_skill first). Use it for scripts, configs, README or other resources referenced by the skill instructions. Reading files through this tool NEVER replaces executing the skill per its SKILL.md from its local_path.", {
|
|
4
5
|
skill_name: z.string().describe("Skill name, e.g. 'MediaCrawler'"),
|
|
5
6
|
file_path: z.string().describe("Relative path within the skill directory, e.g. 'README.md' or 'scripts/run.py'"),
|
|
6
|
-
}, async ({ skill_name, file_path }) => {
|
|
7
|
+
}, async ({ skill_name, file_path }) => withToolLogging("load_skill_file", { skill: skill_name, file: file_path }, async () => {
|
|
7
8
|
const entry = searchEngine.findByName(skill_name);
|
|
8
9
|
if (!entry) {
|
|
10
|
+
logEvent("warn", "tool_error", { tool: "load_skill_file", skill: skill_name, error: "skill not found" });
|
|
9
11
|
return {
|
|
10
12
|
content: [
|
|
11
13
|
{
|
|
@@ -27,15 +29,17 @@ export function registerLoadSkillFile(server, searchEngine, loader) {
|
|
|
27
29
|
};
|
|
28
30
|
}
|
|
29
31
|
catch (err) {
|
|
32
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
33
|
+
logEvent("warn", "tool_error", { tool: "load_skill_file", skill: skill_name, error: message });
|
|
30
34
|
return {
|
|
31
35
|
content: [
|
|
32
36
|
{
|
|
33
37
|
type: "text",
|
|
34
|
-
text: `Error loading file: ${
|
|
38
|
+
text: `Error loading file: ${message}`,
|
|
35
39
|
},
|
|
36
40
|
],
|
|
37
41
|
};
|
|
38
42
|
}
|
|
39
|
-
});
|
|
43
|
+
}));
|
|
40
44
|
}
|
|
41
45
|
//# sourceMappingURL=load-skill-file.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-skill-file.js","sourceRoot":"","sources":["../../src/tools/load-skill-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"load-skill-file.js","sourceRoot":"","sources":["../../src/tools/load-skill-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,YAA+B,EAC/B,MAAmB;IAEnB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,oTAAoT,EACpT;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAClE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gFAAgF,CAAC;KACjH,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,CAClC,eAAe,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACzG,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,UAAU,UAAU,cAAc;qBACzC;iBACF;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAE7E,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,MAAM,UAAU,MAAM,SAAS,KAAK,UAAU,cAAc,OAAO,EAAE;qBAC5E;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/F,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,uBAAuB,OAAO,EAAE;qBACvC;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CACL,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { SkillSearchEngine } from "../search/index.js";
|
|
3
|
-
|
|
3
|
+
import type { SkillLoader } from "../loader/index.js";
|
|
4
|
+
export declare function registerPlanWorkflow(server: McpServer, searchEngine: SkillSearchEngine, loader: SkillLoader): void;
|
|
4
5
|
//# sourceMappingURL=plan-workflow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/plan-workflow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"plan-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/plan-workflow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,WAAW,GAClB,IAAI,CAoEN"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { FOOTER_PLAN, CACHED_BADGE } from "../lib/protocol.js";
|
|
3
|
+
import { withToolLogging } from "../lib/logger.js";
|
|
4
|
+
export function registerPlanWorkflow(server, searchEngine, loader) {
|
|
5
|
+
server.tool("plan_workflow", "STEP 1 DISCOVER of the agent protocol. Given a task description, returns an ordered multi-skill execution plan draft (skills carry a [cached] badge when already on local disk — prefer them when scores are close). After planning you MUST call read_skill for EVERY skill in your final plan — each call downloads the complete skill — before starting work.", {
|
|
4
6
|
task_description: z.string().describe("Full description of the task to accomplish, e.g. '把技术博客文章转换成小红书图文并发布'"),
|
|
5
|
-
}, async ({ task_description }) => {
|
|
7
|
+
}, async ({ task_description }) => withToolLogging("plan_workflow", { task_description }, async () => {
|
|
6
8
|
// Use a broader search to find related skills
|
|
7
9
|
const results = searchEngine.search(task_description, { limit: 15 });
|
|
8
10
|
if (results.length === 0) {
|
|
@@ -10,11 +12,15 @@ export function registerPlanWorkflow(server, searchEngine) {
|
|
|
10
12
|
content: [
|
|
11
13
|
{
|
|
12
14
|
type: "text",
|
|
13
|
-
text: `No skills found for this task. Consider breaking it down into smaller sub-tasks and searching individually.`,
|
|
15
|
+
text: `No skills found for this task. Consider breaking it down into smaller sub-tasks and searching individually with search_skills. If you proceed without any skill, say so explicitly in your final answer.`,
|
|
14
16
|
},
|
|
15
17
|
],
|
|
16
18
|
};
|
|
17
19
|
}
|
|
20
|
+
const badge = (name) => {
|
|
21
|
+
const entry = searchEngine.findByName(name);
|
|
22
|
+
return entry && loader.isCached(entry) ? ` ${CACHED_BADGE}` : "";
|
|
23
|
+
};
|
|
18
24
|
// Group by category for better overview
|
|
19
25
|
const byCategory = new Map();
|
|
20
26
|
for (const r of results) {
|
|
@@ -22,15 +28,18 @@ export function registerPlanWorkflow(server, searchEngine) {
|
|
|
22
28
|
list.push(r);
|
|
23
29
|
byCategory.set(r.category, list);
|
|
24
30
|
}
|
|
25
|
-
let output = `## Workflow
|
|
26
|
-
output += `Found ${results.length} potentially relevant skills
|
|
27
|
-
//
|
|
31
|
+
let output = `## Workflow Plan for:\n> ${task_description}\n\n`;
|
|
32
|
+
output += `Found ${results.length} potentially relevant skills.\n\n`;
|
|
33
|
+
// Suggested ordered plan draft (top 5) — the agent adjusts as needed
|
|
28
34
|
const topSkills = results.slice(0, 5);
|
|
29
35
|
if (topSkills.length > 0) {
|
|
30
|
-
output += "###
|
|
31
|
-
|
|
32
|
-
output +=
|
|
33
|
-
|
|
36
|
+
output += "### 🧭 Suggested plan draft (adjust to your task, keep the set minimal)\n";
|
|
37
|
+
topSkills.forEach((s, i) => {
|
|
38
|
+
output += `${i + 1}. **${s.name}**${badge(s.name)} — ${s.description.substring(0, 140)}...`;
|
|
39
|
+
if (i < topSkills.length - 1)
|
|
40
|
+
output += ` -> `;
|
|
41
|
+
output += "\n";
|
|
42
|
+
});
|
|
34
43
|
output += "\n";
|
|
35
44
|
}
|
|
36
45
|
// All by category
|
|
@@ -38,16 +47,14 @@ export function registerPlanWorkflow(server, searchEngine) {
|
|
|
38
47
|
for (const [category, skills] of byCategory) {
|
|
39
48
|
output += `\n**${category}**:\n`;
|
|
40
49
|
for (const s of skills) {
|
|
41
|
-
output += ` - ${s.name} (score: ${s.score})\n`;
|
|
50
|
+
output += ` - ${s.name}${badge(s.name)} (score: ${s.score})\n`;
|
|
42
51
|
}
|
|
43
52
|
}
|
|
44
53
|
output += "\n---\n";
|
|
45
|
-
output +=
|
|
46
|
-
"Use read_skill(name) to load each skill's instructions. " +
|
|
47
|
-
"You should determine the execution order and how to chain the skills based on your task analysis.";
|
|
54
|
+
output += FOOTER_PLAN;
|
|
48
55
|
return {
|
|
49
56
|
content: [{ type: "text", text: output }],
|
|
50
57
|
};
|
|
51
|
-
});
|
|
58
|
+
}));
|
|
52
59
|
}
|
|
53
60
|
//# sourceMappingURL=plan-workflow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-workflow.js","sourceRoot":"","sources":["../../src/tools/plan-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,YAA+B
|
|
1
|
+
{"version":3,"file":"plan-workflow.js","sourceRoot":"","sources":["../../src/tools/plan-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-skill.d.ts","sourceRoot":"","sources":["../../src/tools/read-skill.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"read-skill.d.ts","sourceRoot":"","sources":["../../src/tools/read-skill.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,WAAW,GAClB,IAAI,CA4IN"}
|
package/dist/tools/read-skill.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { FOOTER_READ } from "../lib/protocol.js";
|
|
3
|
+
import { withToolLogging, logEvent } from "../lib/logger.js";
|
|
2
4
|
export function registerReadSkill(server, searchEngine, loader) {
|
|
3
|
-
server.tool("read_skill", "
|
|
4
|
-
name: z.string().describe("Exact skill name from search results, e.g. 'MediaCrawler'"),
|
|
5
|
-
}, async ({ name }, extra) => {
|
|
5
|
+
server.tool("read_skill", "STEP 3 MATERIALIZE — MANDATORY before executing any skill, once for EVERY skill you plan to use. Downloads the COMPLETE skill directory (SKILL.md + scripts + configs + references) into the local cache (instant when already cached) and returns the instructions, file structure, dependencies, and local_path — the on-disk path to execute the skill from. After this call you MUST execute the task strictly per the returned instructions; do NOT do the task from general knowledge after reading.", {
|
|
6
|
+
name: z.string().describe("Exact skill name from search/plan results, e.g. 'MediaCrawler'"),
|
|
7
|
+
}, async ({ name }, extra) => withToolLogging("read_skill", { skill: name }, async () => {
|
|
6
8
|
const entry = searchEngine.findByName(name);
|
|
7
9
|
if (!entry) {
|
|
10
|
+
logEvent("warn", "tool_error", { tool: "read_skill", skill: name, error: "skill not found" });
|
|
8
11
|
return {
|
|
9
12
|
content: [
|
|
10
13
|
{
|
|
@@ -31,13 +34,15 @@ export function registerReadSkill(server, searchEngine, loader) {
|
|
|
31
34
|
if (typeof searchEngine.recordUsage === "function") {
|
|
32
35
|
searchEngine.recordUsage(entry.name);
|
|
33
36
|
}
|
|
37
|
+
// Deep cache check right after materialization (read-only, fast)
|
|
38
|
+
const cache = loader.cacheState(entry);
|
|
34
39
|
// Format structure as a compact tree
|
|
35
40
|
const structureStr = formatTree(result.structure.files, "");
|
|
36
41
|
// Format sub-skills if any
|
|
37
42
|
let subSkillsStr = "";
|
|
38
43
|
if (result.structure.sub_skills.length > 0) {
|
|
39
44
|
subSkillsStr =
|
|
40
|
-
"\n
|
|
45
|
+
"\n## Sub-Skills\n" +
|
|
41
46
|
result.structure.sub_skills
|
|
42
47
|
.map((s) => `- **${s.name}** (${s.path}): ${s.description}`)
|
|
43
48
|
.join("\n");
|
|
@@ -56,6 +61,25 @@ export function registerReadSkill(server, searchEngine, loader) {
|
|
|
56
61
|
]
|
|
57
62
|
.filter(Boolean)
|
|
58
63
|
.join(" | ");
|
|
64
|
+
// Cache & Execution section: makes "it is on disk, execute from here" visible
|
|
65
|
+
const statusLine = cache.complete
|
|
66
|
+
? `✅ complete — ${cache.filesTotal} files (${formatBytes(cache.sizeBytes)})${cache.completedAt ? `, downloaded ${cache.completedAt}` : ""}`
|
|
67
|
+
: cache.cached
|
|
68
|
+
? `⚠️ INCOMPLETE — ${cache.filesMissing.length} of ${cache.filesTotal} files missing. Re-call read_skill("${entry.name}") to resume the download.`
|
|
69
|
+
: `⚠️ not cached — re-call read_skill("${entry.name}") to download.`;
|
|
70
|
+
const cacheSection = [
|
|
71
|
+
"## Cache & Execution",
|
|
72
|
+
`
|
|
73
|
+
- Status: ${statusLine}`,
|
|
74
|
+
`
|
|
75
|
+
- **local_path**: \`${cache.localPath}\``,
|
|
76
|
+
result.dependencies.setup_command
|
|
77
|
+
? `\n- Setup before first run: \`${result.dependencies.setup_command}\``
|
|
78
|
+
: "",
|
|
79
|
+
"\n- The complete skill now lives on local disk. Run its scripts from local_path and follow the Instructions above exactly.",
|
|
80
|
+
]
|
|
81
|
+
.filter(Boolean)
|
|
82
|
+
.join("");
|
|
59
83
|
return {
|
|
60
84
|
content: [
|
|
61
85
|
{
|
|
@@ -73,10 +97,11 @@ export function registerReadSkill(server, searchEngine, loader) {
|
|
|
73
97
|
"```",
|
|
74
98
|
structureStr,
|
|
75
99
|
"```",
|
|
100
|
+
cacheSection,
|
|
76
101
|
subSkillsStr,
|
|
77
102
|
"",
|
|
78
103
|
"---",
|
|
79
|
-
|
|
104
|
+
FOOTER_READ,
|
|
80
105
|
].join("\n"),
|
|
81
106
|
},
|
|
82
107
|
],
|
|
@@ -87,16 +112,27 @@ export function registerReadSkill(server, searchEngine, loader) {
|
|
|
87
112
|
if (typeof searchEngine.recordFailure === "function") {
|
|
88
113
|
searchEngine.recordFailure(entry.name);
|
|
89
114
|
}
|
|
115
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
116
|
+
logEvent("error", "tool_error", { tool: "read_skill", skill: entry.name, error: message });
|
|
90
117
|
return {
|
|
91
118
|
content: [
|
|
92
119
|
{
|
|
93
120
|
type: "text",
|
|
94
|
-
text: `Error reading skill "${name}": ${
|
|
121
|
+
text: `Error reading skill "${name}": ${message}\n\nIf this is a network failure, retry read_skill — the download resumes from where it stopped. Use diagnostics to inspect recent errors.`,
|
|
95
122
|
},
|
|
96
123
|
],
|
|
97
124
|
};
|
|
98
125
|
}
|
|
99
|
-
});
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
function formatBytes(bytes) {
|
|
129
|
+
if (!bytes || bytes <= 0)
|
|
130
|
+
return "0B";
|
|
131
|
+
if (bytes > 1024 * 1024)
|
|
132
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
133
|
+
if (bytes > 1024)
|
|
134
|
+
return `${Math.round(bytes / 1024)}KB`;
|
|
135
|
+
return `${bytes}B`;
|
|
100
136
|
}
|
|
101
137
|
function formatTree(nodes, indent) {
|
|
102
138
|
const lines = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-skill.js","sourceRoot":"","sources":["../../src/tools/read-skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"read-skill.js","sourceRoot":"","sources":["../../src/tools/read-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type { SkillSearchEngine } from "../search/index.js";
|
|
3
|
-
|
|
3
|
+
import type { SkillLoader } from "../loader/index.js";
|
|
4
|
+
export declare function registerSearchSkills(server: McpServer, searchEngine: SkillSearchEngine, loader: SkillLoader): void;
|
|
4
5
|
//# sourceMappingURL=search-skills.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-skills.d.ts","sourceRoot":"","sources":["../../src/tools/search-skills.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-skills.d.ts","sourceRoot":"","sources":["../../src/tools/search-skills.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,WAAW,GAClB,IAAI,CA0DN"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { FOOTER_SEARCH, CACHED_BADGE } from "../lib/protocol.js";
|
|
3
|
+
import { withToolLogging } from "../lib/logger.js";
|
|
4
|
+
export function registerSearchSkills(server, searchEngine, loader) {
|
|
5
|
+
server.tool("search_skills", "STEP 1 DISCOVER of the agent protocol. Search the codex-skills library by natural language query; results are ranked and carry a [cached] badge when the skill is already fully downloaded on local disk — prefer cached skills when scores are close. After selecting skills you MUST materialize each one with read_skill (downloads the COMPLETE skill) before starting the task.", {
|
|
4
6
|
query: z.string().describe("Natural language description of what you need, e.g. '前端性能优化' or 'video subtitle translation'"),
|
|
5
7
|
category: z.string().optional().describe("Optional category filter, e.g. '05_多媒体与设计资产'"),
|
|
6
8
|
limit: z.number().optional().default(8).describe("Max number of results to return (default: 8)"),
|
|
7
9
|
force_refresh: z.boolean().optional().describe("If true, forcefully refreshes the remote skills list cache. Use this when the user just integrated a new skill and it's not showing up."),
|
|
8
|
-
}, async ({ query, category, limit, force_refresh }) => {
|
|
10
|
+
}, async ({ query, category, limit, force_refresh }) => withToolLogging("search_skills", { query, category, limit, force_refresh }, async () => {
|
|
9
11
|
let results = searchEngine.search(query, { category, limit });
|
|
10
12
|
// Auto-refresh if explicitly requested or if no results are found (might be a newly added skill)
|
|
11
13
|
if (force_refresh || results.length === 0) {
|
|
12
14
|
if (typeof searchEngine.refreshManifest === "function") {
|
|
13
|
-
console.error(`[codex-skills-mcp] ${force_refresh ?
|
|
15
|
+
console.error(`[codex-skills-mcp] ${force_refresh ? "Explicitly" : "Automatically"} refreshing manifest for query: "${query}"`);
|
|
14
16
|
const refreshed = await searchEngine.refreshManifest();
|
|
15
17
|
if (refreshed) {
|
|
16
18
|
results = searchEngine.search(query, { category, limit });
|
|
@@ -22,27 +24,29 @@ export function registerSearchSkills(server, searchEngine) {
|
|
|
22
24
|
content: [
|
|
23
25
|
{
|
|
24
26
|
type: "text",
|
|
25
|
-
text: `No skills found matching "${query}". Try broader keywords or use list_categories to browse available skills.`,
|
|
27
|
+
text: `No skills found matching "${query}". Try broader keywords or use list_categories to browse available skills. If you proceed without a skill, say so explicitly in your final answer.`,
|
|
26
28
|
},
|
|
27
29
|
],
|
|
28
30
|
};
|
|
29
31
|
}
|
|
30
32
|
const formatted = results
|
|
31
33
|
.map((r, i) => {
|
|
34
|
+
const entry = searchEngine.findByName(r.name);
|
|
35
|
+
const badge = entry && loader.isCached(entry) ? ` ${CACHED_BADGE}` : "";
|
|
32
36
|
const hit = Array.isArray(r.matched_terms) && r.matched_terms.length > 0
|
|
33
37
|
? `\n 命中: ${r.matched_terms.join("、")}`
|
|
34
38
|
: "";
|
|
35
|
-
return `${i + 1}. **${r.name}
|
|
39
|
+
return `${i + 1}. **${r.name}**${badge} [${r.category}] (score: ${r.score})\n ${r.description.substring(0, 200)}${r.description.length > 200 ? "..." : ""}${hit}`;
|
|
36
40
|
})
|
|
37
41
|
.join("\n\n");
|
|
38
42
|
return {
|
|
39
43
|
content: [
|
|
40
44
|
{
|
|
41
45
|
type: "text",
|
|
42
|
-
text: `Found ${results.length} matching skills:\n\n${formatted}\n\
|
|
46
|
+
text: `Found ${results.length} matching skills:\n\n${formatted}\n\n${FOOTER_SEARCH}`,
|
|
43
47
|
},
|
|
44
48
|
],
|
|
45
49
|
};
|
|
46
|
-
});
|
|
50
|
+
}));
|
|
47
51
|
}
|
|
48
52
|
//# sourceMappingURL=search-skills.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-skills.js","sourceRoot":"","sources":["../../src/tools/search-skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,YAA+B
|
|
1
|
+
{"version":3,"file":"search-skills.js","sourceRoot":"","sources":["../../src/tools/search-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { SkillSearchEngine } from "../search/index.js";
|
|
3
|
+
import type { SkillLoader } from "../loader/index.js";
|
|
4
|
+
export declare function registerSkillStatus(server: McpServer, searchEngine: SkillSearchEngine, loader: SkillLoader): void;
|
|
5
|
+
//# sourceMappingURL=skill-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-status.d.ts","sourceRoot":"","sources":["../../src/tools/skill-status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAatD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,WAAW,GAClB,IAAI,CAoEN"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { FOOTER_STATUS } from "../lib/protocol.js";
|
|
3
|
+
import { withToolLogging } from "../lib/logger.js";
|
|
4
|
+
const MAX_NAMES = 20;
|
|
5
|
+
function formatBytes(bytes) {
|
|
6
|
+
if (!bytes || bytes <= 0)
|
|
7
|
+
return "0B";
|
|
8
|
+
if (bytes > 1024 * 1024)
|
|
9
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
10
|
+
if (bytes > 1024)
|
|
11
|
+
return `${Math.round(bytes / 1024)}KB`;
|
|
12
|
+
return `${bytes}B`;
|
|
13
|
+
}
|
|
14
|
+
export function registerSkillStatus(server, searchEngine, loader) {
|
|
15
|
+
server.tool("skill_status", "STEP 5 VERIFY. Check the local cache state of one or more skills (deep check: every recorded file is present with the expected size; read-only, never downloads). Returns cached/complete flags, local_path, file counts, size, missing files and completion time per skill. Use it before executing to confirm materialization, or to diagnose incomplete/interrupted downloads.", {
|
|
16
|
+
names: z.string().describe("Comma-separated exact skill names, e.g. 'KrillinAI, videocut-skills' (max 20)"),
|
|
17
|
+
}, async ({ names }) => withToolLogging("skill_status", { names }, async () => {
|
|
18
|
+
const requested = names
|
|
19
|
+
.split(",")
|
|
20
|
+
.map((n) => n.trim())
|
|
21
|
+
.filter(Boolean);
|
|
22
|
+
const unique = Array.from(new Set(requested)).slice(0, MAX_NAMES);
|
|
23
|
+
const truncated = Array.from(new Set(requested)).length > MAX_NAMES;
|
|
24
|
+
if (unique.length === 0) {
|
|
25
|
+
return {
|
|
26
|
+
content: [
|
|
27
|
+
{
|
|
28
|
+
type: "text",
|
|
29
|
+
text: "No skill names provided. Pass names like 'KrillinAI, videocut-skills'.",
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const lines = [];
|
|
35
|
+
let completeCount = 0;
|
|
36
|
+
for (const name of unique) {
|
|
37
|
+
const entry = searchEngine.findByName(name);
|
|
38
|
+
if (!entry) {
|
|
39
|
+
lines.push(`### ❌ ${name}\n- Not found in the library. Use search_skills to find the exact name.`);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const cache = loader.cacheState(entry);
|
|
43
|
+
if (cache.complete)
|
|
44
|
+
completeCount += 1;
|
|
45
|
+
const status = cache.complete
|
|
46
|
+
? `✅ complete — ${cache.filesTotal} files (${formatBytes(cache.sizeBytes)})`
|
|
47
|
+
: cache.cached
|
|
48
|
+
? `⚠️ INCOMPLETE — missing ${cache.filesMissing.length}/${cache.filesTotal} files: ${cache.filesMissing.slice(0, 5).join(", ")}${cache.filesMissing.length > 5 ? ", …" : ""}`
|
|
49
|
+
: "⬜ not downloaded yet — call read_skill to materialize it";
|
|
50
|
+
lines.push([
|
|
51
|
+
`### ${cache.complete ? "✅" : cache.cached ? "⚠️" : "⬜"} ${entry.name}`,
|
|
52
|
+
`- Status: ${status}`,
|
|
53
|
+
`- local_path: \`${cache.localPath}\``,
|
|
54
|
+
cache.completedAt ? `- Downloaded at: ${cache.completedAt}` : "",
|
|
55
|
+
]
|
|
56
|
+
.filter(Boolean)
|
|
57
|
+
.join("\n"));
|
|
58
|
+
}
|
|
59
|
+
const header = `Skill cache status: ${completeCount}/${unique.length} complete${truncated ? ` (list truncated to ${MAX_NAMES})` : ""}`;
|
|
60
|
+
return {
|
|
61
|
+
content: [
|
|
62
|
+
{
|
|
63
|
+
type: "text",
|
|
64
|
+
text: [header, "", lines.join("\n\n"), "", FOOTER_STATUS].join("\n"),
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
};
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=skill-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-status.js","sourceRoot":"","sources":["../../src/tools/skill-status.ts"],"names":[],"mappings":"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"}
|