@dewtech/dare-cli 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +178 -104
- package/dist/bin/dare.js +2 -0
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/discover.d.ts +3 -0
- package/dist/commands/discover.d.ts.map +1 -0
- package/dist/commands/discover.js +234 -0
- package/dist/commands/discover.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +61 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/utils/project-detector.d.ts +15 -0
- package/dist/utils/project-detector.d.ts.map +1 -0
- package/dist/utils/project-detector.js +243 -0
- package/dist/utils/project-detector.js.map +1 -0
- package/dist/utils/project-generator.d.ts +5 -1
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +310 -28
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/templates.d.ts +9 -0
- package/dist/utils/templates.d.ts.map +1 -1
- package/dist/utils/templates.js +95 -0
- package/dist/utils/templates.js.map +1 -1
- package/package.json +12 -12
- package/LICENSE +0 -21
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from 'fs-extra';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import { generateCursorRules, generateAntigravityRules, generateSharedConfig } from './templates.js';
|
|
3
|
+
import { generateCursorRules, generateAntigravityRules, generateSharedConfig, generateMcpCursorRules, generateMcpAntigravityRules } from './templates.js';
|
|
4
4
|
export async function generateProjectStructure(config) {
|
|
5
5
|
const { outputDir, name, structure, backend, frontend, ide, graphrag, mcp } = config;
|
|
6
6
|
await fs.ensureDir(outputDir);
|
|
@@ -8,46 +8,309 @@ export async function generateProjectStructure(config) {
|
|
|
8
8
|
await fs.ensureDir(path.join(outputDir, 'DARE'));
|
|
9
9
|
await fs.ensureDir(path.join(outputDir, 'DARE', 'EXECUTION'));
|
|
10
10
|
// Write dare.config.json
|
|
11
|
-
|
|
11
|
+
const configData = { name, structure, backend, frontend, ide, graphrag, mcp, version: '0.1.0' };
|
|
12
|
+
if (structure === 'mcp-server') {
|
|
13
|
+
configData.mcpTransport = config.mcpTransport;
|
|
14
|
+
configData.mcpLanguage = config.mcpLanguage;
|
|
15
|
+
configData.mcpFeatures = config.mcpFeatures;
|
|
16
|
+
}
|
|
17
|
+
await fs.writeJSON(path.join(outputDir, 'dare.config.json'), configData, { spaces: 2 });
|
|
12
18
|
// Write .gitignore
|
|
13
|
-
|
|
14
|
-
|
|
19
|
+
const gitignoreExtras = structure === 'mcp-server' && config.mcpLanguage === 'python'
|
|
20
|
+
? '\n__pycache__/\n*.py[cod]\n.venv/\n'
|
|
21
|
+
: '';
|
|
22
|
+
await fs.writeFile(path.join(outputDir, '.gitignore'), `node_modules/\ndist/\nbuild/\n*.db\n*.db-shm\n*.db-wal\n.env\n.env.local\n.dare/\nlogs/\n*.log\n${gitignoreExtras}`);
|
|
23
|
+
// Cursor rules
|
|
15
24
|
if (ide === 'cursor' || ide === 'hybrid') {
|
|
16
|
-
|
|
25
|
+
const cursorRulesContent = structure === 'mcp-server'
|
|
26
|
+
? generateMcpCursorRules({ mcpTransport: config.mcpTransport, mcpLanguage: config.mcpLanguage, mcpFeatures: config.mcpFeatures, graphrag, mcp })
|
|
27
|
+
: generateCursorRules({ backend, frontend, graphrag, mcp });
|
|
28
|
+
await fs.writeFile(path.join(outputDir, '.cursorrules'), cursorRulesContent);
|
|
17
29
|
await fs.ensureDir(path.join(outputDir, '.cursor', 'rules'));
|
|
18
30
|
await fs.ensureDir(path.join(outputDir, '.cursor', 'commands'));
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
await fs.writeFile(path.join(outputDir, '.cursor', 'rules', `skill-${backend}.mdc`), generateStackSkill(backend));
|
|
31
|
+
if (structure === 'mcp-server') {
|
|
32
|
+
await fs.writeFile(path.join(outputDir, '.cursor', 'rules', 'skill-mcp-server.mdc'), generateMcpStackSkill(config.mcpLanguage || 'node-ts'));
|
|
22
33
|
}
|
|
23
|
-
|
|
24
|
-
|
|
34
|
+
else {
|
|
35
|
+
if (backend) {
|
|
36
|
+
await fs.writeFile(path.join(outputDir, '.cursor', 'rules', `skill-${backend}.mdc`), generateStackSkill(backend));
|
|
37
|
+
}
|
|
38
|
+
if (frontend) {
|
|
39
|
+
await fs.writeFile(path.join(outputDir, '.cursor', 'rules', `skill-${frontend}.mdc`), generateStackSkill(frontend));
|
|
40
|
+
}
|
|
25
41
|
}
|
|
26
|
-
// Write DARE commands for Cursor
|
|
27
42
|
await fs.writeFile(path.join(outputDir, '.cursor', 'commands', 'generate-design.md'), `# Generate Design\nGenerate a DESIGN.md for the described feature.\n`);
|
|
28
43
|
await fs.writeFile(path.join(outputDir, '.cursor', 'commands', 'generate-blueprint.md'), `# Generate Blueprint\nGenerate a BLUEPRINT.md from the DESIGN.md.\n`);
|
|
29
44
|
await fs.writeFile(path.join(outputDir, '.cursor', 'commands', 'execute-task.md'), `# Execute Task\nExecute the specified task from TASKS.md.\n`);
|
|
30
45
|
}
|
|
31
|
-
//
|
|
46
|
+
// Antigravity rules
|
|
32
47
|
if (ide === 'antigravity' || ide === 'hybrid') {
|
|
33
|
-
|
|
48
|
+
const antigravityContent = structure === 'mcp-server'
|
|
49
|
+
? generateMcpAntigravityRules({ mcpTransport: config.mcpTransport, mcpLanguage: config.mcpLanguage, mcpFeatures: config.mcpFeatures, graphrag, mcp })
|
|
50
|
+
: generateAntigravityRules({ backend, frontend, graphrag, mcp });
|
|
51
|
+
await fs.writeFile(path.join(outputDir, '.antigravityrules'), antigravityContent);
|
|
34
52
|
await fs.ensureDir(path.join(outputDir, '.agents', 'skills', 'dare-design'));
|
|
35
53
|
await fs.ensureDir(path.join(outputDir, '.agents', 'skills', 'dare-blueprint'));
|
|
36
54
|
await fs.ensureDir(path.join(outputDir, '.agents', 'skills', 'dare-execute'));
|
|
37
55
|
await fs.ensureDir(path.join(outputDir, '.agents', 'skills', 'dare-tasks'));
|
|
38
56
|
await fs.ensureDir(path.join(outputDir, '.agents', 'workflows'));
|
|
39
57
|
}
|
|
40
|
-
// Write shared
|
|
58
|
+
// Write shared DARE README
|
|
41
59
|
await fs.writeFile(path.join(outputDir, 'DARE', 'README.md'), generateSharedConfig(name));
|
|
42
|
-
//
|
|
43
|
-
if (structure
|
|
44
|
-
|
|
45
|
-
await generateBackendTemplate(backendDir, backend);
|
|
60
|
+
// Generate project templates
|
|
61
|
+
if (structure === 'mcp-server') {
|
|
62
|
+
await generateMcpTemplate(outputDir, config);
|
|
46
63
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
64
|
+
else {
|
|
65
|
+
if (structure !== 'frontend' && backend) {
|
|
66
|
+
const backendDir = structure === 'monorepo' ? path.join(outputDir, 'backend') : outputDir;
|
|
67
|
+
await generateBackendTemplate(backendDir, backend);
|
|
68
|
+
}
|
|
69
|
+
if (structure !== 'backend' && frontend) {
|
|
70
|
+
const frontendDir = structure === 'monorepo' ? path.join(outputDir, 'frontend') : outputDir;
|
|
71
|
+
await generateFrontendTemplate(frontendDir, frontend);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export async function installDareToExistingProject(projectDir, config) {
|
|
76
|
+
const outputDir = projectDir;
|
|
77
|
+
const { name, structure, backend, frontend, ide, graphrag, mcp } = config;
|
|
78
|
+
await fs.ensureDir(path.join(outputDir, 'DARE'));
|
|
79
|
+
await fs.ensureDir(path.join(outputDir, 'DARE', 'EXECUTION'));
|
|
80
|
+
const configData = { name, structure, backend, frontend, ide, graphrag, mcp, version: '0.1.0', installedAt: new Date().toISOString() };
|
|
81
|
+
if (structure === 'mcp-server') {
|
|
82
|
+
configData.mcpTransport = config.mcpTransport;
|
|
83
|
+
configData.mcpLanguage = config.mcpLanguage;
|
|
84
|
+
configData.mcpFeatures = config.mcpFeatures;
|
|
85
|
+
}
|
|
86
|
+
await fs.writeJSON(path.join(outputDir, 'dare.config.json'), configData, { spaces: 2 });
|
|
87
|
+
await fs.writeFile(path.join(outputDir, 'DARE', 'README.md'), generateSharedConfig(name));
|
|
88
|
+
if (ide === 'cursor' || ide === 'hybrid') {
|
|
89
|
+
const cursorRulesContent = structure === 'mcp-server'
|
|
90
|
+
? generateMcpCursorRules({ mcpTransport: config.mcpTransport, mcpLanguage: config.mcpLanguage, mcpFeatures: config.mcpFeatures, graphrag, mcp })
|
|
91
|
+
: generateCursorRules({ backend, frontend, graphrag, mcp });
|
|
92
|
+
await fs.writeFile(path.join(outputDir, '.cursorrules'), cursorRulesContent);
|
|
93
|
+
await fs.ensureDir(path.join(outputDir, '.cursor', 'rules'));
|
|
94
|
+
await fs.ensureDir(path.join(outputDir, '.cursor', 'commands'));
|
|
95
|
+
if (structure === 'mcp-server') {
|
|
96
|
+
await fs.writeFile(path.join(outputDir, '.cursor', 'rules', 'skill-mcp-server.mdc'), generateMcpStackSkill(config.mcpLanguage || 'node-ts'));
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
if (backend) {
|
|
100
|
+
await fs.writeFile(path.join(outputDir, '.cursor', 'rules', `skill-${backend}.mdc`), generateStackSkill(backend));
|
|
101
|
+
}
|
|
102
|
+
if (frontend) {
|
|
103
|
+
await fs.writeFile(path.join(outputDir, '.cursor', 'rules', `skill-${frontend}.mdc`), generateStackSkill(frontend));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
await fs.writeFile(path.join(outputDir, '.cursor', 'commands', 'generate-design.md'), `# Generate Design\nGenerate a DESIGN.md for the described feature.\n`);
|
|
107
|
+
await fs.writeFile(path.join(outputDir, '.cursor', 'commands', 'generate-blueprint.md'), `# Generate Blueprint\nGenerate a BLUEPRINT.md from the DESIGN.md.\n`);
|
|
108
|
+
await fs.writeFile(path.join(outputDir, '.cursor', 'commands', 'execute-task.md'), `# Execute Task\nExecute the specified task from TASKS.md.\n`);
|
|
109
|
+
}
|
|
110
|
+
if (ide === 'antigravity' || ide === 'hybrid') {
|
|
111
|
+
const antigravityContent = structure === 'mcp-server'
|
|
112
|
+
? generateMcpAntigravityRules({ mcpTransport: config.mcpTransport, mcpLanguage: config.mcpLanguage, mcpFeatures: config.mcpFeatures, graphrag, mcp })
|
|
113
|
+
: generateAntigravityRules({ backend, frontend, graphrag, mcp });
|
|
114
|
+
await fs.writeFile(path.join(outputDir, '.antigravityrules'), antigravityContent);
|
|
115
|
+
await fs.ensureDir(path.join(outputDir, '.agents', 'skills', 'dare-design'));
|
|
116
|
+
await fs.ensureDir(path.join(outputDir, '.agents', 'skills', 'dare-blueprint'));
|
|
117
|
+
await fs.ensureDir(path.join(outputDir, '.agents', 'skills', 'dare-execute'));
|
|
118
|
+
await fs.ensureDir(path.join(outputDir, '.agents', 'skills', 'dare-tasks'));
|
|
119
|
+
await fs.ensureDir(path.join(outputDir, '.agents', 'workflows'));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function generateMcpTemplate(dir, config) {
|
|
123
|
+
const { mcpLanguage = 'node-ts', mcpTransport = 'stdio', mcpFeatures = ['tools'] } = config;
|
|
124
|
+
await fs.ensureDir(path.join(dir, 'src'));
|
|
125
|
+
if (mcpLanguage === 'node-ts') {
|
|
126
|
+
const hasResources = mcpFeatures.includes('resources');
|
|
127
|
+
const hasPrompts = mcpFeatures.includes('prompts');
|
|
128
|
+
const capabilities = [];
|
|
129
|
+
if (mcpFeatures.includes('tools'))
|
|
130
|
+
capabilities.push('tools: {}');
|
|
131
|
+
if (hasResources)
|
|
132
|
+
capabilities.push('resources: {}');
|
|
133
|
+
if (hasPrompts)
|
|
134
|
+
capabilities.push('prompts: {}');
|
|
135
|
+
const transportImport = mcpTransport === 'stdio'
|
|
136
|
+
? `import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';`
|
|
137
|
+
: `import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\nimport express from 'express';`;
|
|
138
|
+
const transportSetup = mcpTransport === 'stdio'
|
|
139
|
+
? `const transport = new StdioServerTransport();\nawait server.connect(transport);`
|
|
140
|
+
: `const app = express();\napp.get('/sse', async (req, res) => {\n const transport = new SSEServerTransport('/messages', res);\n await server.connect(transport);\n});\napp.post('/messages', express.json(), (req, res) => { /* message handler */ });\napp.listen(3000, () => console.error('MCP SSE server running on :3000'));`;
|
|
141
|
+
const resourceSection = hasResources ? `
|
|
142
|
+
import {
|
|
143
|
+
ListResourcesRequestSchema,
|
|
144
|
+
ReadResourceRequestSchema,
|
|
145
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
146
|
+
|
|
147
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
148
|
+
resources: [
|
|
149
|
+
{
|
|
150
|
+
uri: 'resource://example',
|
|
151
|
+
name: 'Example Resource',
|
|
152
|
+
description: 'An example resource',
|
|
153
|
+
mimeType: 'text/plain',
|
|
154
|
+
},
|
|
155
|
+
],
|
|
156
|
+
}));
|
|
157
|
+
|
|
158
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
159
|
+
if (request.params.uri === 'resource://example') {
|
|
160
|
+
return { contents: [{ uri: request.params.uri, mimeType: 'text/plain', text: 'Example content' }] };
|
|
161
|
+
}
|
|
162
|
+
throw new Error(\`Unknown resource: \${request.params.uri}\`);
|
|
163
|
+
});
|
|
164
|
+
` : '';
|
|
165
|
+
const promptSection = hasPrompts ? `
|
|
166
|
+
import {
|
|
167
|
+
ListPromptsRequestSchema,
|
|
168
|
+
GetPromptRequestSchema,
|
|
169
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
170
|
+
|
|
171
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
172
|
+
prompts: [
|
|
173
|
+
{
|
|
174
|
+
name: 'example-prompt',
|
|
175
|
+
description: 'An example prompt template',
|
|
176
|
+
arguments: [{ name: 'topic', description: 'Topic to write about', required: true }],
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
}));
|
|
180
|
+
|
|
181
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
182
|
+
if (request.params.name === 'example-prompt') {
|
|
183
|
+
const topic = request.params.arguments?.topic ?? 'general';
|
|
184
|
+
return {
|
|
185
|
+
description: 'Example prompt',
|
|
186
|
+
messages: [{ role: 'user', content: { type: 'text', text: \`Write about: \${topic}\` } }],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
throw new Error(\`Unknown prompt: \${request.params.name}\`);
|
|
190
|
+
});
|
|
191
|
+
` : '';
|
|
192
|
+
const indexContent = `import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
193
|
+
${transportImport}
|
|
194
|
+
import {
|
|
195
|
+
CallToolRequestSchema,
|
|
196
|
+
ListToolsRequestSchema,
|
|
197
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
198
|
+
|
|
199
|
+
const server = new Server(
|
|
200
|
+
{ name: '${config.name}', version: '0.1.0' },
|
|
201
|
+
{ capabilities: { ${capabilities.join(', ')} } }
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
205
|
+
tools: [
|
|
206
|
+
{
|
|
207
|
+
name: 'hello',
|
|
208
|
+
description: 'Says hello to a given name',
|
|
209
|
+
inputSchema: {
|
|
210
|
+
type: 'object',
|
|
211
|
+
properties: {
|
|
212
|
+
name: { type: 'string', description: 'Name to greet' },
|
|
213
|
+
},
|
|
214
|
+
required: ['name'],
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
}));
|
|
219
|
+
|
|
220
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
221
|
+
if (request.params.name === 'hello') {
|
|
222
|
+
const { name } = request.params.arguments as { name: string };
|
|
223
|
+
return { content: [{ type: 'text', text: \`Hello, \${name}!\` }] };
|
|
224
|
+
}
|
|
225
|
+
throw new Error(\`Unknown tool: \${request.params.name}\`);
|
|
226
|
+
});
|
|
227
|
+
${resourceSection}${promptSection}
|
|
228
|
+
${transportSetup}
|
|
229
|
+
`;
|
|
230
|
+
await fs.writeFile(path.join(dir, 'src', 'index.ts'), indexContent);
|
|
231
|
+
const extraDeps = mcpTransport !== 'stdio' ? { express: '^4.18.0' } : {};
|
|
232
|
+
const extraDevDeps = mcpTransport !== 'stdio' ? { '@types/express': '^4.17.0' } : {};
|
|
233
|
+
await fs.writeJSON(path.join(dir, 'package.json'), {
|
|
234
|
+
name: config.name,
|
|
235
|
+
version: '0.1.0',
|
|
236
|
+
type: 'module',
|
|
237
|
+
scripts: {
|
|
238
|
+
build: 'tsc',
|
|
239
|
+
start: 'node dist/index.js',
|
|
240
|
+
dev: 'tsx src/index.ts',
|
|
241
|
+
test: 'vitest',
|
|
242
|
+
inspect: `npx @modelcontextprotocol/inspector node dist/index.js`,
|
|
243
|
+
},
|
|
244
|
+
dependencies: {
|
|
245
|
+
'@modelcontextprotocol/sdk': '^1.0.0',
|
|
246
|
+
...extraDeps,
|
|
247
|
+
},
|
|
248
|
+
devDependencies: {
|
|
249
|
+
typescript: '^5.0.0',
|
|
250
|
+
tsx: '^4.0.0',
|
|
251
|
+
vitest: '^1.0.0',
|
|
252
|
+
'@types/node': '^20.0.0',
|
|
253
|
+
...extraDevDeps,
|
|
254
|
+
},
|
|
255
|
+
}, { spaces: 2 });
|
|
256
|
+
await fs.writeJSON(path.join(dir, 'tsconfig.json'), {
|
|
257
|
+
compilerOptions: {
|
|
258
|
+
target: 'ES2022',
|
|
259
|
+
module: 'Node16',
|
|
260
|
+
moduleResolution: 'Node16',
|
|
261
|
+
outDir: 'dist',
|
|
262
|
+
rootDir: 'src',
|
|
263
|
+
strict: true,
|
|
264
|
+
esModuleInterop: true,
|
|
265
|
+
skipLibCheck: true,
|
|
266
|
+
},
|
|
267
|
+
include: ['src'],
|
|
268
|
+
}, { spaces: 2 });
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
// Python MCP
|
|
272
|
+
const hasResources = mcpFeatures.includes('resources');
|
|
273
|
+
const hasPrompts = mcpFeatures.includes('prompts');
|
|
274
|
+
const resourceSection = hasResources ? `
|
|
275
|
+
|
|
276
|
+
@mcp.resource("resource://example")
|
|
277
|
+
def example_resource() -> str:
|
|
278
|
+
"""An example resource."""
|
|
279
|
+
return "Example content"
|
|
280
|
+
` : '';
|
|
281
|
+
const promptSection = hasPrompts ? `
|
|
282
|
+
|
|
283
|
+
@mcp.prompt()
|
|
284
|
+
def example_prompt(topic: str) -> str:
|
|
285
|
+
"""An example prompt template."""
|
|
286
|
+
return f"Write about: {topic}"
|
|
287
|
+
` : '';
|
|
288
|
+
const transportLine = mcpTransport === 'stdio' ? '' : '\n# For SSE transport:\n# mcp.run(transport="sse", host="0.0.0.0", port=8000)\n';
|
|
289
|
+
await fs.writeFile(path.join(dir, 'main.py'), `from mcp.server.fastmcp import FastMCP
|
|
290
|
+
|
|
291
|
+
mcp = FastMCP("${config.name}")
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
@mcp.tool()
|
|
295
|
+
def hello(name: str) -> str:
|
|
296
|
+
"""Says hello to a given name."""
|
|
297
|
+
return f"Hello, {name}!"
|
|
298
|
+
${resourceSection}${promptSection}
|
|
299
|
+
|
|
300
|
+
if __name__ == "__main__":
|
|
301
|
+
mcp.run()${transportLine}
|
|
302
|
+
`);
|
|
303
|
+
await fs.writeFile(path.join(dir, 'requirements.txt'), `mcp>=1.0.0\n`);
|
|
304
|
+
await fs.writeFile(path.join(dir, 'pyproject.toml'), `[project]
|
|
305
|
+
name = "${config.name}"
|
|
306
|
+
version = "0.1.0"
|
|
307
|
+
requires-python = ">=3.11"
|
|
308
|
+
dependencies = ["mcp>=1.0.0"]
|
|
309
|
+
|
|
310
|
+
[build-system]
|
|
311
|
+
requires = ["hatchling"]
|
|
312
|
+
build-backend = "hatchling.build"
|
|
313
|
+
`);
|
|
51
314
|
}
|
|
52
315
|
}
|
|
53
316
|
async function generateBackendTemplate(dir, stack) {
|
|
@@ -56,21 +319,17 @@ async function generateBackendTemplate(dir, stack) {
|
|
|
56
319
|
case 'rust-axum':
|
|
57
320
|
await fs.writeFile(path.join(dir, 'Cargo.toml'), `[package]\nname = "api"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\naxum = "0.7"\ntokio = { version = "1", features = ["full"] }\nserde = { version = "1", features = ["derive"] }\nserde_json = "1"\n`);
|
|
58
321
|
await fs.writeFile(path.join(dir, 'src', 'main.rs'), `use axum::{routing::get, Router};\n\n#[tokio::main]\nasync fn main() {\n let app = Router::new().route("/health", get(health));\n let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();\n axum::serve(listener, app).await.unwrap();\n}\n\nasync fn health() -> &'static str { "OK" }\n`);
|
|
59
|
-
await fs.writeFile(path.join(dir, '.cursorrules'), `# Rust/Axum Rules\n- Use Rust idioms and patterns\n- Prefer async/await with Tokio\n- Use Axum for HTTP routing\n- Handle errors with thiserror/anyhow\n- Run clippy before committing\n`);
|
|
60
322
|
break;
|
|
61
323
|
case 'node-nestjs':
|
|
62
324
|
await fs.writeJSON(path.join(dir, 'package.json'), { name: 'api', version: '0.1.0', scripts: { start: 'nest start', build: 'nest build', test: 'jest' }, dependencies: { '@nestjs/core': '^10.0.0', '@nestjs/common': '^10.0.0', '@nestjs/platform-express': '^10.0.0' } }, { spaces: 2 });
|
|
63
325
|
await fs.writeFile(path.join(dir, 'src', 'main.ts'), `import { NestFactory } from '@nestjs/core';\nimport { AppModule } from './app.module';\nasync function bootstrap() {\n const app = await NestFactory.create(AppModule);\n await app.listen(3000);\n}\nbootstrap();\n`);
|
|
64
|
-
await fs.writeFile(path.join(dir, '.cursorrules'), `# Node.js/NestJS Rules\n- Use NestJS decorators and DI\n- Define DTOs with class-validator\n- Use TypeORM or Prisma for DB\n- Write Jest tests for all services\n`);
|
|
65
326
|
break;
|
|
66
327
|
case 'python-fastapi':
|
|
67
328
|
await fs.writeFile(path.join(dir, 'main.py'), `from fastapi import FastAPI\n\napp = FastAPI()\n\n@app.get("/health")\ndef health():\n return {"status": "ok"}\n`);
|
|
68
329
|
await fs.writeFile(path.join(dir, 'requirements.txt'), `fastapi>=0.100.0\nuvicorn>=0.23.0\npydantic>=2.0.0\n`);
|
|
69
|
-
await fs.writeFile(path.join(dir, '.cursorrules'), `# Python/FastAPI Rules\n- Use Pydantic v2 for validation\n- Type all functions with PEP 484\n- Use async/await for IO operations\n- Follow PEP 8 style guide\n`);
|
|
70
330
|
break;
|
|
71
331
|
case 'php-laravel':
|
|
72
332
|
await fs.writeJSON(path.join(dir, 'composer.json'), { name: 'app/api', require: { php: '^8.2', 'laravel/framework': '^11.0' }, scripts: { 'post-install-cmd': ['@php artisan key:generate'] } }, { spaces: 2 });
|
|
73
|
-
await fs.writeFile(path.join(dir, '.cursorrules'), `# PHP/Laravel Rules\n- Follow PSR-12 coding standards\n- Use FormRequests for validation\n- Use API Resources for responses\n- Write PHPUnit tests\n- Use Eloquent ORM\n`);
|
|
74
333
|
break;
|
|
75
334
|
}
|
|
76
335
|
}
|
|
@@ -80,15 +339,38 @@ async function generateFrontendTemplate(dir, stack) {
|
|
|
80
339
|
case 'react':
|
|
81
340
|
await fs.writeJSON(path.join(dir, 'package.json'), { name: 'frontend', version: '0.1.0', scripts: { dev: 'vite', build: 'vite build', test: 'vitest' }, dependencies: { react: '^18.0.0', 'react-dom': '^18.0.0' }, devDependencies: { vite: '^5.0.0', '@vitejs/plugin-react': '^4.0.0', typescript: '^5.0.0' } }, { spaces: 2 });
|
|
82
341
|
await fs.writeFile(path.join(dir, 'src', 'App.tsx'), `import React from 'react';\n\nexport default function App() {\n return <div><h1>DARE Framework - React App</h1></div>;\n}\n`);
|
|
83
|
-
await fs.writeFile(path.join(dir, '.cursorrules'), `# React Rules\n- Use functional components with hooks\n- Use TypeScript for all components\n- Prefer React Query for server state\n- Use Zustand or Context for client state\n- Write Vitest tests\n`);
|
|
84
342
|
break;
|
|
85
343
|
case 'vue':
|
|
86
344
|
await fs.writeJSON(path.join(dir, 'package.json'), { name: 'frontend', version: '0.1.0', scripts: { dev: 'vite', build: 'vite build', test: 'vitest' }, dependencies: { vue: '^3.0.0' }, devDependencies: { vite: '^5.0.0', '@vitejs/plugin-vue': '^5.0.0', typescript: '^5.0.0' } }, { spaces: 2 });
|
|
87
345
|
await fs.writeFile(path.join(dir, 'src', 'App.vue'), `<template>\n <div><h1>DARE Framework - Vue App</h1></div>\n</template>\n\n<script setup lang="ts">\n// Composition API\n</script>\n`);
|
|
88
|
-
await fs.writeFile(path.join(dir, '.cursorrules'), `# Vue Rules\n- Use Composition API with <script setup>\n- Use TypeScript for all components\n- Use Pinia for state management\n- Use Vue Router for navigation\n- Write Vitest tests\n`);
|
|
89
346
|
break;
|
|
90
347
|
}
|
|
91
348
|
}
|
|
349
|
+
function generateMcpStackSkill(language) {
|
|
350
|
+
if (language === 'python') {
|
|
351
|
+
return `---
|
|
352
|
+
description: Python MCP server development skill
|
|
353
|
+
---
|
|
354
|
+
# Python MCP Skill
|
|
355
|
+
- Use FastMCP for rapid server development
|
|
356
|
+
- Decorate tools with @mcp.tool(), resources with @mcp.resource(), prompts with @mcp.prompt()
|
|
357
|
+
- Use type hints — FastMCP derives the JSON schema automatically
|
|
358
|
+
- Test with: npx @modelcontextprotocol/inspector python main.py
|
|
359
|
+
- Use mcp.run() for stdio, mcp.run(transport="sse") for SSE
|
|
360
|
+
`;
|
|
361
|
+
}
|
|
362
|
+
return `---
|
|
363
|
+
description: Node.js/TypeScript MCP server development skill
|
|
364
|
+
---
|
|
365
|
+
# TypeScript MCP Skill
|
|
366
|
+
- Import Server from @modelcontextprotocol/sdk/server/index.js
|
|
367
|
+
- Use StdioServerTransport for CLI tools, SSEServerTransport for web integrations
|
|
368
|
+
- Define tools with ListToolsRequestSchema + CallToolRequestSchema handlers
|
|
369
|
+
- Keep inputSchema strict — Claude uses it to call your tools correctly
|
|
370
|
+
- Test with: npm run inspect (uses @modelcontextprotocol/inspector)
|
|
371
|
+
- Build before shipping: npm run build
|
|
372
|
+
`;
|
|
373
|
+
}
|
|
92
374
|
function generateStackSkill(stack) {
|
|
93
375
|
const skills = {
|
|
94
376
|
'rust-axum': `---\ndescription: Rust/Axum API development skill\n---\n# Rust/Axum Skill\n- Use Axum for HTTP routing\n- Use Tokio for async runtime\n- Use SQLx for database\n- Run clippy and cargo test\n`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-generator.js","sourceRoot":"","sources":["../../src/utils/project-generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"project-generator.js","sourceRoot":"","sources":["../../src/utils/project-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,8 +4,17 @@ interface TemplateConfig {
|
|
|
4
4
|
graphrag: string;
|
|
5
5
|
mcp: boolean;
|
|
6
6
|
}
|
|
7
|
+
interface McpTemplateConfig {
|
|
8
|
+
mcpTransport?: string;
|
|
9
|
+
mcpLanguage?: string;
|
|
10
|
+
mcpFeatures?: string[];
|
|
11
|
+
graphrag: string;
|
|
12
|
+
mcp: boolean;
|
|
13
|
+
}
|
|
7
14
|
export declare function generateCursorRules(config: TemplateConfig): string;
|
|
8
15
|
export declare function generateAntigravityRules(config: TemplateConfig): string;
|
|
16
|
+
export declare function generateMcpCursorRules(config: McpTemplateConfig): string;
|
|
17
|
+
export declare function generateMcpAntigravityRules(config: McpTemplateConfig): string;
|
|
9
18
|
export declare function generateSharedConfig(projectName: string): string;
|
|
10
19
|
export {};
|
|
11
20
|
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"AAAA,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAgFlE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA6BvE;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA4BhE"}
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"AAAA,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,UAAU,iBAAiB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAgFlE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA6BvE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA+DxE;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAkC7E;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA4BhE"}
|
package/dist/utils/templates.js
CHANGED
|
@@ -105,6 +105,101 @@ ${mcp ? `- Query MCP Server at http://localhost:3000 for context
|
|
|
105
105
|
- Request human review for architectural decisions
|
|
106
106
|
`;
|
|
107
107
|
}
|
|
108
|
+
export function generateMcpCursorRules(config) {
|
|
109
|
+
const { mcpTransport = 'stdio', mcpLanguage = 'node-ts', mcpFeatures = ['tools'], graphrag, mcp } = config;
|
|
110
|
+
const featuresStr = mcpFeatures.join(', ');
|
|
111
|
+
const langRules = mcpLanguage === 'python'
|
|
112
|
+
? `## Language: Python
|
|
113
|
+
- Use FastMCP (@mcp.tool, @mcp.resource, @mcp.prompt decorators)
|
|
114
|
+
- Type all arguments — FastMCP builds JSON schema from type hints
|
|
115
|
+
- Use docstrings as tool/resource/prompt descriptions
|
|
116
|
+
- Test: npx @modelcontextprotocol/inspector python main.py
|
|
117
|
+
- Lint: ruff check . && mypy .`
|
|
118
|
+
: `## Language: TypeScript
|
|
119
|
+
- Import from '@modelcontextprotocol/sdk/server/index.js' and types
|
|
120
|
+
- Always define strict inputSchema for every tool (Claude depends on it)
|
|
121
|
+
- Use zod for runtime validation when needed
|
|
122
|
+
- Test: npm run inspect (MCP Inspector)
|
|
123
|
+
- Build: npm run build before marking any task DONE`;
|
|
124
|
+
const transportNote = mcpTransport === 'stdio'
|
|
125
|
+
? `- Transport: stdio — server communicates via stdin/stdout, no HTTP port needed`
|
|
126
|
+
: mcpTransport === 'sse'
|
|
127
|
+
? `- Transport: SSE — server exposes GET /sse and POST /messages endpoints`
|
|
128
|
+
: `- Transport: HTTP Stream — use StreamableHTTPServerTransport`;
|
|
129
|
+
return `# DARE Framework - Cursor Rules (MCP Server Project)
|
|
130
|
+
|
|
131
|
+
## DARE Methodology
|
|
132
|
+
You are an AI assistant following the DARE methodology:
|
|
133
|
+
- **D**esign: Define MCP server requirements and capabilities
|
|
134
|
+
- **A**rchitect: Create technical blueprint and task graph
|
|
135
|
+
- **R**eview: Validate implementation against blueprint
|
|
136
|
+
- **E**xecute: Implement tools, resources, and prompts following the DAG
|
|
137
|
+
|
|
138
|
+
## Core Rules
|
|
139
|
+
- Always read DARE/BLUEPRINT.md before implementing any tool or resource
|
|
140
|
+
- Update DARE/TASKS.md status after completing each task
|
|
141
|
+
- Never skip the Ralph Loop (build → test → inspect) before marking a task as DONE
|
|
142
|
+
- Test every tool with MCP Inspector before marking DONE
|
|
143
|
+
- Validate tool inputSchema matches actual handler logic exactly
|
|
144
|
+
|
|
145
|
+
## MCP Server Configuration
|
|
146
|
+
- Transport: ${mcpTransport}
|
|
147
|
+
- Features: ${featuresStr}
|
|
148
|
+
${transportNote}
|
|
149
|
+
|
|
150
|
+
${langRules}
|
|
151
|
+
|
|
152
|
+
## MCP Best Practices
|
|
153
|
+
- Keep tool names snake_case and descriptive
|
|
154
|
+
- Return structured content arrays, not plain strings
|
|
155
|
+
- Handle unknown tool/resource/prompt names with explicit errors
|
|
156
|
+
- Never expose secrets via tool outputs or resource contents
|
|
157
|
+
- Document every tool argument in inputSchema description fields
|
|
158
|
+
|
|
159
|
+
## GraphRAG Context (${graphrag})
|
|
160
|
+
${mcp ? `- Query MCP Server at http://localhost:3000 for context instead of reading full files` : '- Use DARE/BLUEPRINT.md as the single source of truth'}
|
|
161
|
+
|
|
162
|
+
## Ralph Loop (Mandatory before DONE)
|
|
163
|
+
1. Build (npm run build / python -m py_compile)
|
|
164
|
+
2. Test (npm test / pytest)
|
|
165
|
+
3. Inspect with MCP Inspector to verify tool contracts
|
|
166
|
+
4. Only mark DONE if all 3 steps pass
|
|
167
|
+
`;
|
|
168
|
+
}
|
|
169
|
+
export function generateMcpAntigravityRules(config) {
|
|
170
|
+
const { mcpTransport = 'stdio', mcpLanguage = 'node-ts', mcpFeatures = ['tools'], graphrag, mcp } = config;
|
|
171
|
+
return `# DARE Framework - Antigravity Rules (MCP Server Project)
|
|
172
|
+
|
|
173
|
+
## Agent Configuration
|
|
174
|
+
You are an autonomous AI agent implementing an MCP server using the DARE methodology.
|
|
175
|
+
Execute tasks from DARE/dare-dag.yaml in parallel when dependencies allow.
|
|
176
|
+
|
|
177
|
+
## DARE Phases
|
|
178
|
+
- **Design**: Read DARE/DESIGN.md — what tools/resources/prompts does this MCP server expose?
|
|
179
|
+
- **Architect**: Read DARE/BLUEPRINT.md — tool schemas, transport, auth strategy
|
|
180
|
+
- **Review**: Test each tool with MCP Inspector before marking DONE
|
|
181
|
+
- **Execute**: Implement tasks, update DARE/TASKS.md
|
|
182
|
+
|
|
183
|
+
## MCP Stack
|
|
184
|
+
- Language: ${mcpLanguage}
|
|
185
|
+
- Transport: ${mcpTransport}
|
|
186
|
+
- Features: ${mcpFeatures.join(', ')}
|
|
187
|
+
|
|
188
|
+
## Implementation Rules
|
|
189
|
+
- Each tool must have a strict inputSchema — Claude uses it to call the tool
|
|
190
|
+
- Test with MCP Inspector after implementing each tool
|
|
191
|
+
- Never skip error handling for unknown tool names
|
|
192
|
+
|
|
193
|
+
## Context Strategy (${graphrag})
|
|
194
|
+
${mcp ? `- Query MCP Server at http://localhost:3000 for project context` : '- Read DARE/BLUEPRINT.md for context'}
|
|
195
|
+
|
|
196
|
+
## Execution Rules
|
|
197
|
+
- Always check task dependencies before starting
|
|
198
|
+
- Update task status in DARE/TASKS.md in real-time
|
|
199
|
+
- Run Ralph Loop before marking any task as DONE
|
|
200
|
+
- Request human review for transport or auth design decisions
|
|
201
|
+
`;
|
|
202
|
+
}
|
|
108
203
|
export function generateSharedConfig(projectName) {
|
|
109
204
|
return `# DARE - ${projectName}
|
|
110
205
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dewtech/dare-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "DARE Framework CLI - Interactive project setup and task execution",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -17,16 +17,23 @@
|
|
|
17
17
|
"files": [
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"dev": "tsx watch src/bin/dare.ts",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"lint": "eslint src --ext .ts",
|
|
25
|
+
"format": "prettier --write src"
|
|
26
|
+
},
|
|
20
27
|
"dependencies": {
|
|
28
|
+
"@dewtech/dare-core": "workspace:*",
|
|
21
29
|
"chalk": "^5.3.0",
|
|
22
30
|
"commander": "^11.0.0",
|
|
23
31
|
"fs-extra": "^11.1.1",
|
|
24
32
|
"inquirer": "^9.2.0",
|
|
25
33
|
"ora": "^7.0.1",
|
|
26
34
|
"yaml": "^2.3.1",
|
|
27
|
-
"@dewtech/dare-
|
|
28
|
-
"@dewtech/dare-
|
|
29
|
-
"@dewtech/dare-mcp-server": "0.2.0"
|
|
35
|
+
"@dewtech/dare-graphrag": "workspace:*",
|
|
36
|
+
"@dewtech/dare-mcp-server": "workspace:*"
|
|
30
37
|
},
|
|
31
38
|
"devDependencies": {
|
|
32
39
|
"@types/fs-extra": "^11.0.1",
|
|
@@ -55,12 +62,5 @@
|
|
|
55
62
|
},
|
|
56
63
|
"engines": {
|
|
57
64
|
"node": ">=18.0.0"
|
|
58
|
-
},
|
|
59
|
-
"scripts": {
|
|
60
|
-
"build": "tsc",
|
|
61
|
-
"dev": "tsx watch src/bin/dare.ts",
|
|
62
|
-
"test": "vitest run",
|
|
63
|
-
"lint": "eslint src --ext .ts",
|
|
64
|
-
"format": "prettier --write src"
|
|
65
65
|
}
|
|
66
|
-
}
|
|
66
|
+
}
|