openfeel 1.1.0 → 1.1.2

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 (203) hide show
  1. package/README.en.md +42 -12
  2. package/README.md +8 -3
  3. package/README.zh-CN.md +43 -13
  4. package/bin/openfeel.js +5 -0
  5. package/dist/cli/index.d.ts +15 -3
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +61 -15
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/cli/output-encoding.d.ts +41 -0
  10. package/dist/cli/output-encoding.d.ts.map +1 -0
  11. package/dist/cli/output-encoding.js +165 -0
  12. package/dist/cli/output-encoding.js.map +1 -0
  13. package/dist/cli/repl.d.ts +2 -2
  14. package/dist/cli/repl.d.ts.map +1 -1
  15. package/dist/cli/repl.js +46 -25
  16. package/dist/cli/repl.js.map +1 -1
  17. package/dist/commands/config.d.ts.map +1 -1
  18. package/dist/commands/config.js +56 -9
  19. package/dist/commands/config.js.map +1 -1
  20. package/dist/commands/flow.d.ts.map +1 -1
  21. package/dist/commands/flow.js +827 -138
  22. package/dist/commands/flow.js.map +1 -1
  23. package/dist/commands/init.d.ts +2 -1
  24. package/dist/commands/init.d.ts.map +1 -1
  25. package/dist/commands/init.js +58 -39
  26. package/dist/commands/init.js.map +1 -1
  27. package/dist/commands/knowledge.d.ts.map +1 -1
  28. package/dist/commands/knowledge.js +69 -0
  29. package/dist/commands/knowledge.js.map +1 -1
  30. package/dist/commands/lint.d.ts.map +1 -1
  31. package/dist/commands/lint.js +17 -5
  32. package/dist/commands/lint.js.map +1 -1
  33. package/dist/commands/migrate.d.ts.map +1 -1
  34. package/dist/commands/migrate.js +15 -1
  35. package/dist/commands/migrate.js.map +1 -1
  36. package/dist/commands/model.d.ts.map +1 -1
  37. package/dist/commands/model.js +18 -1
  38. package/dist/commands/model.js.map +1 -1
  39. package/dist/commands/plan.d.ts.map +1 -1
  40. package/dist/commands/plan.js +185 -7
  41. package/dist/commands/plan.js.map +1 -1
  42. package/dist/commands/project.js +2 -2
  43. package/dist/commands/project.js.map +1 -1
  44. package/dist/commands/roadmap.d.ts.map +1 -1
  45. package/dist/commands/roadmap.js +20 -5
  46. package/dist/commands/roadmap.js.map +1 -1
  47. package/dist/commands/setup.d.ts +7 -0
  48. package/dist/commands/setup.d.ts.map +1 -0
  49. package/dist/commands/setup.js +37 -0
  50. package/dist/commands/setup.js.map +1 -0
  51. package/dist/commands/shared/errors.d.ts +22 -0
  52. package/dist/commands/shared/errors.d.ts.map +1 -0
  53. package/dist/commands/shared/errors.js +45 -0
  54. package/dist/commands/shared/errors.js.map +1 -0
  55. package/dist/commands/stage.d.ts.map +1 -1
  56. package/dist/commands/stage.js +133 -23
  57. package/dist/commands/stage.js.map +1 -1
  58. package/dist/commands/update.d.ts.map +1 -1
  59. package/dist/commands/update.js +1 -10
  60. package/dist/commands/update.js.map +1 -1
  61. package/dist/commands/view.d.ts +1 -1
  62. package/dist/commands/view.d.ts.map +1 -1
  63. package/dist/commands/view.js +4 -26
  64. package/dist/commands/view.js.map +1 -1
  65. package/dist/core/archive/merge.d.ts.map +1 -1
  66. package/dist/core/archive/merge.js +9 -5
  67. package/dist/core/archive/merge.js.map +1 -1
  68. package/dist/core/artifact-graph/graph.d.ts +7 -2
  69. package/dist/core/artifact-graph/graph.d.ts.map +1 -1
  70. package/dist/core/artifact-graph/graph.js +25 -18
  71. package/dist/core/artifact-graph/graph.js.map +1 -1
  72. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
  73. package/dist/core/artifact-graph/instruction-loader.js +4 -33
  74. package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
  75. package/dist/core/backup.d.ts +28 -0
  76. package/dist/core/backup.d.ts.map +1 -0
  77. package/dist/core/backup.js +118 -0
  78. package/dist/core/backup.js.map +1 -0
  79. package/dist/core/config.d.ts +30 -19
  80. package/dist/core/config.d.ts.map +1 -1
  81. package/dist/core/config.js +86 -26
  82. package/dist/core/config.js.map +1 -1
  83. package/dist/core/flow-manager.d.ts +256 -5
  84. package/dist/core/flow-manager.d.ts.map +1 -1
  85. package/dist/core/flow-manager.js +908 -68
  86. package/dist/core/flow-manager.js.map +1 -1
  87. package/dist/core/fs/atomic-write.d.ts +3 -0
  88. package/dist/core/fs/atomic-write.d.ts.map +1 -1
  89. package/dist/core/fs/atomic-write.js +3 -0
  90. package/dist/core/fs/atomic-write.js.map +1 -1
  91. package/dist/core/fs/safe-read.d.ts +11 -0
  92. package/dist/core/fs/safe-read.d.ts.map +1 -0
  93. package/dist/core/fs/safe-read.js +31 -0
  94. package/dist/core/fs/safe-read.js.map +1 -0
  95. package/dist/core/global-paths.d.ts +17 -6
  96. package/dist/core/global-paths.d.ts.map +1 -1
  97. package/dist/core/global-paths.js +26 -7
  98. package/dist/core/global-paths.js.map +1 -1
  99. package/dist/core/i18n-data/en.d.ts +3 -0
  100. package/dist/core/i18n-data/en.d.ts.map +1 -1
  101. package/dist/core/i18n-data/en.js +271 -18
  102. package/dist/core/i18n-data/en.js.map +1 -1
  103. package/dist/core/i18n-data/zh-CN.d.ts +3 -0
  104. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
  105. package/dist/core/i18n-data/zh-CN.js +278 -18
  106. package/dist/core/i18n-data/zh-CN.js.map +1 -1
  107. package/dist/core/i18n.d.ts +8 -0
  108. package/dist/core/i18n.d.ts.map +1 -1
  109. package/dist/core/i18n.js +14 -4
  110. package/dist/core/i18n.js.map +1 -1
  111. package/dist/core/init.d.ts +12 -15
  112. package/dist/core/init.d.ts.map +1 -1
  113. package/dist/core/init.js +85 -142
  114. package/dist/core/init.js.map +1 -1
  115. package/dist/core/managed-region.d.ts +1 -1
  116. package/dist/core/managed-region.js +1 -1
  117. package/dist/core/metrics.d.ts +16 -4
  118. package/dist/core/metrics.d.ts.map +1 -1
  119. package/dist/core/metrics.js +31 -11
  120. package/dist/core/metrics.js.map +1 -1
  121. package/dist/core/migrate.d.ts +12 -0
  122. package/dist/core/migrate.d.ts.map +1 -1
  123. package/dist/core/migrate.js +88 -29
  124. package/dist/core/migrate.js.map +1 -1
  125. package/dist/core/model-config.d.ts.map +1 -1
  126. package/dist/core/model-config.js +4 -2
  127. package/dist/core/model-config.js.map +1 -1
  128. package/dist/core/opencode-config.d.ts +4 -4
  129. package/dist/core/opencode-config.d.ts.map +1 -1
  130. package/dist/core/opencode-config.js +20 -7
  131. package/dist/core/opencode-config.js.map +1 -1
  132. package/dist/core/plan/path.d.ts +40 -0
  133. package/dist/core/plan/path.d.ts.map +1 -1
  134. package/dist/core/plan/path.js +108 -1
  135. package/dist/core/plan/path.js.map +1 -1
  136. package/dist/core/plan/roadmap.js +2 -2
  137. package/dist/core/plan/roadmap.js.map +1 -1
  138. package/dist/core/plan/scheme.d.ts +74 -2
  139. package/dist/core/plan/scheme.d.ts.map +1 -1
  140. package/dist/core/plan/scheme.js +311 -26
  141. package/dist/core/plan/scheme.js.map +1 -1
  142. package/dist/core/plan/stage.d.ts +34 -3
  143. package/dist/core/plan/stage.d.ts.map +1 -1
  144. package/dist/core/plan/stage.js +90 -6
  145. package/dist/core/plan/stage.js.map +1 -1
  146. package/dist/core/public-logger.d.ts +18 -5
  147. package/dist/core/public-logger.d.ts.map +1 -1
  148. package/dist/core/public-logger.js +62 -23
  149. package/dist/core/public-logger.js.map +1 -1
  150. package/dist/core/runtime-log.d.ts +25 -0
  151. package/dist/core/runtime-log.d.ts.map +1 -0
  152. package/dist/core/runtime-log.js +94 -0
  153. package/dist/core/runtime-log.js.map +1 -0
  154. package/dist/core/setup.d.ts +10 -0
  155. package/dist/core/setup.d.ts.map +1 -0
  156. package/dist/core/setup.js +103 -0
  157. package/dist/core/setup.js.map +1 -0
  158. package/dist/core/template-loader.d.ts +4 -5
  159. package/dist/core/template-loader.d.ts.map +1 -1
  160. package/dist/core/template-loader.js +1322 -259
  161. package/dist/core/template-loader.js.map +1 -1
  162. package/dist/core/templates.d.ts +4 -4
  163. package/dist/core/templates.d.ts.map +1 -1
  164. package/dist/core/templates.js +15 -11
  165. package/dist/core/templates.js.map +1 -1
  166. package/dist/core/update-infos.d.ts +14 -3
  167. package/dist/core/update-infos.d.ts.map +1 -1
  168. package/dist/core/update-infos.js +67 -15
  169. package/dist/core/update-infos.js.map +1 -1
  170. package/dist/core/update-state.d.ts.map +1 -1
  171. package/dist/core/update-state.js +7 -4
  172. package/dist/core/update-state.js.map +1 -1
  173. package/dist/core/update.d.ts +2 -7
  174. package/dist/core/update.d.ts.map +1 -1
  175. package/dist/core/update.js +338 -149
  176. package/dist/core/update.js.map +1 -1
  177. package/dist/core/view/entry.d.ts +53 -1
  178. package/dist/core/view/entry.d.ts.map +1 -1
  179. package/dist/core/view/entry.js +71 -2
  180. package/dist/core/view/entry.js.map +1 -1
  181. package/dist/core/workspace/identity.d.ts.map +1 -1
  182. package/dist/core/workspace/identity.js +15 -5
  183. package/dist/core/workspace/identity.js.map +1 -1
  184. package/dist/core/workspace/knowledge.d.ts.map +1 -1
  185. package/dist/core/workspace/knowledge.js +125 -19
  186. package/dist/core/workspace/knowledge.js.map +1 -1
  187. package/dist/core/workspace/structure.d.ts.map +1 -1
  188. package/dist/core/workspace/structure.js +6 -2
  189. package/dist/core/workspace/structure.js.map +1 -1
  190. package/dist/index.d.ts +0 -1
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.js +1 -2
  193. package/dist/index.js.map +1 -1
  194. package/dist/utils/kb-dedup.d.ts +5 -1
  195. package/dist/utils/kb-dedup.d.ts.map +1 -1
  196. package/dist/utils/kb-dedup.js +11 -5
  197. package/dist/utils/kb-dedup.js.map +1 -1
  198. package/package.json +6 -6
  199. package/dist/utils/path.d.ts +0 -22
  200. package/dist/utils/path.d.ts.map +0 -1
  201. package/dist/utils/path.js +0 -37
  202. package/dist/utils/path.js.map +0 -1
  203. package/scripts/patch-inquirer.js +0 -70
