@tac0de/flutter-mcp 0.1.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/LICENSE +21 -0
- package/README.md +132 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +226 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/dependencies.d.ts +27 -0
- package/dist/tools/dependencies.d.ts.map +1 -0
- package/dist/tools/dependencies.js +172 -0
- package/dist/tools/dependencies.js.map +1 -0
- package/dist/tools/validate.d.ts +33 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +231 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tools/widgets.d.ts +21 -0
- package/dist/tools/widgets.d.ts.map +1 -0
- package/dist/tools/widgets.js +164 -0
- package/dist/tools/widgets.js.map +1 -0
- package/dist/utils/flutter.d.ts +117 -0
- package/dist/utils/flutter.d.ts.map +1 -0
- package/dist/utils/flutter.js +316 -0
- package/dist/utils/flutter.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import * as fs from "fs/promises";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
// Zod schemas for validation
|
|
6
|
+
const FlutterConfigSchema = z.object({
|
|
7
|
+
"uses-material-design": z.boolean().optional(),
|
|
8
|
+
assets: z.array(z.string()).optional(),
|
|
9
|
+
fonts: z.array(z.any()).optional(),
|
|
10
|
+
});
|
|
11
|
+
export const PubspecSchema = z.object({
|
|
12
|
+
name: z.string(),
|
|
13
|
+
description: z.string().optional(),
|
|
14
|
+
version: z.string().optional(),
|
|
15
|
+
publish_to: z.string().optional(),
|
|
16
|
+
environment: z
|
|
17
|
+
.object({
|
|
18
|
+
sdk: z.string(),
|
|
19
|
+
flutter: z.string().optional(),
|
|
20
|
+
})
|
|
21
|
+
.optional(),
|
|
22
|
+
dependencies: z.record(z.string()).optional(),
|
|
23
|
+
dev_dependencies: z.record(z.string()).optional(),
|
|
24
|
+
flutter: FlutterConfigSchema.optional(),
|
|
25
|
+
});
|
|
26
|
+
/**
|
|
27
|
+
* Check if a directory exists
|
|
28
|
+
*/
|
|
29
|
+
async function directoryExists(dirPath) {
|
|
30
|
+
try {
|
|
31
|
+
const stats = await fs.stat(dirPath);
|
|
32
|
+
return stats.isDirectory();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Find pubspec.yaml in directory or parent directories
|
|
40
|
+
*/
|
|
41
|
+
async function findPubspecYaml(startPath) {
|
|
42
|
+
let currentPath = path.resolve(startPath);
|
|
43
|
+
while (currentPath !== path.dirname(currentPath)) {
|
|
44
|
+
const pubspecPath = path.join(currentPath, "pubspec.yaml");
|
|
45
|
+
if (existsSync(pubspecPath)) {
|
|
46
|
+
return pubspecPath;
|
|
47
|
+
}
|
|
48
|
+
currentPath = path.dirname(currentPath);
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Simple YAML parser (basic implementation without external dependency)
|
|
54
|
+
*/
|
|
55
|
+
function parseYaml(content) {
|
|
56
|
+
const lines = content.split("\n");
|
|
57
|
+
const result = {};
|
|
58
|
+
const stack = [{ obj: result, indent: -1 }];
|
|
59
|
+
for (const line of lines) {
|
|
60
|
+
const trimmed = line.trim();
|
|
61
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
62
|
+
continue;
|
|
63
|
+
const indent = line.search(/\S|$/);
|
|
64
|
+
const [key, ...valueParts] = trimmed.split(":");
|
|
65
|
+
const value = valueParts.join(":").trim();
|
|
66
|
+
// Pop stack to correct indent level
|
|
67
|
+
while (stack.length > 1 && indent <= stack[stack.length - 1].indent) {
|
|
68
|
+
stack.pop();
|
|
69
|
+
}
|
|
70
|
+
const current = stack[stack.length - 1].obj;
|
|
71
|
+
if (value === "") {
|
|
72
|
+
// It's a parent object or array
|
|
73
|
+
if (trimmed.endsWith("|")) {
|
|
74
|
+
// Multiline string
|
|
75
|
+
current[key] = "";
|
|
76
|
+
}
|
|
77
|
+
else if (trimmed.startsWith("- ")) {
|
|
78
|
+
// Array item (simplified)
|
|
79
|
+
if (!Array.isArray(current)) {
|
|
80
|
+
stack[stack.length - 1].obj = [];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
current[key] = {};
|
|
85
|
+
stack.push({ obj: current[key], indent });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Parse value
|
|
90
|
+
current[key] = parseYamlValue(value);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Parse YAML value (string, number, boolean, array)
|
|
97
|
+
*/
|
|
98
|
+
function parseYamlValue(value) {
|
|
99
|
+
value = value.trim();
|
|
100
|
+
// Remove quotes
|
|
101
|
+
if ((value.startsWith("'") && value.endsWith("'")) ||
|
|
102
|
+
(value.startsWith('"') && value.endsWith('"'))) {
|
|
103
|
+
return value.slice(1, -1);
|
|
104
|
+
}
|
|
105
|
+
// Boolean
|
|
106
|
+
if (value === "true")
|
|
107
|
+
return true;
|
|
108
|
+
if (value === "false")
|
|
109
|
+
return false;
|
|
110
|
+
// Null
|
|
111
|
+
if (value === "null" || value === "~")
|
|
112
|
+
return null;
|
|
113
|
+
// Number
|
|
114
|
+
if (/^\d+$/.test(value))
|
|
115
|
+
return parseInt(value, 10);
|
|
116
|
+
if (/^\d+\.\d+$/.test(value))
|
|
117
|
+
return parseFloat(value);
|
|
118
|
+
// Array
|
|
119
|
+
if (value.startsWith("[") && value.endsWith("]")) {
|
|
120
|
+
const items = value.slice(1, -1).split(",").map((v) => v.trim());
|
|
121
|
+
return items;
|
|
122
|
+
}
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Read and parse pubspec.yaml
|
|
127
|
+
*/
|
|
128
|
+
export async function readPubspecYaml(projectPath) {
|
|
129
|
+
try {
|
|
130
|
+
const pubspecPath = path.join(projectPath, "pubspec.yaml");
|
|
131
|
+
if (!existsSync(pubspecPath)) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
const content = await fs.readFile(pubspecPath, "utf-8");
|
|
135
|
+
const parsed = parseYaml(content);
|
|
136
|
+
return PubspecSchema.parse(parsed);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw new Error(`Failed to parse pubspec.yaml: ${error instanceof Error ? error.message : String(error)}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Detect if directory is a Flutter project
|
|
144
|
+
*/
|
|
145
|
+
export async function detectFlutterProject(projectPath) {
|
|
146
|
+
const result = {
|
|
147
|
+
isFlutterProject: false,
|
|
148
|
+
projectType: null,
|
|
149
|
+
flutterVersion: null,
|
|
150
|
+
hasPubspec: false,
|
|
151
|
+
errors: [],
|
|
152
|
+
};
|
|
153
|
+
try {
|
|
154
|
+
const pubspec = await readPubspecYaml(projectPath);
|
|
155
|
+
if (!pubspec) {
|
|
156
|
+
result.errors.push("pubspec.yaml not found");
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
result.hasPubspec = true;
|
|
160
|
+
// Check if it's a Flutter project by looking for flutter dependency
|
|
161
|
+
const hasFlutterDependency = pubspec.dependencies?.flutter !== undefined ||
|
|
162
|
+
pubspec.environment?.flutter !== undefined;
|
|
163
|
+
if (!hasFlutterDependency) {
|
|
164
|
+
result.errors.push("Flutter dependency not found in pubspec.yaml");
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
result.isFlutterProject = true;
|
|
168
|
+
// Determine project type
|
|
169
|
+
const hasAndroid = await directoryExists(path.join(projectPath, "android"));
|
|
170
|
+
const hasIOS = await directoryExists(path.join(projectPath, "ios"));
|
|
171
|
+
const hasWeb = await directoryExists(path.join(projectPath, "web"));
|
|
172
|
+
const hasLib = await directoryExists(path.join(projectPath, "lib"));
|
|
173
|
+
if (hasAndroid || hasIOS || hasWeb) {
|
|
174
|
+
result.projectType = "app";
|
|
175
|
+
}
|
|
176
|
+
else if (hasLib) {
|
|
177
|
+
result.projectType = "package";
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
result.projectType = "module";
|
|
181
|
+
}
|
|
182
|
+
// Try to get Flutter version from environment
|
|
183
|
+
result.flutterVersion = pubspec.environment?.flutter || null;
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
result.errors.push(error instanceof Error ? error.message : String(error));
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Analyze Flutter project structure
|
|
192
|
+
*/
|
|
193
|
+
export async function analyzeFlutterProject(projectPath) {
|
|
194
|
+
const result = {
|
|
195
|
+
projectPath,
|
|
196
|
+
projectName: null,
|
|
197
|
+
projectType: "unknown",
|
|
198
|
+
structure: {
|
|
199
|
+
hasLib: false,
|
|
200
|
+
hasAndroid: false,
|
|
201
|
+
hasIOS: false,
|
|
202
|
+
hasWeb: false,
|
|
203
|
+
hasLinux: false,
|
|
204
|
+
hasWindows: false,
|
|
205
|
+
hasMacOS: false,
|
|
206
|
+
hasTest: false,
|
|
207
|
+
hasIntegrationTest: false,
|
|
208
|
+
},
|
|
209
|
+
fileCount: 0,
|
|
210
|
+
dartFileCount: 0,
|
|
211
|
+
errors: [],
|
|
212
|
+
};
|
|
213
|
+
try {
|
|
214
|
+
const pubspec = await readPubspecYaml(projectPath);
|
|
215
|
+
if (pubspec) {
|
|
216
|
+
result.projectName = pubspec.name;
|
|
217
|
+
}
|
|
218
|
+
// Check directory structure
|
|
219
|
+
const dirs = [
|
|
220
|
+
"lib",
|
|
221
|
+
"android",
|
|
222
|
+
"ios",
|
|
223
|
+
"web",
|
|
224
|
+
"linux",
|
|
225
|
+
"windows",
|
|
226
|
+
"macos",
|
|
227
|
+
"test",
|
|
228
|
+
"integration_test",
|
|
229
|
+
];
|
|
230
|
+
for (const dir of dirs) {
|
|
231
|
+
const exists = await directoryExists(path.join(projectPath, dir));
|
|
232
|
+
const key = dir === "macos" ? "hasMacOS" : `has${dir.charAt(0).toUpperCase() + dir.slice(1)}`;
|
|
233
|
+
result.structure[key] = exists;
|
|
234
|
+
}
|
|
235
|
+
// Determine project type
|
|
236
|
+
if (result.structure.hasAndroid || result.structure.hasIOS) {
|
|
237
|
+
result.projectType = "app";
|
|
238
|
+
}
|
|
239
|
+
else if (result.structure.hasLib) {
|
|
240
|
+
result.projectType = "package";
|
|
241
|
+
}
|
|
242
|
+
// Count files
|
|
243
|
+
result.dartFileCount = await countDartFiles(projectPath);
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
result.errors.push(error instanceof Error ? error.message : String(error));
|
|
247
|
+
}
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Count Dart files in project
|
|
252
|
+
*/
|
|
253
|
+
async function countDartFiles(dirPath) {
|
|
254
|
+
let count = 0;
|
|
255
|
+
try {
|
|
256
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
257
|
+
for (const entry of entries) {
|
|
258
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
259
|
+
if (entry.isDirectory()) {
|
|
260
|
+
// Skip node_modules, build, .dart_tool
|
|
261
|
+
if (entry.name === "node_modules" ||
|
|
262
|
+
entry.name === "build" ||
|
|
263
|
+
entry.name === ".dart_tool" ||
|
|
264
|
+
entry.name === ".git") {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
count += await countDartFiles(fullPath);
|
|
268
|
+
}
|
|
269
|
+
else if (entry.isFile() && entry.name.endsWith(".dart")) {
|
|
270
|
+
count++;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
// Ignore permission errors
|
|
276
|
+
}
|
|
277
|
+
return count;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Get Flutter project information
|
|
281
|
+
*/
|
|
282
|
+
export async function getFlutterProjectInfo(projectPath) {
|
|
283
|
+
const result = {
|
|
284
|
+
name: null,
|
|
285
|
+
description: null,
|
|
286
|
+
version: null,
|
|
287
|
+
sdkVersion: null,
|
|
288
|
+
flutterVersion: null,
|
|
289
|
+
dependencies: {},
|
|
290
|
+
devDependencies: {},
|
|
291
|
+
usesMaterialDesign: false,
|
|
292
|
+
assets: [],
|
|
293
|
+
errors: [],
|
|
294
|
+
};
|
|
295
|
+
try {
|
|
296
|
+
const pubspec = await readPubspecYaml(projectPath);
|
|
297
|
+
if (!pubspec) {
|
|
298
|
+
result.errors.push("pubspec.yaml not found");
|
|
299
|
+
return result;
|
|
300
|
+
}
|
|
301
|
+
result.name = pubspec.name;
|
|
302
|
+
result.description = pubspec.description || null;
|
|
303
|
+
result.version = pubspec.version || null;
|
|
304
|
+
result.sdkVersion = pubspec.environment?.sdk || null;
|
|
305
|
+
result.flutterVersion = pubspec.environment?.flutter || null;
|
|
306
|
+
result.dependencies = pubspec.dependencies || {};
|
|
307
|
+
result.devDependencies = pubspec.dev_dependencies || {};
|
|
308
|
+
result.usesMaterialDesign = pubspec.flutter?.["uses-material-design"] || false;
|
|
309
|
+
result.assets = pubspec.flutter?.assets || [];
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
result.errors.push(error instanceof Error ? error.message : String(error));
|
|
313
|
+
}
|
|
314
|
+
return result;
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=flutter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flutter.js","sourceRoot":"","sources":["../../src/utils/flutter.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tac0de/flutter-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Repo-aware and Verify-first Flutter MCP Server for AI coding agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"flutter-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"watch": "tsc --watch",
|
|
16
|
+
"prepare": "npm run build",
|
|
17
|
+
"dev": "tsc --watch"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"flutter",
|
|
21
|
+
"mcp",
|
|
22
|
+
"model-context-protocol",
|
|
23
|
+
"dart",
|
|
24
|
+
"code-analysis"
|
|
25
|
+
],
|
|
26
|
+
"author": "tac0de",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
30
|
+
"zod": "^3.24.1"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^22.10.5",
|
|
34
|
+
"typescript": "^5.7.3"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18"
|
|
38
|
+
}
|
|
39
|
+
}
|