@icebreakers/monorepo 3.1.18 → 3.2.1

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 (193) hide show
  1. package/README.md +9 -0
  2. package/dist/cli.cjs +43 -27
  3. package/dist/cli.mjs +33 -15
  4. package/dist/index.cjs +25 -6
  5. package/dist/index.d.cts +56 -37
  6. package/dist/index.d.mts +56 -37
  7. package/dist/index.mjs +2 -2
  8. package/dist/{upgrade-DAoYVyhV.cjs → upgrade-CEd5cMQ-.cjs} +160 -192
  9. package/dist/{upgrade-BlCigUlp.mjs → upgrade-Zbej0CnL.mjs} +156 -175
  10. package/package.json +6 -11
  11. package/resources/skills/icebreakers-monorepo-cli/SKILL.md +43 -0
  12. package/resources/skills/icebreakers-monorepo-cli/references/commands.md +75 -0
  13. package/resources/skills/icebreakers-monorepo-cli/references/config.md +63 -0
  14. package/resources/skills/icebreakers-monorepo-cli/references/templates.md +21 -0
  15. package/assets/.changeset/config.json +0 -16
  16. package/assets/.dockerignore +0 -44
  17. package/assets/.editorconfig +0 -12
  18. package/assets/.gitattributes +0 -218
  19. package/assets/.github/FUNDING.yml +0 -4
  20. package/assets/.github/ISSUE_TEMPLATE/bug_report.yml +0 -71
  21. package/assets/.github/ISSUE_TEMPLATE/config.yml +0 -17
  22. package/assets/.github/workflows/ci.yml +0 -62
  23. package/assets/.github/workflows/release.yml +0 -57
  24. package/assets/.husky/commit-msg +0 -4
  25. package/assets/.husky/pre-commit +0 -4
  26. package/assets/.vscode/extensions.json +0 -6
  27. package/assets/.vscode/settings.json +0 -172
  28. package/assets/CODE_OF_CONDUCT.md +0 -128
  29. package/assets/CONTRIBUTING.md +0 -3
  30. package/assets/Dockerfile +0 -27
  31. package/assets/SECURITY.md +0 -21
  32. package/assets/commitlint.config.ts +0 -3
  33. package/assets/eslint.config.js +0 -7
  34. package/assets/gitignore +0 -38
  35. package/assets/lint-staged.config.js +0 -11
  36. package/assets/monorepo.config.ts +0 -22
  37. package/assets/netlify.toml +0 -14
  38. package/assets/package.json +0 -88
  39. package/assets/pnpm-workspace.yaml +0 -10
  40. package/assets/renovate.json +0 -28
  41. package/assets/stylelint.config.js +0 -3
  42. package/assets/tsconfig.json +0 -51
  43. package/assets/turbo.json +0 -74
  44. package/assets/vitest.config.ts +0 -123
  45. package/templates/apps/cli/bin/index.js +0 -2
  46. package/templates/apps/cli/dev/index.ts +0 -2
  47. package/templates/apps/cli/gitignore +0 -2
  48. package/templates/apps/cli/package.json +0 -35
  49. package/templates/apps/cli/src/cli.ts +0 -4
  50. package/templates/apps/cli/src/index.ts +0 -15
  51. package/templates/apps/cli/tsconfig.json +0 -7
  52. package/templates/apps/cli/tsup.config.ts +0 -13
  53. package/templates/apps/client/eslint.config.js +0 -12
  54. package/templates/apps/client/gitignore +0 -28
  55. package/templates/apps/client/index.html +0 -13
  56. package/templates/apps/client/package.json +0 -52
  57. package/templates/apps/client/public/vite.svg +0 -1
  58. package/templates/apps/client/src/App.vue +0 -11
  59. package/templates/apps/client/src/main.ts +0 -16
  60. package/templates/apps/client/src/pages/index.vue +0 -357
  61. package/templates/apps/client/src/query-keys.ts +0 -4
  62. package/templates/apps/client/src/router/index.ts +0 -13
  63. package/templates/apps/client/src/stores/i18n.ts +0 -24
  64. package/templates/apps/client/src/stores/index.ts +0 -15
  65. package/templates/apps/client/src/style.css +0 -1
  66. package/templates/apps/client/src/trpc/index.ts +0 -10
  67. package/templates/apps/client/src/vite-env.d.ts +0 -2
  68. package/templates/apps/client/tsconfig.app.json +0 -28
  69. package/templates/apps/client/tsconfig.json +0 -8
  70. package/templates/apps/client/tsconfig.node.json +0 -25
  71. package/templates/apps/client/tsconfig.worker.json +0 -11
  72. package/templates/apps/client/vite.config.ts +0 -57
  73. package/templates/apps/client/worker/app.ts +0 -24
  74. package/templates/apps/client/worker/config.ts +0 -1
  75. package/templates/apps/client/worker/fetch-entry.ts +0 -5
  76. package/templates/apps/client/worker/node-entry.ts +0 -13
  77. package/templates/apps/client/worker/trpc-router.ts +0 -24
  78. package/templates/apps/client/wrangler.jsonc +0 -24
  79. package/templates/apps/server/gitignore +0 -2
  80. package/templates/apps/server/package.json +0 -60
  81. package/templates/apps/server/src/app.ts +0 -191
  82. package/templates/apps/server/src/config.ts +0 -1
  83. package/templates/apps/server/src/fetch-entry.ts +0 -5
  84. package/templates/apps/server/src/node-entry.ts +0 -13
  85. package/templates/apps/server/test/index.test.ts +0 -14
  86. package/templates/apps/server/tsconfig.json +0 -24
  87. package/templates/apps/server/tsup.config.ts +0 -13
  88. package/templates/apps/server/vitest.config.ts +0 -15
  89. package/templates/apps/server/wrangler.jsonc +0 -18
  90. package/templates/apps/website/.vitepress/config.ts +0 -93
  91. package/templates/apps/website/.vitepress/theme/index.ts +0 -4
  92. package/templates/apps/website/.vitepress/theme/tailwind.css +0 -1
  93. package/templates/apps/website/gitignore +0 -1
  94. package/templates/apps/website/index.md +0 -127
  95. package/templates/apps/website/monorepo/index.md +0 -46
  96. package/templates/apps/website/monorepo/manage.md +0 -126
  97. package/templates/apps/website/monorepo/publish.md +0 -142
  98. package/templates/apps/website/package.json +0 -39
  99. package/templates/apps/website/public/logo.jpg +0 -0
  100. package/templates/apps/website/thinking.md +0 -88
  101. package/templates/apps/website/tools/changeset.md +0 -87
  102. package/templates/apps/website/tools/husky.md +0 -108
  103. package/templates/apps/website/tools/lint-staged.md +0 -79
  104. package/templates/apps/website/tools/pnpm.md +0 -100
  105. package/templates/apps/website/tools/renovate.md +0 -91
  106. package/templates/apps/website/tools/turborepo.md +0 -149
  107. package/templates/apps/website/why/assets/npm-dt.svg +0 -15
  108. package/templates/apps/website/why/assets/npm-ts.svg +0 -19
  109. package/templates/apps/website/why/examples/0.npm-basic-package/index.js +0 -10
  110. package/templates/apps/website/why/examples/0.npm-basic-package/package.json +0 -11
  111. package/templates/apps/website/why/examples/1.npm-basic-package/index.cjs +0 -12
  112. package/templates/apps/website/why/examples/1.npm-basic-package/index.d.ts +0 -1
  113. package/templates/apps/website/why/examples/1.npm-basic-package/index.js +0 -8
  114. package/templates/apps/website/why/examples/1.npm-basic-package/package.json +0 -19
  115. package/templates/apps/website/why/examples/2.npm-basic-package/README.md +0 -1
  116. package/templates/apps/website/why/examples/2.npm-basic-package/package-lock.json +0 -30
  117. package/templates/apps/website/why/examples/2.npm-basic-package/package.json +0 -35
  118. package/templates/apps/website/why/examples/2.npm-basic-package/rename-ext.js +0 -24
  119. package/templates/apps/website/why/examples/2.npm-basic-package/src/index.ts +0 -8
  120. package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.cjs.json +0 -8
  121. package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.esm.json +0 -7
  122. package/templates/apps/website/why/examples/2.npm-basic-package/tsconfig.json +0 -18
  123. package/templates/apps/website/why/examples/3.npm-basic-package/README.md +0 -1
  124. package/templates/apps/website/why/examples/3.npm-basic-package/build.config.ts +0 -24
  125. package/templates/apps/website/why/examples/3.npm-basic-package/package-lock.json +0 -3661
  126. package/templates/apps/website/why/examples/3.npm-basic-package/package.json +0 -32
  127. package/templates/apps/website/why/examples/3.npm-basic-package/src/index.ts +0 -8
  128. package/templates/apps/website/why/examples/3.npm-basic-package/tsconfig.json +0 -16
  129. package/templates/apps/website/why/examples/3.npm-basic-package/tsup.config.ts +0 -16
  130. package/templates/apps/website/why/examples/usage-cjs/cjs.cjs +0 -4
  131. package/templates/apps/website/why/examples/usage-cjs/esm.mjs +0 -4
  132. package/templates/apps/website/why/examples/usage-cjs/index.js +0 -12
  133. package/templates/apps/website/why/examples/usage-cjs/package-lock.json +0 -42
  134. package/templates/apps/website/why/examples/usage-cjs/package.json +0 -20
  135. package/templates/apps/website/why/examples/usage-esm/cjs.cjs +0 -4
  136. package/templates/apps/website/why/examples/usage-esm/createRequire.js +0 -7
  137. package/templates/apps/website/why/examples/usage-esm/esm.mjs +0 -4
  138. package/templates/apps/website/why/examples/usage-esm/index.js +0 -8
  139. package/templates/apps/website/why/examples/usage-esm/package-lock.json +0 -42
  140. package/templates/apps/website/why/examples/usage-esm/package.json +0 -21
  141. package/templates/apps/website/why/how-to-reuse-js-code.md +0 -250
  142. package/templates/apps/website/why/index.md +0 -1
  143. package/templates/apps/website/why/js-cjs-mjs.md +0 -99
  144. package/templates/apps/website/why/js-keywords.md +0 -132
  145. package/templates/apps/website/why/modern/bundlers.md +0 -79
  146. package/templates/apps/website/why/modern/dts.md +0 -93
  147. package/templates/apps/website/why/modern/esm-vs-cjs.md +0 -84
  148. package/templates/apps/website/why/modern/index.md +0 -55
  149. package/templates/apps/website/why/modern/package-entry-points.md +0 -128
  150. package/templates/apps/website/why/modern/typescript.md +0 -155
  151. package/templates/apps/website/why/publish-basic-npm-package.md +0 -146
  152. package/templates/apps/website/why/what-is-npm-package.md +0 -162
  153. package/templates/packages/tsdown-template/package.json +0 -47
  154. package/templates/packages/tsdown-template/src/index.ts +0 -5
  155. package/templates/packages/tsdown-template/test/index.test.ts +0 -11
  156. package/templates/packages/tsdown-template/tsconfig.json +0 -15
  157. package/templates/packages/tsdown-template/tsdown.config.ts +0 -9
  158. package/templates/packages/tsdown-template/vitest.config.ts +0 -15
  159. package/templates/packages/tsup-template/build.config.ts +0 -24
  160. package/templates/packages/tsup-template/package.json +0 -48
  161. package/templates/packages/tsup-template/src/index.ts +0 -12
  162. package/templates/packages/tsup-template/test/index.test.ts +0 -18
  163. package/templates/packages/tsup-template/tsconfig.json +0 -15
  164. package/templates/packages/tsup-template/tsup.config.ts +0 -18
  165. package/templates/packages/tsup-template/vitest.config.ts +0 -15
  166. package/templates/packages/unbuild-template/build.config.ts +0 -24
  167. package/templates/packages/unbuild-template/package.json +0 -48
  168. package/templates/packages/unbuild-template/src/index.ts +0 -9
  169. package/templates/packages/unbuild-template/src/utils.ts +0 -3
  170. package/templates/packages/unbuild-template/test/index.test.ts +0 -18
  171. package/templates/packages/unbuild-template/tsconfig.json +0 -15
  172. package/templates/packages/unbuild-template/vitest.config.ts +0 -15
  173. package/templates/packages/vue-lib-template/eslint.config.js +0 -12
  174. package/templates/packages/vue-lib-template/gitignore +0 -1
  175. package/templates/packages/vue-lib-template/index.html +0 -13
  176. package/templates/packages/vue-lib-template/lib/HelloWorld.vue +0 -21
  177. package/templates/packages/vue-lib-template/lib/index.ts +0 -3
  178. package/templates/packages/vue-lib-template/package.json +0 -61
  179. package/templates/packages/vue-lib-template/src/App.vue +0 -9
  180. package/templates/packages/vue-lib-template/src/main.ts +0 -8
  181. package/templates/packages/vue-lib-template/src/pages/index.vue +0 -7
  182. package/templates/packages/vue-lib-template/src/router/index.ts +0 -11
  183. package/templates/packages/vue-lib-template/src/style.css +0 -1
  184. package/templates/packages/vue-lib-template/src/vite-env.d.ts +0 -2
  185. package/templates/packages/vue-lib-template/test/index.test.ts +0 -13
  186. package/templates/packages/vue-lib-template/tsconfig.app.json +0 -30
  187. package/templates/packages/vue-lib-template/tsconfig.json +0 -14
  188. package/templates/packages/vue-lib-template/tsconfig.node.json +0 -25
  189. package/templates/packages/vue-lib-template/tsconfig.test.json +0 -40
  190. package/templates/packages/vue-lib-template/vite.config.ts +0 -54
  191. package/templates/packages/vue-lib-template/vite.shared.config.ts +0 -13
  192. package/templates/packages/vue-lib-template/vitest.config.ts +0 -13
  193. /package/{assets/LICENSE → LICENSE} +0 -0
