@opensaas/stack-cli 0.1.7 → 0.3.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.
Files changed (94) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +207 -0
  3. package/CLAUDE.md +60 -12
  4. package/dist/commands/generate.d.ts.map +1 -1
  5. package/dist/commands/generate.js +10 -1
  6. package/dist/commands/generate.js.map +1 -1
  7. package/dist/commands/mcp.d.ts +6 -0
  8. package/dist/commands/mcp.d.ts.map +1 -0
  9. package/dist/commands/mcp.js +116 -0
  10. package/dist/commands/mcp.js.map +1 -0
  11. package/dist/generator/context.d.ts.map +1 -1
  12. package/dist/generator/context.js +21 -3
  13. package/dist/generator/context.js.map +1 -1
  14. package/dist/generator/index.d.ts +3 -0
  15. package/dist/generator/index.d.ts.map +1 -1
  16. package/dist/generator/index.js +3 -0
  17. package/dist/generator/index.js.map +1 -1
  18. package/dist/generator/lists.d.ts +31 -0
  19. package/dist/generator/lists.d.ts.map +1 -0
  20. package/dist/generator/lists.js +91 -0
  21. package/dist/generator/lists.js.map +1 -0
  22. package/dist/generator/plugin-types.d.ts +10 -0
  23. package/dist/generator/plugin-types.d.ts.map +1 -0
  24. package/dist/generator/plugin-types.js +122 -0
  25. package/dist/generator/plugin-types.js.map +1 -0
  26. package/dist/generator/prisma-config.d.ts +17 -0
  27. package/dist/generator/prisma-config.d.ts.map +1 -0
  28. package/dist/generator/prisma-config.js +40 -0
  29. package/dist/generator/prisma-config.js.map +1 -0
  30. package/dist/generator/prisma.d.ts.map +1 -1
  31. package/dist/generator/prisma.js +1 -2
  32. package/dist/generator/prisma.js.map +1 -1
  33. package/dist/generator/types.d.ts.map +1 -1
  34. package/dist/generator/types.js +51 -1
  35. package/dist/generator/types.js.map +1 -1
  36. package/dist/index.js +3 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/mcp/lib/documentation-provider.d.ts +43 -0
  39. package/dist/mcp/lib/documentation-provider.d.ts.map +1 -0
  40. package/dist/mcp/lib/documentation-provider.js +163 -0
  41. package/dist/mcp/lib/documentation-provider.js.map +1 -0
  42. package/dist/mcp/lib/features/catalog.d.ts +26 -0
  43. package/dist/mcp/lib/features/catalog.d.ts.map +1 -0
  44. package/dist/mcp/lib/features/catalog.js +291 -0
  45. package/dist/mcp/lib/features/catalog.js.map +1 -0
  46. package/dist/mcp/lib/generators/feature-generator.d.ts +35 -0
  47. package/dist/mcp/lib/generators/feature-generator.d.ts.map +1 -0
  48. package/dist/mcp/lib/generators/feature-generator.js +546 -0
  49. package/dist/mcp/lib/generators/feature-generator.js.map +1 -0
  50. package/dist/mcp/lib/types.d.ts +80 -0
  51. package/dist/mcp/lib/types.d.ts.map +1 -0
  52. package/dist/mcp/lib/types.js +5 -0
  53. package/dist/mcp/lib/types.js.map +1 -0
  54. package/dist/mcp/lib/wizards/wizard-engine.d.ts +71 -0
  55. package/dist/mcp/lib/wizards/wizard-engine.d.ts.map +1 -0
  56. package/dist/mcp/lib/wizards/wizard-engine.js +356 -0
  57. package/dist/mcp/lib/wizards/wizard-engine.js.map +1 -0
  58. package/dist/mcp/server/index.d.ts +8 -0
  59. package/dist/mcp/server/index.d.ts.map +1 -0
  60. package/dist/mcp/server/index.js +202 -0
  61. package/dist/mcp/server/index.js.map +1 -0
  62. package/dist/mcp/server/stack-mcp-server.d.ts +92 -0
  63. package/dist/mcp/server/stack-mcp-server.d.ts.map +1 -0
  64. package/dist/mcp/server/stack-mcp-server.js +265 -0
  65. package/dist/mcp/server/stack-mcp-server.js.map +1 -0
  66. package/package.json +9 -7
  67. package/src/commands/__snapshots__/generate.test.ts.snap +57 -21
  68. package/src/commands/dev.test.ts +0 -1
  69. package/src/commands/generate.test.ts +18 -8
  70. package/src/commands/generate.ts +12 -0
  71. package/src/commands/mcp.ts +135 -0
  72. package/src/generator/__snapshots__/context.test.ts.snap +8 -8
  73. package/src/generator/__snapshots__/prisma.test.ts.snap +8 -16
  74. package/src/generator/__snapshots__/types.test.ts.snap +587 -9
  75. package/src/generator/context.test.ts +13 -8
  76. package/src/generator/context.ts +21 -3
  77. package/src/generator/index.ts +3 -0
  78. package/src/generator/lists.test.ts +335 -0
  79. package/src/generator/lists.ts +102 -0
  80. package/src/generator/plugin-types.ts +147 -0
  81. package/src/generator/prisma-config.ts +46 -0
  82. package/src/generator/prisma.test.ts +0 -10
  83. package/src/generator/prisma.ts +1 -2
  84. package/src/generator/types.test.ts +0 -12
  85. package/src/generator/types.ts +54 -1
  86. package/src/index.ts +4 -0
  87. package/src/mcp/lib/documentation-provider.ts +203 -0
  88. package/src/mcp/lib/features/catalog.ts +301 -0
  89. package/src/mcp/lib/generators/feature-generator.ts +598 -0
  90. package/src/mcp/lib/types.ts +89 -0
  91. package/src/mcp/lib/wizards/wizard-engine.ts +427 -0
  92. package/src/mcp/server/index.ts +240 -0
  93. package/src/mcp/server/stack-mcp-server.ts +301 -0
  94. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Wizard engine for multi-step feature implementation flows
