mulby-cli 1.1.5

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.
Files changed (59) hide show
  1. package/PLUGIN_DEVELOP_PROMPT.md +1164 -0
  2. package/README.md +852 -0
  3. package/assets/default-icon.png +0 -0
  4. package/dist/commands/ai-session.js +44 -0
  5. package/dist/commands/build.js +111 -0
  6. package/dist/commands/config-ai.js +291 -0
  7. package/dist/commands/config.js +53 -0
  8. package/dist/commands/create/ai-create.js +183 -0
  9. package/dist/commands/create/assets.js +53 -0
  10. package/dist/commands/create/basic.js +72 -0
  11. package/dist/commands/create/index.js +73 -0
  12. package/dist/commands/create/react.js +136 -0
  13. package/dist/commands/create/templates/basic.js +383 -0
  14. package/dist/commands/create/templates/react/backend.js +72 -0
  15. package/dist/commands/create/templates/react/config.js +166 -0
  16. package/dist/commands/create/templates/react/docs.js +78 -0
  17. package/dist/commands/create/templates/react/hooks.js +469 -0
  18. package/dist/commands/create/templates/react/index.js +41 -0
  19. package/dist/commands/create/templates/react/types.js +1228 -0
  20. package/dist/commands/create/templates/react/ui.js +528 -0
  21. package/dist/commands/create/templates/react.js +1888 -0
  22. package/dist/commands/dev.js +141 -0
  23. package/dist/commands/pack.js +160 -0
  24. package/dist/commands/resume.js +97 -0
  25. package/dist/commands/test-ui.js +50 -0
  26. package/dist/index.js +71 -0
  27. package/dist/services/ai/PLUGIN_API.md +1102 -0
  28. package/dist/services/ai/PLUGIN_DEVELOP_PROMPT.md +1164 -0
  29. package/dist/services/ai/context-manager.js +639 -0
  30. package/dist/services/ai/index.js +88 -0
  31. package/dist/services/ai/knowledge.js +52 -0
  32. package/dist/services/ai/prompts.js +114 -0
  33. package/dist/services/ai/providers/base.js +38 -0
  34. package/dist/services/ai/providers/claude.js +284 -0
  35. package/dist/services/ai/providers/deepseek.js +28 -0
  36. package/dist/services/ai/providers/gemini.js +191 -0
  37. package/dist/services/ai/providers/glm.js +31 -0
  38. package/dist/services/ai/providers/minimax.js +27 -0
  39. package/dist/services/ai/providers/openai.js +177 -0
  40. package/dist/services/ai/tools.js +204 -0
  41. package/dist/services/ai-generator.js +968 -0
  42. package/dist/services/config-manager.js +117 -0
  43. package/dist/services/dependency-manager.js +236 -0
  44. package/dist/services/file-writer.js +66 -0
  45. package/dist/services/plan-adapter.js +244 -0
  46. package/dist/services/plan-command-handler.js +172 -0
  47. package/dist/services/plan-manager.js +502 -0
  48. package/dist/services/session-manager.js +113 -0
  49. package/dist/services/task-analyzer.js +136 -0
  50. package/dist/services/tui/index.js +57 -0
  51. package/dist/services/tui/store.js +123 -0
  52. package/dist/types/ai.js +172 -0
  53. package/dist/types/plan.js +2 -0
  54. package/dist/ui/Terminal.js +56 -0
  55. package/dist/ui/components/InputArea.js +176 -0
  56. package/dist/ui/components/LogArea.js +19 -0
  57. package/dist/ui/components/PlanPanel.js +69 -0
  58. package/dist/ui/components/SelectArea.js +13 -0
  59. package/package.json +45 -0
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.aiCreate = aiCreate;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const inquirer_1 = __importDefault(require("inquirer"));
42
+ const session_manager_1 = require("../../services/session-manager");
43
+ const ai_generator_1 = require("../../services/ai-generator");
44
+ const config_manager_1 = require("../../services/config-manager");
45
+ const prompts_1 = require("../../services/ai/prompts");
46
+ const path = __importStar(require("path"));
47
+ const react_1 = require("./react");
48
+ const ai_1 = require("../../types/ai");
49
+ async function aiCreate(name, options) {
50
+ const configManager = config_manager_1.ConfigManager.getInstance();
51
+ const sessionManager = session_manager_1.SessionManager.getInstance();
52
+ // 1. Check Config
53
+ const aiConfig = configManager.get('ai');
54
+ if (!aiConfig || !aiConfig.providers || Object.keys(aiConfig.providers).length === 0) {
55
+ console.log(chalk_1.default.yellow('⚠️ 未检测到 AI 配置'));
56
+ const { configure } = await inquirer_1.default.prompt([{
57
+ type: 'confirm',
58
+ name: 'configure',
59
+ message: '是否立即配置 AI 服务商?',
60
+ default: true
61
+ }]);
62
+ if (!configure) {
63
+ console.log('已取消。请先配置: mulby ai add <name>');
64
+ return;
65
+ }
66
+ // Simple config flow
67
+ const answers = await inquirer_1.default.prompt([
68
+ {
69
+ type: 'input',
70
+ name: 'configName',
71
+ message: '配置名称 (例如: my-openai):',
72
+ default: 'default',
73
+ validate: (input) => input.length > 0
74
+ },
75
+ {
76
+ type: 'list',
77
+ name: 'provider',
78
+ message: '选择服务商:',
79
+ choices: [
80
+ { name: 'OpenAI', value: 'openai' },
81
+ { name: 'Claude (Anthropic)', value: 'claude' },
82
+ { name: 'DeepSeek', value: 'deepseek' },
83
+ { name: 'Gemini (Google)', value: 'gemini' },
84
+ { name: 'GLM (智谱AI)', value: 'glm' },
85
+ { name: 'Custom (自定义)', value: 'custom' }
86
+ ],
87
+ default: 'openai'
88
+ },
89
+ {
90
+ type: 'password',
91
+ name: 'apiKey',
92
+ message: 'API Key:',
93
+ validate: (input) => input.length > 0
94
+ },
95
+ {
96
+ type: 'list',
97
+ name: 'model',
98
+ message: '选择模型:',
99
+ choices: (answers) => ai_1.PROVIDER_MODELS[answers.provider],
100
+ when: (answers) => ai_1.PROVIDER_MODELS[answers.provider]?.length > 0
101
+ },
102
+ {
103
+ type: 'input',
104
+ name: 'apiEndpoint',
105
+ message: 'API Endpoint:',
106
+ when: (answers) => answers.provider === 'custom',
107
+ validate: (input) => input.length > 0
108
+ }
109
+ ]);
110
+ const newConfig = {
111
+ default: answers.configName,
112
+ providers: {
113
+ [answers.configName]: {
114
+ provider: answers.provider,
115
+ apiKey: answers.apiKey,
116
+ model: answers.model,
117
+ apiEndpoint: answers.apiEndpoint
118
+ }
119
+ }
120
+ };
121
+ configManager.set('ai', newConfig);
122
+ console.log(chalk_1.default.green(`✓ 配置 "${answers.configName}" 已保存`));
123
+ }
124
+ // 2. Handle Resume or New Session
125
+ if (options.resume) {
126
+ // Resume logic
127
+ let session;
128
+ if (typeof options.resume === 'string') {
129
+ session = sessionManager.getSession(options.resume);
130
+ }
131
+ else {
132
+ session = sessionManager.getRecentSession();
133
+ }
134
+ if (!session) {
135
+ console.log(chalk_1.default.red('未找到可恢复的会话'));
136
+ return;
137
+ }
138
+ console.log(chalk_1.default.blue(`恢复会话: ${session.id} (${session.description})`));
139
+ // Use default system prompt for resumed sessions or try to rebuild it?
140
+ // Ideally prompt is already in history, but we might want to update it if we have new templates.
141
+ // For simplicity, we assume history has the prompt.
142
+ if (session.status === 'completed' || session.status === 'failed') {
143
+ console.log(chalk_1.default.yellow('🔄 Reactivating completed/failed session...'));
144
+ session.status = 'generating';
145
+ sessionManager.saveSession(session);
146
+ }
147
+ const agent = new ai_generator_1.AIAgent(session);
148
+ await agent.start({ waitForInput: true });
149
+ return;
150
+ }
151
+ // 3. New Session - 先进入顾问模式,收集需求后再创建脚手架
152
+ // 3. New Session - 先创建脚手架,再进入顾问模式
153
+ const targetDir = path.resolve(process.cwd(), name);
154
+ console.log(chalk_1.default.blue(`\n🚀 初始化项目脚手架: ${name}...`));
155
+ try {
156
+ await (0, react_1.createReactProject)(targetDir, name);
157
+ console.log(chalk_1.default.green('✓ 脚手架创建完成\n'));
158
+ }
159
+ catch (err) {
160
+ console.error(chalk_1.default.red('脚手架创建失败:'), err);
161
+ return;
162
+ }
163
+ const session = sessionManager.createSession(`插件: ${name}`, targetDir);
164
+ session.pluginName = name;
165
+ // 初始消息:告知 AI 脚手架已就绪,触发 Consultant Mode (Context Aware)
166
+ let initialPrompt = `我想创建一个名为 "${name}" 的 Mulby 插件。`;
167
+ initialPrompt += `\n\n✅ 项目脚手架已创建完成 (React 18 + Tailwind CSS v3 + Vite + Mulby API)。`;
168
+ initialPrompt += `\n当前文件结构已包含:manifest.json, src/ui/App.tsx, src/main.ts 等基础文件。`;
169
+ initialPrompt += `\n请读取现有文件了解结构,并作为产品顾问并通过提问帮我明确功能需求和 UI 设计。`;
170
+ if (options.desc) {
171
+ initialPrompt += `\n\n插件初步设想: ${options.desc}\n`;
172
+ }
173
+ session.conversationHistory.push({
174
+ role: 'user',
175
+ content: initialPrompt
176
+ });
177
+ sessionManager.saveSession(session);
178
+ // isScaffolded = true,让 AI 知道项目已存在,可以读取文件
179
+ // 此时 user 还没有确认具体需求,所以 AI 仍需进入 Phase 1,但在有上下文的情况下进行
180
+ const systemPrompt = (0, prompts_1.buildSystemPrompt)({}, true);
181
+ const agent = new ai_generator_1.AIAgent(session, systemPrompt);
182
+ await agent.start();
183
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.copyDefaultIcon = copyDefaultIcon;
40
+ const fs = __importStar(require("fs-extra"));
41
+ const path = __importStar(require("path"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ function getAssetsDir() {
44
+ return path.resolve(__dirname, '../../../assets');
45
+ }
46
+ function copyDefaultIcon(targetDir) {
47
+ const defaultIconPath = path.join(getAssetsDir(), 'default-icon.png');
48
+ const targetIconPath = path.join(targetDir, 'icon.png');
49
+ if (fs.existsSync(defaultIconPath)) {
50
+ fs.copyFileSync(defaultIconPath, targetIconPath);
51
+ console.log(chalk_1.default.green(' ✓ icon.png'));
52
+ }
53
+ }
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.createBasicProject = createBasicProject;
40
+ const fs = __importStar(require("fs-extra"));
41
+ const path = __importStar(require("path"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const assets_1 = require("./assets");
44
+ const basic_1 = require("./templates/basic");
45
+ async function createBasicProject(targetDir, name) {
46
+ fs.mkdirSync(targetDir, { recursive: true });
47
+ fs.mkdirSync(path.join(targetDir, 'src'));
48
+ (0, assets_1.copyDefaultIcon)(targetDir);
49
+ const manifest = (0, basic_1.buildBasicManifest)(name);
50
+ fs.writeJsonSync(path.join(targetDir, 'manifest.json'), manifest, { spaces: 2 });
51
+ console.log(chalk_1.default.green(' ✓ manifest.json'));
52
+ const pkg = (0, basic_1.buildBasicPackageJson)(name);
53
+ fs.writeJsonSync(path.join(targetDir, 'package.json'), pkg, { spaces: 2 });
54
+ console.log(chalk_1.default.green(' ✓ package.json'));
55
+ const mainTs = (0, basic_1.buildBasicMain)(name);
56
+ fs.writeFileSync(path.join(targetDir, 'src/main.ts'), mainTs);
57
+ console.log(chalk_1.default.green(' ✓ src/main.ts'));
58
+ // 创建 .gitignore
59
+ const gitignore = (0, basic_1.buildGitignore)();
60
+ fs.writeFileSync(path.join(targetDir, '.gitignore'), gitignore);
61
+ console.log(chalk_1.default.green(' ✓ .gitignore'));
62
+ // 创建 README.md
63
+ const readme = (0, basic_1.buildBasicReadme)(name);
64
+ fs.writeFileSync(path.join(targetDir, 'README.md'), readme);
65
+ console.log(chalk_1.default.green(' ✓ README.md'));
66
+ // 复制 API 参考文档
67
+ const apiDocSrc = path.join(__dirname, '../../..', 'PLUGIN_DEVELOP_PROMPT.md');
68
+ if (fs.existsSync(apiDocSrc)) {
69
+ fs.copyFileSync(apiDocSrc, path.join(targetDir, 'PLUGIN_DEVELOP_PROMPT.md'));
70
+ console.log(chalk_1.default.green(' ✓ PLUGIN_DEVELOP_PROMPT.md'));
71
+ }
72
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.create = create;
40
+ const fs = __importStar(require("fs-extra"));
41
+ const path = __importStar(require("path"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const basic_1 = require("./basic");
44
+ const react_1 = require("./react");
45
+ const ai_create_1 = require("./ai-create");
46
+ async function create(name, options) {
47
+ if (options.ai || options.resume) {
48
+ await (0, ai_create_1.aiCreate)(name, options);
49
+ return;
50
+ }
51
+ const targetDir = path.resolve(process.cwd(), name);
52
+ if (fs.existsSync(targetDir)) {
53
+ console.log(chalk_1.default.red(`错误: 目录 ${name} 已存在`));
54
+ process.exit(1);
55
+ }
56
+ const template = options.template || 'react';
57
+ console.log(chalk_1.default.blue(`创建插件项目: ${name}`));
58
+ console.log(chalk_1.default.gray(`模板: ${template}`));
59
+ console.log();
60
+ if (template === 'react') {
61
+ await (0, react_1.createReactProject)(targetDir, name);
62
+ }
63
+ else {
64
+ await (0, basic_1.createBasicProject)(targetDir, name);
65
+ }
66
+ console.log();
67
+ console.log(chalk_1.default.green('插件创建成功!'));
68
+ console.log();
69
+ console.log('下一步:');
70
+ console.log(chalk_1.default.cyan(` cd ${name}`));
71
+ console.log(chalk_1.default.cyan(' npm install'));
72
+ console.log(chalk_1.default.cyan(' npm run dev'));
73
+ }
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.createReactProject = createReactProject;
40
+ const fs = __importStar(require("fs-extra"));
41
+ const path = __importStar(require("path"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const assets_1 = require("./assets");
44
+ const index_js_1 = require("./templates/react/index.js");
45
+ async function createReactProject(targetDir, name) {
46
+ fs.mkdirSync(targetDir, { recursive: true });
47
+ fs.mkdirSync(path.join(targetDir, 'src'));
48
+ fs.mkdirSync(path.join(targetDir, 'src/ui'));
49
+ (0, assets_1.copyDefaultIcon)(targetDir);
50
+ createReactManifest(targetDir, name);
51
+ createReactPackageJson(targetDir, name);
52
+ createTsConfig(targetDir);
53
+ createViteConfig(targetDir);
54
+ createPostcssConfig(targetDir);
55
+ createTailwindConfig(targetDir);
56
+ createBackendMain(targetDir, name);
57
+ createReactUI(targetDir, name);
58
+ createMulbyTypes(targetDir);
59
+ createGitignore(targetDir);
60
+ createReadme(targetDir, name);
61
+ // 复制 API 参考文档
62
+ const apiDocSrc = path.join(__dirname, '../../..', 'PLUGIN_DEVELOP_PROMPT.md');
63
+ if (fs.existsSync(apiDocSrc)) {
64
+ fs.copyFileSync(apiDocSrc, path.join(targetDir, 'PLUGIN_DEVELOP_PROMPT.md'));
65
+ console.log(chalk_1.default.green(' ✓ PLUGIN_DEVELOP_PROMPT.md'));
66
+ }
67
+ }
68
+ function createReactManifest(targetDir, name) {
69
+ const manifest = (0, index_js_1.buildReactManifest)(name);
70
+ fs.writeJsonSync(path.join(targetDir, 'manifest.json'), manifest, { spaces: 2 });
71
+ console.log(chalk_1.default.green(' ✓ manifest.json'));
72
+ }
73
+ function createReactPackageJson(targetDir, name) {
74
+ const pkg = (0, index_js_1.buildReactPackageJson)(name);
75
+ fs.writeJsonSync(path.join(targetDir, 'package.json'), pkg, { spaces: 2 });
76
+ console.log(chalk_1.default.green(' ✓ package.json'));
77
+ }
78
+ function createTsConfig(targetDir) {
79
+ const tsconfig = (0, index_js_1.buildTsConfig)();
80
+ fs.writeJsonSync(path.join(targetDir, 'tsconfig.json'), tsconfig, { spaces: 2 });
81
+ console.log(chalk_1.default.green(' ✓ tsconfig.json'));
82
+ }
83
+ function createViteConfig(targetDir) {
84
+ const viteConfig = (0, index_js_1.buildViteConfig)();
85
+ fs.writeFileSync(path.join(targetDir, 'vite.config.ts'), viteConfig);
86
+ console.log(chalk_1.default.green(' ✓ vite.config.ts'));
87
+ }
88
+ function createPostcssConfig(targetDir) {
89
+ const config = (0, index_js_1.buildPostcssConfig)();
90
+ fs.writeFileSync(path.join(targetDir, 'postcss.config.js'), config);
91
+ console.log(chalk_1.default.green(' ✓ postcss.config.js'));
92
+ }
93
+ function createTailwindConfig(targetDir) {
94
+ const config = (0, index_js_1.buildTailwindConfig)();
95
+ fs.writeFileSync(path.join(targetDir, 'tailwind.config.js'), config);
96
+ console.log(chalk_1.default.green(' ✓ tailwind.config.js'));
97
+ }
98
+ function createBackendMain(targetDir, name) {
99
+ const mainTs = (0, index_js_1.buildBackendMain)(name);
100
+ fs.writeFileSync(path.join(targetDir, 'src/main.ts'), mainTs);
101
+ console.log(chalk_1.default.green(' ✓ src/main.ts'));
102
+ }
103
+ function createReactUI(targetDir, name) {
104
+ fs.mkdirSync(path.join(targetDir, 'src/ui/hooks'), { recursive: true });
105
+ const indexHtml = (0, index_js_1.buildIndexHtml)(name);
106
+ fs.writeFileSync(path.join(targetDir, 'src/ui/index.html'), indexHtml);
107
+ console.log(chalk_1.default.green(' ✓ src/ui/index.html'));
108
+ const mainTsx = (0, index_js_1.buildMainTsx)();
109
+ fs.writeFileSync(path.join(targetDir, 'src/ui/main.tsx'), mainTsx);
110
+ console.log(chalk_1.default.green(' ✓ src/ui/main.tsx'));
111
+ const appTsx = (0, index_js_1.buildAppTsx)(name);
112
+ fs.writeFileSync(path.join(targetDir, 'src/ui/App.tsx'), appTsx);
113
+ console.log(chalk_1.default.green(' ✓ src/ui/App.tsx'));
114
+ const stylesCss = (0, index_js_1.buildStylesCss)();
115
+ fs.writeFileSync(path.join(targetDir, 'src/ui/styles.css'), stylesCss);
116
+ console.log(chalk_1.default.green(' ✓ src/ui/styles.css'));
117
+ const useMulby = (0, index_js_1.buildUseMulby)();
118
+ fs.writeFileSync(path.join(targetDir, 'src/ui/hooks/useMulby.ts'), useMulby);
119
+ console.log(chalk_1.default.green(' ✓ src/ui/hooks/useMulby.ts'));
120
+ }
121
+ function createMulbyTypes(targetDir) {
122
+ fs.mkdirSync(path.join(targetDir, 'src/types'), { recursive: true });
123
+ const typesDts = (0, index_js_1.buildMulbyTypes)();
124
+ fs.writeFileSync(path.join(targetDir, 'src/types/mulby.d.ts'), typesDts);
125
+ console.log(chalk_1.default.green(' ✓ src/types/mulby.d.ts'));
126
+ }
127
+ function createGitignore(targetDir) {
128
+ const gitignore = (0, index_js_1.buildGitignore)();
129
+ fs.writeFileSync(path.join(targetDir, '.gitignore'), gitignore);
130
+ console.log(chalk_1.default.green(' ✓ .gitignore'));
131
+ }
132
+ function createReadme(targetDir, name) {
133
+ const readme = (0, index_js_1.buildReactReadme)(name);
134
+ fs.writeFileSync(path.join(targetDir, 'README.md'), readme);
135
+ console.log(chalk_1.default.green(' ✓ README.md'));
136
+ }