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.
Files changed (52) hide show
  1. package/README.md +61 -18
  2. package/dist/config.d.ts +2 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +12 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/index.js +26 -14
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/logger.d.ts +36 -0
  9. package/dist/lib/logger.d.ts.map +1 -0
  10. package/dist/lib/logger.js +143 -0
  11. package/dist/lib/logger.js.map +1 -0
  12. package/dist/lib/protocol.d.ts +21 -0
  13. package/dist/lib/protocol.d.ts.map +1 -0
  14. package/dist/lib/protocol.js +30 -0
  15. package/dist/lib/protocol.js.map +1 -0
  16. package/dist/loader/index.d.ts +11 -0
  17. package/dist/loader/index.d.ts.map +1 -1
  18. package/dist/loader/index.js +27 -0
  19. package/dist/loader/index.js.map +1 -1
  20. package/dist/remote/github.d.ts +24 -0
  21. package/dist/remote/github.d.ts.map +1 -1
  22. package/dist/remote/github.js +91 -14
  23. package/dist/remote/github.js.map +1 -1
  24. package/dist/tools/diagnostics.d.ts +6 -0
  25. package/dist/tools/diagnostics.d.ts.map +1 -0
  26. package/dist/tools/diagnostics.js +115 -0
  27. package/dist/tools/diagnostics.js.map +1 -0
  28. package/dist/tools/list-categories.d.ts.map +1 -1
  29. package/dist/tools/list-categories.js +4 -3
  30. package/dist/tools/list-categories.js.map +1 -1
  31. package/dist/tools/list-skill-files.d.ts.map +1 -1
  32. package/dist/tools/list-skill-files.js +9 -5
  33. package/dist/tools/list-skill-files.js.map +1 -1
  34. package/dist/tools/load-skill-file.d.ts.map +1 -1
  35. package/dist/tools/load-skill-file.js +8 -4
  36. package/dist/tools/load-skill-file.js.map +1 -1
  37. package/dist/tools/plan-workflow.d.ts +2 -1
  38. package/dist/tools/plan-workflow.d.ts.map +1 -1
  39. package/dist/tools/plan-workflow.js +23 -16
  40. package/dist/tools/plan-workflow.js.map +1 -1
  41. package/dist/tools/read-skill.d.ts.map +1 -1
  42. package/dist/tools/read-skill.js +43 -7
  43. package/dist/tools/read-skill.js.map +1 -1
  44. package/dist/tools/search-skills.d.ts +2 -1
  45. package/dist/tools/search-skills.d.ts.map +1 -1
  46. package/dist/tools/search-skills.js +12 -8
  47. package/dist/tools/search-skills.js.map +1 -1
  48. package/dist/tools/skill-status.d.ts +5 -0
  49. package/dist/tools/skill-status.d.ts.map +1 -0
  50. package/dist/tools/skill-status.js +70 -0
  51. package/dist/tools/skill-status.js.map +1 -0
  52. 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 this to understand a large skill's structure before deciding which files to load.", {
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: ${err instanceof Error ? err.message : String(err)}`,
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":"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"}
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;AAEtD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,WAAW,GAClB,IAAI,CA4CN"}
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 within a skill's directory. Use this after read_skill when you need to access scripts, configs, README, or other resources referenced in the skill instructions.", {
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: ${err instanceof Error ? err.message : String(err)}`,
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;AAKxB,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,YAA+B,EAC/B,MAAmB;IAEnB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,4LAA4L,EAC5L;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;QAClC,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,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,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBAChF;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,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
- export declare function registerPlanWorkflow(server: McpServer, searchEngine: SkillSearchEngine): void;
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;AAE5D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,iBAAiB,GAC9B,IAAI,CA8DN"}
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
- export function registerPlanWorkflow(server, searchEngine) {
3
- server.tool("plan_workflow", "Given a task description, suggest relevant skills that could be combined to accomplish it. Returns a list of recommended skills — the actual orchestration and execution order should be decided by you (the Agent).", {
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 Suggestions for:\n> ${task_description}\n\n`;
26
- output += `Found ${results.length} potentially relevant skills:\n\n`;
27
- // Top recommendations (top 5 by rank, no hardcoded score threshold)
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 += "### 🎯 Top Recommendations\n";
31
- for (const s of topSkills) {
32
- output += `- **${s.name}** (score: ${s.score}) — ${s.description.substring(0, 150)}...\n`;
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;IAE/B,MAAM,CAAC,IAAI,CACT,eAAe,EACf,sNAAsN,EACtN;QACE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;KAC/G,EACD,KAAK,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;QAC7B,8CAA8C;QAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAErE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,6GAA6G;qBACpH;iBACF;aACF,CAAC;QACJ,CAAC;QAED,wCAAwC;QACxC,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,MAAM,GAAG,mCAAmC,gBAAgB,MAAM,CAAC;QACvE,MAAM,IAAI,SAAS,OAAO,CAAC,MAAM,mCAAmC,CAAC;QAErE,oEAAoE;QACpE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,8BAA8B,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;YAC5F,CAAC;YACD,MAAM,IAAI,IAAI,CAAC;QACjB,CAAC;QAED,kBAAkB;QAClB,MAAM,IAAI,sBAAsB,CAAC;QACjC,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC5C,MAAM,IAAI,OAAO,QAAQ,OAAO,CAAC;YACjC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,KAAK,KAAK,CAAC;YAClD,CAAC;QACH,CAAC;QAED,MAAM,IAAI,SAAS,CAAC;QACpB,MAAM;YACJ,0DAA0D;gBAC1D,mGAAmG,CAAC;QAEtG,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
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;AAEtD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,iBAAiB,EAC/B,MAAM,EAAE,WAAW,GAClB,IAAI,CA+GN"}
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"}
@@ -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", "Read a skill's full instructions (SKILL.md), file structure, and dependency info. Call this after search_skills to load a skill you want to use. The instructions contain the role and execution rules you should follow.", {
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\n## Sub-Skills\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
- "Use load_skill_file(skill_name, file_path) to read any file shown above.",
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}": ${err instanceof Error ? err.message : String(err)}`,
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":"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"}
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
- export declare function registerSearchSkills(server: McpServer, searchEngine: SkillSearchEngine): void;
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;AAE5D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,iBAAiB,GAC9B,IAAI,CAuDN"}
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
- export function registerSearchSkills(server, searchEngine) {
3
- server.tool("search_skills", "Search the codex-skills library by natural language query. Returns matching skills ranked by relevance. Use this as the primary entry point to discover skills for a task.", {
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 ? 'Explicitly' : 'Automatically'} refreshing manifest for query: "${query}"`);
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}** [${r.category}] (score: ${r.score})\n ${r.description.substring(0, 200)}${r.description.length > 200 ? "..." : ""}${hit}`;
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\nUse read_skill(name) to load a skill's full instructions.`,
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;IAE/B,MAAM,CAAC,IAAI,CACT,eAAe,EACf,4KAA4K,EAC5K;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8FAA8F,CAAC;QAC1H,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QACxF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,8CAA8C,CAAC;QAChG,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yIAAyI,CAAC;KAC1L,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE;QAClD,IAAI,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAE9D,iGAAiG;QACjG,IAAI,aAAa,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,IAAI,OAAO,YAAY,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;gBACvD,OAAO,CAAC,KAAK,CAAC,sBAAsB,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,oCAAoC,KAAK,GAAG,CAAC,CAAC;gBAChI,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAC;gBACvD,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,6BAA6B,KAAK,4EAA4E;qBACrH;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,OAAO;aACtB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACZ,MAAM,GAAG,GACP,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;gBAC1D,CAAC,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACzC,CAAC,CAAC,EAAE,CAAC;YACT,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,aAAa,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;QAC9J,CAAC,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,SAAS,OAAO,CAAC,MAAM,wBAAwB,SAAS,+DAA+D;iBAC9H;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-skills-mcp",
3
- "version": "1.3.2",
3
+ "version": "1.4.0",
4
4
  "description": "MCP Server for Codex-Skills - Intelligent skill library search, read and orchestration",
5
5
  "type": "module",
6
6
  "bin": {