openfeel 1.1.7 → 1.2.1

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 (115) hide show
  1. package/README.en.md +35 -8
  2. package/README.md +29 -4
  3. package/README.zh-CN.md +35 -8
  4. package/bin/openfeel.js +3 -2
  5. package/dist/cli/index.d.ts.map +1 -1
  6. package/dist/cli/index.js +7 -4
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/commands/config.d.ts.map +1 -1
  9. package/dist/commands/config.js +29 -4
  10. package/dist/commands/config.js.map +1 -1
  11. package/dist/commands/flow.d.ts.map +1 -1
  12. package/dist/commands/flow.js +385 -14
  13. package/dist/commands/flow.js.map +1 -1
  14. package/dist/commands/plan.d.ts.map +1 -1
  15. package/dist/commands/plan.js +19 -6
  16. package/dist/commands/plan.js.map +1 -1
  17. package/dist/commands/req.d.ts +15 -0
  18. package/dist/commands/req.d.ts.map +1 -0
  19. package/dist/commands/req.js +735 -0
  20. package/dist/commands/req.js.map +1 -0
  21. package/dist/commands/stage.d.ts.map +1 -1
  22. package/dist/commands/stage.js +7 -1
  23. package/dist/commands/stage.js.map +1 -1
  24. package/dist/core/config.d.ts +6 -4
  25. package/dist/core/config.d.ts.map +1 -1
  26. package/dist/core/config.js +6 -5
  27. package/dist/core/config.js.map +1 -1
  28. package/dist/core/flow-archive/archive-file.d.ts +35 -0
  29. package/dist/core/flow-archive/archive-file.d.ts.map +1 -0
  30. package/dist/core/flow-archive/archive-file.js +3 -0
  31. package/dist/core/flow-archive/archive-file.js.map +1 -0
  32. package/dist/core/flow-archive/archive-health.d.ts +34 -0
  33. package/dist/core/flow-archive/archive-health.d.ts.map +1 -0
  34. package/dist/core/flow-archive/archive-health.js +76 -0
  35. package/dist/core/flow-archive/archive-health.js.map +1 -0
  36. package/dist/core/flow-archive/archive-ops.d.ts +68 -0
  37. package/dist/core/flow-archive/archive-ops.d.ts.map +1 -0
  38. package/dist/core/flow-archive/archive-ops.js +184 -0
  39. package/dist/core/flow-archive/archive-ops.js.map +1 -0
  40. package/dist/core/flow-archive/grouping.d.ts +58 -0
  41. package/dist/core/flow-archive/grouping.d.ts.map +1 -0
  42. package/dist/core/flow-archive/grouping.js +153 -0
  43. package/dist/core/flow-archive/grouping.js.map +1 -0
  44. package/dist/core/flow-manager.d.ts +67 -9
  45. package/dist/core/flow-manager.d.ts.map +1 -1
  46. package/dist/core/flow-manager.js +243 -51
  47. package/dist/core/flow-manager.js.map +1 -1
  48. package/dist/core/i18n-data/en.d.ts +1 -0
  49. package/dist/core/i18n-data/en.d.ts.map +1 -1
  50. package/dist/core/i18n-data/en.js +174 -4
  51. package/dist/core/i18n-data/en.js.map +1 -1
  52. package/dist/core/i18n-data/zh-CN.d.ts +1 -0
  53. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
  54. package/dist/core/i18n-data/zh-CN.js +175 -4
  55. package/dist/core/i18n-data/zh-CN.js.map +1 -1
  56. package/dist/core/i18n.js +4 -4
  57. package/dist/core/i18n.js.map +1 -1
  58. package/dist/core/managed-region.d.ts +16 -2
  59. package/dist/core/managed-region.d.ts.map +1 -1
  60. package/dist/core/managed-region.js +24 -3
  61. package/dist/core/managed-region.js.map +1 -1
  62. package/dist/core/metrics.d.ts +2 -0
  63. package/dist/core/metrics.d.ts.map +1 -1
  64. package/dist/core/metrics.js +15 -0
  65. package/dist/core/metrics.js.map +1 -1
  66. package/dist/core/model-config.d.ts +1 -1
  67. package/dist/core/model-config.d.ts.map +1 -1
  68. package/dist/core/model-config.js +2 -2
  69. package/dist/core/model-config.js.map +1 -1
  70. package/dist/core/opencode-config.js +1 -1
  71. package/dist/core/opencode-config.js.map +1 -1
  72. package/dist/core/pipeline-schema.d.ts +15 -0
  73. package/dist/core/pipeline-schema.d.ts.map +1 -1
  74. package/dist/core/pipeline-schema.js +17 -0
  75. package/dist/core/pipeline-schema.js.map +1 -1
  76. package/dist/core/plan/path.d.ts +17 -0
  77. package/dist/core/plan/path.d.ts.map +1 -1
  78. package/dist/core/plan/path.js +31 -0
  79. package/dist/core/plan/path.js.map +1 -1
  80. package/dist/core/plan/stage.d.ts +2 -1
  81. package/dist/core/plan/stage.d.ts.map +1 -1
  82. package/dist/core/plan/stage.js +7 -2
  83. package/dist/core/plan/stage.js.map +1 -1
  84. package/dist/core/req/aggregate.d.ts +62 -0
  85. package/dist/core/req/aggregate.d.ts.map +1 -0
  86. package/dist/core/req/aggregate.js +134 -0
  87. package/dist/core/req/aggregate.js.map +1 -0
  88. package/dist/core/req/body-file.d.ts +16 -0
  89. package/dist/core/req/body-file.d.ts.map +1 -0
  90. package/dist/core/req/body-file.js +84 -0
  91. package/dist/core/req/body-file.js.map +1 -0
  92. package/dist/core/req/requirement-ops.d.ts +116 -0
  93. package/dist/core/req/requirement-ops.d.ts.map +1 -0
  94. package/dist/core/req/requirement-ops.js +395 -0
  95. package/dist/core/req/requirement-ops.js.map +1 -0
  96. package/dist/core/req/types.d.ts +46 -0
  97. package/dist/core/req/types.d.ts.map +1 -0
  98. package/dist/core/req/types.js +7 -0
  99. package/dist/core/req/types.js.map +1 -0
  100. package/dist/core/runtime-log.d.ts +18 -0
  101. package/dist/core/runtime-log.d.ts.map +1 -1
  102. package/dist/core/runtime-log.js +72 -0
  103. package/dist/core/runtime-log.js.map +1 -1
  104. package/dist/core/session.d.ts +24 -0
  105. package/dist/core/session.d.ts.map +1 -0
  106. package/dist/core/session.js +107 -0
  107. package/dist/core/session.js.map +1 -0
  108. package/dist/core/setup.js +4 -4
  109. package/dist/core/template-loader.d.ts.map +1 -1
  110. package/dist/core/template-loader.js +3160 -6571
  111. package/dist/core/template-loader.js.map +1 -1
  112. package/dist/core/update.d.ts.map +1 -1
  113. package/dist/core/update.js +770 -26
  114. package/dist/core/update.js.map +1 -1
  115. package/package.json +1 -1
