next2d-development-mcp 1.0.2 → 1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8KvD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8MvD"}
@@ -55,6 +55,26 @@ export function registerPrompts(server) {
55
55
  }
56
56
  ]
57
57
  }));
58
+ server.registerPrompt("orchestrate", {
59
+ "description": "Activate orchestrator mode for systematic Next2D development. " +
60
+ "Handles both NEW screen creation and EXISTING screen modification. " +
61
+ "Claude will inspect the screen state, plan changes, execute MCP tools, and validate.",
62
+ "argsSchema": {
63
+ "task": z.string().describe("What you want to build or change (e.g. 'add search to quest/list', 'implement home screen')"),
64
+ "screenPath": z.string().describe("Target screen path matching routing.json key (e.g. 'quest/list', 'home')"),
65
+ "mode": z.enum(["create", "modify"]).optional().default("create").describe("'create' for a new screen, 'modify' to change an existing screen")
66
+ }
67
+ }, async ({ task, screenPath, mode }) => ({
68
+ "messages": [
69
+ {
70
+ "role": "user",
71
+ "content": {
72
+ "type": "text",
73
+ "text": ORCHESTRATE_GUIDE(task, screenPath, mode ?? "create")
74
+ }
75
+ }
76
+ ]
77
+ }));
58
78
  server.registerPrompt("debug-help", {
59
79
  "description": "Common Next2D debugging tips and troubleshooting guide",
60
80
  "argsSchema": {
@@ -109,6 +129,116 @@ export function registerPrompts(server) {
109
129
  ]
110
130
  }));
111
131
  }
