superskill 0.2.6 → 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/CHANGELOG.md +40 -0
- package/LICENSE +0 -4
- package/README.md +118 -134
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.js +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/skill/activate.d.ts +28 -0
- package/dist/commands/skill/activate.js +207 -0
- package/dist/commands/skill/activate.js.map +1 -0
- package/dist/commands/skill/catalog.d.ts +38 -3
- package/dist/commands/skill/catalog.js +125 -178
- package/dist/commands/skill/catalog.js.map +1 -1
- package/dist/commands/skill/generate.d.ts +28 -0
- package/dist/commands/skill/generate.js +180 -0
- package/dist/commands/skill/generate.js.map +1 -0
- package/dist/commands/skill/helpers.d.ts +14 -0
- package/dist/commands/skill/helpers.js +82 -0
- package/dist/commands/skill/helpers.js.map +1 -0
- package/dist/commands/skill/install.js +1 -1
- package/dist/commands/skill/install.js.map +1 -1
- package/dist/commands/skill/manifest.d.ts +26 -0
- package/dist/commands/skill/manifest.js +90 -0
- package/dist/commands/skill/manifest.js.map +1 -0
- package/dist/commands/skill/marketplace.d.ts +8 -122
- package/dist/commands/skill/marketplace.js +13 -591
- package/dist/commands/skill/marketplace.js.map +1 -1
- package/dist/commands/skill/resolve.d.ts +47 -0
- package/dist/commands/skill/resolve.js +101 -0
- package/dist/commands/skill/resolve.js.map +1 -0
- package/dist/commands/skill/validate.js +1 -1
- package/dist/commands/skill/validate.js.map +1 -1
- package/dist/commands/skill/web-discovery.d.ts +19 -15
- package/dist/commands/skill/web-discovery.js +107 -158
- package/dist/commands/skill/web-discovery.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/registry.js +3 -5
- package/dist/core/registry.js.map +1 -1
- package/dist/lib/analytics.d.ts +55 -0
- package/dist/lib/analytics.js +167 -0
- package/dist/lib/analytics.js.map +1 -0
- package/dist/lib/auto-profile.js +1 -1
- package/dist/lib/auto-profile.js.map +1 -1
- package/dist/lib/escape-regex.js +1 -1
- package/dist/lib/escape-regex.js.map +1 -1
- package/dist/lib/frontmatter.js +1 -1
- package/dist/lib/frontmatter.js.map +1 -1
- package/dist/lib/github-client.d.ts +19 -0
- package/dist/lib/github-client.js +68 -0
- package/dist/lib/github-client.js.map +1 -0
- package/dist/lib/project-detector.js +1 -1
- package/dist/lib/project-detector.js.map +1 -1
- package/dist/lib/registry-loader.d.ts +64 -0
- package/dist/lib/registry-loader.js +115 -0
- package/dist/lib/registry-loader.js.map +1 -0
- package/dist/lib/safe-external-path.js +1 -1
- package/dist/lib/safe-external-path.js.map +1 -1
- package/dist/lib/search-engine.js +1 -1
- package/dist/lib/search-engine.js.map +1 -1
- package/dist/lib/security-scanner.d.ts +16 -0
- package/dist/lib/security-scanner.js +44 -0
- package/dist/lib/security-scanner.js.map +1 -0
- package/dist/lib/session-registry.js +1 -1
- package/dist/lib/session-registry.js.map +1 -1
- package/dist/lib/skill-cache.d.ts +34 -0
- package/dist/lib/skill-cache.js +150 -0
- package/dist/lib/skill-cache.js.map +1 -0
- package/dist/lib/skill-registry.js +1 -1
- package/dist/lib/skill-registry.js.map +1 -1
- package/dist/lib/skill-session.d.ts +37 -0
- package/dist/lib/skill-session.js +62 -0
- package/dist/lib/skill-session.js.map +1 -0
- package/dist/lib/stack-detector.js +1 -1
- package/dist/lib/stack-detector.js.map +1 -1
- package/dist/lib/text-utils.d.ts +14 -0
- package/dist/lib/text-utils.js +45 -0
- package/dist/lib/text-utils.js.map +1 -0
- package/dist/lib/token-estimator.js +1 -1
- package/dist/lib/token-estimator.js.map +1 -1
- package/dist/lib/trigger-matcher.d.ts +45 -0
- package/dist/lib/trigger-matcher.js +129 -0
- package/dist/lib/trigger-matcher.js.map +1 -0
- package/dist/lib/url-utils.d.ts +17 -0
- package/dist/lib/url-utils.js +45 -0
- package/dist/lib/url-utils.js.map +1 -0
- package/dist/lib/vault-fs.js +1 -1
- package/dist/lib/vault-fs.js.map +1 -1
- package/dist/mcp-server.js +11 -1
- package/dist/mcp-server.js.map +1 -1
- package/dist/setup/configure.js +1 -1
- package/dist/setup/configure.js.map +1 -1
- package/dist/setup/detect.js +1 -1
- package/dist/setup/detect.js.map +1 -1
- package/dist/setup/instructions.js +1 -1
- package/dist/setup/instructions.js.map +1 -1
- package/dist/setup/json-config.js +1 -1
- package/dist/setup/json-config.js.map +1 -1
- package/dist/setup/postinstall.js +22 -1
- package/dist/setup/postinstall.js.map +1 -1
- package/dist/setup/preuninstall.js +1 -1
- package/dist/setup/preuninstall.js.map +1 -1
- package/dist/setup/teardown.js +1 -1
- package/dist/setup/teardown.js.map +1 -1
- package/dist/setup/toml-config.js +1 -1
- package/dist/setup/toml-config.js.map +1 -1
- package/dist/setup/types.js +1 -1
- package/dist/setup/types.js.map +1 -1
- package/dist/test-helpers.js +1 -1
- package/dist/test-helpers.js.map +1 -1
- package/package.json +3 -3
- package/registry/index.json +1162 -0
- package/LICENSE-COMMERCIAL.md +0 -46
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface CatalogResult {
|
|
2
|
+
total: number;
|
|
3
|
+
repos: {
|
|
4
|
+
repo: string;
|
|
5
|
+
count: number;
|
|
6
|
+
}[];
|
|
7
|
+
domains: {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
skill_count: number;
|
|
11
|
+
}[];
|
|
12
|
+
skills: import("./catalog.js").CatalogSkill[];
|
|
13
|
+
}
|
|
14
|
+
export interface CollisionResult {
|
|
15
|
+
collisions: Array<{
|
|
16
|
+
domain_id: string;
|
|
17
|
+
domain_name: string;
|
|
18
|
+
skills: Array<{
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
repo: string;
|
|
22
|
+
description: string;
|
|
23
|
+
}>;
|
|
24
|
+
}>;
|
|
25
|
+
total_collision_domains: number;
|
|
26
|
+
total_affected_skills: number;
|
|
27
|
+
}
|
|
28
|
+
export interface ResolveResult {
|
|
29
|
+
success: boolean;
|
|
30
|
+
profile_name: string;
|
|
31
|
+
resolutions: Array<{
|
|
32
|
+
domain: string;
|
|
33
|
+
chosen: string;
|
|
34
|
+
alternatives: string[];
|
|
35
|
+
}>;
|
|
36
|
+
active_skills: string[];
|
|
37
|
+
error?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function catalogCommand(options: {
|
|
40
|
+
domain?: string;
|
|
41
|
+
repo?: string;
|
|
42
|
+
search?: string;
|
|
43
|
+
}): Promise<CatalogResult>;
|
|
44
|
+
export declare function collisionsCommand(): Promise<CollisionResult>;
|
|
45
|
+
export declare function resolveCommand(options: {
|
|
46
|
+
profile?: string;
|
|
47
|
+
}): Promise<ResolveResult>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
import { getCatalog, getDomains, detectCollisions, searchCatalog, getProfile, getBuiltInProfiles, } from "./catalog.js";
|
|
3
|
+
// ── Commands ─────────────────────────────────────────
|
|
4
|
+
export async function catalogCommand(options) {
|
|
5
|
+
const filtered = searchCatalog({
|
|
6
|
+
domain: options.domain,
|
|
7
|
+
repo: options.repo,
|
|
8
|
+
text: options.search,
|
|
9
|
+
});
|
|
10
|
+
const repoCount = new Map();
|
|
11
|
+
const domainSkills = new Map();
|
|
12
|
+
for (const skill of filtered) {
|
|
13
|
+
repoCount.set(skill.repo, (repoCount.get(skill.repo) ?? 0) + 1);
|
|
14
|
+
for (const d of skill.domains) {
|
|
15
|
+
const set = domainSkills.get(d) ?? new Set();
|
|
16
|
+
set.add(skill.id);
|
|
17
|
+
domainSkills.set(d, set);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
total: filtered.length,
|
|
22
|
+
repos: Array.from(repoCount.entries())
|
|
23
|
+
.map(([repo, count]) => ({ repo, count }))
|
|
24
|
+
.sort((a, b) => b.count - a.count),
|
|
25
|
+
domains: Array.from(domainSkills.entries())
|
|
26
|
+
.map(([id, skills]) => ({
|
|
27
|
+
id,
|
|
28
|
+
name: getDomains().find((d) => d.id === id)?.name ?? id,
|
|
29
|
+
skill_count: skills.size,
|
|
30
|
+
}))
|
|
31
|
+
.sort((a, b) => b.skill_count - a.skill_count),
|
|
32
|
+
skills: filtered,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export async function collisionsCommand() {
|
|
36
|
+
const collisions = detectCollisions();
|
|
37
|
+
const affected = new Set();
|
|
38
|
+
const mapped = collisions.map((c) => {
|
|
39
|
+
const skills = c.skills.map((s) => {
|
|
40
|
+
affected.add(s.id);
|
|
41
|
+
return { id: s.id, name: s.name, repo: s.repo, description: s.description };
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
domain_id: c.domain.id,
|
|
45
|
+
domain_name: c.domain.name,
|
|
46
|
+
skills,
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
collisions: mapped,
|
|
51
|
+
total_collision_domains: mapped.length,
|
|
52
|
+
total_affected_skills: affected.size,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export async function resolveCommand(options) {
|
|
56
|
+
const profileName = options.profile ?? "ecc-first";
|
|
57
|
+
const profile = getProfile(profileName);
|
|
58
|
+
if (!profile) {
|
|
59
|
+
const available = getBuiltInProfiles().map((p) => p.name).join(", ");
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
profile_name: profileName,
|
|
63
|
+
resolutions: [],
|
|
64
|
+
active_skills: [],
|
|
65
|
+
error: `Unknown profile: "${profileName}". Available: ${available}`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const collisions = detectCollisions();
|
|
69
|
+
const collisionDomainIds = new Set(collisions.map((c) => c.domain.id));
|
|
70
|
+
// Build resolution report
|
|
71
|
+
const resolutions = profile.resolutions.map((r) => {
|
|
72
|
+
const collision = collisions.find((c) => c.domain.id === r.domain_id);
|
|
73
|
+
return {
|
|
74
|
+
domain: r.domain_id,
|
|
75
|
+
chosen: r.chosen_skill_id,
|
|
76
|
+
alternatives: collision
|
|
77
|
+
? collision.skills.filter((s) => s.id !== r.chosen_skill_id).map((s) => s.id)
|
|
78
|
+
: [],
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
// Collect active skill IDs: chosen winners + all non-colliding skills
|
|
82
|
+
const activeSkillIds = new Set();
|
|
83
|
+
// Add collision winners
|
|
84
|
+
for (const r of profile.resolutions) {
|
|
85
|
+
activeSkillIds.add(r.chosen_skill_id);
|
|
86
|
+
}
|
|
87
|
+
// Add non-colliding skills (domains with only one repo)
|
|
88
|
+
for (const skill of getCatalog()) {
|
|
89
|
+
const allDomainsNonColliding = skill.domains.every((d) => !collisionDomainIds.has(d));
|
|
90
|
+
if (allDomainsNonColliding) {
|
|
91
|
+
activeSkillIds.add(skill.id);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
success: true,
|
|
96
|
+
profile_name: profileName,
|
|
97
|
+
resolutions,
|
|
98
|
+
active_skills: [...activeSkillIds].sort(),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/commands/skill/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/commands/skill/validate.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/commands/skill/validate.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAoB,MAAM,aAAa,CAAC;AAYzE,KAAK,UAAU,QAAQ,CAAC,GAAW;IACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,KAAK,CAAC,MAAc;IAC3B,OAAO,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAwB;IAExB,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE9B,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,CAAC,wBAAyB,CAAW,CAAC,OAAO,EAAE,CAAC;SACzD,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAEzD,OAAO;QACL,KAAK;QACL,MAAM;QACN,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,IAAmC,CAAC,CAAC,CAAC,SAAS;KACrE,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
export { scanForPromptInjection } from "../../lib/security-scanner.js";
|
|
2
|
+
export { normalizeCacheKey } from "../../lib/text-utils.js";
|
|
3
|
+
export interface DiscoveryCacheEntry {
|
|
4
|
+
results: DiscoveredSkill[];
|
|
5
|
+
timestamp: string;
|
|
6
|
+
ttl_hours: number;
|
|
7
|
+
}
|
|
8
|
+
export interface DiscoveryCache {
|
|
9
|
+
entries: Record<string, DiscoveryCacheEntry>;
|
|
10
|
+
}
|
|
11
|
+
/** Visible for testing — override cache file path. */
|
|
12
|
+
export declare let _cacheFilePath: string;
|
|
13
|
+
export declare function _setCacheFilePath(p: string): void;
|
|
14
|
+
export declare function _resetCacheFilePath(): void;
|
|
5
15
|
export interface DiscoveredSkill {
|
|
6
16
|
name: string;
|
|
7
17
|
description: string;
|
|
@@ -16,10 +26,14 @@ export interface WebDiscoveryResult {
|
|
|
16
26
|
results: DiscoveredSkill[];
|
|
17
27
|
error?: string;
|
|
18
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Clear the discovery cache. Exported for testing.
|
|
31
|
+
*/
|
|
32
|
+
export declare function clearDiscoveryCache(): Promise<void>;
|
|
19
33
|
/**
|
|
20
34
|
* Search GitHub for SKILL.md files matching a task description.
|
|
21
35
|
* Uses the GitHub Search API (code search + repo search).
|
|
22
|
-
*
|
|
36
|
+
* Results are cached for 24 hours to avoid hitting GitHub API rate limits.
|
|
23
37
|
*/
|
|
24
38
|
export declare function searchGitHubForSkills(task: string): Promise<WebDiscoveryResult>;
|
|
25
39
|
/**
|
|
@@ -32,16 +46,6 @@ export declare function fetchDiscoveredSkill(sourceUrl: string): Promise<{
|
|
|
32
46
|
error?: string;
|
|
33
47
|
warnings?: string[];
|
|
34
48
|
}>;
|
|
35
|
-
/**
|
|
36
|
-
* Scan skill content for prompt injection patterns.
|
|
37
|
-
* Skills are markdown injected into LLM context — malicious content
|
|
38
|
-
* could instruct the LLM to exfiltrate data, run commands, or ignore user intent.
|
|
39
|
-
*/
|
|
40
|
-
export declare function scanForPromptInjection(content: string): {
|
|
41
|
-
blocked: boolean;
|
|
42
|
-
reason?: string;
|
|
43
|
-
warnings: string[];
|
|
44
|
-
};
|
|
45
49
|
/**
|
|
46
50
|
* Format discovery results for presentation to the user via the LLM.
|
|
47
51
|
*/
|
|
@@ -1,17 +1,108 @@
|
|
|
1
|
-
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
|
+
/**
|
|
3
|
+
* Web Discovery — search GitHub for skills not in the local catalog.
|
|
4
|
+
* Called as a fallback when activateSkills() finds zero matches.
|
|
5
|
+
*
|
|
6
|
+
* Delegates to focused modules:
|
|
7
|
+
* - github-client.ts — GitHub Search API
|
|
8
|
+
* - security-scanner.ts — prompt injection detection
|
|
9
|
+
* - text-utils.ts — keyword extraction
|
|
10
|
+
* - url-utils.ts — URL conversion, relative age formatting
|
|
11
|
+
*/
|
|
12
|
+
import { homedir } from "os";
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
import { readFile, writeFile, rename, mkdir } from "fs/promises";
|
|
15
|
+
import { searchGitHubCode, searchGitHubRepos } from "../../lib/github-client.js";
|
|
16
|
+
import { scanForPromptInjection } from "../../lib/security-scanner.js";
|
|
17
|
+
import { extractKeywords, buildSearchQuery, normalizeCacheKey } from "../../lib/text-utils.js";
|
|
18
|
+
import { toRawUrl, getRelativeAge } from "../../lib/url-utils.js";
|
|
19
|
+
// Re-export for backward compatibility
|
|
20
|
+
export { scanForPromptInjection } from "../../lib/security-scanner.js";
|
|
21
|
+
export { normalizeCacheKey } from "../../lib/text-utils.js";
|
|
22
|
+
const CACHE_DIR = join(homedir(), ".superskill");
|
|
23
|
+
const CACHE_FILE = join(CACHE_DIR, "discovery-cache.json");
|
|
24
|
+
const DEFAULT_TTL_HOURS = 24;
|
|
25
|
+
const MAX_CACHE_ENTRIES = 100;
|
|
26
|
+
/** Visible for testing — override cache file path. */
|
|
27
|
+
export let _cacheFilePath = CACHE_FILE;
|
|
28
|
+
export function _setCacheFilePath(p) {
|
|
29
|
+
_cacheFilePath = p;
|
|
30
|
+
}
|
|
31
|
+
export function _resetCacheFilePath() {
|
|
32
|
+
_cacheFilePath = CACHE_FILE;
|
|
33
|
+
}
|
|
34
|
+
// ── Cache Helpers ────────────────────────────────────
|
|
35
|
+
async function readCache() {
|
|
36
|
+
try {
|
|
37
|
+
const raw = await readFile(_cacheFilePath, "utf-8");
|
|
38
|
+
const parsed = JSON.parse(raw);
|
|
39
|
+
if (parsed && typeof parsed === "object" && parsed.entries && typeof parsed.entries === "object") {
|
|
40
|
+
return parsed;
|
|
41
|
+
}
|
|
42
|
+
return { entries: {} };
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return { entries: {} };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function writeCache(cache) {
|
|
49
|
+
try {
|
|
50
|
+
const dir = _cacheFilePath.substring(0, _cacheFilePath.lastIndexOf("/"));
|
|
51
|
+
await mkdir(dir, { recursive: true });
|
|
52
|
+
const tmp = _cacheFilePath + ".tmp." + process.pid;
|
|
53
|
+
await writeFile(tmp, JSON.stringify(cache, null, 2), "utf-8");
|
|
54
|
+
await rename(tmp, _cacheFilePath);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Never crash on cache write failure
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function isCacheEntryValid(entry) {
|
|
61
|
+
const age = Date.now() - new Date(entry.timestamp).getTime();
|
|
62
|
+
const ttlMs = (entry.ttl_hours || DEFAULT_TTL_HOURS) * 60 * 60 * 1000;
|
|
63
|
+
return age < ttlMs;
|
|
64
|
+
}
|
|
65
|
+
function evictOldest(cache) {
|
|
66
|
+
const keys = Object.keys(cache.entries);
|
|
67
|
+
if (keys.length <= MAX_CACHE_ENTRIES)
|
|
68
|
+
return;
|
|
69
|
+
const sorted = keys.sort((a, b) => {
|
|
70
|
+
const ta = new Date(cache.entries[a].timestamp).getTime();
|
|
71
|
+
const tb = new Date(cache.entries[b].timestamp).getTime();
|
|
72
|
+
return ta - tb;
|
|
73
|
+
});
|
|
74
|
+
const toRemove = sorted.slice(0, keys.length - MAX_CACHE_ENTRIES);
|
|
75
|
+
for (const key of toRemove) {
|
|
76
|
+
delete cache.entries[key];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Clear the discovery cache. Exported for testing.
|
|
81
|
+
*/
|
|
82
|
+
export async function clearDiscoveryCache() {
|
|
83
|
+
await writeCache({ entries: {} });
|
|
84
|
+
}
|
|
2
85
|
/**
|
|
3
86
|
* Search GitHub for SKILL.md files matching a task description.
|
|
4
87
|
* Uses the GitHub Search API (code search + repo search).
|
|
5
|
-
*
|
|
88
|
+
* Results are cached for 24 hours to avoid hitting GitHub API rate limits.
|
|
6
89
|
*/
|
|
7
90
|
export async function searchGitHubForSkills(task) {
|
|
8
91
|
const keywords = extractKeywords(task);
|
|
9
92
|
if (keywords.length === 0) {
|
|
10
93
|
return { success: false, results: [], error: "Could not extract search keywords from task" };
|
|
11
94
|
}
|
|
95
|
+
const cacheKey = normalizeCacheKey(task);
|
|
96
|
+
// Check cache
|
|
97
|
+
if (cacheKey) {
|
|
98
|
+
const cache = await readCache();
|
|
99
|
+
const entry = cache.entries[cacheKey];
|
|
100
|
+
if (entry && isCacheEntryValid(entry)) {
|
|
101
|
+
return { success: true, results: entry.results };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
12
104
|
const query = buildSearchQuery(keywords);
|
|
13
105
|
try {
|
|
14
|
-
// Search for repos with SKILL.md files matching keywords
|
|
15
106
|
const results = await Promise.allSettled([
|
|
16
107
|
searchGitHubCode(query),
|
|
17
108
|
searchGitHubRepos(keywords),
|
|
@@ -31,7 +122,19 @@ export async function searchGitHubForSkills(task) {
|
|
|
31
122
|
// Sort by stars descending (trust signal)
|
|
32
123
|
skills.sort((a, b) => b.stars - a.stars);
|
|
33
124
|
// Cap at 5 results
|
|
34
|
-
|
|
125
|
+
const capped = skills.slice(0, 5);
|
|
126
|
+
// Store in cache
|
|
127
|
+
if (cacheKey) {
|
|
128
|
+
const cache = await readCache();
|
|
129
|
+
cache.entries[cacheKey] = {
|
|
130
|
+
results: capped,
|
|
131
|
+
timestamp: new Date().toISOString(),
|
|
132
|
+
ttl_hours: DEFAULT_TTL_HOURS,
|
|
133
|
+
};
|
|
134
|
+
evictOldest(cache);
|
|
135
|
+
await writeCache(cache);
|
|
136
|
+
}
|
|
137
|
+
return { success: true, results: capped };
|
|
35
138
|
}
|
|
36
139
|
catch (err) {
|
|
37
140
|
return { success: false, results: [], error: `GitHub search failed: ${err.message}` };
|
|
@@ -49,15 +152,12 @@ export async function fetchDiscoveredSkill(sourceUrl) {
|
|
|
49
152
|
return { success: false, error: `HTTP ${res.status} ${res.statusText}` };
|
|
50
153
|
}
|
|
51
154
|
const content = await res.text();
|
|
52
|
-
// Basic validation — must look like a skill file
|
|
53
155
|
if (content.length < 50) {
|
|
54
156
|
return { success: false, error: "File too short to be a valid skill" };
|
|
55
157
|
}
|
|
56
|
-
// Size cap — skills over 50KB are suspicious
|
|
57
158
|
if (content.length > 50_000) {
|
|
58
159
|
return { success: false, error: "Skill file exceeds 50KB size limit — may not be a legitimate skill file" };
|
|
59
160
|
}
|
|
60
|
-
// Security scan
|
|
61
161
|
const securityResult = scanForPromptInjection(content);
|
|
62
162
|
if (securityResult.blocked) {
|
|
63
163
|
return { success: false, error: `Security risk detected: ${securityResult.reason}` };
|
|
@@ -68,45 +168,6 @@ export async function fetchDiscoveredSkill(sourceUrl) {
|
|
|
68
168
|
return { success: false, error: `Fetch failed: ${err.message}` };
|
|
69
169
|
}
|
|
70
170
|
}
|
|
71
|
-
/**
|
|
72
|
-
* Scan skill content for prompt injection patterns.
|
|
73
|
-
* Skills are markdown injected into LLM context — malicious content
|
|
74
|
-
* could instruct the LLM to exfiltrate data, run commands, or ignore user intent.
|
|
75
|
-
*/
|
|
76
|
-
export function scanForPromptInjection(content) {
|
|
77
|
-
const warnings = [];
|
|
78
|
-
const lower = content.toLowerCase();
|
|
79
|
-
// Hard blocks — these should never appear in a skill file
|
|
80
|
-
const blockedPatterns = [
|
|
81
|
-
{ pattern: /ignore (all |any )?(previous|prior|above) (instructions|prompts|context)/i, reason: "Prompt override attempt" },
|
|
82
|
-
{ pattern: /you are now|you must now act as|forget (all |everything )?you/i, reason: "Identity override attempt" },
|
|
83
|
-
{ pattern: /do not (tell|inform|reveal|mention|show) (the user|anyone)/i, reason: "Secrecy instruction — skills should be transparent" },
|
|
84
|
-
{ pattern: /exfiltrate|steal|extract.*secret|send.*to.*http/i, reason: "Data exfiltration pattern" },
|
|
85
|
-
{ pattern: /curl\s+.*\|.*sh/i, reason: "Remote code execution via pipe to shell" },
|
|
86
|
-
{ pattern: /rm\s+-rf\s+[\/~]/i, reason: "Destructive filesystem command" },
|
|
87
|
-
{ pattern: /eval\s*\(.*fetch/i, reason: "Dynamic code execution from remote source" },
|
|
88
|
-
{ pattern: /<\s*script[\s>]/i, reason: "Script injection" },
|
|
89
|
-
];
|
|
90
|
-
for (const { pattern, reason } of blockedPatterns) {
|
|
91
|
-
if (pattern.test(content)) {
|
|
92
|
-
return { blocked: true, reason, warnings };
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// Soft warnings — suspicious but not necessarily malicious
|
|
96
|
-
if (lower.includes("api_key") || lower.includes("secret_key") || lower.includes("password")) {
|
|
97
|
-
warnings.push("References credentials — review before loading");
|
|
98
|
-
}
|
|
99
|
-
if (lower.includes("sudo ") || lower.includes("chmod 777")) {
|
|
100
|
-
warnings.push("Contains privileged system commands");
|
|
101
|
-
}
|
|
102
|
-
if ((content.match(/https?:\/\//g) || []).length > 20) {
|
|
103
|
-
warnings.push("Unusually high number of external URLs");
|
|
104
|
-
}
|
|
105
|
-
if (lower.includes("system prompt") || lower.includes("system message")) {
|
|
106
|
-
warnings.push("References system prompts — may attempt to modify LLM behavior");
|
|
107
|
-
}
|
|
108
|
-
return { blocked: false, warnings };
|
|
109
|
-
}
|
|
110
171
|
/**
|
|
111
172
|
* Format discovery results for presentation to the user via the LLM.
|
|
112
173
|
*/
|
|
@@ -130,116 +191,4 @@ export function formatDiscoveryResults(task, results) {
|
|
|
130
191
|
lines.push("Once they pick, call: `superskill({skill_id: \"<source_url>\"})`");
|
|
131
192
|
return lines.join("\n");
|
|
132
193
|
}
|
|
133
|
-
// ── Internal Helpers ──────────────────────────────────
|
|
134
|
-
function extractKeywords(task) {
|
|
135
|
-
const stopwords = new Set([
|
|
136
|
-
"a", "an", "the", "is", "are", "was", "were", "be", "been", "being",
|
|
137
|
-
"have", "has", "had", "do", "does", "did", "will", "would", "could",
|
|
138
|
-
"should", "may", "might", "shall", "can", "need", "dare", "ought",
|
|
139
|
-
"used", "to", "of", "in", "for", "on", "with", "at", "by", "from",
|
|
140
|
-
"as", "into", "through", "during", "before", "after", "above", "below",
|
|
141
|
-
"between", "out", "off", "over", "under", "again", "further", "then",
|
|
142
|
-
"once", "here", "there", "when", "where", "why", "how", "all", "both",
|
|
143
|
-
"each", "few", "more", "most", "other", "some", "such", "no", "not",
|
|
144
|
-
"only", "own", "same", "so", "than", "too", "very", "just", "because",
|
|
145
|
-
"but", "and", "or", "if", "while", "about", "up", "that", "this",
|
|
146
|
-
"it", "its", "my", "me", "i", "we", "our", "you", "your", "help",
|
|
147
|
-
"get", "give", "make", "use", "want", "let", "try", "find", "show",
|
|
148
|
-
]);
|
|
149
|
-
return task
|
|
150
|
-
.toLowerCase()
|
|
151
|
-
.replace(/[^a-z0-9\s-]/g, "")
|
|
152
|
-
.split(/\s+/)
|
|
153
|
-
.filter((w) => w.length > 2 && !stopwords.has(w));
|
|
154
|
-
}
|
|
155
|
-
function buildSearchQuery(keywords) {
|
|
156
|
-
// Search for SKILL.md files matching keywords
|
|
157
|
-
return `${keywords.join(" ")} filename:SKILL`;
|
|
158
|
-
}
|
|
159
|
-
async function searchGitHubCode(query) {
|
|
160
|
-
const headers = {
|
|
161
|
-
Accept: "application/vnd.github.v3+json",
|
|
162
|
-
"User-Agent": "superskill",
|
|
163
|
-
};
|
|
164
|
-
const token = process.env.GITHUB_TOKEN;
|
|
165
|
-
if (token)
|
|
166
|
-
headers.Authorization = `Bearer ${token}`;
|
|
167
|
-
const url = `https://api.github.com/search/code?q=${encodeURIComponent(query)}&per_page=10`;
|
|
168
|
-
const res = await fetch(url, { headers });
|
|
169
|
-
if (!res.ok) {
|
|
170
|
-
if (res.status === 403)
|
|
171
|
-
return []; // Rate limited, fail gracefully
|
|
172
|
-
throw new Error(`GitHub code search: ${res.status} ${res.statusText}`);
|
|
173
|
-
}
|
|
174
|
-
const data = await res.json();
|
|
175
|
-
return (data.items ?? [])
|
|
176
|
-
.filter((item) => item.name.toLowerCase().includes("skill"))
|
|
177
|
-
.map((item) => ({
|
|
178
|
-
name: inferSkillName(item.path, item.repository.full_name),
|
|
179
|
-
description: item.repository.description ?? "No description",
|
|
180
|
-
source_url: item.html_url,
|
|
181
|
-
repo: item.repository.full_name,
|
|
182
|
-
stars: item.repository.stargazers_count,
|
|
183
|
-
updated_at: item.repository.updated_at,
|
|
184
|
-
path: item.path,
|
|
185
|
-
}));
|
|
186
|
-
}
|
|
187
|
-
async function searchGitHubRepos(keywords) {
|
|
188
|
-
const headers = {
|
|
189
|
-
Accept: "application/vnd.github.v3+json",
|
|
190
|
-
"User-Agent": "superskill",
|
|
191
|
-
};
|
|
192
|
-
const token = process.env.GITHUB_TOKEN;
|
|
193
|
-
if (token)
|
|
194
|
-
headers.Authorization = `Bearer ${token}`;
|
|
195
|
-
const query = `${keywords.join(" ")} skill claude in:name,description,readme`;
|
|
196
|
-
const url = `https://api.github.com/search/repositories?q=${encodeURIComponent(query)}&sort=stars&per_page=5`;
|
|
197
|
-
const res = await fetch(url, { headers });
|
|
198
|
-
if (!res.ok) {
|
|
199
|
-
if (res.status === 403)
|
|
200
|
-
return [];
|
|
201
|
-
throw new Error(`GitHub repo search: ${res.status} ${res.statusText}`);
|
|
202
|
-
}
|
|
203
|
-
const data = await res.json();
|
|
204
|
-
return (data.items ?? []).map((repo) => ({
|
|
205
|
-
name: repo.full_name.split("/")[1] ?? repo.full_name,
|
|
206
|
-
description: repo.description ?? "No description",
|
|
207
|
-
source_url: `${repo.html_url}/blob/main/SKILL.md`,
|
|
208
|
-
repo: repo.full_name,
|
|
209
|
-
stars: repo.stargazers_count,
|
|
210
|
-
updated_at: repo.updated_at,
|
|
211
|
-
path: "SKILL.md",
|
|
212
|
-
}));
|
|
213
|
-
}
|
|
214
|
-
function inferSkillName(path, repo) {
|
|
215
|
-
// Try to extract skill name from path like "skills/user-story/SKILL.md"
|
|
216
|
-
const parts = path.split("/");
|
|
217
|
-
if (parts.length >= 2) {
|
|
218
|
-
const dir = parts[parts.length - 2];
|
|
219
|
-
if (dir !== "skills" && dir !== ".agents") {
|
|
220
|
-
return dir.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return repo.split("/")[1]?.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()) ?? repo;
|
|
224
|
-
}
|
|
225
|
-
function toRawUrl(htmlUrl) {
|
|
226
|
-
// Convert github.com blob URL to raw.githubusercontent.com
|
|
227
|
-
return htmlUrl
|
|
228
|
-
.replace("github.com", "raw.githubusercontent.com")
|
|
229
|
-
.replace("/blob/", "/");
|
|
230
|
-
}
|
|
231
|
-
function getRelativeAge(dateStr) {
|
|
232
|
-
const now = Date.now();
|
|
233
|
-
const then = new Date(dateStr).getTime();
|
|
234
|
-
const days = Math.floor((now - then) / (1000 * 60 * 60 * 24));
|
|
235
|
-
if (days < 1)
|
|
236
|
-
return "today";
|
|
237
|
-
if (days === 1)
|
|
238
|
-
return "yesterday";
|
|
239
|
-
if (days < 30)
|
|
240
|
-
return `${days} days ago`;
|
|
241
|
-
if (days < 365)
|
|
242
|
-
return `${Math.floor(days / 30)} months ago`;
|
|
243
|
-
return `${Math.floor(days / 365)} years ago`;
|
|
244
|
-
}
|
|
245
194
|
//# sourceMappingURL=web-discovery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-discovery.js","sourceRoot":"","sources":["../../../src/commands/skill/web-discovery.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"web-discovery.js","sourceRoot":"","sources":["../../../src/commands/skill/web-discovery.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAQ1D;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,mEAAmE,CACjG,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,mDAAmD,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,YAA4B;IAE5B,IAAI,IAAI,GAAG,YAAY,IAAI,IAAI,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,aAAa,CAAC;IACpD,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QACnC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjB,sEAAsE;IACtE,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CACb,4CAA4C,IAAI,WAAW,SAAS,EAAE,CACvE,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9E,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAE3E,OAAO;QACL,SAAS;QACT,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACvG,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;KACjG,CAAC;AACJ,CAAC"}
|