@skillmark/cli 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 (101) hide show
  1. package/dist/cli-entry-point.d.ts +3 -0
  2. package/dist/cli-entry-point.d.ts.map +1 -0
  3. package/dist/cli-entry-point.js +207 -0
  4. package/dist/cli-entry-point.js.map +1 -0
  5. package/dist/commands/auth-setup-and-token-storage-command.d.ts +21 -0
  6. package/dist/commands/auth-setup-and-token-storage-command.d.ts.map +1 -0
  7. package/dist/commands/auth-setup-and-token-storage-command.js +166 -0
  8. package/dist/commands/auth-setup-and-token-storage-command.js.map +1 -0
  9. package/dist/commands/publish-results-command.d.ts +21 -0
  10. package/dist/commands/publish-results-command.d.ts.map +1 -0
  11. package/dist/commands/publish-results-command.js +256 -0
  12. package/dist/commands/publish-results-command.js.map +1 -0
  13. package/dist/commands/run-benchmark-command.d.ts +6 -0
  14. package/dist/commands/run-benchmark-command.d.ts.map +1 -0
  15. package/dist/commands/run-benchmark-command.js +331 -0
  16. package/dist/commands/run-benchmark-command.js.map +1 -0
  17. package/dist/commands/view-leaderboard-command.d.ts +8 -0
  18. package/dist/commands/view-leaderboard-command.d.ts.map +1 -0
  19. package/dist/commands/view-leaderboard-command.js +169 -0
  20. package/dist/commands/view-leaderboard-command.js.map +1 -0
  21. package/dist/config/api-key-config-reader.d.ts +14 -0
  22. package/dist/config/api-key-config-reader.d.ts.map +1 -0
  23. package/dist/config/api-key-config-reader.js +107 -0
  24. package/dist/config/api-key-config-reader.js.map +1 -0
  25. package/dist/config/api-key-config-reader.test.d.ts +2 -0
  26. package/dist/config/api-key-config-reader.test.d.ts.map +1 -0
  27. package/dist/config/api-key-config-reader.test.js +21 -0
  28. package/dist/config/api-key-config-reader.test.js.map +1 -0
  29. package/dist/engine/claude-cli-executor.d.ts +33 -0
  30. package/dist/engine/claude-cli-executor.d.ts.map +1 -0
  31. package/dist/engine/claude-cli-executor.js +251 -0
  32. package/dist/engine/claude-cli-executor.js.map +1 -0
  33. package/dist/engine/concept-accuracy-scorer.d.ts +24 -0
  34. package/dist/engine/concept-accuracy-scorer.d.ts.map +1 -0
  35. package/dist/engine/concept-accuracy-scorer.js +186 -0
  36. package/dist/engine/concept-accuracy-scorer.js.map +1 -0
  37. package/dist/engine/concept-accuracy-scorer.test.d.ts +2 -0
  38. package/dist/engine/concept-accuracy-scorer.test.d.ts.map +1 -0
  39. package/dist/engine/concept-accuracy-scorer.test.js +230 -0
  40. package/dist/engine/concept-accuracy-scorer.test.js.map +1 -0
  41. package/dist/engine/enhanced-test-prompt-builder.d.ts +30 -0
  42. package/dist/engine/enhanced-test-prompt-builder.d.ts.map +1 -0
  43. package/dist/engine/enhanced-test-prompt-builder.js +134 -0
  44. package/dist/engine/enhanced-test-prompt-builder.js.map +1 -0
  45. package/dist/engine/markdown-test-definition-parser.d.ts +18 -0
  46. package/dist/engine/markdown-test-definition-parser.d.ts.map +1 -0
  47. package/dist/engine/markdown-test-definition-parser.js +525 -0
  48. package/dist/engine/markdown-test-definition-parser.js.map +1 -0
  49. package/dist/engine/markdown-test-definition-parser.test.d.ts +2 -0
  50. package/dist/engine/markdown-test-definition-parser.test.d.ts.map +1 -0
  51. package/dist/engine/markdown-test-definition-parser.test.js +265 -0
  52. package/dist/engine/markdown-test-definition-parser.test.js.map +1 -0
  53. package/dist/engine/retry-with-degrade-utils.d.ts +58 -0
  54. package/dist/engine/retry-with-degrade-utils.d.ts.map +1 -0
  55. package/dist/engine/retry-with-degrade-utils.js +86 -0
  56. package/dist/engine/retry-with-degrade-utils.js.map +1 -0
  57. package/dist/engine/skill-content-collector.d.ts +53 -0
  58. package/dist/engine/skill-content-collector.d.ts.map +1 -0
  59. package/dist/engine/skill-content-collector.js +157 -0
  60. package/dist/engine/skill-content-collector.js.map +1 -0
  61. package/dist/engine/skill-creator-invoker.d.ts +36 -0
  62. package/dist/engine/skill-creator-invoker.d.ts.map +1 -0
  63. package/dist/engine/skill-creator-invoker.js +222 -0
  64. package/dist/engine/skill-creator-invoker.js.map +1 -0
  65. package/dist/engine/transcript-jsonl-parser.d.ts +28 -0
  66. package/dist/engine/transcript-jsonl-parser.d.ts.map +1 -0
  67. package/dist/engine/transcript-jsonl-parser.js +175 -0
  68. package/dist/engine/transcript-jsonl-parser.js.map +1 -0
  69. package/dist/sources/git-repository-skill-source-handler.d.ts +18 -0
  70. package/dist/sources/git-repository-skill-source-handler.d.ts.map +1 -0
  71. package/dist/sources/git-repository-skill-source-handler.js +119 -0
  72. package/dist/sources/git-repository-skill-source-handler.js.map +1 -0
  73. package/dist/sources/local-skill-source-handler.d.ts +21 -0
  74. package/dist/sources/local-skill-source-handler.d.ts.map +1 -0
  75. package/dist/sources/local-skill-source-handler.js +138 -0
  76. package/dist/sources/local-skill-source-handler.js.map +1 -0
  77. package/dist/sources/local-skill-source-handler.test.d.ts +2 -0
  78. package/dist/sources/local-skill-source-handler.test.d.ts.map +1 -0
  79. package/dist/sources/local-skill-source-handler.test.js +55 -0
  80. package/dist/sources/local-skill-source-handler.test.js.map +1 -0
  81. package/dist/sources/skillsh-registry-source-handler.d.ts +18 -0
  82. package/dist/sources/skillsh-registry-source-handler.d.ts.map +1 -0
  83. package/dist/sources/skillsh-registry-source-handler.js +130 -0
  84. package/dist/sources/skillsh-registry-source-handler.js.map +1 -0
  85. package/dist/sources/unified-skill-source-resolver.d.ts +20 -0
  86. package/dist/sources/unified-skill-source-resolver.d.ts.map +1 -0
  87. package/dist/sources/unified-skill-source-resolver.js +64 -0
  88. package/dist/sources/unified-skill-source-resolver.js.map +1 -0
  89. package/dist/sources/unified-skill-source-resolver.test.d.ts +2 -0
  90. package/dist/sources/unified-skill-source-resolver.test.d.ts.map +1 -0
  91. package/dist/sources/unified-skill-source-resolver.test.js +84 -0
  92. package/dist/sources/unified-skill-source-resolver.test.js.map +1 -0
  93. package/dist/types/benchmark-types.d.ts +142 -0
  94. package/dist/types/benchmark-types.d.ts.map +1 -0
  95. package/dist/types/benchmark-types.js +5 -0
  96. package/dist/types/benchmark-types.js.map +1 -0
  97. package/dist/types/index.d.ts +5 -0
  98. package/dist/types/index.d.ts.map +1 -0
  99. package/dist/types/index.js +5 -0
  100. package/dist/types/index.js.map +1 -0
  101. package/package.json +38 -0
