@peterxiaoyang/superspec 0.1.0 → 0.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.
@@ -0,0 +1,659 @@
1
+ const COMMAND_ZH = {
2
+ init: { label_zh: "初始化", hint_zh: "初始化 SuperSpec 工作流所需的目录和文件。" },
3
+ status: { label_zh: "状态检查", hint_zh: "查看当前变更的检查状态和摘要。" },
4
+ recompute: { label_zh: "重新计算状态", hint_zh: "重新计算检查状态指纹和阶段摘要。" },
5
+ "check-init": { label_zh: "初始化前置检查", hint_zh: "检查项目是否具备运行 SuperSpec 的基础内容。" },
6
+ "check-artifact": { label_zh: "工件前置检查", hint_zh: "检查某个 OpenSpec 工件是否允许开始编写。" },
7
+ "check-enter": { label_zh: "进入阶段前检查", hint_zh: "检查是否可以进入指定流程阶段。" },
8
+ "check-apply-ready": { label_zh: "进入实现前检查", hint_zh: "检查提案阶段是否已经处理完成,可以进入实现阶段。" },
9
+ "check-task-reopen": { label_zh: "任务重开检查", hint_zh: "检查被审查打回的任务是否满足重开条件。" },
10
+ "check-task-edit": { label_zh: "任务编辑前检查", hint_zh: "检查任务在开始实现前是否满足测试与范围前置条件。" },
11
+ "check-task-complete": { label_zh: "任务完成检查", hint_zh: "检查任务在勾完成前是否满足 GREEN 或替代验证要求。" },
12
+ "check-review-ready": { label_zh: "进入审查前检查", hint_zh: "检查实现阶段是否已经处理完成,可以进入审查阶段。" },
13
+ "check-review-complete": { label_zh: "审查完成检查", hint_zh: "检查审查阶段证据是否齐备并允许通过。" },
14
+ "check-verify-ready": { label_zh: "验证完成检查", hint_zh: "检查最终验证证据是否完整。" },
15
+ "check-archive-ready": { label_zh: "归档前检查", hint_zh: "检查是否满足 archive 前的确认与保全要求。" },
16
+ "check-archived": { label_zh: "归档结果检查", hint_zh: "检查 change 是否已经被正确归档。" },
17
+ };
18
+ const GATE_ZH = {
19
+ status: { label_zh: "状态", hint_zh: "当前变更的总览状态,不对应单个阶段。" },
20
+ init: { label_zh: "初始化", hint_zh: "项目或 change 级别的初始化检查。" },
21
+ recompute: { label_zh: "重新计算状态", hint_zh: "重新计算 state 与检查指纹的辅助步骤。" },
22
+ openspec_preflight: { label_zh: "OpenSpec 前置检查", hint_zh: "确认 OpenSpec CLI 已满足 SuperSpec 运行要求。" },
23
+ project_init: { label_zh: "项目初始化", hint_zh: "为当前仓库安装或修复 SuperSpec 项目文件。" },
24
+ project_update: { label_zh: "项目级更新", hint_zh: "更新当前仓库中的 SuperSpec 项目文件。" },
25
+ project_uninstall: { label_zh: "项目级卸载", hint_zh: "卸载当前仓库中的 SuperSpec 项目文件。" },
26
+ user_install: { label_zh: "用户级安装", hint_zh: "在用户级 Codex 目录安装 SuperSpec 文件。" },
27
+ user_update: { label_zh: "用户级更新", hint_zh: "更新用户级 Codex 目录中的 SuperSpec 文件。" },
28
+ user_uninstall: { label_zh: "用户级卸载", hint_zh: "卸载用户级 Codex 目录中的 SuperSpec 文件。" },
29
+ guard_error: { label_zh: "命令执行异常", hint_zh: "当前检查或初始化命令在执行过程中返回了错误。" },
30
+ preset_upgrade: { label_zh: "预设升级确认", hint_zh: "需要先确认是否接受更高强度的流程预设。" },
31
+ branch_handling: { label_zh: "分支处理确认", hint_zh: "需要先确认当前分支与工作区的处理方式。" },
32
+ apply_isolation: { label_zh: "实现隔离确认", hint_zh: "需要先确认实现阶段允许写入的隔离范围。" },
33
+ scope_expansion: { label_zh: "范围扩张确认", hint_zh: "需要先确认本次变更是否允许扩大范围。" },
34
+ verify_failure_handling: { label_zh: "失败验证处理确认", hint_zh: "需要先确认失败验证是继续修复还是接受偏差。" },
35
+ explore_complete: { label_zh: "探索完成", hint_zh: "探索记录、审查问题说明和必要的用户确认都已完成。" },
36
+ proposal_reviewed: { label_zh: "提案审查完成", hint_zh: "提案已经完成严格审查,并完成必要的问题说明或用户确认。" },
37
+ design_complete: { label_zh: "设计完成", hint_zh: "设计与规格审查已经完成。" },
38
+ invariants_reviewed: { label_zh: "业务不变量审查完成", hint_zh: "业务不变量文档已经完成审查和必要的问题说明。" },
39
+ test_contract_drafted: { label_zh: "测试契约起草完成", hint_zh: "测试契约已经完成审查和必要的问题说明。" },
40
+ tasks_complete: { label_zh: "任务映射完成", hint_zh: "任务映射、测试引用和上游约束已经处理完成。" },
41
+ propose_complete: { label_zh: "提案阶段完成", hint_zh: "从探索到任务映射的提案链路已经全部通过。" },
42
+ task_reopen: { label_zh: "任务重开", hint_zh: "审查打回后的任务重开流程。" },
43
+ task_edit: { label_zh: "任务编辑", hint_zh: "实现前检查 RED 或现状锁定测试等前置条件。" },
44
+ task_complete: { label_zh: "任务完成", hint_zh: "任务勾完成前的证据检查。" },
45
+ review_ready: { label_zh: "进入审查前准备完成", hint_zh: "可以开始审查阶段。" },
46
+ review_complete: { label_zh: "审查完成", hint_zh: "审查和最终验证证据都已经处理完成。" },
47
+ verify_complete: { label_zh: "验证完成", hint_zh: "最终验证已完成。" },
48
+ archive_ready: { label_zh: "归档准备完成", hint_zh: "满足 archive 之前的所有保全与确认要求。" },
49
+ archived: { label_zh: "已归档", hint_zh: "change 已完成 archive。" },
50
+ };
51
+ const REASON_ZH = {
52
+ missing_review_digest: { label_zh: "缺少审查问题记录", hint_zh: "当前轮次的审查问题还没有整理成给用户看的记录。" },
53
+ needs_user_decision_pending: { label_zh: "等待用户确认", hint_zh: "当前问题需要用户确认,请先选择 A/B/C/D 中的一项。" },
54
+ finding_unresolved: { label_zh: "历史问题未处理完", hint_zh: "旧问题还没有最终处理结果,不能靠新一轮无问题审查把它忽略掉。" },
55
+ finding_undisclosed: { label_zh: "本轮问题未说明", hint_zh: "审查角色提出的问题还没有写进本轮审查问题记录并展示给用户。" },
56
+ user_decision_unbound: { label_zh: "用户确认未绑定", hint_zh: "关键问题的最终处理结果没有正确关联到用户确认或有效授权。" },
57
+ standing_authorization_unbound: { label_zh: "长期授权不适用", hint_zh: "当前问题不能被现有长期授权覆盖。" },
58
+ review_round_stale: { label_zh: "审查轮次已过期", hint_zh: "审查轮次记录的工件版本已经不是当前版本,需要重新审查。" },
59
+ review_digest_stale: { label_zh: "审查问题记录已过期", hint_zh: "审查问题记录对应的工件集合已过期,需要按当前版本重新整理。" },
60
+ review_round_discontinuous: { label_zh: "审查轮次断档", hint_zh: "审查轮次编号必须连续,不能跳过中间轮次。" },
61
+ digest_chain_broken: { label_zh: "审查问题记录链不完整", hint_zh: "后一轮审查问题记录没有正确引用前一轮记录。" },
62
+ finding_identity_mismatch: { label_zh: "问题身份不一致", hint_zh: "主流程在审查问题记录里改写了审查方原始问题的分类或身份字段。" },
63
+ finding_summary_not_verbatim: { label_zh: "问题原文未逐字保留", hint_zh: "展示给用户的问题说明没有逐字保留审查方的原始摘要。" },
64
+ accepted_deviation_unacknowledged: { label_zh: "已接受偏差未被重审确认", hint_zh: "新一轮无问题审查没有明确确认已接受的偏差。" },
65
+ ledger_injection_missing: { label_zh: "缺少问题清单", hint_zh: "增量重审输入中缺少工具生成的问题清单。" },
66
+ round_budget_exhausted: { label_zh: "审查轮次已达上限", hint_zh: "同一流程阶段超过预算轮次仍未处理完成,需要升级给用户。" },
67
+ missing_characterization: { label_zh: "缺少现状锁定测试", hint_zh: "行为保持重构在动代码前,必须先用 GREEN 测试锁住当前行为。" },
68
+ missing_red_evidence: { label_zh: "缺少 RED 证据", hint_zh: "新增行为或修 bug 的任务在实现前需要先有失败测试证据。" },
69
+ missing_green_evidence: { label_zh: "缺少 GREEN 证据", hint_zh: "任务完成前需要通过成功测试或等价验证。" },
70
+ invalid_tdd_mode: { label_zh: "TDD 模式无效", hint_zh: "task 上声明的 tdd_mode 不在允许枚举里。" },
71
+ invalid_no_tdd_reason: { label_zh: "免 TDD 理由无效", hint_zh: "task 上声明的 no_tdd_reason 不在允许枚举里。" },
72
+ missing_discovery: { label_zh: "缺少探索记录", hint_zh: "探索阶段缺少 discovery.md,或者该文件内容为空。" },
73
+ missing_proposal: { label_zh: "缺少提案工件", hint_zh: "提案工件还没有完成。" },
74
+ missing_proposal_review: { label_zh: "缺少提案审查", hint_zh: "提案审查阶段还没有收集到严格审查证据。" },
75
+ explore_complete_failed: { label_zh: "探索阶段未通过", hint_zh: "后续阶段依赖的探索完成检查还没有通过。" },
76
+ proposal_reviewed_failed: { label_zh: "提案审查阶段未通过", hint_zh: "后续阶段依赖的提案审查完成还没有通过。" },
77
+ validate_failed: { label_zh: "OpenSpec 校验失败", hint_zh: "openspec validate 还没有通过。" },
78
+ review_not_ready: { label_zh: "尚未达到审查条件", hint_zh: "进入审查阶段之前的检查还没有全部通过。" },
79
+ apply_isolation_unconfirmed: { label_zh: "实现隔离尚未确认", hint_zh: "实现阶段缺少用户对写入隔离范围的确认。" },
80
+ scope_expansion_unconfirmed: { label_zh: "范围扩张尚未确认", hint_zh: "tasks 结构变化扩大了范围,但还没有新的用户确认。" },
81
+ state_concurrent_update: { label_zh: "状态写入发生并发变更", hint_zh: "决策和写入之间输入发生变化,需要等变更稳定后重新运行。" },
82
+ project_init_failed: { label_zh: "项目初始化失败", hint_zh: "项目级 SuperSpec 初始化没有成功完成。" },
83
+ openspec_cli_too_old: { label_zh: "OpenSpec 版本过低", hint_zh: "当前 openspec CLI 低于 SuperSpec 要求的最低版本。" },
84
+ openspec_cli_unavailable: { label_zh: "OpenSpec CLI 不可用", hint_zh: "PATH 中没有可执行的 openspec CLI。" },
85
+ openspec_native_surface_missing: { label_zh: "OpenSpec 原生能力缺失", hint_zh: "当前 openspec CLI 不是受支持版本,或缺少 SuperSpec 依赖的子命令。" },
86
+ openspec_auto_install_unavailable: { label_zh: "OpenSpec 无法自动安装", hint_zh: "当前环境没有可用包管理器完成 OpenSpec 自动安装或升级。" },
87
+ openspec_auto_install_failed: { label_zh: "OpenSpec 自动安装失败", hint_zh: "OpenSpec 自动安装或升级命令没有成功完成。" },
88
+ project_update_failed: { label_zh: "项目级更新失败", hint_zh: "项目级 SuperSpec 文件更新失败。" },
89
+ project_uninstall_failed: { label_zh: "项目级卸载失败", hint_zh: "项目级 SuperSpec 文件卸载失败。" },
90
+ user_install_failed: { label_zh: "用户级安装失败", hint_zh: "用户级 SuperSpec 安装失败。" },
91
+ user_update_failed: { label_zh: "用户级更新失败", hint_zh: "用户级 SuperSpec 更新失败。" },
92
+ user_uninstall_failed: { label_zh: "用户级卸载失败", hint_zh: "用户级 SuperSpec 卸载失败。" },
93
+ guard_error: { label_zh: "检查执行失败", hint_zh: "guard 命令执行过程中发生了可报告错误。" },
94
+ guard_internal_error: { label_zh: "检查器内部错误", hint_zh: "guard 内部抛出了异常,需要查看错误信息排查。" },
95
+ };
96
+ const WORKFLOW_TERMS_ZH = {
97
+ "check-enter": { term: "check-enter", label_zh: "进入阶段前检查", hint_zh: "进入某个流程阶段前先运行的检查命令。" },
98
+ acceptance: { term: "acceptance", label_zh: "验收标准", hint_zh: "这个 change 交付后必须满足的结果和边界。" },
99
+ characterization: { term: "characterization", label_zh: "现状锁定测试", hint_zh: "先把当前真实行为测出来并锁住,重构后保持一致。" },
100
+ main_review_digest: { term: "main_review_digest", label_zh: "审查问题记录", hint_zh: "主流程把本轮审查问题整理给用户看的记录。" },
101
+ user_review_decision: { term: "user_review_decision", label_zh: "用户确认记录", hint_zh: "用户对 A/B/C/D 选项做出的正式确认记录。" },
102
+ };
103
+ const TRUST_WARNING_ZH = {
104
+ "v1 evidence is audit-only/self-reported unless explicitly backed by OpenSpec facts": "v1 证据默认只作审计参考或自报信息;除非另有 OpenSpec 事实支撑,否则不能单独当作强证明。",
105
+ "v1 role evidence cannot mechanically prove a native subagent ran; it only checks schema, freshness, output refs, and non-direct authorship markers": "v1 角色证据无法机械证明本地子代理一定实际运行;当前只校验 schema、时效、output ref 与非直接作者标记。",
106
+ ".superspec runtime data is never touched by install/update/uninstall; only manifest-managed files are": "install / update / uninstall 不会改动 .superspec 运行态数据,只会处理 manifest 接管的文件。",
107
+ "project init installs project surfaces only; change sidecars are created lazily by later superspec phases": "project init 只安装项目级内容;change sidecar 会在后续 superspec 阶段按需创建。",
108
+ };
109
+ const ACTION_ZH_EXACT = {
110
+ "continue with superspec-explore/propose/apply guard checks": "继续执行探索、提案和实现阶段的前置检查。",
111
+ "create/select a change during superspec-explore, then run change-scoped guard checks": "先在探索阶段创建或选择一个变更,然后运行该变更范围内的前置检查。",
112
+ "review *.new files for user-modified surfaces, then rerun superspec guard check-init": "先检查因用户改动而生成的 *.new 文件,然后重新运行初始化前置检查;Windows PowerShell 中使用 superspec.cmd guard check-init。",
113
+ "review *.new files for user-modified user-level surfaces": "先检查用户级内容对应的 *.new 文件。",
114
+ "user-level SuperSpec Codex surfaces installed; use superspec init --scope project inside a repo when project-local surfaces are needed": "用户级 SuperSpec 配套内容已安装;如果仓库里还需要项目级内容,请在仓库内运行 superspec init --scope project;Windows PowerShell 中使用 superspec.cmd init --scope project。",
115
+ "finish remaining unchecked tasks and mark them complete only after check-task-complete passes": "先完成剩余未勾选任务,并且仅在任务完成检查通过后再标记完成。",
116
+ "record final_test pass evidence and reference it from verification_review": "记录最终测试通过证据,并在验证审查证据中引用它。",
117
+ };
118
+ const ACTION_STATUS_ZH = {
119
+ ok: "正常",
120
+ created: "已创建",
121
+ updated: "已更新",
122
+ skipped: "已跳过",
123
+ removed: "已移除",
124
+ would_remove: "待移除",
125
+ failed: "失败",
126
+ };
127
+ const ROLE_ZH = {
128
+ architect: "架构审查",
129
+ critic: "严格审查",
130
+ "test-engineer": "测试审查",
131
+ "code-reviewer": "代码审查",
132
+ verifier: "验证审查",
133
+ };
134
+ const EVIDENCE_KIND_ZH = {
135
+ source_guidance: "审查指导证据",
136
+ verification_review: "验证审查证据",
137
+ final_test: "最终测试通过证据",
138
+ main_adjudication: "主流程最终判断记录",
139
+ main_review_digest: "审查问题记录",
140
+ user_review_decision: "用户确认记录",
141
+ human_confirmation: "人工确认证据",
142
+ test_run: "测试运行证据",
143
+ alternative_verification: "替代验证证据",
144
+ manual_verification: "人工验证证据",
145
+ task_reopen: "任务重开证据",
146
+ task_reopen_resolved: "任务重开完成证据",
147
+ };
148
+ const FIELD_ZH = {
149
+ reviewed_files: "审查文件列表",
150
+ rollback_targets: "回滚目标",
151
+ source_evidence_refs: "来源证据引用",
152
+ verification_evidence_refs: "验证证据引用",
153
+ blocking_source_evidence_refs: "阻塞来源证据引用",
154
+ required_claim_ids: "必需结论项",
155
+ required_load_refs: "必需加载引用",
156
+ claim_adjudications: "结论项判断",
157
+ finding_adjudications: "问题处理判断",
158
+ request_changes_route: "打回路由",
159
+ reopen_task_ids: "需重开任务列表",
160
+ output_ref: "输出引用",
161
+ prompt_ref: "提示词引用",
162
+ target_refs: "目标引用",
163
+ openspec_validate_ref: "OpenSpec 校验引用",
164
+ scope_drift_ref: "范围漂移引用",
165
+ task_matrix_ref: "任务矩阵引用",
166
+ invariant_matrix_ref: "不变量矩阵引用",
167
+ test_evidence_refs: "测试证据引用",
168
+ base_ref: "基线提交引用",
169
+ head_ref: "当前提交引用",
170
+ raw_artifact_refs: "原始工件引用",
171
+ raw_log_refs: "原始日志引用",
172
+ result_summary: "结果摘要",
173
+ };
174
+ const NOUN_ZH = {
175
+ source_guidance: "审查指导证据",
176
+ verification_review: "验证审查证据",
177
+ final_test: "最终测试通过证据",
178
+ main_adjudication: "主流程最终判断记录",
179
+ main_review_digest: "审查问题记录",
180
+ review_digest: "审查问题记录",
181
+ review_round: "审查轮次",
182
+ final_verification_review: "最终验证审查",
183
+ business_invariants: "业务不变量",
184
+ coverage_matrix: "覆盖矩阵",
185
+ test_contract: "测试契约",
186
+ task_reopen: "任务重开",
187
+ reopen_successor: "重开后继证据",
188
+ archive_manifest: "归档清单",
189
+ archive_preservation_plan: "归档保全计划",
190
+ target_refs: "目标引用",
191
+ source_evidence_refs: "来源证据引用",
192
+ verification_evidence_refs: "验证证据引用",
193
+ blocking_source_evidence_refs: "阻塞来源证据引用",
194
+ raw_artifact_refs: "原始工件引用",
195
+ raw_log_refs: "原始日志引用",
196
+ task_test_refs: "任务测试引用",
197
+ task_invariant_refs: "任务不变量引用",
198
+ verification_evidence: "验证证据",
199
+ review_evidence: "审查证据",
200
+ task_evidence: "任务证据",
201
+ native_subagent_evidence: "本地子代理证据",
202
+ claim_adjudication: "结论项判断",
203
+ claim_adjudications: "结论项判断",
204
+ finding_adjudication: "问题处理判断",
205
+ test_contract_review: "测试契约审查",
206
+ invariant_review: "不变量审查",
207
+ missing_roles: "缺失角色",
208
+ rollback_targets: "回滚目标",
209
+ reviewed_files: "审查文件列表",
210
+ required_loads: "必需加载项",
211
+ claims: "结论项",
212
+ blocking_findings: "阻塞问题",
213
+ human_confirmation: "人工确认",
214
+ scope_drift: "范围漂移",
215
+ openspec_cli: "OpenSpec CLI",
216
+ openspec_native_surface: "OpenSpec 原生配套内容",
217
+ openspec_artifacts: "OpenSpec 工件",
218
+ superspec_skill: "SuperSpec 技能",
219
+ superspec_agent: "SuperSpec 角色代理",
220
+ superspec_prompt: "SuperSpec 角色提示词",
221
+ test_run: "测试运行",
222
+ alternative_verification: "替代验证",
223
+ manual_verification: "人工验证",
224
+ output_ref: "输出引用",
225
+ prompt_ref: "提示词引用",
226
+ base_ref: "基线提交引用",
227
+ head_ref: "当前提交引用",
228
+ task_id: "任务标识",
229
+ reopen_id: "重开标识",
230
+ change_update: "变更回改",
231
+ };
232
+ const TOKEN_ZH = {
233
+ missing: "缺少",
234
+ invalid: "无效",
235
+ unknown: "未知",
236
+ unexpected: "非预期",
237
+ ambiguous: "不唯一",
238
+ unresolved: "未处理完",
239
+ stale: "已过期",
240
+ failed: "失败",
241
+ incomplete: "不完整",
242
+ blocked: "未通过",
243
+ unavailable: "不可用",
244
+ mismatch: "不匹配",
245
+ duplicate: "重复",
246
+ unreferenced: "未被引用",
247
+ unloaded: "未加载",
248
+ required: "必需",
249
+ preserved: "已保全",
250
+ proposal: "提案",
251
+ design: "设计",
252
+ task: "任务",
253
+ tasks: "任务",
254
+ review: "审查",
255
+ verification: "验证",
256
+ source: "来源",
257
+ guidance: "指导",
258
+ archive: "归档",
259
+ manifest: "清单",
260
+ state: "状态",
261
+ fingerprint: "指纹",
262
+ dirty: "脏工作区",
263
+ worktree: "工作区",
264
+ reopen: "重开",
265
+ successor: "后继",
266
+ final: "最终",
267
+ tests: "测试",
268
+ artifacts: "工件",
269
+ artifact: "工件",
270
+ invariant: "不变量",
271
+ invariants: "不变量",
272
+ contract: "契约",
273
+ coverage: "覆盖",
274
+ matrix: "矩阵",
275
+ refs: "引用",
276
+ ref: "引用",
277
+ role: "角色",
278
+ roles: "角色",
279
+ lane: "审查线",
280
+ native: "本地",
281
+ subagent: "子代理",
282
+ evidence: "证据",
283
+ adjudication: "最终判断",
284
+ claim: "结论项",
285
+ claims: "结论项",
286
+ finding: "问题",
287
+ findings: "问题",
288
+ complete: "完成",
289
+ propose: "提案",
290
+ apply: "实现",
291
+ gate: "阶段",
292
+ rereview: "重新审查",
293
+ rollback: "回滚",
294
+ target: "目标",
295
+ human: "人工",
296
+ confirmation: "确认",
297
+ scope: "范围",
298
+ drift: "漂移",
299
+ green: "GREEN",
300
+ red: "RED",
301
+ characterization: "现状锁定测试",
302
+ validate: "校验",
303
+ cli: "命令行",
304
+ schema: "结构",
305
+ surface: "配套内容",
306
+ workflow: "工作流",
307
+ };
308
+ function fallbackZh(kind) {
309
+ return {
310
+ label_zh: kind,
311
+ hint_zh: "这是内部工作流标识;界面层应优先展示对应的中文说明,而不是直接向普通用户暴露原始标识。",
312
+ };
313
+ }
314
+ export function command_zh(command) {
315
+ return COMMAND_ZH[command] ?? { label_zh: noun_phrase_zh(command) ?? "内部命令", hint_zh: "这是内部命令标识;界面层应优先展示对应的中文说明。" };
316
+ }
317
+ export function gate_zh(gate) {
318
+ return GATE_ZH[gate] ?? { label_zh: noun_phrase_zh(gate) ?? "内部流程阶段", hint_zh: "这是内部流程阶段标识;界面层应优先展示对应的中文说明。" };
319
+ }
320
+ export function reason_zh(code) {
321
+ return REASON_ZH[code] ?? auto_reason_zh(code);
322
+ }
323
+ export function decision_zh(decision) {
324
+ if (decision === "allow")
325
+ return "通过";
326
+ if (decision === "block")
327
+ return "未通过";
328
+ if (decision === "status")
329
+ return "状态";
330
+ return "内部结果";
331
+ }
332
+ function hasHan(text) {
333
+ return /[\u3400-\u9fff]/u.test(text);
334
+ }
335
+ function refs_suffix_zh(refs) {
336
+ if (refs.length === 0)
337
+ return "";
338
+ return ` 关联:${refs.join(",")}`;
339
+ }
340
+ function sortedKeysDesc(map) {
341
+ return Object.keys(map).sort((a, b) => b.length - a.length);
342
+ }
343
+ function role_label_zh(role) {
344
+ return ROLE_ZH[role] ?? role;
345
+ }
346
+ function noun_phrase_zh(raw) {
347
+ if (!raw)
348
+ return null;
349
+ if (NOUN_ZH[raw])
350
+ return NOUN_ZH[raw];
351
+ if (FIELD_ZH[raw])
352
+ return FIELD_ZH[raw];
353
+ if (EVIDENCE_KIND_ZH[raw])
354
+ return EVIDENCE_KIND_ZH[raw];
355
+ if (ROLE_ZH[raw])
356
+ return ROLE_ZH[raw];
357
+ for (const key of sortedKeysDesc(NOUN_ZH)) {
358
+ if (raw.includes(key))
359
+ return raw.replaceAll(key, NOUN_ZH[key]);
360
+ }
361
+ const parts = raw.split(/[_-]+/u).filter(Boolean);
362
+ if (parts.length === 0)
363
+ return null;
364
+ const mapped = parts.map((part) => TOKEN_ZH[part] ?? FIELD_ZH[part] ?? null);
365
+ if (mapped.some((item) => item === null))
366
+ return null;
367
+ return mapped.join("");
368
+ }
369
+ function auto_reason_zh(code) {
370
+ const render = (subjectRaw, labelPrefix, hintSuffix) => {
371
+ const subject = noun_phrase_zh(subjectRaw) ?? subjectRaw;
372
+ return { label_zh: `${labelPrefix}${subject}`, hint_zh: `当前${subject}${hintSuffix}` };
373
+ };
374
+ const patterns = [
375
+ [/^missing_(.+)$/u, (subject) => render(subject, "缺少", "缺失,需要补齐后再继续。")],
376
+ [/^invalid_(.+)$/u, (subject) => render(subject, "", "不符合预期格式或约束。")],
377
+ [/^unknown_(.+)$/u, (subject) => render(subject, "未知", "无法被当前流程识别。")],
378
+ [/^unexpected_(.+)$/u, (subject) => render(subject, "出现非预期的", "超出了当前流程允许范围。")],
379
+ [/^ambiguous_(.+)$/u, (subject) => render(subject, "", "不唯一,需要先消歧。")],
380
+ [/^unresolved_(.+)$/u, (subject) => render(subject, "", "尚未处理完成,需要先处理。")],
381
+ [/^stale_(.+)$/u, (subject) => render(subject, "", "已经过期,需要基于最新内容重做。")],
382
+ [/^(.+)_failed$/u, (subject) => render(subject, "", "未通过当前检查。")],
383
+ [/^(.+)_invalid$/u, (subject) => render(subject, "", "不符合预期格式或约束。")],
384
+ [/^(.+)_incomplete$/u, (subject) => render(subject, "", "还不完整,需要补齐。")],
385
+ [/^(.+)_missing$/u, (subject) => render(subject, "缺少", "缺失,需要补齐后再继续。")],
386
+ [/^(.+)_unavailable$/u, (subject) => render(subject, "", "当前不可用。")],
387
+ [/^(.+)_unreferenced$/u, (subject) => render(subject, "", "尚未被正确引用。")],
388
+ [/^(.+)_unloaded$/u, (subject) => render(subject, "", "尚未被正确加载。")],
389
+ [/^(.+)_mismatch$/u, (subject) => render(subject, "", "与预期不一致。")],
390
+ [/^(.+)_duplicate$/u, (subject) => render(subject, "", "出现重复。")],
391
+ [/^(.+)_blocked$/u, (subject) => render(subject, "", "当前未通过。")],
392
+ [/^(.+)_required$/u, (subject) => render(subject, "需要", "是当前流程的必需项。")],
393
+ [/^(.+)_not_honored$/u, (subject) => render(subject, "", "尚未被满足。")],
394
+ [/^(.+)_not_ready$/u, (subject) => render(subject, "", "尚未就绪。")],
395
+ [/^(.+)_not_complete$/u, (subject) => render(subject, "", "尚未完成。")],
396
+ [/^not_(.+)$/u, (subject) => render(subject, "不是", "与当前操作目标不匹配。")],
397
+ [/^non_default_(.+)$/u, (subject) => render(subject, "未使用默认", "与当前流程要求不一致。")],
398
+ ];
399
+ for (const [pattern, make] of patterns) {
400
+ const match = code.match(pattern);
401
+ if (match)
402
+ return make(match[1]);
403
+ }
404
+ const label = noun_phrase_zh(code);
405
+ if (label)
406
+ return { label_zh: label, hint_zh: "当前流程触发了这条未通过原因,请结合上下文继续排查。" };
407
+ return fallbackZh("未通过原因");
408
+ }
409
+ function translate_message_tokens_zh(raw) {
410
+ let out = raw;
411
+ const phraseReplacements = [
412
+ [/main_review_digest/giu, "审查问题记录"],
413
+ [/user_review_decision/giu, "用户确认记录"],
414
+ [/review_standing_authorization/giu, "长期授权记录"],
415
+ [/review_round_id/giu, "审查轮次编号"],
416
+ [/finding_uid/giu, "问题唯一标识"],
417
+ [/decision_scope_key/giu, "确认范围标识"],
418
+ [/confirmed_refs/giu, "已确认内容引用"],
419
+ [/source_review_evidence_refs/giu, "来源审查证据引用"],
420
+ [/previous_digest_refs/giu, "上一轮审查问题记录引用"],
421
+ [/finding_dispositions/giu, "问题处理结果"],
422
+ [/needs_user_decision/giu, "等待用户确认"],
423
+ [/ledger_injection_missing/giu, "缺少问题清单"],
424
+ [/round_budget_exhausted/giu, "审查轮次已达上限"],
425
+ [/source_guidance evidence/giu, "审查指导证据"],
426
+ [/verification_review evidence/giu, "验证审查证据"],
427
+ [/final_test pass evidence/giu, "最终测试通过证据"],
428
+ [/human confirmation evidence/giu, "人工确认证据"],
429
+ [/scope drift report/giu, "范围漂移报告"],
430
+ [/passing review evidence/giu, "通过的审查证据"],
431
+ [/native_subagent ([A-Za-z-]+)/giu, (role) => `本地子代理${role_label_zh(role)}`],
432
+ [/missing roles/giu, "缺失角色"],
433
+ [/review rounds/giu, "审查轮次"],
434
+ [/live\/pass/giu, "仍然有效且通过的"],
435
+ [/request_changes/giu, "打回"],
436
+ [/change update/giu, "变更回改"],
437
+ ];
438
+ for (const [pattern, replacement] of phraseReplacements) {
439
+ out = out.replace(pattern, (...args) => typeof replacement === "string" ? replacement : replacement(...args.slice(1, -2)));
440
+ }
441
+ const tokenMap = {
442
+ requires: "需要",
443
+ require: "需要",
444
+ missing: "缺少",
445
+ invalid: "无效",
446
+ unknown: "未知",
447
+ exactly: "恰好",
448
+ one: "一条",
449
+ live: "有效",
450
+ authored: "生成",
451
+ before: "之前",
452
+ after: "之后",
453
+ must: "必须",
454
+ include: "包含",
455
+ includes: "包含",
456
+ reference: "引用",
457
+ references: "引用",
458
+ referencing: "引用",
459
+ cover: "覆盖",
460
+ covers: "覆盖",
461
+ load: "加载",
462
+ readable: "可读取",
463
+ empty: "为空",
464
+ done: "完成",
465
+ pass: "通过",
466
+ failed: "失败",
467
+ by: "由",
468
+ and: "和",
469
+ or: "或",
470
+ not: "未",
471
+ };
472
+ out = out.replace(/\b[A-Za-z][A-Za-z0-9_.-]*\b/gu, (token) => {
473
+ const lower = token.toLowerCase();
474
+ if (tokenMap[lower])
475
+ return tokenMap[lower];
476
+ if (ROLE_ZH[token])
477
+ return ROLE_ZH[token];
478
+ if (FIELD_ZH[token])
479
+ return FIELD_ZH[token];
480
+ if (EVIDENCE_KIND_ZH[token])
481
+ return EVIDENCE_KIND_ZH[token];
482
+ if (COMMAND_ZH[token])
483
+ return COMMAND_ZH[token].label_zh;
484
+ if (GATE_ZH[token])
485
+ return GATE_ZH[token].label_zh;
486
+ const noun = noun_phrase_zh(token);
487
+ return noun ?? token;
488
+ });
489
+ out = out
490
+ .replace(/\s+/gu, " ")
491
+ .replace(/\s+([:,\)])+/gu, "$1")
492
+ .replace(/\(\s+/gu, "(")
493
+ .trim();
494
+ return out;
495
+ }
496
+ function display_term_zh(value) {
497
+ const trimmed = value.trim();
498
+ const firstToken = trimmed.split(/\s+/u)[0] ?? "";
499
+ if (ROLE_ZH[trimmed])
500
+ return ROLE_ZH[trimmed];
501
+ if (EVIDENCE_KIND_ZH[trimmed])
502
+ return EVIDENCE_KIND_ZH[trimmed];
503
+ if (FIELD_ZH[trimmed])
504
+ return FIELD_ZH[trimmed];
505
+ if (COMMAND_ZH[firstToken])
506
+ return COMMAND_ZH[firstToken].label_zh;
507
+ if (GATE_ZH[trimmed])
508
+ return GATE_ZH[trimmed].label_zh;
509
+ if (REASON_ZH[trimmed])
510
+ return REASON_ZH[trimmed].label_zh;
511
+ if (/^[a-z0-9_]+$/u.test(trimmed))
512
+ return reason_zh(trimmed).label_zh;
513
+ return noun_phrase_zh(trimmed) ?? trimmed;
514
+ }
515
+ function render_roles_zh(raw) {
516
+ return raw.split(/\s*,\s*/u).filter(Boolean).map((item) => role_label_zh(item)).join("、");
517
+ }
518
+ export function translate_action_zh(action) {
519
+ const exact = ACTION_ZH_EXACT[action];
520
+ if (exact)
521
+ return exact;
522
+ const patterns = [
523
+ [/^managed SuperSpec surfaces removed; run superspec init --scope (.+) to reinstall$/u, (scope) => `SuperSpec 管理的文件已移除;如需重新安装,请运行 superspec init --scope ${scope};Windows PowerShell 中使用 superspec.cmd init --scope ${scope}。`],
524
+ [/^install or upgrade @fission-ai\/openspec >= ([0-9.]+), then rerun `superspec init --scope (.+)`$/u, (version, scope) => `先安装或升级 @fission-ai/openspec 到 ${version} 或更高版本,然后重新运行 superspec init --scope ${scope};Windows PowerShell 中使用 superspec.cmd init --scope ${scope}。`],
525
+ [/^fix ([A-Za-z0-9_.-]+) reasons, then rerun(?: (.+))?$/u, (problem, cmd) => {
526
+ const label = display_term_zh(problem);
527
+ return cmd ? `先处理${label}对应问题,然后重新运行相关命令。` : `先处理${label}对应问题,然后重新运行相关检查。`;
528
+ }],
529
+ [/^fix openspec validate failures for (.+)$/u, (change) => `修复 ${change} 的 openspec validate 失败项。`],
530
+ [/^collect ([A-Za-z0-9_.-]+) source_guidance from missing roles: (.+)$/u, (gate, roles) => `补齐${display_term_zh(gate)}所缺的审查指导证据(角色:${render_roles_zh(roles)})。`],
531
+ [/^collect verification_review evidence from missing roles: (.+)$/u, (roles) => `补齐验证审查证据(角色:${render_roles_zh(roles)})。`],
532
+ [/^repair source_guidance evidence fields so every review lane has base\/head refs, reviewed_files, and rollback_targets$/u, () => "修复审查指导证据字段,确保每条审查线都包含基线/当前提交引用、审查文件列表和回滚目标。"],
533
+ [/^write exactly one live main_adjudication referencing every live source_guidance and final verification evidence$/u, () => "补写且仅保留一条有效的主流程最终判断记录,并引用全部有效的审查指导证据和最终验证证据。"],
534
+ [/^repair main_adjudication so it references all source_guidance\/final verification evidence and explicitly covers required loads, claims, and blocking findings$/u, () => "修复主流程最终判断记录,确保它引用全部审查指导证据与最终验证证据,并明确覆盖必需加载项、结论项和阻塞问题。"],
535
+ [/^repair verification_review references so openspec_validate_ref, matrices, scope drift report, and test evidence refs are readable$/u, () => "修复验证审查证据引用,确保 OpenSpec 校验引用、各类矩阵、范围漂移报告和测试证据引用都可读取。"],
536
+ [/^resolve scope drift before review close: narrow the change or record accepted\/none with evidence$/u, () => "先处理范围漂移,再结束审查:要么收窄本次变更范围,要么补充证据后明确记录为已接受或无漂移。"],
537
+ [/^record ([A-Za-z0-9_.-]+) pass evidence and reference it from ([A-Za-z0-9_.-]+)$/u, (kind, target) => `记录${display_term_zh(kind)},并在${display_term_zh(target)}中引用它。`],
538
+ [/^AskUserQuestion for apply isolation\/execution mode and record gate="apply_isolation" human_confirmation$/u, () => "请先让用户确认实现隔离范围或执行方式,并记录对应的人工确认证据。"],
539
+ [/^run the proposal critic review \(round-tagged, findings\[\]\) and record a main_review_digest disclosing every finding$/u, () => "先完成提案的严格审查,并记录一条向用户说明所有问题的审查问题记录。"],
540
+ [/^pass (.+) before entering (.+)$/u, (name, stage) => `进入${display_term_zh(stage)}之前先通过${display_term_zh(name)}。`],
541
+ [/^pass (.+) first$/u, (name) => `先通过${display_term_zh(name)}。`],
542
+ [/^pass (.+)$/u, (name) => `先通过${display_term_zh(name)}。`],
543
+ [/^rerun (.+)$/u, (cmd) => `重新运行${display_term_zh(cmd)}。`],
544
+ [/^run (.+)$/u, (cmd) => `运行${display_term_zh(cmd)}。`],
545
+ [/^fix (.+), then rerun (.+)$/u, (_problem, cmd) => `先修复相关问题,然后重新运行 ${cmd}。`],
546
+ [/^fix (.+)$/u, (problem) => hasHan(problem) ? `修复 ${problem}。` : "先修复当前未通过项。"],
547
+ [/^inspect (.+), then rerun (.+)$/u, (target, cmd) => `先检查 ${target},然后重新运行 ${cmd}。`],
548
+ [/^keep (.+) checked, fix (.+), then rerun (.+)$/u, (target, _problem, cmd) => `保持 ${target} 处于已勾选状态,修复当前问题,然后重新运行 ${cmd}。`],
549
+ [/^continue with (.+)$/u, (what) => `继续执行 ${what}。`],
550
+ [/^record (.+) human_confirmation evidence, then rerun (.+)$/u, (kind, cmd) => `记录${display_term_zh(kind)}对应的人工确认证据,然后重新运行${display_term_zh(cmd)}。`],
551
+ [/^stop review completion and hand off to apply task_reopen for (.+)$/u, (taskIds) => `停止当前审查完成流程,转回实现阶段处理任务重开:${taskIds}。`],
552
+ [/^stop review completion and hand off to apply task_reopen$/u, () => "停止当前审查完成流程,转回实现阶段处理任务重开。"],
553
+ [/^stop review completion and hand off to propose\/change update$/u, () => "停止当前审查完成流程,转回提案阶段处理变更回改。"],
554
+ [/^do not add allow-path verification_review\/final_test evidence to this request_changes round$/u, () => "本轮打回处理中不要补写仅用于通过审查的验证审查证据或最终测试通过证据。"],
555
+ [/^repair request_changes_route and hand off the review round before retrying review_complete$/u, () => "先修复打回路由并完成当前审查轮次交接,再重新尝试审查完成检查。"],
556
+ [/^AskUserQuestion for the failed-verification disposition \(fix or accept deviation\) and record gate="verify_failure_handling" human_confirmation referencing the failed evidence ids$/u, () => "请用户确认失败验证的处理方式:继续修复,或接受这次偏差;并补记引用失败证据的人工确认。"],
557
+ ];
558
+ for (const [pattern, render] of patterns) {
559
+ const match = action.match(pattern);
560
+ if (match)
561
+ return render(...match.slice(1));
562
+ }
563
+ return "先处理当前未通过项,再重新运行相关检查。";
564
+ }
565
+ export function reason_message_zh(code, rawMessage, refs = []) {
566
+ const zh = reason_zh(code);
567
+ if (hasHan(rawMessage))
568
+ return `${translate_message_tokens_zh(rawMessage)}${refs_suffix_zh(refs)}`;
569
+ if (Object.prototype.hasOwnProperty.call(REASON_ZH, code) && zh.hint_zh)
570
+ return `${zh.label_zh}:${zh.hint_zh}${refs_suffix_zh(refs)}`;
571
+ const translated = translate_message_tokens_zh(rawMessage);
572
+ if (translated && translated !== rawMessage && !/[A-Za-z]{4,}/u.test(translated))
573
+ return `${zh.label_zh}:${translated}${refs_suffix_zh(refs)}`;
574
+ if (zh.hint_zh)
575
+ return `${zh.label_zh}:${zh.hint_zh}${refs_suffix_zh(refs)}`;
576
+ return `${zh.label_zh}${refs_suffix_zh(refs)}`;
577
+ }
578
+ export function trust_warning_zh(warning) {
579
+ return TRUST_WARNING_ZH[warning] ?? "注意:这条提示属于信任边界说明,请结合当前证据一起判断。";
580
+ }
581
+ export function action_status_zh(status) {
582
+ return ACTION_STATUS_ZH[status] ?? "状态未知";
583
+ }
584
+ export function action_label_zh(action) {
585
+ const exact = {
586
+ openspec_codex_skills: "检查 OpenSpec 配套技能文件",
587
+ superspec_repo_local_roles: "检查 SuperSpec 本地角色与提示词",
588
+ "openspec init --tools codex .": "运行 OpenSpec 初始化命令",
589
+ "openspec update --force .": "运行 OpenSpec 更新命令",
590
+ };
591
+ if (exact[action])
592
+ return exact[action];
593
+ const patterns = [
594
+ [/^install (.+)$/u, (target) => `安装 ${target}`],
595
+ [/^update (.+)$/u, (target) => `更新 ${target}`],
596
+ [/^uninstall rmdir (.+)$/u, (target) => `删除空目录 ${target}`],
597
+ [/^uninstall (.+)$/u, (target) => `卸载 ${target}`],
598
+ ];
599
+ for (const [pattern, render] of patterns) {
600
+ const match = action.match(pattern);
601
+ if (match)
602
+ return render(...match.slice(1));
603
+ }
604
+ return "执行由 SuperSpec 管理的文件操作";
605
+ }
606
+ export function action_detail_zh(detail) {
607
+ const patterns = [
608
+ [/^existing file backed up to (.+)$/u, (target) => `已有文件已备份到 ${target}。`],
609
+ [/^pre-existing file with different content kept; rerun with --force to overwrite \(backs up \*\.bak\)$/u, () => "已有不同内容文件已保留;如需覆盖,请使用 --force,覆盖前会备份为 *.bak。"],
610
+ [/^preexisting file is never touched$/u, () => "既有文件不会被改动。"],
611
+ [/^user-modified file kept; new version written to (.+)$/u, (target) => `已保留用户修改版本;新版本写入 ${target}。`],
612
+ [/^managed file no longer shipped$/u, () => "该文件在当前版本中已不再分发。"],
613
+ [/^no longer shipped but user-modified; kept$/u, () => "该文件在当前版本中已不再分发,但因存在用户修改而被保留。"],
614
+ [/^preexisting\/unmanaged file is never touched$/u, () => "既有文件或非 SuperSpec 管理的文件不会被改动。"],
615
+ [/^already absent$/u, () => "该文件原本就不存在。"],
616
+ [/^user-modified since install; kept$/u, () => "该文件在安装后已被用户修改,因此会被保留。"],
617
+ ];
618
+ for (const [pattern, render] of patterns) {
619
+ const match = detail.match(pattern);
620
+ if (match)
621
+ return render(...match.slice(1));
622
+ }
623
+ return hasHan(detail) ? detail : system_failure_zh(detail, "该操作包含补充说明,请结合当前阶段与相关证据一起查看。");
624
+ }
625
+ export function system_failure_zh(raw, fallback = "命令执行失败,请查看终端日志后重试。") {
626
+ const text = raw.trim();
627
+ if (!text)
628
+ return fallback;
629
+ if (hasHan(text))
630
+ return text;
631
+ if (/permission denied/i.test(text))
632
+ return "权限不足,请检查当前用户是否有权限执行该命令。";
633
+ if (/command not found|is not recognized/i.test(text))
634
+ return "系统未找到需要的命令,请确认相关工具已安装并已加入 PATH。";
635
+ if (/no such file or directory/i.test(text))
636
+ return "找不到需要的文件或目录,请确认路径和安装环境是否正确。";
637
+ if (/timed out|timeout/i.test(text))
638
+ return "命令执行超时,请稍后重试。";
639
+ if (/network|econn|enotfound|fetch failed|connection refused|connection reset/i.test(text)) {
640
+ return "网络访问失败,请检查网络连接后重试。";
641
+ }
642
+ const exit = text.match(/\bexit status\s+([0-9]+)/i);
643
+ if (exit)
644
+ return `命令执行失败(退出状态码 ${exit[1]})。`;
645
+ return fallback;
646
+ }
647
+ export function workflow_terms_zh_for(command, _gate, reasonCodes) {
648
+ const keys = new Set();
649
+ if (command === "check-enter")
650
+ keys.add("check-enter");
651
+ if (reasonCodes.some((code) => code === "needs_user_decision_pending" || code === "missing_review_digest" || code === "user_decision_unbound")) {
652
+ keys.add("main_review_digest");
653
+ keys.add("user_review_decision");
654
+ keys.add("acceptance");
655
+ }
656
+ if (reasonCodes.includes("missing_characterization"))
657
+ keys.add("characterization");
658
+ return [...keys].map((key) => WORKFLOW_TERMS_ZH[key]).filter(Boolean);
659
+ }