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
package/README.md CHANGED
@@ -134,12 +134,27 @@ src/
134
134
  │ └── push.ts # 上传 Rules
135
135
  └── utils/
136
136
  ├── index.ts # 统一导出 + 常量
137
- ├── project.ts # 项目类型检测
138
- └── ide.ts # IDE 检测
137
+ ├── project.ts # 项目相关(类型检测、项目名、根目录)
138
+ ├── ide.ts # IDE 相关(检测、路径)
139
+ ├── file.ts # 文件操作(复制 Markdown)
140
+ └── git.ts # Git 操作(初始化、分支、提交)
139
141
  ```
140
142
 
141
143
  ## Changelog
142
144
 
145
+ ### v1.2.3 (2026-01-15)
146
+ - ✅ 修复 Cursor/JoyCode 中项目目录获取问题,使用 MCP roots API
147
+ - ✅ 修复 MTA 文档输出路径问题
148
+ - ✅ 移除 Flutter 相关冗余代码
149
+ - ✅ 提取通用方法到 utils(detectProjectName、copyMarkdownFiles)
150
+ - ✅ 新增 `src/utils/file.ts` 文件操作工具
151
+ - ✅ 新增 `src/utils/git.ts` Git 操作工具,提取通用 Git 方法
152
+ - ✅ 优化项目名称检测,根据项目类型选择检测方式(iOS/Android/Harmony/Web)
153
+ - ✅ Rules 操作增加详细日志输出
154
+
155
+ ### v1.2.2 (2026-01-15)
156
+ - ✅ 添加 roots/list 测试代码
157
+
143
158
  ### v1.2.1 (2026-01-14)
144
159
  - ✅ 修复 IDE Rules 路径计算问题,改为运行时动态获取
145
160
  - ✅ 添加调试日志,输出当前工作目录
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
7
7
  import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
8
8
  import { toolDefinitions } from "./server/tools.js";
9
9
  import { handleToolCall } from "./server/handlers.js";
10
+ import { initProjectRoot } from "./utils/project.js";
10
11
  const server = new Server({
11
12
  name: "bmall-mcp",
12
13
  version: "1.0.0",
@@ -22,6 +23,8 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
22
23
  // 处理 Tool 调用
23
24
  server.setRequestHandler(CallToolRequestSchema, async (request) => {
24
25
  const { name, arguments: args } = request.params;
26
+ // 初始化项目根目录(只执行一次)
27
+ await initProjectRoot(server);
25
28
  return handleToolCall(name, args);
26
29
  });
27
30
  // 启动服务器
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,WAAW;AACX,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,eAAe;CACvB,CAAC,CAAC,CAAC;AAEJ,aAAa;AACb,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,cAAc,CAAC,IAAI,EAAE,IAA+B,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,QAAQ;AACR,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,WAAW;AACX,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,eAAe;CACvB,CAAC,CAAC,CAAC;AAEJ,aAAa;AACb,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,kBAAkB;IAClB,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAE9B,OAAO,cAAc,CAAC,IAAI,EAAE,IAA+B,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,QAAQ;AACR,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -9,7 +9,7 @@ const PROJECT_TYPE_TO_MTA_PLATFORMS = {
9
9
  android: ["Android"],
10
10
  web: ["Web"],
11
11
  h5: ["H5"],
12
- flutter: ["iOS", "Android"],
12
+ harmony: ["鸿蒙"],
13
13
  unknown: ["iOS", "Android"],
14
14
  };
15
15
  // 所有 MTA 端类型(用于排除)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tools/mta/read/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAKlG,0BAA0B;AAC1B,MAAM,6BAA6B,GAAkC;IACnE,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,EAAE,EAAE,CAAC,IAAI,CAAC;IACV,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;IAC3B,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;CAC5B,CAAC;AAEF,mBAAmB;AACnB,MAAM,iBAAiB,GAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAE/E,MAAM,UAAU,gBAAgB,CAAC,cAAsB,EAAE,YAAqB;IAC5E,gBAAgB;IAChB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9C,oBAAoB;IACpB,IAAI,SAAwB,CAAC;IAC7B,IAAI,YAAY,IAAI,iBAAiB,CAAC,QAAQ,CAAC,YAA2B,CAAC,EAAE,CAAC;QAC5E,SAAS,GAAG,CAAC,YAA2B,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACxC,SAAS,GAAG,6BAA6B,CAAC,WAAW,CAAC,IAAI,6BAA6B,CAAC,SAAS,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzC,WAAW;IACX,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEvD,gBAAgB;IAChB,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAE1C,OAAO;;;eAGM,cAAc;cACf,aAAa;aACd,YAAY,QAAQ,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAkC7B,aAAa;;;;;;;;;;;;;;;IAehC,SAAS,QAAQ,aAAa,OAAO,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/tools/mta/read/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAKlG,0BAA0B;AAC1B,MAAM,6BAA6B,GAAkC;IACnE,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,EAAE,EAAE,CAAC,IAAI,CAAC;IACV,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;CAC5B,CAAC;AAEF,mBAAmB;AACnB,MAAM,iBAAiB,GAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AAE/E,MAAM,UAAU,gBAAgB,CAAC,cAAsB,EAAE,YAAqB;IAC5E,gBAAgB;IAChB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9C,oBAAoB;IACpB,IAAI,SAAwB,CAAC;IAC7B,IAAI,YAAY,IAAI,iBAAiB,CAAC,QAAQ,CAAC,YAA2B,CAAC,EAAE,CAAC;QAC5E,SAAS,GAAG,CAAC,YAA2B,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACxC,SAAS,GAAG,6BAA6B,CAAC,WAAW,CAAC,IAAI,6BAA6B,CAAC,SAAS,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzC,WAAW;IACX,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEvD,gBAAgB;IAChB,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAE1C,OAAO;;;eAGM,cAAc;cACf,aAAa;aACd,YAAY,QAAQ,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAkC7B,aAAa;;;;;;;;;;;;;;;IAehC,SAAS,QAAQ,aAAa,OAAO,CAAC;AAC1C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/tools/rules/pull.ts"],"names":[],"mappings":"AAYA,wBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CjF"}
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../../src/tools/rules/pull.ts"],"names":[],"mappings":"AAYA,wBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmDjF"}
@@ -4,28 +4,33 @@ import { log } from "../../utils/index.js";
4
4
  import { RULES_CACHE_DIR, validateAndGetRulesType, fetchRulesFromGit, copyMarkdownFiles, getGitRulesDir, getIDERulesPath, } from "./utils.js";
5
5
  export async function pullRules(ide, rulesType) {
6
6
  try {
7
+ log(`开始下载 Rules...`);
7
8
  // 验证并获取 Rules 类型
8
9
  const typeResult = validateAndGetRulesType(rulesType);
9
10
  if (typeResult.error) {
10
11
  return typeResult.error;
11
12
  }
12
13
  const projectType = typeResult.type;
14
+ log(`Rules 类型: ${projectType}`);
13
15
  // 验证并获取 IDE
14
16
  const targetIDE = ide || "kiro";
15
17
  const targetPath = getIDERulesPath(targetIDE);
16
18
  if (!targetPath) {
17
19
  return `❌ 不支持的 IDE: ${targetIDE}\n支持的 IDE: kiro, cursor, windsurf`;
18
20
  }
21
+ log(`目标 IDE: ${targetIDE}`);
19
22
  // 确保父目录存在
20
23
  fs.mkdirSync(targetPath, { recursive: true });
21
24
  // 目标路径包含项目类型文件夹(如 .kiro/steering/bmall/iOS/)
22
25
  const rulesTypeDir = getGitRulesDir(projectType);
23
26
  const targetRulesTypeDir = path.join(targetPath, rulesTypeDir);
24
- log(`Fetching rules from git...`);
27
+ log(`目标目录: ${targetRulesTypeDir}`);
28
+ log(`从 Git 拉取 Rules...`);
25
29
  const rulesSourceDir = await fetchRulesFromGit(projectType);
26
- log(`Copying files to ${targetRulesTypeDir}...`);
30
+ log(`复制文件到目标目录...`);
27
31
  // 直接覆盖,不备份(Git 本身有版本管理)
28
32
  const result = copyMarkdownFiles(rulesSourceDir, targetRulesTypeDir, { backup: false });
33
+ log(`复制文件数: ${result.count}`);
29
34
  if (result.count === 0) {
30
35
  return `⚠️ 未找到任何 Markdown 文件\n源目录: ${rulesSourceDir}`;
31
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/tools/rules/pull.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAY,EAAE,SAAkB;IAC9D,IAAI,CAAC;QACH,iBAAiB;QACjB,MAAM,UAAU,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC;QACD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC;QAEpC,YAAY;QACZ,MAAM,SAAS,GAAG,GAAG,IAAI,MAAM,CAAC;QAChC,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,eAAe,SAAS,mCAAmC,CAAC;QACrE,CAAC;QAED,UAAU;QACV,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,6CAA6C;QAC7C,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAE/D,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAClC,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAE5D,GAAG,CAAC,oBAAoB,kBAAkB,KAAK,CAAC,CAAC;QACjD,wBAAwB;QACxB,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAExF,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,8BAA8B,cAAc,EAAE,CAAC;QACxD,CAAC;QAED,OAAO;YACC,WAAW;OAChB,SAAS;QACR,kBAAkB;SACjB,MAAM,CAAC,KAAK;QACb,eAAe,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,WAAW,QAAQ,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/tools/rules/pull.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAY,EAAE,SAAkB;IAC9D,IAAI,CAAC;QACH,GAAG,CAAC,eAAe,CAAC,CAAC;QAErB,iBAAiB;QACjB,MAAM,UAAU,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC;QACD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC;QACpC,GAAG,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;QAEhC,YAAY;QACZ,MAAM,SAAS,GAAG,GAAG,IAAI,MAAM,CAAC;QAChC,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,eAAe,SAAS,mCAAmC,CAAC;QACrE,CAAC;QACD,GAAG,CAAC,WAAW,SAAS,EAAE,CAAC,CAAC;QAE5B,UAAU;QACV,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,6CAA6C;QAC7C,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC/D,GAAG,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAAC;QAEnC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACzB,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAE5D,GAAG,CAAC,cAAc,CAAC,CAAC;QACpB,wBAAwB;QACxB,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAE9B,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,8BAA8B,cAAc,EAAE,CAAC;QACxD,CAAC;QAED,OAAO;YACC,WAAW;OAChB,SAAS;QACR,kBAAkB;SACjB,MAAM,CAAC,KAAK;QACb,eAAe,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,WAAW,QAAQ,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/tools/rules/push.ts"],"names":[],"mappings":"AAiBA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2GlG"}
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/tools/rules/push.ts"],"names":[],"mappings":"AAqBA,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyFlG"}
@@ -1,16 +1,17 @@
1
1
  import * as fs from "fs";
2
2
  import * as path from "path";
3
- import { execSync } from "child_process";
4
- import { log } from "../../utils/index.js";
5
- import { GIT_BRANCH, RULES_CACHE_DIR, getIDERulesPath, validateAndGetRulesType, detectProjectName, getGitRulesDir, copyMarkdownFiles, initializeGitCache, setupSparseCheckout, checkoutOrCreateBranch, } from "./utils.js";
3
+ import { log, initGitRepo, setupSparseCheckout, fetchBranch, checkoutOrCreateBranch, commitAndPush, } from "../../utils/index.js";
4
+ import { GIT_REPO, GIT_BRANCH, RULES_CACHE_DIR, getIDERulesPath, validateAndGetRulesType, detectProjectName, getGitRulesDir, copyMarkdownFiles, } from "./utils.js";
6
5
  export async function pushRules(ide, message, rulesType) {
7
6
  try {
7
+ log(`开始上传 Rules...`);
8
8
  // 验证并获取 Rules 类型
9
9
  const typeResult = validateAndGetRulesType(rulesType);
10
10
  if (typeResult.error) {
11
11
  return typeResult.error;
12
12
  }
13
13
  const projectType = typeResult.type;
14
+ log(`Rules 类型: ${projectType}`);
14
15
  // 验证并获取 IDE
15
16
  const localRulesPath = getIDERulesPath(ide);
16
17
  if (!localRulesPath) {
@@ -19,6 +20,8 @@ export async function pushRules(ide, message, rulesType) {
19
20
  // 检测项目名称,用于创建项目级分支
20
21
  const projectName = detectProjectName();
21
22
  const projectBranch = `project/${projectName}`;
23
+ log(`项目名称: ${projectName}`);
24
+ log(`项目分支: ${projectBranch}`);
22
25
  // 验证本地 Rules 目录
23
26
  if (!fs.existsSync(localRulesPath)) {
24
27
  return `❌ 本地 Rules 目录不存在: ${localRulesPath}`;
@@ -28,53 +31,34 @@ export async function pushRules(ide, message, rulesType) {
28
31
  if (!fs.existsSync(localRulesTypeDir)) {
29
32
  return `❌ 本地 Rules 类型目录不存在: ${localRulesTypeDir}\n请先运行 pull_rules 下载 Rules`;
30
33
  }
31
- log(`项目名称: ${projectName}`);
32
- log(`项目分支: ${projectBranch}`);
33
- log(`本地 Rules 类型目录: ${localRulesTypeDir}`);
34
+ log(`本地 Rules 目录: ${localRulesTypeDir}`);
35
+ log(`初始化 Git 缓存仓库...`);
34
36
  // 初始化缓存仓库
35
- initializeGitCache();
37
+ initGitRepo(RULES_CACHE_DIR, GIT_REPO);
36
38
  // 设置 sparse-checkout
37
39
  const rulesDir = getGitRulesDir(projectType);
38
- setupSparseCheckout(rulesDir);
40
+ setupSparseCheckout(RULES_CACHE_DIR, [rulesDir]);
39
41
  // 拉取最新代码
40
- log(`拉取最新代码...`);
41
- execSync(`git -C ${RULES_CACHE_DIR} fetch origin`, {
42
- stdio: "inherit",
43
- });
42
+ fetchBranch(RULES_CACHE_DIR, GIT_BRANCH);
44
43
  // 检出或创建项目分支
45
- checkoutOrCreateBranch(projectBranch);
44
+ checkoutOrCreateBranch(RULES_CACHE_DIR, projectBranch, GIT_BRANCH);
46
45
  // 复制本地修改到缓存仓库
47
46
  const cacheRulesTypeDir = path.join(RULES_CACHE_DIR, rulesDir);
48
47
  log(`复制本地修改到缓存仓库...`);
49
48
  // 清空缓存目录中的旧文件
50
49
  if (fs.existsSync(cacheRulesTypeDir)) {
50
+ log(`清空缓存目录: ${cacheRulesTypeDir}`);
51
51
  fs.rmSync(cacheRulesTypeDir, { recursive: true, force: true });
52
52
  }
53
53
  // 复制时不需要备份(覆盖缓存目录)
54
54
  const result = copyMarkdownFiles(localRulesTypeDir, cacheRulesTypeDir, { backup: false });
55
55
  log(`复制文件数: ${result.count}`);
56
- // 检查是否有修改
57
- log(`检查修改...`);
58
- const status = execSync(`git -C ${RULES_CACHE_DIR} status --porcelain`, {
59
- encoding: "utf-8",
60
- });
61
- if (!status.trim()) {
56
+ // 提交并推送
57
+ const commitMessage = message || `chore(${projectType}): 更新 Rules`;
58
+ const hasChanges = commitAndPush(RULES_CACHE_DIR, commitMessage, projectBranch);
59
+ if (!hasChanges) {
62
60
  return `⚠️ 没有检测到修改`;
63
61
  }
64
- // 添加修改
65
- log(`添加修改...`);
66
- execSync(`git -C ${RULES_CACHE_DIR} add -A`, { stdio: "inherit" });
67
- // 提交修改
68
- const commitMessage = message || `chore(${projectType}): 更新 Rules`;
69
- log(`提交修改: ${commitMessage}`);
70
- execSync(`git -C ${RULES_CACHE_DIR} commit -m "${commitMessage}"`, {
71
- stdio: "inherit",
72
- });
73
- // 推送到远程
74
- log(`推送到远程分支 ${projectBranch}...`);
75
- execSync(`git -C ${RULES_CACHE_DIR} push -u origin ${projectBranch}`, {
76
- stdio: "inherit",
77
- });
78
62
  return `✅ 上传完成!
