@nahisaho/musubix-core 1.0.0 → 1.0.1
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/commands/codegen.d.ts +125 -0
- package/dist/cli/commands/codegen.d.ts.map +1 -0
- package/dist/cli/commands/codegen.js +684 -0
- package/dist/cli/commands/codegen.js.map +1 -0
- package/dist/cli/commands/design.d.ts +158 -0
- package/dist/cli/commands/design.d.ts.map +1 -0
- package/dist/cli/commands/design.js +562 -0
- package/dist/cli/commands/design.js.map +1 -0
- package/dist/cli/commands/explain.d.ts +116 -0
- package/dist/cli/commands/explain.d.ts.map +1 -0
- package/dist/cli/commands/explain.js +419 -0
- package/dist/cli/commands/explain.js.map +1 -0
- package/dist/cli/commands/index.d.ts +13 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +31 -7
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/requirements.d.ts +103 -0
- package/dist/cli/commands/requirements.d.ts.map +1 -0
- package/dist/cli/commands/requirements.js +403 -0
- package/dist/cli/commands/requirements.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +99 -0
- package/dist/cli/commands/skills.d.ts.map +1 -0
- package/dist/cli/commands/skills.js +363 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/test.d.ts +113 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +532 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/trace.d.ts +132 -0
- package/dist/cli/commands/trace.d.ts.map +1 -0
- package/dist/cli/commands/trace.js +553 -0
- package/dist/cli/commands/trace.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills Command
|
|
3
|
+
*
|
|
4
|
+
* Manage GitHub Agent Skills for MUSUBIX
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module cli/commands/skills
|
|
8
|
+
*
|
|
9
|
+
* @see REQ-SKL-001 - Skills Directory Structure
|
|
10
|
+
* @see REQ-SKL-002 - Skills Manifest Format
|
|
11
|
+
* @see REQ-SKL-003 - Skills Validation
|
|
12
|
+
* @see REQ-SKL-004 - Skills CLI Integration
|
|
13
|
+
* @see DES-MUSUBIX-001 Section 16-B - Agent Skills設計
|
|
14
|
+
* @see TSK-061 - Skills CLI実装
|
|
15
|
+
*/
|
|
16
|
+
import { readdir, readFile, writeFile, mkdir, access, stat } from 'fs/promises';
|
|
17
|
+
import { join, resolve, basename } from 'path';
|
|
18
|
+
import { ExitCode, getGlobalOptions, outputResult } from '../base.js';
|
|
19
|
+
import * as yaml from 'yaml';
|
|
20
|
+
/**
|
|
21
|
+
* Default skills directory
|
|
22
|
+
*/
|
|
23
|
+
const DEFAULT_SKILLS_DIR = '.github/skills';
|
|
24
|
+
/**
|
|
25
|
+
* Required fields in SKILL.md frontmatter
|
|
26
|
+
*/
|
|
27
|
+
const REQUIRED_FRONTMATTER_FIELDS = ['name', 'description'];
|
|
28
|
+
/**
|
|
29
|
+
* Skill template for creation
|
|
30
|
+
*/
|
|
31
|
+
const SKILL_TEMPLATE = (name) => `---
|
|
32
|
+
name: ${name}
|
|
33
|
+
description: [Enter skill description]
|
|
34
|
+
license: MIT
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
# ${name}
|
|
38
|
+
|
|
39
|
+
## Overview
|
|
40
|
+
|
|
41
|
+
[Describe what this skill does]
|
|
42
|
+
|
|
43
|
+
## Usage
|
|
44
|
+
|
|
45
|
+
[Explain how to use this skill]
|
|
46
|
+
|
|
47
|
+
## Prerequisites
|
|
48
|
+
|
|
49
|
+
[List any prerequisites]
|
|
50
|
+
|
|
51
|
+
## Workflow
|
|
52
|
+
|
|
53
|
+
[Describe the workflow steps]
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
[Provide usage examples]
|
|
58
|
+
`;
|
|
59
|
+
/**
|
|
60
|
+
* Register skills command
|
|
61
|
+
*/
|
|
62
|
+
export function registerSkillsCommand(program) {
|
|
63
|
+
const skills = program
|
|
64
|
+
.command('skills')
|
|
65
|
+
.description('Manage GitHub Agent Skills');
|
|
66
|
+
// skills list
|
|
67
|
+
skills
|
|
68
|
+
.command('list')
|
|
69
|
+
.description('List all available skills')
|
|
70
|
+
.option('-d, --skills-dir <dir>', 'Skills directory', DEFAULT_SKILLS_DIR)
|
|
71
|
+
.action(async (options) => {
|
|
72
|
+
const globalOpts = getGlobalOptions(program);
|
|
73
|
+
try {
|
|
74
|
+
const result = await executeSkillsList(options);
|
|
75
|
+
outputResult(result, globalOpts);
|
|
76
|
+
process.exit(result.success ? ExitCode.SUCCESS : ExitCode.GENERAL_ERROR);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
handleError(error, globalOpts);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
// skills validate
|
|
83
|
+
skills
|
|
84
|
+
.command('validate')
|
|
85
|
+
.description('Validate skill(s)')
|
|
86
|
+
.argument('[skill-name]', 'Skill name to validate (validates all if omitted)')
|
|
87
|
+
.option('-d, --skills-dir <dir>', 'Skills directory', DEFAULT_SKILLS_DIR)
|
|
88
|
+
.action(async (skillName, options) => {
|
|
89
|
+
const globalOpts = getGlobalOptions(program);
|
|
90
|
+
try {
|
|
91
|
+
const result = await executeSkillsValidate(skillName, options);
|
|
92
|
+
outputResult(result, globalOpts);
|
|
93
|
+
process.exit(result.success ? ExitCode.SUCCESS : ExitCode.GENERAL_ERROR);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
handleError(error, globalOpts);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
// skills create
|
|
100
|
+
skills
|
|
101
|
+
.command('create')
|
|
102
|
+
.description('Create a new skill from template')
|
|
103
|
+
.argument('<skill-name>', 'Name for the new skill')
|
|
104
|
+
.option('-d, --skills-dir <dir>', 'Skills directory', DEFAULT_SKILLS_DIR)
|
|
105
|
+
.action(async (skillName, options) => {
|
|
106
|
+
const globalOpts = getGlobalOptions(program);
|
|
107
|
+
try {
|
|
108
|
+
const result = await executeSkillsCreate(skillName, options);
|
|
109
|
+
outputResult(result, globalOpts);
|
|
110
|
+
process.exit(result.success ? ExitCode.SUCCESS : ExitCode.GENERAL_ERROR);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
handleError(error, globalOpts);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Handle error with proper output
|
|
119
|
+
*/
|
|
120
|
+
function handleError(error, globalOpts) {
|
|
121
|
+
if (globalOpts.json) {
|
|
122
|
+
console.error(JSON.stringify({
|
|
123
|
+
success: false,
|
|
124
|
+
error: error instanceof Error ? error.message : String(error),
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
129
|
+
}
|
|
130
|
+
process.exit(ExitCode.GENERAL_ERROR);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Parse YAML frontmatter from SKILL.md content
|
|
134
|
+
*/
|
|
135
|
+
export function parseFrontmatter(content) {
|
|
136
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
137
|
+
if (!frontmatterMatch) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
const parsed = yaml.parse(frontmatterMatch[1]);
|
|
142
|
+
return parsed;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get skill info from a skill directory
|
|
150
|
+
*/
|
|
151
|
+
async function getSkillInfo(skillPath) {
|
|
152
|
+
const name = basename(skillPath);
|
|
153
|
+
const skillMdPath = join(skillPath, 'SKILL.md');
|
|
154
|
+
try {
|
|
155
|
+
await access(skillMdPath);
|
|
156
|
+
const content = await readFile(skillMdPath, 'utf-8');
|
|
157
|
+
const metadata = parseFrontmatter(content);
|
|
158
|
+
return {
|
|
159
|
+
name,
|
|
160
|
+
path: skillPath,
|
|
161
|
+
metadata,
|
|
162
|
+
hasSkillMd: true,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return {
|
|
167
|
+
name,
|
|
168
|
+
path: skillPath,
|
|
169
|
+
metadata: null,
|
|
170
|
+
hasSkillMd: false,
|
|
171
|
+
error: 'SKILL.md not found',
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Execute skills list command
|
|
177
|
+
*/
|
|
178
|
+
export async function executeSkillsList(options) {
|
|
179
|
+
const skillsDir = resolve(process.cwd(), options.skillsDir ?? DEFAULT_SKILLS_DIR);
|
|
180
|
+
try {
|
|
181
|
+
await access(skillsDir);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
skills: [],
|
|
187
|
+
skillsDir,
|
|
188
|
+
message: `Skills directory not found: ${skillsDir}`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
const entries = await readdir(skillsDir, { withFileTypes: true });
|
|
192
|
+
const skillDirs = entries.filter(entry => entry.isDirectory());
|
|
193
|
+
const skills = [];
|
|
194
|
+
for (const dir of skillDirs) {
|
|
195
|
+
const skillPath = join(skillsDir, dir.name);
|
|
196
|
+
const info = await getSkillInfo(skillPath);
|
|
197
|
+
skills.push(info);
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
success: true,
|
|
201
|
+
skills,
|
|
202
|
+
skillsDir,
|
|
203
|
+
message: `Found ${skills.length} skill(s)`,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Validate a single skill
|
|
208
|
+
*/
|
|
209
|
+
async function validateSkill(skillPath) {
|
|
210
|
+
const skillName = basename(skillPath);
|
|
211
|
+
const errors = [];
|
|
212
|
+
const warnings = [];
|
|
213
|
+
// Check if skill directory exists
|
|
214
|
+
try {
|
|
215
|
+
const stats = await stat(skillPath);
|
|
216
|
+
if (!stats.isDirectory()) {
|
|
217
|
+
errors.push('Skill path is not a directory');
|
|
218
|
+
return { skillName, valid: false, errors, warnings };
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
errors.push('Skill directory not found');
|
|
223
|
+
return { skillName, valid: false, errors, warnings };
|
|
224
|
+
}
|
|
225
|
+
// Check SKILL.md exists
|
|
226
|
+
const skillMdPath = join(skillPath, 'SKILL.md');
|
|
227
|
+
let content;
|
|
228
|
+
try {
|
|
229
|
+
content = await readFile(skillMdPath, 'utf-8');
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
errors.push('SKILL.md file not found (REQ-SKL-001 violation)');
|
|
233
|
+
return { skillName, valid: false, errors, warnings };
|
|
234
|
+
}
|
|
235
|
+
// Check frontmatter exists and is valid YAML
|
|
236
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
237
|
+
if (!frontmatterMatch) {
|
|
238
|
+
errors.push('YAML frontmatter not found (REQ-SKL-002 violation)');
|
|
239
|
+
return { skillName, valid: false, errors, warnings };
|
|
240
|
+
}
|
|
241
|
+
// Parse frontmatter
|
|
242
|
+
let metadata;
|
|
243
|
+
try {
|
|
244
|
+
metadata = yaml.parse(frontmatterMatch[1]);
|
|
245
|
+
}
|
|
246
|
+
catch (e) {
|
|
247
|
+
errors.push(`Invalid YAML frontmatter: ${e instanceof Error ? e.message : String(e)}`);
|
|
248
|
+
return { skillName, valid: false, errors, warnings };
|
|
249
|
+
}
|
|
250
|
+
// Check required fields (REQ-SKL-002)
|
|
251
|
+
for (const field of REQUIRED_FRONTMATTER_FIELDS) {
|
|
252
|
+
if (!(field in metadata) || !metadata[field]) {
|
|
253
|
+
errors.push(`Missing required field: ${field} (REQ-SKL-002 violation)`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Check name matches directory name (Article VI - Project Memory)
|
|
257
|
+
if (metadata.name && metadata.name !== skillName) {
|
|
258
|
+
warnings.push(`Skill name '${metadata.name}' does not match directory name '${skillName}'`);
|
|
259
|
+
}
|
|
260
|
+
// Check description is not placeholder
|
|
261
|
+
if (metadata.description?.includes('[Enter') || metadata.description?.includes('[TODO')) {
|
|
262
|
+
warnings.push('Description contains placeholder text');
|
|
263
|
+
}
|
|
264
|
+
// Check for license
|
|
265
|
+
if (!metadata.license) {
|
|
266
|
+
warnings.push('License not specified (recommended)');
|
|
267
|
+
}
|
|
268
|
+
// Check content has meaningful documentation
|
|
269
|
+
const bodyContent = content.replace(/^---\n[\s\S]*?\n---/, '').trim();
|
|
270
|
+
if (bodyContent.length < 100) {
|
|
271
|
+
warnings.push('Skill documentation seems too short');
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
skillName,
|
|
275
|
+
valid: errors.length === 0,
|
|
276
|
+
errors,
|
|
277
|
+
warnings,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Execute skills validate command
|
|
282
|
+
*/
|
|
283
|
+
export async function executeSkillsValidate(skillName, options) {
|
|
284
|
+
const skillsDir = resolve(process.cwd(), options.skillsDir ?? DEFAULT_SKILLS_DIR);
|
|
285
|
+
if (skillName) {
|
|
286
|
+
// Validate single skill
|
|
287
|
+
const skillPath = join(skillsDir, skillName);
|
|
288
|
+
const result = await validateSkill(skillPath);
|
|
289
|
+
return {
|
|
290
|
+
success: result.valid,
|
|
291
|
+
results: [result],
|
|
292
|
+
message: result.valid
|
|
293
|
+
? `Skill '${skillName}' is valid`
|
|
294
|
+
: `Skill '${skillName}' has ${result.errors.length} error(s)`,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
// Validate all skills
|
|
298
|
+
try {
|
|
299
|
+
await access(skillsDir);
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
return {
|
|
303
|
+
success: false,
|
|
304
|
+
results: [],
|
|
305
|
+
message: `Skills directory not found: ${skillsDir}`,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
const entries = await readdir(skillsDir, { withFileTypes: true });
|
|
309
|
+
const skillDirs = entries.filter(entry => entry.isDirectory());
|
|
310
|
+
const results = [];
|
|
311
|
+
for (const dir of skillDirs) {
|
|
312
|
+
const skillPath = join(skillsDir, dir.name);
|
|
313
|
+
const result = await validateSkill(skillPath);
|
|
314
|
+
results.push(result);
|
|
315
|
+
}
|
|
316
|
+
const validCount = results.filter(r => r.valid).length;
|
|
317
|
+
const allValid = validCount === results.length;
|
|
318
|
+
return {
|
|
319
|
+
success: allValid,
|
|
320
|
+
results,
|
|
321
|
+
message: allValid
|
|
322
|
+
? `All ${results.length} skill(s) are valid`
|
|
323
|
+
: `${validCount}/${results.length} skill(s) are valid`,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Execute skills create command
|
|
328
|
+
*/
|
|
329
|
+
export async function executeSkillsCreate(skillName, options) {
|
|
330
|
+
const skillsDir = resolve(process.cwd(), options.skillsDir ?? DEFAULT_SKILLS_DIR);
|
|
331
|
+
const skillPath = join(skillsDir, skillName);
|
|
332
|
+
const filesCreated = [];
|
|
333
|
+
// Check if skill already exists
|
|
334
|
+
try {
|
|
335
|
+
await access(skillPath);
|
|
336
|
+
return {
|
|
337
|
+
success: false,
|
|
338
|
+
skillPath,
|
|
339
|
+
filesCreated: [],
|
|
340
|
+
message: `Skill '${skillName}' already exists`,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
// Skill doesn't exist, continue
|
|
345
|
+
}
|
|
346
|
+
// Create skills directory if it doesn't exist
|
|
347
|
+
await mkdir(skillsDir, { recursive: true });
|
|
348
|
+
// Create skill directory
|
|
349
|
+
await mkdir(skillPath, { recursive: true });
|
|
350
|
+
filesCreated.push(skillName + '/');
|
|
351
|
+
// Create SKILL.md
|
|
352
|
+
const skillMdPath = join(skillPath, 'SKILL.md');
|
|
353
|
+
const content = SKILL_TEMPLATE(skillName);
|
|
354
|
+
await writeFile(skillMdPath, content);
|
|
355
|
+
filesCreated.push(join(skillName, 'SKILL.md'));
|
|
356
|
+
return {
|
|
357
|
+
success: true,
|
|
358
|
+
skillPath,
|
|
359
|
+
filesCreated,
|
|
360
|
+
message: `Created skill '${skillName}' at ${skillPath}`,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Command
|
|
3
|
+
*
|
|
4
|
+
* CLI commands for test generation and coverage
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module cli/commands/test
|
|
8
|
+
*
|
|
9
|
+
* @see REQ-CLI-004 - Test CLI
|
|
10
|
+
* @see REQ-TG-001 - Test Generation
|
|
11
|
+
* @see REQ-TG-002 - Coverage Measurement
|
|
12
|
+
* @see DES-MUSUBIX-001 Section 16-C.4 - testコマンド設計
|
|
13
|
+
* @see TSK-074〜075 - Test CLI実装
|
|
14
|
+
*/
|
|
15
|
+
import type { Command } from 'commander';
|
|
16
|
+
/**
|
|
17
|
+
* Test command options
|
|
18
|
+
*/
|
|
19
|
+
export interface TestOptions {
|
|
20
|
+
output?: string;
|
|
21
|
+
framework?: 'vitest' | 'jest' | 'mocha' | 'pytest';
|
|
22
|
+
style?: 'unit' | 'integration' | 'e2e';
|
|
23
|
+
verbose?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Generated test
|
|
27
|
+
*/
|
|
28
|
+
export interface GeneratedTest {
|
|
29
|
+
filename: string;
|
|
30
|
+
content: string;
|
|
31
|
+
testCount: number;
|
|
32
|
+
metadata: {
|
|
33
|
+
sourceFile: string;
|
|
34
|
+
framework: string;
|
|
35
|
+
style: string;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Test generation result
|
|
40
|
+
*/
|
|
41
|
+
export interface TestGenerationResult {
|
|
42
|
+
success: boolean;
|
|
43
|
+
tests: GeneratedTest[];
|
|
44
|
+
summary: {
|
|
45
|
+
totalFiles: number;
|
|
46
|
+
totalTests: number;
|
|
47
|
+
framework: string;
|
|
48
|
+
};
|
|
49
|
+
message: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Coverage data
|
|
53
|
+
*/
|
|
54
|
+
export interface CoverageData {
|
|
55
|
+
file: string;
|
|
56
|
+
lines: {
|
|
57
|
+
covered: number;
|
|
58
|
+
total: number;
|
|
59
|
+
percentage: number;
|
|
60
|
+
};
|
|
61
|
+
functions: {
|
|
62
|
+
covered: number;
|
|
63
|
+
total: number;
|
|
64
|
+
percentage: number;
|
|
65
|
+
};
|
|
66
|
+
branches: {
|
|
67
|
+
covered: number;
|
|
68
|
+
total: number;
|
|
69
|
+
percentage: number;
|
|
70
|
+
};
|
|
71
|
+
statements: {
|
|
72
|
+
covered: number;
|
|
73
|
+
total: number;
|
|
74
|
+
percentage: number;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Coverage result
|
|
79
|
+
*/
|
|
80
|
+
export interface CoverageResult {
|
|
81
|
+
success: boolean;
|
|
82
|
+
coverage: CoverageData[];
|
|
83
|
+
summary: {
|
|
84
|
+
lines: number;
|
|
85
|
+
functions: number;
|
|
86
|
+
branches: number;
|
|
87
|
+
statements: number;
|
|
88
|
+
overall: number;
|
|
89
|
+
};
|
|
90
|
+
uncoveredFiles: string[];
|
|
91
|
+
message: string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Register test command
|
|
95
|
+
*/
|
|
96
|
+
export declare function registerTestCommand(program: Command): void;
|
|
97
|
+
/**
|
|
98
|
+
* Generate tests for file
|
|
99
|
+
*/
|
|
100
|
+
declare function generateTestsForFile(filePath: string, content: string, framework: string, style: string): Array<{
|
|
101
|
+
content: string;
|
|
102
|
+
testCount: number;
|
|
103
|
+
}>;
|
|
104
|
+
/**
|
|
105
|
+
* Analyze coverage
|
|
106
|
+
*/
|
|
107
|
+
declare function analyzeCoverage(dir: string): Promise<CoverageData[]>;
|
|
108
|
+
/**
|
|
109
|
+
* Calculate coverage summary
|
|
110
|
+
*/
|
|
111
|
+
declare function calculateCoverageSummary(data: CoverageData[]): CoverageResult['summary'];
|
|
112
|
+
export { generateTestsForFile, analyzeCoverage, calculateCoverageSummary, };
|
|
113
|
+
//# sourceMappingURL=test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACpE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AA2ED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8I1D;AAED;;GAEG;AACH,iBAAS,oBAAoB,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA4F/C;AAwED;;GAEG;AACH,iBAAe,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA6BnE;AAuDD;;GAEG;AACH,iBAAS,wBAAwB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,cAAc,CAAC,SAAS,CAAC,CAwBjF;AA2FD,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,wBAAwB,GACzB,CAAC"}
|