132
+ function ORCHESTRATE_GUIDE(task, screenPath, mode) {
133
+ const isModify = mode === "modify";
134
+ const createWorkflow = `
135
+ ## Phase 1: Analyze Current State
136
+ Call **\`analyze_project\`** to understand the overall project state.
137
+
138
+ ## Phase 2: Generate Implementation Plan
139
+ Call **\`plan_feature\`** with:
140
+ - \`screenPath\`: \`"${screenPath}"\`
141
+ - \`hasApi\`: \`true\` if API data is needed
142
+ - \`hasContent\`: \`true\` if Animation Tool (.n2d) assets are needed
143
+
144
+ The tool returns an ordered step list. Steps marked ✅ are already implemented — skip them.
145
+
146
+ ## Phase 3: Execute the Plan
147
+ For each step in the plan:
148
+ 1. Call the specified MCP tool to generate the code
149
+ 2. Write the file to the exact path shown
150
+ 3. Implement business logic as described in the step notes
151
+ 4. Run \`npm run generate\` after updating routing.json
152
+
153
+ ## Phase 4: Validate
154
+ Call **\`validate_architecture\`** to confirm all files exist and the structure is consistent.
155
+
156
+ **Start now:** call \`analyze_project\`.
157
+ `;
158
+ const modifyWorkflow = `
159
+ ## Phase 1: Inspect the Target Screen
160
+ Call **\`inspect_screen\`** with \`screenPath: "${screenPath}"\`.
161
+
162
+ This returns:
163
+ - routing.json configuration for this screen
164
+ - All related file paths (View, ViewModel, Page, UseCases, Repositories, Animations, Content)
165
+ - File line counts so you know how much is already implemented
166
+ - Missing files flagged with ❌
167
+
168
+ ## Phase 2: Read the Relevant Files
169
+ Using the **Read** tool, read the files that are related to the change:
170
+ - If changing UI → read the Page component
171
+ - If changing data flow → read ViewModel + UseCase
172
+ - If changing API → read Repository + Interface
173
+ - If changing navigation → read UseCase that calls \`app.gotoView()\`
174
+
175
+ **Read only what you need** — targeted modification, not full rewrites.
176
+
177
+ ## Phase 3: Plan and Execute Changes
178
+ Based on what you read, decide the minimal set of changes:
179
+
180
+ | Need to... | Action |
181
+ |---|---|
182
+ | Add a new action | Create UseCase with \`create_usecase\` tool |
183
+ | Add API access | Create Repository with \`create_repository\` tool |
184
+ | Add a UI element | Create component with \`create_ui_component\` tool |
185
+ | Add animation | Create animation with \`create_animation\` tool |
186
+ | Modify existing logic | Edit the specific file directly |
187
+
188
+ **Modification rules:**
189
+ - Change **only** what the task requires — no unrelated refactoring
190
+ - Keep single responsibility: one UseCase per action
191
+ - If modifying ViewModel, make sure View still delegates (no logic added to View)
192
+ - Buttons added/modified must use \`ButtonAtom.disable()\`/\`enable()\`
193
+
194
+ ## Phase 4: Validate
195
+ Call **\`validate_architecture\`** to confirm the screen structure remains consistent.
196
+
197
+ **Start now:** call \`inspect_screen\` with \`screenPath: "${screenPath}"\`.
198
+ `;
199
+ return `# Next2D Development Orchestrator
200
+
201
+ ## Task
202
+ ${task}
203
+
204
+ | Item | Value |
205
+ |------|-------|
206
+ | Target screen | \`${screenPath}\` |
207
+ | Mode | **${isModify ? "Modify existing screen" : "Create new screen"}** |
208
+
209
+ ## Your Role
210
+ You are a systematic development orchestrator for Next2D projects.
211
+ Follow the workflow below **in order**. Do not skip phases.
212
+ ${isModify ? modifyWorkflow : createWorkflow}
213
+ ---
214
+
215
+ ## Architecture Rules (always apply)
216
+ - **View** → extends \`View<ViewModel>\`, delegates to Page: \`page.initialize(this.vm)\`
217
+ - **ViewModel** → holds UseCases, no direct UI, fetches data in \`initialize()\`
218
+ - **UseCase** → one action = one class, single \`execute()\` entry point
219
+ - **Repository** → try-catch required, endpoint from \`config.api.endPoint\`, no \`any\` type
220
+ - **Buttons** → \`ButtonAtom.disable()\` on press, \`enable()\` after action or in \`Job.COMPLETE\`
221
+ - **Interfaces** → \`I\` prefix, minimal properties only
222
+
223
+ ---
224
+
225
+ ## Tool Reference
226
+
227
+ | Tool | When to use |
228
+ |------|-------------|
229
+ | \`inspect_screen\` | Before modifying — understand what exists |
230
+ | \`analyze_project\` | Before creating — see overall project state |
231
+ | \`plan_feature\` | Generate ordered creation steps |
232
+ | \`create_usecase\` | Add a new action/behavior |
233
+ | \`create_repository\` | Add new API/data access |
234
+ | \`create_interface\` | Define a new response/DTO type |
235
+ | \`create_ui_component\` | Add Page/Molecule/Atom/Content |
236
+ | \`create_animation\` | Add Tween animation |
237
+ | \`create_view\` | Generate View + ViewModel pair |
238
+ | \`add_route\` | Register new route in routing.json |
239
+ | \`validate_architecture\` | Final consistency check |
240
+ `;
241
+ }
112
242
  const ARCHITECTURE_GUIDE = `# Next2D Architecture & Coding Conventions
113
243
 
114
244
  ## MVVM + Clean Architecture
@@ -138,11 +268,11 @@ const ARCHITECTURE_GUIDE = `# Next2D Architecture & Coding Conventions
138
268
  - All public methods must have JSDoc comments
139
269
 
140
270
  ### View Rules
