@icebreakers/monorepo-templates 0.0.0

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 (201) hide show
  1. package/README.md +9 -0
  2. package/assets/.changeset/config.json +16 -0
  3. package/assets/.changeset/create-icebreaker-interactive.md +5 -0
  4. package/assets/.changeset/monorepo-templates-package.md +5 -0
  5. package/assets/.changeset/skills-sync-resources.md +5 -0
  6. package/assets/.dockerignore +44 -0
  7. package/assets/.editorconfig +12 -0
  8. package/assets/.gitattributes +218 -0
  9. package/assets/.github/FUNDING.yml +4 -0
  10. package/assets/.github/ISSUE_TEMPLATE/bug_report.yml +71 -0
  11. package/assets/.github/ISSUE_TEMPLATE/config.yml +17 -0
  12. package/assets/.github/workflows/ci.yml +62 -0
  13. package/assets/.github/workflows/release.yml +57 -0
  14. package/assets/.husky/commit-msg +4 -0
  15. package/assets/.husky/pre-commit +4 -0
  16. package/assets/.vscode/extensions.json +6 -0
  17. package/assets/.vscode/settings.json +172 -0
  18. package/assets/CODE_OF_CONDUCT.md +128 -0
  19. package/assets/CONTRIBUTING.md +3 -0
  20. package/assets/Dockerfile +27 -0
  21. package/assets/LICENSE +21 -0
  22. package/assets/SECURITY.md +21 -0
  23. package/assets/commitlint.config.ts +3 -0
  24. package/assets/eslint.config.js +7 -0
  25. package/assets/gitignore +38 -0
  26. package/assets/lint-staged.config.js +11 -0
  27. package/assets/monorepo.config.ts +22 -0
  28. package/assets/netlify.toml +14 -0
  29. package/assets/package.json +88 -0
  30. package/assets/pnpm-workspace.yaml +11 -0
  31. package/assets/renovate.json +28 -0
  32. package/assets/stylelint.config.js +3 -0
  33. package/assets/tsconfig.json +51 -0
  34. package/assets/turbo.json +74 -0
  35. package/assets/vitest.config.ts +123 -0
  36. package/assets-data.mjs +45 -0
  37. package/dist/index.d.mts +37 -0
  38. package/dist/index.mjs +287 -0
  39. package/package.json +51 -0
  40. package/skeleton/.editorconfig +12 -0
  41. package/skeleton/LICENSE +21 -0
  42. package/skeleton/commitlint.config.ts +3 -0
  43. package/skeleton/eslint.config.js +7 -0
  44. package/skeleton/gitignore +38 -0
  45. package/skeleton/lint-staged.config.js +11 -0
  46. package/skeleton/package.json +88 -0
  47. package/skeleton/pnpm-workspace.yaml +11 -0
  48. package/skeleton/renovate.json +28 -0
  49. package/skeleton/stylelint.config.js +3 -0
  50. package/skeleton/tsconfig.json +51 -0
  51. package/skeleton/turbo.json +74 -0
  52. package/skeleton/vitest.config.ts +123 -0
  53. package/template-data.mjs +10 -0
  54. package/templates/cli/bin/index.js +2 -0
  55. package/templates/cli/dev/index.ts +2 -0
  56. package/templates/cli/gitignore +2 -0
  57. package/templates/cli/package.json +35 -0
  58. package/templates/cli/src/cli.ts +4 -0
  59. package/templates/cli/src/index.ts +15 -0
  60. package/templates/cli/tsconfig.json +7 -0
  61. package/templates/cli/tsup.config.ts +13 -0
  62. package/templates/client/eslint.config.js +12 -0
  63. package/templates/client/gitignore +28 -0
  64. package/templates/client/index.html +13 -0
  65. package/templates/client/package.json +52 -0
  66. package/templates/client/public/vite.svg +1 -0
  67. package/templates/client/src/App.vue +11 -0
  68. package/templates/client/src/main.ts +16 -0
  69. package/templates/client/src/pages/index.vue +357 -0
  70. package/templates/client/src/query-keys.ts +4 -0
  71. package/templates/client/src/router/index.ts +13 -0
  72. package/templates/client/src/stores/i18n.ts +24 -0
  73. package/templates/client/src/stores/index.ts +15 -0
  74. package/templates/client/src/style.css +1 -0
  75. package/templates/client/src/trpc/index.ts +10 -0
  76. package/templates/client/src/vite-env.d.ts +2 -0
  77. package/templates/client/tsconfig.app.json +28 -0
  78. package/templates/client/tsconfig.json +8 -0
  79. package/templates/client/tsconfig.node.json +25 -0
  80. package/templates/client/tsconfig.worker.json +11 -0
  81. package/templates/client/vite.config.ts +57 -0
  82. package/templates/client/worker/app.ts +24 -0
  83. package/templates/client/worker/config.ts +1 -0
  84. package/templates/client/worker/fetch-entry.ts +5 -0
  85. package/templates/client/worker/node-entry.ts +13 -0
  86. package/templates/client/worker/trpc-router.ts +24 -0
  87. package/templates/client/wrangler.jsonc +24 -0
  88. package/templates/server/gitignore +2 -0
  89. package/templates/server/package.json +60 -0
  90. package/templates/server/src/app.ts +191 -0
  91. package/templates/server/src/config.ts +1 -0
  92. package/templates/server/src/fetch-entry.ts +5 -0
  93. package/templates/server/src/node-entry.ts +13 -0
  94. package/templates/server/test/index.test.ts +14 -0
  95. package/templates/server/tsconfig.json +24 -0
  96. package/templates/server/tsup.config.ts +13 -0
  97. package/templates/server/vitest.config.ts +15 -0
  98. package/templates/server/wrangler.jsonc +18 -0
  99. package/templates/tsdown/package.json +47 -0
  100. package/templates/tsdown/src/index.ts +5 -0
  101. package/templates/tsdown/test/index.test.ts +11 -0
  102. package/templates/tsdown/tsconfig.json +15 -0
  103. package/templates/tsdown/tsdown.config.ts +9 -0
  104. package/templates/tsdown/vitest.config.ts +15 -0
  105. package/templates/tsup/build.config.ts +24 -0
  106. package/templates/tsup/package.json +48 -0
  107. package/templates/tsup/src/index.ts +12 -0
  108. package/templates/tsup/test/index.test.ts +18 -0
  109. package/templates/tsup/tsconfig.json +15 -0
  110. package/templates/tsup/tsup.config.ts +18 -0
  111. package/templates/tsup/vitest.config.ts +15 -0
  112. package/templates/unbuild/build.config.ts +24 -0
  113. package/templates/unbuild/package.json +48 -0
  114. package/templates/unbuild/src/index.ts +9 -0
  115. package/templates/unbuild/src/utils.ts +3 -0
  116. package/templates/unbuild/test/index.test.ts +18 -0
  117. package/templates/unbuild/tsconfig.json +15 -0
  118. package/templates/unbuild/vitest.config.ts +15 -0
  119. package/templates/vitepress/.vitepress/config.ts +93 -0
  120. package/templates/vitepress/.vitepress/theme/index.ts +4 -0
  121. package/templates/vitepress/.vitepress/theme/tailwind.css +1 -0
  122. package/templates/vitepress/gitignore +1 -0
  123. package/templates/vitepress/index.md +127 -0
  124. package/templates/vitepress/monorepo/index.md +46 -0
  125. package/templates/vitepress/monorepo/manage.md +129 -0
  126. package/templates/vitepress/monorepo/publish.md +142 -0
  127. package/templates/vitepress/package.json +39 -0
  128. package/templates/vitepress/public/logo.jpg +0 -0
  129. package/templates/vitepress/thinking.md +88 -0
  130. package/templates/vitepress/tools/changeset.md +87 -0
  131. package/templates/vitepress/tools/husky.md +108 -0
  132. package/templates/vitepress/tools/lint-staged.md +79 -0
  133. package/templates/vitepress/tools/pnpm.md +101 -0
  134. package/templates/vitepress/tools/renovate.md +91 -0
  135. package/templates/vitepress/tools/turborepo.md +149 -0
  136. package/templates/vitepress/why/assets/npm-dt.svg +15 -0
  137. package/templates/vitepress/why/assets/npm-ts.svg +19 -0
  138. package/templates/vitepress/why/examples/0.npm-basic-package/index.js +10 -0
  139. package/templates/vitepress/why/examples/0.npm-basic-package/package.json +11 -0
  140. package/templates/vitepress/why/examples/1.npm-basic-package/index.cjs +12 -0
  141. package/templates/vitepress/why/examples/1.npm-basic-package/index.d.ts +1 -0
  142. package/templates/vitepress/why/examples/1.npm-basic-package/index.js +8 -0
  143. package/templates/vitepress/why/examples/1.npm-basic-package/package.json +19 -0
  144. package/templates/vitepress/why/examples/2.npm-basic-package/README.md +1 -0
  145. package/templates/vitepress/why/examples/2.npm-basic-package/package-lock.json +30 -0
  146. package/templates/vitepress/why/examples/2.npm-basic-package/package.json +35 -0
  147. package/templates/vitepress/why/examples/2.npm-basic-package/rename-ext.js +24 -0
  148. package/templates/vitepress/why/examples/2.npm-basic-package/src/index.ts +8 -0
  149. package/templates/vitepress/why/examples/2.npm-basic-package/tsconfig.cjs.json +8 -0
  150. package/templates/vitepress/why/examples/2.npm-basic-package/tsconfig.esm.json +7 -0
  151. package/templates/vitepress/why/examples/2.npm-basic-package/tsconfig.json +18 -0
  152. package/templates/vitepress/why/examples/3.npm-basic-package/README.md +1 -0
  153. package/templates/vitepress/why/examples/3.npm-basic-package/build.config.ts +24 -0
  154. package/templates/vitepress/why/examples/3.npm-basic-package/package-lock.json +3661 -0
  155. package/templates/vitepress/why/examples/3.npm-basic-package/package.json +32 -0
  156. package/templates/vitepress/why/examples/3.npm-basic-package/src/index.ts +8 -0
  157. package/templates/vitepress/why/examples/3.npm-basic-package/tsconfig.json +16 -0
  158. package/templates/vitepress/why/examples/3.npm-basic-package/tsup.config.ts +16 -0
  159. package/templates/vitepress/why/examples/usage-cjs/cjs.cjs +4 -0
  160. package/templates/vitepress/why/examples/usage-cjs/esm.mjs +4 -0
  161. package/templates/vitepress/why/examples/usage-cjs/index.js +12 -0
  162. package/templates/vitepress/why/examples/usage-cjs/package-lock.json +42 -0
  163. package/templates/vitepress/why/examples/usage-cjs/package.json +20 -0
  164. package/templates/vitepress/why/examples/usage-esm/cjs.cjs +4 -0
  165. package/templates/vitepress/why/examples/usage-esm/createRequire.js +7 -0
  166. package/templates/vitepress/why/examples/usage-esm/esm.mjs +4 -0
  167. package/templates/vitepress/why/examples/usage-esm/index.js +8 -0
  168. package/templates/vitepress/why/examples/usage-esm/package-lock.json +42 -0
  169. package/templates/vitepress/why/examples/usage-esm/package.json +21 -0
  170. package/templates/vitepress/why/how-to-reuse-js-code.md +250 -0
  171. package/templates/vitepress/why/index.md +1 -0
  172. package/templates/vitepress/why/js-cjs-mjs.md +99 -0
  173. package/templates/vitepress/why/js-keywords.md +132 -0
  174. package/templates/vitepress/why/modern/bundlers.md +79 -0
  175. package/templates/vitepress/why/modern/dts.md +93 -0
  176. package/templates/vitepress/why/modern/esm-vs-cjs.md +84 -0
  177. package/templates/vitepress/why/modern/index.md +55 -0
  178. package/templates/vitepress/why/modern/package-entry-points.md +128 -0
  179. package/templates/vitepress/why/modern/typescript.md +155 -0
  180. package/templates/vitepress/why/publish-basic-npm-package.md +146 -0
  181. package/templates/vitepress/why/what-is-npm-package.md +162 -0
  182. package/templates/vue-lib/eslint.config.js +12 -0
  183. package/templates/vue-lib/gitignore +1 -0
  184. package/templates/vue-lib/index.html +13 -0
  185. package/templates/vue-lib/lib/HelloWorld.vue +21 -0
  186. package/templates/vue-lib/lib/index.ts +3 -0
  187. package/templates/vue-lib/package.json +61 -0
  188. package/templates/vue-lib/src/App.vue +9 -0
  189. package/templates/vue-lib/src/main.ts +8 -0
  190. package/templates/vue-lib/src/pages/index.vue +7 -0
  191. package/templates/vue-lib/src/router/index.ts +11 -0
  192. package/templates/vue-lib/src/style.css +1 -0
  193. package/templates/vue-lib/src/vite-env.d.ts +2 -0
  194. package/templates/vue-lib/test/index.test.ts +13 -0
  195. package/templates/vue-lib/tsconfig.app.json +30 -0
  196. package/templates/vue-lib/tsconfig.json +14 -0
  197. package/templates/vue-lib/tsconfig.node.json +25 -0
  198. package/templates/vue-lib/tsconfig.test.json +40 -0
  199. package/templates/vue-lib/vite.config.ts +54 -0
  200. package/templates/vue-lib/vite.shared.config.ts +13 -0
  201. package/templates/vue-lib/vitest.config.ts +13 -0
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@icebreakers/unbuild-template",
3
+ "type": "module",
4
+ "version": "0.0.0",
5
+ "description": "unbuild package template",
6
+ "author": "ice breaker <1324318532@qq.com>",
7
+ "license": "ISC",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/sonofmagic/monorepo-template.git",
11
+ "directory": "templates/unbuild"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/sonofmagic/monorepo-template/issues"
15
+ },
16
+ "keywords": [],
17
+ "sideEffects": false,
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": {
22
+ "types": "./dist/index.d.mts",
23
+ "default": "./dist/index.mjs"
24
+ },
25
+ "require": {
26
+ "types": "./dist/index.d.cts",
27
+ "default": "./dist/index.cjs"
28
+ }
29
+ }
30
+ },
31
+ "main": "./dist/index.cjs",
32
+ "module": "./dist/index.mjs",
33
+ "types": "./dist/index.d.ts",
34
+ "files": [
35
+ "dist"
36
+ ],
37
+ "scripts": {
38
+ "dev": "unbuild --stub",
39
+ "build:watch": "unbuild --watch --sourcemap",
40
+ "build": "unbuild",
41
+ "test": "vitest run",
42
+ "test:dev": "vitest",
43
+ "release": "pnpm publish",
44
+ "lint": "eslint .",
45
+ "lint:fix": "eslint . --fix"
46
+ },
47
+ "publishConfig": {}
48
+ }
@@ -0,0 +1,9 @@
1
+ export function foo() {
2
+ return 'bar'
3
+ }
4
+
5
+ export function getDirname() {
6
+ return __dirname
7
+ }
8
+
9
+ export { format } from '@/utils'
@@ -0,0 +1,3 @@
1
+ export function format(str: string) {
2
+ return str.replaceAll(/[a-z]/g, s => s.toUpperCase())
3
+ }
@@ -0,0 +1,18 @@
1
+ import { foo, format, getDirname } from '@/index'
2
+
3
+ describe('index', () => {
4
+ it('foo bar', () => {
5
+ expect(foo()).toBe('bar')
6
+ })
7
+
8
+ it('format uppercases alphabetical characters', () => {
9
+ expect(format('abc-123')).toBe('ABC-123')
10
+ })
11
+
12
+ it('getDirname exposes template directory path', () => {
13
+ const dirname = getDirname()
14
+ expect(typeof dirname).toBe('string')
15
+ expect(dirname.length).toBeGreaterThan(0)
16
+ expect(dirname).toContain('unbuild')
17
+ })
18
+ })
@@ -0,0 +1,15 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "baseUrl": ".",
5
+ "paths": {
6
+ "@/*": [
7
+ "src/*"
8
+ ]
9
+ }
10
+ },
11
+ "include": [
12
+ "src",
13
+ "test"
14
+ ]
15
+ }
@@ -0,0 +1,15 @@
1
+ import path from 'node:path'
2
+ import { defineProject } from 'vitest/config'
3
+
4
+ export default defineProject({
5
+ test: {
6
+ alias: [
7
+ {
8
+ find: '@',
9
+ replacement: path.resolve(__dirname, './src'),
10
+ },
11
+ ],
12
+ globals: true,
13
+ testTimeout: 60_000,
14
+ },
15
+ })
@@ -0,0 +1,93 @@
1
+ import Tailwindcss from '@tailwindcss/vite'
2
+ import { defineConfig } from 'vitepress'
3
+ import { withMermaid } from 'vitepress-plugin-mermaid'
4
+ // https://vitepress.dev/reference/site-config
5
+ export default withMermaid(defineConfig({
6
+ outDir: '../../dist',
7
+ title: 'icebreaker\'s monorepo',
8
+ description: 'icebreaker\'s monorepo. upgrade your monorepo',
9
+ themeConfig: {
10
+ // https://vitepress.dev/reference/default-theme-config
11
+ nav: [
12
+ { text: '使用手册', link: '/' },
13
+ { text: '一些思考', link: '/thinking' },
14
+ ],
15
+ socialLinks: [
16
+ { icon: 'github', link: 'https://github.com/sonofmagic/monorepo-template' },
17
+ ],
18
+ outline: {
19
+ label: '目录',
20
+ level: [2, 3],
21
+ },
22
+ logo: '/logo.jpg',
23
+ sidebar: {
24
+ '/': [
25
+ { text: '使用手册', link: '/' },
26
+ { text: '一些思考', link: 'thinking' },
27
+ {
28
+ text: 'npm 发包',
29
+ base: '/why/',
30
+ items: [
31
+ { text: '如何复用 js 代码', link: '/how-to-reuse-js-code' },
32
+ { text: 'JS 文件的各种后缀', link: '/js-cjs-mjs' },
33
+ { text: 'CJS和ESM关键字/全局变量对比', link: '/js-keywords' },
34
+ { text: '什么是 npm 包', link: '/what-is-npm-package' },
35
+ { text: '如何发布 npm 包', link: '/publish-basic-npm-package' },
36
+ {
37
+ text: '改进并发布现代 npm 包',
38
+ link: 'index',
39
+ base: 'why/modern/',
40
+ items: [
41
+ { text: 'package entry points 字段', link: '/package-entry-points' },
42
+ { text: '添加 DTS', link: '/dts' },
43
+ { text: 'ESM vs CJS', link: '/esm-vs-cjs' },
44
+ { text: '使用 TypeScript', link: '/typescript' },
45
+ { text: '使用打包器', link: '/bundlers' },
46
+ ],
47
+ },
48
+ ],
49
+ },
50
+ {
51
+ text: 'Monorepo',
52
+ base: '/monorepo/',
53
+ items: [
54
+ { text: '为什么往 monorepo 方向演进', link: '/' },
55
+ { text: '如何管理 monorepo', link: '/manage' },
56
+ { text: 'monorepo 发包生成变更日志', link: '/publish' },
57
+ ],
58
+ },
59
+ {
60
+ text: '相关的工具',
61
+ base: '/tools/',
62
+ items: [
63
+ { text: 'pnpm', link: '/pnpm' },
64
+ { text: 'turborepo', link: '/turborepo' },
65
+ { text: 'changeset', link: '/changeset' },
66
+ { text: 'husky', link: '/husky' },
67
+ { text: 'lint-staged', link: '/lint-staged' },
68
+ { text: 'renovate', link: '/renovate' },
69
+ ],
70
+ },
71
+ ],
72
+ },
73
+ editLink: {
74
+ pattern: 'https://github.com/sonofmagic/monorepo-template/edit/main/apps/website/:path',
75
+ text: '为此页提供修改建议',
76
+ },
77
+ },
78
+ vite: {
79
+ plugins: [
80
+ // @ts-ignore
81
+ Tailwindcss(),
82
+ ],
83
+ // server: {
84
+ // hmr: {
85
+ // overlay: false,
86
+ // },
87
+ // },
88
+ },
89
+ mermaid: {
90
+
91
+ },
92
+ }),
93
+ )
@@ -0,0 +1,4 @@
1
+ import DefaultTheme from 'vitepress/theme'
2
+ import './tailwind.css'
3
+
4
+ export default DefaultTheme
@@ -0,0 +1 @@
1
+ @import 'tailwindcss';
@@ -0,0 +1 @@
1
+ .vitepress/cache
@@ -0,0 +1,127 @@
1
+ ---
2
+ layout: doc
3
+ ---
4
+
5
+ # icebreaker's monorepo 模板
6
+
7
+ 整套模板围绕 **pnpm + Turborepo + TypeScript** 打造,帮助团队快速落地一个可维护、可编排、可持续迭代的 `monorepo` 工程。这里我们把使用方式拆成几个核心模块,方便你按需查阅。
8
+
9
+ ## 核心能力
10
+
11
+ - **工作区管理**:`pnpm` workspace + Turborepo 任务编排,内置缓存和过滤能力。
12
+ - **全链路 TypeScript**:所有模板(应用、类库、CLI)均使用 TS,并自带基础测试脚手架(`vitest`)。
13
+ - **质量与规范**:集成 `eslint`、`stylelint`、`husky`、`commitlint`、`lint-staged`,开箱即用。
14
+ - **自动化发布**:`changesets` + GitHub Actions + Dockerfile 模板,实现语义化发版和部署。
15
+ - **命令行助手**:`@icebreakers/monorepo` CLI 提供创建、同步、升级、镜像等常用命令,可通过 `monorepo.config.ts` 自定义行为。
16
+
17
+ ## 快速上手
18
+
19
+ 1. **拉取模板**:[GitHub](https://github.com/sonofmagic/monorepo-template) 右上角 `Use this template`,或克隆源码。
20
+ 2. **安装依赖**:在 `pnpm-workspace.yaml` 所在目录执行 `pnpm install`(需要 Node.js ≥ 20,推荐 `npm i -g pnpm`)。
21
+ 3. **可选清理**:直接运行 `npx -y @icebreakers/monorepo@latest clean` 远程执行清理,移除演示包后再执行 `pnpm install`(避免依赖本地构建 `monorepo`);如已安装依赖,也可使用 `pnpm script:clean`。
22
+ 4. **初始化元数据**:`pnpm script:init` 会批量更新 `package.json`、`README.md` 等公共信息。
23
+
24
+ ## 仓库结构速览
25
+
26
+ | 目录 | 描述 |
27
+ | --------------------- | -------------------------------- |
28
+ | `templates/cli` | TypeScript 编写的 CLI 模板 |
29
+ | `templates/client` | Vue 3 + Vite 客户端示例 |
30
+ | `templates/server` | 基于 Hono 的服务端模板 |
31
+ | `templates/vitepress` | VitePress 文档站(即本网站源码) |
32
+ | `templates/tsup` | 使用 `tsup` 打包的库模板 |
33
+ | `templates/unbuild` | 使用 `unbuild` 打包的库模板 |
34
+ | `templates/vue-lib` | Vue 组件库模板 |
35
+ | `packages/monorepo` | CLI 及配置同步工具,支持独立升级 |
36
+
37
+ ## 常用脚本
38
+
39
+ | 命令 | 说明 |
40
+ | -------------------- | --------------------------------------------------- |
41
+ | `pnpm script:clean` | 清理演示仓库,保留最小模板 |
42
+ | `pnpm script:init` | 同步初始化 `package.json`、`README.md` 等基础信息 |
43
+ | `pnpm script:sync` | 使用 `cnpm` 同步所有包到 npmmirror(需预装 `cnpm`) |
44
+ | `pnpm script:mirror` | 为 VS Code 终端写入国内镜像环境变量 |
45
+
46
+ 更多脚本可在根目录 `package.json` 中查看,命令介绍详见 [工具区](./tools/turborepo.md)。
47
+
48
+ ## CLI 命令概览
49
+
50
+ ```bash
51
+ npx monorepo new # 创建子包/应用
52
+ npx -y @icebreakers/monorepo@latest clean # 远程清理已勾选的子项目,避免依赖本地构建
53
+ npx monorepo sync # 同步所有包到 npmmirror
54
+ npx monorepo mirror # 写入 VS Code 镜像配置
55
+ npx monorepo up # 从最新模板同步配置文件
56
+ npx monorepo ai create # 生成 Agentic 任务提示词模板(支持输出到文件,可用别名 ai new)
57
+ ```
58
+
59
+ 示例:`npx monorepo ai create -o agentic-task.md -f`,可直接生成 Markdown 模板并覆盖旧文件。默认会写入 `agentic/prompts/<timestamp>/prompt.md`,同时生成一个按时间排序的目录,并会提示你确认或修改目录名称,方便后续补充图片等素材;也可以用别名 `npx monorepo ai new`.
60
+
61
+ 多文件场景:
62
+
63
+ - `npx monorepo ai create --name checkout` 自动落盘到 `agentic/prompts/checkout.md`(默认目录可改)。
64
+ - `npx monorepo ai create --tasks agentic/tasks.json -f` 读取 JSON 数组批量生成,适合多人协作收口任务。
65
+
66
+ 所有命令都支持在 `monorepo.config.ts` 中覆写默认行为,例如新增模板、修改同步命令、跳过 README 初始化等。配置示例见下文和 [配置中心说明](./monorepo/manage.md#使用-monorepo-configts-定制命令行为)。
67
+
68
+ ## 自定义配置:`monorepo.config.ts`
69
+
70
+ ```ts
71
+ import { defineMonorepoConfig } from '@icebreakers/monorepo'
72
+
73
+ export default defineMonorepoConfig({
74
+ commands: {
75
+ ai: {
76
+ baseDir: 'agentic/custom-prompts',
77
+ format: 'json',
78
+ force: true,
79
+ tasksFile: 'agentic/tasks.json',
80
+ },
81
+ create: {
82
+ defaultTemplate: 'cli',
83
+ renameJson: true,
84
+ },
85
+ clean: {
86
+ autoConfirm: true,
87
+ ignorePackages: ['docs'],
88
+ },
89
+ upgrade: {
90
+ skipOverwrite: true,
91
+ targets: ['.github', 'monorepo.config.ts'],
92
+ },
93
+ },
94
+ })
95
+ ```
96
+
97
+ 更多可配置项详见 [管理指南](./monorepo/manage.md)。
98
+
99
+ ## 依赖与版本升级
100
+
101
+ ```bash
102
+ pnpm up -rLi
103
+ ```
104
+
105
+ - `-r`:递归遍历所有 workspace
106
+ - `-L`:升级到最新版本
107
+ - `-i`:交互式选择(推荐查看差异后再确认)
108
+
109
+ ## 自动化发布
110
+
111
+ 模板默认集成 [`changesets`](https://github.com/changesets/changesets) 与推荐的 GitHub Actions 工作流:
112
+
113
+ 1. 安装 [changeset-bot](https://github.com/apps/changeset-bot)。
114
+ 2. 在仓库设置中开启 `Actions` 的 `Read and write permissions` 并勾选允许创建 PR。
115
+ 3. 在 `Repository secrets` 中配置 `NPM_TOKEN`(若需要 Codecov 也可配置 `CODECOV_TOKEN`)。
116
+ 4. 运行 `pnpm changeset`、`pnpm changeset version`、`pnpm changeset publish` 完成发布;或交由 CI 自动执行。
117
+
118
+ 具体操作指南参见 [发包流程](./monorepo/publish.md)。
119
+
120
+ ## 更多资源
121
+
122
+ - [为什么选择 monorepo?](./monorepo/index.md)
123
+ - [pnpm workspaces 与 Turborepo 组合的优势](./monorepo/manage.md)
124
+ - [工具链介绍](./tools/turborepo.md)
125
+ - [常见思考与 FAQ](./thinking.md)
126
+
127
+ > 欢迎结合自己的业务场景对模板做进一步裁剪与扩展,建议在自定义后保留 `monorepo.config.ts` 以便集中管理命令默认值。
@@ -0,0 +1,46 @@
1
+ # 为什么选择 Monorepo?
2
+
3
+ 随着项目复杂度提升,Node.js 团队越来越倾向于把多套服务、组件库、CLI 工具放在同一个仓库里。Monorepo 的核心价值在于 **集中管理依赖与流程**,从而让重构、协作、发布都更高效。
4
+
5
+ ## Monorepo 的主要收益
6
+
7
+ | 维度 | 收益 |
8
+ | -------- | ------------------------------------------------------------------ |
9
+ | 依赖管理 | `pnpm` 等工具会共享缓存、避免重复安装;严格依赖隔离杜绝“幽灵依赖” |
10
+ | 构建效率 | 借助 Turborepo 的缓存与依赖图,仅构建真正改动的包,CI 时间显著降低 |
11
+ | 原子提交 | 一个提交即可跨多个模块同步改动,便于回滚与审计 |
12
+ | 协作体验 | 同一仓库统一配置、脚本与规范,减少跨项目跳转和环境差异 |
13
+ | 可复用性 | 公共库、UI 组件、工具函数在 workspace 内即可本地引用并共享 |
14
+
15
+ ## 与 Polyrepo 的对比
16
+
17
+ | Polyrepo 常见痛点 | Monorepo 的解决方式 |
18
+ | -------------------------------- | -------------------------------------------------- |
19
+ | 每个仓库单独装依赖、重复维护脚本 | Workspace 共享依赖与脚本,一次配置多处使用 |
20
+ | 同步多个仓库中的接口或配置 | 原子提交 + Turborepo 构建,修改一次即可全仓库生效 |
21
+ | CI/CD 配置分散、发布流程冗长 | 基于 changesets 和统一仓库配置快速搭建自动化流水线 |
22
+ | 大规模重构成本高 | 搜索范围集中,易于批量修改、验证与回滚 |
23
+
24
+ ## 常见落地场景
25
+
26
+ - **多端同仓**:Web、Server、CLI 共存,代码共享严格受控。
27
+ - **组件库/工具链**:公共 API 与内部应用一起维护,避免版本漂移。
28
+ - **微服务集成**:多个服务共享协议、类型定义,发布与部署流程统一。
29
+ - **巨石拆分**:将原有大型项目拆成多个 package,逐步抽象并复用。
30
+
31
+ ## 迁移建议
32
+
33
+ 1. **先集中依赖**:把最常见的公共依赖和脚本统一到根目录,利用 `pnpm workspace` 管理版本。
34
+ 2. **逐步迁移模块**:按照业务领域或团队边界迁移子模块,保留原 CI 作为兜底。
35
+ 3. **引入构建缓存**:配置 Turborepo,使用 `turbo run <task> --filter=<scope>` 控制任务范围。
36
+ 4. **接入 changesets**:在迁移过程中就开始记录版本与变更,养成可发布的节奏。
37
+ 5. **通过 monorepo.config.ts 定制命令**:按团队习惯调整 `create` 模板、`clean` 行为、`upgrade` 目标等,提高可维护性。
38
+
39
+ ## 进一步阅读
40
+
41
+ - [仓库管理实践](./manage.md) —— 如何将 pnpm + Turborepo + monorepo.config 协同使用。
42
+ - [发包与变更日志](./publish.md) —— 使用 changesets 管理版本、自动化发布。
43
+ - [工具专题](../tools/turborepo.md) —— 常用工具的配置与技巧。
44
+ - [常见思考](../thinking.md) —— 关于模块拆分、包结构的经验分享。
45
+
46
+ > Monorepo 不是银弹,但在需要大量复用、自动化、跨团队协作的场景下,它能显著提升工程效率。关键是配合合适的工具与规范,让拆分后的每个模块都有清晰的职责与边界。
@@ -0,0 +1,129 @@
1
+ # 如何管理 monorepo
2
+
3
+ 本节结合模板实践,总结一套围绕 **pnpm + Turborepo + monorepo.config** 的管理方法:从依赖安装、任务调度到命令覆写,帮助团队高效协作。
4
+
5
+ ## 基础设施速览
6
+
7
+ | 能力 | 工具 | 要点 |
8
+ | -------------- | -------------------- | --------------------------------------------------------------------------- |
9
+ | Workspace 管理 | `pnpm` | 内容寻址、硬链接,安装速度快、占用小;严格依赖隔离杜绝“幽灵依赖” |
10
+ | 任务编排 | `turborepo` | 基于依赖图调度任务,支持并行与缓存,`turbo run build --filter=...` 精准执行 |
11
+ | 命令自定义 | `monorepo.config.ts` | 使用 `c12` 加载,可对 create/clean/sync/upgrade/init/mirror 覆写默认行为 |
12
+
13
+ ## 日常操作流程
14
+
15
+ ### 1. 管理依赖
16
+
17
+ ```bash
18
+ # 安装/更新
19
+ pnpm install
20
+ pnpm up -rLi
21
+
22
+ # 查看依赖图
23
+ pnpm ls --depth 2
24
+ ```
25
+
26
+ - `pnpm install` 自动按 workspace 复用依赖。
27
+ - `pnpm up -rLi` 交互式升级所有包,`-L` 为最新版本,`-i` 逐项确认。
28
+
29
+ ### 2. 调度构建与测试
30
+
31
+ ```bash
32
+ # 全量构建 / 测试
33
+ pnpm build
34
+ pnpm test
35
+
36
+ # 只构建受影响的包
37
+ pnpm build --filter={templates/client}
38
+
39
+ # 观察执行计划
40
+ pnpm exec turbo run build --dry=json | jq '.'
41
+ ```
42
+
43
+ Turborepo 会缓存任务输出:
44
+
45
+ | 构建场景 | 全量(首次) | 增量(未改动) |
46
+ | -------------- | ------------ | -------------- |
47
+ | 传统脚本 | 120s | 120s |
48
+ | Turbo 本地缓存 | 120s | **≈5s** |
49
+ | Turbo 远程缓存 | 120s | **≈2s** |
50
+
51
+ > 建议在 CI 中启用远程缓存(Vercel/Turbo Cloud 或自建存储)进一步缩短时间。
52
+
53
+ ### 3. 自定义命令行为
54
+
55
+ 使用 `defineMonorepoConfig` 即可集中覆写:
56
+
57
+ ```ts
58
+ import { defineMonorepoConfig } from '@icebreakers/monorepo'
59
+
60
+ export default defineMonorepoConfig({
61
+ commands: {
62
+ create: {
63
+ templatesDir: './custom-templates',
64
+ templateMap: {
65
+ 'cloud-function': {
66
+ source: 'functions/cloud',
67
+ target: 'apps/functions/cloud',
68
+ },
69
+ },
70
+ choices: [
71
+ { value: 'cli', name: 'CLI 模板' },
72
+ { value: 'cloud-function', name: '云函数模板' },
73
+ ],
74
+ },
75
+ sync: {
76
+ command: 'cnpm sync {name}',
77
+ concurrency: 4,
78
+ },
79
+ clean: {
80
+ autoConfirm: true,
81
+ pinnedVersion: '^2.0.0',
82
+ },
83
+ },
84
+ })
85
+ ```
86
+
87
+ 常用配置项:
88
+
89
+ | 命令 | 可覆盖字段 | 说明 |
90
+ | --------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
91
+ | `create` | `templatesDir` / `templateMap` / `choices` / `defaultTemplate` | 扩展模板来源、修改提示内容 |
92
+ | `clean` | `autoConfirm` / `ignorePackages` / `includePrivate` / `pinnedVersion` | 控制交互、过滤包、锁定依赖版本 |
93
+ | `sync` | `concurrency` / `command` / `packages` | 定义同步命令与并发度 |
94
+ | `upgrade` | `targets` / `mergeTargets` / `scripts` / `skipChangesetMarkdown` / `skipOverwrite` | 改写配置同步策略 |
95
+ | `init` | `skipReadme` / `skipPkgJson` / `skipChangeset` | 按需跳过初始化步骤 |
96
+ | `mirror` | `env` | 注入镜像环境变量 |
97
+ | `ai` | `output` / `format` / `force` / `baseDir` / `tasksFile` | 预设 Agentic 模板输出目录、格式与批量任务,默认写入 `agentic/prompts/<timestamp>/prompt.md` |
98
+
99
+ 更多细节可参考 CLI 命令文档或源码中的 `commands/*`。
100
+
101
+ ### 4. 依赖升级 / 配置同步
102
+
103
+ ```bash
104
+ npx monorepo up # 使用本地 CLI
105
+ npx @icebreakers/monorepo@latest up # 直接使用远端 CLI
106
+
107
+ # 常用参数
108
+ # -c, --core 仅同步核心配置,排除 GitHub 相关文件
109
+ # -i 以交互方式筛选文件
110
+ # -s 跳过新增,仅覆盖已存在文件
111
+ ```
112
+
113
+ 升级 CLI 后再执行 `up`,可以同步获得模板最新的工作流、脚手架与配置。
114
+
115
+ ## 常见问题与建议
116
+
117
+ - **依赖冲突**:使用 `pnpm why <pkg>` 定位冲突来源,优先升级上游依赖或将共享依赖提升到顶层。
118
+ - **缓存命中率低**:确认是否使用了 `turbo run <task> --filter` 以及 `dependsOn` 配置是否准确,必要时开启远程缓存。
119
+ - **CI 时间长**:结合 `pnpm fetch` 预拉取依赖,配合 `turbo` 缓存,通常能把 pipeline 压缩到原来的 1/3。
120
+ - **命令行为差异**:将所有自定义行为写入 `monorepo.config.ts`,避免脚本散落多处难以维护。
121
+
122
+ ## 进一步阅读
123
+
124
+ - [为什么越来越多团队迁移到 monorepo?](./index.md)
125
+ - [changesets 发包指南](./publish.md)
126
+ - [工具篇:pnpm、Turborepo、Changesets 等](../tools/turborepo.md)
127
+ - [常见思考与实践](../thinking.md)
128
+
129
+ > 小提示:在迁移现有项目时,可以先把最常变的模块放进 monorepo,再逐步收拢其它仓库,配合 `monorepo.config.ts` 就能实现平滑衔接。
@@ -0,0 +1,142 @@
1
+ # monorepo 发包与变更日志
2
+
3
+ 本模板推荐使用 [`changesets`](https://github.com/changesets/changesets) 管理版本、生成 `CHANGELOG` 并发布 npm 包。它针对 monorepo 场景设计,维护活跃,易于与 CI/CD 集成。
4
+
5
+ ## 为什么选 changesets?
6
+
7
+ | 场景 | changesets 能力 |
8
+ | ------------ | ------------------------------------------------------------- |
9
+ | 精确记录改动 | 每次变更生成独立的 changeset 文件,说明影响的包与语义版本类型 |
10
+ | 自动生成日志 | 基于 changeset 内容生成结构化的 `CHANGELOG.md` |
11
+ | 语义化版本 | 支持 `major` / `minor` / `patch`,并处理依赖联动升级 |
12
+ | 自动化发布 | 可在 CI 中自动创建版本 PR 或直接发布到 npm |
13
+
14
+ ## 推荐流程
15
+
16
+ > 以下命令默认在仓库根目录执行。
17
+
18
+ ### 1. 初始化
19
+
20
+ ```bash
21
+ pnpm add -D @changesets/cli
22
+ pnpm changeset init
23
+ ```
24
+
25
+ 生成 `.changeset/` 目录,用于存放配置与变更记录。
26
+
27
+ ### 2. 记录变更
28
+
29
+ ```bash
30
+ pnpm changeset
31
+ ```
32
+
33
+ 按照提示:
34
+
35
+ 1. 选择受影响的包。
36
+ 2. 指定版本类型(`patch` / `minor` / `major`)。
37
+ 3. 填写 changelog 描述。
38
+
39
+ 示例输出:
40
+
41
+ ```md
42
+ ---
43
+ "@my/utils": minor
44
+ "@my/ui": patch
45
+ ---
46
+
47
+ - feat(utils): 新增时间处理工具
48
+ - fix(ui): 修复按钮颜色
49
+ ```
50
+
51
+ ### 3. 升级版本并生成 changelog
52
+
53
+ ```bash
54
+ pnpm changeset version
55
+ ```
56
+
57
+ 命令会自动:
58
+
59
+ - 更新受影响包的 `package.json` 版本。
60
+ - 调整内部依赖引用。
61
+ - 为每个包写入或追加 `CHANGELOG.md`。
62
+
63
+ ### 4. 发布到 npm
64
+
65
+ ```bash
66
+ pnpm changeset publish
67
+ ```
68
+
69
+ changesets 会只发布有改动的包,并按照依赖顺序执行。
70
+
71
+ ### 5. GitHub Actions 自动化(可选)
72
+
73
+ 结合 `changesets/action` 实现自动创建发布 PR 或直接发布:
74
+
75
+ ```yaml
76
+ name: Release
77
+
78
+ on:
79
+ push:
80
+ branches:
81
+ - main
82
+ workflow_dispatch:
83
+
84
+ permissions:
85
+ contents: write
86
+ pull-requests: write
87
+ issues: write
88
+ id-token: write
89
+
90
+ env:
91
+ HUSKY: 0
92
+
93
+ jobs:
94
+ release:
95
+ runs-on: ubuntu-latest
96
+ steps:
97
+ - uses: actions/checkout@v4
98
+ - uses: pnpm/action-setup@v4
99
+ - uses: actions/setup-node@v4
100
+ with:
101
+ # 这是为了使用新版本的 npm, 只有 npm@11.5.x 以上版本才支持 OIDC
102
+ # 否则你就必须使用 npm i -g npm@latest 来升级 npm 版本
103
+ node-version: 24
104
+ cache: pnpm
105
+ registry-url: https://registry.npmjs.org
106
+ - run: pnpm install
107
+ - name: Create Release Pull Request or Publish to npm
108
+ uses: changesets/action@v1
109
+ with:
110
+ publish: pnpm publish-packages
111
+ env:
112
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
113
+ # npm/action-oidc-auth 会设置 NODE_AUTH_TOKEN 供 publish 使用
114
+ ```
115
+
116
+ `pnpm publish-packages` 为模板内脚本,可替换为自定义构建+发布流程。
117
+
118
+ > 说明:npm 现行 token 默认 90 天过期,推荐在 CI 中使用 OIDC(如上)动态获取 `NODE_AUTH_TOKEN`,无需手动传入 `NPM_TOKEN`。若使用自托管或其他 CI,需要确保工作流具备 `id-token: write` 权限。
119
+
120
+ ## 与其他方案对比
121
+
122
+ | 能力 / 工具 | changesets | lerna 经典模式 | 手写脚本 |
123
+ | -------------- | ---------- | -------------- | -------- |
124
+ | 支持多包 | ✅ | ✅ | ❌ |
125
+ | 自动 changelog | ✅ | 部分支持 | ❌ |
126
+ | 逐条记录变更 | ✅ | ❌ | ❌ |
127
+ | 维护活跃度 | 高 | 低 | 需自养 |
128
+ | CI/CD 集成 | 简单 | 相对繁琐 | 完全手工 |
129
+
130
+ ## 常见问题 FAQ
131
+
132
+ - **是否可与 `monorepo.config.ts` 联动?** 配置文件主要用于 CLI 行为定制,发布流程仍由 changesets 主导,两者互不冲突。
133
+ - **为何 `CHANGELOG` 没生成?** 确认是否执行了 `pnpm changeset version` 并提交了 `.changeset` 文件。
134
+ - **如何避免发布某些包?** 在创建 changeset 时不勾选即可,或将包标记为 `private: true`。
135
+
136
+ ## 相关资源
137
+
138
+ - [changesets 官方文档](https://github.com/changesets/changesets)
139
+ - [模板中的发布工作流示例](https://github.com/sonofmagic/monorepo-template/blob/main/.github/workflows/release.yml)
140
+ - [管理指南:pnpm + Turborepo + monorepo.config](./manage.md)
141
+
142
+ > 小提示:在 PR 合并前先执行 `pnpm changeset version` 并提交结果,可以在代码审查阶段提前暴露发布影响,避免遗漏。