next2d-development-mcp 1.0.2 → 1.1.1

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.
@@ -0,0 +1,159 @@
1
+ import { z } from "zod";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ function walkDir(dir, suffix, results = []) {
5
+ if (!fs.existsSync(dir)) {
6
+ return results;
7
+ }
8
+ for (const entry of fs.readdirSync(dir, { "withFileTypes": true })) {
9
+ const full = path.join(dir, entry.name);
10
+ if (entry.isDirectory()) {
11
+ walkDir(full, suffix, results);
12
+ }
13
+ else if (entry.isFile() && entry.name.endsWith(suffix)) {
14
+ results.push(full);
15
+ }
16
+ }
17
+ return results;
18
+ }
19
+ export function registerAnalyzeProject(server) {
20
+ server.registerTool("analyze_project", {
21
+ "description": "Analyze the current Next2D project state. " +
22
+ "Reads routing.json, scans View/ViewModel/UseCase/Repository files, " +
23
+ "and reports what is implemented vs. missing. " +
24
+ "Use this before planning new features to understand the current state.",
25
+ "inputSchema": {
26
+ "projectPath": z.string().optional().default(".").describe("Path to the project root directory (default: current directory)")
27
+ }
28
+ }, async ({ projectPath }) => {
29
+ const base = path.resolve(projectPath);
30
+ const lines = [
31
+ "## Next2D Project Analysis",
32
+ "",
33
+ `**Project root:** \`${base}\``,
34
+ ""
35
+ ];
36
+ // --- routing.json ---
37
+ const routingPath = path.join(base, "src/config/routing.json");
38
+ const routes = [];
39
+ const missingViews = [];
40
+ if (fs.existsSync(routingPath)) {
41
+ try {
42
+ const routing = JSON.parse(fs.readFileSync(routingPath, "utf-8"));
43
+ const clusters = Object.keys(routing).filter((k) => k.startsWith("@"));
44
+ const screenRoutes = Object.keys(routing).filter((k) => !k.startsWith("@"));
45
+ lines.push(`### Screens (${screenRoutes.length} routes, ${clusters.length} clusters)`);
46
+ for (const route of screenRoutes) {
47
+ routes.push(route);
48
+ const screenDir = route.includes("/")
49
+ ? route.split("/")[0].toLowerCase()
50
+ : route.toLowerCase();
51
+ const pascal = route
52
+ .split("/")
53
+ .map((s) => s.charAt(0).toUpperCase() + s.slice(1))
54
+ .join("");
55
+ const viewFile = path.join(base, `src/view/${screenDir}/${pascal}View.ts`);
56
+ const vmFile = path.join(base, `src/view/${screenDir}/${pascal}ViewModel.ts`);
57
+ const hasView = fs.existsSync(viewFile);
58
+ const hasVM = fs.existsSync(vmFile);
59
+ const entry = routing[route];
60
+ const reqs = Array.isArray(entry.requests)
61
+ ? entry.requests
62
+ : [];
63
+ const hasApi = reqs.some((r) => r.type === "json" || r.type === "custom");
64
+ const hasContent = reqs.some((r) => r.type === "content");
65
+ const isPrivate = entry.private === true;
66
+ const tags = [
67
+ hasApi ? "[API]" : "",
68
+ hasContent ? "[Content]" : "",
69
+ isPrivate ? "[private]" : ""
70
+ ].filter(Boolean).join(" ");
71
+ const missing = [];
72
+ if (!hasView) {
73
+ missing.push("View");
74
+ }
75
+ if (!hasVM) {
76
+ missing.push("ViewModel");
77
+ }
78
+ const icon = missing.length === 0 ? "✅" : "⚠️";
79
+ const missingNote = missing.length > 0 ? ` ← missing: ${missing.join(", ")}` : "";
80
+ lines.push(`- ${icon} \`${route}\` → ${pascal} ${tags}${missingNote}`);
81
+ if (missing.length > 0) {
82
+ missingViews.push(route);
83
+ }
84
+ }
85
+ lines.push("");
86
+ }
87
+ catch {
88
+ lines.push("❌ routing.json is not valid JSON", "");
89
+ }
90
+ }
91
+ else {
92
+ lines.push("❌ `src/config/routing.json` not found", "");
93
+ }
94
+ // --- UseCases ---
95
+ const usecaseBase = path.join(base, "src/model/application");
96
+ const usecaseFiles = walkDir(usecaseBase, "UseCase.ts");
97
+ lines.push(`### UseCases (${usecaseFiles.length})`);
98
+ if (usecaseFiles.length === 0) {
99
+ lines.push("- (none)");
100
+ }
101
+ else {
102
+ for (const f of usecaseFiles) {
103
+ lines.push(`- \`${path.relative(base, f)}\``);
104
+ }
105
+ }
106
+ lines.push("");
107
+ // --- Repositories ---
108
+ const repoBase = path.join(base, "src/model/infrastructure/repository");
109
+ const repoFiles = walkDir(repoBase, "Repository.ts");
110
+ lines.push(`### Repositories (${repoFiles.length})`);
111
+ if (repoFiles.length === 0) {
112
+ lines.push("- (none)");
113
+ }
114
+ else {
115
+ for (const f of repoFiles) {
116
+ lines.push(`- \`${path.relative(base, f)}\``);
117
+ }
118
+ }
119
+ lines.push("");
120
+ // --- UI Components ---
121
+ const atomFiles = walkDir(path.join(base, "src/ui/component/atom"), ".ts");
122
+ const moleculeFiles = walkDir(path.join(base, "src/ui/component/molecule"), ".ts");
123
+ const pageFiles = walkDir(path.join(base, "src/ui/component/page"), ".ts");
124
+ const contentFiles = walkDir(path.join(base, "src/ui/content"), ".ts");
125
+ lines.push("### UI Components");
126
+ lines.push(`- Atoms: ${atomFiles.length}`);
127
+ lines.push(`- Molecules: ${moleculeFiles.length}`);
128
+ lines.push(`- Pages: ${pageFiles.length}`);
129
+ lines.push(`- Contents: ${contentFiles.length}`);
130
+ lines.push("");
131
+ // --- Summary & next actions ---
132
+ lines.push("### Summary");
133
+ if (missingViews.length === 0 && routes.length > 0) {
134
+ lines.push("✅ All routes have corresponding View/ViewModel implementations.");
135
+ }
136
+ else if (missingViews.length > 0) {
137
+ lines.push(`⚠️ ${missingViews.length} route(s) missing View/ViewModel:`);
138
+ for (const r of missingViews) {
139
+ lines.push(` - \`${r}\` → run \`npm run generate\` or use \`create_view\` tool`);
140
+ }
141
+ }
142
+ lines.push("");
143
+ lines.push("### Suggested Next Steps");
144
+ lines.push("- Use `plan_feature` tool to generate an ordered implementation plan for a new screen");
145
+ lines.push("- Use `validate_architecture` tool for a full structural check");
146
+ if (missingViews.length > 0) {
147
+ lines.push("- Run `npm run generate` to auto-create missing View/ViewModel pairs");
148
+ }
149
+ return {
150
+ "content": [
151
+ {
152
+ "type": "text",
153
+ "text": lines.join("\n")
154
+ }
155
+ ]
156
+ };
157
+ });
158
+ }
159
+ //# sourceMappingURL=analyzeProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeProject.js","sourceRoot":"","sources":["../../src/tools/analyzeProject.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,OAAO,EAAE,CAAC,EAAE,CAAC;AAEb,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAWrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAexB,OAAO,EAAE,CAAC,EAAE,CAAC;AAEb,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAcrD"}
@@ -9,6 +9,9 @@ import { registerValidateArchitecture } from "./validateArchitecture.js";
9
9
  import { registerCreateAnimation } from "./createAnimation.js";
