zengen 0.1.35 → 0.2.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 (134) hide show
  1. package/.github/workflows/bump-version.yml +112 -0
  2. package/.github/workflows/ci.yml +2 -2
  3. package/.github/workflows/pages.yml +1 -7
  4. package/.zen/meta.json +155 -0
  5. package/.zen/src/en-US/01d04f7c17b4a541ead9d759d877b30b403e15b849182a49eb1f62bd29ecd18c.md +120 -0
  6. package/.zen/src/en-US/1b798c44a4f353e47296ca83d5905e37e6aba3e90bbd9bc3b3d34fc12059a2ca.md +75 -0
  7. package/.zen/src/en-US/1e96be58d76c60056b708eb5bd8b8b81d7b5845d9cfe0b879d85068a5f11df3a.md +189 -0
  8. package/.zen/src/en-US/5ec990146b35e00de2630559126ee07f7cdcddeb23b0e8cab3d85b4181353e26.md +53 -0
  9. package/.zen/src/en-US/6124ea88edec5bde737b26b21f71ecfeffe4e73151784856edf813ee231a4baa.md +11 -0
  10. package/.zen/src/en-US/80ae9bed74fc6348a7c1fe9f33e86b65f5d919169721f77bcf0e1bc29fbdb4f9.md +61 -0
  11. package/.zen/src/en-US/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md +41 -0
  12. package/.zen/src/en-US/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md +65 -0
  13. package/.zen/src/zh-Hans/01d04f7c17b4a541ead9d759d877b30b403e15b849182a49eb1f62bd29ecd18c.md +120 -0
  14. package/.zen/src/zh-Hans/1b798c44a4f353e47296ca83d5905e37e6aba3e90bbd9bc3b3d34fc12059a2ca.md +77 -0
  15. package/.zen/src/zh-Hans/1e96be58d76c60056b708eb5bd8b8b81d7b5845d9cfe0b879d85068a5f11df3a.md +189 -0
  16. package/.zen/src/zh-Hans/5ec990146b35e00de2630559126ee07f7cdcddeb23b0e8cab3d85b4181353e26.md +55 -0
  17. package/.zen/src/zh-Hans/6124ea88edec5bde737b26b21f71ecfeffe4e73151784856edf813ee231a4baa.md +1 -0
  18. package/.zen/src/zh-Hans/6ad8db715a1b60613fe934fefb29fa981ecad9b63145593accff144d73b44bde.md +175 -0
  19. package/.zen/src/zh-Hans/80ae9bed74fc6348a7c1fe9f33e86b65f5d919169721f77bcf0e1bc29fbdb4f9.md +63 -0
  20. package/.zen/src/zh-Hans/a1580f71c6c6c1ff4a314be72d410a8507af2f087d56360c7f5048d349c21953.md +48 -0
  21. package/.zen/src/zh-Hans/d49012f98c4367b34034063400e2f7826bf0615952210c82396920172d468e2c.md +107 -0
  22. package/.zen/src/zh-Hans/f0c2799126931ccd113a0c45b1e623870b0d4f4f400becf6dd877da8f1011517.md +41 -0
  23. package/.zen/src/zh-Hans/fdfca9b960d0eaa8b2b96fe988ead7481d2c0b16f66ebc94fb477139b4178cdc.md +65 -0
  24. package/assets/templates/default/layout.html +274 -0
  25. package/dist/ai/extractMetadataFromMarkdown.d.ts +8 -0
  26. package/dist/ai/extractMetadataFromMarkdown.d.ts.map +1 -0
  27. package/dist/ai/extractMetadataFromMarkdown.js +88 -0
  28. package/dist/ai/extractMetadataFromMarkdown.js.map +1 -0
  29. package/dist/ai/translateMarkdown.d.ts +8 -0
  30. package/dist/ai/translateMarkdown.d.ts.map +1 -0
  31. package/dist/ai/translateMarkdown.js +29 -0
  32. package/dist/ai/translateMarkdown.js.map +1 -0
  33. package/dist/build/pipeline.d.ts +6 -0
  34. package/dist/build/pipeline.d.ts.map +1 -0
  35. package/dist/build/pipeline.js +218 -0
  36. package/dist/build/pipeline.js.map +1 -0
  37. package/dist/cli.js +17 -83
  38. package/dist/cli.js.map +1 -1
  39. package/dist/findEntries.d.ts +10 -0
  40. package/dist/findEntries.d.ts.map +1 -0
  41. package/dist/findEntries.js +38 -0
  42. package/dist/findEntries.js.map +1 -0
  43. package/dist/index.d.ts +1 -32
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -35
  46. package/dist/index.js.map +1 -1
  47. package/dist/metadata.d.ts +14 -0
  48. package/dist/metadata.d.ts.map +1 -0
  49. package/dist/metadata.js +78 -0
  50. package/dist/metadata.js.map +1 -0
  51. package/dist/paths.d.ts +6 -0
  52. package/dist/paths.d.ts.map +1 -0
  53. package/dist/paths.js +10 -0
  54. package/dist/paths.js.map +1 -0
  55. package/dist/process/extractMetadataByAI.d.ts +5 -0
  56. package/dist/process/extractMetadataByAI.d.ts.map +1 -0
  57. package/dist/process/extractMetadataByAI.js +31 -0
  58. package/dist/process/extractMetadataByAI.js.map +1 -0
  59. package/dist/process/template.d.ts +5 -0
  60. package/dist/process/template.d.ts.map +1 -0
  61. package/dist/process/template.js +188 -0
  62. package/dist/process/template.js.map +1 -0
  63. package/dist/scan/files.d.ts +7 -0
  64. package/dist/scan/files.d.ts.map +1 -0
  65. package/dist/scan/files.js +54 -0
  66. package/dist/scan/files.js.map +1 -0
  67. package/dist/services/openai.d.ts +41 -0
  68. package/dist/services/openai.d.ts.map +1 -0
  69. package/dist/services/openai.js +54 -0
  70. package/dist/services/openai.js.map +1 -0
  71. package/dist/types.d.ts +26 -46
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/utils/convertMarkdownToHtml.d.ts +7 -0
  74. package/dist/utils/convertMarkdownToHtml.d.ts.map +1 -0
  75. package/dist/utils/convertMarkdownToHtml.js +39 -0
  76. package/dist/utils/convertMarkdownToHtml.js.map +1 -0
  77. package/dist/utils/frontmatter.d.ts +6 -0
  78. package/dist/utils/frontmatter.d.ts.map +1 -0
  79. package/dist/utils/frontmatter.js +22 -0
  80. package/dist/utils/frontmatter.js.map +1 -0
  81. package/docs/advanced-usage.md +39 -0
  82. package/docs/deployment/github-pages.md +1 -2
  83. package/docs/getting-started.md +26 -0
  84. package/docs/guides/best-practices.md +4 -117
  85. package/docs/guides/config.md +0 -238
  86. package/package.json +5 -2
  87. package/src/ai/extractMetadataFromMarkdown.ts +95 -0
  88. package/src/ai/translateMarkdown.ts +29 -0
  89. package/src/build/pipeline.ts +211 -0
  90. package/src/cli.ts +18 -94
  91. package/src/findEntries.ts +37 -0
  92. package/src/index.ts +1 -40
  93. package/src/metadata.ts +44 -0
  94. package/src/paths.ts +7 -0
  95. package/src/process/extractMetadataByAI.ts +29 -0
  96. package/src/process/template.ts +201 -0
  97. package/src/scan/files.ts +17 -0
  98. package/src/services/openai.ts +92 -0
  99. package/src/types.ts +29 -47
  100. package/src/utils/convertMarkdownToHtml.ts +32 -0
  101. package/src/utils/frontmatter.ts +18 -0
  102. package/test-multilang.js +44 -0
  103. package/dist/builder.d.ts +0 -46
  104. package/dist/builder.d.ts.map +0 -1
  105. package/dist/builder.js +0 -443
  106. package/dist/builder.js.map +0 -1
  107. package/dist/gitignore.d.ts +0 -40
  108. package/dist/gitignore.d.ts.map +0 -1
  109. package/dist/gitignore.js +0 -184
  110. package/dist/gitignore.js.map +0 -1
  111. package/dist/gitignore.test.d.ts +0 -2
  112. package/dist/gitignore.test.d.ts.map +0 -1
  113. package/dist/gitignore.test.js +0 -244
  114. package/dist/gitignore.test.js.map +0 -1
  115. package/dist/markdown.d.ts +0 -30
  116. package/dist/markdown.d.ts.map +0 -1
  117. package/dist/markdown.js +0 -199
  118. package/dist/markdown.js.map +0 -1
  119. package/dist/navigation.d.ts +0 -46
  120. package/dist/navigation.d.ts.map +0 -1
  121. package/dist/navigation.js +0 -196
  122. package/dist/navigation.js.map +0 -1
  123. package/dist/template.d.ts +0 -29
  124. package/dist/template.d.ts.map +0 -1
  125. package/dist/template.js +0 -385
  126. package/dist/template.js.map +0 -1
  127. package/docs/ci/github-ci-cd.md +0 -127
  128. package/docs/guides/api.md +0 -277
  129. package/src/builder.ts +0 -458
  130. package/src/gitignore.test.ts +0 -253
  131. package/src/gitignore.ts +0 -173
  132. package/src/markdown.ts +0 -184
  133. package/src/navigation.ts +0 -237
  134. package/src/template.ts +0 -365
