openfeel 1.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 (196) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +140 -0
  3. package/README.md +17 -0
  4. package/README.zh-CN.md +140 -0
  5. package/bin/openfeel.js +13 -0
  6. package/dist/cli/index.d.ts +11 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +119 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli/repl.d.ts +10 -0
  11. package/dist/cli/repl.d.ts.map +1 -0
  12. package/dist/cli/repl.js +74 -0
  13. package/dist/cli/repl.js.map +1 -0
  14. package/dist/commands/archive.d.ts +7 -0
  15. package/dist/commands/archive.d.ts.map +1 -0
  16. package/dist/commands/archive.js +38 -0
  17. package/dist/commands/archive.js.map +1 -0
  18. package/dist/commands/config.d.ts +15 -0
  19. package/dist/commands/config.d.ts.map +1 -0
  20. package/dist/commands/config.js +208 -0
  21. package/dist/commands/config.js.map +1 -0
  22. package/dist/commands/flow.d.ts +24 -0
  23. package/dist/commands/flow.d.ts.map +1 -0
  24. package/dist/commands/flow.js +1024 -0
  25. package/dist/commands/flow.js.map +1 -0
  26. package/dist/commands/init.d.ts +9 -0
  27. package/dist/commands/init.d.ts.map +1 -0
  28. package/dist/commands/init.js +62 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/instructions.d.ts +7 -0
  31. package/dist/commands/instructions.d.ts.map +1 -0
  32. package/dist/commands/instructions.js +36 -0
  33. package/dist/commands/instructions.js.map +1 -0
  34. package/dist/commands/knowledge.d.ts +7 -0
  35. package/dist/commands/knowledge.d.ts.map +1 -0
  36. package/dist/commands/knowledge.js +174 -0
  37. package/dist/commands/knowledge.js.map +1 -0
  38. package/dist/commands/lint.d.ts +12 -0
  39. package/dist/commands/lint.d.ts.map +1 -0
  40. package/dist/commands/lint.js +192 -0
  41. package/dist/commands/lint.js.map +1 -0
  42. package/dist/commands/plan.d.ts +7 -0
  43. package/dist/commands/plan.d.ts.map +1 -0
  44. package/dist/commands/plan.js +73 -0
  45. package/dist/commands/plan.js.map +1 -0
  46. package/dist/commands/project.d.ts +7 -0
  47. package/dist/commands/project.d.ts.map +1 -0
  48. package/dist/commands/project.js +189 -0
  49. package/dist/commands/project.js.map +1 -0
  50. package/dist/commands/roadmap.d.ts +7 -0
  51. package/dist/commands/roadmap.d.ts.map +1 -0
  52. package/dist/commands/roadmap.js +26 -0
  53. package/dist/commands/roadmap.js.map +1 -0
  54. package/dist/commands/stage.d.ts +17 -0
  55. package/dist/commands/stage.d.ts.map +1 -0
  56. package/dist/commands/stage.js +291 -0
  57. package/dist/commands/stage.js.map +1 -0
  58. package/dist/commands/update.d.ts +8 -0
  59. package/dist/commands/update.d.ts.map +1 -0
  60. package/dist/commands/update.js +87 -0
  61. package/dist/commands/update.js.map +1 -0
  62. package/dist/commands/view.d.ts +7 -0
  63. package/dist/commands/view.d.ts.map +1 -0
  64. package/dist/commands/view.js +77 -0
  65. package/dist/commands/view.js.map +1 -0
  66. package/dist/core/archive/merge.d.ts +20 -0
  67. package/dist/core/archive/merge.d.ts.map +1 -0
  68. package/dist/core/archive/merge.js +118 -0
  69. package/dist/core/archive/merge.js.map +1 -0
  70. package/dist/core/artifact-graph/graph.d.ts +62 -0
  71. package/dist/core/artifact-graph/graph.d.ts.map +1 -0
  72. package/dist/core/artifact-graph/graph.js +184 -0
  73. package/dist/core/artifact-graph/graph.js.map +1 -0
  74. package/dist/core/artifact-graph/index.d.ts +10 -0
  75. package/dist/core/artifact-graph/index.d.ts.map +1 -0
  76. package/dist/core/artifact-graph/index.js +8 -0
  77. package/dist/core/artifact-graph/index.js.map +1 -0
  78. package/dist/core/artifact-graph/instruction-loader.d.ts +35 -0
  79. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
  80. package/dist/core/artifact-graph/instruction-loader.js +358 -0
  81. package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
  82. package/dist/core/artifact-graph/resolver.d.ts +10 -0
  83. package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
  84. package/dist/core/artifact-graph/resolver.js +32 -0
  85. package/dist/core/artifact-graph/resolver.js.map +1 -0
  86. package/dist/core/artifact-graph/state.d.ts +9 -0
  87. package/dist/core/artifact-graph/state.d.ts.map +1 -0
  88. package/dist/core/artifact-graph/state.js +24 -0
  89. package/dist/core/artifact-graph/state.js.map +1 -0
  90. package/dist/core/artifact-graph/types.d.ts +22 -0
  91. package/dist/core/artifact-graph/types.d.ts.map +1 -0
  92. package/dist/core/artifact-graph/types.js +2 -0
  93. package/dist/core/artifact-graph/types.js.map +1 -0
  94. package/dist/core/config.d.ts +256 -0
  95. package/dist/core/config.d.ts.map +1 -0
  96. package/dist/core/config.js +393 -0
  97. package/dist/core/config.js.map +1 -0
  98. package/dist/core/flow-manager.d.ts +492 -0
  99. package/dist/core/flow-manager.d.ts.map +1 -0
  100. package/dist/core/flow-manager.js +2379 -0
  101. package/dist/core/flow-manager.js.map +1 -0
  102. package/dist/core/i18n-data/en.d.ts +26 -0
  103. package/dist/core/i18n-data/en.d.ts.map +1 -0
  104. package/dist/core/i18n-data/en.js +492 -0
  105. package/dist/core/i18n-data/en.js.map +1 -0
  106. package/dist/core/i18n-data/types.d.ts +18 -0
  107. package/dist/core/i18n-data/types.d.ts.map +1 -0
  108. package/dist/core/i18n-data/types.js +8 -0
  109. package/dist/core/i18n-data/types.js.map +1 -0
  110. package/dist/core/i18n-data/zh-CN.d.ts +28 -0
  111. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -0
  112. package/dist/core/i18n-data/zh-CN.js +524 -0
  113. package/dist/core/i18n-data/zh-CN.js.map +1 -0
  114. package/dist/core/i18n.d.ts +40 -0
  115. package/dist/core/i18n.d.ts.map +1 -0
  116. package/dist/core/i18n.js +135 -0
  117. package/dist/core/i18n.js.map +1 -0
  118. package/dist/core/init.d.ts +22 -0
  119. package/dist/core/init.d.ts.map +1 -0
  120. package/dist/core/init.js +292 -0
  121. package/dist/core/init.js.map +1 -0
  122. package/dist/core/metrics.d.ts +60 -0
  123. package/dist/core/metrics.d.ts.map +1 -0
  124. package/dist/core/metrics.js +137 -0
  125. package/dist/core/metrics.js.map +1 -0
  126. package/dist/core/pipeline-schema.d.ts +78 -0
  127. package/dist/core/pipeline-schema.d.ts.map +1 -0
  128. package/dist/core/pipeline-schema.js +57 -0
  129. package/dist/core/pipeline-schema.js.map +1 -0
  130. package/dist/core/plan/roadmap.d.ts +17 -0
  131. package/dist/core/plan/roadmap.d.ts.map +1 -0
  132. package/dist/core/plan/roadmap.js +71 -0
  133. package/dist/core/plan/roadmap.js.map +1 -0
  134. package/dist/core/plan/scheme.d.ts +34 -0
  135. package/dist/core/plan/scheme.d.ts.map +1 -0
  136. package/dist/core/plan/scheme.js +262 -0
  137. package/dist/core/plan/scheme.js.map +1 -0
  138. package/dist/core/plan/stage.d.ts +20 -0
  139. package/dist/core/plan/stage.d.ts.map +1 -0
  140. package/dist/core/plan/stage.js +120 -0
  141. package/dist/core/plan/stage.js.map +1 -0
  142. package/dist/core/public-logger.d.ts +84 -0
  143. package/dist/core/public-logger.d.ts.map +1 -0
  144. package/dist/core/public-logger.js +344 -0
  145. package/dist/core/public-logger.js.map +1 -0
  146. package/dist/core/schema.d.ts +70 -0
  147. package/dist/core/schema.d.ts.map +1 -0
  148. package/dist/core/schema.js +61 -0
  149. package/dist/core/schema.js.map +1 -0
  150. package/dist/core/template-loader.d.ts +22 -0
  151. package/dist/core/template-loader.d.ts.map +1 -0
  152. package/dist/core/template-loader.js +2848 -0
  153. package/dist/core/template-loader.js.map +1 -0
  154. package/dist/core/templates.d.ts +18 -0
  155. package/dist/core/templates.d.ts.map +1 -0
  156. package/dist/core/templates.js +50 -0
  157. package/dist/core/templates.js.map +1 -0
  158. package/dist/core/update.d.ts +40 -0
  159. package/dist/core/update.d.ts.map +1 -0
  160. package/dist/core/update.js +1569 -0
  161. package/dist/core/update.js.map +1 -0
  162. package/dist/core/view/entry.d.ts +37 -0
  163. package/dist/core/view/entry.d.ts.map +1 -0
  164. package/dist/core/view/entry.js +108 -0
  165. package/dist/core/view/entry.js.map +1 -0
  166. package/dist/core/workspace/identity.d.ts +60 -0
  167. package/dist/core/workspace/identity.d.ts.map +1 -0
  168. package/dist/core/workspace/identity.js +169 -0
  169. package/dist/core/workspace/identity.js.map +1 -0
  170. package/dist/core/workspace/knowledge.d.ts +55 -0
  171. package/dist/core/workspace/knowledge.d.ts.map +1 -0
  172. package/dist/core/workspace/knowledge.js +230 -0
  173. package/dist/core/workspace/knowledge.js.map +1 -0
  174. package/dist/core/workspace/structure.d.ts +9 -0
  175. package/dist/core/workspace/structure.d.ts.map +1 -0
  176. package/dist/core/workspace/structure.js +59 -0
  177. package/dist/core/workspace/structure.js.map +1 -0
  178. package/dist/index.d.ts +7 -0
  179. package/dist/index.d.ts.map +1 -0
  180. package/dist/index.js +7 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/utils/kb-dedup.d.ts +46 -0
  183. package/dist/utils/kb-dedup.d.ts.map +1 -0
  184. package/dist/utils/kb-dedup.js +169 -0
  185. package/dist/utils/kb-dedup.js.map +1 -0
  186. package/dist/utils/path.d.ts +22 -0
  187. package/dist/utils/path.d.ts.map +1 -0
  188. package/dist/utils/path.js +37 -0
  189. package/dist/utils/path.js.map +1 -0
  190. package/package.json +61 -0
  191. package/schemas/spec-driven/schema.yaml +50 -0
  192. package/schemas/spec-driven/templates/design.md +43 -0
  193. package/schemas/spec-driven/templates/plan.md +46 -0
  194. package/schemas/spec-driven/templates/proposal.md +35 -0
  195. package/schemas/spec-driven/templates/tasks.md +39 -0
  196. package/scripts/patch-inquirer.js +70 -0
