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: '', en: '{input} → invalid stage ID (expected stage-NN or vX.Y.Z-stage-NN)' },
24
24
  stageIdSuggestTmpl: { key: 'common.stageIdSuggestTmpl', zh: '', en: 'Suggested name: {suggest}' },
25
25
  stageDirConflictTmpl: { key: 'common.stageDirConflictTmpl', zh: '', en: 'Stage dir conflict: {stage} and {other} map to the same directory' },
26
+ generalOnlyRequirement: { key: 'common.generalOnlyRequirement', zh: '', en: 'general (General Mode) is valid at the requirement level only — not supported at stage / deployment level; use fast / full for stages.' },
26
27
  };
27
28
  /* ==================== flow ==================== */
28
29
  export const flow = {
@@ -87,8 +88,31 @@ export const flow = {
87
88
  'phases.transitionsDiffExtra': { key: 'flow.phases.transitionsDiffExtra', zh: '', en: 'extra keys {keys}' },
88
89
  'phases.transitionsDiffChanged': { key: 'flow.phases.transitionsDiffChanged', zh: '', en: 'differing targets {keys}' },
89
90
  'phases.modeHint': { key: 'flow.phases.modeHint', zh: '', en: 'Hint: inspect mode source / switch mode: openfeel flow mode [--stage <id>]' },
91
+ 'phases.tierLineTmpl': { key: 'flow.phases.tierLineTmpl', zh: '', en: 'Review tier: {tier} (derived from mode {mode})' },
92
+ 'phases.tierHint': { key: 'flow.phases.tierHint', zh: '', en: 'Hint: the review tier only trims review gates (full / lean / skip); to declare explicitly: openfeel flow advance --review-tier <tier>' },
90
93
  'mode.lineTmpl': { key: 'flow.mode.lineTmpl', zh: '', en: 'Workflow mode: {mode} [source: {source}]' },
91
94
  'mode.targetsLabel': { key: 'flow.mode.targetsLabel', zh: '', en: 'Reachable targets ({stage} · {phase}): {targets}' },
95
+ 'archive.doneTmpl': { key: 'flow.archive.doneTmpl', zh: '', en: 'Archived {version}: stages {stages} / reviews {reviews} / log {log}' },
96
+ 'archive.rearchivedTmpl': { key: 'flow.archive.rearchivedTmpl', zh: '', en: '{version} re-archived (overwrite; index already contains it, idempotent convergence)' },
97
+ 'archive.previewTmpl': { key: 'flow.archive.previewTmpl', zh: '', en: '[dry-run] will archive {version}: stages {stages} / reviews {reviews} / log {log}' },
98
+ 'archive.previewNoWrite': { key: 'flow.archive.previewNoWrite', zh: '', en: '(preview mode: no file was written)' },
99
+ 'archive.invalidVersionTmpl': { key: 'flow.archive.invalidVersionTmpl', zh: '', en: '{input} → invalid version (expected vX.Y[.Z], e.g. v1.1.7)' },
100
+ 'archive.versionNotActiveTmpl': { key: 'flow.archive.versionNotActiveTmpl', zh: '', en: 'Version {version} is not registered in the active flow.json (missing or already archived); archive refused (zero writes)' },
101
+ 'archive.gateNotDoneTitleTmpl': { key: 'flow.archive.gateNotDoneTitleTmpl', zh: '', en: 'Version {version} has unfinished stages ({n}):' },
102
+ 'archive.gateBlockingRevTitleTmpl': { key: 'flow.archive.gateBlockingRevTitleTmpl', zh: '', en: 'Version {version} has blocking open reviews ({n}):' },
103
+ 'archive.gateItemTmpl': { key: 'flow.archive.gateItemTmpl', zh: '', en: ' - {item}' },
104
+ 'archive.gateRejected': { key: 'flow.archive.gateRejected', zh: '', en: 'Archive gate not satisfied, refused (zero writes)' },
105
+ 'archive.pipelineTmpl': { key: 'flow.archive.pipelineTmpl', zh: '', en: 'pipeline disposition: current={current}, phase={phase}' },
106
+ 'archive.list.empty': { key: 'flow.archive.list.empty', zh: '', en: 'No archived versions (.openfeel/flow-archive/ is empty or missing)' },
107
+ 'archive.list.title': { key: 'flow.archive.list.title', zh: '', en: 'Archived versions:' },
108
+ 'archive.list.itemTmpl': { key: 'flow.archive.list.itemTmpl', zh: '', en: ' + {version}: stages {stages} / reviews {reviews} / log {log}' },
109
+ 'archive.list.unreadableTmpl': { key: 'flow.archive.list.unreadableTmpl', zh: '', en: ' + {version}: (unreadable, file is corrupt or invalid)' },
110
+ 'archive.show.notFoundTmpl': { key: 'flow.archive.show.notFoundTmpl', zh: '', en: 'Archived version {version} not found; available versions: {versions}' },
111
+ 'archive.show.titleTmpl': { key: 'flow.archive.show.titleTmpl', zh: '', en: 'Archived version {version} (archived_at: {at})' },
112
+ 'archive.show.countsTmpl': { key: 'flow.archive.show.countsTmpl', zh: '', en: 'stages {stages} / reviews {reviews} / log {log}' },
113
+ 'archive.show.stagesLabel': { key: 'flow.archive.show.stagesLabel', zh: '', en: 'Stages:' },
114
+ 'archive.show.stageLineTmpl': { key: 'flow.archive.show.stageLineTmpl', zh: '', en: ' - {stage} [{phase}]' },
115
+ 'archive.show.fullHint': { key: 'flow.archive.show.fullHint', zh: '', en: '(use --json to view the full log / reviews)' },
92
116
  'stage.remove.notFoundTmpl': { key: 'flow.stage.remove.notFoundTmpl', zh: '', en: 'Stage not found: {stage}' },
93
117
  'stage.remove.okTmpl': { key: 'flow.stage.remove.okTmpl', zh: '', en: '✓ Removed stage: {stage}' },
94
118
  'stage.remove.purgedTmpl': { key: 'flow.stage.remove.purgedTmpl', zh: '', en: '✓ Deleted the plan directory' },
@@ -125,13 +149,16 @@ export const flow = {
125
149
  'advance.dryRunTitle': { key: 'flow.advance.dryRunTitle', zh: '', en: '═══ Dry-run Preview ═══' },
126
150
  'advance.dryRunFrom': { key: 'flow.advance.dryRunFrom', zh: '', en: 'Current phase' },
127
151
  'advance.dryRunTo': { key: 'flow.advance.dryRunTo', zh: '', en: 'Target phase' },
152
+ 'advance.dryRunTierTmpl': { key: 'flow.advance.dryRunTierTmpl', zh: '', en: 'Review tier: {tier} (waived gates: {gates})' },
153
+ 'advance.warnTierTmpl': { key: 'flow.advance.warnTierTmpl', zh: '', en: "[!] Review tier '{tier}': this advance waives review gate(s) {gates} (the code review gate is always kept)" },
128
154
  'advance.dryRunOk': { key: 'flow.advance.dryRunOk', zh: '', en: '✓ Validation passed. No changes were made to flow.json. Remove --dry-run to execute.' },
129
155
  'advance.pathTitle': { key: 'flow.advance.pathTitle', zh: '', en: 'Advance path:' },
130
156
  'advance.pathArrow': { key: 'flow.advance.pathArrow', zh: '', en: ' → ' },
131
157
  'advance.stepOkTmpl': { key: 'flow.advance.stepOkTmpl', zh: '', en: 'Advanced: {stage} {from} → {to}' },
132
158
  'advance.ambiguousTmpl': { key: 'flow.advance.ambiguousTmpl', zh: '', en: 'Multiple equivalent paths; refused. Specify --to step by step' },
133
159
  'advance.noPathTmpl': { key: 'flow.advance.noPathTmpl', zh: '', en: 'Cannot reach {to} from {from}; reachable targets: {targets}' },
134
- 'advance.depthExceededTmpl': { key: 'flow.advance.depthExceededTmpl', zh: '', en: 'Path depth exceeds limit ({max}); refused' },
160
+ 'advance.generalNoPipeline': { key: 'flow.advance.generalNoPipeline', zh: '', en: 'Error: stage "{stage}" uses workflow mode general (no pipeline) — no legal transition targets; to advance, explicitly upgrade to fast / full first.' },
161
+ 'advance.depthExceededTmpl': { key: 'flow.advance.depthExceededTmpl', zh: '', en: 'Path depth exceeds limit ({max}); refused (the target may be unreachable under the current review tier)' },
135
162
  'advance.partialFailTmpl': { key: 'flow.advance.partialFailTmpl', zh: '', en: 'Completed up to {done}; failed at {failed}; remaining path: {remaining}' },
136
163
  'advance.blockedByRevTmpl': { key: 'flow.advance.blockedByRevTmpl', zh: '', en: 'Blocking review entries found; stopped: {revs}; remaining path: {remaining}' },
137
164
  'advance.alreadyAtTargetTmpl': { key: 'flow.advance.alreadyAtTargetTmpl', zh: '', en: 'Already at target: {stage} → {to} (no-op)' },
@@ -239,6 +266,9 @@ export const flow = {
239
266
  'health.fixSkippedTmpl': { key: 'flow.health.fixSkippedTmpl', zh: '', en: 'Skipped {n} stage(s) (no "Status" field in status.md)' },
240
267
  'health.fixDryRunNote': { key: 'flow.health.fixDryRunNote', zh: '', en: 'Preview only; nothing was written' },
241
268
  'health.fixOnlyStatusNote': { key: 'flow.health.fixOnlyStatusNote', zh: '', en: 'Only the "Status" field is synced; execution mode / auto-advance / tasks are untouched' },
269
+ 'health.reqLinksPassTmpl': { key: 'flow.health.reqLinksPassTmpl', zh: '', en: 'Requirement links consistent ({n} requirements, no dangling refs)' },
270
+ 'health.reqDanglingTmpl': { key: 'flow.health.reqDanglingTmpl', zh: '', en: 'Dangling requirement links: {items} (referenced requirement does not exist; unbind via req link --unlink)' },
271
+ 'health.reqDriftTmpl': { key: 'flow.health.reqDriftTmpl', zh: '', en: 'Requirement status drift: {items} (all linked stages done but requirement status is not done)' },
242
272
  'recover.title': { key: 'flow.recover.title', zh: '', en: '═══ Cross-Session Context Recovery ═══' },
243
273
  'recover.globalStatus': { key: 'flow.recover.globalStatus', zh: '', en: 'Global Status' },
244
274
  'recover.phase': { key: 'flow.recover.phase', zh: '', en: 'Pipeline Phase' },
@@ -406,6 +436,7 @@ export const stage = {
406
436
  'set.noOptionTmpl': { key: 'stage.set.noOptionTmpl', zh: '', en: 'Provide at least one field option (--status/--exec-mode/--auto-advance/--workflow-mode/--review-agent)' },
407
437
  'set.depsOkTmpl': { key: 'stage.set.depsOkTmpl', zh: '', en: 'Updated deps for stage {stage}: {deps}' },
408
438
  'set.depsDanglingTmpl': { key: 'stage.set.depsDanglingTmpl', zh: '', en: 'Invalid deps: stage(s) not found {deps}' },
439
+ 'set.archivedDepsTmpl': { key: 'stage.set.archivedDepsTmpl', zh: '', en: 'Archived dependency (treated as satisfied): {deps}' },
409
440
  'task.errorMutualExclusive': { key: 'stage.task.errorMutualExclusive', zh: '', en: 'Error: Must specify --done or --undone (mutually exclusive)' },
410
441
  'task.errorInvalidTaskNo': { key: 'stage.task.errorInvalidTaskNo', zh: '', en: 'Error: Task number must be a positive integer' },
411
442
  'task.errorTaskNotFoundTmpl': { key: 'stage.task.errorTaskNotFoundTmpl', zh: '', en: 'Error: Task {taskNo} not found in {stageId} status.md' },
@@ -426,6 +457,7 @@ export const stage = {
426
457
  export const plan = {
427
458
  'stage.createdTmpl': { key: 'plan.stage.createdTmpl', zh: '', en: 'Stage created: {name}' },
428
459
  'stage.invalidDepsTmpl': { key: 'plan.stage.invalidDepsTmpl', zh: '', en: 'Unknown dependency stage(s): {deps} (registered stages: {known})' },
460
+ 'stage.archivedDepsTmpl': { key: 'plan.stage.archivedDepsTmpl', zh: '', en: 'Archived dependency (treated as satisfied): {deps}' },
429
461
  'stage.empty': { key: 'plan.stage.empty', zh: '', en: 'No working stages yet' },
430
462
  'scheme.createdTmpl': { key: 'plan.scheme.createdTmpl', zh: '', en: 'Op created: {opId} ({stage})' },
431
463
  'scheme.create.titleRequiredTmpl': { key: 'plan.scheme.create.titleRequiredTmpl', zh: '', en: 'Missing scheme title: pass <title>, or use --from-tasks to generate mechanically from the stage task table' },
@@ -563,12 +595,21 @@ export const help = {
563
595
  'flow.metrics': { key: 'help.flow.metrics', zh: '', en: 'Show Agent performance metrics' },
564
596
  'flow.metrics.json': { key: 'help.flow.metrics.json', zh: '', en: 'Output as JSON' },
565
597
  'flow.phases': { key: 'help.flow.phases', zh: '', en: 'List all valid phases and transitions (self-describing)' },
566
- 'flow.phases.json': { key: 'help.flow.phases.json', zh: '', en: 'Output { phases, transitions, advanceAccepted, transitionsDiff, schemaVersion, workflowMode } as JSON (advanceAccepted = the built-in 15 phases accepted by flow advance; transitionsDiff = diff report between runtime and built-in default transitions; workflowMode = the workflow mode used for this view)' },
567
- 'flow.phases.mode': { key: 'help.flow.phases.mode', zh: '', en: 'Explicit workflow mode (full | fast; default derived from --stage / current stage)' },
598
+ 'flow.phases.json': { key: 'help.flow.phases.json', zh: '', en: 'Output { phases, transitions, advanceAccepted, transitionsDiff, schemaVersion, workflowMode, reviewTier } as JSON (advanceAccepted = the built-in 15 phases accepted by flow advance; transitionsDiff = diff report between runtime and built-in default transitions; workflowMode = the workflow mode used for this view; reviewTier = the review tier derived from that mode)' },
599
+ 'flow.phases.mode': { key: 'help.flow.phases.mode', zh: '', en: 'Explicit workflow mode (full | fast | general; default derived from --stage / current stage)' },
568
600
  'flow.phases.stage': { key: 'help.flow.phases.stage', zh: '', en: "Show the transition table for the given stage's mode (default: current stage)" },
569
601
  'flow.mode': { key: 'help.flow.mode', zh: '', en: 'Show current workflow mode and its source (read-only)' },
570
602
  'flow.mode.stage': { key: 'help.flow.mode.stage', zh: '', en: 'Target stage (default: current stage)' },
571
603
  'flow.mode.json': { key: 'help.flow.mode.json', zh: '', en: 'Output { schemaVersion, stage, mode, source, modes } as JSON' },
604
+ 'flow.archive': { key: 'help.flow.archive', zh: '', en: 'Archive flow.json slices by version (archives completed history by version prefix; separate from top-level openfeel archive [stage summaries])' },
605
+ 'flow.archive.argversion': { key: 'help.flow.archive.argversion', zh: '', en: 'Version (e.g. v1.1.7; the leading v may be omitted)' },
606
+ 'flow.archive.dryRun': { key: 'help.flow.archive.dryRun', zh: '', en: 'Preview only (the gate is still checked; zero writes)' },
607
+ 'flow.archive.json': { key: 'help.flow.archive.json', zh: '', en: 'Output { schemaVersion, version, stages, reviews, log, dryRun } as JSON' },
608
+ 'flow.archive.list': { key: 'help.flow.archive.list', zh: '', en: 'List archived versions and their counts (read-only; engine lexicographic order)' },
609
+ 'flow.archive.list.json': { key: 'help.flow.archive.list.json', zh: '', en: 'Output { schemaVersion, versions: [{version, counts}] } as JSON' },
610
+ 'flow.archive.show': { key: 'help.flow.archive.show', zh: '', en: 'Show a given archived version (read-only; human output = counts + stage overview)' },
611
+ 'flow.archive.show.argversion': { key: 'help.flow.archive.show.argversion', zh: '', en: 'Version (e.g. v1.1.7; the leading v may be omitted)' },
612
+ 'flow.archive.show.json': { key: 'help.flow.archive.show.json', zh: '', en: 'Output the full archive content (with log / reviews + schemaVersion) as JSON' },
572
613
  'flow.stage': { key: 'help.flow.stage', zh: '', en: 'Stage management' },
573
614
  'flow.stage.add': { key: 'help.flow.stage.add', zh: '', en: 'Add a pipeline stage (registers flow.json only; usually use `openfeel plan stage add`)' },
574
615
  'flow.stage.add.argstageId': { key: 'help.flow.stage.add.argstageId', zh: '', en: 'Stage ID (e.g. v1.1.2-stage-41)' },
@@ -589,6 +630,7 @@ export const help = {
589
630
  'flow.advance.stage': { key: 'help.flow.advance.stage', zh: '', en: 'Stage ID (e.g. stage-03), required' },
590
631
  'flow.advance.force': { key: 'help.flow.advance.force', zh: '', en: 'Force execution (skip invalid phase check and phase jump check, but not REV block check)' },
591
632
  'flow.advance.dryRun': { key: 'help.flow.advance.dryRun', zh: '', en: 'Validate only without modifying (preview output). When combined with --force, skips validation but still does not modify' },
633
+ 'flow.advance.reviewTier': { key: 'help.flow.advance.reviewTier', zh: '', en: 'Review tier (full / lean / skip; default = derived from the workflow mode; the tier trims review gates only when declared explicitly, and cannot bypass the REV block check)' },
592
634
  'flow.advance.quiet': { key: 'help.flow.advance.quiet', zh: '', en: 'Silence non-error output (no success confirmation or Git warning)' },
593
635
  'flow.attempt': { key: 'help.flow.attempt', zh: '', en: 'Record operation execution result' },
594
636
  'flow.attempt.op': { key: 'help.flow.attempt.op', zh: '', en: 'Operation ID (e.g. stage-01.op-001)' },
@@ -688,7 +730,7 @@ export const help = {
688
730
  'stage.set.status': { key: 'help.stage.set.status', zh: '', en: 'Status value (coarse-grained: planned/review_failed/review_passed/testing/archiving/done)' },
689
731
  'stage.set.execMode': { key: 'help.stage.set.execMode', zh: '', en: 'Execution mode (manual | auto)' },
690
732
  'stage.set.autoAdvance': { key: 'help.stage.set.autoAdvance', zh: '', en: 'Auto advance (enabled | disabled)' },
691
- 'stage.set.workflowMode': { key: 'help.stage.set.workflowMode', zh: '', en: 'Workflow mode (full | fast)' },
733
+ 'stage.set.workflowMode': { key: 'help.stage.set.workflowMode', zh: '', en: 'Workflow mode (full | fast | general)' },
692
734
  'stage.set.reviewAgent': { key: 'help.stage.set.reviewAgent', zh: '', en: 'Current responsible agent (e.g. openfeel-executor)' },
693
735
  'stage.task': { key: 'help.stage.task', zh: '', en: 'Check/uncheck a task checkbox, or append a task' },
694
736
  'stage.task.argstageId': { key: 'help.stage.task.argstageId', zh: '', en: 'Stage ID (e.g. v4-stage-04)' },
@@ -753,6 +795,52 @@ export const help = {
753
795
  'model.get.scope': { key: 'help.model.get.scope', zh: '', en: 'Scope (omit to show effective value)' },
754
796
  'model.list': { key: 'help.model.list', zh: '', en: 'List models of all agents' },
755
797
  'model.list.scope': { key: 'help.model.list.scope', zh: '', en: 'Scope (omit to show effective value)' },
798
+ // req (requirement flow command group)
799
+ 'req': { key: 'help.req', zh: '', en: 'Requirement management (add/list/show/claim/release/set/link/advance/board/next)' },
800
+ 'req.add': { key: 'help.req.add', zh: '', en: 'Create a requirement (auto ID; body skeleton under .openfeel/requirements/)' },
801
+ 'req.add.argtitle': { key: 'help.req.add.argtitle', zh: '', en: 'Requirement title' },
802
+ 'req.add.targetVersion': { key: 'help.req.add.targetVersion', zh: '', en: 'Target version (e.g. v1.3.0)' },
803
+ 'req.add.priority': { key: 'help.req.add.priority', zh: '', en: 'Priority (P0/P1/P2)' },
804
+ 'req.add.workflowMode': { key: 'help.req.add.workflowMode', zh: '', en: 'Workflow mode (full / fast / general; unset by default)' },
805
+ 'req.list': { key: 'help.req.list', zh: '', en: 'List requirements (filter by status/version/owner)' },
806
+ 'req.list.status': { key: 'help.req.list.status', zh: '', en: 'Filter by status (draft/scheduled/in_progress/done/blocked/cancelled/rejected)' },
807
+ 'req.list.targetVersion': { key: 'help.req.list.targetVersion', zh: '', en: 'Filter by target version' },
808
+ 'req.list.owner': { key: 'help.req.list.owner', zh: '', en: 'Filter by owner' },
809
+ 'req.list.json': { key: 'help.req.list.json', zh: '', en: 'Output JSON { schemaVersion, requirements }' },
810
+ 'req.show': { key: 'help.req.show', zh: '', en: 'Show requirement detail (linked stages as raw read-only list)' },
811
+ 'req.show.argid': { key: 'help.req.show.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
812
+ 'req.show.json': { key: 'help.req.show.json', zh: '', en: 'Output JSON { schemaVersion, requirement, stages, parent, children }' },
813
+ // req (write commands)
814
+ 'req.claim': { key: 'help.req.claim', zh: '', en: 'Claim a requirement (occupancy checked; rejected if claimed by another)' },
815
+ 'req.claim.argid': { key: 'help.req.claim.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
816
+ 'req.claim.owner': { key: 'help.req.claim.owner', zh: '', en: 'Owner (default: .openfeel/.info.json user -> git config user.name)' },
817
+ 'req.release': { key: 'help.req.release', zh: '', en: 'Release claim (no-op success if unclaimed)' },
818
+ 'req.release.argid': { key: 'help.req.release.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
819
+ 'req.set': { key: 'help.req.set', zh: '', en: 'Update requirement fields (whitelist; transition legality checked by engine)' },
820
+ 'req.set.argid': { key: 'help.req.set.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
821
+ 'req.set.status': { key: 'help.req.set.status', zh: '', en: 'Target status (legality and done gate checked by engine)' },
822
+ 'req.set.title': { key: 'help.req.set.title', zh: '', en: 'New title' },
823
+ 'req.set.targetVersion': { key: 'help.req.set.targetVersion', zh: '', en: 'New target version' },
824
+ 'req.set.priority': { key: 'help.req.set.priority', zh: '', en: 'New priority (P0/P1/P2)' },
825
+ 'req.set.workflowMode': { key: 'help.req.set.workflowMode', zh: '', en: 'New workflow mode (full / fast / general; general requires no linked stages)' },
826
+ 'req.link': { key: 'help.req.link', zh: '', en: 'Link a requirement to a stage / unlink (exactly one of --requirement or --unlink)' },
827
+ 'req.link.stage': { key: 'help.req.link.stage', zh: '', en: 'Stage ID (stage-NN or vX.Y.Z-stage-NN; short name resolves in the v1.0.0 series)' },
828
+ 'req.link.requirement': { key: 'help.req.link.requirement', zh: '', en: 'Requirement ID (to link; exclusive with --unlink)' },
829
+ 'req.link.unlink': { key: 'help.req.link.unlink', zh: '', en: 'Unlink the requirement from the stage' },
830
+ 'req.advance': { key: 'help.req.advance', zh: '', en: 'Advance requirement status (legality by engine transition table; done: non-general requirements require all linked stages done)' },
831
+ 'req.advance.argid': { key: 'help.req.advance.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
832
+ 'req.advance.to': { key: 'help.req.advance.to', zh: '', en: 'Target status (legality checked by engine)' },
833
+ 'req.board': { key: 'help.req.board', zh: '', en: 'Requirement board (grouped by status; 7 fixed groups)' },
834
+ 'req.board.targetVersion': { key: 'help.req.board.targetVersion', zh: '', en: 'Filter by target version' },
835
+ 'req.board.json': { key: 'help.req.board.json', zh: '', en: 'Output JSON { schemaVersion, groups }' },
836
+ 'req.next': { key: 'help.req.next', zh: '', en: 'Recommend the next claimable requirement (scheduled & unclaimed; by target version ascending)' },
837
+ 'req.next.owner': { key: 'help.req.next.owner', zh: '', en: 'Owner perspective (include their claimed scheduled requirements)' },
838
+ 'req.next.json': { key: 'help.req.next.json', zh: '', en: 'Output JSON { schemaVersion, requirement }' },
839
+ 'req.next.limit': { key: 'help.req.next.limit', zh: '', en: 'Max number of candidates (integer >= 1; default 1)' },
840
+ 'req.split': { key: 'help.req.split', zh: '', en: 'Split a requirement into child requirements (split = publish; children start as scheduled)' },
841
+ 'req.split.argid': { key: 'help.req.split.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
842
+ 'req.split.into': { key: 'help.req.split.into', zh: '', en: 'Child requirement title (repeatable; at least one)' },
843
+ 'req.split.json': { key: 'help.req.split.json', zh: '', en: 'Output JSON { schemaVersion, parent, children }' },
756
844
  };
757
845
  /* ==================== config ==================== */
758
846
  export const config = {
@@ -773,6 +861,7 @@ export const config = {
773
861
  'get.globalResult': { key: 'config.get.globalResult', zh: '', en: '{key}: {value}' },
774
862
  'set.valueOk': { key: 'config.set.valueOk', zh: '', en: '{key} set to: {value}' },
775
863
  'set.syncSummaryTmpl': { key: 'config.set.syncSummaryTmpl', zh: '', en: 'Synced {updated} / inserted {inserted} / skipped {skipped}' },
864
+ 'set.syncArchivedStageTmpl': { key: 'config.set.syncArchivedStageTmpl', zh: '', en: 'Archived stage(s): synced to status.md only (flow.json redundancy skipped): {stages}' },
776
865
  'set.invalidKey': { key: 'config.set.invalidKey', zh: '', en: 'Invalid config key "{val}". Currently supported: {keys}' },
777
866
  'set.invalidValue': { key: 'config.set.invalidValue', zh: '', en: 'Invalid value "{val}". {key} only supports: {values}' },
778
867
  'set.error': { key: 'config.set.error', zh: '', en: 'Failed to write project config: {err}' },
@@ -866,6 +955,7 @@ export const metrics = {
866
955
  'summary.totalRetries': { key: 'metrics.summary.totalRetries', zh: '', en: ' Total retries: {n}' },
867
956
  'summary.totalDuration': { key: 'metrics.summary.totalDuration', zh: '', en: ' Total duration: {n}ms' },
868
957
  'summary.avgDuration': { key: 'metrics.summary.avgDuration', zh: '', en: ' Avg duration: {n}ms' },
958
+ 'summary.caliberNote': { key: 'metrics.summary.caliberNote', zh: '', en: 'Note: durations are phase windows (including cross-session idle/wait), not pure agent execution time.' },
869
959
  };
870
960
  /* ==================== repl domain: interactive mode (T40) ==================== */
871
961
  export const repl = {
@@ -875,6 +965,85 @@ export const repl = {
875
965
  'helpTitle': { key: 'repl.helpTitle', zh: '', en: 'Available commands:' },
876
966
  'errorPrefix': { key: 'repl.errorPrefix', zh: '', en: 'Error: ' },
877
967
  };
968
+ /* ==================== req domain: requirement flow command group (stage-82) ==================== */
969
+ export const req = {
970
+ // req add
971
+ 'add.doneTmpl': { key: 'req.add.doneTmpl', zh: '', en: 'Created {id}: {title} (status: draft)' },
972
+ 'add.bodyTmpl': { key: 'req.add.bodyTmpl', zh: '', en: 'Body skeleton: {path}' },
973
+ // shared validation messages
974
+ 'invalidIdTmpl': { key: 'req.invalidIdTmpl', zh: '', en: '{input} -> invalid requirement ID (expected REQ-NNN, e.g. REQ-001)' },
975
+ // req list
976
+ 'list.empty': { key: 'req.list.empty', zh: '', en: '(no matching requirements)' },
977
+ 'list.itemTmpl': { key: 'req.list.itemTmpl', zh: '', en: ' - {id} [{status}] {title}' },
978
+ 'list.invalidStatusTmpl': { key: 'req.list.invalidStatusTmpl', zh: '', en: '{value} -> invalid status filter (allowed: {allowed})' },
979
+ // req show
980
+ 'show.titleTmpl': { key: 'req.show.titleTmpl', zh: '', en: '{id}: {title}' },
981
+ 'show.metaTmpl': { key: 'req.show.metaTmpl', zh: '', en: 'Status: {status} | Target version: {targetVersion} | Priority: {priority}' },
982
+ 'show.ownerTmpl': { key: 'req.show.ownerTmpl', zh: '', en: 'Owner: {owner} (claimed at {claimedAt})' },
983
+ 'show.ownerNone': { key: 'req.show.ownerNone', zh: '', en: 'Owner: (none)' },
984
+ 'show.timesTmpl': { key: 'req.show.timesTmpl', zh: '', en: 'Created: {created} | Updated: {updated}' },
985
+ 'show.bodyTmpl': { key: 'req.show.bodyTmpl', zh: '', en: 'Body: {path}' },
986
+ 'show.stagesLabel': { key: 'req.show.stagesLabel', zh: '', en: 'Linked stages:' },
987
+ 'show.stageItemTmpl': { key: 'req.show.stageItemTmpl', zh: '', en: ' - {stage}' },
988
+ 'show.stagesNone': { key: 'req.show.stagesNone', zh: '', en: 'Linked stages: (none)' },
989
+ // common errors
990
+ 'err.notFoundTmpl': { key: 'req.err.notFoundTmpl', zh: '', en: 'Requirement {id} not found' },
991
+ // req claim
992
+ 'claim.doneTmpl': { key: 'req.claim.doneTmpl', zh: '', en: 'Claimed {id} ({owner})' },
993
+ 'claim.idempotentTmpl': { key: 'req.claim.idempotentTmpl', zh: '', en: '{id} already claimed by {owner} (no-op)' },
994
+ 'claim.ownerUnresolvedTmpl': { key: 'req.claim.ownerUnresolvedTmpl', zh: '', en: 'Cannot resolve current user name (.openfeel/.info.json and git config user.name unavailable); pass --owner <name> explicitly' },
995
+ 'claim.terminalTmpl': { key: 'req.claim.terminalTmpl', zh: '', en: '{id} is in a terminal status ({status}); cannot claim' },
996
+ // req release
997
+ 'release.doneTmpl': { key: 'req.release.doneTmpl', zh: '', en: 'Released {id}' },
998
+ 'release.noopTmpl': { key: 'req.release.noopTmpl', zh: '', en: '{id} is not claimed (no-op)' },
999
+ // req set
1000
+ 'set.doneTmpl': { key: 'req.set.doneTmpl', zh: '', en: 'Updated {id}' },
1001
+ 'set.noopTmpl': { key: 'req.set.noopTmpl', zh: '', en: '{id} unchanged (no-op)' },
1002
+ 'set.noFieldsTmpl': { key: 'req.set.noFieldsTmpl', zh: '', en: 'No fields provided; pass at least one of --status / --title / --target-version / --priority / --workflow-mode' },
1003
+ 'set.modeSyncedTmpl': { key: 'req.set.modeSyncedTmpl', zh: '', en: 'Workflow mode {mode} dispatched to {count} linked stage(s)' },
1004
+ // req link
1005
+ 'link.doneTmpl': { key: 'req.link.doneTmpl', zh: '', en: 'Linked {stage} to {id}' },
1006
+ 'link.unlinkDoneTmpl': { key: 'req.link.unlinkDoneTmpl', zh: '', en: 'Unlinked requirement from {stage}' },
1007
+ 'link.noopTmpl': { key: 'req.link.noopTmpl', zh: '', en: '{stage} link unchanged (no-op)' },
1008
+ 'link.exclusiveTmpl': { key: 'req.link.exclusiveTmpl', zh: '', en: 'Provide exactly one of --requirement or --unlink' },
1009
+ 'link.terminalTmpl': { key: 'req.link.terminalTmpl', zh: '', en: '{id} is in a terminal status ({status}); cannot link' },
1010
+ 'link.modeSyncedTmpl': { key: 'req.link.modeSyncedTmpl', zh: '', en: 'Requirement workflow mode {mode} dispatched to stage {stage} (status.md field + flow.json redundancy batched)' },
1011
+ // req advance
1012
+ 'advance.doneTmpl': { key: 'req.advance.doneTmpl', zh: '', en: 'Advanced {id}: {from} -> {to}' },
1013
+ 'advance.noopTmpl': { key: 'req.advance.noopTmpl', zh: '', en: '{id} is already {to} (no-op)' },
1014
+ // error-code mapping
1015
+ 'err.stageNotFoundTmpl': { key: 'req.err.stageNotFoundTmpl', zh: '', en: 'Stage {stage} not found (not registered in flow.json stages)' },
1016
+ 'err.alreadyClaimedTmpl': { key: 'req.err.alreadyClaimedTmpl', zh: '', en: '{id} is claimed by someone else; release first: openfeel req release {id}' },
1017
+ 'err.alreadyLinkedTmpl': { key: 'req.err.alreadyLinkedTmpl', zh: '', en: '{stage} is already linked to another requirement; unlink first: openfeel req link --stage {stage} --unlink' },
1018
+ 'err.invalidFieldTmpl': { key: 'req.err.invalidFieldTmpl', zh: '', en: '{id} invalid field value (check --status / --title / --target-version / --priority / --workflow-mode)' },
1019
+ 'err.invalidStatusTmpl': { key: 'req.err.invalidStatusTmpl', zh: '', en: '{id} target status {to} rejected (current {current}; allowed: {targets})' },
1020
+ 'err.doneGateTmpl': { key: 'req.err.doneGateTmpl', zh: '', en: '{id} target status done rejected (current {current}) — done requires all linked stages done; a requirement with no linked stages can use general mode for explicit completion' },
1021
+ 'err.generalModeConflictTmpl': { key: 'req.err.generalModeConflictTmpl', zh: '', en: '{id} has linked stages — general (no pipeline) requires a requirement without linked stages (unlink first, or use fast / full)' },
1022
+ 'err.generalTargetTmpl': { key: 'req.err.generalTargetTmpl', zh: '', en: '{id} uses workflow mode general (no pipeline) — stage linking is not allowed' },
1023
+ // req board
1024
+ 'board.groupTmpl': { key: 'req.board.groupTmpl', zh: '', en: '{status} ({n})' },
1025
+ 'board.itemTmpl': { key: 'req.board.itemTmpl', zh: '', en: ' - {id} {title}' },
1026
+ 'board.ownedSuffixTmpl': { key: 'req.board.ownedSuffixTmpl', zh: '', en: ' (claimed by {owner})' },
1027
+ // req next
1028
+ 'next.foundTmpl': { key: 'req.next.foundTmpl', zh: '', en: 'Next: {id} [{status}] {title}' },
1029
+ 'next.ownedSuffixTmpl': { key: 'req.next.ownedSuffixTmpl', zh: '', en: ' (claimed by {owner})' },
1030
+ 'next.empty': { key: 'req.next.empty', zh: '', en: '(no claimable requirement)' },
1031
+ 'next.limitInvalidTmpl': { key: 'req.next.limitInvalidTmpl', zh: '', en: '{value} -> invalid --limit value (expected an integer >= 1)' },
1032
+ 'next.multiLabel': { key: 'req.next.multiLabel', zh: '', en: 'Claimable requirements ({n}):' },
1033
+ 'next.itemTmpl': { key: 'req.next.itemTmpl', zh: '', en: ' - {id} [{status}] {title}' },
1034
+ // req split
1035
+ 'split.doneTmpl': { key: 'req.split.doneTmpl', zh: '', en: 'Split {id} -> {children} ({n} child requirements)' },
1036
+ 'split.childTmpl': { key: 'req.split.childTmpl', zh: '', en: ' - {id}: {title} (body: {path})' },
1037
+ 'split.noIntoTmpl': { key: 'req.split.noIntoTmpl', zh: '', en: 'No --into provided; give at least one child title (--into, repeatable)' },
1038
+ 'split.terminalTmpl': { key: 'req.split.terminalTmpl', zh: '', en: '{id} is in a terminal status ({status}); cannot split' },
1039
+ 'split.invalidFieldTmpl': { key: 'req.split.invalidFieldTmpl', zh: '', en: 'Invalid child value (title must not be empty)' },
1040
+ // req show (parent / children)
1041
+ 'show.parentTmpl': { key: 'req.show.parentTmpl', zh: '', en: 'Parent: {parent}' },
1042
+ 'show.parentNone': { key: 'req.show.parentNone', zh: '', en: 'Parent: (none)' },
1043
+ 'show.childrenLabel': { key: 'req.show.childrenLabel', zh: '', en: 'Children:' },
1044
+ 'show.childItemTmpl': { key: 'req.show.childItemTmpl', zh: '', en: ' - {id} [{status}] {title}' },
1045
+ 'show.childrenNone': { key: 'req.show.childrenNone', zh: '', en: 'Children: (none)' },
1046
+ };
878
1047
  /* ==================== 聚合导出 ==================== */
879
1048
  export const allDomains = [
880
1049
  { name: 'common', domain: common },
@@ -897,5 +1066,6 @@ export const allDomains = [
897
1066
  { name: 'setup', domain: setup },
898
1067
  { name: 'metrics', domain: metrics },
899
1068
  { name: 'repl', domain: repl },
1069
+ { name: 'req', domain: req },
900
1070
  ];
901
1071
  //# sourceMappingURL=en.js.map