@icebreakers/monorepo-templates 1.1.0 → 1.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 (159) hide show
  1. package/README.md +12 -8
  2. package/README.zh-CN.md +16 -0
  3. package/assets/.github/ISSUE_TEMPLATE/config.yml +1 -1
  4. package/assets/.github/workflows/release.yml +5 -3
  5. package/assets/AGENTS.md +4 -3
  6. package/assets/CONTRIBUTING.md +27 -2
  7. package/assets/SECURITY.md +12 -14
  8. package/assets/package.json +13 -4
  9. package/assets/pnpm-workspace.yaml +2 -9
  10. package/dist/cli.mjs +1 -1
  11. package/dist/index.mjs +1 -1
  12. package/dist/{prepare-CNCmvco-.mjs → prepare--cxFop8c.mjs} +20 -0
  13. package/package.json +9 -5
  14. package/templates/cli/package.json +11 -4
  15. package/templates/client/package.json +17 -1
  16. package/templates/server/package.json +11 -4
  17. package/templates/tsdown/package.json +11 -4
  18. package/templates/vitepress/.vitepress/config.ts +146 -165
  19. package/templates/vitepress/ai/index.md +12 -23
  20. package/templates/vitepress/ai/llms-txt.md +13 -31
  21. package/templates/vitepress/getting-started.md +3 -32
  22. package/templates/vitepress/index.md +27 -30
  23. package/templates/vitepress/knowledge/index.md +17 -41
  24. package/templates/vitepress/monorepo/commands.md +13 -18
  25. package/templates/vitepress/monorepo/index.md +22 -100
  26. package/templates/vitepress/monorepo/manage.md +15 -227
  27. package/templates/vitepress/monorepo/publish.md +15 -70
  28. package/templates/vitepress/monorepo/templates.md +10 -17
  29. package/templates/vitepress/monorepo/troubleshooting.md +13 -16
  30. package/templates/vitepress/package.json +10 -4
  31. package/templates/vitepress/public/_redirects +3 -0
  32. package/templates/vitepress/repoctl/adopt-existing.md +51 -53
  33. package/templates/vitepress/repoctl/aliases.md +18 -18
  34. package/templates/vitepress/repoctl/checks.md +21 -68
  35. package/templates/vitepress/repoctl/commands.md +16 -64
  36. package/templates/vitepress/repoctl/config.md +14 -35
  37. package/templates/vitepress/repoctl/doctor.md +20 -60
  38. package/templates/vitepress/repoctl/execution-model.md +16 -69
  39. package/templates/vitepress/repoctl/getting-started.md +34 -40
  40. package/templates/vitepress/repoctl/index.md +33 -61
  41. package/templates/vitepress/repoctl/reports.md +20 -74
  42. package/templates/vitepress/repoctl/scenarios.md +26 -28
  43. package/templates/vitepress/repoctl/template-assets.md +19 -88
  44. package/templates/vitepress/repoctl/templates.md +50 -81
  45. package/templates/vitepress/repoctl/troubleshooting.md +32 -46
  46. package/templates/vitepress/repoctl/workflows.md +38 -67
  47. package/templates/vitepress/thinking.md +4 -85
  48. package/templates/vitepress/tools/changeset.md +9 -59
  49. package/templates/vitepress/tools/husky.md +6 -124
  50. package/templates/vitepress/tools/index.md +13 -32
  51. package/templates/vitepress/tools/lint-staged.md +5 -96
  52. package/templates/vitepress/tools/llms-txt.md +4 -6
  53. package/templates/vitepress/tools/pnpm.md +7 -119
  54. package/templates/vitepress/tools/renovate.md +3 -87
  55. package/templates/vitepress/tools/turborepo.md +5 -157
  56. package/templates/vitepress/why/how-to-reuse-js-code.md +6 -247
  57. package/templates/vitepress/why/index.md +14 -1
  58. package/templates/vitepress/why/js-cjs-mjs.md +9 -96
  59. package/templates/vitepress/why/js-keywords.md +4 -129
  60. package/templates/vitepress/why/modern/bundlers.md +3 -50
  61. package/templates/vitepress/why/modern/dts.md +4 -90
  62. package/templates/vitepress/why/modern/esm-vs-cjs.md +4 -81
  63. package/templates/vitepress/why/modern/index.md +10 -51
  64. package/templates/vitepress/why/modern/package-entry-points.md +6 -117
  65. package/templates/vitepress/why/modern/typescript.md +4 -152
  66. package/templates/vitepress/why/publish-basic-npm-package.md +17 -144
  67. package/templates/vitepress/why/what-is-npm-package.md +4 -159
  68. package/templates/vitepress/zh/ai/index.md +33 -0
  69. package/templates/vitepress/zh/ai/llms-txt.md +42 -0
  70. package/templates/vitepress/zh/getting-started.md +40 -0
  71. package/templates/vitepress/zh/index.md +66 -0
  72. package/templates/vitepress/zh/knowledge/index.md +50 -0
  73. package/templates/vitepress/zh/monorepo/commands.md +21 -0
  74. package/templates/vitepress/zh/monorepo/index.md +115 -0
  75. package/templates/vitepress/zh/monorepo/manage.md +243 -0
  76. package/templates/vitepress/zh/monorepo/publish.md +87 -0
  77. package/templates/vitepress/zh/monorepo/templates.md +21 -0
  78. package/templates/vitepress/zh/monorepo/troubleshooting.md +20 -0
  79. package/templates/vitepress/zh/repoctl/adopt-existing.md +135 -0
  80. package/templates/vitepress/{en → zh}/repoctl/aliases.md +18 -18
  81. package/templates/vitepress/zh/repoctl/checks.md +86 -0
  82. package/templates/vitepress/zh/repoctl/commands.md +168 -0
  83. package/templates/vitepress/zh/repoctl/config.md +90 -0
  84. package/templates/vitepress/zh/repoctl/doctor.md +86 -0
  85. package/templates/vitepress/zh/repoctl/execution-model.md +81 -0
  86. package/templates/vitepress/zh/repoctl/getting-started.md +122 -0
  87. package/templates/vitepress/zh/repoctl/index.md +102 -0
  88. package/templates/vitepress/zh/repoctl/reports.md +94 -0
  89. package/templates/vitepress/{en → zh}/repoctl/scenarios.md +28 -26
  90. package/templates/vitepress/zh/repoctl/template-assets.md +116 -0
  91. package/templates/vitepress/zh/repoctl/templates.md +159 -0
  92. package/templates/vitepress/zh/repoctl/troubleshooting.md +110 -0
  93. package/templates/vitepress/zh/repoctl/workflows.md +118 -0
  94. package/templates/vitepress/zh/thinking.md +88 -0
  95. package/templates/vitepress/zh/tools/changeset.md +75 -0
  96. package/templates/vitepress/zh/tools/husky.md +130 -0
  97. package/templates/vitepress/zh/tools/index.md +38 -0
  98. package/templates/vitepress/zh/tools/lint-staged.md +103 -0
  99. package/templates/vitepress/zh/tools/llms-txt.md +9 -0
  100. package/templates/vitepress/zh/tools/pnpm.md +127 -0
  101. package/templates/vitepress/zh/tools/renovate.md +91 -0
  102. package/templates/vitepress/zh/tools/turborepo.md +166 -0
  103. package/templates/vitepress/zh/why/assets/npm-dt.svg +15 -0
  104. package/templates/vitepress/zh/why/assets/npm-ts.svg +19 -0
  105. package/templates/vitepress/zh/why/examples/0.npm-basic-package/index.js +10 -0
  106. package/templates/vitepress/zh/why/examples/0.npm-basic-package/package.json +11 -0
  107. package/templates/vitepress/zh/why/examples/1.npm-basic-package/index.cjs +12 -0
  108. package/templates/vitepress/zh/why/examples/1.npm-basic-package/index.d.ts +1 -0
  109. package/templates/vitepress/zh/why/examples/1.npm-basic-package/index.js +8 -0
  110. package/templates/vitepress/zh/why/examples/1.npm-basic-package/package.json +19 -0
  111. package/templates/vitepress/zh/why/examples/2.npm-basic-package/README.md +1 -0
  112. package/templates/vitepress/zh/why/examples/2.npm-basic-package/package-lock.json +30 -0
  113. package/templates/vitepress/zh/why/examples/2.npm-basic-package/package.json +35 -0
  114. package/templates/vitepress/zh/why/examples/2.npm-basic-package/rename-ext.js +24 -0
  115. package/templates/vitepress/zh/why/examples/2.npm-basic-package/src/index.ts +8 -0
  116. package/templates/vitepress/zh/why/examples/2.npm-basic-package/tsconfig.cjs.json +8 -0
  117. package/templates/vitepress/zh/why/examples/2.npm-basic-package/tsconfig.esm.json +7 -0
  118. package/templates/vitepress/zh/why/examples/2.npm-basic-package/tsconfig.json +18 -0
  119. package/templates/vitepress/zh/why/examples/3.npm-basic-package/README.md +1 -0
  120. package/templates/vitepress/zh/why/examples/3.npm-basic-package/package-lock.json +1496 -0
  121. package/templates/vitepress/zh/why/examples/3.npm-basic-package/package.json +31 -0
  122. package/templates/vitepress/zh/why/examples/3.npm-basic-package/src/index.ts +8 -0
  123. package/templates/vitepress/zh/why/examples/3.npm-basic-package/tsconfig.json +16 -0
  124. package/templates/vitepress/zh/why/examples/3.npm-basic-package/tsdown.config.ts +16 -0
  125. package/templates/vitepress/zh/why/examples/usage-cjs/cjs.cjs +4 -0
  126. package/templates/vitepress/zh/why/examples/usage-cjs/esm.mjs +4 -0
  127. package/templates/vitepress/zh/why/examples/usage-cjs/index.js +8 -0
  128. package/templates/vitepress/zh/why/examples/usage-cjs/package-lock.json +36 -0
  129. package/templates/vitepress/zh/why/examples/usage-cjs/package.json +20 -0
  130. package/templates/vitepress/zh/why/examples/usage-esm/cjs.cjs +4 -0
  131. package/templates/vitepress/zh/why/examples/usage-esm/createRequire.js +7 -0
  132. package/templates/vitepress/zh/why/examples/usage-esm/esm.mjs +4 -0
  133. package/templates/vitepress/zh/why/examples/usage-esm/index.js +8 -0
  134. package/templates/vitepress/zh/why/examples/usage-esm/package-lock.json +36 -0
  135. package/templates/vitepress/zh/why/examples/usage-esm/package.json +21 -0
  136. package/templates/vitepress/zh/why/how-to-reuse-js-code.md +250 -0
  137. package/templates/vitepress/zh/why/index.md +1 -0
  138. package/templates/vitepress/zh/why/js-cjs-mjs.md +99 -0
  139. package/templates/vitepress/zh/why/js-keywords.md +132 -0
  140. package/templates/vitepress/zh/why/modern/bundlers.md +52 -0
  141. package/templates/vitepress/zh/why/modern/dts.md +93 -0
  142. package/templates/vitepress/zh/why/modern/esm-vs-cjs.md +84 -0
  143. package/templates/vitepress/zh/why/modern/index.md +55 -0
  144. package/templates/vitepress/zh/why/modern/package-entry-points.md +128 -0
  145. package/templates/vitepress/zh/why/modern/typescript.md +155 -0
  146. package/templates/vitepress/zh/why/publish-basic-npm-package.md +146 -0
  147. package/templates/vitepress/zh/why/what-is-npm-package.md +162 -0
  148. package/templates/vue-lib/package.json +12 -5
  149. package/assets/.changeset/ledger.yaml +0 -26
  150. package/templates/vitepress/en/index.md +0 -63
  151. package/templates/vitepress/en/knowledge/monorepo.md +0 -37
  152. package/templates/vitepress/en/repoctl/adopt-existing.md +0 -133
  153. package/templates/vitepress/en/repoctl/commands.md +0 -120
  154. package/templates/vitepress/en/repoctl/config.md +0 -69
  155. package/templates/vitepress/en/repoctl/getting-started.md +0 -116
  156. package/templates/vitepress/en/repoctl/index.md +0 -74
  157. package/templates/vitepress/en/repoctl/templates.md +0 -128
  158. package/templates/vitepress/en/repoctl/troubleshooting.md +0 -96
  159. package/templates/vitepress/en/repoctl/workflows.md +0 -89