@@ -39,23 +39,21 @@ node_process = __toESM(node_process);
39
39
  let fs_extra = require("fs-extra");
40
40
  fs_extra = __toESM(fs_extra);
41
41
  let consola = require("consola");
42
- let _inquirer_checkbox = require("@inquirer/checkbox");
43
- _inquirer_checkbox = __toESM(_inquirer_checkbox);
42
+ let _icebreakers_monorepo_templates = require("@icebreakers/monorepo-templates");
44
43
  let c12 = require("c12");
45
- let picocolors = require("picocolors");
46
- picocolors = __toESM(picocolors);
44
+ let node_os = require("node:os");
45
+ node_os = __toESM(node_os);
47
46
  let node_path = require("node:path");
48
47
  node_path = __toESM(node_path);
49
48
  let node_url = require("node:url");
49
+ let picocolors = require("picocolors");
50
+ picocolors = __toESM(picocolors);
50
51
  let yaml = require("yaml");
51
52
  yaml = __toESM(yaml);
52
53
  let node_crypto = require("node:crypto");
53
54
  node_crypto = __toESM(node_crypto);
54
55
  require("@pnpm/types");
55
56
  let comment_json = require("comment-json");
56
- let node_os = require("node:os");
57
- node_os = __toESM(node_os);
58
- let execa = require("execa");
59
57
  let p_queue = require("p-queue");
