openfeel 1.1.6 → 1.2.0

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 (97) hide show
  1. package/README.en.md +25 -6
  2. package/README.md +17 -2
  3. package/README.zh-CN.md +25 -6
  4. package/dist/cli/index.d.ts.map +1 -1
  5. package/dist/cli/index.js +2 -0
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/commands/config.d.ts.map +1 -1
  8. package/dist/commands/config.js +85 -4
  9. package/dist/commands/config.js.map +1 -1
  10. package/dist/commands/flow.d.ts +8 -0
  11. package/dist/commands/flow.d.ts.map +1 -1
  12. package/dist/commands/flow.js +447 -15
  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 +71 -7
  16. package/dist/commands/plan.js.map +1 -1
  17. package/dist/commands/req.d.ts +14 -0
  18. package/dist/commands/req.d.ts.map +1 -0
  19. package/dist/commands/req.js +562 -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 +56 -2
  23. package/dist/commands/stage.js.map +1 -1
  24. package/dist/core/config.d.ts +17 -2
  25. package/dist/core/config.d.ts.map +1 -1
  26. package/dist/core/config.js +21 -6
  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 +78 -14
  45. package/dist/core/flow-manager.d.ts.map +1 -1
  46. package/dist/core/flow-manager.js +311 -55
  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 +159 -3
  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 +161 -3
  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/pipeline-schema.d.ts +5 -0
  59. package/dist/core/pipeline-schema.d.ts.map +1 -1
  60. package/dist/core/pipeline-schema.js +5 -0
  61. package/dist/core/pipeline-schema.js.map +1 -1
  62. package/dist/core/plan/path.d.ts +17 -0
  63. package/dist/core/plan/path.d.ts.map +1 -1
  64. package/dist/core/plan/path.js +31 -0
  65. package/dist/core/plan/path.js.map +1 -1
  66. package/dist/core/plan/scheme.d.ts +22 -0
  67. package/dist/core/plan/scheme.d.ts.map +1 -1
  68. package/dist/core/plan/scheme.js +71 -2
  69. package/dist/core/plan/scheme.js.map +1 -1
  70. package/dist/core/plan/stage.d.ts +2 -0
  71. package/dist/core/plan/stage.d.ts.map +1 -1
  72. package/dist/core/plan/stage.js +8 -0
  73. package/dist/core/plan/stage.js.map +1 -1
  74. package/dist/core/req/aggregate.d.ts +61 -0
  75. package/dist/core/req/aggregate.d.ts.map +1 -0
  76. package/dist/core/req/aggregate.js +134 -0
  77. package/dist/core/req/aggregate.js.map +1 -0
  78. package/dist/core/req/body-file.d.ts +16 -0
  79. package/dist/core/req/body-file.d.ts.map +1 -0
  80. package/dist/core/req/body-file.js +80 -0
  81. package/dist/core/req/body-file.js.map +1 -0
  82. package/dist/core/req/requirement-ops.d.ts +74 -0
  83. package/dist/core/req/requirement-ops.d.ts.map +1 -0
  84. package/dist/core/req/requirement-ops.js +290 -0
  85. package/dist/core/req/requirement-ops.js.map +1 -0
  86. package/dist/core/req/types.d.ts +40 -0
  87. package/dist/core/req/types.d.ts.map +1 -0
  88. package/dist/core/req/types.js +13 -0
  89. package/dist/core/req/types.js.map +1 -0
  90. package/dist/core/setup.js +4 -4
  91. package/dist/core/template-loader.d.ts.map +1 -1
  92. package/dist/core/template-loader.js +649 -65
  93. package/dist/core/template-loader.js.map +1 -1
  94. package/dist/core/update.d.ts.map +1 -1
  95. package/dist/core/update.js +131 -15
  96. package/dist/core/update.js.map +1 -1
  97. package/package.json +1 -1
