openfeel 1.1.1 → 1.1.3

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/README.en.md +41 -11
  2. package/README.md +8 -3
  3. package/README.zh-CN.md +42 -12
  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 +59 -15
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/cli/output-encoding.d.ts +32 -0
  10. package/dist/cli/output-encoding.d.ts.map +1 -0
  11. package/dist/cli/output-encoding.js +120 -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.map +1 -1
  24. package/dist/commands/init.js +56 -42
  25. package/dist/commands/init.js.map +1 -1
  26. package/dist/commands/knowledge.d.ts.map +1 -1
  27. package/dist/commands/knowledge.js +69 -0
  28. package/dist/commands/knowledge.js.map +1 -1
  29. package/dist/commands/lint.d.ts.map +1 -1
  30. package/dist/commands/lint.js +17 -5
  31. package/dist/commands/lint.js.map +1 -1
  32. package/dist/commands/migrate.d.ts.map +1 -1
  33. package/dist/commands/migrate.js +6 -1
  34. package/dist/commands/migrate.js.map +1 -1
  35. package/dist/commands/model.d.ts.map +1 -1
  36. package/dist/commands/model.js +18 -1
  37. package/dist/commands/model.js.map +1 -1
  38. package/dist/commands/plan.d.ts.map +1 -1
  39. package/dist/commands/plan.js +185 -7
  40. package/dist/commands/plan.js.map +1 -1
  41. package/dist/commands/project.js +2 -2
  42. package/dist/commands/project.js.map +1 -1
  43. package/dist/commands/roadmap.d.ts.map +1 -1
  44. package/dist/commands/roadmap.js +20 -5
  45. package/dist/commands/roadmap.js.map +1 -1
  46. package/dist/commands/setup.d.ts +1 -1
  47. package/dist/commands/setup.d.ts.map +1 -1
  48. package/dist/commands/setup.js +8 -2
  49. package/dist/commands/setup.js.map +1 -1
  50. package/dist/commands/shared/errors.d.ts +22 -0
  51. package/dist/commands/shared/errors.d.ts.map +1 -0
  52. package/dist/commands/shared/errors.js +45 -0
  53. package/dist/commands/shared/errors.js.map +1 -0
  54. package/dist/commands/stage.d.ts.map +1 -1
  55. package/dist/commands/stage.js +133 -23
  56. package/dist/commands/stage.js.map +1 -1
  57. package/dist/commands/view.d.ts +1 -1
  58. package/dist/commands/view.d.ts.map +1 -1
  59. package/dist/commands/view.js +4 -26
  60. package/dist/commands/view.js.map +1 -1
  61. package/dist/core/archive/merge.d.ts.map +1 -1
  62. package/dist/core/archive/merge.js +9 -5
  63. package/dist/core/archive/merge.js.map +1 -1
  64. package/dist/core/artifact-graph/graph.d.ts +7 -2
  65. package/dist/core/artifact-graph/graph.d.ts.map +1 -1
  66. package/dist/core/artifact-graph/graph.js +25 -18
  67. package/dist/core/artifact-graph/graph.js.map +1 -1
  68. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
  69. package/dist/core/artifact-graph/instruction-loader.js +4 -33
  70. package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
  71. package/dist/core/backup.d.ts +28 -0
  72. package/dist/core/backup.d.ts.map +1 -0
  73. package/dist/core/backup.js +118 -0
  74. package/dist/core/backup.js.map +1 -0
  75. package/dist/core/config.d.ts +30 -19
  76. package/dist/core/config.d.ts.map +1 -1
  77. package/dist/core/config.js +86 -26
  78. package/dist/core/config.js.map +1 -1
  79. package/dist/core/flow-manager.d.ts +256 -5
  80. package/dist/core/flow-manager.d.ts.map +1 -1
  81. package/dist/core/flow-manager.js +908 -68
  82. package/dist/core/flow-manager.js.map +1 -1
  83. package/dist/core/fs/atomic-write.d.ts +3 -0
  84. package/dist/core/fs/atomic-write.d.ts.map +1 -1
  85. package/dist/core/fs/atomic-write.js +3 -0
  86. package/dist/core/fs/atomic-write.js.map +1 -1
  87. package/dist/core/fs/safe-read.d.ts +11 -0
  88. package/dist/core/fs/safe-read.d.ts.map +1 -0
  89. package/dist/core/fs/safe-read.js +31 -0
  90. package/dist/core/fs/safe-read.js.map +1 -0
  91. package/dist/core/global-paths.d.ts +16 -7
  92. package/dist/core/global-paths.d.ts.map +1 -1
  93. package/dist/core/global-paths.js +23 -8
  94. package/dist/core/global-paths.js.map +1 -1
  95. package/dist/core/i18n-data/en.d.ts +2 -0
  96. package/dist/core/i18n-data/en.d.ts.map +1 -1
  97. package/dist/core/i18n-data/en.js +259 -23
  98. package/dist/core/i18n-data/en.js.map +1 -1
  99. package/dist/core/i18n-data/zh-CN.d.ts +2 -0
  100. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
  101. package/dist/core/i18n-data/zh-CN.js +265 -23
  102. package/dist/core/i18n-data/zh-CN.js.map +1 -1
  103. package/dist/core/i18n.d.ts +8 -0
  104. package/dist/core/i18n.d.ts.map +1 -1
  105. package/dist/core/i18n.js +14 -4
  106. package/dist/core/i18n.js.map +1 -1
  107. package/dist/core/init.d.ts +4 -2
  108. package/dist/core/init.d.ts.map +1 -1
  109. package/dist/core/init.js +38 -13
  110. package/dist/core/init.js.map +1 -1
  111. package/dist/core/managed-region.d.ts +1 -1
  112. package/dist/core/managed-region.js +1 -1
  113. package/dist/core/metrics.d.ts +16 -4
  114. package/dist/core/metrics.d.ts.map +1 -1
  115. package/dist/core/metrics.js +31 -11
  116. package/dist/core/metrics.js.map +1 -1
  117. package/dist/core/migrate.d.ts.map +1 -1
  118. package/dist/core/migrate.js +53 -19
  119. package/dist/core/migrate.js.map +1 -1
  120. package/dist/core/model-config.d.ts.map +1 -1
  121. package/dist/core/model-config.js +4 -2
  122. package/dist/core/model-config.js.map +1 -1
  123. package/dist/core/opencode-config.d.ts +4 -4
  124. package/dist/core/opencode-config.d.ts.map +1 -1
  125. package/dist/core/opencode-config.js +6 -5
  126. package/dist/core/opencode-config.js.map +1 -1
  127. package/dist/core/plan/path.d.ts +40 -0
  128. package/dist/core/plan/path.d.ts.map +1 -1
  129. package/dist/core/plan/path.js +108 -1
  130. package/dist/core/plan/path.js.map +1 -1
  131. package/dist/core/plan/roadmap.js +2 -2
  132. package/dist/core/plan/roadmap.js.map +1 -1
  133. package/dist/core/plan/scheme.d.ts +74 -2
  134. package/dist/core/plan/scheme.d.ts.map +1 -1
  135. package/dist/core/plan/scheme.js +311 -26
  136. package/dist/core/plan/scheme.js.map +1 -1
  137. package/dist/core/plan/stage.d.ts +34 -3
  138. package/dist/core/plan/stage.d.ts.map +1 -1
  139. package/dist/core/plan/stage.js +90 -6
  140. package/dist/core/plan/stage.js.map +1 -1
  141. package/dist/core/public-logger.d.ts +18 -5
  142. package/dist/core/public-logger.d.ts.map +1 -1
  143. package/dist/core/public-logger.js +62 -23
  144. package/dist/core/public-logger.js.map +1 -1
  145. package/dist/core/runtime-log.d.ts +25 -0
  146. package/dist/core/runtime-log.d.ts.map +1 -0
  147. package/dist/core/runtime-log.js +94 -0
  148. package/dist/core/runtime-log.js.map +1 -0
  149. package/dist/core/setup.d.ts.map +1 -1
  150. package/dist/core/setup.js +47 -19
  151. package/dist/core/setup.js.map +1 -1
  152. package/dist/core/template-loader.d.ts.map +1 -1
  153. package/dist/core/template-loader.js +672 -288
  154. package/dist/core/template-loader.js.map +1 -1
  155. package/dist/core/templates.d.ts +2 -2
  156. package/dist/core/templates.d.ts.map +1 -1
  157. package/dist/core/templates.js +13 -9
  158. package/dist/core/templates.js.map +1 -1
  159. package/dist/core/update-infos.d.ts +14 -3
  160. package/dist/core/update-infos.d.ts.map +1 -1
  161. package/dist/core/update-infos.js +67 -15
  162. package/dist/core/update-infos.js.map +1 -1
  163. package/dist/core/update-state.d.ts.map +1 -1
  164. package/dist/core/update-state.js +7 -4
  165. package/dist/core/update-state.js.map +1 -1
  166. package/dist/core/update.d.ts +2 -1
  167. package/dist/core/update.d.ts.map +1 -1
  168. package/dist/core/update.js +253 -61
  169. package/dist/core/update.js.map +1 -1
  170. package/dist/core/view/entry.d.ts +53 -1
  171. package/dist/core/view/entry.d.ts.map +1 -1
  172. package/dist/core/view/entry.js +71 -2
  173. package/dist/core/view/entry.js.map +1 -1
  174. package/dist/core/workspace/identity.d.ts.map +1 -1
  175. package/dist/core/workspace/identity.js +15 -5
  176. package/dist/core/workspace/identity.js.map +1 -1
  177. package/dist/core/workspace/knowledge.d.ts.map +1 -1
  178. package/dist/core/workspace/knowledge.js +125 -19
  179. package/dist/core/workspace/knowledge.js.map +1 -1
  180. package/dist/core/workspace/structure.d.ts.map +1 -1
  181. package/dist/core/workspace/structure.js +6 -2
  182. package/dist/core/workspace/structure.js.map +1 -1
  183. package/dist/index.d.ts +0 -1
  184. package/dist/index.d.ts.map +1 -1
  185. package/dist/index.js +1 -2
  186. package/dist/index.js.map +1 -1
  187. package/dist/utils/kb-dedup.d.ts +5 -1
  188. package/dist/utils/kb-dedup.d.ts.map +1 -1
  189. package/dist/utils/kb-dedup.js +11 -5
  190. package/dist/utils/kb-dedup.js.map +1 -1
  191. package/package.json +6 -6
  192. package/dist/utils/path.d.ts +0 -22
  193. package/dist/utils/path.d.ts.map +0 -1
  194. package/dist/utils/path.js +0 -37
  195. package/dist/utils/path.js.map +0 -1
  196. package/scripts/patch-inquirer.js +0 -70