@@ -23,6 +23,7 @@ export const common = {
23
23
  stageIdInvalidTmpl: { key: 'common.stageIdInvalidTmpl', zh: '{input} → 非法阶段 ID(应为 stage-NN 或 vX.Y.Z-stage-NN)', en: '' },
24
24
  stageIdSuggestTmpl: { key: 'common.stageIdSuggestTmpl', zh: '建议名称:{suggest}', en: '' },
25
25
  stageDirConflictTmpl: { key: 'common.stageDirConflictTmpl', zh: '阶段目录冲突:{stage} 与 {other} 映射同一目录', en: '' },
26
+ generalOnlyRequirement: { key: 'common.generalOnlyRequirement', zh: 'general(通用模式)仅限需求级——阶段级 / 部署级不支持;阶段请使用 fast / full。', en: '' },
26
27
  };
27
28
  /* ==================== flow 域:流水线状态管理 ==================== */
28
29
  export const flow = {
@@ -93,9 +94,33 @@ export const flow = {
93
94
  'phases.transitionsDiffExtra': { key: 'flow.phases.transitionsDiffExtra', zh: '新增键 {keys}', en: '' },
94
95
  'phases.transitionsDiffChanged': { key: 'flow.phases.transitionsDiffChanged', zh: '目标集不同 {keys}', en: '' },
95
96
  'phases.modeHint': { key: 'flow.phases.modeHint', zh: '提示:查看模式来源与切换:openfeel flow mode [--stage <id>]', en: '' },
97
+ 'phases.tierLineTmpl': { key: 'flow.phases.tierLineTmpl', zh: '审查档位:{tier}(模式派生自 {mode})', en: '' },
98
+ 'phases.tierHint': { key: 'flow.phases.tierHint', zh: '提示:审查档位仅裁剪审查关(全量 / 精简 / 免审);显式声明:openfeel flow advance --review-tier <tier>', en: '' },
96
99
  // flow mode(stage-75 op-002:当前模式与来源,只读)
97
100
  'mode.lineTmpl': { key: 'flow.mode.lineTmpl', zh: '当前模式:{mode} [来源: {source}]', en: '' },
98
101
  'mode.targetsLabel': { key: 'flow.mode.targetsLabel', zh: '可达目标({stage} · {phase}):{targets}', en: '' },
102
+ // flow archive(stage-79 op-001:flow.json 版本分片归档命令面)
103
+ 'archive.doneTmpl': { key: 'flow.archive.doneTmpl', zh: '已归档 {version}:阶段 {stages} / 审查 {reviews} / 日志 {log}', en: '' },
104
+ 'archive.rearchivedTmpl': { key: 'flow.archive.rearchivedTmpl', zh: '{version} 已重新归档(覆盖写;索引已存在,幂等收敛)', en: '' },
105
+ 'archive.previewTmpl': { key: 'flow.archive.previewTmpl', zh: '[dry-run] 将归档 {version}:阶段 {stages} / 审查 {reviews} / 日志 {log}', en: '' },
106
+ 'archive.previewNoWrite': { key: 'flow.archive.previewNoWrite', zh: '(预览模式:未写入任何文件)', en: '' },
107
+ 'archive.invalidVersionTmpl': { key: 'flow.archive.invalidVersionTmpl', zh: '{input} → 非法版本号(应为 vX.Y[.Z] 形式,如 v1.1.7)', en: '' },
108
+ 'archive.versionNotActiveTmpl': { key: 'flow.archive.versionNotActiveTmpl', zh: '版本 {version} 未注册于活跃 flow.json(不存在或已归档);拒绝归档(零写盘)', en: '' },
109
+ 'archive.gateNotDoneTitleTmpl': { key: 'flow.archive.gateNotDoneTitleTmpl', zh: '版本 {version} 存在未完成阶段({n} 个):', en: '' },
110
+ 'archive.gateBlockingRevTitleTmpl': { key: 'flow.archive.gateBlockingRevTitleTmpl', zh: '版本 {version} 存在阻塞 open 审查({n} 条):', en: '' },
111
+ 'archive.gateItemTmpl': { key: 'flow.archive.gateItemTmpl', zh: ' - {item}', en: '' },
112
+ 'archive.gateRejected': { key: 'flow.archive.gateRejected', zh: '归档判据未满足,拒绝执行(零写盘)', en: '' },
113
+ 'archive.pipelineTmpl': { key: 'flow.archive.pipelineTmpl', zh: 'pipeline 处置:current={current},phase={phase}', en: '' },
114
+ 'archive.list.empty': { key: 'flow.archive.list.empty', zh: '暂无归档版本(.openfeel/flow-archive/ 为空或不存在)', en: '' },
115
+ 'archive.list.title': { key: 'flow.archive.list.title', zh: '已归档版本:', en: '' },
116
+ 'archive.list.itemTmpl': { key: 'flow.archive.list.itemTmpl', zh: ' + {version}:阶段 {stages} / 审查 {reviews} / 日志 {log}', en: '' },
117
+ 'archive.list.unreadableTmpl': { key: 'flow.archive.list.unreadableTmpl', zh: ' + {version}:(不可读,文件损坏或非法)', en: '' },
118
+ 'archive.show.notFoundTmpl': { key: 'flow.archive.show.notFoundTmpl', zh: '归档版本 {version} 不存在;可用版本:{versions}', en: '' },
119
+ 'archive.show.titleTmpl': { key: 'flow.archive.show.titleTmpl', zh: '归档版本 {version}(archived_at: {at})', en: '' },
120
+ 'archive.show.countsTmpl': { key: 'flow.archive.show.countsTmpl', zh: '阶段 {stages} / 审查 {reviews} / 日志 {log}', en: '' },
121
+ 'archive.show.stagesLabel': { key: 'flow.archive.show.stagesLabel', zh: '阶段:', en: '' },
122
+ 'archive.show.stageLineTmpl': { key: 'flow.archive.show.stageLineTmpl', zh: ' - {stage} [{phase}]', en: '' },
123
+ 'archive.show.fullHint': { key: 'flow.archive.show.fullHint', zh: '(完整 log / reviews 请用 --json 查看)', en: '' },
99
124
  // flow stage remove
100
125
  'stage.remove.notFoundTmpl': { key: 'flow.stage.remove.notFoundTmpl', zh: '阶段不存在:{stage}', en: '' },
101
126
  'stage.remove.okTmpl': { key: 'flow.stage.remove.okTmpl', zh: '✓ 已移除阶段: {stage}', en: '' },
@@ -134,13 +159,16 @@ export const flow = {
134
159
  'advance.dryRunTitle': { key: 'flow.advance.dryRunTitle', zh: '═══ Dry-run 预览 ═══', en: '' },
135
160
  'advance.dryRunFrom': { key: 'flow.advance.dryRunFrom', zh: '当前阶段', en: '' },
136
161
  'advance.dryRunTo': { key: 'flow.advance.dryRunTo', zh: '目标阶段', en: '' },
162
+ 'advance.dryRunTierTmpl': { key: 'flow.advance.dryRunTierTmpl', zh: '审查档位: {tier}(免除: {gates})', en: '' },
163
+ 'advance.warnTierTmpl': { key: 'flow.advance.warnTierTmpl', zh: '[!] 审查档位『{tier}』:本次推进免除审查关 {gates}(代码审查关恒保留)', en: '' },
137
164
  'advance.dryRunOk': { key: 'flow.advance.dryRunOk', zh: '✓ 合法性验证通过,未实际修改 flow.json。去掉 --dry-run 后正式执行。', en: '' },
138
165
  'advance.pathTitle': { key: 'flow.advance.pathTitle', zh: '推进路径:', en: '' },
139
166
  'advance.pathArrow': { key: 'flow.advance.pathArrow', zh: ' → ', en: '' },
140
167
  'advance.stepOkTmpl': { key: 'flow.advance.stepOkTmpl', zh: '已推进:{stage} {from} → {to}', en: '' },
141
168
  'advance.ambiguousTmpl': { key: 'flow.advance.ambiguousTmpl', zh: '存在多条等价路径,已拒绝;请逐步显式指定 --to', en: '' },
142
169
  'advance.noPathTmpl': { key: 'flow.advance.noPathTmpl', zh: '无法从 {from} 到达 {to};当前可达目标:{targets}', en: '' },
143
- 'advance.depthExceededTmpl': { key: 'flow.advance.depthExceededTmpl', zh: '路径深度超过上限({max}),已拒绝', en: '' },
170
+ 'advance.generalNoPipeline': { key: 'flow.advance.generalNoPipeline', zh: '错误: 阶段 "{stage}" 的工作流模式为 general(无流水线)——无合法跳转目标;如需推进请先显式升级为 fast / full。', en: '' },
171
+ 'advance.depthExceededTmpl': { key: 'flow.advance.depthExceededTmpl', zh: '路径深度超过上限({max}),已拒绝(目标可能不可达:目标相位在当前档位下被裁剪或无可达入边)', en: '' },
144
172
  'advance.partialFailTmpl': { key: 'flow.advance.partialFailTmpl', zh: '已完成到 {done};失败于 {failed};剩余路径:{remaining}', en: '' },
145
173
  'advance.blockedByRevTmpl': { key: 'flow.advance.blockedByRevTmpl', zh: '存在阻塞中的审查条目,已停止推进:{revs};剩余路径:{remaining}', en: '' },
146
174
  'advance.alreadyAtTargetTmpl': { key: 'flow.advance.alreadyAtTargetTmpl', zh: '已在目标阶段:{stage} → {to}(无操作)', en: '' },
@@ -258,6 +286,9 @@ export const flow = {
258
286
  'health.fixSkippedTmpl': { key: 'flow.health.fixSkippedTmpl', zh: '跳过 {n} 个阶段(status.md 中「状态」字段缺失)', en: '' },
259
287
  'health.fixDryRunNote': { key: 'flow.health.fixDryRunNote', zh: '仅预览,未写入任何文件', en: '' },
260
288
  'health.fixOnlyStatusNote': { key: 'flow.health.fixOnlyStatusNote', zh: '仅同步「状态」字段;执行模式/自动推进/当前任务等不受影响', en: '' },
289
+ 'health.reqLinksPassTmpl': { key: 'flow.health.reqLinksPassTmpl', zh: '需求关联一致({n} 个需求,无悬空引用)', en: '' },
290
+ 'health.reqDanglingTmpl': { key: 'flow.health.reqDanglingTmpl', zh: '悬空需求关联:{items}(阶段引用的需求不存在;可经 req link --unlink 解绑)', en: '' },
291
+ 'health.reqDriftTmpl': { key: 'flow.health.reqDriftTmpl', zh: '需求状态漂移:{items}(关联阶段已全部 done 但需求状态非 done)', en: '' },
261
292
  // flow recover
262
293
  'recover.title': { key: 'flow.recover.title', zh: '═══ 跨会话上下文恢复 ═══', en: '' },
263
294
  'recover.globalStatus': { key: 'flow.recover.globalStatus', zh: '全局状态', en: '' },
@@ -429,6 +460,7 @@ export const stage = {
429
460
  'set.noOptionTmpl': { key: 'stage.set.noOptionTmpl', zh: '请至少提供一个字段选项(--status/--exec-mode/--auto-advance/--workflow-mode/--review-agent)', en: '' },
430
461
  'set.depsOkTmpl': { key: 'stage.set.depsOkTmpl', zh: '已更新阶段 {stage} 的依赖:{deps}', en: '' },
431
462
  'set.depsDanglingTmpl': { key: 'stage.set.depsDanglingTmpl', zh: '依赖校验失败:以下阶段不存在 {deps}', en: '' },
463
+ 'set.archivedDepsTmpl': { key: 'stage.set.archivedDepsTmpl', zh: '依赖已归档(视为已满足):{deps}', en: '' },
432
464
  'task.errorMutualExclusive': { key: 'stage.task.errorMutualExclusive', zh: '错误:必须指定 --done 或 --undone(二者互斥)', en: '' },
433
465
  'task.errorInvalidTaskNo': { key: 'stage.task.errorInvalidTaskNo', zh: '错误:任务编号必须为正整数', en: '' },
434
466
  'task.errorTaskNotFoundTmpl': { key: 'stage.task.errorTaskNotFoundTmpl', zh: '错误:在 {stageId} 的 status.md 中未找到「任务{taskNo}」', en: '' },
@@ -449,6 +481,7 @@ export const stage = {
449
481
  export const plan = {
450
482
  'stage.createdTmpl': { key: 'plan.stage.createdTmpl', zh: '已创建阶段: {name}', en: '' },
451
483
  'stage.invalidDepsTmpl': { key: 'plan.stage.invalidDepsTmpl', zh: '依赖阶段不存在:{deps}(已注册阶段:{known})', en: '' },
484
+ 'stage.archivedDepsTmpl': { key: 'plan.stage.archivedDepsTmpl', zh: '依赖已归档(视为已满足):{deps}', en: '' },
452
485
  'stage.empty': { key: 'plan.stage.empty', zh: '暂无工作阶段', en: '' },
453
486
  'scheme.createdTmpl': { key: 'plan.scheme.createdTmpl', zh: '已创建操作方案: {opId}({stage})', en: '' },
454
487
  'scheme.create.titleRequiredTmpl': { key: 'plan.scheme.create.titleRequiredTmpl', zh: '缺少方案标题:请提供 <title>,或改用 --from-tasks 从阶段任务表机械生成', en: '' },
@@ -591,12 +624,21 @@ export const help = {
591
624
  'flow.metrics': { key: 'help.flow.metrics', zh: '展示 Agent 性能指标', en: '' },
592
625
  'flow.metrics.json': { key: 'help.flow.metrics.json', zh: '以 JSON 输出', en: '' },
593
626
  'flow.phases': { key: 'help.flow.phases', zh: '列出全部合法 phase 及其流转映射(自描述)', en: '' },
594
- 'flow.phases.json': { key: 'help.flow.phases.json', zh: '以 JSON 输出 { phases, transitions, advanceAccepted, transitionsDiff, schemaVersion, workflowMode }(advanceAccepted = 内置 15 phase,即 flow advance 的推进白名单;transitionsDiff = 运行时转移表与内置默认的差异报告;workflowMode = 本次展示所依据的工作流模式)', en: '' },
595
- 'flow.phases.mode': { key: 'help.flow.phases.mode', zh: '显式指定工作流模式(full | fast;缺省经 --stage / 当前阶段派生)', en: '' },
627
+ 'flow.phases.json': { key: 'help.flow.phases.json', zh: '以 JSON 输出 { phases, transitions, advanceAccepted, transitionsDiff, schemaVersion, workflowMode, reviewTier }(advanceAccepted = 内置 15 phase,即 flow advance 的推进白名单;transitionsDiff = 运行时转移表与内置默认的差异报告;workflowMode = 本次展示所依据的工作流模式;reviewTier = 由该模式派生的审查档位)', en: '' },
628
+ 'flow.phases.mode': { key: 'help.flow.phases.mode', zh: '显式指定工作流模式(full | fast | general;缺省经 --stage / 当前阶段派生)', en: '' },
596
629
  'flow.phases.stage': { key: 'help.flow.phases.stage', zh: '按指定阶段的模式展示转移表(缺省 = 当前阶段)', en: '' },
597
630
  'flow.mode': { key: 'help.flow.mode', zh: '显示当前工作流模式与来源(只读)', en: '' },
598
631
  'flow.mode.stage': { key: 'help.flow.mode.stage', zh: '目标阶段(缺省 = 当前阶段)', en: '' },
599
632
  'flow.mode.json': { key: 'help.flow.mode.json', zh: '以 JSON 输出 { schemaVersion, stage, mode, source, modes }', en: '' },
633
+ 'flow.archive': { key: 'help.flow.archive', zh: 'flow.json 版本分片归档(按版本号归档已收官历史;与顶层 openfeel archive〔阶段摘要归档〕职责分离)', en: '' },
634
+ 'flow.archive.argversion': { key: 'help.flow.archive.argversion', zh: '版本号(如 v1.1.7;前缀 v 可省略)', en: '' },
635
+ 'flow.archive.dryRun': { key: 'help.flow.archive.dryRun', zh: '仅预览(判据门照常校验;零写盘)', en: '' },
636
+ 'flow.archive.json': { key: 'help.flow.archive.json', zh: '以 JSON 输出 { schemaVersion, version, stages, reviews, log, dryRun }', en: '' },
637
+ 'flow.archive.list': { key: 'help.flow.archive.list', zh: '列出已归档版本及计数(只读;引擎字典序)', en: '' },
638
+ 'flow.archive.list.json': { key: 'help.flow.archive.list.json', zh: '以 JSON 输出 { schemaVersion, versions: [{version, counts}] }', en: '' },
639
+ 'flow.archive.show': { key: 'help.flow.archive.show', zh: '查看指定归档版本(只读;人类输出 = counts + 阶段概览)', en: '' },
640
+ 'flow.archive.show.argversion': { key: 'help.flow.archive.show.argversion', zh: '版本号(如 v1.1.7;前缀 v 可省略)', en: '' },
641
+ 'flow.archive.show.json': { key: 'help.flow.archive.show.json', zh: '以 JSON 输出全量归档内容(含 log / reviews + schemaVersion)', en: '' },
600
642
  'flow.stage': { key: 'help.flow.stage', zh: '阶段管理', en: '' },
601
643
  'flow.stage.add': { key: 'help.flow.stage.add', zh: '新增流水线阶段(仅注册 flow.json,不建目录;通常应使用 openfeel plan stage add)', en: '' },
602
644
  'flow.stage.add.argstageId': { key: 'help.flow.stage.add.argstageId', zh: '阶段 ID(如 v1.1.2-stage-41)', en: '' },
@@ -617,6 +659,7 @@ export const help = {
617
659
  'flow.advance.stage': { key: 'help.flow.advance.stage', zh: '阶段 ID(如 stage-03),必须指定', en: '' },
618
660
  'flow.advance.force': { key: 'help.flow.advance.force', zh: '强制执行(跳过非法 phase 校验和阶段跳跃检查,但不可绕过 REV 阻塞检查)', en: '' },
619
661
  'flow.advance.dryRun': { key: 'help.flow.advance.dryRun', zh: '仅验证不执行修改(预览输出)。与 --force 组合时跳过校验但仍不执行修改', en: '' },
662
+ 'flow.advance.reviewTier': { key: 'help.flow.advance.reviewTier', zh: '审查档位(full / lean / skip;缺省=按模式派生;仅显式声明时裁剪审查关,不可绕过 REV 阻塞检查)', en: '' },
620
663
  'flow.advance.quiet': { key: 'help.flow.advance.quiet', zh: '静默非错误输出(成功确认与 Git 警告均不打印)', en: '' },
621
664
  'flow.attempt': { key: 'help.flow.attempt', zh: '记录操作执行结果', en: '' },
622
665
  'flow.attempt.op': { key: 'help.flow.attempt.op', zh: '操作 ID(如 stage-01.op-001)', en: '' },
@@ -720,7 +763,7 @@ export const help = {
720
763
  'stage.set.status': { key: 'help.stage.set.status', zh: '状态值(粗粒度:planned/review_failed/review_passed/testing/archiving/done)', en: '' },
721
764
  'stage.set.execMode': { key: 'help.stage.set.execMode', zh: '执行模式(manual | auto)', en: '' },
722
765
  'stage.set.autoAdvance': { key: 'help.stage.set.autoAdvance', zh: '自动推进(enabled | disabled)', en: '' },
723
- 'stage.set.workflowMode': { key: 'help.stage.set.workflowMode', zh: '工作流模式(full | fast)', en: '' },
766
+ 'stage.set.workflowMode': { key: 'help.stage.set.workflowMode', zh: '工作流模式(full | fast | general)', en: '' },
724
767
  'stage.set.reviewAgent': { key: 'help.stage.set.reviewAgent', zh: '当前责任 Agent(如 openfeel-executor)', en: '' },
725
768
  'stage.task': { key: 'help.stage.task', zh: '勾选/取消任务 checkbox,或追加任务', en: '' },
726
769
  'stage.task.argstageId': { key: 'help.stage.task.argstageId', zh: '阶段 ID(如 v4-stage-04)', en: '' },
@@ -791,6 +834,52 @@ export const help = {
791
834
  'model.get.scope': { key: 'help.model.get.scope', zh: '层级(缺省展示生效值)', en: '' },
792
835
  'model.list': { key: 'help.model.list', zh: '列出所有 agent 的模型', en: '' },
793
836
  'model.list.scope': { key: 'help.model.list.scope', zh: '层级(缺省展示生效值)', en: '' },
837
+ // req(需求流转命令组)
838
+ 'req': { key: 'help.req', zh: '需求管理(需求流转命令组:添加/列表/详情/认领/推进/看板/推荐)', en: '' },
839
+ 'req.add': { key: 'help.req.add', zh: '创建需求(ID 自动分配;正文骨架铺到 .openfeel/requirements/)', en: '' },
840
+ 'req.add.argtitle': { key: 'help.req.add.argtitle', zh: '需求标题', en: '' },
841
+ 'req.add.targetVersion': { key: 'help.req.add.targetVersion', zh: '预估版本(如 v1.3.0)', en: '' },
842
+ 'req.add.priority': { key: 'help.req.add.priority', zh: '优先级(P0/P1/P2)', en: '' },
843
+ 'req.add.workflowMode': { key: 'help.req.add.workflowMode', zh: '工作流模式(full / fast / general;缺省不设置)', en: '' },
844
+ 'req.list': { key: 'help.req.list', zh: '列出需求(可按状态/版本/认领人过滤)', en: '' },
845
+ 'req.list.status': { key: 'help.req.list.status', zh: '按状态过滤(draft/scheduled/in_progress/done/blocked/cancelled/rejected)', en: '' },
846
+ 'req.list.targetVersion': { key: 'help.req.list.targetVersion', zh: '按预估版本过滤', en: '' },
847
+ 'req.list.owner': { key: 'help.req.list.owner', zh: '按认领人过滤', en: '' },
848
+ 'req.list.json': { key: 'help.req.list.json', zh: '以 JSON 输出 { schemaVersion, requirements }', en: '' },
849
+ 'req.show': { key: 'help.req.show', zh: '查看需求详情(关联阶段为原始只读枚举)', en: '' },
850
+ 'req.show.argid': { key: 'help.req.show.argid', zh: '需求 ID(如 REQ-001)', en: '' },
851
+ 'req.show.json': { key: 'help.req.show.json', zh: '以 JSON 输出 { schemaVersion, requirement, stages, parent, children }', en: '' },
852
+ // req(写命令)
853
+ 'req.claim': { key: 'help.req.claim', zh: '认领需求(占用校验;已被他人认领则拒绝)', en: '' },
854
+ 'req.claim.argid': { key: 'help.req.claim.argid', zh: '需求 ID(如 REQ-001)', en: '' },
855
+ 'req.claim.owner': { key: 'help.req.claim.owner', zh: '认领人(缺省:.openfeel/.info.json user → git config user.name)', en: '' },
856
+ 'req.release': { key: 'help.req.release', zh: '释放认领(未认领为 no-op 成功)', en: '' },
857
+ 'req.release.argid': { key: 'help.req.release.argid', zh: '需求 ID(如 REQ-001)', en: '' },
858
+ 'req.set': { key: 'help.req.set', zh: '更新需求字段(白名单;状态流转合法性由引擎判定)', en: '' },
859
+ 'req.set.argid': { key: 'help.req.set.argid', zh: '需求 ID(如 REQ-001)', en: '' },
860
+ 'req.set.status': { key: 'help.req.set.status', zh: '目标状态(合法性与 done 门由引擎判定)', en: '' },
861
+ 'req.set.title': { key: 'help.req.set.title', zh: '新标题', en: '' },
862
+ 'req.set.targetVersion': { key: 'help.req.set.targetVersion', zh: '新预估版本', en: '' },
863
+ 'req.set.priority': { key: 'help.req.set.priority', zh: '新优先级(P0/P1/P2)', en: '' },
864
+ 'req.set.workflowMode': { key: 'help.req.set.workflowMode', zh: '新工作流模式(full / fast / general;general 仅限无关联阶段的需求)', en: '' },
865
+ 'req.link': { key: 'help.req.link', zh: '关联需求到阶段 / 解绑(--requirement 与 --unlink 二选一)', en: '' },
866
+ 'req.link.stage': { key: 'help.req.link.stage', zh: '阶段 ID(stage-NN 或 vX.Y.Z-stage-NN;短名按 v1.0.0 系列解析)', en: '' },
867
+ 'req.link.requirement': { key: 'help.req.link.requirement', zh: '需求 ID(关联用;与 --unlink 互斥)', en: '' },
868
+ 'req.link.unlink': { key: 'help.req.link.unlink', zh: '解除该阶段的需求关联', en: '' },
869
+ 'req.advance': { key: 'help.req.advance', zh: '显式推进需求状态(合法目标由引擎流转表判定;done:非 general 需求须全部关联阶段 done)', en: '' },
870
+ 'req.advance.argid': { key: 'help.req.advance.argid', zh: '需求 ID(如 REQ-001)', en: '' },
871
+ 'req.advance.to': { key: 'help.req.advance.to', zh: '目标状态(合法目标由引擎判定)', en: '' },
872
+ 'req.board': { key: 'help.req.board', zh: '需求看板(按状态分组;7 组固定顺序)', en: '' },
873
+ 'req.board.targetVersion': { key: 'help.req.board.targetVersion', zh: '按预估版本过滤', en: '' },
874
+ 'req.board.json': { key: 'help.req.board.json', zh: '以 JSON 输出 { schemaVersion, groups }', en: '' },
875
+ 'req.next': { key: 'help.req.next', zh: '推荐下一个可接取需求(scheduled 且未认领;按预估版本升序)', en: '' },
876
+ 'req.next.owner': { key: 'help.req.next.owner', zh: '认领人视角(含该认领人已认领的 scheduled 需求)', en: '' },
877
+ 'req.next.json': { key: 'help.req.next.json', zh: '以 JSON 输出 { schemaVersion, requirement }', en: '' },
878
+ 'req.next.limit': { key: 'help.req.next.limit', zh: '返回候选条数上限(≥1 的整数;缺省 1)', en: '' },
879
+ 'req.split': { key: 'help.req.split', zh: '拆分需求为若干子需求(拆分即发布:子需求入 scheduled)', en: '' },
880
+ 'req.split.argid': { key: 'help.req.split.argid', zh: '需求 ID(如 REQ-001)', en: '' },
881
+ 'req.split.into': { key: 'help.req.split.into', zh: '子需求标题(可重复;至少一项)', en: '' },
882
+ 'req.split.json': { key: 'help.req.split.json', zh: '以 JSON 输出 { schemaVersion, parent, children }', en: '' },
794
883
  };
795
884
  /* ==================== config 域:配置管理命令 ==================== */
796
885
  export const config = {
@@ -811,6 +900,7 @@ export const config = {
811
900
  'get.globalResult': { key: 'config.get.globalResult', zh: '{key}: {value}', en: '' },
812
901
  'set.valueOk': { key: 'config.set.valueOk', zh: '{key} 已设置为:{value}', en: '' },
813
902
  'set.syncSummaryTmpl': { key: 'config.set.syncSummaryTmpl', zh: '同步 {updated} / 插入 {inserted} / 跳过 {skipped}', en: '' },
903
+ 'set.syncArchivedStageTmpl': { key: 'config.set.syncArchivedStageTmpl', zh: '已归档阶段仅同步 status.md(跳过 flow.json 冗余):{stages}', en: '' },
814
904
  'set.invalidKey': { key: 'config.set.invalidKey', zh: '无效的配置键 "{val}",当前仅支持:{keys}', en: '' },
815
905
  'set.invalidValue': { key: 'config.set.invalidValue', zh: '无效的值 "{val}"。{key} 仅支持:{values}', en: '' },
816
906
  'set.error': { key: 'config.set.error', zh: '项目配置写入失败:{err}', en: '' },
@@ -905,6 +995,7 @@ export const metrics = {
905
995
  'summary.totalRetries': { key: 'metrics.summary.totalRetries', zh: ' 总重试次数: {n}', en: '' },
906
996
  'summary.totalDuration': { key: 'metrics.summary.totalDuration', zh: ' 总耗时: {n}ms', en: '' },
907
997
  'summary.avgDuration': { key: 'metrics.summary.avgDuration', zh: ' 平均耗时: {n}ms', en: '' },
998
+ 'summary.caliberNote': { key: 'metrics.summary.caliberNote', zh: '注:耗时口径 = phase 窗口(含跨会话闲置 / 等待),非 agent 纯执行时长。', en: '' },
908
999
  };
909
1000
  /* ==================== repl 域:交互模式(T40) ==================== */
910
1001
  export const repl = {
@@ -914,6 +1005,85 @@ export const repl = {
914
1005
  'helpTitle': { key: 'repl.helpTitle', zh: '可用命令:', en: '' },
915
1006
  'errorPrefix': { key: 'repl.errorPrefix', zh: '错误:', en: '' },
916
1007
  };
1008
+ /* ==================== req 域:需求流转命令组(stage-82) ==================== */
1009
+ export const req = {
1010
+ // req add
1011
+ 'add.doneTmpl': { key: 'req.add.doneTmpl', zh: '已创建 {id}:{title}(状态 draft)', en: '' },
1012
+ 'add.bodyTmpl': { key: 'req.add.bodyTmpl', zh: '正文骨架:{path}', en: '' },
1013
+ // 共享校验文案
1014
+ 'invalidIdTmpl': { key: 'req.invalidIdTmpl', zh: '{input} → 非法需求 ID(应为 REQ-NNN,如 REQ-001)', en: '' },
1015
+ // req list
1016
+ 'list.empty': { key: 'req.list.empty', zh: '(无匹配需求)', en: '' },
1017
+ 'list.itemTmpl': { key: 'req.list.itemTmpl', zh: ' - {id} [{status}] {title}', en: '' },
1018
+ 'list.invalidStatusTmpl': { key: 'req.list.invalidStatusTmpl', zh: '{value} → 非法状态过滤值(合法值:{allowed})', en: '' },
1019
+ // req show
1020
+ 'show.titleTmpl': { key: 'req.show.titleTmpl', zh: '{id}:{title}', en: '' },
1021
+ 'show.metaTmpl': { key: 'req.show.metaTmpl', zh: '状态: {status} | 预估版本: {targetVersion} | 优先级: {priority}', en: '' },
1022
+ 'show.ownerTmpl': { key: 'req.show.ownerTmpl', zh: '认领人: {owner}(认领于 {claimedAt})', en: '' },
1023
+ 'show.ownerNone': { key: 'req.show.ownerNone', zh: '认领人: (无)', en: '' },
1024
+ 'show.timesTmpl': { key: 'req.show.timesTmpl', zh: '创建: {created} | 更新: {updated}', en: '' },
1025
+ 'show.bodyTmpl': { key: 'req.show.bodyTmpl', zh: '正文: {path}', en: '' },
1026
+ 'show.stagesLabel': { key: 'req.show.stagesLabel', zh: '关联阶段:', en: '' },
1027
+ 'show.stageItemTmpl': { key: 'req.show.stageItemTmpl', zh: ' - {stage}', en: '' },
1028
+ 'show.stagesNone': { key: 'req.show.stagesNone', zh: '关联阶段: (无)', en: '' },
1029
+ // 通用错误
1030
+ 'err.notFoundTmpl': { key: 'req.err.notFoundTmpl', zh: '需求 {id} 不存在', en: '' },
1031
+ // req claim
1032
+ 'claim.doneTmpl': { key: 'req.claim.doneTmpl', zh: '已认领 {id}({owner})', en: '' },
1033
+ 'claim.idempotentTmpl': { key: 'req.claim.idempotentTmpl', zh: '{id} 已由 {owner} 认领(no-op)', en: '' },
1034
+ 'claim.ownerUnresolvedTmpl': { key: 'req.claim.ownerUnresolvedTmpl', zh: '无法解析当前用户名(.openfeel/.info.json 与 git config user.name 均不可用);请显式传入 --owner <name>', en: '' },
1035
+ 'claim.terminalTmpl': { key: 'req.claim.terminalTmpl', zh: '{id} 已是终态({status}),不可认领', en: '' },
1036
+ // req release
1037
+ 'release.doneTmpl': { key: 'req.release.doneTmpl', zh: '已释放 {id}', en: '' },
1038
+ 'release.noopTmpl': { key: 'req.release.noopTmpl', zh: '{id} 未被认领(no-op)', en: '' },
1039
+ // req set
1040
+ 'set.doneTmpl': { key: 'req.set.doneTmpl', zh: '已更新 {id}', en: '' },
1041
+ 'set.noopTmpl': { key: 'req.set.noopTmpl', zh: '{id} 无变更(no-op)', en: '' },
1042
+ 'set.noFieldsTmpl': { key: 'req.set.noFieldsTmpl', zh: '未提供任何字段;至少提供 --status / --title / --target-version / --priority / --workflow-mode 之一', en: '' },
1043
+ 'set.modeSyncedTmpl': { key: 'req.set.modeSyncedTmpl', zh: '已将工作流模式 {mode} 下发到 {count} 个关联阶段', en: '' },
1044
+ // req link
1045
+ 'link.doneTmpl': { key: 'req.link.doneTmpl', zh: '已将 {stage} 关联到 {id}', en: '' },
1046
+ 'link.unlinkDoneTmpl': { key: 'req.link.unlinkDoneTmpl', zh: '已解除 {stage} 的需求关联', en: '' },
1047
+ 'link.noopTmpl': { key: 'req.link.noopTmpl', zh: '{stage} 关联未变化(no-op)', en: '' },
1048
+ 'link.exclusiveTmpl': { key: 'req.link.exclusiveTmpl', zh: '--requirement 与 --unlink 必须且只能提供一个', en: '' },
1049
+ 'link.terminalTmpl': { key: 'req.link.terminalTmpl', zh: '{id} 已是终态({status}),不可关联', en: '' },
1050
+ 'link.modeSyncedTmpl': { key: 'req.link.modeSyncedTmpl', zh: '已将需求工作流模式 {mode} 下发到阶段 {stage}(status.md 字段 + flow.json 冗余同批)', en: '' },
1051
+ // req advance
1052
+ 'advance.doneTmpl': { key: 'req.advance.doneTmpl', zh: '已推进 {id}:{from} → {to}', en: '' },
1053
+ 'advance.noopTmpl': { key: 'req.advance.noopTmpl', zh: '{id} 已是 {to}(no-op)', en: '' },
1054
+ // 错误码映射
1055
+ 'err.stageNotFoundTmpl': { key: 'req.err.stageNotFoundTmpl', zh: '阶段 {stage} 不存在(未注册于 flow.json 的 stages)', en: '' },
1056
+ 'err.alreadyClaimedTmpl': { key: 'req.err.alreadyClaimedTmpl', zh: '{id} 已被他人认领;须先释放:openfeel req release {id}', en: '' },
1057
+ 'err.alreadyLinkedTmpl': { key: 'req.err.alreadyLinkedTmpl', zh: '{stage} 已关联其它需求;须先解绑:openfeel req link --stage {stage} --unlink', en: '' },
1058
+ 'err.invalidFieldTmpl': { key: 'req.err.invalidFieldTmpl', zh: '{id} 字段取值非法(检查 --status / --title / --target-version / --priority / --workflow-mode)', en: '' },
1059
+ 'err.invalidStatusTmpl': { key: 'req.err.invalidStatusTmpl', zh: '{id} 目标状态 {to} 被拒(当前 {current};合法目标:{targets})', en: '' },
1060
+ 'err.doneGateTmpl': { key: 'req.err.doneGateTmpl', zh: '{id} 目标状态 done 被拒(当前 {current})——done 须全部关联阶段 done;零关联阶段的需求可设 general 模式显式完成', en: '' },
1061
+ 'err.generalModeConflictTmpl': { key: 'req.err.generalModeConflictTmpl', zh: '{id} 已关联阶段——general(无流水线)仅限无关联阶段的需求(可先解绑阶段,或改走 fast / full)', en: '' },
1062
+ 'err.generalTargetTmpl': { key: 'req.err.generalTargetTmpl', zh: '{id} 工作流模式为 general(无流水线)——不接受阶段关联', en: '' },
1063
+ // req board
1064
+ 'board.groupTmpl': { key: 'req.board.groupTmpl', zh: '{status}({n})', en: '' },
1065
+ 'board.itemTmpl': { key: 'req.board.itemTmpl', zh: ' - {id} {title}', en: '' },
1066
+ 'board.ownedSuffixTmpl': { key: 'req.board.ownedSuffixTmpl', zh: '(已认领:{owner})', en: '' },
1067
+ // req next
1068
+ 'next.foundTmpl': { key: 'req.next.foundTmpl', zh: '下一项:{id} [{status}] {title}', en: '' },
1069
+ 'next.ownedSuffixTmpl': { key: 'req.next.ownedSuffixTmpl', zh: '(已认领:{owner})', en: '' },
1070
+ 'next.empty': { key: 'req.next.empty', zh: '(无可接取需求)', en: '' },
1071
+ 'next.limitInvalidTmpl': { key: 'req.next.limitInvalidTmpl', zh: '{value} → 非法 --limit 值(应为 ≥1 的整数)', en: '' },
1072
+ 'next.multiLabel': { key: 'req.next.multiLabel', zh: '可接取需求({n}):', en: '' },
1073
+ 'next.itemTmpl': { key: 'req.next.itemTmpl', zh: ' - {id} [{status}] {title}', en: '' },
1074
+ // req split
1075
+ 'split.doneTmpl': { key: 'req.split.doneTmpl', zh: '已拆分 {id} → {children}(共 {n} 条子需求)', en: '' },
1076
+ 'split.childTmpl': { key: 'req.split.childTmpl', zh: ' - {id}:{title}(正文:{path})', en: '' },
1077
+ 'split.noIntoTmpl': { key: 'req.split.noIntoTmpl', zh: '未提供 --into;请至少给出一个子需求标题(--into 可重复)', en: '' },
1078
+ 'split.terminalTmpl': { key: 'req.split.terminalTmpl', zh: '{id} 已是终态({status}),不可拆分', en: '' },
1079
+ 'split.invalidFieldTmpl': { key: 'req.split.invalidFieldTmpl', zh: '子需求取值非法(标题不能为空)', en: '' },
1080
+ // req show(父需求 / 子需求)
1081
+ 'show.parentTmpl': { key: 'req.show.parentTmpl', zh: '父需求: {parent}', en: '' },
1082
+ 'show.parentNone': { key: 'req.show.parentNone', zh: '父需求: (无)', en: '' },
1083
+ 'show.childrenLabel': { key: 'req.show.childrenLabel', zh: '子需求:', en: '' },
1084
+ 'show.childItemTmpl': { key: 'req.show.childItemTmpl', zh: ' - {id} [{status}] {title}', en: '' },
1085
+ 'show.childrenNone': { key: 'req.show.childrenNone', zh: '子需求: (无)', en: '' },
1086
+ };
917
1087
  /* ==================== 聚合导出 ==================== */
918
1088
  /** 所有功能域的聚合数组(供 i18n.ts 构建 Map 使用) */
919
1089
  export const allDomains = [
@@ -937,5 +1107,6 @@ export const allDomains = [
937
1107
  { name: 'setup', domain: setup },
938
1108
  { name: 'metrics', domain: metrics },
939
1109
  { name: 'repl', domain: repl },
1110
+ { name: 'req', domain: req },
940
1111
  ];
941
1112
  //# sourceMappingURL=zh-CN.js.map