bmall-mcp 1.2.1 → 1.2.3

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 (45) hide show
  1. package/README.md +17 -2
  2. package/dist/index.js +3 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/tools/mta/read/index.js +1 -1
  5. package/dist/tools/mta/read/index.js.map +1 -1
  6. package/dist/tools/rules/pull.d.ts.map +1 -1
  7. package/dist/tools/rules/pull.js +7 -2
  8. package/dist/tools/rules/pull.js.map +1 -1
  9. package/dist/tools/rules/push.d.ts.map +1 -1
  10. package/dist/tools/rules/push.js +17 -33
  11. package/dist/tools/rules/push.js.map +1 -1
  12. package/dist/tools/rules/utils.d.ts +2 -13
  13. package/dist/tools/rules/utils.d.ts.map +1 -1
  14. package/dist/tools/rules/utils.js +15 -194
  15. package/dist/tools/rules/utils.js.map +1 -1
  16. package/dist/utils/file.d.ts +13 -0
  17. package/dist/utils/file.d.ts.map +1 -0
  18. package/dist/utils/file.js +44 -0
  19. package/dist/utils/file.js.map +1 -0
  20. package/dist/utils/git.d.ts +28 -0
  21. package/dist/utils/git.d.ts.map +1 -0
  22. package/dist/utils/git.js +111 -0
  23. package/dist/utils/git.js.map +1 -0
  24. package/dist/utils/ide.d.ts.map +1 -1
  25. package/dist/utils/ide.js +4 -1
  26. package/dist/utils/ide.js.map +1 -1
  27. package/dist/utils/index.d.ts +2 -1
  28. package/dist/utils/index.d.ts.map +1 -1
  29. package/dist/utils/index.js +2 -1
  30. package/dist/utils/index.js.map +1 -1
  31. package/dist/utils/project.d.ts +20 -1
  32. package/dist/utils/project.d.ts.map +1 -1
  33. package/dist/utils/project.js +233 -29
  34. package/dist/utils/project.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/index.ts +5 -0
  37. package/src/tools/mta/read/index.ts +1 -1
  38. package/src/tools/rules/pull.ts +8 -2
  39. package/src/tools/rules/push.ts +25 -39
  40. package/src/tools/rules/utils.ts +27 -219
  41. package/src/utils/file.ts +54 -0
  42. package/src/utils/git.ts +133 -0
  43. package/src/utils/ide.ts +5 -1
  44. package/src/utils/index.ts +2 -1
  45. package/src/utils/project.ts +251 -29
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Git 操作工具
3
+ */
4
+ /**
5
+ * 初始化 Git 仓库
6
+ */
7
+ export declare function initGitRepo(repoDir: string, remoteUrl: string): void;
8
+ /**
9
+ * 配置 sparse-checkout(只克隆指定目录)
10
+ */
11
+ export declare function setupSparseCheckout(repoDir: string, dirs: string[]): void;
12
+ /**
13
+ * 拉取远程分支
14
+ */
15
+ export declare function fetchBranch(repoDir: string, branch: string): void;
16
+ /**
17
+ * 检出分支
18
+ */
19
+ export declare function checkoutBranch(repoDir: string, branch: string): void;
20
+ /**
21
+ * 检出或创建分支
22
+ */
23
+ export declare function checkoutOrCreateBranch(repoDir: string, branchName: string, baseBranch: string): void;
24
+ /**
25
+ * Git 提交并推送
26
+ */
27
+ export declare function commitAndPush(repoDir: string, message: string, branch: string): boolean;
28
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAsBpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAQzE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGjE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQpE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,IAAI,CAwBN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,OAAO,CAsBT"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Git 操作工具
3
+ */
4
+ import * as fs from "fs";
5
+ import * as path from "path";
6
+ import { execSync } from "child_process";
7
+ import { log } from "./index.js";
8
+ /**
9
+ * 初始化 Git 仓库
10
+ */
11
+ export function initGitRepo(repoDir, remoteUrl) {
12
+ const gitDir = path.join(repoDir, ".git");
13
+ // 检查 .git 目录是否存在且有效
14
+ if (fs.existsSync(gitDir)) {
15
+ try {
16
+ execSync(`git -C ${repoDir} status`, { stdio: "pipe" });
17
+ return; // Git 仓库有效
18
+ }
19
+ catch (e) {
20
+ log(`Git 仓库损坏,重新初始化...`);
21
+ fs.rmSync(repoDir, { recursive: true, force: true });
22
+ }
23
+ }
24
+ log(`创建目录: ${repoDir}`);
25
+ fs.mkdirSync(repoDir, { recursive: true });
26
+ log(`初始化 Git 仓库...`);
27
+ execSync(`git init ${repoDir}`, { stdio: "inherit" });
28
+ log(`添加远程: ${remoteUrl}`);
29
+ execSync(`git -C ${repoDir} remote add origin ${remoteUrl}`, { stdio: "inherit" });
30
+ }
31
+ /**
32
+ * 配置 sparse-checkout(只克隆指定目录)
33
+ */
34
+ export function setupSparseCheckout(repoDir, dirs) {
35
+ log(`配置 sparse-checkout...`);
36
+ execSync(`git -C ${repoDir} config core.sparseCheckout true`, { stdio: "inherit" });
37
+ const sparseCheckoutFile = path.join(repoDir, ".git/info/sparse-checkout");
38
+ const content = dirs.map(d => `${d}/`).join("\n") + "\n";
39
+ fs.writeFileSync(sparseCheckoutFile, content);
40
+ log(`设置只克隆目录: ${dirs.join(", ")}`);
41
+ }
42
+ /**
43
+ * 拉取远程分支
44
+ */
45
+ export function fetchBranch(repoDir, branch) {
46
+ log(`拉取分支 ${branch}...`);
47
+ execSync(`git -C ${repoDir} fetch origin ${branch}`, { stdio: "inherit" });
48
+ }
49
+ /**
50
+ * 检出分支
51
+ */
52
+ export function checkoutBranch(repoDir, branch) {
53
+ log(`检出 origin/${branch}...`);
54
+ try {
55
+ execSync(`git -C ${repoDir} checkout -B ${branch} origin/${branch}`, { stdio: "inherit" });
56
+ }
57
+ catch (e) {
58
+ // 如果失败,尝试直接检出 FETCH_HEAD
59
+ execSync(`git -C ${repoDir} checkout FETCH_HEAD`, { stdio: "inherit" });
60
+ }
61
+ }
62
+ /**
63
+ * 检出或创建分支
64
+ */
65
+ export function checkoutOrCreateBranch(repoDir, branchName, baseBranch) {
66
+ log(`检出或创建分支 ${branchName}...`);
67
+ // 先尝试检出远程分支(如果存在)
68
+ try {
69
+ execSync(`git -C ${repoDir} fetch origin ${branchName}`, { stdio: "pipe" });
70
+ execSync(`git -C ${repoDir} checkout -B ${branchName} origin/${branchName}`, { stdio: "inherit" });
71
+ log(`检出远程分支: ${branchName}`);
72
+ return;
73
+ }
74
+ catch (e) {
75
+ // 远程分支不存在,继续创建新分支
76
+ }
77
+ // 基于主分支创建新分支
78
+ log(`远程分支不存在,基于 ${baseBranch} 创建...`);
79
+ try {
80
+ execSync(`git -C ${repoDir} checkout -B ${baseBranch} origin/${baseBranch}`, { stdio: "inherit" });
81
+ execSync(`git -C ${repoDir} checkout -b ${branchName}`, { stdio: "inherit" });
82
+ log(`创建新分支: ${branchName}`);
83
+ }
84
+ catch (e2) {
85
+ log(`主分支不存在,创建孤立分支...`);
86
+ execSync(`git -C ${repoDir} checkout --orphan ${branchName}`, { stdio: "inherit" });
87
+ log(`创建孤立分支: ${branchName}`);
88
+ }
89
+ }
90
+ /**
91
+ * Git 提交并推送
92
+ */
93
+ export function commitAndPush(repoDir, message, branch) {
94
+ // 检查是否有修改
95
+ log(`检查修改...`);
96
+ const status = execSync(`git -C ${repoDir} status --porcelain`, { encoding: "utf-8" });
97
+ if (!status.trim()) {
98
+ return false; // 没有修改
99
+ }
100
+ // 添加修改
101
+ log(`添加修改...`);
102
+ execSync(`git -C ${repoDir} add -A`, { stdio: "inherit" });
103
+ // 提交修改
104
+ log(`提交修改: ${message}`);
105
+ execSync(`git -C ${repoDir} commit -m "${message}"`, { stdio: "inherit" });
106
+ // 推送到远程
107
+ log(`推送到远程分支 ${branch}...`);
108
+ execSync(`git -C ${repoDir} push -u origin ${branch}`, { stdio: "inherit" });
109
+ return true;
110
+ }
111
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ide.d.ts","sourceRoot":"","sources":["../../src/utils/ide.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAKzC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD"}
1
+ {"version":3,"file":"ide.d.ts","sourceRoot":"","sources":["../../src/utils/ide.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAKzC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGtD"}
package/dist/utils/ide.js CHANGED
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * IDE 相关工具
3
3
  */
4
+ import * as path from "path";
5
+ import { getProjectRoot } from "./project.js";
4
6
  /**
5
7
  * 检测当前 IDE
6
8
  * 优先从 MCP_IDE 环境变量读取
@@ -15,6 +17,7 @@ export function detectCurrentIDE() {
15
17
  * 获取 IDE 的 MTA 目录路径
16
18
  */
17
19
  export function getIDEMtaSpecsPath(ide) {
18
- return `.${ide}/mta`;
20
+ const projectDir = getProjectRoot();
21
+ return path.join(projectDir, `.${ide}/mta`);
19
22
  }
20
23
  //# sourceMappingURL=ide.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ide.js","sourceRoot":"","sources":["../../src/utils/ide.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,IAAI,GAAG,MAAM,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"ide.js","sourceRoot":"","sources":["../../src/utils/ide.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;AAC9C,CAAC"}
@@ -2,8 +2,9 @@
2
2
  * 通用工具 - 统一导出
3
3
  */
4
4
  export declare const HOME: string;
5
- export declare const CWD: string;
6
5
  export declare function log(message: string): void;
7
6
  export * from "./project.js";
8
7
  export * from "./ide.js";
8
+ export * from "./file.js";
9
+ export * from "./git.js";
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,IAAI,QAAoD,CAAC;AACtE,eAAO,MAAM,GAAG,QAAgB,CAAC;AAEjC,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,QAElC;AAGD,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,IAAI,QAAoD,CAAC;AAEtE,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,QAElC;AAGD,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC"}
@@ -2,11 +2,12 @@
2
2
  * 通用工具 - 统一导出
3
3
  */
4
4
  export const HOME = process.env.HOME || process.env.USERPROFILE || "";
5
- export const CWD = process.cwd();
6
5
  export function log(message) {
7
6
  console.error(`[bmall-mcp] ${message}`);
8
7
  }
9
8
  // 重新导出
10
9
  export * from "./project.js";
11
10
  export * from "./ide.js";
11
+ export * from "./file.js";
12
+ export * from "./git.js";
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;AACtE,MAAM,CAAC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAEjC,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,OAAO,CAAC,KAAK,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,OAAO;AACP,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;AAEtE,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,OAAO,CAAC,KAAK,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,OAAO;AACP,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC"}
@@ -1,6 +1,25 @@
1
1
  /**
2
- * 项目类型检测
2
+ * 项目相关工具
3
3
  */
4
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
5
  export type ProjectType = "ios" | "android" | "web" | "h5" | "harmony" | "common" | "unknown";
6
+ /**
7
+ * 初始化项目根目录
8
+ * 优先通过 MCP roots 获取,fallback 到 process.cwd()
9
+ */
10
+ export declare function initProjectRoot(server: Server): Promise<string>;
11
+ /**
12
+ * 获取项目根目录
13
+ */
14
+ export declare function getProjectRoot(): string;
5
15
  export declare function detectProjectType(): ProjectType;
16
+ /**
17
+ * 检测项目名称
18
+ * 根据项目类型选择检测方式
19
+ */
20
+ export declare function detectProjectName(): string;
21
+ /**
22
+ * 清理项目名,确保可以用作分支名
23
+ */
24
+ export declare function sanitizeProjectName(name: string): string;
6
25
  //# sourceMappingURL=project.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE9F,wBAAgB,iBAAiB,IAAI,WAAW,CA4B/C"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAK9F;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBrE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CA8B/C;AAqGD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA+B1C;AAsID;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxD"}
@@ -1,27 +1,62 @@
1
1
  /**
2
- * 项目类型检测
2
+ * 项目相关工具
3
3
  */
4
4
  import * as fs from "fs";
5
5
  import * as path from "path";
6
- import { CWD, log } from "./index.js";
6
+ import { log } from "./index.js";
7
+ // 项目根目录(全局缓存)
8
+ let projectRoot = null;
9
+ /**
10
+ * 初始化项目根目录
11
+ * 优先通过 MCP roots 获取,fallback 到 process.cwd()
12
+ */
13
+ export async function initProjectRoot(server) {
14
+ if (projectRoot) {
15
+ return projectRoot;
16
+ }
17
+ // 尝试通过 roots 获取
18
+ try {
19
+ const rootsResult = await server.listRoots();
20
+ if (rootsResult?.roots?.length > 0) {
21
+ const uri = rootsResult.roots[0].uri;
22
+ projectRoot = uri.replace(/^file:\/\//, "");
23
+ log(`通过 roots 获取项目目录: ${projectRoot}`);
24
+ return projectRoot;
25
+ }
26
+ }
27
+ catch (e) {
28
+ log(`roots 不支持,使用 cwd`);
29
+ }
30
+ // fallback 到 cwd
31
+ projectRoot = process.cwd();
32
+ log(`使用 cwd 作为项目目录: ${projectRoot}`);
33
+ return projectRoot;
34
+ }
35
+ /**
36
+ * 获取项目根目录
37
+ */
38
+ export function getProjectRoot() {
39
+ return projectRoot || process.cwd();
40
+ }
7
41
  export function detectProjectType() {
8
- if (isTaroProject()) {
42
+ const root = getProjectRoot();
43
+ if (isTaroProject(root)) {
9
44
  log(`检测到 Taro 项目,识别为 h5`);
10
45
  return "h5";
11
46
  }
12
- if (isHarmonyProject()) {
47
+ if (isHarmonyProject(root)) {
13
48
  log(`检测到 HarmonyOS 项目,识别为 harmony`);
14
49
  return "harmony";
15
50
  }
16
- if (isIOSProject()) {
51
+ if (isIOSProject(root)) {
17
52
  log(`检测到 iOS 项目`);
18
53
  return "ios";
19
54
  }
20
- if (isAndroidProject()) {
55
+ if (isAndroidProject(root)) {
21
56
  log(`检测到 Android 项目`);
22
57
  return "android";
23
58
  }
24
- if (isWebProject()) {
59
+ if (isWebProject(root)) {
25
60
  log(`检测到 Web 项目`);
26
61
  return "web";
27
62
  }
@@ -31,13 +66,13 @@ export function detectProjectType() {
31
66
  /**
32
67
  * 检测是否为 iOS 项目
33
68
  */
34
- function isIOSProject() {
35
- if (fs.existsSync(path.join(CWD, "Podfile")) ||
36
- fs.existsSync(path.join(CWD, "ios/Podfile"))) {
69
+ function isIOSProject(root) {
70
+ if (fs.existsSync(path.join(root, "Podfile")) ||
71
+ fs.existsSync(path.join(root, "ios/Podfile"))) {
37
72
  return true;
38
73
  }
39
74
  try {
40
- const files = fs.readdirSync(CWD);
75
+ const files = fs.readdirSync(root);
41
76
  if (files.some(f => f.endsWith(".xcodeproj"))) {
42
77
  return true;
43
78
  }
@@ -50,13 +85,13 @@ function isIOSProject() {
50
85
  /**
51
86
  * 检测是否为 Android 项目
52
87
  */
53
- function isAndroidProject() {
54
- if (fs.existsSync(path.join(CWD, "build.gradle")) ||
55
- fs.existsSync(path.join(CWD, "android/build.gradle"))) {
88
+ function isAndroidProject(root) {
89
+ if (fs.existsSync(path.join(root, "build.gradle")) ||
90
+ fs.existsSync(path.join(root, "android/build.gradle"))) {
56
91
  return true;
57
92
  }
58
- if (fs.existsSync(path.join(CWD, "AndroidManifest.xml")) ||
59
- fs.existsSync(path.join(CWD, "app/src/main/AndroidManifest.xml"))) {
93
+ if (fs.existsSync(path.join(root, "AndroidManifest.xml")) ||
94
+ fs.existsSync(path.join(root, "app/src/main/AndroidManifest.xml"))) {
60
95
  return true;
61
96
  }
62
97
  return false;
@@ -64,25 +99,25 @@ function isAndroidProject() {
64
99
  /**
65
100
  * 检测是否为 Web 项目
66
101
  */
67
- function isWebProject() {
68
- return fs.existsSync(path.join(CWD, "vite.config.ts")) ||
69
- fs.existsSync(path.join(CWD, "vite.config.js")) ||
70
- fs.existsSync(path.join(CWD, "webpack.config.js"));
102
+ function isWebProject(root) {
103
+ return fs.existsSync(path.join(root, "vite.config.ts")) ||
104
+ fs.existsSync(path.join(root, "vite.config.js")) ||
105
+ fs.existsSync(path.join(root, "webpack.config.js"));
71
106
  }
72
107
  /**
73
108
  * 检测是否为 Taro 项目(H5)
74
109
  */
75
- function isTaroProject() {
110
+ function isTaroProject(root) {
76
111
  const taroConfigPaths = [
77
- path.join(CWD, "config/index.js"),
78
- path.join(CWD, "config/index.ts"),
79
- path.join(CWD, "config/index.cjs"),
112
+ path.join(root, "config/index.js"),
113
+ path.join(root, "config/index.ts"),
114
+ path.join(root, "config/index.cjs"),
80
115
  ];
81
116
  const hasTaroConfig = taroConfigPaths.some(p => fs.existsSync(p));
82
117
  if (!hasTaroConfig) {
83
118
  return false;
84
119
  }
85
- const packageJsonPath = path.join(CWD, "package.json");
120
+ const packageJsonPath = path.join(root, "package.json");
86
121
  if (fs.existsSync(packageJsonPath)) {
87
122
  try {
88
123
  const content = fs.readFileSync(packageJsonPath, "utf-8");
@@ -101,16 +136,185 @@ function isTaroProject() {
101
136
  /**
102
137
  * 检测是否为 HarmonyOS 项目
103
138
  */
104
- function isHarmonyProject() {
105
- if (fs.existsSync(path.join(CWD, "build-profile.json5"))) {
139
+ function isHarmonyProject(root) {
140
+ if (fs.existsSync(path.join(root, "build-profile.json5"))) {
106
141
  return true;
107
142
  }
108
- if (fs.existsSync(path.join(CWD, "oh-package.json5"))) {
143
+ if (fs.existsSync(path.join(root, "oh-package.json5"))) {
109
144
  return true;
110
145
  }
111
- if (fs.existsSync(path.join(CWD, "entry/src/main/ets"))) {
146
+ if (fs.existsSync(path.join(root, "entry/src/main/ets"))) {
112
147
  return true;
113
148
  }
114
149
  return false;
115
150
  }
151
+ /**
152
+ * 检测项目名称
153
+ * 根据项目类型选择检测方式
154
+ */
155
+ export function detectProjectName() {
156
+ const projectDir = getProjectRoot();
157
+ const projectType = detectProjectType();
158
+ let name = null;
159
+ switch (projectType) {
160
+ case "ios":
161
+ name = detectIOSProjectName(projectDir);
162
+ break;
163
+ case "android":
164
+ name = detectAndroidProjectName(projectDir);
165
+ break;
166
+ case "harmony":
167
+ name = detectHarmonyProjectName(projectDir);
168
+ break;
169
+ case "web":
170
+ case "h5":
171
+ name = detectWebProjectName(projectDir);
172
+ break;
173
+ }
174
+ if (name) {
175
+ return name;
176
+ }
177
+ // fallback: 使用目录名
178
+ const dirName = path.basename(projectDir);
179
+ const sanitized = sanitizeProjectName(dirName);
180
+ log(`使用目录名作为项目名: ${sanitized}`);
181
+ return sanitized;
182
+ }
183
+ /**
184
+ * 检测 iOS 项目名称
185
+ * 优先级:Podfile > .xcodeproj > 目录名
186
+ */
187
+ function detectIOSProjectName(projectDir) {
188
+ // 1. 检查 Podfile
189
+ const podfilePath = path.join(projectDir, "Podfile");
190
+ if (fs.existsSync(podfilePath)) {
191
+ try {
192
+ const content = fs.readFileSync(podfilePath, "utf-8");
193
+ const match = content.match(/target\s+['"](.*?)['"]/);
194
+ if (match && match[1]) {
195
+ const name = sanitizeProjectName(match[1]);
196
+ log(`从 Podfile 检测到项目名: ${name}`);
197
+ return name;
198
+ }
199
+ }
200
+ catch (e) {
201
+ // 继续
202
+ }
203
+ }
204
+ // 2. 检查 .xcodeproj
205
+ try {
206
+ const files = fs.readdirSync(projectDir);
207
+ const xcodeproj = files.find(f => f.endsWith(".xcodeproj"));
208
+ if (xcodeproj) {
209
+ const name = sanitizeProjectName(xcodeproj.replace(".xcodeproj", ""));
210
+ log(`从 .xcodeproj 检测到项目名: ${name}`);
211
+ return name;
212
+ }
213
+ }
214
+ catch (e) {
215
+ // 继续
216
+ }
217
+ return null;
218
+ }
219
+ /**
220
+ * 检测 Android 项目名称
221
+ * 优先级:settings.gradle > 目录名
222
+ */
223
+ function detectAndroidProjectName(projectDir) {
224
+ // 检查 settings.gradle
225
+ const settingsGradlePaths = [
226
+ path.join(projectDir, "settings.gradle"),
227
+ path.join(projectDir, "settings.gradle.kts"),
228
+ ];
229
+ for (const settingsPath of settingsGradlePaths) {
230
+ if (fs.existsSync(settingsPath)) {
231
+ try {
232
+ const content = fs.readFileSync(settingsPath, "utf-8");
233
+ // rootProject.name = 'ProjectName' 或 rootProject.name = "ProjectName"
234
+ const match = content.match(/rootProject\.name\s*=\s*['"](.*?)['"]/);
235
+ if (match && match[1]) {
236
+ const name = sanitizeProjectName(match[1]);
237
+ log(`从 settings.gradle 检测到项目名: ${name}`);
238
+ return name;
239
+ }
240
+ }
241
+ catch (e) {
242
+ // 继续
243
+ }
244
+ }
245
+ }
246
+ return null;
247
+ }
248
+ /**
249
+ * 检测 Harmony 项目名称
250
+ * 优先级:oh-package.json5 > build-profile.json5 > 目录名
251
+ */
252
+ function detectHarmonyProjectName(projectDir) {
253
+ // 1. 检查 oh-package.json5
254
+ const ohPackagePath = path.join(projectDir, "oh-package.json5");
255
+ if (fs.existsSync(ohPackagePath)) {
256
+ try {
257
+ const content = fs.readFileSync(ohPackagePath, "utf-8");
258
+ // JSON5 格式,简单匹配 "name": "xxx"
259
+ const match = content.match(/"name"\s*:\s*"(.*?)"/);
260
+ if (match && match[1]) {
261
+ const name = sanitizeProjectName(match[1]);
262
+ log(`从 oh-package.json5 检测到项目名: ${name}`);
263
+ return name;
264
+ }
265
+ }
266
+ catch (e) {
267
+ // 继续
268
+ }
269
+ }
270
+ // 2. 检查 build-profile.json5
271
+ const buildProfilePath = path.join(projectDir, "build-profile.json5");
272
+ if (fs.existsSync(buildProfilePath)) {
273
+ try {
274
+ const content = fs.readFileSync(buildProfilePath, "utf-8");
275
+ const match = content.match(/"name"\s*:\s*"(.*?)"/);
276
+ if (match && match[1]) {
277
+ const name = sanitizeProjectName(match[1]);
278
+ log(`从 build-profile.json5 检测到项目名: ${name}`);
279
+ return name;
280
+ }
281
+ }
282
+ catch (e) {
283
+ // 继续
284
+ }
285
+ }
286
+ return null;
287
+ }
288
+ /**
289
+ * 检测 Web/H5 项目名称
290
+ * 优先级:package.json > 目录名
291
+ */
292
+ function detectWebProjectName(projectDir) {
293
+ const packageJsonPath = path.join(projectDir, "package.json");
294
+ if (fs.existsSync(packageJsonPath)) {
295
+ try {
296
+ const content = fs.readFileSync(packageJsonPath, "utf-8");
297
+ const json = JSON.parse(content);
298
+ if (json.name) {
299
+ const name = sanitizeProjectName(json.name);
300
+ log(`从 package.json 检测到项目名: ${name}`);
301
+ return name;
302
+ }
303
+ }
304
+ catch (e) {
305
+ // 继续
306
+ }
307
+ }
308
+ return null;
309
+ }
310
+ /**
311
+ * 清理项目名,确保可以用作分支名
312
+ */
313
+ export function sanitizeProjectName(name) {
314
+ return name
315
+ .toLowerCase()
316
+ .replace(/[^a-z0-9-_]/g, "-") // 非法字符替换为 -
317
+ .replace(/-+/g, "-") // 多个 - 合并
318
+ .replace(/^-|-$/g, ""); // 去掉首尾 -
319
+ }
116
320
  //# sourceMappingURL=project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAKjC,cAAc;AACd,IAAI,WAAW,GAAkB,IAAI,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAc;IAClD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7C,IAAI,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACrC,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAC5C,GAAG,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;YACvC,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC5B,GAAG,CAAC,kBAAkB,WAAW,EAAE,CAAC,CAAC;IACrC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAE9B,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,YAAY,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,YAAY,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC/B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACzC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK;IACP,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC9C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;QACrD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAC,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAChD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAChD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,eAAe,GAAG;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC;KACpC,CAAC;IAEF,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/D,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAChD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK;QACP,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAGD;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;IAExC,IAAI,IAAI,GAAkB,IAAI,CAAC;IAE/B,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,KAAK;YACR,IAAI,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM;QACR,KAAK,SAAS;YACZ,IAAI,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM;QACR,KAAK,SAAS;YACZ,IAAI,GAAG,wBAAwB,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM;QACR,KAAK,KAAK,CAAC;QACX,KAAK,IAAI;YACP,IAAI,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM;IACV,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kBAAkB;IAClB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC/C,GAAG,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;IAChC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,gBAAgB;IAChB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACrD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACtD,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3C,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;gBACjC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK;QACP,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAC5D,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,IAAI,GAAG,mBAAmB,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;YACtE,GAAG,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK;IACP,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,wBAAwB,CAAC,UAAkB;IAClD,qBAAqB;IACrB,MAAM,mBAAmB,GAAG;QAC1B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC;KAC7C,CAAC;IAEF,KAAK,MAAM,YAAY,IAAI,mBAAmB,EAAE,CAAC;QAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACvD,sEAAsE;gBACtE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBACrE,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3C,GAAG,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;oBACzC,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,KAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,wBAAwB,CAAC,UAAkB;IAClD,yBAAyB;IACzB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACxD,8BAA8B;YAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACpD,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3C,GAAG,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK;QACP,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACtE,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACpD,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3C,GAAG,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;gBAC7C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK;QACP,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5C,GAAG,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;gBACtC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK;QACP,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAE,YAAY;SAC1C,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAW,UAAU;SACxC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAQ,SAAS;AAC5C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bmall-mcp",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "MCP Server for bmall development rules and tools",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/index.ts CHANGED
@@ -12,6 +12,7 @@ import {
12
12
  } from "@modelcontextprotocol/sdk/types.js";
13
13
  import { toolDefinitions } from "./server/tools.js";
14
14
  import { handleToolCall } from "./server/handlers.js";
15
+ import { initProjectRoot } from "./utils/project.js";
15
16
 
16
17
  const server = new Server(
17
18
  {
@@ -33,6 +34,10 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
33
34
  // 处理 Tool 调用
34
35
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
35
36
  const { name, arguments: args } = request.params;
37
+
38
+ // 初始化项目根目录(只执行一次)
39
+ await initProjectRoot(server);
40
+
36
41
  return handleToolCall(name, args as Record<string, unknown>);
37
42
  });
38
43
 
@@ -14,7 +14,7 @@ const PROJECT_TYPE_TO_MTA_PLATFORMS: Record<string, MtaPlatform[]> = {
14
14
  android: ["Android"],
15
15
  web: ["Web"],
16
16
  h5: ["H5"],
17
- flutter: ["iOS", "Android"],
17
+ harmony: ["鸿蒙"],
18
18
  unknown: ["iOS", "Android"],
19
19
  };
20
20