oh-my-claude-sisyphus 3.8.13 → 3.8.14

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 (41) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/commands/omc-setup.md +45 -9
  3. package/dist/__tests__/mnemosyne/finder.test.js +44 -0
  4. package/dist/__tests__/mnemosyne/finder.test.js.map +1 -1
  5. package/dist/__tests__/omc-tools-server.test.js +15 -6
  6. package/dist/__tests__/omc-tools-server.test.js.map +1 -1
  7. package/dist/__tests__/tools/skills-tools.test.d.ts +2 -0
  8. package/dist/__tests__/tools/skills-tools.test.d.ts.map +1 -0
  9. package/dist/__tests__/tools/skills-tools.test.js +63 -0
  10. package/dist/__tests__/tools/skills-tools.test.js.map +1 -0
  11. package/dist/hooks/learner/bridge.d.ts +7 -2
  12. package/dist/hooks/learner/bridge.d.ts.map +1 -1
  13. package/dist/hooks/learner/bridge.js +59 -30
  14. package/dist/hooks/learner/bridge.js.map +1 -1
  15. package/dist/hooks/learner/constants.d.ts +3 -1
  16. package/dist/hooks/learner/constants.d.ts.map +1 -1
  17. package/dist/hooks/learner/constants.js +3 -1
  18. package/dist/hooks/learner/constants.js.map +1 -1
  19. package/dist/hooks/learner/finder.d.ts +4 -2
  20. package/dist/hooks/learner/finder.d.ts.map +1 -1
  21. package/dist/hooks/learner/finder.js +58 -23
  22. package/dist/hooks/learner/finder.js.map +1 -1
  23. package/dist/hooks/learner/loader.d.ts.map +1 -1
  24. package/dist/hooks/learner/loader.js +3 -4
  25. package/dist/hooks/learner/loader.js.map +1 -1
  26. package/dist/hooks/learner/types.d.ts +3 -1
  27. package/dist/hooks/learner/types.d.ts.map +1 -1
  28. package/dist/hooks/skill-bridge.cjs +50 -27
  29. package/dist/hud/usage-api.d.ts.map +1 -1
  30. package/dist/hud/usage-api.js +148 -3
  31. package/dist/hud/usage-api.js.map +1 -1
  32. package/dist/mcp/omc-tools-server.d.ts +2 -1
  33. package/dist/mcp/omc-tools-server.d.ts.map +1 -1
  34. package/dist/mcp/omc-tools-server.js +7 -3
  35. package/dist/mcp/omc-tools-server.js.map +1 -1
  36. package/dist/tools/skills-tools.d.ts +75 -0
  37. package/dist/tools/skills-tools.d.ts.map +1 -0
  38. package/dist/tools/skills-tools.js +151 -0
  39. package/dist/tools/skills-tools.js.map +1 -0
  40. package/package.json +1 -1
  41. package/scripts/skill-injector.mjs +21 -17
@@ -1,18 +1,20 @@
1
1
  /**
2
2
  * OMC Tools Server - In-process MCP server for custom tools
3
3
  *
4
- * Exposes 15 custom tools (12 LSP, 2 AST, 1 python_repl) via the Claude Agent SDK's
4
+ * Exposes 18 custom tools (12 LSP, 2 AST, 1 python_repl, 3 skills) via the Claude Agent SDK's
5
5
  * createSdkMcpServer helper for use by subagents.
6
6
  */
7
7
  import { createSdkMcpServer, tool } from "@anthropic-ai/claude-agent-sdk";
8
8
  import { lspTools } from "../tools/lsp-tools.js";
9
9
  import { astTools } from "../tools/ast-tools.js";
10
10
  import { pythonReplTool } from "../tools/python-repl/index.js";
11
+ import { skillsTools } from "../tools/skills-tools.js";
11
12
  // Aggregate all custom tools
