openfeel 1.0.8 → 1.0.9

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.
@@ -0,0 +1,150 @@
1
+ /**
2
+ * 阶段路径映射工具 — stageId ↔ plan 目录双向映射的唯一权威
3
+ *
4
+ * 统一规则(决策 1/2):
5
+ * - plan 目录结构:.openfeel/plan/{series}/stage-{NN}/
6
+ * - {series} = 大版本系列 = v{MAJOR}(如 v1、v4)
7
+ * - {stage} = 阶段目录名 = stage-{NN}(不含版本前缀)
8
+ * - flow.json stageId 是权威标识(唯一键),目录名是派生组织单位
9
+ */
10
+ import { existsSync, readFileSync } from 'node:fs';
11
+ import { resolve } from 'node:path';
12
+ import fastGlob from 'fast-glob';
13
+ /** 短名(无版本前缀)默认系列 */
14
+ export const DEFAULT_SERIES = 'v1';
15
+ /** 短名规范化为完整 stageId 时的默认四级版本前缀(与 init 示例阶段一致) */
16
+ export const DEFAULT_STAGE_VERSION = 'v1.0.0';
17
+ /**
18
+ * 解析 stageId → { series, stageDir, fullStageId }
19
+ *
20
+ * 支持三种格式(决策 2 正向映射):
21
+ * - 完整:v1.0.0-stage-34 → { series: 'v1', stageDir: 'stage-34', fullStageId: 'v1.0.0-stage-34' }
22
+ * - 历史:v4-stage-04 → { series: 'v4', stageDir: 'stage-04', fullStageId: 'v4-stage-04' }
23
+ * - 短名:stage-01 → { series: 'v1', stageDir: 'stage-01', fullStageId: 'v1.0.0-stage-01' }
24
+ *
25
+ * 无法解析(如 'foo'、'v1'、空字符串)返回 null。
26
+ * 注意 stageDir 保留原始数字格式(stage-04 不丢前导零),NN 用捕获组原样保留,不做 parseInt。
27
+ */
28
+ export function parseStageId(stageId) {
29
+ // 完整/历史格式:{version}-stage-{NN},version 可为 v1.0.0(四级)或 v4(仅主版本)
30
+ const full = stageId.match(/^(v\d+(?:\.\d+)*)-stage-(\d+)$/);
31
+ if (full) {
32
+ const version = full[1]; // v1.0.0 或 v4
33
+ const stageDir = `stage-${full[2]}`;
34
+ const series = version.split('.')[0]; // v1 或 v4
35
+ return { series, stageDir, fullStageId: stageId };
36
+ }
37
+ // 短名格式:stage-{NN}
38
+ const short = stageId.match(/^stage-(\d+)$/);
39
+ if (short) {
40
+ const stageDir = `stage-${short[1]}`;
41
+ return {
42
+ series: DEFAULT_SERIES,
43
+ stageDir,
44
+ fullStageId: `${DEFAULT_STAGE_VERSION}-${stageDir}`,
45
+ };
46
+ }
47
+ return null;
48
+ }
49
+ /**
50
+ * stageId → plan 相对目录(不含 .openfeel 前缀)
51
+ * 例:v1.0.0-stage-34 → 'plan/v1/stage-34/';stage-01 → 'plan/v1/stage-01/'
52
+ * 无法解析返回 null。
53
+ */
54
+ export function stageIdToPlanDir(stageId) {
55
+ const parsed = parseStageId(stageId);
56
+ if (!parsed) {
57
+ return null;
58
+ }
59
+ return `plan/${parsed.series}/${parsed.stageDir}/`;
60
+ }
61
+ /**
62
+ * 短名/完整 stageId → 规范化完整 stageId
63
+ * 短名 stage-01 → v1.0.0-stage-01;完整/历史格式原样返回。
64
+ * 无法解析返回 null。
65
+ */
66
+ export function normalizeStageId(stageId) {
67
+ const parsed = parseStageId(stageId);
68
+ return parsed ? parsed.fullStageId : null;
69
+ }
70
+ /**
71
+ * 目录名(stage-NN)→ 完整 stageId(反向映射,回查 flow.json stages 键)
72
+ *
73
+ * 目录名 stage-33 无法唯一还原版本前缀,须回查 flow.json 匹配 `*-stage-33`。
74
+ * 去歧义规则(遗留风险 1):若多个 stageId 匹配 `*-stage-{NN}`,
75
+ * 1. 优先 pipeline.current.stage(若在匹配集中);
76
+ * 2. 否则按版本前缀字典序降序取最新(v1.0.0 > v0.9 > v0.5)。
77
+ * 注:同 stage-NN 跨多版本前缀重复在理论上不应发生,此规则仅兜底。
78
+ *
79
+ * @returns 完整 stageId,找不到匹配或 flow.json 不可读时返回 null
80
+ */
81
+ export function planDirToStageId(projectPath, stageDir) {
82
+ const flowPath = resolve(projectPath, '.openfeel', 'flow.json');
83
+ if (!existsSync(flowPath)) {
84
+ return null;
85
+ }
86
+ let flowData;
87
+ try {
88
+ flowData = JSON.parse(readFileSync(flowPath, 'utf-8'));
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ const stages = flowData.stages ?? {};
94
+ const suffix = `-${stageDir}`; // -stage-33
95
+ const matches = Object.keys(stages).filter((k) => k.endsWith(suffix));
96
+ if (matches.length === 0) {
97
+ return null;
98
+ }
99
+ if (matches.length === 1) {
100
+ return matches[0];
101
+ }
102
+ // 去歧义:优先当前阶段,否则取版本字典序最新
103
+ const current = flowData.pipeline?.current?.stage;
104
+ if (current && matches.includes(current)) {
105
+ return current;
106
+ }
107
+ return matches.slice().sort().at(-1) ?? matches[0];
108
+ }
109
+ /**
110
+ * 三级回退查找 status.md(决策 4,供 flow-manager 与命令层复用)
111
+ *
112
+ * 1. plan/{series}/stage-NN/status.md(解析 stageId → 精确路径,首选)
113
+ * 2. plan/ 下递归搜索 stage-NN/status.md(fast-glob 递归,兼容 series 变化/旧平铺)
114
+ * 3. stages/{stageId}/status.md(历史遗留,只读兜底)
115
+ *
116
+ * 性能说明(遗留风险 3):第 1 级精确路径命中率最高(新写入均在此),
117
+ * 第 2 级 fast-glob 仅在精确未命中时触发(兼容旧数据/系列变化的罕见场景),
118
+ * 因此对 flow status 高频调用性能影响可控;本 stage 不做缓存,留作后续观察。
119
+ *
120
+ * @returns status.md 绝对路径,三级均未命中返回 null
121
+ */
122
+ export function findStageStatusPath(projectPath, stageId) {
123
+ const parsed = parseStageId(stageId);
124
+ if (parsed) {
125
+ // 1. 精确路径 plan/{series}/stage-NN/status.md
126
+ const exact = resolve(projectPath, '.openfeel', 'plan', parsed.series, parsed.stageDir, 'status.md');
127
+ if (existsSync(exact)) {
128
+ return exact;
129
+ }
130
+ // 2. 递归搜索 plan/**/stage-NN/status.md
131
+ const planDir = resolve(projectPath, '.openfeel', 'plan');
132
+ if (existsSync(planDir)) {
133
+ const matches = fastGlob.sync(`**/${parsed.stageDir}/status.md`, {
134
+ cwd: planDir,
135
+ onlyFiles: true,
136
+ caseSensitiveMatch: true,
137
+ });
138
+ if (matches.length > 0) {
139
+ return resolve(planDir, matches[0]);
140
+ }
141
+ }
142
+ }
143
+ // 3. 历史兜底 stages/{stageId}/status.md
144
+ const legacy = resolve(projectPath, '.openfeel', 'stages', stageId, 'status.md');
145
+ if (existsSync(legacy)) {
146
+ return legacy;
147
+ }
148
+ return null;
149
+ }
150
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/core/plan/path.ts"],"names":[],"mappings":"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"}
@@ -8,21 +8,22 @@ export interface Scheme {
8
8
  title: string;
9
9
  /** Markdown 全文 */
10
10
  content: string;
11
- /** 相对路径 .openfeel/stages/{stage}/ops/op-001_{title}.md */
11
+ /** 相对路径 .openfeel/plan/{series}/{stage}/ops/op-001_{title}.md */
12
12
  filePath: string;
13
13
  }
14
14
  /**
15
15
  * 创建操作方案
16
- * 在 .openfeel/stages/{stage}/ops/ 下创建 op-NNN_{title}.md
16
+ * 在 .openfeel/plan/{series}/{stage}/ops/ 下创建 op-NNN_{title}.md
17
17
  * NNN 自动递增(从该阶段的已有方案中计算)
18
18
  * 必须按固定模板生成,包含:目标、实施步骤(checkbox)、产出文件、自测清单、修正记录
19
19
  * 创建后自动同步到 flow.json(如果存在)
20
+ * @param stageName 阶段名(短名 stage-01 或完整 v1.0.0-stage-01 均可)
20
21
  * @returns opId(如 op-001)
21
22
  */
22
23
  export declare function createScheme(projectPath: string, stageName: string, title: string): string;
23
24
  /**
24
25
  * 读取操作方案
25
- * @param opId 操作ID(如 op-001)或完整 opId(如 stage-01.op-001)
26
+ * @param opId 操作ID(如 op-001)或完整 opId(如 stage-01.op-001 / v1.0.0-stage-01.op-001)
26
27
  * @returns Scheme 或 null
27
28
  */
28
29
  export declare function getScheme(projectPath: string, opId: string): Scheme | null;
@@ -1 +1 @@
1
- {"version":3,"file":"scheme.d.ts","sourceRoot":"","sources":["../../../src/core/plan/scheme.ts"],"names":[],"mappings":"AASA,WAAW;AACX,MAAM,WAAW,MAAM;IACrB,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAoID;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAwB1F;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4D1E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAyD7E"}
1
+ {"version":3,"file":"scheme.d.ts","sourceRoot":"","sources":["../../../src/core/plan/scheme.ts"],"names":[],"mappings":"AAUA,WAAW;AACX,MAAM,WAAW,MAAM;IACrB,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAqID;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA8B1F;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA+B1E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA6E7E"}
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * 操作方案管理(Schemer 产出层)
3
- * 负责 .openfeel/stages/{stage}/ops/ 下的操作方案文件 CRUD
3
+ * 负责 .openfeel/plan/{series}/{stage}/ops/ 下的操作方案文件 CRUD
4
4
  * 创建后自动同步到 flow.json 的 stages/{stage}.ops 中
5
5
  */
6
6
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
7
7
  import { resolve, join } from 'node:path';
8
8
  import { FlowManager } from '../flow-manager.js';
9
+ import { parseStageId } from './path.js';
9
10
  /**
10
11
  * 生成操作方案的固定 Markdown 模板
11
12
  */
@@ -75,6 +76,7 @@ function getNextOpId(opsDir) {
75
76
  /**
76
77
  * 同步方案到 flow.json
77
78
  * 若 flow.json 不存在或对应 stage 不存在,跳过同步(不报错)
79
+ * @param stageName 完整 stageId(如 v1.0.0-stage-01,调用方已规范化)
78
80
  */
79
81
  function syncToFlowJson(projectPath, stageName, opId, title) {
80
82
  const flowJsonPath = resolve(projectPath, '.openfeel', 'flow.json');
@@ -122,15 +124,21 @@ function syncToFlowJson(projectPath, stageName, opId, title) {
122
124
  }
123
125
  /**
124
126
  * 创建操作方案
125
- * 在 .openfeel/stages/{stage}/ops/ 下创建 op-NNN_{title}.md
127
+ * 在 .openfeel/plan/{series}/{stage}/ops/ 下创建 op-NNN_{title}.md
126
128
  * NNN 自动递增(从该阶段的已有方案中计算)
127
129
  * 必须按固定模板生成,包含:目标、实施步骤(checkbox)、产出文件、自测清单、修正记录
128
130
  * 创建后自动同步到 flow.json(如果存在)
131
+ * @param stageName 阶段名(短名 stage-01 或完整 v1.0.0-stage-01 均可)
129
132
  * @returns opId(如 op-001)
130
133
  */
131
134
  export function createScheme(projectPath, stageName, title) {
132
- // 1. 确保 .openfeel/stages/{stage}/ops/ 目录存在
133
- const opsDir = resolve(projectPath, '.openfeel', 'stages', stageName, 'ops');
135
+ // 解析 stageId(短名/完整)得到 series + stageDir + 完整 ID
136
+ const parsed = parseStageId(stageName);
137
+ if (!parsed) {
138
+ throw new Error(`非法阶段名: ${stageName}(应为 stage-NN 或 vX.Y.Z.W-stage-NN)`);
139
+ }
140
+ // 1. 确保 .openfeel/plan/{series}/{stageDir}/ops/ 目录存在
141
+ const opsDir = resolve(projectPath, '.openfeel', 'plan', parsed.series, parsed.stageDir, 'ops');
134
142
  if (!existsSync(opsDir)) {
135
143
  mkdirSync(opsDir, { recursive: true });
136
144
  }
@@ -141,66 +149,45 @@ export function createScheme(projectPath, stageName, title) {
141
149
  const safeTitle = title.replace(/\s+/g, '_');
142
150
  const fileName = `${opId}_${safeTitle}.md`;
143
151
  const filePath = join(opsDir, fileName);
144
- const content = generateSchemeTemplate(opId, stageName, title);
152
+ const content = generateSchemeTemplate(opId, parsed.fullStageId, title);
145
153
  writeFileSync(filePath, content, 'utf-8');
146
- // 4. 同步到 flow.json
147
- syncToFlowJson(projectPath, stageName, opId, title);
154
+ // 4. 同步到 flow.json(键用完整 stageId)
155
+ syncToFlowJson(projectPath, parsed.fullStageId, opId, title);
148
156
  // 5. 返回 opId
149
157
  return opId;
150
158
  }
151
159
  /**
152
160
  * 读取操作方案
153
- * @param opId 操作ID(如 op-001)或完整 opId(如 stage-01.op-001)
161
+ * @param opId 操作ID(如 op-001)或完整 opId(如 stage-01.op-001 / v1.0.0-stage-01.op-001)
154
162
  * @returns Scheme 或 null
155
163
  */
156
164
  export function getScheme(projectPath, opId) {
157
- const stagesDir = resolve(projectPath, '.openfeel', 'stages');
158
- if (!existsSync(stagesDir)) {
159
- return null;
160
- }
161
- let targetStageName;
165
+ let targetStage = null;
162
166
  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);
167
+ // 解析 opId:'{stage}.{op-XXX}' 或纯 '{op-XXX}'
168
+ // 用正则锚定尾部 .op-NNN,避免完整 stageId 版本号中的点号干扰
169
+ const match = opId.match(/^(.+)\.(op-\d+)$/);
170
+ if (match) {
171
+ targetStage = match[1];
172
+ targetOpId = match[2];
168
173
  }
169
174
  else {
170
- targetStageName = ''; // 遍历所有阶段查找
175
+ targetStage = null;
171
176
  targetOpId = opId;
172
177
  }
173
- // 读取 stages 目录下的子目录
174
- const stageEntries = readdirSync(stagesDir, { withFileTypes: true });
175
- for (const stageEntry of stageEntries) {
176
- if (!stageEntry.isDirectory()) {
177
- continue;
178
+ // 若指定阶段,解析出 stageDir 后遍历查找
179
+ let targetStageDir = null;
180
+ if (targetStage) {
181
+ const parsed = parseStageId(targetStage);
182
+ if (!parsed) {
183
+ return null; // 阶段名非法
178
184
  }
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;
185
+ targetStageDir = parsed.stageDir;
186
+ }
187
+ for (const scheme of listSchemes(projectPath, targetStageDir ?? undefined)) {
188
+ if (scheme.opId === targetOpId) {
189
+ return scheme;
191
190
  }
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
191
  }
205
192
  return null;
206
193
  }
@@ -209,44 +196,61 @@ export function getScheme(projectPath, opId) {
209
196
  * @param stageName 可选,不传则列出所有阶段的方案
210
197
  */
211
198
  export function listSchemes(projectPath, stageName) {
212
- const stagesDir = resolve(projectPath, '.openfeel', 'stages');
199
+ const planDir = resolve(projectPath, '.openfeel', 'plan');
213
200
  const result = [];
214
- if (!existsSync(stagesDir)) {
201
+ if (!existsSync(planDir)) {
215
202
  return result;
216
203
  }
217
- // 若指定了阶段名,只遍历该阶段
218
- const stageNames = [];
204
+ // 解析目标 stageDir(若指定阶段过滤)
205
+ let targetStageDir = null;
219
206
  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
- }
207
+ const parsed = parseStageId(stageName);
208
+ if (!parsed) {
209
+ return result; // 阶段名非法时返回空
228
210
  }
211
+ targetStageDir = parsed.stageDir;
229
212
  }
230
- for (const sn of stageNames) {
231
- const opsDir = join(stagesDir, sn, 'ops');
232
- if (!existsSync(opsDir)) {
213
+ // 遍历 plan/{series}/stage-NN/ 两层目录
214
+ const seriesEntries = readdirSync(planDir, { withFileTypes: true });
215
+ for (const seriesEntry of seriesEntries) {
216
+ if (!seriesEntry.isDirectory()) {
217
+ continue;
218
+ }
219
+ const seriesDir = join(planDir, seriesEntry.name);
220
+ let stageEntries;
221
+ try {
222
+ stageEntries = readdirSync(seriesDir, { withFileTypes: true });
223
+ }
224
+ catch {
233
225
  continue;
234
226
  }
235
- const opFiles = readdirSync(opsDir).filter((f) => f.endsWith('.md'));
236
- for (const fileName of opFiles) {
237
- const opId = extractOpId(fileName);
238
- if (!opId) {
227
+ for (const stageEntry of stageEntries) {
228
+ if (!stageEntry.isDirectory()) {
239
229
  continue;
240
230
  }
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
- });
231
+ if (targetStageDir && stageEntry.name !== targetStageDir) {
232
+ continue;
233
+ }
234
+ const opsDir = join(seriesDir, stageEntry.name, 'ops');
235
+ if (!existsSync(opsDir)) {
236
+ continue;
237
+ }
238
+ const opFiles = readdirSync(opsDir).filter((f) => f.endsWith('.md'));
239
+ for (const fileName of opFiles) {
240
+ const opId = extractOpId(fileName);
241
+ if (!opId) {
242
+ continue;
243
+ }
244
+ const filePath = join(opsDir, fileName);
245
+ const content = readFileSync(filePath, 'utf-8');
246
+ result.push({
247
+ opId,
248
+ stage: stageEntry.name,
249
+ title: extractTitle(fileName),
250
+ content,
251
+ filePath: `.openfeel/plan/${seriesEntry.name}/${stageEntry.name}/ops/${fileName}`,
252
+ });
253
+ }
250
254
  }
251
255
  }
252
256
  // 按阶段名 + opId 排序
@@ -1 +1 @@
1
- {"version":3,"file":"scheme.js","sourceRoot":"","sources":["../../../src/core/plan/scheme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scheme.js","sourceRoot":"","sources":["../../../src/core/plan/scheme.ts"],"names":[],"mappings":"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"}
@@ -2,14 +2,14 @@
2
2
  export interface Stage {
3
3
  /** 阶段名,如 stage-01 */
4
4
  name: string;
5
- /** 相对路径 .openfeel/stages/stage-01/ */
5
+ /** 相对路径 .openfeel/plan/v1/stage-01/ */
6
6
  path: string;
7
7
  /** overview.md 内容 */
8
8
  overview: string;
9
9
  }
10
10
  /**
11
11
  * 添加工作阶段
12
- * 在 .openfeel/stages/ 下创建 {name}/ 目录,包含 overview.md 和 status.md 骨架
12
+ * 在 .openfeel/plan/{series}/ 下创建 {stage}/ 目录,包含 overview.md 和 status.md 骨架
13
13
  * @param deps 依赖的阶段名列表(可选,写入 overview.md)
14
14
  */
15
15
  export declare function addStage(projectPath: string, name: string, deps?: string[]): void;
@@ -1 +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"}
1
+ {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../../src/core/plan/stage.ts"],"names":[],"mappings":"AASA,WAAW;AACX,MAAM,WAAW,KAAK;IACpB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,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,CAgFjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,CAkDvD"}
@@ -1,32 +1,33 @@
1
1
  /**
2
2
  * 工作阶段管理
3
- * 负责 .openfeel/stages/ 下的阶段目录创建与列取
3
+ * 负责 .openfeel/plan/{series}/ 下的阶段目录创建与列取
4
4
  */
5
5
  import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
6
6
  import { resolve, join } from 'node:path';
7
7
  import { FlowManager } from '../flow-manager.js';
8
+ import { parseStageId } from './path.js';
8
9
  /**
9
10
  * 添加工作阶段
10
- * 在 .openfeel/stages/ 下创建 {name}/ 目录,包含 overview.md 和 status.md 骨架
11
+ * 在 .openfeel/plan/{series}/ 下创建 {stage}/ 目录,包含 overview.md 和 status.md 骨架
11
12
  * @param deps 依赖的阶段名列表(可选,写入 overview.md)
12
13
  */
13
14
  export function addStage(projectPath, name, deps) {
14
- const stagesDir = resolve(projectPath, '.openfeel', 'stages');
15
- // 确保 stages 目录存在
16
- if (!existsSync(stagesDir)) {
17
- mkdirSync(stagesDir, { recursive: true });
15
+ // 解析 stageId(短名/完整),无法解析时抛错
16
+ const parsed = parseStageId(name);
17
+ if (!parsed) {
18
+ throw new Error(`非法阶段名: ${name}(应为 stage-NN 或 vX.Y.Z.W-stage-NN)`);
18
19
  }
19
- const stageDir = join(stagesDir, name);
20
+ const stageDir = resolve(projectPath, '.openfeel', 'plan', parsed.series, parsed.stageDir);
20
21
  // 确保阶段目录存在
21
22
  if (!existsSync(stageDir)) {
22
23
  mkdirSync(stageDir, { recursive: true });
23
24
  }
24
25
  // 若目录已存在,不覆盖已有文件,只创建缺失的
25
- // 创建 overview.md(若不存在)
26
+ // 创建 overview.md(若不存在)— 标题用完整 stageId
26
27
  const overviewPath = join(stageDir, 'overview.md');
27
28
  if (!existsSync(overviewPath)) {
28
29
  const depsText = deps && deps.length > 0 ? deps.map((d) => `- ${d}`).join('\n') : '无';
29
- const overviewContent = `# ${name}
30
+ const overviewContent = `# ${parsed.fullStageId}
30
31
 
31
32
  ## 目标
32
33
 
@@ -42,10 +43,10 @@ ${depsText}
42
43
  `;
43
44
  writeFileSync(overviewPath, overviewContent, 'utf-8');
44
45
  }
45
- // 创建 status.md(若不存在)
46
+ // 创建 status.md(若不存在)— 标题用完整 stageId
46
47
  const statusPath = join(stageDir, 'status.md');
47
48
  if (!existsSync(statusPath)) {
48
- const statusContent = `# ${name} 状态
49
+ const statusContent = `# ${parsed.fullStageId} 状态
49
50
 
50
51
  - **执行模式**:manual
51
52
  - **自动推进**:disabled
@@ -78,10 +79,10 @@ ${depsText}
78
79
  `;
79
80
  writeFileSync(statusPath, statusContent, 'utf-8');
80
81
  }
81
- // 同步到 flow.json(若 flow.json 存在)
82
+ // 同步到 flow.json(若存在)— 键用完整 stageId
82
83
  const flowMgr = new FlowManager(projectPath);
83
84
  if (flowMgr.isLoaded()) {
84
- flowMgr.registerStage(name, deps ?? []);
85
+ flowMgr.registerStage(parsed.fullStageId, deps ?? []);
85
86
  flowMgr.save();
86
87
  }
87
88
  }
@@ -89,29 +90,42 @@ ${depsText}
89
90
  * 列出所有工作阶段
90
91
  */
91
92
  export function listStages(projectPath) {
92
- const stagesDir = resolve(projectPath, '.openfeel', 'stages');
93
+ const planDir = resolve(projectPath, '.openfeel', 'plan');
93
94
  // 目录不存在时返回空列表
94
- if (!existsSync(stagesDir)) {
95
+ if (!existsSync(planDir)) {
95
96
  return [];
96
97
  }
97
98
  const result = [];
98
- // 遍历子目录
99
- const entries = readdirSync(stagesDir, { withFileTypes: true });
100
- for (const entry of entries) {
101
- if (!entry.isDirectory()) {
99
+ // 遍历 plan/{series}/ 下的 series 目录,再遍历其下 stage-NN 目录
100
+ const seriesEntries = readdirSync(planDir, { withFileTypes: true });
101
+ for (const seriesEntry of seriesEntries) {
102
+ if (!seriesEntry.isDirectory()) {
102
103
  continue;
103
104
  }
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');
105
+ const seriesDir = join(planDir, seriesEntry.name);
106
+ let stageEntries;
107
+ try {
108
+ stageEntries = readdirSync(seriesDir, { withFileTypes: true });
109
+ }
110
+ catch {
111
+ continue; // series 目录不可读时跳过
112
+ }
113
+ for (const stageEntry of stageEntries) {
114
+ if (!stageEntry.isDirectory()) {
115
+ continue;
116
+ }
117
+ const stageDirPath = join(seriesDir, stageEntry.name);
118
+ const overviewPath = join(stageDirPath, 'overview.md');
119
+ let overview = '';
120
+ if (existsSync(overviewPath)) {
121
+ overview = readFileSync(overviewPath, 'utf-8');
122
+ }
123
+ result.push({
124
+ name: stageEntry.name,
125
+ path: `.openfeel/plan/${seriesEntry.name}/${stageEntry.name}/`,
126
+ overview,
127
+ });
109
128
  }
110
- result.push({
111
- name: entry.name,
112
- path: `.openfeel/stages/${entry.name}/`,
113
- overview,
114
- });
115
129
  }
116
130
  // 按名称排序
117
131
  result.sort((a, b) => a.name.localeCompare(b.name));
@@ -1 +1 @@
1
- {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/core/plan/stage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/core/plan/stage.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"template-loader.d.ts","sourceRoot":"","sources":["../../src/core/template-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAu2FH;;;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;AA8rHD,eAAO,MAAM,kBAAkB,EAAE,MAAqC,CAAC;AACvE,eAAO,MAAM,8BAA8B,EAAE,MAA6C,CAAC;AAE3F;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO/E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAWnF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAG3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD"}
1
+ {"version":3,"file":"template-loader.d.ts","sourceRoot":"","sources":["../../src/core/template-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAu2FH;;;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;AAgsHD,eAAO,MAAM,kBAAkB,EAAE,MAAqC,CAAC;AACvE,eAAO,MAAM,8BAA8B,EAAE,MAA6C,CAAC;AAE3F;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO/E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAWnF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAG3D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD"}