openfeel 1.1.1 → 1.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +41 -11
- package/README.md +8 -3
- package/README.zh-CN.md +42 -12
- 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 +59 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output-encoding.d.ts +32 -0
- package/dist/cli/output-encoding.d.ts.map +1 -0
- package/dist/cli/output-encoding.js +120 -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.map +1 -1
- package/dist/commands/init.js +56 -42
- 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 +6 -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 +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +8 -2
- package/dist/commands/setup.js.map +1 -1
- 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/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 +16 -7
- package/dist/core/global-paths.d.ts.map +1 -1
- package/dist/core/global-paths.js +23 -8
- package/dist/core/global-paths.js.map +1 -1
- package/dist/core/i18n-data/en.d.ts +2 -0
- package/dist/core/i18n-data/en.d.ts.map +1 -1
- package/dist/core/i18n-data/en.js +259 -23
- package/dist/core/i18n-data/en.js.map +1 -1
- package/dist/core/i18n-data/zh-CN.d.ts +2 -0
- package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
- package/dist/core/i18n-data/zh-CN.js +265 -23
- 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 +4 -2
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +38 -13
- 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.map +1 -1
- package/dist/core/migrate.js +53 -19
- 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 +6 -5
- 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.map +1 -1
- package/dist/core/setup.js +47 -19
- package/dist/core/setup.js.map +1 -1
- package/dist/core/template-loader.d.ts.map +1 -1
- package/dist/core/template-loader.js +672 -288
- package/dist/core/template-loader.js.map +1 -1
- package/dist/core/templates.d.ts +2 -2
- package/dist/core/templates.d.ts.map +1 -1
- package/dist/core/templates.js +13 -9
- 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 -1
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +253 -61
- 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,13 +494,18 @@ 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: passes through UTF-8 on Windows non-TTY; GBK requires explicit --encoding gbk/OPENFEEL_ENCODING; --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' },
|
|
377
|
-
'init.workspaceOnly': { key: 'help.init.workspaceOnly', zh: '', en: 'Create the .openfeel/ workspace only (no AGENTS.md/opencode.jsonc); used by Feel to auto-setup blank projects' },
|
|
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' },
|
|
378
507
|
'init.nonInteractive': { key: 'help.init.nonInteractive', zh: '', en: 'Non-interactive mode (used together with --workspace-only)' },
|
|
379
|
-
'setup': { key: 'help.setup', zh: '', en: 'Deploy global OpenFeel framework config (global AGENTS.md + agents + skills + opencode.jsonc); does not create the project .openfeel/' },
|
|
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/' },
|
|
380
509
|
'setup.lang': { key: 'help.setup.lang', zh: '', en: 'Agent prompt language (zh-CN or en), defaults to zh-CN' },
|
|
381
510
|
'update': { key: 'help.update', zh: '', en: 'Deploy OpenFeel adapter files to target project (interactive tool selection when no args)' },
|
|
382
511
|
'update.lang': { key: 'help.update.lang', zh: '', en: 'Agent prompt language (zh-CN or en)' },
|
|
@@ -385,20 +514,39 @@ export const help = {
|
|
|
385
514
|
'flow.status': { key: 'help.flow.status', zh: '', en: 'Show pipeline status summary' },
|
|
386
515
|
'flow.status.verbose': { key: 'help.flow.status.verbose', zh: '', en: 'Enhanced output: config cascade, recent changes, downstream agent readiness' },
|
|
387
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)' },
|
|
388
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' },
|
|
389
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' },
|
|
390
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)' },
|
|
391
526
|
'flow.stage': { key: 'help.flow.stage', zh: '', en: 'Stage management' },
|
|
392
|
-
'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)' },
|
|
393
536
|
'flow.advance': { key: 'help.flow.advance', zh: '', en: 'Advance pipeline stage' },
|
|
394
537
|
'flow.advance.op': { key: 'help.flow.advance.op', zh: '', en: 'Operation ID (e.g. stage-01.op-001), for logging/display only' },
|
|
395
|
-
'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' },
|
|
396
539
|
'flow.advance.stage': { key: 'help.flow.advance.stage', zh: '', en: 'Stage ID (e.g. stage-03), required' },
|
|
397
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)' },
|
|
398
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)' },
|
|
399
543
|
'flow.attempt': { key: 'help.flow.attempt', zh: '', en: 'Record operation execution result' },
|
|
400
544
|
'flow.attempt.op': { key: 'help.flow.attempt.op', zh: '', en: 'Operation ID (e.g. stage-01.op-001)' },
|
|
401
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' },
|
|
402
550
|
'flow.log': { key: 'help.flow.log', zh: '', en: 'Show recent operation logs' },
|
|
403
551
|
'flow.log.last': { key: 'help.flow.log.last', zh: '', en: 'Show last n entries (default 10)' },
|
|
404
552
|
'flow.review': { key: 'help.flow.review', zh: '', en: 'Manage review entries' },
|
|
@@ -408,68 +556,122 @@ export const help = {
|
|
|
408
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' },
|
|
409
557
|
'flow.review.add.blocking': { key: 'help.flow.review.add.blocking', zh: '', en: 'Whether to block pipeline (default true)' },
|
|
410
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)' },
|
|
411
567
|
'flow.retry': { key: 'help.flow.retry', zh: '', en: 'Query operation retry status' },
|
|
412
568
|
'flow.retry.op': { key: 'help.flow.retry.op', zh: '', en: 'Operation ID (e.g. stage-01.op-001)' },
|
|
413
569
|
'flow.repair': { key: 'help.flow.repair', zh: '', en: 'Auto-detect and fix common issues in flow.json' },
|
|
414
570
|
'flow.repair.dryRun': { key: 'help.flow.repair.dryRun', zh: '', en: 'Detect only, do not fix' },
|
|
415
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)' },
|
|
416
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)' },
|
|
417
574
|
'flow.migrate.dryRun': { key: 'help.flow.migrate.dryRun', zh: '', en: 'Preview only, do not write files' },
|
|
418
575
|
'flow.migrate.noBackup': { key: 'help.flow.migrate.noBackup', zh: '', en: 'Skip .bak file generation (default generates flow.json.v4.0.bak)' },
|
|
419
576
|
'flow.health': { key: 'help.flow.health', zh: '', en: 'Comprehensive health check: flow.json / cross-file consistency / zombie states / config.yaml etc.' },
|
|
420
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' },
|
|
421
581
|
'flow.checkpoint': { key: 'help.flow.checkpoint', zh: '', en: 'Checkpoint snapshot management (auto-saves flow.json snapshots on phase advance)' },
|
|
422
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' },
|
|
423
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)' },
|
|
424
586
|
'flow.checkpoint.restore.force': { key: 'help.flow.checkpoint.restore.force', zh: '', en: 'Confirm restore operation (overwrites current flow.json)' },
|
|
425
587
|
'flow.recover': { key: 'help.flow.recover', zh: '', en: 'Cross-session context recovery: pipeline status, blockers, and pending tasks' },
|
|
426
588
|
'flow.wizard': { key: 'help.flow.wizard', zh: '', en: 'Interactive pipeline wizard, advance stage by stage' },
|
|
427
589
|
'config.get-lang': { key: 'help.config.get-lang', zh: '', en: 'Show global default language' },
|
|
428
590
|
'config.set-lang': { key: 'help.config.set-lang', zh: '', en: 'Change global default language (zh-CN or en)' },
|
|
429
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' },
|
|
430
593
|
'config.get': { key: 'help.config.get', zh: '', en: 'Read a config value (project config; --global reads global profile)' },
|
|
431
594
|
'config.get.global': { key: 'help.config.get.global', zh: '', en: 'Operate on global profile (~/.config/openfeel/profile.yaml)' },
|
|
432
595
|
'config.set': { key: 'help.config.set', zh: '', en: 'Set a config value (project config; --global writes global profile)' },
|
|
433
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)' },
|
|
434
598
|
'project': { key: 'help.project', zh: '', en: 'Project management and overview' },
|
|
435
599
|
'project.overview': { key: 'help.project.overview', zh: '', en: 'Scan project structure in real-time, output structured overview' },
|
|
436
600
|
'plan': { key: 'help.plan', zh: '', en: 'Plan management' },
|
|
437
601
|
'plan.stage': { key: 'help.plan.stage', zh: '', en: 'Work stage management' },
|
|
438
|
-
'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)' },
|
|
439
606
|
'plan.stage.list': { key: 'help.plan.stage.list', zh: '', en: 'List all work stages' },
|
|
440
607
|
'plan.scheme': { key: 'help.plan.scheme', zh: '', en: 'Operation scheme management' },
|
|
441
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' },
|
|
442
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)' },
|
|
443
626
|
'stage': { key: 'help.stage', zh: '', en: 'Work stage status management (status.md atomic operations)' },
|
|
444
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)' },
|
|
445
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)' },
|
|
446
631
|
'stage.set.status': { key: 'help.stage.set.status', zh: '', en: 'Status value (e.g. exec_running)' },
|
|
447
|
-
'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)' },
|
|
448
639
|
'stage.task.done': { key: 'help.stage.task.done', zh: '', en: 'Mark task as done' },
|
|
449
640
|
'stage.task.undone': { key: 'help.stage.task.undone', zh: '', en: 'Mark task as not done' },
|
|
450
|
-
'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)' },
|
|
451
643
|
'view': { key: 'help.view', zh: '', en: 'Review entry management' },
|
|
452
644
|
'view.list': { key: 'help.view.list', zh: '', en: 'List review entries' },
|
|
453
645
|
'view.list.op': { key: 'help.view.list.op', zh: '', en: 'Filter by operation ID' },
|
|
454
|
-
'view.
|
|
455
|
-
'view.add.op': { key: 'help.view.add.op', zh: '', en: 'Operation ID (e.g. stage-01.op-001)' },
|
|
456
|
-
'view.add.title': { key: 'help.view.add.title', zh: '', en: 'Review title' },
|
|
457
|
-
'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' },
|
|
458
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)' },
|
|
459
649
|
'knowledge': { key: 'help.knowledge', zh: '', en: 'Knowledge base management' },
|
|
460
650
|
'knowledge.list': { key: 'help.knowledge.list', zh: '', en: 'List knowledge entries' },
|
|
461
651
|
'knowledge.list.type': { key: 'help.knowledge.list.type', zh: '', en: 'Filter by category' },
|
|
462
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' },
|
|
463
655
|
'knowledge.add.content': { key: 'help.knowledge.add.content', zh: '', en: 'Entry content (can also be piped via stdin)' },
|
|
464
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' },
|
|
465
658
|
'knowledge.search.limit': { key: 'help.knowledge.search.limit', zh: '', en: 'Max results (default 10)' },
|
|
466
659
|
'knowledge.search.offset': { key: 'help.knowledge.search.offset', zh: '', en: 'Result offset (default 0)' },
|
|
467
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)' },
|
|
468
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)' },
|
|
469
668
|
'roadmap': { key: 'help.roadmap', zh: '', en: 'Roadmap management' },
|
|
470
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' },
|
|
471
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)' },
|
|
472
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)' },
|
|
473
675
|
'instructions.change': { key: 'help.instructions.change', zh: '', en: 'Change name (e.g. feat-login)' },
|
|
474
676
|
'instructions.json': { key: 'help.instructions.json', zh: '', en: 'Output JSON format instead of XML' },
|
|
475
677
|
'instructions.schema': { key: 'help.instructions.schema', zh: '', en: 'Schema name (default spec-driven)' },
|
|
@@ -482,7 +684,7 @@ export const help = {
|
|
|
482
684
|
'migrate.remapAssignee': { key: 'help.migrate.remapAssignee', zh: '', en: 'Rewrite legacy flow.json assignee to new names (report only by default)' },
|
|
483
685
|
'migrate.rollback': { key: 'help.migrate.rollback', zh: '', en: 'Roll back the most recent migration' },
|
|
484
686
|
'migrate.rollback.dryRun': { key: 'help.migrate.rollback.dryRun', zh: '', en: 'Preview rollback plan only' },
|
|
485
|
-
'migrate.cleanGlobalCoreMd': { key: 'help.migrate.cleanGlobalCoreMd', zh: '', en: 'Delete the deprecated global core.md (~/.config/opencode/openfeel/core.md)' },
|
|
687
|
+
'migrate.cleanGlobalCoreMd': { key: 'help.migrate.cleanGlobalCoreMd', zh: '', en: 'Delete the deprecated global core.md (opencode adapter: ~/.config/opencode/openfeel/core.md)' },
|
|
486
688
|
// model (model configuration)
|
|
487
689
|
'model': { key: 'help.model', zh: '', en: 'Model configuration (three scopes: set/get/list)' },
|
|
488
690
|
'model.set': { key: 'help.model.set', zh: '', en: 'Set the model of a given agent' },
|
|
@@ -496,6 +698,10 @@ export const help = {
|
|
|
496
698
|
};
|
|
497
699
|
/* ==================== config ==================== */
|
|
498
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}' },
|
|
499
705
|
'get.lang': { key: 'config.get.lang', zh: '', en: 'Global language: {lang}' },
|
|
500
706
|
'set.ok': { key: 'config.set.ok', zh: '', en: 'Global language set to: {lang}' },
|
|
501
707
|
'set.invalidLang': { key: 'config.set.invalidLang', zh: '', en: 'Invalid language "{val}". Supported: zh-CN and en' },
|
|
@@ -515,12 +721,18 @@ export const config = {
|
|
|
515
721
|
'set.globalInvalidValue': { key: 'config.set.globalInvalidValue', zh: '', en: 'Invalid value "{val}". {key} only supports: {values}' },
|
|
516
722
|
'set.globalValueOk': { key: 'config.set.globalValueOk', zh: '', en: '✓ Global config set: {key} = {value}' },
|
|
517
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}' },
|
|
518
729
|
};
|
|
519
730
|
/* ==================== migrate domain: legacy layout migration command ==================== */
|
|
520
731
|
export const migrate = {
|
|
521
732
|
// legacy layout general
|
|
522
733
|
'legacy.alreadyLatest': { key: 'migrate.legacy.alreadyLatest', zh: '', en: '✓ Already up-to-date layout, no migration needed' },
|
|
523
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}' },
|
|
524
736
|
// detect report
|
|
525
737
|
'detect.title': { key: 'migrate.detect.title', zh: '', en: 'Legacy layout detection report:' },
|
|
526
738
|
'detect.dryRunTitle': { key: 'migrate.detect.dryRunTitle', zh: '', en: '[DRY-RUN Mode] The following migration plan will be applied (not written):' },
|
|
@@ -536,13 +748,14 @@ export const migrate = {
|
|
|
536
748
|
'rollback.dryRunTitle': { key: 'migrate.rollback.dryRunTitle', zh: '', en: '[DRY-RUN Mode] Rollback will restore the following files (not written):' },
|
|
537
749
|
'rollback.done': { key: 'migrate.rollback.done', zh: '', en: '✓ Rollback complete, restored:' },
|
|
538
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" },
|
|
539
752
|
// error
|
|
540
753
|
'error.pathNotExist': { key: 'migrate.error.pathNotExist', zh: '', en: 'Path does not exist: {path}' },
|
|
541
754
|
'error.aborted': { key: 'migrate.error.aborted', zh: '', en: 'Migration aborted; run `openfeel migrate rollback` to roll back: {message}' },
|
|
542
755
|
// deprecated (v1.1.1 compatibility transition)
|
|
543
|
-
'deprecated.globalCoreMd': { key: 'migrate.deprecated.globalCoreMd', zh: '', en: '? Detected deprecated global core.md (~/.config/opencode/openfeel/core.md); its constraints are now merged into the global AGENTS.md' },
|
|
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' },
|
|
544
757
|
'deprecated.globalCoreMdHint': { key: 'migrate.deprecated.globalCoreMdHint', zh: '', en: 'Run openfeel migrate --clean-global-core-md to delete, or remove it manually' },
|
|
545
|
-
'deprecated.projectAgentsMd': { key: 'migrate.deprecated.projectAgentsMd', zh: '', en: 'i Detected project AGENTS.md (legacy project constraints, now consolidated into the global ~/.config/opencode/AGENTS.md); keep or remove 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' },
|
|
546
759
|
};
|
|
547
760
|
/* ==================== model domain: model configuration (stage-40) ==================== */
|
|
548
761
|
export const model = {
|
|
@@ -558,8 +771,8 @@ export const model = {
|
|
|
558
771
|
// get
|
|
559
772
|
'get.effective': { key: 'model.get.effective', zh: '', en: 'Effective model: {value}' },
|
|
560
773
|
'get.byScope': { key: 'model.get.byScope', zh: '', en: ' {scope}: {value}' },
|
|
561
|
-
'get.none': { key: 'model.get.none', zh: '', en: '(not explicitly set, using
|
|
562
|
-
'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' },
|
|
563
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' },
|
|
564
777
|
'get.failed': { key: 'model.get.failed', zh: '', en: '✗ Read failed: {message}' },
|
|
565
778
|
// list
|
|
@@ -570,10 +783,31 @@ export const model = {
|
|
|
570
783
|
/* ==================== setup domain: global deployment (v1.1.1) ==================== */
|
|
571
784
|
export const setup = {
|
|
572
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' },
|
|
573
788
|
'updated': { key: 'setup.updated', zh: '', en: 'Updated global files:' },
|
|
574
789
|
'appended': { key: 'setup.appended', zh: '', en: 'Global files needing manual confirmation (already exist and are unmanaged; not overwritten):' },
|
|
575
790
|
'complete': { key: 'setup.complete', zh: '', en: '? Global OpenFeel framework config deployed' },
|
|
576
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
|
+
};
|
|
577
811
|
/* ==================== 聚合导出 ==================== */
|
|
578
812
|
export const allDomains = [
|
|
579
813
|
{ name: 'common', domain: common },
|
|
@@ -594,5 +828,7 @@ export const allDomains = [
|
|
|
594
828
|
{ name: 'migrate', domain: migrate },
|
|
595
829
|
{ name: 'model', domain: model },
|
|
596
830
|
{ name: 'setup', domain: setup },
|
|
831
|
+
{ name: 'metrics', domain: metrics },
|
|
832
|
+
{ name: 'repl', domain: repl },
|
|
597
833
|
];
|
|
598
834
|
//# sourceMappingURL=en.js.map
|