vskill 0.1.12 → 0.1.14
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/dist/agents/agents-registry.d.ts +3 -3
- package/dist/agents/agents-registry.js +116 -6
- package/dist/agents/agents-registry.js.map +1 -1
- package/dist/agents/agents-registry.test.js +20 -10
- package/dist/agents/agents-registry.test.js.map +1 -1
- package/dist/api/client.d.ts +6 -0
- package/dist/api/client.js +3 -0
- package/dist/api/client.js.map +1 -1
- package/dist/audit/fix-suggestions.js +15 -0
- package/dist/audit/fix-suggestions.js.map +1 -1
- package/dist/commands/add-wizard.test.js +69 -17
- package/dist/commands/add-wizard.test.js.map +1 -1
- package/dist/commands/add.d.ts +1 -0
- package/dist/commands/add.js +72 -25
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/add.test.js +63 -0
- package/dist/commands/add.test.js.map +1 -1
- package/dist/commands/find.d.ts +6 -1
- package/dist/commands/find.js +18 -1
- package/dist/commands/find.js.map +1 -1
- package/dist/commands/find.test.d.ts +1 -0
- package/dist/commands/find.test.js +50 -0
- package/dist/commands/find.test.js.map +1 -0
- package/dist/commands/info.d.ts +1 -0
- package/dist/commands/info.js +68 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/list.js +20 -4
- package/dist/commands/list.js.map +1 -1
- package/dist/discovery/github-tree.d.ts +12 -0
- package/dist/discovery/github-tree.js +56 -0
- package/dist/discovery/github-tree.js.map +1 -1
- package/dist/discovery/github-tree.test.js +47 -1
- package/dist/discovery/github-tree.test.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/lockfile/index.d.ts +1 -1
- package/dist/lockfile/index.js +1 -1
- package/dist/lockfile/index.js.map +1 -1
- package/dist/lockfile/lockfile.d.ts +8 -0
- package/dist/lockfile/lockfile.js +25 -0
- package/dist/lockfile/lockfile.js.map +1 -1
- package/dist/resolvers/url-resolver.d.ts +24 -0
- package/dist/resolvers/url-resolver.js +51 -0
- package/dist/resolvers/url-resolver.js.map +1 -0
- package/dist/resolvers/url-resolver.test.d.ts +1 -0
- package/dist/resolvers/url-resolver.test.js +49 -0
- package/dist/resolvers/url-resolver.test.js.map +1 -0
- package/dist/scanner/dci-integration.test.d.ts +1 -0
- package/dist/scanner/dci-integration.test.js +83 -0
- package/dist/scanner/dci-integration.test.js.map +1 -0
- package/dist/scanner/patterns.d.ts +2 -2
- package/dist/scanner/patterns.js +146 -1
- package/dist/scanner/patterns.js.map +1 -1
- package/dist/scanner/patterns.test.js +92 -2
- package/dist/scanner/patterns.test.js.map +1 -1
- package/dist/scanner/tier1.test.js +2 -2
- package/dist/utils/prompts.d.ts +18 -0
- package/dist/utils/prompts.js +73 -5
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/prompts.test.js +131 -1
- package/dist/utils/prompts.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Tests for find command (T-009)
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
5
|
+
const mockSearchSkills = vi.hoisted(() => vi.fn());
|
|
6
|
+
vi.mock("../api/client.js", () => ({
|
|
7
|
+
searchSkills: mockSearchSkills,
|
|
8
|
+
}));
|
|
9
|
+
// Capture console.log output
|
|
10
|
+
const logs = [];
|
|
11
|
+
const originalLog = console.log;
|
|
12
|
+
import { findCommand } from "./find.js";
|
|
13
|
+
describe("findCommand hints", () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
logs.length = 0;
|
|
16
|
+
vi.spyOn(console, "log").mockImplementation((...args) => {
|
|
17
|
+
logs.push(args.map(String).join(" "));
|
|
18
|
+
});
|
|
19
|
+
vi.spyOn(console, "error").mockImplementation(() => { });
|
|
20
|
+
mockSearchSkills.mockResolvedValue([
|
|
21
|
+
{ name: "test-skill", author: "test", tier: "VERIFIED", score: 90, installs: 100 },
|
|
22
|
+
]);
|
|
23
|
+
});
|
|
24
|
+
it("TC-030: non-TTY output includes hint line", async () => {
|
|
25
|
+
// Simulate non-TTY
|
|
26
|
+
const origIsTTY = process.stdout.isTTY;
|
|
27
|
+
Object.defineProperty(process.stdout, "isTTY", { value: false, configurable: true });
|
|
28
|
+
await findCommand("test", { json: false, noHint: false });
|
|
29
|
+
const output = logs.join("\n");
|
|
30
|
+
expect(output).toContain("To install: npx skills add");
|
|
31
|
+
Object.defineProperty(process.stdout, "isTTY", { value: origIsTTY, configurable: true });
|
|
32
|
+
});
|
|
33
|
+
it("TC-031: hint is suppressed with --json flag", async () => {
|
|
34
|
+
const origIsTTY = process.stdout.isTTY;
|
|
35
|
+
Object.defineProperty(process.stdout, "isTTY", { value: false, configurable: true });
|
|
36
|
+
await findCommand("test", { json: true, noHint: false });
|
|
37
|
+
const output = logs.join("\n");
|
|
38
|
+
expect(output).not.toContain("To install: npx skills add");
|
|
39
|
+
Object.defineProperty(process.stdout, "isTTY", { value: origIsTTY, configurable: true });
|
|
40
|
+
});
|
|
41
|
+
it("TC-032: hint is suppressed with --no-hint flag", async () => {
|
|
42
|
+
const origIsTTY = process.stdout.isTTY;
|
|
43
|
+
Object.defineProperty(process.stdout, "isTTY", { value: false, configurable: true });
|
|
44
|
+
await findCommand("test", { json: false, noHint: true });
|
|
45
|
+
const output = logs.join("\n");
|
|
46
|
+
expect(output).not.toContain("To install: npx skills add");
|
|
47
|
+
Object.defineProperty(process.stdout, "isTTY", { value: origIsTTY, configurable: true });
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=find.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.test.js","sourceRoot":"","sources":["../../src/commands/find.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function infoCommand(skillName: string): Promise<void>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// vskill info -- display detailed information about a skill
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
import { getSkill } from "../api/client.js";
|
|
5
|
+
import { bold, green, red, yellow, dim, cyan, spinner } from "../utils/output.js";
|
|
6
|
+
function getTrustLabel(tier) {
|
|
7
|
+
switch (tier) {
|
|
8
|
+
case "T0": return "Blocked";
|
|
9
|
+
case "T1": return "Unscanned";
|
|
10
|
+
case "T2": return "Scanned";
|
|
11
|
+
case "T3": return "Verified";
|
|
12
|
+
case "T4": return "Certified";
|
|
13
|
+
default: return "Unknown";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function getTrustColor(tier) {
|
|
17
|
+
switch (tier) {
|
|
18
|
+
case "T0": return red;
|
|
19
|
+
case "T1": return yellow;
|
|
20
|
+
case "T2": return cyan;
|
|
21
|
+
case "T3": return green;
|
|
22
|
+
case "T4": return green;
|
|
23
|
+
default: return dim;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function infoCommand(skillName) {
|
|
27
|
+
const spin = spinner("Looking up skill");
|
|
28
|
+
try {
|
|
29
|
+
const detail = await getSkill(skillName);
|
|
30
|
+
spin.stop(green(`Found: ${detail.name}`));
|
|
31
|
+
console.log("");
|
|
32
|
+
console.log(` ${bold("Name:")} ${detail.name}`);
|
|
33
|
+
console.log(` ${bold("Author:")} ${detail.author}`);
|
|
34
|
+
console.log(` ${bold("Description:")} ${detail.description}`);
|
|
35
|
+
console.log(` ${bold("Version:")} ${detail.version}`);
|
|
36
|
+
console.log(` ${bold("Installs:")} ${detail.installs}`);
|
|
37
|
+
console.log(` ${bold("Updated:")} ${detail.updatedAt}`);
|
|
38
|
+
if (detail.repoUrl) {
|
|
39
|
+
console.log(` ${bold("Repository:")} ${detail.repoUrl}`);
|
|
40
|
+
}
|
|
41
|
+
// Certification tier
|
|
42
|
+
console.log(` ${bold("Cert Tier:")} ${detail.tier} (score: ${detail.score}/100)`);
|
|
43
|
+
// Trust tier and score
|
|
44
|
+
if (detail.trustTier) {
|
|
45
|
+
const color = getTrustColor(detail.trustTier);
|
|
46
|
+
console.log(` ${bold("Trust Tier:")} ${color(`${detail.trustTier} (${getTrustLabel(detail.trustTier)})`)}` +
|
|
47
|
+
(detail.trustScore != null ? ` ${dim(`score ${detail.trustScore}/100`)}` : ""));
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
console.log(` ${bold("Trust Tier:")} ${dim("not available")}`);
|
|
51
|
+
}
|
|
52
|
+
// Provenance verification
|
|
53
|
+
if (detail.provenanceVerified != null) {
|
|
54
|
+
const provLabel = detail.provenanceVerified
|
|
55
|
+
? green("Verified")
|
|
56
|
+
: yellow("Not verified");
|
|
57
|
+
console.log(` ${bold("Provenance:")} ${provLabel}`);
|
|
58
|
+
}
|
|
59
|
+
console.log("");
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
spin.stop();
|
|
63
|
+
console.error(red(`Skill "${skillName}" not found in registry.\n`) +
|
|
64
|
+
dim(`Use ${cyan("vskill find <query>")} to search.`));
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/list.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
2
|
// vskill list -- show installed skills or detected agents
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
|
-
import { readLockfile } from "../lockfile/index.js";
|
|
4
|
+
import { readLockfile, readSkillsShLock } from "../lockfile/index.js";
|
|
5
5
|
import { detectInstalledAgents, AGENTS_REGISTRY, } from "../agents/agents-registry.js";
|
|
6
6
|
import { bold, green, dim, cyan, yellow, table } from "../utils/output.js";
|
|
7
7
|
export async function listCommand(opts) {
|
|
@@ -52,12 +52,16 @@ async function listSkills(json) {
|
|
|
52
52
|
console.log(JSON.stringify(lock.skills, null, 2));
|
|
53
53
|
return;
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
// Also read skills.sh lock file for cross-tool visibility
|
|
56
|
+
const skillsShEntries = readSkillsShLock();
|
|
57
|
+
const skillsShNames = new Set(skillsShEntries.map((e) => e.name));
|
|
58
|
+
if (skillNames.length === 0 && skillsShNames.size === 0) {
|
|
56
59
|
console.log(dim("No skills installed yet."));
|
|
57
|
-
console.log(dim(`Run ${cyan("vskill
|
|
60
|
+
console.log(dim(`Run ${cyan("vskill install <owner/repo>")} to install a skill.`));
|
|
58
61
|
return;
|
|
59
62
|
}
|
|
60
|
-
|
|
63
|
+
const totalCount = skillNames.length + [...skillsShNames].filter((n) => !lock.skills[n]).length;
|
|
64
|
+
console.log(bold(`Installed Skills (${totalCount})\n`));
|
|
61
65
|
const headers = ["Skill", "Version", "Tier", "Source", "Installed"];
|
|
62
66
|
const rows = skillNames.map((name) => {
|
|
63
67
|
const s = lock.skills[name];
|
|
@@ -74,6 +78,18 @@ async function listSkills(json) {
|
|
|
74
78
|
dim(s.installedAt ? new Date(s.installedAt).toLocaleDateString() : "-"),
|
|
75
79
|
];
|
|
76
80
|
});
|
|
81
|
+
// Append skills from .skill-lock.json that aren't already in vskill.lock
|
|
82
|
+
for (const entry of skillsShEntries) {
|
|
83
|
+
if (!lock.skills[entry.name]) {
|
|
84
|
+
rows.push([
|
|
85
|
+
bold(entry.name),
|
|
86
|
+
"-",
|
|
87
|
+
dim("SCANNED"),
|
|
88
|
+
dim("skills.sh"),
|
|
89
|
+
dim("-"),
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
77
93
|
console.log(table(headers, rows));
|
|
78
94
|
}
|
|
79
95
|
//# sourceMappingURL=list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,0DAA0D;AAC1D,8EAA8E;AAE9E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,16 @@ export interface DiscoveredSkill {
|
|
|
2
2
|
name: string;
|
|
3
3
|
path: string;
|
|
4
4
|
rawUrl: string;
|
|
5
|
+
description?: string;
|
|
5
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Extract a short description from SKILL.md content.
|
|
9
|
+
*
|
|
10
|
+
* Skips: blank lines, lines starting with `#`, YAML frontmatter delimiters (`---`).
|
|
11
|
+
* Returns the first content line, truncated to 80 chars.
|
|
12
|
+
* Returns undefined if no content line is found.
|
|
13
|
+
*/
|
|
14
|
+
export declare function extractDescription(content: string): string | undefined;
|
|
6
15
|
/**
|
|
7
16
|
* Discover all SKILL.md files in a GitHub repo using the Trees API.
|
|
8
17
|
*
|
|
@@ -10,6 +19,9 @@ export interface DiscoveredSkill {
|
|
|
10
19
|
* - Root `SKILL.md` (name = repo)
|
|
11
20
|
* - `skills/{name}/SKILL.md` (name = directory name, one level deep only)
|
|
12
21
|
*
|
|
22
|
+
* After discovery, fetches content for each skill in parallel (3s timeout)
|
|
23
|
+
* to populate the `description` field.
|
|
24
|
+
*
|
|
13
25
|
* Returns empty array on any API error (caller falls back to single-skill fetch).
|
|
14
26
|
*/
|
|
15
27
|
export declare function discoverSkills(owner: string, repo: string): Promise<DiscoveredSkill[]>;
|
|
@@ -1,6 +1,43 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
2
|
// GitHub Trees API skill discovery
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* Extract a short description from SKILL.md content.
|
|
6
|
+
*
|
|
7
|
+
* Skips: blank lines, lines starting with `#`, YAML frontmatter delimiters (`---`).
|
|
8
|
+
* Returns the first content line, truncated to 80 chars.
|
|
9
|
+
* Returns undefined if no content line is found.
|
|
10
|
+
*/
|
|
11
|
+
export function extractDescription(content) {
|
|
12
|
+
const lines = content.split("\n");
|
|
13
|
+
let inFrontmatter = false;
|
|
14
|
+
let frontmatterSeen = false;
|
|
15
|
+
for (const line of lines) {
|
|
16
|
+
const trimmed = line.trim();
|
|
17
|
+
// Handle YAML frontmatter
|
|
18
|
+
if (trimmed === "---") {
|
|
19
|
+
if (!frontmatterSeen) {
|
|
20
|
+
inFrontmatter = true;
|
|
21
|
+
frontmatterSeen = true;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
else if (inFrontmatter) {
|
|
25
|
+
inFrontmatter = false;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (inFrontmatter)
|
|
30
|
+
continue;
|
|
31
|
+
// Skip blank lines and headings
|
|
32
|
+
if (trimmed === "" || trimmed.startsWith("#"))
|
|
33
|
+
continue;
|
|
34
|
+
// First real content line
|
|
35
|
+
if (trimmed.length <= 80)
|
|
36
|
+
return trimmed;
|
|
37
|
+
return trimmed.slice(0, 77) + "...";
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
4
41
|
/**
|
|
5
42
|
* Discover all SKILL.md files in a GitHub repo using the Trees API.
|
|
6
43
|
*
|
|
@@ -8,6 +45,9 @@
|
|
|
8
45
|
* - Root `SKILL.md` (name = repo)
|
|
9
46
|
* - `skills/{name}/SKILL.md` (name = directory name, one level deep only)
|
|
10
47
|
*
|
|
48
|
+
* After discovery, fetches content for each skill in parallel (3s timeout)
|
|
49
|
+
* to populate the `description` field.
|
|
50
|
+
*
|
|
11
51
|
* Returns empty array on any API error (caller falls back to single-skill fetch).
|
|
12
52
|
*/
|
|
13
53
|
export async function discoverSkills(owner, repo) {
|
|
@@ -51,6 +91,22 @@ export async function discoverSkills(owner, repo) {
|
|
|
51
91
|
});
|
|
52
92
|
}
|
|
53
93
|
}
|
|
94
|
+
// Fetch descriptions in parallel with a 3s timeout per skill
|
|
95
|
+
await Promise.allSettled(skills.map(async (skill) => {
|
|
96
|
+
try {
|
|
97
|
+
const controller = new AbortController();
|
|
98
|
+
const timer = setTimeout(() => controller.abort(), 3000);
|
|
99
|
+
const res = await fetch(skill.rawUrl, { signal: controller.signal });
|
|
100
|
+
clearTimeout(timer);
|
|
101
|
+
if (!res.ok)
|
|
102
|
+
return;
|
|
103
|
+
const content = await res.text();
|
|
104
|
+
skill.description = extractDescription(content);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Timeout or network error — leave description undefined
|
|
108
|
+
}
|
|
109
|
+
}));
|
|
54
110
|
return skills;
|
|
55
111
|
}
|
|
56
112
|
//# sourceMappingURL=github-tree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-tree.js","sourceRoot":"","sources":["../../src/discovery/github-tree.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;
|
|
1
|
+
{"version":3,"file":"github-tree.js","sourceRoot":"","sources":["../../src/discovery/github-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { describe, it, expect, vi, afterEach } from "vitest";
|
|
|
2
2
|
// ---------------------------------------------------------------------------
|
|
3
3
|
// Import module under test
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
|
-
import { discoverSkills } from "./github-tree.js";
|
|
5
|
+
import { discoverSkills, extractDescription } from "./github-tree.js";
|
|
6
6
|
// ---------------------------------------------------------------------------
|
|
7
7
|
// Helpers
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
@@ -125,6 +125,24 @@ describe("discoverSkills", () => {
|
|
|
125
125
|
expect(names).not.toContain("examples");
|
|
126
126
|
expect(names).not.toContain("nested");
|
|
127
127
|
});
|
|
128
|
+
// TC-021: discoverSkills populates descriptions from fetched content
|
|
129
|
+
it("populates description field from SKILL.md content", async () => {
|
|
130
|
+
const mockFetch = vi.fn()
|
|
131
|
+
.mockResolvedValueOnce({
|
|
132
|
+
ok: true,
|
|
133
|
+
json: async () => makeTreeResponse(["skills/foo/SKILL.md", "skills/bar/SKILL.md"]),
|
|
134
|
+
})
|
|
135
|
+
.mockResolvedValue({
|
|
136
|
+
ok: true,
|
|
137
|
+
text: async () => "# Foo Skill\n\nThis skill does X",
|
|
138
|
+
});
|
|
139
|
+
globalThis.fetch = mockFetch;
|
|
140
|
+
const result = await discoverSkills("owner", "repo");
|
|
141
|
+
expect(result).toHaveLength(2);
|
|
142
|
+
// At least one skill should have a description populated
|
|
143
|
+
const hasDescription = result.some((s) => s.description !== undefined);
|
|
144
|
+
expect(hasDescription).toBe(true);
|
|
145
|
+
});
|
|
128
146
|
// Calls correct GitHub Trees API URL
|
|
129
147
|
it("calls the GitHub Trees API with correct URL", async () => {
|
|
130
148
|
const mockFetch = vi.fn().mockResolvedValue({
|
|
@@ -140,4 +158,32 @@ describe("discoverSkills", () => {
|
|
|
140
158
|
}));
|
|
141
159
|
});
|
|
142
160
|
});
|
|
161
|
+
describe("extractDescription", () => {
|
|
162
|
+
it("returns first non-heading, non-empty line as description", () => {
|
|
163
|
+
const content = "# Title\n\nThis skill does X\n\nMore content";
|
|
164
|
+
expect(extractDescription(content)).toBe("This skill does X");
|
|
165
|
+
});
|
|
166
|
+
it("truncates description at 80 chars with ellipsis", () => {
|
|
167
|
+
const longLine = "A".repeat(120);
|
|
168
|
+
const content = `# Title\n\n${longLine}`;
|
|
169
|
+
const result = extractDescription(content);
|
|
170
|
+
expect(result).toBe("A".repeat(77) + "...");
|
|
171
|
+
expect(result.length).toBe(80);
|
|
172
|
+
});
|
|
173
|
+
it("skips YAML frontmatter delimiters", () => {
|
|
174
|
+
const content = "---\ntitle: foo\n---\n# Title\nDescription here";
|
|
175
|
+
expect(extractDescription(content)).toBe("Description here");
|
|
176
|
+
});
|
|
177
|
+
it("returns undefined when content has only headings", () => {
|
|
178
|
+
const content = "# Title\n## Section\n### Subsection";
|
|
179
|
+
expect(extractDescription(content)).toBeUndefined();
|
|
180
|
+
});
|
|
181
|
+
it("returns undefined for empty content", () => {
|
|
182
|
+
expect(extractDescription("")).toBeUndefined();
|
|
183
|
+
});
|
|
184
|
+
it("skips blank lines before first content line", () => {
|
|
185
|
+
const content = "\n\n# Title\n\n\nActual description";
|
|
186
|
+
expect(extractDescription(content)).toBe("Actual description");
|
|
187
|
+
});
|
|
188
|
+
});
|
|
143
189
|
//# sourceMappingURL=github-tree.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-tree.test.js","sourceRoot":"","sources":["../../src/discovery/github-tree.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAc,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEzE,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"github-tree.test.js","sourceRoot":"","sources":["../../src/discovery/github-tree.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -24,6 +24,7 @@ program
|
|
|
24
24
|
.option("--force", "Install even if scan finds issues")
|
|
25
25
|
.option("--agent <id>", "Install to specific agent only (repeatable)", collect, [])
|
|
26
26
|
.option("--cwd", "Install relative to current directory instead of project root")
|
|
27
|
+
.option("--copy", "Install as independent copies instead of symlinks (default: symlink)")
|
|
27
28
|
.option("-y, --yes", "Skip all prompts, use defaults (all skills, all agents, project scope, symlink)")
|
|
28
29
|
.action(async (source, opts) => {
|
|
29
30
|
const { addCommand } = await import("./commands/add.js");
|
|
@@ -110,6 +111,13 @@ program
|
|
|
110
111
|
maxFiles: opts.maxFiles,
|
|
111
112
|
});
|
|
112
113
|
});
|
|
114
|
+
program
|
|
115
|
+
.command("info <skill-name>")
|
|
116
|
+
.description("Display detailed information about a skill from the registry")
|
|
117
|
+
.action(async (skillName) => {
|
|
118
|
+
const { infoCommand } = await import("./commands/info.js");
|
|
119
|
+
await infoCommand(skillName);
|
|
120
|
+
});
|
|
113
121
|
program
|
|
114
122
|
.command("blocklist [subcommand] [name]")
|
|
115
123
|
.description("Manage the malicious skills blocklist")
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lockfile/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export type { VskillLock, SkillLockEntry } from "./types.js";
|
|
2
|
-
export { readLockfile, writeLockfile, ensureLockfile, addSkillToLock, removeSkillFromLock, } from "./lockfile.js";
|
|
2
|
+
export { readLockfile, writeLockfile, ensureLockfile, addSkillToLock, removeSkillFromLock, readSkillsShLock, } from "./lockfile.js";
|
|
3
3
|
export { findProjectRoot, getProjectRoot } from "./project-root.js";
|
package/dist/lockfile/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { readLockfile, writeLockfile, ensureLockfile, addSkillToLock, removeSkillFromLock, } from "./lockfile.js";
|
|
1
|
+
export { readLockfile, writeLockfile, ensureLockfile, addSkillToLock, removeSkillFromLock, readSkillsShLock, } from "./lockfile.js";
|
|
2
2
|
export { findProjectRoot, getProjectRoot } from "./project-root.js";
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lockfile/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,cAAc,EACd,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lockfile/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -17,6 +17,14 @@ export declare function ensureLockfile(dir?: string): VskillLock;
|
|
|
17
17
|
* Add or update a skill entry in the lockfile.
|
|
18
18
|
*/
|
|
19
19
|
export declare function addSkillToLock(name: string, info: SkillLockEntry, dir?: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Read .skill-lock.json (skills.sh lock file) for cross-tool visibility.
|
|
22
|
+
* Returns skill names found, or empty array if file doesn't exist.
|
|
23
|
+
*/
|
|
24
|
+
export declare function readSkillsShLock(dir?: string): {
|
|
25
|
+
name: string;
|
|
26
|
+
source: string;
|
|
27
|
+
}[];
|
|
20
28
|
/**
|
|
21
29
|
* Remove a skill entry from the lockfile.
|
|
22
30
|
*/
|
|
@@ -5,6 +5,7 @@ import { readFileSync, writeFileSync, existsSync } from "node:fs";
|
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { getProjectRoot } from "./project-root.js";
|
|
7
7
|
const LOCKFILE_NAME = "vskill.lock";
|
|
8
|
+
const SKILLS_SH_LOCKFILE = ".skill-lock.json";
|
|
8
9
|
function lockPath(dir) {
|
|
9
10
|
return join(dir ?? getProjectRoot(), LOCKFILE_NAME);
|
|
10
11
|
}
|
|
@@ -58,6 +59,30 @@ export function addSkillToLock(name, info, dir) {
|
|
|
58
59
|
lock.skills[name] = info;
|
|
59
60
|
writeLockfile(lock, dir);
|
|
60
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Read .skill-lock.json (skills.sh lock file) for cross-tool visibility.
|
|
64
|
+
* Returns skill names found, or empty array if file doesn't exist.
|
|
65
|
+
*/
|
|
66
|
+
export function readSkillsShLock(dir) {
|
|
67
|
+
const p = join(dir ?? getProjectRoot(), SKILLS_SH_LOCKFILE);
|
|
68
|
+
if (!existsSync(p))
|
|
69
|
+
return [];
|
|
70
|
+
try {
|
|
71
|
+
const raw = readFileSync(p, "utf-8");
|
|
72
|
+
const data = JSON.parse(raw);
|
|
73
|
+
// skills.sh lock format: { skills: { "name": { ... } } } or array-based
|
|
74
|
+
if (data && typeof data === "object" && data.skills) {
|
|
75
|
+
return Object.keys(data.skills).map((name) => ({
|
|
76
|
+
name,
|
|
77
|
+
source: "skills.sh",
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
61
86
|
/**
|
|
62
87
|
* Remove a skill entry from the lockfile.
|
|
63
88
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/lockfile/lockfile.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,aAAa,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/lockfile/lockfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface SkillsShParsed {
|
|
2
|
+
owner: string;
|
|
3
|
+
toolkit: string;
|
|
4
|
+
skill: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SkillsShIncomplete {
|
|
7
|
+
incomplete: true;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Parse a skills.sh marketplace URL.
|
|
11
|
+
*
|
|
12
|
+
* - Full URL (3 path segments): returns { owner, toolkit, skill }
|
|
13
|
+
* - Incomplete URL (1-2 segments): returns { incomplete: true }
|
|
14
|
+
* - Non-skills.sh URL or non-URL: returns null
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseSkillsShUrl(input: string): SkillsShParsed | SkillsShIncomplete | null;
|
|
17
|
+
/**
|
|
18
|
+
* Check if a parsed result is a complete skills.sh URL.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isCompleteParsed(result: SkillsShParsed | SkillsShIncomplete | null): result is SkillsShParsed;
|
|
21
|
+
/**
|
|
22
|
+
* Check if a parsed result is an incomplete skills.sh URL.
|
|
23
|
+
*/
|
|
24
|
+
export declare function isIncompleteParsed(result: SkillsShParsed | SkillsShIncomplete | null): result is SkillsShIncomplete;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// URL resolver for skills.sh marketplace URLs.
|
|
3
|
+
// Parses https://skills.sh/{owner}/{toolkit}/{skill} into structured data.
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* Parse a skills.sh marketplace URL.
|
|
7
|
+
*
|
|
8
|
+
* - Full URL (3 path segments): returns { owner, toolkit, skill }
|
|
9
|
+
* - Incomplete URL (1-2 segments): returns { incomplete: true }
|
|
10
|
+
* - Non-skills.sh URL or non-URL: returns null
|
|
11
|
+
*/
|
|
12
|
+
export function parseSkillsShUrl(input) {
|
|
13
|
+
let url;
|
|
14
|
+
try {
|
|
15
|
+
url = new URL(input);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const host = url.hostname;
|
|
21
|
+
if (host !== "skills.sh" && host !== "www.skills.sh") {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const segments = url.pathname.split("/").filter(Boolean);
|
|
25
|
+
if (segments.length >= 3) {
|
|
26
|
+
return {
|
|
27
|
+
owner: segments[0],
|
|
28
|
+
toolkit: segments[1],
|
|
29
|
+
skill: segments[2],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Incomplete path (1 or 2 segments, but it is a skills.sh URL)
|
|
33
|
+
if (segments.length >= 1) {
|
|
34
|
+
return { incomplete: true };
|
|
35
|
+
}
|
|
36
|
+
// Root URL with no path
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if a parsed result is a complete skills.sh URL.
|
|
41
|
+
*/
|
|
42
|
+
export function isCompleteParsed(result) {
|
|
43
|
+
return result !== null && !("incomplete" in result);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if a parsed result is an incomplete skills.sh URL.
|
|
47
|
+
*/
|
|
48
|
+
export function isIncompleteParsed(result) {
|
|
49
|
+
return result !== null && "incomplete" in result;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=url-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-resolver.js","sourceRoot":"","sources":["../../src/resolvers/url-resolver.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+CAA+C;AAC/C,2EAA2E;AAC3E,8EAA8E;AAY9E;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa;IAEb,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC1B,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEzD,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAClB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;YACpB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;SACnB,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;IAED,wBAAwB;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAkD;IAElD,OAAO,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,YAAY,IAAI,MAAM,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAkD;IAElD,OAAO,MAAM,KAAK,IAAI,IAAI,YAAY,IAAI,MAAM,CAAC;AACnD,CAAC"}
|