141
- - Extends \`Sprite\` (via framework \`View\` class)
271
+ - Extends \`View<ViewModel>\` generic class from framework
142
272
  - **No business logic** - only display structure
143
- - Constructor receives ViewModel and creates Page component with \`addChild()\`
144
- - \`initialize()\`: Delegates to Page for UI setup and event binding
145
- - \`onEnter()\`: Delegates to Page for entry animations
273
+ - Constructor receives ViewModel, calls \`super(vm)\`, creates Page component and \`addChild()\`
274
+ - \`initialize()\`: Delegates to \`this._xxxPage.initialize(this.vm)\`
275
+ - \`onEnter()\`: Delegates to \`await this._xxxPage.onEnter()\`
146
276
  - \`onExit()\`: Cleanup when view is hidden
147
277
 
148
278
  ### ViewModel Rules
@@ -191,21 +321,49 @@ content.addEventListener(PointerEvent.POINTER_DOWN, (event: PointerEvent): void
191
321
  \`\`\`typescript
192
322
  // ButtonAtom provides disable()/enable() for mouseEnabled/mouseChildren control
193
323
 
194
- // In Page.initialize(vm):
324
+ // Pattern 1: Normal button (re-enable on POINTER_UP)
195
325
  button.addEventListener(PointerEvent.POINTER_UP, async (): Promise<void> => {
196
326
  button.disable(); // Immediately disable to prevent double-press
197
327
  await vm.onClickButton();
198
328
  button.enable(); // Re-enable after processing (skip if navigating away)
199
329
  });
200
330
 
201
- // In ViewModel (for async operations):
202
- async onClickButton (): Promise<void> {
203
- try {
204
- await this.fetchDataUseCase.execute();
205
- } catch (error) {
206
- console.error(error);
207
- }
208
- }
331
+ // Pattern 2: Tween animation (re-enable in Job.COMPLETE callback)
332
+ button.addEventListener(PointerEvent.POINTER_UP, (): void => {
333
+ button.disable();
334
+ new ButtonPointerUpAnimation(button, () => { button.enable(); }).start();
335
+ });
336
+ \`\`\`
337
+
338
+ ### Display Object Hierarchy
339
+ \`\`\`
340
+ DisplayObject (base)
341
+ ├── InteractiveObject
342
+ │ ├── DisplayObjectContainer
343
+ │ │ └── Sprite
344
+ │ │ └── MovieClip ← addChild() allowed, timeline animation
345
+ │ └── TextField ← addChild() NOT allowed, text display/input
346
+ ├── Shape ← addChild() NOT allowed, lightweight vector drawing
347
+ └── Video ← addChild() NOT allowed, video playback
348
+ \`\`\`
349
+ **Key type constraints:**
350
+ - \`Shape\` does NOT extend \`DisplayObjectContainer\` → \`addChild()\` unavailable
351
+ - \`Shape\` cannot be directly cast to \`Sprite\` → use \`as unknown as Sprite\` two-step assertion
352
+ - \`hitArea\` property type is \`Sprite | null\` → type assertion required when passing \`Shape\`
353
+
354
+ ### Content Security Policy (CSP)
355
+ Required directives for Next2D Player (WebGL/WebGPU, Web Workers, Blob URLs):
356
+ \`\`\`
357
+ default-src 'self' data: blob: ← Blob URL/Data URI used internally
358
+ style-src 'self' 'unsafe-inline' ← Dynamic style injection by Player
359
+ worker-src 'self' blob: data: ← Web Worker via Blob/Data URI
360
+ \`\`\`
361
+ **NEVER add \`frame-ancestors 'none'\`** — it will break the application.
362
+
363
+ ### E2E Testing Recommendation
364
+ After screen transitions or UI behavior changes, verify with Playwright:
365
+ \`\`\`bash
366
+ npx playwright test
209
367
  \`\`\`
210
368
  `;
