@icebreakers/monorepo 3.2.12 → 3.2.14

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.
@@ -7,16 +7,12 @@ var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
8
  var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
9
9
  var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
12
- key = keys[i];
13
- if (!__hasOwnProp.call(to, key) && key !== except) {
14
- __defProp$1(to, key, {
15
- get: ((k) => from[k]).bind(null, key),
16
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
- });
18
- }
19
- }
10
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
11
+ key = keys[i];
12
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp$1(to, key, {
13
+ get: ((k) => from[k]).bind(null, key),
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ });
20
16
  }
21
17
  return to;
22
18
  };
@@ -24,7 +20,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
20
  value: mod,
25
21
  enumerable: true
26
22
  }) : target, mod));
27
-
28
23
  //#endregion
29
24
  let git_url_parse = require("git-url-parse");
30
25
  git_url_parse = __toESM(git_url_parse);
@@ -60,7 +55,6 @@ let klaw = require("klaw");
60
55
  klaw = __toESM(klaw);
61
56
  let node_buffer = require("node:buffer");
62
57
  let semver = require("semver");
63
-
64
58
  //#region ../../node_modules/.pnpm/get-value@4.0.1/node_modules/get-value/dist/index.mjs
65
59
  var __defProp = Object.defineProperty;
66
60
  var __name = (target, value) => __defProp(target, "name", {
@@ -127,7 +121,6 @@ var index_default = /* @__PURE__ */ __name((target, path, options = {}) => {
127
121
  * Copyright (c) 2014-present, Jon Schlinkert.
128
122
  * Released under the MIT License.
129
123
  */
130
-
131
124
  //#endregion
132
125
  //#region src/core/git.ts
133
126
  /**
@@ -195,7 +188,6 @@ var GitClient = class {
195
188
  }
196
189
  }
197
190
  };
198
-
199
191
  //#endregion
200
192
  //#region ../../node_modules/.pnpm/defu@6.1.4/node_modules/defu/dist/defu.mjs
201
193
  function isPlainObject$1(value) {
@@ -224,19 +216,18 @@ function createDefu(merger) {
224
216
  return (...arguments_) => arguments_.reduce((p, c) => _defu(p, c, "", merger), {});
225
217
  }
226
218
  const defu = createDefu();
227
- const defuFn = createDefu((object, key, currentValue) => {
219
+ createDefu((object, key, currentValue) => {
228
220
  if (object[key] !== void 0 && typeof currentValue === "function") {
229
221
  object[key] = currentValue(object[key]);
230
222
  return true;
231
223
  }
232
224
  });
233
- const defuArrayFn = createDefu((object, key, currentValue) => {
225
+ createDefu((object, key, currentValue) => {
234
226
  if (Array.isArray(object[key]) && typeof currentValue === "function") {
235
227
  object[key] = currentValue(object[key]);
236
228
  return true;
237
229
  }
238
230
  });
239
-
240
231
  //#endregion
241
232
  //#region src/core/workspace.ts
242
233
  /**
@@ -275,14 +266,12 @@ async function getWorkspaceData(cwd, options) {
275
266
  packages: await getWorkspacePackages(workspaceDir, options)
276
267
  };
277
268
  }
278
-
279
269
  //#endregion
280
270
  //#region src/core/logger.ts
281
271
  /**
282
272
  * 统一的日志实例,便于在命令行中输出带有前缀和颜色的消息。
283
273
  */
284
274
  const logger = (0, consola.createConsola)();
285
-
286
275
  //#endregion
287
276
  //#region src/commands/ai.ts
288
277
  const agenticSections = [
@@ -313,7 +302,7 @@ function createTimestampFolderName(date = /* @__PURE__ */ new Date()) {
313
302
  async function generateAgenticTemplate(options = {}) {
314
303
  const cwd = options.cwd ?? node_process.default.cwd();
315
304
  const format = options.format ?? "md";
316
- const baseDir = options.baseDir ?? defaultAgenticBaseDir;
305
+ const baseDir = options.baseDir ?? "agentic/prompts";
317
306
  if (format !== "md" && format !== "json") throw new Error(`不支持的模板格式:${format}`);
318
307
  const template = format === "md" ? renderMarkdownTemplate() : renderJsonTemplate();
319
308
  const ext = format === "json" ? "json" : "md";
@@ -353,7 +342,6 @@ async function generateAgenticTemplates(tasks, defaults = {}) {
353
342
  }
354
343
  return results;
355
344
  }
356
-
357
345
  //#endregion
358
346
  //#region ../../node_modules/.pnpm/is-primitive@3.0.1/node_modules/is-primitive/index.js
359
347
  /*!
@@ -368,7 +356,6 @@ var require_is_primitive = /* @__PURE__ */ __commonJSMin(((exports, module) => {
368
356
  return typeof val !== "function";
369
357
  };
370
358
  }));
371
-
372
359
  //#endregion
373
360
  //#region ../../node_modules/.pnpm/isobject@3.0.1/node_modules/isobject/index.js
374
361
  /*!
@@ -382,7 +369,6 @@ var require_isobject = /* @__PURE__ */ __commonJSMin(((exports, module) => {
382
369
  return val != null && typeof val === "object" && Array.isArray(val) === false;
383
370
  };
384
371
  }));
385
-
386
372
  //#endregion
387
373
  //#region ../../node_modules/.pnpm/is-plain-object@2.0.4/node_modules/is-plain-object/index.js
388
374
  /*!
@@ -407,7 +393,6 @@ var require_is_plain_object = /* @__PURE__ */ __commonJSMin(((exports, module) =
407
393
  return true;
408
394
  };
409
395
  }));
410
-
411
396
  //#endregion
412
397
  //#region ../../node_modules/.pnpm/set-value@4.1.0/node_modules/set-value/index.js
413
398
  /*!
@@ -521,7 +506,6 @@ var require_set_value = /* @__PURE__ */ __commonJSMin(((exports, module) => {
521
506
  };
522
507
  module.exports = setValue;
523
508
  }));
524
-
525
509
  //#endregion
526
510
  //#region src/core/config.ts
527
511
  /**
@@ -566,12 +550,10 @@ async function loadMonorepoConfig(cwd) {
566
550
  async function resolveCommandConfig(name, cwd) {
567
551
  return ((await loadMonorepoConfig(cwd)).commands ?? {})[name] ?? {};
568
552
  }
569
-
570
553
  //#endregion
571
554
  //#region package.json
572
555
  var name = "@icebreakers/monorepo";
573
- var version = "3.2.12";
574
-
556
+ var version = "3.2.14";
575
557
  //#endregion
576
558
  //#region src/constants.ts
577
559
  /**
@@ -586,7 +568,6 @@ const packageDir = node_path.dirname(packageJsonPath);
586
568
  * monorepo 根目录,方便需要跳出当前包的逻辑(例如定位工作区文件)。
587
569
  */
588
570
  const rootDir = node_path.resolve(packageDir, "..", "..");
589
-
590
571
  //#endregion
591
572
  //#region src/commands/skills.ts
592
573
  const skillName = "icebreakers-monorepo-cli";
@@ -600,7 +581,7 @@ function getSkillTargetPaths(homeDir = node_os.default.homedir()) {
600
581
  }
601
582
  function normalizeTargets(values) {
602
583
  if (!values?.length) return;
603
- return Array.from(new Set(values));
584
+ return [...new Set(values)];
604
585
  }
605
586
  async function syncSkills(options = {}) {
606
587
  const cwd = options.cwd ?? node_process.default.cwd();
@@ -632,7 +613,6 @@ async function syncSkills(options = {}) {
632
613
  }
633
614
  return results;
634
615
  }
635
-
636
616
  //#endregion
637
617
  //#region src/commands/clean.ts
638
618
  var import_set_value = /* @__PURE__ */ __toESM(require_set_value(), 1);
@@ -677,13 +657,13 @@ async function cleanProjects(cwd, overrides) {
677
657
  const qoderDir = pathe.default.resolve(workspaceDir, ".qoder");
678
658
  const docsPlansDir = pathe.default.resolve(workspaceDir, "docs/plans");
679
659
  const skillTargets = Object.values(getSkillTargetPaths());
680
- const candidates = Array.from(new Set([
660
+ const candidates = [...new Set([
681
661
  ...cleanDirs.filter(Boolean),
682
662
  readmeZh,
683
663
  qoderDir,
684
664
  docsPlansDir,
685
665
  ...skillTargets
686
- ]));
666
+ ])];
687
667
  await Promise.all(candidates.map(async (dir) => {
688
668
  if (await fs_extra.default.pathExists(dir)) await fs_extra.default.remove(dir);
689
669
  }));
@@ -692,7 +672,6 @@ async function cleanProjects(cwd, overrides) {
692
672
  (0, import_set_value.default)(pkgJson, "devDependencies.@icebreakers/monorepo", cleanConfig?.pinnedVersion ?? "latest", { preservePaths: false });
693
673
  await fs_extra.default.outputJson(name, pkgJson, { spaces: 2 });
694
674
  }
695
-
696
675
  //#endregion
697
676
  //#region src/commands/create.ts
698
677
  /**
@@ -819,10 +798,10 @@ async function createNewProject(options) {
819
798
  const renameJson = options?.renameJson ?? createConfig?.renameJson ?? false;
820
799
  const rawName = options?.name ?? createConfig?.name;
821
800
  const name = typeof rawName === "string" ? rawName.trim() : void 0;
822
- const requestedTemplate = options?.type ?? createConfig?.type ?? createConfig?.defaultTemplate ?? defaultTemplate;
801
+ const requestedTemplate = options?.type ?? createConfig?.type ?? createConfig?.defaultTemplate ?? "unbuild";
823
802
  const templateDefinitions = getTemplateMap(createConfig?.templateMap);
824
803
  const templatesRoot = createConfig?.templatesDir ? pathe.default.resolve(cwd, createConfig.templatesDir) : _icebreakers_monorepo_templates.templatesDir;
825
- const fallbackTemplate = createConfig?.defaultTemplate ?? defaultTemplate;
804
+ const fallbackTemplate = createConfig?.defaultTemplate ?? "unbuild";
826
805
  const bundlerName = typeof requestedTemplate === "string" && templateDefinitions[requestedTemplate] ? requestedTemplate : fallbackTemplate;
827
806
  const templateDefinition = templateDefinitions[bundlerName];
828
807
  if (!templateDefinition) throw new Error(`未找到名为 ${bundlerName} 的模板,请检查 monorepo.config.ts`);
@@ -847,7 +826,6 @@ async function createNewProject(options) {
847
826
  }
848
827
  logger.success(`${picocolors.default.bgGreenBright(picocolors.default.white(`[${bundlerName}]`))} ${targetName} 项目创建成功!`);
849
828
  }
850
-
851
829
  //#endregion
852
830
  //#region src/core/context.ts
853
831
  /**
@@ -868,7 +846,6 @@ async function createContext(cwd) {
868
846
  config: await loadMonorepoConfig(workspaceDir)
869
847
  };
870
848
  }
871
-
872
849
  //#endregion
873
850
  //#region src/commands/init/setChangeset.ts
874
851
  /**
@@ -887,7 +864,6 @@ async function setChangeset_default(ctx) {
887
864
  }
888
865
  }
889
866
  }
890
-
891
867
  //#endregion
892
868
  //#region src/utils/fs.ts
893
869
  /**
@@ -900,7 +876,6 @@ function isIgnorableFsError(error) {
900
876
  const code = error.code;
901
877
  return code === "ENOENT" || code === "EBUSY" || code === "EEXIST";
902
878
  }
903
-
904
879
  //#endregion
905
880
  //#region src/utils/github.ts
906
881
  /**
@@ -937,7 +912,6 @@ function updateIssueTemplateConfig(source, repoName) {
937
912
  if (!changed) return source;
938
913
  return doc.toString();
939
914
  }
940
-
941
915
  //#endregion
942
916
  //#region src/utils/hash.ts
943
917
  /**
@@ -959,14 +933,15 @@ function isFileChanged(src, dest) {
959
933
  return false;
960
934
  }
961
935
  }
962
-
963
936
  //#endregion
964
937
  //#region src/utils/regexp.ts
938
+ const regexpSpecialCharacterPattern = /[|\\{}()[\]^$+*?.]/g;
939
+ const hyphenPattern = /-/g;
965
940
  /**
966
941
  * 逃逸正则表达式中所有特殊字符,避免被当做模式解析。
967
942
  */
968
943
  function escapeStringRegexp(str) {
969
- return str.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d");
944
+ return str.replace(regexpSpecialCharacterPattern, "\\$&").replace(hyphenPattern, "\\x2d");
970
945
  }
971
946
  /**
972
947
  * 判断字符串是否命中任意一个正则,用于过滤要同步的资产文件。
@@ -975,7 +950,6 @@ function isMatch(str, arr) {
975
950
  for (const reg of arr) if (reg.test(str)) return true;
976
951
  return false;
977
952
  }
978
-
979
953
  //#endregion
980
954
  //#region src/commands/init/setIssueTemplateConfig.ts
981
955
  /**
@@ -990,7 +964,6 @@ async function setIssueTemplateConfig_default(ctx) {
990
964
  const next = updateIssueTemplateConfig(source, repoName);
991
965
  if (next !== source) await fs_extra.default.writeFile(configPath, next, "utf8");
992
966
  }
993
-
994
967
  //#endregion
995
968
  //#region src/commands/init/setPkgJson.ts
996
969
  /**
@@ -1015,7 +988,6 @@ async function setPkgJson_default(ctx) {
1015
988
  if (await fs_extra.default.readFile(pkg.pkgJsonPath, "utf8") !== nextContent) await fs_extra.default.writeFile(pkg.pkgJsonPath, nextContent, "utf8");
1016
989
  }));
1017
990
  }
1018
-
1019
991
  //#endregion
1020
992
  //#region src/commands/init/setReadme.ts
1021
993
  async function getRows(ctx) {
@@ -1023,7 +995,7 @@ async function getRows(ctx) {
1023
995
  const rows = [];
1024
996
  if (gitUrl) rows.push(`# ${gitUrl.name}\n`);
1025
997
  rows.push("## Packages\n");
1026
- const sortedPackages = [...packages].sort((a, b) => {
998
+ const sortedPackages = packages.toSorted((a, b) => {
1027
999
  const left = a.manifest.name ?? "";
1028
1000
  const right = b.manifest.name ?? "";
1029
1001
  return left.localeCompare(right);
@@ -1062,7 +1034,6 @@ async function setReadme_default(ctx) {
1062
1034
  const rows = await getRows(ctx);
1063
1035
  await fs_extra.default.writeFile(pathe.default.resolve(ctx.cwd, "README.md"), `${rows.join("\n")}\n`);
1064
1036
  }
1065
-
1066
1037
  //#endregion
1067
1038
  //#region src/commands/init/index.ts
1068
1039
  /**
@@ -1076,7 +1047,6 @@ async function init(cwd) {
1076
1047
  if (!initConfig.skipReadme) await setReadme_default(ctx);
1077
1048
  if (!initConfig.skipIssueTemplateConfig) await setIssueTemplateConfig_default(ctx);
1078
1049
  }
1079
-
1080
1050
  //#endregion
1081
1051
  //#region src/commands/mirror/sources.ts
1082
1052
  const chinaMirrorsEnvs = {
@@ -1107,7 +1077,6 @@ const chinaMirrorsEnvs = {
1107
1077
  npm_config_sharp_libvips_binary_host: "https://cdn.npmmirror.com/binaries/sharp-libvips",
1108
1078
  npm_config_robotjs_binary_host: "https://cdn.npmmirror.com/binaries/robotjs"
1109
1079
  };
1110
-
1111
1080
  //#endregion
1112
1081
  //#region src/commands/mirror/utils.ts
1113
1082
  /**
@@ -1122,7 +1091,6 @@ function setMirror(obj, envs = chinaMirrorsEnvs) {
1122
1091
  const prefix = "terminal.integrated.env";
1123
1092
  if (typeof obj === "object" && obj) for (const platform of platforms) (0, import_set_value.default)(obj, [prefix, platform].join(".").replaceAll(".", "\\."), envs);
1124
1093
  }
1125
-
1126
1094
  //#endregion
1127
1095
  //#region src/commands/mirror/binaryMirror.ts
1128
1096
  /**
@@ -1140,7 +1108,6 @@ async function setVscodeBinaryMirror(cwd) {
1140
1108
  json && typeof json === "object" && setMirror(json, env);
1141
1109
  await fs_extra.default.writeFile(targetJsonPath, `${(0, comment_json.stringify)(json, void 0, 2)}\n`, "utf8");
1142
1110
  }
1143
-
1144
1111
  //#endregion
1145
1112
  //#region src/commands/sync.ts
1146
1113
  function renderCommand(template, pkgName) {
@@ -1158,9 +1125,9 @@ async function syncNpmMirror(cwd, options) {
1158
1125
  logger.info(`[当前工作区Repo]:\n${packages.map((x) => `- ${picocolors.default.green(x.manifest.name)} : ${pathe.default.relative(workspaceDir, x.rootDir)}`).join("\n")}\n`);
1159
1126
  const set = new Set(packages.map((x) => x.manifest.name));
1160
1127
  if (packageFilter?.length) {
1161
- for (const name of Array.from(set)) if (!name || !packageFilter.includes(name)) set.delete(name);
1128
+ for (const name of [...set]) if (!name || !packageFilter.includes(name)) set.delete(name);
1162
1129
  }
1163
- logger.info(`[即将同步的包]:\n${Array.from(set).map((x) => `- ${picocolors.default.green(x ?? "")}`).join("\n")}\n`);
1130
+ logger.info(`[即将同步的包]:\n${Array.from(set, (x) => `- ${picocolors.default.green(x ?? "")}`).join("\n")}\n`);
1164
1131
  const queue = new p_queue.default({ concurrency: configConcurrency ?? Math.max(node_os.default.cpus().length, 1) });
1165
1132
  const template = configCommand ?? "cnpm sync {name}";
1166
1133
  const tasks = [];
@@ -1172,17 +1139,18 @@ async function syncNpmMirror(cwd, options) {
1172
1139
  }
1173
1140
  await Promise.all(tasks);
1174
1141
  }
1175
-
1176
1142
  //#endregion
1177
1143
  //#region src/commands/upgrade/agents.ts
1178
- function normalizeEol(input) {
1179
- return input.replace(/\r\n/g, "\n");
1144
+ const crlfPattern$1 = /\r\n/g;
1145
+ const h2HeadingPrefixPattern = /^##\s+/;
1146
+ function normalizeEol$1(input) {
1147
+ return input.replace(crlfPattern$1, "\n");
1180
1148
  }
1181
1149
  function normalizeComparableContent(input) {
1182
- return normalizeEol(input).trimEnd();
1150
+ return normalizeEol$1(input).trimEnd();
1183
1151
  }
1184
1152
  function normalizeHeadingKey(line) {
1185
- return line.replace(/^##\s+/, "").trim().toLowerCase();
1153
+ return line.replace(h2HeadingPrefixPattern, "").trim().toLowerCase();
1186
1154
  }
1187
1155
  function trimEdgeEmptyLines(lines) {
1188
1156
  const next = [...lines];
@@ -1199,12 +1167,12 @@ function trimEdgeEmptyLines(lines) {
1199
1167
  return next;
1200
1168
  }
1201
1169
  function parseMarkdownByH2(content) {
1202
- const lines = normalizeEol(content).split("\n");
1170
+ const lines = normalizeEol$1(content).split("\n");
1203
1171
  const preamble = [];
1204
1172
  const sections = [];
1205
1173
  let current;
1206
1174
  for (const line of lines) {
1207
- if (/^##\s+/.test(line)) {
1175
+ if (h2HeadingPrefixPattern.test(line)) {
1208
1176
  if (current) sections.push(current);
1209
1177
  current = {
1210
1178
  key: normalizeHeadingKey(line),
@@ -1225,8 +1193,8 @@ function parseMarkdownByH2(content) {
1225
1193
  };
1226
1194
  }
1227
1195
  function mergePlainText(source, target) {
1228
- const sourceLines = trimEdgeEmptyLines(normalizeEol(source).split("\n"));
1229
- const result = trimEdgeEmptyLines(normalizeEol(target).split("\n"));
1196
+ const sourceLines = trimEdgeEmptyLines(normalizeEol$1(source).split("\n"));
1197
+ const result = trimEdgeEmptyLines(normalizeEol$1(target).split("\n"));
1230
1198
  const seen = new Set(result);
1231
1199
  for (const line of sourceLines) {
1232
1200
  if (!line.trim()) continue;
@@ -1270,7 +1238,6 @@ function mergeAgentsMarkdown(source, target) {
1270
1238
  function isAgentsMarkdownEquivalent(left, right) {
1271
1239
  return normalizeComparableContent(left) === normalizeComparableContent(right);
1272
1240
  }
1273
-
1274
1241
  //#endregion
1275
1242
  //#region src/commands/upgrade/overwrite.ts
1276
1243
  function asBuffer(data) {
@@ -1335,21 +1302,13 @@ async function flushPendingOverwrites(pending) {
1335
1302
  const selectedSet = new Set(selected);
1336
1303
  for (const item of pending) if (selectedSet.has(item.targetPath)) await item.action();
1337
1304
  }
1338
-
1339
- //#endregion
1340
- //#region src/commands/upgrade/scripts.ts
1341
- /**
1342
- * 升级时注入到 package.json 的脚本命令集合,保证常用脚本齐全。
1343
- */
1344
- const scripts = {
1305
+ const scriptsEntries = Object.entries({
1345
1306
  "script:init": "monorepo init",
1346
1307
  "script:sync": "monorepo sync",
1347
1308
  "script:clean": "monorepo clean",
1348
1309
  "script:mirror": "monorepo mirror",
1349
1310
  "commitlint": "commitlint --edit"
1350
- };
1351
- const scriptsEntries = Object.entries(scripts);
1352
-
1311
+ });
1353
1312
  //#endregion
1354
1313
  //#region src/commands/upgrade/pkg-json.ts
1355
1314
  const NON_OVERRIDABLE_PREFIXES = ["workspace:", "catalog:"];
@@ -1413,7 +1372,6 @@ function setPkgJson(sourcePkgJson, targetPkgJson, options) {
1413
1372
  targetPkgJson.scripts = scripts;
1414
1373
  }
1415
1374
  }
1416
-
1417
1375
  //#endregion
1418
1376
  //#region src/commands/upgrade/workspace.ts
1419
1377
  function isPlainObject(value) {
@@ -1469,9 +1427,38 @@ function mergeWorkspaceManifest(source, target) {
1469
1427
  }
1470
1428
  return result;
1471
1429
  }
1472
-
1473
1430
  //#endregion
1474
1431
  //#region src/commands/upgrade/index.ts
1432
+ const crlfPattern = /\r\n/g;
1433
+ function normalizeEol(input) {
1434
+ return input.replace(crlfPattern, "\n");
1435
+ }
1436
+ function normalizeGitignoreLine(line) {
1437
+ const trimmed = line.trim();
1438
+ if (!trimmed) return "";
1439
+ if (trimmed.startsWith("#")) return `#${trimmed.slice(1).trim()}`;
1440
+ return trimmed;
1441
+ }
1442
+ function isTextEquivalent(left, right) {
1443
+ return normalizeEol(left).trimEnd() === normalizeEol(right).trimEnd();
1444
+ }
1445
+ function mergeGitignore(source, target) {
1446
+ const sourceLines = normalizeEol(source).split("\n");
1447
+ const result = normalizeEol(target).split("\n");
1448
+ const seen = new Set(result.map((line) => normalizeGitignoreLine(line)).filter(Boolean));
1449
+ for (const line of sourceLines) {
1450
+ const normalized = normalizeGitignoreLine(line);
1451
+ if (!normalized || seen.has(normalized)) continue;
1452
+ seen.add(normalized);
1453
+ result.push(line);
1454
+ }
1455
+ while (result.length) {
1456
+ const last = result.at(-1);
1457
+ if (last === void 0 || last.trim().length > 0) break;
1458
+ result.pop();
1459
+ }
1460
+ return `${result.join("\n")}\n`;
1461
+ }
1475
1462
  /**
1476
1463
  * 将 assets 目录的模版文件同步到工程中,实现一键升级脚手架能力。
1477
1464
  */
@@ -1493,7 +1480,7 @@ async function upgradeMonorepo(opts) {
1493
1480
  const baseTargets = (0, _icebreakers_monorepo_templates.getAssetTargets)(useCoreAssets);
1494
1481
  const configTargets = upgradeConfig?.targets ?? [];
1495
1482
  const mergeTargets = upgradeConfig?.mergeTargets;
1496
- let targets = configTargets.length ? mergeTargets === false ? [...configTargets] : Array.from(new Set([...baseTargets, ...configTargets])) : baseTargets;
1483
+ let targets = configTargets.length ? mergeTargets === false ? [...configTargets] : [...new Set([...baseTargets, ...configTargets])] : baseTargets;
1497
1484
  if (merged.interactive) targets = await (0, _icebreakers_monorepo_templates.checkbox)({
1498
1485
  message: "选择你需要的文件",
1499
1486
  choices: targets.map((x) => {
@@ -1562,6 +1549,25 @@ async function upgradeMonorepo(opts) {
1562
1549
  });
1563
1550
  continue;
1564
1551
  }
1552
+ if (relPath === ".gitignore") {
1553
+ const source = await fs_extra.default.readFile(file.path, "utf8");
1554
+ const exists = await fs_extra.default.pathExists(targetPath);
1555
+ const target = exists ? await fs_extra.default.readFile(targetPath, "utf8") : "";
1556
+ const data = exists ? mergeGitignore(source, target) : source;
1557
+ if (exists && isTextEquivalent(target, data)) continue;
1558
+ const intent = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(data));
1559
+ const action = async () => {
1560
+ await fs_extra.default.outputFile(targetPath, data, "utf8");
1561
+ logger.success(targetPath);
1562
+ };
1563
+ await scheduleOverwrite(intent, {
1564
+ relPath,
1565
+ targetPath,
1566
+ action,
1567
+ pending: pendingOverwrites
1568
+ });
1569
+ continue;
1570
+ }
1565
1571
  if (relPath === "AGENTS.md") {
1566
1572
  const source = await fs_extra.default.readFile(file.path, "utf8");
1567
1573
  const exists = await fs_extra.default.pathExists(targetPath);
@@ -1650,227 +1656,226 @@ async function upgradeMonorepo(opts) {
1650
1656
  }
1651
1657
  await flushPendingOverwrites(pendingOverwrites);
1652
1658
  }
1653
-
1654
1659
  //#endregion
1655
- Object.defineProperty(exports, 'GitClient', {
1656
- enumerable: true,
1657
- get: function () {
1658
- return GitClient;
1659
- }
1660
+ Object.defineProperty(exports, "GitClient", {
1661
+ enumerable: true,
1662
+ get: function() {
1663
+ return GitClient;
1664
+ }
1660
1665
  });
1661
- Object.defineProperty(exports, '__toESM', {
1662
- enumerable: true,
1663
- get: function () {
1664
- return __toESM;
1665
- }
1666
+ Object.defineProperty(exports, "__toESM", {
1667
+ enumerable: true,
1668
+ get: function() {
1669
+ return __toESM;
1670
+ }
1666
1671
  });
1667
- Object.defineProperty(exports, 'cleanProjects', {
1668
- enumerable: true,
1669
- get: function () {
1670
- return cleanProjects;
1671
- }
1672
+ Object.defineProperty(exports, "cleanProjects", {
1673
+ enumerable: true,
1674
+ get: function() {
1675
+ return cleanProjects;
1676
+ }
1672
1677
  });
1673
- Object.defineProperty(exports, 'createContext', {
1674
- enumerable: true,
1675
- get: function () {
1676
- return createContext;
1677
- }
1678
+ Object.defineProperty(exports, "createContext", {
1679
+ enumerable: true,
1680
+ get: function() {
1681
+ return createContext;
1682
+ }
1678
1683
  });
1679
- Object.defineProperty(exports, 'createNewProject', {
1680
- enumerable: true,
1681
- get: function () {
1682
- return createNewProject;
1683
- }
1684
+ Object.defineProperty(exports, "createNewProject", {
1685
+ enumerable: true,
1686
+ get: function() {
1687
+ return createNewProject;
1688
+ }
1684
1689
  });
1685
- Object.defineProperty(exports, 'createTimestampFolderName', {
1686
- enumerable: true,
1687
- get: function () {
1688
- return createTimestampFolderName;
1689
- }
1690
+ Object.defineProperty(exports, "createTimestampFolderName", {
1691
+ enumerable: true,
1692
+ get: function() {
1693
+ return createTimestampFolderName;
1694
+ }
1690
1695
  });
1691
- Object.defineProperty(exports, 'defaultAgenticBaseDir', {
1692
- enumerable: true,
1693
- get: function () {
1694
- return defaultAgenticBaseDir;
1695
- }
1696
+ Object.defineProperty(exports, "defaultAgenticBaseDir", {
1697
+ enumerable: true,
1698
+ get: function() {
1699
+ return defaultAgenticBaseDir;
1700
+ }
1696
1701
  });
1697
- Object.defineProperty(exports, 'defaultTemplate', {
1698
- enumerable: true,
1699
- get: function () {
1700
- return defaultTemplate;
1701
- }
1702
+ Object.defineProperty(exports, "defaultTemplate", {
1703
+ enumerable: true,
1704
+ get: function() {
1705
+ return defaultTemplate;
1706
+ }
1702
1707
  });
1703
- Object.defineProperty(exports, 'defineMonorepoConfig', {
1704
- enumerable: true,
1705
- get: function () {
1706
- return defineMonorepoConfig;
1707
- }
1708
+ Object.defineProperty(exports, "defineMonorepoConfig", {
1709
+ enumerable: true,
1710
+ get: function() {
1711
+ return defineMonorepoConfig;
1712
+ }
1708
1713
  });
1709
- Object.defineProperty(exports, 'escapeStringRegexp', {
1710
- enumerable: true,
1711
- get: function () {
1712
- return escapeStringRegexp;
1713
- }
1714
+ Object.defineProperty(exports, "escapeStringRegexp", {
1715
+ enumerable: true,
1716
+ get: function() {
1717
+ return escapeStringRegexp;
1718
+ }
1714
1719
  });
1715
- Object.defineProperty(exports, 'generateAgenticTemplate', {
1716
- enumerable: true,
1717
- get: function () {
1718
- return generateAgenticTemplate;
1719
- }
1720
+ Object.defineProperty(exports, "generateAgenticTemplate", {
1721
+ enumerable: true,
1722
+ get: function() {
1723
+ return generateAgenticTemplate;
1724
+ }
1720
1725
  });
1721
- Object.defineProperty(exports, 'generateAgenticTemplates', {
1722
- enumerable: true,
1723
- get: function () {
1724
- return generateAgenticTemplates;
1725
- }
1726
+ Object.defineProperty(exports, "generateAgenticTemplates", {
1727
+ enumerable: true,
1728
+ get: function() {
1729
+ return generateAgenticTemplates;
1730
+ }
1726
1731
  });
1727
- Object.defineProperty(exports, 'getCreateChoices', {
1728
- enumerable: true,
1729
- get: function () {
1730
- return getCreateChoices;
1731
- }
1732
+ Object.defineProperty(exports, "getCreateChoices", {
1733
+ enumerable: true,
1734
+ get: function() {
1735
+ return getCreateChoices;
1736
+ }
1732
1737
  });
1733
- Object.defineProperty(exports, 'getFileHash', {
1734
- enumerable: true,
1735
- get: function () {
1736
- return getFileHash;
1737
- }
1738
+ Object.defineProperty(exports, "getFileHash", {
1739
+ enumerable: true,
1740
+ get: function() {
1741
+ return getFileHash;
1742
+ }
1738
1743
  });
1739
- Object.defineProperty(exports, 'getSkillTargetPaths', {
1740
- enumerable: true,
1741
- get: function () {
1742
- return getSkillTargetPaths;
1743
- }
1744
+ Object.defineProperty(exports, "getSkillTargetPaths", {
1745
+ enumerable: true,
1746
+ get: function() {
1747
+ return getSkillTargetPaths;
1748
+ }
1744
1749
  });
1745
- Object.defineProperty(exports, 'getTemplateMap', {
1746
- enumerable: true,
1747
- get: function () {
1748
- return getTemplateMap;
1749
- }
1750
+ Object.defineProperty(exports, "getTemplateMap", {
1751
+ enumerable: true,
1752
+ get: function() {
1753
+ return getTemplateMap;
1754
+ }
1755
+ });
1756
+ Object.defineProperty(exports, "getWorkspaceData", {
1757
+ enumerable: true,
1758
+ get: function() {
1759
+ return getWorkspaceData;
1760
+ }
1750
1761
  });
1751
- Object.defineProperty(exports, 'getWorkspaceData', {
1752
- enumerable: true,
1753
- get: function () {
1754
- return getWorkspaceData;
1755
- }
1762
+ Object.defineProperty(exports, "getWorkspacePackages", {
1763
+ enumerable: true,
1764
+ get: function() {
1765
+ return getWorkspacePackages;
1766
+ }
1756
1767
  });
1757
- Object.defineProperty(exports, 'getWorkspacePackages', {
1758
- enumerable: true,
1759
- get: function () {
1760
- return getWorkspacePackages;
1761
- }
1768
+ Object.defineProperty(exports, "init", {
1769
+ enumerable: true,
1770
+ get: function() {
1771
+ return init;
1772
+ }
1762
1773
  });
1763
- Object.defineProperty(exports, 'init', {
1764
- enumerable: true,
1765
- get: function () {
1766
- return init;
1767
- }
1774
+ Object.defineProperty(exports, "isFileChanged", {
1775
+ enumerable: true,
1776
+ get: function() {
1777
+ return isFileChanged;
1778
+ }
1768
1779
  });
1769
- Object.defineProperty(exports, 'isFileChanged', {
1770
- enumerable: true,
1771
- get: function () {
1772
- return isFileChanged;
1773
- }
1780
+ Object.defineProperty(exports, "isIgnorableFsError", {
1781
+ enumerable: true,
1782
+ get: function() {
1783
+ return isIgnorableFsError;
1784
+ }
1774
1785
  });
1775
- Object.defineProperty(exports, 'isIgnorableFsError', {
1776
- enumerable: true,
1777
- get: function () {
1778
- return isIgnorableFsError;
1779
- }
1786
+ Object.defineProperty(exports, "isMatch", {
1787
+ enumerable: true,
1788
+ get: function() {
1789
+ return isMatch;
1790
+ }
1780
1791
  });
1781
- Object.defineProperty(exports, 'isMatch', {
1782
- enumerable: true,
1783
- get: function () {
1784
- return isMatch;
1785
- }
1792
+ Object.defineProperty(exports, "loadAgenticTasks", {
1793
+ enumerable: true,
1794
+ get: function() {
1795
+ return loadAgenticTasks;
1796
+ }
1786
1797
  });
1787
- Object.defineProperty(exports, 'loadAgenticTasks', {
1788
- enumerable: true,
1789
- get: function () {
1790
- return loadAgenticTasks;
1791
- }
1798
+ Object.defineProperty(exports, "loadMonorepoConfig", {
1799
+ enumerable: true,
1800
+ get: function() {
1801
+ return loadMonorepoConfig;
1802
+ }
1792
1803
  });
1793
- Object.defineProperty(exports, 'loadMonorepoConfig', {
1794
- enumerable: true,
1795
- get: function () {
1796
- return loadMonorepoConfig;
1797
- }
1804
+ Object.defineProperty(exports, "logger", {
1805
+ enumerable: true,
1806
+ get: function() {
1807
+ return logger;
1808
+ }
1798
1809
  });
1799
- Object.defineProperty(exports, 'logger', {
1800
- enumerable: true,
1801
- get: function () {
1802
- return logger;
1803
- }
1810
+ Object.defineProperty(exports, "name", {
1811
+ enumerable: true,
1812
+ get: function() {
1813
+ return name;
1814
+ }
1804
1815
  });
1805
- Object.defineProperty(exports, 'name', {
1806
- enumerable: true,
1807
- get: function () {
1808
- return name;
1809
- }
1816
+ Object.defineProperty(exports, "packageDir", {
1817
+ enumerable: true,
1818
+ get: function() {
1819
+ return packageDir;
1820
+ }
1810
1821
  });
1811
- Object.defineProperty(exports, 'packageDir', {
1812
- enumerable: true,
1813
- get: function () {
1814
- return packageDir;
1815
- }
1822
+ Object.defineProperty(exports, "resolveCommandConfig", {
1823
+ enumerable: true,
1824
+ get: function() {
1825
+ return resolveCommandConfig;
1826
+ }
1816
1827
  });
1817
- Object.defineProperty(exports, 'resolveCommandConfig', {
1818
- enumerable: true,
1819
- get: function () {
1820
- return resolveCommandConfig;
1821
- }
1828
+ Object.defineProperty(exports, "rootDir", {
1829
+ enumerable: true,
1830
+ get: function() {
1831
+ return rootDir;
1832
+ }
1822
1833
  });
1823
- Object.defineProperty(exports, 'rootDir', {
1824
- enumerable: true,
1825
- get: function () {
1826
- return rootDir;
1827
- }
1834
+ Object.defineProperty(exports, "setVscodeBinaryMirror", {
1835
+ enumerable: true,
1836
+ get: function() {
1837
+ return setVscodeBinaryMirror;
1838
+ }
1828
1839
  });
1829
- Object.defineProperty(exports, 'setVscodeBinaryMirror', {
1830
- enumerable: true,
1831
- get: function () {
1832
- return setVscodeBinaryMirror;
1833
- }
1840
+ Object.defineProperty(exports, "skillTargets", {
1841
+ enumerable: true,
1842
+ get: function() {
1843
+ return skillTargets;
1844
+ }
1834
1845
  });
1835
- Object.defineProperty(exports, 'skillTargets', {
1836
- enumerable: true,
1837
- get: function () {
1838
- return skillTargets;
1839
- }
1846
+ Object.defineProperty(exports, "syncNpmMirror", {
1847
+ enumerable: true,
1848
+ get: function() {
1849
+ return syncNpmMirror;
1850
+ }
1840
1851
  });
1841
- Object.defineProperty(exports, 'syncNpmMirror', {
1842
- enumerable: true,
1843
- get: function () {
1844
- return syncNpmMirror;
1845
- }
1852
+ Object.defineProperty(exports, "syncSkills", {
1853
+ enumerable: true,
1854
+ get: function() {
1855
+ return syncSkills;
1856
+ }
1846
1857
  });
1847
- Object.defineProperty(exports, 'syncSkills', {
1848
- enumerable: true,
1849
- get: function () {
1850
- return syncSkills;
1851
- }
1858
+ Object.defineProperty(exports, "templateMap", {
1859
+ enumerable: true,
1860
+ get: function() {
1861
+ return templateMap;
1862
+ }
1852
1863
  });
1853
- Object.defineProperty(exports, 'templateMap', {
1854
- enumerable: true,
1855
- get: function () {
1856
- return templateMap;
1857
- }
1864
+ Object.defineProperty(exports, "updateIssueTemplateConfig", {
1865
+ enumerable: true,
1866
+ get: function() {
1867
+ return updateIssueTemplateConfig;
1868
+ }
1858
1869
  });
1859
- Object.defineProperty(exports, 'updateIssueTemplateConfig', {
1860
- enumerable: true,
1861
- get: function () {
1862
- return updateIssueTemplateConfig;
1863
- }
1870
+ Object.defineProperty(exports, "upgradeMonorepo", {
1871
+ enumerable: true,
1872
+ get: function() {
1873
+ return upgradeMonorepo;
1874
+ }
1864
1875
  });
1865
- Object.defineProperty(exports, 'upgradeMonorepo', {
1866
- enumerable: true,
1867
- get: function () {
1868
- return upgradeMonorepo;
1869
- }
1876
+ Object.defineProperty(exports, "version", {
1877
+ enumerable: true,
1878
+ get: function() {
1879
+ return version;
1880
+ }
1870
1881
  });
1871
- Object.defineProperty(exports, 'version', {
1872
- enumerable: true,
1873
- get: function () {
1874
- return version;
1875
- }
1876
- });