uasp-skills 0.1.2 → 0.1.4

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.
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Search benchmarks - Structured vs full-text search
3
+ */
4
+ import { benchmark } from './metrics.js';
5
+ /**
6
+ * Structured search on UASP registry
7
+ * Searches specific fields: name, description, keywords
8
+ */
9
+ export function searchUaspStructured(skills, query) {
10
+ const lowerQuery = query.toLowerCase();
11
+ const results = [];
12
+ for (const { skill, registrySkill } of skills) {
13
+ let score = 0;
14
+ // Name match (highest weight)
15
+ if (skill.meta.name.toLowerCase().includes(lowerQuery)) {
16
+ score += 10;
17
+ }
18
+ // Description match
19
+ if (skill.meta.description?.toLowerCase().includes(lowerQuery)) {
20
+ score += 5;
21
+ }
22
+ // Keyword match
23
+ if (skill.triggers?.keywords?.some(k => k.toLowerCase().includes(lowerQuery))) {
24
+ score += 8;
25
+ }
26
+ // Intent match
27
+ if (skill.triggers?.intents?.some(i => i.toLowerCase().includes(lowerQuery))) {
28
+ score += 6;
29
+ }
30
+ // Registry keyword match
31
+ if (registrySkill.keywords.some(k => k.toLowerCase().includes(lowerQuery))) {
32
+ score += 7;
33
+ }
34
+ if (score > 0) {
35
+ results.push({ skill, registrySkill, score });
36
+ }
37
+ }
38
+ // Sort by score descending
39
+ return results.sort((a, b) => b.score - a.score);
40
+ }
41
+ /**
42
+ * Full-text search on SKILL.md content
43
+ */
44
+ export function searchSkillMdFullText(skillMdContents, query) {
45
+ const lowerQuery = query.toLowerCase();
46
+ const results = [];
47
+ for (const { name, content } of skillMdContents) {
48
+ const lowerContent = content.toLowerCase();
49
+ // Count occurrences
50
+ let count = 0;
51
+ let index = 0;
52
+ while ((index = lowerContent.indexOf(lowerQuery, index)) !== -1) {
53
+ count++;
54
+ index += lowerQuery.length;
55
+ }
56
+ if (count > 0) {
57
+ // Score based on occurrences and position
58
+ const firstIndex = lowerContent.indexOf(lowerQuery);
59
+ const positionBonus = firstIndex < 500 ? 2 : 1; // Boost if found early
60
+ results.push({
61
+ name,
62
+ score: count * positionBonus,
63
+ });
64
+ }
65
+ }
66
+ return results.sort((a, b) => b.score - a.score);
67
+ }
68
+ /**
69
+ * Benchmark structured UASP search
70
+ */
71
+ export async function benchmarkUaspSearch(skills, query, options) {
72
+ return benchmark('UASP Structured Search', () => searchUaspStructured(skills, query), options);
73
+ }
74
+ /**
75
+ * Benchmark full-text SKILL.md search
76
+ */
77
+ export async function benchmarkSkillMdSearch(skillMdContents, query, options) {
78
+ return benchmark('SKILL.md Full-text Search', () => searchSkillMdFullText(skillMdContents, query), options);
79
+ }
80
+ /**
81
+ * Calculate search precision
82
+ * Measures how relevant the top N results are
83
+ */
84
+ export function calculateSearchPrecision(results, expectedTopResults, topN = 3) {
85
+ const topResults = results.slice(0, topN).map(r => r.name);
86
+ const relevant = topResults.filter(r => expectedTopResults.includes(r));
87
+ return relevant.length / Math.min(topN, results.length);
88
+ }
89
+ /**
90
+ * Run search benchmarks
91
+ */
92
+ export async function runSearchBenchmarks(skills, skillMdContents, query, options) {
93
+ const uasp = await benchmarkUaspSearch(skills, query, options);
94
+ const skillMd = await benchmarkSkillMdSearch(skillMdContents, query, options);
95
+ return { uasp, skillMd };
96
+ }
97
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/benchmark/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Validation benchmarks - AJV schema vs loose validation
3
+ */
4
+ import { type BenchmarkResult, type BenchmarkOptions } from './metrics.js';
5
+ /**
6
+ * Loose validation for SKILL.md frontmatter
7
+ * Mimics what Claude Code might do to validate a skill
8
+ */
9
+ export declare function validateSkillMdLoose(data: unknown): {
10
+ valid: boolean;
11
+ errors: string[];
12
+ };
13
+ /**
14
+ * Benchmark UASP schema validation with AJV
15
+ */
16
+ export declare function benchmarkUaspValidation(skill: unknown, options?: BenchmarkOptions): Promise<BenchmarkResult>;
17
+ /**
18
+ * Benchmark UASP type guard validation
19
+ */
20
+ export declare function benchmarkUaspTypeGuard(skill: unknown, options?: BenchmarkOptions): Promise<BenchmarkResult>;
21
+ /**
22
+ * Benchmark loose SKILL.md validation
23
+ */
24
+ export declare function benchmarkSkillMdValidation(frontmatter: unknown, options?: BenchmarkOptions): Promise<BenchmarkResult>;
25
+ /**
26
+ * Run all validation benchmarks
27
+ */
28
+ export declare function runValidationBenchmarks(uaspSkill: unknown, skillMdFrontmatter: unknown, options?: BenchmarkOptions): Promise<{
29
+ uasp: BenchmarkResult;
30
+ skillMd: BenchmarkResult;
31
+ }>;
32
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/benchmark/validators.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAa,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGtF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA8BxF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,OAAO,EAClB,kBAAkB,EAAE,OAAO,EAC3B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC,CAK9D"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Validation benchmarks - AJV schema vs loose validation
3
+ */
4
+ import { benchmark } from './metrics.js';
5
+ import { validateSkill, isValidSkillStructure } from '../core/validator.js';
6
+ /**
7
+ * Loose validation for SKILL.md frontmatter
8
+ * Mimics what Claude Code might do to validate a skill
9
+ */
10
+ export function validateSkillMdLoose(data) {
11
+ const errors = [];
12
+ if (typeof data !== 'object' || data === null) {
13
+ return { valid: false, errors: ['Data must be an object'] };
14
+ }
15
+ const obj = data;
16
+ // Required fields
17
+ if (typeof obj.name !== 'string' || !obj.name) {
18
+ errors.push('Missing or invalid name');
19
+ }
20
+ if (typeof obj.description !== 'string') {
21
+ errors.push('Missing or invalid description');
22
+ }
23
+ // Optional but validated if present
24
+ if (obj['allowed-tools'] !== undefined && typeof obj['allowed-tools'] !== 'string') {
25
+ errors.push('allowed-tools must be a string');
26
+ }
27
+ if (obj.metadata !== undefined) {
28
+ if (typeof obj.metadata !== 'object') {
29
+ errors.push('metadata must be an object');
30
+ }
31
+ }
32
+ return { valid: errors.length === 0, errors };
33
+ }
34
+ /**
35
+ * Benchmark UASP schema validation with AJV
36
+ */
37
+ export async function benchmarkUaspValidation(skill, options) {
38
+ return benchmark('UASP AJV Schema', () => validateSkill(skill), options);
39
+ }
40
+ /**
41
+ * Benchmark UASP type guard validation
42
+ */
43
+ export async function benchmarkUaspTypeGuard(skill, options) {
44
+ return benchmark('UASP Type Guard', () => isValidSkillStructure(skill), options);
45
+ }
46
+ /**
47
+ * Benchmark loose SKILL.md validation
48
+ */
49
+ export async function benchmarkSkillMdValidation(frontmatter, options) {
50
+ return benchmark('SKILL.md Loose', () => validateSkillMdLoose(frontmatter), options);
51
+ }
52
+ /**
53
+ * Run all validation benchmarks
54
+ */
55
+ export async function runValidationBenchmarks(uaspSkill, skillMdFrontmatter, options) {
56
+ const uasp = await benchmarkUaspValidation(uaspSkill, options);
57
+ const skillMd = await benchmarkSkillMdValidation(skillMdFrontmatter, options);
58
+ return { uasp, skillMd };
59
+ }
60
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/benchmark/validators.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAA+C,MAAM,cAAc,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE5E;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,MAAM,GAAG,GAAG,IAA+B,CAAC;IAE5C,kBAAkB;IAClB,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,CAAC,eAAe,CAAC,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,eAAe,CAAC,KAAK,QAAQ,EAAE,CAAC;QACnF,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,KAAc,EACd,OAA0B;IAE1B,OAAO,SAAS,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAc,EACd,OAA0B;IAE1B,OAAO,SAAS,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAAoB,EACpB,OAA0B;IAE1B,OAAO,SAAS,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;AACvF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAkB,EAClB,kBAA2B,EAC3B,OAA0B;IAE1B,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,MAAM,0BAA0B,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAE9E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC"}
package/dist/cli/index.js CHANGED
@@ -14,7 +14,7 @@ const program = new Command();
14
14
  program
