sdd-mcp-server 2.0.3 ā 2.2.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/README.md +65 -33
- package/atomicWrite.js +86 -0
- package/dist/adapters/cli/SDDToolAdapter.js +15 -5
- package/dist/adapters/cli/SDDToolAdapter.js.map +1 -1
- package/dist/application/services/ProjectContextService.js +4 -4
- package/dist/application/services/ProjectInitializationService.js +23 -23
- package/dist/application/services/ProjectService.js +2 -2
- package/dist/application/services/QualityGateService.js +4 -4
- package/dist/application/services/SteeringContextLoader.js +2 -2
- package/dist/application/services/SteeringDocumentService.js +4 -4
- package/dist/application/services/TemplateService.js +2 -2
- package/dist/application/services/WorkflowValidationService.js +4 -4
- package/dist/application/services/staticSteering.js +10 -10
- package/dist/cli/install-skills.d.ts +38 -2
- package/dist/cli/install-skills.js +221 -5
- package/dist/cli/install-skills.js.map +1 -1
- package/dist/cli/migrate-kiro.d.ts +2 -0
- package/dist/cli/migrate-kiro.js +91 -0
- package/dist/cli/migrate-kiro.js.map +1 -0
- package/dist/cli/sdd-mcp-cli.d.ts +3 -1
- package/dist/cli/sdd-mcp-cli.js +26 -6
- package/dist/cli/sdd-mcp-cli.js.map +1 -1
- package/dist/index.js +26 -17
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/mcp/ResourceManager.js +2 -2
- package/dist/utils/atomicWrite.d.ts +55 -0
- package/dist/utils/atomicWrite.js +84 -0
- package/dist/utils/atomicWrite.js.map +1 -0
- package/dist/utils/documentGenerator.js +1 -1
- package/dist/utils/specGenerator.js +3 -3
- package/mcp-server.js +5 -4
- package/package.json +3 -1
- package/skills/sdd-commit/SKILL.md +14 -0
- package/skills/sdd-design/SKILL.md +15 -0
- package/skills/sdd-implement/SKILL.md +15 -0
- package/skills/sdd-requirements/SKILL.md +9 -2
- package/skills/sdd-tasks/SKILL.md +14 -0
- package/steering/AGENTS.md +281 -0
- package/steering/commit.md +59 -0
- package/steering/linus-review.md +153 -0
- package/steering/owasp-top10-check.md +49 -0
- package/steering/principles.md +639 -0
- package/steering/tdd-guideline.md +324 -0
|
@@ -50,7 +50,7 @@ let WorkflowValidationService = class WorkflowValidationService {
|
|
|
50
50
|
let readinessScore = 0;
|
|
51
51
|
try {
|
|
52
52
|
// Check if requirements document exists
|
|
53
|
-
const requirementsPath = `${project.path}/.
|
|
53
|
+
const requirementsPath = `${project.path}/.spec/specs/${project.name}/requirements.md`;
|
|
54
54
|
if (!(await this.fileSystem.exists(requirementsPath))) {
|
|
55
55
|
missingItems.push('requirements.md file not found');
|
|
56
56
|
}
|
|
@@ -168,7 +168,7 @@ let WorkflowValidationService = class WorkflowValidationService {
|
|
|
168
168
|
let readinessScore = 0;
|
|
169
169
|
try {
|
|
170
170
|
// Check if design document exists
|
|
171
|
-
const designPath = `${project.path}/.
|
|
171
|
+
const designPath = `${project.path}/.spec/specs/${project.name}/design.md`;
|
|
172
172
|
if (!(await this.fileSystem.exists(designPath))) {
|
|
173
173
|
missingItems.push('design.md file not found');
|
|
174
174
|
}
|
|
@@ -292,7 +292,7 @@ let WorkflowValidationService = class WorkflowValidationService {
|
|
|
292
292
|
let readinessScore = 0;
|
|
293
293
|
try {
|
|
294
294
|
// Check if tasks document exists
|
|
295
|
-
const tasksPath = `${project.path}/.
|
|
295
|
+
const tasksPath = `${project.path}/.spec/specs/${project.name}/tasks.md`;
|
|
296
296
|
if (!(await this.fileSystem.exists(tasksPath))) {
|
|
297
297
|
missingItems.push('tasks.md file not found');
|
|
298
298
|
}
|
|
@@ -414,7 +414,7 @@ let WorkflowValidationService = class WorkflowValidationService {
|
|
|
414
414
|
const traceabilityIssues = [];
|
|
415
415
|
const coverageGaps = [];
|
|
416
416
|
try {
|
|
417
|
-
const basePath = `${project.path}/.
|
|
417
|
+
const basePath = `${project.path}/.spec/specs/${project.name}`;
|
|
418
418
|
// Read all phase documents
|
|
419
419
|
const documents = {};
|
|
420
420
|
const files = ['requirements.md', 'design.md', 'tasks.md'];
|
|
@@ -6,7 +6,7 @@ export async function ensureStaticSteeringDocuments(projectPath, steeringService
|
|
|
6
6
|
const fs = await import('fs');
|
|
7
7
|
const path = await import('path');
|
|
8
8
|
// Linus review (always-on quality guardrail)
|
|
9
|
-
const linusReviewPath = path.join(projectPath, '.
|
|
9
|
+
const linusReviewPath = path.join(projectPath, '.spec', 'steering', 'linus-review.md');
|
|
10
10
|
if (!fs.existsSync(linusReviewPath)) {
|
|
11
11
|
const linusReviewContent = `# Linus Torvalds Code Review Steering Document
|
|
12
12
|
|
|
@@ -170,7 +170,7 @@ Remember: "Good taste" comes from experience. Question everything. Simplify ruth
|
|
|
170
170
|
});
|
|
171
171
|
}
|
|
172
172
|
// Commit guidelines
|
|
173
|
-
const commitPath = path.join(projectPath, '.
|
|
173
|
+
const commitPath = path.join(projectPath, '.spec', 'steering', 'commit.md');
|
|
174
174
|
if (!fs.existsSync(commitPath)) {
|
|
175
175
|
const commitContent = `# Commit Message Guidelines
|
|
176
176
|
|
|
@@ -240,7 +240,7 @@ These guidelines help maintain a clean and useful git history that makes it easi
|
|
|
240
240
|
});
|
|
241
241
|
}
|
|
242
242
|
// Security checklist (OWASP baseline)
|
|
243
|
-
const securityPath = path.join(projectPath, '.
|
|
243
|
+
const securityPath = path.join(projectPath, '.spec', 'steering', 'security-check.md');
|
|
244
244
|
if (!fs.existsSync(securityPath)) {
|
|
245
245
|
const securityContent = `# Security Check (OWASP Top 10 Aligned)
|
|
246
246
|
|
|
@@ -300,7 +300,7 @@ Use this checklist during code generation and review. Avoid OWASP Top 10 issues
|
|
|
300
300
|
});
|
|
301
301
|
}
|
|
302
302
|
// TDD guideline reinforcement
|
|
303
|
-
const tddPath = path.join(projectPath, '.
|
|
303
|
+
const tddPath = path.join(projectPath, '.spec', 'steering', 'tdd-guideline.md');
|
|
304
304
|
if (!fs.existsSync(tddPath)) {
|
|
305
305
|
const tddContent = `# Test-Driven Development (TDD) Guideline
|
|
306
306
|
|
|
@@ -422,7 +422,7 @@ This document is **always** active and applies to all development phases. Every
|
|
|
422
422
|
});
|
|
423
423
|
}
|
|
424
424
|
// Core coding principles (SOLID, DRY, etc.)
|
|
425
|
-
const principlesPath = path.join(projectPath, '.
|
|
425
|
+
const principlesPath = path.join(projectPath, '.spec', 'steering', 'principles.md');
|
|
426
426
|
if (!fs.existsSync(principlesPath)) {
|
|
427
427
|
const principlesContent = `# Core Coding Principles and Patterns
|
|
428
428
|
|
|
@@ -491,17 +491,17 @@ Kiro-style Spec Driven Development implementation using MCP tools.
|
|
|
491
491
|
## Project Context
|
|
492
492
|
|
|
493
493
|
### Paths
|
|
494
|
-
- Steering: \`.
|
|
495
|
-
- Specs: \`.
|
|
494
|
+
- Steering: \`.spec/steering/\`
|
|
495
|
+
- Specs: \`.spec/specs/\`
|
|
496
496
|
- Commands: \`.ai agent/commands/\`
|
|
497
497
|
|
|
498
498
|
### Steering vs Specification
|
|
499
499
|
|
|
500
|
-
**Steering** (\`.
|
|
501
|
-
**Specs** (\`.
|
|
500
|
+
**Steering** (\`.spec/steering/\`) - Guide AI with project-wide rules and context
|
|
501
|
+
**Specs** (\`.spec/specs/\`) - Formalize development process for individual features
|
|
502
502
|
|
|
503
503
|
### Active Specifications
|
|
504
|
-
- Check \`.
|
|
504
|
+
- Check \`.spec/specs/\` for active specifications
|
|
505
505
|
- Use \`sdd-status\` to check progress
|
|
506
506
|
|
|
507
507
|
**Current Specifications:**
|
|
@@ -5,25 +5,37 @@
|
|
|
5
5
|
export interface CLIOptions {
|
|
6
6
|
/** Target path for skill installation */
|
|
7
7
|
targetPath: string;
|
|
8
|
+
/** Target path for steering installation */
|
|
9
|
+
steeringPath: string;
|
|
8
10
|
/** Only list skills, don't install */
|
|
9
11
|
listOnly: boolean;
|
|
10
12
|
/** Show help message */
|
|
11
13
|
showHelp: boolean;
|
|
14
|
+
/** Install skills only (for unified install) */
|
|
15
|
+
skillsOnly: boolean;
|
|
16
|
+
/** Install steering only (for unified install) */
|
|
17
|
+
steeringOnly: boolean;
|
|
12
18
|
}
|
|
13
19
|
/**
|
|
14
20
|
* CLI for installing SDD skills to a project
|
|
15
21
|
*/
|
|
16
22
|
export declare class InstallSkillsCLI {
|
|
17
23
|
private skillManager;
|
|
24
|
+
private steeringPath;
|
|
18
25
|
/**
|
|
19
26
|
* Create CLI instance
|
|
20
27
|
* @param skillsPath - Optional path to skills directory (for testing)
|
|
28
|
+
* @param steeringPath - Optional path to steering directory (for testing)
|
|
21
29
|
*/
|
|
22
|
-
constructor(skillsPath?: string);
|
|
30
|
+
constructor(skillsPath?: string, steeringPath?: string);
|
|
23
31
|
/**
|
|
24
32
|
* Get the default skills path based on package location
|
|
25
33
|
*/
|
|
26
34
|
private getDefaultSkillsPath;
|
|
35
|
+
/**
|
|
36
|
+
* Get the default steering path based on package location
|
|
37
|
+
*/
|
|
38
|
+
private getDefaultSteeringPath;
|
|
27
39
|
/**
|
|
28
40
|
* Parse command line arguments
|
|
29
41
|
* @param args - Command line arguments (process.argv.slice(2))
|
|
@@ -31,23 +43,47 @@ export declare class InstallSkillsCLI {
|
|
|
31
43
|
*/
|
|
32
44
|
parseArgs(args: string[]): CLIOptions;
|
|
33
45
|
/**
|
|
34
|
-
* Run the CLI with given options
|
|
46
|
+
* Run the CLI with given options (legacy skills-only mode)
|
|
35
47
|
* @param options - CLI options
|
|
36
48
|
*/
|
|
37
49
|
run(options: CLIOptions): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Run unified install (skills + steering)
|
|
52
|
+
* @param options - CLI options
|
|
53
|
+
*/
|
|
54
|
+
runUnified(options: CLIOptions): Promise<void>;
|
|
38
55
|
/**
|
|
39
56
|
* List available skills
|
|
40
57
|
*/
|
|
41
58
|
private listSkills;
|
|
59
|
+
/**
|
|
60
|
+
* List available steering documents
|
|
61
|
+
*/
|
|
62
|
+
private listSteering;
|
|
63
|
+
/**
|
|
64
|
+
* List all available skills and steering documents
|
|
65
|
+
*/
|
|
66
|
+
private listAll;
|
|
42
67
|
/**
|
|
43
68
|
* Install skills to target directory
|
|
44
69
|
* @param targetPath - Target directory
|
|
45
70
|
*/
|
|
46
71
|
private installSkills;
|
|
72
|
+
/**
|
|
73
|
+
* Install steering documents to target directory
|
|
74
|
+
* @param targetPath - Target directory (e.g., .spec/steering)
|
|
75
|
+
*/
|
|
76
|
+
private installSteering;
|
|
47
77
|
/**
|
|
48
78
|
* Get help text
|
|
49
79
|
* @returns Help message
|
|
50
80
|
*/
|
|
51
81
|
getHelp(): string;
|
|
82
|
+
/**
|
|
83
|
+
* Get unified install help text
|
|
84
|
+
* @returns Help message for unified install
|
|
85
|
+
*/
|
|
86
|
+
getUnifiedHelp(): string;
|
|
52
87
|
}
|
|
53
88
|
export declare function main(): Promise<void>;
|
|
89
|
+
export declare function mainInstall(): Promise<void>;
|
|
@@ -11,14 +11,18 @@ const __dirname = path.dirname(__filename);
|
|
|
11
11
|
*/
|
|
12
12
|
export class InstallSkillsCLI {
|
|
13
13
|
skillManager;
|
|
14
|
+
steeringPath;
|
|
14
15
|
/**
|
|
15
16
|
* Create CLI instance
|
|
16
17
|
* @param skillsPath - Optional path to skills directory (for testing)
|
|
18
|
+
* @param steeringPath - Optional path to steering directory (for testing)
|
|
17
19
|
*/
|
|
18
|
-
constructor(skillsPath) {
|
|
20
|
+
constructor(skillsPath, steeringPath) {
|
|
19
21
|
// If no path provided, determine from package location
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
+
const resolvedSkillsPath = skillsPath || this.getDefaultSkillsPath();
|
|
23
|
+
const resolvedSteeringPath = steeringPath || this.getDefaultSteeringPath();
|
|
24
|
+
this.skillManager = new SkillManager(resolvedSkillsPath);
|
|
25
|
+
this.steeringPath = resolvedSteeringPath;
|
|
22
26
|
}
|
|
23
27
|
/**
|
|
24
28
|
* Get the default skills path based on package location
|
|
@@ -45,6 +49,31 @@ export class InstallSkillsCLI {
|
|
|
45
49
|
// Fallback to first path (will error in SkillManager if not found)
|
|
46
50
|
return possiblePaths[0];
|
|
47
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the default steering path based on package location
|
|
54
|
+
*/
|
|
55
|
+
getDefaultSteeringPath() {
|
|
56
|
+
// Try multiple paths and return the first one that exists
|
|
57
|
+
const possiblePaths = [
|
|
58
|
+
// Relative to this file (dist/cli/install-skills.js -> steering/)
|
|
59
|
+
path.resolve(__dirname, '../../steering'),
|
|
60
|
+
// Alternative: one level up
|
|
61
|
+
path.resolve(__dirname, '../steering'),
|
|
62
|
+
// From package root when installed globally or via npx
|
|
63
|
+
path.resolve(__dirname, '../../../steering'),
|
|
64
|
+
// From current working directory
|
|
65
|
+
path.resolve(process.cwd(), 'node_modules/sdd-mcp-server/steering'),
|
|
66
|
+
path.resolve(process.cwd(), 'steering'),
|
|
67
|
+
];
|
|
68
|
+
// Return the first path that exists
|
|
69
|
+
for (const p of possiblePaths) {
|
|
70
|
+
if (fs.existsSync(p)) {
|
|
71
|
+
return p;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Fallback to first path
|
|
75
|
+
return possiblePaths[0];
|
|
76
|
+
}
|
|
48
77
|
/**
|
|
49
78
|
* Parse command line arguments
|
|
50
79
|
* @param args - Command line arguments (process.argv.slice(2))
|
|
@@ -53,8 +82,11 @@ export class InstallSkillsCLI {
|
|
|
53
82
|
parseArgs(args) {
|
|
54
83
|
const options = {
|
|
55
84
|
targetPath: '.claude/skills',
|
|
85
|
+
steeringPath: '.spec/steering',
|
|
56
86
|
listOnly: false,
|
|
57
87
|
showHelp: false,
|
|
88
|
+
skillsOnly: false,
|
|
89
|
+
steeringOnly: false,
|
|
58
90
|
};
|
|
59
91
|
for (let i = 0; i < args.length; i++) {
|
|
60
92
|
const arg = args[i];
|
|
@@ -64,6 +96,11 @@ export class InstallSkillsCLI {
|
|
|
64
96
|
options.targetPath = args[++i];
|
|
65
97
|
}
|
|
66
98
|
break;
|
|
99
|
+
case '--steering-path':
|
|
100
|
+
if (i + 1 < args.length) {
|
|
101
|
+
options.steeringPath = args[++i];
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
67
104
|
case '--list':
|
|
68
105
|
case '-l':
|
|
69
106
|
options.listOnly = true;
|
|
@@ -72,12 +109,18 @@ export class InstallSkillsCLI {
|
|
|
72
109
|
case '-h':
|
|
73
110
|
options.showHelp = true;
|
|
74
111
|
break;
|
|
112
|
+
case '--skills':
|
|
113
|
+
options.skillsOnly = true;
|
|
114
|
+
break;
|
|
115
|
+
case '--steering':
|
|
116
|
+
options.steeringOnly = true;
|
|
117
|
+
break;
|
|
75
118
|
}
|
|
76
119
|
}
|
|
77
120
|
return options;
|
|
78
121
|
}
|
|
79
122
|
/**
|
|
80
|
-
* Run the CLI with given options
|
|
123
|
+
* Run the CLI with given options (legacy skills-only mode)
|
|
81
124
|
* @param options - CLI options
|
|
82
125
|
*/
|
|
83
126
|
async run(options) {
|
|
@@ -91,6 +134,29 @@ export class InstallSkillsCLI {
|
|
|
91
134
|
}
|
|
92
135
|
await this.installSkills(options.targetPath);
|
|
93
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Run unified install (skills + steering)
|
|
139
|
+
* @param options - CLI options
|
|
140
|
+
*/
|
|
141
|
+
async runUnified(options) {
|
|
142
|
+
if (options.showHelp) {
|
|
143
|
+
console.log(this.getUnifiedHelp());
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (options.listOnly) {
|
|
147
|
+
await this.listAll();
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// Determine what to install
|
|
151
|
+
const installSkills = !options.steeringOnly;
|
|
152
|
+
const installSteering = !options.skillsOnly;
|
|
153
|
+
if (installSkills) {
|
|
154
|
+
await this.installSkills(options.targetPath);
|
|
155
|
+
}
|
|
156
|
+
if (installSteering) {
|
|
157
|
+
await this.installSteering(options.steeringPath);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
94
160
|
/**
|
|
95
161
|
* List available skills
|
|
96
162
|
*/
|
|
@@ -111,6 +177,56 @@ export class InstallSkillsCLI {
|
|
|
111
177
|
console.log(`Total: ${skills.length} skills\n`);
|
|
112
178
|
console.log('Run "npx sdd-mcp install-skills" to install all skills.\n');
|
|
113
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* List available steering documents
|
|
182
|
+
*/
|
|
183
|
+
async listSteering() {
|
|
184
|
+
const steeringDocs = [];
|
|
185
|
+
try {
|
|
186
|
+
const entries = await fs.promises.readdir(this.steeringPath);
|
|
187
|
+
for (const entry of entries) {
|
|
188
|
+
if (entry.endsWith('.md')) {
|
|
189
|
+
steeringDocs.push(entry);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Return empty array if steering directory doesn't exist
|
|
195
|
+
}
|
|
196
|
+
return steeringDocs;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* List all available skills and steering documents
|
|
200
|
+
*/
|
|
201
|
+
async listAll() {
|
|
202
|
+
const skills = await this.skillManager.listSkills();
|
|
203
|
+
const steeringDocs = await this.listSteering();
|
|
204
|
+
console.log('\nš Available Skills:\n');
|
|
205
|
+
if (skills.length === 0) {
|
|
206
|
+
console.log(' (none)\n');
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
for (const skill of skills) {
|
|
210
|
+
console.log(` ⢠${skill.name}`);
|
|
211
|
+
if (skill.description) {
|
|
212
|
+
console.log(` ${skill.description}`);
|
|
213
|
+
}
|
|
214
|
+
console.log('');
|
|
215
|
+
}
|
|
216
|
+
console.log(` Total: ${skills.length} skills\n`);
|
|
217
|
+
}
|
|
218
|
+
console.log('š Available Steering Documents:\n');
|
|
219
|
+
if (steeringDocs.length === 0) {
|
|
220
|
+
console.log(' (none)\n');
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
for (const doc of steeringDocs) {
|
|
224
|
+
console.log(` ⢠${doc}`);
|
|
225
|
+
}
|
|
226
|
+
console.log(`\n Total: ${steeringDocs.length} steering documents\n`);
|
|
227
|
+
}
|
|
228
|
+
console.log('Run "npx sdd-mcp install" to install all skills and steering documents.\n');
|
|
229
|
+
}
|
|
114
230
|
/**
|
|
115
231
|
* Install skills to target directory
|
|
116
232
|
* @param targetPath - Target directory
|
|
@@ -138,6 +254,60 @@ export class InstallSkillsCLI {
|
|
|
138
254
|
console.log(' Use /sdd-requirements, /sdd-design, etc. in Claude Code.\n');
|
|
139
255
|
}
|
|
140
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* Install steering documents to target directory
|
|
259
|
+
* @param targetPath - Target directory (e.g., .spec/steering)
|
|
260
|
+
*/
|
|
261
|
+
async installSteering(targetPath) {
|
|
262
|
+
console.log(`\nš Installing steering documents to: ${targetPath}\n`);
|
|
263
|
+
const installed = [];
|
|
264
|
+
const failed = [];
|
|
265
|
+
try {
|
|
266
|
+
// Create target directory
|
|
267
|
+
await fs.promises.mkdir(targetPath, { recursive: true });
|
|
268
|
+
// Read source steering directory
|
|
269
|
+
const entries = await fs.promises.readdir(this.steeringPath);
|
|
270
|
+
for (const entry of entries) {
|
|
271
|
+
if (entry.endsWith('.md')) {
|
|
272
|
+
try {
|
|
273
|
+
const sourceFile = path.join(this.steeringPath, entry);
|
|
274
|
+
const destFile = path.join(targetPath, entry);
|
|
275
|
+
await fs.promises.copyFile(sourceFile, destFile);
|
|
276
|
+
installed.push(entry);
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
failed.push({
|
|
280
|
+
name: entry,
|
|
281
|
+
error: error instanceof Error ? error.message : String(error),
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
console.error(`ā Failed to read steering directory: ${error instanceof Error ? error.message : String(error)}`);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (installed.length > 0) {
|
|
292
|
+
const plural = installed.length === 1 ? 'document' : 'documents';
|
|
293
|
+
console.log(`ā
Installed ${installed.length} steering ${plural}:`);
|
|
294
|
+
for (const name of installed) {
|
|
295
|
+
console.log(` ⢠${name}`);
|
|
296
|
+
}
|
|
297
|
+
console.log('');
|
|
298
|
+
}
|
|
299
|
+
if (failed.length > 0) {
|
|
300
|
+
console.error(`ā Failed to install ${failed.length} document(s):`);
|
|
301
|
+
for (const failure of failed) {
|
|
302
|
+
console.error(` ⢠${failure.name}: ${failure.error}`);
|
|
303
|
+
}
|
|
304
|
+
console.log('');
|
|
305
|
+
}
|
|
306
|
+
if (installed.length > 0) {
|
|
307
|
+
console.log('š Steering documents installed successfully!');
|
|
308
|
+
console.log(' These provide project-wide guidance for AI interactions.\n');
|
|
309
|
+
}
|
|
310
|
+
}
|
|
141
311
|
/**
|
|
142
312
|
* Get help text
|
|
143
313
|
* @returns Help message
|
|
@@ -166,15 +336,61 @@ After installation, you can use them in Claude Code with:
|
|
|
166
336
|
/sdd-implement <feature-name>
|
|
167
337
|
/sdd-steering
|
|
168
338
|
/sdd-commit
|
|
339
|
+
`;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Get unified install help text
|
|
343
|
+
* @returns Help message for unified install
|
|
344
|
+
*/
|
|
345
|
+
getUnifiedHelp() {
|
|
346
|
+
return `
|
|
347
|
+
SDD Unified Installer
|
|
348
|
+
|
|
349
|
+
Usage: npx sdd-mcp install [options]
|
|
350
|
+
|
|
351
|
+
Installs both SDD skills and steering documents to your project.
|
|
352
|
+
|
|
353
|
+
Options:
|
|
354
|
+
--skills Install skills only (to .claude/skills)
|
|
355
|
+
--steering Install steering documents only (to .spec/steering)
|
|
356
|
+
--path <dir> Target directory for skills (default: .claude/skills)
|
|
357
|
+
--steering-path <dir> Target directory for steering (default: .spec/steering)
|
|
358
|
+
--list, -l List available skills and steering documents
|
|
359
|
+
--help, -h Show this help message
|
|
360
|
+
|
|
361
|
+
Examples:
|
|
362
|
+
npx sdd-mcp install # Install both skills and steering
|
|
363
|
+
npx sdd-mcp install --skills # Install skills only
|
|
364
|
+
npx sdd-mcp install --steering # Install steering only
|
|
365
|
+
npx sdd-mcp install --list # List available content
|
|
366
|
+
|
|
367
|
+
Skills are installed to .claude/skills/ and provide workflow guidance.
|
|
368
|
+
Steering documents are installed to .spec/steering/ and provide project-wide rules.
|
|
369
|
+
|
|
370
|
+
After installation, use skills in Claude Code:
|
|
371
|
+
/sdd-requirements <feature-name>
|
|
372
|
+
/sdd-design <feature-name>
|
|
373
|
+
/sdd-tasks <feature-name>
|
|
374
|
+
/sdd-implement <feature-name>
|
|
375
|
+
/sdd-steering
|
|
376
|
+
/sdd-commit
|
|
377
|
+
|
|
378
|
+
Steering documents are automatically loaded by the SDD MCP server.
|
|
169
379
|
`;
|
|
170
380
|
}
|
|
171
381
|
}
|
|
172
|
-
// Main entry point when run directly
|
|
382
|
+
// Main entry point when run directly (legacy install-skills)
|
|
173
383
|
export async function main() {
|
|
174
384
|
const cli = new InstallSkillsCLI();
|
|
175
385
|
const options = cli.parseArgs(process.argv.slice(2));
|
|
176
386
|
await cli.run(options);
|
|
177
387
|
}
|
|
388
|
+
// Main entry point for unified install command
|
|
389
|
+
export async function mainInstall() {
|
|
390
|
+
const cli = new InstallSkillsCLI();
|
|
391
|
+
const options = cli.parseArgs(process.argv.slice(2));
|
|
392
|
+
await cli.runUnified(options);
|
|
393
|
+
}
|
|
178
394
|
// ESM main module detection: check if this file is the entry point
|
|
179
395
|
const isMainModule = process.argv[1] && (process.argv[1] === __filename ||
|
|
180
396
|
process.argv[1].endsWith('/install-skills.js') ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../../src/cli/install-skills.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,8BAA8B;AAC9B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../../src/cli/install-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
const HELP = `
|
|
5
|
+
SDD Directory Migration Tool
|
|
6
|
+
|
|
7
|
+
Migrates .kiro directory to .spec for updated SDD workflow.
|
|
8
|
+
|
|
9
|
+
Usage: npx sdd-mcp migrate-kiro [options]
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
--path <dir> Project directory (default: current directory)
|
|
13
|
+
--dry-run, -n Preview without making changes
|
|
14
|
+
--force, -f Overwrite existing .spec directory
|
|
15
|
+
--help, -h Show this help
|
|
16
|
+
|
|
17
|
+
Examples:
|
|
18
|
+
npx sdd-mcp migrate-kiro
|
|
19
|
+
npx sdd-mcp migrate-kiro --dry-run
|
|
20
|
+
npx sdd-mcp migrate-kiro --path ./my-project
|
|
21
|
+
`;
|
|
22
|
+
function getAllFiles(dir) {
|
|
23
|
+
const files = [];
|
|
24
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
25
|
+
const fullPath = path.join(dir, entry.name);
|
|
26
|
+
if (entry.isDirectory()) {
|
|
27
|
+
files.push(...getAllFiles(fullPath));
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
files.push(fullPath);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return files;
|
|
34
|
+
}
|
|
35
|
+
export async function main() {
|
|
36
|
+
const args = process.argv.slice(2);
|
|
37
|
+
// Parse args
|
|
38
|
+
let projectPath = process.cwd();
|
|
39
|
+
let dryRun = false;
|
|
40
|
+
let force = false;
|
|
41
|
+
for (let i = 0; i < args.length; i++) {
|
|
42
|
+
switch (args[i]) {
|
|
43
|
+
case '--path':
|
|
44
|
+
projectPath = path.resolve(args[++i] || '.');
|
|
45
|
+
break;
|
|
46
|
+
case '--dry-run':
|
|
47
|
+
case '-n':
|
|
48
|
+
dryRun = true;
|
|
49
|
+
break;
|
|
50
|
+
case '--force':
|
|
51
|
+
case '-f':
|
|
52
|
+
force = true;
|
|
53
|
+
break;
|
|
54
|
+
case '--help':
|
|
55
|
+
case '-h':
|
|
56
|
+
console.log(HELP);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const kiroPath = path.join(projectPath, '.kiro');
|
|
61
|
+
const specPath = path.join(projectPath, '.spec');
|
|
62
|
+
console.log('\nš SDD Directory Migration: .kiro ā .spec\n');
|
|
63
|
+
if (!fs.existsSync(kiroPath)) {
|
|
64
|
+
console.log('ā
No .kiro directory found. Nothing to migrate.\n');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (fs.existsSync(specPath) && !force) {
|
|
68
|
+
console.log('ā ļø .spec already exists. Use --force to overwrite.\n');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const files = getAllFiles(kiroPath);
|
|
72
|
+
console.log(dryRun ? 'š Would migrate:\n' : 'š¦ Migrating:\n');
|
|
73
|
+
for (const file of files) {
|
|
74
|
+
const rel = path.relative(kiroPath, file);
|
|
75
|
+
const newPath = path.join(specPath, rel);
|
|
76
|
+
if (dryRun) {
|
|
77
|
+
console.log(` .kiro/${rel} ā .spec/${rel}`);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
fs.mkdirSync(path.dirname(newPath), { recursive: true });
|
|
81
|
+
fs.copyFileSync(file, newPath);
|
|
82
|
+
console.log(` ā .kiro/${rel} ā .spec/${rel}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (!dryRun && files.length > 0) {
|
|
86
|
+
fs.rmSync(kiroPath, { recursive: true });
|
|
87
|
+
console.log('\n ā Removed .kiro directory');
|
|
88
|
+
}
|
|
89
|
+
console.log(`\nā
${dryRun ? 'Preview' : 'Migration'} complete! (${files.length} files)\n`);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=migrate-kiro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-kiro.js","sourceRoot":"","sources":["../../src/cli/migrate-kiro.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* Main CLI entry point for sdd-mcp commands
|
|
4
4
|
*
|
|
5
5
|
* Usage:
|
|
6
|
-
* npx sdd-mcp install
|
|
6
|
+
* npx sdd-mcp install [options] # Install skills AND steering (unified)
|
|
7
|
+
* npx sdd-mcp install-skills [options] # Install skills only (legacy)
|
|
8
|
+
* npx sdd-mcp migrate-kiro [options]
|
|
7
9
|
* npx sdd-mcp --help
|
|
8
10
|
*/
|
|
9
11
|
export {};
|