@@ -86,6 +86,30 @@ export const flow = {
86
86
  'phases.transitionsDiffMissing': { key: 'flow.phases.transitionsDiffMissing', zh: '', en: 'missing keys {keys}' },
87
87
  'phases.transitionsDiffExtra': { key: 'flow.phases.transitionsDiffExtra', zh: '', en: 'extra keys {keys}' },
88
88
  'phases.transitionsDiffChanged': { key: 'flow.phases.transitionsDiffChanged', zh: '', en: 'differing targets {keys}' },
89
+ 'phases.modeHint': { key: 'flow.phases.modeHint', zh: '', en: 'Hint: inspect mode source / switch mode: openfeel flow mode [--stage <id>]' },
90
+ 'mode.lineTmpl': { key: 'flow.mode.lineTmpl', zh: '', en: 'Workflow mode: {mode} [source: {source}]' },
91
+ 'mode.targetsLabel': { key: 'flow.mode.targetsLabel', zh: '', en: 'Reachable targets ({stage} · {phase}): {targets}' },
92
+ 'archive.doneTmpl': { key: 'flow.archive.doneTmpl', zh: '', en: 'Archived {version}: stages {stages} / reviews {reviews} / log {log}' },
93
+ 'archive.rearchivedTmpl': { key: 'flow.archive.rearchivedTmpl', zh: '', en: '{version} re-archived (overwrite; index already contains it, idempotent convergence)' },
94
+ 'archive.previewTmpl': { key: 'flow.archive.previewTmpl', zh: '', en: '[dry-run] will archive {version}: stages {stages} / reviews {reviews} / log {log}' },
95
+ 'archive.previewNoWrite': { key: 'flow.archive.previewNoWrite', zh: '', en: '(preview mode: no file was written)' },
96
+ 'archive.invalidVersionTmpl': { key: 'flow.archive.invalidVersionTmpl', zh: '', en: '{input} → invalid version (expected vX.Y[.Z], e.g. v1.1.7)' },
97
+ '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)' },
98
+ 'archive.gateNotDoneTitleTmpl': { key: 'flow.archive.gateNotDoneTitleTmpl', zh: '', en: 'Version {version} has unfinished stages ({n}):' },
99
+ 'archive.gateBlockingRevTitleTmpl': { key: 'flow.archive.gateBlockingRevTitleTmpl', zh: '', en: 'Version {version} has blocking open reviews ({n}):' },
100
+ 'archive.gateItemTmpl': { key: 'flow.archive.gateItemTmpl', zh: '', en: ' - {item}' },
101
+ 'archive.gateRejected': { key: 'flow.archive.gateRejected', zh: '', en: 'Archive gate not satisfied, refused (zero writes)' },
102
+ 'archive.pipelineTmpl': { key: 'flow.archive.pipelineTmpl', zh: '', en: 'pipeline disposition: current={current}, phase={phase}' },
103
+ 'archive.list.empty': { key: 'flow.archive.list.empty', zh: '', en: 'No archived versions (.openfeel/flow-archive/ is empty or missing)' },
104
+ 'archive.list.title': { key: 'flow.archive.list.title', zh: '', en: 'Archived versions:' },
105
+ 'archive.list.itemTmpl': { key: 'flow.archive.list.itemTmpl', zh: '', en: ' + {version}: stages {stages} / reviews {reviews} / log {log}' },
106
+ 'archive.list.unreadableTmpl': { key: 'flow.archive.list.unreadableTmpl', zh: '', en: ' + {version}: (unreadable, file is corrupt or invalid)' },
107
+ 'archive.show.notFoundTmpl': { key: 'flow.archive.show.notFoundTmpl', zh: '', en: 'Archived version {version} not found; available versions: {versions}' },
108
+ 'archive.show.titleTmpl': { key: 'flow.archive.show.titleTmpl', zh: '', en: 'Archived version {version} (archived_at: {at})' },
109
+ 'archive.show.countsTmpl': { key: 'flow.archive.show.countsTmpl', zh: '', en: 'stages {stages} / reviews {reviews} / log {log}' },
110
+ 'archive.show.stagesLabel': { key: 'flow.archive.show.stagesLabel', zh: '', en: 'Stages:' },
111
+ 'archive.show.stageLineTmpl': { key: 'flow.archive.show.stageLineTmpl', zh: '', en: ' - {stage} [{phase}]' },
112
+ 'archive.show.fullHint': { key: 'flow.archive.show.fullHint', zh: '', en: '(use --json to view the full log / reviews)' },
89
113
  'stage.remove.notFoundTmpl': { key: 'flow.stage.remove.notFoundTmpl', zh: '', en: 'Stage not found: {stage}' },
90
114
  'stage.remove.okTmpl': { key: 'flow.stage.remove.okTmpl', zh: '', en: '✓ Removed stage: {stage}' },
91
115
  'stage.remove.purgedTmpl': { key: 'flow.stage.remove.purgedTmpl', zh: '', en: '✓ Deleted the plan directory' },
