@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.
Files changed (97) hide show
  1. package/dist/api/developer.d.ts +13 -0
  2. package/dist/api/developer.d.ts.map +1 -0
  3. package/dist/api/developer.js +66 -0
  4. package/dist/api/developer.js.map +1 -0
  5. package/dist/api/oauth.d.ts +36 -0
  6. package/dist/api/oauth.d.ts.map +1 -0
  7. package/dist/api/oauth.js +77 -0
  8. package/dist/api/oauth.js.map +1 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +16 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/server.d.ts +6 -0
  14. package/dist/server.d.ts.map +1 -0
  15. package/dist/server.js +57 -0
  16. package/dist/server.js.map +1 -0
  17. package/dist/store/requirements-store.d.ts +8 -0
  18. package/dist/store/requirements-store.d.ts.map +1 -0
  19. package/dist/store/requirements-store.js +67 -0
  20. package/dist/store/requirements-store.js.map +1 -0
  21. package/dist/store/token-store.d.ts +12 -0
  22. package/dist/store/token-store.d.ts.map +1 -0
  23. package/dist/store/token-store.js +94 -0
  24. package/dist/store/token-store.js.map +1 -0
  25. package/dist/templates/backend/.env.example +20 -0
  26. package/dist/templates/backend/nest-cli.json +5 -0
  27. package/dist/templates/backend/package.json +26 -0
  28. package/dist/templates/backend/src/app.module.ts +10 -0
  29. package/dist/templates/backend/src/main.ts +12 -0
  30. package/dist/templates/backend/tsconfig.json +21 -0
  31. package/dist/templates/frontend/.env.example +6 -0
  32. package/dist/templates/frontend/index.html +13 -0
  33. package/dist/templates/frontend/package.json +24 -0
  34. package/dist/templates/frontend/src/App.tsx +32 -0
  35. package/dist/templates/frontend/src/components/Layout.tsx +53 -0
  36. package/dist/templates/frontend/src/context/AuthContext.tsx +59 -0
  37. package/dist/templates/frontend/src/index.css +48 -0
  38. package/dist/templates/frontend/src/main.tsx +16 -0
  39. package/dist/templates/frontend/src/pages/Callback.tsx +53 -0
  40. package/dist/templates/frontend/src/pages/Dashboard.tsx +24 -0
  41. package/dist/templates/frontend/src/pages/Login.tsx +42 -0
  42. package/dist/templates/frontend/src/services/api.ts +48 -0
  43. package/dist/templates/frontend/tsconfig.json +21 -0
  44. package/dist/templates/frontend/vite.config.ts +15 -0
  45. package/dist/tools/app-management.d.ts +3 -0
  46. package/dist/tools/app-management.d.ts.map +1 -0
  47. package/dist/tools/app-management.js +132 -0
  48. package/dist/tools/app-management.js.map +1 -0
  49. package/dist/tools/auth.d.ts +3 -0
  50. package/dist/tools/auth.d.ts.map +1 -0
  51. package/dist/tools/auth.js +164 -0
  52. package/dist/tools/auth.js.map +1 -0
  53. package/dist/tools/build.d.ts +3 -0
  54. package/dist/tools/build.d.ts.map +1 -0
  55. package/dist/tools/build.js +178 -0
  56. package/dist/tools/build.js.map +1 -0
  57. package/dist/tools/codegen.d.ts +3 -0
  58. package/dist/tools/codegen.d.ts.map +1 -0
  59. package/dist/tools/codegen.js +315 -0
  60. package/dist/tools/codegen.js.map +1 -0
  61. package/dist/tools/developer-auth.d.ts +3 -0
  62. package/dist/tools/developer-auth.d.ts.map +1 -0
  63. package/dist/tools/developer-auth.js +87 -0
  64. package/dist/tools/developer-auth.js.map +1 -0
  65. package/dist/tools/index.d.ts +16 -0
  66. package/dist/tools/index.d.ts.map +1 -0
  67. package/dist/tools/index.js +27 -0
  68. package/dist/tools/index.js.map +1 -0
  69. package/dist/tools/lifecycle.d.ts +3 -0
  70. package/dist/tools/lifecycle.d.ts.map +1 -0
  71. package/dist/tools/lifecycle.js +95 -0
  72. package/dist/tools/lifecycle.js.map +1 -0
  73. package/dist/tools/requirements.d.ts +3 -0
  74. package/dist/tools/requirements.d.ts.map +1 -0
  75. package/dist/tools/requirements.js +169 -0
  76. package/dist/tools/requirements.js.map +1 -0
  77. package/dist/tools/scaffold.d.ts +3 -0
  78. package/dist/tools/scaffold.d.ts.map +1 -0
  79. package/dist/tools/scaffold.js +209 -0
  80. package/dist/tools/scaffold.js.map +1 -0
  81. package/dist/tools/submission.d.ts +3 -0
  82. package/dist/tools/submission.d.ts.map +1 -0
  83. package/dist/tools/submission.js +138 -0
  84. package/dist/tools/submission.js.map +1 -0
  85. package/dist/utils/errors.d.ts +34 -0
  86. package/dist/utils/errors.d.ts.map +1 -0
  87. package/dist/utils/errors.js +81 -0
  88. package/dist/utils/errors.js.map +1 -0
  89. package/dist/utils/logger.d.ts +29 -0
  90. package/dist/utils/logger.d.ts.map +1 -0
  91. package/dist/utils/logger.js +74 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/dist/utils/zod-to-json.d.ts +7 -0
  94. package/dist/utils/zod-to-json.d.ts.map +1 -0
  95. package/dist/utils/zod-to-json.js +63 -0
  96. package/dist/utils/zod-to-json.js.map +1 -0
  97. package/package.json +31 -0
