@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.
- package/dist/cli-entry-point.d.ts +3 -0
- package/dist/cli-entry-point.d.ts.map +1 -0
- package/dist/cli-entry-point.js +207 -0
- package/dist/cli-entry-point.js.map +1 -0
- package/dist/commands/auth-setup-and-token-storage-command.d.ts +21 -0
- package/dist/commands/auth-setup-and-token-storage-command.d.ts.map +1 -0
- package/dist/commands/auth-setup-and-token-storage-command.js +166 -0
- package/dist/commands/auth-setup-and-token-storage-command.js.map +1 -0
- package/dist/commands/publish-results-command.d.ts +21 -0
- package/dist/commands/publish-results-command.d.ts.map +1 -0
- package/dist/commands/publish-results-command.js +256 -0
- package/dist/commands/publish-results-command.js.map +1 -0
- package/dist/commands/run-benchmark-command.d.ts +6 -0
- package/dist/commands/run-benchmark-command.d.ts.map +1 -0
- package/dist/commands/run-benchmark-command.js +331 -0
- package/dist/commands/run-benchmark-command.js.map +1 -0
- package/dist/commands/view-leaderboard-command.d.ts +8 -0
- package/dist/commands/view-leaderboard-command.d.ts.map +1 -0
- package/dist/commands/view-leaderboard-command.js +169 -0
- package/dist/commands/view-leaderboard-command.js.map +1 -0
- package/dist/config/api-key-config-reader.d.ts +14 -0
- package/dist/config/api-key-config-reader.d.ts.map +1 -0
- package/dist/config/api-key-config-reader.js +107 -0
- package/dist/config/api-key-config-reader.js.map +1 -0
- package/dist/config/api-key-config-reader.test.d.ts +2 -0
- package/dist/config/api-key-config-reader.test.d.ts.map +1 -0
- package/dist/config/api-key-config-reader.test.js +21 -0
- package/dist/config/api-key-config-reader.test.js.map +1 -0
- package/dist/engine/claude-cli-executor.d.ts +33 -0
- package/dist/engine/claude-cli-executor.d.ts.map +1 -0
- package/dist/engine/claude-cli-executor.js +251 -0
- package/dist/engine/claude-cli-executor.js.map +1 -0
- package/dist/engine/concept-accuracy-scorer.d.ts +24 -0
- package/dist/engine/concept-accuracy-scorer.d.ts.map +1 -0
- package/dist/engine/concept-accuracy-scorer.js +186 -0
- package/dist/engine/concept-accuracy-scorer.js.map +1 -0
- package/dist/engine/concept-accuracy-scorer.test.d.ts +2 -0
- package/dist/engine/concept-accuracy-scorer.test.d.ts.map +1 -0
- package/dist/engine/concept-accuracy-scorer.test.js +230 -0
- package/dist/engine/concept-accuracy-scorer.test.js.map +1 -0
- package/dist/engine/enhanced-test-prompt-builder.d.ts +30 -0
- package/dist/engine/enhanced-test-prompt-builder.d.ts.map +1 -0
- package/dist/engine/enhanced-test-prompt-builder.js +134 -0
- package/dist/engine/enhanced-test-prompt-builder.js.map +1 -0
- package/dist/engine/markdown-test-definition-parser.d.ts +18 -0
- package/dist/engine/markdown-test-definition-parser.d.ts.map +1 -0
- package/dist/engine/markdown-test-definition-parser.js +525 -0
- package/dist/engine/markdown-test-definition-parser.js.map +1 -0
- package/dist/engine/markdown-test-definition-parser.test.d.ts +2 -0
- package/dist/engine/markdown-test-definition-parser.test.d.ts.map +1 -0
- package/dist/engine/markdown-test-definition-parser.test.js +265 -0
- package/dist/engine/markdown-test-definition-parser.test.js.map +1 -0
- package/dist/engine/retry-with-degrade-utils.d.ts +58 -0
- package/dist/engine/retry-with-degrade-utils.d.ts.map +1 -0
- package/dist/engine/retry-with-degrade-utils.js +86 -0
- package/dist/engine/retry-with-degrade-utils.js.map +1 -0
- package/dist/engine/skill-content-collector.d.ts +53 -0
- package/dist/engine/skill-content-collector.d.ts.map +1 -0
- package/dist/engine/skill-content-collector.js +157 -0
- package/dist/engine/skill-content-collector.js.map +1 -0
- package/dist/engine/skill-creator-invoker.d.ts +36 -0
- package/dist/engine/skill-creator-invoker.d.ts.map +1 -0
- package/dist/engine/skill-creator-invoker.js +222 -0
- package/dist/engine/skill-creator-invoker.js.map +1 -0
- package/dist/engine/transcript-jsonl-parser.d.ts +28 -0
- package/dist/engine/transcript-jsonl-parser.d.ts.map +1 -0
- package/dist/engine/transcript-jsonl-parser.js +175 -0
- package/dist/engine/transcript-jsonl-parser.js.map +1 -0
- package/dist/sources/git-repository-skill-source-handler.d.ts +18 -0
- package/dist/sources/git-repository-skill-source-handler.d.ts.map +1 -0
- package/dist/sources/git-repository-skill-source-handler.js +119 -0
- package/dist/sources/git-repository-skill-source-handler.js.map +1 -0
- package/dist/sources/local-skill-source-handler.d.ts +21 -0
- package/dist/sources/local-skill-source-handler.d.ts.map +1 -0
- package/dist/sources/local-skill-source-handler.js +138 -0
- package/dist/sources/local-skill-source-handler.js.map +1 -0
- package/dist/sources/local-skill-source-handler.test.d.ts +2 -0
- package/dist/sources/local-skill-source-handler.test.d.ts.map +1 -0
- package/dist/sources/local-skill-source-handler.test.js +55 -0
- package/dist/sources/local-skill-source-handler.test.js.map +1 -0
- package/dist/sources/skillsh-registry-source-handler.d.ts +18 -0
- package/dist/sources/skillsh-registry-source-handler.d.ts.map +1 -0
- package/dist/sources/skillsh-registry-source-handler.js +130 -0
- package/dist/sources/skillsh-registry-source-handler.js.map +1 -0
- package/dist/sources/unified-skill-source-resolver.d.ts +20 -0
- package/dist/sources/unified-skill-source-resolver.d.ts.map +1 -0
- package/dist/sources/unified-skill-source-resolver.js +64 -0
- package/dist/sources/unified-skill-source-resolver.js.map +1 -0
- package/dist/sources/unified-skill-source-resolver.test.d.ts +2 -0
- package/dist/sources/unified-skill-source-resolver.test.d.ts.map +1 -0
- package/dist/sources/unified-skill-source-resolver.test.js +84 -0
- package/dist/sources/unified-skill-source-resolver.test.js.map +1 -0
- package/dist/types/benchmark-types.d.ts +142 -0
- package/dist/types/benchmark-types.d.ts.map +1 -0
- package/dist/types/benchmark-types.js +5 -0
- package/dist/types/benchmark-types.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-test-definition-parser.test.d.ts","sourceRoot":"","sources":["../../src/engine/markdown-test-definition-parser.test.ts"],"names":[],"mappings":""}
|