@ratio-mcp/dev-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/developer.d.ts +13 -0
- package/dist/api/developer.d.ts.map +1 -0
- package/dist/api/developer.js +66 -0
- package/dist/api/developer.js.map +1 -0
- package/dist/api/oauth.d.ts +36 -0
- package/dist/api/oauth.d.ts.map +1 -0
- package/dist/api/oauth.js +77 -0
- package/dist/api/oauth.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +57 -0
- package/dist/server.js.map +1 -0
- package/dist/store/requirements-store.d.ts +8 -0
- package/dist/store/requirements-store.d.ts.map +1 -0
- package/dist/store/requirements-store.js +67 -0
- package/dist/store/requirements-store.js.map +1 -0
- package/dist/store/token-store.d.ts +12 -0
- package/dist/store/token-store.d.ts.map +1 -0
- package/dist/store/token-store.js +94 -0
- package/dist/store/token-store.js.map +1 -0
- package/dist/templates/backend/.env.example +20 -0
- package/dist/templates/backend/nest-cli.json +5 -0
- package/dist/templates/backend/package.json +26 -0
- package/dist/templates/backend/src/app.module.ts +10 -0
- package/dist/templates/backend/src/main.ts +12 -0
- package/dist/templates/backend/tsconfig.json +21 -0
- package/dist/templates/frontend/.env.example +6 -0
- package/dist/templates/frontend/index.html +13 -0
- package/dist/templates/frontend/package.json +24 -0
- package/dist/templates/frontend/src/App.tsx +32 -0
- package/dist/templates/frontend/src/components/Layout.tsx +53 -0
- package/dist/templates/frontend/src/context/AuthContext.tsx +59 -0
- package/dist/templates/frontend/src/index.css +48 -0
- package/dist/templates/frontend/src/main.tsx +16 -0
- package/dist/templates/frontend/src/pages/Callback.tsx +53 -0
- package/dist/templates/frontend/src/pages/Dashboard.tsx +24 -0
- package/dist/templates/frontend/src/pages/Login.tsx +42 -0
- package/dist/templates/frontend/src/services/api.ts +48 -0
- package/dist/templates/frontend/tsconfig.json +21 -0
- package/dist/templates/frontend/vite.config.ts +15 -0
- package/dist/tools/app-management.d.ts +3 -0
- package/dist/tools/app-management.d.ts.map +1 -0
- package/dist/tools/app-management.js +132 -0
- package/dist/tools/app-management.js.map +1 -0
- package/dist/tools/auth.d.ts +3 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +164 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/build.d.ts +3 -0
- package/dist/tools/build.d.ts.map +1 -0
- package/dist/tools/build.js +178 -0
- package/dist/tools/build.js.map +1 -0
- package/dist/tools/codegen.d.ts +3 -0
- package/dist/tools/codegen.d.ts.map +1 -0
- package/dist/tools/codegen.js +315 -0
- package/dist/tools/codegen.js.map +1 -0
- package/dist/tools/developer-auth.d.ts +3 -0
- package/dist/tools/developer-auth.d.ts.map +1 -0
- package/dist/tools/developer-auth.js +87 -0
- package/dist/tools/developer-auth.js.map +1 -0
- package/dist/tools/index.d.ts +16 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/lifecycle.d.ts +3 -0
- package/dist/tools/lifecycle.d.ts.map +1 -0
- package/dist/tools/lifecycle.js +95 -0
- package/dist/tools/lifecycle.js.map +1 -0
- package/dist/tools/requirements.d.ts +3 -0
- package/dist/tools/requirements.d.ts.map +1 -0
- package/dist/tools/requirements.js +169 -0
- package/dist/tools/requirements.js.map +1 -0
- package/dist/tools/scaffold.d.ts +3 -0
- package/dist/tools/scaffold.d.ts.map +1 -0
- package/dist/tools/scaffold.js +209 -0
- package/dist/tools/scaffold.js.map +1 -0
- package/dist/tools/submission.d.ts +3 -0
- package/dist/tools/submission.d.ts.map +1 -0
- package/dist/tools/submission.js +138 -0
- package/dist/tools/submission.js.map +1 -0
- package/dist/utils/errors.d.ts +34 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +81 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +29 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +74 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/zod-to-json.d.ts +7 -0
- package/dist/utils/zod-to-json.d.ts.map +1 -0
- package/dist/utils/zod-to-json.js +63 -0
- package/dist/utils/zod-to-json.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { mkdir, writeFile, readFile } from 'fs/promises';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { homedir } from 'os';
|
|
6
|
+
import { getRequirements } from '../store/requirements-store.js';
|
|
7
|
+
import { logger } from '../utils/logger.js';
|
|
8
|
+
import { ToolExecutionError } from '../utils/errors.js';
|
|
9
|
+
// Import schemas directly — in a real setup these come from the docs-server
|
|
10
|
+
// but for now we co-locate the schema reading logic
|
|
11
|
+
import { readFileSync } from 'fs';
|
|
12
|
+
import { resolve, dirname } from 'path';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = dirname(__filename);
|
|
16
|
+
/**
|
|
17
|
+
* Load resource schema from the docs-server schemas directory.
|
|
18
|
+
* In production, this would query the docs-server via MCP, but since both servers
|
|
19
|
+
* share the same machine, we read the schema files directly.
|
|
20
|
+
*/
|
|
21
|
+
function loadResourceSchema(resource) {
|
|
22
|
+
// Try to find schema in docs-server's schemas directory
|
|
23
|
+
const docsSchemaPath = resolve(__dirname, '..', '..', '..', 'docs-server', 'src', 'schemas', `${resource}.json`);
|
|
24
|
+
const distSchemaPath = resolve(__dirname, '..', '..', '..', 'docs-server', 'dist', 'schemas', `${resource}.json`);
|
|
25
|
+
for (const schemaPath of [docsSchemaPath, distSchemaPath]) {
|
|
26
|
+
if (existsSync(schemaPath)) {
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(readFileSync(schemaPath, 'utf-8'));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
logger.warn(`Failed to parse schema: ${schemaPath}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
function capitalize(s) {
|
|
38
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
39
|
+
}
|
|
40
|
+
function generateServiceCode(resource, endpoints) {
|
|
41
|
+
const className = `${capitalize(resource)}Service`;
|
|
42
|
+
const lines = [];
|
|
43
|
+
lines.push(`import { Injectable, HttpException, HttpStatus } from '@nestjs/common';`);
|
|
44
|
+
lines.push(`import { ConfigService } from '@nestjs/config';`);
|
|
45
|
+
lines.push(`import axios from 'axios';`);
|
|
46
|
+
lines.push('');
|
|
47
|
+
lines.push(`@Injectable()`);
|
|
48
|
+
lines.push(`export class ${className} {`);
|
|
49
|
+
lines.push(` private readonly apiBaseUrl: string;`);
|
|
50
|
+
lines.push(` private readonly accessToken: string;`);
|
|
51
|
+
lines.push(` private readonly merchantId: string;`);
|
|
52
|
+
lines.push('');
|
|
53
|
+
lines.push(` constructor(private configService: ConfigService) {`);
|
|
54
|
+
lines.push(` this.apiBaseUrl = this.configService.get<string>('RATIO_API_BASE_URL');`);
|
|
55
|
+
lines.push(` this.accessToken = this.configService.get<string>('RATIO_ACCESS_TOKEN', '');`);
|
|
56
|
+
lines.push(` this.merchantId = this.configService.get<string>('RATIO_MERCHANT_ID', '');`);
|
|
57
|
+
lines.push(` }`);
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push(` private getHeaders(extra?: Record<string, string>) {`);
|
|
60
|
+
lines.push(` return {`);
|
|
61
|
+
lines.push(` Authorization: \`Bearer \${this.accessToken}\`,`);
|
|
62
|
+
lines.push(` 'Content-Type': 'application/json',`);
|
|
63
|
+
lines.push(` ...extra,`);
|
|
64
|
+
lines.push(` };`);
|
|
65
|
+
lines.push(` }`);
|
|
66
|
+
for (const ep of endpoints) {
|
|
67
|
+
lines.push('');
|
|
68
|
+
lines.push(` /** ${ep.summary} */`);
|
|
69
|
+
// Build method signature
|
|
70
|
+
const params = [];
|
|
71
|
+
if (ep.path_params) {
|
|
72
|
+
for (const p of ep.path_params) {
|
|
73
|
+
params.push(`${p.name}: string`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (ep.query_params && ep.query_params.length > 0 && ep.method === 'GET') {
|
|
77
|
+
params.push('query?: Record<string, unknown>');
|
|
78
|
+
}
|
|
79
|
+
if (ep.request_body && ['POST', 'PATCH', 'PUT'].includes(ep.method)) {
|
|
80
|
+
params.push('body?: Record<string, unknown>');
|
|
81
|
+
}
|
|
82
|
+
lines.push(` async ${ep.handler_name}(${params.join(', ')}): Promise<any> {`);
|
|
83
|
+
lines.push(` try {`);
|
|
84
|
+
// Build URL
|
|
85
|
+
let urlPath = ep.path;
|
|
86
|
+
if (ep.path_params) {
|
|
87
|
+
for (const p of ep.path_params) {
|
|
88
|
+
urlPath = urlPath.replace(`:${p.name}`, `\${${p.name}}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const extraHeaders = ep.extra_headers
|
|
92
|
+
? `{ ${ep.extra_headers.map((h) => `'${h.name}': this.merchantId`).join(', ')} }`
|
|
93
|
+
: 'undefined';
|
|
94
|
+
if (ep.method === 'GET') {
|
|
95
|
+
lines.push(` const response = await axios.get(\`\${this.apiBaseUrl}${urlPath}\`, {`);
|
|
96
|
+
lines.push(` headers: this.getHeaders(${extraHeaders !== 'undefined' ? extraHeaders : ''}),`);
|
|
97
|
+
if (ep.query_params && ep.query_params.length > 0) {
|
|
98
|
+
lines.push(` params: query,`);
|
|
99
|
+
}
|
|
100
|
+
lines.push(` });`);
|
|
101
|
+
}
|
|
102
|
+
else if (ep.method === 'POST') {
|
|
103
|
+
lines.push(` const response = await axios.post(\`\${this.apiBaseUrl}${urlPath}\`, body, {`);
|
|
104
|
+
lines.push(` headers: this.getHeaders(${extraHeaders !== 'undefined' ? extraHeaders : ''}),`);
|
|
105
|
+
lines.push(` });`);
|
|
106
|
+
}
|
|
107
|
+
else if (ep.method === 'PATCH') {
|
|
108
|
+
lines.push(` const response = await axios.patch(\`\${this.apiBaseUrl}${urlPath}\`, body, {`);
|
|
109
|
+
lines.push(` headers: this.getHeaders(${extraHeaders !== 'undefined' ? extraHeaders : ''}),`);
|
|
110
|
+
lines.push(` });`);
|
|
111
|
+
}
|
|
112
|
+
else if (ep.method === 'PUT') {
|
|
113
|
+
lines.push(` const response = await axios.put(\`\${this.apiBaseUrl}${urlPath}\`, body, {`);
|
|
114
|
+
lines.push(` headers: this.getHeaders(${extraHeaders !== 'undefined' ? extraHeaders : ''}),`);
|
|
115
|
+
lines.push(` });`);
|
|
116
|
+
}
|
|
117
|
+
else if (ep.method === 'DELETE') {
|
|
118
|
+
lines.push(` const response = await axios.delete(\`\${this.apiBaseUrl}${urlPath}\`, {`);
|
|
119
|
+
lines.push(` headers: this.getHeaders(${extraHeaders !== 'undefined' ? extraHeaders : ''}),`);
|
|
120
|
+
lines.push(` });`);
|
|
121
|
+
}
|
|
122
|
+
lines.push(` return response.data;`);
|
|
123
|
+
lines.push(` } catch (error: any) {`);
|
|
124
|
+
lines.push(` throw new HttpException(`);
|
|
125
|
+
lines.push(` error.response?.data?.message || '${ep.handler_name} failed',`);
|
|
126
|
+
lines.push(` error.response?.status || HttpStatus.INTERNAL_SERVER_ERROR,`);
|
|
127
|
+
lines.push(` );`);
|
|
128
|
+
lines.push(` }`);
|
|
129
|
+
lines.push(` }`);
|
|
130
|
+
}
|
|
131
|
+
lines.push(`}`);
|
|
132
|
+
return lines.join('\n');
|
|
133
|
+
}
|
|
134
|
+
function generateControllerCode(resource, endpoints) {
|
|
135
|
+
const className = `${capitalize(resource)}Controller`;
|
|
136
|
+
const serviceName = `${capitalize(resource)}Service`;
|
|
137
|
+
const serviceVar = `${resource}Service`;
|
|
138
|
+
const lines = [];
|
|
139
|
+
// Collect decorators needed
|
|
140
|
+
const decorators = new Set(['Controller']);
|
|
141
|
+
for (const ep of endpoints) {
|
|
142
|
+
decorators.add(ep.method === 'DELETE' ? 'Delete' : capitalize(ep.method.toLowerCase()));
|
|
143
|
+
if (ep.path_params)
|
|
144
|
+
decorators.add('Param');
|
|
145
|
+
if (ep.query_params && ep.method === 'GET')
|
|
146
|
+
decorators.add('Query');
|
|
147
|
+
if (ep.request_body && ['POST', 'PATCH', 'PUT'].includes(ep.method))
|
|
148
|
+
decorators.add('Body');
|
|
149
|
+
}
|
|
150
|
+
lines.push(`import { ${[...decorators].join(', ')} } from '@nestjs/common';`);
|
|
151
|
+
lines.push(`import { ${serviceName} } from './${resource}.service';`);
|
|
152
|
+
lines.push('');
|
|
153
|
+
// Extract base path
|
|
154
|
+
const basePath = getCommonBasePath(endpoints.map((ep) => ep.path));
|
|
155
|
+
lines.push(`@Controller('${basePath}')`);
|
|
156
|
+
lines.push(`export class ${className} {`);
|
|
157
|
+
lines.push(` constructor(private readonly ${serviceVar}: ${serviceName}) {}`);
|
|
158
|
+
for (const ep of endpoints) {
|
|
159
|
+
lines.push('');
|
|
160
|
+
lines.push(` /** ${ep.summary} */`);
|
|
161
|
+
// Calculate relative path from base
|
|
162
|
+
let relativePath = ep.path.replace(basePath, '').replace(/^\//, '');
|
|
163
|
+
// Convert :param to NestJS :param format (same)
|
|
164
|
+
const decorator = ep.method === 'DELETE' ? 'Delete' : capitalize(ep.method.toLowerCase());
|
|
165
|
+
lines.push(` @${decorator}('${relativePath || '/'}')`);
|
|
166
|
+
const params = [];
|
|
167
|
+
const callArgs = [];
|
|
168
|
+
if (ep.path_params) {
|
|
169
|
+
for (const p of ep.path_params) {
|
|
170
|
+
params.push(`@Param('${p.name}') ${p.name}: string`);
|
|
171
|
+
callArgs.push(p.name);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (ep.query_params && ep.query_params.length > 0 && ep.method === 'GET') {
|
|
175
|
+
params.push(`@Query() query: Record<string, unknown>`);
|
|
176
|
+
callArgs.push('query');
|
|
177
|
+
}
|
|
178
|
+
if (ep.request_body && ['POST', 'PATCH', 'PUT'].includes(ep.method)) {
|
|
179
|
+
params.push(`@Body() body: Record<string, unknown>`);
|
|
180
|
+
callArgs.push('body');
|
|
181
|
+
}
|
|
182
|
+
lines.push(` async ${ep.handler_name}(${params.join(', ')}) {`);
|
|
183
|
+
lines.push(` return this.${serviceVar}.${ep.handler_name}(${callArgs.join(', ')});`);
|
|
184
|
+
lines.push(` }`);
|
|
185
|
+
}
|
|
186
|
+
lines.push(`}`);
|
|
187
|
+
return lines.join('\n');
|
|
188
|
+
}
|
|
189
|
+
function generateModuleCode(resource) {
|
|
190
|
+
const className = `${capitalize(resource)}Module`;
|
|
191
|
+
const controllerName = `${capitalize(resource)}Controller`;
|
|
192
|
+
const serviceName = `${capitalize(resource)}Service`;
|
|
193
|
+
return [
|
|
194
|
+
`import { Module } from '@nestjs/common';`,
|
|
195
|
+
`import { ${controllerName} } from './${resource}.controller';`,
|
|
196
|
+
`import { ${serviceName} } from './${resource}.service';`,
|
|
197
|
+
'',
|
|
198
|
+
`@Module({`,
|
|
199
|
+
` controllers: [${controllerName}],`,
|
|
200
|
+
` providers: [${serviceName}],`,
|
|
201
|
+
` exports: [${serviceName}],`,
|
|
202
|
+
`})`,
|
|
203
|
+
`export class ${className} {}`,
|
|
204
|
+
].join('\n');
|
|
205
|
+
}
|
|
206
|
+
function getCommonBasePath(paths) {
|
|
207
|
+
if (paths.length === 0)
|
|
208
|
+
return '';
|
|
209
|
+
const parts = paths[0].split('/');
|
|
210
|
+
let common = '';
|
|
211
|
+
for (let i = 0; i < parts.length; i++) {
|
|
212
|
+
const part = parts[i];
|
|
213
|
+
if (part.startsWith(':'))
|
|
214
|
+
break;
|
|
215
|
+
if (paths.every((p) => p.split('/')[i] === part)) {
|
|
216
|
+
common += (common ? '/' : '') + part;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return common.replace(/^\//, '');
|
|
223
|
+
}
|
|
224
|
+
export const codegenTools = [
|
|
225
|
+
{
|
|
226
|
+
name: 'generate_api_routes',
|
|
227
|
+
description: 'Generate NestJS backend code (controller, service, module) for each resource in the app requirements. ' +
|
|
228
|
+
'Reads scopes from requirements, loads API schemas, and generates endpoints in deterministic controller_order. ' +
|
|
229
|
+
'Only generates endpoints matching the developer\'s scopes. Updates app.module.ts with new imports. ' +
|
|
230
|
+
'PREREQUISITE: Call define_app_requirements and scaffold_backend first.',
|
|
231
|
+
inputSchema: z.object({
|
|
232
|
+
app_id: z.string().min(1).describe('App ID from create_app'),
|
|
233
|
+
project_path: z.string().min(1).describe('Absolute path to the project root'),
|
|
234
|
+
}),
|
|
235
|
+
handler: async (input) => {
|
|
236
|
+
const { app_id, project_path: rawPath } = input;
|
|
237
|
+
const projectPath = rawPath.startsWith('~') ? rawPath.replace('~', homedir()) : rawPath;
|
|
238
|
+
const backendSrcDir = join(projectPath, 'backend', 'src');
|
|
239
|
+
if (!existsSync(backendSrcDir)) {
|
|
240
|
+
throw new ToolExecutionError('generate_api_routes', `Backend src directory not found: ${backendSrcDir}. Call scaffold_backend first.`);
|
|
241
|
+
}
|
|
242
|
+
const requirements = getRequirements(app_id);
|
|
243
|
+
if (!requirements) {
|
|
244
|
+
throw new ToolExecutionError('generate_api_routes', `No requirements found for app_id: ${app_id}. Call define_app_requirements first.`);
|
|
245
|
+
}
|
|
246
|
+
const generatedModules = [];
|
|
247
|
+
const allErrors = [];
|
|
248
|
+
for (const dataNeed of requirements.data_needs) {
|
|
249
|
+
const schema = loadResourceSchema(dataNeed);
|
|
250
|
+
if (!schema) {
|
|
251
|
+
allErrors.push(`No API schema found for resource: ${dataNeed}`);
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
const endpoints = schema['endpoints']
|
|
255
|
+
.filter((ep) => requirements.scopes.includes(ep.required_scope))
|
|
256
|
+
.sort((a, b) => a.controller_order - b.controller_order);
|
|
257
|
+
if (endpoints.length === 0) {
|
|
258
|
+
allErrors.push(`No endpoints match scopes [${requirements.scopes.join(', ')}] for resource: ${dataNeed}`);
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
// Generate code
|
|
262
|
+
const serviceCode = generateServiceCode(dataNeed, endpoints);
|
|
263
|
+
const controllerCode = generateControllerCode(dataNeed, endpoints);
|
|
264
|
+
const moduleCode = generateModuleCode(dataNeed);
|
|
265
|
+
// Write files
|
|
266
|
+
const resourceDir = join(backendSrcDir, dataNeed);
|
|
267
|
+
if (!existsSync(resourceDir))
|
|
268
|
+
await mkdir(resourceDir, { recursive: true });
|
|
269
|
+
await writeFile(join(resourceDir, `${dataNeed}.service.ts`), serviceCode);
|
|
270
|
+
await writeFile(join(resourceDir, `${dataNeed}.controller.ts`), controllerCode);
|
|
271
|
+
await writeFile(join(resourceDir, `${dataNeed}.module.ts`), moduleCode);
|
|
272
|
+
generatedModules.push(dataNeed);
|
|
273
|
+
logger.info(`Generated ${dataNeed} module with ${endpoints.length} endpoints`);
|
|
274
|
+
}
|
|
275
|
+
// Update app.module.ts
|
|
276
|
+
if (generatedModules.length > 0) {
|
|
277
|
+
const appModulePath = join(backendSrcDir, 'app.module.ts');
|
|
278
|
+
if (existsSync(appModulePath)) {
|
|
279
|
+
let appModule = await readFile(appModulePath, 'utf-8');
|
|
280
|
+
for (const mod of generatedModules) {
|
|
281
|
+
const moduleName = `${capitalize(mod)}Module`;
|
|
282
|
+
const importPath = `./${mod}/${mod}.module`;
|
|
283
|
+
if (!appModule.includes(moduleName)) {
|
|
284
|
+
// Add import statement
|
|
285
|
+
appModule = `import { ${moduleName} } from '${importPath}';\n${appModule}`;
|
|
286
|
+
// Add to imports array
|
|
287
|
+
appModule = appModule.replace(/imports:\s*\[/, `imports: [\n ${moduleName},`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
await writeFile(appModulePath, appModule);
|
|
291
|
+
logger.info('Updated app.module.ts with new module imports');
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
success: true,
|
|
296
|
+
message: `Generated ${generatedModules.length} resource module(s)`,
|
|
297
|
+
generated_modules: generatedModules.map((mod) => ({
|
|
298
|
+
resource: mod,
|
|
299
|
+
files: [
|
|
300
|
+
`${mod}/${mod}.service.ts`,
|
|
301
|
+
`${mod}/${mod}.controller.ts`,
|
|
302
|
+
`${mod}/${mod}.module.ts`,
|
|
303
|
+
],
|
|
304
|
+
})),
|
|
305
|
+
errors: allErrors.length > 0 ? allErrors : undefined,
|
|
306
|
+
next_steps: [
|
|
307
|
+
`1. cd ${projectPath}/backend && npm install && npm run start:dev`,
|
|
308
|
+
'2. Test endpoints with curl or Postman',
|
|
309
|
+
'3. Use validate_api_code (docs-server) to verify the generated code',
|
|
310
|
+
],
|
|
311
|
+
};
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
];
|
|
315
|
+
//# sourceMappingURL=codegen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/tools/codegen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer-auth.d.ts","sourceRoot":"","sources":["../../src/tools/developer-auth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,kBAAkB,EAAE,cAAc,EA0G9C,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { developerApiRequest, setDeveloperCredentials } from '../api/developer.js';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
export const developerAuthTools = [
|
|
5
|
+
{
|
|
6
|
+
name: 'developer_signup',
|
|
7
|
+
description: 'Register a new developer account on the Ratio Developer Dashboard. A verification code will be sent to the provided email. Use developer_verify_otp to complete registration.',
|
|
8
|
+
inputSchema: z.object({
|
|
9
|
+
display_name: z.string().min(1).describe('Developer display name (required)'),
|
|
10
|
+
email: z.string().email().describe('Developer email address (required)'),
|
|
11
|
+
password: z.string().min(1).describe('Password for the developer account (required)'),
|
|
12
|
+
}),
|
|
13
|
+
handler: async (input) => {
|
|
14
|
+
const { display_name, email, password } = input;
|
|
15
|
+
logger.info(`Signing up developer: ${email}`);
|
|
16
|
+
const response = await developerApiRequest('POST', '/developers/signup', { displayName: display_name, email, password }, { skipAuth: true });
|
|
17
|
+
return {
|
|
18
|
+
success: true,
|
|
19
|
+
message: `Signup initiated. A verification code has been sent to ${email}.`,
|
|
20
|
+
email,
|
|
21
|
+
raw_response: response,
|
|
22
|
+
next_steps: [
|
|
23
|
+
`1. Check email (${email}) for the verification code`,
|
|
24
|
+
'2. Use developer_verify_otp to verify your account',
|
|
25
|
+
'3. After verification, use developer_login to sign in',
|
|
26
|
+
],
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'developer_verify_otp',
|
|
32
|
+
description: 'Verify the OTP code sent to the developer email during signup. Completes registration. After verification, use developer_login to sign in.',
|
|
33
|
+
inputSchema: z.object({
|
|
34
|
+
email: z.string().email().describe('Developer email address used during signup'),
|
|
35
|
+
code: z.string().min(1).describe('Verification code received via email'),
|
|
36
|
+
}),
|
|
37
|
+
handler: async (input) => {
|
|
38
|
+
const { email, code } = input;
|
|
39
|
+
logger.info(`Verifying OTP for: ${email}`);
|
|
40
|
+
const response = await developerApiRequest('POST', '/developers/verify-otp', { email, code, purpose: 'signup' }, { skipAuth: true });
|
|
41
|
+
return {
|
|
42
|
+
success: true,
|
|
43
|
+
message: `Email verified for ${email}. Account is now active.`,
|
|
44
|
+
raw_response: response,
|
|
45
|
+
next_steps: [`1. Use developer_login with email "${email}" and your password`],
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'developer_login',
|
|
51
|
+
description: 'Login to the Ratio Developer Dashboard. Returns and stores the developer token for subsequent API calls. Must be called before using app management tools.',
|
|
52
|
+
inputSchema: z.object({
|
|
53
|
+
email: z.string().email().describe('Developer email address'),
|
|
54
|
+
password: z.string().min(1).describe('Developer password'),
|
|
55
|
+
}),
|
|
56
|
+
handler: async (input) => {
|
|
57
|
+
const { email, password } = input;
|
|
58
|
+
logger.info(`Logging in developer: ${email}`);
|
|
59
|
+
const responseData = await developerApiRequest('POST', '/developers/signin', { email, password }, { skipAuth: true });
|
|
60
|
+
const token = responseData.data?.accessToken ?? responseData.data?.token ??
|
|
61
|
+
responseData.accessToken ?? responseData.token;
|
|
62
|
+
if (!token) {
|
|
63
|
+
return { success: false, message: 'Login succeeded but no token found in response.', raw_response: responseData };
|
|
64
|
+
}
|
|
65
|
+
let devId = responseData.data?.developerId ?? responseData.data?.id ?? responseData.data?.sub;
|
|
66
|
+
if (!devId && typeof token === 'string') {
|
|
67
|
+
try {
|
|
68
|
+
const parts = token.split('.');
|
|
69
|
+
if (parts.length === 3 && parts[1]) {
|
|
70
|
+
const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString());
|
|
71
|
+
devId = payload.sub ?? payload.developerId ?? payload.id;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch { /* ignore */ }
|
|
75
|
+
}
|
|
76
|
+
setDeveloperCredentials(token, devId ?? '');
|
|
77
|
+
logger.info(`Developer logged in: ${email}`);
|
|
78
|
+
return {
|
|
79
|
+
success: true,
|
|
80
|
+
message: 'Login successful. Token stored for this session.',
|
|
81
|
+
developer_id: devId,
|
|
82
|
+
email,
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
//# sourceMappingURL=developer-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer-auth.js","sourceRoot":"","sources":["../../src/tools/developer-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Tool definition for MCP registration
|
|
4
|
+
*/
|
|
5
|
+
export interface ToolDefinition {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
inputSchema: z.ZodType;
|
|
9
|
+
handler: (input: Record<string, unknown>) => Promise<unknown>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* All dev-server tools in registration order
|
|
13
|
+
* NOTE: get_available_scopes is in docs-server (static data, no auth needed)
|
|
14
|
+
*/
|
|
15
|
+
export declare const allDevTools: ToolDefinition[];
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC;IACvB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAaD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,cAAc,EAUvC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Import all tool groups
|
|
2
|
+
import { developerAuthTools } from './developer-auth.js';
|
|
3
|
+
import { appManagementTools } from './app-management.js';
|
|
4
|
+
import { requirementsTools } from './requirements.js';
|
|
5
|
+
import { scaffoldTools } from './scaffold.js';
|
|
6
|
+
import { authTools } from './auth.js';
|
|
7
|
+
import { codegenTools } from './codegen.js';
|
|
8
|
+
import { buildTools } from './build.js';
|
|
9
|
+
import { submissionTools } from './submission.js';
|
|
10
|
+
import { lifecycleTools } from './lifecycle.js';
|
|
11
|
+
/**
|
|
12
|
+
* All dev-server tools in registration order
|
|
13
|
+
* NOTE: get_available_scopes is in docs-server (static data, no auth needed)
|
|
14
|
+
*/
|
|
15
|
+
export const allDevTools = [
|
|
16
|
+
...developerAuthTools, // 3 tools
|
|
17
|
+
...appManagementTools, // 5 tools
|
|
18
|
+
...requirementsTools, // 1 tool
|
|
19
|
+
...scaffoldTools, // 2 tools
|
|
20
|
+
...authTools, // 4 tools (request_auth_code, get_access_token, refresh, check_status)
|
|
21
|
+
...codegenTools, // 1 tool
|
|
22
|
+
...buildTools, // 3 tools
|
|
23
|
+
...submissionTools, // 4 tools
|
|
24
|
+
...lifecycleTools, // 1 tool
|
|
25
|
+
];
|
|
26
|
+
// Total: 24 tools
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAYA,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,GAAG,kBAAkB,EAAK,UAAU;IACpC,GAAG,kBAAkB,EAAK,UAAU;IACpC,GAAG,iBAAiB,EAAM,SAAS;IACnC,GAAG,aAAa,EAAU,UAAU;IACpC,GAAG,SAAS,EAAc,uEAAuE;IACjG,GAAG,YAAY,EAAW,SAAS;IACnC,GAAG,UAAU,EAAa,UAAU;IACpC,GAAG,eAAe,EAAQ,UAAU;IACpC,GAAG,cAAc,EAAS,SAAS;CACpC,CAAC;AACF,kBAAkB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/tools/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6EjD,eAAO,MAAM,cAAc,EAAE,cAAc,EAuB1C,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* The complete Ratio app lifecycle phases
|
|
4
|
+
*
|
|
5
|
+
* Core focus: select the right scopes → scaffold frontend → build & submit →
|
|
6
|
+
* get approved → OAuth → inject correct backend code via codegen.
|
|
7
|
+
*/
|
|
8
|
+
const LIFECYCLE_PHASES = [
|
|
9
|
+
{
|
|
10
|
+
phase: 1,
|
|
11
|
+
name: 'Developer Authentication',
|
|
12
|
+
description: 'Sign up or login to the Ratio Developer Dashboard',
|
|
13
|
+
tools: ['developer_signup', 'developer_verify_otp', 'developer_login'],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
phase: 2,
|
|
17
|
+
name: 'App Creation',
|
|
18
|
+
description: 'Create your app and get client credentials (client_id, client_secret)',
|
|
19
|
+
tools: ['create_app'],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
phase: 3,
|
|
23
|
+
name: 'Define Scopes',
|
|
24
|
+
description: 'Select the right OAuth scopes for the app. The LLM suggests scopes based on what the developer ' +
|
|
25
|
+
'wants to build, then presents a preview for developer approval before confirming. ' +
|
|
26
|
+
'This is critical — scopes drive which backend API routes get generated later.',
|
|
27
|
+
tools: ['define_app_requirements'],
|
|
28
|
+
docs_server_tools: ['get_available_scopes'],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
phase: 4,
|
|
32
|
+
name: 'Scaffold Frontend',
|
|
33
|
+
description: 'Scaffold a default React + Vite frontend project. This is a required submission artifact — ' +
|
|
34
|
+
'the admin needs a frontend build to approve the app. Not the focus of customization right now.',
|
|
35
|
+
tools: ['scaffold_frontend'],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
phase: 5,
|
|
39
|
+
name: 'Build & Submit',
|
|
40
|
+
description: 'Build the frontend, package as zip, upload to dashboard, and submit for admin review',
|
|
41
|
+
tools: ['build_frontend', 'validate_build', 'create_submission_zip', 'upload_build', 'submit_for_review'],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
phase: 6,
|
|
45
|
+
name: 'Admin Review',
|
|
46
|
+
description: 'Wait for admin approval. Check status periodically.',
|
|
47
|
+
tools: ['get_app_status'],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
phase: 7,
|
|
51
|
+
name: 'Publish & OAuth',
|
|
52
|
+
description: 'Publish the approved app, then complete OAuth flow with a merchant to get access tokens. ' +
|
|
53
|
+
'These tokens are needed for the backend to make API calls on behalf of the merchant.',
|
|
54
|
+
tools: ['publish_app', 'request_auth_code', 'get_access_token'],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
phase: 8,
|
|
58
|
+
name: 'Backend Code Generation',
|
|
59
|
+
description: 'Scaffold the NestJS backend (with OAuth tokens injected into .env), then auto-generate ' +
|
|
60
|
+
'API route code (controller, service, module) for each resource based on the confirmed scopes. ' +
|
|
61
|
+
'Only resources with codegen_ready=true will get generated code.',
|
|
62
|
+
tools: ['scaffold_backend', 'generate_api_routes'],
|
|
63
|
+
docs_server_tools: ['get_scope_endpoint_map', 'get_api_reference'],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
phase: 9,
|
|
67
|
+
name: 'Code Validation',
|
|
68
|
+
description: 'Validate the generated backend code against API schemas to catch any issues',
|
|
69
|
+
docs_server_tools: ['validate_api_code'],
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
export const lifecycleTools = [
|
|
73
|
+
{
|
|
74
|
+
name: 'get_app_lifecycle',
|
|
75
|
+
description: 'Get the complete Ratio app development lifecycle. Shows all phases from authentication to validation, ' +
|
|
76
|
+
'including which tools to call at each step. Call this first before starting any app development.',
|
|
77
|
+
inputSchema: z.object({}),
|
|
78
|
+
handler: async () => {
|
|
79
|
+
return {
|
|
80
|
+
success: true,
|
|
81
|
+
total_phases: LIFECYCLE_PHASES.length,
|
|
82
|
+
phases: LIFECYCLE_PHASES,
|
|
83
|
+
note: 'Tools prefixed with docs_server are from the ratio-docs-server. All other tools are from ratio-dev-server.',
|
|
84
|
+
important: [
|
|
85
|
+
'Scope selection is critical — it drives which backend code gets auto-generated',
|
|
86
|
+
'Always call define_app_requirements with confirmed=false first to preview scopes with the developer',
|
|
87
|
+
'Frontend scaffold + build + submit is required before OAuth (admin must approve first)',
|
|
88
|
+
'Backend code generation only works for resources with codegen_ready=true (currently: orders, products)',
|
|
89
|
+
'Always validate generated code using validate_api_code before finalizing',
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/tools/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG;IACvB;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,mDAAmD;QAChE,KAAK,EAAE,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,CAAC;KACvE;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,uEAAuE;QACpF,KAAK,EAAE,CAAC,YAAY,CAAC;KACtB;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,iGAAiG;YACjG,oFAAoF;YACpF,+EAA+E;QACjF,KAAK,EAAE,CAAC,yBAAyB,CAAC;QAClC,iBAAiB,EAAE,CAAC,sBAAsB,CAAC;KAC5C;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,6FAA6F;YAC7F,gGAAgG;QAClG,KAAK,EAAE,CAAC,mBAAmB,CAAC;KAC7B;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,sFAAsF;QACnG,KAAK,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,cAAc,EAAE,mBAAmB,CAAC;KAC1G;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,qDAAqD;QAClE,KAAK,EAAE,CAAC,gBAAgB,CAAC;KAC1B;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,2FAA2F;YAC3F,sFAAsF;QACxF,KAAK,EAAE,CAAC,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,CAAC;KAChE;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,yFAAyF;YACzF,gGAAgG;YAChG,iEAAiE;QACnE,KAAK,EAAE,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;QAClD,iBAAiB,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,CAAC;KACnE;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,6EAA6E;QAC1F,iBAAiB,EAAE,CAAC,mBAAmB,CAAC;KACzC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,wGAAwG;YACxG,kGAAkG;QACpG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,gBAAgB,CAAC,MAAM;gBACrC,MAAM,EAAE,gBAAgB;gBACxB,IAAI,EAAE,4GAA4G;gBAClH,SAAS,EAAE;oBACT,gFAAgF;oBAChF,qGAAqG;oBACrG,wFAAwF;oBACxF,wGAAwG;oBACxG,0EAA0E;iBAC3E;aACF,CAAC;QACJ,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../src/tools/requirements.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,iBAAiB,EAAE,cAAc,EA0L7C,CAAC"}
|