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.
package/README.md CHANGED
@@ -1,9 +1,5 @@
1
1
  # next2d-development-mcp
2
2
 
3
- <div align="center">
4
- <img src="https://github.com/Next2D/next2d-development-mcp/raw/main/icon.png" width="180" alt="Next2D">
5
- </div>
6
-
7
3
  [![UnitTest](https://github.com/Next2D/next2d-development-mcp/actions/workflows/integration.yml/badge.svg?branch=main)](https://github.com/Next2D/next2d-development-mcp/actions/workflows/integration.yml)
8
4
  [![CodeQL](https://github.com/Next2D/next2d-development-mcp/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main)](https://github.com/Next2D/next2d-development-mcp/actions/workflows/github-code-scanning/codeql)
9
5
  [![Lint](https://github.com/Next2D/next2d-development-mcp/actions/workflows/lint.yml/badge.svg?branch=main)](https://github.com/Next2D/next2d-development-mcp/actions/workflows/lint.yml)
@@ -27,6 +23,7 @@ Provides code generation, architecture validation, and API reference following *
27
23
  - [Resources / リソース](#resources--リソース)
28
24
  - [Prompts / プロンプト](#prompts--プロンプト)
29
25
  - [サポートするアーキテクチャ / Supported Architecture](#サポートするアーキテクチャ--supported-architecture)
26
+ - [関連リンク / Related Links](#関連リンク--related-links)
30
27
  - [License](#license)
31
28
 
32
29
  ---
@@ -43,11 +40,15 @@ This MCP server provides the following capabilities to AI agents:
43
40
 
44
41
  | 機能 / Feature | 説明 / Description |
45
42
  |---|---|
46
- | **コード生成** | View/ViewModel, UseCase, Repository, UI コンポーネント, Interface のスキャフォールディング |
43
+ | **コード生成** | View/ViewModel, UseCase, Repository, UI コンポーネント, Interface, Animation, Domain Service のスキャフォールディング |
47
44
  | **ルーティング設定** | routing.json へのルートエントリ生成 |
48
45
  | **アーキテクチャ検証** | プロジェクト構造の Clean Architecture 準拠チェック |
46
+ | **プロジェクト分析** | 実装済みファイルのスキャンと未実装箇所のレポート |
47
+ | **画面インスペクション** | 特定画面の全関連ファイルの一覧と実装状況の確認 |
48
+ | **実装計画生成** | 既存ファイルをスキップしつつ新規画面の順序付き実装ステップを生成 |
49
49
  | **API リファレンス** | Player API, Framework 仕様, 開発テンプレート仕様の提供 |
50
50
  | **開発ガイド** | 画面追加手順, コーディング規約, デバッグガイドの提供 |
51
+ | **オーケストレーター** | 新規画面作成・既存画面修正をフェーズ別に自律実行 |
51
52
 
52
53
  ---
53
54
 
@@ -256,14 +257,32 @@ args: -y next2d-development-mcp
256
257
 
257
258
  ## Tools / ツール
258
259
 
260
+ ### オーケストレーション系 / Orchestration
261
+
262
+ | Tool | Description |
263
+ |---|---|
264
+ | `analyze_project` | routing.json をスキャンし、View/ViewModel/UseCase/Repository の実装状況を一覧表示。新機能追加前の現状把握に使用 |
265
+ | `inspect_screen` | 特定画面の全関連ファイル (View, ViewModel, Page, UseCase, Repository, Animation, Content) をファイル行数付きで一覧表示。既存画面修正前に使用 |
266
+ | `plan_feature` | 新規画面の実装ステップを順序付きで生成。既存ファイルは ✅ としてスキップ。`analyze_project` 実行後に使用 |
267
+
268
+ ### コード生成系 / Code Generation
269
+
259
270
  | Tool | Description |
260
271
  |---|---|
261
272
  | `create_view` | View/ViewModel ペアを生成 (MVVM パターン)。`name` にルートパスを指定 (例: `home`, `quest/list`) |
262
273
  | `create_usecase` | UseCase クラスを生成 (Application 層)。1 アクション = 1 UseCase、`execute()` がエントリーポイント |
263
274
  | `create_repository` | Repository クラスを生成 (Infrastructure 層)。try-catch 必須、config からエンドポイント取得 |
264
275
  | `create_ui_component` | Atomic Design UI コンポーネント生成 (`atom` / `molecule` / `organism` / `page` / `content`) |
276
+ | `create_animation` | UI トランジション用 Animation クラスを生成。`@next2d/ui` の Tween/Easing/Job を使用。`src/ui/animation/{screen}/` に配置 |
277
+ | `create_domain_service` | Domain 層クラス (Service または Callback) を生成。Service はコアビジネスロジック、Callback は gotoView 完了後に実行 |
278
+ | `create_loading` | ローディング画面クラスを生成。`start()` / `end()` メソッドを持ち、config.json の `loading.callback` で登録 |
265
279
  | `add_route` | routing.json へのルートエントリ生成。リクエスト設定 (`json` / `content` / `custom` / `cluster`) に対応 |
266
280
  | `create_interface` | TypeScript インターフェースファイル生成 (`I` プレフィックス規約に準拠) |
281
+
282
+ ### アーキテクチャ検証 / Architecture Validation
283
+
284
+ | Tool | Description |
285
+ |---|---|
267
286
  | `validate_architecture` | プロジェクト構造の検証。ディレクトリ構成、設定ファイル、routing.json ↔ View の整合性をチェック |
268
287
 
269
288
  ### ツール使用例 / Tool Usage Example
@@ -275,7 +294,7 @@ Next2Dプロジェクトに「quest/list」画面を追加して。
275
294
  APIからクエスト一覧を取得して表示するようにして。
276
295
  ```
277
296
 
278
- エージェントが自動的に `add_route` → `create_view` → `create_usecase` → `create_repository` → `create_interface` → `create_ui_component` を順に実行し、必要なファイルをすべて生成します。
297
+ オーケストレーターモードでは `analyze_project` → `plan_feature` → `add_route` → `create_view` → `create_usecase` → `create_repository` → `create_interface` → `create_ui_component` → `create_animation` → `validate_architecture` を自律的に実行し、必要なファイルをすべて生成します。
279
298
 
280
299
  ---
281
300
 
@@ -294,10 +313,24 @@ APIからクエスト一覧を取得して表示するようにして。
294
313
 
295
314
  | Prompt | Parameters | Description |
296
315
  |---|---|---|
316
+ | `orchestrate` | `task`, `screenPath`, `mode` | オーケストレーターモードを起動。`mode: "create"` で新規画面作成、`mode: "modify"` で既存画面修正のフェーズ別ワークフローを実行 |
297
317
  | `new-screen` | `screenName`, `hasApi?`, `hasAnimation?` | 新しい画面追加のステップバイステップガイド |
298
318
  | `architecture-guide` | — | アーキテクチャルールとコーディング規約のリファレンス |
299
319
  | `debug-help` | `issue` | よくある問題のデバッグのヒントとトラブルシューティング |
300
320
 
321
+ ### orchestrate プロンプトの使用例 / Orchestrate Prompt Example
322
+
323
+ ```
324
+ # 新規画面作成
325
+ orchestrate(task="クエスト一覧画面を追加", screenPath="quest/list", mode="create")
326
+
327
+ # 既存画面修正
328
+ orchestrate(task="ホーム画面に検索機能を追加", screenPath="home", mode="modify")
329
+ ```
330
+
331
+ `create` モードでは `analyze_project` → `plan_feature` → 実装 → `validate_architecture` の順に実行します。
332
+ `modify` モードでは `inspect_screen` → 対象ファイル Read → 最小変更 → `validate_architecture` の順に実行します。
333
+
301
334
  ---
302
335
 
303
336
  ## サポートするアーキテクチャ / Supported Architecture
@@ -308,9 +341,14 @@ src/
308
341
  ├── interface/ # インターフェース定義 (I プレフィックス)
309
342
  ├── model/
310
343
  │ ├── application/ # UseCase (ビジネスロジック)
311
- │ ├── domain/ # コアビジネスルール
344
+ │ ├── domain/
345
+ │ │ └── callback/ # gotoView Callback / Loading クラス
346
+ │ │ └── {name}/
347
+ │ │ └── service/ # Domain Service (純粋ビジネスロジック)
312
348
  │ └── infrastructure/ # Repository (データアクセス)
313
349
  ├── ui/
350
+ │ ├── animation/ # UI トランジション Animation クラス
351
+ │ │ └── {screen}/ # 画面別ディレクトリ
314
352
  │ ├── component/
315
353
  │ │ ├── atom/ # 最小コンポーネント
316
354
  │ │ ├── molecule/ # 複合コンポーネント
@@ -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"}
@@ -2241,6 +2241,42 @@ textField.replaceText("Next2D", 6, 11);
2241
2241
  stage.addChild(textField);
2242
2242
  ```
2243
2243
 
2244
+ ### RPGゲーム風台詞アニメーション(stopIndex)
2245
+
2246
+ `stopIndex` を使うと、テキストを先頭から順番に表示するタイプライター効果を実現できます。
2247
+ RPGゲームの台詞ウィンドウのような演出に適しています。
2248
+ `stopIndex` のデフォルト値は `-1`(全文字を表示)で、`0` にすると文字が非表示になります。
2249
+
2250
+ ```typescript
2251
+ const { TextField } = next2d.text;
2252
+ const { Tween, Job } = next2d.ui;
2253
+
2254
+ const textField = new TextField();
2255
+ textField.width = 300;
2256
+ textField.height = 80;
2257
+ textField.multiline = true;
2258
+ textField.wordWrap = true;
2259
+ textField.text = "勇者よ、魔王を倒してくれ!世界の命運はそなたにかかっている。";
2260
+
2261
+ stage.addChild(textField);
2262
+
2263
+ // stopIndex を 0 → text.length まで 5秒かけてアニメーション(0.5秒の遅延あり)
2264
+ const job = Tween.add(
2265
+ textField,
2266
+ { stopIndex: 0 },
2267
+ { stopIndex: textField.text.length },
2268
+ 0.5,
2269
+ 5
2270
+ );
2271
+
2272
+ // 表示完了後のコールバック
2273
+ job.addEventListener(Job.COMPLETE, () => {
2274
+ console.log("台詞表示完了");
2275
+ });
2276
+
2277
+ job.start();
2278
+ ```
2279
+
2244
2280
  ## イベント
2245
2281
 
2246
2282
  | イベント | 説明 |
@@ -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":"AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,SAAS,aAAa,CAAC,QAAgB;IACnC,wCAAwC;IACxC,sEAAsE;IACtE,yGAAyG;IACzG,oGAAoG;IACpG,iFAAiF;IACjF,gHAAgH;IAChH,2GAA2G;IAC3G,6DAA6D;IAC7D,MAAM,UAAU,GAAG;QACf,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC;QAClD,IAAI,CAAC,IAAI,CACL,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,8BAA8B,EAC9B,QAAQ,EACR,8BAA8B,EAC9B,YAAY,EACZ,QAAQ,CACX;QACD,IAAI,CAAC,IAAI,CACL,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,8BAA8B,EAC9B,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,QAAQ,CACX;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;QAC7E,IAAI,CAAC,IAAI,CACL,OAAO,CAAC,GAAG,EAAE,EACb,8BAA8B,EAC9B,QAAQ,EACR,8BAA8B,EAC9B,YAAY,EACZ,QAAQ,CACX;QACD,IAAI,CAAC,IAAI,CACL,OAAO,CAAC,GAAG,EAAE,EACb,8BAA8B,EAC9B,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,QAAQ,CACX;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;KACxE,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAED,OAAO,mBAAmB,QAAQ,0BAA0B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IAC/C,MAAM,CAAC,gBAAgB,CACnB,cAAc,EACd,uBAAuB,EACvB;QACI,aAAa,EACT,oFAAoF;YACpF,gFAAgF;YAChF,4CAA4C;QAChD,UAAU,EAAE,eAAe;KAC9B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACT,UAAU,EAAE;YACR;gBACI,KAAK,EAAE,uBAAuB;gBAC9B,UAAU,EAAE,eAAe;gBAC3B,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC;aAC3C;SACJ;KACJ,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACnB,iBAAiB,EACjB,0BAA0B,EAC1B;QACI,aAAa,EACT,mEAAmE;YACnE,uEAAuE;YACvE,sFAAsF;QAC1F,UAAU,EAAE,eAAe;KAC9B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACT,UAAU,EAAE;YACR;gBACI,KAAK,EAAE,0BAA0B;gBACjC,UAAU,EAAE,eAAe;gBAC3B,MAAM,EAAE,aAAa,CAAC,oBAAoB,CAAC;aAC9C;SACJ;KACJ,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACnB,eAAe,EACf,wBAAwB,EACxB;QACI,aAAa,EACT,4EAA4E;YAC5E,qEAAqE;YACrE,uFAAuF;QAC3F,UAAU,EAAE,eAAe;KAC9B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACT,UAAU,EAAE;YACR;gBACI,KAAK,EAAE,wBAAwB;gBAC/B,UAAU,EAAE,eAAe;gBAC3B,MAAM,EAAE,aAAa,CAAC,kBAAkB,CAAC;aAC5C;SACJ;KACJ,CAAC,CACL,CAAC;IAEF,MAAM,CAAC,gBAAgB,CACnB,uBAAuB,EACvB,uBAAuB,EACvB;QACI,aAAa,EACT,0EAA0E;YAC1E,2CAA2C;QAC/C,UAAU,EAAE,eAAe;KAC9B,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACT,UAAU,EAAE;YACR;gBACI,KAAK,EAAE,uBAAuB;gBAC9B,UAAU,EAAE,eAAe;gBAC3B,MAAM,EAAE,qBAAqB;aAChC;SACJ;KACJ,CAAC,CACL,CAAC;AACN,CAAC;AAED,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwG7B,CAAC"}
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"}