@@ -0,0 +1,42 @@
1
+ ---
2
+ description: 使用 llms.txt 为大语言模型提供更易读取的 repoctl 文档入口。
3
+ ---
4
+
5
+ # AI 文档入口:llms.txt
6
+
7
+ `llms.txt` 是面向大语言模型的文档入口文件。它把站点中的关键页面整理成更适合模型读取的 Markdown 索引,便于 AI 工具在回答 repoctl、pnpm workspace、Turborepo 和模板用法相关问题时快速定位上下文。
8
+
9
+ 本站通过 `vitepress-plugin-llms` 在构建阶段自动生成这些文件:
10
+
11
+ | 文件 | 用途 |
12
+ | ---------------- | -------------------------------- |
13
+ | `/llms.txt` | 文档索引,列出可供模型读取的页面 |
14
+ | `/llms-full.txt` | 把站点文档合并成单个文本文件 |
15
+ | 页面 `.md` 文件 | 保留每个页面内容的 Markdown 版本 |
16
+
17
+ ## 1. 使用方式
18
+
19
+ 访问 `https://repo.icebreaker.top/llms.txt` 可以获取当前文档的 LLM 索引。如果需要一次性提供完整上下文,可以使用 `https://repo.icebreaker.top/llms-full.txt`。
20
+
21
+ 当你在 Cursor、Claude Code、Codex 或其他 AI 编程工具里引用 repoctl 文档时,优先提供 `llms.txt`,再按需要补充具体页面链接。
22
+
23
+ ## 2. 维护约定
24
+
25
+ 新增重要文档页面时,在 frontmatter 中补充 `description`。构建插件会把描述写入 `llms.txt` 的链接说明中,让模型更容易判断每个页面的用途。
26
+
27
+ ```md
28
+ ---
29
+ description: 说明这个页面解决的问题和适用场景。
30
+ ---
31
+ ```
32
+
33
+ ## 3. 页面组织建议
34
+
35
+ AI 入口应该保持显眼,但不要替代正常文档结构:
36
+
37
+ | 页面类型 | 推荐位置 |
38
+ | -------------------------------------- | ------------------------------------ |
39
+ | repoctl 命令、校验、诊断、报告 | `/repoctl/` |
40
+ | monorepo 和 npm 包基础知识 | `/knowledge/`、`/monorepo/`、`/why/` |
41
+ | pnpm、Turborepo、versioning 等工具专题 | `/tools/` |
42
+ | llms.txt 和 AI 工具读取约定 | `/ai/` |
@@ -0,0 +1,40 @@
1
+ # 新手使用指南
2
+
3
+ 这篇旧入口已经收敛到 repoctl 主线。新读者建议直接阅读:
4
+
5
+ - [repoctl 快速开始](./repoctl/getting-started.md)
6
+ - [repoctl 命令速查](./repoctl/commands.md)
7
+ - [repoctl 配置文件](./repoctl/config.md)
8
+
9
+ ## 先这样用
10
+
11
+ ```bash
12
+ pnpm add -D repoctl
13
+ pnpm exec repo init
14
+ pnpm exec repo doctor
15
+ pnpm exec repo new
16
+ pnpm exec repo check
17
+ ```
18
+
19
+ 模板生成仓库里可以使用更短的根脚本:
20
+
21
+ ```bash
22
+ pnpm run repo:init
23
+ pnpm doctor
24
+ pnpm new
25
+ pnpm check
26
+ ```
27
+
28
+ ## 知识点保留
29
+
30
+ 理解工具前,先理解这几个边界:
31
+
32
+ | 命令 | 解决的问题 |
33
+ | -------------- | ----------------------------------------------------- |
34
+ | `repo init` | 补齐仓库默认脚本、workspace patterns 和基础工具链入口 |
35
+ | `repo doctor` | 判断仓库当前是否可用,并输出可保存的诊断报告 |
36
+ | `repo new` | 从内置模板创建包、应用、服务、文档站或 CLI |
37
+ | `repo check` | 预览或执行提交前推荐校验 |
38
+ | `repo upgrade` | 同步模板最新标准资产 |
39
+
40
+ 如果你是在学习 monorepo 的基础概念,可以继续看 [为什么往 monorepo 方向演进](./monorepo/index.md)。
@@ -0,0 +1,66 @@
1
+ ---
2
+ layout: home
3
+
4
+ hero:
5
+ name: repoctl
6
+ text: 让 pnpm monorepo 的日常操作更短、更稳
7
+ tagline: 用一套 CLI 管理初始化、诊断、创建模板、提交前校验和模板资产同步。
8
+ image:
9
+ src: /logo.jpg
10
+ alt: repoctl logo
11
+ actions:
12
+ - theme: brand
13
+ text: 快速开始
14
+ link: /zh/repoctl/getting-started
15
+ - theme: alt
16
+ text: 命令速查
17
+ link: /zh/repoctl/commands
18
+ - theme: alt
19
+ text: AI 文档入口
20
+ link: /zh/ai/
21
+
22
+ features:
23
+ - title: 从已有仓库开始
24
+ details: 安装 repoctl 后运行 setup 和 doctor,先把 workspace、根脚本、配置冲突和提交链路检查清楚。
25
+ - title: 用模板创建包和应用
26
+ details: repo new 支持交互式创建、指定模板、dry-run、JSON 输出和创建计划落盘。
27
+ - title: 把质量门禁变成日常命令
28
+ details: repo check 统一预览和执行 lint、typecheck、build、test、tsd 等推荐校验。
29
+ - title: 给 AI 工具的文档入口
30
+ details: 构建时自动生成 llms.txt、llms-full.txt 和页面 Markdown,让 AI 编程工具更容易读取 repoctl 文档。
31
+ ---
32
+
33
+ ## 最短路径
34
+
35
+ ```bash
36
+ pnpm add -D repoctl
37
+ pnpm exec repo init
38
+ pnpm exec repo doctor
39
+ pnpm exec repo new
40
+ pnpm exec repo check
41
+ ```
42
+
43
+ 在由 repoctl 创建或初始化的仓库里,同一套工作流会暴露成更短的根脚本:
44
+
45
+ ```bash
46
+ pnpm run repo:init
47
+ pnpm run repo:doctor
48
+ pnpm run repo:new
49
+ pnpm run repo:check
50
+ ```
51
+
52
+ ## 你可以继续阅读
53
+
54
+ - [repoctl 概览](./repoctl/index.md)
55
+ - [快速开始](./repoctl/getting-started.md)
56
+ - [接入已有仓库](./repoctl/adopt-existing.md)
57
+ - [按场景选命令](./repoctl/scenarios.md)
58
+ - [执行模型](./repoctl/execution-model.md)
59
+ - [命令速查](./repoctl/commands.md)
60
+ - [校验链路](./repoctl/checks.md)
61
+ - [doctor 诊断](./repoctl/doctor.md)
62
+ - [配置文件](./repoctl/config.md)
63
+ - [模板与创建](./repoctl/templates.md)
64
+ - [模板资产治理](./repoctl/template-assets.md)
65
+ - [工作流与 CI](./repoctl/workflows.md)
66
+ - [报告与自动化输出](./repoctl/reports.md)
@@ -0,0 +1,50 @@
1
+ ---
2
+ description: repoctl 文档站的知识库入口,汇总 monorepo 管理、现代 npm 包和 JavaScript 模块化基础。
3
+ ---
4
+
5
+ # 知识库
6
+
7
+ 知识库用于解释 repoctl 背后的工程背景。这里不放命令速查,而是回答为什么要这样组织仓库、包、构建和发布流程。
8
+
9
+ ## 1. monorepo 主题
10
+
11
+ | 页面 | 适合解决的问题 |
12
+ | -------------------------------------------------- | ---------------------------------- |
13
+ | [为什么往 monorepo 方向演进](../monorepo/index.md) | 判断多包仓库是否值得合并管理 |
14
+ | [如何管理 monorepo](../monorepo/manage.md) | 理解 workspace、任务编排和依赖边界 |
15
+ | [发包与变更日志](../monorepo/publish.md) | 设计 pnpm intent、版本和发布链路 |
16
+ | [monorepo 命令参考](../monorepo/commands.md) | 查看通用 monorepo 操作命令 |
17
+ | [monorepo 模板体系](../monorepo/templates.md) | 理解模板如何减少重复初始化 |
18
+ | [monorepo 排障](../monorepo/troubleshooting.md) | 排查依赖、构建、类型和发布问题 |
19
+
20
+ ## 2. 现代 npm 包主题
21
+
22
+ | 页面 | 适合解决的问题 |
23
+ | ------------------------------------------------------ | ---------------------------------- |
24
+ | [如何复用 js 代码](../why/how-to-reuse-js-code.md) | 从复制文件演进到发布包 |
25
+ | [什么是 npm 包](../why/what-is-npm-package.md) | 理解 package.json、入口和安装方式 |
26
+ | [如何发布 npm 包](../why/publish-basic-npm-package.md) | 走通最小 npm 发布流程 |
27
+ | [改进并发布现代 npm 包](../why/index.md) | 把普通包升级成更规范的现代包 |
28
+ | [现代包指南](../why/modern/index.md) | 汇总类型、入口、模块格式和构建工具 |
29
+
30
+ ## 3. 阅读顺序
31
+
32
+ 如果你第一次接触 monorepo,建议按下面顺序阅读:
33
+
34
+ ```txt
35
+ 为什么 monorepo
36
+ -> 如何管理 monorepo
37
+ -> 什么是 npm 包
38
+ -> 现代包指南
39
+ -> 发包与变更日志
40
+ ```
41
+
42
+ 如果你已经在维护仓库,可以直接从具体问题进入:
43
+
44
+ | 你遇到的问题 | 建议入口 |
45
+ | ----------------------------- | ----------------------------------------------- |
46
+ | workspace 包互相引用不清楚 | [如何管理 monorepo](../monorepo/manage.md) |
47
+ | 不确定 CJS、ESM、types 怎么配 | [现代包指南](../why/modern/index.md) |
48
+ | 发布后使用方拿不到类型 | [类型声明](../why/modern/dts.md) |
49
+ | 包入口太多、导入路径混乱 | [包入口](../why/modern/package-entry-points.md) |
50
+ | CI 和发版流程容易漂移 | [发包与变更日志](../monorepo/publish.md) |
@@ -0,0 +1,21 @@
1
+ # 命令速查
2
+
3
+ repoctl 现在是这套文档的主线。完整命令说明请阅读:
4
+
5
+ - [repoctl 命令速查](../repoctl/commands.md)
6
+ - [repoctl 模板与创建](../repoctl/templates.md)
7
+ - [repoctl 排障与报告](../repoctl/troubleshooting.md)
8
+
9
+ ## monorepo 知识点:为什么要统一命令入口
10
+
11
+ monorepo 的难点通常不是“能不能跑某个工具”,而是团队成员是否能稳定地用同一套入口完成日常动作。
12
+
13
+ repoctl 把命令分成三层:
14
+
15
+ | 层级 | 示例 | 适合场景 |
16
+ | -------- | -------------------------------------------- | -------------------- |
17
+ | 根脚本 | `pnpm run repo:doctor` / `pnpm run repo:new` | 日常开发和团队教程 |
18
+ | 主 CLI | `pnpm exec repo doctor` | CI、脚本、排障和文档 |
19
+ | 分组命令 | `repo ws ls` / `repo env support` | 维护者和自动化 |
20
+
21
+ 保留这个旧页面,是为了让已有链接继续可用,同时把读者导向新的 repoctl 命令文档。
@@ -0,0 +1,115 @@
1
+ # 为什么往 monorepo 方向演进
2
+
3
+ 选择 monorepo,不是为了“更先进”,而是为了把多包协作里最常见的重复劳动砍掉。
4
+
5
+ 当你的仓库里同时存在应用、类库、CLI、文档站,或者多个团队要共享同一套类型、配置、脚手架时,monorepo 的收益会很快超过它的管理成本。
6
+
7
+ ## repoctl 面向的真实问题
8
+
9
+ ### 1. 依赖和脚本不再分散
10
+
11
+ 在 polyrepo 里,最常见的问题不是代码本身,而是:
12
+
13
+ - 每个仓库都要单独装依赖
14
+ - 每个仓库都维护一套 lint / typecheck / test 脚本
15
+ - 同样的工具链升级要重复做很多次
16
+ - 团队成员很难判断哪个仓库的规范才是“当前标准”
17
+
18
+ 在 monorepo 里,这些东西可以收敛到一个根目录。
19
+
20
+ ### 2. 跨包改动可以原子提交
21
+
22
+ 如果一个接口变更同时影响:
23
+
24
+ - `packages/types`
25
+ - `packages/sdk`
26
+ - `apps/web`
27
+ - `apps/server`
28
+
29
+ 那么在 monorepo 里,一次提交就能把它们一起改完、一起验证、一起回滚。对重构和版本审计都更友好。
30
+
31
+ ### 3. 构建与测试更容易增量化
32
+
33
+ `pnpm` 负责 workspace 依赖管理,`turborepo` 负责任务编排和缓存,结果就是:
34
+
35
+ - 没改动的包不需要重复构建
36
+ - CI 可以按依赖图只跑受影响任务
37
+ - 大仓库也能保持比较稳定的反馈速度
38
+
39
+ ## repoctl 的工程立场
40
+
41
+ 这不是一个“什么都能配”的框架,而是一套偏实战、偏收敛的默认值:
42
+
43
+ | 维度 | 默认选择 |
44
+ | -------- | --------------------------------------- |
45
+ | 包管理 | `pnpm workspace` |
46
+ | 任务编排 | `turborepo` |
47
+ | 语言 | TypeScript 优先 |
48
+ | 校验链路 | ESLint + Stylelint + typecheck + Vitest |
49
+ | 提交规范 | Husky + lint-staged + commitlint |
50
+ | 发包 | pnpm versioning |
51
+ | 命令入口 | `repo` 为主,`repoctl` 为完整包名入口 |
52
+
53
+ 这些选择的目的只有一个:减少“每个项目重新想一遍”的成本。
54
+
55
+ ## 什么时候适合用 monorepo
56
+
57
+ 下面这些情况,适合直接上:
58
+
59
+ - 你要同时维护多个 npm 包
60
+ - 你有前后端、CLI、文档站共用一套类型或工具
61
+ - 你希望升级脚本、工程化配置时一次同步全仓
62
+ - 你有持续重构、跨包联动改动的需求
63
+
64
+ 下面这些情况,不一定值得上:
65
+
66
+ - 只有一个很小的应用,没有共享代码需求
67
+ - 团队还没有接受统一规范的准备
68
+ - 构建链路本身还不稳定,先统一仓库只会放大问题
69
+
70
+ ## repoctl 提供的补位能力
71
+
72
+ 单纯有 monorepo 还不够,真正难的是“如何让它易用”。repoctl 补充了三层能力:
73
+
74
+ ### 1. 更短的日常命令
75
+
76
+ ```bash
77
+ pnpm exec repo init
78
+ pnpm exec repo doctor
79
+ pnpm run repo:new
80
+ pnpm run repo:check
81
+ ```
82
+
83
+ 不用先背完整 CLI,先把日常路径跑顺。
84
+
85
+ ### 2. `repo doctor` 这种面向新人的诊断命令
86
+
87
+ 它会直接回答这些问题:
88
+
89
+ - 你是不是站在仓库根目录
90
+ - `pnpm-workspace.yaml` 在不在
91
+ - Node 版本对不对
92
+ - 有没有安装 CLI 依赖
93
+ - 根脚本齐不齐
94
+ - 是否仍残留已废弃的 `monorepo.config.ts`
95
+ - Husky / lint-staged 链路是不是半残状态
96
+
97
+ ### 3. `repo upgrade` 这种面向存量仓库的同步命令
98
+
99
+ 当受管默认值变化时,你不需要手抄配置,只要选择性同步标准资产。
100
+
101
+ ## 实际收益通常体现在这里
102
+
103
+ | 场景 | Polyrepo 常见成本 | Monorepo 常见收益 |
104
+ | ------------ | ------------------ | ---------------------- |
105
+ | 工具链升级 | 多仓重复改配置 | 一次升级,多包受益 |
106
+ | 共享类型变更 | 多仓分别发版联调 | 一次改动,一次验证 |
107
+ | CI 反馈 | 每仓重复跑全量 | 利用缓存和依赖图做增量 |
108
+ | 新人接手 | 先理解多个仓库差异 | 先理解一套统一约定 |
109
+
110
+ ## 继续阅读
111
+
112
+ - [如何管理 monorepo](./manage.md)
113
+ - [命令速查](./commands.md)
114
+ - [排障指南](./troubleshooting.md)
115
+ - [发包与变更日志](./publish.md)
@@ -0,0 +1,243 @@
1
+ # 如何管理 monorepo
2
+
3
+ 这一页是 repoctl 文档后面的知识库页面。它不再重新解释所有命令参数,而是解释:为什么这些命令能让 monorepo 日常管理变简单。
4
+
5
+ 如果你只想查命令,直接看 [repoctl 工作流与 CI](../repoctl/workflows.md) 或 [repoctl 命令速查](../repoctl/commands.md)。
6
+
7
+ ## 先记住默认工作流
8
+
9
+ ```bash
10
+ pnpm install
11
+ pnpm exec repo doctor
12
+ pnpm run repo:new
13
+ pnpm run repo:check
14
+ pnpm build
15
+ ```
16
+
17
+ 大多数场景里,这已经够了。
18
+
19
+ 如果你在接入一个旧仓库,再多加一步:
20
+
21
+ ```bash
22
+ pnpm exec repo init
23
+ ```
24
+
25
+ 这个工作流背后的顺序是:
26
+
27
+ | 阶段 | 目标 |
28
+ | ---- | ------------------------------------------------ |
29
+ | 安装 | 让 workspace 依赖和本地包链接完整 |
30
+ | 诊断 | 先确认仓库结构、Node、脚本、配置和提交链路可用 |
31
+ | 创建 | 用模板生成新包,减少手写 package metadata 和配置 |
32
+ | 校验 | 在提交前复现默认 hook 和 workspace typecheck |
33
+ | 构建 | 最后再跑更重的全仓任务 |
34
+
35
+ ## 命令分层
36
+
37
+ repoctl 刻意把日常入口收敛到少量任务型命令。
38
+
39
+ ### 第一层:根脚本
40
+
41
+ 这是最推荐的入口:
42
+
43
+ ```bash
44
+ pnpm exec repo init
45
+ pnpm run repo:new
46
+ pnpm exec repo doctor
47
+ pnpm run repo:check
48
+ ```
49
+
50
+ 适合:
51
+
52
+ - 新人
53
+ - 日常开发
54
+ - 文档教程
55
+ - 团队内部统一约定
56
+
57
+ ### 第二层:主 CLI
58
+
59
+ 当你要明确告诉别人“这是 CLI 行为,不只是 package.json 脚本”时,用:
60
+
61
+ ```bash
62
+ pnpm exec repo init
63
+ pnpm exec repo new
64
+ pnpm exec repo doctor
65
+ pnpm exec repo check
66
+ pnpm exec repo upgrade
67
+ ```
68
+
69
+ ### 第三层:分组命令
70
+
71
+ 更细的高级操作保留在分组里:
72
+
73
+ ```bash
74
+ repo workspace upgrade
75
+ repo ws up
76
+ repo tooling init eslint vitest
77
+ repo tg init --all
78
+ repo skills sync --codex
79
+ repo ai prompt create --name checkout
80
+ ```
81
+
82
+ ## 日常任务对照表
83
+
84
+ | 你想做什么 | 推荐命令 | 说明 |
85
+ | ---------------------- | ------------------------------- | ---------------------------------------------------- |
86
+ | 初始化一个刚接入的仓库 | `pnpm exec repo init` | 同步推荐的仓库元信息和基础工程化配置 |
87
+ | 看仓库当前状态是否健康 | `pnpm exec repo doctor` | 先排根目录、Node、脚本、遗留配置、提交链路 |
88
+ | 创建一个新的包或应用 | `pnpm run repo:new` | 支持交互式选择,也支持 `-- --template` |
89
+ | 提交前做本地校验 | `pnpm run repo:check` | 默认对齐推荐 pre-commit / pre-push 逻辑 |
90
+ | 同步模板最新标准资产 | `pnpm exec repo upgrade` | 适合模板升级、老仓库补齐 |
91
+ | 清理演示仓库或非必要包 | `pnpm exec repo ws clean --yes` | 零安装也可以用 `pnpm dlx repo@latest ws clean --yes` |
92
+
93
+ ## `doctor`、`check`、`upgrade` 的边界
94
+
95
+ 这是最容易混淆的三个命令。
96
+
97
+ ### `doctor`
98
+
99
+ 偏“仓库体检”。
100
+
101
+ 它不关心你当前改了什么代码,而是关心:
102
+
103
+ - 这个仓库是不是完整
104
+ - 当前目录是不是根目录
105
+ - 当前机器的 Node 版本能不能跑
106
+ - 命令入口和配置文件是不是一致
107
+
108
+ ### `check`
109
+
110
+ 偏“提交前校验”。
111
+
112
+ 它更像一个人工触发的推荐检查入口,适合:
113
+
114
+ - 提交前自查
115
+ - 怀疑 lint / typecheck / hooks 有问题时快速复现
116
+ - 用 `repo check --dry-run`、`repo check --json --out reports/check-plan.json` 或 `repo check --markdown --redact --out reports/check-plan.md` 先确认校验路由
117
+
118
+ ### `upgrade`
119
+
120
+ 偏“模板资产同步”。
121
+
122
+ 它解决的是:
123
+
124
+ - 模板最新默认脚本要不要补进来
125
+ - 工作流、配置文件、GitHub 资产要不要同步
126
+ - 存量仓库要不要追上现在的标准
127
+
128
+ ## 配置推荐
129
+
130
+ 推荐只保留一个文件:
131
+
132
+ ```ts
133
+ // repoctl.config.ts
134
+ import { defineMonorepoConfig } from 'repoctl'
135
+
136
+ export default defineMonorepoConfig({
137
+ commands: {
138
+ create: {
139
+ defaultTemplate: 'tsdown',
140
+ },
141
+ clean: {
142
+ autoConfirm: true,
143
+ },
144
+ upgrade: {
145
+ skipOverwrite: true,
146
+ },
147
+ },
148
+ })
149
+ ```
150
+
151
+ 说明:
152
+
153
+ - 优先使用 `repoctl.config.ts`
154
+ - `monorepo.config.ts` 已不再加载
155
+ - 两者不能同时存在
156
+
157
+ 如果同时存在,现在 CLI 会直接报错,`repo doctor` 也会把它判成阻塞项。
158
+
159
+ ## `new` 的推荐用法
160
+
161
+ ### 交互式
162
+
163
+ ```bash
164
+ pnpm run repo:new
165
+ ```
166
+
167
+ 适合第一次使用模板、想先看看有哪些模板可选。
168
+
169
+ ### 直接指定模板
170
+
171
+ ```bash
172
+ pnpm exec repo new docs --template vitepress
173
+ pnpm exec repo new sdk --template tsdown
174
+ ```
175
+
176
+ 适合你已经明确知道要创建什么。
177
+
178
+ ### 固化团队默认模板
179
+
180
+ ```ts
181
+ import { defineMonorepoConfig } from 'repoctl'
182
+
183
+ export default defineMonorepoConfig({
184
+ commands: {
185
+ create: {
186
+ defaultTemplate: 'tsdown',
187
+ },
188
+ },
189
+ })
190
+ ```
191
+
192
+ 设置后:
193
+
194
+ ```bash
195
+ pnpm exec repo new utils
196
+ ```
197
+
198
+ 会直接按默认模板生成,不再额外询问模板类型。
199
+
200
+ ## 默认提交链路
201
+
202
+ 如果你保留模板默认生成的 `.husky` 与 `lint-staged.config.js`,通常会得到这条链路:
203
+
204
+ | 阶段 | 默认行为 |
205
+ | ------------ | ----------------------------------------------------------------------- |
206
+ | `pre-commit` | 聚焦 staged 文件运行 `stylelint`、`eslint`、workspace `typecheck` |
207
+ | `pre-push` | 运行整仓 `lint`、`typecheck`,再补跑受影响包的 `build` / `test` / `tsd` |
208
+
209
+ 这也是为什么:
210
+
211
+ - `pnpm exec repo doctor` 会检查 Husky 与 lint-staged 是否同时存在
212
+ - `pnpm run repo:check` 会成为最自然的人工入口
213
+
214
+ ## 依赖与构建建议
215
+
216
+ ```bash
217
+ pnpm install
218
+ pnpm up -rLi
219
+ pnpm build
220
+ pnpm test
221
+ ```
222
+
223
+ - `pnpm install`:统一安装 workspace 依赖
224
+ - `pnpm up -rLi`:交互式升级依赖
225
+ - `pnpm build` / `pnpm test`:让 Turborepo 帮你做任务编排与缓存
226
+
227
+ ## 工具层 API 什么时候用
228
+
229
+ 如果你只是要使用默认 CLI,不需要直接碰 `@icebreakers/monorepo/tooling`。
230
+
231
+ 只有下面两种情况建议直接使用:
232
+
233
+ - 你要在仓库里手写 tooling wrapper 配置
234
+ - 你在维护这套 CLI / 模板本身
235
+
236
+ 其余大多数团队,停留在 `repoctl.config.ts` 这一层就够了。
237
+
238
+ ## 继续阅读
239
+
240
+ - [repoctl 工作流与 CI](../repoctl/workflows.md)
241
+ - [repoctl 命令速查](../repoctl/commands.md)
242
+ - [repoctl 排障与报告](../repoctl/troubleshooting.md)
243
+ - [发包与变更日志](./publish.md)
@@ -0,0 +1,87 @@
1
+ # monorepo 发包与变更日志
2
+
3
+ repoctl 默认使用 pnpm 原生 versioning。它保留 Changesets 格式的变更意图,同时把版本计算、依赖传播、changelog 和发布收进 pnpm 本身。
4
+
5
+ ## 日常流程
6
+
7
+ 先完成质量校验,再记录变更:
8
+
9
+ ```bash
10
+ pnpm build
11
+ pnpm lint
12
+ pnpm typecheck
13
+ pnpm tsd
14
+ pnpm test
15
+ pnpm change
16
+ pnpm change status
17
+ ```
18
+
19
+ 变更意图文件放在 `.changeset/*.md`,描述受影响包和 patch/minor/major。不要手动修改包版本。
20
+
21
+ ## Release PR
22
+
23
+ main push 会运行:
24
+
25
+ ```bash
26
+ pnpm version -r --dry-run
27
+ pnpm version -r
28
+ ```
29
+
30
+ CI 将版本号、各包 `CHANGELOG.md` 和 `.changeset/ledger.yaml` 提交到 Release PR。合并 Release PR 后,下一次 main push 执行:
31
+
32
+ ```bash
33
+ pnpm publish -r --report-summary --provenance --no-git-checks
34
+ ```
35
+
36
+ pnpm 根据 registry 中已有的版本自动跳过已发布包。CI 读取 `pnpm-publish-summary.json` 创建 `package@version` tag 和 GitHub Release,发布操作可以安全重试。
37
+
38
+ ## Workspace versioning 配置
39
+
40
+ 根 `pnpm-workspace.yaml` 中的关键配置:
41
+
42
+ ```yaml
43
+ versioning:
44
+ fixed:
45
+ - ['@icebreakers/monorepo', repoctl]
46
+ ignore:
47
+ - '@icebreakers/client'
48
+ changelog:
49
+ storage: repository
50
+ ```
51
+
52
+ `fixed` 保证组内包同版本;`ignore` 排除 private 包;`repository` 让 changelog 作为源代码提交。
53
+
54
+ ## Prerelease lanes
55
+
56
+ 预发布使用 pnpm lanes:
57
+
58
+ ```bash
59
+ pnpm exec repo release pre enter beta
60
+ git add pnpm-workspace.yaml && git commit -m "chore(release): enter beta lane"
61
+ git push
62
+ pnpm exec repo release pre publish
63
+ ```
64
+
65
+ 预发布版本为 `X.Y.Z-beta.N`,并使用 npm `beta` dist-tag。退出时运行:
66
+
67
+ ```bash
68
+ pnpm exec repo release pre exit
69
+ git add pnpm-workspace.yaml && git commit -m "chore(release): exit prerelease lane"
70
+ ```
71
+
72
+ fixed group 必须整体切换 lane,不能只移动其中一个包。
73
+
74
+ ## 恢复未发布版本
75
+
76
+ 如果版本提交已合并但 npm 发布失败,在 Release workflow 手动选择 `publish-unpublished`,填入 package 和 version。CI 会校验 main 上的 manifest 版本,使用 pnpm 发布并重新生成 tag 和 GitHub Release 元数据。
77
+
78
+ ## repoctl 的边界
79
+
80
+ 生成的 GitHub Actions 只保留环境准备和一个 `pnpm exec repo release ci` 调用。
81
+ repoctl 负责发布前 build/lint/test、lane 一致性检查、Release PR、npm
82
+ 发布、package tag 与 GitHub Release;pnpm 负责变更意图、版本计算、changelog、
83
+ ledger 和 registry 发布细节。
84
+
85
+ 存量项目首次迁移运行 `pnpm dlx repoctl@latest upgrade --yes`,后续使用
86
+ `pnpm exec repo upgrade --yes` 即可跟随 repoctl 升级。未标记的自定义 release
87
+ workflow 默认不会被覆盖,确认后可使用 `repo upgrade --overwrite-release`。
@@ -0,0 +1,21 @@
1
+ # 模板速查
2
+
3
+ 模板创建已经收敛到 repoctl 文档:
4
+
5
+ - [repoctl 模板与创建](../repoctl/templates.md)
6
+ - [repoctl 快速开始](../repoctl/getting-started.md)
7
+
8
+ ## monorepo 知识点:模板为什么重要
9
+
10
+ 当仓库里存在多种产物时,模板能把重复选择前置成稳定默认值:
11
+
12
+ | 产物 | 常见目录 | 关注点 |
13
+ | ------------- | ------------------------ | ------------------------------ |
14
+ | TypeScript 库 | `packages/*` | exports、types、构建和 tsd |
15
+ | Vue 组件库 | `packages/*` | SFC、样式校验、类型声明 |
16
+ | 应用 | `apps/*` | dev、build、部署资产 |
17
+ | 服务 | `apps/*` | API 入口、运行时类型、环境变量 |
18
+ | 文档站 | `apps/*` | VitePress 配置、导航、内容结构 |
19
+ | CLI | `apps/*` 或 `packages/*` | bin 入口、参数解析、发布 |
20
+
21
+ repoctl 的 `repo templates` 和 `repo new` 负责把这些约定落实到文件系统。