uasp-skills 0.1.3 ā 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.
- package/LICENSE +1 -1
- package/README.md +193 -0
- package/dist/benchmark/converters.d.ts +34 -0
- package/dist/benchmark/converters.d.ts.map +1 -0
- package/dist/benchmark/converters.js +139 -0
- package/dist/benchmark/converters.js.map +1 -0
- package/dist/benchmark/index.d.ts +6 -0
- package/dist/benchmark/index.d.ts.map +1 -0
- package/dist/benchmark/index.js +196 -0
- package/dist/benchmark/index.js.map +1 -0
- package/dist/benchmark/metrics.d.ts +92 -0
- package/dist/benchmark/metrics.d.ts.map +1 -0
- package/dist/benchmark/metrics.js +146 -0
- package/dist/benchmark/metrics.js.map +1 -0
- package/dist/benchmark/parsers.d.ts +42 -0
- package/dist/benchmark/parsers.d.ts.map +1 -0
- package/dist/benchmark/parsers.js +81 -0
- package/dist/benchmark/parsers.js.map +1 -0
- package/dist/benchmark/report.d.ts +46 -0
- package/dist/benchmark/report.d.ts.map +1 -0
- package/dist/benchmark/report.js +140 -0
- package/dist/benchmark/report.js.map +1 -0
- package/dist/benchmark/search.d.ts +63 -0
- package/dist/benchmark/search.d.ts.map +1 -0
- package/dist/benchmark/search.js +97 -0
- package/dist/benchmark/search.js.map +1 -0
- package/dist/benchmark/validators.d.ts +32 -0
- package/dist/benchmark/validators.d.ts.map +1 -0
- package/dist/benchmark/validators.js +60 -0
- package/dist/benchmark/validators.js.map +1 -0
- package/dist/cli/index.js +1 -1
- package/package.json +11 -2
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -112,6 +112,199 @@ const results = searchSkills(registry, 'browser');
|
|
|
112
112
|
const result = await installSkill(githubSource, skill);
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
+
## Benchmarking
|
|
116
|
+
|
|
117
|
+
The CLI includes a comprehensive benchmarking suite that compares the performance of UASP (`.uasp.yaml`) format against SKILL.md format across multiple dimensions.
|
|
118
|
+
|
|
119
|
+
### Running Benchmarks
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Run benchmarks on skills in current directory
|
|
123
|
+
npx uasp-skills benchmark
|
|
124
|
+
|
|
125
|
+
# Run benchmarks on a specific skills directory
|
|
126
|
+
npx uasp-skills benchmark --dir ./path/to/skills
|
|
127
|
+
|
|
128
|
+
# Output as JSON
|
|
129
|
+
npx uasp-skills benchmark --output json
|
|
130
|
+
|
|
131
|
+
# Output as Markdown
|
|
132
|
+
npx uasp-skills benchmark --output markdown
|
|
133
|
+
|
|
134
|
+
# Save report to file
|
|
135
|
+
npx uasp-skills benchmark --save report.md --output markdown
|
|
136
|
+
|
|
137
|
+
# Customize iterations and warmup
|
|
138
|
+
npx uasp-skills benchmark --iterations 200 --warmup 10
|
|
139
|
+
|
|
140
|
+
# Show verbose output with additional metrics
|
|
141
|
+
npx uasp-skills benchmark --verbose
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### CLI Options
|
|
145
|
+
|
|
146
|
+
| Option | Description | Default |
|
|
147
|
+
|--------|-------------|---------|
|
|
148
|
+
| `-d, --dir <path>` | Directory containing skills to benchmark | Current directory |
|
|
149
|
+
| `-o, --output <format>` | Output format: `console`, `json`, or `markdown` | `console` |
|
|
150
|
+
| `-s, --save <path>` | Save the report to a file | - |
|
|
151
|
+
| `-i, --iterations <n>` | Number of benchmark iterations | `100` |
|
|
152
|
+
| `-w, --warmup <n>` | Number of warmup runs before benchmarking | `5` |
|
|
153
|
+
| `-v, --verbose` | Show additional metrics (file sizes, feature coverage) | `false` |
|
|
154
|
+
|
|
155
|
+
### Benchmark Categories
|
|
156
|
+
|
|
157
|
+
The benchmark suite measures performance across four key categories:
|
|
158
|
+
|
|
159
|
+
#### 1. Parsing Benchmarks
|
|
160
|
+
|
|
161
|
+
Compares the time to parse skill definitions:
|
|
162
|
+
- **UASP**: Full YAML parsing using the `yaml` library
|
|
163
|
+
- **SKILL.md**: Frontmatter extraction and parsing using `gray-matter`
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
// UASP parsing
|
|
167
|
+
const skill = yaml.parse(uaspContent);
|
|
168
|
+
|
|
169
|
+
// SKILL.md parsing
|
|
170
|
+
const { data, content } = matter(skillMdContent);
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
#### 2. Validation Benchmarks
|
|
174
|
+
|
|
175
|
+
Compares schema validation approaches:
|
|
176
|
+
- **UASP**: Strict AJV JSON Schema validation with comprehensive type checking
|
|
177
|
+
- **SKILL.md**: Loose runtime validation checking only required fields
|
|
178
|
+
|
|
179
|
+
The UASP validation ensures type safety and catches configuration errors early, while SKILL.md relies on minimal validation.
|
|
180
|
+
|
|
181
|
+
#### 3. Conversion Benchmarks
|
|
182
|
+
|
|
183
|
+
Measures the time to convert UASP format to SKILL.md format. Also calculates:
|
|
184
|
+
- **File Size Ratio**: Compares the byte size of both formats
|
|
185
|
+
- **Feature Coverage**: Percentage of UASP features preserved in SKILL.md conversion
|
|
186
|
+
|
|
187
|
+
Features tracked for coverage:
|
|
188
|
+
- Meta information (name, version, type, description)
|
|
189
|
+
- Triggers (keywords, intents, file patterns)
|
|
190
|
+
- Constraints (never, always, prefer rules)
|
|
191
|
+
- Decisions, Commands, Workflows
|
|
192
|
+
- State entities, Templates, Environment variables
|
|
193
|
+
- Reference sections, Sources
|
|
194
|
+
|
|
195
|
+
#### 4. Search Benchmarks
|
|
196
|
+
|
|
197
|
+
Compares search performance:
|
|
198
|
+
- **UASP Structured Search**: Searches specific fields (name, description, keywords, intents) with weighted scoring
|
|
199
|
+
- **SKILL.md Full-text Search**: Searches entire document content with occurrence counting
|
|
200
|
+
|
|
201
|
+
Structured search provides better relevance ranking while full-text search is simpler but may return less relevant results.
|
|
202
|
+
|
|
203
|
+
### Metrics Collected
|
|
204
|
+
|
|
205
|
+
For each benchmark, the following metrics are collected:
|
|
206
|
+
|
|
207
|
+
| Metric | Description |
|
|
208
|
+
|--------|-------------|
|
|
209
|
+
| Mean | Average execution time |
|
|
210
|
+
| Median | Middle value of all samples |
|
|
211
|
+
| Min | Fastest execution time |
|
|
212
|
+
| Max | Slowest execution time |
|
|
213
|
+
| Std Dev | Standard deviation (consistency measure) |
|
|
214
|
+
| Memory Delta | Heap memory change (when `--verbose`) |
|
|
215
|
+
|
|
216
|
+
### Report Output
|
|
217
|
+
|
|
218
|
+
#### Console Output
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
222
|
+
UASP vs SKILL.md Format Benchmark
|
|
223
|
+
Generated: 2026-01-29T12:00:00.000Z
|
|
224
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
225
|
+
|
|
226
|
+
āāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāā¬āāāāāāāāāāā¬āāāāāāāāāā
|
|
227
|
+
ā Category ā UASP ā SKILL.md ā Winner ā Speedup ā
|
|
228
|
+
āāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāā¼āāāāāāāāāāā¼āāāāāāāāāā¤
|
|
229
|
+
ā Parsing ā 0.15 ms ā 0.22 ms ā UASP ā 1.47x ā
|
|
230
|
+
ā Validation ā 0.08 ms ā 0.02 ms ā SKILL-MD ā 4.00x ā
|
|
231
|
+
ā Conversion ā 0.12 ms ā 0.00 ms ā SKILL-MD ā 12.00x ā
|
|
232
|
+
ā Search ā 0.05 ms ā 0.18 ms ā UASP ā 3.60x ā
|
|
233
|
+
āāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāā“āāāāāāāāāāā“āāāāāāāāāā
|
|
234
|
+
|
|
235
|
+
Summary:
|
|
236
|
+
UASP wins: 2
|
|
237
|
+
SKILL.md wins: 2
|
|
238
|
+
Ties: 0
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
#### JSON Output
|
|
242
|
+
|
|
243
|
+
The JSON output includes full benchmark data for programmatic analysis:
|
|
244
|
+
|
|
245
|
+
```json
|
|
246
|
+
{
|
|
247
|
+
"title": "UASP vs SKILL.md Format Benchmark",
|
|
248
|
+
"timestamp": "2026-01-29T12:00:00.000Z",
|
|
249
|
+
"comparisons": [
|
|
250
|
+
{
|
|
251
|
+
"category": "Parsing",
|
|
252
|
+
"uasp": {
|
|
253
|
+
"name": "UASP YAML",
|
|
254
|
+
"timing": { "mean": 0.15, "median": 0.14, "min": 0.12, "max": 0.25, "stdDev": 0.02 },
|
|
255
|
+
"iterations": 100,
|
|
256
|
+
"warmup": 5
|
|
257
|
+
},
|
|
258
|
+
"skillMd": { ... },
|
|
259
|
+
"winner": "uasp",
|
|
260
|
+
"speedup": 1.47
|
|
261
|
+
}
|
|
262
|
+
],
|
|
263
|
+
"summary": { "uaspWins": 2, "skillMdWins": 2, "ties": 0 }
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
#### Markdown Output
|
|
268
|
+
|
|
269
|
+
The Markdown output includes a summary table plus detailed results for each category, suitable for documentation or reports.
|
|
270
|
+
|
|
271
|
+
### How It Works
|
|
272
|
+
|
|
273
|
+
1. **Skill Loading**: The benchmark loads all `.uasp.yaml` files from the specified directory. If a `registry.json` exists, it uses that to locate skills.
|
|
274
|
+
|
|
275
|
+
2. **Skill Conversion**: Each UASP skill is converted to SKILL.md format for comparison.
|
|
276
|
+
|
|
277
|
+
3. **Warmup Phase**: Before each benchmark category, warmup iterations run to eliminate JIT compilation effects.
|
|
278
|
+
|
|
279
|
+
4. **Timed Runs**: Each operation runs for the specified number of iterations using high-resolution timing (`process.hrtime.bigint()`).
|
|
280
|
+
|
|
281
|
+
5. **GC Management**: Garbage collection is triggered between runs (when available) to reduce noise in measurements.
|
|
282
|
+
|
|
283
|
+
6. **Statistics**: Results are aggregated into statistical summaries (mean, median, stdDev, etc.).
|
|
284
|
+
|
|
285
|
+
7. **Comparison**: Results are compared to determine the winner in each category, with a 5% tolerance for ties.
|
|
286
|
+
|
|
287
|
+
### Programmatic Usage
|
|
288
|
+
|
|
289
|
+
```typescript
|
|
290
|
+
import {
|
|
291
|
+
benchmark,
|
|
292
|
+
runParsingBenchmarks,
|
|
293
|
+
runValidationBenchmarks,
|
|
294
|
+
runSearchBenchmarks,
|
|
295
|
+
createReport,
|
|
296
|
+
formatMarkdownReport
|
|
297
|
+
} from 'uasp-skills/benchmark';
|
|
298
|
+
|
|
299
|
+
// Run a custom benchmark
|
|
300
|
+
const result = await benchmark('My Operation', () => {
|
|
301
|
+
// Your code here
|
|
302
|
+
}, { iterations: 100, warmup: 5 });
|
|
303
|
+
|
|
304
|
+
console.log(`Mean: ${result.timing.mean}ms`);
|
|
305
|
+
console.log(`Std Dev: ${result.timing.stdDev}ms`);
|
|
306
|
+
```
|
|
307
|
+
|
|
115
308
|
## License
|
|
116
309
|
|
|
117
310
|
MIT
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversion benchmarks - UASP to SKILL.md and file size comparison
|
|
3
|
+
*/
|
|
4
|
+
import { type BenchmarkResult, type BenchmarkOptions } from './metrics.js';
|
|
5
|
+
import type { Skill, RegistrySkill } from '../types/index.js';
|
|
6
|
+
export interface FileSizeComparison {
|
|
7
|
+
uaspBytes: number;
|
|
8
|
+
skillMdBytes: number;
|
|
9
|
+
ratio: number;
|
|
10
|
+
uaspFormatted: string;
|
|
11
|
+
skillMdFormatted: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Calculate file sizes
|
|
15
|
+
*/
|
|
16
|
+
export declare function calculateFileSizes(uaspContent: string, skillMdContent: string): FileSizeComparison;
|
|
17
|
+
/**
|
|
18
|
+
* Benchmark UASP to SKILL.md conversion
|
|
19
|
+
*/
|
|
20
|
+
export declare function benchmarkConversion(skill: Skill, registrySkill: RegistrySkill, options?: BenchmarkOptions): Promise<BenchmarkResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Calculate feature coverage score
|
|
23
|
+
* Measures how many UASP features are preserved in SKILL.md conversion
|
|
24
|
+
*/
|
|
25
|
+
export declare function calculateFeatureCoverage(skill: Skill, skillMdContent: string): number;
|
|
26
|
+
/**
|
|
27
|
+
* Run conversion benchmarks
|
|
28
|
+
*/
|
|
29
|
+
export declare function runConversionBenchmarks(skill: Skill, registrySkill: RegistrySkill, uaspContent: string, options?: BenchmarkOptions): Promise<{
|
|
30
|
+
conversion: BenchmarkResult;
|
|
31
|
+
fileSize: FileSizeComparison;
|
|
32
|
+
featureCoverage: number;
|
|
33
|
+
}>;
|
|
34
|
+
//# sourceMappingURL=converters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../../src/benchmark/converters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAa,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAe,MAAM,cAAc,CAAC;AAEnG,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,kBAAkB,CAWlG;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,aAAa,EAC5B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAqGrF;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC;IACT,UAAU,EAAE,eAAe,CAAC;IAC5B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,CASD"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversion benchmarks - UASP to SKILL.md and file size comparison
|
|
3
|
+
*/
|
|
4
|
+
import { benchmark, formatBytes } from './metrics.js';
|
|
5
|
+
import { convertToSkillMd } from '../core/installer.js';
|
|
6
|
+
/**
|
|
7
|
+
* Calculate file sizes
|
|
8
|
+
*/
|
|
9
|
+
export function calculateFileSizes(uaspContent, skillMdContent) {
|
|
10
|
+
const uaspBytes = Buffer.byteLength(uaspContent, 'utf-8');
|
|
11
|
+
const skillMdBytes = Buffer.byteLength(skillMdContent, 'utf-8');
|
|
12
|
+
return {
|
|
13
|
+
uaspBytes,
|
|
14
|
+
skillMdBytes,
|
|
15
|
+
ratio: skillMdBytes / uaspBytes,
|
|
16
|
+
uaspFormatted: formatBytes(uaspBytes),
|
|
17
|
+
skillMdFormatted: formatBytes(skillMdBytes),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Benchmark UASP to SKILL.md conversion
|
|
22
|
+
*/
|
|
23
|
+
export async function benchmarkConversion(skill, registrySkill, options) {
|
|
24
|
+
return benchmark('UASP to SKILL.md', () => convertToSkillMd(skill, registrySkill), options);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Calculate feature coverage score
|
|
28
|
+
* Measures how many UASP features are preserved in SKILL.md conversion
|
|
29
|
+
*/
|
|
30
|
+
export function calculateFeatureCoverage(skill, skillMdContent) {
|
|
31
|
+
let totalFeatures = 0;
|
|
32
|
+
let coveredFeatures = 0;
|
|
33
|
+
// Meta (always present)
|
|
34
|
+
totalFeatures += 4; // name, version, type, description
|
|
35
|
+
coveredFeatures += 4; // Always included
|
|
36
|
+
// Triggers
|
|
37
|
+
if (skill.triggers) {
|
|
38
|
+
if (skill.triggers.keywords?.length) {
|
|
39
|
+
totalFeatures += 1;
|
|
40
|
+
if (skillMdContent.includes('## Keywords'))
|
|
41
|
+
coveredFeatures += 1;
|
|
42
|
+
}
|
|
43
|
+
if (skill.triggers.intents?.length) {
|
|
44
|
+
totalFeatures += 1;
|
|
45
|
+
if (skillMdContent.includes('## Intents'))
|
|
46
|
+
coveredFeatures += 1;
|
|
47
|
+
}
|
|
48
|
+
if (skill.triggers.file_patterns?.length) {
|
|
49
|
+
totalFeatures += 1;
|
|
50
|
+
// file_patterns are not typically included in SKILL.md
|
|
51
|
+
coveredFeatures += 0;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Constraints
|
|
55
|
+
if (skill.constraints) {
|
|
56
|
+
if (skill.constraints.never?.length) {
|
|
57
|
+
totalFeatures += 1;
|
|
58
|
+
if (skillMdContent.includes('### Never'))
|
|
59
|
+
coveredFeatures += 1;
|
|
60
|
+
}
|
|
61
|
+
if (skill.constraints.always?.length) {
|
|
62
|
+
totalFeatures += 1;
|
|
63
|
+
if (skillMdContent.includes('### Always'))
|
|
64
|
+
coveredFeatures += 1;
|
|
65
|
+
}
|
|
66
|
+
if (skill.constraints.prefer?.length) {
|
|
67
|
+
totalFeatures += 1;
|
|
68
|
+
if (skillMdContent.includes('### Preferences'))
|
|
69
|
+
coveredFeatures += 1;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Decisions
|
|
73
|
+
if (skill.decisions?.length) {
|
|
74
|
+
totalFeatures += 1;
|
|
75
|
+
if (skillMdContent.includes('## Decisions'))
|
|
76
|
+
coveredFeatures += 1;
|
|
77
|
+
}
|
|
78
|
+
// State
|
|
79
|
+
if (skill.state?.entities?.length) {
|
|
80
|
+
totalFeatures += 1;
|
|
81
|
+
// State entities are not typically converted
|
|
82
|
+
coveredFeatures += 0;
|
|
83
|
+
}
|
|
84
|
+
// Commands
|
|
85
|
+
if (skill.commands && Object.keys(skill.commands).length > 0) {
|
|
86
|
+
totalFeatures += 1;
|
|
87
|
+
if (skillMdContent.includes('## Commands'))
|
|
88
|
+
coveredFeatures += 1;
|
|
89
|
+
}
|
|
90
|
+
// Global flags
|
|
91
|
+
if (skill.global_flags?.length) {
|
|
92
|
+
totalFeatures += 1;
|
|
93
|
+
// Global flags are partially included in commands
|
|
94
|
+
coveredFeatures += 0.5;
|
|
95
|
+
}
|
|
96
|
+
// Workflows
|
|
97
|
+
if (skill.workflows && Object.keys(skill.workflows).length > 0) {
|
|
98
|
+
totalFeatures += 1;
|
|
99
|
+
if (skillMdContent.includes('## Workflows'))
|
|
100
|
+
coveredFeatures += 1;
|
|
101
|
+
}
|
|
102
|
+
// Reference
|
|
103
|
+
if (skill.reference && Object.keys(skill.reference).length > 0) {
|
|
104
|
+
totalFeatures += 1;
|
|
105
|
+
// Reference sections are not typically converted
|
|
106
|
+
coveredFeatures += 0;
|
|
107
|
+
}
|
|
108
|
+
// Templates
|
|
109
|
+
if (skill.templates && Object.keys(skill.templates).length > 0) {
|
|
110
|
+
totalFeatures += 1;
|
|
111
|
+
// Templates are not typically converted
|
|
112
|
+
coveredFeatures += 0;
|
|
113
|
+
}
|
|
114
|
+
// Environment
|
|
115
|
+
if (skill.environment?.length) {
|
|
116
|
+
totalFeatures += 1;
|
|
117
|
+
// Environment is not typically converted
|
|
118
|
+
coveredFeatures += 0;
|
|
119
|
+
}
|
|
120
|
+
// Sources
|
|
121
|
+
if (skill.sources?.length) {
|
|
122
|
+
totalFeatures += 1;
|
|
123
|
+
if (skillMdContent.includes('## References'))
|
|
124
|
+
coveredFeatures += 1;
|
|
125
|
+
}
|
|
126
|
+
return totalFeatures > 0 ? (coveredFeatures / totalFeatures) * 100 : 100;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Run conversion benchmarks
|
|
130
|
+
*/
|
|
131
|
+
export async function runConversionBenchmarks(skill, registrySkill, uaspContent, options) {
|
|
132
|
+
const conversion = await benchmarkConversion(skill, registrySkill, options);
|
|
133
|
+
// Generate SKILL.md for size comparison
|
|
134
|
+
const skillMdContent = convertToSkillMd(skill, registrySkill);
|
|
135
|
+
const fileSize = calculateFileSizes(uaspContent, skillMdContent);
|
|
136
|
+
const featureCoverage = calculateFeatureCoverage(skill, skillMdContent);
|
|
137
|
+
return { conversion, fileSize, featureCoverage };
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=converters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../../src/benchmark/converters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/benchmark/index.ts"],"names":[],"mappings":";AACA;;GAEG"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Benchmark CLI - UASP vs SKILL.md format performance comparison
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import yaml from 'yaml';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import { runParsingBenchmarks } from './parsers.js';
|
|
11
|
+
import { runValidationBenchmarks } from './validators.js';
|
|
12
|
+
import { runConversionBenchmarks } from './converters.js';
|
|
13
|
+
import { runSearchBenchmarks } from './search.js';
|
|
14
|
+
import { runGC, formatBytes, } from './metrics.js';
|
|
15
|
+
import { createComparison, createReport, formatConsoleReport, formatJsonReport, formatMarkdownReport, } from './report.js';
|
|
16
|
+
import { convertToSkillMd } from '../core/installer.js';
|
|
17
|
+
const program = new Command();
|
|
18
|
+
/**
|
|
19
|
+
* Load all skills from a directory
|
|
20
|
+
*/
|
|
21
|
+
async function loadSkills(dir) {
|
|
22
|
+
const skills = [];
|
|
23
|
+
// Check if directory has registry.json
|
|
24
|
+
const registryPath = path.join(dir, 'registry.json');
|
|
25
|
+
if (await fs.pathExists(registryPath)) {
|
|
26
|
+
const registryContent = await fs.readFile(registryPath, 'utf-8');
|
|
27
|
+
const registry = JSON.parse(registryContent);
|
|
28
|
+
for (const registrySkill of registry.skills) {
|
|
29
|
+
const skillPath = path.join(dir, registrySkill.path);
|
|
30
|
+
if (await fs.pathExists(skillPath)) {
|
|
31
|
+
const content = await fs.readFile(skillPath, 'utf-8');
|
|
32
|
+
const skill = yaml.parse(content);
|
|
33
|
+
skills.push({ skill, registrySkill, content, path: skillPath });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Find .uasp.yaml files recursively
|
|
39
|
+
const findSkillFiles = async (currentDir) => {
|
|
40
|
+
const files = [];
|
|
41
|
+
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
44
|
+
if (entry.isDirectory()) {
|
|
45
|
+
files.push(...await findSkillFiles(fullPath));
|
|
46
|
+
}
|
|
47
|
+
else if (entry.name.endsWith('.uasp.yaml')) {
|
|
48
|
+
files.push(fullPath);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return files;
|
|
52
|
+
};
|
|
53
|
+
const skillFiles = await findSkillFiles(dir);
|
|
54
|
+
for (const skillPath of skillFiles) {
|
|
55
|
+
const content = await fs.readFile(skillPath, 'utf-8');
|
|
56
|
+
const skill = yaml.parse(content);
|
|
57
|
+
const registrySkill = {
|
|
58
|
+
name: skill.meta.name,
|
|
59
|
+
version: skill.meta.version,
|
|
60
|
+
type: skill.meta.type,
|
|
61
|
+
description: skill.meta.description,
|
|
62
|
+
path: path.relative(dir, skillPath),
|
|
63
|
+
keywords: skill.triggers?.keywords || [],
|
|
64
|
+
};
|
|
65
|
+
skills.push({ skill, registrySkill, content, path: skillPath });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return skills;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Run all benchmarks
|
|
72
|
+
*/
|
|
73
|
+
async function runBenchmarks(options) {
|
|
74
|
+
const { dir, output, save, iterations, warmup, verbose } = options;
|
|
75
|
+
console.log(chalk.blue('\nš¬ UASP vs SKILL.md Benchmark Suite\n'));
|
|
76
|
+
console.log(chalk.gray(`Directory: ${dir}`));
|
|
77
|
+
console.log(chalk.gray(`Iterations: ${iterations}, Warmup: ${warmup}`));
|
|
78
|
+
console.log('');
|
|
79
|
+
// Load skills
|
|
80
|
+
console.log(chalk.yellow('Loading skills...'));
|
|
81
|
+
const skills = await loadSkills(dir);
|
|
82
|
+
if (skills.length === 0) {
|
|
83
|
+
console.log(chalk.red('No skills found in directory'));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
console.log(chalk.green(`Loaded ${skills.length} skill(s)\n`));
|
|
87
|
+
const benchmarkOpts = {
|
|
88
|
+
iterations,
|
|
89
|
+
warmup,
|
|
90
|
+
gcBetweenRuns: true,
|
|
91
|
+
measureMemory: true,
|
|
92
|
+
};
|
|
93
|
+
const comparisons = [];
|
|
94
|
+
// Prepare SKILL.md versions
|
|
95
|
+
const skillMdContents = [];
|
|
96
|
+
for (const { skill, registrySkill } of skills) {
|
|
97
|
+
const skillMdContent = convertToSkillMd(skill, registrySkill);
|
|
98
|
+
skillMdContents.push({ name: skill.meta.name, content: skillMdContent });
|
|
99
|
+
}
|
|
100
|
+
// Use the largest skill for benchmarks
|
|
101
|
+
const largestSkill = skills.reduce((a, b) => a.content.length > b.content.length ? a : b);
|
|
102
|
+
const largestSkillMd = skillMdContents.find(s => s.name === largestSkill.skill.meta.name);
|
|
103
|
+
// 1. Parsing Benchmarks
|
|
104
|
+
console.log(chalk.yellow('Running parsing benchmarks...'));
|
|
105
|
+
if (verbose) {
|
|
106
|
+
console.log(chalk.gray(` Using skill: ${largestSkill.skill.meta.name} (${formatBytes(Buffer.byteLength(largestSkill.content))})`));
|
|
107
|
+
}
|
|
108
|
+
const parsingResults = await runParsingBenchmarks(largestSkill.content, largestSkillMd.content, benchmarkOpts);
|
|
109
|
+
comparisons.push(createComparison('Parsing', parsingResults.uasp, parsingResults.skillMd));
|
|
110
|
+
console.log(chalk.green(' ā Parsing benchmarks complete'));
|
|
111
|
+
// 2. Validation Benchmarks
|
|
112
|
+
console.log(chalk.yellow('Running validation benchmarks...'));
|
|
113
|
+
runGC();
|
|
114
|
+
const validationResults = await runValidationBenchmarks(largestSkill.skill, yaml.parse(largestSkillMd.content.match(/^---\n([\s\S]*?)\n---/)?.[1] || '{}'), benchmarkOpts);
|
|
115
|
+
comparisons.push(createComparison('Validation', validationResults.uasp, validationResults.skillMd));
|
|
116
|
+
console.log(chalk.green(' ā Validation benchmarks complete'));
|
|
117
|
+
// 3. Conversion Benchmarks
|
|
118
|
+
console.log(chalk.yellow('Running conversion benchmarks...'));
|
|
119
|
+
runGC();
|
|
120
|
+
const conversionResults = await runConversionBenchmarks(largestSkill.skill, largestSkill.registrySkill, largestSkill.content, benchmarkOpts);
|
|
121
|
+
// For conversion, we compare UASP conversion time vs "already converted" (near-zero)
|
|
122
|
+
const noOpResult = {
|
|
123
|
+
name: 'SKILL.md (no conversion)',
|
|
124
|
+
timing: { mean: 0.001, median: 0.001, min: 0.001, max: 0.001, stdDev: 0, samples: [] },
|
|
125
|
+
iterations,
|
|
126
|
+
warmup,
|
|
127
|
+
};
|
|
128
|
+
comparisons.push(createComparison('Conversion', conversionResults.conversion, noOpResult));
|
|
129
|
+
console.log(chalk.green(' ā Conversion benchmarks complete'));
|
|
130
|
+
// 4. Search Benchmarks
|
|
131
|
+
console.log(chalk.yellow('Running search benchmarks...'));
|
|
132
|
+
runGC();
|
|
133
|
+
const searchQuery = 'browser'; // Common search term
|
|
134
|
+
const searchResults = await runSearchBenchmarks(skills.map(s => ({ skill: s.skill, registrySkill: s.registrySkill })), skillMdContents, searchQuery, benchmarkOpts);
|
|
135
|
+
comparisons.push(createComparison('Search', searchResults.uasp, searchResults.skillMd));
|
|
136
|
+
console.log(chalk.green(' ā Search benchmarks complete'));
|
|
137
|
+
// Generate report
|
|
138
|
+
console.log('');
|
|
139
|
+
const report = createReport(comparisons);
|
|
140
|
+
// Add additional metrics
|
|
141
|
+
if (verbose) {
|
|
142
|
+
console.log(chalk.cyan('\nAdditional Metrics:'));
|
|
143
|
+
console.log(chalk.gray(` File Size Ratio: ${conversionResults.fileSize.ratio.toFixed(2)}x`));
|
|
144
|
+
console.log(chalk.gray(` UASP: ${conversionResults.fileSize.uaspFormatted}`));
|
|
145
|
+
console.log(chalk.gray(` SKILL.md: ${conversionResults.fileSize.skillMdFormatted}`));
|
|
146
|
+
console.log(chalk.gray(` Feature Coverage: ${conversionResults.featureCoverage.toFixed(1)}%`));
|
|
147
|
+
}
|
|
148
|
+
// Output report
|
|
149
|
+
let reportOutput;
|
|
150
|
+
switch (output) {
|
|
151
|
+
case 'json':
|
|
152
|
+
reportOutput = formatJsonReport(report);
|
|
153
|
+
break;
|
|
154
|
+
case 'markdown':
|
|
155
|
+
reportOutput = formatMarkdownReport(report);
|
|
156
|
+
break;
|
|
157
|
+
default:
|
|
158
|
+
reportOutput = formatConsoleReport(report);
|
|
159
|
+
}
|
|
160
|
+
console.log(reportOutput);
|
|
161
|
+
// Save to file if requested
|
|
162
|
+
if (save) {
|
|
163
|
+
await fs.writeFile(save, reportOutput);
|
|
164
|
+
console.log(chalk.green(`\nReport saved to: ${save}`));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// CLI setup
|
|
168
|
+
program
|
|
169
|
+
.name('uasp-benchmark')
|
|
170
|
+
.description('Benchmark UASP vs SKILL.md format performance')
|
|
171
|
+
.version('1.0.0');
|
|
172
|
+
program
|
|
173
|
+
.option('-d, --dir <path>', 'Directory containing skills', process.cwd())
|
|
174
|
+
.option('-o, --output <format>', 'Output format (console, json, markdown)', 'console')
|
|
175
|
+
.option('-s, --save <path>', 'Save report to file')
|
|
176
|
+
.option('-i, --iterations <n>', 'Number of iterations', '100')
|
|
177
|
+
.option('-w, --warmup <n>', 'Number of warmup runs', '5')
|
|
178
|
+
.option('-v, --verbose', 'Show verbose output', false)
|
|
179
|
+
.action(async (opts) => {
|
|
180
|
+
try {
|
|
181
|
+
await runBenchmarks({
|
|
182
|
+
dir: opts.dir,
|
|
183
|
+
output: opts.output,
|
|
184
|
+
save: opts.save,
|
|
185
|
+
iterations: parseInt(opts.iterations, 10),
|
|
186
|
+
warmup: parseInt(opts.warmup, 10),
|
|
187
|
+
verbose: opts.verbose,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
console.error(chalk.red('Error:'), error.message);
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
program.parse();
|
|
196
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/benchmark/index.ts"],"names":[],"mappings":"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"}
|