@@ -11,6 +11,7 @@ import { getGlobalProfilePath } from './global-paths.js';
11
11
  import { z } from 'zod';
12
12
  import { parse as parseYaml, parseDocument, stringify as stringifyYaml } from 'yaml';
13
13
  import { getUserName } from './workspace/identity.js';
14
+ import { t, getCliLang } from './i18n.js';
14
15
  // ── Zod Schema ──
15
16
  /** meta 块 Schema(允许扩展字段) */
16
17
  export const ConfigMetaSchema = z.object({
@@ -25,6 +26,36 @@ export const ConfigDefaultsSchema = z.object({
25
26
  test_enabled: z.boolean().optional().default(false),
26
27
  merge_mode: z.enum(['manual', 'auto']).optional().default('manual'),
27
28
  }).passthrough();
29
+ /** 逐层解包 ZodDefault / ZodOptional / ZodNullable,取得底层类型(schema 驱动的类型判定用) */
30
+ function unwrapSchema(schema) {
31
+ let current = schema;
32
+ for (let i = 0; i < 8 && current; i++) {
33
+ const unwrap = current.unwrap;
34
+ if (typeof unwrap !== 'function') {
35
+ break;
36
+ }
37
+ current = unwrap.call(current);
38
+ }
39
+ return current;
40
+ }
41
+ /**
42
+ * 从 ConfigDefaultsSchema 派生某键的合法字符串值集合(T36/R3)。
43
+ * enum → options;boolean → ['true','false'];未知键或无限定类型 → null。
44
+ */
45
+ export function getConfigFieldLegalValues(key) {
46
+ const fieldSchema = ConfigDefaultsSchema.shape[key];
47
+ if (!fieldSchema) {
48
+ return null;
49
+ }
50
+ const inner = unwrapSchema(fieldSchema);
51
+ if (inner instanceof z.ZodEnum) {
52
+ return [...inner.options];
53
+ }
54
+ if (inner instanceof z.ZodBoolean) {
55
+ return ['true', 'false'];
56
+ }
57
+ return null;
58
+ }
28
59
  /** 单个模型配置 Schema */
29
60
  export const ModelConfigSchema = z.object({
30
61
  provider: z.string(), // deepseek / openai / anthropic / zhipu / qwen
@@ -45,31 +76,31 @@ export const ConfigSchema = z.object({
45
76
  models: ModelsSchema.optional(),
46
77
  }).passthrough();
47
78
  // ── 全局用户画像 Profile Schema(v5.0 记忆体系第一层) ──
48
- /** 用户基础信息 Schema:姓名 + 偏好语言 */
79
+ /** 用户基础信息 Schema:姓名 + 偏好语言(passthrough:保全自定义扩展键,遗留 #7) */
49
80
  export const ProfileUserSchema = z.object({
50
81
  name: z.string().optional(),
51
82
  lang: z.enum(['zh-CN', 'en']).optional(),
52
- });
53
- /** 用户偏好 Schema:工作流偏好(全部可选,缺失时使用默认值) */
83
+ }).passthrough();
84
+ /** 用户偏好 Schema:工作流偏好(全部可选,缺失时使用默认值;passthrough:保全自定义扩展键,遗留 #7) */
54
85
  export const ProfilePreferencesSchema = z.object({
55
86
  auto_advance: z.enum(['enabled', 'disabled']).optional(),
56
87
  review_mode: z.enum(['full', 'skip_small_changes']).optional(),
57
88
  communication: z.enum(['concise', 'detailed']).optional(),
58
89
  confirm_threshold: z.enum(['low', 'medium', 'high']).optional(),
59
- });
60
- /** 历史记录 Schema:最近项目信息 */
90
+ }).passthrough();
91
+ /** 历史记录 Schema:最近项目信息(passthrough:保全自定义扩展键,遗留 #7) */
61
92
  export const ProfileHistorySchema = z.object({
62
93
  last_project: z.string().optional(),
63
94
  recent_projects: z.array(z.string()).optional(),
64
- });
95
+ }).passthrough();
65
96
  /** 完整 Profile Schema:组合三块,全部可选,允许扩展字段 */
