sdd-mcp-server 1.8.1 → 2.0.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 CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  A Model Context Protocol (MCP) server implementing Spec-Driven Development (SDD) workflows for AI-agent CLIs and IDEs like Claude Code, Cursor, and others.
8
8
 
9
+ > šŸŽÆ **v1.9.0 - Hybrid MCP + Agent Skills Architecture**: Restructured for token efficiency! Template/guidance tools (requirements, design, tasks, steering, implement) are now **Claude Code Agent Skills** loaded on-demand. Action-oriented tools remain as MCP tools. ~55% token savings in typical operations. Install skills with `npx sdd-mcp install-skills`.
10
+
9
11
  > šŸ¤– **v1.8.0 - MCP Tool Standardization**: Updated `AGENTS.md` generation to use standard MCP tool calls (e.g., `sdd-init`) instead of legacy slash commands. Fixed `sdd-steering` to correctly generate `AGENTS.md` with the new format. Ensures consistent tool usage across all AI agents.
10
12
 
11
13
  > šŸ”§ **v1.6.2 - Module Loading Fix**: Fixed critical bug where `sdd-steering` generated generic templates instead of analyzing actual codebases when run via `npx`. Root cause: hardcoded import paths didn't account for different execution contexts. Solution: Unified module loading system with **4-path fallback resolution** handling npm start, npm dev, node dist/index.js, and npx contexts. Comprehensive error handling with all attempted paths in error messages. Debug logging for troubleshooting. **100% test coverage** (71 tests passing, 6 new moduleLoader tests). Code review score: **9/10 (Excellent)** āœ…. Production-ready with zero security issues!
@@ -148,83 +150,130 @@ npm install -g sdd-mcp-server@latest
148
150
  sdd-mcp-server