211
369
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
@@ -6,10 +6,10 @@ describe("Prompt registration", () => {
6
6
  beforeEach(() => {
7
7
  server = new McpServer({ name: "test", version: "0.0.1" });
8
8
  });
9
- it("registers 3 prompts without error", () => {
9
+ it("registers 4 prompts without error", () => {
10
10
  const spy = vi.spyOn(server, "registerPrompt");
11
11
  registerPrompts(server);
12
- expect(spy).toHaveBeenCalledTimes(3);
12
+ expect(spy).toHaveBeenCalledTimes(4);
13
13
  });
14
14
  it("registers expected prompt names", () => {
15
15
  const spy = vi.spyOn(server, "registerPrompt");
@@ -18,6 +18,7 @@ describe("Prompt registration", () => {
18
18
  expect(names).toContain("new-screen");
19
19
  expect(names).toContain("architecture-guide");
20
20
  expect(names).toContain("debug-help");
21
+ expect(names).toContain("orchestrate");
21
22
  });
22
23
  });
23
24
  //# sourceMappingURL=prompts.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../../src/prompts/prompts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,IAAI,MAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACZ,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC/C,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC/C,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"prompts.test.js","sourceRoot":"","sources":["../../src/prompts/prompts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,IAAI,MAAiB,CAAC;IAEtB,UAAU,CAAC,GAAG,EAAE;QACZ,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC/C,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC/C,eAAe,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -109,9 +109,9 @@ Application Layer (model/application/)
109
109
  \`\`\`
110
110
 
111
111
  ### View Layer (src/view/, src/ui/)
112
- - **View**: Extends Sprite, manages display structure. No business logic.
113
- - **ViewModel**: Bridge between View and Model. Holds UseCases.
114
- - **UI Components**: Atomic Design hierarchy (Atom → Molecule → Organism → Page)
112
+ - **View**: Extends \`View<ViewModel>\` generic class. No business logic. Constructor calls \`super(vm)\`, creates Page component.
113
+ - **ViewModel**: Bridge between View and Model. Holds UseCases. Initialized before View.
114
+ - **UI Components**: Atomic Design hierarchy (Atom → Molecule → Organism → Page). View delegates to Page for UI setup.
115
115
 
116
116
  ### Interface Layer (src/interface/)
117
117
  - TypeScript interfaces with \`I\` prefix
@@ -158,9 +158,26 @@ URL-to-View mapping with request configurations.
158
158
  \`\`\`
159
159
  ViewModel.constructor → ViewModel.initialize() → View.constructor(vm) → View.initialize() → View.onEnter() → (interaction) → View.onExit()
160
160
  \`\`\`
161
+ **Note:** View delegates to Page component: \`initialize()\` calls \`page.initialize(this.vm)\`, \`onEnter()\` calls \`await page.onEnter()\`.
162
+
163
+ ## Display Object Hierarchy
164
+ \`\`\`
165
+ DisplayObject (base)
166
+ ├── InteractiveObject
167
+ │ ├── DisplayObjectContainer
168
+ │ │ └── Sprite
169
+ │ │ └── MovieClip ← addChild() allowed, timeline animation
170
+ │ └── TextField ← addChild() NOT allowed, text display/input
171
+ ├── Shape ← addChild() NOT allowed, lightweight vector drawing
172
+ └── Video ← addChild() NOT allowed, video playback
173
+ \`\`\`
174
+ **Key constraints:**
175
+ - \`Shape\` has no \`addChild()\` — use \`Sprite\` or \`MovieClip\` as container
176
+ - Casting \`Shape\` to \`Sprite\`: requires \`as unknown as Sprite\` two-step assertion
177
+ - \`hitArea\` is \`Sprite | null\` — type assertion required for \`Shape\`
161
178
 
162
179
  ## Key Rules
163
- 1. View: Display only. Delegate events to ViewModel.
180
+ 1. View: Display only. Delegate events to ViewModel. Use \`View<ViewModel>\` generic.
164
181
  2. ViewModel: Hold UseCases. Depend on interfaces. Get data via \`app.getResponse()\`.
165
182
  3. UseCase: Single responsibility. \`execute()\` entry point. Can call Repository, Domain, framework APIs.
166
183
  4. Repository: try-catch required. Config for endpoints. Return typed interfaces.
@@ -168,6 +185,8 @@ ViewModel.constructor → ViewModel.initialize() → View.constructor(vm) → Vi
168
185
  6. No \`any\` type. Explicit types always.
169
186
  7. Domain: No external API/DB dependencies (Next2D display APIs allowed). Pure business logic.
170
187
  8. Animation: Separate from components. Use Tween/Easing/Job.
188
+ 9. CSP: \`default-src 'self' data: blob:\`, \`worker-src 'self' blob: data:\`, \`style-src 'self' 'unsafe-inline'\` required. NEVER add \`frame-ancestors 'none'\`.
189
+ 10. E2E: After UI/screen changes, run \`npx playwright test\` to verify behavior.
171
190
 
172
191
  ## DisplayObject Centering Pattern
173
192
  \`\`\`typescript
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.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 registerAnalyzeProject(server: McpServer): void;
3
+ //# sourceMappingURL=analyzeProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeProject.d.ts","sourceRoot":"","sources":["../../src/tools/analyzeProject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2J9D"}
@@ -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"}
@@ -0,0 +1,254 @@
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
+ export function registerPlanFeature(server) {
11
+ server.registerTool("plan_feature", {
12
+ "description": "Generate a systematic, ordered implementation plan for a new Next2D screen or feature. " +
13
+ "Checks what already exists in the project and produces step-by-step instructions " +
14
+ "with specific MCP tool calls to execute. " +
15
+ "Run analyze_project first to understand current state.",
16
+ "inputSchema": {
17
+ "screenPath": z.string().describe("Screen path matching routing.json key (e.g. 'quest/list', 'home', 'settings')"),
18
+ "hasApi": z.boolean().optional().default(false).describe("Does this screen fetch data from an external API?"),
19
+ "hasContent": z.boolean().optional().default(false).describe("Does this screen use Animation Tool (.n2d) content?"),
20
+ "projectPath": z.string().optional().default(".").describe("Path to project root directory (default: current directory)")
21
+ }
22
+ }, async ({ screenPath, hasApi, hasContent, projectPath }) => {
23
+ const base = path.resolve(projectPath);
24
+ const pascal = toPascal(screenPath);
25
+ const screenDir = screenPath.includes("/")
26
+ ? screenPath.split("/")[0].toLowerCase()
27
+ : screenPath.toLowerCase();
28
+ // --- Detect what already exists ---
29
+ const routingPath = path.join(base, "src/config/routing.json");
30
+ let routeExists = false;
31
+ if (fs.existsSync(routingPath)) {
32
+ try {
33
+ const routing = JSON.parse(fs.readFileSync(routingPath, "utf-8"));
34
+ routeExists = screenPath in routing;
35
+ }
36
+ catch { /* ignore */ }
37
+ }
38
+ const viewExists = fs.existsSync(path.join(base, `src/view/${screenDir}/${pascal}View.ts`));
39
+ const vmExists = fs.existsSync(path.join(base, `src/view/${screenDir}/${pascal}ViewModel.ts`));
40
+ const repoExists = fs.existsSync(path.join(base, `src/model/infrastructure/repository/${pascal}Repository.ts`));
41
+ const pageExists = fs.existsSync(path.join(base, `src/ui/component/page/${screenDir}/${pascal}Page.ts`));
42
+ const contentExists = fs.existsSync(path.join(base, `src/ui/content/${pascal}Content.ts`));
43
+ const lines = [
44
+ `## Implementation Plan: \`${screenPath}\``,
45
+ "",
46
+ "| Item | Value |",
47
+ "|------|-------|",
48
+ `| Screen path | \`${screenPath}\` |`,
49
+ `| Class prefix | \`${pascal}\` |`,
50
+ `| View directory | \`src/view/${screenDir}/\` |`,
51
+ `| Features | ${[hasApi ? "API data" : "", hasContent ? "Animation Tool content" : ""].filter(Boolean).join(", ") || "Basic screen"} |`,
52
+ "",
53
+ "---",
54
+ ""
55
+ ];
56
+ let step = 1;
57
+ // ── Step: Route ──────────────────────────────────────────────
58
+ if (routeExists) {
59
+ lines.push(`### ✅ Route \`${screenPath}\` already defined in routing.json`);
60
+ }
61
+ else {
62
+ lines.push(`### Step ${step}: Add Route`);
63
+ lines.push("**Tool:** `add_route`");
64
+ lines.push("```json");
65
+ lines.push("{");
66
+ lines.push(` "path": "${screenPath}",`);
67
+ lines.push(" \"requests\": [");
68
+ if (hasContent) {
69
+ lines.push(` { "type": "content", "path": "{{ content.endPoint }}content/${screenPath}.json", "name": "${pascal}Content", "cache": true }${hasApi ? "," : ""}`);
70
+ }
71
+ if (hasApi) {
72
+ lines.push(` { "type": "json", "path": "{{ api.endPoint }}api/${screenPath}.json", "name": "${pascal}Data" }`);
73
+ }
74
+ lines.push(" ]");
75
+ lines.push("}");
76
+ lines.push("```");
77
+ step++;
78
+ }
79
+ lines.push("");
80
+ // ── Step: Interface (API response type) ──────────────────────
81
+ if (hasApi) {
82
+ lines.push(`### Step ${step}: Define API Response Interface`);
83
+ lines.push("**Tool:** `create_interface`");
84
+ lines.push("```");
85
+ lines.push("create_interface({");
86
+ lines.push(` name: "${pascal}Response",`);
87
+ lines.push(" properties: [{ name: \"id\", type: \"string\" }, { name: \"name\", type: \"string\" }]");
88
+ lines.push("})");
89
+ lines.push("```");
90
+ lines.push(`**Output:** \`src/interface/I${pascal}Response.ts\``);
91
+ lines.push("**Note:** Define only the properties you actually use (minimal interface rule)");
92
+ lines.push("");
93
+ step++;
94
+ // ── Step: Repository ─────────────────────────────────────
95
+ if (repoExists) {
96
+ lines.push(`### ✅ ${pascal}Repository already exists`);
97
+ }
98
+ else {
99
+ lines.push(`### Step ${step}: Create Repository`);
100
+ lines.push("**Tool:** `create_repository`");
101
+ lines.push("```");
102
+ lines.push(`create_repository({ name: "${pascal}", method: "get" })`);
103
+ lines.push("```");
104
+ lines.push(`**Output:** \`src/model/infrastructure/repository/${pascal}Repository.ts\``);
105
+ lines.push("**Implement:**");
106
+ lines.push(`- Endpoint: \`\${config.api.endPoint}api/${screenPath}.json\``);
107
+ lines.push(`- Return type: \`Promise<I${pascal}Response>\``);
108
+ lines.push("- Wrap in try-catch (required)");
109
+ step++;
110
+ }
111
+ lines.push("");
112
+ // ── Step: Fetch UseCase ──────────────────────────────────
113
+ lines.push(`### Step ${step}: Create Fetch UseCase`);
114
+ lines.push("**Tool:** `create_usecase`");
115
+ lines.push("```");
116
+ lines.push(`create_usecase({ name: "Fetch${pascal}Data", screen: "${screenDir}" })`);
117
+ lines.push("```");
118
+ lines.push(`**Output:** \`src/model/application/${screenDir}/usecase/Fetch${pascal}DataUseCase.ts\``);
119
+ lines.push("**Implement:** Call Repository, return typed data");
120
+ lines.push("");
121
+ step++;
122
+ }
123
+ // ── Step: Navigation UseCase ─────────────────────────────────
124
+ lines.push(`### Step ${step}: Create Navigation UseCase`);
125
+ lines.push("**Tool:** `create_usecase`");
126
+ lines.push("```");
127
+ lines.push(`create_usecase({ name: "NavigateToView", screen: "${screenDir}" })`);
128
+ lines.push("```");
129
+ lines.push(`**Output:** \`src/model/application/${screenDir}/usecase/NavigateToViewUseCase.ts\``);
130
+ lines.push("**Implement:** `await app.gotoView(viewName)` inside execute()");
131
+ lines.push("");
132
+ step++;
133
+ // ── Step: View / ViewModel ───────────────────────────────────
134
+ if (viewExists && vmExists) {
135
+ lines.push(`### ✅ ${pascal}View and ${pascal}ViewModel already exist`);
136
+ }
137
+ else {
138
+ lines.push(`### Step ${step}: Generate View & ViewModel`);
139
+ lines.push("**Preferred:** `npm run generate` (auto-generates from routing.json)");
140
+ lines.push("**Or Tool:** `create_view`");
141
+ lines.push("```");
142
+ lines.push(`create_view({ name: "${screenPath}" })`);
143
+ lines.push("```");
144
+ lines.push("**Output:**");
145
+ lines.push(`- \`src/view/${screenDir}/${pascal}View.ts\``);
146
+ lines.push(`- \`src/view/${screenDir}/${pascal}ViewModel.ts\``);
147
+ lines.push("**After creation:**");
148
+ lines.push(`- Register in \`src/Packages.ts\` (import ${pascal}View, ${pascal}ViewModel)`);
149
+ lines.push(`- Add \`"${screenPath}"\` to \`src/interface/IViewName.ts\` union type`);
150
+ step++;
151
+ }
152
+ lines.push("");
153
+ // ── Step: Page Component ─────────────────────────────────────
154
+ if (pageExists) {
155
+ lines.push(`### ✅ ${pascal}Page already exists`);
156
+ }
157
+ else {
158
+ lines.push(`### Step ${step}: Create Page Component`);
159
+ lines.push("**Tool:** `create_ui_component`");
160
+ lines.push("```");
161
+ lines.push(`create_ui_component({ name: "${pascal}Page", level: "page", screen: "${screenDir}" })`);
162
+ lines.push("```");
163
+ lines.push(`**Output:** \`src/ui/component/page/${screenDir}/${pascal}Page.ts\``);
164
+ lines.push("**Implement:**");
165
+ lines.push("- `initialize(vm)`: Create Atom/Molecule components, register event listeners");
166
+ lines.push("- `onEnter()`: Start entry animations");
167
+ lines.push("- Events must delegate to ViewModel methods (no logic in Page)");
168
+ step++;
169
+ }
170
+ lines.push("");
171
+ // ── Step: Content (if needed) ────────────────────────────────
172
+ if (hasContent) {
173
+ if (contentExists) {
174
+ lines.push(`### ✅ ${pascal}Content already exists`);
175
+ }
176
+ else {
177
+ lines.push(`### Step ${step}: Create Animation Tool Content Wrapper`);
178
+ lines.push("**Tool:** `create_ui_component`");
179
+ lines.push("```");
180
+ lines.push(`create_ui_component({ name: "${pascal}Content", level: "content" })`);
181
+ lines.push("```");
182
+ lines.push(`**Output:** \`src/ui/content/${pascal}Content.ts\``);
183
+ lines.push("**Remember:** Set `namespace` to match the Animation Tool symbol name exactly");
184
+ step++;
185
+ }
186
+ lines.push("");
187
+ }
188
+ // ── Step: Animation ──────────────────────────────────────────
189
+ lines.push(`### Step ${step}: Create Entry Animation (recommended)`);
190
+ lines.push("**Tool:** `create_animation`");
191
+ lines.push("```");
192
+ lines.push(`create_animation({ component: "${pascal}Page", action: "Show", screen: "${screenDir}" })`);
193
+ lines.push("```");
194
+ lines.push(`**Output:** \`src/ui/animation/${screenDir}/${pascal}PageShowAnimation.ts\``);
195
+ lines.push("**Implement:** Use `Tween.add()` with `Easing.*`. Call `job.start()` in `onEnter()`");
196
+ lines.push("");
197
+ step++;
198
+ // ── Step: Validate ───────────────────────────────────────────
199
+ lines.push(`### Step ${step}: Validate Architecture`);
200
+ lines.push("**Tool:** `validate_architecture`");
201
+ lines.push("Confirm all required files exist and the project structure is consistent.");
202
+ lines.push("");
203
+ // ── Implementation Notes ─────────────────────────────────────
204
+ lines.push("---");
205
+ lines.push("");
206
+ lines.push("## Key Implementation Rules");
207
+ lines.push("");
208
+ lines.push("### View Pattern");
209
+ lines.push("```typescript");
210
+ lines.push(`export class ${pascal}View extends View<${pascal}ViewModel> {`);
211
+ lines.push(` private readonly _${screenDir}Page: ${pascal}Page;`);
212
+ lines.push(` constructor(vm: ${pascal}ViewModel) {`);
213
+ lines.push(" super(vm);");
214
+ lines.push(` this._${screenDir}Page = new ${pascal}Page();`);
215
+ lines.push(` this.addChild(this._${screenDir}Page);`);
216
+ lines.push(" }");
217
+ lines.push(` async initialize(): Promise<void> { this._${screenDir}Page.initialize(this.vm); }`);
218
+ lines.push(` async onEnter(): Promise<void> { await this._${screenDir}Page.onEnter(); }`);
219
+ lines.push(" async onExit(): Promise<void> { return void 0; }");
220
+ lines.push("}");
221
+ lines.push("```");
222
+ lines.push("");
223
+ lines.push("### ViewModel Pattern");
224
+ if (hasApi) {
225
+ lines.push("```typescript");
226
+ lines.push("async initialize(): Promise<void> {");
227
+ lines.push(" const response = app.getResponse();");
228
+ lines.push(` if (response.has("${pascal}Data")) {`);
229
+ lines.push(` this.data = response.get("${pascal}Data") as I${pascal}Response;`);
230
+ lines.push(" }");
231
+ lines.push("}");
232
+ lines.push("```");
233
+ }
234
+ lines.push("");
235
+ lines.push("### Button Double-Press Prevention");
236
+ lines.push("```typescript");
237
+ lines.push("// In Page.initialize(vm):");
238
+ lines.push("btn.addEventListener(PointerEvent.POINTER_UP, async (): Promise<void> => {");
239
+ lines.push(" btn.disable();");
240
+ lines.push(" await vm.onClickButton();");
241
+ lines.push(" btn.enable(); // omit if navigating away");
242
+ lines.push("});");
243
+ lines.push("```");
244
+ return {
245
+ "content": [
246
+ {
247
+ "type": "text",
248
+ "text": lines.join("\n")
249
+ }
250
+ ]
251
+ };
252
+ });
253
+ }
254
+ //# sourceMappingURL=planFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planFeature.js","sourceRoot":"","sources":["../../src/tools/planFeature.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,9 @@ import { registerAddRoute } from "./addRoute.js";
8
8
  import { registerCreateInterface } from "./createInterface.js";
