@opensaas/stack-cli 0.4.0 → 0.6.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 (90) hide show
  1. package/README.md +76 -0
  2. package/dist/commands/migrate.d.ts +9 -0
  3. package/dist/commands/migrate.d.ts.map +1 -0
  4. package/dist/commands/migrate.js +299 -0
  5. package/dist/commands/migrate.js.map +1 -0
  6. package/dist/index.js +3 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/mcp/lib/documentation-provider.d.ts +23 -0
  9. package/dist/mcp/lib/documentation-provider.d.ts.map +1 -1
  10. package/dist/mcp/lib/documentation-provider.js +471 -0
  11. package/dist/mcp/lib/documentation-provider.js.map +1 -1
  12. package/dist/mcp/lib/wizards/migration-wizard.d.ts +80 -0
  13. package/dist/mcp/lib/wizards/migration-wizard.d.ts.map +1 -0
  14. package/dist/mcp/lib/wizards/migration-wizard.js +499 -0
  15. package/dist/mcp/lib/wizards/migration-wizard.js.map +1 -0
  16. package/dist/mcp/server/index.d.ts.map +1 -1
  17. package/dist/mcp/server/index.js +103 -0
  18. package/dist/mcp/server/index.js.map +1 -1
  19. package/dist/mcp/server/stack-mcp-server.d.ts +85 -0
  20. package/dist/mcp/server/stack-mcp-server.d.ts.map +1 -1
  21. package/dist/mcp/server/stack-mcp-server.js +219 -0
  22. package/dist/mcp/server/stack-mcp-server.js.map +1 -1
  23. package/dist/migration/generators/migration-generator.d.ts +60 -0
  24. package/dist/migration/generators/migration-generator.d.ts.map +1 -0
  25. package/dist/migration/generators/migration-generator.js +510 -0
  26. package/dist/migration/generators/migration-generator.js.map +1 -0
  27. package/dist/migration/introspectors/index.d.ts +12 -0
  28. package/dist/migration/introspectors/index.d.ts.map +1 -0
  29. package/dist/migration/introspectors/index.js +10 -0
  30. package/dist/migration/introspectors/index.js.map +1 -0
  31. package/dist/migration/introspectors/keystone-introspector.d.ts +59 -0
  32. package/dist/migration/introspectors/keystone-introspector.d.ts.map +1 -0
  33. package/dist/migration/introspectors/keystone-introspector.js +229 -0
  34. package/dist/migration/introspectors/keystone-introspector.js.map +1 -0
  35. package/dist/migration/introspectors/nextjs-introspector.d.ts +59 -0
  36. package/dist/migration/introspectors/nextjs-introspector.d.ts.map +1 -0
  37. package/dist/migration/introspectors/nextjs-introspector.js +159 -0
  38. package/dist/migration/introspectors/nextjs-introspector.js.map +1 -0
  39. package/dist/migration/introspectors/prisma-introspector.d.ts +45 -0
  40. package/dist/migration/introspectors/prisma-introspector.d.ts.map +1 -0
  41. package/dist/migration/introspectors/prisma-introspector.js +190 -0
  42. package/dist/migration/introspectors/prisma-introspector.js.map +1 -0
  43. package/dist/migration/types.d.ts +86 -0
  44. package/dist/migration/types.d.ts.map +1 -0
  45. package/dist/migration/types.js +5 -0
  46. package/dist/migration/types.js.map +1 -0
  47. package/package.json +10 -2
  48. package/plugin/.claude-plugin/plugin.json +15 -0
  49. package/plugin/README.md +112 -0
  50. package/plugin/agents/migration-assistant.md +150 -0
  51. package/plugin/commands/analyze-schema.md +34 -0
  52. package/plugin/commands/generate-config.md +33 -0
  53. package/plugin/commands/validate-migration.md +34 -0
  54. package/plugin/skills/opensaas-migration/SKILL.md +192 -0
  55. package/.turbo/turbo-build.log +0 -4
  56. package/CHANGELOG.md +0 -410
  57. package/CLAUDE.md +0 -298
  58. package/src/commands/__snapshots__/generate.test.ts.snap +0 -413
  59. package/src/commands/dev.test.ts +0 -215
  60. package/src/commands/dev.ts +0 -48
  61. package/src/commands/generate.test.ts +0 -282
  62. package/src/commands/generate.ts +0 -182
  63. package/src/commands/init.ts +0 -34
  64. package/src/commands/mcp.ts +0 -135
  65. package/src/generator/__snapshots__/context.test.ts.snap +0 -361
  66. package/src/generator/__snapshots__/prisma.test.ts.snap +0 -174
  67. package/src/generator/__snapshots__/types.test.ts.snap +0 -1702
  68. package/src/generator/context.test.ts +0 -139
  69. package/src/generator/context.ts +0 -227
  70. package/src/generator/index.ts +0 -7
  71. package/src/generator/lists.test.ts +0 -335
  72. package/src/generator/lists.ts +0 -140
  73. package/src/generator/plugin-types.ts +0 -147
  74. package/src/generator/prisma-config.ts +0 -46
  75. package/src/generator/prisma-extensions.ts +0 -159
  76. package/src/generator/prisma.test.ts +0 -211
  77. package/src/generator/prisma.ts +0 -161
  78. package/src/generator/types.test.ts +0 -268
  79. package/src/generator/types.ts +0 -537
  80. package/src/index.ts +0 -42
  81. package/src/mcp/lib/documentation-provider.ts +0 -203
  82. package/src/mcp/lib/features/catalog.ts +0 -301
  83. package/src/mcp/lib/generators/feature-generator.ts +0 -598
  84. package/src/mcp/lib/types.ts +0 -89
  85. package/src/mcp/lib/wizards/wizard-engine.ts +0 -427
  86. package/src/mcp/server/index.ts +0 -240
  87. package/src/mcp/server/stack-mcp-server.ts +0 -301
  88. package/tsconfig.json +0 -13
  89. package/tsconfig.tsbuildinfo +0 -1
  90. package/vitest.config.ts +0 -26