149
151
  ```
150
152
 
151
- ## šŸ“‹ Available SDD Commands
153
+ ## šŸŽÆ Agent Skills (NEW in v1.9.0)
154
+
155
+ SDD now uses a **hybrid architecture** for better token efficiency:
156
+
157
+ - **MCP Tools**: Action-oriented operations (init, status, approve, quality-check, validate, spec-impl)
158
+ - **Agent Skills**: Template/guidance-heavy operations (requirements, design, tasks, steering, implement, commit)
159
+
160
+ ### Installing Agent Skills
161
+
162
+ ```bash
163
+ # Install skills to your project's .claude/skills/ directory
164
+ npx sdd-mcp install-skills
165
+
166
+ # Or specify a custom path
167
+ npx sdd-mcp install-skills --path ./my-skills
168
+
169
+ # List available skills
170
+ npx sdd-mcp install-skills --list
171
+ ```
172
+
173
+ ### Available Skills
174
+
175
+ After installation, use these skills in Claude Code:
176
+
177
+ | Skill | Description |
178
+ |-------|-------------|
179
+ | `/sdd-requirements <feature>` | Generate EARS-formatted requirements with embedded quality checklist |
180
+ | `/sdd-design <feature>` | Create architecture design with Linus-style principles |
181
+ | `/sdd-tasks <feature>` | Generate TDD task breakdown with test pyramid guidance |
182
+ | `/sdd-implement <feature>` | Implementation guidelines with SOLID, security, TDD |
183
+ | `/sdd-steering` | Create/update project-specific steering documents |
184
+ | `/sdd-steering-custom` | Create custom steering with inclusion modes |
185
+ | `/sdd-commit` | Commit/PR guidelines with conventional commits |
186
+
187
+ ### Token Efficiency
188
+
189
+ **Old Design** (static steering): ~3,800 tokens loaded for every operation
190
+ **New Design** (skills): ~1,700 tokens loaded only when skill invoked
191
+
192
+ **Savings**: ~55% fewer tokens in typical operations!
193
+
194
+ ## šŸ“‹ Available MCP Tools
152
195
 
153
196
  Once connected to your AI client, you can use these MCP tools:
154
197
 
155
198
  | Tool | Description | Usage |
156
199
  |------|-------------|--------|
157
- | `sdd-init` | Initialize new SDD project with interactive clarification | **šŸŽÆ NEW v1.5.0**: Analyzes description quality (0-100 score), blocks if < 70%, asks targeted WHY/WHO/WHAT questions, synthesizes enriched 5W1H descriptions |
158
- | `sdd-requirements` | Generate context-aware requirements | Analyzes package.json and structure to create EARS-formatted requirements with comprehensive multi-language analysis |
159
- | `sdd-design` | Create project-specific design | Generates architecture docs based on actual tech stack, dependencies, and framework detection |
160
- | `sdd-tasks` | Generate TDD-focused task breakdown | Creates test-first implementation tasks following RED-GREEN-REFACTOR workflow |
161
- | `sdd-implement` | Implementation guidelines | Provides implementation steering |
162
- | `sdd-status` | Check workflow progress | Shows current phase and approvals |
163
- | `sdd-approve` | Approve workflow phases | Mark phases as approved for progression |
200
+ | `sdd-init` | Initialize new SDD project with interactive clarification | Analyzes description quality (0-100 score), blocks if < 70%, asks targeted WHY/WHO/WHAT questions |
201
+ | `sdd-status` | Check workflow progress | Shows current phase and approvals for features |
202
+ | `sdd-approve` | Approve workflow phases | Mark phases (requirements, design, tasks) as approved |
164
203
  | `sdd-quality-check` | Code quality analysis | Linus-style 5-layer code review |
165
204
  | `sdd-context-load` | Load project context | Restore project memory and state |
166
- | `sdd-template-render` | Render templates | Generate files from templates |
167
- | `sdd-steering` | Create/update steering docs | Analyzes project to generate product.md, tech.md, structure.md + static docs: linus-review.md, commit.md, security-check.md, tdd-guideline.md, principles.md (SOLID/DRY/KISS/YAGNI/SoC/Modularity) |
168
- | `sdd-steering-custom` | Create custom steering docs | Add specialized guidance documents |
169
205
  | `sdd-validate-design` | Design quality validation | Interactive GO/NO-GO design review |
170
206
  | `sdd-validate-gap` | Implementation gap analysis | Analyze requirements vs codebase |
171
207
  | `sdd-spec-impl` | Execute tasks with TDD | Kent Beck's Red-Green-Refactor methodology |
208
+ | `sdd-list-skills` | List available Agent Skills | Shows skills that can be installed for Claude Code |
209
+
210
+ > **Note**: Template/guidance tools (`sdd-requirements`, `sdd-design`, `sdd-tasks`, `sdd-steering`, `sdd-implement`) are now **Agent Skills**. Install them with `npx sdd-mcp install-skills` and use as `/sdd-requirements`, `/sdd-design`, etc.
172
211
 
173
212
  ## šŸ’” Basic Workflow
174
213
 
175
- 1. **Initialize Project & Steering**
176
- ```
214
+ 1. **Setup: Install Skills & Initialize Project**
215
+ ```bash
216
+ # Install SDD Agent Skills to your project
217
+ npx sdd-mcp install-skills
218
+
219
+ # Initialize project with MCP tool
177
220
  Use sdd-init to create a new SDD project
178
- Use sdd-steering to generate 8 steering documents:
179
- - product.md, tech.md, structure.md (dynamic, analyzed from codebase)
180
- - linus-review.md, commit.md, security-check.md (static quality standards)
181
- - tdd-guideline.md (Test-Driven Development workflow)
182
- - principles.md (SOLID, DRY, KISS, YAGNI, SoC, Modularity)
221
+
222
+ # Generate steering documents with Agent Skill
223
+ Use /sdd-steering to generate product.md, tech.md, structure.md
183
224
  ```
184
225
 
185
- 2. **Generate Requirements**
226
+ 2. **Generate Requirements (Agent Skill)**
186
227
  ```
187
- Use sdd-requirements to analyze your project with comprehensive multi-language detection
188
- Automatically detects: language, framework, build tools, test frameworks, architecture patterns
189
- Creates EARS-formatted requirements based on actual project context
190
- Use sdd-validate-gap to analyze implementation feasibility
228
+ Use /sdd-requirements <feature-name> to analyze your project
229
+ Automatically detects: language, framework, build tools, test frameworks
230
+ Creates EARS-formatted requirements with embedded quality checklist
231
+ Use sdd-validate-gap (MCP tool) to analyze implementation feasibility
191
232
  ```