9
9
  import { registerCreateAnimation } from "./createAnimation.js";
10
10
  import { registerCreateDomainService } from "./createDomainService.js";
11
+ import { registerAnalyzeProject } from "./analyzeProject.js";
12
+ import { registerPlanFeature } from "./planFeature.js";
13
+ import { registerInspectScreen } from "./inspectScreen.js";
11
14
  import { registerTools } from "./index.js";
12
15
  describe("Tool registration", () => {
13
16
  let server;
@@ -38,10 +41,19 @@ describe("Tool registration", () => {
38
41
  it("registerCreateDomainService registers without error", () => {
39
42
  expect(() => registerCreateDomainService(server)).not.toThrow();
40
43
  });
41
- it("registerTools registers all 10 tools", () => {
44
+ it("registerAnalyzeProject registers without error", () => {
45
+ expect(() => registerAnalyzeProject(server)).not.toThrow();
46
+ });
47
+ it("registerPlanFeature registers without error", () => {
48
+ expect(() => registerPlanFeature(server)).not.toThrow();
49
+ });
50
+ it("registerInspectScreen registers without error", () => {
51
+ expect(() => registerInspectScreen(server)).not.toThrow();
52
+ });
53
+ it("registerTools registers all 13 tools", () => {
42
54
  const spy = vi.spyOn(server, "registerTool");
43
55
  registerTools(server);
44
- expect(spy).toHaveBeenCalledTimes(10);
56
+ expect(spy).toHaveBeenCalledTimes(13);
45
57
  const toolNames = spy.mock.calls.map((call) => call[0]);
46
58
  expect(toolNames).toContain("create_view");
47
59
  expect(toolNames).toContain("create_usecase");
@@ -53,6 +65,9 @@ describe("Tool registration", () => {
53
65
  expect(toolNames).toContain("create_animation");
54
66
  expect(toolNames).toContain("create_domain_service");
55
67
  expect(toolNames).toContain("create_loading");
68
+ expect(toolNames).toContain("analyze_project");
69
+ expect(toolNames).toContain("plan_feature");
70
+ expect(toolNames).toContain("inspect_screen");
56
71
  });
57
72
  });
58
73
  //# sourceMappingURL=tools.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/tools/tools.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/tools/tools.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "next2d-development-mcp",
3
3
  "displayName": "Next2D Development MCP",
4
- "version": "1.0.2",
4
+ "version": "1.1.0",
5
5
  "description": "MCP server for Next2D application development assistance",
6
6
  "type": "module",
7
7
  "author": "Toshiyuki Ienaga <ienaga@next2d.app>",
@@ -52,7 +52,7 @@
52
52
  },
53
53
  "devDependencies": {
54
54
  "@eslint/js": "^10.0.1",
55
- "@types/node": "^25.3.0",
55
+ "@types/node": "^25.3.1",
56
56
  "@types/vscode": "^1.109.0",
57
57
  "@typescript-eslint/eslint-plugin": "^8.56.1",
58
58
  "@typescript-eslint/parser": "^8.56.1",