@codemieai/code 0.0.32 → 0.0.34

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 (203) hide show
  1. package/README.md +73 -7
  2. package/bin/codemie-opencode.js +11 -0
  3. package/dist/agents/codemie-code/agent.d.ts +17 -1
  4. package/dist/agents/codemie-code/agent.d.ts.map +1 -1
  5. package/dist/agents/codemie-code/agent.js +62 -3
  6. package/dist/agents/codemie-code/agent.js.map +1 -1
  7. package/dist/agents/codemie-code/index.d.ts +1 -0
  8. package/dist/agents/codemie-code/index.d.ts.map +1 -1
  9. package/dist/agents/codemie-code/index.js +28 -2
  10. package/dist/agents/codemie-code/index.js.map +1 -1
  11. package/dist/agents/codemie-code/prompts.d.ts +12 -3
  12. package/dist/agents/codemie-code/prompts.d.ts.map +1 -1
  13. package/dist/agents/codemie-code/prompts.js +25 -5
  14. package/dist/agents/codemie-code/prompts.js.map +1 -1
  15. package/dist/agents/codemie-code/types.d.ts +3 -0
  16. package/dist/agents/codemie-code/types.d.ts.map +1 -1
  17. package/dist/agents/codemie-code/types.js.map +1 -1
  18. package/dist/agents/codemie-code/ui/todoPanel.d.ts.map +1 -1
  19. package/dist/agents/codemie-code/ui/todoPanel.js +4 -0
  20. package/dist/agents/codemie-code/ui/todoPanel.js.map +1 -1
  21. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  22. package/dist/agents/core/AgentCLI.js +3 -1
  23. package/dist/agents/core/AgentCLI.js.map +1 -1
  24. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  25. package/dist/agents/core/BaseAgentAdapter.js +46 -2
  26. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  27. package/dist/agents/core/session/BaseSessionAdapter.d.ts +25 -0
  28. package/dist/agents/core/session/BaseSessionAdapter.d.ts.map +1 -1
  29. package/dist/agents/core/session/SessionStore.d.ts +15 -0
  30. package/dist/agents/core/session/SessionStore.d.ts.map +1 -1
  31. package/dist/agents/core/session/SessionStore.js +46 -0
  32. package/dist/agents/core/session/SessionStore.js.map +1 -1
  33. package/dist/agents/core/session/discovery-types.d.ts +53 -0
  34. package/dist/agents/core/session/discovery-types.d.ts.map +1 -0
  35. package/dist/agents/core/session/discovery-types.js +8 -0
  36. package/dist/agents/core/session/discovery-types.js.map +1 -0
  37. package/dist/agents/core/session/types.d.ts +2 -0
  38. package/dist/agents/core/session/types.d.ts.map +1 -1
  39. package/dist/agents/core/types.d.ts +45 -0
  40. package/dist/agents/core/types.d.ts.map +1 -1
  41. package/dist/agents/plugins/claude/claude.plugin.d.ts +44 -1
  42. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  43. package/dist/agents/plugins/claude/claude.plugin.js +214 -0
  44. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  45. package/dist/agents/plugins/claude/plugin/.claude-plugin/plugin.json +1 -1
  46. package/dist/agents/plugins/claude/plugin/README.md +40 -2
  47. package/dist/agents/plugins/claude/plugin/claude-templates/README.md +5 -5
  48. package/dist/agents/plugins/claude/plugin/claude-templates/templates/CLAUDE.md.template +177 -436
  49. package/dist/agents/plugins/claude/plugin/claude-templates/templates/agents/code-review-agent-template.md.template +49 -82
  50. package/dist/agents/plugins/claude/plugin/claude-templates/templates/agents/refactor-cleaner-agent.md.template +337 -0
  51. package/dist/agents/plugins/claude/plugin/claude-templates/templates/agents/solution-architect-agent.md.template +129 -419
  52. package/dist/agents/plugins/claude/plugin/claude-templates/templates/agents/unit-tester-agent.md.template +146 -693
  53. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/api/api-patterns.md.template +110 -138
  54. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/architecture/architecture.md.template +197 -0
  55. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/data/database-patterns.md.template +171 -91
  56. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/development/development-practices.md.template +219 -131
  57. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/security/security-practices.md.template +223 -98
  58. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/standards/code-quality.md.template +131 -95
  59. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/testing/testing-patterns.md.template +247 -75
  60. package/dist/agents/plugins/claude/plugin/commands/README.md +133 -0
  61. package/dist/agents/plugins/claude/plugin/commands/codemie-init.md +336 -544
  62. package/dist/agents/plugins/claude/plugin/commands/codemie-subagents.md +232 -503
  63. package/dist/agents/plugins/claude/plugin/commands/memory-add.md +311 -30
  64. package/dist/agents/plugins/claude/plugin/commands/memory-refresh.md +218 -39
  65. package/dist/agents/plugins/claude/plugin/hooks/hooks.json +11 -0
  66. package/dist/agents/plugins/gemini/extension/gemini-extension.json +1 -1
  67. package/dist/agents/plugins/gemini/extension/hooks/hooks.json +12 -0
  68. package/dist/agents/plugins/gemini/gemini.plugin.d.ts.map +1 -1
  69. package/dist/agents/plugins/gemini/gemini.plugin.js +2 -4
  70. package/dist/agents/plugins/gemini/gemini.plugin.js.map +1 -1
  71. package/dist/agents/plugins/opencode/index.d.ts +8 -0
  72. package/dist/agents/plugins/opencode/index.d.ts.map +1 -0
  73. package/dist/agents/plugins/opencode/index.js +12 -0
  74. package/dist/agents/plugins/opencode/index.js.map +1 -0
  75. package/dist/agents/plugins/opencode/opencode-message-types.d.ts +207 -0
  76. package/dist/agents/plugins/opencode/opencode-message-types.d.ts.map +1 -0
  77. package/dist/agents/plugins/opencode/opencode-message-types.js +59 -0
  78. package/dist/agents/plugins/opencode/opencode-message-types.js.map +1 -0
  79. package/dist/agents/plugins/opencode/opencode-model-configs.d.ts +65 -0
  80. package/dist/agents/plugins/opencode/opencode-model-configs.d.ts.map +1 -0
  81. package/dist/agents/plugins/opencode/opencode-model-configs.js +184 -0
  82. package/dist/agents/plugins/opencode/opencode-model-configs.js.map +1 -0
  83. package/dist/agents/plugins/opencode/opencode.paths.d.ts +62 -0
  84. package/dist/agents/plugins/opencode/opencode.paths.d.ts.map +1 -0
  85. package/dist/agents/plugins/opencode/opencode.paths.js +148 -0
  86. package/dist/agents/plugins/opencode/opencode.paths.js.map +1 -0
  87. package/dist/agents/plugins/opencode/opencode.plugin.d.ts +35 -0
  88. package/dist/agents/plugins/opencode/opencode.plugin.d.ts.map +1 -0
  89. package/dist/agents/plugins/opencode/opencode.plugin.js +338 -0
  90. package/dist/agents/plugins/opencode/opencode.plugin.js.map +1 -0
  91. package/dist/agents/plugins/opencode/opencode.session.d.ts +77 -0
  92. package/dist/agents/plugins/opencode/opencode.session.d.ts.map +1 -0
  93. package/dist/agents/plugins/opencode/opencode.session.js +424 -0
  94. package/dist/agents/plugins/opencode/opencode.session.js.map +1 -0
  95. package/dist/agents/plugins/opencode/opencode.storage-utils.d.ts +25 -0
  96. package/dist/agents/plugins/opencode/opencode.storage-utils.d.ts.map +1 -0
  97. package/dist/agents/plugins/opencode/opencode.storage-utils.js +96 -0
  98. package/dist/agents/plugins/opencode/opencode.storage-utils.js.map +1 -0
  99. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.d.ts +30 -0
  100. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.d.ts.map +1 -0
  101. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js +116 -0
  102. package/dist/agents/plugins/opencode/session/processors/opencode.conversations-processor.js.map +1 -0
  103. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.d.ts +102 -0
  104. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.d.ts.map +1 -0
  105. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.js +584 -0
  106. package/dist/agents/plugins/opencode/session/processors/opencode.metrics-processor.js.map +1 -0
  107. package/dist/agents/registry.d.ts.map +1 -1
  108. package/dist/agents/registry.js +2 -0
  109. package/dist/agents/registry.js.map +1 -1
  110. package/dist/cli/commands/doctor/checks/AgentsCheck.d.ts +5 -0
  111. package/dist/cli/commands/doctor/checks/AgentsCheck.d.ts.map +1 -1
  112. package/dist/cli/commands/doctor/checks/AgentsCheck.js +29 -0
  113. package/dist/cli/commands/doctor/checks/AgentsCheck.js.map +1 -1
  114. package/dist/cli/commands/hook.d.ts.map +1 -1
  115. package/dist/cli/commands/hook.js +63 -6
  116. package/dist/cli/commands/hook.js.map +1 -1
  117. package/dist/cli/commands/install.d.ts.map +1 -1
  118. package/dist/cli/commands/install.js +86 -7
  119. package/dist/cli/commands/install.js.map +1 -1
  120. package/dist/cli/commands/opencode-metrics.d.ts +13 -0
  121. package/dist/cli/commands/opencode-metrics.d.ts.map +1 -0
  122. package/dist/cli/commands/opencode-metrics.js +200 -0
  123. package/dist/cli/commands/opencode-metrics.js.map +1 -0
  124. package/dist/cli/commands/setup.d.ts.map +1 -1
  125. package/dist/cli/commands/setup.js +113 -0
  126. package/dist/cli/commands/setup.js.map +1 -1
  127. package/dist/cli/commands/skill.d.ts +6 -0
  128. package/dist/cli/commands/skill.d.ts.map +1 -0
  129. package/dist/cli/commands/skill.js +196 -0
  130. package/dist/cli/commands/skill.js.map +1 -0
  131. package/dist/cli/commands/update.d.ts.map +1 -1
  132. package/dist/cli/commands/update.js +34 -6
  133. package/dist/cli/commands/update.js.map +1 -1
  134. package/dist/cli/index.js +4 -0
  135. package/dist/cli/index.js.map +1 -1
  136. package/dist/migrations/003-remove-hooks-node.migration.d.ts +22 -0
  137. package/dist/migrations/003-remove-hooks-node.migration.d.ts.map +1 -0
  138. package/dist/migrations/003-remove-hooks-node.migration.js +103 -0
  139. package/dist/migrations/003-remove-hooks-node.migration.js.map +1 -0
  140. package/dist/migrations/index.d.ts +1 -0
  141. package/dist/migrations/index.d.ts.map +1 -1
  142. package/dist/migrations/index.js +1 -1
  143. package/dist/migrations/index.js.map +1 -1
  144. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.d.ts +3 -2
  145. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.d.ts.map +1 -1
  146. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.js +6 -2
  147. package/dist/providers/plugins/sso/session/processors/metrics/metrics-api-client.js.map +1 -1
  148. package/dist/providers/plugins/sso/sso.http-client.js +2 -2
  149. package/dist/providers/plugins/sso/sso.http-client.js.map +1 -1
  150. package/dist/providers/plugins/sso/sso.setup-steps.d.ts.map +1 -1
  151. package/dist/providers/plugins/sso/sso.setup-steps.js +14 -10
  152. package/dist/providers/plugins/sso/sso.setup-steps.js.map +1 -1
  153. package/dist/skills/core/SkillDiscovery.d.ts +83 -0
  154. package/dist/skills/core/SkillDiscovery.d.ts.map +1 -0
  155. package/dist/skills/core/SkillDiscovery.js +237 -0
  156. package/dist/skills/core/SkillDiscovery.js.map +1 -0
  157. package/dist/skills/core/SkillManager.d.ts +86 -0
  158. package/dist/skills/core/SkillManager.d.ts.map +1 -0
  159. package/dist/skills/core/SkillManager.js +155 -0
  160. package/dist/skills/core/SkillManager.js.map +1 -0
  161. package/dist/skills/core/types.d.ts +120 -0
  162. package/dist/skills/core/types.d.ts.map +1 -0
  163. package/dist/skills/core/types.js +20 -0
  164. package/dist/skills/core/types.js.map +1 -0
  165. package/dist/skills/index.d.ts +12 -0
  166. package/dist/skills/index.d.ts.map +1 -0
  167. package/dist/skills/index.js +12 -0
  168. package/dist/skills/index.js.map +1 -0
  169. package/dist/skills/utils/content-loader.d.ts +25 -0
  170. package/dist/skills/utils/content-loader.d.ts.map +1 -0
  171. package/dist/skills/utils/content-loader.js +161 -0
  172. package/dist/skills/utils/content-loader.js.map +1 -0
  173. package/dist/skills/utils/frontmatter.d.ts +60 -0
  174. package/dist/skills/utils/frontmatter.d.ts.map +1 -0
  175. package/dist/skills/utils/frontmatter.js +114 -0
  176. package/dist/skills/utils/frontmatter.js.map +1 -0
  177. package/dist/skills/utils/pattern-matcher.d.ts +60 -0
  178. package/dist/skills/utils/pattern-matcher.d.ts.map +1 -0
  179. package/dist/skills/utils/pattern-matcher.js +97 -0
  180. package/dist/skills/utils/pattern-matcher.js.map +1 -0
  181. package/dist/utils/exec.d.ts.map +1 -1
  182. package/dist/utils/exec.js +11 -1
  183. package/dist/utils/exec.js.map +1 -1
  184. package/dist/utils/installation-detector.d.ts +22 -0
  185. package/dist/utils/installation-detector.d.ts.map +1 -0
  186. package/dist/utils/installation-detector.js +49 -0
  187. package/dist/utils/installation-detector.js.map +1 -0
  188. package/dist/utils/native-installer.d.ts +49 -0
  189. package/dist/utils/native-installer.d.ts.map +1 -0
  190. package/dist/utils/native-installer.js +194 -0
  191. package/dist/utils/native-installer.js.map +1 -0
  192. package/dist/utils/version-utils.d.ts +50 -0
  193. package/dist/utils/version-utils.d.ts.map +1 -0
  194. package/dist/utils/version-utils.js +92 -0
  195. package/dist/utils/version-utils.js.map +1 -0
  196. package/package.json +5 -2
  197. package/scripts/copy-mr-skill-to-global.ts +252 -0
  198. package/scripts/demo-hooks.sh +125 -0
  199. package/scripts/test-hooks.sh +196 -0
  200. package/dist/agents/plugins/claude/plugin/claude-templates/templates/INDEX.md +0 -205
  201. package/dist/agents/plugins/claude/plugin/claude-templates/templates/TEMPLATE_SIZES.md +0 -74
  202. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/architecture/layered-architecture.md.template +0 -143
  203. package/dist/agents/plugins/claude/plugin/claude-templates/templates/guides/architecture/project-structure.md.template +0 -127
