openfeel 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +42 -12
- package/README.md +8 -3
- package/README.zh-CN.md +43 -13
- package/bin/openfeel.js +5 -0
- package/dist/cli/index.d.ts +15 -3
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +61 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output-encoding.d.ts +41 -0
- package/dist/cli/output-encoding.d.ts.map +1 -0
- package/dist/cli/output-encoding.js +165 -0
- package/dist/cli/output-encoding.js.map +1 -0
- package/dist/cli/repl.d.ts +2 -2
- package/dist/cli/repl.d.ts.map +1 -1
- package/dist/cli/repl.js +46 -25
- package/dist/cli/repl.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +56 -9
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/flow.d.ts.map +1 -1
- package/dist/commands/flow.js +827 -138
- package/dist/commands/flow.js.map +1 -1
- package/dist/commands/init.d.ts +2 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +58 -39
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/knowledge.d.ts.map +1 -1
- package/dist/commands/knowledge.js +69 -0
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +17 -5
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +15 -1
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +18 -1
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +185 -7
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/project.js +2 -2
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/roadmap.d.ts.map +1 -1
- package/dist/commands/roadmap.js +20 -5
- package/dist/commands/roadmap.js.map +1 -1
- package/dist/commands/setup.d.ts +7 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +37 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/shared/errors.d.ts +22 -0
- package/dist/commands/shared/errors.d.ts.map +1 -0
- package/dist/commands/shared/errors.js +45 -0
- package/dist/commands/shared/errors.js.map +1 -0
- package/dist/commands/stage.d.ts.map +1 -1
- package/dist/commands/stage.js +133 -23
- package/dist/commands/stage.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +1 -10
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/view.d.ts +1 -1
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +4 -26
- package/dist/commands/view.js.map +1 -1
- package/dist/core/archive/merge.d.ts.map +1 -1
- package/dist/core/archive/merge.js +9 -5
- package/dist/core/archive/merge.js.map +1 -1
- package/dist/core/artifact-graph/graph.d.ts +7 -2
- package/dist/core/artifact-graph/graph.d.ts.map +1 -1
- package/dist/core/artifact-graph/graph.js +25 -18
- package/dist/core/artifact-graph/graph.js.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.js +4 -33
- package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
- package/dist/core/backup.d.ts +28 -0
- package/dist/core/backup.d.ts.map +1 -0
- package/dist/core/backup.js +118 -0
- package/dist/core/backup.js.map +1 -0
- package/dist/core/config.d.ts +30 -19
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +86 -26
- package/dist/core/config.js.map +1 -1
- package/dist/core/flow-manager.d.ts +256 -5
- package/dist/core/flow-manager.d.ts.map +1 -1
- package/dist/core/flow-manager.js +908 -68
- package/dist/core/flow-manager.js.map +1 -1
- package/dist/core/fs/atomic-write.d.ts +3 -0
- package/dist/core/fs/atomic-write.d.ts.map +1 -1
- package/dist/core/fs/atomic-write.js +3 -0
- package/dist/core/fs/atomic-write.js.map +1 -1
- package/dist/core/fs/safe-read.d.ts +11 -0
- package/dist/core/fs/safe-read.d.ts.map +1 -0
- package/dist/core/fs/safe-read.js +31 -0
- package/dist/core/fs/safe-read.js.map +1 -0
- package/dist/core/global-paths.d.ts +17 -6
- package/dist/core/global-paths.d.ts.map +1 -1
- package/dist/core/global-paths.js +26 -7
- package/dist/core/global-paths.js.map +1 -1
- package/dist/core/i18n-data/en.d.ts +3 -0
- package/dist/core/i18n-data/en.d.ts.map +1 -1
- package/dist/core/i18n-data/en.js +271 -18
- package/dist/core/i18n-data/en.js.map +1 -1
- package/dist/core/i18n-data/zh-CN.d.ts +3 -0
- package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
- package/dist/core/i18n-data/zh-CN.js +278 -18
- package/dist/core/i18n-data/zh-CN.js.map +1 -1
- package/dist/core/i18n.d.ts +8 -0
- package/dist/core/i18n.d.ts.map +1 -1
- package/dist/core/i18n.js +14 -4
- package/dist/core/i18n.js.map +1 -1
- package/dist/core/init.d.ts +12 -15
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +85 -142
- package/dist/core/init.js.map +1 -1
- package/dist/core/managed-region.d.ts +1 -1
- package/dist/core/managed-region.js +1 -1
- package/dist/core/metrics.d.ts +16 -4
- package/dist/core/metrics.d.ts.map +1 -1
- package/dist/core/metrics.js +31 -11
- package/dist/core/metrics.js.map +1 -1
- package/dist/core/migrate.d.ts +12 -0
- package/dist/core/migrate.d.ts.map +1 -1
- package/dist/core/migrate.js +88 -29
- package/dist/core/migrate.js.map +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +4 -2
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/opencode-config.d.ts +4 -4
- package/dist/core/opencode-config.d.ts.map +1 -1
- package/dist/core/opencode-config.js +20 -7
- package/dist/core/opencode-config.js.map +1 -1
- package/dist/core/plan/path.d.ts +40 -0
- package/dist/core/plan/path.d.ts.map +1 -1
- package/dist/core/plan/path.js +108 -1
- package/dist/core/plan/path.js.map +1 -1
- package/dist/core/plan/roadmap.js +2 -2
- package/dist/core/plan/roadmap.js.map +1 -1
- package/dist/core/plan/scheme.d.ts +74 -2
- package/dist/core/plan/scheme.d.ts.map +1 -1
- package/dist/core/plan/scheme.js +311 -26
- package/dist/core/plan/scheme.js.map +1 -1
- package/dist/core/plan/stage.d.ts +34 -3
- package/dist/core/plan/stage.d.ts.map +1 -1
- package/dist/core/plan/stage.js +90 -6
- package/dist/core/plan/stage.js.map +1 -1
- package/dist/core/public-logger.d.ts +18 -5
- package/dist/core/public-logger.d.ts.map +1 -1
- package/dist/core/public-logger.js +62 -23
- package/dist/core/public-logger.js.map +1 -1
- package/dist/core/runtime-log.d.ts +25 -0
- package/dist/core/runtime-log.d.ts.map +1 -0
- package/dist/core/runtime-log.js +94 -0
- package/dist/core/runtime-log.js.map +1 -0
- package/dist/core/setup.d.ts +10 -0
- package/dist/core/setup.d.ts.map +1 -0
- package/dist/core/setup.js +103 -0
- package/dist/core/setup.js.map +1 -0
- package/dist/core/template-loader.d.ts +4 -5
- package/dist/core/template-loader.d.ts.map +1 -1
- package/dist/core/template-loader.js +1322 -259
- package/dist/core/template-loader.js.map +1 -1
- package/dist/core/templates.d.ts +4 -4
- package/dist/core/templates.d.ts.map +1 -1
- package/dist/core/templates.js +15 -11
- package/dist/core/templates.js.map +1 -1
- package/dist/core/update-infos.d.ts +14 -3
- package/dist/core/update-infos.d.ts.map +1 -1
- package/dist/core/update-infos.js +67 -15
- package/dist/core/update-infos.js.map +1 -1
- package/dist/core/update-state.d.ts.map +1 -1
- package/dist/core/update-state.js +7 -4
- package/dist/core/update-state.js.map +1 -1
- package/dist/core/update.d.ts +2 -7
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +338 -149
- package/dist/core/update.js.map +1 -1
- package/dist/core/view/entry.d.ts +53 -1
- package/dist/core/view/entry.d.ts.map +1 -1
- package/dist/core/view/entry.js +71 -2
- package/dist/core/view/entry.js.map +1 -1
- package/dist/core/workspace/identity.d.ts.map +1 -1
- package/dist/core/workspace/identity.js +15 -5
- package/dist/core/workspace/identity.js.map +1 -1
- package/dist/core/workspace/knowledge.d.ts.map +1 -1
- package/dist/core/workspace/knowledge.js +125 -19
- package/dist/core/workspace/knowledge.js.map +1 -1
- package/dist/core/workspace/structure.d.ts.map +1 -1
- package/dist/core/workspace/structure.js +6 -2
- package/dist/core/workspace/structure.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/kb-dedup.d.ts +5 -1
- package/dist/utils/kb-dedup.d.ts.map +1 -1
- package/dist/utils/kb-dedup.js +11 -5
- package/dist/utils/kb-dedup.js.map +1 -1
- package/package.json +6 -6
- package/dist/utils/path.d.ts +0 -22
- package/dist/utils/path.d.ts.map +0 -1
- package/dist/utils/path.js +0 -37
- package/dist/utils/path.js.map +0 -1
- package/scripts/patch-inquirer.js +0 -70
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
export const common = {
|
|
3
3
|
error: { key: 'common.error', zh: '', en: 'Error' },
|
|
4
4
|
errorTmpl: { key: 'common.errorTmpl', zh: '', en: 'Error: {msg}' },
|
|
5
|
+
concurrentConflict: { key: 'common.concurrentConflict', zh: '', en: '[concurrent conflict] flow.json was modified by another process (expected revision={expected}, on-disk={actual}); this change was not written, please retry.' },
|
|
5
6
|
ok: { key: 'common.ok', zh: '', en: '✓' },
|
|
6
7
|
none: { key: 'common.none', zh: '', en: '(none)' },
|
|
7
8
|
noData: { key: 'common.noData', zh: '', en: '(no records)' },
|
|
@@ -19,6 +20,9 @@ export const common = {
|
|
|
19
20
|
blockedBy: { key: 'common.blockedBy', zh: '', en: 'Blocked By' },
|
|
20
21
|
retry: { key: 'common.retry', zh: '', en: 'Retry' },
|
|
21
22
|
cancel: { key: 'common.cancel', zh: '', en: 'Cancel' },
|
|
23
|
+
stageIdInvalidTmpl: { key: 'common.stageIdInvalidTmpl', zh: '', en: '{input} → invalid stage ID (expected stage-NN or vX.Y.Z-stage-NN)' },
|
|
24
|
+
stageIdSuggestTmpl: { key: 'common.stageIdSuggestTmpl', zh: '', en: 'Suggested name: {suggest}' },
|
|
25
|
+
stageDirConflictTmpl: { key: 'common.stageDirConflictTmpl', zh: '', en: 'Stage dir conflict: {stage} and {other} map to the same directory' },
|
|
22
26
|
};
|
|
23
27
|
/* ==================== flow ==================== */
|
|
24
28
|
export const flow = {
|
|
@@ -36,8 +40,8 @@ export const flow = {
|
|
|
36
40
|
'status.reviewPending': { key: 'flow.status.reviewPending', zh: '', en: 'Pending Reviews' },
|
|
37
41
|
'status.logTotal': { key: 'flow.status.logTotal', zh: '', en: 'Total Logs' },
|
|
38
42
|
'status.cascadeTitle': { key: 'flow.status.cascadeTitle', zh: '', en: '── Config Cascade Status ──' },
|
|
39
|
-
'status.cascadeHeader': { key: 'flow.status.cascadeHeader', zh: '', en: 'Field config.yaml status.md Effective' },
|
|
40
|
-
'status.cascadeNote': { key: 'flow.status.cascadeNote', zh: '', en: '(* status.md overrides config.yaml defaults)' },
|
|
43
|
+
'status.cascadeHeader': { key: 'flow.status.cascadeHeader', zh: '', en: 'Field profile.yaml config.yaml status.md Effective' },
|
|
44
|
+
'status.cascadeNote': { key: 'flow.status.cascadeNote', zh: '', en: '(* status.md overrides config.yaml defaults; falls back to the global profile when unset)' },
|
|
41
45
|
'status.recentTitleTmpl': { key: 'flow.status.recentTitleTmpl', zh: '', en: '── Recent {n} Status Changes ──' },
|
|
42
46
|
'status.recentHeader': { key: 'flow.status.recentHeader', zh: '', en: 'Time Agent Status Change Note' },
|
|
43
47
|
'status.downstreamTitle': { key: 'flow.status.downstreamTitle', zh: '', en: '── Downstream Agent Readiness ──' },
|
|
@@ -71,7 +75,25 @@ export const flow = {
|
|
|
71
75
|
'current.stagePhase': { key: 'flow.current.stagePhase', zh: '', en: 'Stage Phase' },
|
|
72
76
|
'current.currentOp': { key: 'flow.current.currentOp', zh: '', en: 'Current Op' },
|
|
73
77
|
'current.retryCount': { key: 'flow.current.retryCount', zh: '', en: 'Retry Count' },
|
|
78
|
+
'current.noOpTmpl': { key: 'flow.current.noOpTmpl', zh: '', en: '{stage} (no op)' },
|
|
74
79
|
'stage.addedTmpl': { key: 'flow.stage.addedTmpl', zh: '', en: '✓ Stage created: {stage} → plan_pending' },
|
|
80
|
+
'phases.title': { key: 'flow.phases.title', zh: '', en: 'OpenFeel pipeline phase reference' },
|
|
81
|
+
'phases.listLabel': { key: 'flow.phases.listLabel', zh: '', en: 'Valid phases' },
|
|
82
|
+
'phases.transitionsLabel': { key: 'flow.phases.transitionsLabel', zh: '', en: 'Phase transitions (from → [to...])' },
|
|
83
|
+
'phases.hint': { key: 'flow.phases.hint', zh: '', en: 'Hint: advance with `openfeel flow advance --stage <id> --to <phase>`' },
|
|
84
|
+
'phases.customPhaseNote': { key: 'flow.phases.customPhaseNote', zh: '', en: 'Note: the runtime pipeline.yaml contains phase(s) outside the built-in 15 ({phases}); they are shown but openfeel flow advance only accepts built-in phases.' },
|
|
85
|
+
'phases.transitionsDiffNote': { key: 'flow.phases.transitionsDiffNote', zh: '', en: 'Runtime transition table differs from built-in defaults: {detail}' },
|
|
86
|
+
'phases.transitionsDiffMissing': { key: 'flow.phases.transitionsDiffMissing', zh: '', en: 'missing keys {keys}' },
|
|
87
|
+
'phases.transitionsDiffExtra': { key: 'flow.phases.transitionsDiffExtra', zh: '', en: 'extra keys {keys}' },
|
|
88
|
+
'phases.transitionsDiffChanged': { key: 'flow.phases.transitionsDiffChanged', zh: '', en: 'differing targets {keys}' },
|
|
89
|
+
'stage.remove.notFoundTmpl': { key: 'flow.stage.remove.notFoundTmpl', zh: '', en: 'Stage not found: {stage}' },
|
|
90
|
+
'stage.remove.okTmpl': { key: 'flow.stage.remove.okTmpl', zh: '', en: '✓ Removed stage: {stage}' },
|
|
91
|
+
'stage.remove.purgedTmpl': { key: 'flow.stage.remove.purgedTmpl', zh: '', en: '✓ Deleted the plan directory' },
|
|
92
|
+
'stage.remove.purgeNeedForce': { key: 'flow.stage.remove.purgeNeedForce', zh: '', en: 'Purging needs confirmation; in non-TTY, pass --force explicitly' },
|
|
93
|
+
'stage.remove.purgeConfirm': { key: 'flow.stage.remove.purgeConfirm', zh: '', en: "Delete this stage's plan directory (irreversible)?" },
|
|
94
|
+
'stage.remove.dryRunTitle': { key: 'flow.stage.remove.dryRunTitle', zh: '', en: '─── Dry-run preview ───' },
|
|
95
|
+
'stage.remove.dryRunReferencing': { key: 'flow.stage.remove.dryRunReferencing', zh: '', en: 'Referenced by (deps)' },
|
|
96
|
+
'stage.remove.dryRunOk': { key: 'flow.stage.remove.dryRunOk', zh: '', en: '✓ Removable (not written); drop --dry-run to execute' },
|
|
75
97
|
'advance.errorNoStage': { key: 'flow.advance.errorNoStage', zh: '', en: 'Error: --stage parameter must specify a stage ID (e.g. stage-03). If this is a new project, run openfeel stage create <id> first.' },
|
|
76
98
|
'advance.warnAutoCorrect': { key: 'flow.advance.warnAutoCorrect', zh: '', en: '(Non-standard phase auto-corrected, proceeding)' },
|
|
77
99
|
'advance.errorInvalidFormat': { key: 'flow.advance.errorInvalidFormat', zh: '', en: 'Error: flow.json format is invalid' },
|
|
@@ -87,6 +109,7 @@ export const flow = {
|
|
|
87
109
|
'advance.okTmpl': { key: 'flow.advance.okTmpl', zh: '', en: '✓ Advanced: {stage} → {to}' },
|
|
88
110
|
'advance.opLabelTmpl': { key: 'flow.advance.opLabelTmpl', zh: '', en: 'Op: {op}' },
|
|
89
111
|
'advance.autoRepaired': { key: 'flow.advance.autoRepaired', zh: '', en: 'Stage data inconsistency detected, auto-repaired' },
|
|
112
|
+
'advance.autoRepairPreview': { key: 'flow.advance.autoRepairPreview', zh: '', en: 'Stage data inconsistency detected; a real run will auto-repair it' },
|
|
90
113
|
'advance.saveError': { key: 'flow.advance.saveError', zh: '', en: 'flow.json save failed' },
|
|
91
114
|
'advance.gitCommitOkTmpl': { key: 'flow.advance.gitCommitOkTmpl', zh: '', en: '✓ Stage {stage} auto git commit archived' },
|
|
92
115
|
'advance.gitCommitSkipTmpl': { key: 'flow.advance.gitCommitSkipTmpl', zh: '', en: '(Skipped auto git commit: not a git repo or no changes) {stage}' },
|
|
@@ -95,15 +118,51 @@ export const flow = {
|
|
|
95
118
|
'advance.dryRunFrom': { key: 'flow.advance.dryRunFrom', zh: '', en: 'Current phase' },
|
|
96
119
|
'advance.dryRunTo': { key: 'flow.advance.dryRunTo', zh: '', en: 'Target phase' },
|
|
97
120
|
'advance.dryRunOk': { key: 'flow.advance.dryRunOk', zh: '', en: '✓ Validation passed. No changes were made to flow.json. Remove --dry-run to execute.' },
|
|
121
|
+
'advance.pathTitle': { key: 'flow.advance.pathTitle', zh: '', en: 'Advance path:' },
|
|
122
|
+
'advance.pathArrow': { key: 'flow.advance.pathArrow', zh: '', en: ' → ' },
|
|
123
|
+
'advance.stepOkTmpl': { key: 'flow.advance.stepOkTmpl', zh: '', en: 'Advanced: {stage} {from} → {to}' },
|
|
124
|
+
'advance.ambiguousTmpl': { key: 'flow.advance.ambiguousTmpl', zh: '', en: 'Multiple equivalent paths; refused. Specify --to step by step' },
|
|
125
|
+
'advance.noPathTmpl': { key: 'flow.advance.noPathTmpl', zh: '', en: 'Cannot reach {to} from {from}; reachable targets: {targets}' },
|
|
126
|
+
'advance.depthExceededTmpl': { key: 'flow.advance.depthExceededTmpl', zh: '', en: 'Path depth exceeds limit ({max}); refused' },
|
|
127
|
+
'advance.partialFailTmpl': { key: 'flow.advance.partialFailTmpl', zh: '', en: 'Completed up to {done}; failed at {failed}; remaining path: {remaining}' },
|
|
128
|
+
'advance.blockedByRevTmpl': { key: 'flow.advance.blockedByRevTmpl', zh: '', en: 'Blocking review entries found; stopped: {revs}; remaining path: {remaining}' },
|
|
129
|
+
'advance.alreadyAtTargetTmpl': { key: 'flow.advance.alreadyAtTargetTmpl', zh: '', en: 'Already at target: {stage} → {to} (no-op)' },
|
|
130
|
+
'advance.forceRevRefused': { key: 'flow.advance.forceRevRefused', zh: '', en: '[!] --force specified, but the REV safety check cannot be bypassed. Refusing to advance.' },
|
|
131
|
+
'advance.blockingRevRefused': { key: 'flow.advance.blockingRevRefused', zh: '', en: 'Error: cannot advance to done while blocking REVs remain unresolved.' },
|
|
132
|
+
'advance.blockingRevHint': { key: 'flow.advance.blockingRevHint', zh: '', en: "Resolve the REVs listed above, or mark them non-blocking via 'flow review resolve'." },
|
|
133
|
+
'advance.gitDirtyBoxTop': { key: 'flow.advance.gitDirtyBoxTop', zh: '', en: '[!] ╔════════════════════════════════════════╗' },
|
|
134
|
+
'advance.gitDirtyBoxMsg': { key: 'flow.advance.gitDirtyBoxMsg', zh: '', en: '[!] ║ ⚠ Git dirty: uncommitted changes ║' },
|
|
135
|
+
'advance.gitDirtyBoxHint': { key: 'flow.advance.gitDirtyBoxHint', zh: '', en: '[!] ║ Ensure the executor has committed ║' },
|
|
136
|
+
'advance.gitDirtyBoxBottom': { key: 'flow.advance.gitDirtyBoxBottom', zh: '', en: '[!] ╚════════════════════════════════════════╝' },
|
|
137
|
+
'advance.revBlockedTitleTmpl': { key: 'flow.advance.revBlockedTitleTmpl', zh: '', en: '[!] {n} unresolved blocking REV(s) detected:' },
|
|
138
|
+
'advance.revBlockedItemTmpl': { key: 'flow.advance.revBlockedItemTmpl', zh: '', en: ' {id}: {title} (priority={priority})' },
|
|
98
139
|
'attempt.errorInvalidResult': { key: 'flow.attempt.errorInvalidResult', zh: '', en: 'Error: --result must be pass or fail' },
|
|
99
140
|
'attempt.passTmpl': { key: 'flow.attempt.passTmpl', zh: '', en: '✓ {op} completed successfully' },
|
|
100
141
|
'attempt.failRetryTmpl': { key: 'flow.attempt.failRetryTmpl', zh: '', en: '⚠ {op} failed, will retry (retriable)' },
|
|
101
142
|
'attempt.failReplanTmpl': { key: 'flow.attempt.failReplanTmpl', zh: '', en: '✗ {op} retries exhausted, needs re-planning' },
|
|
102
143
|
'attempt.autoReplan': { key: 'flow.attempt.autoReplan', zh: '', en: '→ Auto reverted to scheme_pending, please re-plan' },
|
|
144
|
+
'attempt.currentOpTmpl': { key: 'flow.attempt.currentOpTmpl', zh: '', en: 'Current pointer: {stage}.{op}' },
|
|
145
|
+
'attempt.currentOpEmptyTmpl': { key: 'flow.attempt.currentOpEmptyTmpl', zh: '', en: 'Current pointer: {stage}. (no pending op)' },
|
|
146
|
+
'attempt.draftRefusedTmpl': { key: 'flow.attempt.draftRefusedTmpl', zh: '', en: '{opId} is a draft (unpublished); cannot record attempts. Run \'openfeel plan scheme publish {stage} {opId}\' first' },
|
|
147
|
+
'ops.title': { key: 'flow.ops.title', zh: '', en: 'Operations:' },
|
|
148
|
+
'ops.emptyWarningTmpl': { key: 'flow.ops.emptyWarningTmpl', zh: '', en: ' ⚠️ {opId} template not filled ("- [ ] 待补充" still present)' },
|
|
149
|
+
'ops.groupDraft': { key: 'flow.ops.groupDraft', zh: '', en: 'Unpublished (draft):' },
|
|
150
|
+
'ops.groupActive': { key: 'flow.ops.groupActive', zh: '', en: 'Published:' },
|
|
151
|
+
'manager.snapshotRestoreRefused': { key: 'flow.manager.snapshotRestoreRefused', zh: '', en: '[WARN] flow.json was modified by another process; refusing to restore from snapshot (reload and retry)' },
|
|
152
|
+
'manager.phaseAutoCorrectTmpl': { key: 'flow.manager.phaseAutoCorrectTmpl', zh: '', en: "[WARN] advanceStagePhase: phase '{phase}' auto-corrected to '{corrected}'" },
|
|
153
|
+
'manager.advancePhaseDeprecated': { key: 'flow.manager.advancePhaseDeprecated', zh: '', en: '[DEPRECATED] advancePhase() is deprecated; use advanceStagePhase(stageName, phase) instead' },
|
|
154
|
+
'manager.phaseAutoCorrectShortTmpl': { key: 'flow.manager.phaseAutoCorrectShortTmpl', zh: '', en: "[WARN] phase '{to}' auto-corrected to '{corrected}'" },
|
|
155
|
+
'manager.advancePhaseNoStageId': { key: 'flow.manager.advancePhaseNoStageId', zh: '', en: '[DEPRECATED] advancePhase: cannot parse stageId; skipped' },
|
|
156
|
+
'manager.autoFixPhaseGuardTmpl': { key: 'flow.manager.autoFixPhaseGuardTmpl', zh: '', en: '[WARN] addAutoFixReview is only allowed from review_failed; current stage {stage} phase is {phase}' },
|
|
103
157
|
'log.noInit': { key: 'flow.log.noInit', zh: '', en: 'Pipeline not initialized, no logs' },
|
|
104
158
|
'log.noLogs': { key: 'flow.log.noLogs', zh: '', en: 'No operation logs' },
|
|
105
159
|
'log.recentTitleTmpl': { key: 'flow.log.recentTitleTmpl', zh: '', en: 'Recent {n} operation logs' },
|
|
106
160
|
'log.detail': { key: 'flow.log.detail', zh: '', en: 'Details' },
|
|
161
|
+
'log.writeFailedTmpl': { key: 'flow.log.writeFailedTmpl', zh: '', en: '[WARN] Failed to write public log: {err}' },
|
|
162
|
+
'log.layoutNestedTag': { key: 'flow.log.layoutNestedTag', zh: '', en: '(nested)' },
|
|
163
|
+
'log.layoutLegacyTag': { key: 'flow.log.layoutLegacyTag', zh: '', en: '(legacy flat)' },
|
|
164
|
+
'log.legacyDirTmpl': { key: 'flow.log.legacyDirTmpl', zh: '', en: 'Legacy flat directory ({date}): no day_index.md' },
|
|
165
|
+
'log.legacyDirNoteTmpl': { key: 'flow.log.legacyDirNoteTmpl', zh: '', en: 'Legacy flat directory ({date})' },
|
|
107
166
|
'checkpoint.listTitle': { key: 'flow.checkpoint.listTitle', zh: '', en: 'Checkpoint Snapshots' },
|
|
108
167
|
'checkpoint.noSnapshots': { key: 'flow.checkpoint.noSnapshots', zh: '', en: '(No checkpoint snapshots yet)' },
|
|
109
168
|
'checkpoint.noSnapshotsStageTmpl': { key: 'flow.checkpoint.noSnapshotsStageTmpl', zh: '', en: '(No checkpoint snapshots for stage {stage})' },
|
|
@@ -113,6 +172,7 @@ export const flow = {
|
|
|
113
172
|
'checkpoint.restoreFailTmpl': { key: 'flow.checkpoint.restoreFailTmpl', zh: '', en: 'Error: Cannot restore from snapshot {file} (missing, invalid name, or bad content)' },
|
|
114
173
|
'review.errorStageNotFoundTmpl': { key: 'flow.review.errorStageNotFoundTmpl', zh: '', en: 'Error: Stage "{stage}" in opId "{opId}" not found in flow.json' },
|
|
115
174
|
'review.errorOpNotFoundTmpl': { key: 'flow.review.errorOpNotFoundTmpl', zh: '', en: 'Error: Op "{op}" in opId "{opId}" not found in stage "{stage}"' },
|
|
175
|
+
'review.errorInvalidPriorityTmpl': { key: 'flow.review.errorInvalidPriorityTmpl', zh: '', en: 'Error: Invalid priority "{priority}", options: high / medium / low' },
|
|
116
176
|
'review.labelBlocking': { key: 'flow.review.labelBlocking', zh: '', en: '[Blocking]' },
|
|
117
177
|
'review.labelNonBlocking': { key: 'flow.review.labelNonBlocking', zh: '', en: '[Non-blocking]' },
|
|
118
178
|
'review.addedAutoFixTmpl': { key: 'flow.review.addedAutoFixTmpl', zh: '', en: '✓ {label} [AUTO_FIX] Review entry added and auto-fixed: {revId}' },
|
|
@@ -121,6 +181,10 @@ export const flow = {
|
|
|
121
181
|
'review.addedTmpl': { key: 'flow.review.addedTmpl', zh: '', en: '✓ {label} Review entry added: {revId} ({op})' },
|
|
122
182
|
'review.resolvedTmpl': { key: 'flow.review.resolvedTmpl', zh: '', en: '✓ Review entry resolved: {revId}' },
|
|
123
183
|
'review.notFoundTmpl': { key: 'flow.review.notFoundTmpl', zh: '', en: 'Error: Review entry {revId} not found' },
|
|
184
|
+
'review.updateOkTmpl': { key: 'flow.review.updateOkTmpl', zh: '', en: 'Review entry updated: {revId}' },
|
|
185
|
+
'review.updateNoFieldTmpl': { key: 'flow.review.updateNoFieldTmpl', zh: '', en: 'No field provided to update (--priority/--title/--blocking)' },
|
|
186
|
+
'review.removeOkTmpl': { key: 'flow.review.removeOkTmpl', zh: '', en: 'Review entry removed: {revId} — {title}' },
|
|
187
|
+
'review.invalidBlockingTmpl': { key: 'flow.review.invalidBlockingTmpl', zh: '', en: 'Error: --blocking must be true or false (got "{value}")' },
|
|
124
188
|
'retry.errorNoData': { key: 'flow.retry.errorNoData', zh: '', en: 'Error: Unable to read pipeline data' },
|
|
125
189
|
'retry.errorStageNotFoundTmpl': { key: 'flow.retry.errorStageNotFoundTmpl', zh: '', en: 'Error: Stage {stage} not found' },
|
|
126
190
|
'retry.errorOpNotFoundTmpl': { key: 'flow.retry.errorOpNotFoundTmpl', zh: '', en: 'Error: Op {op} not found' },
|
|
@@ -136,6 +200,12 @@ export const flow = {
|
|
|
136
200
|
'repair.fixFailed': { key: 'flow.repair.fixFailed', zh: '', en: '✗ Some issues could not be auto-fixed, please check flow.json manually' },
|
|
137
201
|
'repair.migrationHint': { key: 'flow.repair.migrationHint', zh: '', en: '💡 Legacy flow.json format detected (global phase), consider running:' },
|
|
138
202
|
'repair.migrationPreview': { key: 'flow.repair.migrationPreview', zh: '', en: ' Preview migration: openfeel flow migrate --dry-run' },
|
|
203
|
+
'repair.orphansTitle': { key: 'flow.repair.orphansTitle', zh: '', en: 'Orphan op reconciliation:' },
|
|
204
|
+
'repair.orphanKeyTmpl': { key: 'flow.repair.orphanKeyTmpl', zh: '', en: ' Key orphans (registered, file missing): {items}' },
|
|
205
|
+
'repair.orphanFileTmpl': { key: 'flow.repair.orphanFileTmpl', zh: '', en: ' File orphans (file present, not registered): {items}' },
|
|
206
|
+
'repair.fileOrphanTitle': { key: 'flow.repair.fileOrphanTitle', zh: '', en: 'File orphans (file present, not registered):' },
|
|
207
|
+
'repair.fileOrphanNote': { key: 'flow.repair.fileOrphanNote', zh: '', en: 'No auto-cleanup by policy (prevents deleting historical sources); handle manually after review' },
|
|
208
|
+
'repair.pruneOkTmpl': { key: 'flow.repair.pruneOkTmpl', zh: '', en: 'Pruned {n} key orphans (files not deleted)' },
|
|
139
209
|
'migrate.alreadyNew': { key: 'flow.migrate.alreadyNew', zh: '', en: '✓ Already up-to-date format, no migration needed' },
|
|
140
210
|
'migrate.dryRunTitle': { key: 'flow.migrate.dryRunTitle', zh: '', en: '[DRY-RUN Mode] The following changes will be applied:' },
|
|
141
211
|
'migrate.dryRunNote': { key: 'flow.migrate.dryRunNote', zh: '', en: '(No files modified, run without --dry-run to apply migration)' },
|
|
@@ -146,6 +216,16 @@ export const flow = {
|
|
|
146
216
|
'health.pass': { key: 'flow.health.pass', zh: '', en: '🎉 Health check passed' },
|
|
147
217
|
'health.hasFailures': { key: 'flow.health.hasFailures', zh: '', en: '⚠️ There are failures, please check errors above' },
|
|
148
218
|
'health.quickMode': { key: 'flow.health.quickMode', zh: '', en: '(Quick mode: key checks only)' },
|
|
219
|
+
'health.orphanOps': { key: 'flow.health.orphanOps', zh: '', en: 'Orphan operations' },
|
|
220
|
+
'health.emptyTemplate': { key: 'flow.health.emptyTemplate', zh: '', en: 'Empty templates' },
|
|
221
|
+
'health.emptyTemplateDetail': { key: 'flow.health.emptyTemplateDetail', zh: '', en: '{n} operation template(s) not filled: {items}' },
|
|
222
|
+
'health.orphanOpsDetail': { key: 'flow.health.orphanOpsDetail', zh: '', en: '{n} key orphans, {m} file orphans; run `flow repair` for details (no auto-cleanup by policy)' },
|
|
223
|
+
'health.fixTitle': { key: 'flow.health.fixTitle', zh: '', en: 'Status reconciliation:' },
|
|
224
|
+
'health.fixItemTmpl': { key: 'flow.health.fixItemTmpl', zh: '', en: ' {stage}: {from} → {to} ({result})' },
|
|
225
|
+
'health.fixAppliedTmpl': { key: 'flow.health.fixAppliedTmpl', zh: '', en: 'Reconciled {n} stage status field(s)' },
|
|
226
|
+
'health.fixSkippedTmpl': { key: 'flow.health.fixSkippedTmpl', zh: '', en: 'Skipped {n} stage(s) (no "Status" field in status.md)' },
|
|
227
|
+
'health.fixDryRunNote': { key: 'flow.health.fixDryRunNote', zh: '', en: 'Preview only; nothing was written' },
|
|
228
|
+
'health.fixOnlyStatusNote': { key: 'flow.health.fixOnlyStatusNote', zh: '', en: 'Only the "Status" field is synced; execution mode / auto-advance / tasks are untouched' },
|
|
149
229
|
'recover.title': { key: 'flow.recover.title', zh: '', en: '═══ Cross-Session Context Recovery ═══' },
|
|
150
230
|
'recover.globalStatus': { key: 'flow.recover.globalStatus', zh: '', en: 'Global Status' },
|
|
151
231
|
'recover.phase': { key: 'flow.recover.phase', zh: '', en: 'Pipeline Phase' },
|
|
@@ -161,6 +241,7 @@ export const flow = {
|
|
|
161
241
|
'recover.statusFileMissing': { key: 'flow.recover.statusFileMissing', zh: '', en: 'status.md not found' },
|
|
162
242
|
'recover.statusNoCurrentStage': { key: 'flow.recover.statusNoCurrentStage', zh: '', en: 'No current stage' },
|
|
163
243
|
'wizard.done': { key: 'flow.wizard.done', zh: '', en: '🎉 Pipeline is complete!' },
|
|
244
|
+
'wizard.nonTtyHint': { key: 'flow.wizard.nonTtyHint', zh: '', en: "Non-interactive environment; use non-interactive commands such as 'flow advance'" },
|
|
164
245
|
'wizard.noStages': { key: 'flow.wizard.noStages', zh: '', en: 'No stages available.' },
|
|
165
246
|
'wizard.selectStage': { key: 'flow.wizard.selectStage', zh: '', en: 'Select stage to advance' },
|
|
166
247
|
'wizard.currentLabel': { key: 'flow.wizard.currentLabel', zh: '', en: '(current)' },
|
|
@@ -191,6 +272,7 @@ export const init = {
|
|
|
191
272
|
'initializingTmpl': { key: 'init.initializingTmpl', zh: '', en: 'Initializing OpenFeel workspace: {path}' },
|
|
192
273
|
'created': { key: 'init.created', zh: '', en: 'Created' },
|
|
193
274
|
'updated': { key: 'init.updated', zh: '', en: 'Updated' },
|
|
275
|
+
'skipped': { key: 'init.skipped', zh: '', en: 'Skipped' },
|
|
194
276
|
'alreadyUpToDate': { key: 'init.alreadyUpToDate', zh: '', en: 'Workspace is already up-to-date, no changes needed.' },
|
|
195
277
|
'complete': { key: 'init.complete', zh: '', en: '✓ OpenFeel workspace initialized' },
|
|
196
278
|
'demoCreating': { key: 'init.demoCreating', zh: '', en: '⚙ Creating demo project skeleton...' },
|
|
@@ -201,6 +283,7 @@ export const init = {
|
|
|
201
283
|
'prompt.bilingual': { key: 'init.prompt.bilingual', zh: '', en: 'Select Agent prompt language / 选择 Agent 提示词语言:' },
|
|
202
284
|
'agentLangTmpl': { key: 'init.agentLangTmpl', zh: '', en: 'Agent prompt language: {lang}' },
|
|
203
285
|
'invalidLangWarnTmpl': { key: 'init.invalidLangWarnTmpl', zh: '', en: 'Invalid --lang value "{lang}", falling back to interactive selection' },
|
|
286
|
+
'pkgBackupSkipTmpl': { key: 'init.pkgBackupSkipTmpl', zh: '', en: '[init] {err}; skipped package.json rewrite' },
|
|
204
287
|
// ensureGlobalConfig 非交互环境消息(REV-006)
|
|
205
288
|
'firstUse.nonInteractive': { key: 'init.firstUse.nonInteractive', zh: '', en: 'First time using OpenFeel: Non-interactive environment detected, global default language set to zh-CN.' },
|
|
206
289
|
'firstUse.changeHint': { key: 'init.firstUse.changeHint', zh: '', en: 'Use openfeel config set-lang <zh-CN|en> to change.' },
|
|
@@ -231,6 +314,10 @@ export const update = {
|
|
|
231
314
|
'appendedTitle': { key: 'update.appendedTitle', zh: '', en: 'Appended {n} file(s) (no control-region marker; managed content appended to the end, pending session-start review)' },
|
|
232
315
|
'appendedHint': { key: 'update.appendedHint', zh: '', en: 'See ~/.openfeel/update_infos.md; each entry will be checked and prompted for repair at session start.' },
|
|
233
316
|
'appendedManyWarning': { key: 'update.appendedManyWarning', zh: '', en: '⚠️ Appending {n} files at once — possible update_state corruption or first migration. Run openfeel update then check ~/.openfeel/update_infos.md.' },
|
|
317
|
+
'fileWriteSkipTmpl': { key: 'update.fileWriteSkipTmpl', zh: '', en: '[update] {err}; skipped writing this file' },
|
|
318
|
+
'legacyLayoutWarnTmpl': { key: 'update.legacyLayoutWarnTmpl', zh: '', en: '[update] Detected legacy in-project layout .opencode/{dirs}; run openfeel migrate (provided since stage-39) to migrate.' },
|
|
319
|
+
'globalJsoncParseSkipTmpl': { key: 'update.globalJsoncParseSkipTmpl', zh: '', en: '[update] Failed to parse global opencode.jsonc (may contain block comments); skipping merge and keeping the original file: {err}' },
|
|
320
|
+
'globalJsoncWriteSkipTmpl': { key: 'update.globalJsoncWriteSkipTmpl', zh: '', en: '[update] {err}; skipped global opencode.jsonc write, continuing with remaining steps' },
|
|
234
321
|
};
|
|
235
322
|
/* ==================== project ==================== */
|
|
236
323
|
export const project = {
|
|
@@ -283,8 +370,14 @@ export const stage = {
|
|
|
283
370
|
'status.hint': { key: 'stage.status.hint', zh: '', en: 'Use openfeel stage status <stageId> to view detailed status' },
|
|
284
371
|
'errorStageNotFoundTmpl': { key: 'stage.errorStageNotFoundTmpl', zh: '', en: 'Error: status.md not found for stage "{stageId}"' },
|
|
285
372
|
'errorCheckStageId': { key: 'stage.errorCheckStageId', zh: '', en: 'Please verify the stage ID is correct (e.g. v4-stage-04)' },
|
|
286
|
-
'set.errorFieldNotFoundTmpl': { key: 'stage.set.errorFieldNotFoundTmpl', zh: '', en: 'Error: "
|
|
287
|
-
'set.updatedTmpl': { key: 'stage.set.updatedTmpl', zh: '', en: '✓ Updated {stageId}
|
|
373
|
+
'set.errorFieldNotFoundTmpl': { key: 'stage.set.errorFieldNotFoundTmpl', zh: '', en: 'Error: "{field}" field not found in {stageId} status.md' },
|
|
374
|
+
'set.updatedTmpl': { key: 'stage.set.updatedTmpl', zh: '', en: '✓ Updated {stageId} {field}: → {value}' },
|
|
375
|
+
'set.noopTmpl': { key: 'stage.set.noopTmpl', zh: '', en: 'Field {field} already has the target value; no change made' },
|
|
376
|
+
'set.invalidValueTmpl': { key: 'stage.set.invalidValueTmpl', zh: '', en: 'Invalid value for {field}: {value} (allowed: {allowed})' },
|
|
377
|
+
'set.multiPartialTmpl': { key: 'stage.set.multiPartialTmpl', zh: '', en: 'Applied: {done}; failed at: {field}' },
|
|
378
|
+
'set.noOptionTmpl': { key: 'stage.set.noOptionTmpl', zh: '', en: 'Provide at least one field option (--status/--exec-mode/--auto-advance/--review-agent)' },
|
|
379
|
+
'set.depsOkTmpl': { key: 'stage.set.depsOkTmpl', zh: '', en: 'Updated deps for stage {stage}: {deps}' },
|
|
380
|
+
'set.depsDanglingTmpl': { key: 'stage.set.depsDanglingTmpl', zh: '', en: 'Invalid deps: stage(s) not found {deps}' },
|
|
288
381
|
'task.errorMutualExclusive': { key: 'stage.task.errorMutualExclusive', zh: '', en: 'Error: Must specify --done or --undone (mutually exclusive)' },
|
|
289
382
|
'task.errorInvalidTaskNo': { key: 'stage.task.errorInvalidTaskNo', zh: '', en: 'Error: Task number must be a positive integer' },
|
|
290
383
|
'task.errorTaskNotFoundTmpl': { key: 'stage.task.errorTaskNotFoundTmpl', zh: '', en: 'Error: Task {taskNo} not found in {stageId} status.md' },
|
|
@@ -294,15 +387,40 @@ export const stage = {
|
|
|
294
387
|
'task.taskItemTmpl': { key: 'stage.task.taskItemTmpl', zh: '', en: 'Task {number}: {desc}' },
|
|
295
388
|
'task.blockedByTmpl': { key: 'stage.task.blockedByTmpl', zh: '', en: 'Blocked by: {reason}' },
|
|
296
389
|
'task.actionLabelTmpl': { key: 'stage.task.actionLabelTmpl', zh: '', en: '{label} {stageId} Task {taskNo}' },
|
|
297
|
-
'
|
|
390
|
+
'task.addOkTmpl': { key: 'stage.task.addOkTmpl', zh: '', en: 'Task {no} appended: {desc}' },
|
|
391
|
+
'task.addUsageTmpl': { key: 'stage.task.addUsageTmpl', zh: '', en: 'Provide a task number or use --add "<description>"' },
|
|
392
|
+
'task.addMutualExclusiveTmpl': { key: 'stage.task.addMutualExclusiveTmpl', zh: '', en: 'Error: --add is mutually exclusive with --done/--undone' },
|
|
393
|
+
'task.sectionMissingTmpl': { key: 'stage.task.sectionMissingTmpl', zh: '', en: 'status.md has no task section; run "openfeel plan stage add" to create the skeleton first' },
|
|
298
394
|
'create.addedTmpl': { key: 'stage.create.addedTmpl', zh: '', en: '✓ Stage created: {stage} → plan_pending' },
|
|
395
|
+
'create.deprecated': { key: 'stage.create.deprecated', zh: '', en: '[deprecated] `openfeel stage create` is deprecated; use `openfeel flow stage add <stageId>` (register only) or `openfeel plan stage add <name>` (full entry)' },
|
|
299
396
|
};
|
|
300
397
|
/* ==================== plan ==================== */
|
|
301
398
|
export const plan = {
|
|
302
399
|
'stage.createdTmpl': { key: 'plan.stage.createdTmpl', zh: '', en: 'Stage created: {name}' },
|
|
400
|
+
'stage.invalidDepsTmpl': { key: 'plan.stage.invalidDepsTmpl', zh: '', en: 'Unknown dependency stage(s): {deps} (registered stages: {known})' },
|
|
303
401
|
'stage.empty': { key: 'plan.stage.empty', zh: '', en: 'No working stages yet' },
|
|
304
402
|
'scheme.createdTmpl': { key: 'plan.scheme.createdTmpl', zh: '', en: 'Op created: {opId} ({stage})' },
|
|
305
403
|
'scheme.empty': { key: 'plan.scheme.empty', zh: '', en: 'No ops yet' },
|
|
404
|
+
'scheme.remove.okTmpl': { key: 'plan.scheme.remove.okTmpl', zh: '', en: 'Scheme removed: {opId} (stage {stage})' },
|
|
405
|
+
'scheme.remove.dryRunTmpl': { key: 'plan.scheme.remove.dryRunTmpl', zh: '', en: 'Preview removing scheme: {opId} (stage {stage}) [DRY-RUN, not written]' },
|
|
406
|
+
'scheme.remove.orphanNote': { key: 'plan.scheme.remove.orphanNote', zh: '', en: 'This op was an orphan (no template file); its registry key has been removed' },
|
|
407
|
+
'scheme.remove.reasonDone': { key: 'plan.scheme.remove.reasonDone', zh: '', en: 'Refused: {opId} is done; use --force to remove anyway' },
|
|
408
|
+
'scheme.remove.reasonCheckpoint': { key: 'plan.scheme.remove.reasonCheckpoint', zh: '', en: 'Refused: {opId} has checkpoint progress; use --force to remove anyway' },
|
|
409
|
+
'scheme.remove.notFoundTmpl': { key: 'plan.scheme.remove.notFoundTmpl', zh: '', en: 'Not found: stage {stage} or scheme {opId}' },
|
|
410
|
+
'scheme.implicitRegisterTmpl': { key: 'plan.scheme.implicitRegisterTmpl', zh: '', en: 'Stage {stage} was not registered; stage skeleton created (overview.md / status.md)' },
|
|
411
|
+
'scheme.skeletonWarnTmpl': { key: 'plan.scheme.skeletonWarnTmpl', zh: '', en: 'Failed to create stage skeleton ({err}); skipped. Please create overview.md / status.md manually' },
|
|
412
|
+
'scheme.skipAutoRegisterTmpl': { key: 'plan.scheme.skipAutoRegisterTmpl', zh: '', en: '[WARN] {reason}; skipped flow.json auto-registration (op file created).' },
|
|
413
|
+
'scheme.dirConflictSkipTmpl': { key: 'plan.scheme.dirConflictSkipTmpl', zh: '', en: "[WARN] Stage '{stage}' and '{other}' map to the same (series, stageDir); skipped flow.json auto-registration (op file created); please check the stageId." },
|
|
414
|
+
'scheme.concurrentSkipTmpl': { key: 'plan.scheme.concurrentSkipTmpl', zh: '', en: '[WARN] op {opId} was created, but flow.json sync failed due to a concurrent conflict; run openfeel flow repair or re-register the op.' },
|
|
415
|
+
'scheme.publish.okTmpl': { key: 'plan.scheme.publish.okTmpl', zh: '', en: 'Published {opId} (draft → pending)' },
|
|
416
|
+
'scheme.publish.emptyTmpl': { key: 'plan.scheme.publish.emptyTmpl', zh: '', en: 'Template not filled; publish refused: {opId}' },
|
|
417
|
+
'scheme.publish.notDraftTmpl': { key: 'plan.scheme.publish.notDraftTmpl', zh: '', en: '{opId} is not in draft state' },
|
|
418
|
+
'scheme.publish.notFoundTmpl': { key: 'plan.scheme.publish.notFoundTmpl', zh: '', en: 'Not found: stage {stage} or scheme {opId}' },
|
|
419
|
+
'scheme.rename.okTmpl': { key: 'plan.scheme.rename.okTmpl', zh: '', en: 'Renamed {opId}: {from} → {to}' },
|
|
420
|
+
'scheme.rename.unchangedTmpl': { key: 'plan.scheme.rename.unchangedTmpl', zh: '', en: 'Title unchanged: {opId}' },
|
|
421
|
+
'scheme.rename.notFoundTmpl': { key: 'plan.scheme.rename.notFoundTmpl', zh: '', en: 'Not found: stage {stage} or scheme {opId}' },
|
|
422
|
+
'scheme.rename.fileMissingTmpl': { key: 'plan.scheme.rename.fileMissingTmpl', zh: '', en: 'Template file for {opId} not found ({path}); flow.json unchanged' },
|
|
423
|
+
'scheme.rename.emptyTitleTmpl': { key: 'plan.scheme.rename.emptyTitleTmpl', zh: '', en: 'Title must not be empty' },
|
|
306
424
|
};
|
|
307
425
|
/* ==================== knowledge ==================== */
|
|
308
426
|
export const knowledge = {
|
|
@@ -320,6 +438,14 @@ export const knowledge = {
|
|
|
320
438
|
'index.noCategories': { key: 'knowledge.index.noCategories', zh: '', en: '(No categories)' },
|
|
321
439
|
'index.recentUpdates': { key: 'knowledge.index.recentUpdates', zh: '', en: '=== Recent Updates ===' },
|
|
322
440
|
'index.noUpdates': { key: 'knowledge.index.noUpdates', zh: '', en: 'No updates yet.' },
|
|
441
|
+
'dedup.title': { key: 'knowledge.dedup.title', zh: '', en: 'Similar entry suggestions:' },
|
|
442
|
+
'dedup.itemTmpl': { key: 'knowledge.dedup.itemTmpl', zh: '', en: ' [{category}] {title} ({pct}% similar){flag}' },
|
|
443
|
+
'dedup.suggestFlag': { key: 'knowledge.dedup.suggestFlag', zh: '', en: '← consider merging/updating' },
|
|
444
|
+
'dedup.noneTmpl': { key: 'knowledge.dedup.noneTmpl', zh: '', en: 'No similar entries found (threshold {threshold})' },
|
|
445
|
+
'dedup.readOnlyNote': { key: 'knowledge.dedup.readOnlyNote', zh: '', en: 'This command only prints suggestions; it does not modify kb files' },
|
|
446
|
+
'dedup.invalidThresholdTmpl': { key: 'knowledge.dedup.invalidThresholdTmpl', zh: '', en: 'Invalid threshold: {value} (expected a number between 0 and 1)' },
|
|
447
|
+
'dedup.invalidCategoryTmpl': { key: 'knowledge.dedup.invalidCategoryTmpl', zh: '', en: 'Invalid category: {value} (allowed: {allowed})' },
|
|
448
|
+
'dedup.noContentTmpl': { key: 'knowledge.dedup.noContentTmpl', zh: '', en: 'No content provided: pass the content argument or use stdin' },
|
|
323
449
|
// knowledge list 表头列名
|
|
324
450
|
'list.colCategory': { key: 'knowledge.list.colCategory', zh: '', en: 'Category' },
|
|
325
451
|
'list.colTitle': { key: 'knowledge.list.colTitle', zh: '', en: 'Title' },
|
|
@@ -345,8 +471,6 @@ export const view = {
|
|
|
345
471
|
'list.empty': { key: 'view.list.empty', zh: '', en: 'No review entries' },
|
|
346
472
|
'list.filedBy': { key: 'view.list.filedBy', zh: '', en: 'Filed By' },
|
|
347
473
|
'list.filedAt': { key: 'view.list.filedAt', zh: '', en: 'Time' },
|
|
348
|
-
'add.errorInvalidPriorityTmpl': { key: 'view.add.errorInvalidPriorityTmpl', zh: '', en: 'Error: Invalid priority "{priority}", options: high / medium / low' },
|
|
349
|
-
'add.okTmpl': { key: 'view.add.okTmpl', zh: '', en: '✓ Review entry added: {id} ({op}) — {title}' },
|
|
350
474
|
'accept.okTmpl': { key: 'view.accept.okTmpl', zh: '', en: '✓ Review entry accepted: {id} → closed' },
|
|
351
475
|
'accept.errorNotFoundTmpl': { key: 'view.accept.errorNotFoundTmpl', zh: '', en: 'Error: Review entry {id} not found' },
|
|
352
476
|
};
|
|
@@ -370,10 +494,19 @@ export const lint = {
|
|
|
370
494
|
/* ==================== help ==================== */
|
|
371
495
|
export const help = {
|
|
372
496
|
'openfeel': { key: 'help.openfeel', zh: '', en: 'AI Agent development workflow governance CLI tool' },
|
|
497
|
+
'global.noColor': { key: 'help.global.noColor', zh: '', en: 'Disable colored output (also via NO_COLOR=1)' },
|
|
498
|
+
'global.encoding': { key: 'help.global.encoding', zh: '', en: 'Output encoding (utf8|gbk|auto; default auto: adapts to chcp on Windows non-TTY; --json is always UTF-8)' },
|
|
499
|
+
'global.logFile': { key: 'help.global.logFile', zh: '', en: 'Runtime log file path (default ~/.openfeel/cli/logs/openfeel-YYYY-MM-DD.log)' },
|
|
500
|
+
'global.noLog': { key: 'help.global.noLog', zh: '', en: 'Disable runtime log (also via OPENFEEL_LOG=0 / OPENFEEL_NO_LOG=1)' },
|
|
501
|
+
'global.debug': { key: 'help.global.debug', zh: '', en: 'Record debug-level logs (default: info/warn/error only)' },
|
|
373
502
|
'openfeel.version': { key: 'help.openfeel.version', zh: '', en: 'Output version number' },
|
|
374
503
|
'init': { key: 'help.init', zh: '', en: 'Initialize project workspace, create .openfeel/ directory structure and config files' },
|
|
375
504
|
'init.demo': { key: 'help.init.demo', zh: '', en: 'Create demo project skeleton (NumKit style)' },
|
|
376
505
|
'init.lang': { key: 'help.init.lang', zh: '', en: 'Agent prompt language (zh-CN or en), defaults to zh-CN in non-interactive mode' },
|
|
506
|
+
'init.workspaceOnly': { key: 'help.init.workspaceOnly', zh: '', en: 'Create the .openfeel/ workspace only (no global rules / platform adapter config: AGENTS.md/opencode.jsonc); used by Feel to auto-setup blank projects' },
|
|
507
|
+
'init.nonInteractive': { key: 'help.init.nonInteractive', zh: '', en: 'Non-interactive mode (used together with --workspace-only)' },
|
|
508
|
+
'setup': { key: 'help.setup', zh: '', en: 'Deploy global OpenFeel framework config (global AGENTS.md + agents + skills + platform adapter config: opencode.jsonc); does not create the project .openfeel/' },
|
|
509
|
+
'setup.lang': { key: 'help.setup.lang', zh: '', en: 'Agent prompt language (zh-CN or en), defaults to zh-CN' },
|
|
377
510
|
'update': { key: 'help.update', zh: '', en: 'Deploy OpenFeel adapter files to target project (interactive tool selection when no args)' },
|
|
378
511
|
'update.lang': { key: 'help.update.lang', zh: '', en: 'Agent prompt language (zh-CN or en)' },
|
|
379
512
|
'update.force': { key: 'help.update.force', zh: '', en: 'Skip AGENTS.md overwrite confirmation, force overwrite' },
|
|
@@ -381,20 +514,39 @@ export const help = {
|
|
|
381
514
|
'flow.status': { key: 'help.flow.status', zh: '', en: 'Show pipeline status summary' },
|
|
382
515
|
'flow.status.verbose': { key: 'help.flow.status.verbose', zh: '', en: 'Enhanced output: config cascade, recent changes, downstream agent readiness' },
|
|
383
516
|
'flow.status.lines': { key: 'help.flow.status.lines', zh: '', en: 'Number of recent status changes (default 5)' },
|
|
517
|
+
'flow.status.json': { key: 'help.flow.status.json', zh: '', en: 'Output as JSON (machine-readable, single JSON document)' },
|
|
384
518
|
'flow.overview': { key: 'help.flow.overview', zh: '', en: 'Full status visualization (openfeel flow overview backend)' },
|
|
519
|
+
'flow.overview.json': { key: 'help.flow.overview.json', zh: '', en: 'Output as JSON' },
|
|
385
520
|
'flow.current': { key: 'help.flow.current', zh: '', en: 'Show current stage and operation' },
|
|
521
|
+
'flow.current.json': { key: 'help.flow.current.json', zh: '', en: 'Output as JSON' },
|
|
386
522
|
'flow.metrics': { key: 'help.flow.metrics', zh: '', en: 'Show Agent performance metrics' },
|
|
523
|
+
'flow.metrics.json': { key: 'help.flow.metrics.json', zh: '', en: 'Output as JSON' },
|
|
524
|
+
'flow.phases': { key: 'help.flow.phases', zh: '', en: 'List all valid phases and transitions (self-describing)' },
|
|
525
|
+
'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)' },
|
|
387
526
|
'flow.stage': { key: 'help.flow.stage', zh: '', en: 'Stage management' },
|
|
388
|
-
'flow.stage.add': { key: 'help.flow.stage.add', zh: '', en: 'Add pipeline stage' },
|
|
527
|
+
'flow.stage.add': { key: 'help.flow.stage.add', zh: '', en: 'Add a pipeline stage (registers flow.json only; usually use `openfeel plan stage add`)' },
|
|
528
|
+
'flow.stage.add.argstageId': { key: 'help.flow.stage.add.argstageId', zh: '', en: 'Stage ID (e.g. v1.1.2-stage-41)' },
|
|
529
|
+
'flow.stage.remove': { key: 'help.flow.stage.remove', zh: '', en: 'Remove a pipeline stage (with safety checks; default only unregisters flow.json)' },
|
|
530
|
+
'flow.stage.remove.force': { key: 'help.flow.stage.remove.force', zh: '', en: 'Bypass safety checks (non-empty ops / current active stage / depended upon)' },
|
|
531
|
+
'flow.stage.remove.dryRun': { key: 'help.flow.stage.remove.dryRun', zh: '', en: 'Preview only, do not write' },
|
|
532
|
+
'flow.stage.remove.purge': { key: 'help.flow.stage.remove.purge', zh: '', en: 'Also delete plan/{series}/{stageDir}/ (non-TTY requires --force)' },
|
|
533
|
+
'flow.stage.set': { key: 'help.flow.stage.set', zh: '', en: 'Set stage dependencies (overwrite; no --deps means clear)' },
|
|
534
|
+
'flow.stage.set.argstageId': { key: 'help.flow.stage.set.argstageId', zh: '', en: 'Stage ID (e.g. stage-01 or v1.0.0-stage-01)' },
|
|
535
|
+
'flow.stage.set.deps': { key: 'help.flow.stage.set.deps', zh: '', en: 'Dependency stage IDs (space- or comma-separated; variadic, place at end of command)' },
|
|
389
536
|
'flow.advance': { key: 'help.flow.advance', zh: '', en: 'Advance pipeline stage' },
|
|
390
537
|
'flow.advance.op': { key: 'help.flow.advance.op', zh: '', en: 'Operation ID (e.g. stage-01.op-001), for logging/display only' },
|
|
391
|
-
'flow.advance.to': { key: 'help.flow.advance.to', zh: '', en: 'Target phase (e.g. exec_running)' },
|
|
538
|
+
'flow.advance.to': { key: 'help.flow.advance.to', zh: '', en: 'Target phase (e.g. exec_running). Valid phases & transitions: openfeel flow phases' },
|
|
392
539
|
'flow.advance.stage': { key: 'help.flow.advance.stage', zh: '', en: 'Stage ID (e.g. stage-03), required' },
|
|
393
540
|
'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)' },
|
|
394
541
|
'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' },
|
|
542
|
+
'flow.advance.quiet': { key: 'help.flow.advance.quiet', zh: '', en: 'Silence non-error output (no success confirmation or Git warning)' },
|
|
395
543
|
'flow.attempt': { key: 'help.flow.attempt', zh: '', en: 'Record operation execution result' },
|
|
396
544
|
'flow.attempt.op': { key: 'help.flow.attempt.op', zh: '', en: 'Operation ID (e.g. stage-01.op-001)' },
|
|
397
545
|
'flow.attempt.result': { key: 'help.flow.attempt.result', zh: '', en: 'Execution result (pass or fail)' },
|
|
546
|
+
'flow.ops': { key: 'help.flow.ops', zh: '', en: 'Operation scheme view' },
|
|
547
|
+
'flow.ops.list': { key: 'help.flow.ops.list', zh: '', en: 'List operations (state + template fill status)' },
|
|
548
|
+
'flow.ops.list.stage': { key: 'help.flow.ops.list.stage', zh: '', en: 'Limit to the given stage' },
|
|
549
|
+
'flow.ops.list.json': { key: 'help.flow.ops.list.json', zh: '', en: 'Output as JSON' },
|
|
398
550
|
'flow.log': { key: 'help.flow.log', zh: '', en: 'Show recent operation logs' },
|
|
399
551
|
'flow.log.last': { key: 'help.flow.log.last', zh: '', en: 'Show last n entries (default 10)' },
|
|
400
552
|
'flow.review': { key: 'help.flow.review', zh: '', en: 'Manage review entries' },
|
|
@@ -404,68 +556,122 @@ export const help = {
|
|
|
404
556
|
'flow.review.add.autoFix': { key: 'help.flow.review.add.autoFix', zh: '', en: 'Auto-fix detail, when set skips scheme_pending and advances directly to exec_running' },
|
|
405
557
|
'flow.review.add.blocking': { key: 'help.flow.review.add.blocking', zh: '', en: 'Whether to block pipeline (default true)' },
|
|
406
558
|
'flow.review.resolve': { key: 'help.flow.review.resolve', zh: '', en: 'Resolve review entry' },
|
|
559
|
+
'flow.review.resolve.argrev-id': { key: 'help.flow.review.resolve.argrev-id', zh: '', en: 'Review entry ID (e.g. REV-001)' },
|
|
560
|
+
'flow.review.update': { key: 'help.flow.review.update', zh: '', en: 'Update review entry fields (provide at least one option)' },
|
|
561
|
+
'flow.review.update.argrev-id': { key: 'help.flow.review.update.argrev-id', zh: '', en: 'Review entry ID (e.g. REV-001)' },
|
|
562
|
+
'flow.review.update.priority': { key: 'help.flow.review.update.priority', zh: '', en: 'Priority (high/medium/low)' },
|
|
563
|
+
'flow.review.update.title': { key: 'help.flow.review.update.title', zh: '', en: 'Review title' },
|
|
564
|
+
'flow.review.update.blocking': { key: 'help.flow.review.update.blocking', zh: '', en: 'Whether to block pipeline (true/false)' },
|
|
565
|
+
'flow.review.remove': { key: 'help.flow.review.remove', zh: '', en: 'Remove review entry (leaves audit log; prints removed title)' },
|
|
566
|
+
'flow.review.remove.argrev-id': { key: 'help.flow.review.remove.argrev-id', zh: '', en: 'Review entry ID (e.g. REV-001)' },
|
|
407
567
|
'flow.retry': { key: 'help.flow.retry', zh: '', en: 'Query operation retry status' },
|
|
408
568
|
'flow.retry.op': { key: 'help.flow.retry.op', zh: '', en: 'Operation ID (e.g. stage-01.op-001)' },
|
|
409
569
|
'flow.repair': { key: 'help.flow.repair', zh: '', en: 'Auto-detect and fix common issues in flow.json' },
|
|
410
570
|
'flow.repair.dryRun': { key: 'help.flow.repair.dryRun', zh: '', en: 'Detect only, do not fix' },
|
|
411
571
|
'flow.repair.backup': { key: 'help.flow.repair.backup', zh: '', en: 'Backup as .bak before repair' },
|
|
572
|
+
'flow.repair.pruneOrphans': { key: 'help.flow.repair.pruneOrphans', zh: '', en: 'Prune key orphans (flow.json op keys with no ops/ file; files are not deleted)' },
|
|
412
573
|
'flow.migrate': { key: 'help.flow.migrate', zh: '', en: 'Migrate legacy flow.json (v4.0 global phase) to new format (v4.1 stage-level phase)' },
|
|
413
574
|
'flow.migrate.dryRun': { key: 'help.flow.migrate.dryRun', zh: '', en: 'Preview only, do not write files' },
|
|
414
575
|
'flow.migrate.noBackup': { key: 'help.flow.migrate.noBackup', zh: '', en: 'Skip .bak file generation (default generates flow.json.v4.0.bak)' },
|
|
415
576
|
'flow.health': { key: 'help.flow.health', zh: '', en: 'Comprehensive health check: flow.json / cross-file consistency / zombie states / config.yaml etc.' },
|
|
416
577
|
'flow.health.quick': { key: 'help.flow.health.quick', zh: '', en: 'Key checks only (phase/current validity, skip other checks)' },
|
|
578
|
+
'flow.health.json': { key: 'help.flow.health.json', zh: '', en: 'Output as JSON' },
|
|
579
|
+
'flow.health.fix': { key: 'help.flow.health.fix', zh: '', en: 'Reconcile status.md "Status" field against flow.json (that field only)' },
|
|
580
|
+
'flow.health.dryRun': { key: 'help.flow.health.dryRun', zh: '', en: 'Preview only (combine with --fix); nothing is written' },
|
|
417
581
|
'flow.checkpoint': { key: 'help.flow.checkpoint', zh: '', en: 'Checkpoint snapshot management (auto-saves flow.json snapshots on phase advance)' },
|
|
418
582
|
'flow.checkpoint.list': { key: 'help.flow.checkpoint.list', zh: '', en: 'List all (or stage-filtered) checkpoint snapshots' },
|
|
583
|
+
'flow.checkpoint.list.argstage': { key: 'help.flow.checkpoint.list.argstage', zh: '', en: 'Stage ID (optional), e.g. v5.3-stage-01' },
|
|
419
584
|
'flow.checkpoint.restore': { key: 'help.flow.checkpoint.restore', zh: '', en: 'Restore flow.json from a checkpoint snapshot (overwrites current file, requires --force)' },
|
|
585
|
+
'flow.checkpoint.restore.argcheckpoint-file': { key: 'help.flow.checkpoint.restore.argcheckpoint-file', zh: '', en: 'Checkpoint file name (e.g. v5.3-stage-01-20260807T162300-exec_running.json)' },
|
|
420
586
|
'flow.checkpoint.restore.force': { key: 'help.flow.checkpoint.restore.force', zh: '', en: 'Confirm restore operation (overwrites current flow.json)' },
|
|
421
587
|
'flow.recover': { key: 'help.flow.recover', zh: '', en: 'Cross-session context recovery: pipeline status, blockers, and pending tasks' },
|
|
422
588
|
'flow.wizard': { key: 'help.flow.wizard', zh: '', en: 'Interactive pipeline wizard, advance stage by stage' },
|
|
423
589
|
'config.get-lang': { key: 'help.config.get-lang', zh: '', en: 'Show global default language' },
|
|
424
590
|
'config.set-lang': { key: 'help.config.set-lang', zh: '', en: 'Change global default language (zh-CN or en)' },
|
|
425
591
|
'config.list-projects': { key: 'help.config.list-projects', zh: '', en: 'List all recorded project path→language mappings' },
|
|
592
|
+
'config': { key: 'help.config', zh: '', en: 'View or modify project config' },
|
|
426
593
|
'config.get': { key: 'help.config.get', zh: '', en: 'Read a config value (project config; --global reads global profile)' },
|
|
427
594
|
'config.get.global': { key: 'help.config.get.global', zh: '', en: 'Operate on global profile (~/.config/openfeel/profile.yaml)' },
|
|
428
595
|
'config.set': { key: 'help.config.set', zh: '', en: 'Set a config value (project config; --global writes global profile)' },
|
|
429
596
|
'config.set.global': { key: 'help.config.set.global', zh: '', en: 'Operate on global profile (~/.config/openfeel/profile.yaml)' },
|
|
597
|
+
'config.effective': { key: 'help.config.effective', zh: '', en: 'Show effective config values and their source (status.md > config.yaml > profile.yaml > builtin)' },
|
|
430
598
|
'project': { key: 'help.project', zh: '', en: 'Project management and overview' },
|
|
431
599
|
'project.overview': { key: 'help.project.overview', zh: '', en: 'Scan project structure in real-time, output structured overview' },
|
|
432
600
|
'plan': { key: 'help.plan', zh: '', en: 'Plan management' },
|
|
433
601
|
'plan.stage': { key: 'help.plan.stage', zh: '', en: 'Work stage management' },
|
|
434
|
-
'plan.stage.add': { key: 'help.plan.stage.add', zh: '', en: 'Add work stage' },
|
|
602
|
+
'plan.stage.add': { key: 'help.plan.stage.add', zh: '', en: 'Add a work stage (full entry: creates dir + overview/status + registers flow.json)' },
|
|
603
|
+
'plan.stage.add.deps': { key: 'help.plan.stage.add.deps', zh: '', en: 'Dependency stage IDs (space- or comma-separated, e.g. --deps a b or --deps a,b)' },
|
|
604
|
+
'plan.stage.add.argname': { key: 'help.plan.stage.add.argname', zh: '', en: 'Stage ID (e.g. stage-01 or v1.0.0-stage-01)' },
|
|
605
|
+
'plan.stage.add.tasks': { key: 'help.plan.stage.add.tasks', zh: '', en: 'Initial task list (space- or comma-separated, written to status.md)' },
|
|
435
606
|
'plan.stage.list': { key: 'help.plan.stage.list', zh: '', en: 'List all work stages' },
|
|
436
607
|
'plan.scheme': { key: 'help.plan.scheme', zh: '', en: 'Operation scheme management' },
|
|
437
608
|
'plan.scheme.create': { key: 'help.plan.scheme.create', zh: '', en: 'Create operation scheme' },
|
|
609
|
+
'plan.scheme.create.argstage': { key: 'help.plan.scheme.create.argstage', zh: '', en: 'Stage ID (e.g. stage-01 or v1.0.0-stage-01)' },
|
|
610
|
+
'plan.scheme.create.argtitle': { key: 'help.plan.scheme.create.argtitle', zh: '', en: 'Scheme title' },
|
|
611
|
+
'plan.scheme.create.draft': { key: 'help.plan.scheme.create.draft', zh: '', en: 'Create as draft (unpublished); run plan scheme publish after filling it in' },
|
|
438
612
|
'plan.scheme.list': { key: 'help.plan.scheme.list', zh: '', en: 'List operation schemes (optionally filter by stage)' },
|
|
613
|
+
'plan.scheme.list.argstage': { key: 'help.plan.scheme.list.argstage', zh: '', en: 'Stage name (optional)' },
|
|
614
|
+
'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)' },
|
|
615
|
+
'plan.scheme.remove.force': { key: 'help.plan.scheme.remove.force', zh: '', en: 'Bypass protection (op done / has checkpoint progress)' },
|
|
616
|
+
'plan.scheme.remove.dryRun': { key: 'help.plan.scheme.remove.dryRun', zh: '', en: 'Preview only, do not write' },
|
|
617
|
+
'plan.scheme.remove.argstage': { key: 'help.plan.scheme.remove.argstage', zh: '', en: 'Stage ID (e.g. stage-01 or v1.0.0-stage-01)' },
|
|
618
|
+
'plan.scheme.remove.argopId': { key: 'help.plan.scheme.remove.argopId', zh: '', en: 'Scheme ID (e.g. op-001 or stage.op-001)' },
|
|
619
|
+
'plan.scheme.publish': { key: 'help.plan.scheme.publish', zh: '', en: 'Publish a draft scheme (draft → pending)' },
|
|
620
|
+
'plan.scheme.publish.argstage': { key: 'help.plan.scheme.publish.argstage', zh: '', en: 'Stage ID (e.g. stage-01 or v1.0.0-stage-01)' },
|
|
621
|
+
'plan.scheme.publish.argopId': { key: 'help.plan.scheme.publish.argopId', zh: '', en: 'Scheme ID (e.g. op-001 or stage.op-001)' },
|
|
622
|
+
'plan.scheme.rename': { key: 'help.plan.scheme.rename', zh: '', en: 'Rename a scheme' },
|
|
623
|
+
'plan.scheme.rename.title': { key: 'help.plan.scheme.rename.title', zh: '', en: 'New title (required)' },
|
|
624
|
+
'plan.scheme.rename.argstage': { key: 'help.plan.scheme.rename.argstage', zh: '', en: 'Stage ID (e.g. stage-01 or v1.0.0-stage-01)' },
|
|
625
|
+
'plan.scheme.rename.argopId': { key: 'help.plan.scheme.rename.argopId', zh: '', en: 'Scheme ID (e.g. op-001 or stage.op-001)' },
|
|
439
626
|
'stage': { key: 'help.stage', zh: '', en: 'Work stage status management (status.md atomic operations)' },
|
|
440
627
|
'stage.status': { key: 'help.stage.status', zh: '', en: 'View stage status (list all stages when no arg)' },
|
|
628
|
+
'stage.status.argstageId': { key: 'help.stage.status.argstageId', zh: '', en: 'Stage ID (e.g. v4-stage-04)' },
|
|
441
629
|
'stage.set': { key: 'help.stage.set', zh: '', en: 'Set stage status field (atomic update, preserve rest)' },
|
|
630
|
+
'stage.set.argstageId': { key: 'help.stage.set.argstageId', zh: '', en: 'Stage ID (e.g. v4-stage-04)' },
|
|
442
631
|
'stage.set.status': { key: 'help.stage.set.status', zh: '', en: 'Status value (e.g. exec_running)' },
|
|
443
|
-
'stage.
|
|
632
|
+
'stage.set.execMode': { key: 'help.stage.set.execMode', zh: '', en: 'Execution mode (manual | auto)' },
|
|
633
|
+
'stage.set.autoAdvance': { key: 'help.stage.set.autoAdvance', zh: '', en: 'Auto advance (enabled | disabled)' },
|
|
634
|
+
'stage.set.reviewAgent': { key: 'help.stage.set.reviewAgent', zh: '', en: 'Current responsible agent (e.g. openfeel-executor)' },
|
|
635
|
+
'stage.task': { key: 'help.stage.task', zh: '', en: 'Check/uncheck a task checkbox, or append a task' },
|
|
636
|
+
'stage.task.argstageId': { key: 'help.stage.task.argstageId', zh: '', en: 'Stage ID (e.g. v4-stage-04)' },
|
|
637
|
+
'stage.task.argtaskNo': { key: 'help.stage.task.argtaskNo', zh: '', en: 'Task number (e.g. 1)' },
|
|
638
|
+
'stage.task.add': { key: 'help.stage.task.add', zh: '', en: 'Append a task (mutually exclusive with --done/--undone)' },
|
|
444
639
|
'stage.task.done': { key: 'help.stage.task.done', zh: '', en: 'Mark task as done' },
|
|
445
640
|
'stage.task.undone': { key: 'help.stage.task.undone', zh: '', en: 'Mark task as not done' },
|
|
446
|
-
'stage.create': { key: 'help.stage.create', zh: '', en: 'Create a
|
|
641
|
+
'stage.create': { key: 'help.stage.create', zh: '', en: 'Create a stage (deprecated; use openfeel flow stage add)' },
|
|
642
|
+
'stage.create.argstageId': { key: 'help.stage.create.argstageId', zh: '', en: 'Stage ID (e.g. v1.0.0-stage-30)' },
|
|
447
643
|
'view': { key: 'help.view', zh: '', en: 'Review entry management' },
|
|
448
644
|
'view.list': { key: 'help.view.list', zh: '', en: 'List review entries' },
|
|
449
645
|
'view.list.op': { key: 'help.view.list.op', zh: '', en: 'Filter by operation ID' },
|
|
450
|
-
'view.
|
|
451
|
-
'view.add.op': { key: 'help.view.add.op', zh: '', en: 'Operation ID (e.g. stage-01.op-001)' },
|
|
452
|
-
'view.add.title': { key: 'help.view.add.title', zh: '', en: 'Review title' },
|
|
453
|
-
'view.add.priority': { key: 'help.view.add.priority', zh: '', en: 'Priority (high/medium/low, default medium)' },
|
|
646
|
+
'view.note': { key: 'help.view.note', zh: '', en: 'Use `openfeel flow review add|update|remove` to add/modify/remove review entries' },
|
|
454
647
|
'view.accept': { key: 'help.view.accept', zh: '', en: 'Accept review entry (mark as closed)' },
|
|
648
|
+
'view.accept.argrev-id': { key: 'help.view.accept.argrev-id', zh: '', en: 'Review entry ID (e.g. REV-001)' },
|
|
455
649
|
'knowledge': { key: 'help.knowledge', zh: '', en: 'Knowledge base management' },
|
|
456
650
|
'knowledge.list': { key: 'help.knowledge.list', zh: '', en: 'List knowledge entries' },
|
|
457
651
|
'knowledge.list.type': { key: 'help.knowledge.list.type', zh: '', en: 'Filter by category' },
|
|
458
652
|
'knowledge.add': { key: 'help.knowledge.add', zh: '', en: 'Add knowledge entry' },
|
|
653
|
+
'knowledge.add.argcategory': { key: 'help.knowledge.add.argcategory', zh: '', en: 'Category (architecture | patterns | troubleshooting | setup)' },
|
|
654
|
+
'knowledge.add.argtitle': { key: 'help.knowledge.add.argtitle', zh: '', en: 'Entry title' },
|
|
459
655
|
'knowledge.add.content': { key: 'help.knowledge.add.content', zh: '', en: 'Entry content (can also be piped via stdin)' },
|
|
460
656
|
'knowledge.search': { key: 'help.knowledge.search', zh: '', en: 'Search knowledge base' },
|
|
657
|
+
'knowledge.search.argquery': { key: 'help.knowledge.search.argquery', zh: '', en: 'Search query' },
|
|
461
658
|
'knowledge.search.limit': { key: 'help.knowledge.search.limit', zh: '', en: 'Max results (default 10)' },
|
|
462
659
|
'knowledge.search.offset': { key: 'help.knowledge.search.offset', zh: '', en: 'Result offset (default 0)' },
|
|
463
660
|
'knowledge.index': { key: 'help.knowledge.index', zh: '', en: 'Show knowledge base index overview' },
|
|
661
|
+
'knowledge.dedup': { key: 'help.knowledge.dedup', zh: '', en: 'Find similar knowledge entries (read-only suggestions; does not modify kb)' },
|
|
662
|
+
'knowledge.dedup.argcontent': { key: 'help.knowledge.dedup.argcontent', zh: '', en: 'Content to archive (read from stdin if omitted)' },
|
|
663
|
+
'knowledge.dedup.project': { key: 'help.knowledge.dedup.project', zh: '', en: 'Target project root (defaults to current directory)' },
|
|
664
|
+
'knowledge.dedup.category': { key: 'help.knowledge.dedup.category', zh: '', en: 'Check only the given category (architecture|patterns|troubleshooting|setup)' },
|
|
665
|
+
'knowledge.dedup.threshold': { key: 'help.knowledge.dedup.threshold', zh: '', en: 'Similarity threshold 0–1 (default 0.8)' },
|
|
464
666
|
'archive': { key: 'help.archive', zh: '', en: 'Archive stage (summarize output, generate summary, extract knowledge)' },
|
|
667
|
+
'archive.argstage': { key: 'help.archive.argstage', zh: '', en: 'Stage name (e.g. stage-06)' },
|
|
465
668
|
'roadmap': { key: 'help.roadmap', zh: '', en: 'Roadmap management' },
|
|
466
669
|
'roadmap.create': { key: 'help.roadmap.create', zh: '', en: 'Create roadmap (version number like 1.0, 2.0)' },
|
|
670
|
+
'roadmap.create.argversion': { key: 'help.roadmap.create.argversion', zh: '', en: 'Version number' },
|
|
467
671
|
'roadmap.show': { key: 'help.roadmap.show', zh: '', en: 'Show roadmap content (list all if no version)' },
|
|
672
|
+
'roadmap.show.argversion': { key: 'help.roadmap.show.argversion', zh: '', en: 'Version number (optional)' },
|
|
468
673
|
'instructions': { key: 'help.instructions', zh: '', en: 'Generate structured instructions (XML or JSON) for an artifact' },
|
|
674
|
+
'instructions.argartifactId': { key: 'help.instructions.argartifactId', zh: '', en: 'Target artifact ID (e.g. proposal, implementation)' },
|
|
469
675
|
'instructions.change': { key: 'help.instructions.change', zh: '', en: 'Change name (e.g. feat-login)' },
|
|
470
676
|
'instructions.json': { key: 'help.instructions.json', zh: '', en: 'Output JSON format instead of XML' },
|
|
471
677
|
'instructions.schema': { key: 'help.instructions.schema', zh: '', en: 'Schema name (default spec-driven)' },
|
|
@@ -478,6 +684,7 @@ export const help = {
|
|
|
478
684
|
'migrate.remapAssignee': { key: 'help.migrate.remapAssignee', zh: '', en: 'Rewrite legacy flow.json assignee to new names (report only by default)' },
|
|
479
685
|
'migrate.rollback': { key: 'help.migrate.rollback', zh: '', en: 'Roll back the most recent migration' },
|
|
480
686
|
'migrate.rollback.dryRun': { key: 'help.migrate.rollback.dryRun', zh: '', en: 'Preview rollback plan only' },
|
|
687
|
+
'migrate.cleanGlobalCoreMd': { key: 'help.migrate.cleanGlobalCoreMd', zh: '', en: 'Delete the deprecated global core.md (opencode adapter: ~/.config/opencode/openfeel/core.md)' },
|
|
481
688
|
// model (model configuration)
|
|
482
689
|
'model': { key: 'help.model', zh: '', en: 'Model configuration (three scopes: set/get/list)' },
|
|
483
690
|
'model.set': { key: 'help.model.set', zh: '', en: 'Set the model of a given agent' },
|
|
@@ -491,6 +698,10 @@ export const help = {
|
|
|
491
698
|
};
|
|
492
699
|
/* ==================== config ==================== */
|
|
493
700
|
export const config = {
|
|
701
|
+
'desc': { key: 'config.desc', zh: '', en: 'View or modify project config' },
|
|
702
|
+
'getLang.desc': { key: 'config.getLang.desc', zh: '', en: 'View CLI language setting' },
|
|
703
|
+
'get.parseErrorWarn': { key: 'config.get.parseErrorWarn', zh: '', en: 'Failed to parse config file, treated as empty: {path}' },
|
|
704
|
+
'effective.invalidValueSkipped': { key: 'config.effective.invalidValueSkipped', zh: '', en: 'Invalid config value for {key}, skipped: {reason}' },
|
|
494
705
|
'get.lang': { key: 'config.get.lang', zh: '', en: 'Global language: {lang}' },
|
|
495
706
|
'set.ok': { key: 'config.set.ok', zh: '', en: 'Global language set to: {lang}' },
|
|
496
707
|
'set.invalidLang': { key: 'config.set.invalidLang', zh: '', en: 'Invalid language "{val}". Supported: zh-CN and en' },
|
|
@@ -510,12 +721,18 @@ export const config = {
|
|
|
510
721
|
'set.globalInvalidValue': { key: 'config.set.globalInvalidValue', zh: '', en: 'Invalid value "{val}". {key} only supports: {values}' },
|
|
511
722
|
'set.globalValueOk': { key: 'config.set.globalValueOk', zh: '', en: '✓ Global config set: {key} = {value}' },
|
|
512
723
|
'set.globalAllowedKeys': { key: 'config.set.globalAllowedKeys', zh: '', en: 'Supported global config keys: {keys}' },
|
|
724
|
+
'effective.title': { key: 'config.effective.title', zh: '', en: 'Effective config values and sources' },
|
|
725
|
+
'effective.row': { key: 'config.effective.row', zh: '', en: '{key}: {value} [source: {source}]' },
|
|
726
|
+
'effective.unknownKey': { key: 'config.effective.unknownKey', zh: '', en: 'Unknown config key: {key} (managed keys: {keys})' },
|
|
727
|
+
'profile.parseErrorSkipTmpl': { key: 'config.profile.parseErrorSkipTmpl', zh: '', en: '[profile] {err}; skipped auto-fill write-back to protect the existing file' },
|
|
728
|
+
'profile.writeFailSkipTmpl': { key: 'config.profile.writeFailSkipTmpl', zh: '', en: '[profile] auto-fill write failed; skipped: {err}' },
|
|
513
729
|
};
|
|
514
730
|
/* ==================== migrate domain: legacy layout migration command ==================== */
|
|
515
731
|
export const migrate = {
|
|
516
732
|
// legacy layout general
|
|
517
733
|
'legacy.alreadyLatest': { key: 'migrate.legacy.alreadyLatest', zh: '', en: '✓ Already up-to-date layout, no migration needed' },
|
|
518
734
|
'legacy.done': { key: 'migrate.legacy.done', zh: '', en: 'Migration complete' },
|
|
735
|
+
'globalJsoncParseSkipTmpl': { key: 'migrate.globalJsoncParseSkipTmpl', zh: '', en: '[migrate] Failed to parse global opencode.jsonc (may contain block comments); skipping merge and keeping the original file: {err}' },
|
|
519
736
|
// detect report
|
|
520
737
|
'detect.title': { key: 'migrate.detect.title', zh: '', en: 'Legacy layout detection report:' },
|
|
521
738
|
'detect.dryRunTitle': { key: 'migrate.detect.dryRunTitle', zh: '', en: '[DRY-RUN Mode] The following migration plan will be applied (not written):' },
|
|
@@ -531,9 +748,14 @@ export const migrate = {
|
|
|
531
748
|
'rollback.dryRunTitle': { key: 'migrate.rollback.dryRunTitle', zh: '', en: '[DRY-RUN Mode] Rollback will restore the following files (not written):' },
|
|
532
749
|
'rollback.done': { key: 'migrate.rollback.done', zh: '', en: '✓ Rollback complete, restored:' },
|
|
533
750
|
'rollback.failed': { key: 'migrate.rollback.failed', zh: '', en: '✗ Rollback failed: {message}' },
|
|
751
|
+
'rollback.wrongDir': { key: 'migrate.rollback.wrongDir', zh: '', en: "Not a project root (no migration marker found); run 'migrate rollback' in the project root" },
|
|
534
752
|
// error
|
|
535
753
|
'error.pathNotExist': { key: 'migrate.error.pathNotExist', zh: '', en: 'Path does not exist: {path}' },
|
|
536
754
|
'error.aborted': { key: 'migrate.error.aborted', zh: '', en: 'Migration aborted; run `openfeel migrate rollback` to roll back: {message}' },
|
|
755
|
+
// deprecated (v1.1.1 compatibility transition)
|
|
756
|
+
'deprecated.globalCoreMd': { key: 'migrate.deprecated.globalCoreMd', zh: '', en: '? Detected deprecated global core.md (opencode adapter: ~/.config/opencode/openfeel/core.md); its constraints are now merged into the global AGENTS.md' },
|
|
757
|
+
'deprecated.globalCoreMdHint': { key: 'migrate.deprecated.globalCoreMdHint', zh: '', en: 'Run openfeel migrate --clean-global-core-md to delete, or remove it manually' },
|
|
758
|
+
'deprecated.projectAgentsMd': { key: 'migrate.deprecated.projectAgentsMd', zh: '', en: 'i Detected project AGENTS.md (legacy project constraints, now consolidated into the global rules file (opencode adapter: ~/.config/opencode/AGENTS.md)); keep or remove manually' },
|
|
537
759
|
};
|
|
538
760
|
/* ==================== model domain: model configuration (stage-40) ==================== */
|
|
539
761
|
export const model = {
|
|
@@ -549,8 +771,8 @@ export const model = {
|
|
|
549
771
|
// get
|
|
550
772
|
'get.effective': { key: 'model.get.effective', zh: '', en: 'Effective model: {value}' },
|
|
551
773
|
'get.byScope': { key: 'model.get.byScope', zh: '', en: ' {scope}: {value}' },
|
|
552
|
-
'get.none': { key: 'model.get.none', zh: '', en: '(not explicitly set, using
|
|
553
|
-
'get.inconsistent': { key: 'model.get.inconsistent', zh: '', en: '⚠ default layer multi-source mismatch (frontmatter differs from
|
|
774
|
+
'get.none': { key: 'model.get.none', zh: '', en: '(not explicitly set, using platform default; current adapter: opencode)' },
|
|
775
|
+
'get.inconsistent': { key: 'model.get.inconsistent', zh: '', en: '⚠ default layer multi-source mismatch (frontmatter differs from the adapter default config value); frontmatter takes precedence' },
|
|
554
776
|
'get.shadowed': { key: 'model.get.shadowed', zh: '', en: '⚠ project/global setting is shadowed by the framework default frontmatter (default takes precedence); use --scope default to change the effective value' },
|
|
555
777
|
'get.failed': { key: 'model.get.failed', zh: '', en: '✗ Read failed: {message}' },
|
|
556
778
|
// list
|
|
@@ -558,6 +780,34 @@ export const model = {
|
|
|
558
780
|
// error
|
|
559
781
|
'error.scope': { key: 'model.error.scope', zh: '', en: '✗ {message}' },
|
|
560
782
|
};
|
|
783
|
+
/* ==================== setup domain: global deployment (v1.1.1) ==================== */
|
|
784
|
+
export const setup = {
|
|
785
|
+
'created': { key: 'setup.created', zh: '', en: 'Created global files:' },
|
|
786
|
+
'globalJsoncParseSkipTmpl': { key: 'setup.globalJsoncParseSkipTmpl', zh: '', en: '[setup] Failed to parse global adapter config (opencode.jsonc); skipping merge and keeping the original file: {err}' },
|
|
787
|
+
'globalJsoncWriteSkipTmpl': { key: 'setup.globalJsoncWriteSkipTmpl', zh: '', en: '[setup] {err}; skipped global opencode.jsonc write, continuing with remaining steps' },
|
|
788
|
+
'updated': { key: 'setup.updated', zh: '', en: 'Updated global files:' },
|
|
789
|
+
'appended': { key: 'setup.appended', zh: '', en: 'Global files needing manual confirmation (already exist and are unmanaged; not overwritten):' },
|
|
790
|
+
'complete': { key: 'setup.complete', zh: '', en: '? Global OpenFeel framework config deployed' },
|
|
791
|
+
};
|
|
792
|
+
/* ==================== metrics domain: agent performance summary (T15) ==================== */
|
|
793
|
+
export const metrics = {
|
|
794
|
+
'summary.noData': { key: 'metrics.summary.noData', zh: '', en: 'No agent metrics data yet.' },
|
|
795
|
+
'summary.title': { key: 'metrics.summary.title', zh: '', en: 'Agent Metrics Summary' },
|
|
796
|
+
'summary.totalRuns': { key: 'metrics.summary.totalRuns', zh: '', en: ' Total runs: {n}' },
|
|
797
|
+
'summary.successFail': { key: 'metrics.summary.successFail', zh: '', en: ' Success / Failure: {ok} / {fail}' },
|
|
798
|
+
'summary.successRate': { key: 'metrics.summary.successRate', zh: '', en: ' Success rate: {rate}' },
|
|
799
|
+
'summary.totalRetries': { key: 'metrics.summary.totalRetries', zh: '', en: ' Total retries: {n}' },
|
|
800
|
+
'summary.totalDuration': { key: 'metrics.summary.totalDuration', zh: '', en: ' Total duration: {n}ms' },
|
|
801
|
+
'summary.avgDuration': { key: 'metrics.summary.avgDuration', zh: '', en: ' Avg duration: {n}ms' },
|
|
802
|
+
};
|
|
803
|
+
/* ==================== repl domain: interactive mode (T40) ==================== */
|
|
804
|
+
export const repl = {
|
|
805
|
+
'prompt': { key: 'repl.prompt', zh: '', en: 'openfeel> ' },
|
|
806
|
+
'welcome': { key: 'repl.welcome', zh: '', en: 'OpenFeel REPL interactive mode (type exit to quit, help for commands)' },
|
|
807
|
+
'bye': { key: 'repl.bye', zh: '', en: 'Bye!' },
|
|
808
|
+
'helpTitle': { key: 'repl.helpTitle', zh: '', en: 'Available commands:' },
|
|
809
|
+
'errorPrefix': { key: 'repl.errorPrefix', zh: '', en: 'Error: ' },
|
|
810
|
+
};
|
|
561
811
|
/* ==================== 聚合导出 ==================== */
|
|
562
812
|
export const allDomains = [
|
|
563
813
|
{ name: 'common', domain: common },
|
|
@@ -577,5 +827,8 @@ export const allDomains = [
|
|
|
577
827
|
{ name: 'config', domain: config },
|
|
578
828
|
{ name: 'migrate', domain: migrate },
|
|
579
829
|
{ name: 'model', domain: model },
|
|
830
|
+
{ name: 'setup', domain: setup },
|
|
831
|
+
{ name: 'metrics', domain: metrics },
|
|
832
|
+
{ name: 'repl', domain: repl },
|
|
580
833
|
];
|
|
581
834
|
//# sourceMappingURL=en.js.map
|