package/dist/template.js DELETED
@@ -1,385 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.TemplateEngine = void 0;
37
- const fs = __importStar(require("fs/promises"));
38
- const path = __importStar(require("path"));
39
- class TemplateEngine {
40
- constructor() {
41
- this.defaultTemplate = `<!DOCTYPE html>
42
- <html lang="zh-CN">
43
- <head>
44
- <meta charset="UTF-8">
45
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
46
- <title>{{title}}</title>
47
- <style>
48
- * {
49
- margin: 0;
50
- padding: 0;
51
- box-sizing: border-box;
52
- }
53
-
54
- body {
55
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
56
- line-height: 1.6;
57
- color: #333;
58
- background: #f8f9fa;
59
- display: flex;
60
- min-height: 100vh;
61
- }
62
-
63
- .sidebar {
64
- width: 280px;
65
- background: #fff;
66
- border-right: 1px solid #e9ecef;
67
- padding: 2rem 1rem;
68
- overflow-y: auto;
69
- position: fixed;
70
- height: 100vh;
71
- left: 0;
72
- top: 0;
73
- }
74
-
75
- .sidebar-header {
76
- margin-bottom: 2rem;
77
- padding-bottom: 1rem;
78
- border-bottom: 1px solid #e9ecef;
79
- }
80
-
81
- .sidebar-header h1 {
82
- font-size: 1.5rem;
83
- font-weight: 600;
84
- color: #212529;
85
- }
86
-
87
- .sidebar-header p {
88
- color: #6c757d;
89
- font-size: 0.875rem;
90
- margin-top: 0.5rem;
91
- }
92
-
93
- .nav-list {
94
- list-style: none;
95
- }
96
-
97
- .nav-item {
98
- margin-bottom: 0.5rem;
99
- }
100
-
101
- .nav-link {
102
- display: block;
103
- padding: 0.5rem 1rem;
104
- color: #495057;
105
- text-decoration: none;
106
- border-radius: 4px;
107
- transition: all 0.2s;
108
- }
109
-
110
- .nav-link:hover {
111
- background: #e9ecef;
112
- color: #212529;
113
- }
114
-
115
- .nav-link.active {
116
- background: #007bff;
117
- color: white;
118
- }
119
-
120
- .nav-submenu {
121
- list-style: none;
122
- margin-left: 1rem;
123
- margin-top: 0.25rem;
124
- }
125
-
126
- .content {
127
- flex: 1;
128
- margin-left: 280px;
129
- padding: 3rem 4rem;
130
- max-width: 900px;
131
- }
132
-
133
- .content-header {
134
- margin-bottom: 2rem;
135
- padding-bottom: 1rem;
136
- border-bottom: 1px solid #e9ecef;
137
- }
138
-
139
- .content-header h1 {
140
- font-size: 2.5rem;
141
- font-weight: 700;
142
- color: #212529;
143
- margin-bottom: 0.5rem;
144
- }
145
-
146
- .content-header .meta {
147
- color: #6c757d;
148
- font-size: 0.875rem;
149
- }
150
-
151
- .content-body {
152
- font-size: 1.125rem;
153
- line-height: 1.8;
154
- }
155
-
156
- .content-body h1 {
157
- font-size: 2rem;
158
- margin: 2rem 0 1rem;
159
- color: #212529;
160
- }
161
-
162
- .content-body h2 {
163
- font-size: 1.75rem;
164
- margin: 1.75rem 0 0.875rem;
165
- color: #343a40;
166
- }
167
-
168
- .content-body h3 {
169
- font-size: 1.5rem;
170
- margin: 1.5rem 0 0.75rem;
171
- color: #495057;
172
- }
173
-
174
- .content-body p {
175
- margin: 1rem 0;
176
- }
177
-
178
- .content-body ul, .content-body ol {
179
- margin: 1rem 0 1rem 2rem;
180
- }
181
-
182
- .content-body li {
183
- margin: 0.5rem 0;
184
- }
185
-
186
- .content-body blockquote {
187
- border-left: 4px solid #007bff;
188
- padding: 0.5rem 1rem;
189
- margin: 1rem 0;
190
- background: #f8f9fa;
191
- color: #495057;
192
- }
193
-
194
- .content-body code {
195
- background: #f8f9fa;
196
- padding: 0.2rem 0.4rem;
197
- border-radius: 3px;
198
- font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
199
- font-size: 0.875em;
200
- }
201
-
202
- .content-body pre {
203
- background: #f8f9fa;
204
- padding: 1rem;
205
- border-radius: 6px;
206
- overflow-x: auto;
207
- margin: 1rem 0;
208
- }
209
-
210
- .content-body pre code {
211
- background: none;
212
- padding: 0;
213
- }
214
-
215
- .content-body table {
216
- width: 100%;
217
- border-collapse: collapse;
218
- margin: 1rem 0;
219
- }
220
-
221
- .content-body th, .content-body td {
222
- border: 1px solid #dee2e6;
223
- padding: 0.75rem;
224
- text-align: left;
225
- }
226
-
227
- .content-body th {
228
- background: #f8f9fa;
229
- font-weight: 600;
230
- }
231
-
232
- .content-body img {
233
- max-width: 100%;
234
- height: auto;
235
- border-radius: 6px;
236
- margin: 1rem 0;
237
- }
238
-
239
- .content-body a {
240
- color: #007bff;
241
- text-decoration: none;
242
- }
243
-
244
- .content-body a:hover {
245
- text-decoration: underline;
246
- }
247
-
248
- .footer {
249
- margin-top: 3rem;
250
- padding-top: 2rem;
251
- border-top: 1px solid #e9ecef;
252
- color: #6c757d;
253
- font-size: 0.875rem;
254
- text-align: center;
255
- }
256
-
257
- @media (max-width: 768px) {
258
- body {
259
- flex-direction: column;
260
- }
261
-
262
- .sidebar {
263
- width: 100%;
264
- height: auto;
265
- position: static;
266
- border-right: none;
267
- border-bottom: 1px solid #e9ecef;
268
- }
269
-
270
- .content {
271
- margin-left: 0;
272
- padding: 2rem;
273
- }
274
- }
275
- </style>
276
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/github.min.css">
277
- </head>
278
- <body>
279
- <nav class="sidebar">
280
- <div class="sidebar-header">
281
- <h1>ZEN Documentation</h1>
282
- <p>A minimalist Markdown documentation site builder</p>
283
- </div>
284
- {{navigation}}
285
- </nav>
286
-
287
- <main class="content">
288
- <header class="content-header">
289
- <h1>{{title}}</h1>
290
- </header>
291
-
292
- <article class="content-body">
293
- {{{content}}}
294
- </article>
295
-
296
- <footer class="footer">
297
- <p>Generated by <strong>ZEN</strong> • <a href="https://github.com/zccz14/ZEN" target="_blank">View on GitHub</a></p>
298
- </footer>
299
- </main>
300
-
301
- <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/highlight.min.js"></script>
302
- <script>hljs.highlightAll();</script>
303
- </body>
304
- </html>`;
305
- }
306
- /**
307
- * 生成导航 HTML
308
- */
309
- generateNavigationHtml(navigation, currentPath) {
310
- const renderItem = (item) => {
311
- const isActive = currentPath === item.path;
312
- const activeClass = isActive ? 'active' : '';
313
- let html = `<li class="nav-item">`;
314
- html += `<a href="${item.path}" class="nav-link ${activeClass}">${item.title}</a>`;
315
- if (item.children && item.children.length > 0) {
316
- html += `<ul class="nav-submenu">`;
317
- html += item.children.map(child => renderItem(child)).join('');
318
- html += `</ul>`;
319
- }
320
- html += `</li>`;
321
- return html;
322
- };
323
- return `<ul class="nav-list">${navigation.map(item => renderItem(item)).join('')}</ul>`;
324
- }
325
- /**
326
- * 简单的模板变量替换
327
- */
328
- renderTemplate(template, data) {
329
- let result = template;
330
- // 替换导航
331
- const navigationHtml = this.generateNavigationHtml(data.navigation, data.currentPath);
332
- result = result.replace('{{navigation}}', navigationHtml);
333
- // 替换其他变量 - 使用全局替换
334
- result = result.replace(/{{title}}/g, data.title || 'Untitled');
335
- result = result.replace(/{{{content}}}/g, data.content || '');
336
- return result;
337
- }
338
- /**
339
- * 渲染模板
340
- */
341
- async render(data, templatePath) {
342
- let template = this.defaultTemplate;
343
- if (templatePath) {
344
- try {
345
- template = await fs.readFile(templatePath, 'utf-8');
346
- }
347
- catch (error) {
348
- console.warn(`Failed to load custom template from ${templatePath}, using default template:`, error);
349
- }
350
- }
351
- return this.renderTemplate(template, data);
352
- }
353
- /**
354
- * 从文件信息生成模板数据
355
- */
356
- generateTemplateData(fileInfo, navigation) {
357
- return {
358
- title: fileInfo.metadata?.title || fileInfo.name, // 优先使用提取的标题,如果没有则使用文件名
359
- content: fileInfo.html || '',
360
- navigation,
361
- metadata: fileInfo.metadata,
362
- currentPath: `/${fileInfo.relativePath.replace(/\.md$/, '.html')}`,
363
- };
364
- }
365
- /**
366
- * 生成输出文件路径
367
- */
368
- getOutputPath(fileInfo, outDir) {
369
- const htmlFileName = `${fileInfo.name}.html`;
370
- const relativeDir = path.dirname(fileInfo.relativePath);
371
- return path.join(outDir, relativeDir, htmlFileName);
372
- }
373
- /**
374
- * 保存渲染结果到文件
375
- */
376
- async saveToFile(html, outputPath) {
377
- // 确保目录存在
378
- const dir = path.dirname(outputPath);
379
- await fs.mkdir(dir, { recursive: true });
380
- // 写入文件
381
- await fs.writeFile(outputPath, html, 'utf-8');
382
- }
383
- }
384
- exports.TemplateEngine = TemplateEngine;
385
- //# sourceMappingURL=template.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template.js","sourceRoot":"","sources":["../src/template.ts"],"names":[],"mappings":"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"}
@@ -1,127 +0,0 @@
1
- # GitHub CI/CD 配置指南
2
-
3
- 本文档描述了如何为 zengen 项目配置 GitHub Actions 进行可信发布。
4
-
5
- ## 概述
6
-
7
- 我们配置了三个 GitHub Actions workflows:
8
-
9
- 1. **CI** (`ci.yml`) - 代码质量检查和测试
10
- 2. **Version Management** (`version.yml`) - 版本管理和自动创建 Release
11
- 3. **Publish to npm** (`publish.yml`) - 可信发布到 npm registry
12
-
13
- ## 配置步骤
14
-
15
- ### 1. 设置 npm 认证令牌
16
-
17
- 由于 npm 经典令牌已被撤销,需要使用新的认证方式:
18
-
19
- #### 选项 A: 使用细粒度访问令牌(推荐)
20
-
21
- 1. 登录 [npmjs.com](https://www.npmjs.com)
22
- 2. 进入 Account Settings → Access Tokens
23
- 3. 点击 "Create New Token"
24
- 4. 选择 "Automation" 类型
25
- 5. 配置权限:
26
- - 读取和写入包
27
- - 绕过 2FA(用于自动化工作流)
28
- 6. 设置有效期(最长 90 天)
29
- 7. 复制生成的令牌
30
-
31
- #### 选项 B: 使用 OIDC 可信发布
32
-
33
- 1. 确保在 GitHub 仓库设置中启用了 OIDC
34
- 2. 配置 npm 以信任 GitHub Actions 的 OIDC 令牌
35
-
36
- ### 2. 配置 GitHub Actions 权限
37
-
38
- 确保仓库有以下权限设置:
39
-
40
- - Settings → Actions → General
41
- - Workflow permissions: 选择 "Read and write permissions"
42
- - 确保启用了 OIDC 支持
43
-
44
- **注意**:对于 npm OIDC 发布,不需要配置 `NPM_TOKEN` secret。GitHub Actions 会自动使用 OIDC 令牌进行认证。
45
-
46
- ## 工作流程
47
-
48
- ### CI 流程
49
-
50
- 1. 当有 push 到 main 分支或创建 PR 时触发
51
- 2. 在多个 Node.js 版本上运行测试
52
- 3. 执行代码质量检查
53
- 4. 构建包并验证
54
-
55
- ### 版本管理流程
56
-
57
- 1. 当 package.json 版本变更时触发
58
- 2. 自动创建 GitHub Release
59
- 3. 生成基于提交历史的 changelog
60
-
61
- ### 发布流程
62
-
63
- 1. 当创建 GitHub Release 时触发
64
- 2. 使用 OIDC 进行可信认证
65
- 3. 构建并发布到 npm
66
- 4. 生成来源证明(provenance)
67
-
68
- ## 手动发布
69
-
70
- 如果需要手动发布:
71
-
72
- 1. 更新 `package.json` 中的版本号
73
- 2. 提交并推送到 main 分支
74
- 3. 版本管理 workflow 会自动创建 Release
75
- 4. 发布 workflow 会自动发布到 npm
76
-
77
- 或者使用 workflow_dispatch:
78
-
79
- 1. 前往 Actions → Publish to npm
80
- 2. 点击 "Run workflow"
81
- 3. 选择分支并运行
82
-
83
- ## 安全注意事项
84
-
85
- 1. **令牌安全**:
86
- - 永远不要在代码中硬编码令牌
87
- - 使用 GitHub Secrets 存储敏感信息
88
- - 定期轮换令牌
89
-
90
- 2. **OIDC 优势**:
91
- - 消除长期令牌的管理
92
- - 自动化的短期会话令牌
93
- - 更好的安全审计
94
-
95
- 3. **来源证明**:
96
- - 使用 `--provenance` 标志发布
97
- - 验证包的构建环境和来源
98
- - 增加用户信任
99
-
100
- ## 故障排除
101
-
102
- ### 常见问题
103
-
104
- 1. **认证失败**:
105
- - 确保仓库启用了 OIDC 支持
106
- - 检查 workflow 中设置了 `permissions: id-token: write`
107
- - 验证 npm 版本是否支持 OIDC(需要 npm 9.0.0+)
108
-
109
- 2. **版本检测失败**:
110
- - 确保 `fetch-depth: 0` 以获取完整历史
111
- - 检查 package.json 格式是否正确
112
-
113
- 3. **构建失败**:
114
- - 检查 Node.js 版本兼容性
115
- - 验证 TypeScript 配置
116
- - 确保所有依赖项已安装
117
-
118
- ### 调试
119
-
120
- - 查看 GitHub Actions 日志
121
- - 启用调试日志:在仓库 Settings → Actions → Runner 中设置 secret `ACTIONS_STEP_DEBUG` 为 `true`
122
-
123
- ## 相关链接
124
-
125
- - [npm 认证变更公告](https://github.blog/changelog/2025-12-09-npm-classic-tokens-revoked-session-based-auth-and-cli-token-management-now-available/)
126
- - [GitHub Actions npm 发布文档](https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages)
127
- - [npm 可信发布文档](https://docs.npmjs.com/trusted-publishing-with-oidc)