10
10
  import { registerCreateDomainService } from "./createDomainService.js";
11
11
  import { registerCreateLoading } from "./createLoading.js";
12
+ import { registerAnalyzeProject } from "./analyzeProject.js";
13
+ import { registerPlanFeature } from "./planFeature.js";
14
+ import { registerInspectScreen } from "./inspectScreen.js";
12
15
  export { z };
13
16
  export function registerTools(server) {
14
17
  registerCreateView(server);
@@ -21,5 +24,8 @@ export function registerTools(server) {
21
24
  registerCreateAnimation(server);
22
25
  registerCreateDomainService(server);
23
26
  registerCreateLoading(server);
27
+ registerAnalyzeProject(server);
28
+ registerPlanFeature(server);
29
+ registerInspectScreen(server);
24
30
  }
25
31
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,CAAC,EAAE,CAAC;AAEb,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC3C,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,CAAC,EAAE,CAAC;AAEb,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC3C,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerInspectScreen(server: McpServer): void;
3
+ //# sourceMappingURL=inspectScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectScreen.d.ts","sourceRoot":"","sources":["../../src/tools/inspectScreen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsCzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwM7D"}
@@ -0,0 +1,223 @@
1
+ import { z } from "zod";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ function toPascal(name) {
5
+ return name
6
+ .split(/[/\-_]/)
7
+ .map((s) => s.charAt(0).toUpperCase() + s.slice(1))
8
+ .join("");
9
+ }
10
+ function walkDir(dir, suffix, results = []) {
11
+ if (!fs.existsSync(dir)) {
12
+ return results;
13
+ }
14
+ for (const entry of fs.readdirSync(dir, { "withFileTypes": true })) {
15
+ const full = path.join(dir, entry.name);
16
+ if (entry.isDirectory()) {
17
+ walkDir(full, suffix, results);
18
+ }
19
+ else if (entry.isFile() && entry.name.endsWith(suffix)) {
20
+ results.push(full);
21
+ }
22
+ }
23
+ return results;
24
+ }
25
+ function fileStatus(base, relativePath) {
26
+ const full = path.join(base, relativePath);
27
+ if (!fs.existsSync(full)) {
28
+ return { "exists": false, "lines": 0, "path": relativePath };
29
+ }
30
+ const content = fs.readFileSync(full, "utf-8");
31
+ const lines = content.split("\n").length;
32
+ return { "exists": true, lines, "path": relativePath };
33
+ }
34
+ export function registerInspectScreen(server) {
35
+ server.registerTool("inspect_screen", {
36
+ "description": "Inspect all implementation files for a specific Next2D screen. " +
37
+ "Lists View, ViewModel, Page, UseCases, Repositories, Animations, and Content " +
38
+ "related to the given screen path. Shows file existence, line counts, and " +
39
+ "routing.json configuration. Use this before modifying an existing screen " +
40
+ "to understand what is already implemented.",
41
+ "inputSchema": {
42
+ "screenPath": z.string().describe("Screen path matching routing.json key (e.g. 'quest/list', 'home', 'settings')"),
43
+ "projectPath": z.string().optional().default(".").describe("Path to the project root directory (default: current directory)")
44
+ }
45
+ }, async ({ screenPath, projectPath }) => {
46
+ const base = path.resolve(projectPath);
47
+ const pascal = toPascal(screenPath);
48
+ const screenDir = screenPath.includes("/")
49
+ ? screenPath.split("/")[0].toLowerCase()
50
+ : screenPath.toLowerCase();
51
+ const lines = [
52
+ `## Screen Inspection: \`${screenPath}\``,
53
+ "",
54
+ "| Item | Value |",
55
+ "|------|-------|",
56
+ `| Screen path | \`${screenPath}\` |`,
57
+ `| Class prefix | \`${pascal}\` |`,
58
+ `| Screen directory | \`src/view/${screenDir}/\` |`,
59
+ ""
60
+ ];
61
+ // --- routing.json entry ---
62
+ lines.push("### routing.json Configuration");
63
+ const routingPath = path.join(base, "src/config/routing.json");
64
+ if (fs.existsSync(routingPath)) {
65
+ try {
66
+ const routing = JSON.parse(fs.readFileSync(routingPath, "utf-8"));
67
+ if (screenPath in routing) {
68
+ lines.push("```json");
69
+ lines.push(JSON.stringify({ [screenPath]: routing[screenPath] }, null, 4));
70
+ lines.push("```");
71
+ }
72
+ else {
73
+ lines.push(`⚠️ Route \`${screenPath}\` not found in routing.json`);
74
+ lines.push("→ Add route first with `add_route` tool or `npm run generate`");
75
+ }
76
+ }
77
+ catch {
78
+ lines.push("❌ routing.json parse error");
79
+ }
80
+ }
81
+ else {
82
+ lines.push("❌ routing.json not found");
83
+ }
84
+ lines.push("");
85
+ // --- Core MVVM files ---
86
+ lines.push("### MVVM Files");
87
+ const coreFiles = [
88
+ { "label": "View", "rel": `src/view/${screenDir}/${pascal}View.ts` },
89
+ { "label": "ViewModel", "rel": `src/view/${screenDir}/${pascal}ViewModel.ts` }
90
+ ];
91
+ for (const f of coreFiles) {
92
+ const s = fileStatus(base, f.rel);
93
+ const icon = s.exists ? "✅" : "❌";
94
+ const detail = s.exists ? `(${s.lines} lines)` : "← missing";
95
+ lines.push(`- ${icon} **${f.label}**: \`${f.rel}\` ${detail}`);
96
+ }
97
+ lines.push("");
98
+ // --- Page component ---
99
+ lines.push("### Page Component");
100
+ const pageStat = fileStatus(base, `src/ui/component/page/${screenDir}/${pascal}Page.ts`);
101
+ const pageIcon = pageStat.exists ? "✅" : "❌";
102
+ const pageDetail = pageStat.exists ? `(${pageStat.lines} lines)` : "← missing";
103
+ lines.push(`- ${pageIcon} **Page**: \`${pageStat.path}\` ${pageDetail}`);
104
+ lines.push("");
105
+ // --- UseCases ---
106
+ lines.push("### UseCases");
107
+ const usecaseDir = path.join(base, `src/model/application/${screenDir}/usecase`);
108
+ const usecaseFiles = walkDir(usecaseDir, ".ts");
109
+ if (usecaseFiles.length === 0) {
110
+ lines.push("- ❌ No UseCases found");
111
+ lines.push(` → Expected in: \`src/model/application/${screenDir}/usecase/\``);
112
+ }
113
+ else {
114
+ for (const f of usecaseFiles) {
115
+ const rel = path.relative(base, f);
116
+ const content = fs.readFileSync(f, "utf-8");
117
+ const lc = content.split("\n").length;
118
+ lines.push(`- ✅ \`${rel}\` (${lc} lines)`);
119
+ }
120
+ }
121
+ lines.push("");
122
+ // --- Repositories ---
123
+ lines.push("### Repositories");
124
+ const repoDir = path.join(base, "src/model/infrastructure/repository");
125
+ const allRepos = walkDir(repoDir, "Repository.ts");
126
+ // Match repositories whose name starts with the pascal prefix
127
+ const screenRepos = allRepos.filter((f) => path.basename(f).startsWith(pascal));
128
+ if (screenRepos.length === 0) {
129
+ lines.push("- (none matching this screen)");
130
+ }
131
+ else {
132
+ for (const f of screenRepos) {
133
+ const rel = path.relative(base, f);
134
+ const content = fs.readFileSync(f, "utf-8");
135
+ const lc = content.split("\n").length;
136
+ lines.push(`- ✅ \`${rel}\` (${lc} lines)`);
137
+ }
138
+ }
139
+ lines.push("");
140
+ // --- Animations ---
141
+ lines.push("### Animations");
142
+ const animDir = path.join(base, `src/ui/animation/${screenDir}`);
143
+ const animFiles = walkDir(animDir, "Animation.ts");
144
+ if (animFiles.length === 0) {
145
+ lines.push("- (none)");
146
+ }
147
+ else {
148
+ for (const f of animFiles) {
149
+ const rel = path.relative(base, f);
150
+ lines.push(`- ✅ \`${rel}\``);
151
+ }
152
+ }
153
+ lines.push("");
154
+ // --- Content ---
155
+ lines.push("### Animation Tool Content");
156
+ const contentStat = fileStatus(base, `src/ui/content/${pascal}Content.ts`);
157
+ if (contentStat.exists) {
158
+ lines.push(`- ✅ \`${contentStat.path}\` (${contentStat.lines} lines)`);
159
+ }
160
+ else {
161
+ lines.push("- (none)");
162
+ }
163
+ lines.push("");
164
+ // --- Interfaces ---
165
+ lines.push("### Interfaces");
166
+ const interfaceDir = path.join(base, "src/interface");
167
+ const allInterfaces = walkDir(interfaceDir, ".ts");
168
+ // Match interfaces whose name contains the pascal prefix
169
+ const screenInterfaces = allInterfaces.filter((f) => {
170
+ const name = path.basename(f, ".ts");
171
+ return name.includes(pascal) || name.startsWith(`I${pascal}`);
172
+ });
173
+ if (screenInterfaces.length === 0) {
174
+ lines.push("- (none matching this screen)");
175
+ }
176
+ else {
177
+ for (const f of screenInterfaces) {
178
+ const rel = path.relative(base, f);
179
+ lines.push(`- ✅ \`${rel}\``);
180
+ }
181
+ }
182
+ lines.push("");
183
+ // --- Summary ---
184
+ const missing = [];
185
+ if (!coreFiles[0] || !fileStatus(base, coreFiles[0].rel).exists) {
186
+ missing.push("View");
187
+ }
188
+ if (!coreFiles[1] || !fileStatus(base, coreFiles[1].rel).exists) {
189
+ missing.push("ViewModel");
190
+ }
191
+ if (!pageStat.exists) {
192
+ missing.push("Page");
193
+ }
194
+ if (usecaseFiles.length === 0) {
195
+ missing.push("UseCase");
196
+ }
197
+ lines.push("### Summary");
198
+ if (missing.length === 0) {
199
+ lines.push("✅ All core files are implemented.");
200
+ }
201
+ else {
202
+ lines.push(`⚠️ Missing: ${missing.join(", ")}`);
203
+ }
204
+ lines.push("");
205
+ lines.push("### Next Steps for Modification");
206
+ lines.push("Read the files listed above with the **Read** tool to understand the current implementation.");
207
+ lines.push("Then plan your changes:");
208
+ lines.push("- **Add UseCase**: `create_usecase` tool");
209
+ lines.push("- **Add Repository**: `create_repository` tool");
210
+ lines.push("- **Add UI component**: `create_ui_component` tool");
211
+ lines.push("- **Add Animation**: `create_animation` tool");
212
+ lines.push("- **Modify existing file**: Read → plan changes → Edit");
213
+ return {
214
+ "content": [
215
+ {
216
+ "type": "text",
217
+ "text": lines.join("\n")
218
+ }
219
+ ]
220
+ };
221
+ });
222
+ }
223
+ //# sourceMappingURL=inspectScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspectScreen.js","sourceRoot":"","sources":["../../src/tools/inspectScreen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerPlanFeature(server: McpServer): void;
3
+ //# sourceMappingURL=planFeature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planFeature.d.ts","sourceRoot":"","sources":["../../src/tools/planFeature.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsR3D"}