79
63
  项目名称: ${projectName}
80
64
  Rules 类型: ${projectType}
@@ -1 +1 @@
1
- {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/tools/rules/push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/tools/rules/push.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,GAAG,EACH,WAAW,EACX,mBAAmB,EACnB,WAAW,EACX,sBAAsB,EACtB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,QAAQ,EACR,UAAU,EACV,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,OAAgB,EAAE,SAAkB;IAC/E,IAAI,CAAC;QACH,GAAG,CAAC,eAAe,CAAC,CAAC;QAErB,iBAAiB;QACjB,MAAM,UAAU,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;QACtD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC;QACD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC;QACpC,GAAG,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;QAEhC,YAAY;QACZ,MAAM,cAAc,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,eAAe,GAAG,EAAE,CAAC;QAC9B,CAAC;QAED,mBAAmB;QACnB,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACxC,MAAM,aAAa,GAAG,WAAW,WAAW,EAAE,CAAC;QAC/C,GAAG,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;QAC5B,GAAG,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;QAE9B,gBAAgB;QAChB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,OAAO,qBAAqB,cAAc,EAAE,CAAC;QAC/C,CAAC;QAED,oDAAoD;QACpD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QAEjF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACtC,OAAO,uBAAuB,iBAAiB,4BAA4B,CAAC;QAC9E,CAAC;QACD,GAAG,CAAC,gBAAgB,iBAAiB,EAAE,CAAC,CAAC;QAEzC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACvB,UAAU;QACV,WAAW,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAEvC,qBAAqB;QACrB,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAC7C,mBAAmB,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEjD,SAAS;QACT,WAAW,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QAEzC,YAAY;QACZ,sBAAsB,CAAC,eAAe,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;QAEnE,cAAc;QACd,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;QAE/D,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAEtB,cAAc;QACd,IAAI,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,WAAW,iBAAiB,EAAE,CAAC,CAAC;YACpC,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,mBAAmB;QACnB,MAAM,MAAM,GAAG,iBAAiB,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAE1F,GAAG,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAE9B,QAAQ;QACR,MAAM,aAAa,GAAG,OAAO,IAAI,SAAS,WAAW,aAAa,CAAC;QACnE,MAAM,UAAU,GAAG,aAAa,CAAC,eAAe,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QAEhF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,OAAO;QACH,WAAW;YACP,WAAW;QACf,aAAa;QACb,aAAa;SACZ,MAAM,CAAC,KAAK;;6BAEQ,UAAU;4BACX,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,WAAW,QAAQ,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC"}
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * Rules 专用工具函数
3
- * Git 操作、文件复制等
4
3
  */
5
- import { ProjectType } from "../../utils/index.js";
4
+ import { ProjectType, detectProjectName, copyMarkdownFiles } from "../../utils/index.js";
6
5
  export declare const GIT_REPO = "git@coding.jd.com:retail-jdb-app-ai/RulesManager.git";
7
6
  export declare const GIT_BRANCH = "develop";
8
7
  export declare const RULES_CACHE_DIR: string;
@@ -13,16 +12,6 @@ export declare function validateAndGetRulesType(rulesType?: string): {
13
12
  error?: string;
14
13
  };
15
14
  export declare function getGitRulesDir(projectType: ProjectType): string;
16
- export declare function detectProjectName(): string;
17
- export declare function sanitizeProjectName(name: string): string;
18
- export declare function initializeGitCache(): void;
19
- export declare function setupSparseCheckout(rulesDir: string): void;
20
- export declare function checkoutOrCreateBranch(branchName: string, baseBranch?: string): void;
15
+ export { detectProjectName, copyMarkdownFiles };
21
16
  export declare function fetchRulesFromGit(projectType: ProjectType): Promise<string>;
22
- export declare function copyMarkdownFiles(src: string, dest: string, options?: {
23
- backup?: boolean;
24
- }): {
25
- count: number;
26
- backups: string[];
27
- };
28
17
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tools/rules/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAa,WAAW,EAA0B,MAAM,sBAAsB,CAAC;AAGtF,eAAO,MAAM,QAAQ,yDAAyD,CAAC;AAC/E,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,eAAe,QAA4C,CAAC;AAGzE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAiB7D;AAED,wBAAgB,uBAAuB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAejG;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAW/D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAwD1C;AAGD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxD;AAGD,wBAAgB,kBAAkB,IAAI,IAAI,CAyBzC;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAY1D;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,GAAE,MAAmB,GAAG,IAAI,CAmChG;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCjF;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAqB,GAC/C;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAsCtC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tools/rules/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAEL,WAAW,EAIX,iBAAiB,EACjB,iBAAiB,EAKlB,MAAM,sBAAsB,CAAC;AAG9B,eAAO,MAAM,QAAQ,yDAAyD,CAAC;AAC/E,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,eAAe,QAA4C,CAAC;AAGzE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAiB7D;AAED,wBAAgB,uBAAuB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAejG;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAW/D;AAGD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;AAEhD,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBjF"}
@@ -1,24 +1,22 @@
1
1
  /**
2
2
  * Rules 专用工具函数
3
- * Git 操作、文件复制等
4
3
  */
5
4
  import * as fs from "fs";
6
5
  import * as path from "path";
7
- import { execSync } from "child_process";
8
- import { HOME, CWD, log, detectProjectType } from "../../utils/index.js";
6
+ import { HOME, log, detectProjectType, getProjectRoot, detectProjectName, copyMarkdownFiles, initGitRepo, setupSparseCheckout, fetchBranch, checkoutBranch, } from "../../utils/index.js";
9
7
  // Git 仓库配置
10
8
  export const GIT_REPO = "git@coding.jd.com:retail-jdb-app-ai/RulesManager.git";
11
9
  export const GIT_BRANCH = "develop";
12
10
  export const RULES_CACHE_DIR = path.join(HOME, ".bmall-mcp/rules-cache");
13
- // 获取 IDE 的 Rules 目录路径(运行时计算)
11
+ // 获取 IDE 的 Rules 目录路径
14
12
  export function getIDERulesPath(ide) {
15
- const cwd = process.cwd();
16
- log(`当前工作目录 (cwd): ${cwd}`);
13
+ const projectDir = getProjectRoot();
14
+ log(`项目目录: ${projectDir}`);
17
15
  const paths = {
18
- kiro: path.join(cwd, ".kiro/steering/bmall"),
19
- cursor: path.join(cwd, ".cursor/rules/bmall"),
20
- windsurf: path.join(cwd, ".windsurfrules"),
21
- joycode: path.join(cwd, ".joycode/rules/bmall"),
16
+ kiro: path.join(projectDir, ".kiro/steering/bmall"),
17
+ cursor: path.join(projectDir, ".cursor/rules/bmall"),
18
+ windsurf: path.join(projectDir, ".windsurfrules"),
19
+ joycode: path.join(projectDir, ".joycode/rules/bmall"),
22
20
  };
23
21
  const result = paths[ide] || paths.kiro;
24
22
  log(`IDE: ${ide}, Rules 路径: ${result}`);
@@ -67,163 +65,20 @@ export function getGitRulesDir(projectType) {
67
65
  };
68
66
  return dirMap[projectType];
69
67
  }
70
- export function detectProjectName() {
71
- // 优先级:package.json > Podfile > pubspec.yaml > 目录名
72
- // 1. 检查 package.json
73
- const packageJsonPath = path.join(CWD, "package.json");
74
- if (fs.existsSync(packageJsonPath)) {
75
- try {
76
- const content = fs.readFileSync(packageJsonPath, "utf-8");
77
- const json = JSON.parse(content);
78
- if (json.name) {
79
- const name = sanitizeProjectName(json.name);
80
- log(`从 package.json 检测到项目名: ${name}`);
81
- return name;
82
- }
83
- }
84
- catch (e) {
85
- // 继续
86
- }
87
- }
88
- // 2. 检查 Podfile
89
- const podfilePath = path.join(CWD, "Podfile");
90
- if (fs.existsSync(podfilePath)) {
91
- try {
92
- const content = fs.readFileSync(podfilePath, "utf-8");
93
- const match = content.match(/platform\s*:\s*:ios.*?target\s+['"](.*?)['"]/s);
94
- if (match && match[1]) {
95
- const name = sanitizeProjectName(match[1]);
96
- log(`从 Podfile 检测到项目名: ${name}`);
97
- return name;
98
- }
99
- }
100
- catch (e) {
101
- // 继续
102
- }
103
- }
104
- // 3. 检查 pubspec.yaml
105
- const pubspecPath = path.join(CWD, "pubspec.yaml");
106
- if (fs.existsSync(pubspecPath)) {
107
- try {
108
- const content = fs.readFileSync(pubspecPath, "utf-8");
109
- const match = content.match(/^name:\s*(.+?)$/m);
110
- if (match && match[1]) {
111
- const name = sanitizeProjectName(match[1]);
112
- log(`从 pubspec.yaml 检测到项目名: ${name}`);
113
- return name;
114
- }
115
- }
116
- catch (e) {
117
- // 继续
118
- }
119
- }
120
- // 4. 使用目录名
121
- const dirName = path.basename(CWD);
122
- const name = sanitizeProjectName(dirName);
123
- log(`使用目录名作为项目名: ${name}`);
124
- return name;
125
- }
126
- // 清理项目名,确保可以用作分支名
127
- export function sanitizeProjectName(name) {
128
- return name
129
- .toLowerCase()
130
- .replace(/[^a-z0-9-_]/g, "-") // 非法字符替换为 -
131
- .replace(/-+/g, "-") // 多个 - 合并
132
- .replace(/^-|-$/g, ""); // 去掉首尾 -
133
- }
134
- // Git 操作公共函数
135
- export function initializeGitCache() {
136
- const gitDir = path.join(RULES_CACHE_DIR, ".git");
137
- // 检查 .git 目录是否存在且有效
138
- if (fs.existsSync(gitDir)) {
139
- try {
140
- execSync(`git -C ${RULES_CACHE_DIR} status`, { stdio: "pipe" });
141
- return; // Git 仓库有效
142
- }
143
- catch (e) {
144
- log(`Git 仓库损坏,重新初始化...`);
145
- fs.rmSync(RULES_CACHE_DIR, { recursive: true, force: true });
146
- }
147
- }
148
- log(`创建缓存目录: ${RULES_CACHE_DIR}`);
149
- fs.mkdirSync(RULES_CACHE_DIR, { recursive: true });
150
- log(`初始化 Git 仓库...`);
151
- execSync(`git init ${RULES_CACHE_DIR}`, { stdio: "inherit" });
152
- log(`添加远程: ${GIT_REPO}`);
153
- execSync(`git -C ${RULES_CACHE_DIR} remote add origin ${GIT_REPO}`, { stdio: "inherit" });
154
- }
155
- export function setupSparseCheckout(rulesDir) {
156
- log(`配置 sparse-checkout...`);
157
- execSync(`git -C ${RULES_CACHE_DIR} config core.sparseCheckout true`, {
158
- stdio: "inherit",
159
- });
160
- const sparseCheckoutFile = path.join(RULES_CACHE_DIR, ".git/info/sparse-checkout");
161
- fs.writeFileSync(sparseCheckoutFile, `${rulesDir}/\n`);
162
- log(`设置只克隆 ${rulesDir} 目录...`);
163
- }
164
- export function checkoutOrCreateBranch(branchName, baseBranch = GIT_BRANCH) {
165
- log(`检出或创建分支 ${branchName}...`);
166
- // 先尝试检出远程分支(如果存在)
167
- try {
168
- execSync(`git -C ${RULES_CACHE_DIR} fetch origin ${branchName}`, {
169
- stdio: "pipe",
170
- });
171
- // 远程分支存在,检出并跟踪
172
- execSync(`git -C ${RULES_CACHE_DIR} checkout -B ${branchName} origin/${branchName}`, {
173
- stdio: "inherit",
174
- });
175
- log(`检出远程分支: ${branchName}`);
176
- return;
177
- }
178
- catch (e) {
179
- // 远程分支不存在,继续创建新分支
180
- }
181
- // 基于主分支创建新分支
182
- log(`远程分支不存在,基于 ${baseBranch} 创建...`);
183
- try {
184
- execSync(`git -C ${RULES_CACHE_DIR} checkout -B ${baseBranch} origin/${baseBranch}`, {
185
- stdio: "inherit",
186
- });
187
- execSync(`git -C ${RULES_CACHE_DIR} checkout -b ${branchName}`, {
188
- stdio: "inherit",
189
- });
190
- log(`创建新分支: ${branchName}`);
191
- }
192
- catch (e2) {
193
- log(`主分支不存在,创建孤立分支...`);
194
- execSync(`git -C ${RULES_CACHE_DIR} checkout --orphan ${branchName}`, {
195
- stdio: "inherit",
196
- });
197
- log(`创建孤立分支: ${branchName}`);
198
- }
199
- }
68
+ // 重新导出(供外部使用)
69
+ export { detectProjectName, copyMarkdownFiles };
200
70
  export async function fetchRulesFromGit(projectType) {
201
71
  const rulesDir = getGitRulesDir(projectType);
202
72
  log(`Git 仓库: ${GIT_REPO}`);
203
73
  log(`分支: ${GIT_BRANCH}`);
204
74
  log(`Rules 目录: ${rulesDir}`);
205
75
  // 初始化缓存仓库
206
- initializeGitCache();
76
+ initGitRepo(RULES_CACHE_DIR, GIT_REPO);
207
77
  // 设置 sparse-checkout
208
- setupSparseCheckout(rulesDir);
209
- // 拉取远程分支
210
- log(`拉取分支 ${GIT_BRANCH}...`);
211
- execSync(`git -C ${RULES_CACHE_DIR} fetch origin ${GIT_BRANCH}`, {
212
- stdio: "inherit",
213
- });
214
- // 检出到 origin/develop(避免本地分支不存在的问题)
215
- log(`检出 origin/${GIT_BRANCH}...`);
216
- try {
217
- execSync(`git -C ${RULES_CACHE_DIR} checkout -B ${GIT_BRANCH} origin/${GIT_BRANCH}`, {
218
- stdio: "inherit",
219
- });
220
- }
221
- catch (e) {
222
- // 如果失败,尝试直接检出 FETCH_HEAD
223
- execSync(`git -C ${RULES_CACHE_DIR} checkout FETCH_HEAD`, {
224
- stdio: "inherit",
225
- });
226
- }
78
+ setupSparseCheckout(RULES_CACHE_DIR, [rulesDir]);
79
+ // 拉取并检出分支
80
+ fetchBranch(RULES_CACHE_DIR, GIT_BRANCH);
81
+ checkoutBranch(RULES_CACHE_DIR, GIT_BRANCH);
227
82
  const projectRulesDir = path.join(RULES_CACHE_DIR, rulesDir);
228
83
  if (!fs.existsSync(projectRulesDir)) {
229
84
  throw new Error(`${rulesDir} 目录不存在: ${projectRulesDir}`);
@@ -231,38 +86,4 @@ export async function fetchRulesFromGit(projectType) {
231
86
  log(`${rulesDir} 目录: ${projectRulesDir}`);
232
87
  return projectRulesDir;
233
88
  }
234
- export function copyMarkdownFiles(src, dest, options = { backup: true }) {
235
- if (!fs.existsSync(dest)) {
236
- fs.mkdirSync(dest, { recursive: true });
237
- }
238
- let count = 0;
239
- const backups = [];
240
- const files = fs.readdirSync(src);
241
- for (const file of files) {
242
- if (file.startsWith(".") || file === "node_modules") {
243
- continue;
244
- }
245
- const srcPath = path.join(src, file);
246
- const destPath = path.join(dest, file);
247
- const stat = fs.statSync(srcPath);
248
- if (stat.isDirectory()) {
249
- const result = copyMarkdownFiles(srcPath, destPath, options);
250
- count += result.count;
251
- backups.push(...result.backups);
252
- }
253
- else if (file.endsWith(".md")) {
254
- // 如果目标文件已存在且需要备份
255
- if (options.backup && fs.existsSync(destPath)) {
256
- const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
257
- const backupPath = `${destPath}.backup.${timestamp}`;
258
- fs.copyFileSync(destPath, backupPath);
259
- backups.push(backupPath);
260
- log(`备份文件: ${destPath} → ${backupPath}`);
261
- }
262
- fs.copyFileSync(srcPath, destPath);
263
- count++;
264
- }
265
- }
266
- return { count, backups };
267
- }
268
89
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/tools/rules/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/tools/rules/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 文件操作工具
3
+ */
4
+ /**
5
+ * 复制 Markdown 文件(递归)
6
+ */
7
+ export declare function copyMarkdownFiles(src: string, dest: string, options?: {
8
+ backup?: boolean;
9
+ }): {
10
+ count: number;
11
+ backups: string[];
12
+ };
13
+ //# sourceMappingURL=file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAqB,GAC/C;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAsCtC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * 文件操作工具
3
+ */
4
+ import * as fs from "fs";
5
+ import * as path from "path";
6
+ import { log } from "./index.js";
7
+ /**
8
+ * 复制 Markdown 文件(递归)
9
+ */
10
+ export function copyMarkdownFiles(src, dest, options = { backup: true }) {
11
+ if (!fs.existsSync(dest)) {
12
+ fs.mkdirSync(dest, { recursive: true });
13
+ }
14
+ let count = 0;
15
+ const backups = [];
16
+ const files = fs.readdirSync(src);
17
+ for (const file of files) {
18
+ if (file.startsWith(".") || file === "node_modules") {
19
+ continue;
20
+ }
21
+ const srcPath = path.join(src, file);
22
+ const destPath = path.join(dest, file);
23
+ const stat = fs.statSync(srcPath);
24
+ if (stat.isDirectory()) {
25
+ const result = copyMarkdownFiles(srcPath, destPath, options);
26
+ count += result.count;
27
+ backups.push(...result.backups);
28
+ }
29
+ else if (file.endsWith(".md")) {
30
+ // 如果目标文件已存在且需要备份
31
+ if (options.backup && fs.existsSync(destPath)) {
32
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
33
+ const backupPath = `${destPath}.backup.${timestamp}`;
34
+ fs.copyFileSync(destPath, backupPath);
35
+ backups.push(backupPath);
36
+ log(`备份文件: ${destPath} → ${backupPath}`);
37
+ }
38
+ fs.copyFileSync(srcPath, destPath);
39
+ count++;
40
+ }
41
+ }
42
+ return { count, backups };
43
+ }
44
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,IAAY,EACZ,UAAgC,EAAE,MAAM,EAAE,IAAI,EAAE;IAEhD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAElC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC7D,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,iBAAiB;YACjB,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACjE,MAAM,UAAU,GAAG,GAAG,QAAQ,WAAW,SAAS,EAAE,CAAC;gBACrD,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACzB,GAAG,CAAC,SAAS,QAAQ,MAAM,UAAU,EAAE,CAAC,CAAC;YAC3C,CAAC;YAED,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACnC,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}