@@ -0,0 +1,499 @@
1
+ /**
2
+ * Migration Wizard - Interactive guide for migrating to OpenSaaS Stack
3
+ */
4
+ import { MigrationGenerator } from '../../../migration/generators/migration-generator.js';
5
+ export class MigrationWizard {
6
+ sessions = {};
7
+ generator;
8
+ constructor() {
9
+ this.generator = new MigrationGenerator();
10
+ }
11
+ /**
12
+ * Start a new migration wizard session
13
+ */
14
+ async startMigration(projectType, analysis) {
15
+ const sessionId = this.generateSessionId();
16
+ // Generate questions based on project type and analysis
17
+ const questions = this.generateQuestions(projectType, analysis);
18
+ const session = {
19
+ id: sessionId,
20
+ projectType,
21
+ analysis: {
22
+ projectTypes: [projectType],
23
+ cwd: process.cwd(),
24
+ models: analysis?.models?.map((m) => ({
25
+ name: m.name,
26
+ fieldCount: m.fields.length,
27
+ })),
28
+ provider: analysis?.provider,
29
+ },
30
+ currentQuestionIndex: 0,
31
+ answers: {},
32
+ isComplete: false,
33
+ createdAt: new Date(),
34
+ updatedAt: new Date(),
35
+ questions,
36
+ };
37
+ this.sessions[sessionId] = session;
38
+ const totalQuestions = questions.length;
39
+ const firstQuestion = questions[0];
40
+ const progressBar = this.renderProgressBar(1, totalQuestions);
41
+ return {
42
+ content: [
43
+ {
44
+ type: 'text',
45
+ text: `# 🚀 OpenSaaS Stack Migration Wizard
46
+
47
+ ## Project Analysis
48
+
49
+ - **Project Type:** ${projectType}
50
+ - **Models:** ${analysis?.models?.length || 0}
51
+ - **Database:** ${analysis?.provider || 'Not detected'}
52
+
53
+ ---
54
+
55
+ ## Let's Configure Your Migration
56
+
57
+ ${this.renderQuestion(firstQuestion, 1, totalQuestions)}
58
+
59
+ ---
60
+
61
+ **Progress:** ${progressBar} 1/${totalQuestions}
62
+
63
+ <details>
64
+ <summary>💡 **Instructions for Claude**</summary>
65
+
66
+ 1. Present this question naturally to the user
67
+ 2. When they answer, call \`opensaas_answer_migration\` with:
68
+ - \`sessionId\`: "${sessionId}"
69
+ - \`answer\`: their response (string, boolean, or array)
70
+ 3. Continue until the wizard is complete
71
+ 4. Do NOT mention session IDs to the user
72
+
73
+ </details>`,
74
+ },
75
+ ],
76
+ };
77
+ }
78
+ /**
79
+ * Answer a wizard question
80
+ */
81
+ async answerQuestion(sessionId, answer) {
82
+ const session = this.sessions[sessionId];
83
+ if (!session) {
84
+ return {
85
+ content: [
86
+ {
87
+ type: 'text',
88
+ text: `❌ **Session not found:** ${sessionId}
89
+
90
+ Please start a new migration with \`opensaas_start_migration\`.`,
91
+ },
92
+ ],
93
+ };
94
+ }
95
+ const questions = session.questions;
96
+ const currentQuestion = questions[session.currentQuestionIndex];
97
+ // Validate answer
98
+ const validation = this.validateAnswer(answer, currentQuestion);
99
+ if (!validation.valid) {
100
+ return {
101
+ content: [
102
+ {
103
+ type: 'text',
104
+ text: `❌ **Invalid answer:** ${validation.message}
105
+
106
+ ${this.renderQuestion(currentQuestion, session.currentQuestionIndex + 1, questions.length)}`,
107
+ },
108
+ ],
109
+ };
110
+ }
111
+ // Normalize and store answer
112
+ let normalizedAnswer = answer;
113
+ if (currentQuestion.type === 'boolean') {
114
+ const boolValue = this.normalizeBoolean(answer);
115
+ if (boolValue !== null) {
116
+ normalizedAnswer = boolValue;
117
+ }
118
+ }
119
+ session.answers[currentQuestion.id] = normalizedAnswer;
120
+ session.updatedAt = new Date();
121
+ // Move to next question, skipping conditional questions
122
+ session.currentQuestionIndex++;
123
+ while (session.currentQuestionIndex < questions.length) {
124
+ const nextQ = questions[session.currentQuestionIndex];
125
+ // Skip if this question depends on a previous answer that doesn't match
126
+ if (nextQ.dependsOn &&
127
+ session.answers[nextQ.dependsOn.questionId] !== nextQ.dependsOn.value) {
128
+ session.currentQuestionIndex++;
129
+ }
130
+ else {
131
+ break;
132
+ }
133
+ }
134
+ // Check if complete
135
+ if (session.currentQuestionIndex >= questions.length) {
136
+ session.isComplete = true;
137
+ return this.generateMigrationConfig(session);
138
+ }
139
+ // Render next question
140
+ const nextQuestion = questions[session.currentQuestionIndex];
141
+ const questionNum = session.currentQuestionIndex + 1;
142
+ const progressBar = this.renderProgressBar(questionNum, questions.length);
143
+ return {
144
+ content: [
145
+ {
146
+ type: 'text',
147
+ text: `✅ **Recorded:** ${this.formatAnswer(normalizedAnswer)}
148
+
149
+ ---
150
+
151
+ ${this.renderQuestion(nextQuestion, questionNum, questions.length)}
152
+
153
+ ---
154
+
155
+ **Progress:** ${progressBar} ${questionNum}/${questions.length}`,
156
+ },
157
+ ],
158
+ };
159
+ }
160
+ /**
161
+ * Generate questions based on project type and analysis
162
+ */
163
+ generateQuestions(projectType, analysis) {
164
+ const questions = [];
165
+ // 1. Database configuration
166
+ questions.push({
167
+ id: 'preserve_database',
168
+ text: 'Do you want to keep your existing database?',
169
+ type: 'boolean',
170
+ defaultValue: true,
171
+ });
172
+ questions.push({
173
+ id: 'db_provider',
174
+ text: 'Which database provider are you using?',
175
+ type: 'select',
176
+ options: ['sqlite', 'postgresql', 'mysql'],
177
+ defaultValue: analysis?.provider || 'sqlite',
178
+ });
179
+ // 2. Authentication
180
+ questions.push({
181
+ id: 'enable_auth',
182
+ text: 'Do you want to add authentication?',
183
+ type: 'boolean',
184
+ defaultValue: this.hasAuthModels(analysis),
185
+ });
186
+ questions.push({
187
+ id: 'auth_methods',
188
+ text: 'Which authentication methods do you want?',
189
+ type: 'multiselect',
190
+ options: ['email-password', 'google', 'github', 'magic-link'],
191
+ defaultValue: ['email-password'],
192
+ dependsOn: {
193
+ questionId: 'enable_auth',
194
+ value: true,
195
+ },
196
+ });
197
+ // 3. Access control strategy
198
+ questions.push({
199
+ id: 'default_access',
200
+ text: 'What should be the default access control strategy?',
201
+ type: 'select',
202
+ options: ['public-read-auth-write', 'authenticated-only', 'owner-only', 'admin-only'],
203
+ defaultValue: 'public-read-auth-write',
204
+ });
205
+ // 4. Per-model configuration (if models detected)
206
+ if (analysis?.models && analysis.models.length > 0) {
207
+ // Ask about special models
208
+ const modelNames = analysis.models.map((m) => m.name);
209
+ if (modelNames.some((n) => ['User', 'Account', 'Session'].includes(n))) {
210
+ questions.push({
211
+ id: 'skip_auth_models',
212
+ text: "We detected User/Account/Session models. Should we skip these (they'll be managed by the auth plugin)?",
213
+ type: 'boolean',
214
+ defaultValue: true,
215
+ });
216
+ }
217
+ // Ask about models that need special access control
218
+ const nonAuthModels = modelNames.filter((n) => !['User', 'Account', 'Session', 'Verification'].includes(n));
219
+ if (nonAuthModels.length > 0) {
220
+ questions.push({
221
+ id: 'models_with_owner',
222
+ text: `Which models should have owner-based access control? (User can only access their own)`,
223
+ type: 'multiselect',
224
+ options: nonAuthModels,
225
+ defaultValue: this.guessOwnerModels(analysis.models, nonAuthModels),
226
+ });
227
+ }
228
+ }
229
+ // 5. Admin UI
230
+ questions.push({
231
+ id: 'admin_base_path',
232
+ text: 'What base path should the admin UI use?',
233
+ type: 'text',
234
+ defaultValue: '/admin',
235
+ });
236
+ // 6. Additional features
237
+ questions.push({
238
+ id: 'additional_features',
239
+ text: 'Do you want to add any additional features?',
240
+ type: 'multiselect',
241
+ options: ['file-storage', 'semantic-search', 'audit-logging'],
242
+ defaultValue: [],
243
+ });
244
+ // 7. Final confirmation
245
+ questions.push({
246
+ id: 'confirm',
247
+ text: 'Ready to generate your opensaas.config.ts?',
248
+ type: 'boolean',
249
+ defaultValue: true,
250
+ });
251
+ return questions;
252
+ }
253
+ /**
254
+ * Generate the final migration config
255
+ */
256
+ async generateMigrationConfig(session) {
257
+ try {
258
+ const output = await this.generator.generate(session);
259
+ // Clean up session
260
+ delete this.sessions[session.id];
261
+ return {
262
+ content: [
263
+ {
264
+ type: 'text',
265
+ text: `# ✅ Migration Complete!
266
+
267
+ ## Generated opensaas.config.ts
268
+
269
+ \`\`\`typescript
270
+ ${output.configContent}
271
+ \`\`\`
272
+
273
+ ---
274
+
275
+ ## Install Dependencies
276
+
277
+ \`\`\`bash
278
+ ${output.dependencies.map((d) => `pnpm add ${d}`).join('\n')}
279
+ \`\`\`
280
+
281
+ ---
282
+
283
+ ${output.files.length > 0
284
+ ? `## Additional Files
285
+
286
+ ${output.files
287
+ .map((f) => `### ${f.path}
288
+
289
+ *${f.description}*
290
+
291
+ \`\`\`${f.language}
292
+ ${f.content}
293
+ \`\`\``)
294
+ .join('\n\n')}
295
+
296
+ ---
297
+
298
+ `
299
+ : ''}
300
+
301
+ ${output.warnings.length > 0
302
+ ? `## ⚠️ Warnings
303
+
304
+ ${output.warnings.map((w) => `- ${w}`).join('\n')}
305
+
306
+ ---
307
+
308
+ `
309
+ : ''}
310
+
311
+ ## Next Steps
312
+
313
+ ${output.steps.map((step, i) => `${i + 1}. ${step}`).join('\n')}
314
+
315
+ ---
316
+
317
+ 🎉 **Your migration is ready!**
318
+
319
+ The generated config creates an OpenSaaS Stack application that matches your existing schema.
320
+
321
+ 📚 **Documentation:** https://stack.opensaas.au/`,
322
+ },
323
+ ],
324
+ };
325
+ }
326
+ catch (error) {
327
+ const message = error instanceof Error ? error.message : String(error);
328
+ return {
329
+ content: [
330
+ {
331
+ type: 'text',
332
+ text: `❌ **Failed to generate config:** ${message}
333
+
334
+ Please try again or create the config manually.
335
+
336
+ 📚 See: https://stack.opensaas.au/guides/migration`,
337
+ },
338
+ ],
339
+ };
340
+ }
341
+ }
342
+ /**
343
+ * Check if analysis includes auth-related models
344
+ */
345
+ hasAuthModels(analysis) {
346
+ if (!analysis?.models)
347
+ return false;
348
+ const authModelNames = ['User', 'Account', 'Session'];
349
+ return analysis.models.some((m) => authModelNames.includes(m.name));
350
+ }
351
+ /**
352
+ * Guess which models should have owner-based access
353
+ */
354
+ guessOwnerModels(models, modelNames) {
355
+ const ownerModels = [];
356
+ for (const name of modelNames) {
357
+ const model = models.find((m) => m.name === name);
358
+ if (!model)
359
+ continue;
360
+ // Check if model has a relationship to User
361
+ const hasUserRelation = model.fields.some((f) => f.relation &&
362
+ (f.relation.model === 'User' ||
363
+ f.name.toLowerCase().includes('author') ||
364
+ f.name.toLowerCase().includes('owner')));
365
+ if (hasUserRelation) {
366
+ ownerModels.push(name);
367
+ }
368
+ }
369
+ return ownerModels;
370
+ }
371
+ /**
372
+ * Render a question for display
373
+ */
374
+ renderQuestion(question, questionNum, totalQuestions) {
375
+ let rendered = `### Question ${questionNum}/${totalQuestions}\n\n**${question.text}**\n\n`;
376
+ if (question.type === 'select') {
377
+ rendered += question.options.map((opt) => `- \`${opt}\``).join('\n');
378
+ }
379
+ else if (question.type === 'multiselect') {
380
+ rendered += question.options.map((opt) => `- \`${opt}\``).join('\n');
381
+ rendered += '\n\n*Select multiple (comma-separated) or empty for none*';
382
+ }
383
+ else if (question.type === 'boolean') {
384
+ rendered += '*Answer: yes or no*';
385
+ }
386
+ else if (question.type === 'text') {
387
+ rendered += '*Enter your response*';
388
+ }
389
+ if (question.defaultValue !== undefined) {
390
+ rendered += `\n\n*Default: ${this.formatAnswer(question.defaultValue)}*`;
391
+ }
392
+ return rendered;
393
+ }
394
+ /**
395
+ * Validate an answer
396
+ */
397
+ validateAnswer(answer, question) {
398
+ if (question.required && !answer) {
399
+ return { valid: false, message: 'This question requires an answer.' };
400
+ }
401
+ if (question.type === 'boolean') {
402
+ const normalized = this.normalizeBoolean(answer);
403
+ if (normalized === null) {
404
+ return { valid: false, message: 'Please answer with yes/no or true/false.' };
405
+ }
406
+ }
407
+ if (question.type === 'select' && question.options) {
408
+ if (!question.options.includes(answer)) {
409
+ return {
410
+ valid: false,
411
+ message: `Please select one of: ${question.options.join(', ')}`,
412
+ };
413
+ }
414
+ }
415
+ if (question.type === 'multiselect' && question.options) {
416
+ const answers = Array.isArray(answer)
417
+ ? answer
418
+ : answer
419
+ .split(',')
420
+ .map((a) => a.trim())
421
+ .filter(Boolean);
422
+ const invalid = answers.filter((a) => !question.options.includes(a));
423
+ if (invalid.length > 0) {
424
+ return {
425
+ valid: false,
426
+ message: `Invalid options: ${invalid.join(', ')}. Valid: ${question.options.join(', ')}`,
427
+ };
428
+ }
429
+ }
430
+ return { valid: true };
431
+ }
432
+ /**
433
+ * Normalize boolean answer
434
+ */
435
+ normalizeBoolean(answer) {
436
+ if (typeof answer === 'boolean')
437
+ return answer;
438
+ if (typeof answer !== 'string')
439
+ return null;
440
+ const lower = answer.toLowerCase().trim();
441
+ if (['yes', 'y', 'true', '1'].includes(lower))
442
+ return true;
443
+ if (['no', 'n', 'false', '0'].includes(lower))
444
+ return false;
445
+ return null;
446
+ }
447
+ /**
448
+ * Format an answer for display
449
+ */
450
+ formatAnswer(answer) {
451
+ if (typeof answer === 'boolean')
452
+ return answer ? 'Yes' : 'No';
453
+ if (Array.isArray(answer))
454
+ return answer.length > 0 ? answer.join(', ') : '(none)';
455
+ return String(answer);
456
+ }
457
+ /**
458
+ * Generate a unique session ID
459
+ */
460
+ generateSessionId() {
461
+ return `migration_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
462
+ }
463
+ /**
464
+ * Render a progress bar
465
+ */
466
+ renderProgressBar(current, total) {
467
+ const filled = Math.round((current / total) * 10);
468
+ const empty = 10 - filled;
469
+ return '▓'.repeat(filled) + '░'.repeat(empty);
470
+ }
471
+ /**
472
+ * Get a session by ID (for testing/debugging)
473
+ */
474
+ getSession(sessionId) {
475
+ return this.sessions[sessionId];
476
+ }
477
+ /**
478
+ * Clear completed sessions
479
+ */
480
+ clearCompletedSessions() {
481
+ Object.keys(this.sessions).forEach((id) => {
482
+ if (this.sessions[id].isComplete) {
483
+ delete this.sessions[id];
484
+ }
485
+ });
486
+ }
487
+ /**
488
+ * Clear old sessions (older than 1 hour)
489
+ */
490
+ clearOldSessions() {
491
+ const oneHourAgo = Date.now() - 60 * 60 * 1000;
492
+ Object.keys(this.sessions).forEach((id) => {
493
+ if (this.sessions[id].createdAt.getTime() < oneHourAgo) {
494
+ delete this.sessions[id];
495
+ }
496
+ });
497
+ }
498
+ }
499
+ //# sourceMappingURL=migration-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-wizard.js","sourceRoot":"","sources":["../../../../src/mcp/lib/wizards/migration-wizard.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwOH;;GAEG;AACH,wBAAsB,cAAc,kBAmHnC"}
@@ -120,6 +120,97 @@ const TOOLS = [
120
120
  required: ['feature'],
121
121
  },
122
122
  },
123
+ {
124
+ name: 'opensaas_start_migration',
125
+ description: 'Start the migration wizard for an existing project. Returns the first question to begin the migration process.',
126
+ inputSchema: {
127
+ type: 'object',
128
+ properties: {
129
+ projectType: {
130
+ type: 'string',
131
+ description: 'Type of project being migrated',
132
+ enum: ['prisma', 'keystone', 'nextjs'],
133
+ },
134
+ },
135
+ required: ['projectType'],
136
+ },
137
+ },
138
+ {
139
+ name: 'opensaas_answer_migration',
140
+ description: 'Answer a question in the migration wizard. Use this after opensaas_start_migration to progress through the migration.',
141
+ inputSchema: {
142
+ type: 'object',
143
+ properties: {
144
+ sessionId: {
145
+ type: 'string',
146
+ description: 'Migration session ID from the wizard',
147
+ },
148
+ answer: {
149
+ description: 'Answer to the current question',
150
+ oneOf: [
151
+ { type: 'string' },
152
+ { type: 'boolean' },
153
+ { type: 'array', items: { type: 'string' } },
154
+ ],
155
+ },
156
+ },
157
+ required: ['sessionId', 'answer'],
158
+ },
159
+ },
160
+ {
161
+ name: 'opensaas_introspect_prisma',
162
+ description: 'Analyze a Prisma schema file and return detailed information about models, fields, and relationships. This helps you understand your existing schema before migration.',
163
+ inputSchema: {
164
+ type: 'object',
165
+ properties: {
166
+ schemaPath: {
167
+ type: 'string',
168
+ description: 'Path to schema.prisma (defaults to prisma/schema.prisma)',
169
+ },
170
+ },
171
+ },
172
+ },
173
+ {
174
+ name: 'opensaas_introspect_keystone',
175
+ description: 'Analyze a KeystoneJS config file and return information about lists and fields. This helps you understand your existing schema before migration.',
176
+ inputSchema: {
177
+ type: 'object',
178
+ properties: {
179
+ configPath: {
180
+ type: 'string',
181
+ description: 'Path to keystone.config.ts (defaults to keystone.config.ts)',
182
+ },
183
+ },
184
+ },
185
+ },
186
+ {
187
+ name: 'opensaas_search_migration_docs',
188
+ description: 'Search OpenSaaS Stack documentation for migration-related topics. Searches both local CLAUDE.md files and online documentation.',
189
+ inputSchema: {
190
+ type: 'object',
191
+ properties: {
192
+ query: {
193
+ type: 'string',
194
+ description: 'Search query (e.g., "prisma to opensaas", "access control patterns", "field types")',
195
+ },
196
+ },
197
+ required: ['query'],
198
+ },
199
+ },
200
+ {
201
+ name: 'opensaas_get_example',
202
+ description: 'Get example code for a specific feature or pattern. Returns code snippets from the examples directory.',
203
+ inputSchema: {
204
+ type: 'object',
205
+ properties: {
206
+ feature: {
207
+ type: 'string',
208
+ description: 'Feature to get example for (e.g., "blog-with-auth", "access-control", "relationships", "hooks", "custom-fields")',
209
+ },
210
+ },
211
+ required: ['feature'],
212
+ },
213
+ },
123
214
  ];
124
215
  /**
125
216
  * Create and start the MCP server
@@ -157,6 +248,18 @@ export async function startMCPServer() {
157
248
  return await stackServer.suggestFeatures(args);
158
249
  case 'opensaas_validate_feature':
159
250
  return await stackServer.validateFeature(args);
251
+ case 'opensaas_start_migration':
252
+ return await stackServer.startMigration(args);
253
+ case 'opensaas_answer_migration':
254
+ return await stackServer.answerMigration(args);
255
+ case 'opensaas_introspect_prisma':
256
+ return await stackServer.introspectPrisma(args);
257
+ case 'opensaas_introspect_keystone':
258
+ return await stackServer.introspectKeystone(args);
259
+ case 'opensaas_search_migration_docs':
260
+ return await stackServer.searchMigrationDocs(args);
261
+ case 'opensaas_get_example':
262
+ return await stackServer.getExample(args);
160
263
  default:
161
264
  return {
162
265
  content: [
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/server/index.ts"],"names":[],"mappings":"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"}