@@ -5,8 +5,10 @@
5
5
  */
6
6
  import { existsSync, mkdirSync, readFileSync, readdirSync } from 'node:fs';
7
7
  import { resolve, join } from 'node:path';
8
- import { FlowManager, isFlowConcurrentError } from '../flow-manager.js';
9
- import { parseStageId } from './path.js';
8
+ import { FlowManager, isFlowConcurrentError, isTemplateEmpty, EMPTY_TEMPLATE_MARKER } from '../flow-manager.js';
9
+ import { parseStageId, validateStageId, findStageDirConflict, normalizeStageId } from './path.js';
10
+ import { ensureStageSkeleton } from './stage.js';
11
+ import { t, getCliLang } from '../i18n.js';
10
12
  import { atomicWriteFileSync } from '../fs/atomic-write.js';
11
13
  import { withFileLock, projectLockPath } from '../fs/file-lock.js';
12
14
  import { reserveSequence } from '../fs/sequence.js';
@@ -26,13 +28,13 @@ function generateSchemeTemplate(opId, stageName, title) {
26
28
  ${title}
27
29
 
28
30
  ## 实施步骤
29
- - [ ] 待补充
31
+ ${EMPTY_TEMPLATE_MARKER}
30
32
 
31
33
  ## 产出文件
32
34
  - 待补充
33
35
 
34
36
  ## 自测清单
35
- - [ ] 待补充
37
+ ${EMPTY_TEMPLATE_MARKER}
36
38
 
37
39
  ## 修正记录
38
40
  | 次数 | 时间 | 问题 | 修正内容 |
@@ -41,31 +43,45 @@ ${title}
41
43
  }
