@framers/agentos-skills 0.3.0 → 0.4.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.
- package/CONTRIBUTING.md +231 -0
- package/README.md +93 -58
- package/package.json +19 -31
- package/registry/community/.gitkeep +0 -0
- package/registry/curated/1password/SKILL.md +53 -0
- package/registry/curated/account-manager/SKILL.md +60 -0
- package/registry/curated/agent-config/SKILL.md +22 -0
- package/registry/curated/amazon-polly/SKILL.md +74 -0
- package/registry/curated/apple-notes/SKILL.md +45 -0
- package/registry/curated/apple-reminders/SKILL.md +46 -0
- package/registry/curated/audio-generation/SKILL.md +231 -0
- package/registry/curated/blog-publisher/SKILL.md +110 -0
- package/registry/curated/bluesky-bot/SKILL.md +93 -0
- package/registry/curated/cli-tools/SKILL.md +137 -0
- package/registry/curated/cloud-ops/SKILL.md +124 -0
- package/registry/curated/code-safety/SKILL.md +42 -0
- package/registry/curated/coding-agent/SKILL.md +40 -0
- package/registry/curated/company-research/SKILL.md +46 -0
- package/registry/curated/content-creator/SKILL.md +53 -0
- package/registry/curated/deep-research/SKILL.md +56 -0
- package/registry/curated/diarization/SKILL.md +83 -0
- package/registry/curated/discord-helper/SKILL.md +43 -0
- package/registry/curated/document-export/SKILL.md +54 -0
- package/registry/curated/email-intelligence/SKILL.md +41 -0
- package/registry/curated/emergent-tools/SKILL.md +225 -0
- package/registry/curated/endpoint-semantic/SKILL.md +72 -0
- package/registry/curated/facebook-bot/SKILL.md +94 -0
- package/registry/curated/git/SKILL.md +49 -0
- package/registry/curated/github/SKILL.md +142 -0
- package/registry/curated/google-cloud-stt/SKILL.md +71 -0
- package/registry/curated/google-cloud-tts/SKILL.md +71 -0
- package/registry/curated/grounding-guard/SKILL.md +38 -0
- package/registry/curated/healthcheck/SKILL.md +43 -0
- package/registry/curated/image-editing/SKILL.md +25 -0
- package/registry/curated/image-gen/SKILL.md +141 -0
- package/registry/curated/instagram-bot/SKILL.md +60 -0
- package/registry/curated/interactive-widgets/SKILL.md +85 -0
- package/registry/curated/linkedin-bot/SKILL.md +86 -0
- package/registry/curated/mastodon-bot/SKILL.md +104 -0
- package/registry/curated/memory-manager/SKILL.md +127 -0
- package/registry/curated/ml-content-classifier/SKILL.md +38 -0
- package/registry/curated/movie-lookup/SKILL.md +48 -0
- package/registry/curated/multimodal-rag/SKILL.md +153 -0
- package/registry/curated/notion/SKILL.md +43 -0
- package/registry/curated/obsidian/SKILL.md +42 -0
- package/registry/curated/openwakeword/SKILL.md +75 -0
- package/registry/curated/pii-redaction/SKILL.md +56 -0
- package/registry/curated/pinterest-bot/SKILL.md +45 -0
- package/registry/curated/piper/SKILL.md +72 -0
- package/registry/curated/porcupine/SKILL.md +74 -0
- package/registry/curated/reddit-bot/SKILL.md +74 -0
- package/registry/curated/seo-campaign/SKILL.md +51 -0
- package/registry/curated/site-deploy/SKILL.md +119 -0
- package/registry/curated/slack-helper/SKILL.md +43 -0
- package/registry/curated/social-broadcast/SKILL.md +145 -0
- package/registry/curated/spotify-player/SKILL.md +45 -0
- package/registry/curated/streaming-stt-deepgram/SKILL.md +84 -0
- package/registry/curated/streaming-stt-whisper/SKILL.md +82 -0
- package/registry/curated/streaming-tts-elevenlabs/SKILL.md +84 -0
- package/registry/curated/streaming-tts-openai/SKILL.md +83 -0
- package/registry/curated/structured-output/SKILL.md +22 -0
- package/registry/curated/summarize/SKILL.md +40 -0
- package/registry/curated/threads-bot/SKILL.md +82 -0
- package/registry/curated/tiktok-bot/SKILL.md +104 -0
- package/registry/curated/topicality/SKILL.md +37 -0
- package/registry/curated/trello/SKILL.md +44 -0
- package/registry/curated/twitter-bot/SKILL.md +63 -0
- package/registry/curated/video-generation/SKILL.md +225 -0
- package/registry/curated/vision-ocr/SKILL.md +82 -0
- package/registry/curated/voice-conversation/SKILL.md +65 -0
- package/registry/curated/vosk/SKILL.md +74 -0
- package/registry/curated/weather/SKILL.md +37 -0
- package/registry/curated/web-scraper/SKILL.md +60 -0
- package/registry/curated/web-search/SKILL.md +49 -0
- package/registry/curated/whisper-transcribe/SKILL.md +58 -0
- package/registry/curated/youtube-bot/SKILL.md +104 -0
- package/registry.json +2446 -0
- package/scripts/update-registry.mjs +126 -0
- package/scripts/validate-skill.mjs +304 -0
- package/types.d.ts +160 -0
- package/dist/SkillLoader.d.ts +0 -50
- package/dist/SkillLoader.d.ts.map +0 -1
- package/dist/SkillLoader.js +0 -291
- package/dist/SkillLoader.js.map +0 -1
- package/dist/SkillRegistry.d.ts +0 -135
- package/dist/SkillRegistry.d.ts.map +0 -1
- package/dist/SkillRegistry.js +0 -455
- package/dist/SkillRegistry.js.map +0 -1
- package/dist/index.d.ts +0 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -13
- package/dist/index.js.map +0 -1
- package/dist/paths.d.ts +0 -35
- package/dist/paths.d.ts.map +0 -1
- package/dist/paths.js +0 -71
- package/dist/paths.js.map +0 -1
- package/dist/types.d.ts +0 -231
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -21
- package/dist/types.js.map +0 -1
package/dist/SkillRegistry.js
DELETED
|
@@ -1,455 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Skill Registry for AgentOS
|
|
3
|
-
* @module @framers/agentos-skills/SkillRegistry
|
|
4
|
-
*
|
|
5
|
-
* Runtime registry for managing and querying loaded skills.
|
|
6
|
-
* Provides methods for registration, filtering, and building
|
|
7
|
-
* skill snapshots for agent context.
|
|
8
|
-
*/
|
|
9
|
-
import * as fs from 'node:fs';
|
|
10
|
-
import * as path from 'node:path';
|
|
11
|
-
import { loadSkillsFromDir, filterByPlatform, filterByEligibility, checkBinaryRequirements, } from './SkillLoader.js';
|
|
12
|
-
/**
|
|
13
|
-
* Skill Registry for managing loaded skills at runtime.
|
|
14
|
-
*/
|
|
15
|
-
export class SkillRegistry {
|
|
16
|
-
constructor(config) {
|
|
17
|
-
this.entries = new Map();
|
|
18
|
-
this.snapshotVersion = 1;
|
|
19
|
-
this.config = config;
|
|
20
|
-
}
|
|
21
|
-
// ============================================================================
|
|
22
|
-
// REGISTRATION
|
|
23
|
-
// ============================================================================
|
|
24
|
-
/**
|
|
25
|
-
* Register a skill entry.
|
|
26
|
-
*
|
|
27
|
-
* @returns Whether the skill was registered (false if already exists)
|
|
28
|
-
*/
|
|
29
|
-
register(entry) {
|
|
30
|
-
const name = entry.skill.name;
|
|
31
|
-
const skillKey = entry.metadata?.skillKey ?? name;
|
|
32
|
-
if (this.entries.has(name)) {
|
|
33
|
-
console.warn(`[SkillRegistry] Skill '${name}' already registered, skipping`);
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
// If an allowlist is configured, only apply it to bundled skills.
|
|
37
|
-
const allowBundled = normalizeAllowlist(this.config?.allowBundled);
|
|
38
|
-
if (allowBundled && entry.source === 'bundled') {
|
|
39
|
-
if (!allowBundled.includes(skillKey) && !allowBundled.includes(name)) {
|
|
40
|
-
console.log(`[SkillRegistry] Bundled skill '${name}' blocked by allowBundled, skipping`);
|
|
41
|
-
return false;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
// Check if skill is enabled in config
|
|
45
|
-
const skillConfig = this.config?.entries?.[skillKey] ?? this.config?.entries?.[name];
|
|
46
|
-
if (skillConfig?.enabled === false) {
|
|
47
|
-
console.log(`[SkillRegistry] Skill '${name}' disabled in config, skipping`);
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
this.entries.set(name, entry);
|
|
51
|
-
this.snapshotVersion++;
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Unregister a skill by name.
|
|
56
|
-
*/
|
|
57
|
-
unregister(name) {
|
|
58
|
-
const existed = this.entries.delete(name);
|
|
59
|
-
if (existed) {
|
|
60
|
-
this.snapshotVersion++;
|
|
61
|
-
}
|
|
62
|
-
return existed;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Clear all registered skills.
|
|
66
|
-
*/
|
|
67
|
-
clear() {
|
|
68
|
-
this.entries.clear();
|
|
69
|
-
this.snapshotVersion++;
|
|
70
|
-
}
|
|
71
|
-
// ============================================================================
|
|
72
|
-
// QUERIES
|
|
73
|
-
// ============================================================================
|
|
74
|
-
/**
|
|
75
|
-
* Get a skill by name.
|
|
76
|
-
*/
|
|
77
|
-
getByName(name) {
|
|
78
|
-
return this.entries.get(name);
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* List all registered skills.
|
|
82
|
-
*/
|
|
83
|
-
listAll() {
|
|
84
|
-
return Array.from(this.entries.values());
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Get the count of registered skills.
|
|
88
|
-
*/
|
|
89
|
-
get size() {
|
|
90
|
-
return this.entries.size;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Check if a skill is registered.
|
|
94
|
-
*/
|
|
95
|
-
has(name) {
|
|
96
|
-
return this.entries.has(name);
|
|
97
|
-
}
|
|
98
|
-
// ============================================================================
|
|
99
|
-
// LOADING
|
|
100
|
-
// ============================================================================
|
|
101
|
-
/**
|
|
102
|
-
* Load skills from one or more directories.
|
|
103
|
-
*/
|
|
104
|
-
async loadFromDirs(dirs) {
|
|
105
|
-
let count = 0;
|
|
106
|
-
for (const dir of dirs) {
|
|
107
|
-
count += await this.loadFromDir(dir);
|
|
108
|
-
}
|
|
109
|
-
return count;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Load skills from a single directory, optionally tagging the source.
|
|
113
|
-
*/
|
|
114
|
-
async loadFromDir(dir, options) {
|
|
115
|
-
let count = 0;
|
|
116
|
-
const entries = await loadSkillsFromDir(dir);
|
|
117
|
-
for (const entry of entries) {
|
|
118
|
-
if (options?.source) {
|
|
119
|
-
entry.source = options.source;
|
|
120
|
-
}
|
|
121
|
-
if (this.register(entry)) {
|
|
122
|
-
count++;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return count;
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Reload all skills from configured directories.
|
|
129
|
-
*/
|
|
130
|
-
async reload(options) {
|
|
131
|
-
this.clear();
|
|
132
|
-
if (options.config) {
|
|
133
|
-
this.config = options.config;
|
|
134
|
-
}
|
|
135
|
-
// Load in high -> low precedence order (first registered wins):
|
|
136
|
-
// workspace > managed > bundled > extra.
|
|
137
|
-
let count = 0;
|
|
138
|
-
if (options.workspaceDir) {
|
|
139
|
-
count += await this.loadFromDir(options.workspaceDir, { source: 'workspace' });
|
|
140
|
-
}
|
|
141
|
-
if (options.managedSkillsDir) {
|
|
142
|
-
count += await this.loadFromDir(options.managedSkillsDir, { source: 'managed' });
|
|
143
|
-
}
|
|
144
|
-
if (options.bundledSkillsDir) {
|
|
145
|
-
count += await this.loadFromDir(options.bundledSkillsDir, { source: 'bundled' });
|
|
146
|
-
}
|
|
147
|
-
if (options.extraDirs) {
|
|
148
|
-
for (const dir of options.extraDirs) {
|
|
149
|
-
count += await this.loadFromDir(dir, { source: 'extra' });
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return count;
|
|
153
|
-
}
|
|
154
|
-
// ============================================================================
|
|
155
|
-
// FILTERING
|
|
156
|
-
// ============================================================================
|
|
157
|
-
/**
|
|
158
|
-
* Get skills filtered by platform.
|
|
159
|
-
*/
|
|
160
|
-
filterByPlatform(platform) {
|
|
161
|
-
return filterByPlatform(this.listAll(), platform);
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Get skills filtered by eligibility context.
|
|
165
|
-
*/
|
|
166
|
-
filterByEligibility(context) {
|
|
167
|
-
return filterByEligibility(this.listAll(), context);
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Get skills that can be invoked by users.
|
|
171
|
-
*/
|
|
172
|
-
getUserInvocableSkills() {
|
|
173
|
-
return this.listAll().filter((entry) => entry.invocation?.userInvocable !== false);
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Get skills that can be invoked by the model.
|
|
177
|
-
*/
|
|
178
|
-
getModelInvocableSkills() {
|
|
179
|
-
return this.listAll().filter((entry) => entry.invocation?.disableModelInvocation !== true);
|
|
180
|
-
}
|
|
181
|
-
// ============================================================================
|
|
182
|
-
// SNAPSHOTS
|
|
183
|
-
// ============================================================================
|
|
184
|
-
/**
|
|
185
|
-
* Build a skill snapshot for agent context.
|
|
186
|
-
*/
|
|
187
|
-
buildSnapshot(options) {
|
|
188
|
-
let entries = this.listAll();
|
|
189
|
-
// Apply platform filter
|
|
190
|
-
if (options?.platform) {
|
|
191
|
-
entries = filterByPlatform(entries, options.platform);
|
|
192
|
-
}
|
|
193
|
-
if (options?.strict) {
|
|
194
|
-
const platform = (options.platform && String(options.platform).trim()) || process.platform;
|
|
195
|
-
entries = entries.filter((entry) => shouldIncludeSkillEntry(entry, {
|
|
196
|
-
platform,
|
|
197
|
-
skillsConfig: this.config,
|
|
198
|
-
runtimeConfig: options.runtimeConfig,
|
|
199
|
-
}));
|
|
200
|
-
}
|
|
201
|
-
// Apply eligibility filter
|
|
202
|
-
if (options?.eligibility) {
|
|
203
|
-
entries = filterByEligibility(entries, options.eligibility);
|
|
204
|
-
}
|
|
205
|
-
// Apply name filter
|
|
206
|
-
if (options?.filter && options.filter.length > 0) {
|
|
207
|
-
const filterSet = new Set(options.filter);
|
|
208
|
-
entries = entries.filter((e) => filterSet.has(e.skill.name));
|
|
209
|
-
}
|
|
210
|
-
// Build prompt
|
|
211
|
-
const prompt = this.buildPrompt(entries);
|
|
212
|
-
// Build skill list
|
|
213
|
-
const skills = entries.map((e) => ({
|
|
214
|
-
name: e.skill.name,
|
|
215
|
-
primaryEnv: e.metadata?.primaryEnv,
|
|
216
|
-
}));
|
|
217
|
-
return {
|
|
218
|
-
prompt,
|
|
219
|
-
skills,
|
|
220
|
-
resolvedSkills: entries.map((e) => e.skill),
|
|
221
|
-
version: this.snapshotVersion,
|
|
222
|
-
createdAt: new Date(),
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Format skills into a prompt for LLM context.
|
|
227
|
-
*/
|
|
228
|
-
buildPrompt(entries) {
|
|
229
|
-
if (entries.length === 0) {
|
|
230
|
-
return '';
|
|
231
|
-
}
|
|
232
|
-
const sections = entries.map((entry) => {
|
|
233
|
-
const { skill, metadata } = entry;
|
|
234
|
-
const emoji = metadata?.emoji || '\u{1F4E6}';
|
|
235
|
-
const header = `## ${emoji} ${skill.name}`;
|
|
236
|
-
const desc = skill.description ? `\n${skill.description}\n` : '';
|
|
237
|
-
const content = skill.content ? `\n${skill.content}` : '';
|
|
238
|
-
return `${header}${desc}${content}`;
|
|
239
|
-
});
|
|
240
|
-
return `# Available Skills\n\n${sections.join('\n\n---\n\n')}`;
|
|
241
|
-
}
|
|
242
|
-
// ============================================================================
|
|
243
|
-
// COMMANDS
|
|
244
|
-
// ============================================================================
|
|
245
|
-
/**
|
|
246
|
-
* Build command specifications for all skills.
|
|
247
|
-
*/
|
|
248
|
-
buildCommandSpecs(options) {
|
|
249
|
-
let entries = this.getUserInvocableSkills();
|
|
250
|
-
if (options?.platform) {
|
|
251
|
-
entries = filterByPlatform(entries, options.platform);
|
|
252
|
-
}
|
|
253
|
-
if (options?.eligibility) {
|
|
254
|
-
entries = filterByEligibility(entries, options.eligibility);
|
|
255
|
-
}
|
|
256
|
-
const reservedNames = options?.reservedNames || new Set();
|
|
257
|
-
const usedNames = new Set(reservedNames);
|
|
258
|
-
const specs = [];
|
|
259
|
-
for (const entry of entries) {
|
|
260
|
-
const baseName = sanitizeCommandName(entry.skill.name);
|
|
261
|
-
const name = resolveUniqueCommandName(baseName, usedNames);
|
|
262
|
-
usedNames.add(name);
|
|
263
|
-
specs.push({
|
|
264
|
-
name,
|
|
265
|
-
skillName: entry.skill.name,
|
|
266
|
-
description: truncateDescription(entry.skill.description),
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
return specs;
|
|
270
|
-
}
|
|
271
|
-
// ============================================================================
|
|
272
|
-
// REQUIREMENTS
|
|
273
|
-
// ============================================================================
|
|
274
|
-
/**
|
|
275
|
-
* Check requirements for all registered skills.
|
|
276
|
-
*/
|
|
277
|
-
checkAllRequirements(hasBin) {
|
|
278
|
-
const results = new Map();
|
|
279
|
-
for (const entry of this.listAll()) {
|
|
280
|
-
results.set(entry.skill.name, checkBinaryRequirements(entry, hasBin));
|
|
281
|
-
}
|
|
282
|
-
return results;
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Get skills with unmet requirements.
|
|
286
|
-
*/
|
|
287
|
-
getSkillsWithMissingRequirements(hasBin) {
|
|
288
|
-
const results = [];
|
|
289
|
-
for (const entry of this.listAll()) {
|
|
290
|
-
const { met, missing } = checkBinaryRequirements(entry, hasBin);
|
|
291
|
-
if (!met) {
|
|
292
|
-
results.push({ skill: entry.skill.name, missing });
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
return results;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
// ============================================================================
|
|
299
|
-
// HELPERS
|
|
300
|
-
// ============================================================================
|
|
301
|
-
const COMMAND_MAX_LENGTH = 32;
|
|
302
|
-
const COMMAND_FALLBACK = 'skill';
|
|
303
|
-
const DESCRIPTION_MAX_LENGTH = 100;
|
|
304
|
-
/**
|
|
305
|
-
* Sanitize a skill name into a valid command name.
|
|
306
|
-
*/
|
|
307
|
-
function sanitizeCommandName(raw) {
|
|
308
|
-
// Convert to lowercase, replace non-alphanumeric with hyphens
|
|
309
|
-
let name = raw.toLowerCase().replace(/[^a-z0-9-]/g, '-');
|
|
310
|
-
// Remove leading/trailing hyphens
|
|
311
|
-
name = name.replace(/^-+|-+$/g, '');
|
|
312
|
-
// Collapse multiple hyphens
|
|
313
|
-
name = name.replace(/-+/g, '-');
|
|
314
|
-
// Truncate to max length
|
|
315
|
-
if (name.length > COMMAND_MAX_LENGTH) {
|
|
316
|
-
name = name.slice(0, COMMAND_MAX_LENGTH);
|
|
317
|
-
// Clean up trailing hyphen
|
|
318
|
-
name = name.replace(/-+$/, '');
|
|
319
|
-
}
|
|
320
|
-
return name || COMMAND_FALLBACK;
|
|
321
|
-
}
|
|
322
|
-
/**
|
|
323
|
-
* Resolve a unique command name avoiding collisions.
|
|
324
|
-
*/
|
|
325
|
-
function resolveUniqueCommandName(base, used) {
|
|
326
|
-
if (!used.has(base)) {
|
|
327
|
-
return base;
|
|
328
|
-
}
|
|
329
|
-
// Append numeric suffix
|
|
330
|
-
for (let i = 2; i < 100; i++) {
|
|
331
|
-
const candidate = `${base}-${i}`;
|
|
332
|
-
if (!used.has(candidate)) {
|
|
333
|
-
return candidate;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
// Fallback with random suffix
|
|
337
|
-
return `${base}-${Date.now() % 1000}`;
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Truncate description to max length.
|
|
341
|
-
*/
|
|
342
|
-
function truncateDescription(desc) {
|
|
343
|
-
if (desc.length <= DESCRIPTION_MAX_LENGTH) {
|
|
344
|
-
return desc;
|
|
345
|
-
}
|
|
346
|
-
return desc.slice(0, DESCRIPTION_MAX_LENGTH - 3) + '...';
|
|
347
|
-
}
|
|
348
|
-
function normalizeAllowlist(input) {
|
|
349
|
-
if (!Array.isArray(input))
|
|
350
|
-
return undefined;
|
|
351
|
-
const normalized = input.map((entry) => String(entry).trim()).filter(Boolean);
|
|
352
|
-
return normalized.length > 0 ? normalized : undefined;
|
|
353
|
-
}
|
|
354
|
-
function isTruthy(value) {
|
|
355
|
-
if (value === undefined || value === null)
|
|
356
|
-
return false;
|
|
357
|
-
if (typeof value === 'boolean')
|
|
358
|
-
return value;
|
|
359
|
-
if (typeof value === 'number')
|
|
360
|
-
return value !== 0;
|
|
361
|
-
if (typeof value === 'string')
|
|
362
|
-
return value.trim().length > 0;
|
|
363
|
-
return true;
|
|
364
|
-
}
|
|
365
|
-
function resolveConfigPath(config, pathStr) {
|
|
366
|
-
if (!config)
|
|
367
|
-
return undefined;
|
|
368
|
-
const parts = pathStr.split('.').filter(Boolean);
|
|
369
|
-
let current = config;
|
|
370
|
-
for (const part of parts) {
|
|
371
|
-
if (typeof current !== 'object' || current === null)
|
|
372
|
-
return undefined;
|
|
373
|
-
current = current[part];
|
|
374
|
-
}
|
|
375
|
-
return current;
|
|
376
|
-
}
|
|
377
|
-
function isConfigPathTruthy(config, pathStr) {
|
|
378
|
-
return isTruthy(resolveConfigPath(config, pathStr));
|
|
379
|
-
}
|
|
380
|
-
function normalizePlatformName(raw) {
|
|
381
|
-
const lower = raw.toLowerCase();
|
|
382
|
-
if (lower === 'darwin' || lower === 'macos' || lower === 'mac')
|
|
383
|
-
return 'darwin';
|
|
384
|
-
if (lower === 'win32' || lower === 'windows')
|
|
385
|
-
return 'win32';
|
|
386
|
-
if (lower === 'linux')
|
|
387
|
-
return 'linux';
|
|
388
|
-
return lower;
|
|
389
|
-
}
|
|
390
|
-
function hasBinary(bin) {
|
|
391
|
-
// Local PATH-only check (no shell).
|
|
392
|
-
// Mirrors OpenClaw's behavior and is safe to call in hot paths.
|
|
393
|
-
const pathEnv = process.env.PATH ?? '';
|
|
394
|
-
const parts = pathEnv.split(path.delimiter).filter(Boolean);
|
|
395
|
-
const candidates = process.platform === 'win32' ? [bin, `${bin}.exe`, `${bin}.cmd`, `${bin}.bat`] : [bin];
|
|
396
|
-
for (const part of parts) {
|
|
397
|
-
for (const candidateName of candidates) {
|
|
398
|
-
const candidate = path.join(part, candidateName);
|
|
399
|
-
try {
|
|
400
|
-
fs.accessSync(candidate, fs.constants.X_OK);
|
|
401
|
-
return true;
|
|
402
|
-
}
|
|
403
|
-
catch {
|
|
404
|
-
// keep scanning
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
return false;
|
|
409
|
-
}
|
|
410
|
-
function shouldIncludeSkillEntry(entry, opts) {
|
|
411
|
-
const name = entry.skill.name;
|
|
412
|
-
const skillKey = entry.metadata?.skillKey ?? name;
|
|
413
|
-
const skillConfig = opts.skillsConfig?.entries?.[skillKey] ?? opts.skillsConfig?.entries?.[name];
|
|
414
|
-
if (skillConfig?.enabled === false)
|
|
415
|
-
return false;
|
|
416
|
-
const osList = entry.metadata?.os ?? [];
|
|
417
|
-
if (osList.length > 0) {
|
|
418
|
-
const platform = normalizePlatformName(opts.platform);
|
|
419
|
-
const allowed = osList.some((p) => normalizePlatformName(p) === platform);
|
|
420
|
-
if (!allowed)
|
|
421
|
-
return false;
|
|
422
|
-
}
|
|
423
|
-
if (entry.metadata?.always === true) {
|
|
424
|
-
return true;
|
|
425
|
-
}
|
|
426
|
-
const requires = entry.metadata?.requires;
|
|
427
|
-
const requiredBins = requires?.bins ?? [];
|
|
428
|
-
const requiredAnyBins = requires?.anyBins ?? [];
|
|
429
|
-
const requiredEnv = requires?.env ?? [];
|
|
430
|
-
const requiredConfig = requires?.config ?? [];
|
|
431
|
-
for (const bin of requiredBins) {
|
|
432
|
-
if (!hasBinary(bin))
|
|
433
|
-
return false;
|
|
434
|
-
}
|
|
435
|
-
if (requiredAnyBins.length > 0) {
|
|
436
|
-
const ok = requiredAnyBins.some((bin) => hasBinary(bin));
|
|
437
|
-
if (!ok)
|
|
438
|
-
return false;
|
|
439
|
-
}
|
|
440
|
-
for (const envName of requiredEnv) {
|
|
441
|
-
if (process.env[envName])
|
|
442
|
-
continue;
|
|
443
|
-
if (skillConfig?.env?.[envName])
|
|
444
|
-
continue;
|
|
445
|
-
if (skillConfig?.apiKey && entry.metadata?.primaryEnv === envName)
|
|
446
|
-
continue;
|
|
447
|
-
return false;
|
|
448
|
-
}
|
|
449
|
-
for (const cfgPath of requiredConfig) {
|
|
450
|
-
if (!isConfigPathTruthy(opts.runtimeConfig, cfgPath))
|
|
451
|
-
return false;
|
|
452
|
-
}
|
|
453
|
-
return true;
|
|
454
|
-
}
|
|
455
|
-
//# sourceMappingURL=SkillRegistry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SkillRegistry.js","sourceRoot":"","sources":["../src/SkillRegistry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Skills runtime module exports
|
|
3
|
-
* @module @framers/agentos-skills
|
|
4
|
-
*
|
|
5
|
-
* Runtime package for loading, parsing, and managing SKILL.md prompt modules.
|
|
6
|
-
* Provides SkillLoader (file parsing), SkillRegistry (runtime management),
|
|
7
|
-
* and path utilities for skill directory resolution.
|
|
8
|
-
*/
|
|
9
|
-
export * from './types.js';
|
|
10
|
-
export * from './SkillLoader.js';
|
|
11
|
-
export { SkillRegistry, type SkillRegistryOptions } from './SkillRegistry.js';
|
|
12
|
-
export * from './paths.js';
|
|
13
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,cAAc,YAAY,CAAC"}
|
package/dist/index.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Skills runtime module exports
|
|
3
|
-
* @module @framers/agentos-skills
|
|
4
|
-
*
|
|
5
|
-
* Runtime package for loading, parsing, and managing SKILL.md prompt modules.
|
|
6
|
-
* Provides SkillLoader (file parsing), SkillRegistry (runtime management),
|
|
7
|
-
* and path utilities for skill directory resolution.
|
|
8
|
-
*/
|
|
9
|
-
export * from './types.js';
|
|
10
|
-
export * from './SkillLoader.js';
|
|
11
|
-
export { SkillRegistry } from './SkillRegistry.js';
|
|
12
|
-
export * from './paths.js';
|
|
13
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,aAAa,EAA6B,MAAM,oBAAoB,CAAC;AAC9E,cAAc,YAAY,CAAC"}
|
package/dist/paths.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Skills path helpers for AgentOS
|
|
3
|
-
* @module @framers/agentos-skills/paths
|
|
4
|
-
*
|
|
5
|
-
* Provides a canonical resolver for "default" skill directories so runtimes
|
|
6
|
-
* and CLIs don't need to re-implement the same heuristics.
|
|
7
|
-
*/
|
|
8
|
-
export interface ResolveSkillsDirsOptions {
|
|
9
|
-
/** Base directory used to resolve relative --skills-dir entries. Default: process.cwd() */
|
|
10
|
-
cwd?: string;
|
|
11
|
-
/** Comma-separated list of additional skills directories (e.g. CLI flag). */
|
|
12
|
-
skillsDirFlag?: string;
|
|
13
|
-
/** Environment variables to consult. Default: process.env */
|
|
14
|
-
env?: NodeJS.ProcessEnv;
|
|
15
|
-
/** Include `AGENTOS_SKILLS_DIR` if set. Default: true */
|
|
16
|
-
includeAgentosSkillsDir?: boolean;
|
|
17
|
-
/** Include `$CODEX_HOME/skills` if CODEX_HOME is set. Default: true */
|
|
18
|
-
includeCodexHomeSkillsDir?: boolean;
|
|
19
|
-
/** Include `~/.codex/skills`. Default: true */
|
|
20
|
-
includeHomeCodexSkillsDir?: boolean;
|
|
21
|
-
/** Include `<cwd>/skills`. Default: true */
|
|
22
|
-
includeCwdSkillsDir?: boolean;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Resolve the "default" skills directories to scan for `SKILL.md` folders.
|
|
26
|
-
*
|
|
27
|
-
* Order is high -> low precedence for first-registered wins systems:
|
|
28
|
-
* - CLI flag dirs
|
|
29
|
-
* - AGENTOS_SKILLS_DIR
|
|
30
|
-
* - CODEX_HOME/skills
|
|
31
|
-
* - ~/.codex/skills
|
|
32
|
-
* - <cwd>/skills
|
|
33
|
-
*/
|
|
34
|
-
export declare function resolveDefaultSkillsDirs(options?: ResolveSkillsDirsOptions): string[];
|
|
35
|
-
//# sourceMappingURL=paths.d.ts.map
|
package/dist/paths.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,wBAAwB;IACvC,2FAA2F;IAC3F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAExB,yDAAyD;IACzD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,uEAAuE;IACvE,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,+CAA+C;IAC/C,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAwBD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,MAAM,EAAE,CAoCrF"}
|
package/dist/paths.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Skills path helpers for AgentOS
|
|
3
|
-
* @module @framers/agentos-skills/paths
|
|
4
|
-
*
|
|
5
|
-
* Provides a canonical resolver for "default" skill directories so runtimes
|
|
6
|
-
* and CLIs don't need to re-implement the same heuristics.
|
|
7
|
-
*/
|
|
8
|
-
import { existsSync } from 'node:fs';
|
|
9
|
-
import * as path from 'node:path';
|
|
10
|
-
import os from 'node:os';
|
|
11
|
-
function splitCommaList(raw) {
|
|
12
|
-
return raw
|
|
13
|
-
.split(',')
|
|
14
|
-
.map((p) => p.trim())
|
|
15
|
-
.filter(Boolean);
|
|
16
|
-
}
|
|
17
|
-
function uniqExistingDirs(dirs) {
|
|
18
|
-
const seen = new Set();
|
|
19
|
-
const result = [];
|
|
20
|
-
for (const dir of dirs) {
|
|
21
|
-
const key = path.resolve(dir);
|
|
22
|
-
if (seen.has(key))
|
|
23
|
-
continue;
|
|
24
|
-
seen.add(key);
|
|
25
|
-
if (!existsSync(key))
|
|
26
|
-
continue;
|
|
27
|
-
result.push(key);
|
|
28
|
-
}
|
|
29
|
-
return result;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Resolve the "default" skills directories to scan for `SKILL.md` folders.
|
|
33
|
-
*
|
|
34
|
-
* Order is high -> low precedence for first-registered wins systems:
|
|
35
|
-
* - CLI flag dirs
|
|
36
|
-
* - AGENTOS_SKILLS_DIR
|
|
37
|
-
* - CODEX_HOME/skills
|
|
38
|
-
* - ~/.codex/skills
|
|
39
|
-
* - <cwd>/skills
|
|
40
|
-
*/
|
|
41
|
-
export function resolveDefaultSkillsDirs(options) {
|
|
42
|
-
const env = options?.env ?? process.env;
|
|
43
|
-
const cwd = path.resolve(options?.cwd ?? process.cwd());
|
|
44
|
-
const dirs = [];
|
|
45
|
-
const skillsDirFlag = typeof options?.skillsDirFlag === 'string' ? options.skillsDirFlag.trim() : '';
|
|
46
|
-
if (skillsDirFlag) {
|
|
47
|
-
for (const part of splitCommaList(skillsDirFlag)) {
|
|
48
|
-
dirs.push(path.resolve(cwd, part));
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
if (options?.includeAgentosSkillsDir !== false) {
|
|
52
|
-
const agentosDir = typeof env['AGENTOS_SKILLS_DIR'] === 'string' ? env['AGENTOS_SKILLS_DIR'].trim() : '';
|
|
53
|
-
if (agentosDir) {
|
|
54
|
-
dirs.push(path.resolve(cwd, agentosDir));
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
if (options?.includeCodexHomeSkillsDir !== false) {
|
|
58
|
-
const codexHome = typeof env['CODEX_HOME'] === 'string' ? env['CODEX_HOME'].trim() : '';
|
|
59
|
-
if (codexHome) {
|
|
60
|
-
dirs.push(path.join(codexHome, 'skills'));
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (options?.includeHomeCodexSkillsDir !== false) {
|
|
64
|
-
dirs.push(path.join(os.homedir(), '.codex', 'skills'));
|
|
65
|
-
}
|
|
66
|
-
if (options?.includeCwdSkillsDir !== false) {
|
|
67
|
-
dirs.push(path.join(cwd, 'skills'));
|
|
68
|
-
}
|
|
69
|
-
return uniqExistingDirs(dirs);
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=paths.js.map
|
package/dist/paths.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|