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,262 @@
1
+ /**
2
+ * 操作方案管理(Schemer 产出层)
3
+ * 负责 .openfeel/stages/{stage}/ops/ 下的操作方案文件 CRUD
4
+ * 创建后自动同步到 flow.json 的 stages/{stage}.ops 中
5
+ */
6
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
7
+ import { resolve, join } from 'node:path';
8
+ import { FlowManager } from '../flow-manager.js';
9
+ /**
10
+ * 生成操作方案的固定 Markdown 模板
11
+ */
12
+ function generateSchemeTemplate(opId, stageName, title) {
13
+ return `# ${opId}:${title}
14
+
15
+ - **阶段**:${stageName}
16
+ - **状态**:pending
17
+ - **前置**:无
18
+ - **负责 Agent**:Executor
19
+ - **最多重试**:3
20
+
21
+ ## 目标
22
+ ${title}
23
+
24
+ ## 实施步骤
25
+ - [ ] 待补充
26
+
27
+ ## 产出文件
28
+ - 待补充
29
+
30
+ ## 自测清单
31
+ - [ ] 待补充
32
+
33
+ ## 修正记录
34
+ | 次数 | 时间 | 问题 | 修正内容 |
35
+ |------|------|------|----------|
36
+ `;
37
+ }
38
+ /**
39
+ * 从文件名中提取 opId
40
+ * 文件名格式:op-NNN_{title}.md
41
+ */
42
+ function extractOpId(fileName) {
43
+ const match = fileName.match(/^(op-\d+)/);
44
+ return match ? match[1] : null;
45
+ }
46
+ /**
47
+ * 从文件名中提取标题
48
+ * 文件名格式:op-NNN_{title}.md
49
+ */
50
+ function extractTitle(fileName) {
51
+ // 去掉 op-NNN_ 前缀和 .md 后缀
52
+ const noPrefix = fileName.replace(/^op-\d+_?/, '');
53
+ return noPrefix.replace(/\.md$/, '').replace(/_/g, ' ');
54
+ }
55
+ /**
56
+ * 计算下一个 opId(基于已有方案中的最大编号 +1)
57
+ */
58
+ function getNextOpId(opsDir) {
59
+ if (!existsSync(opsDir)) {
60
+ return 'op-001';
61
+ }
62
+ const files = readdirSync(opsDir).filter((f) => f.endsWith('.md'));
63
+ let maxNum = 0;
64
+ for (const file of files) {
65
+ const match = file.match(/^op-(\d+)/);
66
+ if (match) {
67
+ const num = parseInt(match[1], 10);
68
+ if (num > maxNum) {
69
+ maxNum = num;
70
+ }
71
+ }
72
+ }
73
+ return `op-${String(maxNum + 1).padStart(3, '0')}`;
74
+ }
75
+ /**
76
+ * 同步方案到 flow.json
77
+ * 若 flow.json 不存在或对应 stage 不存在,跳过同步(不报错)
78
+ */
79
+ function syncToFlowJson(projectPath, stageName, opId, title) {
80
+ const flowJsonPath = resolve(projectPath, '.openfeel', 'flow.json');
81
+ if (!existsSync(flowJsonPath)) {
82
+ return;
83
+ }
84
+ try {
85
+ const flowMgr = new FlowManager(projectPath);
86
+ const flowData = flowMgr.getData();
87
+ if (!flowData) {
88
+ return;
89
+ }
90
+ // 检查 stage 是否存在
91
+ // 若 stage 未在 flow.json 中注册,自动注册
92
+ if (!flowData.stages[stageName]) {
93
+ flowData.stages[stageName] = {
94
+ name: stageName,
95
+ phase: 'plan_pending',
96
+ status: 'planned',
97
+ deps: [],
98
+ ops: {},
99
+ };
100
+ }
101
+ // 将 op 注册到 stages.{stageName}.ops 中
102
+ flowData.stages[stageName].ops[opId] = {
103
+ id: opId,
104
+ title,
105
+ state: 'pending',
106
+ assignee: 'Executor',
107
+ attempts: 0,
108
+ max_attempts: 3,
109
+ checkpoints: {
110
+ plan: 'pending',
111
+ scheme: 'pending',
112
+ exec: { attempts: 0, self: 'pending' },
113
+ review: 'pending',
114
+ test: 'pending',
115
+ },
116
+ };
117
+ flowMgr.save();
118
+ }
119
+ catch {
120
+ // 同步失败不阻塞方案创建(静默忽略)
121
+ }
122
+ }
123
+ /**
124
+ * 创建操作方案
125
+ * 在 .openfeel/stages/{stage}/ops/ 下创建 op-NNN_{title}.md
126
+ * NNN 自动递增(从该阶段的已有方案中计算)
127
+ * 必须按固定模板生成,包含:目标、实施步骤(checkbox)、产出文件、自测清单、修正记录
128
+ * 创建后自动同步到 flow.json(如果存在)
129
+ * @returns opId(如 op-001)
130
+ */
131
+ export function createScheme(projectPath, stageName, title) {
132
+ // 1. 确保 .openfeel/stages/{stage}/ops/ 目录存在
133
+ const opsDir = resolve(projectPath, '.openfeel', 'stages', stageName, 'ops');
134
+ if (!existsSync(opsDir)) {
135
+ mkdirSync(opsDir, { recursive: true });
136
+ }
137
+ // 2. 计算下一个 opId
138
+ const opId = getNextOpId(opsDir);
139
+ // 3. 生成模板内容并写入文件
140
+ // 文件名中空格用下划线替换
141
+ const safeTitle = title.replace(/\s+/g, '_');
142
+ const fileName = `${opId}_${safeTitle}.md`;
143
+ const filePath = join(opsDir, fileName);
144
+ const content = generateSchemeTemplate(opId, stageName, title);
145
+ writeFileSync(filePath, content, 'utf-8');
146
+ // 4. 同步到 flow.json
147
+ syncToFlowJson(projectPath, stageName, opId, title);
148
+ // 5. 返回 opId
149
+ return opId;
150
+ }
151
+ /**
152
+ * 读取操作方案
153
+ * @param opId 操作ID(如 op-001)或完整 opId(如 stage-01.op-001)
154
+ * @returns Scheme 或 null
155
+ */
156
+ export function getScheme(projectPath, opId) {
157
+ const stagesDir = resolve(projectPath, '.openfeel', 'stages');
158
+ if (!existsSync(stagesDir)) {
159
+ return null;
160
+ }
161
+ let targetStageName;
162
+ let targetOpId;
163
+ // 判断 opId 格式:包含 "." 则为完整格式 "stage-01.op-001"
164
+ const dotIdx = opId.indexOf('.');
165
+ if (dotIdx !== -1) {
166
+ targetStageName = opId.substring(0, dotIdx);
167
+ targetOpId = opId.substring(dotIdx + 1);
168
+ }
169
+ else {
170
+ targetStageName = ''; // 遍历所有阶段查找
171
+ targetOpId = opId;
172
+ }
173
+ // 读取 stages 目录下的子目录
174
+ const stageEntries = readdirSync(stagesDir, { withFileTypes: true });
175
+ for (const stageEntry of stageEntries) {
176
+ if (!stageEntry.isDirectory()) {
177
+ continue;
178
+ }
179
+ // 若指定了阶段名,只检查匹配的目录
180
+ if (targetStageName && stageEntry.name !== targetStageName) {
181
+ continue;
182
+ }
183
+ const opsDir = join(stagesDir, stageEntry.name, 'ops');
184
+ if (!existsSync(opsDir)) {
185
+ continue;
186
+ }
187
+ // 在 ops 目录中查找匹配的文件
188
+ const opFiles = readdirSync(opsDir).filter((f) => f.startsWith(targetOpId) && f.endsWith('.md'));
189
+ if (opFiles.length === 0) {
190
+ continue;
191
+ }
192
+ // 找到匹配文件,读取内容
193
+ const matchedFile = opFiles[0]; // 取第一个匹配
194
+ const filePath = join(opsDir, matchedFile);
195
+ const content = readFileSync(filePath, 'utf-8');
196
+ const scheme = {
197
+ opId: targetOpId,
198
+ stage: stageEntry.name,
199
+ title: extractTitle(matchedFile),
200
+ content,
201
+ filePath: `.openfeel/stages/${stageEntry.name}/ops/${matchedFile}`,
202
+ };
203
+ return scheme;
204
+ }
205
+ return null;
206
+ }
207
+ /**
208
+ * 列出操作方案
209
+ * @param stageName 可选,不传则列出所有阶段的方案
210
+ */
211
+ export function listSchemes(projectPath, stageName) {
212
+ const stagesDir = resolve(projectPath, '.openfeel', 'stages');
213
+ const result = [];
214
+ if (!existsSync(stagesDir)) {
215
+ return result;
216
+ }
217
+ // 若指定了阶段名,只遍历该阶段
218
+ const stageNames = [];
219
+ if (stageName) {
220
+ stageNames.push(stageName);
221
+ }
222
+ else {
223
+ const stageEntries = readdirSync(stagesDir, { withFileTypes: true });
224
+ for (const entry of stageEntries) {
225
+ if (entry.isDirectory()) {
226
+ stageNames.push(entry.name);
227
+ }
228
+ }
229
+ }
230
+ for (const sn of stageNames) {
231
+ const opsDir = join(stagesDir, sn, 'ops');
232
+ if (!existsSync(opsDir)) {
233
+ continue;
234
+ }
235
+ const opFiles = readdirSync(opsDir).filter((f) => f.endsWith('.md'));
236
+ for (const fileName of opFiles) {
237
+ const opId = extractOpId(fileName);
238
+ if (!opId) {
239
+ continue;
240
+ }
241
+ const filePath = join(opsDir, fileName);
242
+ const content = readFileSync(filePath, 'utf-8');
243
+ result.push({
244
+ opId,
245
+ stage: sn,
246
+ title: extractTitle(fileName),
247
+ content,
248
+ filePath: `.openfeel/stages/${sn}/ops/${fileName}`,
249
+ });
250
+ }
251
+ }
252
+ // 按阶段名 + opId 排序
253
+ result.sort((a, b) => {
254
+ const cmp = a.stage.localeCompare(b.stage);
255
+ if (cmp !== 0) {
256
+ return cmp;
257
+ }
258
+ return a.opId.localeCompare(b.opId);
259
+ });
260
+ return result;
261
+ }
262
+ //# sourceMappingURL=scheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheme.js","sourceRoot":"","sources":["../../../src/core/plan/scheme.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAsB,MAAM,oBAAoB,CAAC;AAgBrE;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAAY,EAAE,SAAiB,EAAE,KAAa;IAC5E,OAAO,KAAK,IAAI,IAAI,KAAK;;WAEhB,SAAS;;;;;;;EAOlB,KAAK;;;;;;;;;;;;;;CAcN,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,QAAgB;IACpC,wBAAwB;IACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACnD,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,MAAc;IACjC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,IAAI,GAAG,GAAG,MAAM,EAAE,CAAC;gBACjB,MAAM,GAAG,GAAG,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,WAAmB,EACnB,SAAiB,EACjB,IAAY,EACZ,KAAa;IAEb,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,gBAAgB;QAChB,gCAAgC;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG;gBAC3B,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,cAA+B;gBACtC,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,EAAE;gBACR,GAAG,EAAE,EAAE;aACR,CAAC;QACJ,CAAC;QAED,oCAAoC;QACpC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG;YACrC,EAAE,EAAE,IAAI;YACR,KAAK;YACL,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,UAAU;YACpB,QAAQ,EAAE,CAAC;YACX,YAAY,EAAE,CAAC;YACf,WAAW,EAAE;gBACX,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;gBACtC,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,SAAS;aAChB;SACF,CAAC;QAEF,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,SAAiB,EAAE,KAAa;IAChF,2CAA2C;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAC7E,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,gBAAgB;IAChB,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAEjC,iBAAiB;IACjB,eAAe;IACf,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,GAAG,IAAI,IAAI,SAAS,KAAK,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/D,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1C,mBAAmB;IACnB,cAAc,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAEpD,aAAa;IACb,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,WAAmB,EAAE,IAAY;IACzD,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE9D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,eAAuB,CAAC;IAC5B,IAAI,UAAkB,CAAC;IAEvB,6CAA6C;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAClB,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC5C,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,eAAe,GAAG,EAAE,CAAC,CAAC,WAAW;QACjC,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,oBAAoB;IACpB,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QAED,mBAAmB;QACnB,IAAI,eAAe,IAAI,UAAU,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAC3D,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,mBAAmB;QACnB,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACjG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QAED,cAAc;QACd,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAW;YACrB,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,UAAU,CAAC,IAAI;YACtB,KAAK,EAAE,YAAY,CAAC,WAAW,CAAC;YAChC,OAAO;YACP,QAAQ,EAAE,oBAAoB,UAAU,CAAC,IAAI,QAAQ,WAAW,EAAE;SACnE,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,SAAkB;IACjE,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iBAAiB;IACjB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,SAAS,EAAE,CAAC;QACd,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEhD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC;gBAC7B,OAAO;gBACP,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,QAAQ,EAAE;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACd,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** 工作阶段 */
2
+ export interface Stage {
3
+ /** 阶段名,如 stage-01 */
4
+ name: string;
5
+ /** 相对路径 .openfeel/stages/stage-01/ */
6
+ path: string;
7
+ /** overview.md 内容 */
8
+ overview: string;
9
+ }
10
+ /**
11
+ * 添加工作阶段
12
+ * 在 .openfeel/stages/ 下创建 {name}/ 目录,包含 overview.md 和 status.md 骨架
13
+ * @param deps 依赖的阶段名列表(可选,写入 overview.md)
14
+ */
15
+ export declare function addStage(projectPath: string, name: string, deps?: string[]): void;
16
+ /**
17
+ * 列出所有工作阶段
18
+ */
19
+ export declare function listStages(projectPath: string): Stage[];
20
+ //# sourceMappingURL=stage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../../src/core/plan/stage.ts"],"names":[],"mappings":"AAQA,WAAW;AACX,MAAM,WAAW,KAAK;IACpB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAiFjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,CAoCvD"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * 工作阶段管理
3
+ * 负责 .openfeel/stages/ 下的阶段目录创建与列取
4
+ */
5
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
6
+ import { resolve, join } from 'node:path';
7
+ import { FlowManager } from '../flow-manager.js';
8
+ /**
9
+ * 添加工作阶段
10
+ * 在 .openfeel/stages/ 下创建 {name}/ 目录,包含 overview.md 和 status.md 骨架
11
+ * @param deps 依赖的阶段名列表(可选,写入 overview.md)
12
+ */
13
+ export function addStage(projectPath, name, deps) {
14
+ const stagesDir = resolve(projectPath, '.openfeel', 'stages');
15
+ // 确保 stages 目录存在
16
+ if (!existsSync(stagesDir)) {
17
+ mkdirSync(stagesDir, { recursive: true });
18
+ }
19
+ const stageDir = join(stagesDir, name);
20
+ // 确保阶段目录存在
21
+ if (!existsSync(stageDir)) {
22
+ mkdirSync(stageDir, { recursive: true });
23
+ }
24
+ // 若目录已存在,不覆盖已有文件,只创建缺失的
25
+ // 创建 overview.md(若不存在)
26
+ const overviewPath = join(stageDir, 'overview.md');
27
+ if (!existsSync(overviewPath)) {
28
+ const depsText = deps && deps.length > 0 ? deps.map((d) => `- ${d}`).join('\n') : '无';
29
+ const overviewContent = `# ${name}
30
+
31
+ ## 目标
32
+
33
+ > 待补充
34
+
35
+ ## 依赖
36
+
37
+ ${depsText}
38
+
39
+ ## 操作方案
40
+
41
+ > 待补充
42
+ `;
43
+ writeFileSync(overviewPath, overviewContent, 'utf-8');
44
+ }
45
+ // 创建 status.md(若不存在)
46
+ const statusPath = join(stageDir, 'status.md');
47
+ if (!existsSync(statusPath)) {
48
+ const statusContent = `# ${name} 状态
49
+
50
+ - **执行模式**:manual
51
+ - **自动推进**:disabled
52
+ - **状态**:planned
53
+ - **当前责任 Agent**:user
54
+ - **上一责任 Agent**:none
55
+ - **更新时间**:${new Date().toISOString().replace('T', ' ').substring(0, 16)}
56
+
57
+ ## Worktree / Session
58
+
59
+ - **工作模式**:manual
60
+ - **分支名**:-
61
+ - **Session 名称**:-
62
+ - **合并状态**:not_started
63
+ - **清理策略**:manual
64
+
65
+ ## 当前任务
66
+
67
+ > 待补充
68
+
69
+ ## 阻塞 / 暂停原因
70
+
71
+ 无
72
+
73
+ ## 状态记录
74
+
75
+ | 时间 | Agent | 状态变化 | 说明 |
76
+ |------|-------|----------|------|
77
+ | ${new Date().toISOString().replace('T', ' ').substring(0, 16)} | user | planned | 阶段已创建 |
78
+ `;
79
+ writeFileSync(statusPath, statusContent, 'utf-8');
80
+ }
81
+ // 同步到 flow.json(若 flow.json 存在)
82
+ const flowMgr = new FlowManager(projectPath);
83
+ if (flowMgr.isLoaded()) {
84
+ flowMgr.registerStage(name, deps ?? []);
85
+ flowMgr.save();
86
+ }
87
+ }
88
+ /**
89
+ * 列出所有工作阶段
90
+ */
91
+ export function listStages(projectPath) {
92
+ const stagesDir = resolve(projectPath, '.openfeel', 'stages');
93
+ // 目录不存在时返回空列表
94
+ if (!existsSync(stagesDir)) {
95
+ return [];
96
+ }
97
+ const result = [];
98
+ // 遍历子目录
99
+ const entries = readdirSync(stagesDir, { withFileTypes: true });
100
+ for (const entry of entries) {
101
+ if (!entry.isDirectory()) {
102
+ continue;
103
+ }
104
+ const stageDir = join(stagesDir, entry.name);
105
+ const overviewPath = join(stageDir, 'overview.md');
106
+ let overview = '';
107
+ if (existsSync(overviewPath)) {
108
+ overview = readFileSync(overviewPath, 'utf-8');
109
+ }
110
+ result.push({
111
+ name: entry.name,
112
+ path: `.openfeel/stages/${entry.name}/`,
113
+ overview,
114
+ });
115
+ }
116
+ // 按名称排序
117
+ result.sort((a, b) => a.name.localeCompare(b.name));
118
+ return result;
119
+ }
120
+ //# sourceMappingURL=stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/core/plan/stage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAYjD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,WAAmB,EAAE,IAAY,EAAE,IAAe;IACzE,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE9D,iBAAiB;IACjB,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAEvC,WAAW;IACX,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,wBAAwB;IAExB,uBAAuB;IACvB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACtF,MAAM,eAAe,GAAG,KAAK,IAAI;;;;;;;;EAQnC,QAAQ;;;;;CAKT,CAAC;QACE,aAAa,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,qBAAqB;IACrB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,aAAa,GAAG,KAAK,IAAI;;;;;;;aAOtB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;IAsBpE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;CAC9D,CAAC;QACE,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,gCAAgC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE9D,cAAc;IACd,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,QAAQ;IACR,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAEnD,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,QAAQ,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,oBAAoB,KAAK,CAAC,IAAI,GAAG;YACvC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;IACR,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,84 @@
1
+ /** 里程碑事件 */
2
+ export interface MilestoneEvent {
3
+ action: string;
4
+ stageId?: string;
5
+ durationMs?: number;
6
+ finalPhase?: string;
7
+ [key: string]: unknown;
8
+ }
9
+ /** 日志事件详情 */
10
+ export interface LogEventDetail {
11
+ /** 操作类型(如 advance_phase, attempt_pass, review_added 等) */
12
+ action: string;
13
+ /** 关联的操作 ID(可选) */
14
+ opId?: string | null;
15
+ /** 变更前状态(可选) */
16
+ from?: string;
17
+ /** 变更后状态(可选) */
18
+ to?: string;
19
+ /** 其他补充信息 */
20
+ extra?: Record<string, unknown>;
21
+ }
22
+ /**
23
+ * PublicLogger 单例类
24
+ * 负责写入公共日志并维护索引文件。
25
+ * 构造时从 .openfeel/.info.json 加载用户名。
26
+ */
27
+ export declare class PublicLogger {
28
+ private static instance;
29
+ private projectPath;
30
+ private username;
31
+ private constructor();
32
+ /**
33
+ * 获取或创建 PublicLogger 单例
34
+ * @param projectPath 项目根路径
35
+ */
36
+ static getInstance(projectPath: string): PublicLogger;
37
+ /**
38
+ * 重置单例(仅供测试使用)
39
+ */
40
+ static resetInstance(): void;
41
+ /**
42
+ * 记录状态变更事件(advancePhase / recordAttempt)
43
+ * @param detail 变更详情
44
+ */
45
+ logPhaseChange(detail: LogEventDetail): void;
46
+ /**
47
+ * 记录审查事件(addReview / addAutoFixReview)
48
+ * @param detail 审查详情
49
+ */
50
+ logReviewEvent(detail: LogEventDetail): void;
51
+ /**
52
+ * 记录测试事件
53
+ * @param detail 测试详情
54
+ */
55
+ logTestEvent(detail: LogEventDetail): void;
56
+ /**
57
+ * 记录里程碑事件(阶段完成、测试通过、归档完成等)
58
+ * 此类重要事件逐条记录,不参与批量聚合
59
+ */
60
+ logMilestone(title: string, event: MilestoneEvent): void;
61
+ /** 获取当前用户名 */
62
+ getUsername(): string;
63
+ /** 从 .openfeel/.info.json 加载用户名 */
64
+ private loadUsername;
65
+ /** 写入日志并维护索引(乐观操作) */
66
+ private writeLog;
67
+ /** 确保年/月/日目录存在,返回日目录路径 */
68
+ private ensureDateDir;
69
+ /** 计算当日的下一个 NNN 值(当日已有日志文件数 + 1) */
70
+ private computeNextNnn;
71
+ /** 构建日志文件名 yyyy-mm-dd-{username}-NNN.md */
72
+ private buildFileName;
73
+ /** 构建日志文件内容 */
74
+ private buildLogContent;
75
+ /** 更新当日 day_index.md */
76
+ private updateDayIndex;
77
+ /** 更新根级 index.md(日期索引) */
78
+ private updateRootIndex;
79
+ /** 更新根级 log.md(最近 30 条摘要,倒序插入顶部) */
80
+ private updateLogMd;
81
+ }
82
+ /** 格式化日期为 yyyy-mm-dd */
83
+ export declare function formatDate(date: Date): string;
84
+ //# sourceMappingURL=public-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-logger.d.ts","sourceRoot":"","sources":["../../src/core/public-logger.ts"],"names":[],"mappings":"AAcA,YAAY;AACZ,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6B;IACpD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO;IAKP;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY;IAOrD;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAM5B;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAI5C;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAI5C;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAI1C;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;IAOxD,cAAc;IACd,WAAW,IAAI,MAAM;IAIrB,mCAAmC;IACnC,OAAO,CAAC,YAAY;IAgBpB,sBAAsB;IACtB,OAAO,CAAC,QAAQ;IAqBhB,0BAA0B;IAC1B,OAAO,CAAC,aAAa;IAmBrB,oCAAoC;IACpC,OAAO,CAAC,cAAc;IAsBtB,2CAA2C;IAC3C,OAAO,CAAC,aAAa;IAKrB,eAAe;IACf,OAAO,CAAC,eAAe;IAsCvB,wBAAwB;IACxB,OAAO,CAAC,cAAc;IA6BtB,0BAA0B;IAC1B,OAAO,CAAC,eAAe;IAiCvB,oCAAoC;IACpC,OAAO,CAAC,WAAW;CA0DpB;AAID,wBAAwB;AACxB,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAK7C"}