@magnolia/skill-loader 0.1.0-preview.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE.txt +27 -0
  2. package/README.md +354 -0
  3. package/dist/filter.d.ts +26 -0
  4. package/dist/filter.d.ts.map +1 -0
  5. package/dist/filter.js +160 -0
  6. package/dist/filter.js.map +1 -0
  7. package/dist/index.d.ts +35 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +38 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/loader.d.ts +81 -0
  12. package/dist/loader.d.ts.map +1 -0
  13. package/dist/loader.js +192 -0
  14. package/dist/loader.js.map +1 -0
  15. package/dist/manager.d.ts +131 -0
  16. package/dist/manager.d.ts.map +1 -0
  17. package/dist/manager.js +236 -0
  18. package/dist/manager.js.map +1 -0
  19. package/dist/parser.d.ts +25 -0
  20. package/dist/parser.d.ts.map +1 -0
  21. package/dist/parser.js +110 -0
  22. package/dist/parser.js.map +1 -0
  23. package/dist/sources/directory.d.ts +18 -0
  24. package/dist/sources/directory.d.ts.map +1 -0
  25. package/dist/sources/directory.js +57 -0
  26. package/dist/sources/directory.js.map +1 -0
  27. package/dist/sources/file.d.ts +15 -0
  28. package/dist/sources/file.d.ts.map +1 -0
  29. package/dist/sources/file.js +30 -0
  30. package/dist/sources/file.js.map +1 -0
  31. package/dist/sources/inline.d.ts +15 -0
  32. package/dist/sources/inline.d.ts.map +1 -0
  33. package/dist/sources/inline.js +21 -0
  34. package/dist/sources/inline.js.map +1 -0
  35. package/dist/sources/url.d.ts +20 -0
  36. package/dist/sources/url.d.ts.map +1 -0
  37. package/dist/sources/url.js +65 -0
  38. package/dist/sources/url.js.map +1 -0
  39. package/dist/types.d.ts +111 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +21 -0
  42. package/dist/types.js.map +1 -0
  43. package/package.json +60 -0
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @magnolia/skill-loader - SkillLoader Class
3
+ *
4
+ * The main entry point for loading and filtering skills.
5
+ */
6
+ import { Skill, SkillContext, SkillSource, SkillLoaderOptions, PromptOptions } from './types.js';
7
+ /**
8
+ * SkillLoader - loads, caches, and filters AI prompt skills.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const loader = new SkillLoader()
13
+ * .addDirectory('./skills')
14
+ * .addSkills([customSkill]);
15
+ *
16
+ * const skills = await loader.load({ target: 'freemarker' });
17
+ * ```
18
+ */
19
+ export declare class SkillLoader {
20
+ private sources;
21
+ private options;
22
+ private cache;
23
+ constructor(options?: SkillLoaderOptions);
24
+ /**
25
+ * Add a skill source to the loader.
26
+ * Sources are loaded in order; later sources can override earlier ones by name.
27
+ */
28
+ addSource(source: SkillSource): this;
29
+ /**
30
+ * Add inline skills directly.
31
+ * Convenience method for addSource({ type: 'inline', skills }).
32
+ */
33
+ addSkills(skills: Skill[]): this;
34
+ /**
35
+ * Add a directory of skill files.
36
+ * Convenience method for addSource({ type: 'directory', path, pattern }).
37
+ */
38
+ addDirectory(path: string, pattern?: string): this;
39
+ /**
40
+ * Add a single skill file.
41
+ * Convenience method for addSource({ type: 'file', path }).
42
+ */
43
+ addFile(path: string): this;
44
+ /**
45
+ * Add a URL source for remote skills.
46
+ * Convenience method for addSource({ type: 'url', url, headers }).
47
+ */
48
+ addUrl(url: string, headers?: Record<string, string>): this;
49
+ /**
50
+ * Load all skills from configured sources.
51
+ * Results are cached until clearCache() is called or TTL expires.
52
+ */
53
+ loadAll(): Promise<Skill[]>;
54
+ /**
55
+ * Load skills filtered by context.
56
+ * This is the primary method for getting relevant skills.
57
+ */
58
+ load(context: SkillContext): Promise<Skill[]>;
59
+ /**
60
+ * Get a single skill by name.
61
+ */
62
+ get(name: string): Promise<Skill | undefined>;
63
+ /**
64
+ * Clear the internal cache, forcing reload on next load().
65
+ */
66
+ clearCache(): void;
67
+ /**
68
+ * Get combined prompt content from filtered skills.
69
+ * Convenience method that loads and concatenates skill content.
70
+ */
71
+ getPrompt(context: SkillContext, options?: PromptOptions): Promise<string>;
72
+ /**
73
+ * Load skills from a single source.
74
+ */
75
+ private loadSource;
76
+ }
77
+ /**
78
+ * Standalone function to load skills from a directory with optional context filtering.
79
+ */
80
+ export declare function loadSkills(sources: SkillSource[], context?: SkillContext): Promise<Skill[]>;
81
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,EACL,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,aAAa,EAEd,MAAM,YAAY,CAAC;AAkBpB;;;;;;;;;;;GAWG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,KAAK,CAA2B;gBAE5B,OAAO,GAAE,kBAAuB;IAQ5C;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMpC;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAIhC;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAQlD;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAI3D;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAgCjC;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAmBnD;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAKnD;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;;OAGG;IACG,SAAS,CACb,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC;IA+BlB;;OAEG;YACW,UAAU;CAwBzB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,KAAK,EAAE,CAAC,CAYlB"}
package/dist/loader.js ADDED
@@ -0,0 +1,192 @@
1
+ /**
2
+ * @magnolia/skill-loader - SkillLoader Class
3
+ *
4
+ * The main entry point for loading and filtering skills.
5
+ */
6
+ import { SkillLoaderError, } from './types.js';
7
+ import { filterSkills } from './filter.js';
8
+ import { loadSkillsFromDirectory, DEFAULT_PATTERN, } from './sources/directory.js';
9
+ import { loadSkillFromFile } from './sources/file.js';
10
+ import { processInlineSkills } from './sources/inline.js';
11
+ import { loadSkillsFromUrl } from './sources/url.js';
12
+ /**
13
+ * SkillLoader - loads, caches, and filters AI prompt skills.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const loader = new SkillLoader()
18
+ * .addDirectory('./skills')
19
+ * .addSkills([customSkill]);
20
+ *
21
+ * const skills = await loader.load({ target: 'freemarker' });
22
+ * ```
23
+ */
24
+ export class SkillLoader {
25
+ sources = [];
26
+ options;
27
+ cache = null;
28
+ constructor(options = {}) {
29
+ this.options = {
30
+ defaultPattern: DEFAULT_PATTERN,
31
+ cacheTtl: 0,
32
+ ...options,
33
+ };
34
+ }
35
+ /**
36
+ * Add a skill source to the loader.
37
+ * Sources are loaded in order; later sources can override earlier ones by name.
38
+ */
39
+ addSource(source) {
40
+ this.sources.push(source);
41
+ this.clearCache();
42
+ return this;
43
+ }
44
+ /**
45
+ * Add inline skills directly.
46
+ * Convenience method for addSource({ type: 'inline', skills }).
47
+ */
48
+ addSkills(skills) {
49
+ return this.addSource({ type: 'inline', skills });
50
+ }
51
+ /**
52
+ * Add a directory of skill files.
53
+ * Convenience method for addSource({ type: 'directory', path, pattern }).
54
+ */
55
+ addDirectory(path, pattern) {
56
+ return this.addSource({
57
+ type: 'directory',
58
+ path,
59
+ pattern: pattern || this.options.defaultPattern,
60
+ });
61
+ }
62
+ /**
63
+ * Add a single skill file.
64
+ * Convenience method for addSource({ type: 'file', path }).
65
+ */
66
+ addFile(path) {
67
+ return this.addSource({ type: 'file', path });
68
+ }
69
+ /**
70
+ * Add a URL source for remote skills.
71
+ * Convenience method for addSource({ type: 'url', url, headers }).
72
+ */
73
+ addUrl(url, headers) {
74
+ return this.addSource({ type: 'url', url, headers });
75
+ }
76
+ /**
77
+ * Load all skills from configured sources.
78
+ * Results are cached until clearCache() is called or TTL expires.
79
+ */
80
+ async loadAll() {
81
+ // Check cache
82
+ if (this.cache) {
83
+ const cacheTtl = this.options.cacheTtl ?? 0;
84
+ if (cacheTtl === 0 || Date.now() - this.cache.timestamp < cacheTtl) {
85
+ return this.cache.skills;
86
+ }
87
+ }
88
+ // Load from all sources
89
+ const skillsMap = new Map();
90
+ for (const source of this.sources) {
91
+ const sourceSkills = await this.loadSource(source);
92
+ // Later sources override earlier ones by name
93
+ for (const skill of sourceSkills) {
94
+ skillsMap.set(skill.name, skill);
95
+ }
96
+ }
97
+ const skills = Array.from(skillsMap.values());
98
+ // Cache the results
99
+ this.cache = {
100
+ skills,
101
+ timestamp: Date.now(),
102
+ };
103
+ return skills;
104
+ }
105
+ /**
106
+ * Load skills filtered by context.
107
+ * This is the primary method for getting relevant skills.
108
+ */
109
+ async load(context) {
110
+ const allSkills = await this.loadAll();
111
+ let filtered = filterSkills(allSkills, context);
112
+ // Apply custom filter if provided
113
+ if (this.options.customFilter) {
114
+ filtered = filtered.filter((skill) => this.options.customFilter(skill, context));
115
+ }
116
+ // Apply custom sort if provided
117
+ if (this.options.customSort) {
118
+ filtered = filtered.sort(this.options.customSort);
119
+ }
120
+ return filtered;
121
+ }
122
+ /**
123
+ * Get a single skill by name.
124
+ */
125
+ async get(name) {
126
+ const allSkills = await this.loadAll();
127
+ return allSkills.find((skill) => skill.name === name);
128
+ }
129
+ /**
130
+ * Clear the internal cache, forcing reload on next load().
131
+ */
132
+ clearCache() {
133
+ this.cache = null;
134
+ }
135
+ /**
136
+ * Get combined prompt content from filtered skills.
137
+ * Convenience method that loads and concatenates skill content.
138
+ */
139
+ async getPrompt(context, options = {}) {
140
+ const { separator = '\n\n---\n\n', includeHeaders = true, headerFormat = '## {name}', maxLength, } = options;
141
+ const skills = await this.load(context);
142
+ const parts = [];
143
+ for (const skill of skills) {
144
+ if (includeHeaders) {
145
+ const header = headerFormat.replace('{name}', skill.name);
146
+ parts.push(`${header}\n\n${skill.content}`);
147
+ }
148
+ else {
149
+ parts.push(skill.content);
150
+ }
151
+ }
152
+ let result = parts.join(separator);
153
+ // Truncate if maxLength is specified
154
+ if (maxLength && result.length > maxLength) {
155
+ result = result.slice(0, maxLength) + '\n\n[truncated]';
156
+ }
157
+ return result;
158
+ }
159
+ /**
160
+ * Load skills from a single source.
161
+ */
162
+ async loadSource(source) {
163
+ switch (source.type) {
164
+ case 'directory':
165
+ return loadSkillsFromDirectory(source.path, source.pattern);
166
+ case 'file':
167
+ return [await loadSkillFromFile(source.path)];
168
+ case 'inline':
169
+ return processInlineSkills(source.skills);
170
+ case 'url':
171
+ return loadSkillsFromUrl(source.url, source.headers);
172
+ case 'custom':
173
+ return source.loader();
174
+ default:
175
+ throw new SkillLoaderError(`Unknown source type: ${source.type}`, 'SOURCE_ERROR');
176
+ }
177
+ }
178
+ }
179
+ /**
180
+ * Standalone function to load skills from a directory with optional context filtering.
181
+ */
182
+ export async function loadSkills(sources, context) {
183
+ const loader = new SkillLoader();
184
+ for (const source of sources) {
185
+ loader.addSource(source);
186
+ }
187
+ if (context) {
188
+ return loader.load(context);
189
+ }
190
+ return loader.loadAll();
191
+ }
192
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * SkillManager - High-level API for managing skills from multiple sources.
3
+ *
4
+ * This is a reusable component that can be used in any application that needs
5
+ * to manage skills with configurable loading order and priority.
6
+ */
7
+ import type { Skill, SkillContext, SkillLoaderOptions, PromptOptions } from "./types.js";
8
+ /**
9
+ * A skill directory with optional priority.
10
+ * Higher priority = loaded later = overrides earlier directories.
11
+ */
12
+ export interface SkillDirectory {
13
+ path: string;
14
+ priority?: number;
15
+ }
16
+ /**
17
+ * Logger interface for debug output.
18
+ */
19
+ export interface SkillManagerLogger {
20
+ debug: (message: string, meta?: Record<string, unknown>) => void;
21
+ }
22
+ /**
23
+ * Options for SkillManager initialization.
24
+ */
25
+ export interface SkillManagerOptions extends SkillLoaderOptions {
26
+ /**
27
+ * Ordered list of skill directories to load.
28
+ * Later directories override earlier ones by skill name.
29
+ * If not provided, no directories are loaded by default.
30
+ */
31
+ directories?: SkillDirectory[];
32
+ /**
33
+ * Whether to enable skill loading (default: true).
34
+ * When disabled, all methods return empty results.
35
+ */
36
+ enabled?: boolean;
37
+ /**
38
+ * Optional logger for debug output.
39
+ * If provided, detailed information about skill loading will be logged.
40
+ */
41
+ logger?: SkillManagerLogger;
42
+ }
43
+ /**
44
+ * Skill info for listing.
45
+ */
46
+ export interface SkillInfo {
47
+ name: string;
48
+ description?: string;
49
+ targets?: string[];
50
+ tags?: string[];
51
+ priority?: number;
52
+ }
53
+ /**
54
+ * SkillManager provides a high-level API for managing skills from multiple sources
55
+ * with configurable loading order. This is a reusable component that can be used
56
+ * in any application that needs to manage skills.
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * const manager = new SkillManager({
61
+ * directories: [
62
+ * { path: './plugin-skills', priority: 1 },
63
+ * { path: '~/.app/skills', priority: 2 },
64
+ * { path: './project/skills', priority: 3 }
65
+ * ],
66
+ * cacheTtl: 60000
67
+ * })
68
+ *
69
+ * const prompt = await manager.getPrompt({ target: 'freemarker' })
70
+ * ```
71
+ */
72
+ export declare class SkillManager {
73
+ private loader;
74
+ private directories;
75
+ private enabled;
76
+ private initialized;
77
+ private cacheTtl;
78
+ private logger?;
79
+ constructor(options?: SkillManagerOptions);
80
+ /**
81
+ * Register a skill directory with optional priority.
82
+ * Higher priority directories override lower priority ones.
83
+ * Directories are loaded in priority order (lowest first).
84
+ */
85
+ registerSkillDirectory(path: string, priority?: number): void;
86
+ /**
87
+ * Initialize all skill sources in priority order.
88
+ * Called lazily on first load or after source changes.
89
+ */
90
+ private initializeSources;
91
+ /**
92
+ * Load all skills without filtering.
93
+ */
94
+ loadAll(): Promise<Skill[]>;
95
+ /**
96
+ * Load skills filtered by context.
97
+ */
98
+ load(context: SkillContext): Promise<Skill[]>;
99
+ /**
100
+ * Get a single skill by name.
101
+ */
102
+ get(name: string): Promise<Skill | undefined>;
103
+ /**
104
+ * Get combined prompt from filtered skills.
105
+ */
106
+ getPrompt(context: SkillContext, options?: PromptOptions): Promise<string>;
107
+ /**
108
+ * List all loaded skills with metadata.
109
+ */
110
+ listSkills(): Promise<SkillInfo[]>;
111
+ /**
112
+ * Clear the skills cache to force reload.
113
+ */
114
+ clearCache(): void;
115
+ /**
116
+ * Get all registered directories with their priorities.
117
+ */
118
+ getDirectories(): Array<{
119
+ path: string;
120
+ priority: number;
121
+ }>;
122
+ /**
123
+ * Get statistics about registered directories.
124
+ */
125
+ getStats(): {
126
+ totalDirectories: number;
127
+ enabledDirectories: number;
128
+ enabled: boolean;
129
+ };
130
+ }
131
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAExF;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CACjE;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D;;;;OAIG;IACH,WAAW,CAAC,EAAE,cAAc,EAAE,CAAA;IAE9B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;OAGG;IACH,MAAM,CAAC,EAAE,kBAAkB,CAAA;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,MAAM,CAAC,CAAoB;gBAEvB,OAAO,GAAE,mBAAwB;IA2B7C;;;;OAIG;IACH,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IA0B7D;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAmCzB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAqBjC;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAkBnD;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IASnD;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAoChF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAexC;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACH,cAAc,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAM3D;;OAEG;IACH,QAAQ,IAAI;QACV,gBAAgB,EAAE,MAAM,CAAA;QACxB,kBAAkB,EAAE,MAAM,CAAA;QAC1B,OAAO,EAAE,OAAO,CAAA;KACjB;CASF"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * SkillManager - High-level API for managing skills from multiple sources.
3
+ *
4
+ * This is a reusable component that can be used in any application that needs
5
+ * to manage skills with configurable loading order and priority.
6
+ */
7
+ import { existsSync } from "fs";
8
+ import { SkillLoader } from "./loader.js";
9
+ /**
10
+ * SkillManager provides a high-level API for managing skills from multiple sources
11
+ * with configurable loading order. This is a reusable component that can be used
12
+ * in any application that needs to manage skills.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const manager = new SkillManager({
17
+ * directories: [
18
+ * { path: './plugin-skills', priority: 1 },
19
+ * { path: '~/.app/skills', priority: 2 },
20
+ * { path: './project/skills', priority: 3 }
21
+ * ],
22
+ * cacheTtl: 60000
23
+ * })
24
+ *
25
+ * const prompt = await manager.getPrompt({ target: 'freemarker' })
26
+ * ```
27
+ */
28
+ export class SkillManager {
29
+ loader;
30
+ directories = new Map(); // path -> priority
31
+ enabled;
32
+ initialized = false;
33
+ cacheTtl;
34
+ logger;
35
+ constructor(options = {}) {
36
+ this.enabled = options.enabled ?? true;
37
+ this.cacheTtl = options.cacheTtl ?? 60000;
38
+ this.logger = options.logger;
39
+ this.loader = new SkillLoader({
40
+ cacheTtl: this.cacheTtl,
41
+ customFilter: options.customFilter,
42
+ customSort: options.customSort,
43
+ defaultPattern: options.defaultPattern,
44
+ });
45
+ this.logger?.debug("SkillManager created", {
46
+ enabled: this.enabled,
47
+ cacheTtl: this.cacheTtl,
48
+ });
49
+ // Add directories in priority order (lowest to highest)
50
+ if (options.directories) {
51
+ const sorted = [...options.directories].sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
52
+ for (const dir of sorted) {
53
+ this.registerSkillDirectory(dir.path, dir.priority);
54
+ }
55
+ }
56
+ }
57
+ /**
58
+ * Register a skill directory with optional priority.
59
+ * Higher priority directories override lower priority ones.
60
+ * Directories are loaded in priority order (lowest first).
61
+ */
62
+ registerSkillDirectory(path, priority) {
63
+ if (!this.enabled) {
64
+ this.logger?.debug("Skipping directory registration (disabled)", { path });
65
+ return;
66
+ }
67
+ const actualPriority = priority ?? 0;
68
+ const exists = existsSync(path);
69
+ // If already registered, remove and re-add to maintain order
70
+ if (this.directories.has(path)) {
71
+ this.directories.delete(path);
72
+ }
73
+ this.directories.set(path, actualPriority);
74
+ this.logger?.debug("Registered skill directory", {
75
+ path,
76
+ priority: actualPriority,
77
+ exists,
78
+ });
79
+ // Mark as needing reinitialization
80
+ this.initialized = false;
81
+ }
82
+ /**
83
+ * Initialize all skill sources in priority order.
84
+ * Called lazily on first load or after source changes.
85
+ */
86
+ initializeSources() {
87
+ if (this.initialized || !this.enabled) {
88
+ return;
89
+ }
90
+ this.logger?.debug("Initializing skill sources");
91
+ // Create a fresh loader to ensure clean state
92
+ this.loader = new SkillLoader({ cacheTtl: this.cacheTtl });
93
+ // Sort by priority and add to loader
94
+ const sorted = Array.from(this.directories.entries()).sort(([, a], [, b]) => a - b);
95
+ const addedDirs = [];
96
+ const skippedDirs = [];
97
+ for (const [path, priority] of sorted) {
98
+ if (existsSync(path)) {
99
+ this.loader.addDirectory(path);
100
+ addedDirs.push(path);
101
+ this.logger?.debug("Added skill directory to loader", { path, priority });
102
+ }
103
+ else {
104
+ skippedDirs.push(path);
105
+ this.logger?.debug("Skipped non-existent directory", { path, priority });
106
+ }
107
+ }
108
+ this.logger?.debug("Skill sources initialized", {
109
+ addedDirectories: addedDirs.length,
110
+ skippedDirectories: skippedDirs.length,
111
+ });
112
+ this.initialized = true;
113
+ }
114
+ /**
115
+ * Load all skills without filtering.
116
+ */
117
+ async loadAll() {
118
+ if (!this.enabled) {
119
+ this.logger?.debug("Skipping loadAll (disabled)");
120
+ return [];
121
+ }
122
+ this.initializeSources();
123
+ const skills = await this.loader.loadAll();
124
+ this.logger?.debug("Loaded all skills", {
125
+ skills: skills.map((s) => ({
126
+ name: s.name,
127
+ targets: s.metadata?.targets,
128
+ tags: s.metadata?.tags,
129
+ })),
130
+ count: skills.length,
131
+ });
132
+ return skills;
133
+ }
134
+ /**
135
+ * Load skills filtered by context.
136
+ */
137
+ async load(context) {
138
+ if (!this.enabled) {
139
+ this.logger?.debug("Skipping skill load (disabled)");
140
+ return [];
141
+ }
142
+ this.initializeSources();
143
+ const skills = await this.loader.load(context);
144
+ this.logger?.debug("Loaded skills with context filter", {
145
+ context,
146
+ matchedSkills: skills.map((s) => s.name),
147
+ count: skills.length,
148
+ });
149
+ return skills;
150
+ }
151
+ /**
152
+ * Get a single skill by name.
153
+ */
154
+ async get(name) {
155
+ if (!this.enabled) {
156
+ return undefined;
157
+ }
158
+ this.initializeSources();
159
+ return this.loader.get(name);
160
+ }
161
+ /**
162
+ * Get combined prompt from filtered skills.
163
+ */
164
+ async getPrompt(context, options) {
165
+ if (!this.enabled) {
166
+ this.logger?.debug("Skipping getPrompt (disabled)");
167
+ return "";
168
+ }
169
+ this.initializeSources();
170
+ // First load skills to log which ones matched
171
+ const skills = await this.loader.load(context);
172
+ this.logger?.debug("Getting prompt for context", {
173
+ context,
174
+ matchedSkills: skills.map((s) => ({
175
+ name: s.name,
176
+ targets: s.metadata?.targets,
177
+ tags: s.metadata?.tags,
178
+ })),
179
+ count: skills.length,
180
+ });
181
+ const prompt = await this.loader.getPrompt(context, {
182
+ includeHeaders: true,
183
+ headerFormat: "## {name}",
184
+ separator: "\n\n---\n\n",
185
+ ...options,
186
+ });
187
+ this.logger?.debug("Generated prompt", {
188
+ skillNames: skills.map((s) => s.name),
189
+ promptLength: prompt.length,
190
+ });
191
+ return prompt;
192
+ }
193
+ /**
194
+ * List all loaded skills with metadata.
195
+ */
196
+ async listSkills() {
197
+ if (!this.enabled) {
198
+ return [];
199
+ }
200
+ const skills = await this.loadAll();
201
+ return skills.map((s) => ({
202
+ name: s.name,
203
+ description: s.description,
204
+ targets: s.metadata?.targets,
205
+ tags: s.metadata?.tags,
206
+ priority: s.metadata?.priority,
207
+ }));
208
+ }
209
+ /**
210
+ * Clear the skills cache to force reload.
211
+ */
212
+ clearCache() {
213
+ this.loader.clearCache();
214
+ this.initialized = false;
215
+ }
216
+ /**
217
+ * Get all registered directories with their priorities.
218
+ */
219
+ getDirectories() {
220
+ return Array.from(this.directories.entries())
221
+ .map(([path, priority]) => ({ path, priority }))
222
+ .sort((a, b) => a.priority - b.priority);
223
+ }
224
+ /**
225
+ * Get statistics about registered directories.
226
+ */
227
+ getStats() {
228
+ const enabledDirs = Array.from(this.directories.keys()).filter((path) => existsSync(path));
229
+ return {
230
+ totalDirectories: this.directories.size,
231
+ enabledDirectories: enabledDirs.length,
232
+ enabled: this.enabled,
233
+ };
234
+ }
235
+ }
236
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}