12
13
  const allTools = [
13
14
  ...lspTools,
14
15
  ...astTools,
15
- pythonReplTool
16
+ pythonReplTool,
17
+ ...skillsTools
16
18
  ];
17
19
  // Convert to SDK tool format
18
20
  // The SDK's tool() expects a ZodRawShape directly (not wrapped in z.object())
@@ -35,7 +37,7 @@ export const omcToolNames = allTools.map(t => `mcp__omc-tools__${t.name}`);
35
37
  * Get tool names filtered by category
36
38
  */
37
39
  export function getOmcToolNames(options) {
38
- const { includeLsp = true, includeAst = true, includePython = true } = options || {};
40
+ const { includeLsp = true, includeAst = true, includePython = true, includeSkills = true } = options || {};
39
41
  return omcToolNames.filter(name => {
40
42
  if (!includeLsp && name.includes('lsp_'))
41
43
  return false;
@@ -43,6 +45,8 @@ export function getOmcToolNames(options) {
43
45
  return false;
44
46
  if (!includePython && name.includes('python_repl'))
45
47
  return false;
48
+ if (!includeSkills && (name.includes('load_omc_skills') || name.includes('list_omc_skills')))
49
+ return false;
46
50
  return true;
47
51
  });
48
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"omc-tools-server.js","sourceRoot":"","sources":["../../src/mcp/omc-tools-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAU/D,6BAA6B;AAC7B,MAAM,QAAQ,GAAc;IAC1B,GAAI,QAAiC;IACrC,GAAI,QAAiC;IACrC,cAAoC;CACrC,CAAC;AAEF,6BAA6B;AAC7B,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAChC,IAAI,CACF,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,MAAoC,EACtC,KAAK,EAAE,IAAa,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAC/C,CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC;IAC/C,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,QAAQ;CAChB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAE3E;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAI/B;IACC,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAErF,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAChC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAAE,OAAO,KAAK,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"omc-tools-server.js","sourceRoot":"","sources":["../../src/mcp/omc-tools-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAUvD,6BAA6B;AAC7B,MAAM,QAAQ,GAAc;IAC1B,GAAI,QAAiC;IACrC,GAAI,QAAiC;IACrC,cAAoC;IACpC,GAAI,WAAoC;CACzC,CAAC;AAEF,6BAA6B;AAC7B,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAChC,IAAI,CACF,CAAC,CAAC,IAAI,EACN,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,MAAoC,EACtC,KAAK,EAAE,IAAa,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAC/C,CACF,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC;IAC/C,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,QAAQ;CAChB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAE3E;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAK/B;IACC,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAE3G,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAChC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAAE,OAAO,KAAK,CAAC;QACjE,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3G,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Skills Tools
3
+ *
4
+ * MCP tools for loading and listing OMC learned skills
5
+ * from local (.omc/skills/) and global (~/.omc/skills/) directories.
6
+ */
7
+ import { z } from 'zod';
8
+ export declare const loadLocalTool: {
9
+ name: string;
10
+ description: string;
11
+ schema: {
12
+ projectRoot: z.ZodOptional<z.ZodString>;
13
+ };
14
+ handler: (args: {
15
+ projectRoot?: string;
16
+ }) => Promise<{
17
+ content: {
18
+ type: "text";
19
+ text: string;
20
+ }[];
21
+ }>;
22
+ };
23
+ export declare const loadGlobalTool: {
24
+ name: string;
25
+ description: string;
26
+ schema: {};
27
+ handler: (_args: Record<string, never>) => Promise<{
28
+ content: {
29
+ type: "text";
30
+ text: string;
31
+ }[];
32
+ }>;
33
+ };
34
+ export declare const listSkillsTool: {
35
+ name: string;
36
+ description: string;
37
+ schema: {
38
+ projectRoot: z.ZodOptional<z.ZodString>;
39
+ };
40
+ handler: (args: {
41
+ projectRoot?: string;
42
+ }) => Promise<{
43
+ content: {
44
+ type: "text";
45
+ text: string;
46
+ }[];
47
+ }>;
48
+ };
49
+ /** All skills tools for registration in omc-tools-server */
50
+ export declare const skillsTools: ({
51
+ name: string;
52
+ description: string;
53
+ schema: {
54
+ projectRoot: z.ZodOptional<z.ZodString>;
55
+ };
56
+ handler: (args: {
57
+ projectRoot?: string;
58
+ }) => Promise<{
59
+ content: {
60
+ type: "text";
61
+ text: string;
62
+ }[];
63
+ }>;
64
+ } | {
65
+ name: string;
66
+ description: string;
67
+ schema: {};
68
+ handler: (_args: Record<string, never>) => Promise<{
69
+ content: {
70
+ type: "text";
71
+ text: string;
72
+ }[];
73
+ }>;
74
+ })[];
75
+ //# sourceMappingURL=skills-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-tools.d.ts","sourceRoot":"","sources":["../../src/tools/skills-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA+FxB,eAAO,MAAM,aAAa;;;;;;oBAIF;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;CAY/C,CAAC;AAGF,eAAO,MAAM,cAAc;;;;qBAIF,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;;;;;;CAW7C,CAAC;AAGF,eAAO,MAAM,cAAc;;;;;;oBAIH;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;CA2B/C,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,WAAW;;;;;;oBAnEA;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;qBAmBvB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;;;;;;IAgD4B,CAAC"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Skills Tools
3
+ *
4
+ * MCP tools for loading and listing OMC learned skills
5
+ * from local (.omc/skills/) and global (~/.omc/skills/) directories.
6
+ */
7
+ import { z } from 'zod';
8
+ import { resolve, normalize, sep } from 'path';
9
+ import { homedir } from 'os';
10
+ import { loadAllSkills } from '../hooks/learner/loader.js';
11
+ import { MAX_SKILL_CONTENT_LENGTH } from '../hooks/learner/constants.js';
12
+ /** Allowed boundary directories for projectRoot validation */
13
+ const ALLOWED_BOUNDARIES = [process.cwd(), homedir()];
14
+ /** Role boundary tags that could be used for prompt injection */
15
+ const ROLE_BOUNDARY_PATTERN = /^<\s*\/?\s*(system|human|assistant|user|tool_use|tool_result)\b[^>]*>/i;
16
+ /**
17
+ * Validate projectRoot is within allowed directories.
18
+ * Prevents path traversal attacks.
19
+ */
20
+ function validateProjectRoot(input) {
21
+ const normalized = normalize(resolve(input));
22
+ // Reject path traversal sequences in raw input
23
+ if (input.includes('..')) {
24
+ throw new Error('Invalid project root: path traversal not allowed');
25
+ }
26
+ // Positive boundary validation: resolved path must be under cwd or HOME
27
+ const isWithinAllowed = ALLOWED_BOUNDARIES.some(boundary => {
28
+ const normalizedBoundary = normalize(boundary);
29
+ return normalized === normalizedBoundary ||
30
+ normalized.startsWith(normalizedBoundary + sep);
31
+ });
32
+ if (!isWithinAllowed) {
33
+ throw new Error('Invalid project root: path is outside allowed directories');
34
+ }
35
+ return normalized;
36
+ }
37
+ /**
38
+ * Sanitize skill content to prevent prompt injection.
39
+ */
40
+ function sanitizeSkillContent(content) {
41
+ // Truncate to max length
42
+ const truncated = content.length > MAX_SKILL_CONTENT_LENGTH
43
+ ? content.slice(0, MAX_SKILL_CONTENT_LENGTH) + '\n[truncated]'
44
+ : content;
45
+ // Strip role boundary tags
46
+ return truncated
47
+ .split('\n')
48
+ .filter(line => !ROLE_BOUNDARY_PATTERN.test(line.trim()))
49
+ .join('\n');
50
+ }
51
+ // Schema definitions
52
+ const loadLocalSchema = {
53
+ projectRoot: z.string()
54
+ .max(500)
55
+ .optional()
56
+ .describe('Project root directory (defaults to cwd)'),
57
+ };
58
+ // Empty ZodRawShape: SDK expects plain object of z-types; {} means no parameters
59
+ const loadGlobalSchema = {};
60
+ const listSkillsSchema = {
61
+ projectRoot: z.string()
62
+ .max(500)
63
+ .optional()
64
+ .describe('Project root directory (defaults to cwd)'),
65
+ };
66
+ /**
67
+ * Format skills into readable markdown output.
68
+ */
69
+ function formatSkillOutput(skills) {
70
+ if (skills.length === 0) {
71
+ return 'No skills found in the searched directories.';
72
+ }
73
+ const lines = [];
74
+ for (const skill of skills) {
75
+ lines.push(`### ${skill.metadata.id}`);
76
+ lines.push(`- **Name:** ${skill.metadata.name}`);
77
+ lines.push(`- **Description:** ${skill.metadata.description}`);
78
+ lines.push(`- **Triggers:** ${skill.metadata.triggers.join(', ')}`);
79
+ if (skill.metadata.tags?.length) {
80
+ lines.push(`- **Tags:** ${skill.metadata.tags.join(', ')}`);
81
+ }
82
+ lines.push(`- **Scope:** ${skill.scope}`);
83
+ lines.push(`- **Path:** ${skill.relativePath}`);
84
+ lines.push('');
85
+ }
86
+ return lines.join('\n');
87
+ }
88
+ // Tool 1: load_omc_skills_local
89
+ export const loadLocalTool = {
90
+ name: 'load_omc_skills_local',
91
+ description: 'Load and list skills from the project-local .omc/skills/ directory. Returns skill metadata (id, name, description, triggers, tags) for all discovered project-scoped skills.',
92
+ schema: loadLocalSchema,
93
+ handler: async (args) => {
94
+ const projectRoot = args.projectRoot ? validateProjectRoot(args.projectRoot) : process.cwd();
95
+ const allSkills = loadAllSkills(projectRoot);
96
+ const projectSkills = allSkills.filter(s => s.scope === 'project');
97
+ return {
98
+ content: [{
99
+ type: 'text',
100
+ text: `## Project Skills (${projectSkills.length})\n\n${formatSkillOutput(projectSkills)}`,
101
+ }],
102
+ };
103
+ },
104
+ };
105
+ // Tool 2: load_omc_skills_global
106
+ export const loadGlobalTool = {
107
+ name: 'load_omc_skills_global',
108
+ description: 'Load and list skills from global user directories (~/.omc/skills/ and ~/.claude/skills/omc-learned/). Returns skill metadata for all discovered user-scoped skills.',
109
+ schema: loadGlobalSchema,
110
+ handler: async (_args) => {
111
+ const allSkills = loadAllSkills(null);
112
+ const userSkills = allSkills.filter(s => s.scope === 'user');
113
+ return {
114
+ content: [{
115
+ type: 'text',
116
+ text: `## Global User Skills (${userSkills.length})\n\n${formatSkillOutput(userSkills)}`,
117
+ }],
118
+ };
119
+ },
120
+ };
121
+ // Tool 3: list_omc_skills
122
+ export const listSkillsTool = {
123
+ name: 'list_omc_skills',
124
+ description: 'List all available skills (both project-local and global user skills). Project skills take priority over user skills with the same ID.',
125
+ schema: listSkillsSchema,
126
+ handler: async (args) => {
127
+ const projectRoot = args.projectRoot ? validateProjectRoot(args.projectRoot) : process.cwd();
128
+ const skills = loadAllSkills(projectRoot);
129
+ const projectSkills = skills.filter(s => s.scope === 'project');
130
+ const userSkills = skills.filter(s => s.scope === 'user');
131
+ let output = `## All Available Skills (${skills.length} total)\n\n`;
132
+ if (projectSkills.length > 0) {
133
+ output += `### Project Skills (${projectSkills.length})\n\n${formatSkillOutput(projectSkills)}\n`;
134
+ }
135
+ if (userSkills.length > 0) {
136
+ output += `### User Skills (${userSkills.length})\n\n${formatSkillOutput(userSkills)}`;
137
+ }
138
+ if (skills.length === 0) {
139
+ output = '## No Skills Found\n\nNo skill files were discovered in any searched directories.\n\nSearched:\n- Project: .omc/skills/\n- Global: ~/.omc/skills/\n- Legacy: ~/.claude/skills/omc-learned/';
140
+ }
141
+ return {
142
+ content: [{
143
+ type: 'text',
144
+ text: output,
145
+ }],
146
+ };
147
+ },
148
+ };
149
+ /** All skills tools for registration in omc-tools-server */
150
+ export const skillsTools = [loadLocalTool, loadGlobalTool, listSkillsTool];
151
+ //# sourceMappingURL=skills-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-tools.js","sourceRoot":"","sources":["../../src/tools/skills-tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-claude-sisyphus",
3
- "version": "3.8.13",
3
+ "version": "3.8.14",
4
4
  "description": "Multi-agent orchestration system for Claude Code - Inspired by oh-my-opencode",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -26,7 +26,8 @@ try {
26
26
 
27
27
  // Constants (used by fallback)
28
28
  const USER_SKILLS_DIR = join(homedir(), '.claude', 'skills', 'omc-learned');
29
- const PROJECT_SKILLS_SUBDIR = '.omc/skills';
29
+ const GLOBAL_SKILLS_DIR = join(homedir(), '.omc', 'skills');
30
+ const PROJECT_SKILLS_SUBDIR = join('.omc', 'skills');
30
31
  const SKILL_EXTENSION = '.md';
31
32
  const MAX_SKILLS_PER_SESSION = 5;
32
33
 
@@ -92,26 +93,29 @@ function findSkillFilesFallback(directory) {
92
93
  }
93
94
  }
94
95
 
95
- // User-level skills
96
- if (existsSync(USER_SKILLS_DIR)) {
97
- try {
98
- const files = readdirSync(USER_SKILLS_DIR, { withFileTypes: true });
99
- for (const file of files) {
100
- if (file.isFile() && file.name.endsWith(SKILL_EXTENSION)) {
101
- const fullPath = join(USER_SKILLS_DIR, file.name);
102
- try {
103
- const realPath = realpathSync(fullPath);
104
- if (!seenPaths.has(realPath)) {
105
- seenPaths.add(realPath);
106
- candidates.push({ path: fullPath, scope: 'user' });
96
+ // User-level skills (search both global and legacy directories)
97
+ const userDirs = [GLOBAL_SKILLS_DIR, USER_SKILLS_DIR];
98
+ for (const userDir of userDirs) {
99
+ if (existsSync(userDir)) {
100
+ try {
101
+ const files = readdirSync(userDir, { withFileTypes: true });
102
+ for (const file of files) {
103
+ if (file.isFile() && file.name.endsWith(SKILL_EXTENSION)) {
104
+ const fullPath = join(userDir, file.name);
105
+ try {
106
+ const realPath = realpathSync(fullPath);
107
+ if (!seenPaths.has(realPath)) {
108
+ seenPaths.add(realPath);
109
+ candidates.push({ path: fullPath, scope: 'user' });
110
+ }
111
+ } catch {
112
+ // Ignore symlink resolution errors
107
113
  }
108
- } catch {
109
- // Ignore symlink resolution errors
110
114
  }
111
115
  }
116
+ } catch {
117
+ // Ignore directory read errors
112
118
  }
113
- } catch {
114
- // Ignore directory read errors
115
119
  }
116
120
  }
117
121