@@ -0,0 +1,18 @@
1
+ import type { TestDefinition } from '../types/index.js';
2
+ /**
3
+ * Parse a single test file
4
+ */
5
+ export declare function parseTestFile(filePath: string): Promise<TestDefinition>;
6
+ /**
7
+ * Parse test content from string
8
+ */
9
+ export declare function parseTestContent(content: string, sourcePath?: string): TestDefinition;
10
+ /**
11
+ * Load all test files from a directory
12
+ */
13
+ export declare function loadTestsFromDirectory(dirPath: string): Promise<TestDefinition[]>;
14
+ /**
15
+ * Auto-discover test files from skill directory
16
+ */
17
+ export declare function discoverTests(skillPath: string): Promise<TestDefinition[]>;
18
+ //# sourceMappingURL=markdown-test-definition-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-test-definition-parser.d.ts","sourceRoot":"","sources":["../../src/engine/markdown-test-definition-parser.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAqCxD;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAG7E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAkB,GAAG,cAAc,CAoChG;AA+FD;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAwBvF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA+BhF"}
@@ -0,0 +1,525 @@
1
+ /**
2
+ * Markdown test definition parser - parses test files with YAML frontmatter
3
+ * and auto-generates tests from SKILL.md when no tests exist.
4
+ *
5
+ * Enhanced generation uses skill-creator + @claude-code-guide for better
6
+ * test quality via concept extraction and testing pattern awareness.
7
+ */
8
+ import { readFile, readdir, stat, mkdir, writeFile } from 'node:fs/promises';
9
+ import { join, extname } from 'node:path';
10
+ import matter from 'gray-matter';
11
+ import { SkillContentCollector } from './skill-content-collector.js';
12
+ import { withRetry } from './retry-with-degrade-utils.js';
13
+ import { getStoredToken } from '../commands/auth-setup-and-token-storage-command.js';
14
+ import { ensureSkillCreatorInstalled, invokeSkillCreator, } from './skill-creator-invoker.js';
15
+ import { buildEnhancedTestPrompt } from './enhanced-test-prompt-builder.js';
16
+ /** Default values for test definitions */
17
+ const DEFAULTS = {
18
+ type: 'knowledge',
19
+ timeout: 600, // 10 minutes - agent tests can be multi-step
20
+ concepts: [],
21
+ };
22
+ /**
23
+ * Parse a single test file
24
+ */
25
+ export async function parseTestFile(filePath) {
26
+ const content = await readFile(filePath, 'utf-8');
27
+ return parseTestContent(content, filePath);
28
+ }
29
+ /**
30
+ * Parse test content from string
31
+ */
32
+ export function parseTestContent(content, sourcePath = 'unknown') {
33
+ const { data: frontmatter, content: body } = matter(content);
34
+ // Validate required fields
35
+ if (!frontmatter.name) {
36
+ throw new Error(`Test file missing required 'name' field: ${sourcePath}`);
37
+ }
38
+ // Parse sections from body
39
+ const sections = parseSections(body);
40
+ // Extract prompt
41
+ const prompt = sections.prompt || sections.question || '';
42
+ if (!prompt) {
43
+ throw new Error(`Test file missing 'Prompt' or 'Question' section: ${sourcePath}`);
44
+ }
45
+ // Extract expected patterns
46
+ const expectedSection = sections.expected || sections.criteria || '';
47
+ const expected = parseExpectedPatterns(expectedSection);
48
+ // Combine frontmatter concepts with expected patterns
49
+ const concepts = [
50
+ ...(frontmatter.concepts || []),
51
+ ...extractConceptsFromExpected(expected),
52
+ ];
53
+ return {
54
+ name: frontmatter.name,
55
+ type: frontmatter.type || DEFAULTS.type,
56
+ concepts: [...new Set(concepts)], // Deduplicate
57
+ timeout: frontmatter.timeout || DEFAULTS.timeout,
58
+ prompt: prompt.trim(),
59
+ expected,
60
+ sourcePath,
61
+ };
62
+ }
63
+ /**
64
+ * Parse markdown sections (# Heading -> content)
65
+ */
66
+ function parseSections(content) {
67
+ const sections = {};
68
+ const lines = content.split('\n');
69
+ let currentSection = '';
70
+ let currentContent = [];
71
+ for (const line of lines) {
72
+ const headingMatch = line.match(/^#+\s+(.+)$/);
73
+ if (headingMatch) {
74
+ // Save previous section
75
+ if (currentSection) {
76
+ sections[currentSection.toLowerCase()] = currentContent.join('\n').trim();
77
+ }
78
+ currentSection = headingMatch[1];
79
+ currentContent = [];
80
+ }
81
+ else {
82
+ currentContent.push(line);
83
+ }
84
+ }
85
+ // Save last section
86
+ if (currentSection) {
87
+ sections[currentSection.toLowerCase()] = currentContent.join('\n').trim();
88
+ }
89
+ return sections;
90
+ }
91
+ /**
92
+ * Parse expected patterns from section content
93
+ */
94
+ function parseExpectedPatterns(content) {
95
+ const patterns = [];
96
+ const lines = content.split('\n');
97
+ for (const line of lines) {
98
+ // Parse checkbox items: - [ ] Pattern or - [x] Pattern
99
+ const checkboxMatch = line.match(/^-\s*\[[\sx]\]\s*(.+)$/);
100
+ if (checkboxMatch) {
101
+ patterns.push(checkboxMatch[1].trim());
102
+ continue;
103
+ }
104
+ // Parse bullet items: - Pattern or * Pattern
105
+ const bulletMatch = line.match(/^[-*]\s+(.+)$/);
106
+ if (bulletMatch) {
107
+ patterns.push(bulletMatch[1].trim());
108
+ continue;
109
+ }
110
+ // Parse numbered items: 1. Pattern
111
+ const numberedMatch = line.match(/^\d+\.\s+(.+)$/);
112
+ if (numberedMatch) {
113
+ patterns.push(numberedMatch[1].trim());
114
+ }
115
+ }
116
+ return patterns;
117
+ }
118
+ /**
119
+ * Extract key concepts from expected patterns
120
+ */
121
+ function extractConceptsFromExpected(patterns) {
122
+ const concepts = [];
123
+ for (const pattern of patterns) {
124
+ // Extract quoted terms
125
+ const quoted = pattern.match(/"([^"]+)"/g);
126
+ if (quoted) {
127
+ concepts.push(...quoted.map((q) => q.replace(/"/g, '')));
128
+ }
129
+ // Extract backticked terms
130
+ const backticked = pattern.match(/`([^`]+)`/g);
131
+ if (backticked) {
132
+ concepts.push(...backticked.map((b) => b.replace(/`/g, '')));
133
+ }
134
+ // Extract parenthetical clarifications like "concept (detail)"
135
+ const parenthetical = pattern.match(/(\w+(?:\s+\w+)?)\s*\([^)]+\)/g);
136
+ if (parenthetical) {
137
+ concepts.push(...parenthetical.map((p) => p.replace(/\s*\([^)]+\)/, '').trim()));
138
+ }
139
+ }
140
+ return concepts;
141
+ }
142
+ /**
143
+ * Load all test files from a directory
144
+ */
145
+ export async function loadTestsFromDirectory(dirPath) {
146
+ const tests = [];
147
+ try {
148
+ const entries = await readdir(dirPath);
149
+ for (const entry of entries) {
150
+ const fullPath = join(dirPath, entry);
151
+ const stats = await stat(fullPath);
152
+ if (stats.isFile() && extname(entry) === '.md') {
153
+ try {
154
+ const test = await parseTestFile(fullPath);
155
+ tests.push(test);
156
+ }
157
+ catch (error) {
158
+ console.warn(`Skipping invalid test file ${entry}: ${error}`);
159
+ }
160
+ }
161
+ }
162
+ }
163
+ catch (error) {
164
+ throw new Error(`Failed to load tests from ${dirPath}: ${error}`);
165
+ }
166
+ return tests;
167
+ }
168
+ /**
169
+ * Auto-discover test files from skill directory
170
+ */
171
+ export async function discoverTests(skillPath) {
172
+ // Check common test locations
173
+ const testLocations = [
174
+ join(skillPath, 'tests'),
175
+ join(skillPath, 'test'),
176
+ join(skillPath, '__tests__'),
177
+ skillPath, // Look for *.test.md in root
178
+ ];
179
+ for (const location of testLocations) {
180
+ try {
181
+ const stats = await stat(location);
182
+ if (stats.isDirectory()) {
183
+ const tests = await loadTestsFromDirectory(location);
184
+ if (tests.length > 0) {
185
+ return tests;
186
+ }
187
+ }
188
+ }
189
+ catch {
190
+ continue;
191
+ }
192
+ }
193
+ // No tests found - auto-generate from SKILL.md
194
+ const skillMdPath = join(skillPath, 'SKILL.md');
195
+ try {
196
+ await stat(skillMdPath);
197
+ return generateTestsFromSkillMd(skillPath);
198
+ }
199
+ catch {
200
+ return [];
201
+ }
202
+ }
203
+ /**
204
+ * Prompt template for test generation - requests JSON-only output
205
+ */
206
+ const TEST_GENERATION_PROMPT = `You must respond with ONLY a JSON object. No explanation, no markdown code blocks, just raw JSON.
207
+
208
+ Generate tests for this skill. Output format:
209
+ {"skill_name":"<name>","tests":[{"name":"<skill>-<topic>","test_type":"knowledge"|"task","concepts":["..."],"timeout":600|1800,"prompt":"...","expected_items":["..."]}]}
210
+
211
+ Rules:
212
+ - 2-4 tests, at least 1 knowledge + 1 task
213
+ - Extract concepts from Key Concepts Index or section headers
214
+ - timeout: 600 (knowledge/10min), 1800 (task/30min)
215
+ - 4-8 expected_items per test
216
+
217
+ Skill content:
218
+ {skill_content}
219
+
220
+ JSON:`;
221
+ /**
222
+ * Extract JSON from Claude CLI response - handles various formats
223
+ */
224
+ function extractJsonFromResponse(text) {
225
+ // Patterns to try in order of preference
226
+ const patterns = [
227
+ /```json\s*\n([\s\S]*?)\n```/, // ```json ... ```
228
+ /```\s*\n([\s\S]*?)\n```/, // ``` ... ```
229
+ /\{[\s\S]*\}/, // Raw JSON object
230
+ ];
231
+ for (const pattern of patterns) {
232
+ const match = text.match(pattern);
233
+ if (match) {
234
+ const jsonStr = match[1] ?? match[0];
235
+ // Validate it's actual JSON
236
+ try {
237
+ JSON.parse(jsonStr);
238
+ return jsonStr;
239
+ }
240
+ catch {
241
+ continue;
242
+ }
243
+ }
244
+ }
245
+ return null;
246
+ }
247
+ /**
248
+ * Spawn Claude CLI with JSON output format
249
+ */
250
+ async function invokeClaudeCliWithJson(prompt, model = 'sonnet', timeoutMs = 180000) {
251
+ const { spawn } = await import('node:child_process');
252
+ // Get stored OAuth token
253
+ const storedToken = await getStoredToken();
254
+ const env = { ...process.env };
255
+ if (storedToken) {
256
+ env.CLAUDE_CODE_OAUTH_TOKEN = storedToken;
257
+ }
258
+ return new Promise((resolve) => {
259
+ const args = [
260
+ '-p', prompt,
261
+ '--output-format', 'json',
262
+ '--model', model,
263
+ '--dangerously-skip-permissions',
264
+ ];
265
+ console.log(`Invoking Claude CLI (${model})...`);
266
+ const proc = spawn('claude', args, {
267
+ env,
268
+ stdio: ['ignore', 'pipe', 'pipe'],
269
+ });
270
+ let stdout = '';
271
+ let stderr = '';
272
+ proc.stdout.on('data', (data) => {
273
+ stdout += data.toString();
274
+ });
275
+ proc.stderr.on('data', (data) => {
276
+ stderr += data.toString();
277
+ });
278
+ const timeout = setTimeout(() => {
279
+ proc.kill('SIGTERM');
280
+ console.warn(`Claude CLI timeout after ${timeoutMs}ms`);
281
+ resolve(null);
282
+ }, timeoutMs);
283
+ proc.on('error', (error) => {
284
+ clearTimeout(timeout);
285
+ console.warn(`Claude CLI error: ${error.message}`);
286
+ resolve(null);
287
+ });
288
+ proc.on('close', (code) => {
289
+ clearTimeout(timeout);
290
+ // First try to parse stdout for error details (Claude CLI returns errors in JSON)
291
+ if (stdout) {
292
+ try {
293
+ const parsed = JSON.parse(stdout);
294
+ if (parsed.is_error && parsed.result) {
295
+ const errorMsg = parsed.result;
296
+ if (errorMsg.includes('Invalid API key') || errorMsg.includes('/login')) {
297
+ console.warn(`Authentication required: ${errorMsg}. Run 'claude /login' to authenticate.`);
298
+ }
299
+ else {
300
+ console.warn(`Claude CLI error: ${errorMsg}`);
301
+ }
302
+ resolve(null);
303
+ return;
304
+ }
305
+ }
306
+ catch {
307
+ // Not JSON, continue
308
+ }
309
+ }
310
+ if (code !== 0) {
311
+ const errorDetail = stderr || stdout.slice(0, 200) || 'No error details';
312
+ console.warn(`Claude CLI exited with code ${code}: ${errorDetail}`);
313
+ resolve(null);
314
+ return;
315
+ }
316
+ try {
317
+ // Parse the outer JSON response from Claude CLI
318
+ // Format: {"type": "result", "subtype": "success", "result": <actual_result>}
319
+ const response = JSON.parse(stdout);
320
+ if (response.result !== undefined) {
321
+ const inner = response.result;
322
+ // Result might be a JSON string that needs parsing
323
+ if (typeof inner === 'string') {
324
+ // Try extracting JSON from markdown code blocks
325
+ const jsonStr = extractJsonFromResponse(inner);
326
+ if (jsonStr) {
327
+ try {
328
+ const parsed = JSON.parse(jsonStr);
329
+ resolve(parsed.tests || null);
330
+ return;
331
+ }
332
+ catch {
333
+ // Fall through
334
+ }
335
+ }
336
+ // Try direct parsing
337
+ try {
338
+ const parsed = JSON.parse(inner);
339
+ resolve(parsed.tests || null);
340
+ return;
341
+ }
342
+ catch {
343
+ console.warn(`Could not parse JSON from response: ${inner.slice(0, 300)}`);
344
+ resolve(null);
345
+ return;
346
+ }
347
+ }
348
+ // inner is already an object
349
+ const innerObj = inner;
350
+ resolve(innerObj.tests || null);
351
+ return;
352
+ }
353
+ // Response might be the direct output
354
+ resolve(response.tests || null);
355
+ }
356
+ catch (error) {
357
+ console.warn(`Failed to parse Claude response: ${error}`);
358
+ resolve(null);
359
+ }
360
+ });
361
+ });
362
+ }
363
+ /**
364
+ * Format a generated test into skillmark test.md format
365
+ */
366
+ function formatTestToMarkdown(test) {
367
+ const lines = [
368
+ '---',
369
+ `name: ${test.name}`,
370
+ `type: ${test.test_type}`,
371
+ 'concepts:',
372
+ ];
373
+ for (const concept of test.concepts) {
374
+ lines.push(` - ${concept}`);
375
+ }
376
+ lines.push(`timeout: ${test.timeout}`);
377
+ lines.push('---');
378
+ lines.push('');
379
+ lines.push('# Prompt');
380
+ lines.push('');
381
+ lines.push(test.prompt);
382
+ lines.push('');
383
+ lines.push('# Expected');
384
+ lines.push('');
385
+ lines.push('The response should cover:');
386
+ for (const item of test.expected_items) {
387
+ lines.push(`- [ ] ${item}`);
388
+ }
389
+ lines.push('');
390
+ return lines.join('\n');
391
+ }
392
+ /**
393
+ * Convert generated test to TestDefinition
394
+ */
395
+ function convertToTestDefinition(test, testsDir) {
396
+ const filename = `${test.name}-test.md`;
397
+ return {
398
+ name: test.name,
399
+ type: test.test_type,
400
+ concepts: test.concepts,
401
+ timeout: test.timeout,
402
+ prompt: test.prompt,
403
+ expected: test.expected_items,
404
+ sourcePath: join(testsDir, filename),
405
+ };
406
+ }
407
+ /**
408
+ * Perform enhanced skill analysis using skill-creator with @claude-code-guide.
409
+ *
410
+ * Returns analysis with capabilities, concepts, edge cases, and testing patterns.
411
+ * Returns null if skill-creator is unavailable or analysis fails.
412
+ */
413
+ async function performEnhancedSkillAnalysis(skillPath) {
414
+ try {
415
+ // Ensure skill-creator is installed
416
+ const skillCreatorPath = await ensureSkillCreatorInstalled();
417
+ // Invoke skill-creator with retry (1 retry attempt)
418
+ const analysis = await withRetry(() => invokeSkillCreator(skillPath, skillCreatorPath), {
419
+ maxRetries: 1,
420
+ delayMs: 2000,
421
+ onRetry: (attempt, error) => {
422
+ console.log(`Retrying skill analysis (attempt ${attempt + 1}): ${error.message}`);
423
+ },
424
+ });
425
+ return analysis;
426
+ }
427
+ catch (error) {
428
+ console.warn(`Enhanced analysis unavailable: ${error.message}`);
429
+ return null;
430
+ }
431
+ }
432
+ /**
433
+ * Auto-generate tests from SKILL.md using Claude Code CLI with structured JSON output.
434
+ *
435
+ * Enhanced flow:
436
+ * 1. Try to invoke skill-creator with @claude-code-guide for skill analysis
437
+ * 2. Build enhanced prompt with analysis (capabilities, concepts, edge cases)
438
+ * 3. If analysis fails, gracefully degrade to basic prompt
439
+ * 4. Generate tests via Claude CLI
440
+ */
441
+ async function generateTestsFromSkillMd(skillPath) {
442
+ const testsDir = join(skillPath, 'tests');
443
+ console.log('Generating tests using Claude Code CLI (enhanced mode)...');
444
+ // Validate and collect skill content
445
+ const collector = new SkillContentCollector(skillPath);
446
+ const validation = await collector.validate();
447
+ if (!validation.valid) {
448
+ console.warn(`Invalid skill: ${validation.message}`);
449
+ return generateFallbackTests(skillPath);
450
+ }
451
+ const skillName = await collector.getSkillName();
452
+ console.log(`Analyzing skill: ${skillName}`);
453
+ // Attempt enhanced skill analysis (with graceful degradation)
454
+ console.log('Attempting enhanced skill analysis with skill-creator...');
455
+ const analysis = await performEnhancedSkillAnalysis(skillPath);
456
+ if (analysis) {
457
+ console.log('Enhanced analysis successful - using enriched prompt');
458
+ }
459
+ else {
460
+ console.log('Enhanced analysis unavailable - using basic prompt');
461
+ }
462
+ // Collect and format skill content for prompt
463
+ const skillContent = await collector.formatForPrompt();
464
+ // Build prompt (enhanced with analysis or basic fallback)
465
+ const prompt = buildEnhancedTestPrompt(skillContent, analysis);
466
+ // Invoke Claude CLI with JSON output
467
+ const generatedTests = await invokeClaudeCliWithJson(prompt);
468
+ if (!generatedTests || generatedTests.length === 0) {
469
+ console.warn('No tests generated from Claude CLI');
470
+ return generateFallbackTests(skillPath);
471
+ }
472
+ console.log(`Generated ${generatedTests.length} tests`);
473
+ // Create tests directory
474
+ await mkdir(testsDir, { recursive: true });
475
+ // Write test files and collect TestDefinitions
476
+ const tests = [];
477
+ let written = 0;
478
+ for (const test of generatedTests) {
479
+ const filename = `${test.name}-test.md`;
480
+ const filepath = join(testsDir, filename);
481
+ try {
482
+ await stat(filepath);
483
+ console.log(`Skipping existing: ${filename}`);
484
+ }
485
+ catch {
486
+ // File doesn't exist, create it
487
+ const content = formatTestToMarkdown(test);
488
+ await writeFile(filepath, content, 'utf-8');
489
+ console.log(`Created: ${filename}`);
490
+ written++;
491
+ }
492
+ tests.push(convertToTestDefinition(test, testsDir));
493
+ }
494
+ console.log(`Summary: ${written} created, ${generatedTests.length - written} skipped`);
495
+ console.log(`Output directory: ${testsDir}`);
496
+ return tests;
497
+ }
498
+ /**
499
+ * Generate fallback tests when Claude CLI fails
500
+ */
501
+ async function generateFallbackTests(skillPath) {
502
+ const skillMdPath = join(skillPath, 'SKILL.md');
503
+ console.log('Falling back to basic test generation...');
504
+ try {
505
+ const content = await readFile(skillMdPath, 'utf-8');
506
+ const { data: frontmatter } = matter(content);
507
+ const skillName = frontmatter.name || 'skill';
508
+ const desc = frontmatter.description || '';
509
+ const tests = [{
510
+ name: `${skillName}-basic-usage`,
511
+ type: 'task',
512
+ prompt: `Activate and use the skill "${skillName}" at ${skillPath}. ${desc}`,
513
+ expected: ['Skill activates correctly', 'Produces relevant output', 'No errors'],
514
+ timeout: 600,
515
+ concepts: ['basic-usage'],
516
+ sourcePath: skillMdPath,
517
+ }];
518
+ console.log(`Generated ${tests.length} fallback test(s)`);
519
+ return tests;
520
+ }
521
+ catch {
522
+ return [];
523
+ }
524
+ }
525
+ //# sourceMappingURL=markdown-test-definition-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-test-definition-parser.js","sourceRoot":"","sources":["../../src/engine/markdown-test-definition-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=markdown-test-definition-parser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-test-definition-parser.test.d.ts","sourceRoot":"","sources":["../../src/engine/markdown-test-definition-parser.test.ts"],"names":[],"mappings":""}