192
233
 
193
- 3. **Create Design**
234
+ 3. **Create Design (Agent Skill)**
194
235
  ```
195
- Use sdd-design to generate architecture based on detected tech stack
196
- Includes: component structure, data models, API design, tech stack details
197
- Use sdd-validate-design for GO/NO-GO design review
236
+ Use /sdd-design <feature-name> to generate architecture
237
+ Includes: component structure, data models, API design, Linus principles
238
+ Use sdd-validate-design (MCP tool) for GO/NO-GO design review
239
+ Use sdd-approve (MCP tool) to approve the design phase
198
240
  ```
199
241
 
200
- 4. **Plan Tasks with TDD**
242
+ 4. **Plan Tasks with TDD (Agent Skill)**
201
243
  ```
202
- Use sdd-tasks to create TDD-focused implementation breakdown
244
+ Use /sdd-tasks <feature-name> to create TDD-focused task breakdown
245
+ Includes test pyramid guidance (70/20/10 ratio)
203
246
  Tasks follow RED-GREEN-REFACTOR workflow automatically
204
- Phases: Test Setup → Implementation → Refactoring → Integration
247
+ Use sdd-approve (MCP tool) to approve the tasks phase
248
+ ```
249
+
250
+ 5. **Implement with TDD (Agent Skill + MCP Tool)**
251
+ ```
252
+ Use /sdd-implement <feature-name> for implementation guidelines
253
+ Use sdd-spec-impl (MCP tool) to execute tasks with TDD methodology
254
+ Use sdd-quality-check (MCP tool) for Linus-style code review
205
255
  ```
206
256
 
207
- 5. **Implement with TDD**
257
+ 6. **Commit Changes (Agent Skill)**
208
258
  ```
209
- Use sdd-spec-impl to execute tasks with Test-Driven Development
210
- Follow the generated TDD workflow from tdd-guideline.md
211
- Use sdd-quality-check for Linus-style code review and SOLID principles validation
259
+ Use /sdd-commit for commit message and PR guidelines
260
+ Follow conventional commits format
212
261
  ```
213
262
 
214
- 6. **Monitor & Manage**
263
+ 7. **Monitor & Manage (MCP Tools)**
215
264
  ```
216
265
  Use sdd-status to check workflow progress and phase approvals
217
- Use sdd-approve to mark phases as approved
218
266
  Use sdd-context-load to restore project memory
219
267
  ```
220
268
 
221
- ## Latest Updates (v1.8.0)
269
+ ## Latest Updates (v1.9.0)
222
270
 
223
271
  **What's New**:
224
- - āœ… **MCP Tool Standardization**: All documentation and generated files now use standard MCP tool calls (e.g., `sdd-init`) instead of legacy slash commands.
225
- - āœ… **Updated AGENTS.md**: The `AGENTS.md` file is now automatically generated with the correct tool usage instructions.
226
- - āœ… **Module Loading Fix (v1.6.2)**: Robust module loading for `sdd-steering` across all execution contexts (npx, npm start, etc.).
227
- - āœ… **Architecture Refactoring (v1.6.0)**: Improved internal architecture for better maintainability and testing.
272
+ - šŸŽÆ **Hybrid MCP + Agent Skills Architecture**: Template/guidance tools moved to Claude Code Agent Skills for ~55% token savings
273
+ - āœ… **7 Agent Skills**: sdd-requirements, sdd-design, sdd-tasks, sdd-implement, sdd-steering, sdd-steering-custom, sdd-commit
274
+ - āœ… **Skill Installation CLI**: `npx sdd-mcp install-skills` to install skills to `.claude/skills/`
275
+ - āœ… **New MCP Tool**: `sdd-list-skills` to list available skills
276
+ - āœ… **Token Efficiency**: Guidance loaded on-demand instead of always-on steering
228
277
 
229
278
  **Upgrade Commands**:
230
279
  ```bash
@@ -233,10 +282,17 @@ npx -y sdd-mcp-server@latest
233
282
 
234
283
  # Global installation
235
284
  npm install -g sdd-mcp-server@latest
285
+
286
+ # Install Agent Skills to your project
287
+ npx sdd-mcp install-skills
236
288
  ```
