vskill 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.
Files changed (59) hide show
  1. package/README.md +49 -0
  2. package/dist/agents/agents-registry.d.ts +57 -0
  3. package/dist/agents/agents-registry.js +511 -0
  4. package/dist/agents/agents-registry.js.map +1 -0
  5. package/dist/api/client.d.ts +50 -0
  6. package/dist/api/client.js +50 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/commands/add.d.ts +7 -0
  9. package/dist/commands/add.js +126 -0
  10. package/dist/commands/add.js.map +1 -0
  11. package/dist/commands/find.d.ts +1 -0
  12. package/dist/commands/find.js +42 -0
  13. package/dist/commands/find.js.map +1 -0
  14. package/dist/commands/init.d.ts +1 -0
  15. package/dist/commands/init.js +39 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/list.d.ts +6 -0
  18. package/dist/commands/list.js +79 -0
  19. package/dist/commands/list.js.map +1 -0
  20. package/dist/commands/scan.d.ts +1 -0
  21. package/dist/commands/scan.js +99 -0
  22. package/dist/commands/scan.js.map +1 -0
  23. package/dist/commands/submit.d.ts +5 -0
  24. package/dist/commands/submit.js +34 -0
  25. package/dist/commands/submit.js.map +1 -0
  26. package/dist/commands/update.d.ts +5 -0
  27. package/dist/commands/update.js +114 -0
  28. package/dist/commands/update.js.map +1 -0
  29. package/dist/commands/version.d.ts +1 -0
  30. package/dist/commands/version.js +11 -0
  31. package/dist/commands/version.js.map +1 -0
  32. package/dist/index.d.ts +2 -0
  33. package/dist/index.js +68 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/lockfile/index.d.ts +2 -0
  36. package/dist/lockfile/index.js +2 -0
  37. package/dist/lockfile/index.js.map +1 -0
  38. package/dist/lockfile/lockfile.d.ts +23 -0
  39. package/dist/lockfile/lockfile.js +70 -0
  40. package/dist/lockfile/lockfile.js.map +1 -0
  41. package/dist/lockfile/types.d.ts +14 -0
  42. package/dist/lockfile/types.js +5 -0
  43. package/dist/lockfile/types.js.map +1 -0
  44. package/dist/scanner/index.d.ts +4 -0
  45. package/dist/scanner/index.js +3 -0
  46. package/dist/scanner/index.js.map +1 -0
  47. package/dist/scanner/patterns.d.ts +25 -0
  48. package/dist/scanner/patterns.js +347 -0
  49. package/dist/scanner/patterns.js.map +1 -0
  50. package/dist/scanner/pipeline/submission-pipeline.d.ts +100 -0
  51. package/dist/scanner/pipeline/submission-pipeline.js +173 -0
  52. package/dist/scanner/pipeline/submission-pipeline.js.map +1 -0
  53. package/dist/scanner/tier1.d.ts +23 -0
  54. package/dist/scanner/tier1.js +83 -0
  55. package/dist/scanner/tier1.js.map +1 -0
  56. package/dist/utils/output.d.ts +15 -0
  57. package/dist/utils/output.js +87 -0
  58. package/dist/utils/output.js.map +1 -0
  59. package/package.json +51 -0