@@ -159,6 +183,7 @@ export const flow = {
159
183
  'manager.phaseAutoCorrectShortTmpl': { key: 'flow.manager.phaseAutoCorrectShortTmpl', zh: '', en: "[WARN] phase '{to}' auto-corrected to '{corrected}'" },
160
184
  'manager.advancePhaseNoStageId': { key: 'flow.manager.advancePhaseNoStageId', zh: '', en: '[DEPRECATED] advancePhase: cannot parse stageId; skipped' },
161
185
  'manager.autoFixPhaseGuardTmpl': { key: 'flow.manager.autoFixPhaseGuardTmpl', zh: '', en: '[WARN] addAutoFixReview is only allowed from review_failed; current stage {stage} phase is {phase}' },
186
+ 'manager.fastTransitionsInvalid': { key: 'flow.manager.fastTransitionsInvalid', zh: '', en: '[WARN] pipeline.yaml fast_transitions has invalid type; ignored, using built-in fast table' },
162
187
  'log.noInit': { key: 'flow.log.noInit', zh: '', en: 'Pipeline not initialized, no logs' },
163
188
  'log.noLogs': { key: 'flow.log.noLogs', zh: '', en: 'No operation logs' },
164
189
  'log.recentTitleTmpl': { key: 'flow.log.recentTitleTmpl', zh: '', en: 'Recent {n} operation logs' },
@@ -235,6 +260,9 @@ export const flow = {
235
260
  'health.fixSkippedTmpl': { key: 'flow.health.fixSkippedTmpl', zh: '', en: 'Skipped {n} stage(s) (no "Status" field in status.md)' },
236
261
  'health.fixDryRunNote': { key: 'flow.health.fixDryRunNote', zh: '', en: 'Preview only; nothing was written' },
237
262
  'health.fixOnlyStatusNote': { key: 'flow.health.fixOnlyStatusNote', zh: '', en: 'Only the "Status" field is synced; execution mode / auto-advance / tasks are untouched' },
263
+ 'health.reqLinksPassTmpl': { key: 'flow.health.reqLinksPassTmpl', zh: '', en: 'Requirement links consistent ({n} requirements, no dangling refs)' },
264
+ 'health.reqDanglingTmpl': { key: 'flow.health.reqDanglingTmpl', zh: '', en: 'Dangling requirement links: {items} (referenced requirement does not exist; unbind via req link --unlink)' },
265
+ 'health.reqDriftTmpl': { key: 'flow.health.reqDriftTmpl', zh: '', en: 'Requirement status drift: {items} (all linked stages done but requirement status is not done)' },
238
266
  'recover.title': { key: 'flow.recover.title', zh: '', en: '═══ Cross-Session Context Recovery ═══' },
239
267
  'recover.globalStatus': { key: 'flow.recover.globalStatus', zh: '', en: 'Global Status' },
240
268
  'recover.phase': { key: 'flow.recover.phase', zh: '', en: 'Pipeline Phase' },
@@ -274,6 +302,10 @@ export const flow = {
274
302
  'wizard.createEmpty': { key: 'flow.wizard.createEmpty', zh: '', en: 'Stage ID cannot be empty' },
275
303
  'wizard.createdTmpl': { key: 'flow.wizard.createdTmpl', zh: '', en: '✓ Stage created: {stage}, entering wizard...' },
276
304
  'wizard.createSkipped': { key: 'flow.wizard.createSkipped', zh: '', en: 'Stage creation skipped, exiting wizard.' },
305
+ 'wizard.modePrompt': { key: 'flow.wizard.modePrompt', zh: '', en: 'First-time setup: choose the workflow mode for this stage' },
306
+ 'wizard.modeFull': { key: 'flow.wizard.modeFull', zh: '', en: 'full (complete pipeline: plan review / scheme / test included)' },
307
+ 'wizard.modeFast': { key: 'flow.wizard.modeFast', zh: '', en: 'fast (quick iteration: scheme/test skipped; single-round plan review and code review kept)' },
308
+ 'wizard.modeRememberedTmpl': { key: 'flow.wizard.modeRememberedTmpl', zh: '', en: '✓ Workflow mode remembered: {mode} (written to status.md and project config.yaml)' },
277
309
  };
278
310
  /* ==================== init ==================== */
279
311
  export const init = {
@@ -390,12 +422,15 @@ export const stage = {
390
422
  'errorCheckStageId': { key: 'stage.errorCheckStageId', zh: '', en: 'Please verify the stage ID is correct (e.g. v4-stage-04)' },
391
423
  'set.errorFieldNotFoundTmpl': { key: 'stage.set.errorFieldNotFoundTmpl', zh: '', en: 'Error: "{field}" field not found in {stageId} status.md' },
392
424
  'set.updatedTmpl': { key: 'stage.set.updatedTmpl', zh: '', en: '✓ Updated {stageId} {field}: → {value}' },
425
+ 'set.insertedTmpl': { key: 'stage.set.insertedTmpl', zh: '', en: '✓ Inserted "{field}" in {stageId} status.md: {value}' },
426
+ 'set.noAnchorTmpl': { key: 'stage.set.noAnchorTmpl', zh: '', en: '{stageId}: no insert anchor for "{field}" in status.md (neither "自动推进" nor "执行模式" line found); nothing written' },
393
427
  'set.noopTmpl': { key: 'stage.set.noopTmpl', zh: '', en: 'Field {field} already has the target value; no change made' },
394
428
  'set.invalidValueTmpl': { key: 'stage.set.invalidValueTmpl', zh: '', en: 'Invalid value for {field}: {value} (allowed: {allowed})' },
395
429
  'set.multiPartialTmpl': { key: 'stage.set.multiPartialTmpl', zh: '', en: 'Applied: {done}; failed at: {field}' },
396
- 'set.noOptionTmpl': { key: 'stage.set.noOptionTmpl', zh: '', en: 'Provide at least one field option (--status/--exec-mode/--auto-advance/--review-agent)' },
430
+ 'set.noOptionTmpl': { key: 'stage.set.noOptionTmpl', zh: '', en: 'Provide at least one field option (--status/--exec-mode/--auto-advance/--workflow-mode/--review-agent)' },
397
431
  'set.depsOkTmpl': { key: 'stage.set.depsOkTmpl', zh: '', en: 'Updated deps for stage {stage}: {deps}' },
398
432
  'set.depsDanglingTmpl': { key: 'stage.set.depsDanglingTmpl', zh: '', en: 'Invalid deps: stage(s) not found {deps}' },
433
+ 'set.archivedDepsTmpl': { key: 'stage.set.archivedDepsTmpl', zh: '', en: 'Archived dependency (treated as satisfied): {deps}' },
399
434
  'task.errorMutualExclusive': { key: 'stage.task.errorMutualExclusive', zh: '', en: 'Error: Must specify --done or --undone (mutually exclusive)' },
400
435
  'task.errorInvalidTaskNo': { key: 'stage.task.errorInvalidTaskNo', zh: '', en: 'Error: Task number must be a positive integer' },
401
436
  'task.errorTaskNotFoundTmpl': { key: 'stage.task.errorTaskNotFoundTmpl', zh: '', en: 'Error: Task {taskNo} not found in {stageId} status.md' },
@@ -416,8 +451,13 @@ export const stage = {
416
451
  export const plan = {
417
452
  'stage.createdTmpl': { key: 'plan.stage.createdTmpl', zh: '', en: 'Stage created: {name}' },
418
453
  'stage.invalidDepsTmpl': { key: 'plan.stage.invalidDepsTmpl', zh: '', en: 'Unknown dependency stage(s): {deps} (registered stages: {known})' },
454
+ 'stage.archivedDepsTmpl': { key: 'plan.stage.archivedDepsTmpl', zh: '', en: 'Archived dependency (treated as satisfied): {deps}' },
419
455
  'stage.empty': { key: 'plan.stage.empty', zh: '', en: 'No working stages yet' },
420
456
  'scheme.createdTmpl': { key: 'plan.scheme.createdTmpl', zh: '', en: 'Op created: {opId} ({stage})' },
457
+ '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' },
458
+ 'scheme.create.fromTasksMutualTmpl': { key: 'plan.scheme.create.fromTasksMutualTmpl', zh: '', en: '--from-tasks and <title> are mutually exclusive: the title is derived from the stage task line' },
459
+ 'scheme.fromTasks.okTmpl': { key: 'plan.scheme.fromTasks.okTmpl', zh: '', en: 'Generated {count} op skeletons from the task table: {ops} (stage {stage}; skipped {skipped} already generated); ops/deps.yaml placeholder created when missing' },
460
+ 'scheme.fromTasks.emptyTmpl': { key: 'plan.scheme.fromTasks.emptyTmpl', zh: '', en: 'Stage {stage} has no tasks left to scaffold (existing ops are left untouched); ops/deps.yaml placeholder created when missing' },
421
461
  'scheme.empty': { key: 'plan.scheme.empty', zh: '', en: 'No ops yet' },
422
462
  'scheme.remove.okTmpl': { key: 'plan.scheme.remove.okTmpl', zh: '', en: 'Scheme removed: {opId} (stage {stage})' },
423
463
  'scheme.remove.dryRunTmpl': { key: 'plan.scheme.remove.dryRunTmpl', zh: '', en: 'Preview removing scheme: {opId} (stage {stage}) [DRY-RUN, not written]' },
@@ -549,7 +589,21 @@ export const help = {
549
589
  'flow.metrics': { key: 'help.flow.metrics', zh: '', en: 'Show Agent performance metrics' },
550
590
  'flow.metrics.json': { key: 'help.flow.metrics.json', zh: '', en: 'Output as JSON' },
551
591
  'flow.phases': { key: 'help.flow.phases', zh: '', en: 'List all valid phases and transitions (self-describing)' },
552
- 'flow.phases.json': { key: 'help.flow.phases.json', zh: '', en: 'Output { phases, transitions, advanceAccepted, transitionsDiff, schemaVersion } as JSON (advanceAccepted = the built-in 15 phases accepted by flow advance; transitionsDiff = diff report between runtime and built-in default transitions)' },
592
+ '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)' },
593
+ 'flow.phases.mode': { key: 'help.flow.phases.mode', zh: '', en: 'Explicit workflow mode (full | fast; default derived from --stage / current stage)' },
594
+ 'flow.phases.stage': { key: 'help.flow.phases.stage', zh: '', en: "Show the transition table for the given stage's mode (default: current stage)" },
595
+ 'flow.mode': { key: 'help.flow.mode', zh: '', en: 'Show current workflow mode and its source (read-only)' },
596
+ 'flow.mode.stage': { key: 'help.flow.mode.stage', zh: '', en: 'Target stage (default: current stage)' },
597
+ 'flow.mode.json': { key: 'help.flow.mode.json', zh: '', en: 'Output { schemaVersion, stage, mode, source, modes } as JSON' },
598
+ '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])' },
599
+ 'flow.archive.argversion': { key: 'help.flow.archive.argversion', zh: '', en: 'Version (e.g. v1.1.7; the leading v may be omitted)' },
600
+ 'flow.archive.dryRun': { key: 'help.flow.archive.dryRun', zh: '', en: 'Preview only (the gate is still checked; zero writes)' },
601
+ 'flow.archive.json': { key: 'help.flow.archive.json', zh: '', en: 'Output { schemaVersion, version, stages, reviews, log, dryRun } as JSON' },
602
+ 'flow.archive.list': { key: 'help.flow.archive.list', zh: '', en: 'List archived versions and their counts (read-only; engine lexicographic order)' },
603
+ 'flow.archive.list.json': { key: 'help.flow.archive.list.json', zh: '', en: 'Output { schemaVersion, versions: [{version, counts}] } as JSON' },
604
+ 'flow.archive.show': { key: 'help.flow.archive.show', zh: '', en: 'Show a given archived version (read-only; human output = counts + stage overview)' },
605
+ 'flow.archive.show.argversion': { key: 'help.flow.archive.show.argversion', zh: '', en: 'Version (e.g. v1.1.7; the leading v may be omitted)' },
606
+ 'flow.archive.show.json': { key: 'help.flow.archive.show.json', zh: '', en: 'Output the full archive content (with log / reviews + schemaVersion) as JSON' },
553
607
  'flow.stage': { key: 'help.flow.stage', zh: '', en: 'Stage management' },
554
608
  'flow.stage.add': { key: 'help.flow.stage.add', zh: '', en: 'Add a pipeline stage (registers flow.json only; usually use `openfeel plan stage add`)' },
555
609
  'flow.stage.add.argstageId': { key: 'help.flow.stage.add.argstageId', zh: '', en: 'Stage ID (e.g. v1.1.2-stage-41)' },
@@ -640,8 +694,9 @@ export const help = {
640
694
  'plan.scheme': { key: 'help.plan.scheme', zh: '', en: 'Operation scheme management' },
641
695
  'plan.scheme.create': { key: 'help.plan.scheme.create', zh: '', en: 'Create operation scheme' },
642
696
  'plan.scheme.create.argstage': { key: 'help.plan.scheme.create.argstage', zh: '', en: 'Stage ID (e.g. stage-01 or v1.0.0-stage-01)' },
643
- 'plan.scheme.create.argtitle': { key: 'help.plan.scheme.create.argtitle', zh: '', en: 'Scheme title' },
697
+ 'plan.scheme.create.argtitle': { key: 'help.plan.scheme.create.argtitle', zh: '', en: 'Scheme title (optional)' },
644
698
  'plan.scheme.create.draft': { key: 'help.plan.scheme.create.draft', zh: '', en: 'Create as draft (unpublished); run plan scheme publish after filling it in' },
699
+ 'plan.scheme.create.fromTasks': { key: 'help.plan.scheme.create.fromTasks', zh: '', en: 'Mechanically generate ops/op-NNN.md skeletons + ops/deps.yaml placeholder from the stage task table (no Agent involved)' },
645
700
  'plan.scheme.list': { key: 'help.plan.scheme.list', zh: '', en: 'List operation schemes (optionally filter by stage)' },
646
701
  'plan.scheme.list.argstage': { key: 'help.plan.scheme.list.argstage', zh: '', en: 'Stage name (optional)' },
647
702
  'plan.scheme.remove': { key: 'help.plan.scheme.remove', zh: '', en: 'Remove an operation scheme (deregisters the flow.json key only; does not delete the op template file)' },
@@ -668,6 +723,7 @@ export const help = {
668
723
  'stage.set.status': { key: 'help.stage.set.status', zh: '', en: 'Status value (coarse-grained: planned/review_failed/review_passed/testing/archiving/done)' },
669
724
  'stage.set.execMode': { key: 'help.stage.set.execMode', zh: '', en: 'Execution mode (manual | auto)' },
670
725
  'stage.set.autoAdvance': { key: 'help.stage.set.autoAdvance', zh: '', en: 'Auto advance (enabled | disabled)' },
726
+ 'stage.set.workflowMode': { key: 'help.stage.set.workflowMode', zh: '', en: 'Workflow mode (full | fast)' },
671
727
  'stage.set.reviewAgent': { key: 'help.stage.set.reviewAgent', zh: '', en: 'Current responsible agent (e.g. openfeel-executor)' },
672
728
  'stage.task': { key: 'help.stage.task', zh: '', en: 'Check/uncheck a task checkbox, or append a task' },
673
729
  'stage.task.argstageId': { key: 'help.stage.task.argstageId', zh: '', en: 'Stage ID (e.g. v4-stage-04)' },
@@ -732,6 +788,45 @@ export const help = {
732
788
  'model.get.scope': { key: 'help.model.get.scope', zh: '', en: 'Scope (omit to show effective value)' },
733
789
  'model.list': { key: 'help.model.list', zh: '', en: 'List models of all agents' },
734
790
  'model.list.scope': { key: 'help.model.list.scope', zh: '', en: 'Scope (omit to show effective value)' },
791
+ // req (requirement flow command group)
792
+ 'req': { key: 'help.req', zh: '', en: 'Requirement management (add/list/show/claim/release/set/link/advance/board/next)' },
793
+ 'req.add': { key: 'help.req.add', zh: '', en: 'Create a requirement (auto ID; body skeleton under .openfeel/requirements/)' },
794
+ 'req.add.argtitle': { key: 'help.req.add.argtitle', zh: '', en: 'Requirement title' },
795
+ 'req.add.targetVersion': { key: 'help.req.add.targetVersion', zh: '', en: 'Target version (e.g. v1.3.0)' },
796
+ 'req.add.priority': { key: 'help.req.add.priority', zh: '', en: 'Priority (P0/P1/P2)' },
797
+ 'req.list': { key: 'help.req.list', zh: '', en: 'List requirements (filter by status/version/owner)' },
798
+ 'req.list.status': { key: 'help.req.list.status', zh: '', en: 'Filter by status (draft/scheduled/in_progress/done/blocked/cancelled/rejected)' },
799
+ 'req.list.targetVersion': { key: 'help.req.list.targetVersion', zh: '', en: 'Filter by target version' },
800
+ 'req.list.owner': { key: 'help.req.list.owner', zh: '', en: 'Filter by owner' },
801
+ 'req.list.json': { key: 'help.req.list.json', zh: '', en: 'Output JSON { schemaVersion, requirements }' },
802
+ 'req.show': { key: 'help.req.show', zh: '', en: 'Show requirement detail (linked stages as raw read-only list)' },
803
+ 'req.show.argid': { key: 'help.req.show.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
804
+ 'req.show.json': { key: 'help.req.show.json', zh: '', en: 'Output JSON { schemaVersion, requirement, stages }' },
805
+ // req (write commands)
806
+ 'req.claim': { key: 'help.req.claim', zh: '', en: 'Claim a requirement (occupancy checked; rejected if claimed by another)' },
807
+ 'req.claim.argid': { key: 'help.req.claim.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
808
+ 'req.claim.owner': { key: 'help.req.claim.owner', zh: '', en: 'Owner (default: .openfeel/.info.json user -> git config user.name)' },
809
+ 'req.release': { key: 'help.req.release', zh: '', en: 'Release claim (no-op success if unclaimed)' },
810
+ 'req.release.argid': { key: 'help.req.release.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
811
+ 'req.set': { key: 'help.req.set', zh: '', en: 'Update requirement fields (whitelist; transition legality checked by engine)' },
812
+ 'req.set.argid': { key: 'help.req.set.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
813
+ 'req.set.status': { key: 'help.req.set.status', zh: '', en: 'Target status (legality and done gate checked by engine)' },
814
+ 'req.set.title': { key: 'help.req.set.title', zh: '', en: 'New title' },
815
+ 'req.set.targetVersion': { key: 'help.req.set.targetVersion', zh: '', en: 'New target version' },
816
+ 'req.set.priority': { key: 'help.req.set.priority', zh: '', en: 'New priority (P0/P1/P2)' },
817
+ 'req.link': { key: 'help.req.link', zh: '', en: 'Link a requirement to a stage / unlink (exactly one of --requirement or --unlink)' },
818
+ '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)' },
819
+ 'req.link.requirement': { key: 'help.req.link.requirement', zh: '', en: 'Requirement ID (to link; exclusive with --unlink)' },
820
+ 'req.link.unlink': { key: 'help.req.link.unlink', zh: '', en: 'Unlink the requirement from the stage' },
821
+ 'req.advance': { key: 'help.req.advance', zh: '', en: 'Advance requirement status (legality by engine transition table; done requires all linked stages done)' },
822
+ 'req.advance.argid': { key: 'help.req.advance.argid', zh: '', en: 'Requirement ID (e.g. REQ-001)' },
823
+ 'req.advance.to': { key: 'help.req.advance.to', zh: '', en: 'Target status (legality checked by engine)' },
824
+ 'req.board': { key: 'help.req.board', zh: '', en: 'Requirement board (grouped by status; 7 fixed groups)' },
825
+ 'req.board.targetVersion': { key: 'help.req.board.targetVersion', zh: '', en: 'Filter by target version' },
826
+ 'req.board.json': { key: 'help.req.board.json', zh: '', en: 'Output JSON { schemaVersion, groups }' },
827
+ 'req.next': { key: 'help.req.next', zh: '', en: 'Recommend the next claimable requirement (scheduled & unclaimed; by target version ascending)' },
828
+ 'req.next.owner': { key: 'help.req.next.owner', zh: '', en: 'Owner perspective (include their claimed scheduled requirements)' },
829
+ 'req.next.json': { key: 'help.req.next.json', zh: '', en: 'Output JSON { schemaVersion, requirement }' },
735
830
  };
736
831
  /* ==================== config ==================== */
737
832
  export const config = {
@@ -751,6 +846,8 @@ export const config = {
751
846
  'get.globalKeyNotFound': { key: 'config.get.globalKeyNotFound', zh: '', en: '{key}: not set' },
752
847
  'get.globalResult': { key: 'config.get.globalResult', zh: '', en: '{key}: {value}' },
753
848
  'set.valueOk': { key: 'config.set.valueOk', zh: '', en: '{key} set to: {value}' },
849
+ 'set.syncSummaryTmpl': { key: 'config.set.syncSummaryTmpl', zh: '', en: 'Synced {updated} / inserted {inserted} / skipped {skipped}' },
850
+ 'set.syncArchivedStageTmpl': { key: 'config.set.syncArchivedStageTmpl', zh: '', en: 'Archived stage(s): synced to status.md only (flow.json redundancy skipped): {stages}' },
754
851
  'set.invalidKey': { key: 'config.set.invalidKey', zh: '', en: 'Invalid config key "{val}". Currently supported: {keys}' },
755
852
  'set.invalidValue': { key: 'config.set.invalidValue', zh: '', en: 'Invalid value "{val}". {key} only supports: {values}' },
756
853
  'set.error': { key: 'config.set.error', zh: '', en: 'Failed to write project config: {err}' },
@@ -853,6 +950,64 @@ export const repl = {
853
950
  'helpTitle': { key: 'repl.helpTitle', zh: '', en: 'Available commands:' },
854
951
  'errorPrefix': { key: 'repl.errorPrefix', zh: '', en: 'Error: ' },
855
952
  };
953
+ /* ==================== req domain: requirement flow command group (stage-82) ==================== */
954
+ export const req = {
955
+ // req add
956
+ 'add.doneTmpl': { key: 'req.add.doneTmpl', zh: '', en: 'Created {id}: {title} (status: draft)' },
957
+ 'add.bodyTmpl': { key: 'req.add.bodyTmpl', zh: '', en: 'Body skeleton: {path}' },
958
+ // shared validation messages
959
+ 'invalidIdTmpl': { key: 'req.invalidIdTmpl', zh: '', en: '{input} -> invalid requirement ID (expected REQ-NNN, e.g. REQ-001)' },
960
+ // req list
961
+ 'list.empty': { key: 'req.list.empty', zh: '', en: '(no matching requirements)' },
962
+ 'list.itemTmpl': { key: 'req.list.itemTmpl', zh: '', en: ' - {id} [{status}] {title}' },
963
+ 'list.invalidStatusTmpl': { key: 'req.list.invalidStatusTmpl', zh: '', en: '{value} -> invalid status filter (allowed: {allowed})' },
964
+ // req show
965
+ 'show.titleTmpl': { key: 'req.show.titleTmpl', zh: '', en: '{id}: {title}' },
966
+ 'show.metaTmpl': { key: 'req.show.metaTmpl', zh: '', en: 'Status: {status} | Target version: {targetVersion} | Priority: {priority}' },
967
+ 'show.ownerTmpl': { key: 'req.show.ownerTmpl', zh: '', en: 'Owner: {owner} (claimed at {claimedAt})' },
968
+ 'show.ownerNone': { key: 'req.show.ownerNone', zh: '', en: 'Owner: (none)' },
969
+ 'show.timesTmpl': { key: 'req.show.timesTmpl', zh: '', en: 'Created: {created} | Updated: {updated}' },
970
+ 'show.bodyTmpl': { key: 'req.show.bodyTmpl', zh: '', en: 'Body: {path}' },
971
+ 'show.stagesLabel': { key: 'req.show.stagesLabel', zh: '', en: 'Linked stages:' },
972
+ 'show.stageItemTmpl': { key: 'req.show.stageItemTmpl', zh: '', en: ' - {stage}' },
973
+ 'show.stagesNone': { key: 'req.show.stagesNone', zh: '', en: 'Linked stages: (none)' },
974
+ // common errors
975
+ 'err.notFoundTmpl': { key: 'req.err.notFoundTmpl', zh: '', en: 'Requirement {id} not found' },
976
+ // req claim
977
+ 'claim.doneTmpl': { key: 'req.claim.doneTmpl', zh: '', en: 'Claimed {id} ({owner})' },
978
+ 'claim.idempotentTmpl': { key: 'req.claim.idempotentTmpl', zh: '', en: '{id} already claimed by {owner} (no-op)' },
979
+ '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' },
980
+ 'claim.terminalTmpl': { key: 'req.claim.terminalTmpl', zh: '', en: '{id} is in a terminal status ({status}); cannot claim' },
981
+ // req release
982
+ 'release.doneTmpl': { key: 'req.release.doneTmpl', zh: '', en: 'Released {id}' },
983
+ 'release.noopTmpl': { key: 'req.release.noopTmpl', zh: '', en: '{id} is not claimed (no-op)' },
984
+ // req set
985
+ 'set.doneTmpl': { key: 'req.set.doneTmpl', zh: '', en: 'Updated {id}' },
986
+ 'set.noopTmpl': { key: 'req.set.noopTmpl', zh: '', en: '{id} unchanged (no-op)' },
987
+ 'set.noFieldsTmpl': { key: 'req.set.noFieldsTmpl', zh: '', en: 'No fields provided; pass at least one of --status / --title / --target-version / --priority' },
988
+ // req link
989
+ 'link.doneTmpl': { key: 'req.link.doneTmpl', zh: '', en: 'Linked {stage} to {id}' },
990
+ 'link.unlinkDoneTmpl': { key: 'req.link.unlinkDoneTmpl', zh: '', en: 'Unlinked requirement from {stage}' },
991
+ 'link.noopTmpl': { key: 'req.link.noopTmpl', zh: '', en: '{stage} link unchanged (no-op)' },
992
+ 'link.exclusiveTmpl': { key: 'req.link.exclusiveTmpl', zh: '', en: 'Provide exactly one of --requirement or --unlink' },
993
+ 'link.terminalTmpl': { key: 'req.link.terminalTmpl', zh: '', en: '{id} is in a terminal status ({status}); cannot link' },
994
+ // req advance
995
+ 'advance.doneTmpl': { key: 'req.advance.doneTmpl', zh: '', en: 'Advanced {id}: {from} -> {to}' },
996
+ 'advance.noopTmpl': { key: 'req.advance.noopTmpl', zh: '', en: '{id} is already {to} (no-op)' },
997
+ // error-code mapping
998
+ 'err.stageNotFoundTmpl': { key: 'req.err.stageNotFoundTmpl', zh: '', en: 'Stage {stage} not found (not registered in flow.json stages)' },
999
+ 'err.alreadyClaimedTmpl': { key: 'req.err.alreadyClaimedTmpl', zh: '', en: '{id} is claimed by someone else; release first: openfeel req release {id}' },
1000
+ 'err.alreadyLinkedTmpl': { key: 'req.err.alreadyLinkedTmpl', zh: '', en: '{stage} is already linked to another requirement; unlink first: openfeel req link --stage {stage} --unlink' },
1001
+ 'err.invalidFieldTmpl': { key: 'req.err.invalidFieldTmpl', zh: '', en: '{id} invalid field value (check --status / --title / --target-version / --priority)' },
1002
+ 'err.invalidStatusTmpl': { key: 'req.err.invalidStatusTmpl', zh: '', en: '{id} target status {to} rejected (current {current}; allowed: {targets})' },
1003
+ // req board
1004
+ 'board.groupTmpl': { key: 'req.board.groupTmpl', zh: '', en: '{status} ({n})' },
1005
+ 'board.itemTmpl': { key: 'req.board.itemTmpl', zh: '', en: ' - {id} {title}' },
1006
+ // req next
1007
+ 'next.foundTmpl': { key: 'req.next.foundTmpl', zh: '', en: 'Next: {id} [{status}] {title}' },
1008
+ 'next.ownedSuffixTmpl': { key: 'req.next.ownedSuffixTmpl', zh: '', en: ' (claimed by {owner})' },
1009
+ 'next.empty': { key: 'req.next.empty', zh: '', en: '(no claimable requirement)' },
1010
+ };
856
1011
  /* ==================== 聚合导出 ==================== */
857
1012
  export const allDomains = [
858
1013
  { name: 'common', domain: common },
@@ -875,5 +1030,6 @@ export const allDomains = [
875
1030
  { name: 'setup', domain: setup },
876
1031
  { name: 'metrics', domain: metrics },
877
1032
  { name: 'repl', domain: repl },
1033
+ { name: 'req', domain: req },
878
1034
  ];
879
1035
  //# sourceMappingURL=en.js.map