66
97
  export const ProfileSchema = z.object({
67
98
  user: ProfileUserSchema.optional(),
68
99
  preferences: ProfilePreferencesSchema.optional(),
69
100
  history: ProfileHistorySchema.optional(),
70
101
  }).passthrough();
71
- /** 默认配置值 */
72
- const DEFAULT_CONFIG = {
102
+ /** 默认配置值(导出供 flow-manager 作为级联 builtin 层取值,保持单一权威) */
103
+ export const DEFAULT_CONFIG = {
73
104
  execution_mode: 'manual',
74
105
  auto_advance: 'disabled',
75
106
  test_enabled: false,
@@ -114,6 +145,16 @@ function getProfilePath() {
114
145
  // 委托 global-paths 作为全局路径唯一权威(N4 收口)
115
146
  return getGlobalProfilePath();
116
147
  }
148
+ /**
149
+ * 深拷贝 DEFAULT_PROFILE,确保返回值与模块级常量完全隔离(T28)。
150
+ * structuredClone 不可用时回退 JSON 深拷贝。
151
+ */
152
+ function cloneDefaultProfile() {
153
+ if (typeof structuredClone === 'function') {
154
+ return structuredClone(DEFAULT_PROFILE);
155
+ }
156
+ return JSON.parse(JSON.stringify(DEFAULT_PROFILE));
157
+ }
117
158
  /**
118
159
  * 读取全局用户画像 ~/.config/openfeel/profile.yaml
119
160
  * 文件不存在时返回默认 Profile(空用户名、zh-CN、disabled、full、concise、medium、空数组)。
@@ -124,13 +165,15 @@ function getProfilePath() {
124
165
  export function readProfile() {
125
166
  const profilePath = getProfilePath();
126
167
  if (!existsSync(profilePath)) {
127
- return { ...DEFAULT_PROFILE };
168
+ // 深拷贝:避免调用方原位修改污染模块级 DEFAULT_PROFILE(T28)
169
+ return cloneDefaultProfile();
128
170
  }
129
171
  try {
130
172
  const content = readFileSync(profilePath, 'utf-8');
131
173
  const raw = parseYaml(content);
132
174
  if (!raw || typeof raw !== 'object') {
133
- return { ...DEFAULT_PROFILE };
175
+ // 错误路径:顶层非对象(含空文件 / 标量)→ 标记 parseError,供调用方跳过写回(遗留 #8)
176
+ return { ...cloneDefaultProfile(), parseError: `profile.yaml 顶层非对象:${profilePath}` };
134
177
  }
135
178
  const parsed = ProfileSchema.parse(raw);
136
179
  // 与默认值深度合并:缺失字段回填默认值,同时保留顶层 passthrough 扩展字段
@@ -142,9 +185,12 @@ export function readProfile() {
142
185
  history: { ...DEFAULT_PROFILE.history, ...(parsed.history ?? {}) },
143
186
  };
144
187
  }
145
- catch {
146
- // YAML 解析失败或 Zod 校验失败时回退默认值(保持可用性)
147
- return { ...DEFAULT_PROFILE };
188
+ catch (err) {
189
+ // 错误路径:YAML 语法 / Zod 校验失败 → 标记 parseError(不写回),返回默认值保持可用性(遗留 #8)
190
+ return {
191
+ ...cloneDefaultProfile(),
192
+ parseError: `profile.yaml 解析失败(${err instanceof Error ? err.message : String(err)}):${profilePath}`,
193
+ };
148
194
  }
149
195
  }
150
196
  /**
@@ -175,6 +221,11 @@ export function ensureProfileDefaults(projectPath) {
175
221
  // 路径规范化:统一分隔符、消除 . / ..,避免 recent_projects 因路径形式差异产生重复(REV-003)
176
222
  const normalizedPath = resolve(projectPath);
177
223
  const profile = readProfile();
224
+ // 错误路径:profile.yaml 非法 → 不覆盖用户文件(遗留 #8;解析失败属用户可修复态,覆盖才是不可逆伤害)
225
+ if (profile.parseError) {
226
+ console.warn(t('config.profile.parseErrorSkipTmpl', getCliLang(projectPath), { err: profile.parseError }));
227
+ return;
228
+ }
178
229
  let changed = false;
179
230
  // 1. user.name 为空时自动填充(.info.json → git config 回退)
180
231
  if (!profile.user?.name) {
@@ -187,8 +238,11 @@ export function ensureProfileDefaults(projectPath) {
187
238
  changed = true;
188
239
  }
189
240
  // 3. recent_projects 去重追加(新项目置顶,保留最近 5 个)
241
+ // 去重比较大小写不敏感 + 分隔符归一(T32:Windows 下 c:\x 与 C:\x 视为同一;存储保留原样)
242
+ const normalizeKey = (p) => p.replace(/\\/g, '/').toLowerCase();
243
+ const normalizedKey = normalizeKey(normalizedPath);
190
244
  const recent = profile.history?.recent_projects ?? [];
191
- const deduped = [normalizedPath, ...recent.filter((p) => p !== normalizedPath)].slice(0, 5);
245
+ const deduped = [normalizedPath, ...recent.filter((p) => normalizeKey(p) !== normalizedKey)].slice(0, 5);
192
246
  if (deduped.length !== recent.length || deduped.some((p, i) => p !== recent[i])) {
193
247
  profile.history = { ...(profile.history ?? {}), recent_projects: deduped };
194
248
  changed = true;
@@ -199,7 +253,7 @@ export function ensureProfileDefaults(projectPath) {
199
253
  }
200
254
  catch (err) {
201
255
  // 写盘失败(权限不足、磁盘满、只读挂载等)时静默降级:仅告警,不阻断 Feel 启动(REV-001)
202
- console.warn(`[profile] 自动填充写盘失败,已跳过:${err instanceof Error ? err.message : String(err)}`);
256
+ console.warn(t('config.profile.writeFailSkipTmpl', getCliLang(projectPath), { err: err instanceof Error ? err.message : String(err) }));
203
257
  }
204
258
  }
205
259
  }
@@ -237,13 +291,13 @@ const CONFIG_TEMPLATE_ZH = `# .openfeel/config.yaml
237
291
  # 本文件为所有阶段提供默认值,status.md 可覆盖
238
292
 
239
293
  meta:
240
- version: 1.1.1
294
+ version: 1.1.3
241
295
  project: OpenFeel
242
296
  tech_stack: TypeScript
243
297
 
244
298
  # ---- 工作流默认配置 ----
245
299
  # 所有阶段 status.md 的初始值由此处写入
246
- # 部署模板默认 auto+enabled,仓库自身默认 manual+disabled
300
+ # 默认值来自框架 DEFAULT_CONFIG;项目可在 defaults 中覆盖(status.md 局部优先级更高)
247
301
 
248
302
  defaults:
249
303
  # 执行模式:manual=人工流程,agent 不自动接管
@@ -293,13 +347,13 @@ const CONFIG_TEMPLATE_EN = `# .openfeel/config.yaml
293
347
  # This file provides defaults for all stages; status.md can override
294
348
 
295
349
  meta:
296
- version: 1.1.1
350
+ version: 1.1.3
297
351
  project: OpenFeel
298
352
  tech_stack: TypeScript
299
353
 
300
354
  # ---- Workflow Defaults ----
301
355
  # Initial values for all stage status.md are written from here
302
- # Deployment template defaults to auto+enabled, repo itself defaults to manual+disabled
356
+ # Defaults come from framework DEFAULT_CONFIG; override per project (status.md wins locally)
303
357
 
304
358
  defaults:
305
359
  # Execution mode: manual=human workflow, agent does not automatically take over
@@ -343,7 +397,9 @@ models:
343
397
  model_name: glm-5.1
344
398
  `;
345
399
  /**
346
- * 写入默认配置到 .openfeel/config.yaml
400
+ * 写入默认配置到 .openfeel/config.yaml(**整体覆盖**)。
401
+ * ⚠️ 契约:调用方须先自行守卫(如 `init` 已存在则不调用,见 stage-47 BUG-002 语义修复),
402
+ * 本函数不做「是否存在」判定,不应被无守卫地用于既有用户配置。
347
403
  * @param projectPath 项目路径
348
404
  * @param lang 语言,'zh-CN' 或 'en',默认 'zh-CN'
349
405
  */
@@ -384,15 +440,19 @@ export function setConfigValue(projectPath, key, value) {
384
440
  if (!fieldSchema) {
385
441
  throw new Error(`Unknown config key: ${key}`);
386
442
  }
387
- // 对 enum 字段尝试直接解析值(如 'enabled'/'disabled' → Zod enum 通过)
388
- fieldSchema.parse(value);
389
- // 2. 读取原始 YAML(绕过 normalizeConfig,保留注释与原始结构;文件不存在则创建空文档)
443
+ // 2. 按 schema 归一值类型:boolean 键把 'true'/'false' 转真布尔,enum 键保持字符串(R3)
444
+ // 否则 test_enabled 会写成字符串 "true",后续 ConfigDefaultsSchema.parse 语义错误
445
+ const isBooleanField = unwrapSchema(fieldSchema) instanceof z.ZodBoolean;
446
+ const coerced = isBooleanField ? (value === 'true') : value;
447
+ // 3. 校验归一后的值
448
+ fieldSchema.parse(coerced);
449
+ // 4. 读取原始 YAML(绕过 normalizeConfig,保留注释与原始结构;文件不存在则创建空文档)
390
450
  const doc = existsSync(configPath)
391
451
  ? parseDocument(readFileSync(configPath, 'utf-8'))
392
452
  : parseDocument('');
393
- // 3. 写入 defaults[key](setIn 原地修改,路径不存在时自动创建节点)
394
- doc.setIn(['defaults', key], value);
395
- // 4. 序列化并写回
453
+ // 5. 写入 defaults[key](setIn 原地修改,路径不存在时自动创建节点;写入归一后的布尔/字符串)
454
+ doc.setIn(['defaults', key], coerced);
455
+ // 6. 序列化并写回
396
456
  atomicWriteFileSync(configPath, doc.toString());
397
457
  }
398
458
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { type PipelinePhase, type MetaPhase, type StageStats } from './pipeline-schema.js';
2
2
  export { type PipelinePhase, type MetaPhase, type StageStats } from './pipeline-schema.js';
3
- /** 操作执行状态 */
4
- export type OpState = 'pending' | 'executing' | 'done' | 'failed';
3
+ /** 操作执行状态(B4/A1:新增 draft = 已创建未发布) */
4
+ export type OpState = 'pending' | 'executing' | 'done' | 'failed' | 'draft';
5
5
  /** 检查点结构 */
6
6
  export interface Checkpoints {
7
7
  plan: string;
@@ -93,6 +93,14 @@ export declare class FlowConcurrentModificationError extends Error {
93
93
  }
94
94
  /** 判断错误是否为 flow.json 并发冲突(供命令层统一识别) */
95
95
  export declare function isFlowConcurrentError(err: unknown): err is FlowConcurrentModificationError;
96
+ /** 阶段目录冲突:两个不同 stageId 映射同一 (series, stageDir)(cli/BUG-002) */
97
+ export declare class StageDirConflictError extends Error {
98
+ /** 本次冲突检测的 stageId */
99
+ readonly stage: string;
100
+ /** 已存在、占用同一目录的其它 stageId */
101
+ readonly other: string;
102
+ constructor(stage: string, other: string);
103
+ }
96
104
  /** 流水线摘要 */
97
105
  export interface PipelineSummary {
98
106
  phase: string;
@@ -105,10 +113,14 @@ export interface PipelineSummary {
105
113
  }
106
114
  /** verbose 模式下的配置级联信息 */
107
115
  export interface CascadeConfig {
116
+ /** 最低优先级:全局画像 ~/.config/openfeel/profile.yaml 的 preferences(P2 兜底) */
117
+ profileDefaults: Record<string, string>;
108
118
  configDefaults: Record<string, string>;
109
119
  statusOverrides: Record<string, string>;
110
120
  effective: Record<string, string>;
111
121
  }
122
+ /** 配置生效来源枚举(`config effective` 出口,P9) */
123
+ export type ConfigSource = 'status.md' | 'config.yaml' | 'profile.yaml' | 'builtin';
112
124
  /** verbose 模式下的状态变更记录 */
113
125
  export interface RecentChange {
114
126
  time: string;
@@ -148,11 +160,47 @@ export interface ValidationResult {
148
160
  errors: string[];
149
161
  warnings: string[];
150
162
  }
163
+ /** 孤儿操作方案描述(flow.json 注册键 与 ops/ 目录文件不一致,N1) */
164
+ export interface OrphanOp {
165
+ /** 所属阶段(完整 stageId) */
166
+ stage: string;
167
+ /** 操作方案 ID(如 op-001) */
168
+ opId: string;
169
+ }
151
170
  /** 修复结果 */
152
171
  export interface RepairResult {
153
172
  fixed: boolean;
154
173
  changes: string[];
155
174
  recovered: boolean;
175
+ /** 孤儿 op 对账结果(N1-2;键孤儿/文件孤儿),供命令层报告与 --prune-orphans 使用 */
176
+ orphans?: {
177
+ keyOrphans: OrphanOp[];
178
+ fileOrphans: OrphanOp[];
179
+ };
180
+ }
181
+ /** 状态对账单条差异(B2-1;status.md「状态」字段 ↔ flow.json 权威值) */
182
+ export interface StatusReconcileItem {
183
+ /** 阶段 ID */
184
+ stage: string;
185
+ /** status.md 当前「状态」值('' = 字段缺失/文件缺失) */
186
+ from: string;
187
+ /** flow.json 权威值(mapPhaseToStageStatus 派生) */
188
+ to: string;
189
+ /** 处理结果:planned(dry-run 预览)/ applied(已回写)/ skipped-not-found(字段或文件缺失) */
190
+ result: 'planned' | 'applied' | 'skipped-not-found';
191
+ }
192
+ /** 阶段可移除性检查结果(供 removeStage 与 flow stage remove --dry-run 共用,REV-005) */
193
+ export interface RemovalCheck {
194
+ /** 是否允许移除(force=true 且阶段存在时恒 true) */
195
+ ok: boolean;
196
+ /** ok=false 时的拒绝原因(中文,供 CLI 直接展示) */
197
+ reason?: string;
198
+ /** 阶段 ops 数量 */
199
+ opCount: number;
200
+ /** 是否为 pipeline.current.stage */
201
+ isCurrent: boolean;
202
+ /** 引用该阶段的其它阶段(flow.json.stages[].deps 命中者,REV-004) */
203
+ referencing: string[];
156
204
  }
157
205
  /** 健康检查单项 */
158
206
  export interface HealthCheckItem {
@@ -165,6 +213,24 @@ export interface HealthCheckResult {
165
213
  items: HealthCheckItem[];
166
214
  ok: boolean;
167
215
  }
216
+ /**
217
+ * 对账 flow.json 的 op 键与 ops/ 目录文件(N1-2 公开入口)。
218
+ * @param projectPath 项目根路径
219
+ * @returns keyOrphans(有键无文件)/ fileOrphans(有文件无键);flow.json 缺失/损坏时返回空
220
+ */
221
+ export declare function findOrphanOps(projectPath: string): {
222
+ keyOrphans: OrphanOp[];
223
+ fileOrphans: OrphanOp[];
224
+ };
225
+ /** findPhasePath 的路径查找结果(B5-1) */
226
+ export interface PhasePathResult {
227
+ /** 唯一可达路径(含起点后的逐跳目标);不存在/多义时为 [] */
228
+ path: string[];
229
+ /** 结果原因 */
230
+ reason: 'ok' | 'already-at-target' | 'no-path' | 'ambiguous' | 'depth-exceeded';
231
+ }
232
+ /** findPhasePath BFS 深度上限(B5-1;超出按拒绝处理) */
233
+ export declare const PHASE_PATH_MAX_DEPTH = 8;
168
234
  export declare class FlowManager {
169
235
  private projectPath;
170
236
  private data;
@@ -239,6 +305,12 @@ export declare class FlowManager {
239
305
  getReadyOps(stageId?: string): Op[];
240
306
  /** 获取审查条目,可按 opId 过滤 */
241
307
  getReviewItems(opId?: string): ReviewItem[];
308
+ /**
309
+ * 读取 op 模板文件内容(兼容 `op-NNN.md` 与历史 `op-NNN_{title}.md` 两种命名)。
310
+ * B3-1 填充度检测与 healthCheck 空模板检查共用。
311
+ * @returns 文件内容;未找到/不可读返回 null
312
+ */
313
+ readOpTemplate(stageId: string, opId: string): string | null;
242
314
  /** 获取指定 op 的重试次数 */
243
315
  getRetryCount(opId: string): number;
244
316
  /** 返回人类可读的流水线摘要(支持 i18n) */
@@ -291,6 +363,16 @@ export declare class FlowManager {
291
363
  * @returns 恢复上下文对象
292
364
  */
293
365
  recoverContext(lang?: string): RecoveryContext;
366
+ /**
367
+ * 同步 pipeline.current 到指定阶段中首个 pending / executing 的 op。
368
+ * 单一 owner:被 advanceStagePhase 与 recordAttempt 共用,禁止各自实现。
369
+ * @param stageName 目标阶段 ID(如 'v1.1.2-stage-50')
370
+ * @returns 同步后的 current 快照(便于调用方复用,不写盘)
371
+ */
372
+ syncCurrentOp(stageName: string): {
373
+ stage: string;
374
+ op: string;
375
+ };
294
376
  /**
295
377
  * 推进指定阶段到目标流水线阶段(新 API)
296
378
  * @param stageName 阶段名(如 stage-01)
@@ -313,6 +395,40 @@ export declare class FlowManager {
313
395
  * @param initialPhase 初始流水线阶段,默认 plan_pending
314
396
  */
315
397
  addStage(stageId: string, initialPhase?: PipelinePhase): void;
398
+ /**
399
+ * 检查阶段是否可安全移除(只读,不写盘)。
400
+ *
401
+ * 判定顺序:ops 非空 → 当前活跃阶段 → 被其它阶段 deps 引用。
402
+ * force=true 时越过三项校验(ok 恒 true,阶段不存在除外),但 opCount/isCurrent/referencing 仍如实返回。
403
+ *
404
+ * deps 匹配:精确相等,或 dep/target 经 parseStageId 解析后 (series, stageDir) 相同(兼容短名)。
405
+ * 存量 stage 可能缺 deps 字段(StageData.deps 虽为必填,历史数据未必),以 Array.isArray 守卫。
406
+ *
407
+ * @param stageId 目标阶段 ID
408
+ * @param options.force 是否越权检查
409
+ * @returns 可移除性检查结果
410
+ */
411
+ checkRemovable(stageId: string, options?: {
412
+ force?: boolean;
413
+ }): RemovalCheck;
414
+ /**
415
+ * 移除流水线阶段(仅注销 flow.json 注册;**不删除目录**)。
416
+ *
417
+ * 安全校验复用 checkRemovable:ops 非空 / 当前活跃阶段 / 被其它阶段 deps 引用,默认拒绝,--force 越过。
418
+ * --force 移除时**不清理**引用者 deps 中的悬空项(deps 为声明式引用;保留原样 + 日志 referencing/snapshot 使失真可审计)。
419
+ * 移除后 current 兜底:若 current 指向被删阶段,按 stages 插入序回退首个非 done;无则清空 current。
420
+ * 目录删除由调用方在 `save()` 成功后执行(REV-41 REV-009 事务顺序:避免 save 失败但目录已删的中间态)。
421
+ *
422
+ * @param stageId 目标阶段 ID
423
+ * @param options.force 越过安全校验;options.purge 计算待删 plan 目录(不在此处删除)
424
+ * @returns purgeTarget:`--purge` 时待删除的 plan 目录绝对路径;否则 undefined
425
+ */
426
+ removeStage(stageId: string, options?: {
427
+ force?: boolean;
428
+ purge?: boolean;
429
+ }): {
430
+ purgeTarget?: string;
431
+ };
316
432
  /**
317
433
  * 推进流水线阶段(旧 API)
318
434
  * @param opId 操作 ID(格式 "stage-xx.op-xxx")
@@ -342,6 +458,32 @@ export declare class FlowManager {
342
458
  * @param stageName 可选阶段名,提供时使用该阶段 phase 进行查找;否则使用 current.stage 的 phase
343
459
  */
344
460
  getAvailablePhases(stageName?: string): PipelinePhase[];
461
+ /**
462
+ * 在运行时 transitions 上求 stageName 当前 phase → to 的**唯一**可达路径(B5-1)。
463
+ * BFS(深度上限 PHASE_PATH_MAX_DEPTH);最短深度上存在多条路径 → ambiguous(拒绝,不猜测)。
464
+ * 纯只读:不写盘、不改内存。
465
+ * @param stageName 阶段 ID
466
+ * @param to 目标 phase
467
+ * @returns 路径与原因(no-path/ambiguous/depth-exceeded 供命令层报错;already-at-target 按 no-op)
468
+ */
469
+ findPhasePath(stageName: string, to: string): PhasePathResult;
470
+ /**
471
+ * 获取运行时生效的 phase 列表(供 flow phases 自描述)。
472
+ * 数据源 = this.pipelineConfig(构造时经 loadPipelineConfig 加载 .openfeel/pipeline.yaml);
473
+ * 缺省/解析失败时回退内置默认配置。返回副本,避免调用方修改内部状态。
474
+ */
475
+ getPipelinePhases(): string[];
476
+ /**
477
+ * 获取运行时生效的 phase 转移表(key 可含 '|' 组合条件)。
478
+ * 缺省/解析失败时回退内置默认配置。返回浅拷贝。
479
+ */
480
+ getPipelineTransitions(): Record<string, string[]>;
481
+ /**
482
+ * 获取内置默认 phase 转移表(不受项目 pipeline.yaml 影响)。
483
+ * 供 `flow phases` 做「运行时 vs 默认」差异报告(T19)。
484
+ * @returns 默认 transitions 的深拷贝
485
+ */
486
+ getDefaultTransitions(): Record<string, string[]>;
345
487
  /**
346
488
  * 解析当前阶段 phase:优先使用传入的 stageName,其次 current.stage,最后 fallback
347
489
  */
@@ -359,8 +501,22 @@ export declare class FlowManager {
359
501
  * @param maxChanges 最近状态变更条数(默认 5)
360
502
  */
361
503
  verboseSummary(maxChanges?: number): VerboseSummary;
362
- /** 构建配置级联信息 */
504
+ /**
505
+ * 构建配置级联信息(优先级:profileDefaults < configDefaults < statusOverrides)
506
+ * 全局画像仅作最低优先级兜底(P2),且只取 preferences.auto_advance 单值,
507
+ * 不对 preferences 做整体替换(与 config.yaml defaults 键集重叠的仅 auto_advance)。
508
+ */
363
509
  private buildCascadeConfig;
510
+ /**
511
+ * 解析四个受管配置键的「有效值 + 生效来源」(`openfeel config effective`,P9)。
512
+ * 复用 buildCascadeConfig(单一权威,避免第二套解析),优先级:
513
+ * status.md > config.yaml > profile.yaml > builtin。
514
+ * @returns key → { value, source }
515
+ */
516
+ resolveEffectiveConfig(): Record<string, {
517
+ value: string;
518
+ source: ConfigSource;
519
+ }>;
364
520
  /** 查找 status.md 的路径(三级回退:plan/{series}/ 精确 → plan 递归 → stages 兜底) */
365
521
  private findStatusPath;
366
522
  /** 从 status.md 的状态记录表提取最近 N 条变更 */
@@ -383,6 +539,32 @@ export declare class FlowManager {
383
539
  addReview(item: ReviewItem): void;
384
540
  /** 将指定审查条目标记为 resolved */
385
541
  resolveReview(reviewId: string): boolean;
542
+ /**
543
+ * 更新审查条目的可编辑字段(N2-2):仅覆盖 patch 中提供的键。
544
+ * 留审计日志 `review_update`,并 save()。
545
+ * @param revId 审查条目 ID
546
+ * @param patch 待覆盖字段(priority/title/blocking)
547
+ * @returns 是否命中条目
548
+ */
549
+ updateReview(revId: string, patch: {
550
+ priority?: 'high' | 'medium' | 'low';
551
+ title?: string;
552
+ blocking?: boolean;
553
+ }): boolean;
554
+ /**
555
+ * 删除审查条目(N2-2):留审计日志 `review_remove`,并 save()。
556
+ * @param revId 审查条目 ID
557
+ * @returns 是否命中并删除
558
+ */
559
+ removeReview(revId: string): boolean;
560
+ /**
561
+ * 覆盖写入某阶段的 deps 列表(N2-1)。
562
+ * 悬空依赖的强制校验在命令层(核心层不静默,仅写入 + 审计日志 + save)。
563
+ * @param stageName 阶段 ID(简写或全称,经 normalizeStageId 归一)
564
+ * @param deps 依赖阶段 ID 列表
565
+ * @throws Error 阶段不存在时抛出(调用方决定退出码)
566
+ */
567
+ setStageDeps(stageName: string, deps: string[]): void;
386
568
  /**
387
569
  * 添加自动修复审查条目
388
570
  * 当 openfeel-reviewer 认为问题可直接修复时调用,REV 条目状态直接设为 resolved,
@@ -419,15 +601,20 @@ export declare class FlowManager {
419
601
  * @param dryRun true 时仅检测不修复
420
602
  * @returns 修复结果(修改列表 + 是否从 .bak 恢复)
421
603
  */
422
- repair(dryRun?: boolean): RepairResult;
604
+ repair(dryRun?: boolean, options?: {
605
+ pruneOrphans?: boolean;
606
+ }): RepairResult;
423
607
  /**
424
608
  * 自动修复指定阶段的 phase/status 不一致
425
609
  * - status=done 但 phase≠done → 同步 phase 为 done
426
610
  * - phase=done 但 status≠done → 同步 status 为 done
427
611
  * @param stageName 阶段名(如 stage-01)
612
+ * @param options.dryRun 为 true 时仅计算并返回等价结果,不修改内存(供 --dry-run 预览用)
428
613
  * @returns 修复结果(是否修复 + 详情)
429
614
  */
430
- autoRepairInconsistency(stageName: string): {
615
+ autoRepairInconsistency(stageName: string, options?: {
616
+ dryRun?: boolean;
617
+ }): {
431
618
  fixed: boolean;
432
619
  detail: string;
433
620
  };
@@ -462,6 +649,56 @@ export declare class FlowManager {
462
649
  * @param quick true 时仅检查关键项(phase/current 合法性)
463
650
  */
464
651
  healthCheck(quick?: boolean): HealthCheckResult;
652
+ /**
653
+ * 结构化健康报告访问器(B1-3:供 `flow health --json` 消费)。
654
+ * 复用 healthCheck() 结果,仅做字段别名映射(section→name / message→detail),不改判定。
655
+ * @param quick 是否快速模式(仅检查关键项)
656
+ * @returns { ok, items: [{ name, status, detail }] }
657
+ */
658
+ getHealthReport(quick?: boolean): {
659
+ ok: boolean;
660
+ items: Array<{
661
+ name: string;
662
+ status: 'pass' | 'warn' | 'fail';
663
+ detail: string;
664
+ }>;
665
+ };
666
+ /**
667
+ * 以 flow.json 为权威,对账并回写各阶段 status.md 的「状态」字段(B2-1 / A2)。
668
+ * 仅处理「状态」字段;**绝不**触碰执行模式/自动推进/当前任务/状态记录表(独立字段)。
669
+ * 与 `commands/stage.ts:setStatusField` 同语义(定向替换,其余字节不变);后续可下沉合并。
670
+ * @param options.dryRun true 时只计算差异、不写盘
671
+ * @returns 差异清单(含 dry-run 预览结果);已一致项不入清单(保证幂等 applied=0)
672
+ */
673
+ reconcileStatusMd(options?: {
674
+ dryRun?: boolean;
675
+ }): StatusReconcileItem[];
676
+ /**
677
+ * status.md「状态」字段定向写(原子写 + 按阶段目录加锁)。
678
+ * 仅替换首个匹配的 `- **{key}**:{value}` 行的值,其余内容逐字节保留。
679
+ * 与 `commands/stage.ts:setStatusField` 同语义。
680
+ */
681
+ private writeStatusField;
682
+ /**
683
+ * 7. 悬空依赖检测:stages[].deps 是否均指向已注册阶段(B2 存量防御)
684
+ * 仅作数据卫生告警(warn),不阻断;强制校验点在命令层 `commands/plan.ts`
685
+ * @param items 健康检查结果收集数组
686
+ */
687
+ private checkDanglingDeps;
688
+ /**
689
+ * 8. 孤儿 op 检测:flow.json 的 op 键与 ops/ 目录文件是否一致(N1-3)
690
+ * 仅作数据卫生告警(warn),不阻断;退出码不受影响(仅 fail 决定)。
691
+ * 无孤儿时不产生条目(保持输出精简)。
692
+ * @param items 健康检查结果收集数组
693
+ */
694
+ private checkOrphanOps;
695
+ /**
696
+ * 9. 空模板检测:op 模板仍含 `- [ ] 待补充` 时告警(B3/B4)。
697
+ * 窄兼容(A1 第 1 条):**显式跳过 `draft`** op(draft 本就允许空模板)。
698
+ * 仅作数据卫生告警(warn),不阻断。
699
+ * @param items 健康检查结果收集数组
700
+ */
701
+ private checkEmptyTemplates;
465
702
  /** 1. 检查 flow.json 合法性 */
466
703
  private checkFlowJson;
467
704
  /** 2. 检查 flow.json 与 plan/{series}/stage-NN/status.md 跨文件一致性 */
@@ -502,6 +739,20 @@ export declare class FlowManager {
502
739
  * 幂等:已是 openfeel-* 原样返回;feel / none / unknown / 非 agent 值(如 flow-manager)原样保留。
503
740
  */
504
741
  export declare function normalizeAgentName(name: string): string;
742
+ /**
743
+ * 空模板标记(**单一来源**):B3 填充度检测、B4 publish 校验、healthCheck 空模板检查共用。
744
+ * 见 op-005 验收 12(无第二套判定)。
745
+ */
746
+ export declare const EMPTY_TEMPLATE_MARKER = "- [ ] \u5F85\u8865\u5145";
747
+ /** 模板是否仍含空模板标记(未填充;**整行锚定**,非子串) */
748
+ export declare function isTemplateEmpty(content: string): boolean;
749
+ /**
750
+ * 判定 op 模板填充度(B3-1)。
751
+ * - empty:仍含空模板标记 `- [ ] 待补充`(**整行锚定**,行内引用不误报)
752
+ * - partial:已删除该标记但存在其它未勾选 `- [ ]`(行首 `[ \t]*` 锚定,口径与 empty 统一)
753
+ * - filled:无未完成标记
754
+ */
755
+ export declare function detectFillState(content: string): 'empty' | 'partial' | 'filled';
505
756
  /**
506
757
  * 将 PipelinePhase 映射为 stage 状态
507
758
  * @param phase 流水线阶段