@@ -0,0 +1,344 @@
1
+ /**
2
+ * PublicLogger — 公共日志写入模块
3
+ * 负责将团队级重要事件写入 .openfeel/log/ 公共日志目录,
4
+ * 实现完整的审计追踪链。
5
+ *
6
+ * 写入规则(符合 AGENTS.md 定义的「日志目录」规范):
7
+ * - 写入路径:.openfeel/log/{yyyy}/{MM}/{dd}/{date}-{username}-{NNN}.md
8
+ * - NNN 为当日 3 位递增序号(001, 002, ...),基于当日已有日志文件数 + 1
9
+ * - 自动维护 day_index.md(每日索引)、根级 index.md + log.md
10
+ * - 异步乐观:写入失败仅 console.warn,不阻塞流水线推进
11
+ */
12
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync } from 'node:fs';
13
+ import { resolve } from 'node:path';
14
+ /**
15
+ * PublicLogger 单例类
16
+ * 负责写入公共日志并维护索引文件。
17
+ * 构造时从 .openfeel/.info.json 加载用户名。
18
+ */
19
+ export class PublicLogger {
20
+ static instance = null;
21
+ projectPath;
22
+ username;
23
+ constructor(projectPath) {
24
+ this.projectPath = projectPath;
25
+ this.username = this.loadUsername();
26
+ }
27
+ /**
28
+ * 获取或创建 PublicLogger 单例
29
+ * @param projectPath 项目根路径
30
+ */
31
+ static getInstance(projectPath) {
32
+ if (!PublicLogger.instance) {
33
+ PublicLogger.instance = new PublicLogger(projectPath);
34
+ }
35
+ return PublicLogger.instance;
36
+ }
37
+ /**
38
+ * 重置单例(仅供测试使用)
39
+ */
40
+ static resetInstance() {
41
+ PublicLogger.instance = null;
42
+ }
43
+ // ── 公开方法 ──
44
+ /**
45
+ * 记录状态变更事件(advancePhase / recordAttempt)
46
+ * @param detail 变更详情
47
+ */
48
+ logPhaseChange(detail) {
49
+ this.writeLog('状态变更', detail);
50
+ }
51
+ /**
52
+ * 记录审查事件(addReview / addAutoFixReview)
53
+ * @param detail 审查详情
54
+ */
55
+ logReviewEvent(detail) {
56
+ this.writeLog('审查事件', detail);
57
+ }
58
+ /**
59
+ * 记录测试事件
60
+ * @param detail 测试详情
61
+ */
62
+ logTestEvent(detail) {
63
+ this.writeLog('测试事件', detail);
64
+ }
65
+ /**
66
+ * 记录里程碑事件(阶段完成、测试通过、归档完成等)
67
+ * 此类重要事件逐条记录,不参与批量聚合
68
+ */
69
+ logMilestone(title, event) {
70
+ // 确保 title 参数被传递到日志内容的 extra.title 字段中
71
+ this.writeLog('里程碑', { ...event, action: event.action, extra: { title } });
72
+ }
73
+ // ═══ 私有方法 ═══
74
+ /** 获取当前用户名 */
75
+ getUsername() {
76
+ return this.username;
77
+ }
78
+ /** 从 .openfeel/.info.json 加载用户名 */
79
+ loadUsername() {
80
+ try {
81
+ const infoPath = resolve(this.projectPath, '.openfeel', '.info.json');
82
+ if (existsSync(infoPath)) {
83
+ const raw = readFileSync(infoPath, 'utf-8');
84
+ const info = JSON.parse(raw);
85
+ if (info.user && typeof info.user === 'string') {
86
+ return info.user;
87
+ }
88
+ }
89
+ }
90
+ catch {
91
+ // 加载失败使用默认值
92
+ }
93
+ return 'unknown';
94
+ }
95
+ /** 写入日志并维护索引(乐观操作) */
96
+ writeLog(eventType, detail) {
97
+ try {
98
+ const now = new Date();
99
+ const dateDir = this.ensureDateDir(now);
100
+ const nnn = this.computeNextNnn(dateDir, now);
101
+ const fileName = this.buildFileName(now, nnn);
102
+ const filePath = resolve(dateDir, fileName);
103
+ // 写入日志文件
104
+ const content = this.buildLogContent(now, eventType, detail, fileName);
105
+ writeFileSync(filePath, content, 'utf-8');
106
+ // 维护三级索引
107
+ this.updateDayIndex(dateDir, fileName, now, getShortDesc(detail, eventType));
108
+ this.updateRootIndex(now, getShortDesc(detail, eventType));
109
+ this.updateLogMd(fileName, now, getShortDesc(detail, eventType));
110
+ }
111
+ catch (err) {
112
+ console.warn(`[WARN] 公共日志写入失败: ${err.message}`);
113
+ }
114
+ }
115
+ /** 确保年/月/日目录存在,返回日目录路径 */
116
+ ensureDateDir(now) {
117
+ const yyyy = now.getFullYear().toString();
118
+ const MM = (now.getMonth() + 1).toString().padStart(2, '0');
119
+ const dd = now.getDate().toString().padStart(2, '0');
120
+ const logRoot = resolve(this.projectPath, '.openfeel', 'log');
121
+ const yearDir = resolve(logRoot, yyyy);
122
+ const monthDir = resolve(yearDir, MM);
123
+ const dayDir = resolve(monthDir, dd);
124
+ // 确保各级目录存在
125
+ for (const dir of [logRoot, yearDir, monthDir, dayDir]) {
126
+ if (!existsSync(dir)) {
127
+ mkdirSync(dir, { recursive: true });
128
+ }
129
+ }
130
+ return dayDir;
131
+ }
132
+ /** 计算当日的下一个 NNN 值(当日已有日志文件数 + 1) */
133
+ computeNextNnn(dayDir, now) {
134
+ const datePrefix = formatDate(now);
135
+ try {
136
+ const entries = readdirSync(dayDir);
137
+ // 匹配文件名模式 {datePrefix}-{username}-{NNN}.md
138
+ const userPrefix = `${datePrefix}-${this.username}-`;
139
+ let maxNnn = 0;
140
+ for (const entry of entries) {
141
+ if (entry.startsWith(userPrefix) && entry.endsWith('.md')) {
142
+ const nnnStr = entry.slice(userPrefix.length, -3); // 去掉 ".md" 后缀
143
+ const nnn = parseInt(nnnStr, 10);
144
+ if (!isNaN(nnn) && nnn > maxNnn) {
145
+ maxNnn = nnn;
146
+ }
147
+ }
148
+ }
149
+ return maxNnn + 1;
150
+ }
151
+ catch {
152
+ return 1;
153
+ }
154
+ }
155
+ /** 构建日志文件名 yyyy-mm-dd-{username}-NNN.md */
156
+ buildFileName(now, nnn) {
157
+ const nnnStr = nnn.toString().padStart(3, '0');
158
+ return `${formatDate(now)}-${this.username}-${nnnStr}.md`;
159
+ }
160
+ /** 构建日志文件内容 */
161
+ buildLogContent(now, eventType, detail, fileName) {
162
+ const lines = [
163
+ `# ${fileName.replace('.md', '')}`,
164
+ '',
165
+ `- **时间**:${now.toISOString()}`,
166
+ `- **操作者**:${this.username}`,
167
+ `- **事件类型**:${eventType}`,
168
+ `- **操作**:${detail.action}`,
169
+ ];
170
+ if (detail.opId) {
171
+ lines.push(`- **关联操作**:${detail.opId}`);
172
+ }
173
+ if (detail.from !== undefined) {
174
+ lines.push(`- **变更前**:${detail.from}`);
175
+ }
176
+ if (detail.to !== undefined) {
177
+ lines.push(`- **变更后**:${detail.to}`);
178
+ }
179
+ // 额外信息
180
+ if (detail.extra && Object.keys(detail.extra).length > 0) {
181
+ lines.push('');
182
+ lines.push('## 补充信息');
183
+ for (const [key, value] of Object.entries(detail.extra)) {
184
+ lines.push(`- **${key}**:${String(value)}`);
185
+ }
186
+ }
187
+ lines.push('');
188
+ return lines.join('\n');
189
+ }
190
+ /** 更新当日 day_index.md */
191
+ updateDayIndex(dayDir, fileName, now, desc) {
192
+ const indexPath = resolve(dayDir, 'day_index.md');
193
+ const dateStr = formatDate(now);
194
+ const headerContent = `# ${dateStr}\n\n## 日志列表\n| 文件 | 操作者 | 描述 |\n|------|--------|------|`;
195
+ if (!existsSync(indexPath)) {
196
+ // 新建索引
197
+ const entry = `\n| [${fileName}](${fileName}) | ${this.username} | ${desc} |\n`;
198
+ writeFileSync(indexPath, headerContent + entry, 'utf-8');
199
+ return;
200
+ }
201
+ // 追加条目
202
+ let content = readFileSync(indexPath, 'utf-8');
203
+ // 避免重复追加(幂等性:检查是否已存在同名条目)
204
+ if (content.includes(fileName)) {
205
+ return;
206
+ }
207
+ // 去掉末尾空白后追加
208
+ content = content.replace(/\s*$/, '');
209
+ content += `\n| [${fileName}](${fileName}) | ${this.username} | ${desc} |\n`;
210
+ writeFileSync(indexPath, content, 'utf-8');
211
+ }
212
+ /** 更新根级 index.md(日期索引) */
213
+ updateRootIndex(now, desc) {
214
+ const indexPath = resolve(this.projectPath, '.openfeel', 'log', 'index.md');
215
+ const dateStr = formatDate(now);
216
+ const yyyy = now.getFullYear().toString();
217
+ const MM = (now.getMonth() + 1).toString().padStart(2, '0');
218
+ const dd = now.getDate().toString().padStart(2, '0');
219
+ const dayRelPath = `${yyyy}/${MM}/${dd}/day_index.md`;
220
+ const entry = `| [${dateStr}](${dayRelPath}) | ${desc} |`;
221
+ if (!existsSync(indexPath)) {
222
+ const content = `# 日志索引\n\n## 日期索引\n\n| 日期 | 摘要 |\n|------|------|\n${entry}\n`;
223
+ writeFileSync(indexPath, content, 'utf-8');
224
+ return;
225
+ }
226
+ let content = readFileSync(indexPath, 'utf-8');
227
+ // 检查该日期是否已存在,存在则更新摘要;否则插入新行
228
+ if (content.includes(`[${dateStr}]`)) {
229
+ // 日期已存在,不重复添加
230
+ return;
231
+ }
232
+ // 在表格末尾追加(在下一个 ## 或文件末尾之前)
233
+ const tableEndMatch = content.match(/\| [^\n]+\n(?=\n|##|$)/);
234
+ if (tableEndMatch) {
235
+ const insertPos = content.indexOf(tableEndMatch[0]) + tableEndMatch[0].length;
236
+ content = content.slice(0, insertPos) + entry + '\n' + content.slice(insertPos);
237
+ }
238
+ else {
239
+ content = content.replace(/\s*$/, '') + '\n' + entry + '\n';
240
+ }
241
+ writeFileSync(indexPath, content, 'utf-8');
242
+ }
243
+ /** 更新根级 log.md(最近 30 条摘要,倒序插入顶部) */
244
+ updateLogMd(fileName, now, desc) {
245
+ const logPath = resolve(this.projectPath, '.openfeel', 'log', 'log.md');
246
+ const yyyy = now.getFullYear().toString();
247
+ const MM = (now.getMonth() + 1).toString().padStart(2, '0');
248
+ const dd = now.getDate().toString().padStart(2, '0');
249
+ const fileRelPath = `${yyyy}/${MM}/${dd}/${fileName}`;
250
+ const entry = `| [${fileName}](${fileRelPath}) | ${this.username} | ${desc} |`;
251
+ if (!existsSync(logPath)) {
252
+ const content = `# 最近日志\n\n| 文件 | 用户 | 描述 |\n|------|------|------|\n${entry}\n`;
253
+ writeFileSync(logPath, content, 'utf-8');
254
+ return;
255
+ }
256
+ let content = readFileSync(logPath, 'utf-8');
257
+ // 避免重复追加
258
+ if (content.includes(fileName)) {
259
+ return;
260
+ }
261
+ // 找到表格头部后的第一行,插入新条目
262
+ const tableHeaderEnd = content.indexOf('|------|------|------|');
263
+ if (tableHeaderEnd === -1) {
264
+ // 格式异常,重新初始化
265
+ const newContent = `# 最近日志\n\n| 文件 | 用户 | 描述 |\n|------|------|------|\n${entry}\n`;
266
+ writeFileSync(logPath, newContent, 'utf-8');
267
+ return;
268
+ }
269
+ const insertPos = tableHeaderEnd + '|------|------|------|'.length;
270
+ const before = content.slice(0, insertPos);
271
+ let after = content.slice(insertPos);
272
+ // 在前面插入新条目(倒序:最新在上)
273
+ after = '\n' + entry + after;
274
+ // 截断到最近 30 条
275
+ const lines = after.split('\n');
276
+ const entryLines = [];
277
+ const maxEntries = 30;
278
+ let count = 0;
279
+ for (const line of lines) {
280
+ if (line.startsWith('| [')) {
281
+ count++;
282
+ if (count <= maxEntries) {
283
+ entryLines.push(line);
284
+ }
285
+ // 超过 maxEntries 的丢弃
286
+ }
287
+ else {
288
+ entryLines.push(line);
289
+ }
290
+ }
291
+ // 确保末尾有换行
292
+ const newContent = before + entryLines.join('\n').replace(/\n*$/, '\n');
293
+ writeFileSync(logPath, newContent, 'utf-8');
294
+ }
295
+ }
296
+ // ── 辅助函数 ──
297
+ /** 格式化日期为 yyyy-mm-dd */
298
+ export function formatDate(date) {
299
+ const yyyy = date.getFullYear().toString();
300
+ const MM = (date.getMonth() + 1).toString().padStart(2, '0');
301
+ const dd = date.getDate().toString().padStart(2, '0');
302
+ return `${yyyy}-${MM}-${dd}`;
303
+ }
304
+ /** 从 LogEventDetail 生成简短描述 */
305
+ function getShortDesc(detail, eventType) {
306
+ const parts = [];
307
+ if (detail.opId) {
308
+ parts.push(detail.opId);
309
+ }
310
+ // 根据操作类型生成可读描述
311
+ switch (detail.action) {
312
+ case 'advance_phase':
313
+ parts.push('阶段推进');
314
+ if (detail.from && detail.to) {
315
+ parts.push(`${detail.from} → ${detail.to}`);
316
+ }
317
+ break;
318
+ case 'attempt_pass':
319
+ parts.push('执行通过');
320
+ break;
321
+ case 'attempt_fail_retry':
322
+ parts.push('执行失败,重试中');
323
+ break;
324
+ case 'attempt_fail_exhausted':
325
+ parts.push('执行失败,重试耗尽');
326
+ break;
327
+ case 'auto_fix_review':
328
+ parts.push('自动修复审查');
329
+ break;
330
+ case 'stage_completed':
331
+ if (detail.extra?.title) {
332
+ parts.push(String(detail.extra.title));
333
+ }
334
+ else {
335
+ parts.push('阶段完成');
336
+ }
337
+ break;
338
+ default:
339
+ parts.push(detail.action);
340
+ break;
341
+ }
342
+ return parts.join(' ') || eventType;
343
+ }
344
+ //# sourceMappingURL=public-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-logger.js","sourceRoot":"","sources":["../../src/core/public-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * 核心 Schema 引擎 — Zod 类型定义与 YAML Schema 加载验证
3
+ * 定义 Artifact(构建产物)、Dependency(依赖关系)和 Schema(工作流模式)的数据模型
4
+ */
5
+ import { z } from 'zod';
6
+ /** 单个依赖关系定义 */
7
+ declare const DependencySchema: z.ZodObject<{
8
+ artifact: z.ZodString;
9
+ type: z.ZodDefault<z.ZodEnum<{
10
+ hard: "hard";
11
+ soft: "soft";
12
+ }>>;
13
+ description: z.ZodOptional<z.ZodString>;
14
+ }, z.core.$strip>;
15
+ /** 构建产物(Artifact)定义 */
16
+ declare const ArtifactSchema: z.ZodObject<{
17
+ id: z.ZodString;
18
+ description: z.ZodOptional<z.ZodString>;
19
+ generates: z.ZodString;
20
+ template: z.ZodOptional<z.ZodString>;
21
+ requires: z.ZodDefault<z.ZodArray<z.ZodObject<{
22
+ artifact: z.ZodString;
23
+ type: z.ZodDefault<z.ZodEnum<{
24
+ hard: "hard";
25
+ soft: "soft";
26
+ }>>;
27
+ description: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$strip>>>;
29
+ dependsOn: z.ZodDefault<z.ZodArray<z.ZodString>>;
30
+ instruction: z.ZodOptional<z.ZodString>;
31
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
32
+ }, z.core.$strip>;
33
+ /** 工作流 Schema 顶层定义 */
34
+ export declare const SchemaSchema: z.ZodObject<{
35
+ name: z.ZodString;
36
+ version: z.ZodDefault<z.ZodString>;
37
+ description: z.ZodOptional<z.ZodString>;
38
+ artifacts: z.ZodArray<z.ZodObject<{
39
+ id: z.ZodString;
40
+ description: z.ZodOptional<z.ZodString>;
41
+ generates: z.ZodString;
42
+ template: z.ZodOptional<z.ZodString>;
43
+ requires: z.ZodDefault<z.ZodArray<z.ZodObject<{
44
+ artifact: z.ZodString;
45
+ type: z.ZodDefault<z.ZodEnum<{
46
+ hard: "hard";
47
+ soft: "soft";
48
+ }>>;
49
+ description: z.ZodOptional<z.ZodString>;
50
+ }, z.core.$strip>>>;
51
+ dependsOn: z.ZodDefault<z.ZodArray<z.ZodString>>;
52
+ instruction: z.ZodOptional<z.ZodString>;
53
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
54
+ }, z.core.$strip>>;
55
+ }, z.core.$strip>;
56
+ /** 依赖关系类型 */
57
+ export type Dependency = z.infer<typeof DependencySchema>;
58
+ /** 构建产物类型 */
59
+ export type Artifact = z.infer<typeof ArtifactSchema>;
60
+ /** 工作流 Schema 类型 */
61
+ export type Schema = z.infer<typeof SchemaSchema>;
62
+ /**
63
+ * 从 YAML 文件加载并验证 Schema
64
+ * @param filePath YAML 文件路径
65
+ * @returns 验证后的 Schema 对象
66
+ * @throws 文件不存在或格式校验失败时抛出异常
67
+ */
68
+ export declare function loadSchema(filePath: string): Promise<Schema>;
69
+ export {};
70
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAe;AACf,QAAA,MAAM,gBAAgB;;;;;;;iBAIpB,CAAC;AAEH,uBAAuB;AACvB,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;iBASlB,CAAC;AAEH,sBAAsB;AACtB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;iBAoBvB,CAAC;AAIH,aAAa;AACb,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,aAAa;AACb,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,oBAAoB;AACpB,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIlD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIlE"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * 核心 Schema 引擎 — Zod 类型定义与 YAML Schema 加载验证
3
+ * 定义 Artifact(构建产物)、Dependency(依赖关系)和 Schema(工作流模式)的数据模型
4
+ */
5
+ import { z } from 'zod';
6
+ import { parse as parseYaml } from 'yaml';
7
+ import { readFile } from 'node:fs/promises';
8
+ // ─── Zod Schema 定义 ────────────────────────────────────────────
9
+ /** 单个依赖关系定义 */
10
+ const DependencySchema = z.object({
11
+ artifact: z.string(), // 依赖的 artifact ID
12
+ type: z.enum(['hard', 'soft']).default('hard'), // 硬依赖(阻塞)或软依赖(仅提示)
13
+ description: z.string().optional(), // 依赖说明
14
+ });
15
+ /** 构建产物(Artifact)定义 */
16
+ const ArtifactSchema = z.object({
17
+ id: z.string(), // 唯一标识
18
+ description: z.string().optional(), // 产物描述
19
+ generates: z.string(), // 产物文件路径(支持 glob 模式)
20
+ template: z.string().optional(), // 模板文件路径
21
+ requires: z.array(DependencySchema).default([]), // 前置依赖(支持硬/软类型)
22
+ dependsOn: z.array(z.string()).default([]), // 简写:直接写 artifact ID(视为 hard 依赖)
23
+ instruction: z.string().optional(), // 给 AI Agent 的指令
24
+ metadata: z.record(z.string(), z.unknown()).default({}),
25
+ });
26
+ /** 工作流 Schema 顶层定义 */
27
+ export const SchemaSchema = z.object({
28
+ name: z.string(), // Schema 名称
29
+ version: z.string().default('1.0'), // 版本号
30
+ description: z.string().optional(), // 描述
31
+ artifacts: z.array(ArtifactSchema), // 产物列表
32
+ }).superRefine((data, ctx) => {
33
+ // 检查 artifact ID 唯一性
34
+ const seen = new Set();
35
+ for (let i = 0; i < data.artifacts.length; i++) {
36
+ const artifact = data.artifacts[i];
37
+ if (seen.has(artifact.id)) {
38
+ ctx.addIssue({
39
+ code: z.ZodIssueCode.custom,
40
+ message: `Artifact ID "${artifact.id}" 重复出现,ID 必须唯一`,
41
+ path: ['artifacts', i, 'id'],
42
+ });
43
+ }
44
+ else {
45
+ seen.add(artifact.id);
46
+ }
47
+ }
48
+ });
49
+ // ─── Schema 加载与验证 ──────────────────────────────────────────
50
+ /**
51
+ * 从 YAML 文件加载并验证 Schema
52
+ * @param filePath YAML 文件路径
53
+ * @returns 验证后的 Schema 对象
54
+ * @throws 文件不存在或格式校验失败时抛出异常
55
+ */
56
+ export async function loadSchema(filePath) {
57
+ const content = await readFile(filePath, 'utf-8');
58
+ const raw = parseYaml(content); // yaml.parse 解析
59
+ return SchemaSchema.parse(raw); // Zod 校验
60
+ }
61
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 模板加载器 — 构建时内联模板常量,按语言和模板名返回。
3
+ *
4
+ * 以下 AUTO-GENERATED 段由 build.js 在 npm run build 时从 templates-data/ 下读取 .md 文件生成。
5
+ * 禁止手动编辑 AUTO-GENERATED 之间的内容。
6
+ */
7
+ /**
8
+ * 获取指定语言的 Agent 模板内容。
9
+ * 指定语言不存在时回退到 zh-CN;若 zh-CN 也不存在则抛出错误。
10
+ */
11
+ export declare function loadAgentTemplate(lang: string, agentId: string): string;
12
+ /**
13
+ * 获取指定语言下所有 Agent ID 列表。
14
+ * 指定语言不存在时回退到 zh-CN。
15
+ */
16
+ export declare function listAgentIds(lang: string): string[];
17
+ /** 加载通用模板(core-instructions / agents-md) */
18
+ export type TemplateName = 'core-instructions' | 'agents-md';
19
+ export declare function loadTemplate(lang: string, templateName: TemplateName): string;
20
+ export declare const AGENTS_MD_TEMPLATE: string;
21
+ export declare const CORE_INSTRUCTIONS_TEMPLATE_B64: string;
22
+ //# sourceMappingURL=template-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-loader.d.ts","sourceRoot":"","sources":["../../src/core/template-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuvFH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAWvE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGnD;AAED,4CAA4C;AAC5C,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,WAAW,CAAC;AAE7D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,CAe7E;AAGD,eAAO,MAAM,kBAAkB,EAAE,MAAqC,CAAC;AACvE,eAAO,MAAM,8BAA8B,EAAE,MAA6C,CAAC"}