zengen 0.1.35 → 0.1.36

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 (70) 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 +57 -0
  5. package/.zen/translations.json +51 -0
  6. package/dist/ai-client.d.ts +34 -0
  7. package/dist/ai-client.d.ts.map +1 -0
  8. package/dist/ai-client.js +180 -0
  9. package/dist/ai-client.js.map +1 -0
  10. package/dist/ai-processor.d.ts +51 -0
  11. package/dist/ai-processor.d.ts.map +1 -0
  12. package/dist/ai-processor.js +215 -0
  13. package/dist/ai-processor.js.map +1 -0
  14. package/dist/ai-service.d.ts +79 -0
  15. package/dist/ai-service.d.ts.map +1 -0
  16. package/dist/ai-service.js +257 -0
  17. package/dist/ai-service.js.map +1 -0
  18. package/dist/builder.d.ts +26 -2
  19. package/dist/builder.d.ts.map +1 -1
  20. package/dist/builder.js +420 -9
  21. package/dist/builder.js.map +1 -1
  22. package/dist/cli.js +45 -3
  23. package/dist/cli.js.map +1 -1
  24. package/dist/gitignore.d.ts +2 -1
  25. package/dist/gitignore.d.ts.map +1 -1
  26. package/dist/gitignore.js +21 -3
  27. package/dist/gitignore.js.map +1 -1
  28. package/dist/gitignore.test.js +82 -17
  29. package/dist/gitignore.test.js.map +1 -1
  30. package/dist/markdown.d.ts +6 -1
  31. package/dist/markdown.d.ts.map +1 -1
  32. package/dist/markdown.js +31 -9
  33. package/dist/markdown.js.map +1 -1
  34. package/dist/navigation.js +5 -5
  35. package/dist/navigation.js.map +1 -1
  36. package/dist/scanner.d.ts +26 -0
  37. package/dist/scanner.d.ts.map +1 -0
  38. package/dist/scanner.js +190 -0
  39. package/dist/scanner.js.map +1 -0
  40. package/dist/template.d.ts +6 -2
  41. package/dist/template.d.ts.map +1 -1
  42. package/dist/template.js +57 -8
  43. package/dist/template.js.map +1 -1
  44. package/dist/translation-service.d.ts +72 -0
  45. package/dist/translation-service.d.ts.map +1 -0
  46. package/dist/translation-service.js +291 -0
  47. package/dist/translation-service.js.map +1 -0
  48. package/dist/types.d.ts +35 -4
  49. package/dist/types.d.ts.map +1 -1
  50. package/docs/advanced-usage.md +39 -0
  51. package/docs/getting-started.md +26 -0
  52. package/docs/guides/best-practices.md +0 -113
  53. package/docs/guides/config.md +0 -233
  54. package/package.json +2 -1
  55. package/src/ai-client.ts +227 -0
  56. package/src/ai-processor.ts +243 -0
  57. package/src/ai-service.ts +281 -0
  58. package/src/builder.ts +543 -10
  59. package/src/cli.ts +49 -3
  60. package/src/gitignore.test.ts +82 -17
  61. package/src/gitignore.ts +23 -3
  62. package/src/markdown.ts +39 -11
  63. package/src/navigation.ts +5 -5
  64. package/src/scanner.ts +180 -0
  65. package/src/template.ts +68 -8
  66. package/src/translation-service.ts +350 -0
  67. package/src/types.ts +39 -3
  68. package/test-multilang.js +44 -0
  69. package/docs/ci/github-ci-cd.md +0 -127
  70. package/docs/guides/api.md +0 -277
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AIProcessor = void 0;
4
+ const ai_service_1 = require("./ai-service");
5
+ const ai_client_1 = require("./ai-client");
6
+ /**
7
+ * AI 处理器 - 集成到 Markdown 处理流程中
8
+ */
9
+ class AIProcessor {
10
+ constructor(config = {}) {
11
+ // 从配置和环境变量初始化 AI 服务
12
+ const aiConfig = {
13
+ enabled: config.ai?.enabled ?? true,
14
+ model: config.ai?.model,
15
+ temperature: config.ai?.temperature,
16
+ maxTokens: config.ai?.maxTokens,
17
+ };
18
+ this.aiService = new ai_service_1.AIService(aiConfig);
19
+ this.aiClient = new ai_client_1.AIClient(this.aiService);
20
+ this.enabled = this.aiService.isEnabled();
21
+ if (this.enabled) {
22
+ console.log('🤖 AI processor initialized and enabled');
23
+ console.log(` Model: ${this.aiService.getConfig().model}`);
24
+ console.log(` Base URL: ${this.aiService.getConfig().baseUrl}`);
25
+ }
26
+ else {
27
+ console.log('⚠️ AI processor initialized but disabled (no API key or explicitly disabled)');
28
+ }
29
+ }
30
+ /**
31
+ * 在解析前处理 - 这里我们提取 AI metadata
32
+ */
33
+ async beforeParse(content, fileInfo) {
34
+ if (!this.enabled) {
35
+ return content;
36
+ }
37
+ if (!fileInfo.hash) {
38
+ console.warn(`⚠️ Skipping AI processing for ${fileInfo.path}: file hash is missing`);
39
+ return content;
40
+ }
41
+ try {
42
+ // 检查缓存
43
+ const cachedMetadata = await this.aiService.getCachedMetadata(fileInfo.hash, fileInfo.path);
44
+ if (cachedMetadata) {
45
+ fileInfo.aiMetadata = cachedMetadata;
46
+ this.logMetadata(fileInfo.path, cachedMetadata);
47
+ return content;
48
+ }
49
+ // 调用 AI 提取 metadata
50
+ const metadata = await this.aiClient.extractMetadata(content, fileInfo.path);
51
+ if (metadata) {
52
+ fileInfo.aiMetadata = metadata;
53
+ // 缓存结果
54
+ await this.aiService.cacheMetadata(fileInfo.hash, fileInfo.path, metadata);
55
+ this.logMetadata(fileInfo.path, metadata);
56
+ }
57
+ }
58
+ catch (error) {
59
+ console.error(`❌ AI processor failed for ${fileInfo.path}:`, error);
60
+ }
61
+ return content;
62
+ }
63
+ /**
64
+ * 在解析后处理 - 这里可以添加 AI 增强的 HTML 内容
65
+ */
66
+ async afterParse(html, fileInfo) {
67
+ if (!this.enabled || !fileInfo.aiMetadata) {
68
+ return html;
69
+ }
70
+ try {
71
+ // 可以在这里添加 AI metadata 到 HTML 中
72
+ // 例如:添加 meta 标签或结构化数据
73
+ return this.enhanceHtmlWithMetadata(html, fileInfo);
74
+ }
75
+ catch (error) {
76
+ console.error(`❌ Failed to enhance HTML with AI metadata for ${fileInfo.path}:`, error);
77
+ return html;
78
+ }
79
+ }
80
+ /**
81
+ * 将 AI metadata 添加到 HTML 中
82
+ */
83
+ enhanceHtmlWithMetadata(html, fileInfo) {
84
+ const metadata = fileInfo.aiMetadata;
85
+ if (!metadata) {
86
+ return html;
87
+ }
88
+ // 在 head 部分添加 meta 标签
89
+ const metaTags = `
90
+ <!-- AI Generated Metadata -->
91
+ <meta name="ai-title" content="${this.escapeHtml(metadata.title)}">
92
+ <meta name="ai-summary" content="${this.escapeHtml(metadata.summary)}">
93
+ <meta name="ai-tags" content="${this.escapeHtml(metadata.tags.join(', '))}">
94
+ ${metadata.inferred_date ? `<meta name="ai-inferred-date" content="${metadata.inferred_date}">` : ''}
95
+ <meta name="ai-language" content="${metadata.inferred_lang}">
96
+ `;
97
+ // 在 body 开始处添加结构化数据
98
+ const structuredData = `
99
+ <!-- AI Structured Data -->
100
+ <script type="application/ld+json">
101
+ {
102
+ "@context": "https://schema.org",
103
+ "@type": "Article",
104
+ "headline": "${this.escapeJson(metadata.title)}",
105
+ "description": "${this.escapeJson(metadata.summary)}",
106
+ "keywords": "${this.escapeJson(metadata.tags.join(', '))}",
107
+ "inLanguage": "${metadata.inferred_lang}"
108
+ }
109
+ </script>
110
+ `;
111
+ // 插入 meta 标签到 head
112
+ const headEndIndex = html.indexOf('</head>');
113
+ if (headEndIndex !== -1) {
114
+ html = html.slice(0, headEndIndex) + metaTags + html.slice(headEndIndex);
115
+ }
116
+ // 插入结构化数据到 body 开始处
117
+ const bodyStartIndex = html.indexOf('<body');
118
+ if (bodyStartIndex !== -1) {
119
+ const bodyTagEndIndex = html.indexOf('>', bodyStartIndex) + 1;
120
+ html = html.slice(0, bodyTagEndIndex) + structuredData + html.slice(bodyTagEndIndex);
121
+ }
122
+ return html;
123
+ }
124
+ /**
125
+ * 转义 HTML 特殊字符
126
+ */
127
+ escapeHtml(text) {
128
+ return text
129
+ .replace(/&/g, '&amp;')
130
+ .replace(/</g, '&lt;')
131
+ .replace(/>/g, '&gt;')
132
+ .replace(/"/g, '&quot;')
133
+ .replace(/'/g, '&#039;');
134
+ }
135
+ /**
136
+ * 转义 JSON 字符串
137
+ */
138
+ escapeJson(text) {
139
+ return text
140
+ .replace(/\\/g, '\\\\')
141
+ .replace(/"/g, '\\"')
142
+ .replace(/\n/g, '\\n')
143
+ .replace(/\r/g, '\\r')
144
+ .replace(/\t/g, '\\t');
145
+ }
146
+ /**
147
+ * 记录 metadata 信息
148
+ */
149
+ logMetadata(filePath, metadata) {
150
+ console.log(`📊 AI metadata for ${filePath}:`);
151
+ console.log(` Title: ${metadata.title}`);
152
+ console.log(` Summary: ${metadata.summary.substring(0, 50)}...`);
153
+ console.log(` Tags: ${metadata.tags.join(', ')}`);
154
+ if (metadata.inferred_date) {
155
+ console.log(` Inferred Date: ${metadata.inferred_date}`);
156
+ }
157
+ console.log(` Language: ${metadata.inferred_lang}`);
158
+ }
159
+ /**
160
+ * 批量处理文件
161
+ */
162
+ async processBatch(files) {
163
+ if (!this.enabled) {
164
+ return;
165
+ }
166
+ console.log(`🤖 Processing ${files.length} files with AI...`);
167
+ const filesToProcess = files.filter(file => file.hash && !file.aiMetadata);
168
+ if (filesToProcess.length === 0) {
169
+ console.log('📚 All files already have AI metadata or no files to process');
170
+ return;
171
+ }
172
+ // 准备数据
173
+ const fileData = filesToProcess.map(file => ({
174
+ content: file.content,
175
+ path: file.path,
176
+ hash: file.hash,
177
+ }));
178
+ // 批量处理
179
+ const results = await this.aiClient.processFiles(fileData);
180
+ // 更新文件信息
181
+ for (const file of filesToProcess) {
182
+ const metadata = results.get(file.path);
183
+ if (metadata) {
184
+ file.aiMetadata = metadata;
185
+ }
186
+ }
187
+ console.log(`✅ AI processing completed for ${results.size} files`);
188
+ }
189
+ /**
190
+ * 清理缓存
191
+ */
192
+ async cleanupCache(maxAgeDays = 30) {
193
+ await this.aiService.cleanupCache(maxAgeDays);
194
+ }
195
+ /**
196
+ * 检查是否启用
197
+ */
198
+ isEnabled() {
199
+ return this.enabled;
200
+ }
201
+ /**
202
+ * 获取配置信息
203
+ */
204
+ getConfigInfo() {
205
+ const config = this.aiService.getConfig();
206
+ return `AI Processor Status: ${this.enabled ? 'Enabled' : 'Disabled'}
207
+ API Key: ${config.apiKey ? 'Set' : 'Not set'}
208
+ Base URL: ${config.baseUrl}
209
+ Model: ${config.model}
210
+ Temperature: ${config.temperature}
211
+ Max Tokens: ${config.maxTokens}`;
212
+ }
213
+ }
214
+ exports.AIProcessor = AIProcessor;
215
+ //# sourceMappingURL=ai-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-processor.js","sourceRoot":"","sources":["../src/ai-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { AIMetadata } from './types';
2
+ /**
3
+ * AI 服务配置
4
+ */
5
+ export interface AIConfig {
6
+ enabled: boolean;
7
+ apiKey: string;
8
+ baseUrl: string;
9
+ model: string;
10
+ temperature: number;
11
+ maxTokens: number;
12
+ }
13
+ /**
14
+ * 单个文件的元数据缓存项
15
+ */
16
+ export interface FileMetaData {
17
+ hash: string;
18
+ path: string;
19
+ metadata: AIMetadata;
20
+ lastUpdated: string;
21
+ }
22
+ /**
23
+ * .zen/meta.json 文件结构
24
+ */
25
+ export interface MetaDataStore {
26
+ version: string;
27
+ timestamp: string;
28
+ files: FileMetaData[];
29
+ }
30
+ /**
31
+ * AI 服务类
32
+ */
33
+ export declare class AIService {
34
+ private config;
35
+ private metaDataPath;
36
+ constructor(config?: Partial<AIConfig>);
37
+ /**
38
+ * 获取配置
39
+ */
40
+ getConfig(): AIConfig;
41
+ /**
42
+ * 检查是否启用 AI 功能
43
+ */
44
+ isEnabled(): boolean;
45
+ /**
46
+ * 加载 .zen/meta.json 文件
47
+ */
48
+ loadMetaData(): Promise<MetaDataStore>;
49
+ /**
50
+ * 保存 .zen/meta.json 文件
51
+ */
52
+ saveMetaData(metaData: MetaDataStore): Promise<void>;
53
+ /**
54
+ * 根据文件 hash 获取缓存的 metadata
55
+ */
56
+ getCachedMetadata(fileHash: string, filePath: string): Promise<AIMetadata | null>;
57
+ /**
58
+ * 缓存 metadata 到 .zen/meta.json
59
+ */
60
+ cacheMetadata(fileHash: string, filePath: string, metadata: AIMetadata): Promise<void>;
61
+ /**
62
+ * 清理过期的缓存
63
+ */
64
+ cleanupCache(maxAgeDays?: number): Promise<void>;
65
+ /**
66
+ * 移除孤儿条目(文件已删除但缓存仍存在)
67
+ * @param existingFilePaths 当前存在的文件路径列表
68
+ */
69
+ removeOrphanEntries(existingFilePaths: string[]): Promise<void>;
70
+ /**
71
+ * 计算文件内容的 hash
72
+ */
73
+ calculateFileHash(content: string): string;
74
+ /**
75
+ * 打印 tokens 使用情况
76
+ */
77
+ logTokenUsage(filePath: string, tokensUsed: AIMetadata['tokens_used']): void;
78
+ }
79
+ //# sourceMappingURL=ai-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-service.d.ts","sourceRoot":"","sources":["../src/ai-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAKrC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,GAAE,OAAO,CAAC,QAAQ,CAAM;IAoB1C;;OAEG;IACH,SAAS,IAAI,QAAQ;IAIrB;;OAEG;IACH,SAAS,IAAI,OAAO;IAUpB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC;IAe5C;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1D;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA6BvF;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAyD5F;;OAEG;IACG,YAAY,CAAC,UAAU,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1D;;;OAGG;IACG,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBrE;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI1C;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,aAAa,CAAC,GAAG,IAAI;CAU7E"}
@@ -0,0 +1,257 @@
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.AIService = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const crypto = __importStar(require("crypto"));
40
+ /**
41
+ * AI 服务类
42
+ */
43
+ class AIService {
44
+ constructor(config = {}) {
45
+ // 从环境变量读取配置
46
+ const apiKey = process.env.OPENAI_API_KEY || '';
47
+ const baseUrl = process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1';
48
+ // 配置优先级:构造函数参数 > 环境变量 > 默认值
49
+ const model = config.model || process.env.OPENAI_MODEL || 'gpt-3.5-turbo';
50
+ this.config = {
51
+ enabled: config.enabled ?? apiKey !== '',
52
+ apiKey,
53
+ baseUrl,
54
+ model,
55
+ temperature: 0, // 总是设置为 0,提取内容不需要随机性
56
+ maxTokens: config.maxTokens || 500,
57
+ };
58
+ this.metaDataPath = path.join(process.cwd(), '.zen', 'meta.json');
59
+ }
60
+ /**
61
+ * 获取配置
62
+ */
63
+ getConfig() {
64
+ return this.config;
65
+ }
66
+ /**
67
+ * 检查是否启用 AI 功能
68
+ */
69
+ isEnabled() {
70
+ const enabled = this.config.enabled && this.config.apiKey !== '';
71
+ if (!enabled && this.config.enabled) {
72
+ console.warn('⚠️ AI is enabled but API key is missing. Please set OPENAI_API_KEY environment variable.');
73
+ }
74
+ return enabled;
75
+ }
76
+ /**
77
+ * 加载 .zen/meta.json 文件
78
+ */
79
+ async loadMetaData() {
80
+ try {
81
+ await fs.access(this.metaDataPath);
82
+ const content = await fs.readFile(this.metaDataPath, 'utf-8');
83
+ return JSON.parse(content);
84
+ }
85
+ catch (error) {
86
+ // 如果文件不存在,返回空结构
87
+ return {
88
+ version: '1.0.0',
89
+ timestamp: new Date().toISOString(),
90
+ files: [],
91
+ };
92
+ }
93
+ }
94
+ /**
95
+ * 保存 .zen/meta.json 文件
96
+ */
97
+ async saveMetaData(metaData) {
98
+ // 确保 .zen 目录存在
99
+ const zenDir = path.dirname(this.metaDataPath);
100
+ await fs.mkdir(zenDir, { recursive: true });
101
+ // 更新时间戳
102
+ metaData.timestamp = new Date().toISOString();
103
+ // 保存文件
104
+ await fs.writeFile(this.metaDataPath, JSON.stringify(metaData, null, 2), 'utf-8');
105
+ }
106
+ /**
107
+ * 根据文件 hash 获取缓存的 metadata
108
+ */
109
+ async getCachedMetadata(fileHash, filePath) {
110
+ if (!this.isEnabled()) {
111
+ return null;
112
+ }
113
+ try {
114
+ const metaData = await this.loadMetaData();
115
+ const cachedFile = metaData.files.find(f => f.hash === fileHash);
116
+ if (cachedFile) {
117
+ if (cachedFile.path === filePath) {
118
+ // 完全匹配:hash 和 path 都相同
119
+ console.log(`📚 Using cached AI metadata for: ${filePath}`);
120
+ return cachedFile.metadata;
121
+ }
122
+ else {
123
+ // 文件移动情况:hash 相同但 path 不同
124
+ // 更新缓存中的 path 为最新路径
125
+ console.log(`🔄 File moved detected: ${cachedFile.path} -> ${filePath}`);
126
+ await this.cacheMetadata(fileHash, filePath, cachedFile.metadata);
127
+ return cachedFile.metadata;
128
+ }
129
+ }
130
+ }
131
+ catch (error) {
132
+ console.warn(`⚠️ Failed to load cached metadata:`, error);
133
+ }
134
+ return null;
135
+ }
136
+ /**
137
+ * 缓存 metadata 到 .zen/meta.json
138
+ */
139
+ async cacheMetadata(fileHash, filePath, metadata) {
140
+ if (!this.isEnabled()) {
141
+ return;
142
+ }
143
+ try {
144
+ const metaData = await this.loadMetaData();
145
+ // 查找是否已存在相同 hash 的缓存(文件移动情况)
146
+ const sameHashIndex = metaData.files.findIndex(f => f.hash === fileHash);
147
+ // 查找是否已存在相同 path 但不同 hash 的缓存(文件内容更新情况)
148
+ const samePathIndex = metaData.files.findIndex(f => f.path === filePath && f.hash !== fileHash);
149
+ if (sameHashIndex >= 0) {
150
+ // 文件移动情况:相同 hash 但 path 可能不同
151
+ // 更新现有缓存项的 path 和 metadata
152
+ metaData.files[sameHashIndex] = {
153
+ hash: fileHash,
154
+ path: filePath,
155
+ metadata,
156
+ lastUpdated: new Date().toISOString(),
157
+ };
158
+ // 如果存在相同 path 但不同 hash 的旧缓存项,删除它
159
+ if (samePathIndex >= 0 && samePathIndex !== sameHashIndex) {
160
+ metaData.files.splice(samePathIndex, 1);
161
+ }
162
+ }
163
+ else if (samePathIndex >= 0) {
164
+ // 文件内容更新情况:相同 path 但 hash 不同
165
+ // 删除旧的缓存项,添加新的
166
+ metaData.files.splice(samePathIndex, 1);
167
+ metaData.files.push({
168
+ hash: fileHash,
169
+ path: filePath,
170
+ metadata,
171
+ lastUpdated: new Date().toISOString(),
172
+ });
173
+ }
174
+ else {
175
+ // 全新的文件,添加新缓存
176
+ metaData.files.push({
177
+ hash: fileHash,
178
+ path: filePath,
179
+ metadata,
180
+ lastUpdated: new Date().toISOString(),
181
+ });
182
+ }
183
+ await this.saveMetaData(metaData);
184
+ console.log(`💾 Cached AI metadata for: ${filePath}`);
185
+ }
186
+ catch (error) {
187
+ console.warn(`⚠️ Failed to cache metadata:`, error);
188
+ }
189
+ }
190
+ /**
191
+ * 清理过期的缓存
192
+ */
193
+ async cleanupCache(maxAgeDays = 30) {
194
+ try {
195
+ const metaData = await this.loadMetaData();
196
+ const cutoffTime = Date.now() - maxAgeDays * 24 * 60 * 60 * 1000;
197
+ const originalCount = metaData.files.length;
198
+ // 过滤掉过期的缓存
199
+ metaData.files = metaData.files.filter(fileData => {
200
+ const fileTime = new Date(fileData.lastUpdated).getTime();
201
+ return fileTime >= cutoffTime;
202
+ });
203
+ const cleanedCount = originalCount - metaData.files.length;
204
+ if (cleanedCount > 0) {
205
+ await this.saveMetaData(metaData);
206
+ console.log(`🧹 Cleaned ${cleanedCount} expired AI metadata entries`);
207
+ }
208
+ }
209
+ catch (error) {
210
+ console.warn(`⚠️ Failed to cleanup cache:`, error);
211
+ }
212
+ }
213
+ /**
214
+ * 移除孤儿条目(文件已删除但缓存仍存在)
215
+ * @param existingFilePaths 当前存在的文件路径列表
216
+ */
217
+ async removeOrphanEntries(existingFilePaths) {
218
+ try {
219
+ const metaData = await this.loadMetaData();
220
+ const originalCount = metaData.files.length;
221
+ // 创建现有文件路径的 Set 用于快速查找
222
+ const existingPathsSet = new Set(existingFilePaths);
223
+ // 过滤掉文件已经不存在的缓存条目
224
+ metaData.files = metaData.files.filter(fileData => {
225
+ return existingPathsSet.has(fileData.path);
226
+ });
227
+ const removedCount = originalCount - metaData.files.length;
228
+ if (removedCount > 0) {
229
+ await this.saveMetaData(metaData);
230
+ console.log(`🗑️ Removed ${removedCount} orphan AI metadata entries`);
231
+ }
232
+ }
233
+ catch (error) {
234
+ console.warn(`⚠️ Failed to remove orphan entries:`, error);
235
+ }
236
+ }
237
+ /**
238
+ * 计算文件内容的 hash
239
+ */
240
+ calculateFileHash(content) {
241
+ return crypto.createHash('sha256').update(content).digest('hex');
242
+ }
243
+ /**
244
+ * 打印 tokens 使用情况
245
+ */
246
+ logTokenUsage(filePath, tokensUsed) {
247
+ if (!tokensUsed) {
248
+ return;
249
+ }
250
+ console.log(`🧮 Tokens usage for ${filePath}:`);
251
+ console.log(` Prompt: ${tokensUsed.prompt}`);
252
+ console.log(` Completion: ${tokensUsed.completion}`);
253
+ console.log(` Total: ${tokensUsed.total}`);
254
+ }
255
+ }
256
+ exports.AIService = AIService;
257
+ //# sourceMappingURL=ai-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-service.js","sourceRoot":"","sources":["../src/ai-service.ts"],"names":[],"mappings":"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"}
package/dist/builder.d.ts CHANGED
@@ -1,14 +1,33 @@
1
- import { BuildOptions, ZenConfig } from './types';
1
+ import { BuildOptions, ZenConfig, MultiLangBuildOptions } from './types';
2
2
  export declare class ZenBuilder {
3
3
  private markdownConverter;
4
4
  private templateEngine;
5
5
  private navigationGenerator;
6
+ private scanner;
7
+ private aiProcessor;
8
+ private translationService;
6
9
  private config;
7
10
  constructor(config?: ZenConfig);
8
11
  /**
9
12
  * 构建文档站点
10
13
  */
11
14
  build(options: BuildOptions): Promise<void>;
15
+ /**
16
+ * 多语言构建:基于 meta.json 构建多语言版本
17
+ */
18
+ buildMultiLang(options: MultiLangBuildOptions): Promise<void>;
19
+ /**
20
+ * 过滤有效的文件(移除 path 不存在的孤儿文件)
21
+ */
22
+ private filterValidFiles;
23
+ /**
24
+ * 为特定语言构建文件
25
+ */
26
+ private buildForLanguage;
27
+ /**
28
+ * 生成语言索引页面
29
+ */
30
+ private generateLanguageIndex;
12
31
  /**
13
32
  * 监听文件变化并自动重建
14
33
  */
@@ -39,8 +58,13 @@ export declare class ZenBuilder {
39
58
  */
40
59
  clean(outDir: string): Promise<void>;
41
60
  /**
42
- * 验证配置
61
+ * 存储母语文件到 .zen/src 目录
62
+ */
63
+ private storeNativeFiles;
64
+ /**
65
+ * 处理文件翻译
43
66
  */
67
+ private processTranslations;
44
68
  validateConfig(config: ZenConfig): string[];
45
69
  }
46
70
  //# sourceMappingURL=builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA4B,SAAS,EAAE,MAAM,SAAS,CAAC;AAW5E,qBAAa,UAAU;IACrB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,GAAE,SAAc;IAOlC;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAoGjD;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAqIjD;;OAEG;YACW,eAAe;IAsB7B;;OAEG;YACW,eAAe;IAU7B;;OAEG;YACW,sBAAsB;IAUpC;;OAEG;YACW,gBAAgB;IA6B9B;;;OAGG;YACW,wBAAwB;IAqEtC;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1C;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE;CAuB5C"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAGZ,SAAS,EAET,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAejB,qBAAa,UAAU;IACrB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,GAAE,SAAc;IAuBlC;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmKjD;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqGnE;;OAEG;YACW,gBAAgB;IAoB9B;;OAEG;YACW,gBAAgB;IAyI9B;;OAEG;YACW,qBAAqB;IAsEnC;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAqIjD;;OAEG;YACW,eAAe;IAsB7B;;OAEG;YACW,eAAe;IAU7B;;OAEG;YACW,sBAAsB;IAUpC;;OAEG;YACW,gBAAgB;IA6B9B;;;OAGG;YACW,wBAAwB;IAqEtC;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1C;;OAEG;YACW,gBAAgB;IAwC9B;;OAEG;YACW,mBAAmB;IAwCjC,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE;CAwC5C"}