@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,169 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ALL_SCOPE_CODES, getResourceForScope, RESOURCE_METADATA, SCOPES_BY_RESOURCE } from '@ratio-mcp/shared';
|
|
3
|
+
import { saveRequirements } from '../store/requirements-store.js';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
5
|
+
export const requirementsTools = [
|
|
6
|
+
{
|
|
7
|
+
name: 'define_app_requirements',
|
|
8
|
+
description: 'Define app requirements by specifying exact OAuth scope codes. ' +
|
|
9
|
+
'Has a two-step flow: first call WITHOUT confirmed=true to get a preview of what will be set up ' +
|
|
10
|
+
'(validated scopes, which resources have codegen support, warnings). ' +
|
|
11
|
+
'Then call AGAIN with confirmed=true to actually save. ' +
|
|
12
|
+
'This ensures the developer reviews and approves scopes before they drive code generation. ' +
|
|
13
|
+
'IMPORTANT: You MUST show the preview to the developer and get their approval before calling with confirmed=true.',
|
|
14
|
+
inputSchema: z.object({
|
|
15
|
+
app_id: z.string().min(1).describe('App ID from create_app (required)'),
|
|
16
|
+
app_name: z.string().optional().describe('App display name'),
|
|
17
|
+
scopes: z
|
|
18
|
+
.array(z.string())
|
|
19
|
+
.min(1)
|
|
20
|
+
.describe('Array of OAuth scope codes (e.g. ["read_orders", "write_products"]). Use get_available_scopes to see valid codes.'),
|
|
21
|
+
features: z
|
|
22
|
+
.array(z.string())
|
|
23
|
+
.default(['list'])
|
|
24
|
+
.describe('App features: "list", "analytics", "management"'),
|
|
25
|
+
confirmed: z
|
|
26
|
+
.boolean()
|
|
27
|
+
.default(false)
|
|
28
|
+
.describe('Set to true ONLY after the developer has reviewed and approved the scope preview. ' +
|
|
29
|
+
'First call without this (or false) to get a preview. Then call with true to save.'),
|
|
30
|
+
}),
|
|
31
|
+
handler: async (input) => {
|
|
32
|
+
const { app_id, app_name, scopes, features, confirmed } = input;
|
|
33
|
+
logger.info(`Defining requirements for app: ${app_id} (confirmed=${confirmed})`);
|
|
34
|
+
// ── Step 1: Validate scopes ──────────────────────────────
|
|
35
|
+
const validScopes = [];
|
|
36
|
+
const invalidScopes = [];
|
|
37
|
+
for (const scope of scopes) {
|
|
38
|
+
if (ALL_SCOPE_CODES.has(scope)) {
|
|
39
|
+
validScopes.push(scope);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
invalidScopes.push(scope);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const warnings = [];
|
|
46
|
+
if (invalidScopes.length > 0) {
|
|
47
|
+
warnings.push(`Invalid scopes ignored: ${invalidScopes.join(', ')}. Use get_available_scopes to see valid scope codes.`);
|
|
48
|
+
}
|
|
49
|
+
if (validScopes.length === 0) {
|
|
50
|
+
return {
|
|
51
|
+
error: true,
|
|
52
|
+
message: 'No valid scopes specified.',
|
|
53
|
+
invalid_scopes: invalidScopes,
|
|
54
|
+
warnings,
|
|
55
|
+
_instruction: 'Call get_available_scopes first to see available scope codes.',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// ── Step 2: Derive resources and build preview ───────────
|
|
59
|
+
const dataNeedsSet = new Set();
|
|
60
|
+
for (const scope of validScopes) {
|
|
61
|
+
const resource = getResourceForScope(scope);
|
|
62
|
+
if (resource) {
|
|
63
|
+
dataNeedsSet.add(resource);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Build per-resource breakdown for the preview
|
|
67
|
+
const resourceBreakdown = [...dataNeedsSet].map((resource) => {
|
|
68
|
+
const meta = RESOURCE_METADATA[resource];
|
|
69
|
+
const resourceScopes = validScopes.filter((s) => getResourceForScope(s) === resource);
|
|
70
|
+
// Get scope details for richer display
|
|
71
|
+
const allResourceScopes = SCOPES_BY_RESOURCE[resource] || [];
|
|
72
|
+
const scopeDetails = resourceScopes.map((code) => {
|
|
73
|
+
const scopeData = allResourceScopes.find((s) => s.code === code);
|
|
74
|
+
return {
|
|
75
|
+
code,
|
|
76
|
+
label: scopeData?.label || code,
|
|
77
|
+
description: scopeData?.description || '',
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
return {
|
|
81
|
+
resource,
|
|
82
|
+
codegen_ready: meta?.codegen_ready || false,
|
|
83
|
+
scopes: scopeDetails,
|
|
84
|
+
note: meta?.codegen_ready
|
|
85
|
+
? 'Backend code will be auto-generated for this resource'
|
|
86
|
+
: 'No API schema available yet — scopes will be registered but code generation will skip this resource',
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
// ── If NOT confirmed: return preview for developer approval ──
|
|
90
|
+
if (!confirmed) {
|
|
91
|
+
// Suggest related scopes the developer might also want
|
|
92
|
+
const suggestedAdditional = [];
|
|
93
|
+
const alreadySelected = new Set(validScopes);
|
|
94
|
+
for (const scope of validScopes) {
|
|
95
|
+
const scopeResource = getResourceForScope(scope);
|
|
96
|
+
if (!scopeResource)
|
|
97
|
+
continue;
|
|
98
|
+
const allResourceScopes = SCOPES_BY_RESOURCE[scopeResource] || [];
|
|
99
|
+
const scopeData = allResourceScopes.find((s) => s.code === scope);
|
|
100
|
+
if (!scopeData?.commonly_paired_with)
|
|
101
|
+
continue;
|
|
102
|
+
for (const pairedCode of scopeData.commonly_paired_with) {
|
|
103
|
+
if (!alreadySelected.has(pairedCode) && ALL_SCOPE_CODES.has(pairedCode)) {
|
|
104
|
+
// Find the paired scope's details
|
|
105
|
+
const pairedResource = getResourceForScope(pairedCode);
|
|
106
|
+
if (!pairedResource)
|
|
107
|
+
continue;
|
|
108
|
+
const pairedScopes = SCOPES_BY_RESOURCE[pairedResource] || [];
|
|
109
|
+
const pairedData = pairedScopes.find((s) => s.code === pairedCode);
|
|
110
|
+
if (!pairedData)
|
|
111
|
+
continue;
|
|
112
|
+
// Avoid duplicates in suggestions
|
|
113
|
+
if (!suggestedAdditional.some((s) => s.code === pairedCode)) {
|
|
114
|
+
suggestedAdditional.push({
|
|
115
|
+
code: pairedCode,
|
|
116
|
+
label: pairedData.label,
|
|
117
|
+
reason: `Commonly needed with ${scope} — ${pairedData.description.split('.')[0]}.`,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
alreadySelected.add(pairedCode); // prevent re-suggesting
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
status: 'preview',
|
|
126
|
+
message: 'Here is a preview of the scopes that will be configured for this app. ' +
|
|
127
|
+
'Please review and confirm.',
|
|
128
|
+
app_id,
|
|
129
|
+
app_name: app_name || undefined,
|
|
130
|
+
selected_scopes: resourceBreakdown,
|
|
131
|
+
total_scopes: validScopes.length,
|
|
132
|
+
suggested_additional: suggestedAdditional.length > 0 ? suggestedAdditional : undefined,
|
|
133
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
134
|
+
_instruction: 'Present this preview to the developer clearly. Show selected scopes grouped by resource, ' +
|
|
135
|
+
'highlight which resources have codegen support, and show suggested additional scopes. ' +
|
|
136
|
+
'Ask the developer to confirm, add more scopes, or remove any. ' +
|
|
137
|
+
'Once approved, call define_app_requirements again with the final scopes and confirmed=true.',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// ── If confirmed: save requirements ──────────────────────
|
|
141
|
+
const requirements = {
|
|
142
|
+
app_id,
|
|
143
|
+
app_name,
|
|
144
|
+
scopes: validScopes,
|
|
145
|
+
data_needs: [...dataNeedsSet],
|
|
146
|
+
features,
|
|
147
|
+
created_at: new Date().toISOString(),
|
|
148
|
+
updated_at: new Date().toISOString(),
|
|
149
|
+
};
|
|
150
|
+
saveRequirements(app_id, requirements);
|
|
151
|
+
logger.info(`Requirements confirmed and saved for app: ${app_id}`);
|
|
152
|
+
return {
|
|
153
|
+
success: true,
|
|
154
|
+
confirmed: true,
|
|
155
|
+
message: `Requirements saved for app ${app_id}`,
|
|
156
|
+
requirements: {
|
|
157
|
+
app_id,
|
|
158
|
+
scopes: validScopes,
|
|
159
|
+
resources: [...dataNeedsSet],
|
|
160
|
+
codegen_resources: [...dataNeedsSet].filter((r) => RESOURCE_METADATA[r]?.codegen_ready),
|
|
161
|
+
features,
|
|
162
|
+
},
|
|
163
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
164
|
+
next_step: 'Call scaffold_frontend to create the frontend project.',
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
];
|
|
169
|
+
//# sourceMappingURL=requirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirements.js","sourceRoot":"","sources":["../../src/tools/requirements.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA2BjD,eAAO,MAAM,aAAa,EAAE,cAAc,EAqNzC,CAAC"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { existsSync, readdirSync } from 'fs';
|
|
3
|
+
import { cp, mkdir, writeFile } from 'fs/promises';
|
|
4
|
+
import { join, resolve, dirname } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { RATIO_API_BASE_URL } from '@ratio-mcp/shared';
|
|
7
|
+
import { homedir, tmpdir } from 'os';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
import { ToolExecutionError } from '../utils/errors.js';
|
|
10
|
+
import { getToken } from '../store/token-store.js';
|
|
11
|
+
import { getAllRequirements, updateRequirementsField } from '../store/requirements-store.js';
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = dirname(__filename);
|
|
14
|
+
const LOCAL_FS_NOTICE = ' IMPORTANT: This tool runs on the user\'s LOCAL machine filesystem. ' +
|
|
15
|
+
'All paths must be real local paths. Do NOT use sandbox paths.';
|
|
16
|
+
function getTemplatesDir() {
|
|
17
|
+
return resolve(__dirname, '..', 'templates');
|
|
18
|
+
}
|
|
19
|
+
async function copyTemplate(source, dest) {
|
|
20
|
+
await cp(source, dest, {
|
|
21
|
+
recursive: true,
|
|
22
|
+
filter: (src) => {
|
|
23
|
+
const relative = src.replace(source, '');
|
|
24
|
+
if (relative.includes('node_modules'))
|
|
25
|
+
return false;
|
|
26
|
+
if (relative.includes('/dist/') || relative.endsWith('/dist'))
|
|
27
|
+
return false;
|
|
28
|
+
if (relative.endsWith('package-lock.json'))
|
|
29
|
+
return false;
|
|
30
|
+
if (relative.endsWith('pnpm-lock.yaml'))
|
|
31
|
+
return false;
|
|
32
|
+
return true;
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export const scaffoldTools = [
|
|
37
|
+
{
|
|
38
|
+
name: 'scaffold_frontend',
|
|
39
|
+
description: 'Scaffold a React + Vite frontend project with auth, routing, layout, and API service pre-configured. ' +
|
|
40
|
+
'After this tool completes, the next step is ALWAYS to call build_frontend to compile the project.' + LOCAL_FS_NOTICE,
|
|
41
|
+
inputSchema: z.object({
|
|
42
|
+
project_name: z.string().min(1).describe('Project name (used as directory name)'),
|
|
43
|
+
project_path: z.string().optional().describe('Parent directory. Defaults to ~/Desktop.'),
|
|
44
|
+
app_name: z.string().optional().describe('App display name'),
|
|
45
|
+
client_id: z.string().optional().describe('App client ID from create_app'),
|
|
46
|
+
}),
|
|
47
|
+
handler: async (input) => {
|
|
48
|
+
const debugLog = [];
|
|
49
|
+
const log = (msg) => { debugLog.push(msg); logger.info(msg); };
|
|
50
|
+
const { project_name, project_path, app_name, client_id } = input;
|
|
51
|
+
log(`[scaffold_frontend] START — project_name="${project_name}", project_path="${project_path}", app_name="${app_name}", client_id="${client_id}"`);
|
|
52
|
+
const home = homedir();
|
|
53
|
+
const safeHome = existsSync(home) ? home : tmpdir();
|
|
54
|
+
log(`[scaffold_frontend] home="${home}", safeHome="${safeHome}", homeExists=${existsSync(home)}`);
|
|
55
|
+
const parentDir = project_path
|
|
56
|
+
? (project_path.startsWith('~') ? project_path.replace('~', safeHome) : project_path)
|
|
57
|
+
: join(safeHome, 'Desktop');
|
|
58
|
+
log(`[scaffold_frontend] parentDir="${parentDir}", parentDirExists=${existsSync(parentDir)}`);
|
|
59
|
+
if (!existsSync(parentDir)) {
|
|
60
|
+
await mkdir(parentDir, { recursive: true });
|
|
61
|
+
log(`[scaffold_frontend] Created parentDir`);
|
|
62
|
+
}
|
|
63
|
+
const projectDir = join(parentDir, project_name);
|
|
64
|
+
log(`[scaffold_frontend] projectDir="${projectDir}", projectDirExists=${existsSync(projectDir)}`);
|
|
65
|
+
if (existsSync(projectDir)) {
|
|
66
|
+
throw new ToolExecutionError('scaffold_frontend', `Directory already exists: ${projectDir}. Debug: ${debugLog.join(' | ')}`);
|
|
67
|
+
}
|
|
68
|
+
await mkdir(projectDir, { recursive: true });
|
|
69
|
+
log(`[scaffold_frontend] Created projectDir, exists now=${existsSync(projectDir)}`);
|
|
70
|
+
const frontendDir = join(projectDir, 'frontend');
|
|
71
|
+
const templateDir = join(getTemplatesDir(), 'frontend');
|
|
72
|
+
log(`[scaffold_frontend] frontendDir="${frontendDir}"`);
|
|
73
|
+
log(`[scaffold_frontend] templateDir="${templateDir}", templateDirExists=${existsSync(templateDir)}`);
|
|
74
|
+
const templateDirExists = existsSync(templateDir);
|
|
75
|
+
const templateDirContents = templateDirExists ? readdirSync(templateDir) : [];
|
|
76
|
+
const hasTemplateFiles = templateDirExists && templateDirContents.length > 0;
|
|
77
|
+
log(`[scaffold_frontend] templateDirContents=[${templateDirContents.join(', ')}], hasTemplateFiles=${hasTemplateFiles}`);
|
|
78
|
+
if (hasTemplateFiles) {
|
|
79
|
+
log(`[scaffold_frontend] COPYING from template dir...`);
|
|
80
|
+
try {
|
|
81
|
+
await copyTemplate(templateDir, frontendDir);
|
|
82
|
+
log(`[scaffold_frontend] copyTemplate completed`);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
log(`[scaffold_frontend] copyTemplate FAILED: ${err.message}`);
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
log(`[scaffold_frontend] NO TEMPLATES — creating inline files...`);
|
|
91
|
+
await mkdir(join(frontendDir, 'src'), { recursive: true });
|
|
92
|
+
await mkdir(join(frontendDir, 'public'), { recursive: true });
|
|
93
|
+
await writeFile(join(frontendDir, 'package.json'), JSON.stringify({
|
|
94
|
+
name: `${project_name}-frontend`,
|
|
95
|
+
private: true,
|
|
96
|
+
version: '0.1.0',
|
|
97
|
+
type: 'module',
|
|
98
|
+
scripts: { dev: 'vite', build: 'vite build', preview: 'vite preview' },
|
|
99
|
+
dependencies: { react: '^18.2.0', 'react-dom': '^18.2.0', 'react-router-dom': '^6.20.0' },
|
|
100
|
+
devDependencies: { '@types/react': '^18.2.0', '@types/react-dom': '^18.2.0', '@vitejs/plugin-react': '^4.2.0', typescript: '^5.3.0', vite: '^5.0.0' },
|
|
101
|
+
}, null, 2));
|
|
102
|
+
await writeFile(join(frontendDir, 'vite.config.ts'), `import { defineConfig } from 'vite';\nimport react from '@vitejs/plugin-react';\nexport default defineConfig({ plugins: [react()] });\n`);
|
|
103
|
+
await writeFile(join(frontendDir, 'index.html'), `<!DOCTYPE html>\n<html lang="en">\n<head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>${app_name || project_name}</title></head>\n<body><div id="root"></div><script type="module" src="/src/main.tsx"></script></body>\n</html>\n`);
|
|
104
|
+
await writeFile(join(frontendDir, 'src', 'main.tsx'), `import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport App from './App';\n\nReactDOM.createRoot(document.getElementById('root')!).render(<React.StrictMode><App /></React.StrictMode>);\n`);
|
|
105
|
+
await writeFile(join(frontendDir, 'src', 'App.tsx'), `import React from 'react';\n\nexport default function App() {\n return <div><h1>${app_name || project_name}</h1><p>Your Ratio app is ready. Build your UI here.</p></div>;\n}\n`);
|
|
106
|
+
await writeFile(join(frontendDir, 'tsconfig.json'), JSON.stringify({
|
|
107
|
+
compilerOptions: { target: 'ES2020', useDefineForClassFields: true, lib: ['ES2020', 'DOM', 'DOM.Iterable'], module: 'ESNext', skipLibCheck: true, moduleResolution: 'bundler', allowImportingTsExtensions: true, resolveJsonModule: true, isolatedModules: true, noEmit: true, strict: true, jsx: 'react-jsx' },
|
|
108
|
+
include: ['src'],
|
|
109
|
+
}, null, 2));
|
|
110
|
+
log(`[scaffold_frontend] Inline files written`);
|
|
111
|
+
}
|
|
112
|
+
// Write frontend .env.local
|
|
113
|
+
await writeFile(join(frontendDir, '.env.local'), `VITE_API_URL=http://localhost:3000/api\nVITE_APP_NAME=${app_name || project_name}\nVITE_APP_VERSION=1.0.0\n`);
|
|
114
|
+
log(`[scaffold_frontend] .env.local written`);
|
|
115
|
+
// Verify what was actually written
|
|
116
|
+
const frontendExists = existsSync(frontendDir);
|
|
117
|
+
const frontendContents = frontendExists ? readdirSync(frontendDir) : [];
|
|
118
|
+
log(`[scaffold_frontend] VERIFY — frontendDir exists=${frontendExists}, contents=[${frontendContents.join(', ')}]`);
|
|
119
|
+
if (frontendExists && frontendContents.includes('src')) {
|
|
120
|
+
const srcContents = readdirSync(join(frontendDir, 'src'));
|
|
121
|
+
log(`[scaffold_frontend] VERIFY — src/ contents=[${srcContents.join(', ')}]`);
|
|
122
|
+
}
|
|
123
|
+
// Update requirements store
|
|
124
|
+
if (client_id) {
|
|
125
|
+
const allReqs = getAllRequirements();
|
|
126
|
+
const targetAppId = Object.keys(allReqs).find((appId) => {
|
|
127
|
+
const req = allReqs[appId];
|
|
128
|
+
return req?.client_id === client_id;
|
|
129
|
+
}) || Object.keys(allReqs).find((appId) => !allReqs[appId]?.project_path);
|
|
130
|
+
if (targetAppId) {
|
|
131
|
+
updateRequirementsField(targetAppId, { project_path: projectDir, client_id });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
logger.info(`Frontend scaffolded: ${frontendDir}`);
|
|
135
|
+
return {
|
|
136
|
+
success: true,
|
|
137
|
+
message: `Frontend project scaffolded at ${frontendDir}`,
|
|
138
|
+
project_path: projectDir,
|
|
139
|
+
frontend_path: frontendDir,
|
|
140
|
+
debug_log: debugLog,
|
|
141
|
+
files_created: frontendContents,
|
|
142
|
+
next_step: `Call build_frontend with project_path="${projectDir}" to compile the project.`,
|
|
143
|
+
};
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: 'scaffold_backend',
|
|
148
|
+
description: 'Scaffold a NestJS backend project with .env pre-populated with access token, merchant ID, and client credentials. ' +
|
|
149
|
+
'Only creates the base structure — resource modules come from generate_api_routes. ' +
|
|
150
|
+
'Call AFTER OAuth flow (when access token is available).' + LOCAL_FS_NOTICE,
|
|
151
|
+
inputSchema: z.object({
|
|
152
|
+
project_path: z.string().min(1).describe('Path to the project directory (where frontend/ already exists)'),
|
|
153
|
+
client_id: z.string().optional().describe('App client ID'),
|
|
154
|
+
client_secret: z.string().optional().describe('App client secret'),
|
|
155
|
+
app_name: z.string().optional().describe('App display name'),
|
|
156
|
+
}),
|
|
157
|
+
handler: async (input) => {
|
|
158
|
+
const { project_path, client_id, client_secret, app_name } = input;
|
|
159
|
+
const projectDir = project_path.startsWith('~')
|
|
160
|
+
? project_path.replace('~', homedir())
|
|
161
|
+
: project_path;
|
|
162
|
+
if (!existsSync(projectDir)) {
|
|
163
|
+
throw new ToolExecutionError('scaffold_backend', `Project directory not found: ${projectDir}`);
|
|
164
|
+
}
|
|
165
|
+
const backendDir = join(projectDir, 'backend');
|
|
166
|
+
const templateDir = join(getTemplatesDir(), 'backend');
|
|
167
|
+
// Copy the backend template
|
|
168
|
+
await copyTemplate(templateDir, backendDir);
|
|
169
|
+
// Fetch token from store
|
|
170
|
+
const storedToken = client_id ? getToken(client_id) : undefined;
|
|
171
|
+
// Write backend .env
|
|
172
|
+
const backendEnv = `# Ratio App Backend Configuration
|
|
173
|
+
PORT=3000
|
|
174
|
+
NODE_ENV=development
|
|
175
|
+
|
|
176
|
+
# Ratio App Credentials
|
|
177
|
+
RATIO_APP_ID=${client_id || 'your_app_id'}
|
|
178
|
+
RATIO_APP_SECRET=${client_secret || 'your_app_secret'}
|
|
179
|
+
RATIO_REDIRECT_URI=http://localhost:3000/auth/callback
|
|
180
|
+
RATIO_API_BASE_URL=${RATIO_API_BASE_URL}
|
|
181
|
+
RATIO_API_VERSION=v1
|
|
182
|
+
|
|
183
|
+
# OAuth Tokens
|
|
184
|
+
RATIO_ACCESS_TOKEN=${storedToken?.access_token || ''}
|
|
185
|
+
RATIO_REFRESH_TOKEN=${storedToken?.refresh_token || ''}
|
|
186
|
+
RATIO_MERCHANT_ID=${storedToken?.merchant_id || ''}
|
|
187
|
+
RATIO_SCOPES=${storedToken?.scopes?.join(',') || ''}
|
|
188
|
+
|
|
189
|
+
# JWT
|
|
190
|
+
JWT_SECRET=your_jwt_secret_change_this
|
|
191
|
+
JWT_EXPIRES_IN=7d
|
|
192
|
+
`;
|
|
193
|
+
await writeFile(join(backendDir, '.env'), backendEnv);
|
|
194
|
+
logger.info(`Backend scaffolded: ${backendDir}`);
|
|
195
|
+
return {
|
|
196
|
+
success: true,
|
|
197
|
+
message: `Backend project scaffolded at ${backendDir}` +
|
|
198
|
+
(storedToken ? '. OAuth tokens injected into .env.' : ''),
|
|
199
|
+
backend_path: backendDir,
|
|
200
|
+
token_injected: !!storedToken,
|
|
201
|
+
next_steps: [
|
|
202
|
+
'1. Call generate_api_routes to create resource controllers and services',
|
|
203
|
+
`2. cd ${backendDir} && npm install && npm run start:dev to test`,
|
|
204
|
+
],
|
|
205
|
+
};
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
];
|
|
209
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/tools/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submission.d.ts","sourceRoot":"","sources":["../../src/tools/submission.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAcjD,eAAO,MAAM,eAAe,EAAE,cAAc,EA2I3C,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { existsSync, createReadStream, statSync } from 'fs';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { developerApiRequest } from '../api/developer.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import { ToolExecutionError } from '../utils/errors.js';
|
|
7
|
+
import FormData from 'form-data';
|
|
8
|
+
const STATUS_EXPLANATIONS = {
|
|
9
|
+
draft: 'App is in draft state. Upload a build and submit for review.',
|
|
10
|
+
submitted: 'App has been submitted for review. Waiting for admin.',
|
|
11
|
+
in_review: 'App is currently being reviewed by admin.',
|
|
12
|
+
approved: 'App version has been approved. You can now publish it.',
|
|
13
|
+
rejected: 'App version was rejected. Check feedback and resubmit.',
|
|
14
|
+
published: 'App is published and available to merchants.',
|
|
15
|
+
suspended: 'App has been suspended by admin.',
|
|
16
|
+
disabled: 'App has been disabled.',
|
|
17
|
+
};
|
|
18
|
+
export const submissionTools = [
|
|
19
|
+
{
|
|
20
|
+
name: 'upload_build',
|
|
21
|
+
description: 'Upload a ZIP file to the Ratio Developer Dashboard. Creates a new app version. ' +
|
|
22
|
+
'PREREQUISITE: Use create_submission_zip first.',
|
|
23
|
+
inputSchema: z.object({
|
|
24
|
+
app_id: z.string().min(1).describe('Application ID'),
|
|
25
|
+
zip_path: z.string().min(1).describe('Absolute path to the zip file'),
|
|
26
|
+
version: z.string().optional().describe('Version string (e.g. "1.0.0")'),
|
|
27
|
+
changelog: z.string().optional().describe('Changelog for this version'),
|
|
28
|
+
}),
|
|
29
|
+
handler: async (input) => {
|
|
30
|
+
const { app_id, zip_path: rawPath, version, changelog } = input;
|
|
31
|
+
const zipPath = rawPath.startsWith('~') ? rawPath.replace('~', homedir()) : rawPath;
|
|
32
|
+
if (!existsSync(zipPath)) {
|
|
33
|
+
throw new ToolExecutionError('upload_build', `Zip file not found: ${zipPath}`);
|
|
34
|
+
}
|
|
35
|
+
const zipSize = statSync(zipPath).size;
|
|
36
|
+
logger.info(`Uploading build: ${zipPath} (${(zipSize / 1024 / 1024).toFixed(2)}MB)`);
|
|
37
|
+
// Create FormData — note: we import from 'form-data' (node)
|
|
38
|
+
const formData = new FormData();
|
|
39
|
+
formData.append('buildZip', createReadStream(zipPath));
|
|
40
|
+
if (version)
|
|
41
|
+
formData.append('version', version);
|
|
42
|
+
if (changelog)
|
|
43
|
+
formData.append('changelog', changelog);
|
|
44
|
+
const response = await developerApiRequest('POST', `/applications/${app_id}/upload-build`, formData, {
|
|
45
|
+
axiosConfig: {
|
|
46
|
+
headers: formData.getHeaders(),
|
|
47
|
+
maxContentLength: Infinity,
|
|
48
|
+
maxBodyLength: Infinity,
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
success: true,
|
|
53
|
+
message: 'Build uploaded successfully',
|
|
54
|
+
response,
|
|
55
|
+
next_steps: ['1. Call submit_for_review to submit for admin review'],
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'submit_for_review',
|
|
61
|
+
description: 'Submit an application for review. PREREQUISITE: Must have at least one uploaded build version.',
|
|
62
|
+
inputSchema: z.object({
|
|
63
|
+
app_id: z.string().min(1).describe('Application ID'),
|
|
64
|
+
description: z.string().optional().describe('Description for submission'),
|
|
65
|
+
changelog: z.string().optional().describe('Changelog'),
|
|
66
|
+
category_ids: z.array(z.string()).optional().describe('Categories'),
|
|
67
|
+
tags: z.array(z.string()).optional().describe('Tags'),
|
|
68
|
+
}),
|
|
69
|
+
handler: async (input) => {
|
|
70
|
+
const { app_id, description, changelog, category_ids, tags } = input;
|
|
71
|
+
const body = {
|
|
72
|
+
appId: app_id,
|
|
73
|
+
submitToReview: true,
|
|
74
|
+
};
|
|
75
|
+
if (description)
|
|
76
|
+
body['description'] = description;
|
|
77
|
+
if (changelog)
|
|
78
|
+
body['changelog'] = changelog;
|
|
79
|
+
if (category_ids)
|
|
80
|
+
body['categoryIds'] = category_ids;
|
|
81
|
+
if (tags)
|
|
82
|
+
body['tags'] = tags;
|
|
83
|
+
const response = await developerApiRequest('POST', `/applications/submit`, body);
|
|
84
|
+
return {
|
|
85
|
+
success: true,
|
|
86
|
+
message: 'Application submitted for review',
|
|
87
|
+
response,
|
|
88
|
+
next_steps: [
|
|
89
|
+
'1. Wait for admin approval',
|
|
90
|
+
'2. Use get_app_status to check progress',
|
|
91
|
+
'3. After approval: publish_app to publish, then OAuth flow',
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'get_app_status',
|
|
98
|
+
description: 'Check the current status of an application and its versions.',
|
|
99
|
+
inputSchema: z.object({
|
|
100
|
+
app_id: z.string().min(1).describe('Application ID'),
|
|
101
|
+
}),
|
|
102
|
+
handler: async (input) => {
|
|
103
|
+
const { app_id } = input;
|
|
104
|
+
const response = await developerApiRequest('GET', `/applications/${app_id}`);
|
|
105
|
+
const status = response?.data?.status || response?.status || 'unknown';
|
|
106
|
+
const explanation = STATUS_EXPLANATIONS[status] || 'Unknown status';
|
|
107
|
+
return {
|
|
108
|
+
success: true,
|
|
109
|
+
application: response,
|
|
110
|
+
status,
|
|
111
|
+
explanation,
|
|
112
|
+
};
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'publish_app',
|
|
117
|
+
description: 'Publish an approved application version. PREREQUISITE: Version must be in "approved" status.',
|
|
118
|
+
inputSchema: z.object({
|
|
119
|
+
app_id: z.string().min(1).describe('Application ID'),
|
|
120
|
+
version_id: z.string().min(1).describe('Version ID to publish (from get_app_status)'),
|
|
121
|
+
}),
|
|
122
|
+
handler: async (input) => {
|
|
123
|
+
const { app_id, version_id } = input;
|
|
124
|
+
const response = await developerApiRequest('POST', `/developer/apps/${app_id}/versions/${version_id}/publish`);
|
|
125
|
+
return {
|
|
126
|
+
success: true,
|
|
127
|
+
message: 'Application published successfully',
|
|
128
|
+
response,
|
|
129
|
+
next_steps: [
|
|
130
|
+
'1. App is now available to merchants',
|
|
131
|
+
'2. Use request_auth_code to start OAuth with a test merchant',
|
|
132
|
+
'3. After OAuth: scaffold_backend → generate_api_routes',
|
|
133
|
+
],
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
//# sourceMappingURL=submission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submission.js","sourceRoot":"","sources":["../../src/tools/submission.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for Ratio MCP
|
|
3
|
+
*/
|
|
4
|
+
export declare class RatioMCPError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class AuthenticationError extends RatioMCPError {
|
|
8
|
+
details?: unknown | undefined;
|
|
9
|
+
constructor(message: string, details?: unknown | undefined);
|
|
10
|
+
}
|
|
11
|
+
export declare class RatioAPIError extends RatioMCPError {
|
|
12
|
+
endpoint: string;
|
|
13
|
+
method: string;
|
|
14
|
+
statusCode?: number | undefined;
|
|
15
|
+
details?: unknown | undefined;
|
|
16
|
+
constructor(message: string, endpoint: string, method: string, statusCode?: number | undefined, details?: unknown | undefined);
|
|
17
|
+
}
|
|
18
|
+
export declare class ToolExecutionError extends RatioMCPError {
|
|
19
|
+
toolName: string;
|
|
20
|
+
constructor(toolName: string, message: string);
|
|
21
|
+
}
|
|
22
|
+
export declare class BuildError extends RatioMCPError {
|
|
23
|
+
details?: unknown | undefined;
|
|
24
|
+
constructor(message: string, details?: unknown | undefined);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Extract a human-readable message from an Axios error response
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractAxiosMessage(error: unknown): string;
|
|
30
|
+
/**
|
|
31
|
+
* Handle axios errors with consistent formatting
|
|
32
|
+
*/
|
|
33
|
+
export declare function handleAxiosError(error: unknown, endpoint: string, method: string): never;
|
|
34
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,mBAAoB,SAAQ,aAAa;IAChB,OAAO,CAAC,EAAE,OAAO;gBAAzC,OAAO,EAAE,MAAM,EAAS,OAAO,CAAC,EAAE,OAAO,YAAA;CAItD;AAED,qBAAa,aAAc,SAAQ,aAAa;IAGrC,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,MAAM;IACd,UAAU,CAAC,EAAE,MAAM;IACnB,OAAO,CAAC,EAAE,OAAO;gBAJxB,OAAO,EAAE,MAAM,EACR,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,OAAO,CAAC,EAAE,OAAO,YAAA;CAK3B;AAED,qBAAa,kBAAmB,SAAQ,aAAa;IAChC,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIrD;AAED,qBAAa,UAAW,SAAQ,aAAa;IACP,OAAO,CAAC,EAAE,OAAO;gBAAzC,OAAO,EAAE,MAAM,EAAS,OAAO,CAAC,EAAE,OAAO,YAAA;CAItD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAU1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,KAAK,CAqBP"}
|