@skillbase/spm 0.1.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/CHANGELOG.md +341 -0
- package/LICENSE +21 -0
- package/README.md +90 -0
- package/dist/cli/commands/connect.d.ts +3 -0
- package/dist/cli/commands/connect.d.ts.map +1 -0
- package/dist/cli/commands/connect.js +95 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/convert.d.ts +9 -0
- package/dist/cli/commands/convert.d.ts.map +1 -0
- package/dist/cli/commands/convert.js +189 -0
- package/dist/cli/commands/convert.js.map +1 -0
- package/dist/cli/commands/create.d.ts +4 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +104 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/info.d.ts +2 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js +51 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +53 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +6 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +272 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.d.ts +4 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +29 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/login.d.ts +10 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +141 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +6 -0
- package/dist/cli/commands/publish.d.ts.map +1 -0
- package/dist/cli/commands/publish.js +109 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/rate.d.ts +5 -0
- package/dist/cli/commands/rate.d.ts.map +1 -0
- package/dist/cli/commands/rate.js +22 -0
- package/dist/cli/commands/rate.js.map +1 -0
- package/dist/cli/commands/search.d.ts +5 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +70 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +2 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +33 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +2 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.js +37 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/commands/update.d.ts +5 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +97 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +2 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +72 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +159 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config.d.ts +7 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +72 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/feedback.d.ts +22 -0
- package/dist/core/feedback.d.ts.map +1 -0
- package/dist/core/feedback.js +93 -0
- package/dist/core/feedback.js.map +1 -0
- package/dist/core/github/client.d.ts +18 -0
- package/dist/core/github/client.d.ts.map +1 -0
- package/dist/core/github/client.js +141 -0
- package/dist/core/github/client.js.map +1 -0
- package/dist/core/indexer.d.ts +4 -0
- package/dist/core/indexer.d.ts.map +1 -0
- package/dist/core/indexer.js +90 -0
- package/dist/core/indexer.js.map +1 -0
- package/dist/core/loader.d.ts +3 -0
- package/dist/core/loader.d.ts.map +1 -0
- package/dist/core/loader.js +37 -0
- package/dist/core/loader.js.map +1 -0
- package/dist/core/lock.d.ts +4 -0
- package/dist/core/lock.d.ts.map +1 -0
- package/dist/core/lock.js +86 -0
- package/dist/core/lock.js.map +1 -0
- package/dist/core/manifest.d.ts +6 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +33 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/paths.d.ts +8 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +30 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/plugins/index.d.ts +8 -0
- package/dist/core/plugins/index.d.ts.map +1 -0
- package/dist/core/plugins/index.js +30 -0
- package/dist/core/plugins/index.js.map +1 -0
- package/dist/core/plugins/loader.d.ts +9 -0
- package/dist/core/plugins/loader.d.ts.map +1 -0
- package/dist/core/plugins/loader.js +57 -0
- package/dist/core/plugins/loader.js.map +1 -0
- package/dist/core/plugins/types.d.ts +79 -0
- package/dist/core/plugins/types.d.ts.map +1 -0
- package/dist/core/plugins/types.js +3 -0
- package/dist/core/plugins/types.js.map +1 -0
- package/dist/core/registry-client.d.ts +80 -0
- package/dist/core/registry-client.d.ts.map +1 -0
- package/dist/core/registry-client.js +166 -0
- package/dist/core/registry-client.js.map +1 -0
- package/dist/core/registry.d.ts +11 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +44 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/resolver.d.ts +17 -0
- package/dist/core/resolver.d.ts.map +1 -0
- package/dist/core/resolver.js +44 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/core/storage/index.d.ts +9 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +34 -0
- package/dist/core/storage/index.js.map +1 -0
- package/dist/core/storage/local-provider.d.ts +12 -0
- package/dist/core/storage/local-provider.d.ts.map +1 -0
- package/dist/core/storage/local-provider.js +44 -0
- package/dist/core/storage/local-provider.js.map +1 -0
- package/dist/core/storage/packager.d.ts +10 -0
- package/dist/core/storage/packager.d.ts.map +1 -0
- package/dist/core/storage/packager.js +185 -0
- package/dist/core/storage/packager.js.map +1 -0
- package/dist/core/storage/s3-provider.d.ts +12 -0
- package/dist/core/storage/s3-provider.d.ts.map +1 -0
- package/dist/core/storage/s3-provider.js +84 -0
- package/dist/core/storage/s3-provider.js.map +1 -0
- package/dist/core/storage/types.d.ts +27 -0
- package/dist/core/storage/types.d.ts.map +1 -0
- package/dist/core/storage/types.js +4 -0
- package/dist/core/storage/types.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +349 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/schema/skill-schema.d.ts +6 -0
- package/dist/schema/skill-schema.d.ts.map +1 -0
- package/dist/schema/skill-schema.js +147 -0
- package/dist/schema/skill-schema.js.map +1 -0
- package/dist/scripts/reindex.d.ts +3 -0
- package/dist/scripts/reindex.d.ts.map +1 -0
- package/dist/scripts/reindex.js +37 -0
- package/dist/scripts/reindex.js.map +1 -0
- package/dist/types/index.d.ts +191 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { SkillManifest } from "../types/index.js";
|
|
2
|
+
export declare function getDefaultManifest(): SkillManifest;
|
|
3
|
+
export declare function readManifest(cwd: string): Promise<SkillManifest | null>;
|
|
4
|
+
export declare function writeManifest(cwd: string, manifest: SkillManifest): Promise<void>;
|
|
5
|
+
export declare function addDependency(cwd: string, skillRef: string, version: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wBAAgB,kBAAkB,IAAI,aAAa,CAUlD;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAQ7E;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvF;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import { getManifestPath } from "./paths.js";
|
|
3
|
+
export function getDefaultManifest() {
|
|
4
|
+
return {
|
|
5
|
+
schema_version: 1,
|
|
6
|
+
name: "my-project",
|
|
7
|
+
version: "1.0.0",
|
|
8
|
+
description: "Project skill bundle",
|
|
9
|
+
dependencies: {},
|
|
10
|
+
author: "",
|
|
11
|
+
license: "MIT",
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export async function readManifest(cwd) {
|
|
15
|
+
const manifestPath = getManifestPath(cwd);
|
|
16
|
+
try {
|
|
17
|
+
const raw = await fs.readFile(manifestPath, "utf-8");
|
|
18
|
+
return JSON.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function writeManifest(cwd, manifest) {
|
|
25
|
+
const manifestPath = getManifestPath(cwd);
|
|
26
|
+
await fs.writeFile(manifestPath, JSON.stringify(manifest, null, 2) + "\n", "utf-8");
|
|
27
|
+
}
|
|
28
|
+
export async function addDependency(cwd, skillRef, version) {
|
|
29
|
+
const manifest = (await readManifest(cwd)) ?? getDefaultManifest();
|
|
30
|
+
manifest.dependencies[skillRef] = `^${version}`;
|
|
31
|
+
await writeManifest(cwd, manifest);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,sBAAsB;QACnC,YAAY,EAAE,EAAE;QAChB,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,QAAuB;IACtE,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,QAAgB,EAAE,OAAe;IAChF,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,kBAAkB,EAAE,CAAC;IACnE,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;IAChD,MAAM,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function getGlobalSkillsDir(): string;
|
|
2
|
+
export declare function getProjectSkillsDir(cwd: string): string;
|
|
3
|
+
export declare function getInstalledDir(skillsDir: string): string;
|
|
4
|
+
export declare function getIndexPath(skillsDir: string): string;
|
|
5
|
+
export declare function getFeedbackPath(skillsDir: string): string;
|
|
6
|
+
export declare function getConfigPath(skillsDir: string): string;
|
|
7
|
+
export declare function getManifestPath(cwd: string): string;
|
|
8
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAUA,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
const SKILLS_DIR_NAME = ".skills";
|
|
4
|
+
const INSTALLED_DIR = "installed";
|
|
5
|
+
const INDEX_FILE = "index.json";
|
|
6
|
+
const FEEDBACK_FILE = "feedback.json";
|
|
7
|
+
const CONFIG_FILE = "config.json";
|
|
8
|
+
const MANIFEST_FILE = "skill.json";
|
|
9
|
+
export function getGlobalSkillsDir() {
|
|
10
|
+
return path.join(os.homedir(), SKILLS_DIR_NAME);
|
|
11
|
+
}
|
|
12
|
+
export function getProjectSkillsDir(cwd) {
|
|
13
|
+
return path.join(cwd, SKILLS_DIR_NAME);
|
|
14
|
+
}
|
|
15
|
+
export function getInstalledDir(skillsDir) {
|
|
16
|
+
return path.join(skillsDir, INSTALLED_DIR);
|
|
17
|
+
}
|
|
18
|
+
export function getIndexPath(skillsDir) {
|
|
19
|
+
return path.join(skillsDir, INDEX_FILE);
|
|
20
|
+
}
|
|
21
|
+
export function getFeedbackPath(skillsDir) {
|
|
22
|
+
return path.join(skillsDir, FEEDBACK_FILE);
|
|
23
|
+
}
|
|
24
|
+
export function getConfigPath(skillsDir) {
|
|
25
|
+
return path.join(skillsDir, CONFIG_FILE);
|
|
26
|
+
}
|
|
27
|
+
export function getManifestPath(cwd) {
|
|
28
|
+
return path.join(cwd, MANIFEST_FILE);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,aAAa,GAAG,WAAW,CAAC;AAClC,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,aAAa,GAAG,YAAY,CAAC;AAEnC,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LoadContext } from "./types.js";
|
|
2
|
+
export declare function initPlugins(): Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* Runs all onLoad hooks in sequence, piping content through each transformer.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runLoadHooks(ctx: LoadContext): Promise<string>;
|
|
7
|
+
export type { SkillBasePlugin, LoadContext, LoadHookResult, } from "./types.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACZ,MAAM,YAAY,CAAC;AAOpB,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAOjD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpE;AAGD,YAAY,EACV,eAAe,EACf,WAAW,EACX,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { loadPlugins } from "./loader.js";
|
|
2
|
+
// ── Plugin Manager (singleton) ───────────────────────────────────────
|
|
3
|
+
let plugins = [];
|
|
4
|
+
export async function initPlugins() {
|
|
5
|
+
plugins = await loadPlugins();
|
|
6
|
+
for (const p of plugins) {
|
|
7
|
+
if (p.init) {
|
|
8
|
+
await p.init();
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Runs all onLoad hooks in sequence, piping content through each transformer.
|
|
14
|
+
*/
|
|
15
|
+
export async function runLoadHooks(ctx) {
|
|
16
|
+
let { content } = ctx;
|
|
17
|
+
for (const p of plugins) {
|
|
18
|
+
if (!p.onLoad)
|
|
19
|
+
continue;
|
|
20
|
+
try {
|
|
21
|
+
const result = await p.onLoad({ ...ctx, content });
|
|
22
|
+
content = result.content;
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
console.error(`[plugins] ${p.name}.onLoad error:`, err);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return content;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/plugins/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,wEAAwE;AAExE,IAAI,OAAO,GAAsB,EAAE,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAgB;IACjD,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAEtB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,MAAM;YAAE,SAAS;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YACnD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SkillBasePlugin } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Scans the `plugins/` directory at the project root for plugin modules.
|
|
4
|
+
* Each subdirectory must export an `SkillBasePlugin` as default or named `plugin`.
|
|
5
|
+
*
|
|
6
|
+
* Plugins are optional — if the directory doesn't exist, returns empty array.
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadPlugins(): Promise<SkillBasePlugin[]>;
|
|
9
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQlD;;;;;GAKG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAgD9D"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import semver from "semver";
|
|
5
|
+
import { createRequire } from "node:module";
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const { version: skillbaseVersion } = require("../../../package.json");
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
/**
|
|
10
|
+
* Scans the `plugins/` directory at the project root for plugin modules.
|
|
11
|
+
* Each subdirectory must export an `SkillBasePlugin` as default or named `plugin`.
|
|
12
|
+
*
|
|
13
|
+
* Plugins are optional — if the directory doesn't exist, returns empty array.
|
|
14
|
+
*/
|
|
15
|
+
export async function loadPlugins() {
|
|
16
|
+
const plugins = [];
|
|
17
|
+
// plugins/ directory lives at project root (3 levels up from src/core/plugins/)
|
|
18
|
+
const pluginsDir = path.resolve(__dirname, "../../../plugins");
|
|
19
|
+
let entries;
|
|
20
|
+
try {
|
|
21
|
+
entries = await fs.readdir(pluginsDir);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// No plugins directory — that's fine
|
|
25
|
+
return plugins;
|
|
26
|
+
}
|
|
27
|
+
for (const entry of entries) {
|
|
28
|
+
const pluginDir = path.join(pluginsDir, entry);
|
|
29
|
+
const stat = await fs.stat(pluginDir).catch(() => null);
|
|
30
|
+
if (!stat?.isDirectory())
|
|
31
|
+
continue;
|
|
32
|
+
// Try to import the plugin's index
|
|
33
|
+
const indexPath = path.join(pluginDir, "index.js");
|
|
34
|
+
const indexExists = await fs.access(indexPath).then(() => true).catch(() => false);
|
|
35
|
+
if (!indexExists)
|
|
36
|
+
continue;
|
|
37
|
+
try {
|
|
38
|
+
const mod = await import(indexPath);
|
|
39
|
+
const plugin = mod.default ?? mod.plugin;
|
|
40
|
+
if (!plugin?.name) {
|
|
41
|
+
console.warn(`[plugins] Skipping ${entry}: no valid plugin export found`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (plugin.compatibility && !semver.satisfies(skillbaseVersion, plugin.compatibility)) {
|
|
45
|
+
console.warn(`[plugins] Skipping ${plugin.name}: requires skillbase ${plugin.compatibility}, current ${skillbaseVersion}`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
plugins.push(plugin);
|
|
49
|
+
console.log(`[plugins] Loaded: ${plugin.name}`);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
console.warn(`[plugins] Failed to load ${entry}:`, err instanceof Error ? err.message : err);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return plugins;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/plugins/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export interface ScanDetail {
|
|
2
|
+
pattern: string;
|
|
3
|
+
line: number;
|
|
4
|
+
snippet: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ScanResult {
|
|
7
|
+
score: number;
|
|
8
|
+
status: "clean" | "flagged" | "blocked";
|
|
9
|
+
flags: string[];
|
|
10
|
+
details: ScanDetail[];
|
|
11
|
+
}
|
|
12
|
+
export interface PublishContext {
|
|
13
|
+
content: string;
|
|
14
|
+
manifest: Record<string, unknown>;
|
|
15
|
+
permissions: string[];
|
|
16
|
+
authorName: string;
|
|
17
|
+
}
|
|
18
|
+
export interface LoadContext {
|
|
19
|
+
content: string;
|
|
20
|
+
name: string;
|
|
21
|
+
version: string;
|
|
22
|
+
permissions: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface PluginFeedbackContext {
|
|
25
|
+
skillName: string;
|
|
26
|
+
result: string;
|
|
27
|
+
type: string;
|
|
28
|
+
rating?: number;
|
|
29
|
+
comment?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface PublishHookResult {
|
|
32
|
+
/** If "blocked", publish is rejected with 403. */
|
|
33
|
+
action: "allow" | "flag" | "block";
|
|
34
|
+
scan?: ScanResult;
|
|
35
|
+
/** Data to upsert into the plugin's own table (keyed by skill_id). */
|
|
36
|
+
tableData?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
export interface LoadHookResult {
|
|
39
|
+
/** Transformed content (e.g. with spotlighting delimiters). */
|
|
40
|
+
content: string;
|
|
41
|
+
}
|
|
42
|
+
export interface PluginTableColumn {
|
|
43
|
+
/** Column name in the plugin table. */
|
|
44
|
+
name: string;
|
|
45
|
+
/** SQL type. */
|
|
46
|
+
type: "text" | "real" | "integer" | "jsonb";
|
|
47
|
+
/** Value returned in API when the plugin is not loaded or row doesn't exist. */
|
|
48
|
+
fallback: unknown;
|
|
49
|
+
}
|
|
50
|
+
export interface PluginTable {
|
|
51
|
+
/** Table name (e.g. "skill_safety"). Must be globally unique. */
|
|
52
|
+
name: string;
|
|
53
|
+
/** Columns to expose in skill API responses (excluding skill_id). */
|
|
54
|
+
columns: PluginTableColumn[];
|
|
55
|
+
}
|
|
56
|
+
export interface SkillBasePlugin {
|
|
57
|
+
/** Unique plugin name. */
|
|
58
|
+
name: string;
|
|
59
|
+
/** Semver range of skillbase versions this plugin is compatible with (e.g. ">=0.1.0"). */
|
|
60
|
+
compatibility?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Declares a plugin-owned table joined to skills via skill_id.
|
|
63
|
+
* The framework handles LEFT JOIN in queries and UPSERT on publish.
|
|
64
|
+
*/
|
|
65
|
+
table?(): PluginTable;
|
|
66
|
+
/** SQL migrations to run on startup. Each string is an idempotent SQL statement. */
|
|
67
|
+
migrations?(ctx: {
|
|
68
|
+
tableName: string;
|
|
69
|
+
}): string[];
|
|
70
|
+
/** Called once during server startup (after migrations). */
|
|
71
|
+
init?(): Promise<void>;
|
|
72
|
+
/** Called when a skill is published. Can block or flag the publish. */
|
|
73
|
+
onPublish?(ctx: PublishContext): Promise<PublishHookResult>;
|
|
74
|
+
/** Called when a skill is loaded into an agent. Can transform content. */
|
|
75
|
+
onLoad?(ctx: LoadContext): Promise<LoadHookResult>;
|
|
76
|
+
/** Called when feedback is recorded. */
|
|
77
|
+
onFeedback?(ctx: PluginFeedbackContext): Promise<void>;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAID,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IACnC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC5C,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAID,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IAEb,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,KAAK,CAAC,IAAI,WAAW,CAAC;IAEtB,oFAAoF;IACpF,UAAU,CAAC,CAAC,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE,CAAC;IAElD,4DAA4D;IAC5D,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,uEAAuE;IACvE,SAAS,CAAC,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE5D,0EAA0E;IAC1E,MAAM,CAAC,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEnD,wCAAwC;IACxC,UAAU,CAAC,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/plugins/types.ts"],"names":[],"mappings":"AAAA,wEAAwE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { SkillsConfig, RemoteSkillEntry, RegistrySearchResult, SkillManifest } from "../types/index.js";
|
|
2
|
+
export interface PublishResult {
|
|
3
|
+
published: boolean;
|
|
4
|
+
name: string;
|
|
5
|
+
version: string;
|
|
6
|
+
updated: boolean;
|
|
7
|
+
size?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface DownloadResult {
|
|
10
|
+
name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
manifest: Record<string, unknown>;
|
|
13
|
+
integrity: string | null;
|
|
14
|
+
tokens_estimate: number;
|
|
15
|
+
download_url: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class RegistryClient {
|
|
18
|
+
private readonly url;
|
|
19
|
+
private readonly token?;
|
|
20
|
+
constructor(url: string, token?: string | undefined);
|
|
21
|
+
private headers;
|
|
22
|
+
private skillUrl;
|
|
23
|
+
search(query?: string, tag?: string, page?: number): Promise<RegistrySearchResult>;
|
|
24
|
+
getSkill(author: string, name: string): Promise<RemoteSkillEntry | null>;
|
|
25
|
+
getContent(author: string, name: string, version?: string): Promise<{
|
|
26
|
+
name: string;
|
|
27
|
+
version: string;
|
|
28
|
+
content: string;
|
|
29
|
+
manifest: SkillManifest;
|
|
30
|
+
integrity: string;
|
|
31
|
+
tokens_estimate: number;
|
|
32
|
+
}>;
|
|
33
|
+
publish(body: {
|
|
34
|
+
manifest: SkillManifest;
|
|
35
|
+
content: string;
|
|
36
|
+
compact_content?: string;
|
|
37
|
+
source?: {
|
|
38
|
+
type: "github";
|
|
39
|
+
url: string;
|
|
40
|
+
ref?: string;
|
|
41
|
+
path?: string;
|
|
42
|
+
};
|
|
43
|
+
}): Promise<PublishResult>;
|
|
44
|
+
publishWithArchive(metadata: {
|
|
45
|
+
manifest: SkillManifest;
|
|
46
|
+
content: string;
|
|
47
|
+
compact_content?: string;
|
|
48
|
+
}, archive: Buffer): Promise<PublishResult>;
|
|
49
|
+
getDownloadUrl(author: string, name: string, version?: string): Promise<DownloadResult>;
|
|
50
|
+
getVersions(author: string, name: string): Promise<{
|
|
51
|
+
version: string;
|
|
52
|
+
created_at: string;
|
|
53
|
+
}[]>;
|
|
54
|
+
startDeviceAuth(): Promise<{
|
|
55
|
+
session_id: string;
|
|
56
|
+
user_code: string;
|
|
57
|
+
verification_uri: string;
|
|
58
|
+
interval: number;
|
|
59
|
+
}>;
|
|
60
|
+
pollDeviceAuth(sessionId: string): Promise<{
|
|
61
|
+
status: string;
|
|
62
|
+
interval?: number;
|
|
63
|
+
author?: {
|
|
64
|
+
id: number;
|
|
65
|
+
name: string;
|
|
66
|
+
};
|
|
67
|
+
token?: string;
|
|
68
|
+
}>;
|
|
69
|
+
register(name: string, githubUsername?: string): Promise<{
|
|
70
|
+
author: {
|
|
71
|
+
id: number;
|
|
72
|
+
name: string;
|
|
73
|
+
};
|
|
74
|
+
token: string;
|
|
75
|
+
}>;
|
|
76
|
+
sendFeedback(author: string, skillName: string, result: string, comment?: string): Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
export declare function createRegistryClients(config: SkillsConfig): Map<string, RegistryClient>;
|
|
79
|
+
export declare function getClientForSkill(config: SkillsConfig, _skillRef: string): RegistryClient | null;
|
|
80
|
+
//# sourceMappingURL=registry-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-client.d.ts","sourceRoot":"","sources":["../../src/core/registry-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
export class RegistryClient {
|
|
2
|
+
url;
|
|
3
|
+
token;
|
|
4
|
+
constructor(url, token) {
|
|
5
|
+
this.url = url;
|
|
6
|
+
this.token = token;
|
|
7
|
+
}
|
|
8
|
+
headers() {
|
|
9
|
+
const h = { "Content-Type": "application/json" };
|
|
10
|
+
if (this.token)
|
|
11
|
+
h["Authorization"] = `Bearer ${this.token}`;
|
|
12
|
+
return h;
|
|
13
|
+
}
|
|
14
|
+
skillUrl(author, name) {
|
|
15
|
+
return `${this.url}/api/skills/${author}/${name}`;
|
|
16
|
+
}
|
|
17
|
+
async search(query, tag, page = 1) {
|
|
18
|
+
const params = new URLSearchParams();
|
|
19
|
+
if (query)
|
|
20
|
+
params.set("q", query);
|
|
21
|
+
if (tag)
|
|
22
|
+
params.set("tag", tag);
|
|
23
|
+
params.set("page", String(page));
|
|
24
|
+
const res = await fetch(`${this.url}/api/skills/search?${params}`, {
|
|
25
|
+
headers: this.headers(),
|
|
26
|
+
});
|
|
27
|
+
if (!res.ok)
|
|
28
|
+
throw new Error(`Registry search failed: ${res.status} ${res.statusText}`);
|
|
29
|
+
return (await res.json());
|
|
30
|
+
}
|
|
31
|
+
async getSkill(author, name) {
|
|
32
|
+
const res = await fetch(this.skillUrl(author, name), {
|
|
33
|
+
headers: this.headers(),
|
|
34
|
+
});
|
|
35
|
+
if (res.status === 404)
|
|
36
|
+
return null;
|
|
37
|
+
if (!res.ok)
|
|
38
|
+
throw new Error(`Registry request failed: ${res.status}`);
|
|
39
|
+
return (await res.json());
|
|
40
|
+
}
|
|
41
|
+
async getContent(author, name, version) {
|
|
42
|
+
const params = new URLSearchParams();
|
|
43
|
+
if (version)
|
|
44
|
+
params.set("version", version);
|
|
45
|
+
const res = await fetch(`${this.skillUrl(author, name)}/content?${params}`, { headers: this.headers() });
|
|
46
|
+
if (!res.ok)
|
|
47
|
+
throw new Error(`Failed to fetch skill content: ${res.status}`);
|
|
48
|
+
return (await res.json());
|
|
49
|
+
}
|
|
50
|
+
async publish(body) {
|
|
51
|
+
const res = await fetch(`${this.url}/api/skills`, {
|
|
52
|
+
method: "POST",
|
|
53
|
+
headers: this.headers(),
|
|
54
|
+
body: JSON.stringify(body),
|
|
55
|
+
});
|
|
56
|
+
if (!res.ok) {
|
|
57
|
+
const err = await res.json().catch(() => ({}));
|
|
58
|
+
throw new Error(`Publish failed: ${res.status} ${err.error ?? res.statusText}`);
|
|
59
|
+
}
|
|
60
|
+
return (await res.json());
|
|
61
|
+
}
|
|
62
|
+
async publishWithArchive(metadata, archive) {
|
|
63
|
+
const formData = new FormData();
|
|
64
|
+
formData.append("metadata", JSON.stringify(metadata));
|
|
65
|
+
formData.append("archive", new Blob([archive]), "skill.tar.gz");
|
|
66
|
+
const headers = {};
|
|
67
|
+
if (this.token)
|
|
68
|
+
headers["Authorization"] = `Bearer ${this.token}`;
|
|
69
|
+
const res = await fetch(`${this.url}/api/skills`, {
|
|
70
|
+
method: "POST",
|
|
71
|
+
headers,
|
|
72
|
+
body: formData,
|
|
73
|
+
});
|
|
74
|
+
if (!res.ok) {
|
|
75
|
+
const err = await res.json().catch(() => ({}));
|
|
76
|
+
throw new Error(`Publish failed: ${res.status} ${err.error ?? res.statusText}`);
|
|
77
|
+
}
|
|
78
|
+
return (await res.json());
|
|
79
|
+
}
|
|
80
|
+
async getDownloadUrl(author, name, version) {
|
|
81
|
+
const params = new URLSearchParams();
|
|
82
|
+
if (version)
|
|
83
|
+
params.set("version", version);
|
|
84
|
+
const res = await fetch(`${this.skillUrl(author, name)}/download?${params}`, { headers: this.headers() });
|
|
85
|
+
if (!res.ok)
|
|
86
|
+
throw new Error(`Failed to get download URL: ${res.status}`);
|
|
87
|
+
return (await res.json());
|
|
88
|
+
}
|
|
89
|
+
async getVersions(author, name) {
|
|
90
|
+
const res = await fetch(`${this.skillUrl(author, name)}/versions`, { headers: this.headers() });
|
|
91
|
+
if (res.status === 404)
|
|
92
|
+
return [];
|
|
93
|
+
if (!res.ok)
|
|
94
|
+
throw new Error(`Failed to fetch versions: ${res.status}`);
|
|
95
|
+
const data = (await res.json());
|
|
96
|
+
return data.versions;
|
|
97
|
+
}
|
|
98
|
+
async startDeviceAuth() {
|
|
99
|
+
const res = await fetch(`${this.url}/auth/github/device`, {
|
|
100
|
+
method: "POST",
|
|
101
|
+
headers: { "Content-Type": "application/json" },
|
|
102
|
+
body: JSON.stringify({}),
|
|
103
|
+
});
|
|
104
|
+
if (!res.ok) {
|
|
105
|
+
const err = await res.json().catch(() => ({}));
|
|
106
|
+
throw new Error(`GitHub auth failed: ${err.error ?? res.statusText}`);
|
|
107
|
+
}
|
|
108
|
+
return (await res.json());
|
|
109
|
+
}
|
|
110
|
+
async pollDeviceAuth(sessionId) {
|
|
111
|
+
const res = await fetch(`${this.url}/auth/github/device/poll`, {
|
|
112
|
+
method: "POST",
|
|
113
|
+
headers: { "Content-Type": "application/json" },
|
|
114
|
+
body: JSON.stringify({ session_id: sessionId }),
|
|
115
|
+
});
|
|
116
|
+
if (res.status === 410) {
|
|
117
|
+
throw new Error("Session expired. Please try again.");
|
|
118
|
+
}
|
|
119
|
+
if (res.status === 404) {
|
|
120
|
+
throw new Error("Session not found. Please try again.");
|
|
121
|
+
}
|
|
122
|
+
if (!res.ok) {
|
|
123
|
+
const err = await res.json().catch(() => ({}));
|
|
124
|
+
throw new Error(`Poll failed: ${err.error ?? res.statusText}`);
|
|
125
|
+
}
|
|
126
|
+
return (await res.json());
|
|
127
|
+
}
|
|
128
|
+
async register(name, githubUsername) {
|
|
129
|
+
const res = await fetch(`${this.url}/api/auth/register`, {
|
|
130
|
+
method: "POST",
|
|
131
|
+
headers: { "Content-Type": "application/json" },
|
|
132
|
+
body: JSON.stringify({ name, github_username: githubUsername }),
|
|
133
|
+
});
|
|
134
|
+
if (!res.ok) {
|
|
135
|
+
const err = await res.json().catch(() => ({}));
|
|
136
|
+
throw new Error(`Registration failed: ${err.error ?? res.statusText}`);
|
|
137
|
+
}
|
|
138
|
+
return (await res.json());
|
|
139
|
+
}
|
|
140
|
+
async sendFeedback(author, skillName, result, comment) {
|
|
141
|
+
const res = await fetch(`${this.skillUrl(author, skillName)}/feedback`, {
|
|
142
|
+
method: "POST",
|
|
143
|
+
headers: this.headers(),
|
|
144
|
+
body: JSON.stringify({ result, comment }),
|
|
145
|
+
});
|
|
146
|
+
if (!res.ok)
|
|
147
|
+
throw new Error(`Feedback failed: ${res.status}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export function createRegistryClients(config) {
|
|
151
|
+
const clients = new Map();
|
|
152
|
+
for (const reg of config.registries) {
|
|
153
|
+
clients.set(reg.name, new RegistryClient(reg.url, reg.token));
|
|
154
|
+
}
|
|
155
|
+
return clients;
|
|
156
|
+
}
|
|
157
|
+
export function getClientForSkill(config, _skillRef) {
|
|
158
|
+
const registryName = config.scopes["*"];
|
|
159
|
+
if (!registryName)
|
|
160
|
+
return null;
|
|
161
|
+
const reg = config.registries.find((r) => r.name === registryName);
|
|
162
|
+
if (!reg)
|
|
163
|
+
return null;
|
|
164
|
+
return new RegistryClient(reg.url, reg.token);
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=registry-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-client.js","sourceRoot":"","sources":["../../src/core/registry-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SkillIndex, IndexSkillEntry } from "../types/index.js";
|
|
2
|
+
export interface RegistryOptions {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Reads and merges skill indexes from project-level and global directories.
|
|
7
|
+
* Project skills override global ones by name.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getSkillIndex(options?: RegistryOptions): Promise<SkillIndex>;
|
|
10
|
+
export declare function findSkill(index: SkillIndex, name: string): IndexSkillEntry | undefined;
|
|
11
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAYrE,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CA4BtF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEtF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import { getGlobalSkillsDir, getProjectSkillsDir, getIndexPath } from "./paths.js";
|
|
3
|
+
async function readIndex(skillsDir) {
|
|
4
|
+
const indexPath = getIndexPath(skillsDir);
|
|
5
|
+
try {
|
|
6
|
+
const raw = await fs.readFile(indexPath, "utf-8");
|
|
7
|
+
return JSON.parse(raw);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Reads and merges skill indexes from project-level and global directories.
|
|
15
|
+
* Project skills override global ones by name.
|
|
16
|
+
*/
|
|
17
|
+
export async function getSkillIndex(options = {}) {
|
|
18
|
+
const cwd = options.cwd ?? process.cwd();
|
|
19
|
+
const globalDir = getGlobalSkillsDir();
|
|
20
|
+
const projectDir = getProjectSkillsDir(cwd);
|
|
21
|
+
const [globalIndex, projectIndex] = await Promise.all([
|
|
22
|
+
readIndex(globalDir),
|
|
23
|
+
readIndex(projectDir),
|
|
24
|
+
]);
|
|
25
|
+
const skillMap = new Map();
|
|
26
|
+
// Global first — project overrides
|
|
27
|
+
if (globalIndex) {
|
|
28
|
+
for (const skill of globalIndex.skills) {
|
|
29
|
+
skillMap.set(skill.name, skill);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (projectIndex) {
|
|
33
|
+
for (const skill of projectIndex.skills) {
|
|
34
|
+
skillMap.set(skill.name, skill);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const skills = Array.from(skillMap.values());
|
|
38
|
+
skills.sort((a, b) => b.priority - a.priority);
|
|
39
|
+
return { version: "1.0.0", skills };
|
|
40
|
+
}
|
|
41
|
+
export function findSkill(index, name) {
|
|
42
|
+
return index.skills.find((s) => s.name === name);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=registry.js.map
|