3
+ */
4
+ import type { WizardSession } from '../types.js';
5
+ export declare class WizardEngine {
6
+ private sessions;
7
+ /**
8
+ * Start a new feature implementation wizard
9
+ */
10
+ startFeature(featureId: string): Promise<{
11
+ content: Array<{
12
+ type: string;
13
+ text: string;
14
+ }>;
15
+ }>;
16
+ /**
17
+ * Process an answer and move to next question or complete the wizard
18
+ */
19
+ answerQuestion(sessionId: string, answer: string | boolean | string[]): Promise<{
20
+ content: Array<{
21
+ type: string;
22
+ text: string;
23
+ }>;
24
+ }>;
25
+ /**
26
+ * Handle follow-up question answers
27
+ */
28
+ answerFollowUp(sessionId: string, answer: string): Promise<{
29
+ content: Array<{
30
+ type: string;
31
+ text: string;
32
+ }>;
33
+ }>;
34
+ /**
35
+ * Generate the complete feature implementation
36
+ */
37
+ private generateFeatureImplementation;
38
+ /**
39
+ * Create a new wizard session
40
+ */
41
+ private createSession;
42
+ /**
43
+ * Generate a unique session ID
44
+ */
45
+ private generateSessionId;
46
+ /**
47
+ * Render a question for the user
48
+ */
49
+ private renderQuestion;
50
+ /**
51
+ * Validate an answer against question requirements
52
+ */
53
+ private validateAnswer;
54
+ /**
55
+ * Render a progress bar
56
+ */
57
+ private renderProgressBar;
58
+ /**
59
+ * Format an answer for display
60
+ */
61
+ private formatAnswer;
62
+ /**
63
+ * Get session by ID (for debugging/testing)
64
+ */
65
+ getSession(sessionId: string): WizardSession | undefined;
66
+ /**
67
+ * Clear completed sessions (cleanup)
68
+ */
69
+ clearCompletedSessions(): void;
70
+ }
71
+ //# sourceMappingURL=wizard-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard-engine.d.ts","sourceRoot":"","sources":["../../../../src/mcp/lib/wizards/wizard-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAW,aAAa,EAAmC,MAAM,aAAa,CAAA;AAI1F,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAqB;IAErC;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7C,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAC/C,CAAC;IA4DF;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAClC,OAAO,CAAC;QACT,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAC/C,CAAC;IA2EF;;OAEG;IACG,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QACT,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAC/C,CAAC;IA4CF;;OAEG;YACW,6BAA6B;IA8E3C;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAwCtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIxD;;OAEG;IACH,sBAAsB,IAAI,IAAI;CAO/B"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Wizard engine for multi-step feature implementation flows
3
+ */
4
+ import { getFeature } from '../features/catalog.js';
5
+ import { FeatureGenerator } from '../generators/feature-generator.js';
6
+ export class WizardEngine {
7
+ sessions = {};
8
+ /**
9
+ * Start a new feature implementation wizard
10
+ */
11
+ async startFeature(featureId) {
12
+ const feature = getFeature(featureId);
13
+ if (!feature) {
14
+ return {
15
+ content: [
16
+ {
17
+ type: 'text',
18
+ text: `❌ Unknown feature: "${featureId}"\n\nAvailable features: authentication, blog, comments, file-upload, semantic-search`,
19
+ },
20
+ ],
21
+ };
22
+ }
23
+ const sessionId = this.generateSessionId();
24
+ const session = this.createSession(sessionId, feature);
25
+ this.sessions[sessionId] = session;
26
+ const progressBar = this.renderProgressBar(1, feature.questions.length);
27
+ const firstQuestion = this.renderQuestion(feature.questions[0], session, 1);
28
+ return {
29
+ content: [
30
+ {
31
+ type: 'text',
32
+ text: `🚀 **${feature.name} Implementation**
33
+
34
+ ${feature.description}
35
+
36
+ **What's included**:
37
+ ${feature.includes.map((item) => `- ${item}`).join('\n')}
38
+
39
+ ${feature.dependsOn && feature.dependsOn.length > 0 ? `\n⚠️ **Dependencies**: This feature requires: ${feature.dependsOn.join(', ')}\n` : ''}
40
+
41
+ ---
42
+
43
+ ## Let's configure this feature
44
+
45
+ ${firstQuestion}
46
+
47
+ ---
48
+
49
+ **Progress**: ${progressBar} 1/${feature.questions.length}
50
+ **Session ID**: \`${sessionId}\`
51
+
52
+ <details>
53
+ <summary>💡 **Instructions for Claude Code**</summary>
54
+
55
+ 1. Present this question to the user naturally in conversation
56
+ 2. When they respond, call \`opensaas_answer_feature\` with:
57
+ - sessionId: "${sessionId}"
58
+ - answer: <their response>
59
+ 3. Continue the conversation flow with the next question
60
+ 4. Keep it natural - don't mention session IDs to the user
61
+
62
+ </details>`,
63
+ },
64
+ ],
65
+ };
66
+ }
67
+ /**
68
+ * Process an answer and move to next question or complete the wizard
69
+ */
70
+ async answerQuestion(sessionId, answer) {
71
+ const session = this.sessions[sessionId];
72
+ if (!session) {
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: `❌ Session not found: ${sessionId}\n\nPlease start a new feature implementation.`,
78
+ },
79
+ ],
80
+ };
81
+ }
82
+ const currentQ = session.feature.questions[session.currentQuestionIndex];
83
+ // Validate answer
84
+ const validation = this.validateAnswer(answer, currentQ);
85
+ if (!validation.valid) {
86
+ return {
87
+ content: [
88
+ {
89
+ type: 'text',
90
+ text: `❌ **Invalid answer**: ${validation.message}\n\n${this.renderQuestion(currentQ, session, session.currentQuestionIndex + 1)}`,
91
+ },
92
+ ],
93
+ };
94
+ }
95
+ // Store answer
96
+ session.answers[currentQ.id] = answer;
97
+ session.updatedAt = new Date();
98
+ // Check for follow-up questions
99
+ if (currentQ.followUp) {
100
+ const shouldAskFollowUp = currentQ.followUp.if === answer ||
101
+ (typeof currentQ.followUp.if === 'boolean' && currentQ.followUp.if === answer);
102
+ if (shouldAskFollowUp) {
103
+ const followUpText = `**Follow-up**: ${currentQ.followUp.ask}`;
104
+ return {
105
+ content: [
106
+ {
107
+ type: 'text',
108
+ text: `✓ Recorded: ${this.formatAnswer(answer)}\n\n${followUpText}\n\n---\n\n💡 **Claude Code**: Ask this follow-up question and call \`opensaas_answer_followup\` with sessionId "${sessionId}" and their response.`,
109
+ },
110
+ ],
111
+ };
112
+ }
113
+ }
114
+ // Move to next question
115
+ session.currentQuestionIndex++;
116
+ // Check if complete
117
+ if (session.currentQuestionIndex >= session.feature.questions.length) {
118
+ session.isComplete = true;
119
+ return this.generateFeatureImplementation(session);
120
+ }
121
+ // Render next question
122
+ const nextQ = session.feature.questions[session.currentQuestionIndex];
123
+ const questionNum = session.currentQuestionIndex + 1;
124
+ const progressBar = this.renderProgressBar(questionNum, session.feature.questions.length);
125
+ return {
126
+ content: [
127
+ {
128
+ type: 'text',
129
+ text: `✓ Recorded: ${this.formatAnswer(answer)}\n\n${this.renderQuestion(nextQ, session, questionNum)}\n\n---\n\n**Progress**: ${progressBar} ${questionNum}/${session.feature.questions.length}`,
130
+ },
131
+ ],
132
+ };
133
+ }
134
+ /**
135
+ * Handle follow-up question answers
136
+ */
137
+ async answerFollowUp(sessionId, answer) {
138
+ const session = this.sessions[sessionId];
139
+ if (!session) {
140
+ return {
141
+ content: [
142
+ {
143
+ type: 'text',
144
+ text: `❌ Session not found: ${sessionId}`,
145
+ },
146
+ ],
147
+ };
148
+ }
149
+ const currentQ = session.feature.questions[session.currentQuestionIndex];
150
+ const followUpKey = `${currentQ.id}_followup`;
151
+ // Store follow-up answer
152
+ session.followUpAnswers[followUpKey] = answer;
153
+ session.updatedAt = new Date();
154
+ // Move to next question
155
+ session.currentQuestionIndex++;
156
+ // Check if complete
157
+ if (session.currentQuestionIndex >= session.feature.questions.length) {
158
+ session.isComplete = true;
159
+ return this.generateFeatureImplementation(session);
160
+ }
161
+ // Render next question
162
+ const nextQ = session.feature.questions[session.currentQuestionIndex];
163
+ const questionNum = session.currentQuestionIndex + 1;
164
+ const progressBar = this.renderProgressBar(questionNum, session.feature.questions.length);
165
+ return {
166
+ content: [
167
+ {
168
+ type: 'text',
169
+ text: `✓ Recorded: ${answer}\n\n${this.renderQuestion(nextQ, session, questionNum)}\n\n---\n\n**Progress**: ${progressBar} ${questionNum}/${session.feature.questions.length}`,
170
+ },
171
+ ],
172
+ };
173
+ }
174
+ /**
175
+ * Generate the complete feature implementation
176
+ */
177
+ async generateFeatureImplementation(session) {
178
+ const generator = new FeatureGenerator(session.feature, session.answers, session.followUpAnswers);
179
+ const implementation = generator.generate();
180
+ return {
181
+ content: [
182
+ {
183
+ type: 'text',
184
+ text: `✅ **${session.feature.name} Implementation Complete!**
185
+
186
+ ---
187
+
188
+ ## 📝 Update \`opensaas.config.ts\`
189
+
190
+ \`\`\`typescript
191
+ ${implementation.configUpdates}
192
+ \`\`\`
193
+
194
+ ---
195
+
196
+ ## 📁 Create these files:
197
+
198
+ ${implementation.files.map((file) => `### ${file.path}\n*${file.description}*\n\n\`\`\`${file.language}\n${file.content}\n\`\`\``).join('\n\n')}
199
+
200
+ ---
201
+
202
+ ${implementation.envVars && Object.keys(implementation.envVars).length > 0
203
+ ? `## 🔐 Environment Variables\n\nAdd these to your \`.env\` file:\n\n\`\`\`bash\n${Object.entries(implementation.envVars)
204
+ .map(([key, value]) => `${key}=${value}`)
205
+ .join('\n')}\n\`\`\`\n\n---\n\n`
206
+ : ''}
207
+
208
+ ## 🚀 Next Steps
209
+
210
+ ${implementation.nextSteps.map((step, i) => `${i + 1}. ${step}`).join('\n')}
211
+
212
+ ---
213
+
214
+ ## 📖 Feature Documentation
215
+
216
+ Add this to your project's \`DEVELOPMENT.md\`:
217
+
218
+ \`\`\`markdown
219
+ ${implementation.devGuideSection}
220
+ \`\`\`
221
+
222
+ ---
223
+
224
+ 🎉 **Your ${session.feature.name} feature is ready to use!**
225
+
226
+ <details>
227
+ <summary>💡 **Troubleshooting**</summary>
228
+
229
+ If you encounter issues:
230
+ 1. Ensure all dependencies are installed: \`pnpm install\`
231
+ 2. Check that environment variables are set correctly
232
+ 3. Run \`pnpm generate\` to update Prisma schema
233
+ 4. Run \`pnpm db:push\` to update database
234
+
235
+ For more help, see the docs at https://stack.opensaas.au/
236
+
237
+ </details>`,
238
+ },
239
+ ],
240
+ };
241
+ }
242
+ /**
243
+ * Create a new wizard session
244
+ */
245
+ createSession(sessionId, feature) {
246
+ return {
247
+ id: sessionId,
248
+ featureId: feature.id,
249
+ feature,
250
+ currentQuestionIndex: 0,
251
+ answers: {},
252
+ followUpAnswers: {},
253
+ isComplete: false,
254
+ createdAt: new Date(),
255
+ updatedAt: new Date(),
256
+ };
257
+ }
258
+ /**
259
+ * Generate a unique session ID
260
+ */
261
+ generateSessionId() {
262
+ return `session_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
263
+ }
264
+ /**
265
+ * Render a question for the user
266
+ */
267
+ renderQuestion(question, session, questionNum) {
268
+ let rendered = `**Question ${questionNum}**: ${question.text}\n\n`;
269
+ if (question.type === 'select' || question.type === 'multiselect') {
270
+ rendered += question.options.map((opt) => `- ${opt}`).join('\n');
271
+ if (question.type === 'multiselect') {
272
+ rendered += '\n\n*You can select multiple options (comma-separated)*';
273
+ }
274
+ }
275
+ else if (question.type === 'boolean') {
276
+ rendered += '*Answer: yes or no*';
277
+ }
278
+ else if (question.type === 'textarea') {
279
+ rendered += '*Provide a detailed response*';
280
+ }
281
+ if (question.defaultValue !== undefined) {
282
+ rendered += `\n\n*Default: ${this.formatAnswer(question.defaultValue)}*`;
283
+ }
284
+ return rendered;
285
+ }
286
+ /**
287
+ * Validate an answer against question requirements
288
+ */
289
+ validateAnswer(answer, question) {
290
+ if (question.required && !answer) {
291
+ return { valid: false, message: 'This question is required' };
292
+ }
293
+ if (question.type === 'boolean' && typeof answer !== 'boolean') {
294
+ return {
295
+ valid: false,
296
+ message: 'Please answer with yes/no or true/false',
297
+ };
298
+ }
299
+ if (question.type === 'select' &&
300
+ question.options &&
301
+ !question.options.includes(answer)) {
302
+ return {
303
+ valid: false,
304
+ message: `Please select one of: ${question.options.join(', ')}`,
305
+ };
306
+ }
307
+ if (question.type === 'multiselect' && question.options) {
308
+ const answers = Array.isArray(answer) ? answer : [answer];
309
+ const invalid = answers.filter((a) => typeof a === 'string' && !question.options.includes(a));
310
+ if (invalid.length > 0) {
311
+ return {
312
+ valid: false,
313
+ message: `Invalid options: ${invalid.join(', ')}. Valid options: ${question.options.join(', ')}`,
314
+ };
315
+ }
316
+ }
317
+ return { valid: true };
318
+ }
319
+ /**
320
+ * Render a progress bar
321
+ */
322
+ renderProgressBar(current, total) {
323
+ const filled = Math.round((current / total) * 10);
324
+ const empty = 10 - filled;
325
+ return '▓'.repeat(filled) + '░'.repeat(empty);
326
+ }
327
+ /**
328
+ * Format an answer for display
329
+ */
330
+ formatAnswer(answer) {
331
+ if (typeof answer === 'boolean') {
332
+ return answer ? 'Yes' : 'No';
333
+ }
334
+ if (Array.isArray(answer)) {
335
+ return answer.join(', ');
336
+ }
337
+ return answer;
338
+ }
339
+ /**
340
+ * Get session by ID (for debugging/testing)
341
+ */
342
+ getSession(sessionId) {
343
+ return this.sessions[sessionId];
344
+ }
345
+ /**
346
+ * Clear completed sessions (cleanup)
347
+ */
348
+ clearCompletedSessions() {
349
+ Object.keys(this.sessions).forEach((id) => {
350
+ if (this.sessions[id].isComplete) {
351
+ delete this.sessions[id];
352
+ }
353
+ });
354
+ }
355
+ }
356
+ //# sourceMappingURL=wizard-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard-engine.js","sourceRoot":"","sources":["../../../../src/mcp/lib/wizards/wizard-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * OpenSaaS Stack MCP Server - Main entry point
3
+ */
4
+ /**
5
+ * Create and start the MCP server
6
+ */
7
+ export declare function startMCPServer(): Promise<void>;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqIH;;GAEG;AACH,wBAAsB,cAAc,kBA6FnC"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * OpenSaaS Stack MCP Server - Main entry point
3
+ */
4
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
5
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
+ import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
7
+ import { StackMCPServer } from './stack-mcp-server.js';
8
+ // Tool definitions
9
+ const TOOLS = [
10
+ {
11
+ name: 'opensaas_implement_feature',
12
+ description: 'Start an interactive wizard to implement a complete feature (authentication, blog, comments, file-upload, semantic-search, or custom). Returns step-by-step guidance.',
13
+ inputSchema: {
14
+ type: 'object',
15
+ properties: {
16
+ feature: {
17
+ type: 'string',
18
+ description: 'Feature to implement: "authentication", "blog", "comments", "file-upload", "semantic-search", or "custom"',
19
+ enum: ['authentication', 'blog', 'comments', 'file-upload', 'semantic-search', 'custom'],
20
+ },
21
+ description: {
22
+ type: 'string',
23
+ description: 'Required if feature is "custom" - describe what you want to build',
24
+ },
25
+ },
26
+ required: ['feature'],
27
+ },
28
+ },
29
+ {
30
+ name: 'opensaas_answer_feature',
31
+ description: 'Answer a question in the feature implementation wizard. Use this after opensaas_implement_feature to progress through the wizard.',
32
+ inputSchema: {
33
+ type: 'object',
34
+ properties: {
35
+ sessionId: {
36
+ type: 'string',
37
+ description: 'Session ID from the wizard',
38
+ },
39
+ answer: {
40
+ description: 'Your answer to the current question',
41
+ oneOf: [
42
+ { type: 'string' },
43
+ { type: 'boolean' },
44
+ { type: 'array', items: { type: 'string' } },
45
+ ],
46
+ },
47
+ },
48
+ required: ['sessionId', 'answer'],
49
+ },
50
+ },
51
+ {
52
+ name: 'opensaas_answer_followup',
53
+ description: 'Answer a follow-up question in the wizard flow',
54
+ inputSchema: {
55
+ type: 'object',
56
+ properties: {
57
+ sessionId: {
58
+ type: 'string',
59
+ description: 'Session ID from the wizard',
60
+ },
61
+ answer: {
62
+ type: 'string',
63
+ description: 'Your answer to the follow-up question',
64
+ },
65
+ },
66
+ required: ['sessionId', 'answer'],
67
+ },
68
+ },
69
+ {
70
+ name: 'opensaas_feature_docs',
71
+ description: 'Search OpenSaaS Stack documentation for a specific topic. Returns relevant docs with code examples.',
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ topic: {
76
+ type: 'string',
77
+ description: 'Topic to search for (e.g., "access control", "field types", "hooks", "authentication")',
78
+ },
79
+ },
80
+ required: ['topic'],
81
+ },
82
+ },
83
+ {
84
+ name: 'opensaas_list_features',
85
+ description: 'List all available features that can be implemented with the wizard',
86
+ inputSchema: {
87
+ type: 'object',
88
+ properties: {},
89
+ },
90
+ },
91
+ {
92
+ name: 'opensaas_suggest_features',
93
+ description: 'Get feature suggestions based on what features are already implemented',
94
+ inputSchema: {
95
+ type: 'object',
96
+ properties: {
97
+ currentFeatures: {
98
+ type: 'array',
99
+ items: { type: 'string' },
100
+ description: 'List of features already implemented (e.g., ["authentication", "blog"])',
101
+ },
102
+ },
103
+ },
104
+ },
105
+ {
106
+ name: 'opensaas_validate_feature',
107
+ description: 'Validate that a feature is properly implemented according to best practices',
108
+ inputSchema: {
109
+ type: 'object',
110
+ properties: {
111
+ feature: {
112
+ type: 'string',
113
+ description: 'Feature to validate (e.g., "authentication")',
114
+ },
115
+ configPath: {
116
+ type: 'string',
117
+ description: 'Path to opensaas.config.ts (optional)',
118
+ },
119
+ },
120
+ required: ['feature'],
121
+ },
122
+ },
123
+ ];
124
+ /**
125
+ * Create and start the MCP server
126
+ */
127
+ export async function startMCPServer() {
128
+ const server = new Server({
129
+ name: 'opensaas-stack-mcp',
130
+ version: '0.1.0',
131
+ }, {
132
+ capabilities: {
133
+ tools: {},
134
+ },
135
+ });
136
+ const stackServer = new StackMCPServer();
137
+ // Register tool list handler
138
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
139
+ return { tools: TOOLS };
140
+ });
141
+ // Register tool call handler
142
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
143
+ const { name, arguments: args } = request.params;
144
+ try {
145
+ switch (name) {
146
+ case 'opensaas_implement_feature':
147
+ return await stackServer.implementFeature(args);
148
+ case 'opensaas_answer_feature':
149
+ return await stackServer.answerFeatureQuestion(args);
150
+ case 'opensaas_answer_followup':
151
+ return await stackServer.answerFollowUpQuestion(args);
152
+ case 'opensaas_feature_docs':
153
+ return await stackServer.searchFeatureDocs(args);
154
+ case 'opensaas_list_features':
155
+ return await stackServer.listFeatures();
156
+ case 'opensaas_suggest_features':
157
+ return await stackServer.suggestFeatures(args);
158
+ case 'opensaas_validate_feature':
159
+ return await stackServer.validateFeature(args);
160
+ default:
161
+ return {
162
+ content: [
163
+ {
164
+ type: 'text',
165
+ text: `Unknown tool: ${name}`,
166
+ },
167
+ ],
168
+ isError: true,
169
+ };
170
+ }
171
+ }
172
+ catch (error) {
173
+ const errorMessage = error instanceof Error ? error.message : String(error);
174
+ console.error(`Error executing tool ${name}:`, error);
175
+ return {
176
+ content: [
177
+ {
178
+ type: 'text',
179
+ text: `Error: ${errorMessage}`,
180
+ },
181
+ ],
182
+ isError: true,
183
+ };
184
+ }
185
+ });
186
+ // Periodic cleanup
187
+ setInterval(() => {
188
+ stackServer.cleanup();
189
+ }, 1000 * 60 * 15); // Every 15 minutes
190
+ // Start server
191
+ const transport = new StdioServerTransport();
192
+ await server.connect(transport);
193
+ console.error('OpenSaaS Stack MCP server running on stdio');
194
+ }
195
+ // Start if run directly
196
+ if (import.meta.url === `file://${process.argv[1]}`) {
197
+ startMCPServer().catch((error) => {
198
+ console.error('Failed to start MCP server:', error);
199
+ process.exit(1);
200
+ });
201
+ }
202
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/server/index.ts"],"names":[],"mappings":"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"}