@nahisaho/musubix-core 1.0.0 → 1.0.2

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 (33) hide show
  1. package/dist/cli/commands/codegen.d.ts +125 -0
  2. package/dist/cli/commands/codegen.d.ts.map +1 -0
  3. package/dist/cli/commands/codegen.js +684 -0
  4. package/dist/cli/commands/codegen.js.map +1 -0
  5. package/dist/cli/commands/design.d.ts +158 -0
  6. package/dist/cli/commands/design.d.ts.map +1 -0
  7. package/dist/cli/commands/design.js +562 -0
  8. package/dist/cli/commands/design.js.map +1 -0
  9. package/dist/cli/commands/explain.d.ts +116 -0
  10. package/dist/cli/commands/explain.d.ts.map +1 -0
  11. package/dist/cli/commands/explain.js +419 -0
  12. package/dist/cli/commands/explain.js.map +1 -0
  13. package/dist/cli/commands/index.d.ts +13 -0
  14. package/dist/cli/commands/index.d.ts.map +1 -1
  15. package/dist/cli/commands/index.js +31 -7
  16. package/dist/cli/commands/index.js.map +1 -1
  17. package/dist/cli/commands/requirements.d.ts +103 -0
  18. package/dist/cli/commands/requirements.d.ts.map +1 -0
  19. package/dist/cli/commands/requirements.js +403 -0
  20. package/dist/cli/commands/requirements.js.map +1 -0
  21. package/dist/cli/commands/skills.d.ts +99 -0
  22. package/dist/cli/commands/skills.d.ts.map +1 -0
  23. package/dist/cli/commands/skills.js +363 -0
  24. package/dist/cli/commands/skills.js.map +1 -0
  25. package/dist/cli/commands/test.d.ts +113 -0
  26. package/dist/cli/commands/test.d.ts.map +1 -0
  27. package/dist/cli/commands/test.js +532 -0
  28. package/dist/cli/commands/test.js.map +1 -0
  29. package/dist/cli/commands/trace.d.ts +132 -0
  30. package/dist/cli/commands/trace.d.ts.map +1 -0
  31. package/dist/cli/commands/trace.js +553 -0
  32. package/dist/cli/commands/trace.js.map +1 -0
  33. 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"}