@@ -0,0 +1,83 @@
1
+ import type { Skill, SkillDiscoveryOptions } from './types.js';
2
+ /**
3
+ * Skill discovery engine
4
+ *
5
+ * Discovers SKILL.md files from multiple locations, parses frontmatter,
6
+ * validates metadata, and applies priority sorting.
7
+ */
8
+ export declare class SkillDiscovery {
9
+ private cache;
10
+ /**
11
+ * Discover all skills matching the given options
12
+ *
13
+ * @param options - Discovery options (cwd, mode, agent, forceReload)
14
+ * @returns Array of discovered and validated skills, sorted by priority
15
+ */
16
+ discoverSkills(options?: SkillDiscoveryOptions): Promise<Skill[]>;
17
+ /**
18
+ * Discover skills from project directory (.codemie/skills/)
19
+ */
20
+ private discoverProjectSkills;
21
+ /**
22
+ * Discover skills from mode-specific directory (~/.codemie/skills-{mode}/)
23
+ */
24
+ private discoverModeSkills;
25
+ /**
26
+ * Discover skills from global directory (~/.codemie/skills/)
27
+ */
28
+ private discoverGlobalSkills;
29
+ /**
30
+ * Discover skills from a specific directory
31
+ *
32
+ * @param directory - Directory to search
33
+ * @param source - Source type (project, mode-specific, global)
34
+ * @returns Array of discovered skills
35
+ */
36
+ private discoverFromDirectory;
37
+ /**
38
+ * Parse a single skill file
39
+ *
40
+ * @param filePath - Absolute path to SKILL.md
41
+ * @param source - Source type
42
+ * @returns Parse result with skill or error
43
+ */
44
+ private parseSkillFile;
45
+ /**
46
+ * Compute priority for a skill
47
+ *
48
+ * Priority = source base priority + metadata priority
49
+ */
50
+ private computePriority;
51
+ /**
52
+ * Deduplicate skills by name (higher priority wins)
53
+ */
54
+ private deduplicateSkills;
55
+ /**
56
+ * Filter skills by agent compatibility
57
+ */
58
+ private filterByAgent;
59
+ /**
60
+ * Filter skills by mode
61
+ */
62
+ private filterByMode;
63
+ /**
64
+ * Sort skills by computed priority (descending)
65
+ */
66
+ private sortByPriority;
67
+ /**
68
+ * Generate cache key from options
69
+ */
70
+ private getCacheKey;
71
+ /**
72
+ * Clear cache (force reload on next discovery)
73
+ */
74
+ clearCache(): void;
75
+ /**
76
+ * Get cache statistics (for debugging)
77
+ */
78
+ getCacheStats(): {
79
+ size: number;
80
+ keys: string[];
81
+ };
82
+ }
83
+ //# sourceMappingURL=SkillDiscovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillDiscovery.d.ts","sourceRoot":"","sources":["../../../src/skills/core/SkillDiscovery.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,KAAK,EAIL,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAYpB;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAmC;IAEhD;;;;;OAKG;IACG,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAwC3E;;OAEG;YACW,qBAAqB;IAKnC;;OAEG;YACW,kBAAkB;IAOhC;;OAEG;YACW,oBAAoB;IAKlC;;;;;;OAMG;YACW,qBAAqB;IAiCnC;;;;;;OAMG;YACW,cAAc;IA8C5B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAMvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,aAAa,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;CAMlD"}
@@ -0,0 +1,237 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { join } from 'path';
3
+ import fg from 'fast-glob';
4
+ import { getCodemiePath } from '../../utils/paths.js';
5
+ import { parseFrontmatter, FrontmatterParseError } from '../utils/frontmatter.js';
6
+ import { SkillMetadataSchema } from './types.js';
7
+ /**
8
+ * Priority multipliers for skill sources
9
+ * Higher priority = loaded first, can override lower priority
10
+ */
11
+ const SOURCE_PRIORITY = {
12
+ project: 1000, // Highest priority
13
+ 'mode-specific': 500, // Medium priority
14
+ global: 100, // Lowest priority
15
+ };
16
+ /**
17
+ * Skill discovery engine
18
+ *
19
+ * Discovers SKILL.md files from multiple locations, parses frontmatter,
20
+ * validates metadata, and applies priority sorting.
21
+ */
22
+ export class SkillDiscovery {
23
+ cache = new Map();
24
+ /**
25
+ * Discover all skills matching the given options
26
+ *
27
+ * @param options - Discovery options (cwd, mode, agent, forceReload)
28
+ * @returns Array of discovered and validated skills, sorted by priority
29
+ */
30
+ async discoverSkills(options = {}) {
31
+ const { cwd = process.cwd(), forceReload = false } = options;
32
+ // Check cache first
33
+ const cacheKey = this.getCacheKey(options);
34
+ if (!forceReload && this.cache.has(cacheKey)) {
35
+ return this.cache.get(cacheKey);
36
+ }
37
+ // Discover from all locations
38
+ const [projectSkills, modeSkills, globalSkills] = await Promise.all([
39
+ this.discoverProjectSkills(cwd),
40
+ this.discoverModeSkills(options.mode),
41
+ this.discoverGlobalSkills(),
42
+ ]);
43
+ // Combine and deduplicate by name (higher priority wins)
44
+ const allSkills = [...projectSkills, ...modeSkills, ...globalSkills];
45
+ const deduplicatedSkills = this.deduplicateSkills(allSkills);
46
+ // Filter by agent if specified
47
+ let filteredSkills = deduplicatedSkills;
48
+ if (options.agentName) {
49
+ filteredSkills = this.filterByAgent(deduplicatedSkills, options.agentName);
50
+ }
51
+ // Filter by mode if specified
52
+ if (options.mode) {
53
+ filteredSkills = this.filterByMode(filteredSkills, options.mode);
54
+ }
55
+ // Sort by computed priority (descending)
56
+ const sortedSkills = this.sortByPriority(filteredSkills);
57
+ // Cache result
58
+ this.cache.set(cacheKey, sortedSkills);
59
+ return sortedSkills;
60
+ }
61
+ /**
62
+ * Discover skills from project directory (.codemie/skills/)
63
+ */
64
+ async discoverProjectSkills(cwd) {
65
+ const projectSkillsDir = join(cwd, '.codemie', 'skills');
66
+ return this.discoverFromDirectory(projectSkillsDir, 'project');
67
+ }
68
+ /**
69
+ * Discover skills from mode-specific directory (~/.codemie/skills-{mode}/)
70
+ */
71
+ async discoverModeSkills(mode) {
72
+ if (!mode)
73
+ return [];
74
+ const modeSkillsDir = getCodemiePath(`skills-${mode}`);
75
+ return this.discoverFromDirectory(modeSkillsDir, 'mode-specific');
76
+ }
77
+ /**
78
+ * Discover skills from global directory (~/.codemie/skills/)
79
+ */
80
+ async discoverGlobalSkills() {
81
+ const globalSkillsDir = getCodemiePath('skills');
82
+ return this.discoverFromDirectory(globalSkillsDir, 'global');
83
+ }
84
+ /**
85
+ * Discover skills from a specific directory
86
+ *
87
+ * @param directory - Directory to search
88
+ * @param source - Source type (project, mode-specific, global)
89
+ * @returns Array of discovered skills
90
+ */
91
+ async discoverFromDirectory(directory, source) {
92
+ try {
93
+ // Find all SKILL.md files (case-insensitive, up to 3 levels deep)
94
+ const pattern = '**/SKILL.md';
95
+ const files = await fg(pattern, {
96
+ cwd: directory,
97
+ absolute: true,
98
+ caseSensitiveMatch: false,
99
+ deep: 3,
100
+ ignore: ['**/node_modules/**', '**/.git/**'],
101
+ onlyFiles: true,
102
+ });
103
+ // Parse all skill files
104
+ const parseResults = await Promise.all(files.map((filePath) => this.parseSkillFile(filePath, source)));
105
+ // Filter out errors and return valid skills
106
+ const skills = parseResults
107
+ .filter((result) => result.skill !== undefined)
108
+ .map((result) => result.skill);
109
+ return skills;
110
+ }
111
+ catch {
112
+ // Directory doesn't exist or other error - return empty array
113
+ return [];
114
+ }
115
+ }
116
+ /**
117
+ * Parse a single skill file
118
+ *
119
+ * @param filePath - Absolute path to SKILL.md
120
+ * @param source - Source type
121
+ * @returns Parse result with skill or error
122
+ */
123
+ async parseSkillFile(filePath, source) {
124
+ try {
125
+ // Read file
126
+ const fileContent = await readFile(filePath, 'utf-8');
127
+ // Parse frontmatter
128
+ const { metadata, content } = parseFrontmatter(fileContent, filePath);
129
+ // Validate metadata with Zod
130
+ const validatedMetadata = SkillMetadataSchema.parse(metadata);
131
+ // Compute priority
132
+ const computedPriority = this.computePriority(validatedMetadata, source);
133
+ // Create skill object
134
+ const skill = {
135
+ metadata: validatedMetadata,
136
+ content: content.trim(),
137
+ filePath,
138
+ source,
139
+ computedPriority,
140
+ };
141
+ return { skill };
142
+ }
143
+ catch (error) {
144
+ // Log error but don't throw - allow partial discovery
145
+ const errorMessage = error instanceof FrontmatterParseError
146
+ ? error.message
147
+ : error instanceof Error
148
+ ? error.message
149
+ : String(error);
150
+ return {
151
+ error: {
152
+ filePath,
153
+ message: errorMessage,
154
+ cause: error,
155
+ },
156
+ };
157
+ }
158
+ }
159
+ /**
160
+ * Compute priority for a skill
161
+ *
162
+ * Priority = source base priority + metadata priority
163
+ */
164
+ computePriority(metadata, source) {
165
+ const sourceBasePriority = SOURCE_PRIORITY[source];
166
+ const metadataPriority = metadata.priority || 0;
167
+ return sourceBasePriority + metadataPriority;
168
+ }
169
+ /**
170
+ * Deduplicate skills by name (higher priority wins)
171
+ */
172
+ deduplicateSkills(skills) {
173
+ const skillMap = new Map();
174
+ for (const skill of skills) {
175
+ const existingSkill = skillMap.get(skill.metadata.name);
176
+ if (!existingSkill || skill.computedPriority > existingSkill.computedPriority) {
177
+ skillMap.set(skill.metadata.name, skill);
178
+ }
179
+ }
180
+ return Array.from(skillMap.values());
181
+ }
182
+ /**
183
+ * Filter skills by agent compatibility
184
+ */
185
+ filterByAgent(skills, agentName) {
186
+ return skills.filter((skill) => {
187
+ // If no compatibility specified, skill is compatible with all agents
188
+ if (!skill.metadata.compatibility?.agents) {
189
+ return true;
190
+ }
191
+ // Check if agent is in compatibility list
192
+ return skill.metadata.compatibility.agents.includes(agentName);
193
+ });
194
+ }
195
+ /**
196
+ * Filter skills by mode
197
+ */
198
+ filterByMode(skills, mode) {
199
+ return skills.filter((skill) => {
200
+ // If no modes specified, skill is available in all modes
201
+ if (!skill.metadata.modes || skill.metadata.modes.length === 0) {
202
+ return true;
203
+ }
204
+ // Check if mode is in modes list
205
+ return skill.metadata.modes.includes(mode);
206
+ });
207
+ }
208
+ /**
209
+ * Sort skills by computed priority (descending)
210
+ */
211
+ sortByPriority(skills) {
212
+ return [...skills].sort((a, b) => b.computedPriority - a.computedPriority);
213
+ }
214
+ /**
215
+ * Generate cache key from options
216
+ */
217
+ getCacheKey(options) {
218
+ const { cwd = process.cwd(), mode, agentName } = options;
219
+ return `${cwd}::${mode || ''}::${agentName || ''}`;
220
+ }
221
+ /**
222
+ * Clear cache (force reload on next discovery)
223
+ */
224
+ clearCache() {
225
+ this.cache.clear();
226
+ }
227
+ /**
228
+ * Get cache statistics (for debugging)
229
+ */
230
+ getCacheStats() {
231
+ return {
232
+ size: this.cache.size,
233
+ keys: Array.from(this.cache.keys()),
234
+ };
235
+ }
236
+ }
237
+ //# sourceMappingURL=SkillDiscovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillDiscovery.js","sourceRoot":"","sources":["../../../src/skills/core/SkillDiscovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import type { Skill, SkillDiscoveryOptions, SkillValidationResult, SkillWithInventory } from './types.js';
2
+ /**
3
+ * Skill manager singleton
4
+ *
5
+ * Provides high-level API for skill management:
6
+ * - Discovery and caching
7
+ * - Agent-aware filtering
8
+ * - Validation
9
+ * - Cache management
10
+ */
11
+ export declare class SkillManager {
12
+ private static instance;
13
+ private discovery;
14
+ /**
15
+ * Private constructor (singleton pattern)
16
+ */
17
+ private constructor();
18
+ /**
19
+ * Get singleton instance
20
+ */
21
+ static getInstance(): SkillManager;
22
+ /**
23
+ * Get skills for a specific agent
24
+ *
25
+ * @param agentName - Name of the agent (e.g., 'codemie-code')
26
+ * @param options - Additional discovery options
27
+ * @returns Array of skills compatible with the agent
28
+ */
29
+ getSkillsForAgent(agentName: string, options?: Omit<SkillDiscoveryOptions, 'agentName'>): Promise<Skill[]>;
30
+ /**
31
+ * Get a specific skill by name
32
+ *
33
+ * @param name - Skill name
34
+ * @param options - Discovery options
35
+ * @returns Skill if found, undefined otherwise
36
+ */
37
+ getSkillByName(name: string, options?: SkillDiscoveryOptions): Promise<Skill | undefined>;
38
+ /**
39
+ * List all discovered skills
40
+ *
41
+ * @param options - Discovery options
42
+ * @returns Array of all skills
43
+ */
44
+ listSkills(options?: SkillDiscoveryOptions): Promise<Skill[]>;
45
+ /**
46
+ * Get multiple skills by names with file inventory
47
+ *
48
+ * Used for pattern-based invocation when /skill-name patterns are detected.
49
+ * Loads skill content and builds file inventory for each requested skill.
50
+ *
51
+ * @param names - Array of skill names to load
52
+ * @param options - Discovery options
53
+ * @returns Array of skills with inventory (only found skills)
54
+ */
55
+ getSkillsByNames(names: string[], options?: SkillDiscoveryOptions): Promise<SkillWithInventory[]>;
56
+ /**
57
+ * Reload skills (clear cache and force re-discovery)
58
+ *
59
+ * Call this after adding/removing/modifying skill files
60
+ */
61
+ reload(): void;
62
+ /**
63
+ * Validate all skill files
64
+ *
65
+ * Attempts to discover and parse all skills, returning validation results
66
+ *
67
+ * @param options - Discovery options
68
+ * @returns Validation results for all skills
69
+ */
70
+ validateAll(options?: SkillDiscoveryOptions): Promise<{
71
+ valid: Skill[];
72
+ invalid: SkillValidationResult[];
73
+ }>;
74
+ /**
75
+ * Get cache statistics (for debugging)
76
+ */
77
+ getCacheStats(): {
78
+ size: number;
79
+ keys: string[];
80
+ };
81
+ /**
82
+ * Reset singleton instance (for testing)
83
+ */
84
+ static resetInstance(): void;
85
+ }
86
+ //# sourceMappingURL=SkillManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillManager.d.ts","sourceRoot":"","sources":["../../../src/skills/core/SkillManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,KAAK,EACL,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAIpB;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,SAAS,CAAiB;IAElC;;OAEG;IACH,OAAO;IAIP;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,YAAY;IAOlC;;;;;;OAMG;IACG,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,IAAI,CAAC,qBAAqB,EAAE,WAAW,CAAM,GACrD,OAAO,CAAC,KAAK,EAAE,CAAC;IAOnB;;;;;;OAMG;IACG,cAAc,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAK7B;;;;;OAKG;IACG,UAAU,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAIvE;;;;;;;;;OASG;IACG,gBAAgB,CACpB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAyBhC;;;;OAIG;IACH,MAAM,IAAI,IAAI;IAId;;;;;;;OAOG;IACG,WAAW,CACf,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC;QAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAAC,OAAO,EAAE,qBAAqB,EAAE,CAAA;KAAE,CAAC;IAiChE;;OAEG;IACH,aAAa,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;IAIjD;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;CAG7B"}
@@ -0,0 +1,155 @@
1
+ import { SkillDiscovery } from './SkillDiscovery.js';
2
+ import { loadSkillWithInventory } from '../utils/content-loader.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ /**
5
+ * Skill manager singleton
6
+ *
7
+ * Provides high-level API for skill management:
8
+ * - Discovery and caching
9
+ * - Agent-aware filtering
10
+ * - Validation
11
+ * - Cache management
12
+ */
13
+ export class SkillManager {
14
+ static instance;
15
+ discovery;
16
+ /**
17
+ * Private constructor (singleton pattern)
18
+ */
19
+ constructor() {
20
+ this.discovery = new SkillDiscovery();
21
+ }
22
+ /**
23
+ * Get singleton instance
24
+ */
25
+ static getInstance() {
26
+ if (!SkillManager.instance) {
27
+ SkillManager.instance = new SkillManager();
28
+ }
29
+ return SkillManager.instance;
30
+ }
31
+ /**
32
+ * Get skills for a specific agent
33
+ *
34
+ * @param agentName - Name of the agent (e.g., 'codemie-code')
35
+ * @param options - Additional discovery options
36
+ * @returns Array of skills compatible with the agent
37
+ */
38
+ async getSkillsForAgent(agentName, options = {}) {
39
+ return this.discovery.discoverSkills({
40
+ ...options,
41
+ agentName,
42
+ });
43
+ }
44
+ /**
45
+ * Get a specific skill by name
46
+ *
47
+ * @param name - Skill name
48
+ * @param options - Discovery options
49
+ * @returns Skill if found, undefined otherwise
50
+ */
51
+ async getSkillByName(name, options = {}) {
52
+ const skills = await this.discovery.discoverSkills(options);
53
+ return skills.find((skill) => skill.metadata.name === name);
54
+ }
55
+ /**
56
+ * List all discovered skills
57
+ *
58
+ * @param options - Discovery options
59
+ * @returns Array of all skills
60
+ */
61
+ async listSkills(options = {}) {
62
+ return this.discovery.discoverSkills(options);
63
+ }
64
+ /**
65
+ * Get multiple skills by names with file inventory
66
+ *
67
+ * Used for pattern-based invocation when /skill-name patterns are detected.
68
+ * Loads skill content and builds file inventory for each requested skill.
69
+ *
70
+ * @param names - Array of skill names to load
71
+ * @param options - Discovery options
72
+ * @returns Array of skills with inventory (only found skills)
73
+ */
74
+ async getSkillsByNames(names, options = {}) {
75
+ const results = [];
76
+ // Discover all skills (uses cache)
77
+ const allSkills = await this.discovery.discoverSkills(options);
78
+ // Find and load each requested skill
79
+ for (const name of names) {
80
+ const skill = allSkills.find((s) => s.metadata.name === name);
81
+ if (skill) {
82
+ try {
83
+ const withInventory = await loadSkillWithInventory(skill);
84
+ results.push(withInventory);
85
+ }
86
+ catch (error) {
87
+ logger.warn(`Failed to load inventory for skill '${name}':`, error);
88
+ }
89
+ }
90
+ else {
91
+ logger.debug(`Skill '${name}' not found during pattern invocation`);
92
+ }
93
+ }
94
+ return results;
95
+ }
96
+ /**
97
+ * Reload skills (clear cache and force re-discovery)
98
+ *
99
+ * Call this after adding/removing/modifying skill files
100
+ */
101
+ reload() {
102
+ this.discovery.clearCache();
103
+ }
104
+ /**
105
+ * Validate all skill files
106
+ *
107
+ * Attempts to discover and parse all skills, returning validation results
108
+ *
109
+ * @param options - Discovery options
110
+ * @returns Validation results for all skills
111
+ */
112
+ async validateAll(options = {}) {
113
+ try {
114
+ // Force reload to ensure fresh validation
115
+ const skills = await this.discovery.discoverSkills({
116
+ ...options,
117
+ forceReload: true,
118
+ });
119
+ // All discovered skills are valid (parsing errors are filtered out in discovery)
120
+ const valid = skills;
121
+ // For now, we don't track invalid skills (they're silently filtered)
122
+ // Future enhancement: return parse errors from discovery
123
+ const invalid = [];
124
+ return { valid, invalid };
125
+ }
126
+ catch (error) {
127
+ // Discovery failed entirely
128
+ return {
129
+ valid: [],
130
+ invalid: [
131
+ {
132
+ valid: false,
133
+ filePath: 'unknown',
134
+ errors: [
135
+ error instanceof Error ? error.message : String(error),
136
+ ],
137
+ },
138
+ ],
139
+ };
140
+ }
141
+ }
142
+ /**
143
+ * Get cache statistics (for debugging)
144
+ */
145
+ getCacheStats() {
146
+ return this.discovery.getCacheStats();
147
+ }
148
+ /**
149
+ * Reset singleton instance (for testing)
150
+ */
151
+ static resetInstance() {
152
+ SkillManager.instance = undefined;
153
+ }
154
+ }
155
+ //# sourceMappingURL=SkillManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillManager.js","sourceRoot":"","sources":["../../../src/skills/core/SkillManager.ts"],"names":[],"mappings":"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"}