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 CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 ifoster01
3
+ Copyright (c) 2026 ifoster01
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
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,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Benchmark CLI - UASP vs SKILL.md format performance comparison
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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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"}