42
44
  /**
43
45
  * 从文件名中提取 opId
44
- * 文件名格式:op-NNN_{title}.md
46
+ * 文件名格式:op-NNN.md(新)或 op-NNN_{title}.md(历史)
45
47
  */
46
48
  function extractOpId(fileName) {
47
49
  const match = fileName.match(/^(op-\d+)/);
48
50
  return match ? match[1] : null;
49
51
  }
50
52
  /**
51
- * 从文件名中提取标题
52
- * 文件名格式:op-NNN_{title}.md
53
+ * 读取 op 标题(兼容两种命名,N8-2)。
54
+ * - 历史命名 `op-NNN_{title}.md`:沿用文件名解析(原行为,零变化)
55
+ * - 新命名 `op-NNN.md`:读文件内容首个 `# op-NNN:{title}` 行(标题权威来源)
56
+ * IO 失败 / 无标题行 → 回退文件名(去 `.md`),不抛错(列表命令需健壮)。
57
+ * @param filePath op 文件的绝对路径
58
+ * @param fileName 文件名(历史命名解析与回退用)
53
59
  */
54
- function extractTitle(fileName) {
55
- // 去掉 op-NNN_ 前缀和 .md 后缀
56
- const noPrefix = fileName.replace(/^op-\d+_?/, '');
57
- return noPrefix.replace(/\.md$/, '').replace(/_/g, ' ');
60
+ function extractTitle(filePath, fileName) {
61
+ // ① 历史命名:op-NNN_标题.md → 文件名解析(原行为)
62
+ const legacy = fileName.match(/^op-\d+_(.+)\.md$/);
63
+ if (legacy) {
64
+ return legacy[1].replace(/_/g, ' ');
65
+ }
66
+ // ② 新命名 op-NNN.md:读内容首行标题(模板首行为 `# {opId}:{title}`)
67
+ try {
68
+ const content = readFileSync(filePath, 'utf-8');
69
+ const m = content.match(/^#\s*op-\d+[::]\s*(.+)$/m);
70
+ if (m) {
71
+ return m[1].trim();
72
+ }
73
+ }
74
+ catch {
75
+ // IO 失败静默回退文件名(列表命令不应因单个坏文件中断)
76
+ }
77
+ // ③ 回退:文件名去扩展(op-NNN)
78
+ return fileName.replace(/\.md$/, '');
58
79
  }
59
80
  /** 序号 → opId(3 位补零) */
60
81
  function opIdOf(seq) {
61
82
  return `op-${String(seq).padStart(3, '0')}`;
62
83
  }
63
- /**
64
- * 同步方案到 flow.json
65
- * 若 flow.json 不存在或对应 stage 不存在,跳过同步(不报错)
66
- * @param stageName 完整 stageId(如 v1.0.0-stage-01,调用方已规范化)
67
- */
68
- function syncToFlowJson(projectPath, stageName, opId, title) {
84
+ function syncToFlowJson(projectPath, stageName, opId, title, onImplicitRegister, draft) {
69
85
  const flowJsonPath = resolve(projectPath, '.openfeel', 'flow.json');
70
86
  if (!existsSync(flowJsonPath)) {
71
87
  return;
@@ -79,6 +95,20 @@ function syncToFlowJson(projectPath, stageName, opId, title) {
79
95
  // 检查 stage 是否存在
80
96
  // 若 stage 未在 flow.json 中注册,自动注册
81
97
  if (!flowData.stages[stageName]) {
98
+ // 兜底自动注册前先校验:非法 stageId / (series, stageDir) 冲突
99
+ // (补齐 stage-41 op-002 的绕过缺口,REV-v1.1.2-stage-41 REV-003)
100
+ const v = validateStageId(stageName);
101
+ if (!v.ok) {
102
+ // 不静默吞错(外层 try/catch 会吞非并发错误):显式告警并跳过自动注册
103
+ console.warn(t('plan.scheme.skipAutoRegisterTmpl', getCliLang(projectPath), { reason: v.reason ?? '' }));
104
+ return;
105
+ }
106
+ const conflict = findStageDirConflict(projectPath, stageName);
107
+ if (conflict) {
108
+ // 命中既有不同 stageId 映射同一目录:告警并跳过自动注册,避免写入脏键
109
+ console.warn(t('plan.scheme.dirConflictSkipTmpl', getCliLang(projectPath), { stage: stageName, other: conflict }));
110
+ return;
111
+ }
82
112
  flowData.stages[stageName] = {
83
113
  name: stageName,
84
114
  phase: 'plan_pending',
@@ -86,12 +116,27 @@ function syncToFlowJson(projectPath, stageName, opId, title) {
86
116
  deps: [],
87
117
  ops: {},
88
118
  };
119
+ // N3-1:隐式注册时按注册语义补齐阶段骨架(复用 ensureStageSkeleton,幂等)
120
+ // 注意:此处位于「非法 stageId / (series,stageDir) 冲突 → 跳过注册」分支之后,
121
+ // 跳过分支已 return,故不会为其建骨架(与跳过语义一致)。
122
+ let skeletonCreated = false;
123
+ try {
124
+ skeletonCreated = ensureStageSkeleton(projectPath, stageName);
125
+ }
126
+ catch (err) {
127
+ // 骨架创建失败(权限/IO):告警但不中止(op 文件与 flow.json 条目已写)
128
+ console.warn(t('plan.scheme.skeletonWarnTmpl', getCliLang(projectPath), {
129
+ err: err instanceof Error ? err.message : String(err),
130
+ }));
131
+ }
132
+ onImplicitRegister?.({ stage: stageName, skeletonCreated });
89
133
  }
90
134
  // 将 op 注册到 stages.{stageName}.ops 中
135
+ // B4-1:draft=true → 以 draft(未发布)状态注册;缺省/ false → pending(现行为,零破坏)
91
136
  flowData.stages[stageName].ops[opId] = {
92
137
  id: opId,
93
138
  title,
94
- state: 'pending',
139
+ state: draft ? 'draft' : 'pending',
95
140
  assignee: 'openfeel-executor',
96
141
  attempts: 0,
97
142
  max_attempts: 3,
@@ -103,13 +148,18 @@ function syncToFlowJson(projectPath, stageName, opId, title) {
103
148
  test: 'pending',
104
149
  },
105
150
  };
151
+ // 审计日志(P7):op 注册成功,记录 register_op(agent=cli)
152
+ flowMgr.appendLog({ time: '', agent: 'cli', action: 'register_op', detail: { stageName, opId } });
153
+ // B4-1:draft 创建额外留痕(scheme_create + draft:true),便于识别未发布来源
154
+ if (draft) {
155
+ flowMgr.appendLog({ time: '', agent: 'cli', action: 'scheme_create', detail: { stageName, opId, draft: true } });
156
+ }
106
157
  flowMgr.save();
107
158
  }
108
159
  catch (err) {
109
160
  // 并发冲突:op 文件已创建,但 flow.json 注册失败;不静默吞错,告警并提示兜底
110
161
  if (isFlowConcurrentError(err)) {
111
- console.warn(`[WARN] op ${opId} 已创建,但 flow.json 同步因并发冲突失败;` +
112
- `请执行 openfeel flow repair 兜底或重新注册该 op。`);
162
+ console.warn(t('plan.scheme.concurrentSkipTmpl', getCliLang(projectPath), { opId }));
113
163
  return;
114
164
  }
115
165
  // 其它同步失败不阻塞方案创建(既有语义:静默忽略)
@@ -120,11 +170,13 @@ function syncToFlowJson(projectPath, stageName, opId, title) {
120
170
  * 在 .openfeel/plan/{series}/{stage}/ops/ 下创建 op-NNN_{title}.md
121
171
  * NNN 自动递增(从该阶段的已有方案中计算)
122
172
  * 必须按固定模板生成,包含:目标、实施步骤(checkbox)、产出文件、自测清单、修正记录
123
- * 创建后自动同步到 flow.json(如果存在)
173
+ * 创建后自动同步到 flow.json(如果存在);阶段未注册时按注册语义补齐阶段骨架(N3)
124
174
  * @param stageName 阶段名(短名 stage-01 或完整 v1.0.0-stage-01 均可)
175
+ * @param options.onImplicitRegister 隐式注册回调(阶段未注册时触发,供命令层输出提示)
176
+ * @param options.draft true → 以 draft(未发布)状态注册;false/缺省 → pending(现行为)
125
177
  * @returns opId(如 op-001)
126
178
  */
127
- export function createScheme(projectPath, stageName, title) {
179
+ export function createScheme(projectPath, stageName, title, options) {
128
180
  // 解析 stageId(短名/完整)得到 series + stageDir + 完整 ID
129
181
  const parsed = parseStageId(stageName);
130
182
  if (!parsed) {
@@ -136,12 +188,16 @@ export function createScheme(projectPath, stageName, title) {
136
188
  mkdirSync(opsDir, { recursive: true });
137
189
  }
138
190
  // 2. 锁内:原子占号 + 原子写 op 文件(临界区仅含占号与写文件,不含 flow 同步)
139
- const safeTitle = title.replace(/\s+/g, '_');
191
+ //
192
+ // 命名约定(N8-1 / A5):新建 op 固定 `op-NNN.md`——**标题不再参与命名**(写入文件内容首行
193
+ // `# op-NNN:{title}`,模板已含),彻底规避标题含 `/` 等路径字符导致的 ENOENT 创建失败。
194
+ // 历史 `op-NNN_{title}.md` 不迁移、不改名;读取端 extractTitle 兼容回退(N8-2)。
195
+ // parse 正则 /^op-(\d+)/ 未改 → 历史命名仍占号,序号分配不受影响(新旧共存不撞号)。
140
196
  const lockPath = projectLockPath(projectPath, `scheme-${parsed.stageDir}`);
141
197
  const opId = withFileLock(lockPath, () => {
142
198
  const reserved = reserveSequence({
143
199
  dir: opsDir,
144
- candidate: (seq) => `${opIdOf(seq)}_${safeTitle}.md`,
200
+ candidate: (seq) => `${opIdOf(seq)}.md`,
145
201
  parse: (fileName) => {
146
202
  const m = fileName.match(/^op-(\d+)/);
147
203
  return m ? parseInt(m[1], 10) : null;
@@ -152,9 +208,238 @@ export function createScheme(projectPath, stageName, title) {
152
208
  return opIdOf(reserved.seq);
153
209
  });
154
210
  // 3. 同步到 flow.json(键用完整 stageId;由 FlowManager.save 的 flow.lock 保护)
155
- syncToFlowJson(projectPath, parsed.fullStageId, opId, title);
211
+ syncToFlowJson(projectPath, parsed.fullStageId, opId, title, options?.onImplicitRegister, options?.draft);
156
212
  return opId;
157
213
  }
214
+ /**
215
+ * 判断 ops/ 目录是否存在该 op 的模板文件。
216
+ * R1:同时匹配 `op-NNN.md` 与历史 `op-NNN_*.md` 两种命名(避免历史命名被误判为键孤儿)。
217
+ */
218
+ function hasOpTemplateFile(projectPath, stageId, opId) {
219
+ const parsed = parseStageId(stageId);
220
+ if (!parsed) {
221
+ return false;
222
+ }
223
+ const opsDir = resolve(projectPath, '.openfeel', 'plan', parsed.series, parsed.stageDir, 'ops');
224
+ if (!existsSync(opsDir)) {
225
+ return false;
226
+ }
227
+ try {
228
+ return readdirSync(opsDir).some((f) => f === `${opId}.md` || f.startsWith(`${opId}_`));
229
+ }
230
+ catch {
231
+ // 目录不可读时视为无文件(不误判为存在)
232
+ return false;
233
+ }
234
+ }
235
+ /**
236
+ * 判断该 op 是否存在 checkpoint 进展(默认拒绝删除的保护依据)。
237
+ * 判据:① op.checkpoints 含任一非 pending 值;② 阶段 checkpoint 快照含该 op 或 current 指向该 op。
238
+ */
239
+ function hasCheckpointProgress(projectPath, stageId, opId, op) {
240
+ const c = op.checkpoints;
241
+ if (c) {
242
+ const untouched = c.plan === 'pending' &&
243
+ c.scheme === 'pending' &&
244
+ c.review === 'pending' &&
245
+ c.test === 'pending' &&
246
+ (c.exec?.attempts ?? 0) === 0 &&
247
+ (c.exec?.self ?? 'pending') === 'pending';
248
+ if (!untouched) {
249
+ return true;
250
+ }
251
+ }
252
+ // 阶段快照目录:.openfeel/checkpoints/{stageId}-*.json
253
+ const cpDir = resolve(projectPath, '.openfeel', 'checkpoints');
254
+ if (!existsSync(cpDir)) {
255
+ return false;
256
+ }
257
+ try {
258
+ for (const f of readdirSync(cpDir)) {
259
+ if (!f.startsWith(`${stageId}-`) || !f.endsWith('.json')) {
260
+ continue;
261
+ }
262
+ try {
263
+ const snap = JSON.parse(readFileSync(resolve(cpDir, f), 'utf-8'));
264
+ if (snap?.stages?.[stageId]?.ops && opId in snap.stages[stageId].ops) {
265
+ return true;
266
+ }
267
+ if (snap?.pipeline?.current?.op === opId) {
268
+ return true;
269
+ }
270
+ }
271
+ catch {
272
+ // 单个快照损坏忽略
273
+ }
274
+ }
275
+ }
276
+ catch {
277
+ return false;
278
+ }
279
+ return false;
280
+ }
281
+ /**
282
+ * 从 flow.json 注销一个 op 键(不删除 op 模板文件),并留审计日志(N1-1)。
283
+ * 默认对「已 done」或「存在 checkpoint 进展」的 op 拒绝删除(--force 覆盖)。
284
+ * @param projectPath 项目根路径
285
+ * @param stageName 阶段 ID(简写或全称,经 normalizeStageId 归一)
286
+ * @param opId op ID(op-001 或 完整 stage.op-001)
287
+ * @param options.force 跳过保护校验;options.dryRun 仅预览不写盘
288
+ * @returns 删除结果(成功/原因码/是否孤儿)
289
+ */
290
+ export function removeScheme(projectPath, stageName, opId, options) {
291
+ const normalized = normalizeStageId(stageName) ?? stageName;
292
+ const localOpId = opId.includes('.') ? opId.substring(opId.lastIndexOf('.') + 1) : opId;
293
+ const mgr = new FlowManager(projectPath);
294
+ if (!mgr.isLoaded()) {
295
+ return { removed: false, reason: 'stage-not-found' };
296
+ }
297
+ const data = mgr.getData();
298
+ const stage = data.stages[normalized] ?? data.stages[stageName];
299
+ if (!stage) {
300
+ return { removed: false, reason: 'stage-not-found' };
301
+ }
302
+ const op = stage.ops[localOpId];
303
+ if (!op) {
304
+ return { removed: false, reason: 'op-not-found' };
305
+ }
306
+ const stageKey = data.stages[normalized] ? normalized : stageName;
307
+ // 孤儿(opsDir 无对应文件):这正是回收场景,允许直接删除
308
+ const orphan = !hasOpTemplateFile(projectPath, stageKey, localOpId);
309
+ if (!options?.force) {
310
+ // 保护已完成进度
311
+ if (op.state === 'done') {
312
+ return { removed: false, reason: 'op-done', orphan };
313
+ }
314
+ // 保护含 checkpoint 进展的 op
315
+ if (hasCheckpointProgress(projectPath, stageKey, localOpId, op)) {
316
+ return { removed: false, reason: 'has-checkpoint', orphan };
317
+ }
318
+ }
319
+ // --dry-run:仅预览,不写盘
320
+ if (options?.dryRun) {
321
+ return { removed: true, orphan };
322
+ }
323
+ delete stage.ops[localOpId];
324
+ mgr.appendLog({
325
+ time: '',
326
+ agent: 'cli',
327
+ action: 'scheme_remove',
328
+ detail: { stage: stageKey, opId: localOpId, force: !!options?.force, orphan },
329
+ });
330
+ mgr.save();
331
+ return { removed: true, orphan };
332
+ }
333
+ /**
334
+ * 将 draft op 发布为 pending(B4-2 / A1)。
335
+ * 校验模板已填充(无空模板标记残留,单一来源 EMPTY_TEMPLATE_MARKER)。
336
+ * @param projectPath 项目根路径
337
+ * @param stageName 阶段 ID(简写或全称)
338
+ * @param opId op ID(op-001 或 完整 stage.op-001)
339
+ */
340
+ export function publishScheme(projectPath, stageName, opId) {
341
+ const normalized = normalizeStageId(stageName) ?? stageName;
342
+ const localOpId = opId.includes('.') ? opId.substring(opId.lastIndexOf('.') + 1) : opId;
343
+ const mgr = new FlowManager(projectPath);
344
+ if (!mgr.isLoaded()) {
345
+ return { published: false, reason: 'not-found' };
346
+ }
347
+ const data = mgr.getData();
348
+ const stage = data.stages[normalized] ?? data.stages[stageName];
349
+ if (!stage) {
350
+ return { published: false, reason: 'not-found' };
351
+ }
352
+ const op = stage.ops[localOpId];
353
+ if (!op) {
354
+ return { published: false, reason: 'not-found' };
355
+ }
356
+ if (op.state !== 'draft') {
357
+ return { published: false, reason: 'not-draft' };
358
+ }
359
+ const stageKey = data.stages[normalized] ? normalized : stageName;
360
+ // 空模板校验(单一来源:isTemplateEmpty / EMPTY_TEMPLATE_MARKER)
361
+ const content = mgr.readOpTemplate(stageKey, localOpId);
362
+ if (content === null) {
363
+ // 文件缺失 → 无法校验填充度,保守拒绝
364
+ return { published: false, reason: 'not-found' };
365
+ }
366
+ if (isTemplateEmpty(content)) {
367
+ return { published: false, reason: 'empty-template' };
368
+ }
369
+ op.state = 'pending';
370
+ mgr.appendLog({ time: '', agent: 'cli', action: 'scheme_publish', detail: { stage: stageKey, opId: localOpId } });
371
+ mgr.save();
372
+ return { published: true };
373
+ }
374
+ /**
375
+ * 替换内容中首个 `# op-NNN:title` 行为新标题;无匹配则头部插入。
376
+ * 仅替换首个匹配行(R2),其余内容逐字节保留。
377
+ */
378
+ function replaceOrInsertTitleLine(content, opId, title) {
379
+ const titleLine = `# ${opId}:${title}`;
380
+ const re = /^#\s*op-\d+[::]\s*.*$/m;
381
+ if (re.test(content)) {
382
+ return content.replace(re, titleLine);
383
+ }
384
+ // 无首行模式 → 文件头部插入标题行(保持其余内容不变)
385
+ return `${titleLine}\n\n${content}`;
386
+ }
387
+ /**
388
+ * 更新 op 标题(B6-1):同步 flow.json 的 `ops[opId].title` 与 op 文件内容首行的 `# {opId}:{title}`。
389
+ * 文件名为 op-NNN.md(不含标题)→ **无需重命名文件**(含历史命名 `op-NNN_{title}.md` 亦不改文件名)。
390
+ * 顺序:先校验(存在/文件可读)→ 写文件首行 → 写 flow.json;`file-missing` 时不写 flow.json。
391
+ * @param title 新标题(非空;首尾空白折叠)
392
+ */
393
+ export function renameScheme(projectPath, stageName, opId, title) {
394
+ const normalized = normalizeStageId(stageName) ?? stageName;
395
+ const localOpId = opId.includes('.') ? opId.substring(opId.lastIndexOf('.') + 1) : opId;
396
+ const newTitle = title.trim();
397
+ const mgr = new FlowManager(projectPath);
398
+ if (!mgr.isLoaded()) {
399
+ return { renamed: false, reason: 'not-found' };
400
+ }
401
+ const data = mgr.getData();
402
+ const stage = data.stages[normalized] ?? data.stages[stageName];
403
+ if (!stage) {
404
+ return { renamed: false, reason: 'not-found' };
405
+ }
406
+ const op = stage.ops[localOpId];
407
+ if (!op) {
408
+ return { renamed: false, reason: 'not-found' };
409
+ }
410
+ const stageKey = data.stages[normalized] ? normalized : stageName;
411
+ const previousTitle = op.title;
412
+ // 定位模板文件(兼容 op-NNN.md 与历史 op-NNN_*.md)
413
+ const parsed = parseStageId(stageKey);
414
+ if (!parsed) {
415
+ return { renamed: false, reason: 'not-found' };
416
+ }
417
+ const opsDir = resolve(projectPath, '.openfeel', 'plan', parsed.series, parsed.stageDir, 'ops');
418
+ const fileName = existsSync(opsDir)
419
+ ? readdirSync(opsDir).find((f) => f === `${localOpId}.md` || f.startsWith(`${localOpId}_`))
420
+ : undefined;
421
+ if (!fileName) {
422
+ // 文件缺失 → 不改写 flow.json(原子性前移)
423
+ return { renamed: false, reason: 'file-missing', previousTitle, path: `.openfeel/plan/${parsed.series}/${parsed.stageDir}/ops/${localOpId}.md` };
424
+ }
425
+ const filePath = resolve(opsDir, fileName);
426
+ // 标题未变 → no-op(无写盘)
427
+ if (previousTitle === newTitle) {
428
+ return { renamed: false, reason: 'title-unchanged', previousTitle, path: filePath };
429
+ }
430
+ // 先写文件首行,再写 flow.json(顺序明确;失败点写入错误文案由命令层呈现)
431
+ const content = readFileSync(filePath, 'utf-8');
432
+ atomicWriteFileSync(filePath, replaceOrInsertTitleLine(content, localOpId, newTitle));
433
+ op.title = newTitle;
434
+ mgr.appendLog({
435
+ time: '',
436
+ agent: 'cli',
437
+ action: 'scheme_rename',
438
+ detail: { opId: localOpId, from: previousTitle, to: newTitle },
439
+ });
440
+ mgr.save();
441
+ return { renamed: true, previousTitle, path: filePath };
442
+ }
158
443
  /**
159
444
  * 读取操作方案
160
445
  * @param opId 操作ID(如 op-001)或完整 opId(如 stage-01.op-001 / v1.0.0-stage-01.op-001)
@@ -245,7 +530,7 @@ export function listSchemes(projectPath, stageName) {
245
530
  result.push({
246
531
  opId,
247
532
  stage: stageEntry.name,
248
- title: extractTitle(fileName),
533
+ title: extractTitle(filePath, fileName),
249
534
  content,
250
535
  filePath: `.openfeel/plan/${seriesEntry.name}/${stageEntry.name}/ops/${fileName}`,
251
536
  });
@@ -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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"}
@@ -7,12 +7,43 @@ export interface Stage {
7
7
  /** overview.md 内容 */
8
8
  overview: string;
9
9
  }
10
+ /** 折叠任务描述:去除首尾空白,内部换行折叠为空格(防结构破坏) */
11
+ export declare function sanitizeTaskDesc(desc: string): string;
12
+ /**
13
+ * 构建任务行块(`- [ ] 任务N:desc`,编号从 1 连续)。
14
+ * 供 `plan stage add --tasks`(初始化)与 `stage task --add`(追加)共用,保证两路径格式逐字节一致。
15
+ * @param tasks 任务描述列表
16
+ * @returns 多行任务块(\n 分隔,无尾换行)
17
+ */
18
+ export declare function buildTaskLines(tasks: string[]): string;
19
+ /**
20
+ * 向 status.md 的「## 当前任务」小节追加一条任务行(编号 = 既有任务行最大编号 + 1,保证连续性)。
21
+ * @param projectPath 项目根路径
22
+ * @param stageId 阶段 ID
23
+ * @param desc 任务描述
24
+ * @returns 新任务的编号
25
+ * @throws Error 阶段 status.md 不存在(STATUS_NOT_FOUND)或缺少「## 当前任务」小节(TASK_SECTION_MISSING)
26
+ */
27
+ export declare function appendStatusTask(projectPath: string, stageId: string, desc: string): number;
28
+ /**
29
+ * 确保阶段目录与 overview.md / status.md 骨架存在(幂等:已存在不覆盖)。
30
+ * 从 addStage 抽出,供 addStage 与 plan scheme create 的隐式注册共用(单一实现,避免双份骨架文本)。
31
+ * @param projectPath 项目根路径
32
+ * @param name 阶段 ID(简写或全称)
33
+ * @param deps 依赖阶段 ID 列表(仅用于新建 overview.md 时写入「依赖」段)
34
+ * @param tasks 初始任务列表(仅用于新建 status.md 时生成任务行;缺省写占位 `> 待补充`)
35
+ * @returns 是否发生了创建(true = 补建了目录或骨架文件)
36
+ */
37
+ export declare function ensureStageSkeleton(projectPath: string, name: string, deps?: string[], tasks?: string[]): boolean;
10
38
  /**
11
39
  * 添加工作阶段
12
- * 在 .openfeel/plan/{series}/ 下创建 {stage}/ 目录,包含 overview.md 和 status.md 骨架
13
- * @param deps 依赖的阶段名列表(可选,写入 overview.md)
40
+ * 在 .openfeel/plan/{series}/ 下创建 {stage}/ 目录,包含 overview.md 和 status.md 骨架,
41
+ * 并注册到 flow.json(键用完整 stageId)。
42
+ * 骨架生成复用 ensureStageSkeleton(保持行为与文案一致)。
43
+ * @param deps 依赖的阶段名列表(可选,写入 overview.md 与 flow.json)
44
+ * @param tasks 初始任务列表(可选,写入 status.md 的「## 当前任务」小节)
14
45
  */
15
- export declare function addStage(projectPath: string, name: string, deps?: string[]): void;
46
+ export declare function addStage(projectPath: string, name: string, deps?: string[], tasks?: string[]): void;
16
47
  /**
17
48
  * 列出所有工作阶段
18
49
  */
@@ -1 +1 @@
1
- {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../../src/core/plan/stage.ts"],"names":[],"mappings":"AAUA,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
+ {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../../src/core/plan/stage.ts"],"names":[],"mappings":"AAUA,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,qCAAqC;AACrC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAsC3F;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAiFjH;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAgBnG;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,EAAE,CAkDvD"}