@framers/agentos-skills-registry 0.2.0 → 0.3.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/CONTRIBUTING.md +231 -0
- package/README.md +146 -49
- package/dist/catalog.d.ts +105 -6
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +257 -206
- package/dist/catalog.js.map +1 -1
- package/dist/index.d.ts +30 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -25
- package/dist/index.js.map +1 -1
- package/dist/schema-types.d.ts +79 -0
- package/dist/schema-types.d.ts.map +1 -0
- package/dist/schema-types.js +11 -0
- package/dist/schema-types.js.map +1 -0
- package/dist/workspace-discovery.d.ts +77 -0
- package/dist/workspace-discovery.d.ts.map +1 -0
- package/dist/workspace-discovery.js +172 -0
- package/dist/workspace-discovery.js.map +1 -0
- package/package.json +17 -5
- 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/apple-notes/SKILL.md +45 -0
- package/registry/curated/apple-reminders/SKILL.md +46 -0
- package/registry/curated/blog-publisher/SKILL.md +110 -0
- package/registry/curated/bluesky-bot/SKILL.md +93 -0
- package/registry/curated/cloud-ops/SKILL.md +124 -0
- package/registry/curated/coding-agent/SKILL.md +40 -0
- package/registry/curated/content-creator/SKILL.md +53 -0
- package/registry/curated/deep-research/SKILL.md +56 -0
- package/registry/curated/discord-helper/SKILL.md +43 -0
- package/registry/curated/facebook-bot/SKILL.md +94 -0
- package/registry/curated/git/SKILL.md +39 -0
- package/registry/curated/github/SKILL.md +54 -0
- package/registry/curated/healthcheck/SKILL.md +43 -0
- package/registry/curated/image-gen/SKILL.md +50 -0
- package/registry/curated/instagram-bot/SKILL.md +60 -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/notion/SKILL.md +43 -0
- package/registry/curated/obsidian/SKILL.md +42 -0
- package/registry/curated/pinterest-bot/SKILL.md +45 -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/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/trello/SKILL.md +44 -0
- package/registry/curated/twitter-bot/SKILL.md +63 -0
- package/registry/curated/voice-conversation/SKILL.md +65 -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 +1478 -0
- package/scripts/update-registry.mjs +126 -0
- package/scripts/validate-skill.mjs +304 -0
- package/types.d.ts +77 -0
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview AgentOS Skills Registry
|
|
2
|
+
* @fileoverview AgentOS Skills Registry.
|
|
3
3
|
*
|
|
4
|
-
* Single
|
|
5
|
-
*
|
|
4
|
+
* Single package containing curated SKILL.md prompt modules, a typed catalog,
|
|
5
|
+
* and lazy-loading factory functions for SkillRegistry/SkillSnapshot.
|
|
6
6
|
*
|
|
7
7
|
* `@framers/agentos` is an **optional peer dependency** — the catalog helpers
|
|
8
8
|
* (re-exported from `./catalog.js`) work without it. Only the factory
|
|
@@ -13,9 +13,11 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import * as path from 'node:path';
|
|
15
15
|
import * as fs from 'node:fs/promises';
|
|
16
|
-
import { createRequire } from 'node:module';
|
|
17
16
|
// ── Re-export the programmatic catalog (zero heavy deps) ────────────────────
|
|
18
|
-
export { SKILLS_CATALOG, getSkillsByCategory, getSkillByName, getAvailableSkills, getCategories, getSkillsByTag, searchSkills, getCuratedSkills, getCommunitySkills, getAllSkills, } from './catalog.js';
|
|
17
|
+
export { SKILLS_CATALOG, getSkillsByCategory, getSkillByName, getAvailableSkills, getCategories, getSkillsByTag, searchSkills, getCuratedSkills, getCommunitySkills, getAllSkills, getSkillEntries, createLocalSkillProxy, loadSkillFromAbsolutePath, loadSkillByName, loadSkillsByNames, } from './catalog.js';
|
|
18
|
+
import { getSkillEntries, loadSkillsByNames, } from './catalog.js';
|
|
19
|
+
// ── Re-export workspace skill discovery (Feature 3.5) ───────────────────────
|
|
20
|
+
export { discoverWorkspaceSkills, mergeWithWorkspaceSkills, parseSkillFrontmatter, } from './workspace-discovery.js';
|
|
19
21
|
// ── Lazy loader for @framers/agentos ────────────────────────────────────────
|
|
20
22
|
/** Resolved module cache — loaded at most once per process. */
|
|
21
23
|
let _agentosSkillsMod = null;
|
|
@@ -36,14 +38,15 @@ async function requireAgentOS() {
|
|
|
36
38
|
'which have no peer-dep requirement.');
|
|
37
39
|
}
|
|
38
40
|
}
|
|
39
|
-
// ── Path helpers (
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
// ── Path helpers (resolve locally — SKILL.md files are bundled in this package) ───────
|
|
42
|
+
const __dirname = path.dirname(new URL(import.meta.url).pathname);
|
|
43
|
+
/** Package root (one level up from dist/ or src/) */
|
|
44
|
+
function resolvePackageRoot() {
|
|
45
|
+
// Works from both dist/index.js and src/index.ts
|
|
46
|
+
return path.resolve(__dirname, '..');
|
|
43
47
|
}
|
|
44
|
-
function
|
|
45
|
-
|
|
46
|
-
return path.dirname(pkgJsonPath);
|
|
48
|
+
function resolveCatalogPath() {
|
|
49
|
+
return path.join(resolvePackageRoot(), 'registry.json');
|
|
47
50
|
}
|
|
48
51
|
/**
|
|
49
52
|
* Absolute path to the bundled curated skills directory.
|
|
@@ -51,17 +54,17 @@ function resolveSkillsPackageDir() {
|
|
|
51
54
|
* This directory can be passed to `SkillRegistry.loadFromDirs([dir])`.
|
|
52
55
|
*/
|
|
53
56
|
export function getBundledCuratedSkillsDir() {
|
|
54
|
-
return path.join(
|
|
57
|
+
return path.join(resolvePackageRoot(), 'registry', 'curated');
|
|
55
58
|
}
|
|
56
59
|
/**
|
|
57
60
|
* Absolute path to the bundled community skills directory.
|
|
58
61
|
*/
|
|
59
62
|
export function getBundledCommunitySkillsDir() {
|
|
60
|
-
return path.join(
|
|
63
|
+
return path.join(resolvePackageRoot(), 'registry', 'community');
|
|
61
64
|
}
|
|
62
65
|
// ── Catalog JSON loader ─────────────────────────────────────────────────────
|
|
63
66
|
/**
|
|
64
|
-
* Load the
|
|
67
|
+
* Load the bundled registry.json catalog.
|
|
65
68
|
*/
|
|
66
69
|
export async function getSkillsCatalog() {
|
|
67
70
|
const registryPath = resolveCatalogPath();
|
|
@@ -76,6 +79,23 @@ export async function getAvailableCuratedSkills() {
|
|
|
76
79
|
return catalog.skills.curated ?? [];
|
|
77
80
|
}
|
|
78
81
|
// ── Factory functions (lazy-load @framers/agentos) ──────────────────────────
|
|
82
|
+
async function populateCuratedRegistry(args) {
|
|
83
|
+
const names = getSkillEntries(args.selection).map((entry) => entry.name);
|
|
84
|
+
const loadedSkills = await loadSkillsByNames(names);
|
|
85
|
+
for (const loadedSkill of loadedSkills) {
|
|
86
|
+
args.registry.register({
|
|
87
|
+
skill: {
|
|
88
|
+
name: loadedSkill.name,
|
|
89
|
+
description: loadedSkill.description,
|
|
90
|
+
content: loadedSkill.content,
|
|
91
|
+
},
|
|
92
|
+
frontmatter: loadedSkill.frontmatter,
|
|
93
|
+
metadata: loadedSkill.metadata ?? args.runtime.extractMetadata?.(loadedSkill.frontmatter),
|
|
94
|
+
sourcePath: path.dirname(loadedSkill.sourcePath),
|
|
95
|
+
source: 'bundled',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
79
99
|
/**
|
|
80
100
|
* Create a SkillRegistry loaded with bundled curated skills.
|
|
81
101
|
*
|
|
@@ -83,13 +103,15 @@ export async function getAvailableCuratedSkills() {
|
|
|
83
103
|
* Throws a descriptive error if the peer dep is missing.
|
|
84
104
|
*/
|
|
85
105
|
export async function createCuratedSkillRegistry(options) {
|
|
86
|
-
const
|
|
87
|
-
const registry = new SkillRegistry(options?.config);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
106
|
+
const runtime = await requireAgentOS();
|
|
107
|
+
const registry = new runtime.SkillRegistry(options?.config);
|
|
108
|
+
const selection = options?.skills ?? 'all';
|
|
109
|
+
if (selection !== 'none') {
|
|
110
|
+
await populateCuratedRegistry({
|
|
111
|
+
registry,
|
|
112
|
+
runtime,
|
|
113
|
+
selection,
|
|
114
|
+
});
|
|
93
115
|
}
|
|
94
116
|
return registry;
|
|
95
117
|
}
|
|
@@ -111,12 +133,13 @@ export async function createCuratedSkillSnapshot(options) {
|
|
|
111
133
|
createdAt,
|
|
112
134
|
};
|
|
113
135
|
}
|
|
114
|
-
const registry = await createCuratedSkillRegistry({
|
|
115
|
-
|
|
136
|
+
const registry = await createCuratedSkillRegistry({
|
|
137
|
+
config: options?.config,
|
|
138
|
+
skills: selection,
|
|
139
|
+
});
|
|
116
140
|
return registry.buildSnapshot({
|
|
117
141
|
platform: options?.platform,
|
|
118
142
|
eligibility: options?.eligibility,
|
|
119
|
-
filter,
|
|
120
143
|
});
|
|
121
144
|
}
|
|
122
145
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type declarations for registry.json schema.
|
|
3
|
+
*
|
|
4
|
+
* These types describe the shape of the SKILL.md registry catalog
|
|
5
|
+
* (registry.json). They differ from the SkillCatalogEntry in catalog.ts,
|
|
6
|
+
* which is a higher-level, UI-friendly representation.
|
|
7
|
+
*
|
|
8
|
+
* @module @framers/agentos-skills-registry/schema-types
|
|
9
|
+
*/
|
|
10
|
+
export type SkillInstallKind = 'brew' | 'apt' | 'node' | 'go' | 'uv' | 'download';
|
|
11
|
+
export interface SkillInstallSpec {
|
|
12
|
+
id?: string;
|
|
13
|
+
kind: SkillInstallKind;
|
|
14
|
+
label?: string;
|
|
15
|
+
bins?: string[];
|
|
16
|
+
os?: readonly string[];
|
|
17
|
+
formula?: string;
|
|
18
|
+
package?: string;
|
|
19
|
+
module?: string;
|
|
20
|
+
url?: string;
|
|
21
|
+
archive?: string;
|
|
22
|
+
extract?: boolean;
|
|
23
|
+
stripComponents?: number;
|
|
24
|
+
targetDir?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface SkillRequirements {
|
|
27
|
+
bins?: string[];
|
|
28
|
+
anyBins?: string[];
|
|
29
|
+
env?: string[];
|
|
30
|
+
config?: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface SkillMetadata {
|
|
33
|
+
always?: boolean;
|
|
34
|
+
skillKey?: string;
|
|
35
|
+
primaryEnv?: string;
|
|
36
|
+
emoji?: string;
|
|
37
|
+
homepage?: string;
|
|
38
|
+
os?: readonly string[];
|
|
39
|
+
requires?: SkillRequirements;
|
|
40
|
+
install?: SkillInstallSpec[];
|
|
41
|
+
}
|
|
42
|
+
/** Shape of a single skill entry in registry.json */
|
|
43
|
+
export interface SkillRegistryEntry {
|
|
44
|
+
id: string;
|
|
45
|
+
name: string;
|
|
46
|
+
displayName?: string;
|
|
47
|
+
version: string;
|
|
48
|
+
path: string;
|
|
49
|
+
description: string;
|
|
50
|
+
category?: string;
|
|
51
|
+
namespace?: string;
|
|
52
|
+
verified: boolean;
|
|
53
|
+
source?: 'curated' | 'community';
|
|
54
|
+
verifiedAt?: string;
|
|
55
|
+
keywords?: string[];
|
|
56
|
+
requiredSecrets?: string[];
|
|
57
|
+
requiredTools?: string[];
|
|
58
|
+
metadata?: SkillMetadata;
|
|
59
|
+
}
|
|
60
|
+
export interface SkillsRegistryStats {
|
|
61
|
+
totalSkills: number;
|
|
62
|
+
curatedCount: number;
|
|
63
|
+
communityCount: number;
|
|
64
|
+
}
|
|
65
|
+
/** Shape of the full registry.json file */
|
|
66
|
+
export interface SkillsRegistry {
|
|
67
|
+
version: string;
|
|
68
|
+
updated: string;
|
|
69
|
+
categories: {
|
|
70
|
+
curated: string[];
|
|
71
|
+
community: string[];
|
|
72
|
+
};
|
|
73
|
+
skills: {
|
|
74
|
+
curated: SkillRegistryEntry[];
|
|
75
|
+
community: SkillRegistryEntry[];
|
|
76
|
+
};
|
|
77
|
+
stats: SkillsRegistryStats;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=schema-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-types.d.ts","sourceRoot":"","sources":["../src/schema-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,UAAU,CAAC;AAElF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,MAAM,EAAE;QACN,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC9B,SAAS,EAAE,kBAAkB,EAAE,CAAC;KACjC,CAAC;IACF,KAAK,EAAE,mBAAmB,CAAC;CAC5B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Type declarations for registry.json schema.
|
|
3
|
+
*
|
|
4
|
+
* These types describe the shape of the SKILL.md registry catalog
|
|
5
|
+
* (registry.json). They differ from the SkillCatalogEntry in catalog.ts,
|
|
6
|
+
* which is a higher-level, UI-friendly representation.
|
|
7
|
+
*
|
|
8
|
+
* @module @framers/agentos-skills-registry/schema-types
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=schema-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-types.js","sourceRoot":"","sources":["../src/schema-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Cross-Agent Skill Discovery (Feature 3.5)
|
|
3
|
+
*
|
|
4
|
+
* Discovers SKILL.md files from a workspace `.agents/skills/` directory,
|
|
5
|
+
* parses their YAML frontmatter, and returns them as SkillCatalogEntry[]
|
|
6
|
+
* compatible with the existing registry catalog.
|
|
7
|
+
*
|
|
8
|
+
* Workspace skills take priority over registry skills when names collide.
|
|
9
|
+
*
|
|
10
|
+
* @module @framers/agentos-skills-registry/workspace-discovery
|
|
11
|
+
*/
|
|
12
|
+
import { type LoadedSkillFrontmatter, type SkillCatalogEntry } from './catalog.js';
|
|
13
|
+
/** Raw frontmatter fields extracted from a workspace SKILL.md */
|
|
14
|
+
export interface SkillFrontmatter extends LoadedSkillFrontmatter {
|
|
15
|
+
name: string;
|
|
16
|
+
version?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
category?: string;
|
|
19
|
+
tags?: string[];
|
|
20
|
+
author?: string;
|
|
21
|
+
namespace?: string;
|
|
22
|
+
requires_secrets?: string[];
|
|
23
|
+
requires_tools?: string[];
|
|
24
|
+
metadata?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
/** Options for workspace skill discovery */
|
|
27
|
+
export interface WorkspaceDiscoveryOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Absolute or relative path to the workspace skills directory.
|
|
30
|
+
* Defaults to `.agents/skills/` resolved from `cwd`.
|
|
31
|
+
*/
|
|
32
|
+
skillsDir?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Working directory used to resolve relative `skillsDir`.
|
|
35
|
+
* Defaults to `process.cwd()`.
|
|
36
|
+
*/
|
|
37
|
+
cwd?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* YAML frontmatter parser for workspace SKILL.md files.
|
|
41
|
+
*/
|
|
42
|
+
export declare function parseSkillFrontmatter(content: string): SkillFrontmatter | null;
|
|
43
|
+
/**
|
|
44
|
+
* Discover SKILL.md files from a workspace directory.
|
|
45
|
+
*
|
|
46
|
+
* Scans `<skillsDir>/` for sub-directories containing a SKILL.md file,
|
|
47
|
+
* parses the YAML frontmatter, and returns the discovered skills as
|
|
48
|
+
* SkillCatalogEntry[] compatible with the existing catalog.
|
|
49
|
+
*
|
|
50
|
+
* If the directory does not exist, returns an empty array.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* import { discoverWorkspaceSkills } from '@framers/agentos-skills-registry';
|
|
55
|
+
*
|
|
56
|
+
* // Uses default .agents/skills/ in cwd
|
|
57
|
+
* const skills = await discoverWorkspaceSkills();
|
|
58
|
+
*
|
|
59
|
+
* // Custom path
|
|
60
|
+
* const skills2 = await discoverWorkspaceSkills({
|
|
61
|
+
* skillsDir: '/my/project/.agents/skills',
|
|
62
|
+
* });
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function discoverWorkspaceSkills(options?: WorkspaceDiscoveryOptions): Promise<SkillCatalogEntry[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Merge workspace-discovered skills with the registry catalog.
|
|
68
|
+
*
|
|
69
|
+
* Workspace skills take priority: if a workspace skill has the same `name`
|
|
70
|
+
* as a registry skill, the workspace version replaces the registry one.
|
|
71
|
+
*
|
|
72
|
+
* @param registrySkills - Skills from the built-in catalog (SKILLS_CATALOG)
|
|
73
|
+
* @param workspaceSkills - Skills discovered from the workspace directory
|
|
74
|
+
* @returns Merged array with workspace overrides applied
|
|
75
|
+
*/
|
|
76
|
+
export declare function mergeWithWorkspaceSkills(registrySkills: SkillCatalogEntry[], workspaceSkills: SkillCatalogEntry[]): SkillCatalogEntry[];
|
|
77
|
+
//# sourceMappingURL=workspace-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-discovery.d.ts","sourceRoot":"","sources":["../src/workspace-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,cAAc,CAAC;AAItB,iEAAiE;AACjE,MAAM,WAAW,gBAAiB,SAAQ,sBAAsB;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,4CAA4C;AAC5C,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAmC9E;AA2CD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA8C9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,iBAAiB,EAAE,EACnC,eAAe,EAAE,iBAAiB,EAAE,GACnC,iBAAiB,EAAE,CAUrB"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Cross-Agent Skill Discovery (Feature 3.5)
|
|
3
|
+
*
|
|
4
|
+
* Discovers SKILL.md files from a workspace `.agents/skills/` directory,
|
|
5
|
+
* parses their YAML frontmatter, and returns them as SkillCatalogEntry[]
|
|
6
|
+
* compatible with the existing registry catalog.
|
|
7
|
+
*
|
|
8
|
+
* Workspace skills take priority over registry skills when names collide.
|
|
9
|
+
*
|
|
10
|
+
* @module @framers/agentos-skills-registry/workspace-discovery
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'node:fs/promises';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import YAML from 'yaml';
|
|
15
|
+
import { loadSkillFromAbsolutePath, } from './catalog.js';
|
|
16
|
+
// ── Frontmatter parser ──────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* YAML frontmatter parser for workspace SKILL.md files.
|
|
19
|
+
*/
|
|
20
|
+
export function parseSkillFrontmatter(content) {
|
|
21
|
+
// Extract frontmatter block between leading --- fences
|
|
22
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
23
|
+
if (!match)
|
|
24
|
+
return null;
|
|
25
|
+
const block = match[1];
|
|
26
|
+
let parsed;
|
|
27
|
+
try {
|
|
28
|
+
parsed = YAML.parse(block);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
34
|
+
return null;
|
|
35
|
+
const result = parsed;
|
|
36
|
+
// name is required
|
|
37
|
+
if (typeof result.name !== 'string' || !result.name)
|
|
38
|
+
return null;
|
|
39
|
+
return {
|
|
40
|
+
name: result.name,
|
|
41
|
+
version: result.version ?? undefined,
|
|
42
|
+
description: result.description ?? undefined,
|
|
43
|
+
category: result.category ?? undefined,
|
|
44
|
+
tags: Array.isArray(result.tags) ? result.tags : undefined,
|
|
45
|
+
author: result.author ?? undefined,
|
|
46
|
+
namespace: result.namespace ?? undefined,
|
|
47
|
+
requires_secrets: Array.isArray(result.requires_secrets)
|
|
48
|
+
? result.requires_secrets
|
|
49
|
+
: undefined,
|
|
50
|
+
requires_tools: Array.isArray(result.requires_tools)
|
|
51
|
+
? result.requires_tools
|
|
52
|
+
: undefined,
|
|
53
|
+
metadata: result.metadata ?? undefined,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// ── Skill discovery ─────────────────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Create a lazy-loading skill factory for an absolute SKILL.md path.
|
|
59
|
+
* Used for workspace-discovered skills where the path is already resolved.
|
|
60
|
+
*/
|
|
61
|
+
function createAbsoluteSkillLoader(absolutePath, displayName) {
|
|
62
|
+
return async () => loadSkillFromAbsolutePath(absolutePath, displayName);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Convert parsed frontmatter + filesystem path into a SkillCatalogEntry.
|
|
66
|
+
*/
|
|
67
|
+
function frontmatterToEntry(fm, skillPath, absoluteSkillMdPath) {
|
|
68
|
+
const displayName = fm.name
|
|
69
|
+
.split('-')
|
|
70
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
71
|
+
.join(' ');
|
|
72
|
+
return {
|
|
73
|
+
name: fm.name,
|
|
74
|
+
displayName,
|
|
75
|
+
description: fm.description ?? '',
|
|
76
|
+
category: fm.category ?? 'workspace',
|
|
77
|
+
tags: fm.tags ?? [],
|
|
78
|
+
requiredSecrets: fm.requires_secrets ?? [],
|
|
79
|
+
requiredTools: fm.requires_tools ?? [],
|
|
80
|
+
skillPath,
|
|
81
|
+
source: 'community',
|
|
82
|
+
namespace: 'wunderland',
|
|
83
|
+
available: true,
|
|
84
|
+
loadSkill: createAbsoluteSkillLoader(absoluteSkillMdPath, displayName),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Discover SKILL.md files from a workspace directory.
|
|
89
|
+
*
|
|
90
|
+
* Scans `<skillsDir>/` for sub-directories containing a SKILL.md file,
|
|
91
|
+
* parses the YAML frontmatter, and returns the discovered skills as
|
|
92
|
+
* SkillCatalogEntry[] compatible with the existing catalog.
|
|
93
|
+
*
|
|
94
|
+
* If the directory does not exist, returns an empty array.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```ts
|
|
98
|
+
* import { discoverWorkspaceSkills } from '@framers/agentos-skills-registry';
|
|
99
|
+
*
|
|
100
|
+
* // Uses default .agents/skills/ in cwd
|
|
101
|
+
* const skills = await discoverWorkspaceSkills();
|
|
102
|
+
*
|
|
103
|
+
* // Custom path
|
|
104
|
+
* const skills2 = await discoverWorkspaceSkills({
|
|
105
|
+
* skillsDir: '/my/project/.agents/skills',
|
|
106
|
+
* });
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export async function discoverWorkspaceSkills(options) {
|
|
110
|
+
const cwd = options?.cwd ?? process.cwd();
|
|
111
|
+
const skillsDir = options?.skillsDir
|
|
112
|
+
? path.resolve(cwd, options.skillsDir)
|
|
113
|
+
: path.resolve(cwd, '.agents', 'skills');
|
|
114
|
+
// If directory doesn't exist, return empty array
|
|
115
|
+
let entries;
|
|
116
|
+
try {
|
|
117
|
+
entries = await fs.readdir(skillsDir);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
const discovered = [];
|
|
123
|
+
for (const entry of entries) {
|
|
124
|
+
const entryPath = path.join(skillsDir, entry);
|
|
125
|
+
// Only scan directories
|
|
126
|
+
let stat;
|
|
127
|
+
try {
|
|
128
|
+
stat = await fs.stat(entryPath);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (!stat.isDirectory())
|
|
134
|
+
continue;
|
|
135
|
+
// Look for SKILL.md inside the directory
|
|
136
|
+
const skillMdPath = path.join(entryPath, 'SKILL.md');
|
|
137
|
+
let content;
|
|
138
|
+
try {
|
|
139
|
+
content = await fs.readFile(skillMdPath, 'utf-8');
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const frontmatter = parseSkillFrontmatter(content);
|
|
145
|
+
if (!frontmatter)
|
|
146
|
+
continue;
|
|
147
|
+
// Use relative path from skillsDir for the skillPath
|
|
148
|
+
const relativePath = path.relative(skillsDir, skillMdPath);
|
|
149
|
+
discovered.push(frontmatterToEntry(frontmatter, relativePath, skillMdPath));
|
|
150
|
+
}
|
|
151
|
+
return discovered;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Merge workspace-discovered skills with the registry catalog.
|
|
155
|
+
*
|
|
156
|
+
* Workspace skills take priority: if a workspace skill has the same `name`
|
|
157
|
+
* as a registry skill, the workspace version replaces the registry one.
|
|
158
|
+
*
|
|
159
|
+
* @param registrySkills - Skills from the built-in catalog (SKILLS_CATALOG)
|
|
160
|
+
* @param workspaceSkills - Skills discovered from the workspace directory
|
|
161
|
+
* @returns Merged array with workspace overrides applied
|
|
162
|
+
*/
|
|
163
|
+
export function mergeWithWorkspaceSkills(registrySkills, workspaceSkills) {
|
|
164
|
+
if (workspaceSkills.length === 0)
|
|
165
|
+
return registrySkills;
|
|
166
|
+
const workspaceNames = new Set(workspaceSkills.map((s) => s.name));
|
|
167
|
+
// Filter out registry skills that are overridden by workspace skills
|
|
168
|
+
const filtered = registrySkills.filter((s) => !workspaceNames.has(s.name));
|
|
169
|
+
// Workspace skills come first (higher priority), then remaining registry skills
|
|
170
|
+
return [...workspaceSkills, ...filtered];
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=workspace-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-discovery.js","sourceRoot":"","sources":["../src/workspace-discovery.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@framers/agentos-skills-registry",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist",
|
|
6
|
+
"registry",
|
|
7
|
+
"registry.json",
|
|
8
|
+
"types.d.ts",
|
|
9
|
+
"scripts",
|
|
10
|
+
"CONTRIBUTING.md",
|
|
6
11
|
"README.md"
|
|
7
12
|
],
|
|
8
|
-
"description": "Curated skills registry
|
|
13
|
+
"description": "Curated skills registry for AgentOS — SKILL.md prompt modules, typed catalog, and lazy-loading factories",
|
|
9
14
|
"type": "module",
|
|
10
15
|
"sideEffects": false,
|
|
11
16
|
"main": "./dist/index.js",
|
|
@@ -19,11 +24,19 @@
|
|
|
19
24
|
"import": "./dist/catalog.js",
|
|
20
25
|
"types": "./dist/catalog.d.ts"
|
|
21
26
|
},
|
|
27
|
+
"./workspace-discovery": {
|
|
28
|
+
"import": "./dist/workspace-discovery.js",
|
|
29
|
+
"types": "./dist/workspace-discovery.d.ts"
|
|
30
|
+
},
|
|
31
|
+
"./registry.json": "./registry.json",
|
|
32
|
+
"./types": "./types.d.ts",
|
|
22
33
|
"./package.json": "./package.json"
|
|
23
34
|
},
|
|
24
35
|
"scripts": {
|
|
25
36
|
"build": "tsc",
|
|
26
37
|
"clean": "rm -rf dist",
|
|
38
|
+
"validate": "node scripts/validate-skill.mjs",
|
|
39
|
+
"update:registry": "node scripts/update-registry.mjs",
|
|
27
40
|
"prepublishOnly": "npm run build",
|
|
28
41
|
"test": "vitest run"
|
|
29
42
|
},
|
|
@@ -50,7 +63,7 @@
|
|
|
50
63
|
"access": "public"
|
|
51
64
|
},
|
|
52
65
|
"dependencies": {
|
|
53
|
-
"
|
|
66
|
+
"yaml": "^2.8.1"
|
|
54
67
|
},
|
|
55
68
|
"peerDependencies": {
|
|
56
69
|
"@framers/agentos": ">=0.1.0"
|
|
@@ -61,8 +74,7 @@
|
|
|
61
74
|
}
|
|
62
75
|
},
|
|
63
76
|
"devDependencies": {
|
|
64
|
-
"@framers/agentos": "
|
|
65
|
-
"@framers/agentos-skills": "workspace:*",
|
|
77
|
+
"@framers/agentos": ">=0.1.0",
|
|
66
78
|
"@types/node": "^20.12.12",
|
|
67
79
|
"typescript": "^5.4.5",
|
|
68
80
|
"vitest": "^1.0.0"
|
|
File without changes
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 1password
|
|
3
|
+
version: '1.0.0'
|
|
4
|
+
description: Query and retrieve items from 1Password vaults using the 1Password CLI for secure credential access.
|
|
5
|
+
author: Wunderland
|
|
6
|
+
namespace: wunderland
|
|
7
|
+
category: security
|
|
8
|
+
tags: [1password, passwords, secrets, vault, credentials, security]
|
|
9
|
+
requires_secrets: [1password.service_account_token]
|
|
10
|
+
requires_tools: []
|
|
11
|
+
metadata:
|
|
12
|
+
agentos:
|
|
13
|
+
emoji: "\U0001F510"
|
|
14
|
+
primaryEnv: OP_SERVICE_ACCOUNT_TOKEN
|
|
15
|
+
homepage: https://developer.1password.com/docs/cli
|
|
16
|
+
requires:
|
|
17
|
+
bins: ['op']
|
|
18
|
+
install:
|
|
19
|
+
- id: brew
|
|
20
|
+
kind: brew
|
|
21
|
+
formula: 1password-cli
|
|
22
|
+
bins: ['op']
|
|
23
|
+
label: 'Install 1Password CLI (brew)'
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# 1Password Vault Queries
|
|
27
|
+
|
|
28
|
+
You can query 1Password vaults to retrieve credentials, secure notes, API keys, and other secrets using the `op` CLI. This enables secure access to stored credentials without hardcoding secrets in code or configuration files.
|
|
29
|
+
|
|
30
|
+
When retrieving items, use `op item get` with the item name or UUID. Support querying specific fields (username, password, TOTP, custom fields) using the `--fields` flag. For listing items, filter by vault, category (login, secure-note, api-credential, credit-card), or tags. Always use the most specific identifier available to avoid ambiguous matches.
|
|
31
|
+
|
|
32
|
+
For security, never display full passwords or secret values in plain text unless the user explicitly requests it. Instead, confirm the item exists and describe its metadata (title, vault, category, last modified). When injecting secrets into environment variables or configuration files, use `op run` or `op inject` for ephemeral secret injection that avoids writing secrets to disk.
|
|
33
|
+
|
|
34
|
+
Support common workflows like looking up API keys for service integrations, retrieving database credentials for connection strings, and checking TOTP codes for two-factor authentication. When multiple items match a query, present a disambiguated list with vault and category context so the user can select the correct one.
|
|
35
|
+
|
|
36
|
+
## Examples
|
|
37
|
+
|
|
38
|
+
- "Look up the API key for our Stripe integration"
|
|
39
|
+
- "What vaults do I have access to?"
|
|
40
|
+
- "Get the database connection credentials from the Production vault"
|
|
41
|
+
- "Generate a TOTP code for my AWS account"
|
|
42
|
+
- "List all items tagged 'deploy' in the DevOps vault"
|
|
43
|
+
- "Inject secrets from the 'staging-env' item into environment variables"
|
|
44
|
+
|
|
45
|
+
## Constraints
|
|
46
|
+
|
|
47
|
+
- Requires the `op` CLI to be installed and authenticated (service account token or interactive sign-in).
|
|
48
|
+
- The agent can only access vaults and items that the authenticated account has permissions for.
|
|
49
|
+
- Biometric unlock is not available in non-interactive CLI sessions; use service account tokens.
|
|
50
|
+
- TOTP codes are time-sensitive and expire every 30 seconds.
|
|
51
|
+
- Cannot create, modify, or delete vault items -- read-only access for security.
|
|
52
|
+
- Session tokens expire after 30 minutes of inactivity by default.
|
|
53
|
+
- Do not log, cache, or persist retrieved secret values beyond the immediate use.
|