next2d-development-mcp 0.0.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 +344 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +211 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/prompts.test.d.ts +2 -0
- package/dist/prompts/prompts.test.d.ts.map +1 -0
- package/dist/prompts/prompts.test.js +23 -0
- package/dist/prompts/prompts.test.js.map +1 -0
- package/dist/references/develop-specs.md +1576 -0
- package/dist/references/framework-specs.md +1687 -0
- package/dist/references/player-specs.md +3292 -0
- package/dist/resources/index.d.ts +3 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +185 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/resources.test.d.ts +2 -0
- package/dist/resources/resources.test.d.ts.map +1 -0
- package/dist/resources/resources.test.js +32 -0
- package/dist/resources/resources.test.js.map +1 -0
- package/dist/templates/animation.d.ts +6 -0
- package/dist/templates/animation.d.ts.map +1 -0
- package/dist/templates/animation.js +65 -0
- package/dist/templates/animation.js.map +1 -0
- package/dist/templates/animation.test.d.ts +2 -0
- package/dist/templates/animation.test.d.ts.map +1 -0
- package/dist/templates/animation.test.js +30 -0
- package/dist/templates/animation.test.js.map +1 -0
- package/dist/templates/domainService.d.ts +9 -0
- package/dist/templates/domainService.d.ts.map +1 -0
- package/dist/templates/domainService.js +56 -0
- package/dist/templates/domainService.js.map +1 -0
- package/dist/templates/domainService.test.d.ts +2 -0
- package/dist/templates/domainService.test.d.ts.map +1 -0
- package/dist/templates/domainService.test.js +33 -0
- package/dist/templates/domainService.test.js.map +1 -0
- package/dist/templates/interfaceFile.d.ts +5 -0
- package/dist/templates/interfaceFile.d.ts.map +1 -0
- package/dist/templates/interfaceFile.js +16 -0
- package/dist/templates/interfaceFile.js.map +1 -0
- package/dist/templates/interfaceFile.test.d.ts +2 -0
- package/dist/templates/interfaceFile.test.d.ts.map +1 -0
- package/dist/templates/interfaceFile.test.js +30 -0
- package/dist/templates/interfaceFile.test.js.map +1 -0
- package/dist/templates/loading.d.ts +5 -0
- package/dist/templates/loading.d.ts.map +1 -0
- package/dist/templates/loading.js +62 -0
- package/dist/templates/loading.js.map +1 -0
- package/dist/templates/loading.test.d.ts +2 -0
- package/dist/templates/loading.test.d.ts.map +1 -0
- package/dist/templates/loading.test.js +31 -0
- package/dist/templates/loading.test.js.map +1 -0
- package/dist/templates/repository.d.ts +2 -0
- package/dist/templates/repository.d.ts.map +1 -0
- package/dist/templates/repository.js +42 -0
- package/dist/templates/repository.js.map +1 -0
- package/dist/templates/repository.test.d.ts +2 -0
- package/dist/templates/repository.test.d.ts.map +1 -0
- package/dist/templates/repository.test.js +44 -0
- package/dist/templates/repository.test.js.map +1 -0
- package/dist/templates/uiComponent.d.ts +4 -0
- package/dist/templates/uiComponent.d.ts.map +1 -0
- package/dist/templates/uiComponent.js +108 -0
- package/dist/templates/uiComponent.js.map +1 -0
- package/dist/templates/uiComponent.test.d.ts +2 -0
- package/dist/templates/uiComponent.test.d.ts.map +1 -0
- package/dist/templates/uiComponent.test.js +76 -0
- package/dist/templates/uiComponent.test.js.map +1 -0
- package/dist/templates/usecase.d.ts +2 -0
- package/dist/templates/usecase.d.ts.map +1 -0
- package/dist/templates/usecase.js +31 -0
- package/dist/templates/usecase.js.map +1 -0
- package/dist/templates/usecase.test.d.ts +2 -0
- package/dist/templates/usecase.test.d.ts.map +1 -0
- package/dist/templates/usecase.test.js +23 -0
- package/dist/templates/usecase.test.js.map +1 -0
- package/dist/templates/view.d.ts +3 -0
- package/dist/templates/view.d.ts.map +1 -0
- package/dist/templates/view.js +112 -0
- package/dist/templates/view.js.map +1 -0
- package/dist/templates/view.test.d.ts +2 -0
- package/dist/templates/view.test.d.ts.map +1 -0
- package/dist/templates/view.test.js +71 -0
- package/dist/templates/view.test.js.map +1 -0
- package/dist/tools/addRoute.d.ts +3 -0
- package/dist/tools/addRoute.d.ts.map +1 -0
- package/dist/tools/addRoute.js +101 -0
- package/dist/tools/addRoute.js.map +1 -0
- package/dist/tools/createAnimation.d.ts +3 -0
- package/dist/tools/createAnimation.d.ts.map +1 -0
- package/dist/tools/createAnimation.js +53 -0
- package/dist/tools/createAnimation.js.map +1 -0
- package/dist/tools/createDomainService.d.ts +3 -0
- package/dist/tools/createDomainService.d.ts.map +1 -0
- package/dist/tools/createDomainService.js +82 -0
- package/dist/tools/createDomainService.js.map +1 -0
- package/dist/tools/createInterface.d.ts +3 -0
- package/dist/tools/createInterface.d.ts.map +1 -0
- package/dist/tools/createInterface.js +59 -0
- package/dist/tools/createInterface.js.map +1 -0
- package/dist/tools/createLoading.d.ts +3 -0
- package/dist/tools/createLoading.d.ts.map +1 -0
- package/dist/tools/createLoading.js +52 -0
- package/dist/tools/createLoading.js.map +1 -0
- package/dist/tools/createRepository.d.ts +3 -0
- package/dist/tools/createRepository.d.ts.map +1 -0
- package/dist/tools/createRepository.js +55 -0
- package/dist/tools/createRepository.js.map +1 -0
- package/dist/tools/createUiComponent.d.ts +3 -0
- package/dist/tools/createUiComponent.d.ts.map +1 -0
- package/dist/tools/createUiComponent.js +80 -0
- package/dist/tools/createUiComponent.js.map +1 -0
- package/dist/tools/createUseCase.d.ts +3 -0
- package/dist/tools/createUseCase.d.ts.map +1 -0
- package/dist/tools/createUseCase.js +52 -0
- package/dist/tools/createUseCase.js.map +1 -0
- package/dist/tools/createView.d.ts +3 -0
- package/dist/tools/createView.d.ts.map +1 -0
- package/dist/tools/createView.js +59 -0
- package/dist/tools/createView.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +25 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/tools.test.d.ts +2 -0
- package/dist/tools/tools.test.d.ts.map +1 -0
- package/dist/tools/tools.test.js +58 -0
- package/dist/tools/tools.test.js.map +1 -0
- package/dist/tools/validateArchitecture.d.ts +3 -0
- package/dist/tools/validateArchitecture.d.ts.map +1 -0
- package/dist/tools/validateArchitecture.js +134 -0
- package/dist/tools/validateArchitecture.js.map +1 -0
- package/dist/utils.d.ts +10 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +18 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +34 -0
- package/dist/utils.test.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { generateView, generateViewModel } from "./view.js";
|
|
3
|
+
describe("generateView", () => {
|
|
4
|
+
it("generates View class with correct name", () => {
|
|
5
|
+
const code = generateView("home");
|
|
6
|
+
expect(code).toContain("export class HomeView extends View<HomeViewModel>");
|
|
7
|
+
});
|
|
8
|
+
it("imports ViewModel type", () => {
|
|
9
|
+
const code = generateView("home");
|
|
10
|
+
expect(code).toContain('import type { HomeViewModel } from "./HomeViewModel"');
|
|
11
|
+
});
|
|
12
|
+
it("imports View from framework", () => {
|
|
13
|
+
const code = generateView("home");
|
|
14
|
+
expect(code).toContain('import { View } from "@next2d/framework"');
|
|
15
|
+
});
|
|
16
|
+
it("includes lifecycle methods", () => {
|
|
17
|
+
const code = generateView("home");
|
|
18
|
+
expect(code).toContain("async initialize ()");
|
|
19
|
+
expect(code).toContain("async onEnter ()");
|
|
20
|
+
expect(code).toContain("async onExit ()");
|
|
21
|
+
});
|
|
22
|
+
it("imports and instantiates Page component", () => {
|
|
23
|
+
const code = generateView("home");
|
|
24
|
+
expect(code).toContain('import { HomePage } from "@/ui/component/page/home/HomePage"');
|
|
25
|
+
expect(code).toContain("this._homePage = new HomePage()");
|
|
26
|
+
expect(code).toContain("this.addChild(this._homePage)");
|
|
27
|
+
});
|
|
28
|
+
it("calls page.initialize(this.vm) in initialize()", () => {
|
|
29
|
+
const code = generateView("home");
|
|
30
|
+
expect(code).toContain("this._homePage.initialize(this.vm)");
|
|
31
|
+
});
|
|
32
|
+
it("handles slash-separated name with valid variable names", () => {
|
|
33
|
+
const code = generateView("quest/list");
|
|
34
|
+
expect(code).toContain("export class QuestListView extends View<QuestListViewModel>");
|
|
35
|
+
expect(code).toContain('import type { QuestListViewModel } from "./QuestListViewModel"');
|
|
36
|
+
expect(code).toContain('import { QuestListPage } from "@/ui/component/page/quest/QuestListPage"');
|
|
37
|
+
expect(code).toContain("this._questListPage = new QuestListPage()");
|
|
38
|
+
expect(code).toContain("this._questListPage.initialize(this.vm)");
|
|
39
|
+
// Variable name must not contain slashes
|
|
40
|
+
expect(code).not.toContain("_quest/list");
|
|
41
|
+
});
|
|
42
|
+
it("constructor receives ViewModel", () => {
|
|
43
|
+
const code = generateView("home");
|
|
44
|
+
expect(code).toContain("constructor (vm: HomeViewModel)");
|
|
45
|
+
expect(code).toContain("super(vm)");
|
|
46
|
+
});
|
|
47
|
+
it("onEnter delegates to page", () => {
|
|
48
|
+
const code = generateView("home");
|
|
49
|
+
expect(code).toContain("await this._homePage.onEnter()");
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("generateViewModel", () => {
|
|
53
|
+
it("generates ViewModel class with correct name", () => {
|
|
54
|
+
const code = generateViewModel("home");
|
|
55
|
+
expect(code).toContain("export class HomeViewModel extends ViewModel");
|
|
56
|
+
});
|
|
57
|
+
it("imports ViewModel from framework with app", () => {
|
|
58
|
+
const code = generateViewModel("home");
|
|
59
|
+
expect(code).toContain('import { ViewModel, app } from "@next2d/framework"');
|
|
60
|
+
});
|
|
61
|
+
it("includes initialize method with response pattern", () => {
|
|
62
|
+
const code = generateViewModel("home");
|
|
63
|
+
expect(code).toContain("async initialize ()");
|
|
64
|
+
expect(code).toContain("app.getResponse()");
|
|
65
|
+
});
|
|
66
|
+
it("handles slash-separated name", () => {
|
|
67
|
+
const code = generateViewModel("quest/list");
|
|
68
|
+
expect(code).toContain("export class QuestListViewModel extends ViewModel");
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=view.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.test.js","sourceRoot":"","sources":["../../src/templates/view.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addRoute.d.ts","sourceRoot":"","sources":["../../src/tools/addRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0GxD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerAddRoute(server) {
|
|
3
|
+
server.registerTool("add_route", {
|
|
4
|
+
"description": "Generate a route entry for routing.json. " +
|
|
5
|
+
"Supports request types: json, content, custom, cluster. " +
|
|
6
|
+
"The route key becomes the URL path and determines the View class name (CamelCase).",
|
|
7
|
+
"inputSchema": {
|
|
8
|
+
"path": z.string().describe("Route path (e.g. 'home', 'quest/list'). " +
|
|
9
|
+
"Becomes URL path and View class name in CamelCase."),
|
|
10
|
+
"requests": z
|
|
11
|
+
.array(z.object({
|
|
12
|
+
"type": z
|
|
13
|
+
.enum(["json", "content", "custom", "cluster"])
|
|
14
|
+
.describe("Request type"),
|
|
15
|
+
"path": z.string().optional().describe("URL path. Use {{var}} for config variables (e.g. '{{ api.endPoint }}path/to/api')"),
|
|
16
|
+
"name": z.string().optional().describe("Response key name for app.getResponse().get(name)"),
|
|
17
|
+
"cache": z.boolean().optional().describe("Cache the response (persists across screen transitions)"),
|
|
18
|
+
"class": z.string().optional().describe("Class path for custom type (e.g. 'infrastructure.repository.UserRepository')"),
|
|
19
|
+
"access": z
|
|
20
|
+
.enum(["public", "static"])
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Method access type for custom requests (default: 'public')"),
|
|
23
|
+
"method": z.string().optional().describe("Method name for custom type"),
|
|
24
|
+
"callback": z
|
|
25
|
+
.union([z.string(), z.array(z.string())])
|
|
26
|
+
.optional()
|
|
27
|
+
.describe("Callback class(es) after request completes")
|
|
28
|
+
}))
|
|
29
|
+
.optional()
|
|
30
|
+
.default([])
|
|
31
|
+
.describe("Array of request configurations"),
|
|
32
|
+
"isPrivate": z.boolean().optional().default(false).describe("If true, direct URL access redirects to TopView")
|
|
33
|
+
}
|
|
34
|
+
}, async ({ path, requests, isPrivate }) => {
|
|
35
|
+
const routeEntry = {};
|
|
36
|
+
if (isPrivate) {
|
|
37
|
+
routeEntry.private = true;
|
|
38
|
+
}
|
|
39
|
+
if (requests.length > 0) {
|
|
40
|
+
routeEntry.requests = requests.map((r) => {
|
|
41
|
+
const req = { "type": r.type };
|
|
42
|
+
if (r.path) {
|
|
43
|
+
req.path = r.path;
|
|
44
|
+
}
|
|
45
|
+
if (r.name) {
|
|
46
|
+
req.name = r.name;
|
|
47
|
+
}
|
|
48
|
+
if (r.cache !== undefined) {
|
|
49
|
+
req.cache = r.cache;
|
|
50
|
+
}
|
|
51
|
+
if (r.class) {
|
|
52
|
+
req.class = r.class;
|
|
53
|
+
}
|
|
54
|
+
if (r.access) {
|
|
55
|
+
req.access = r.access;
|
|
56
|
+
}
|
|
57
|
+
if (r.method) {
|
|
58
|
+
req.method = r.method;
|
|
59
|
+
}
|
|
60
|
+
if (r.callback) {
|
|
61
|
+
req.callback = r.callback;
|
|
62
|
+
}
|
|
63
|
+
return req;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
routeEntry.requests = [];
|
|
68
|
+
}
|
|
69
|
+
const json = JSON.stringify({ [path]: routeEntry }, null, 4);
|
|
70
|
+
const pascal = path
|
|
71
|
+
.split(/[\\/]/)
|
|
72
|
+
.map((s) => s.charAt(0).toUpperCase() + s.slice(1))
|
|
73
|
+
.join("");
|
|
74
|
+
const screenDir = path.includes("/") ? path.split("/")[0].toLowerCase() : path.toLowerCase();
|
|
75
|
+
return {
|
|
76
|
+
"content": [
|
|
77
|
+
{
|
|
78
|
+
"type": "text",
|
|
79
|
+
"text": [
|
|
80
|
+
`## Route Entry for: ${path}`,
|
|
81
|
+
"",
|
|
82
|
+
"### Add to src/config/routing.json",
|
|
83
|
+
"```json",
|
|
84
|
+
json,
|
|
85
|
+
"```",
|
|
86
|
+
"",
|
|
87
|
+
`### This will map to: ${pascal}View / ${pascal}ViewModel`,
|
|
88
|
+
`### URL: /${path}`,
|
|
89
|
+
"",
|
|
90
|
+
"### After adding the route:",
|
|
91
|
+
"1. Run `npm run generate` to auto-generate View/ViewModel",
|
|
92
|
+
"2. Or manually create:",
|
|
93
|
+
` - src/view/${screenDir}/${pascal}View.ts`,
|
|
94
|
+
` - src/view/${screenDir}/${pascal}ViewModel.ts`
|
|
95
|
+
].join("\n")
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=addRoute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addRoute.js","sourceRoot":"","sources":["../../src/tools/addRoute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAnimation.d.ts","sourceRoot":"","sources":["../../src/tools/createAnimation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4D/D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { generateAnimation } from "../templates/animation.js";
|
|
3
|
+
import { toPascalCase } from "../utils.js";
|
|
4
|
+
export function registerCreateAnimation(server) {
|
|
5
|
+
server.registerTool("create_animation", {
|
|
6
|
+
"description": "Create a new Animation class for UI transitions. " +
|
|
7
|
+
"Uses Tween/Easing/Job from @next2d/ui. " +
|
|
8
|
+
"Naming: {Component}{Action}Animation.ts in src/ui/animation/{screen}/. " +
|
|
9
|
+
"Separates animation logic from components for reusability.",
|
|
10
|
+
"inputSchema": {
|
|
11
|
+
"component": z.string().describe("Component name (e.g. 'TopBtn', 'HomeCard')"),
|
|
12
|
+
"action": z.string().describe("Animation action (e.g. 'Show', 'Exit', 'Hover')"),
|
|
13
|
+
"screen": z.string().describe("Screen this animation belongs to (e.g. 'top', 'home')")
|
|
14
|
+
}
|
|
15
|
+
}, async ({ component, action, screen }) => {
|
|
16
|
+
const componentPascal = toPascalCase(component);
|
|
17
|
+
const actionPascal = toPascalCase(action);
|
|
18
|
+
const className = `${componentPascal}${actionPascal}Animation`;
|
|
19
|
+
const filePath = `src/ui/animation/${screen.toLowerCase()}/${className}.ts`;
|
|
20
|
+
const code = generateAnimation(component, action);
|
|
21
|
+
return {
|
|
22
|
+
"content": [
|
|
23
|
+
{
|
|
24
|
+
"type": "text",
|
|
25
|
+
"text": [
|
|
26
|
+
`## Generated Animation: ${className}`,
|
|
27
|
+
"",
|
|
28
|
+
`### File: ${filePath}`,
|
|
29
|
+
"```typescript",
|
|
30
|
+
code.trim(),
|
|
31
|
+
"```",
|
|
32
|
+
"",
|
|
33
|
+
"### Usage in Component",
|
|
34
|
+
"```typescript",
|
|
35
|
+
`import { ${className} } from "@/ui/animation/${screen.toLowerCase()}/${className}";`,
|
|
36
|
+
"",
|
|
37
|
+
"// In Molecule/Component:",
|
|
38
|
+
`play${actionPascal} (callback: () => void): void {`,
|
|
39
|
+
` new ${className}(this, callback).start();`,
|
|
40
|
+
"}",
|
|
41
|
+
"```",
|
|
42
|
+
"",
|
|
43
|
+
"### Animation Types",
|
|
44
|
+
"- **Show**: Entrance animation when screen appears",
|
|
45
|
+
"- **Exit**: Exit animation before screen transition",
|
|
46
|
+
"- **Hover/Interaction**: Response to user input"
|
|
47
|
+
].join("\n")
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=createAnimation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAnimation.js","sourceRoot":"","sources":["../../src/tools/createAnimation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CACf,kBAAkB,EAClB;QACI,aAAa,EACT,mDAAmD;YACnD,yCAAyC;YACzC,yEAAyE;YACzE,4DAA4D;QAChE,aAAa,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAC5B,4CAA4C,CAC/C;YACD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACzB,iDAAiD,CACpD;YACD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACzB,uDAAuD,CAC1D;SACJ;KACJ,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACpC,MAAM,eAAe,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,GAAG,eAAe,GAAG,YAAY,WAAW,CAAC;QAC/D,MAAM,QAAQ,GAAG,oBAAoB,MAAM,CAAC,WAAW,EAAE,IAAI,SAAS,KAAK,CAAC;QAC5E,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAElD,OAAO;YACH,SAAS,EAAE;gBACP;oBACI,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE;wBACJ,2BAA2B,SAAS,EAAE;wBACtC,EAAE;wBACF,aAAa,QAAQ,EAAE;wBACvB,eAAe;wBACf,IAAI,CAAC,IAAI,EAAE;wBACX,KAAK;wBACL,EAAE;wBACF,wBAAwB;wBACxB,eAAe;wBACf,YAAY,SAAS,2BAA2B,MAAM,CAAC,WAAW,EAAE,IAAI,SAAS,IAAI;wBACrF,EAAE;wBACF,2BAA2B;wBAC3B,OAAO,YAAY,iCAAiC;wBACpD,WAAW,SAAS,2BAA2B;wBAC/C,GAAG;wBACH,KAAK;wBACL,EAAE;wBACF,qBAAqB;wBACrB,oDAAoD;wBACpD,qDAAqD;wBACrD,iDAAiD;qBACpD,CAAC,IAAI,CAAC,IAAI,CAAC;iBACf;aACJ;SACJ,CAAC;IACN,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createDomainService.d.ts","sourceRoot":"","sources":["../../src/tools/createDomainService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4FnE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { generateDomainService, generateDomainCallback } from "../templates/domainService.js";
|
|
3
|
+
import { toPascalCase } from "../utils.js";
|
|
4
|
+
export function registerCreateDomainService(server) {
|
|
5
|
+
server.registerTool("create_domain_service", {
|
|
6
|
+
"description": "Create a Domain layer class (service or callback). " +
|
|
7
|
+
"Services implement core business rules with no external dependencies. " +
|
|
8
|
+
"Callbacks are executed after gotoView completes (configured in config.json gotoView.callback). " +
|
|
9
|
+
"Located in src/model/domain/.",
|
|
10
|
+
"inputSchema": {
|
|
11
|
+
"name": z.string().describe("Feature name (e.g. 'Background', 'Score', 'Timer')"),
|
|
12
|
+
"type": z.enum(["service", "callback"]).describe("Domain type: 'service' for business logic, 'callback' for gotoView.callback handler"),
|
|
13
|
+
"action": z.string().optional().describe("Action name for service type (e.g. 'Draw', 'ChangeScale'). Not needed for callback.")
|
|
14
|
+
}
|
|
15
|
+
}, async ({ name, type, action }) => {
|
|
16
|
+
const pascal = toPascalCase(name);
|
|
17
|
+
if (type === "callback") {
|
|
18
|
+
const filePath = `src/model/domain/callback/${pascal}.ts`;
|
|
19
|
+
const code = generateDomainCallback(name);
|
|
20
|
+
return {
|
|
21
|
+
"content": [
|
|
22
|
+
{
|
|
23
|
+
"type": "text",
|
|
24
|
+
"text": [
|
|
25
|
+
`## Generated Domain Callback: ${pascal}`,
|
|
26
|
+
"",
|
|
27
|
+
`### File: ${filePath}`,
|
|
28
|
+
"```typescript",
|
|
29
|
+
code.trim(),
|
|
30
|
+
"```",
|
|
31
|
+
"",
|
|
32
|
+
"### Register in config.json",
|
|
33
|
+
"```json",
|
|
34
|
+
"\"gotoView\": {",
|
|
35
|
+
` "callback": ["domain.callback.${pascal}"]`,
|
|
36
|
+
"}",
|
|
37
|
+
"```",
|
|
38
|
+
"",
|
|
39
|
+
"### Rules",
|
|
40
|
+
"- `execute()` is called after every screen transition completes",
|
|
41
|
+
"- Multiple callbacks are executed sequentially with async/await",
|
|
42
|
+
"- Use `app.getContext().view` to access the current view"
|
|
43
|
+
].join("\n")
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Service type — services are nested under their parent callback directory
|
|
49
|
+
const actionPascal = action ? toPascalCase(action) : "Execute";
|
|
50
|
+
const className = `${pascal}${actionPascal}Service`;
|
|
51
|
+
const filePath = `src/model/domain/callback/${pascal}/service/${className}.ts`;
|
|
52
|
+
const code = generateDomainService(name, action || "Execute");
|
|
53
|
+
return {
|
|
54
|
+
"content": [
|
|
55
|
+
{
|
|
56
|
+
"type": "text",
|
|
57
|
+
"text": [
|
|
58
|
+
`## Generated Domain Service: ${className}`,
|
|
59
|
+
"",
|
|
60
|
+
`### File: ${filePath}`,
|
|
61
|
+
"```typescript",
|
|
62
|
+
code.trim(),
|
|
63
|
+
"```",
|
|
64
|
+
"",
|
|
65
|
+
"### Usage in Callback",
|
|
66
|
+
"```typescript",
|
|
67
|
+
`import { execute as ${name.toLowerCase()}${actionPascal} } from "./service/${className}";`,
|
|
68
|
+
"",
|
|
69
|
+
`${name.toLowerCase()}${actionPascal}(param);`,
|
|
70
|
+
"```",
|
|
71
|
+
"",
|
|
72
|
+
"### Rules",
|
|
73
|
+
"- Domain layer has no external API/DB dependencies (Next2D display APIs are allowed)",
|
|
74
|
+
"- Pure business logic (no fetch calls, no direct data access)",
|
|
75
|
+
"- Prefer functional style with `execute` export"
|
|
76
|
+
].join("\n")
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=createDomainService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createDomainService.js","sourceRoot":"","sources":["../../src/tools/createDomainService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC9F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CACf,uBAAuB,EACvB;QACI,aAAa,EACT,qDAAqD;YACrD,wEAAwE;YACxE,iGAAiG;YACjG,+BAA+B;QACnC,aAAa,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACvB,oDAAoD,CACvD;YACD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAC5C,qFAAqF,CACxF;YACD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,qFAAqF,CACxF;SACJ;KACJ,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,6BAA6B,MAAM,KAAK,CAAC;YAC1D,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAE1C,OAAO;gBACH,SAAS,EAAE;oBACP;wBACI,MAAM,EAAE,MAAM;wBACd,MAAM,EAAE;4BACJ,iCAAiC,MAAM,EAAE;4BACzC,EAAE;4BACF,aAAa,QAAQ,EAAE;4BACvB,eAAe;4BACf,IAAI,CAAC,IAAI,EAAE;4BACX,KAAK;4BACL,EAAE;4BACF,6BAA6B;4BAC7B,SAAS;4BACT,iBAAiB;4BACjB,qCAAqC,MAAM,IAAI;4BAC/C,GAAG;4BACH,KAAK;4BACL,EAAE;4BACF,WAAW;4BACX,iEAAiE;4BACjE,iEAAiE;4BACjE,0DAA0D;yBAC7D,CAAC,IAAI,CAAC,IAAI,CAAC;qBACf;iBACJ;aACJ,CAAC;QACN,CAAC;QAED,2EAA2E;QAC3E,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,MAAM,SAAS,GAAG,GAAG,MAAM,GAAG,YAAY,SAAS,CAAC;QACpD,MAAM,QAAQ,GAAG,6BAA6B,MAAM,YAAY,SAAS,KAAK,CAAC;QAC/E,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;QAE9D,OAAO;YACH,SAAS,EAAE;gBACP;oBACI,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE;wBACJ,gCAAgC,SAAS,EAAE;wBAC3C,EAAE;wBACF,aAAa,QAAQ,EAAE;wBACvB,eAAe;wBACf,IAAI,CAAC,IAAI,EAAE;wBACX,KAAK;wBACL,EAAE;wBACF,uBAAuB;wBACvB,eAAe;wBACf,uBAAuB,IAAI,CAAC,WAAW,EAAE,GAAG,YAAY,sBAAsB,SAAS,IAAI;wBAC3F,EAAE;wBACF,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,YAAY,UAAU;wBAC9C,KAAK;wBACL,EAAE;wBACF,WAAW;wBACX,sFAAsF;wBACtF,+DAA+D;wBAC/D,iDAAiD;qBACpD,CAAC,IAAI,CAAC,IAAI,CAAC;iBACf;aACJ;SACJ,CAAC;IACN,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createInterface.d.ts","sourceRoot":"","sources":["../../src/tools/createInterface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgE/D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { generateInterface } from "../templates/interfaceFile.js";
|
|
3
|
+
import { toPascalCase } from "../utils.js";
|
|
4
|
+
export function registerCreateInterface(server) {
|
|
5
|
+
server.registerTool("create_interface", {
|
|
6
|
+
"description": "Create a TypeScript interface file with I prefix convention. " +
|
|
7
|
+
"Interfaces go in src/interface/ and define contracts between layers. " +
|
|
8
|
+
"Used for dependency inversion (View depends on interface, not concrete class).",
|
|
9
|
+
"inputSchema": {
|
|
10
|
+
"name": z.string().describe("Interface name (e.g. 'Draggable', 'HomeTextResponse'). " +
|
|
11
|
+
"Will be prefixed with 'I' automatically if not already."),
|
|
12
|
+
"properties": z
|
|
13
|
+
.array(z.object({
|
|
14
|
+
"name": z.string().describe("Property name"),
|
|
15
|
+
"type": z.string().describe("TypeScript type (e.g. 'string', 'number', 'boolean')")
|
|
16
|
+
}))
|
|
17
|
+
.optional()
|
|
18
|
+
.default([])
|
|
19
|
+
.describe("Interface properties")
|
|
20
|
+
}
|
|
21
|
+
}, async ({ name, properties }) => {
|
|
22
|
+
const pascal = toPascalCase(name);
|
|
23
|
+
const interfaceName = pascal.startsWith("I") ? pascal : `I${pascal}`;
|
|
24
|
+
const fileName = `${interfaceName}.ts`;
|
|
25
|
+
const filePath = `src/interface/${fileName}`;
|
|
26
|
+
const code = generateInterface(name, properties);
|
|
27
|
+
return {
|
|
28
|
+
"content": [
|
|
29
|
+
{
|
|
30
|
+
"type": "text",
|
|
31
|
+
"text": [
|
|
32
|
+
`## Generated Interface: ${interfaceName}`,
|
|
33
|
+
"",
|
|
34
|
+
`### File: ${filePath}`,
|
|
35
|
+
"```typescript",
|
|
36
|
+
code.trim(),
|
|
37
|
+
"```",
|
|
38
|
+
"",
|
|
39
|
+
"### Usage Example",
|
|
40
|
+
"```typescript",
|
|
41
|
+
`import type { ${interfaceName} } from "@/interface/${interfaceName}";`,
|
|
42
|
+
"",
|
|
43
|
+
"// In UseCase (depend on interface, not concrete class)",
|
|
44
|
+
`execute (target: ${interfaceName}): void {`,
|
|
45
|
+
" // ...",
|
|
46
|
+
"}",
|
|
47
|
+
"```",
|
|
48
|
+
"",
|
|
49
|
+
"### Rules",
|
|
50
|
+
"- Always prefix with 'I'",
|
|
51
|
+
"- Define only necessary properties (minimal interface)",
|
|
52
|
+
"- Used for dependency inversion between layers"
|
|
53
|
+
].join("\n")
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=createInterface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createInterface.js","sourceRoot":"","sources":["../../src/tools/createInterface.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CACf,kBAAkB,EAClB;QACI,aAAa,EACT,+DAA+D;YAC/D,uEAAuE;YACvE,gFAAgF;QACpF,aAAa,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACvB,yDAAyD;gBACzD,yDAAyD,CAC5D;YACD,YAAY,EAAE,CAAC;iBACV,KAAK,CACF,CAAC,CAAC,MAAM,CAAC;gBACL,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;aACtF,CAAC,CACL;iBACA,QAAQ,EAAE;iBACV,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,sBAAsB,CAAC;SACxC;KACJ,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;QACrE,MAAM,QAAQ,GAAG,GAAG,aAAa,KAAK,CAAC;QACvC,MAAM,QAAQ,GAAG,iBAAiB,QAAQ,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAEjD,OAAO;YACH,SAAS,EAAE;gBACP;oBACI,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE;wBACJ,2BAA2B,aAAa,EAAE;wBAC1C,EAAE;wBACF,aAAa,QAAQ,EAAE;wBACvB,eAAe;wBACf,IAAI,CAAC,IAAI,EAAE;wBACX,KAAK;wBACL,EAAE;wBACF,mBAAmB;wBACnB,eAAe;wBACf,iBAAiB,aAAa,wBAAwB,aAAa,IAAI;wBACvE,EAAE;wBACF,yDAAyD;wBACzD,oBAAoB,aAAa,WAAW;wBAC5C,YAAY;wBACZ,GAAG;wBACH,KAAK;wBACL,EAAE;wBACF,WAAW;wBACX,0BAA0B;wBAC1B,wDAAwD;wBACxD,gDAAgD;qBACnD,CAAC,IAAI,CAAC,IAAI,CAAC;iBACf;aACJ;SACJ,CAAC;IACN,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createLoading.d.ts","sourceRoot":"","sources":["../../src/tools/createLoading.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuD7D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { generateLoading } from "../templates/loading.js";
|
|
3
|
+
import { toPascalCase } from "../utils.js";
|
|
4
|
+
export function registerCreateLoading(server) {
|
|
5
|
+
server.registerTool("create_loading", {
|
|
6
|
+
"description": "Create a Loading screen class for screen transition loading indicator. " +
|
|
7
|
+
"The class has start() and end() methods called by the framework during gotoView transitions. " +
|
|
8
|
+
"Configured in config.json loading.callback. Located in src/model/domain/callback/.",
|
|
9
|
+
"inputSchema": {
|
|
10
|
+
"name": z.string().optional().default("Loading").describe("Loading class name (default: 'Loading')")
|
|
11
|
+
}
|
|
12
|
+
}, async ({ name }) => {
|
|
13
|
+
const pascal = toPascalCase(name);
|
|
14
|
+
const filePath = `src/model/domain/callback/${pascal}.ts`;
|
|
15
|
+
const code = generateLoading(name);
|
|
16
|
+
return {
|
|
17
|
+
"content": [
|
|
18
|
+
{
|
|
19
|
+
"type": "text",
|
|
20
|
+
"text": [
|
|
21
|
+
`## Generated Loading Class: ${pascal}`,
|
|
22
|
+
"",
|
|
23
|
+
`### File: ${filePath}`,
|
|
24
|
+
"```typescript",
|
|
25
|
+
code.trim(),
|
|
26
|
+
"```",
|
|
27
|
+
"",
|
|
28
|
+
"### Register in config.json",
|
|
29
|
+
"Add to the `all` section:",
|
|
30
|
+
"```json",
|
|
31
|
+
"\"loading\": {",
|
|
32
|
+
` "callback": "${pascal}"`,
|
|
33
|
+
"}",
|
|
34
|
+
"```",
|
|
35
|
+
"",
|
|
36
|
+
"### Lifecycle",
|
|
37
|
+
"1. `constructor()`: Called once when the app starts",
|
|
38
|
+
"2. `start()`: Called when screen transition begins (show loading indicator)",
|
|
39
|
+
"3. `end()`: Called when new screen is ready (hide loading indicator)",
|
|
40
|
+
"",
|
|
41
|
+
"### Tips",
|
|
42
|
+
"- Register the Loading class in `src/Packages.ts`",
|
|
43
|
+
"- Use `stage.addChild()` to overlay loading on top of everything",
|
|
44
|
+
"- Use `shape.remove()` or `stage.removeChild()` to clean up",
|
|
45
|
+
"- Can use Tween for fade in/out effects"
|
|
46
|
+
].join("\n")
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=createLoading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createLoading.js","sourceRoot":"","sources":["../../src/tools/createLoading.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACf,gBAAgB,EAChB;QACI,aAAa,EACT,yEAAyE;YACzE,+FAA+F;YAC/F,oFAAoF;QACxF,aAAa,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CACrD,yCAAyC,CAC5C;SACJ;KACJ,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,6BAA6B,MAAM,KAAK,CAAC;QAC1D,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAEnC,OAAO;YACH,SAAS,EAAE;gBACP;oBACI,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE;wBACJ,+BAA+B,MAAM,EAAE;wBACvC,EAAE;wBACF,aAAa,QAAQ,EAAE;wBACvB,eAAe;wBACf,IAAI,CAAC,IAAI,EAAE;wBACX,KAAK;wBACL,EAAE;wBACF,6BAA6B;wBAC7B,2BAA2B;wBAC3B,SAAS;wBACT,gBAAgB;wBAChB,oBAAoB,MAAM,GAAG;wBAC7B,GAAG;wBACH,KAAK;wBACL,EAAE;wBACF,eAAe;wBACf,qDAAqD;wBACrD,6EAA6E;wBAC7E,sEAAsE;wBACtE,EAAE;wBACF,UAAU;wBACV,mDAAmD;wBACnD,kEAAkE;wBAClE,6DAA6D;wBAC7D,yCAAyC;qBAC5C,CAAC,IAAI,CAAC,IAAI,CAAC;iBACf;aACJ;SACJ,CAAC;IACN,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRepository.d.ts","sourceRoot":"","sources":["../../src/tools/createRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4DhE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { generateRepository } from "../templates/repository.js";
|
|
3
|
+
import { toPascalCase } from "../utils.js";
|
|
4
|
+
export function registerCreateRepository(server) {
|
|
5
|
+
server.registerTool("create_repository", {
|
|
6
|
+
"description": "Create a new Repository class in the Infrastructure layer. " +
|
|
7
|
+
"Repositories abstract data source access (API, DB). " +
|
|
8
|
+
"Located in src/model/infrastructure/repository/. " +
|
|
9
|
+
"Must include try-catch and use config for endpoints.",
|
|
10
|
+
"inputSchema": {
|
|
11
|
+
"name": z.string().describe("Repository name (e.g. 'HomeText', 'UserData', 'QuestList')"),
|
|
12
|
+
"method": z.string().optional().default("get").describe("Method name for the repository (default: 'get')")
|
|
13
|
+
}
|
|
14
|
+
}, async ({ name, method }) => {
|
|
15
|
+
const pascal = toPascalCase(name);
|
|
16
|
+
const repoName = pascal.endsWith("Repository") ? pascal : `${pascal}Repository`;
|
|
17
|
+
const actualName = name.endsWith("Repository") ? name : `${name}Repository`;
|
|
18
|
+
const filePath = `src/model/infrastructure/repository/${repoName}.ts`;
|
|
19
|
+
const code = generateRepository(actualName.replace("Repository", ""), method);
|
|
20
|
+
return {
|
|
21
|
+
"content": [
|
|
22
|
+
{
|
|
23
|
+
"type": "text",
|
|
24
|
+
"text": [
|
|
25
|
+
`## Generated Repository: ${repoName}`,
|
|
26
|
+
"",
|
|
27
|
+
`### File: ${filePath}`,
|
|
28
|
+
"```typescript",
|
|
29
|
+
code.trim(),
|
|
30
|
+
"```",
|
|
31
|
+
"",
|
|
32
|
+
"### Usage in routing.json (custom request)",
|
|
33
|
+
"```json",
|
|
34
|
+
"{",
|
|
35
|
+
" \"type\": \"custom\",",
|
|
36
|
+
` "class": "infrastructure.repository.${repoName}",`,
|
|
37
|
+
" \"access\": \"static\",",
|
|
38
|
+
` "method": "${method}",`,
|
|
39
|
+
` "name": "${pascal.replace("Repository", "")}",`,
|
|
40
|
+
" \"cache\": false",
|
|
41
|
+
"}",
|
|
42
|
+
"```",
|
|
43
|
+
"",
|
|
44
|
+
"### Rules",
|
|
45
|
+
"- Always wrap external calls in try-catch",
|
|
46
|
+
"- Get endpoints from config (not hardcode)",
|
|
47
|
+
"- Define response type as interface in src/interface/",
|
|
48
|
+
"- Never use `any` type"
|
|
49
|
+
].join("\n")
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=createRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRepository.js","sourceRoot":"","sources":["../../src/tools/createRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACtD,MAAM,CAAC,YAAY,CACf,mBAAmB,EACnB;QACI,aAAa,EACT,6DAA6D;YAC7D,sDAAsD;YACtD,mDAAmD;YACnD,sDAAsD;QAC1D,aAAa,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACvB,4DAA4D,CAC/D;YACD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CACnD,iDAAiD,CACpD;SACJ;KACJ,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,YAAY,CAAC;QAChF,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC;QAC5E,MAAM,QAAQ,GAAG,uCAAuC,QAAQ,KAAK,CAAC;QACtE,MAAM,IAAI,GAAG,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QAE9E,OAAO;YACH,SAAS,EAAE;gBACP;oBACI,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE;wBACJ,4BAA4B,QAAQ,EAAE;wBACtC,EAAE;wBACF,aAAa,QAAQ,EAAE;wBACvB,eAAe;wBACf,IAAI,CAAC,IAAI,EAAE;wBACX,KAAK;wBACL,EAAE;wBACF,4CAA4C;wBAC5C,SAAS;wBACT,GAAG;wBACH,2BAA2B;wBAC3B,2CAA2C,QAAQ,IAAI;wBACvD,6BAA6B;wBAC7B,kBAAkB,MAAM,IAAI;wBAC5B,gBAAgB,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI;wBACpD,sBAAsB;wBACtB,GAAG;wBACH,KAAK;wBACL,EAAE;wBACF,WAAW;wBACX,2CAA2C;wBAC3C,4CAA4C;wBAC5C,uDAAuD;wBACvD,wBAAwB;qBAC3B,CAAC,IAAI,CAAC,IAAI,CAAC;iBACf;aACJ;SACJ,CAAC;IACN,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createUiComponent.d.ts","sourceRoot":"","sources":["../../src/tools/createUiComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiGjE"}
|