@@ -0,0 +1,83 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Tier 1 Scanner -- Static pattern-based security analysis
3
+ // ---------------------------------------------------------------------------
4
+ import { scanContent, SCAN_PATTERNS, } from "./patterns.js";
5
+ // ---- Severity scoring weights ---------------------------------------------
6
+ const SEVERITY_DEDUCTIONS = {
7
+ critical: 25,
8
+ high: 15,
9
+ medium: 8,
10
+ low: 3,
11
+ info: 0,
12
+ };
13
+ // ---- Scanner --------------------------------------------------------------
14
+ /**
15
+ * Run the Tier 1 static scan against the provided skill content.
16
+ *
17
+ * Scoring starts at 100 and deducts points per finding based on severity.
18
+ * Verdict thresholds:
19
+ * >= 80 PASS
20
+ * 50-79 CONCERNS
21
+ * < 50 FAIL
22
+ */
23
+ export function runTier1Scan(content) {
24
+ const start = performance.now();
25
+ const findings = scanContent(content);
26
+ // Count findings by severity
27
+ let criticalCount = 0;
28
+ let highCount = 0;
29
+ let mediumCount = 0;
30
+ let lowCount = 0;
31
+ let infoCount = 0;
32
+ for (const finding of findings) {
33
+ switch (finding.severity) {
34
+ case "critical":
35
+ criticalCount++;
36
+ break;
37
+ case "high":
38
+ highCount++;
39
+ break;
40
+ case "medium":
41
+ mediumCount++;
42
+ break;
43
+ case "low":
44
+ lowCount++;
45
+ break;
46
+ case "info":
47
+ infoCount++;
48
+ break;
49
+ }
50
+ }
51
+ // Calculate score
52
+ let score = 100;
53
+ for (const finding of findings) {
54
+ score -= SEVERITY_DEDUCTIONS[finding.severity];
55
+ }
56
+ // Clamp to 0-100
57
+ score = Math.max(0, Math.min(100, score));
58
+ // Determine verdict
59
+ let verdict;
60
+ if (score >= 80) {
61
+ verdict = "PASS";
62
+ }
63
+ else if (score >= 50) {
64
+ verdict = "CONCERNS";
65
+ }
66
+ else {
67
+ verdict = "FAIL";
68
+ }
69
+ const durationMs = Math.round(performance.now() - start);
70
+ return {
71
+ verdict,
72
+ findings,
73
+ score,
74
+ patternsChecked: SCAN_PATTERNS.length,
75
+ criticalCount,
76
+ highCount,
77
+ mediumCount,
78
+ lowCount,
79
+ infoCount,
80
+ durationMs,
81
+ };
82
+ }
83
+ //# sourceMappingURL=tier1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier1.js","sourceRoot":"","sources":["../../src/scanner/tier1.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,OAAO,EACL,WAAW,EACX,aAAa,GAId,MAAM,eAAe,CAAC;AAiBvB,8EAA8E;AAE9E,MAAM,mBAAmB,GAAoC;IAC3D,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAEhC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAEtC,6BAA6B;IAC7B,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,UAAU;gBACb,aAAa,EAAE,CAAC;gBAChB,MAAM;YACR,KAAK,MAAM;gBACT,SAAS,EAAE,CAAC;gBACZ,MAAM;YACR,KAAK,QAAQ;gBACX,WAAW,EAAE,CAAC;gBACd,MAAM;YACR,KAAK,KAAK;gBACR,QAAQ,EAAE,CAAC;gBACX,MAAM;YACR,KAAK,MAAM;gBACT,SAAS,EAAE,CAAC;gBACZ,MAAM;QACV,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,IAAI,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IACD,iBAAiB;IACjB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAE1C,oBAAoB;IACpB,IAAI,OAAoB,CAAC;IACzB,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;SAAM,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACvB,OAAO,GAAG,UAAU,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IAEzD,OAAO;QACL,OAAO;QACP,QAAQ;QACR,KAAK;QACL,eAAe,EAAE,aAAa,CAAC,MAAM;QACrC,aAAa;QACb,SAAS;QACT,WAAW;QACX,QAAQ;QACR,SAAS;QACT,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare const green: (text: string) => string;
2
+ export declare const red: (text: string) => string;
3
+ export declare const yellow: (text: string) => string;
4
+ export declare const cyan: (text: string) => string;
5
+ export declare const bold: (text: string) => string;
6
+ export declare const dim: (text: string) => string;
7
+ export declare const magenta: (text: string) => string;
8
+ /**
9
+ * Print aligned columns. Each row is an array of strings.
10
+ * Column widths are auto-calculated from the widest cell.
11
+ */
12
+ export declare function table(headers: string[], rows: string[][], gap?: number): string;
13
+ export declare function spinner(message: string): {
14
+ stop: (final?: string) => void;
15
+ };
@@ -0,0 +1,87 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Colored console output helpers (ANSI codes, zero dependencies)
3
+ // ---------------------------------------------------------------------------
4
+ const isColorSupported = process.env.FORCE_COLOR !== "0" &&
5
+ process.env.NO_COLOR === undefined &&
6
+ (process.stdout.isTTY || process.env.FORCE_COLOR === "1");
7
+ function wrap(code, reset) {
8
+ if (!isColorSupported)
9
+ return (text) => text;
10
+ return (text) => `${code}${text}${reset}`;
11
+ }
12
+ // ---- Text formatters ------------------------------------------------------
13
+ export const green = wrap("\x1b[32m", "\x1b[39m");
14
+ export const red = wrap("\x1b[31m", "\x1b[39m");
15
+ export const yellow = wrap("\x1b[33m", "\x1b[39m");
16
+ export const cyan = wrap("\x1b[36m", "\x1b[39m");
17
+ export const bold = wrap("\x1b[1m", "\x1b[22m");
18
+ export const dim = wrap("\x1b[2m", "\x1b[22m");
19
+ export const magenta = wrap("\x1b[35m", "\x1b[39m");
20
+ // ---- Table output ---------------------------------------------------------
21
+ /**
22
+ * Print aligned columns. Each row is an array of strings.
23
+ * Column widths are auto-calculated from the widest cell.
24
+ */
25
+ export function table(headers, rows, gap = 2) {
26
+ const allRows = [headers, ...rows];
27
+ const colWidths = [];
28
+ for (const row of allRows) {
29
+ for (let i = 0; i < row.length; i++) {
30
+ const stripped = stripAnsi(row[i] || "");
31
+ colWidths[i] = Math.max(colWidths[i] || 0, stripped.length);
32
+ }
33
+ }
34
+ const lines = [];
35
+ // Header
36
+ const headerLine = headers
37
+ .map((h, i) => padRight(h, colWidths[i], gap))
38
+ .join("")
39
+ .trimEnd();
40
+ lines.push(bold(headerLine));
41
+ lines.push(dim(colWidths.map((w) => "-".repeat(w)).join(" ".repeat(gap))));
42
+ // Data rows
43
+ for (const row of rows) {
44
+ const line = row
45
+ .map((cell, i) => padRight(cell, colWidths[i], gap))
46
+ .join("")
47
+ .trimEnd();
48
+ lines.push(line);
49
+ }
50
+ return lines.join("\n");
51
+ }
52
+ function stripAnsi(str) {
53
+ // eslint-disable-next-line no-control-regex
54
+ return str.replace(/\x1b\[[0-9;]*m/g, "");
55
+ }
56
+ function padRight(str, width, gap) {
57
+ const visible = stripAnsi(str);
58
+ const padding = Math.max(0, width - visible.length) + gap;
59
+ return str + " ".repeat(padding);
60
+ }
61
+ // ---- Spinner --------------------------------------------------------------
62
+ export function spinner(message) {
63
+ const frames = ["|", "/", "-", "\\"];
64
+ let i = 0;
65
+ if (!isColorSupported || !process.stdout.isTTY) {
66
+ process.stdout.write(`${message}...\n`);
67
+ return {
68
+ stop: (final) => {
69
+ if (final)
70
+ process.stdout.write(`${final}\n`);
71
+ },
72
+ };
73
+ }
74
+ const interval = setInterval(() => {
75
+ process.stdout.write(`\r${frames[i % frames.length]} ${message}`);
76
+ i++;
77
+ }, 80);
78
+ return {
79
+ stop: (final) => {
80
+ clearInterval(interval);
81
+ process.stdout.write(`\r${" ".repeat(message.length + 3)}\r`);
82
+ if (final)
83
+ process.stdout.write(`${final}\n`);
84
+ },
85
+ };
86
+ }
87
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "vskill",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Secure multi-platform AI skill installer — scan before you install",
6
+ "bin": {
7
+ "vskill": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "test": "vitest run",
15
+ "clean": "rm -rf dist",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "keywords": [
19
+ "ai",
20
+ "skills",
21
+ "security",
22
+ "agent",
23
+ "cli",
24
+ "claude",
25
+ "cursor",
26
+ "copilot",
27
+ "verified-skill"
28
+ ],
29
+ "author": "Anton Abyzov",
30
+ "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/anton-abyzov/vskill"
34
+ },
35
+ "homepage": "https://verified-skill.com",
36
+ "files": [
37
+ "dist",
38
+ "README.md"
39
+ ],
40
+ "devDependencies": {
41
+ "@types/node": "^25.2.3",
42
+ "typescript": "^5.7.0",
43
+ "vitest": "^3.0.0"
44
+ },
45
+ "engines": {
46
+ "node": ">=20.0.0"
47
+ },
48
+ "dependencies": {
49
+ "commander": "^14.0.3"
50
+ }
51
+ }