60
58
  p_queue = __toESM(p_queue);
61
59
  let klaw = require("klaw");
@@ -250,7 +248,8 @@ async function getWorkspacePackages(workspaceDir, options) {
250
248
  ignorePrivatePackage: true
251
249
  });
252
250
  const manifest = await (0, _pnpm_workspace_read_manifest.readWorkspaceManifest)(workspaceDir);
253
- let pkgs = (await (0, _pnpm_workspace_find_packages.findWorkspacePackages)(workspaceDir, { patterns: patterns ?? manifest?.packages })).filter((x) => {
251
+ const workspacePatterns = patterns ?? manifest?.packages;
252
+ let pkgs = (await (0, _pnpm_workspace_find_packages.findWorkspacePackages)(workspaceDir, workspacePatterns ? { patterns: workspacePatterns } : {})).filter((x) => {
254
253
  if (ignorePrivatePackage && x.manifest.private) return false;
255
254
  return true;
256
255
  }).map((project) => {
@@ -568,6 +567,72 @@ async function resolveCommandConfig(name$1, cwd) {
568
567
  return ((await loadMonorepoConfig(cwd)).commands ?? {})[name$1] ?? {};
569
568
  }
570
569
 
570
+ //#endregion
571
+ //#region package.json
572
+ var name = "@icebreakers/monorepo";
573
+ var version = "3.2.1";
574
+
575
+ //#endregion
576
+ //#region src/constants.ts
577
+ /**
578
+ * 还原出 package.json 所在的绝对路径,方便后续按目录组织资源文件。
579
+ */
580
+ const packageJsonPath = (0, node_url.fileURLToPath)(new URL("../package.json", require("url").pathToFileURL(__filename).href));
581
+ /**
582
+ * @icebreakers/monorepo 包的根目录。
583
+ */
584
+ const packageDir = node_path.dirname(packageJsonPath);
585
+ /**
586
+ * monorepo 根目录,方便需要跳出当前包的逻辑(例如定位工作区文件)。
587
+ */
588
+ const rootDir = node_path.resolve(packageDir, "..", "..");
589
+
590
+ //#endregion
591
+ //#region src/commands/skills.ts
592
+ const skillName = "icebreakers-monorepo-cli";
593
+ const skillTargets = ["codex", "claude"];
594
+ const skillSourceDir = pathe.default.join(packageDir, "resources", "skills", skillName);
595
+ function getSkillTargetPaths(homeDir = node_os.default.homedir()) {
596
+ return {
597
+ codex: pathe.default.join(homeDir, ".codex", "skills", skillName),
598
+ claude: pathe.default.join(homeDir, ".claude", "skills", skillName)
599
+ };
600
+ }
601
+ function normalizeTargets(values) {
602
+ if (!values?.length) return;
603
+ return Array.from(new Set(values));
604
+ }
605
+ async function syncSkills(options = {}) {
606
+ const cwd = options.cwd ?? node_process.default.cwd();
607
+ if (!await fs_extra.default.pathExists(skillSourceDir)) {
608
+ const relative = pathe.default.relative(cwd, skillSourceDir);
609
+ throw new Error(`未找到技能目录:${relative || skillSourceDir}`);
610
+ }
611
+ let targets = normalizeTargets(options.targets);
612
+ if (!targets?.length) targets = normalizeTargets(await (0, _icebreakers_monorepo_templates.checkbox)({
613
+ message: "请选择需要同步的技能目标",
614
+ choices: skillTargets.map((target) => ({
615
+ name: target,
616
+ value: target,
617
+ checked: true
618
+ }))
619
+ }));
620
+ if (!targets?.length) return [];
621
+ const targetPaths = getSkillTargetPaths();
622
+ const results = [];
623
+ for (const target of targets) {
624
+ const dest = targetPaths[target];
625
+ await fs_extra.default.remove(dest);
626
+ await fs_extra.default.ensureDir(pathe.default.dirname(dest));
627
+ await fs_extra.default.copy(skillSourceDir, dest);
628
+ results.push({
629
+ target,
630
+ dest
631
+ });
632
+ }
633
+ return results;
634
+ }
635
+
571
636
  //#endregion
572
637
  //#region src/commands/clean.ts
573
638
  var import_set_value = /* @__PURE__ */ __toESM(require_set_value(), 1);
@@ -594,7 +659,7 @@ async function cleanProjects(cwd, overrides) {
594
659
  });
595
660
  let cleanDirs = [];
596
661
  if (cleanConfig?.autoConfirm) cleanDirs = filteredPackages.map((pkg) => pkg.rootDir);
597
- else cleanDirs = await (0, _inquirer_checkbox.default)({
662
+ else cleanDirs = await (0, _icebreakers_monorepo_templates.checkbox)({
598
663
  message: "请选择需要清理的目录",
599
664
  choices: filteredPackages.map((x) => {
600
665
  const baseChoice = {
@@ -610,10 +675,12 @@ async function cleanProjects(cwd, overrides) {
610
675
  });
611
676
  const readmeZh = pathe.default.resolve(workspaceDir, "README.zh-CN.md");
612
677
  const qoderDir = pathe.default.resolve(workspaceDir, ".qoder");
678
+ const skillTargets$1 = Object.values(getSkillTargetPaths());
613
679
  const candidates = Array.from(new Set([
614
680
  ...cleanDirs.filter(Boolean),
615
681
  readmeZh,
616
- qoderDir
682
+ qoderDir,
683
+ ...skillTargets$1
617
684
  ]));
618
685
  await Promise.all(candidates.map(async (dir) => {
619
686
  if (await fs_extra.default.pathExists(dir)) await fs_extra.default.remove(dir);
@@ -624,34 +691,6 @@ async function cleanProjects(cwd, overrides) {
624
691
  await fs_extra.default.outputJson(name$1, pkgJson, { spaces: 2 });
625
692
  }
626
693
 
627
- //#endregion
628
- //#region package.json
629
- var name = "@icebreakers/monorepo";
630
- var version = "3.1.18";
631
-
632
- //#endregion
633
- //#region src/constants.ts
634
- /**
635
- * 还原出 package.json 所在的绝对路径,方便后续按目录组织资源文件。
636
- */
637
- const packageJsonPath = (0, node_url.fileURLToPath)(new URL("../package.json", require("url").pathToFileURL(__filename).href));
638
- /**
639
- * @icebreakers/monorepo 包的根目录,所有模板与资产目录都以此为基准。
640
- */
641
- const packageDir = node_path.default.dirname(packageJsonPath);
642
- /**
643
- * CLI 提供的模板目录,`monorepo new` 会从这里复制目标工程骨架。
644
- */
645
- const templatesDir = node_path.default.join(packageDir, "templates");
646
- /**
647
- * 升级命令需要写入的静态文件集合,位于 assets 目录中。
648
- */
649
- const assetsDir = node_path.default.join(packageDir, "assets");
650
- /**
651
- * monorepo 根目录,方便需要跳出当前包的逻辑(例如定位工作区文件)。
652
- */
653
- const rootDir = node_path.default.resolve(packageDir, "..", "..");
654
-
655
694
  //#endregion
656
695
  //#region src/utils/fs.ts
657
696
  /**
@@ -702,54 +741,6 @@ function updateIssueTemplateConfig(source, repoName) {
702
741
  return doc.toString();
703
742
  }
704
743
 
705
- //#endregion
706
- //#region src/utils/gitignore.ts
707
- /**
708
- * Utilities to handle renaming `.gitignore` files when packaging templates.
709
- * pnpm publish strips `.gitignore`, so we temporarily rename them to `gitignore`
710
- * and convert them back when writing into workspaces.
711
- */
712
- const publishBasename = "gitignore";
713
- const workspaceBasename = ".gitignore";
714
- function detectSeparator(input) {
715
- if (input.includes("\\") && !input.includes("/")) return "\\";
716
- return "/";
717
- }
718
- function replaceBasename(input, from, to) {
719
- if (!input) return input;
720
- const separator = detectSeparator(input);
721
- const normalized = input.replace(/[\\/]/g, separator);
722
- const hasTrailingSeparator = normalized.endsWith(separator);
723
- const segments = normalized.split(separator);
724
- if (hasTrailingSeparator && segments[segments.length - 1] === "") segments.pop();
725
- const lastIndex = segments.length - 1;
726
- if (lastIndex >= 0 && segments[lastIndex] === from) {
727
- segments[lastIndex] = to;
728
- const rebuilt = segments.join(separator);
729
- return hasTrailingSeparator ? `${rebuilt}${separator}` : rebuilt;
730
- }
731
- return input;
732
- }
733
- /**
734
- * Map a workspace path (containing `.gitignore`) to its packaged variant.
735
- */
736
- function toPublishGitignorePath(input) {
737
- return replaceBasename(input, workspaceBasename, publishBasename);
738
- }
739
- /**
740
- * Map a packaged path (containing `gitignore`) back to the workspace form.
741
- */
742
- function toWorkspaceGitignorePath(input) {
743
- return replaceBasename(input, publishBasename, workspaceBasename);
744
- }
745
- /**
746
- * Convenient helper to check whether a filename (with or without dot prefix)
747
- * should be treated as a gitignore file.
748
- */
749
- function isGitignoreFile(name$1) {
750
- return toPublishGitignorePath(name$1) !== name$1 || toWorkspaceGitignorePath(name$1) !== name$1;
751
- }
752
-
753
744
  //#endregion
754
745
  //#region src/utils/hash.ts
755
746
  /**
@@ -791,18 +782,49 @@ function isMatch(str, arr) {
791
782
  //#endregion
792
783
  //#region src/commands/create.ts
793
784
  /**
794
- * 内置模板映射表,value 指向仓库中对应模板所在路径。
785
+ * 内置模板映射表,source 指向 templates 根目录下的来源目录,target 为生成路径。
795
786
  */
796
787
  const templateMap = {
797
- "tsup": "packages/tsup-template",
798
- "tsdown": "packages/tsdown-template",
799
- "unbuild": "packages/unbuild-template",
800
- "vue-lib": "packages/vue-lib-template",
801
- "hono-server": "apps/server",
802
- "vue-hono": "apps/client",
803
- "vitepress": "apps/website",
804
- "cli": "apps/cli"
788
+ "tsup": {
789
+ source: "tsup",
790
+ target: "packages/tsup"
791
+ },
792
+ "tsdown": {
793
+ source: "tsdown",
794
+ target: "packages/tsdown"
795
+ },
796
+ "unbuild": {
797
+ source: "unbuild",
798
+ target: "packages/unbuild"
799
+ },
800
+ "vue-lib": {
801
+ source: "vue-lib",
802
+ target: "packages/vue-lib"
803
+ },
804
+ "hono-server": {
805
+ source: "server",
806
+ target: "apps/server"
807
+ },
808
+ "vue-hono": {
809
+ source: "client",
810
+ target: "apps/client"
811
+ },
812
+ "vitepress": {
813
+ source: "vitepress",
814
+ target: "apps/website"
815
+ },
816
+ "cli": {
817
+ source: "cli",
818
+ target: "apps/cli"
819
+ }
805
820
  };
821
+ function normalizeTemplateDefinition(value) {
822
+ if (typeof value === "string") return {
823
+ source: value,
824
+ target: value
825
+ };
826
+ return value;
827
+ }
806
828
  const defaultTemplate = "unbuild";
807
829
  /**
808
830
  * 交互式选择模板时的默认选项列表。
@@ -852,8 +874,8 @@ function getCreateChoices(choices) {
852
874
  * 合并内置与自定义模板映射,允许扩展新的模板类型。
853
875
  */
854
876
  function getTemplateMap(extra) {
855
- const base = { ...templateMap };
856
- if (extra && Object.keys(extra).length) Object.assign(base, extra);
877
+ const base = Object.fromEntries(Object.entries(templateMap).map(([key, value]) => [key, normalizeTemplateDefinition(value)]));
878
+ if (extra && Object.keys(extra).length) for (const [key, value] of Object.entries(extra)) base[key] = normalizeTemplateDefinition(value);
857
879
  return base;
858
880
  }
859
881
  async function applyGitMetadata(pkgJson, repoDir, targetDir) {
@@ -885,24 +907,23 @@ async function createNewProject(options) {
885
907
  const name$1 = typeof rawName === "string" ? rawName.trim() : void 0;
886
908
  const requestedTemplate = options?.type ?? createConfig?.type ?? createConfig?.defaultTemplate ?? defaultTemplate;
887
909
  const templateDefinitions = getTemplateMap(createConfig?.templateMap);
888
- const templatesRoot = createConfig?.templatesDir ? pathe.default.resolve(cwd, createConfig.templatesDir) : templatesDir;
910
+ const templatesRoot = createConfig?.templatesDir ? pathe.default.resolve(cwd, createConfig.templatesDir) : _icebreakers_monorepo_templates.templatesDir;
889
911
  const fallbackTemplate = createConfig?.defaultTemplate ?? defaultTemplate;
890
912
  const bundlerName = typeof requestedTemplate === "string" && templateDefinitions[requestedTemplate] ? requestedTemplate : fallbackTemplate;
891
- const sourceRelative = templateDefinitions[bundlerName];
892
- if (!sourceRelative) throw new Error(`未找到名为 ${bundlerName} 的模板,请检查 monorepo.config.ts`);
893
- const from = pathe.default.join(templatesRoot, sourceRelative);
894
- const targetName = name$1 && name$1.length > 0 ? name$1 : sourceRelative;
913
+ const templateDefinition = templateDefinitions[bundlerName];
914
+ if (!templateDefinition) throw new Error(`未找到名为 ${bundlerName} 的模板,请检查 monorepo.config.ts`);
915
+ const from = pathe.default.join(templatesRoot, templateDefinition.source);
916
+ const targetName = name$1 && name$1.length > 0 ? name$1 : templateDefinition.target;
895
917
  const to = pathe.default.join(cwd, targetName);
896
918
  if (await fs_extra.default.pathExists(to)) throw new Error(`${picocolors.default.red("目标目录已存在")}: ${pathe.default.relative(cwd, to)}`);
897
919
  await fs_extra.default.ensureDir(to);
898
920
  const filelist = await fs_extra.default.readdir(from);
899
- const shouldSkip = (src) => pathe.default.basename(src) === ".DS_Store";
921
+ const shouldSkip = (src) => (0, _icebreakers_monorepo_templates.shouldSkipTemplatePath)(from, src);
900
922
  const copyTasks = filelist.filter((filename) => filename !== "package.json").map(async (filename) => {
901
923
  const sourcePath = pathe.default.resolve(from, filename);
902
- const targetPath = pathe.default.resolve(to, toWorkspaceGitignorePath(filename));
924
+ const targetPath = pathe.default.resolve(to, (0, _icebreakers_monorepo_templates.toWorkspaceGitignorePath)(filename));
903
925
  await fs_extra.default.copy(sourcePath, targetPath, { filter(src) {
904
- if (shouldSkip(src)) return false;
905
- return true;
926
+ return !shouldSkip(src);
906
927
  } });
907
928
  });
908
929
  await Promise.all(copyTasks);
@@ -1148,7 +1169,7 @@ async function syncNpmMirror(cwd, options) {
1148
1169
  for (const pkgName of set$6) {
1149
1170
  if (!pkgName) continue;
1150
1171
  tasks.push(queue.add(async () => {
1151
- return (0, execa.execaCommand)(renderCommand(template, pkgName), { stdio: "inherit" });
1172
+ return (0, _icebreakers_monorepo_templates.execaCommand)(renderCommand(template, pkgName), { stdio: "inherit" });
1152
1173
  }));
1153
1174
  }
1154
1175
  await Promise.all(tasks);
@@ -1206,7 +1227,7 @@ async function scheduleOverwrite(intent, options) {
1206
1227
  }
1207
1228
  async function flushPendingOverwrites(pending) {
1208
1229
  if (!pending.length) return;
1209
- const selected = await (0, _inquirer_checkbox.default)({
1230
+ const selected = await (0, _icebreakers_monorepo_templates.checkbox)({
1210
1231
  message: "检测到以下文件内容与当前仓库不同,选择需要覆盖的文件",
1211
1232
  choices: pending.map((item) => ({
1212
1233
  name: picocolors.default.greenBright(item.relPath),
@@ -1297,38 +1318,6 @@ function setPkgJson(sourcePkgJson, targetPkgJson, options) {
1297
1318
  }
1298
1319
  }
1299
1320
 
1300
- //#endregion
1301
- //#region src/commands/upgrade/targets.ts
1302
- /**
1303
- * 根据 core 模式返回需要同步的资产目录。
1304
- * core=true 时仅包含最小集,便于内联到其他项目。
1305
- */
1306
- function getAssetTargets(core) {
1307
- const list = [
1308
- ".changeset",
1309
- ".husky",
1310
- ".vscode",
1311
- ".editorconfig",
1312
- ".gitattributes",
1313
- ".gitignore",
1314
- ".npmrc",
1315
- "commitlint.config.ts",
1316
- "eslint.config.js",
1317
- "lint-staged.config.js",
1318
- "stylelint.config.js",
1319
- "monorepo.config.ts",
1320
- "package.json",
1321
- "pnpm-workspace.yaml",
1322
- "tsconfig.json",
1323
- "turbo.json",
1324
- "vitest.config.ts",
1325
- "Dockerfile",
1326
- ".dockerignore"
1327
- ];
1328
- if (!core) list.push(".github", "LICENSE", "renovate.json", "SECURITY.md", "CODE_OF_CONDUCT.md", "CONTRIBUTING.md", "netlify.toml");
1329
- return list;
1330
- }
1331
-
1332
1321
  //#endregion
1333
1322
  //#region src/commands/upgrade/workspace.ts
1334
1323
  function isPlainObject(value) {
@@ -1404,11 +1393,11 @@ async function upgradeMonorepo(opts) {
1404
1393
  const repoName = await new GitClient({ baseDir: cwd }).getRepoName();
1405
1394
  const useCoreAssets = merged.core ?? false;
1406
1395
  merged.core = useCoreAssets;
1407
- const baseTargets = getAssetTargets(useCoreAssets);
1396
+ const baseTargets = (0, _icebreakers_monorepo_templates.getAssetTargets)(useCoreAssets);
1408
1397
  const configTargets = upgradeConfig?.targets ?? [];
1409
1398
  const mergeTargets = upgradeConfig?.mergeTargets;
1410
1399
  let targets = configTargets.length ? mergeTargets === false ? [...configTargets] : Array.from(new Set([...baseTargets, ...configTargets])) : baseTargets;
1411
- if (merged.interactive) targets = await (0, _inquirer_checkbox.default)({
1400
+ if (merged.interactive) targets = await (0, _icebreakers_monorepo_templates.checkbox)({
1412
1401
  message: "选择你需要的文件",
1413
1402
  choices: targets.map((x) => {
1414
1403
  return {
@@ -1423,12 +1412,18 @@ async function upgradeMonorepo(opts) {
1423
1412
  const skipChangesetMarkdown = upgradeConfig?.skipChangesetMarkdown ?? true;
1424
1413
  const scriptOverrides = upgradeConfig?.scripts;
1425
1414
  const skipOverwrite = merged.skipOverwrite;
1415
+ const buildWriteIntentOptions = (source) => {
1416
+ return skipOverwrite === void 0 ? { source } : {
1417
+ skipOverwrite,
1418
+ source
1419
+ };
1420
+ };
1426
1421
  const pendingOverwrites = [];
1427
- for await (const file of (0, klaw.default)(assetsDir, { filter(p) {
1428
- return isMatch(toWorkspaceGitignorePath(pathe.default.relative(assetsDir, p)), regexpArr);
1422
+ for await (const file of (0, klaw.default)(_icebreakers_monorepo_templates.assetsDir, { filter(p) {
1423
+ return isMatch((0, _icebreakers_monorepo_templates.toWorkspaceGitignorePath)(pathe.default.relative(_icebreakers_monorepo_templates.assetsDir, p)), regexpArr);
1429
1424
  } })) {
1430
1425
  if (!file.stats.isFile()) continue;
1431
- const relPath = toWorkspaceGitignorePath(pathe.default.relative(assetsDir, file.path));
1426
+ const relPath = (0, _icebreakers_monorepo_templates.toWorkspaceGitignorePath)(pathe.default.relative(_icebreakers_monorepo_templates.assetsDir, file.path));
1432
1427
  if (skipChangesetMarkdown && relPath.startsWith(".changeset/") && relPath.endsWith(".md")) continue;
1433
1428
  const targetPath = pathe.default.resolve(absOutDir, relPath);
1434
1429
  try {
@@ -1436,12 +1431,9 @@ async function upgradeMonorepo(opts) {
1436
1431
  if (!await fs_extra.default.pathExists(targetPath)) continue;
1437
1432
  const sourcePkgJson = await fs_extra.default.readJson(file.path);
1438
1433
  const targetPkgJson = await fs_extra.default.readJson(targetPath);
1439
- setPkgJson(sourcePkgJson, targetPkgJson, { scripts: scriptOverrides });
1434
+ setPkgJson(sourcePkgJson, targetPkgJson, scriptOverrides ? { scripts: scriptOverrides } : void 0);
1440
1435
  const data = `${JSON.stringify(targetPkgJson, void 0, 2)}\n`;
1441
- const intent$1 = await evaluateWriteIntent(targetPath, {
1442
- skipOverwrite,
1443
- source: data
1444
- });
1436
+ const intent$1 = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(data));
1445
1437
  const action$1 = async () => {
1446
1438
  await fs_extra.default.outputFile(targetPath, data, "utf8");
1447
1439
  logger.success(targetPath);
@@ -1460,10 +1452,7 @@ async function upgradeMonorepo(opts) {
1460
1452
  const targetManifest = exists ? normalizeWorkspaceManifest(yaml.default.parse(await fs_extra.default.readFile(targetPath, "utf8"))) : normalizeWorkspaceManifest({});
1461
1453
  const mergedManifest = exists ? mergeWorkspaceManifest(sourceManifest, targetManifest) : sourceManifest;
1462
1454
  const data = yaml.default.stringify(mergedManifest, { singleQuote: true });
1463
- const intent$1 = await evaluateWriteIntent(targetPath, {
1464
- skipOverwrite,
1465
- source: data
1466
- });
1455
+ const intent$1 = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(data));
1467
1456
  const action$1 = async () => {
1468
1457
  await fs_extra.default.outputFile(targetPath, data, "utf8");
1469
1458
  logger.success(targetPath);
@@ -1480,10 +1469,7 @@ async function upgradeMonorepo(opts) {
1480
1469
  const changesetJson = await fs_extra.default.readJson(file.path);
1481
1470
  (0, import_set_value.default)(changesetJson, "changelog.1.repo", repoName);
1482
1471
  const data = `${JSON.stringify(changesetJson, void 0, 2)}\n`;
1483
- const intent$1 = await evaluateWriteIntent(targetPath, {
1484
- skipOverwrite,
1485
- source: data
1486
- });
1472
+ const intent$1 = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(data));
1487
1473
  const action$1 = async () => {
1488
1474
  await fs_extra.default.outputFile(targetPath, data, "utf8");
1489
1475
  logger.success(targetPath);
@@ -1516,10 +1502,7 @@ async function upgradeMonorepo(opts) {
1516
1502
  }
1517
1503
  if (relPath === ".github/ISSUE_TEMPLATE/config.yml") {
1518
1504
  const data = updateIssueTemplateConfig(await fs_extra.default.readFile(file.path, "utf8"), repoName);
1519
- const intent$1 = await evaluateWriteIntent(targetPath, {
1520
- skipOverwrite,
1521
- source: data
1522
- });
1505
+ const intent$1 = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(data));
1523
1506
  const action$1 = async () => {
1524
1507
  await fs_extra.default.outputFile(targetPath, data);
1525
1508
  logger.success(targetPath);
@@ -1533,10 +1516,7 @@ async function upgradeMonorepo(opts) {
1533
1516
  continue;
1534
1517
  }
1535
1518
  const source = await fs_extra.default.readFile(file.path);
1536
- const intent = await evaluateWriteIntent(targetPath, {
1537
- skipOverwrite,
1538
- source
1539
- });
1519
+ const intent = await evaluateWriteIntent(targetPath, buildWriteIntentOptions(source));
1540
1520
  const action = async () => {
1541
1521
  await fs_extra.default.outputFile(targetPath, source);
1542
1522
  logger.success(targetPath);
@@ -1568,12 +1548,6 @@ Object.defineProperty(exports, '__toESM', {
1568
1548
  return __toESM;
1569
1549
  }
1570
1550
  });
1571
- Object.defineProperty(exports, 'assetsDir', {
1572
- enumerable: true,
1573
- get: function () {
1574
- return assetsDir;
1575
- }
1576
- });
1577
1551
  Object.defineProperty(exports, 'cleanProjects', {
1578
1552
  enumerable: true,
1579
1553
  get: function () {
@@ -1646,6 +1620,12 @@ Object.defineProperty(exports, 'getFileHash', {
1646
1620
  return getFileHash;
1647
1621
  }
1648
1622
  });
1623
+ Object.defineProperty(exports, 'getSkillTargetPaths', {
1624
+ enumerable: true,
1625
+ get: function () {
1626
+ return getSkillTargetPaths;
1627
+ }
1628
+ });
1649
1629
  Object.defineProperty(exports, 'getTemplateMap', {
1650
1630
  enumerable: true,
1651
1631
  get: function () {
@@ -1676,12 +1656,6 @@ Object.defineProperty(exports, 'isFileChanged', {
1676
1656
  return isFileChanged;
1677
1657
  }
1678
1658
  });
1679
- Object.defineProperty(exports, 'isGitignoreFile', {
1680
- enumerable: true,
1681
- get: function () {
1682
- return isGitignoreFile;
1683
- }
1684
- });
1685
1659
  Object.defineProperty(exports, 'isIgnorableFsError', {
1686
1660
  enumerable: true,
1687
1661
  get: function () {
@@ -1742,34 +1716,28 @@ Object.defineProperty(exports, 'setVscodeBinaryMirror', {
1742
1716
  return setVscodeBinaryMirror;
1743
1717
  }
1744
1718
  });
1745
- Object.defineProperty(exports, 'syncNpmMirror', {
1719
+ Object.defineProperty(exports, 'skillTargets', {
1746
1720
  enumerable: true,
1747
1721
  get: function () {
1748
- return syncNpmMirror;
1722
+ return skillTargets;
1749
1723
  }
1750
1724
  });
1751
- Object.defineProperty(exports, 'templateMap', {
1752
- enumerable: true,
1753
- get: function () {
1754
- return templateMap;
1755
- }
1756
- });
1757
- Object.defineProperty(exports, 'templatesDir', {
1725
+ Object.defineProperty(exports, 'syncNpmMirror', {
1758
1726
  enumerable: true,
1759
1727
  get: function () {
1760
- return templatesDir;
1728
+ return syncNpmMirror;
1761
1729
  }
1762
1730
  });
1763
- Object.defineProperty(exports, 'toPublishGitignorePath', {
1731
+ Object.defineProperty(exports, 'syncSkills', {
1764
1732
  enumerable: true,
1765
1733
  get: function () {
1766
- return toPublishGitignorePath;
1734
+ return syncSkills;
1767
1735
  }
1768
1736
  });
1769
- Object.defineProperty(exports, 'toWorkspaceGitignorePath', {
1737
+ Object.defineProperty(exports, 'templateMap', {
1770
1738
  enumerable: true,
1771
1739
  get: function () {
1772
- return toWorkspaceGitignorePath;
1740
+ return templateMap;
1773
1741
  }
1774
1742
  });
1775
1743
  Object.defineProperty(exports, 'updateIssueTemplateConfig', {