237
289
 
238
290
  ## Previous Versions
239
291
 
292
+ ### v1.8.x
293
+ - MCP tool standardization (standard tool calls vs slash commands)
294
+ - Updated AGENTS.md generation
295
+
240
296
  ### v1.6.x
241
297
  - Module loading fixes and architecture refactoring
242
298
  - Improved requirements clarification service
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI options for install-skills command
4
+ */
5
+ export interface CLIOptions {
6
+ /** Target path for skill installation */
7
+ targetPath: string;
8
+ /** Only list skills, don't install */
9
+ listOnly: boolean;
10
+ /** Show help message */
11
+ showHelp: boolean;
12
+ }
13
+ /**
14
+ * CLI for installing SDD skills to a project
15
+ */
16
+ export declare class InstallSkillsCLI {
17
+ private skillManager;
18
+ /**
19
+ * Create CLI instance
20
+ * @param skillsPath - Optional path to skills directory (for testing)
21
+ */
22
+ constructor(skillsPath?: string);
23
+ /**
24
+ * Get the default skills path based on package location
25
+ */
26
+ private getDefaultSkillsPath;
27
+ /**
28
+ * Parse command line arguments
29
+ * @param args - Command line arguments (process.argv.slice(2))
30
+ * @returns Parsed options
31
+ */
32
+ parseArgs(args: string[]): CLIOptions;
33
+ /**
34
+ * Run the CLI with given options
35
+ * @param options - CLI options
36
+ */
37
+ run(options: CLIOptions): Promise<void>;
38
+ /**
39
+ * List available skills
40
+ */
41
+ private listSkills;
42
+ /**
43
+ * Install skills to target directory
44
+ * @param targetPath - Target directory
45
+ */
46
+ private installSkills;
47
+ /**
48
+ * Get help text
49
+ * @returns Help message
50
+ */
51
+ getHelp(): string;
52
+ }
53
+ export declare function main(): Promise<void>;
@@ -0,0 +1,171 @@
1
+ #!/usr/bin/env node
2
+ import * as path from 'path';
3
+ import { SkillManager } from '../skills/SkillManager.js';
4
+ /**
5
+ * CLI for installing SDD skills to a project
6
+ */
7
+ export class InstallSkillsCLI {
8
+ skillManager;
9
+ /**
10
+ * Create CLI instance
11
+ * @param skillsPath - Optional path to skills directory (for testing)
12
+ */
13
+ constructor(skillsPath) {
14
+ // If no path provided, determine from package location
15
+ const resolvedPath = skillsPath || this.getDefaultSkillsPath();
16
+ this.skillManager = new SkillManager(resolvedPath);
17
+ }
18
+ /**
19
+ * Get the default skills path based on package location
20
+ */
21
+ getDefaultSkillsPath() {
22
+ // In production, skills are at package root
23
+ // Try to find skills directory relative to common locations
24
+ const possiblePaths = [
25
+ path.resolve(process.cwd(), 'node_modules/sdd-mcp-server/skills'),
26
+ path.resolve(process.cwd(), 'skills'),
27
+ path.resolve(__dirname, '../../skills'),
28
+ path.resolve(__dirname, '../../../skills'),
29
+ ];
30
+ // Return first path (we'll validate in SkillManager)
31
+ return possiblePaths[0];
32
+ }
33
+ /**
34
+ * Parse command line arguments
35
+ * @param args - Command line arguments (process.argv.slice(2))
36
+ * @returns Parsed options
37
+ */
38
+ parseArgs(args) {
39
+ const options = {
40
+ targetPath: '.claude/skills',
41
+ listOnly: false,
42
+ showHelp: false,
43
+ };
44
+ for (let i = 0; i < args.length; i++) {
45
+ const arg = args[i];
46
+ switch (arg) {
47
+ case '--path':
48
+ if (i + 1 < args.length) {
49
+ options.targetPath = args[++i];
50
+ }
51
+ break;
52
+ case '--list':
53
+ case '-l':
54
+ options.listOnly = true;
55
+ break;
56
+ case '--help':
57
+ case '-h':
58
+ options.showHelp = true;
59
+ break;
60
+ }
61
+ }
62
+ return options;
63
+ }
64
+ /**
65
+ * Run the CLI with given options
66
+ * @param options - CLI options
67
+ */
68
+ async run(options) {
69
+ if (options.showHelp) {
70
+ console.log(this.getHelp());
71
+ return;
72
+ }
73
+ if (options.listOnly) {
74
+ await this.listSkills();
75
+ return;
76
+ }
77
+ await this.installSkills(options.targetPath);
78
+ }
79
+ /**
80
+ * List available skills
81
+ */
82
+ async listSkills() {
83
+ const skills = await this.skillManager.listSkills();
84
+ if (skills.length === 0) {
85
+ console.log('No skills available');
86
+ return;
87
+ }
88
+ console.log('\nšŸ“š Available Skills:\n');
89
+ for (const skill of skills) {
90
+ console.log(` • ${skill.name}`);
91
+ if (skill.description) {
92
+ console.log(` ${skill.description}`);
93
+ }
94
+ console.log('');
95
+ }
96
+ console.log(`Total: ${skills.length} skills\n`);
97
+ console.log('Run "npx sdd-mcp install-skills" to install all skills.\n');
98
+ }
99
+ /**
100
+ * Install skills to target directory
101
+ * @param targetPath - Target directory
102
+ */
103
+ async installSkills(targetPath) {
104
+ console.log(`\nšŸ“¦ Installing SDD skills to: ${targetPath}\n`);
105
+ const result = await this.skillManager.installSkills(targetPath);
106
+ if (result.installed.length > 0) {
107
+ const plural = result.installed.length === 1 ? 'skill' : 'skills';
108
+ console.log(`āœ… Installed ${result.installed.length} ${plural}:`);
109
+ for (const name of result.installed) {
110
+ console.log(` • ${name}`);
111
+ }
112
+ console.log('');
113
+ }
114
+ if (result.failed.length > 0) {
115
+ console.error(`āŒ Failed to install ${result.failed.length} skill(s):`);
116
+ for (const failure of result.failed) {
117
+ console.error(` • ${failure.name}: ${failure.error}`);
118
+ }
119
+ console.log('');
120
+ }
121
+ if (result.installed.length > 0) {
122
+ console.log('šŸŽ‰ Skills installed successfully!');
123
+ console.log(' Use /sdd-requirements, /sdd-design, etc. in Claude Code.\n');
124
+ }
125
+ }
126
+ /**
127
+ * Get help text
128
+ * @returns Help message
129
+ */
130
+ getHelp() {
131
+ return `
132
+ SDD Skills Installer
133
+
134
+ Usage: npx sdd-mcp install-skills [options]
135
+
136
+ Options:
137
+ --path <dir> Target directory for skills (default: .claude/skills)
138
+ --list, -l List available skills without installing
139
+ --help, -h Show this help message
140
+
141
+ Examples:
142
+ npx sdd-mcp install-skills # Install to .claude/skills
143
+ npx sdd-mcp install-skills --path ./ # Install to current directory
144
+ npx sdd-mcp install-skills --list # List available skills
145
+
146
+ Skills will be installed to your project's .claude/skills directory.
147
+ After installation, you can use them in Claude Code with:
148
+ /sdd-requirements <feature-name>
149
+ /sdd-design <feature-name>
150
+ /sdd-tasks <feature-name>
151
+ /sdd-implement <feature-name>
152
+ /sdd-steering
153
+ /sdd-commit
154
+ `;
155
+ }
156
+ }
157
+ // Main entry point when run directly
158
+ export async function main() {
159
+ const cli = new InstallSkillsCLI();
160
+ const options = cli.parseArgs(process.argv.slice(2));
161
+ await cli.run(options);
162
+ }
163
+ // Only run main if this is the entry point (works in both ESM and CJS)
164
+ const isMainModule = typeof require !== 'undefined' && require.main === module;
165
+ if (isMainModule) {
166
+ main().catch((error) => {
167
+ console.error('Error:', error.message);
168
+ process.exit(1);
169
+ });
170
+ }
171
+ //# sourceMappingURL=install-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../../src/cli/install-skills.ts"],"names":[],"mappings":"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"}