@@ -0,0 +1,164 @@
1
+ import { z } from 'zod';
2
+ import { requestAuthorization, exchangeCodeForToken, refreshToken } from '../api/oauth.js';
3
+ import { saveToken, getToken, isTokenExpired, writeTokenToScaffoldEnv } from '../store/token-store.js';
4
+ import { getRequirements, getRequirementsByClientId } from '../store/requirements-store.js';
5
+ import { logger } from '../utils/logger.js';
6
+ export const authTools = [
7
+ {
8
+ name: 'request_auth_code',
9
+ description: 'Request an authorization code for app installation (OAuth Step 1). App must be PUBLISHED first. ' +
10
+ 'Auto-fills scopes from saved requirements if app_id is provided.',
11
+ inputSchema: z.object({
12
+ app_id: z.string().optional().describe('App ID to auto-fill scopes from requirements'),
13
+ client_id: z.string().min(1).describe('Application Client ID'),
14
+ merchant_id: z.string().min(1).describe('Merchant ID of the store installing the app'),
15
+ redirect_uri: z.string().describe('Registered redirect URI'),
16
+ scopes: z.array(z.string()).optional().describe('Scopes to request. Auto-filled from requirements if omitted.'),
17
+ }),
18
+ handler: async (input) => {
19
+ const { app_id, client_id, merchant_id, redirect_uri } = input;
20
+ let scopes = input.scopes;
21
+ // Auto-fill scopes
22
+ if (!scopes || scopes.length === 0) {
23
+ if (!app_id) {
24
+ return { error: true, message: 'No scopes provided and no app_id for lookup. Pass app_id or scopes explicitly.' };
25
+ }
26
+ const requirements = getRequirements(app_id);
27
+ if (requirements && requirements.scopes.length > 0) {
28
+ scopes = requirements.scopes;
29
+ logger.info(`Auto-filled scopes from requirements: [${scopes.join(', ')}]`);
30
+ }
31
+ else {
32
+ return { error: true, message: `No requirements found for app_id "${app_id}". Call define_app_requirements first.` };
33
+ }
34
+ }
35
+ const response = await requestAuthorization({ clientId: client_id, merchantId: merchant_id, redirectUri: redirect_uri, scopes });
36
+ const { code, redirectUri, expiresAt } = response.data;
37
+ return {
38
+ success: true,
39
+ message: response.message,
40
+ auth_code: code,
41
+ redirect_uri: redirectUri,
42
+ expires_at: expiresAt,
43
+ warning: 'Auth code expires quickly! Call get_access_token immediately.',
44
+ };
45
+ },
46
+ },
47
+ {
48
+ name: 'get_access_token',
49
+ description: 'Exchange authorization code for access and refresh tokens (OAuth Step 2). ' +
50
+ 'Saves tokens persistently and auto-injects into backend .env if project is scaffolded.',
51
+ inputSchema: z.object({
52
+ auth_code: z.string().min(1).describe('Authorization code from request_auth_code'),
53
+ client_id: z.string().min(1).describe('Application Client ID'),
54
+ client_secret: z.string().min(1).describe('Application Client Secret'),
55
+ redirect_uri: z.string().describe('Redirect URI (must match request_auth_code)'),
56
+ }),
57
+ handler: async (input) => {
58
+ const { auth_code, client_id, client_secret, redirect_uri } = input;
59
+ const tokenData = await exchangeCodeForToken({ code: auth_code, clientId: client_id, clientSecret: client_secret, redirectUri: redirect_uri });
60
+ const expiresAt = new Date(Date.now() + tokenData.expires_in * 1000);
61
+ const storedToken = {
62
+ access_token: tokenData.access_token,
63
+ refresh_token: tokenData.refresh_token,
64
+ scopes: tokenData.scope.split(',').map((s) => s.trim()).filter(Boolean),
65
+ merchant_id: tokenData.merchant_id,
66
+ expires_at: expiresAt.toISOString(),
67
+ created_at: new Date().toISOString(),
68
+ client_id, client_secret, redirect_uri,
69
+ };
70
+ saveToken(client_id, storedToken);
71
+ // Auto-inject into backend .env
72
+ let tokenInjected = false;
73
+ const requirements = getRequirementsByClientId(client_id);
74
+ if (requirements?.project_path) {
75
+ const backendEnvPath = `${requirements.project_path}/backend/.env`;
76
+ writeTokenToScaffoldEnv(backendEnvPath, storedToken);
77
+ tokenInjected = true;
78
+ logger.info(`Token injected into: ${backendEnvPath}`);
79
+ }
80
+ return {
81
+ success: true,
82
+ message: 'Tokens obtained and saved' + (tokenInjected ? '. Injected into backend .env.' : ''),
83
+ tokens: {
84
+ access_token: tokenData.access_token,
85
+ token_type: tokenData.token_type,
86
+ refresh_token: tokenData.refresh_token,
87
+ scope: tokenData.scope,
88
+ merchant_id: tokenData.merchant_id,
89
+ expires_in: tokenData.expires_in,
90
+ expires_at: expiresAt.toISOString(),
91
+ },
92
+ token_injected_to_project: tokenInjected,
93
+ storage_location: '~/.ratio-v2/tokens.json',
94
+ next_steps: [
95
+ tokenInjected ? '1. Backend .env updated — ready to generate routes' : '1. Call scaffold_backend to create the backend project',
96
+ '2. Call generate_api_routes to create resource controllers',
97
+ ],
98
+ };
99
+ },
100
+ },
101
+ {
102
+ name: 'refresh_access_token',
103
+ description: 'Refresh an expired access token using the refresh token.',
104
+ inputSchema: z.object({
105
+ refresh_token: z.string().min(1).describe('Refresh token from get_access_token'),
106
+ client_id: z.string().min(1).describe('Application Client ID'),
107
+ client_secret: z.string().min(1).describe('Application Client Secret'),
108
+ }),
109
+ handler: async (input) => {
110
+ const { refresh_token: rt, client_id, client_secret } = input;
111
+ const tokenData = await refreshToken({ refreshToken: rt, clientId: client_id, clientSecret: client_secret });
112
+ const expiresAt = new Date(Date.now() + tokenData.expires_in * 1000);
113
+ // Update persistent store
114
+ const existing = getToken(client_id);
115
+ if (existing) {
116
+ saveToken(client_id, {
117
+ ...existing,
118
+ access_token: tokenData.access_token,
119
+ refresh_token: tokenData.refresh_token,
120
+ scopes: tokenData.scope.split(',').map((s) => s.trim()).filter(Boolean),
121
+ merchant_id: tokenData.merchant_id,
122
+ expires_at: expiresAt.toISOString(),
123
+ });
124
+ }
125
+ return {
126
+ success: true,
127
+ message: 'Token refreshed successfully',
128
+ tokens: {
129
+ access_token: tokenData.access_token,
130
+ refresh_token: tokenData.refresh_token,
131
+ scope: tokenData.scope,
132
+ merchant_id: tokenData.merchant_id,
133
+ expires_in: tokenData.expires_in,
134
+ expires_at: expiresAt.toISOString(),
135
+ },
136
+ };
137
+ },
138
+ },
139
+ {
140
+ name: 'check_token_status',
141
+ description: 'Check the current access token status for a given client_id.',
142
+ inputSchema: z.object({
143
+ client_id: z.string().min(1).describe('Client ID to check token for'),
144
+ }),
145
+ handler: async (input) => {
146
+ const { client_id } = input;
147
+ const token = getToken(client_id);
148
+ if (!token) {
149
+ return { status: 'not_found', message: `No token found for client_id: ${client_id}` };
150
+ }
151
+ const expired = isTokenExpired(token);
152
+ return {
153
+ status: expired ? 'expired' : 'valid',
154
+ message: expired ? 'Token is expired. Use refresh_access_token.' : 'Token is valid.',
155
+ client_id: token.client_id,
156
+ merchant_id: token.merchant_id,
157
+ scopes: token.scopes,
158
+ expires_at: token.expires_at,
159
+ recommendation: expired ? 'Call refresh_access_token' : 'No action needed',
160
+ };
161
+ },
162
+ },
163
+ ];
164
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/tools/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from './index.js';
2
+ export declare const buildTools: ToolDefinition[];
3
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/tools/build.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA6BjD,eAAO,MAAM,UAAU,EAAE,cAAc,EAwKtC,CAAC"}
@@ -0,0 +1,178 @@
1
+ import { z } from 'zod';
2
+ import { existsSync, statSync, readdirSync } from 'fs';
3
+ import { join, resolve } from 'path';
4
+ import { homedir } from 'os';
5
+ import { execSync } from 'child_process';
6
+ import { logger } from '../utils/logger.js';
7
+ import { ToolExecutionError, BuildError } from '../utils/errors.js';
8
+ const LOCAL_FS_NOTICE = ' IMPORTANT: This tool runs on the user\'s LOCAL machine filesystem. All paths must be real local paths.';
9
+ function getDirectorySize(dirPath) {
10
+ let size = 0;
11
+ try {
12
+ const entries = readdirSync(dirPath, { withFileTypes: true });
13
+ for (const entry of entries) {
14
+ const entryPath = join(dirPath, entry.name);
15
+ if (entry.isDirectory()) {
16
+ size += getDirectorySize(entryPath);
17
+ }
18
+ else {
19
+ size += statSync(entryPath).size;
20
+ }
21
+ }
22
+ }
23
+ catch { /* ignore */ }
24
+ return size;
25
+ }
26
+ function findBuildDir(projectPath) {
27
+ for (const dir of ['dist', 'build', '.next', 'out']) {
28
+ const candidate = join(projectPath, dir);
29
+ if (existsSync(candidate))
30
+ return candidate;
31
+ }
32
+ return null;
33
+ }
34
+ export const buildTools = [
35
+ {
36
+ name: 'build_frontend',
37
+ description: 'Run production build for a React/Vite frontend project. Returns build output path and statistics.' + LOCAL_FS_NOTICE,
38
+ inputSchema: z.object({
39
+ project_path: z.string().min(1).describe('Absolute path to the frontend project directory'),
40
+ install_dependencies: z.boolean().default(true).describe('Install dependencies before building'),
41
+ build_command: z.string().optional().describe('Custom build command'),
42
+ }),
43
+ handler: async (input) => {
44
+ const { project_path: rawPath, install_dependencies, build_command } = input;
45
+ const projectPath = rawPath.startsWith('~') ? rawPath.replace('~', homedir()) : rawPath;
46
+ if (!existsSync(join(projectPath, 'package.json'))) {
47
+ throw new BuildError(`No package.json found in: ${projectPath}`);
48
+ }
49
+ // Detect package manager
50
+ const hasYarnLock = existsSync(join(projectPath, 'yarn.lock'));
51
+ const hasPnpmLock = existsSync(join(projectPath, 'pnpm-lock.yaml'));
52
+ const pm = hasPnpmLock ? 'pnpm' : hasYarnLock ? 'yarn' : 'npm';
53
+ if (install_dependencies) {
54
+ logger.info(`Installing dependencies with ${pm}...`);
55
+ try {
56
+ execSync(`${pm} install`, { cwd: projectPath, stdio: 'pipe', timeout: 120000 });
57
+ }
58
+ catch (err) {
59
+ throw new BuildError(`Dependency installation failed: ${err.message}`);
60
+ }
61
+ }
62
+ const cmd = build_command || 'build';
63
+ logger.info(`Running build: ${pm} run ${cmd}`);
64
+ try {
65
+ const output = execSync(`${pm} run ${cmd}`, { cwd: projectPath, stdio: 'pipe', timeout: 120000 });
66
+ logger.info('Build completed');
67
+ }
68
+ catch (err) {
69
+ throw new BuildError(`Build failed: ${err.message}`);
70
+ }
71
+ const buildDir = findBuildDir(projectPath);
72
+ if (!buildDir) {
73
+ throw new BuildError('Build directory not found. Expected dist/, build/, .next/, or out/');
74
+ }
75
+ const buildSize = getDirectorySize(buildDir);
76
+ return {
77
+ success: true,
78
+ message: 'Build completed successfully',
79
+ build_path: buildDir,
80
+ build_size_bytes: buildSize,
81
+ build_size_mb: (buildSize / 1024 / 1024).toFixed(2),
82
+ next_steps: [
83
+ `1. Call create_submission_zip with build_path: "${buildDir}"`,
84
+ '2. Upload and submit for review',
85
+ ],
86
+ };
87
+ },
88
+ },
89
+ {
90
+ name: 'validate_build',
91
+ description: 'Validate a frontend build meets Ratio submission requirements.' + LOCAL_FS_NOTICE,
92
+ inputSchema: z.object({
93
+ build_path: z.string().min(1).describe('Absolute path to the build output directory'),
94
+ }),
95
+ handler: async (input) => {
96
+ const { build_path: rawPath } = input;
97
+ const buildPath = rawPath.startsWith('~') ? rawPath.replace('~', homedir()) : rawPath;
98
+ if (!existsSync(buildPath)) {
99
+ return { valid: false, errors: [`Build directory not found: ${buildPath}`] };
100
+ }
101
+ const errors = [];
102
+ const warnings = [];
103
+ // Check for index.html
104
+ if (!existsSync(join(buildPath, 'index.html'))) {
105
+ errors.push('Missing index.html in build output');
106
+ }
107
+ // Check for JS files
108
+ const hasJs = readdirSync(buildPath, { recursive: true })
109
+ .some((f) => String(f).endsWith('.js'));
110
+ if (!hasJs) {
111
+ warnings.push('No JavaScript files found in build');
112
+ }
113
+ // Check build size
114
+ const size = getDirectorySize(buildPath);
115
+ if (size > 50 * 1024 * 1024) {
116
+ warnings.push(`Build size (${(size / 1024 / 1024).toFixed(1)}MB) exceeds 50MB`);
117
+ }
118
+ // Check for sensitive files
119
+ const sensitiveFiles = ['.env', '.env.local', '.env.production'];
120
+ for (const sf of sensitiveFiles) {
121
+ if (existsSync(join(buildPath, sf))) {
122
+ errors.push(`Sensitive file found in build: ${sf}`);
123
+ }
124
+ }
125
+ return {
126
+ valid: errors.length === 0,
127
+ errors: errors.length > 0 ? errors : undefined,
128
+ warnings: warnings.length > 0 ? warnings : undefined,
129
+ build_size_mb: (size / 1024 / 1024).toFixed(2),
130
+ };
131
+ },
132
+ },
133
+ {
134
+ name: 'create_submission_zip',
135
+ description: 'Create a zip file from the build output for submission to Ratio.' + LOCAL_FS_NOTICE,
136
+ inputSchema: z.object({
137
+ build_path: z.string().min(1).describe('Absolute path to the build output directory'),
138
+ output_path: z.string().optional().describe('Output zip file path. Defaults to build_path/../submission.zip'),
139
+ include_source_maps: z.boolean().default(false).describe('Include .map files in zip'),
140
+ }),
141
+ handler: async (input) => {
142
+ const { build_path: rawPath, output_path: rawOutput, include_source_maps } = input;
143
+ const buildPath = rawPath.startsWith('~') ? rawPath.replace('~', homedir()) : rawPath;
144
+ if (!existsSync(buildPath)) {
145
+ throw new ToolExecutionError('create_submission_zip', `Build directory not found: ${buildPath}`);
146
+ }
147
+ const zipPath = rawOutput
148
+ ? (rawOutput.startsWith('~') ? rawOutput.replace('~', homedir()) : rawOutput)
149
+ : join(resolve(buildPath, '..'), 'submission.zip');
150
+ // Use archiver
151
+ const archiver = (await import('archiver')).default;
152
+ const { createWriteStream } = await import('fs');
153
+ return new Promise((resolvePromise, reject) => {
154
+ const output = createWriteStream(zipPath);
155
+ const archive = archiver('zip', { zlib: { level: 9 } });
156
+ output.on('close', () => {
157
+ const zipSize = statSync(zipPath).size;
158
+ resolvePromise({
159
+ success: true,
160
+ message: 'Submission zip created',
161
+ zip_path: zipPath,
162
+ zip_size_bytes: zipSize,
163
+ zip_size_mb: (zipSize / 1024 / 1024).toFixed(2),
164
+ next_steps: [`1. Call upload_build with zip_path: "${zipPath}"`],
165
+ });
166
+ });
167
+ archive.on('error', (err) => reject(new BuildError(`Zip creation failed: ${err.message}`)));
168
+ archive.pipe(output);
169
+ archive.glob('**/*', {
170
+ cwd: buildPath,
171
+ ignore: include_source_maps ? [] : ['**/*.map'],
172
+ });
173
+ archive.finalize();
174
+ });
175
+ },
176
+ },
177
+ ];
178
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/tools/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from './index.js';
2
+ export declare const codegenTools: ToolDefinition[];
3
+ //# sourceMappingURL=codegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/tools/codegen.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwPjD,eAAO,MAAM,YAAY,EAAE,cAAc,EA4GxC,CAAC"}