15
15
  .name('skills')
16
16
  .description('CLI tool for managing UASP agent skills')
17
- .version('0.1.0');
17
+ .version('0.1.4');
18
18
  // Add commands
19
19
  program.addCommand(addCommand);
20
20
  program.addCommand(listCommand);
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "uasp-skills",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "CLI tool for managing UASP agent skills",
5
5
  "type": "module",
6
6
  "bin": {
7
- "skills": "./bin/skills.js"
7
+ "uasp-skills": "./bin/uasp-skills.js"
8
8
  },
9
9
  "main": "./dist/index.js",
10
10
  "types": "./dist/index.d.ts",
@@ -15,9 +15,15 @@
15
15
  "scripts": {
16
16
  "build": "tsc",
17
17
  "dev": "tsc --watch",
18
- "start": "node bin/skills.js",
18
+ "start": "node bin/uasp-skills.js",
19
19
  "lint": "eslint src",
20
20
  "test": "vitest",
21
+ "test:unit": "vitest run tests/unit",
22
+ "test:integration": "vitest run tests/integration",
23
+ "test:coverage": "vitest run --coverage",
24
+ "test:watch": "vitest watch",
25
+ "benchmark": "node --expose-gc dist/benchmark/index.js",
26
+ "benchmark:dev": "tsx --expose-gc src/benchmark/index.ts",
21
27
  "prepublishOnly": "npm run build"
22
28
  },
23
29
  "dependencies": {
@@ -32,10 +38,13 @@
32
38
  },
33
39
  "devDependencies": {
34
40
  "@types/fs-extra": "^11.0.0",
35
- "@types/node": "^20.0.0",
41
+ "@types/node": "^20.19.30",
36
42
  "@typescript-eslint/eslint-plugin": "^6.0.0",
37
43
  "@typescript-eslint/parser": "^6.0.0",
44
+ "@vitest/coverage-v8": "^1.0.0",
38
45
  "eslint": "^8.0.0",
46
+ "gray-matter": "^4.0.3",
47
+ "tsx": "^4.0.0",
39
48
  "typescript": "^5.3.0",
40
49
  "vitest": "^1.0.0"
41
50
  },
File without changes