bmall-mcp 1.2.2 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -21
- package/dist/index.js.map +1 -1
- package/dist/tools/mta/read/index.js +1 -1
- package/dist/tools/mta/read/index.js.map +1 -1
- package/dist/tools/rules/pull.d.ts.map +1 -1
- package/dist/tools/rules/pull.js +7 -2
- package/dist/tools/rules/pull.js.map +1 -1
- package/dist/tools/rules/push.d.ts.map +1 -1
- package/dist/tools/rules/push.js +17 -33
- package/dist/tools/rules/push.js.map +1 -1
- package/dist/tools/rules/utils.d.ts +2 -13
- package/dist/tools/rules/utils.d.ts.map +1 -1
- package/dist/tools/rules/utils.js +15 -194
- package/dist/tools/rules/utils.js.map +1 -1
- package/dist/utils/file.d.ts +13 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +44 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/git.d.ts +28 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +111 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/ide.d.ts.map +1 -1
- package/dist/utils/ide.js +4 -1
- package/dist/utils/ide.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/project.d.ts +20 -1
- package/dist/utils/project.d.ts.map +1 -1
- package/dist/utils/project.js +233 -29
- package/dist/utils/project.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +7 -21
- package/src/tools/mta/read/index.ts +1 -1
- package/src/tools/rules/pull.ts +8 -2
- package/src/tools/rules/push.ts +25 -39
- package/src/tools/rules/utils.ts +27 -219
- package/src/utils/file.ts +54 -0
- package/src/utils/git.ts +133 -0
- package/src/utils/ide.ts +5 -1
- package/src/utils/index.ts +2 -1
- package/src/utils/project.ts +251 -29
package/README.md
CHANGED
|
@@ -134,12 +134,30 @@ src/
|
|
|
134
134
|
│ └── push.ts # 上传 Rules
|
|
135
135
|
└── utils/
|
|
136
136
|
├── index.ts # 统一导出 + 常量
|
|
137
|
-
├── project.ts #
|
|
138
|
-
|
|
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.4 (2026-01-15)
|
|
146
|
+
- ✅ 启动时输出版本号
|
|
147
|
+
|
|
148
|
+
### v1.2.3 (2026-01-15)
|
|
149
|
+
- ✅ 修复 Cursor/JoyCode 中项目目录获取问题,使用 MCP roots API
|
|
150
|
+
- ✅ 修复 MTA 文档输出路径问题
|
|
151
|
+
- ✅ 移除 Flutter 相关冗余代码
|
|
152
|
+
- ✅ 提取通用方法到 utils(detectProjectName、copyMarkdownFiles)
|
|
153
|
+
- ✅ 新增 `src/utils/file.ts` 文件操作工具
|
|
154
|
+
- ✅ 新增 `src/utils/git.ts` Git 操作工具,提取通用 Git 方法
|
|
155
|
+
- ✅ 优化项目名称检测,根据项目类型选择检测方式(iOS/Android/Harmony/Web)
|
|
156
|
+
- ✅ Rules 操作增加详细日志输出
|
|
157
|
+
|
|
158
|
+
### v1.2.2 (2026-01-15)
|
|
159
|
+
- ✅ 添加 roots/list 测试代码
|
|
160
|
+
|
|
143
161
|
### v1.2.1 (2026-01-14)
|
|
144
162
|
- ✅ 修复 IDE Rules 路径计算问题,改为运行时动态获取
|
|
145
163
|
- ✅ 添加调试日志,输出当前工作目录
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG"}
|
package/dist/index.js
CHANGED
|
@@ -7,14 +7,12 @@ 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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return projectRoot;
|
|
14
|
-
}
|
|
10
|
+
import { initProjectRoot } from "./utils/project.js";
|
|
11
|
+
// 版本号
|
|
12
|
+
const VERSION = "1.2.4";
|
|
15
13
|
const server = new Server({
|
|
16
14
|
name: "bmall-mcp",
|
|
17
|
-
version:
|
|
15
|
+
version: VERSION,
|
|
18
16
|
}, {
|
|
19
17
|
capabilities: {
|
|
20
18
|
tools: {},
|
|
@@ -27,27 +25,15 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
|
27
25
|
// 处理 Tool 调用
|
|
28
26
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
29
27
|
const { name, arguments: args } = request.params;
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
const rootsResult = await server.listRoots();
|
|
33
|
-
console.error("[bmall-mcp] roots/list 结果:", JSON.stringify(rootsResult));
|
|
34
|
-
if (rootsResult?.roots?.length > 0) {
|
|
35
|
-
const uri = rootsResult.roots[0].uri;
|
|
36
|
-
// 转换 file:// URI 为路径
|
|
37
|
-
projectRoot = uri.replace(/^file:\/\//, "");
|
|
38
|
-
console.error("[bmall-mcp] 项目根目录:", projectRoot);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
catch (e) {
|
|
42
|
-
console.error("[bmall-mcp] roots/list 失败:", e);
|
|
43
|
-
}
|
|
28
|
+
// 初始化项目根目录(只执行一次)
|
|
29
|
+
await initProjectRoot(server);
|
|
44
30
|
return handleToolCall(name, args);
|
|
45
31
|
});
|
|
46
32
|
// 启动服务器
|
|
47
33
|
async function main() {
|
|
48
34
|
const transport = new StdioServerTransport();
|
|
49
35
|
await server.connect(transport);
|
|
50
|
-
console.error(
|
|
36
|
+
console.error(`[bmall-mcp] v${VERSION} Server running on stdio`);
|
|
51
37
|
}
|
|
52
38
|
main().catch((error) => {
|
|
53
39
|
console.error("[bmall-mcp] Fatal error:", error);
|
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;
|
|
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;AACN,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,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,gBAAgB,OAAO,0BAA0B,CAAC,CAAC;AACnE,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 +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,
|
|
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,
|
|
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"}
|
package/dist/tools/rules/pull.js
CHANGED
|
@@ -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(`
|
|
27
|
+
log(`目标目录: ${targetRulesTypeDir}`);
|
|
28
|
+
log(`从 Git 拉取 Rules...`);
|
|
25
29
|
const rulesSourceDir = await fetchRulesFromGit(projectType);
|
|
26
|
-
log(
|
|
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;
|
|
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":"
|
|
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"}
|
package/dist/tools/rules/push.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import * as fs from "fs";
|
|
2
2
|
import * as path from "path";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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(
|
|
32
|
-
log(
|
|
33
|
-
log(`本地 Rules 类型目录: ${localRulesTypeDir}`);
|
|
34
|
+
log(`本地 Rules 目录: ${localRulesTypeDir}`);
|
|
35
|
+
log(`初始化 Git 缓存仓库...`);
|
|
34
36
|
// 初始化缓存仓库
|
|
35
|
-
|
|
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
|
-
|
|
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
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
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":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/tools/rules/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
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
|
|
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 {
|
|
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
|
|
16
|
-
log(
|
|
13
|
+
const projectDir = getProjectRoot();
|
|
14
|
+
log(`项目目录: ${projectDir}`);
|
|
17
15
|
const paths = {
|
|
18
|
-
kiro: path.join(
|
|
19
|
-
cursor: path.join(
|
|
20
|
-
windsurf: path.join(
|
|
21
|
-
joycode: path.join(
|
|
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
|
-
|
|
71
|
-
|
|
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
|
-
|
|
76
|
+
initGitRepo(RULES_CACHE_DIR, GIT_REPO);
|
|
207
77
|
// 设置 sparse-checkout
|
|
208
|
-
setupSparseCheckout(rulesDir);
|
|
209
|
-
//
|
|
210
|
-
|
|
211
|
-
|
|
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":"AAAA
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/tools/rules/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|