@0xmaxma/claude-gateway 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +791 -0
- package/config.template.json +87 -0
- package/dist/agent/context-isolation.d.ts +28 -0
- package/dist/agent/context-isolation.d.ts.map +1 -0
- package/dist/agent/context-isolation.js +80 -0
- package/dist/agent/context-isolation.js.map +1 -0
- package/dist/agent/runner.d.ts +211 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +1802 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/workspace-loader.d.ts +31 -0
- package/dist/agent/workspace-loader.d.ts.map +1 -0
- package/dist/agent/workspace-loader.js +207 -0
- package/dist/agent/workspace-loader.js.map +1 -0
- package/dist/api/auth.d.ts +25 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +77 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/cron-router.d.ts +22 -0
- package/dist/api/cron-router.d.ts.map +1 -0
- package/dist/api/cron-router.js +197 -0
- package/dist/api/cron-router.js.map +1 -0
- package/dist/api/gateway-router.d.ts +52 -0
- package/dist/api/gateway-router.d.ts.map +1 -0
- package/dist/api/gateway-router.js +215 -0
- package/dist/api/gateway-router.js.map +1 -0
- package/dist/api/router.d.ts +5 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +1098 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/skills-router.d.ts +5 -0
- package/dist/api/skills-router.d.ts.map +1 -0
- package/dist/api/skills-router.js +424 -0
- package/dist/api/skills-router.js.map +1 -0
- package/dist/api/workspace-router.d.ts +4 -0
- package/dist/api/workspace-router.d.ts.map +1 -0
- package/dist/api/workspace-router.js +149 -0
- package/dist/api/workspace-router.js.map +1 -0
- package/dist/config/loader.d.ts +16 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +235 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/migrator.d.ts +70 -0
- package/dist/config/migrator.d.ts.map +1 -0
- package/dist/config/migrator.js +343 -0
- package/dist/config/migrator.js.map +1 -0
- package/dist/config/watcher.d.ts +30 -0
- package/dist/config/watcher.d.ts.map +1 -0
- package/dist/config/watcher.js +170 -0
- package/dist/config/watcher.js.map +1 -0
- package/dist/cron/manager.d.ts +48 -0
- package/dist/cron/manager.d.ts.map +1 -0
- package/dist/cron/manager.js +580 -0
- package/dist/cron/manager.js.map +1 -0
- package/dist/cron/scheduler.d.ts +50 -0
- package/dist/cron/scheduler.d.ts.map +1 -0
- package/dist/cron/scheduler.js +231 -0
- package/dist/cron/scheduler.js.map +1 -0
- package/dist/discord/receiver.d.ts +17 -0
- package/dist/discord/receiver.d.ts.map +1 -0
- package/dist/discord/receiver.js +108 -0
- package/dist/discord/receiver.js.map +1 -0
- package/dist/heartbeat/history.d.ts +24 -0
- package/dist/heartbeat/history.d.ts.map +1 -0
- package/dist/heartbeat/history.js +50 -0
- package/dist/heartbeat/history.js.map +1 -0
- package/dist/heartbeat/parser.d.ts +26 -0
- package/dist/heartbeat/parser.d.ts.map +1 -0
- package/dist/heartbeat/parser.js +283 -0
- package/dist/heartbeat/parser.js.map +1 -0
- package/dist/history/cleanup.d.ts +21 -0
- package/dist/history/cleanup.d.ts.map +1 -0
- package/dist/history/cleanup.js +171 -0
- package/dist/history/cleanup.js.map +1 -0
- package/dist/history/db.d.ts +27 -0
- package/dist/history/db.d.ts.map +1 -0
- package/dist/history/db.js +323 -0
- package/dist/history/db.js.map +1 -0
- package/dist/history/media-store.d.ts +27 -0
- package/dist/history/media-store.d.ts.map +1 -0
- package/dist/history/media-store.js +158 -0
- package/dist/history/media-store.js.map +1 -0
- package/dist/history/types.d.ts +62 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +3 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +483 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +81 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory/manager.d.ts +45 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +178 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/session/compactor.d.ts +22 -0
- package/dist/session/compactor.d.ts.map +1 -0
- package/dist/session/compactor.js +151 -0
- package/dist/session/compactor.js.map +1 -0
- package/dist/session/process.d.ts +76 -0
- package/dist/session/process.d.ts.map +1 -0
- package/dist/session/process.js +729 -0
- package/dist/session/process.js.map +1 -0
- package/dist/session/store.d.ts +102 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +533 -0
- package/dist/session/store.js.map +1 -0
- package/dist/skills/index.d.ts +9 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +15 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/invoker.d.ts +16 -0
- package/dist/skills/invoker.d.ts.map +1 -0
- package/dist/skills/invoker.js +36 -0
- package/dist/skills/invoker.js.map +1 -0
- package/dist/skills/loader.d.ts +23 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +183 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/parser.d.ts +55 -0
- package/dist/skills/parser.d.ts.map +1 -0
- package/dist/skills/parser.js +178 -0
- package/dist/skills/parser.js.map +1 -0
- package/dist/skills/sync.d.ts +10 -0
- package/dist/skills/sync.d.ts.map +1 -0
- package/dist/skills/sync.js +130 -0
- package/dist/skills/sync.js.map +1 -0
- package/dist/skills/watcher.d.ts +16 -0
- package/dist/skills/watcher.d.ts.map +1 -0
- package/dist/skills/watcher.js +25 -0
- package/dist/skills/watcher.js.map +1 -0
- package/dist/telegram/markdown.d.ts +25 -0
- package/dist/telegram/markdown.d.ts.map +1 -0
- package/dist/telegram/markdown.js +237 -0
- package/dist/telegram/markdown.js.map +1 -0
- package/dist/telegram/receiver.d.ts +17 -0
- package/dist/telegram/receiver.d.ts.map +1 -0
- package/dist/telegram/receiver.js +104 -0
- package/dist/telegram/receiver.js.map +1 -0
- package/dist/types.d.ts +224 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/web-ui.d.ts +6 -0
- package/dist/ui/web-ui.d.ts.map +1 -0
- package/dist/ui/web-ui.js +227 -0
- package/dist/ui/web-ui.js.map +1 -0
- package/dist/watch/factory.d.ts +26 -0
- package/dist/watch/factory.d.ts.map +1 -0
- package/dist/watch/factory.js +43 -0
- package/dist/watch/factory.js.map +1 -0
- package/dist/webhook/manager.d.ts +34 -0
- package/dist/webhook/manager.d.ts.map +1 -0
- package/dist/webhook/manager.js +120 -0
- package/dist/webhook/manager.js.map +1 -0
- package/mcp/bun.lock +264 -0
- package/mcp/channel-manager.ts +115 -0
- package/mcp/package.json +15 -0
- package/mcp/router.ts +69 -0
- package/mcp/server.ts +129 -0
- package/mcp/tools/agent/handlers.ts +578 -0
- package/mcp/tools/agent/module.ts +163 -0
- package/mcp/tools/browser/module.ts +321 -0
- package/mcp/tools/browser/skills/open-browser/SKILL.md +89 -0
- package/mcp/tools/cron/client.ts +65 -0
- package/mcp/tools/cron/module.ts +158 -0
- package/mcp/tools/cron/skills/cron/SKILL.md +46 -0
- package/mcp/tools/discord/access.ts +197 -0
- package/mcp/tools/discord/client.ts +31 -0
- package/mcp/tools/discord/commands.ts +48 -0
- package/mcp/tools/discord/inbound.ts +53 -0
- package/mcp/tools/discord/module.ts +442 -0
- package/mcp/tools/discord/outbound.ts +90 -0
- package/mcp/tools/discord/receiver-server.ts +58 -0
- package/mcp/tools/discord/skills/access/SKILL.md +86 -0
- package/mcp/tools/discord/skills/configure/SKILL.md +53 -0
- package/mcp/tools/discord/threading.ts +37 -0
- package/mcp/tools/discord/types.ts +106 -0
- package/mcp/tools/skills/handlers.ts +196 -0
- package/mcp/tools/skills/module.ts +163 -0
- package/mcp/tools/telegram/module.ts +454 -0
- package/mcp/tools/telegram/pure.ts +224 -0
- package/mcp/tools/telegram/receiver-server.ts +1656 -0
- package/mcp/tools/telegram/skills/access/SKILL.md +169 -0
- package/mcp/tools/telegram/skills/configure/SKILL.md +118 -0
- package/mcp/tools/telegram/typing.ts +327 -0
- package/mcp/types.ts +128 -0
- package/package.json +62 -0
- package/resource/claude_gateway.svg +112 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type SkillDefinition } from './parser';
|
|
2
|
+
export interface SkillRegistry {
|
|
3
|
+
skills: Map<string, SkillDefinition>;
|
|
4
|
+
}
|
|
5
|
+
export interface LoadSkillsOptions {
|
|
6
|
+
workspaceDir: string;
|
|
7
|
+
mcpToolsDir?: string;
|
|
8
|
+
sharedSkillsDir?: string;
|
|
9
|
+
logger?: {
|
|
10
|
+
warn: (msg: string) => void;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Load all skills from workspace, module, and shared directories.
|
|
15
|
+
* Priority: workspace > module > shared (workspace overrides same-name skills).
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadSkills(opts: LoadSkillsOptions): SkillRegistry;
|
|
18
|
+
/**
|
|
19
|
+
* Render the AVAILABLE SKILLS section for the system prompt.
|
|
20
|
+
* Groups skills by source: workspace, module, shared.
|
|
21
|
+
*/
|
|
22
|
+
export declare function renderSkillsSection(registry: SkillRegistry): string;
|
|
23
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,KAAK,eAAe,EAA0B,MAAM,UAAU,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CAC1C;AAiGD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAuCjE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAwCnE"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.loadSkills = loadSkills;
|
|
7
|
+
exports.renderSkillsSection = renderSkillsSection;
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const parser_1 = require("./parser");
|
|
11
|
+
/**
|
|
12
|
+
* Scan a directory for skill subdirectories containing SKILL.md.
|
|
13
|
+
* Each subdirectory name is the skill name used for directory-based discovery.
|
|
14
|
+
*/
|
|
15
|
+
function scanSkillDir(dir, source, modulePrefix) {
|
|
16
|
+
if (!fs_1.default.existsSync(dir))
|
|
17
|
+
return [];
|
|
18
|
+
const skills = [];
|
|
19
|
+
let entries;
|
|
20
|
+
try {
|
|
21
|
+
entries = fs_1.default.readdirSync(dir).sort();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
if (entry.startsWith('.') || entry === 'node_modules')
|
|
28
|
+
continue;
|
|
29
|
+
const skillDir = path_1.default.join(dir, entry);
|
|
30
|
+
const skillFile = path_1.default.join(skillDir, 'SKILL.md');
|
|
31
|
+
try {
|
|
32
|
+
const stat = fs_1.default.statSync(skillDir);
|
|
33
|
+
if (!stat.isDirectory())
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (!fs_1.default.existsSync(skillFile))
|
|
40
|
+
continue;
|
|
41
|
+
try {
|
|
42
|
+
const raw = fs_1.default.readFileSync(skillFile, 'utf-8');
|
|
43
|
+
const opts = { filePath: skillFile, source, modulePrefix };
|
|
44
|
+
const skill = (0, parser_1.parseSkill)(raw, opts);
|
|
45
|
+
if (skill)
|
|
46
|
+
skills.push(skill);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Skip unreadable files
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return skills;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Scan MCP tool module directories for skills.
|
|
56
|
+
* Structure: mcpToolsDir/{module}/skills/{skill-name}/SKILL.md
|
|
57
|
+
* Skills are prefixed with {module}: in the registry.
|
|
58
|
+
*/
|
|
59
|
+
function scanModuleSkills(mcpToolsDir) {
|
|
60
|
+
if (!fs_1.default.existsSync(mcpToolsDir))
|
|
61
|
+
return [];
|
|
62
|
+
const skills = [];
|
|
63
|
+
let modules;
|
|
64
|
+
try {
|
|
65
|
+
modules = fs_1.default.readdirSync(mcpToolsDir).sort();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
for (const mod of modules) {
|
|
71
|
+
if (mod.startsWith('.') || mod === 'node_modules')
|
|
72
|
+
continue;
|
|
73
|
+
const skillsDir = path_1.default.join(mcpToolsDir, mod, 'skills');
|
|
74
|
+
const moduleSkills = scanSkillDir(skillsDir, 'module', mod);
|
|
75
|
+
skills.push(...moduleSkills);
|
|
76
|
+
}
|
|
77
|
+
return skills;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if required binaries are available in PATH.
|
|
81
|
+
*/
|
|
82
|
+
function checkBinAvailability(bins) {
|
|
83
|
+
const missing = [];
|
|
84
|
+
const pathDirs = (process.env.PATH || '').split(path_1.default.delimiter);
|
|
85
|
+
for (const bin of bins) {
|
|
86
|
+
const found = pathDirs.some((dir) => {
|
|
87
|
+
try {
|
|
88
|
+
const binPath = path_1.default.join(dir, bin);
|
|
89
|
+
fs_1.default.accessSync(binPath, fs_1.default.constants.X_OK);
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
if (!found)
|
|
97
|
+
missing.push(bin);
|
|
98
|
+
}
|
|
99
|
+
return missing;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Load all skills from workspace, module, and shared directories.
|
|
103
|
+
* Priority: workspace > module > shared (workspace overrides same-name skills).
|
|
104
|
+
*/
|
|
105
|
+
function loadSkills(opts) {
|
|
106
|
+
const registry = new Map();
|
|
107
|
+
const log = opts.logger || { warn: () => { } };
|
|
108
|
+
// 1. Shared skills (lowest priority, loaded first)
|
|
109
|
+
if (opts.sharedSkillsDir) {
|
|
110
|
+
const shared = scanSkillDir(opts.sharedSkillsDir, 'shared');
|
|
111
|
+
for (const skill of shared) {
|
|
112
|
+
registry.set(skill.name, skill);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// 2. Module skills (middle priority)
|
|
116
|
+
if (opts.mcpToolsDir) {
|
|
117
|
+
const moduleSkills = scanModuleSkills(opts.mcpToolsDir);
|
|
118
|
+
for (const skill of moduleSkills) {
|
|
119
|
+
const key = skill.modulePrefix ? `${skill.modulePrefix}:${skill.name}` : skill.name;
|
|
120
|
+
registry.set(key, skill);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// 3. Workspace skills (highest priority, overrides shared)
|
|
124
|
+
const workspaceSkillsDir = path_1.default.join(opts.workspaceDir, 'skills');
|
|
125
|
+
const workspaceSkills = scanSkillDir(workspaceSkillsDir, 'workspace');
|
|
126
|
+
for (const skill of workspaceSkills) {
|
|
127
|
+
registry.set(skill.name, skill);
|
|
128
|
+
}
|
|
129
|
+
// Warn about missing binary dependencies
|
|
130
|
+
for (const [key, skill] of registry) {
|
|
131
|
+
if (skill.requires?.bins) {
|
|
132
|
+
const missing = checkBinAvailability(skill.requires.bins);
|
|
133
|
+
if (missing.length > 0) {
|
|
134
|
+
log.warn(`Skill "${key}" requires missing binaries: ${missing.join(', ')}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return { skills: registry };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Render the AVAILABLE SKILLS section for the system prompt.
|
|
142
|
+
* Groups skills by source: workspace, module, shared.
|
|
143
|
+
*/
|
|
144
|
+
function renderSkillsSection(registry) {
|
|
145
|
+
if (registry.skills.size === 0)
|
|
146
|
+
return '';
|
|
147
|
+
const workspace = [];
|
|
148
|
+
const module = [];
|
|
149
|
+
const shared = [];
|
|
150
|
+
for (const [key, skill] of registry.skills) {
|
|
151
|
+
if (!skill.userInvocable)
|
|
152
|
+
continue;
|
|
153
|
+
const emoji = skill.emoji ? ` [${skill.emoji}]` : '';
|
|
154
|
+
const line = `/${key}: ${skill.description}${emoji}`;
|
|
155
|
+
if (skill.source === 'workspace')
|
|
156
|
+
workspace.push(line);
|
|
157
|
+
else if (skill.source === 'module')
|
|
158
|
+
module.push(line);
|
|
159
|
+
else
|
|
160
|
+
shared.push(line);
|
|
161
|
+
}
|
|
162
|
+
if (workspace.length === 0 && module.length === 0 && shared.length === 0)
|
|
163
|
+
return '';
|
|
164
|
+
const sections = [];
|
|
165
|
+
sections.push('Use /skill-name [args] to invoke a skill\n');
|
|
166
|
+
if (workspace.length > 0) {
|
|
167
|
+
sections.push('**Workspace Skills**');
|
|
168
|
+
sections.push(...workspace);
|
|
169
|
+
sections.push('');
|
|
170
|
+
}
|
|
171
|
+
if (module.length > 0) {
|
|
172
|
+
sections.push('**Module Skills**');
|
|
173
|
+
sections.push(...module);
|
|
174
|
+
sections.push('');
|
|
175
|
+
}
|
|
176
|
+
if (shared.length > 0) {
|
|
177
|
+
sections.push('**Shared Skills**');
|
|
178
|
+
sections.push(...shared);
|
|
179
|
+
sections.push('');
|
|
180
|
+
}
|
|
181
|
+
return sections.join('\n').trimEnd();
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface SkillRequires {
|
|
2
|
+
bins?: string[];
|
|
3
|
+
env?: string[];
|
|
4
|
+
plugins?: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface SkillInstallDescriptor {
|
|
7
|
+
id: string;
|
|
8
|
+
kind: 'brew' | 'python' | 'npm' | 'apt';
|
|
9
|
+
package?: string;
|
|
10
|
+
formula?: string;
|
|
11
|
+
bins?: string[];
|
|
12
|
+
label: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SkillDefinition {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
emoji?: string;
|
|
18
|
+
userInvocable: boolean;
|
|
19
|
+
allowedTools?: string[];
|
|
20
|
+
readWhen?: string[];
|
|
21
|
+
requires?: SkillRequires;
|
|
22
|
+
install?: SkillInstallDescriptor[];
|
|
23
|
+
primaryEnv?: string;
|
|
24
|
+
homepage?: string;
|
|
25
|
+
version?: string;
|
|
26
|
+
author?: string;
|
|
27
|
+
keywords?: string[];
|
|
28
|
+
content: string;
|
|
29
|
+
filePath: string;
|
|
30
|
+
source: 'workspace' | 'module' | 'shared';
|
|
31
|
+
modulePrefix?: string;
|
|
32
|
+
}
|
|
33
|
+
interface ParsedFrontmatter {
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Extract YAML frontmatter from a SKILL.md file.
|
|
38
|
+
* Frontmatter is the content between the first two `---` lines.
|
|
39
|
+
*/
|
|
40
|
+
export declare function extractFrontmatter(raw: string): {
|
|
41
|
+
frontmatter: ParsedFrontmatter;
|
|
42
|
+
body: string;
|
|
43
|
+
} | null;
|
|
44
|
+
export interface ParseSkillOptions {
|
|
45
|
+
filePath: string;
|
|
46
|
+
source: SkillDefinition['source'];
|
|
47
|
+
modulePrefix?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse a SKILL.md file content into a SkillDefinition.
|
|
51
|
+
* Returns null if the file is invalid (missing name/description, bad frontmatter).
|
|
52
|
+
*/
|
|
53
|
+
export declare function parseSkill(raw: string, opts: ParseSkillOptions): SkillDefinition | null;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/skills/parser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,iBAAiB;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,WAAW,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiBvG;AA0ED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,IAAI,CAiEvF"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.extractFrontmatter = extractFrontmatter;
|
|
7
|
+
exports.parseSkill = parseSkill;
|
|
8
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
9
|
+
/**
|
|
10
|
+
* Extract YAML frontmatter from a SKILL.md file.
|
|
11
|
+
* Frontmatter is the content between the first two `---` lines.
|
|
12
|
+
*/
|
|
13
|
+
function extractFrontmatter(raw) {
|
|
14
|
+
const trimmed = raw.trimStart();
|
|
15
|
+
if (!trimmed.startsWith('---'))
|
|
16
|
+
return null;
|
|
17
|
+
const end = trimmed.indexOf('\n---', 3);
|
|
18
|
+
if (end === -1)
|
|
19
|
+
return null;
|
|
20
|
+
const yamlBlock = trimmed.slice(3, end).trim();
|
|
21
|
+
const body = trimmed.slice(end + 4).trim();
|
|
22
|
+
try {
|
|
23
|
+
const parsed = js_yaml_1.default.load(yamlBlock);
|
|
24
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
25
|
+
return null;
|
|
26
|
+
return { frontmatter: parsed, body };
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve metadata from either `metadata.openclaw` or `metadata.clawdbot` namespace.
|
|
34
|
+
* Returns the resolved namespace object, or undefined if neither exists.
|
|
35
|
+
*/
|
|
36
|
+
function resolveMetadataNamespace(fm) {
|
|
37
|
+
const meta = fm.metadata;
|
|
38
|
+
if (typeof meta !== 'object' || meta === null)
|
|
39
|
+
return undefined;
|
|
40
|
+
const obj = meta;
|
|
41
|
+
// Prefer openclaw, fallback to clawdbot
|
|
42
|
+
for (const ns of ['openclaw', 'clawdbot']) {
|
|
43
|
+
const nsObj = obj[ns];
|
|
44
|
+
if (typeof nsObj === 'object' && nsObj !== null) {
|
|
45
|
+
return nsObj;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
function toStringArray(val) {
|
|
51
|
+
if (!Array.isArray(val))
|
|
52
|
+
return undefined;
|
|
53
|
+
const arr = val.filter((v) => typeof v === 'string');
|
|
54
|
+
return arr.length > 0 ? arr : undefined;
|
|
55
|
+
}
|
|
56
|
+
function parseRequires(nsMeta) {
|
|
57
|
+
if (!nsMeta)
|
|
58
|
+
return undefined;
|
|
59
|
+
const req = nsMeta.requires;
|
|
60
|
+
if (typeof req !== 'object' || req === null)
|
|
61
|
+
return undefined;
|
|
62
|
+
const r = req;
|
|
63
|
+
const result = {};
|
|
64
|
+
const bins = toStringArray(r.bins);
|
|
65
|
+
const env = toStringArray(r.env);
|
|
66
|
+
const plugins = toStringArray(r.plugins);
|
|
67
|
+
if (bins)
|
|
68
|
+
result.bins = bins;
|
|
69
|
+
if (env)
|
|
70
|
+
result.env = env;
|
|
71
|
+
if (plugins)
|
|
72
|
+
result.plugins = plugins;
|
|
73
|
+
return Object.keys(result).length > 0 ? result : undefined;
|
|
74
|
+
}
|
|
75
|
+
function parseInstall(nsMeta) {
|
|
76
|
+
if (!nsMeta)
|
|
77
|
+
return undefined;
|
|
78
|
+
const inst = nsMeta.install;
|
|
79
|
+
if (!Array.isArray(inst))
|
|
80
|
+
return undefined;
|
|
81
|
+
const descriptors = [];
|
|
82
|
+
for (const item of inst) {
|
|
83
|
+
if (typeof item !== 'object' || item === null)
|
|
84
|
+
continue;
|
|
85
|
+
const obj = item;
|
|
86
|
+
if (typeof obj.id !== 'string' || typeof obj.kind !== 'string' || typeof obj.label !== 'string')
|
|
87
|
+
continue;
|
|
88
|
+
const validKinds = ['brew', 'python', 'npm', 'apt'];
|
|
89
|
+
if (!validKinds.includes(obj.kind))
|
|
90
|
+
continue;
|
|
91
|
+
const desc = {
|
|
92
|
+
id: obj.id,
|
|
93
|
+
kind: obj.kind,
|
|
94
|
+
label: obj.label,
|
|
95
|
+
};
|
|
96
|
+
if (typeof obj.package === 'string')
|
|
97
|
+
desc.package = obj.package;
|
|
98
|
+
if (typeof obj.formula === 'string')
|
|
99
|
+
desc.formula = obj.formula;
|
|
100
|
+
const bins = toStringArray(obj.bins);
|
|
101
|
+
if (bins)
|
|
102
|
+
desc.bins = bins;
|
|
103
|
+
descriptors.push(desc);
|
|
104
|
+
}
|
|
105
|
+
return descriptors.length > 0 ? descriptors : undefined;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Parse a SKILL.md file content into a SkillDefinition.
|
|
109
|
+
* Returns null if the file is invalid (missing name/description, bad frontmatter).
|
|
110
|
+
*/
|
|
111
|
+
function parseSkill(raw, opts) {
|
|
112
|
+
const extracted = extractFrontmatter(raw);
|
|
113
|
+
if (!extracted)
|
|
114
|
+
return null;
|
|
115
|
+
const { frontmatter: fm, body } = extracted;
|
|
116
|
+
// Required: name
|
|
117
|
+
const name = typeof fm.name === 'string' ? fm.name : undefined;
|
|
118
|
+
if (!name)
|
|
119
|
+
return null;
|
|
120
|
+
// Description: from frontmatter or first line of body
|
|
121
|
+
const description = typeof fm.description === 'string' ? fm.description : undefined;
|
|
122
|
+
if (!description)
|
|
123
|
+
return null;
|
|
124
|
+
const nsMeta = resolveMetadataNamespace(fm);
|
|
125
|
+
const skill = {
|
|
126
|
+
name,
|
|
127
|
+
description,
|
|
128
|
+
content: raw,
|
|
129
|
+
filePath: opts.filePath,
|
|
130
|
+
source: opts.source,
|
|
131
|
+
userInvocable: fm['user-invocable'] !== false,
|
|
132
|
+
};
|
|
133
|
+
// Emoji
|
|
134
|
+
const emoji = nsMeta?.emoji;
|
|
135
|
+
if (typeof emoji === 'string')
|
|
136
|
+
skill.emoji = emoji;
|
|
137
|
+
// Requires
|
|
138
|
+
const requires = parseRequires(nsMeta);
|
|
139
|
+
if (requires)
|
|
140
|
+
skill.requires = requires;
|
|
141
|
+
// Install
|
|
142
|
+
const install = parseInstall(nsMeta);
|
|
143
|
+
if (install)
|
|
144
|
+
skill.install = install;
|
|
145
|
+
// allowed-tools (top-level or from metadata)
|
|
146
|
+
const allowedTools = fm['allowed-tools'];
|
|
147
|
+
if (typeof allowedTools === 'string') {
|
|
148
|
+
skill.allowedTools = [allowedTools];
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const arr = toStringArray(allowedTools);
|
|
152
|
+
if (arr)
|
|
153
|
+
skill.allowedTools = arr;
|
|
154
|
+
}
|
|
155
|
+
// read_when
|
|
156
|
+
const readWhen = toStringArray(fm.read_when);
|
|
157
|
+
if (readWhen)
|
|
158
|
+
skill.readWhen = readWhen;
|
|
159
|
+
// primaryEnv
|
|
160
|
+
const primaryEnv = nsMeta?.primaryEnv;
|
|
161
|
+
if (typeof primaryEnv === 'string')
|
|
162
|
+
skill.primaryEnv = primaryEnv;
|
|
163
|
+
// Optional display fields
|
|
164
|
+
if (typeof fm.homepage === 'string')
|
|
165
|
+
skill.homepage = fm.homepage;
|
|
166
|
+
if (typeof fm.version === 'string')
|
|
167
|
+
skill.version = fm.version;
|
|
168
|
+
if (typeof fm.author === 'string')
|
|
169
|
+
skill.author = fm.author;
|
|
170
|
+
const keywords = toStringArray(fm.keywords);
|
|
171
|
+
if (keywords)
|
|
172
|
+
skill.keywords = keywords;
|
|
173
|
+
// Module prefix
|
|
174
|
+
if (opts.modulePrefix)
|
|
175
|
+
skill.modulePrefix = opts.modulePrefix;
|
|
176
|
+
return skill;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/skills/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Syncs shared skills to the personal Claude skills directory (~/.claude/skills/).
|
|
3
|
+
* Skills synced from shared are marked with a .shared sentinel file so stale
|
|
4
|
+
* entries can be cleaned up when they are removed from shared-skills.
|
|
5
|
+
*/
|
|
6
|
+
export declare function syncSharedSkills(sharedSkillsDir: string, personalSkillsDir: string, logger?: {
|
|
7
|
+
info: (msg: string, meta?: Record<string, unknown>) => void;
|
|
8
|
+
warn: (msg: string, meta?: Record<string, unknown>) => void;
|
|
9
|
+
}): void;
|
|
10
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/skills/sync.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,eAAe,EAAE,MAAM,EACvB,iBAAiB,EAAE,MAAM,EACzB,MAAM,CAAC,EAAE;IAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CAAE,GACpI,IAAI,CAoFN"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.syncSharedSkills = syncSharedSkills;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* Syncs shared skills to the personal Claude skills directory (~/.claude/skills/).
|
|
41
|
+
* Skills synced from shared are marked with a .shared sentinel file so stale
|
|
42
|
+
* entries can be cleaned up when they are removed from shared-skills.
|
|
43
|
+
*/
|
|
44
|
+
function syncSharedSkills(sharedSkillsDir, personalSkillsDir, logger) {
|
|
45
|
+
// Enumerate skills currently in shared-skills/
|
|
46
|
+
const sharedNames = new Set();
|
|
47
|
+
if (fs.existsSync(sharedSkillsDir)) {
|
|
48
|
+
let entries;
|
|
49
|
+
try {
|
|
50
|
+
entries = fs.readdirSync(sharedSkillsDir);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
entries = [];
|
|
54
|
+
}
|
|
55
|
+
for (const entry of entries) {
|
|
56
|
+
if (entry.startsWith('.') || entry === 'node_modules')
|
|
57
|
+
continue;
|
|
58
|
+
const skillMd = path.join(sharedSkillsDir, entry, 'SKILL.md');
|
|
59
|
+
if (fs.existsSync(skillMd)) {
|
|
60
|
+
sharedNames.add(entry);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Ensure personal skills directory exists
|
|
65
|
+
try {
|
|
66
|
+
fs.mkdirSync(personalSkillsDir, { recursive: true });
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
logger?.warn('syncSharedSkills: failed to create personalSkillsDir', { personalSkillsDir });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Remove stale synced entries (those with .shared marker no longer in shared-skills)
|
|
73
|
+
let existingEntries = [];
|
|
74
|
+
try {
|
|
75
|
+
existingEntries = fs.readdirSync(personalSkillsDir);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// ignore
|
|
79
|
+
}
|
|
80
|
+
for (const entry of existingEntries) {
|
|
81
|
+
if (entry.startsWith('.'))
|
|
82
|
+
continue;
|
|
83
|
+
const markerFile = path.join(personalSkillsDir, entry, '.shared');
|
|
84
|
+
if (fs.existsSync(markerFile) && !sharedNames.has(entry)) {
|
|
85
|
+
try {
|
|
86
|
+
fs.rmSync(path.join(personalSkillsDir, entry), { recursive: true, force: true });
|
|
87
|
+
logger?.info('syncSharedSkills: removed stale skill', { name: entry });
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
logger?.warn('syncSharedSkills: failed to remove stale skill', { name: entry });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Copy/update skills from shared-skills to personal skills dir
|
|
95
|
+
for (const skillName of sharedNames) {
|
|
96
|
+
const srcFile = path.join(sharedSkillsDir, skillName, 'SKILL.md');
|
|
97
|
+
const destDir = path.join(personalSkillsDir, skillName);
|
|
98
|
+
const destFile = path.join(destDir, 'SKILL.md');
|
|
99
|
+
const markerFile = path.join(destDir, '.shared');
|
|
100
|
+
try {
|
|
101
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
102
|
+
// Only write if content differs (avoids spurious mtime updates)
|
|
103
|
+
const newContent = fs.readFileSync(srcFile, 'utf-8');
|
|
104
|
+
let existing = '';
|
|
105
|
+
try {
|
|
106
|
+
existing = fs.readFileSync(destFile, 'utf-8');
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// file doesn't exist yet
|
|
110
|
+
}
|
|
111
|
+
if (newContent !== existing) {
|
|
112
|
+
const tmp = destFile + '.tmp';
|
|
113
|
+
fs.writeFileSync(tmp, newContent, 'utf-8');
|
|
114
|
+
fs.renameSync(tmp, destFile);
|
|
115
|
+
logger?.info('syncSharedSkills: synced skill', { name: skillName });
|
|
116
|
+
}
|
|
117
|
+
// Ensure .shared marker exists
|
|
118
|
+
if (!fs.existsSync(markerFile)) {
|
|
119
|
+
fs.writeFileSync(markerFile, '', 'utf-8');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
logger?.warn('syncSharedSkills: failed to sync skill', {
|
|
124
|
+
name: skillName,
|
|
125
|
+
error: err.message,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/skills/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { WatchHandle } from '../watch/factory';
|
|
2
|
+
export interface SkillWatcherOptions {
|
|
3
|
+
/** Directories to watch for SKILL.md changes */
|
|
4
|
+
dirs: string[];
|
|
5
|
+
/** Callback when skills change */
|
|
6
|
+
onChange: () => void;
|
|
7
|
+
/** Debounce interval in ms (default: 250) */
|
|
8
|
+
debounceMs?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Watch skill directories for SKILL.md file changes (add/modify/delete).
|
|
12
|
+
* Debounces rapid changes to avoid excessive rebuilds.
|
|
13
|
+
* Returns a close() handle to stop watching.
|
|
14
|
+
*/
|
|
15
|
+
export declare function watchSkills(opts: SkillWatcherOptions): WatchHandle;
|
|
16
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/skills/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,kCAAkC;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW,CAiBlE"}
|