spec-driven-steroids 0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Lindoélio Lázaro
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inject-validate.e2e.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-validate.e2e.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/inject-validate.e2e.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,165 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import inquirer from 'inquirer';
3
+ import fs from 'fs-extra';
4
+ import path from 'path';
5
+ import { mockFs } from '@spec-driven-steroids/test-utils';
6
+ describe('CLI E2E: inject command', () => {
7
+ let targetDir;
8
+ let originalCwd;
9
+ beforeEach(async () => {
10
+ originalCwd = process.cwd();
11
+ targetDir = await mockFs.createTempDir();
12
+ process.chdir(targetDir);
13
+ vi.clearAllMocks();
14
+ });
15
+ afterEach(async () => {
16
+ process.chdir(originalCwd);
17
+ await mockFs.cleanup();
18
+ });
19
+ it('inject command with GitHub platform creates .github directory structure', async () => {
20
+ vi.spyOn(inquirer, 'prompt').mockResolvedValueOnce({
21
+ platforms: ['github']
22
+ }).mockResolvedValueOnce({
23
+ mcpServers: []
24
+ });
25
+ const program = (await import('../index.js')).default;
26
+ program.parse(['node', 'index.js', 'inject'], { from: 'user' });
27
+ const githubDir = path.join(targetDir, '.github');
28
+ expect(await fs.pathExists(githubDir)).toBe(true);
29
+ expect(await fs.pathExists(path.join(githubDir, 'agents'))).toBe(true);
30
+ });
31
+ it('inject command with Antigravity platform creates .agent directory structure', async () => {
32
+ vi.spyOn(inquirer, 'prompt').mockResolvedValueOnce({
33
+ platforms: ['antigravity']
34
+ }).mockResolvedValueOnce({
35
+ mcpServers: []
36
+ });
37
+ const program = (await import('../index.js')).default;
38
+ program.parse(['node', 'index.js', 'inject'], { from: 'user' });
39
+ const agentDir = path.join(targetDir, '.agent');
40
+ expect(await fs.pathExists(agentDir)).toBe(true);
41
+ expect(await fs.pathExists(path.join(agentDir, 'workflows'))).toBe(true);
42
+ });
43
+ it('inject command with OpenCode platform creates .opencode directory structure', async () => {
44
+ vi.spyOn(inquirer, 'prompt').mockResolvedValueOnce({
45
+ platforms: ['opencode']
46
+ }).mockResolvedValueOnce({
47
+ mcpServers: []
48
+ });
49
+ const program = (await import('../index.js')).default;
50
+ program.parse(['node', 'index.js', 'inject'], { from: 'user' });
51
+ const opencodeDir = path.join(targetDir, '.opencode');
52
+ expect(await fs.pathExists(opencodeDir)).toBe(true);
53
+ expect(await fs.pathExists(path.join(opencodeDir, 'skills'))).toBe(true);
54
+ });
55
+ it('inject command updates opencode.json with injected skills', async () => {
56
+ const opencodeConfigPath = path.join(targetDir, 'opencode.json');
57
+ await fs.writeJson(opencodeConfigPath, {
58
+ name: 'test-project',
59
+ skills: [],
60
+ mcpServers: {}
61
+ });
62
+ vi.spyOn(inquirer, 'prompt').mockResolvedValueOnce({
63
+ platforms: ['opencode']
64
+ }).mockResolvedValueOnce({
65
+ mcpServers: []
66
+ });
67
+ const program = (await import('../index.js')).default;
68
+ program.parse(['node', 'index.js', 'inject'], { from: 'user' });
69
+ const config = await fs.readJson(opencodeConfigPath);
70
+ expect(config.skills.length).toBeGreaterThan(0);
71
+ expect(config.skills.some((skill) => skill.includes('spec-driven'))).toBe(true);
72
+ });
73
+ it('inject command with MCP servers adds them to config', async () => {
74
+ vi.spyOn(inquirer, 'prompt').mockResolvedValueOnce({
75
+ platforms: ['github']
76
+ }).mockResolvedValueOnce({
77
+ mcpServers: ['github', 'linear']
78
+ });
79
+ const program = (await import('../index.js')).default;
80
+ program.parse(['node', 'index.js', 'inject'], { from: 'user' });
81
+ const mcpConfigPath = path.join(targetDir, '.vscode', 'mcp.json');
82
+ const config = await fs.readJson(mcpConfigPath);
83
+ expect(config.mcpServers['spec-driven-steroids']).toBeDefined();
84
+ expect(config.mcpServers.github).toBeDefined();
85
+ expect(config.mcpServers.linear).toBeDefined();
86
+ });
87
+ it('inject command merges with existing MCP config', async () => {
88
+ const vscodeDir = path.join(targetDir, '.vscode');
89
+ await fs.ensureDir(vscodeDir);
90
+ const mcpConfigPath = path.join(vscodeDir, 'mcp.json');
91
+ await fs.writeJson(mcpConfigPath, {
92
+ mcpServers: {
93
+ 'existing-server': {
94
+ command: 'custom',
95
+ args: []
96
+ }
97
+ }
98
+ });
99
+ vi.spyOn(inquirer, 'prompt').mockResolvedValueOnce({
100
+ platforms: ['github']
101
+ }).mockResolvedValueOnce({
102
+ mcpServers: ['github']
103
+ });
104
+ const program = (await import('../index.js')).default;
105
+ program.parse(['node', 'index.js', 'inject'], { from: 'user' });
106
+ const config = await fs.readJson(mcpConfigPath);
107
+ expect(config.mcpServers['existing-server']).toBeDefined();
108
+ expect(config.mcpServers['spec-driven-steroids']).toBeDefined();
109
+ expect(config.mcpServers.github).toBeDefined();
110
+ });
111
+ });
112
+ describe('CLI E2E: validate command', () => {
113
+ let targetDir;
114
+ let originalCwd;
115
+ beforeEach(async () => {
116
+ originalCwd = process.cwd();
117
+ targetDir = await mockFs.createTempDir();
118
+ process.chdir(targetDir);
119
+ vi.clearAllMocks();
120
+ });
121
+ afterEach(async () => {
122
+ process.chdir(originalCwd);
123
+ await mockFs.cleanup();
124
+ });
125
+ it('validate command detects existing GitHub config', async () => {
126
+ const githubDir = path.join(targetDir, '.github');
127
+ await fs.ensureDir(path.join(githubDir, 'agents'));
128
+ const program = (await import('../index.js')).default;
129
+ program.parse(['node', 'index.js', 'validate'], { from: 'user' });
130
+ const githubDirExists = await fs.pathExists(githubDir);
131
+ expect(githubDirExists).toBe(true);
132
+ });
133
+ it('validate command detects existing Antigravity config', async () => {
134
+ const agentDir = path.join(targetDir, '.agent');
135
+ await fs.ensureDir(path.join(agentDir, 'workflows'));
136
+ const program = (await import('../index.js')).default;
137
+ program.parse(['node', 'index.js', 'validate'], { from: 'user' });
138
+ const agentDirExists = await fs.pathExists(agentDir);
139
+ expect(agentDirExists).toBe(true);
140
+ });
141
+ it('validate command detects existing OpenCode config', async () => {
142
+ const opencodeDir = path.join(targetDir, '.opencode');
143
+ await fs.ensureDir(path.join(opencodeDir, 'skills'));
144
+ const program = (await import('../index.js')).default;
145
+ program.parse(['node', 'index.js', 'validate'], { from: 'user' });
146
+ const opencodeDirExists = await fs.pathExists(opencodeDir);
147
+ expect(opencodeDirExists).toBe(true);
148
+ });
149
+ it('validate command detects specs directory', async () => {
150
+ const specsDir = path.join(targetDir, 'specs');
151
+ await fs.ensureDir(specsDir);
152
+ const program = (await import('../index.js')).default;
153
+ program.parse(['node', 'index.js', 'validate'], { from: 'user' });
154
+ const specsDirExists = await fs.pathExists(specsDir);
155
+ expect(specsDirExists).toBe(true);
156
+ });
157
+ it('validate command shows correct status for missing configs', async () => {
158
+ const program = (await import('../index.js')).default;
159
+ program.parse(['node', 'index.js', 'validate'], { from: 'user' });
160
+ const githubDir = path.join(targetDir, '.github');
161
+ const githubDirExists = await fs.pathExists(githubDir);
162
+ expect(githubDirExists).toBe(false);
163
+ });
164
+ });
165
+ //# sourceMappingURL=inject-validate.e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-validate.e2e.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/inject-validate.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-registry.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/mcp-registry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { MCP_SERVERS } from '../mcp-registry.js';
3
+ describe('MCP Registry', () => {
4
+ describe('MCP_SERVERS array', () => {
5
+ it('should contain at least one MCP server', () => {
6
+ expect(MCP_SERVERS.length).toBeGreaterThan(0);
7
+ });
8
+ it('should have GitHub MCP server', () => {
9
+ const github = MCP_SERVERS.find((s) => s.id === 'github');
10
+ expect(github).toBeDefined();
11
+ expect(github?.name).toBe('Official GitHub MCP');
12
+ expect(github?.category).toBe('git');
13
+ });
14
+ it('should have Linear MCP server', () => {
15
+ const linear = MCP_SERVERS.find((s) => s.id === 'linear');
16
+ expect(linear).toBeDefined();
17
+ expect(linear?.name).toBe('Linear MCP');
18
+ expect(linear?.category).toBe('project-management');
19
+ });
20
+ it('should have unique server IDs', () => {
21
+ const ids = MCP_SERVERS.map((s) => s.id);
22
+ const uniqueIds = new Set(ids);
23
+ expect(ids.length).toBe(uniqueIds.size);
24
+ });
25
+ it('should have valid server entries with required fields', () => {
26
+ MCP_SERVERS.forEach((server) => {
27
+ expect(server.id).toBeDefined();
28
+ expect(server.name).toBeDefined();
29
+ expect(server.category).toBeDefined();
30
+ expect(server.command).toBeDefined();
31
+ expect(server.args).toBeInstanceOf(Array);
32
+ expect(typeof server.requiresApiKey).toBe('boolean');
33
+ expect(server.documentationUrl).toBeDefined();
34
+ });
35
+ });
36
+ it('should have valid categories', () => {
37
+ const validCategories = ['git', 'project-management', 'database', 'auth', 'testing', 'development', 'productivity'];
38
+ MCP_SERVERS.forEach((server) => {
39
+ expect(validCategories).toContain(server.category);
40
+ });
41
+ });
42
+ it('should categorize servers correctly', () => {
43
+ const gitServers = MCP_SERVERS.filter((s) => s.category === 'git');
44
+ expect(gitServers.length).toBeGreaterThan(0);
45
+ const projectManagementServers = MCP_SERVERS.filter((s) => s.category === 'project-management');
46
+ expect(projectManagementServers.length).toBeGreaterThan(0);
47
+ const testingServers = MCP_SERVERS.filter((s) => s.category === 'testing');
48
+ expect(testingServers.length).toBeGreaterThan(0);
49
+ });
50
+ it('should have servers that require API keys', () => {
51
+ const serversWithApiKey = MCP_SERVERS.filter((s) => s.requiresApiKey === true);
52
+ expect(serversWithApiKey.length).toBeGreaterThan(0);
53
+ serversWithApiKey.forEach((server) => {
54
+ expect(server.documentationUrl).toBeDefined();
55
+ expect(server.documentationUrl.length).toBeGreaterThan(0);
56
+ });
57
+ });
58
+ it('should have servers without API key requirements', () => {
59
+ const serversWithoutApiKey = MCP_SERVERS.filter((s) => s.requiresApiKey === false);
60
+ expect(serversWithoutApiKey.length).toBeGreaterThan(0);
61
+ });
62
+ it('should have valid command and args for all servers', () => {
63
+ MCP_SERVERS.forEach((server) => {
64
+ expect(server.command).toBeTruthy();
65
+ expect(server.command.length).toBeGreaterThan(0);
66
+ expect(server.args).toBeInstanceOf(Array);
67
+ });
68
+ });
69
+ it('should have valid documentation URLs', () => {
70
+ MCP_SERVERS.forEach((server) => {
71
+ expect(server.documentationUrl).toMatch(/^https?:\/\//);
72
+ });
73
+ });
74
+ });
75
+ describe('Server configuration structure', () => {
76
+ it('should have GitHub server with correct config', () => {
77
+ const github = MCP_SERVERS.find((s) => s.id === 'github');
78
+ expect(github).toBeDefined();
79
+ expect(github.npmPackage).toBe('@github/mcp-server');
80
+ expect(github.command).toBe('npx');
81
+ expect(github.args).toEqual(['@github/mcp-server']);
82
+ expect(github.requiresApiKey).toBe(true);
83
+ });
84
+ it('should have Linear server with correct config', () => {
85
+ const linear = MCP_SERVERS.find((s) => s.id === 'linear');
86
+ expect(linear).toBeDefined();
87
+ expect(linear.npmPackage).toBe('@linear/mcp-server');
88
+ expect(linear.command).toBe('npx');
89
+ expect(linear.args).toEqual(['@linear/mcp-server']);
90
+ expect(linear.requiresApiKey).toBe(true);
91
+ });
92
+ it('should have Firebase server with correct config', () => {
93
+ const firebase = MCP_SERVERS.find((s) => s.id === 'firebase');
94
+ expect(firebase).toBeDefined();
95
+ expect(firebase.npmPackage).toBe('@firebase/mcp-server');
96
+ expect(firebase.command).toBe('npx');
97
+ expect(firebase.args).toEqual(['@firebase/mcp-server']);
98
+ expect(firebase.requiresApiKey).toBe(false);
99
+ });
100
+ it('should have Playwright server with correct config', () => {
101
+ const playwright = MCP_SERVERS.find((s) => s.id === 'playwright');
102
+ expect(playwright).toBeDefined();
103
+ expect(playwright.npmPackage).toBe('@playwright/mcp');
104
+ expect(playwright.command).toBe('npx');
105
+ expect(playwright.args).toEqual(['@playwright/mcp']);
106
+ expect(playwright.requiresApiKey).toBe(false);
107
+ });
108
+ });
109
+ describe('Category distribution', () => {
110
+ it('should have servers distributed across multiple categories', () => {
111
+ const categories = new Set(MCP_SERVERS.map((s) => s.category));
112
+ expect(categories.size).toBeGreaterThan(3);
113
+ });
114
+ it('should have at least one server in each expected category', () => {
115
+ const categories = new Set(MCP_SERVERS.map((s) => s.category));
116
+ expect(categories.has('git')).toBe(true);
117
+ expect(categories.has('project-management')).toBe(true);
118
+ expect(categories.has('database')).toBe(true);
119
+ expect(categories.has('testing')).toBe(true);
120
+ });
121
+ });
122
+ });
123
+ //# sourceMappingURL=mcp-registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-registry.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/mcp-registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,229 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import inquirer from 'inquirer';
5
+ import fs from 'fs-extra';
6
+ import path from 'path';
7
+ import { fileURLToPath } from 'url';
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+ const program = new Command();
11
+ program
12
+ .name('spec-driven-steroids')
13
+ .description('Inject Spec Driven standards into your repository')
14
+ .version('0.1.0');
15
+ program
16
+ .command('inject')
17
+ .description('Inject platform-specific Spec Driven configs')
18
+ .action(async () => {
19
+ console.log(chalk.bold.cyan('\n💪 Injecting steroids...\n'));
20
+ const { platforms } = await inquirer.prompt([
21
+ {
22
+ type: 'checkbox',
23
+ name: 'platforms',
24
+ message: 'Select platforms to support:',
25
+ choices: [
26
+ { name: 'GitHub Copilot for VSCode', value: 'github' },
27
+ { name: 'GitHub Copilot for JetBrains', value: 'jetbrains' },
28
+ { name: 'Google Antigravity', value: 'antigravity' },
29
+ { name: 'OpenCode', value: 'opencode' }
30
+ ],
31
+ validate: (input) => input.length > 0 || 'Select at least one platform.'
32
+ }
33
+ ]);
34
+ const targetDir = process.cwd();
35
+ const standardsDir = path.resolve(__dirname, '../../standards/src/templates');
36
+ const universalSkillsDir = path.join(standardsDir, 'universal/skills');
37
+ for (const platform of platforms) {
38
+ console.log(chalk.yellow(`\nConfiguring ${platform}...`));
39
+ try {
40
+ let platformDest = '';
41
+ let skillsSubDir = 'skills';
42
+ if (platform === 'github') {
43
+ await configureCopilotMcp(targetDir);
44
+ const src = path.join(standardsDir, 'github');
45
+ platformDest = path.join(targetDir, '.github');
46
+ await fs.copy(src, platformDest, { overwrite: true });
47
+ }
48
+ if (platform === 'jetbrains') {
49
+ // JetBrains uses .jetbrains/ folder for prompts and agents
50
+ const src = path.join(standardsDir, 'jetbrains');
51
+ platformDest = path.join(targetDir, '.jetbrains');
52
+ await fs.copy(src, platformDest, { overwrite: true });
53
+ }
54
+ if (platform === 'antigravity') {
55
+ await configureAntigravityMcp(targetDir);
56
+ const src = path.join(standardsDir, 'antigravity');
57
+ platformDest = path.join(targetDir, '.agent');
58
+ await fs.copy(src, platformDest, { overwrite: true });
59
+ }
60
+ if (platform === 'opencode') {
61
+ await configureOpenCodeMcp(targetDir);
62
+ const src = path.join(standardsDir, 'opencode');
63
+ platformDest = path.join(targetDir, '.opencode');
64
+ await fs.copy(src, platformDest, { overwrite: true });
65
+ // Specifically for OpenCode, we need to update opencode.json
66
+ await updateOpenCodeConfig(targetDir);
67
+ }
68
+ // Copy universal skills to the platform's skills directory
69
+ if (platformDest) {
70
+ const destSkillsDir = path.join(platformDest, skillsSubDir);
71
+ await fs.ensureDir(destSkillsDir);
72
+ await fs.copy(universalSkillsDir, destSkillsDir, { overwrite: true });
73
+ console.log(chalk.green(`✅ ${platform} config and universal skills injected.`));
74
+ }
75
+ }
76
+ catch (err) {
77
+ console.error(chalk.red(`❌ Failed to inject ${platform} config:`, err));
78
+ }
79
+ }
80
+ console.log(chalk.bold.cyan('\n🚀 Injection Complete!'));
81
+ console.log(chalk.white('Next steps:'));
82
+ console.log(chalk.white('1. Ensure the spec-driven-steroids MCP server is running.'));
83
+ });
84
+ program
85
+ .command('validate')
86
+ .description('Check if Spec Driven standards are correctly configured')
87
+ .action(async () => {
88
+ const targetDir = process.cwd();
89
+ console.log(chalk.cyan('\n🔍 Validating Spec Driven setup...\n'));
90
+ const checks = [
91
+ { name: 'GitHub Config', path: '.github/agents' },
92
+ { name: 'JetBrains Config', path: '.jetbrains/prompts' },
93
+ { name: 'Antigravity Config', path: '.agent/workflows' },
94
+ { name: 'OpenCode Config', path: '.opencode/skills' },
95
+ { name: 'Standard Requirements', path: 'specs' }
96
+ ];
97
+ for (const check of checks) {
98
+ const exists = await fs.pathExists(path.join(targetDir, check.path));
99
+ if (exists) {
100
+ console.log(`${chalk.green('✅')} ${check.name} found.`);
101
+ }
102
+ else {
103
+ console.log(`${chalk.gray('➖')} ${check.name} not present (optional).`);
104
+ }
105
+ }
106
+ console.log(chalk.yellow('\nTip: Make sure to connect your MCP server to enable structural validation.\n'));
107
+ });
108
+ program.parse();
109
+ async function configureCopilotMcp(targetDir) {
110
+ try {
111
+ const vscodeDir = path.join(targetDir, '.vscode');
112
+ await fs.ensureDir(vscodeDir);
113
+ const mcpConfigPath = path.join(vscodeDir, 'mcp.json');
114
+ let config = { servers: {} };
115
+ if (await fs.pathExists(mcpConfigPath)) {
116
+ try {
117
+ config = await fs.readJson(mcpConfigPath);
118
+ if (!config.servers)
119
+ config.servers = {};
120
+ }
121
+ catch (e) {
122
+ console.warn(chalk.yellow('Warning: Could not parse existing .vscode/mcp.json.'));
123
+ }
124
+ }
125
+ const legacyServers = config.mcpServers ?? {};
126
+ if (!config.servers)
127
+ config.servers = {};
128
+ for (const [serverName, serverConfig] of Object.entries(legacyServers)) {
129
+ if (!config.servers[serverName]) {
130
+ config.servers[serverName] = serverConfig;
131
+ }
132
+ }
133
+ // Add spec-driven-steroids (always)
134
+ const mcpLaunch = await resolveMcpLaunchConfig();
135
+ config.servers['spec-driven-steroids'] = {
136
+ command: mcpLaunch.command,
137
+ args: mcpLaunch.args
138
+ };
139
+ delete config.mcpServers;
140
+ await fs.writeJson(mcpConfigPath, config, { spaces: 2 });
141
+ }
142
+ catch (error) {
143
+ console.error(chalk.red('Failed to configure GitHub Copilot MCP:'), error);
144
+ }
145
+ }
146
+ async function configureAntigravityMcp(targetDir) {
147
+ try {
148
+ const agentDir = path.join(targetDir, '.agent');
149
+ await fs.ensureDir(agentDir);
150
+ const configPath = path.join(agentDir, 'mcp_config.json');
151
+ let config = { mcpServers: {} };
152
+ if (await fs.pathExists(configPath)) {
153
+ try {
154
+ config = await fs.readJson(configPath);
155
+ if (!config.mcpServers)
156
+ config.mcpServers = {};
157
+ }
158
+ catch (e) {
159
+ console.warn(chalk.yellow('Warning: Could not parse existing Antigravity config.'));
160
+ }
161
+ }
162
+ // Add spec-driven-steroids (always)
163
+ const mcpLaunch = await resolveMcpLaunchConfig();
164
+ if (!config.mcpServers)
165
+ config.mcpServers = {};
166
+ config.mcpServers['spec-driven-steroids'] = {
167
+ command: mcpLaunch.command,
168
+ args: mcpLaunch.args
169
+ };
170
+ await fs.writeJson(configPath, config, { spaces: 2 });
171
+ }
172
+ catch (error) {
173
+ console.error(chalk.red('Failed to configure Antigravity MCP:'), error);
174
+ }
175
+ }
176
+ async function configureOpenCodeMcp(targetDir) {
177
+ try {
178
+ const configPath = path.join(targetDir, 'opencode.json');
179
+ let config = {};
180
+ if (await fs.pathExists(configPath)) {
181
+ try {
182
+ config = await fs.readJson(configPath);
183
+ }
184
+ catch (e) {
185
+ console.warn(chalk.yellow('Warning: Could not parse existing opencode.json.'));
186
+ }
187
+ }
188
+ if (!config.mcp)
189
+ config.mcp = {};
190
+ // Add spec-driven-steroids (always) - local MCP server
191
+ const mcpLaunch = await resolveMcpLaunchConfig();
192
+ config.mcp['spec-driven-steroids'] = {
193
+ type: 'local',
194
+ command: [mcpLaunch.command, ...mcpLaunch.args]
195
+ };
196
+ await fs.writeJson(configPath, config, { spaces: 2 });
197
+ }
198
+ catch (error) {
199
+ console.error(chalk.red('Failed to configure OpenCode MCP:'), error);
200
+ }
201
+ }
202
+ async function updateOpenCodeConfig(targetDir) {
203
+ const configPath = path.join(targetDir, 'opencode.json');
204
+ if (!await fs.pathExists(configPath))
205
+ return;
206
+ const config = await fs.readJson(configPath);
207
+ // Add $schema if not present for validation/autocomplete support
208
+ if (!config.$schema) {
209
+ config.$schema = 'https://opencode.ai/config.json';
210
+ }
211
+ // Skills are auto-discovered by OpenCode, so we don't need to add them to the config
212
+ await fs.writeJson(configPath, config, { spaces: 2 });
213
+ console.log(chalk.green('✅ opencode.json updated with schema.'));
214
+ }
215
+ async function resolveMcpLaunchConfig() {
216
+ const localMcpDistPath = path.resolve(__dirname, '../../mcp/dist/index.js');
217
+ const hasLocalMcpDist = await fs.pathExists(localMcpDistPath);
218
+ if (hasLocalMcpDist) {
219
+ return {
220
+ command: 'node',
221
+ args: [localMcpDistPath]
222
+ };
223
+ }
224
+ return {
225
+ command: 'pnpm',
226
+ args: ['dlx', '@spec-driven-steroids/mcp']
227
+ };
228
+ }
229
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAuCpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,sBAAsB,CAAC;KAC5B,WAAW,CAAC,mDAAmD,CAAC;KAChE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAE7D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC1C;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACtD,EAAE,IAAI,EAAE,8BAA8B,EAAE,KAAK,EAAE,WAAW,EAAE;gBAC5D,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,aAAa,EAAE;gBACpD,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;aACxC;YACD,QAAQ,EAAE,CAAC,KAAe,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,+BAA+B;SACnF;KACF,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC;IAC9E,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IAEvE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,QAAQ,KAAK,CAAC,CAAC,CAAC;QAE1D,IAAI,CAAC;YACH,IAAI,YAAY,GAAG,EAAE,CAAC;YACtB,IAAI,YAAY,GAAG,QAAQ,CAAC;YAE5B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;gBACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;gBAC9C,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC/C,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAC7B,2DAA2D;gBAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;gBACjD,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;gBAClD,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC/B,MAAM,uBAAuB,CAAC,SAAS,CAAC,CAAC;gBACzC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;gBACnD,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC9C,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC5B,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACtC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;gBAChD,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBACjD,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEtD,6DAA6D;gBAC7D,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC;YAED,2DAA2D;YAC3D,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;gBAClC,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,wCAAwC,CAAC,CAAC,CAAC;YAClF,CAAC;QAEH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,QAAQ,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC,CAAC;AACxF,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG;QACb,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,EAAE;QACjD,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,oBAAoB,EAAE;QACxD,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,kBAAkB,EAAE;QACxD,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE;QACrD,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE;KACjD,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,0BAA0B,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gFAAgF,CAAC,CAAC,CAAC;AAC9G,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IAClD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAEvD,IAAI,MAAM,GAAqB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC/C,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAqB,CAAC;gBAC9D,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;YAC3C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YACvE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,MAAM,SAAS,GAAG,MAAM,sBAAsB,EAAE,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,GAAG;YACvC,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;SACrB,CAAC;QAEF,OAAO,MAAM,CAAC,UAAU,CAAC;QAEzB,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,SAAiB;IACtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAE1D,IAAI,MAAM,GAAc,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAc,CAAC;gBACpD,IAAI,CAAC,MAAM,CAAC,UAAU;oBAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;YACjD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,MAAM,SAAS,GAAG,MAAM,sBAAsB,EAAE,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;QAC/C,MAAM,CAAC,UAAU,CAAC,sBAAsB,CAAC,GAAG;YAC1C,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;SACrB,CAAC;QAEF,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,SAAiB;IACnD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAEzD,IAAI,MAAM,GAAmB,EAAE,CAAC;QAChC,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,kDAAkD,CAAC,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG;YAAE,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;QAEjC,uDAAuD;QACvD,MAAM,SAAS,GAAG,MAAM,sBAAsB,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG;YACnC,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC;SAChD,CAAC;QAEF,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,SAAiB;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO;IAE7C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE7C,iEAAiE;IACjE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,OAAO,GAAG,iCAAiC,CAAC;IACrD,CAAC;IAED,qFAAqF;IAErF,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,sBAAsB;IACnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;IAC5E,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE9D,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,MAAM;YACf,IAAI,EAAE,CAAC,gBAAgB,CAAC;SACzB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,CAAC,KAAK,EAAE,2BAA2B,CAAC;KAC3C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface McpServerConfig {
2
+ id: string;
3
+ name: string;
4
+ description: string;
5
+ npmPackage: string;
6
+ command: string;
7
+ args: string[];
8
+ requiresApiKey: boolean;
9
+ documentationUrl: string;
10
+ }
11
+ export declare const MCP_SERVERS: McpServerConfig[];
12
+ //# sourceMappingURL=mcp-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-registry.d.ts","sourceRoot":"","sources":["../src/mcp-registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,WAAW,EAAE,eAAe,EA+GxC,CAAC"}
@@ -0,0 +1,113 @@
1
+ export const MCP_SERVERS = [
2
+ {
3
+ id: 'github',
4
+ name: 'Official GitHub MCP',
5
+ description: 'Repository management, file operations, GitHub API integration',
6
+ npmPackage: '@github/mcp-server',
7
+ command: 'npx',
8
+ args: ['@github/mcp-server'],
9
+ requiresApiKey: true,
10
+ documentationUrl: 'https://github.com/github/mcp-server'
11
+ },
12
+ {
13
+ id: 'linear',
14
+ name: 'Linear MCP',
15
+ description: 'Issue tracking, projects, and comments',
16
+ npmPackage: '@linear/mcp-server',
17
+ command: 'npx',
18
+ args: ['@linear/mcp-server'],
19
+ requiresApiKey: true,
20
+ documentationUrl: 'https://github.com/mcplinear/mcp'
21
+ },
22
+ {
23
+ id: 'atlassian',
24
+ name: 'Atlassian MCP',
25
+ description: 'Jira and Confluence integration',
26
+ npmPackage: '@atlassian/mcp-server',
27
+ command: 'npx',
28
+ args: ['@atlassian/mcp-server'],
29
+ requiresApiKey: true,
30
+ documentationUrl: 'https://github.com/atlassian/mcp-server'
31
+ },
32
+ {
33
+ id: 'supabase',
34
+ name: 'Supabase MCP',
35
+ description: 'Database and auth services',
36
+ npmPackage: '@supabase/mcp-server',
37
+ command: 'npx',
38
+ args: ['@supabase/mcp-server'],
39
+ requiresApiKey: true,
40
+ documentationUrl: 'https://supabase.com/docs/guides/functions/mcp'
41
+ },
42
+ {
43
+ id: 'firebase',
44
+ name: 'Firebase MCP',
45
+ description: 'Firebase tools integration',
46
+ npmPackage: '@firebase/mcp-server',
47
+ command: 'npx',
48
+ args: ['@firebase/mcp-server'],
49
+ requiresApiKey: false,
50
+ documentationUrl: 'https://github.com/firebase/mcp-server'
51
+ },
52
+ {
53
+ id: 'notion',
54
+ name: 'Notion MCP',
55
+ description: 'Notion API integration',
56
+ npmPackage: 'notionhq/mcp-server',
57
+ command: 'npx',
58
+ args: ['notionhq/mcp-server'],
59
+ requiresApiKey: true,
60
+ documentationUrl: 'https://github.com/notionhq/mcp-server'
61
+ },
62
+ {
63
+ id: 'postman',
64
+ name: 'Postman MCP',
65
+ description: 'API collection and testing',
66
+ npmPackage: '@postman/mcp-server',
67
+ command: 'npx',
68
+ args: ['@postman/mcp-server'],
69
+ requiresApiKey: true,
70
+ documentationUrl: 'https://github.com/postmanlabs/mcp-server'
71
+ },
72
+ {
73
+ id: 'playwright',
74
+ name: 'Playwright MCP',
75
+ description: 'Browser automation and testing',
76
+ npmPackage: '@playwright/mcp',
77
+ command: 'npx',
78
+ args: ['@playwright/mcp'],
79
+ requiresApiKey: false,
80
+ documentationUrl: 'https://playwright.dev'
81
+ },
82
+ {
83
+ id: 'svelte',
84
+ name: 'Svelte MCP',
85
+ description: 'Svelte development tools',
86
+ npmPackage: '@sveltejs/opencode',
87
+ command: 'npx',
88
+ args: ['@sveltejs/opencode'],
89
+ requiresApiKey: false,
90
+ documentationUrl: 'https://svelte.dev'
91
+ },
92
+ {
93
+ id: 'context7',
94
+ name: 'Context7 MCP',
95
+ description: 'Search with Context7 API',
96
+ npmPackage: 'context7-mcp-server',
97
+ command: 'npx',
98
+ args: ['context7-mcp-server'],
99
+ requiresApiKey: true,
100
+ documentationUrl: 'https://context7.io'
101
+ },
102
+ {
103
+ id: 'teststrike',
104
+ name: 'TestStrike MCP',
105
+ description: 'Test automation (research needed)',
106
+ npmPackage: '@teststrike/mcp-server',
107
+ command: 'npx',
108
+ args: ['@teststrike/mcp-server'],
109
+ requiresApiKey: false,
110
+ documentationUrl: 'https://teststrike.com'
111
+ }
112
+ ];
113
+ //# sourceMappingURL=mcp-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-registry.js","sourceRoot":"","sources":["../src/mcp-registry.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "spec-driven-steroids",
3
+ "version": "0.2.0",
4
+ "description": "CLI to inject Spec Driven Steroids standards into any repository",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "spec-driven-steroids": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "package.json",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "dependencies": {
17
+ "commander": "^11.1.0",
18
+ "inquirer": "^9.2.12",
19
+ "chalk": "^5.3.0",
20
+ "fs-extra": "^11.2.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^20.10.0",
24
+ "@types/fs-extra": "^11.0.4",
25
+ "@types/inquirer": "^9.0.7",
26
+ "typescript": "^5.3.3",
27
+ "@spec-driven-steroids/test-utils": "0.1.0"
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/lindoelio/spec-driven-steroids.git"
32
+ },
33
+ "author": "Lindoélio Lázaro <lindoelio@gmail.com>",
34
+ "license": "MIT",
35
+ "engines": {
36
+ "node": ">=20.0.0"
37
+ },
38
+ "scripts": {
39
+ "build": "tsc",
40
+ "start": "node dist/index.js",
41
+ "dev": "tsc -w",
42
+ "test": "tsc && vitest run",
43
+ "test:ui": "tsc && vitest --ui",
44
+ "test:coverage": "tsc && vitest --coverage"
45
+ }
46
+ }