@fenglimg/fabric-shared 2.0.0-rc.8 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,958 +0,0 @@
1
- // src/i18n/locales/en.ts
2
- var enMessages = {
3
- "cli.main.description": "Fabric CLI - AI agent collaboration framework",
4
- "cli.shared.created": "Created",
5
- "cli.shared.skipped": "Skipped",
6
- "cli.shared.next": "Next",
7
- "cli.shared.reason": "Reason",
8
- "cli.shared.updated": "Updated",
9
- "cli.shared.missing": "missing",
10
- "cli.shared.present": "present",
11
- "cli.shared.absent": "missing",
12
- "cli.shared.yes": "yes",
13
- "cli.shared.no": "no",
14
- "cli.shared.none": "none",
15
- "cli.shared.loading": "loading",
16
- "cli.shared.refresh": "Refresh",
17
- "cli.shared.target-invalid": "Target must be an existing directory: {target}",
18
- "cli.shared.template-not-found": "Template not found: {path}",
19
- "cli.shared.invalid-host-empty": "Invalid host: <empty>",
20
- "cli.shared.invalid-port": "Invalid port: {value}",
21
- "cli.approve.description": "Approve drifted human-lock entries from the command line.",
22
- "cli.approve.args.all.description": "Approve all drifted human-lock entries without prompting.",
23
- "cli.approve.args.interactive.description": "Prompt before approving each drifted human-lock entry.",
24
- "cli.approve.args.target.description": "Target project path, default is the current working directory.",
25
- "cli.approve.no-drift": "No drift entries found.",
26
- "cli.approve.prompt": "Approve this entry? [y/N] ",
27
- "cli.approve.approved-one": "Approved {location}",
28
- "cli.approve.skipped-one": "Skipped {location}",
29
- "cli.approve.summary": "Approved {approved}/{total} drift entries. Skipped {skipped}.",
30
- "cli.approve.table.expected": "Expected",
31
- "cli.approve.table.current": "Current",
32
- "cli.bootstrap.description": "Install Fabric bootstrap prompts for supported AI clients.",
33
- "cli.bootstrap.install.description": "Copy Fabric bootstrap templates into native client locations.",
34
- "cli.bootstrap.install.args.clients.description": "Optional comma-separated client filter, for example claude,cursor,codex.",
35
- "cli.bootstrap.install.no-targets": "No bootstrap targets detected. Pass --clients claude,cursor,codex to install explicitly.",
36
- "cli.bootstrap.install.installed": "Installed {path}",
37
- "cli.bootstrap.install.skipped-header": "Skipped {path}: Fabric Bootstrap header already present.",
38
- "cli.bootstrap.install.prepended": "Prepended {path}",
39
- "cli.bootstrap.errors.unknown-client": 'Unknown client "{client}". Use a comma-separated list such as claude,cursor,codex.',
40
- "cli.config.description": "Manage Fabric MCP client configuration.",
41
- "cli.config.clients.claude": "Claude Code CLI",
42
- "cli.config.install.description": "Install Fabric MCP server entries into detected client configs.",
43
- "cli.config.install.args.clients.description": "Optional comma-separated client filter, for example cursor,codex.",
44
- "cli.config.install.args.dry-run.description": "Preview detected write operations without modifying files.",
45
- "cli.config.errors.unknown-client": 'Unknown client "{client}". Use a comma-separated list such as cursor,codex.',
46
- "cli.config.errors.expected-object": "Expected object in {path}",
47
- "cli.config.install.no-configs": "No Fabric MCP client config detected. Create the client directory or set clientPaths in fabric.config.json.",
48
- "cli.config.install.no-config-path": "Skipping {client}: no config path detected.",
49
- "cli.config.install.dry-run": "[dry-run] {client}: would write {path}",
50
- "cli.config.install.wrote": "{client}: wrote {path}",
51
- "cli.doctor.description": "Run Fabric target-state diagnostics.",
52
- "doctor.section.fixable": "Fixable errors:",
53
- "doctor.section.manual": "Manual errors:",
54
- "doctor.section.warnings": "Warnings:",
55
- "doctor.section.apply-lint-mutations": "Apply-lint mutations:",
56
- "cli.doctor.args.target.description": "Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.",
57
- "cli.doctor.args.fix.description": "Repair deterministic derived Fabric state, including meta, knowledge-test index, bootstrap, and events ledger.",
58
- "cli.doctor.args.json.description": "Print the doctor report as JSON.",
59
- "cli.doctor.args.strict.description": "Treat warnings as failures.",
60
- "cli.doctor.args.force.description": "Run even if a serve process appears to hold the lock.",
61
- "cli.doctor.args.apply-lint.description": "Apply lint mutations: demote orphaned canonical entries, archive stale drafts, and bump drifted index counters. Emits knowledge_demoted / knowledge_archived events. Default doctor invocation remains report-only.",
62
- "cli.doctor.args.yes.description": "Skip the --apply-lint safety confirm. Required for non-tty invocations unless FABRIC_NONINTERACTIVE=1 is set in the environment.",
63
- "cli.doctor.errors.apply-lint-fix-mutually-exclusive": "--apply-lint and --fix cannot be combined. --apply-lint mutates user knowledge state (demote/archive); --fix repairs derived state (meta/index). Run them separately.",
64
- "cli.hooks.description": "Manage Fabric Git hook templates.",
65
- "cli.hooks.install.description": "Install the Fabric Husky pre-commit hook template.",
66
- "cli.hooks.install.args.target.description": "Target project path, default is the current working directory.",
67
- "cli.hooks.errors.package-json-required": "package.json is required to install hooks: {path}",
68
- "cli.hooks.install.hook-skipped": "Fabric hook already present in {path}, skipped.",
69
- "cli.hooks.install.hook-appended": "Appended Fabric hook to existing {path}",
70
- "cli.hooks.install.hook-created": "Created {path}",
71
- "cli.hooks.install.prepare-left": "Left existing prepare script unchanged in {path}",
72
- "cli.hooks.install.prepare-added": "Added prepare script to {path}",
73
- "cli.human-lint.description": "Validate locked human-edit regions.",
74
- "cli.human-lint.args.target.description": "Target project path, default is the current working directory.",
75
- "cli.human-lint.drift-detected": "Human-locked content drift detected. Revert the edit or update approved hashes before committing.",
76
- "cli.human-lint.table.location": "Location",
77
- "cli.human-lint.table.expected": "Expected",
78
- "cli.human-lint.table.got": "Got",
79
- "cli.init.description": "Initialize Fabric in the target project.",
80
- "cli.init.args.target.description": "Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.",
81
- "cli.init.args.debug.description": "Print target resolution details to stderr.",
82
- "cli.init.args.force.description": "Overwrite existing files (bypass non-destructive guard)",
83
- "cli.init.args.yes.description": "Accept the current init plan and run without the TTY wizard",
84
- "cli.init.args.plan.description": "Print the init plan without writing files or running follow-up stages",
85
- "cli.init.args.reapply.description": "Reapply Fabric-managed files and stage installers over an existing setup",
86
- "cli.init.args.no-bootstrap.description": "Compatibility flag: remove bootstrap from the init plan",
87
- "cli.init.args.no-mcp.description": "Compatibility flag: remove MCP configuration from the init plan",
88
- "cli.init.args.no-hooks.description": "Compatibility flag: remove git hooks from the init plan",
89
- "cli.init.args.interactive.description": "Compatibility flag: disable the TTY wizard and use direct execution",
90
- "cli.init.mcp.install.global": "Using globally-installed @fenglimg/fabric-server",
91
- "cli.init.mcp.install.local": "Installing @fenglimg/fabric-server to project devDependencies",
92
- "cli.init.mcp.install.prompt": "MCP server install scope (global|local)",
93
- "cli.init.mcp.install.invalid": 'Invalid --mcp-install value "{value}" \u2014 falling back to global',
94
- "cli.init.mcp.local.installing": "Running {manager} add -D @fenglimg/fabric-server...",
95
- "cli.init.mcp.local.installed": "Installed to devDependencies",
96
- "cli.init.mcp.scope.description": "Claude MCP config scope: project (writes .mcp.json) or user (writes ~/.claude.json)",
97
- "cli.init.mcp.scope.invalid": 'Invalid --scope value "{value}" \u2014 falling back to project',
98
- "cli.init.mcp.scope.project": "Writes .mcp.json in project root (per Claude Code spec)",
99
- "cli.init.mcp.scope.user": "Writes ~/.claude.json (user-scoped, applies to all projects)",
100
- "cli.init.wizard.mcp-scope": "Claude MCP config scope (project/.mcp.json or user/~/.claude.json) [{defaultValue}]",
101
- "cli.init.created-path": "{label} {path}",
102
- "cli.init.skipped-existing-path": "{label} {path}: already exists.",
103
- "cli.init.force.overwritten": "Overwritten",
104
- "cli.init.force.warning": "--force will overwrite existing Fabric artifacts in {path}",
105
- "cli.init.stages.bootstrap": "Installing bootstrap templates...",
106
- "cli.init.stages.mcp": "Configuring MCP clients...",
107
- "cli.init.stages.hooks": "Installing git hooks...",
108
- "cli.init.stages.skipped": "skipped",
109
- "cli.init.stages.completed": "completed",
110
- "cli.init.stages.failed": "failed",
111
- "cli.init.stages.summary.ran": "ran",
112
- "cli.init.stages.summary.skipped": "skipped",
113
- "cli.init.stages.summary.failed": "failed",
114
- "cli.init.next-step": "{label} {message}",
115
- "cli.init.reason-message": "{label} {message}",
116
- "cli.init.plan.title": "Fabric init plan",
117
- "cli.init.plan.mode-banner.default": "[mode: apply] Standard init execution",
118
- "cli.init.plan.mode-banner.plan": "[mode: plan] Dry run only, no files will be written",
119
- "cli.init.plan.mode-banner.reapply": "[mode: reapply] Force reapplying Fabric-managed assets",
120
- "cli.init.plan.mode-banner.plan-reapply": "[mode: plan+reapply] Previewing a forced reapply without writing files",
121
- "cli.init.plan.target": "Target: {target}",
122
- "cli.init.plan.actions": "Plan: bootstrap={bootstrap} mcp={mcp} hooks={hooks} mcp-install={mcpInstall}",
123
- "cli.init.plan.detected": "Detected clients: {clients}",
124
- "cli.init.plan.writes": "Core writes:",
125
- "cli.init.plan.preview-title": "Fabric init dry run",
126
- "cli.init.plan.preview-result": "Mode={mode} bootstrap={bootstrap} mcp={mcp} hooks={hooks}",
127
- "cli.init.mode.default": "default",
128
- "cli.init.mode.reapply": "reapply",
129
- "cli.init.mode.badge.default": "APPLY",
130
- "cli.init.mode.badge.plan": "PLAN",
131
- "cli.init.mode.badge.reapply": "REAPPLY",
132
- "cli.init.mode.badge.plan-reapply": "PLAN + REAPPLY",
133
- "cli.init.compat.plan": "Using standard --plan mode: no files will be written.",
134
- "cli.init.compat.interactive": "Compatibility: --interactive=false disables the TTY wizard.",
135
- "cli.init.compat.legacy-stage-flags": "Compatibility: legacy --no-* flags are being mapped into the init plan.",
136
- "cli.init.wizard.title": "Fabric init wizard",
137
- "cli.init.wizard.intro": "Fabric init",
138
- "cli.init.wizard.overview.title": "Install overview",
139
- "cli.init.wizard.overview.body": "Target: {target}\nMode: {mode}\nThis wizard only reshapes the init plan; execution still runs through the existing Fabric init stages.",
140
- "cli.init.wizard.step.target": "Confirm target",
141
- "cli.init.wizard.step.plan": "Shape init plan",
142
- "cli.init.wizard.step.review": "Review final plan",
143
- "cli.init.wizard.target.confirm": "Continue initializing Fabric in {target}? [Y/n]",
144
- "cli.init.wizard.stage.bootstrap": "Install bootstrap templates? [{defaultValue}]",
145
- "cli.init.wizard.stage.mcp": "Configure MCP clients? [{defaultValue}]",
146
- "cli.init.wizard.stage.hooks": "Install git hooks? [{defaultValue}]",
147
- "cli.init.wizard.mcp-install": "MCP server install scope (global/local) [{defaultValue}]",
148
- "cli.init.wizard.execute.confirm": "Execute this init plan now? [Y/n]",
149
- "cli.init.wizard.outro": "Init plan accepted. Running Fabric init...",
150
- "cli.init.wizard.invalid-yes-no": "Please answer yes or no.",
151
- "cli.init.wizard.invalid-select": "Invalid value. Use one of: {options}.",
152
- "cli.init.wizard.cancelled": "Fabric init cancelled before execution.",
153
- "cli.init.capabilities.title": "Client capability summary",
154
- "cli.init.capabilities.none": "No supported client was detected for bootstrap or MCP follow-up.",
155
- "cli.init.capabilities.header.client": "Client",
156
- "cli.init.capabilities.header.bootstrap": "Bootstrap",
157
- "cli.init.capabilities.header.mcp": "MCP",
158
- "cli.init.capabilities.header.hook": "Hook",
159
- "cli.init.capabilities.header.skill": "Skill",
160
- "cli.init.capabilities.header.follow-up": "Follow-up",
161
- "cli.init.capabilities.status.ready": "ready",
162
- "cli.init.capabilities.status.installed": "installed",
163
- "cli.init.capabilities.status.supported": "supported",
164
- "cli.init.capabilities.status.manual": "manual",
165
- "cli.init.capabilities.status.skipped": "skipped",
166
- "cli.init.capabilities.status.failed": "failed",
167
- "cli.init.capabilities.status.na": "n/a",
168
- "cli.init.capabilities.follow-up.ready": "continue in client",
169
- "cli.init.capabilities.follow-up.install": "install client assets",
170
- "cli.init.capabilities.follow-up.manual": "manual step required",
171
- "cli.init.next-step.message": "run fab hooks install to add the Day 4 pre-commit pipeline.",
172
- "cli.init.reason-message.installable-body": ".fabric/forensic.json is ready; some detected clients support Fabric follow-up but still need client assets installed.",
173
- "cli.init.reason-message.manual-body": ".fabric/forensic.json is ready; some detected clients still need manual follow-up because no Fabric skill is installed for them yet.",
174
- "cli.init.codex-hooks.created": "{label} {path} with Codex hooks config (requires features.codex_hooks = true).",
175
- "cli.init.codex-hooks.updated": "{label} {path} with Codex hooks config (requires features.codex_hooks = true).",
176
- "cli.init.codex-hooks.skipped": "{label} {path}: Codex hooks config already present.",
177
- "cli.init.claude-settings.created": "{label} {path} with Claude Stop hook.",
178
- "cli.init.claude-settings.updated": "{label} {path} with Claude Stop hook.",
179
- "cli.init.claude-settings.skipped": "{label} {path}: Claude Stop hook already present.",
180
- "cli.init.claude-settings.skipped-invalid": "{label} {path}: unable to merge Claude Stop hook.",
181
- "cli.init.claude-settings.invalid-object": "{label} {path}: expected a JSON object.",
182
- "cli.init.claude-settings.invalid-json": "{label} {path}: invalid JSON ({reason}).",
183
- "cli.init.claude-settings.invalid-hooks": '{label} {path}: "hooks" must be a JSON object.',
184
- "cli.init.claude-settings.invalid-stop-array": '{label} {path}: "hooks.Stop" must be an array.',
185
- "cli.init.errors.abort-existing": "ABORT: {path} already exists. fab init is non-destructive.",
186
- "cli.ledger-append.description": "Append an entry to the Fabric intent ledger.",
187
- "cli.ledger-append.args.target.description": "Target project path, default is the current working directory.",
188
- "cli.ledger-append.args.staged.description": "Derive the entry from staged changes (used during pre-commit).",
189
- "cli.ledger-append.requires-staged": "requires --staged in pre-commit context",
190
- "cli.ledger-append.intent.auto": "auto: {head}{suffix}",
191
- "cli.ledger-append.intent.auto-more": " +{count} more",
192
- "cli.pre-commit.description": "Composite pre-commit hook: runs sync-meta --check-only, human-lint, and ledger-append --staged in one Node process.",
193
- "cli.pre-commit.args.target.description": "Project root directory, defaults to cwd or EXTERNAL_FIXTURE_PATH.",
194
- "cli.pre-commit.run-failed": "fabric pre-commit: {name} failed - {message}",
195
- "cli.scan.description": "Scan the project to detect Fabric bootstrap candidates.",
196
- "cli.scan.args.target.description": "Target absolute path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.",
197
- "cli.scan.args.debug.description": "Print detection evidence in formatted output.",
198
- "cli.scan.args.json.description": "Print the diagnostic report as JSON.",
199
- "cli.scan.error.missing-forensic": "forensic.json not found at {path}; run `fabric init` first to produce the deterministic project snapshot.",
200
- "cli.scan.summary.created": "Wrote {count} knowledge entries to .fabric/knowledge/.",
201
- "cli.scan.summary.skipped": "No changes detected; {count} entries already up-to-date.",
202
- "cli.scan.report.title": "Fabric scan report",
203
- "cli.scan.report.target": "Target",
204
- "cli.scan.report.framework": "Framework",
205
- "cli.scan.report.evidence": "Evidence",
206
- "cli.scan.report.readme-quality": "README quality",
207
- "cli.scan.report.contributing": "CONTRIBUTING.md",
208
- "cli.scan.report.files-counted": "Files counted",
209
- "cli.scan.report.ignored-entries": "Ignored entries",
210
- "cli.scan.report.existing-fabric": "Existing Fabric files",
211
- "cli.scan.report.recommendations": "Recommendations:",
212
- "cli.scan.readme-quality.ok": "ok",
213
- "cli.scan.readme-quality.stub": "stub",
214
- "cli.scan.recommendation.init": "L0: Run fab init to scaffold .fabric/bootstrap/README.md with TODO markers.",
215
- "cli.scan.recommendation.readme": "L0: Expand README.md before promoting project facts into Fabric references.",
216
- "cli.scan.recommendation.contributing": "L0: Add CONTRIBUTING.md or leave a bootstrap TODO reference for contribution flow.",
217
- "cli.scan.recommendation.unknown-framework": "L1: Add tech-stack TODOs manually because no framework marker was detected.",
218
- "cli.scan.recommendation.framework-dirs": "L1: Review {framework} directories for future scoped Fabric rule files.",
219
- "cli.serve.description": "Start the local Fabric MCP HTTP service. Set FABRIC_AUTH_TOKEN to enable Bearer auth for non-localhost binding.",
220
- "cli.serve.args.port.description": "Listen port, default 7373.",
221
- "cli.serve.args.host.description": "Listen host, default 127.0.0.1. Set FABRIC_AUTH_TOKEN to enable Bearer auth for non-localhost binding.",
222
- "cli.serve.args.target.description": "Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.",
223
- "cli.serve.args.debug.description": "Print target resolution details to stderr.",
224
- "cli.serve.args.force.description": "Force-acquire the serve lock even if another serve process appears to be running.",
225
- "cli.serve.ready.title": "Fabric Dashboard",
226
- "cli.serve.warning.host-fallback": "--host {host} requires FABRIC_AUTH_TOKEN; falling back to 127.0.0.1 for safety",
227
- "cli.serve.error.port-in-use": "Port {port} in use - try --port {nextPort}",
228
- "cli.update.description": "Refresh MCP host configuration and git hooks without re-creating Fabric files.",
229
- "cli.update.args.target.description": "Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.",
230
- "cli.update.args.no-mcp.description": "Skip re-configuring MCP clients",
231
- "cli.update.args.no-hooks.description": "Skip re-installing git hooks",
232
- "cli.sync-meta.description": "Sync Fabric metadata from internal rule files.",
233
- "cli.sync-meta.args.target.description": "Target project path, default is the current working directory.",
234
- "cli.sync-meta.args.check-only.description": "Exit with code 1 when .fabric/agents.meta.json is out of date.",
235
- "cli.sync-meta.drift-detected": "Fabric metadata drift detected. Run fab sync-meta to update.",
236
- "cli.sync-meta.updated": "{label} {path}",
237
- "dashboard.app.nav.aria-label": "Dashboard views",
238
- "dashboard.app.nav.readiness.label": "Readiness",
239
- "dashboard.app.nav.readiness.label-bilingual": "\u51C6\u5907\u60C5\u51B5 Readiness",
240
- "dashboard.app.nav.readiness.subtitle": "project status",
241
- "dashboard.app.nav.rules-explain.label": "Rules Explain",
242
- "dashboard.app.nav.rules-explain.label-bilingual": "\u89C4\u5219\u89E3\u6790 Rules Explain",
243
- "dashboard.app.nav.rules-explain.subtitle": "topology & context",
244
- "dashboard.app.nav.timeline.label": "Timeline",
245
- "dashboard.app.nav.timeline.label-bilingual": "\u65F6\u95F4\u7EBF Timeline",
246
- "dashboard.app.nav.timeline.subtitle": "audit & history",
247
- "dashboard.app.nav.health.label": "Health",
248
- "dashboard.app.nav.health.label-bilingual": "\u7CFB\u7EDF\u5065\u5EB7 Health",
249
- "dashboard.app.nav.health.subtitle": "doctor & diagnostics",
250
- "dashboard.app.nav.section.insights": "Insights",
251
- "dashboard.app.nav.drift-check": "Drift Check",
252
- "dashboard.app.nav.modules.read-only": "read-only dashboard",
253
- "dashboard.app.header.connected": "CONNECTED",
254
- "dashboard.app.header.connecting": "CONNECTING",
255
- "dashboard.app.live-region.received": "Received {type}",
256
- "dashboard.app.breadcrumb.readiness": "readiness",
257
- "dashboard.app.breadcrumb.rules-explain": "rules-explain",
258
- "dashboard.app.breadcrumb.timeline": "timeline",
259
- "dashboard.app.breadcrumb.health": "health",
260
- "dashboard.rule-topology.title": "Rule Topology",
261
- "dashboard.rule-topology.subtitle": "See which rules match the current path and why",
262
- "dashboard.rule-topology.path.placeholder": "Sample path for rules context",
263
- "dashboard.rule-topology.path.aria-label": "Rules context sample path",
264
- "dashboard.rule-topology.status.sample": "current path {path}",
265
- "dashboard.rule-topology.status.hits": "{count} hits",
266
- "dashboard.rule-topology.status.revision": "version {revision}",
267
- "dashboard.rule-topology.heatmap.title": "Coverage Heatmap",
268
- "dashboard.rule-topology.heatmap.subtitle": "Heuristic directory coverage derived from scope_glob patterns",
269
- "dashboard.rule-topology.heatmap.aria-label": "Directory coverage heatmap",
270
- "dashboard.rule-topology.heatmap.count": "{count} directories",
271
- "dashboard.rule-topology.heatmap.rules": "{count} rules",
272
- "dashboard.rule-topology.heatmap.uncovered": "no matching scope",
273
- "dashboard.rule-topology.heatmap.empty": "No rule directories available.",
274
- "dashboard.rule-topology.heatmap.density.full": "covered",
275
- "dashboard.rule-topology.heatmap.density.partial": "partial",
276
- "dashboard.rule-topology.heatmap.density.none": "uncovered",
277
- "dashboard.rule-topology.hit-reason.title": "Hit Reasons",
278
- "dashboard.rule-topology.hit-reason.subtitle": "Why each rule was loaded for the current sample path",
279
- "dashboard.rule-topology.hit-reason.aria-label": "Rule hit reasons",
280
- "dashboard.rule-topology.hit-reason.count": "{count} reasons",
281
- "dashboard.rule-topology.hit-reason.empty": "No rules loaded for this sample path.",
282
- "dashboard.rule-topology.hit-reason.global": "Global",
283
- "dashboard.rule-topology.hit-reason.tier.always": "Always-on",
284
- "dashboard.rule-topology.hit-reason.tier.path": "Glob",
285
- "dashboard.rule-topology.hit-reason.tier.description": "Description",
286
- "dashboard.module-placeholder.coming-soon": "Reserved",
287
- "dashboard.module-placeholder.read-only": "Reserved for future read-only dashboard capabilities.",
288
- "dashboard.module-placeholder.forensic.title": "Cognitive Forensic",
289
- "dashboard.module-placeholder.forensic.subtitle": "Coming later",
290
- "dashboard.module-placeholder.semantic.title": "Semantic Timeline",
291
- "dashboard.module-placeholder.semantic.subtitle": "Coming later",
292
- "dashboard.module-placeholder.ledger.title": "Historical Ledger",
293
- "dashboard.module-placeholder.ledger.subtitle": "Coming later",
294
- "dashboard.rules-tree.title": "Rules Tree",
295
- "dashboard.rules-tree.subtitle": "Browse the rule structure, hierarchy, and sync state from .fabric/agents.meta.json",
296
- "dashboard.rules-tree.filter.placeholder": "Filter by file, glob, priority, hash...",
297
- "dashboard.rules-tree.filter.aria-label": "Filter rules tree",
298
- "dashboard.rules-tree.status.loading": "loading rules",
299
- "dashboard.rules-tree.status.nodes": "{count} nodes \xB7 version {revision}",
300
- "dashboard.rules-tree.status.locks": "{count} protected regions",
301
- "dashboard.rules-tree.empty": "No matching rules found.",
302
- "dashboard.rules-tree.tree.aria-label": "Fabric rules tree",
303
- "dashboard.rules-tree.detail.title": "Node Detail",
304
- "dashboard.rules-tree.detail.empty": "Select a rule node to inspect scope, dependencies, priority and hash.",
305
- "dashboard.rules-tree.detail.file": "file",
306
- "dashboard.rules-tree.detail.scope": "scope",
307
- "dashboard.rules-tree.detail.priority": "priority",
308
- "dashboard.rules-tree.detail.hash": "hash",
309
- "dashboard.rules-tree.detail.no-deps": "no deps",
310
- "dashboard.human-lock.title": "Human Protection",
311
- "dashboard.human-lock.subtitle": "Review protected regions that require human confirmation",
312
- "dashboard.human-lock.filters.aria-label": "Human lock filters",
313
- "dashboard.human-lock.filters.all": "all",
314
- "dashboard.human-lock.filters.drift": "drift",
315
- "dashboard.human-lock.filters.approved": "approved",
316
- "dashboard.human-lock.summary": "{drift} drift \xB7 {approved} confirmed",
317
- "dashboard.human-lock.empty": "No human lock entries for this filter.",
318
- "dashboard.intent-timeline.title": "Intent Timeline",
319
- "dashboard.intent-timeline.subtitle": "Review AI and human change records in reverse chronological order",
320
- "dashboard.intent-timeline.filter.label": "Source",
321
- "dashboard.intent-timeline.filter.all": "All",
322
- "dashboard.intent-timeline.summary": "AI {aiCount} \xB7 Human {humanCount}",
323
- "dashboard.intent-timeline.columns.ai.title": "AI",
324
- "dashboard.intent-timeline.columns.ai.entries": "{count} entries",
325
- "dashboard.intent-timeline.columns.human.title": "Human",
326
- "dashboard.intent-timeline.columns.human.entries": "{count} entries",
327
- "dashboard.intent-timeline.empty": "No ledger entries found.",
328
- "dashboard.intent-timeline.annotate.missing-id": "Cannot annotate a ledger entry without an id.",
329
- "dashboard.history-replay.title": "History Replay",
330
- "dashboard.history-replay.subtitle": "Review the rules tree state at any recorded point in history",
331
- "dashboard.history-replay.toolbar.scrub": "Scrub",
332
- "dashboard.history-replay.toolbar.latest": "Latest",
333
- "dashboard.history-replay.selected.none": "No historical entry selected",
334
- "dashboard.history-replay.status.replay-points": "{count} replay points",
335
- "dashboard.history-replay.status.entries-applied": "{count} entries applied",
336
- "dashboard.history-replay.empty.entries": "No ledger entries found for replay.",
337
- "dashboard.history-replay.state.title": "Viewing state as of {label}",
338
- "dashboard.history-replay.state.meta": "record {ledgerId} \xB7 commit {commit} \xB7 {mode}",
339
- "dashboard.history-replay.status.loading": "loading snapshot",
340
- "dashboard.history-replay.status.nodes": "{count} nodes",
341
- "dashboard.history-replay.status.unknown-revision": "unknown version",
342
- "dashboard.history-replay.tree.aria-label": "Historical Fabric rules tree",
343
- "dashboard.history-replay.empty.loading": "Loading historical snapshot...",
344
- "dashboard.history-replay.empty.select": "Select a timeline entry to replay its state.",
345
- "dashboard.history-replay.meta.not-available": "unavailable",
346
- "dashboard.history-replay.meta.pending": "pending",
347
- "dashboard.history-replay.meta.na": "n/a",
348
- "dashboard.doctor.title": "Doctor Console",
349
- "dashboard.doctor.subtitle": "Check framework, entry points, version drift, and protected paths",
350
- "dashboard.doctor.toolbar.overall": "Overall",
351
- "dashboard.doctor.toolbar.no-summary": "No summary yet",
352
- "dashboard.doctor.toolbar.entry-points-summary": "{framework} \xB7 {count} entry points",
353
- "dashboard.doctor.toolbar.entry-point-summary": "{framework} \xB7 {count} entry point",
354
- "dashboard.doctor.empty.loading": "Loading doctor report...",
355
- "dashboard.doctor.summary.framework": "Framework",
356
- "dashboard.doctor.summary.protected-paths": "Protected paths",
357
- "dashboard.doctor.summary.intent-ledger": "Intent ledger",
358
- "dashboard.doctor.summary.no-meta-revision": "No metadata version yet",
359
- "dashboard.doctor.summary.tracked-paths.none": "No tracked paths",
360
- "dashboard.doctor.summary.tracked-paths.some": "{count} tracked",
361
- "dashboard.doctor.summary.hashes-intact": "All approved hashes intact",
362
- "dashboard.doctor.summary.drifted": "{count} drifted",
363
- "dashboard.doctor.summary.no-ledger-entries": "No ledger entries yet",
364
- "dashboard.doctor.card.entry-points": "Entry points",
365
- "dashboard.doctor.card.checks": "Checks",
366
- "dashboard.doctor.empty.entry-points": "No current entry points detected.",
367
- "dashboard.doctor.framework.unknown": "unknown",
368
- "dashboard.doctor.age.none": "No entries",
369
- "dashboard.doctor.age.seconds": "{count}s ago",
370
- "dashboard.doctor.age.minutes": "{count}m ago",
371
- "dashboard.doctor.age.hours": "{count}h ago",
372
- "dashboard.doctor.age.days": "{count}d ago",
373
- "dashboard.doctor.age.weeks": "{count}w ago",
374
- "dashboard.shared.refresh": "Refresh",
375
- "dashboard.shared.loading": "loading",
376
- "dashboard.shared.status.ok": "ok",
377
- "dashboard.shared.status.warn": "warn",
378
- "dashboard.shared.status.error": "error",
379
- "dashboard.shared.status.confirmed": "confirmed",
380
- "dashboard.shared.status.hash-drift": "hash drift",
381
- "dashboard.shared.status.stale": "stale",
382
- "dashboard.shared.status.orphan": "orphan",
383
- "dashboard.shared.status.attention": "attention",
384
- "dashboard.source.ai": "AI",
385
- "dashboard.source.human": "Human",
386
- "dashboard.timeline-entry.aria-label": "{source} intent {intent}",
387
- "dashboard.timeline-entry.working-tree": "working tree",
388
- "dashboard.timeline-entry.parent": "parent {parent}",
389
- "dashboard.timeline-entry.paths": "paths",
390
- "dashboard.timeline-entry.annotate": "Annotate",
391
- "dashboard.timeline-entry.annotation-label": "Human annotation",
392
- "dashboard.timeline-entry.annotation-placeholder": "Explain review outcome or approval context...",
393
- "dashboard.timeline-entry.annotation-save": "Save annotation",
394
- "dashboard.tree-node.locked": "locked",
395
- "dashboard.tree-node.stale.hash-mismatch": "hash mismatch",
396
- "dashboard.tree-node.stale.orphan": "orphan",
397
- "dashboard.lock-card.aria-label": "{file} {lineRange} {status}",
398
- "dashboard.lock-card.status.drift": "hash drift",
399
- "dashboard.lock-card.status.confirmed": "confirmed",
400
- "dashboard.lock-card.hash.locked": "locked hash",
401
- "dashboard.lock-card.hash.current": "current hash",
402
- "dashboard.lock-card.hash.diff": "diff",
403
- "dashboard.lock-card.preview.drift": "DRIFT",
404
- "dashboard.lock-card.preview.sync": "SYNC",
405
- "dashboard.lock-card.preview.drift-detail": "Hash differs from protected region.",
406
- "dashboard.lock-card.preview.sync-detail": "Protected region is in sync.",
407
- "dashboard.lock-card.footer.region": "protected region \xB7 {count} lines",
408
- "dashboard.lock-card.button.approve": "Approve new hash",
409
- "dashboard.lock-card.button.confirmed": "Confirmed",
410
- "dashboard.lock-card.diff.hash-mismatch": "hash mismatch",
411
- "dashboard.lock-card.diff.no-changes": "no changes",
412
- "dashboard.lock-card.diff.with-bytes": "+{added} / -{removed} \xB7 {bytes} bytes",
413
- "dashboard.lock-card.diff.without-bytes": "+{added} / -{removed}",
414
- "dashboard.approve-button.retry": "Retry",
415
- "dashboard.readiness.filter.analysis": "Project Analysis",
416
- "dashboard.readiness.loading": "Loading scan data...",
417
- "dashboard.readiness.summary.framework": "Framework",
418
- "dashboard.readiness.summary.files": "Files",
419
- "dashboard.readiness.summary.status": "Fabric Status",
420
- "dashboard.readiness.card.evidence": "Readiness Evidence",
421
- "dashboard.readiness.card.recommendations": "Recommendations & Next Steps",
422
- "dashboard.readiness.readme.description": "Quality of project documentation",
423
- "dashboard.readiness.contributing.description": "Contribution guidelines for AI/Human",
424
- "dashboard.readiness.fully-ready": "Project is fully ready.",
425
- "dashboard.readiness.init-prompt": "Run this command to initialize:",
426
- "dashboard.rules-explain.analyze": "Analyze Path",
427
- "dashboard.rules-explain.detail.topology-type": "Topology Type",
428
- "dashboard.timeline.history-replay.title": "History Replay",
429
- "dashboard.timeline.close": "Close",
430
- "dashboard.health.ledger-path.label": "Event Ledger Path",
431
- "dashboard.health.ledger-path.detail": "Append-only timeline source",
432
- "dashboard.health.boundary.title": "Control Plane Boundaries",
433
- "dashboard.health.boundary.description": "The Web Dashboard operates as a Viewer. All rules, metadata, and fixes must be managed via the CLI.",
434
- "dashboard.health.boundary.cli-action": "CLI Action Required:",
435
- "dashboard.health.boundary.cli-prompt": "You have {count} fixable issues. Run the following command in your terminal to repair metadata automatically.",
436
- "dashboard.health.runtime.connected": "MCP Runtime Connected",
437
- "dashboard.health.runtime.disconnected": "MCP Runtime Disconnected"
438
- };
439
-
440
- // src/i18n/locales/zh-CN.ts
441
- var zhCNMessages = {
442
- "cli.main.description": "Fabric CLI - AI \u667A\u80FD\u4F53\u534F\u4F5C\u6846\u67B6",
443
- "cli.shared.created": "\u5DF2\u521B\u5EFA",
444
- "cli.shared.skipped": "\u5DF2\u8DF3\u8FC7",
445
- "cli.shared.next": "\u4E0B\u4E00\u6B65",
446
- "cli.shared.reason": "\u539F\u56E0",
447
- "cli.shared.updated": "\u5DF2\u66F4\u65B0",
448
- "cli.shared.missing": "\u7F3A\u5931",
449
- "cli.shared.present": "\u5B58\u5728",
450
- "cli.shared.absent": "\u7F3A\u5931",
451
- "cli.shared.yes": "\u662F",
452
- "cli.shared.no": "\u5426",
453
- "cli.shared.none": "\u65E0",
454
- "cli.shared.loading": "\u52A0\u8F7D\u4E2D",
455
- "cli.shared.refresh": "\u5237\u65B0",
456
- "cli.shared.target-invalid": "\u76EE\u6807\u5FC5\u987B\u662F\u5DF2\u5B58\u5728\u7684\u76EE\u5F55\uFF1A{target}",
457
- "cli.shared.template-not-found": "\u672A\u627E\u5230\u6A21\u677F\uFF1A{path}",
458
- "cli.shared.invalid-host-empty": "\u65E0\u6548 host\uFF1A<empty>",
459
- "cli.shared.invalid-port": "\u65E0\u6548\u7AEF\u53E3\uFF1A{value}",
460
- "cli.approve.description": "\u4ECE\u547D\u4EE4\u884C\u6279\u51C6\u5DF2\u6F02\u79FB\u7684 human-lock \u8BB0\u5F55\u3002",
461
- "cli.approve.args.all.description": "\u4E0D\u63D0\u793A\uFF0C\u6279\u51C6\u6240\u6709\u5DF2\u6F02\u79FB\u7684 human-lock \u8BB0\u5F55\u3002",
462
- "cli.approve.args.interactive.description": "\u9010\u6761\u63D0\u793A\u540E\u6279\u51C6\u5DF2\u6F02\u79FB\u7684 human-lock \u8BB0\u5F55\u3002",
463
- "cli.approve.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
464
- "cli.approve.no-drift": "\u672A\u53D1\u73B0\u6F02\u79FB\u8BB0\u5F55\u3002",
465
- "cli.approve.prompt": "\u6279\u51C6\u6B64\u8BB0\u5F55\uFF1F[y/N] ",
466
- "cli.approve.approved-one": "\u5DF2\u6279\u51C6 {location}",
467
- "cli.approve.skipped-one": "\u5DF2\u8DF3\u8FC7 {location}",
468
- "cli.approve.summary": "\u5DF2\u6279\u51C6 {approved}/{total} \u6761\u6F02\u79FB\u8BB0\u5F55\u3002\u5DF2\u8DF3\u8FC7 {skipped} \u6761\u3002",
469
- "cli.approve.table.expected": "\u9884\u671F",
470
- "cli.approve.table.current": "\u5F53\u524D",
471
- "cli.bootstrap.description": "\u4E3A\u652F\u6301\u7684 AI \u5BA2\u6237\u7AEF\u5B89\u88C5 Fabric \u5F15\u5BFC\u63D0\u793A\u6A21\u677F\u3002",
472
- "cli.bootstrap.install.description": "\u5C06 Fabric \u5F15\u5BFC\u6A21\u677F\u590D\u5236\u5230\u5404\u5BA2\u6237\u7AEF\u7684\u539F\u751F\u4F4D\u7F6E\u3002",
473
- "cli.bootstrap.install.args.clients.description": "\u53EF\u9009\u7684\u9017\u53F7\u5206\u9694\u5BA2\u6237\u7AEF\u8FC7\u6EE4\u5668\uFF0C\u4F8B\u5982 claude,cursor,codex\u3002",
474
- "cli.bootstrap.install.no-targets": "\u672A\u68C0\u6D4B\u5230\u53EF\u5B89\u88C5\u7684 bootstrap \u76EE\u6807\u3002\u53EF\u663E\u5F0F\u4F20\u5165 --clients claude,cursor,codex\u3002",
475
- "cli.bootstrap.install.installed": "\u5DF2\u5B89\u88C5 {path}",
476
- "cli.bootstrap.install.skipped-header": "\u5DF2\u8DF3\u8FC7 {path}\uFF1AFabric Bootstrap \u5934\u90E8\u5DF2\u5B58\u5728\u3002",
477
- "cli.bootstrap.install.prepended": "\u5DF2\u524D\u7F6E\u5199\u5165 {path}",
478
- "cli.bootstrap.errors.unknown-client": "\u672A\u77E5\u5BA2\u6237\u7AEF\u201C{client}\u201D\u3002\u8BF7\u4F7F\u7528\u9017\u53F7\u5206\u9694\u5217\u8868\uFF0C\u4F8B\u5982 claude,cursor,codex\u3002",
479
- "cli.config.description": "\u7BA1\u7406 Fabric MCP \u5BA2\u6237\u7AEF\u914D\u7F6E\u3002",
480
- "cli.config.clients.claude": "Claude Code CLI",
481
- "cli.config.install.description": "\u5C06 Fabric MCP \u670D\u52A1\u7AEF\u6761\u76EE\u5B89\u88C5\u5230\u68C0\u6D4B\u5230\u7684\u5BA2\u6237\u7AEF\u914D\u7F6E\u4E2D\u3002",
482
- "cli.config.install.args.clients.description": "\u53EF\u9009\u7684\u9017\u53F7\u5206\u9694\u5BA2\u6237\u7AEF\u8FC7\u6EE4\u5668\uFF0C\u4F8B\u5982 cursor,codex\u3002",
483
- "cli.config.install.args.dry-run.description": "\u4EC5\u9884\u89C8\u5C06\u8981\u53D1\u751F\u7684\u5199\u5165\u64CD\u4F5C\uFF0C\u4E0D\u4FEE\u6539\u6587\u4EF6\u3002",
484
- "cli.config.errors.unknown-client": "\u672A\u77E5\u5BA2\u6237\u7AEF\u201C{client}\u201D\u3002\u8BF7\u4F7F\u7528\u9017\u53F7\u5206\u9694\u5217\u8868\uFF0C\u4F8B\u5982 cursor,codex\u3002",
485
- "cli.config.errors.expected-object": "{path} \u4E2D\u5E94\u4E3A\u5BF9\u8C61\u3002",
486
- "cli.config.install.no-configs": "\u672A\u68C0\u6D4B\u5230 Fabric MCP \u5BA2\u6237\u7AEF\u914D\u7F6E\u3002\u8BF7\u521B\u5EFA\u5BA2\u6237\u7AEF\u76EE\u5F55\uFF0C\u6216\u5728 fabric.config.json \u4E2D\u8BBE\u7F6E clientPaths\u3002",
487
- "cli.config.install.no-config-path": "\u8DF3\u8FC7 {client}\uFF1A\u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u8DEF\u5F84\u3002",
488
- "cli.config.install.dry-run": "[dry-run] {client}\uFF1A\u5C06\u5199\u5165 {path}",
489
- "cli.config.install.wrote": "{client}\uFF1A\u5DF2\u5199\u5165 {path}",
490
- "cli.doctor.description": "\u8FD0\u884C Fabric \u76EE\u6807\u6001\u8BCA\u65AD\u3002",
491
- "doctor.section.fixable": "\u53EF\u4FEE\u590D\u9519\u8BEF\uFF1A",
492
- "doctor.section.manual": "\u9700\u624B\u52A8\u4FEE\u590D\uFF1A",
493
- "doctor.section.warnings": "\u8B66\u544A\uFF1A",
494
- "doctor.section.apply-lint-mutations": "Apply-lint \u53D8\u66F4\uFF1A",
495
- "cli.doctor.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\u3002\u9ED8\u8BA4\u4F9D\u6B21\u4F7F\u7528 CLI \u53C2\u6570\u3001EXTERNAL_FIXTURE_PATH\u3001fabric.config.json\u3001\u5F53\u524D\u76EE\u5F55\u3002",
496
- "cli.doctor.args.fix.description": "\u4FEE\u590D\u786E\u5B9A\u6027\u6D3E\u751F\u7684 Fabric \u72B6\u6001\uFF0C\u5305\u62EC meta\u3001knowledge-test \u7D22\u5F15\u3001bootstrap \u548C events ledger\u3002",
497
- "cli.doctor.args.json.description": "\u4EE5 JSON \u8F93\u51FA doctor \u62A5\u544A\u3002",
498
- "cli.doctor.args.strict.description": "\u5C06 warning \u4E5F\u89C6\u4E3A\u5931\u8D25\u3002",
499
- "cli.doctor.args.force.description": "\u5373\u4F7F serve \u8FDB\u7A0B\u6301\u6709\u9501\uFF0C\u4E5F\u5F3A\u5236\u8FD0\u884C\u3002",
500
- "cli.doctor.args.apply-lint.description": "\u5E94\u7528 lint \u53D8\u66F4\uFF1A\u964D\u7EA7\u5B64\u7ACB\u7684\u89C4\u8303\u6761\u76EE\u3001\u5F52\u6863\u9648\u65E7 draft\u3001\u4FEE\u6B63\u6F02\u79FB\u7684\u7D22\u5F15\u8BA1\u6570\u5668\uFF1B\u5199\u5165 knowledge_demoted / knowledge_archived \u4E8B\u4EF6\u3002\u9ED8\u8BA4\u8FD0\u884C\u4ECD\u7136\u53EA\u8BFB\u3002",
501
- "cli.doctor.args.yes.description": "\u8DF3\u8FC7 --apply-lint \u7684\u5B89\u5168\u786E\u8BA4\uFF1B\u975E tty \u8C03\u7528\u5FC5\u987B\u663E\u5F0F\u8BBE\u7F6E\u8BE5\u6807\u8BB0\uFF0C\u6216\u5728\u73AF\u5883\u53D8\u91CF\u4E2D\u8BBE\u7F6E FABRIC_NONINTERACTIVE=1\u3002",
502
- "cli.doctor.errors.apply-lint-fix-mutually-exclusive": "--apply-lint \u4E0E --fix \u4E0D\u53EF\u540C\u65F6\u4F7F\u7528\u3002--apply-lint \u4FEE\u6539\u7528\u6237\u77E5\u8BC6\u72B6\u6001\uFF08\u964D\u7EA7/\u5F52\u6863\uFF09\uFF1B--fix \u4FEE\u590D\u6D3E\u751F\u72B6\u6001\uFF08meta/\u7D22\u5F15\uFF09\u3002\u8BF7\u5206\u522B\u8FD0\u884C\u3002",
503
- "cli.hooks.description": "\u7BA1\u7406 Fabric Git \u94A9\u5B50\u6A21\u677F\u3002",
504
- "cli.hooks.install.description": "\u5B89\u88C5 Fabric Husky pre-commit \u94A9\u5B50\u6A21\u677F\u3002",
505
- "cli.hooks.install.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
506
- "cli.hooks.errors.package-json-required": "\u5B89\u88C5 hooks \u9700\u8981 package.json\uFF1A{path}",
507
- "cli.hooks.install.hook-skipped": "{path} \u4E2D\u5DF2\u5B58\u5728 Fabric hook\uFF0C\u5DF2\u8DF3\u8FC7\u3002",
508
- "cli.hooks.install.hook-appended": "\u5DF2\u5411\u73B0\u6709 {path} \u8FFD\u52A0 Fabric hook",
509
- "cli.hooks.install.hook-created": "\u5DF2\u521B\u5EFA {path}",
510
- "cli.hooks.install.prepare-left": "\u4FDD\u7559 {path} \u4E2D\u539F\u6709\u7684 prepare \u811A\u672C\u4E0D\u53D8",
511
- "cli.hooks.install.prepare-added": "\u5DF2\u5411 {path} \u6DFB\u52A0 prepare \u811A\u672C",
512
- "cli.human-lint.description": "\u9A8C\u8BC1\u9501\u5B9A\u7684\u4EBA\u5DE5\u7F16\u8F91\u533A\u5757\u3002",
513
- "cli.human-lint.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
514
- "cli.human-lint.drift-detected": "\u68C0\u6D4B\u5230 human-lock \u5185\u5BB9\u6F02\u79FB\u3002\u8BF7\u56DE\u9000\u7F16\u8F91\uFF0C\u6216\u5728\u63D0\u4EA4\u524D\u66F4\u65B0\u5DF2\u6279\u51C6\u7684\u54C8\u5E0C\u3002",
515
- "cli.human-lint.table.location": "\u4F4D\u7F6E",
516
- "cli.human-lint.table.expected": "\u9884\u671F",
517
- "cli.human-lint.table.got": "\u5B9E\u9645",
518
- "cli.init.description": "\u5728\u76EE\u6807\u9879\u76EE\u4E2D\u521D\u59CB\u5316 Fabric\u3002",
519
- "cli.init.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\u3002\u9ED8\u8BA4\u4F9D\u6B21\u4F7F\u7528 CLI \u53C2\u6570\u3001EXTERNAL_FIXTURE_PATH\u3001fabric.config.json\u3001\u5F53\u524D\u76EE\u5F55\u3002",
520
- "cli.init.args.debug.description": "\u5C06\u76EE\u6807\u89E3\u6790\u7EC6\u8282\u8F93\u51FA\u5230 stderr\u3002",
521
- "cli.init.args.force.description": "\u8986\u76D6\u73B0\u6709\u6587\u4EF6\uFF08\u7ED5\u8FC7\u975E\u7834\u574F\u6027\u4FDD\u62A4\uFF09",
522
- "cli.init.args.yes.description": "\u63A5\u53D7\u5F53\u524D\u521D\u59CB\u5316\u8BA1\u5212\u5E76\u8DF3\u8FC7 TTY \u5411\u5BFC\u76F4\u63A5\u6267\u884C",
523
- "cli.init.args.plan.description": "\u4EC5\u8F93\u51FA\u521D\u59CB\u5316\u8BA1\u5212\uFF0C\u4E0D\u5199\u6587\u4EF6\u4E5F\u4E0D\u6267\u884C\u540E\u7EED\u9636\u6BB5",
524
- "cli.init.args.reapply.description": "\u5728\u5DF2\u6709 setup \u4E0A\u91CD\u65B0\u5E94\u7528 Fabric \u7BA1\u7406\u7684\u6587\u4EF6\u548C\u9636\u6BB5\u5B89\u88C5\u5668",
525
- "cli.init.args.no-bootstrap.description": "\u517C\u5BB9\u6807\u5FD7\uFF1A\u4ECE\u521D\u59CB\u5316\u8BA1\u5212\u4E2D\u79FB\u9664 bootstrap",
526
- "cli.init.args.no-mcp.description": "\u517C\u5BB9\u6807\u5FD7\uFF1A\u4ECE\u521D\u59CB\u5316\u8BA1\u5212\u4E2D\u79FB\u9664 MCP \u914D\u7F6E",
527
- "cli.init.args.no-hooks.description": "\u517C\u5BB9\u6807\u5FD7\uFF1A\u4ECE\u521D\u59CB\u5316\u8BA1\u5212\u4E2D\u79FB\u9664 git hooks",
528
- "cli.init.args.interactive.description": "\u517C\u5BB9\u6807\u5FD7\uFF1A\u7981\u7528 TTY \u5411\u5BFC\u5E76\u76F4\u63A5\u6267\u884C",
529
- "cli.init.mcp.install.global": "\u4F7F\u7528\u5168\u5C40\u5B89\u88C5\u7684 @fenglimg/fabric-server",
530
- "cli.init.mcp.install.local": "\u5C06 @fenglimg/fabric-server \u5B89\u88C5\u5230\u9879\u76EE devDependencies",
531
- "cli.init.mcp.install.prompt": "MCP \u670D\u52A1\u7AEF\u5B89\u88C5\u8303\u56F4\uFF08global|local\uFF09",
532
- "cli.init.mcp.install.invalid": "\u65E0\u6548\u7684 --mcp-install \u503C\u201C{value}\u201D\uFF0C\u5C06\u56DE\u9000\u5230 global",
533
- "cli.init.mcp.local.installing": "\u6B63\u5728\u8FD0\u884C {manager} add -D @fenglimg/fabric-server...",
534
- "cli.init.mcp.local.installed": "\u5DF2\u5B89\u88C5\u5230 devDependencies",
535
- "cli.init.mcp.scope.description": "Claude MCP \u914D\u7F6E\u8303\u56F4\uFF1Aproject\uFF08\u5199\u5165 .mcp.json\uFF09\u6216 user\uFF08\u5199\u5165 ~/.claude.json\uFF09",
536
- "cli.init.mcp.scope.invalid": "\u65E0\u6548\u7684 --scope \u503C\u201C{value}\u201D\uFF0C\u5C06\u56DE\u9000\u5230 project",
537
- "cli.init.mcp.scope.project": "\u5199\u5165\u9879\u76EE\u6839\u76EE\u5F55\u7684 .mcp.json\uFF08\u7B26\u5408 Claude Code \u89C4\u8303\uFF09",
538
- "cli.init.mcp.scope.user": "\u5199\u5165 ~/.claude.json\uFF08\u7528\u6237\u8303\u56F4\uFF0C\u9002\u7528\u4E8E\u6240\u6709\u9879\u76EE\uFF09",
539
- "cli.init.wizard.mcp-scope": "Claude MCP \u914D\u7F6E\u8303\u56F4\uFF08project/.mcp.json \u6216 user/~/.claude.json\uFF09[{defaultValue}]",
540
- "cli.init.created-path": "{label} {path}",
541
- "cli.init.skipped-existing-path": "{label} {path}\uFF1A\u5DF2\u5B58\u5728\u3002",
542
- "cli.init.force.overwritten": "\u5DF2\u8986\u76D6",
543
- "cli.init.force.warning": "--force \u5C06\u8986\u76D6 {path} \u4E2D\u73B0\u6709\u7684 Fabric \u4EA7\u7269",
544
- "cli.init.stages.bootstrap": "\u6B63\u5728\u5B89\u88C5 bootstrap \u6A21\u677F...",
545
- "cli.init.stages.mcp": "\u6B63\u5728\u914D\u7F6E MCP \u5BA2\u6237\u7AEF...",
546
- "cli.init.stages.hooks": "\u6B63\u5728\u5B89\u88C5 git hooks...",
547
- "cli.init.stages.skipped": "\u5DF2\u8DF3\u8FC7",
548
- "cli.init.stages.completed": "\u5DF2\u5B8C\u6210",
549
- "cli.init.stages.failed": "\u5931\u8D25",
550
- "cli.init.stages.summary.ran": "\u5DF2\u6267\u884C",
551
- "cli.init.stages.summary.skipped": "\u5DF2\u8DF3\u8FC7",
552
- "cli.init.stages.summary.failed": "\u5931\u8D25",
553
- "cli.init.next-step": "{label} {message}",
554
- "cli.init.reason-message": "{label} {message}",
555
- "cli.init.plan.title": "Fabric \u521D\u59CB\u5316\u8BA1\u5212",
556
- "cli.init.plan.mode-banner.default": "[mode: apply] \u6807\u51C6\u521D\u59CB\u5316\u6267\u884C",
557
- "cli.init.plan.mode-banner.plan": "[mode: plan] \u4EC5\u9884\u89C8\uFF0C\u4E0D\u4F1A\u5199\u5165\u6587\u4EF6",
558
- "cli.init.plan.mode-banner.reapply": "[mode: reapply] \u5C06\u5F3A\u5236\u91CD\u65B0\u5E94\u7528 Fabric \u7BA1\u7406\u8D44\u4EA7",
559
- "cli.init.plan.mode-banner.plan-reapply": "[mode: plan+reapply] \u6B63\u5728\u9884\u89C8\u4E00\u6B21\u5F3A\u5236 reapply\uFF0C\u4E0D\u4F1A\u5199\u5165\u6587\u4EF6",
560
- "cli.init.plan.target": "\u76EE\u6807\uFF1A{target}",
561
- "cli.init.plan.actions": "\u8BA1\u5212\uFF1Abootstrap={bootstrap} mcp={mcp} hooks={hooks} mcp-install={mcpInstall}",
562
- "cli.init.plan.detected": "\u68C0\u6D4B\u5230\u7684\u5BA2\u6237\u7AEF\uFF1A{clients}",
563
- "cli.init.plan.writes": "\u6838\u5FC3\u5199\u5165\uFF1A",
564
- "cli.init.plan.preview-title": "Fabric \u521D\u59CB\u5316 dry run",
565
- "cli.init.plan.preview-result": "\u6A21\u5F0F={mode} bootstrap={bootstrap} mcp={mcp} hooks={hooks}",
566
- "cli.init.mode.default": "default",
567
- "cli.init.mode.reapply": "reapply",
568
- "cli.init.mode.badge.default": "APPLY",
569
- "cli.init.mode.badge.plan": "PLAN",
570
- "cli.init.mode.badge.reapply": "REAPPLY",
571
- "cli.init.mode.badge.plan-reapply": "PLAN + REAPPLY",
572
- "cli.init.compat.plan": "\u5DF2\u542F\u7528\u6807\u51C6 --plan \u6A21\u5F0F\uFF1A\u4E0D\u4F1A\u5199\u5165\u4EFB\u4F55\u6587\u4EF6\u3002",
573
- "cli.init.compat.interactive": "\u517C\u5BB9\u63D0\u793A\uFF1A--interactive=false \u4F1A\u7981\u7528 TTY \u5411\u5BFC\u3002",
574
- "cli.init.compat.legacy-stage-flags": "\u517C\u5BB9\u63D0\u793A\uFF1A\u65E7\u7684 --no-* \u6807\u5FD7\u6B63\u5728\u6620\u5C04\u5230\u521D\u59CB\u5316\u8BA1\u5212\u4E2D\u3002",
575
- "cli.init.wizard.title": "Fabric \u521D\u59CB\u5316\u5411\u5BFC",
576
- "cli.init.wizard.intro": "Fabric init",
577
- "cli.init.wizard.overview.title": "\u5B89\u88C5\u6982\u89C8",
578
- "cli.init.wizard.overview.body": "\u76EE\u6807\uFF1A{target}\n\u6A21\u5F0F\uFF1A{mode}\n\u8FD9\u4E2A\u5411\u5BFC\u53EA\u8D1F\u8D23\u8C03\u6574\u521D\u59CB\u5316\u8BA1\u5212\uFF1B\u771F\u6B63\u6267\u884C\u4ECD\u7136\u8D70\u73B0\u6709\u7684 Fabric init \u9636\u6BB5\u3002",
579
- "cli.init.wizard.step.target": "\u786E\u8BA4\u76EE\u6807",
580
- "cli.init.wizard.step.plan": "\u914D\u7F6E\u521D\u59CB\u5316\u8BA1\u5212",
581
- "cli.init.wizard.step.review": "\u590D\u6838\u6700\u7EC8\u8BA1\u5212",
582
- "cli.init.wizard.target.confirm": "\u786E\u8BA4\u5728 {target} \u4E2D\u7EE7\u7EED\u521D\u59CB\u5316 Fabric\uFF1F[Y/n]",
583
- "cli.init.wizard.stage.bootstrap": "\u662F\u5426\u5B89\u88C5 bootstrap \u6A21\u677F\uFF1F[{defaultValue}]",
584
- "cli.init.wizard.stage.mcp": "\u662F\u5426\u914D\u7F6E MCP \u5BA2\u6237\u7AEF\uFF1F[{defaultValue}]",
585
- "cli.init.wizard.stage.hooks": "\u662F\u5426\u5B89\u88C5 git hooks\uFF1F[{defaultValue}]",
586
- "cli.init.wizard.mcp-install": "MCP \u670D\u52A1\u7AEF\u5B89\u88C5\u8303\u56F4\uFF08global/local\uFF09[{defaultValue}]",
587
- "cli.init.wizard.execute.confirm": "\u73B0\u5728\u6267\u884C\u8BE5\u521D\u59CB\u5316\u8BA1\u5212\uFF1F[Y/n]",
588
- "cli.init.wizard.outro": "\u521D\u59CB\u5316\u8BA1\u5212\u5DF2\u786E\u8BA4\uFF0C\u5F00\u59CB\u6267\u884C Fabric init...",
589
- "cli.init.wizard.invalid-yes-no": "\u8BF7\u8F93\u5165 yes \u6216 no\u3002",
590
- "cli.init.wizard.invalid-select": "\u65E0\u6548\u8F93\u5165\u3002\u53EF\u9009\u503C\uFF1A{options}\u3002",
591
- "cli.init.wizard.cancelled": "Fabric \u521D\u59CB\u5316\u5DF2\u5728\u6267\u884C\u524D\u53D6\u6D88\u3002",
592
- "cli.init.capabilities.title": "\u5BA2\u6237\u7AEF\u80FD\u529B\u6458\u8981",
593
- "cli.init.capabilities.none": "\u6CA1\u6709\u68C0\u6D4B\u5230\u53EF\u7528\u4E8E bootstrap \u6216 MCP \u540E\u7EED\u63A5\u529B\u7684\u53D7\u652F\u6301\u5BA2\u6237\u7AEF\u3002",
594
- "cli.init.capabilities.header.client": "\u5BA2\u6237\u7AEF",
595
- "cli.init.capabilities.header.bootstrap": "Bootstrap",
596
- "cli.init.capabilities.header.mcp": "MCP",
597
- "cli.init.capabilities.header.hook": "Hook",
598
- "cli.init.capabilities.header.skill": "Skill",
599
- "cli.init.capabilities.header.follow-up": "\u540E\u7EED\u52A8\u4F5C",
600
- "cli.init.capabilities.status.ready": "\u5DF2\u5C31\u7EEA",
601
- "cli.init.capabilities.status.installed": "\u5DF2\u5B89\u88C5",
602
- "cli.init.capabilities.status.supported": "\u5DF2\u652F\u6301",
603
- "cli.init.capabilities.status.manual": "\u624B\u52A8\u5904\u7406",
604
- "cli.init.capabilities.status.skipped": "\u5DF2\u8DF3\u8FC7",
605
- "cli.init.capabilities.status.failed": "\u5931\u8D25",
606
- "cli.init.capabilities.status.na": "\u4E0D\u9002\u7528",
607
- "cli.init.capabilities.follow-up.ready": "\u53EF\u5728\u5BA2\u6237\u7AEF\u7EE7\u7EED",
608
- "cli.init.capabilities.follow-up.install": "\u5B89\u88C5\u5BA2\u6237\u7AEF\u8D44\u4EA7",
609
- "cli.init.capabilities.follow-up.manual": "\u9700\u8981\u624B\u52A8\u540E\u7EED\u5904\u7406",
610
- "cli.init.next-step.message": "\u8FD0\u884C fab hooks install \u4EE5\u6DFB\u52A0\u7B2C 4 \u5929\u7684 pre-commit \u6D41\u6C34\u7EBF\u3002",
611
- "cli.init.reason-message.installable-body": ".fabric/forensic.json \u5DF2\u5C31\u7EEA\uFF1B\u90E8\u5206\u5DF2\u68C0\u6D4B\u5230\u7684\u5BA2\u6237\u7AEF\u5DF2\u652F\u6301 Fabric \u540E\u7EED\u63A5\u529B\uFF0C\u4F46\u4ECD\u9700\u5B89\u88C5\u5BA2\u6237\u7AEF\u8D44\u4EA7\u3002",
612
- "cli.init.reason-message.manual-body": ".fabric/forensic.json \u5DF2\u5C31\u7EEA\uFF1B\u90E8\u5206\u5DF2\u68C0\u6D4B\u5230\u7684\u5BA2\u6237\u7AEF\u5C1A\u672A\u5B89\u88C5 Fabric skill\uFF0C\u9700\u8981\u624B\u52A8\u5B8C\u6210\u540E\u7EED\u521D\u59CB\u5316\u3002",
613
- "cli.init.codex-hooks.created": "{label} {path}\uFF0C\u5E76\u5199\u5165 Codex hooks \u914D\u7F6E\uFF08\u9700\u542F\u7528 features.codex_hooks = true\uFF09\u3002",
614
- "cli.init.codex-hooks.updated": "{label} {path}\uFF0C\u5E76\u5199\u5165 Codex hooks \u914D\u7F6E\uFF08\u9700\u542F\u7528 features.codex_hooks = true\uFF09\u3002",
615
- "cli.init.codex-hooks.skipped": "{label} {path}\uFF1ACodex hooks \u914D\u7F6E\u5DF2\u5B58\u5728\u3002",
616
- "cli.init.claude-settings.created": "{label} {path}\uFF0C\u5E76\u5199\u5165 Claude Stop hook\u3002",
617
- "cli.init.claude-settings.updated": "{label} {path}\uFF0C\u5E76\u5199\u5165 Claude Stop hook\u3002",
618
- "cli.init.claude-settings.skipped": "{label} {path}\uFF1AClaude Stop hook \u5DF2\u5B58\u5728\u3002",
619
- "cli.init.claude-settings.skipped-invalid": "{label} {path}\uFF1A\u65E0\u6CD5\u5408\u5E76 Claude Stop hook\u3002",
620
- "cli.init.claude-settings.invalid-object": "{label} {path}\uFF1A\u9884\u671F\u4E3A JSON \u5BF9\u8C61\u3002",
621
- "cli.init.claude-settings.invalid-json": "{label} {path}\uFF1AJSON \u65E0\u6548\uFF08{reason}\uFF09\u3002",
622
- "cli.init.claude-settings.invalid-hooks": '{label} {path}\uFF1A"hooks" \u5FC5\u987B\u662F JSON \u5BF9\u8C61\u3002',
623
- "cli.init.claude-settings.invalid-stop-array": '{label} {path}\uFF1A"hooks.Stop" \u5FC5\u987B\u662F\u6570\u7EC4\u3002',
624
- "cli.init.errors.abort-existing": "\u4E2D\u6B62\uFF1A{path} \u5DF2\u5B58\u5728\u3002fab init \u662F\u975E\u7834\u574F\u6027\u7684\u3002",
625
- "cli.ledger-append.description": "\u5411 Fabric \u610F\u56FE\u65E5\u5FD7\u8FFD\u52A0\u4E00\u6761\u8BB0\u5F55\u3002",
626
- "cli.ledger-append.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
627
- "cli.ledger-append.args.staged.description": "\u4ECE\u6682\u5B58\u53D8\u66F4\u63A8\u5BFC\u8BB0\u5F55\uFF08\u7528\u4E8E pre-commit \u9636\u6BB5\uFF09\u3002",
628
- "cli.ledger-append.requires-staged": "pre-commit \u573A\u666F\u4E0B\u5FC5\u987B\u4F20\u5165 --staged",
629
- "cli.ledger-append.intent.auto": "\u81EA\u52A8\uFF1A{head}{suffix}",
630
- "cli.ledger-append.intent.auto-more": " \u7B49 {count} \u9879",
631
- "cli.pre-commit.description": "\u590D\u5408 pre-commit \u94A9\u5B50\uFF1A\u5728\u5355\u4E2A Node \u8FDB\u7A0B\u4E2D\u4F9D\u6B21\u6267\u884C sync-meta --check-only\u3001human-lint\u3001ledger-append --staged\u3002",
632
- "cli.pre-commit.args.target.description": "\u9879\u76EE\u6839\u76EE\u5F55\uFF0C\u9ED8\u8BA4\u53D6\u5F53\u524D\u76EE\u5F55\u6216 EXTERNAL_FIXTURE_PATH\u3002",
633
- "cli.pre-commit.run-failed": "fabric pre-commit\uFF1A{name} \u5931\u8D25 - {message}",
634
- "cli.scan.description": "\u626B\u63CF\u9879\u76EE\u4EE5\u68C0\u6D4B Fabric \u5F15\u5BFC\u5019\u9009\u6A21\u5757\u3002",
635
- "cli.scan.args.target.description": "\u76EE\u6807\u7EDD\u5BF9\u8DEF\u5F84\u3002\u9ED8\u8BA4\u4F9D\u6B21\u4F7F\u7528 CLI \u53C2\u6570\u3001EXTERNAL_FIXTURE_PATH\u3001fabric.config.json\u3001\u5F53\u524D\u76EE\u5F55\u3002",
636
- "cli.scan.args.debug.description": "\u4EE5\u683C\u5F0F\u5316\u8F93\u51FA\u6253\u5370\u68C0\u6D4B\u8BC1\u636E\u3002",
637
- "cli.scan.args.json.description": "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\u8BCA\u65AD\u62A5\u544A\u3002",
638
- "cli.scan.error.missing-forensic": "\u672A\u627E\u5230 forensic.json\uFF08\u8DEF\u5F84 {path}\uFF09\uFF1B\u8BF7\u5148\u8FD0\u884C `fabric init` \u751F\u6210\u9879\u76EE\u5FEB\u7167\u3002",
639
- "cli.scan.summary.created": "\u5DF2\u5199\u5165 {count} \u6761\u77E5\u8BC6\u6761\u76EE\u81F3 .fabric/knowledge/\u3002",
640
- "cli.scan.summary.skipped": "\u65E0\u5DEE\u5F02\uFF1B{count} \u6761\u5DF2\u5B58\u5728\u7684\u6761\u76EE\u4FDD\u6301\u4E0D\u53D8\u3002",
641
- "cli.scan.report.title": "Fabric \u626B\u63CF\u62A5\u544A",
642
- "cli.scan.report.target": "\u76EE\u6807",
643
- "cli.scan.report.framework": "\u6846\u67B6",
644
- "cli.scan.report.evidence": "\u8BC1\u636E",
645
- "cli.scan.report.readme-quality": "README \u8D28\u91CF",
646
- "cli.scan.report.contributing": "CONTRIBUTING.md",
647
- "cli.scan.report.files-counted": "\u6587\u4EF6\u6570",
648
- "cli.scan.report.ignored-entries": "\u5FFD\u7565\u9879",
649
- "cli.scan.report.existing-fabric": "\u73B0\u6709 Fabric \u6587\u4EF6",
650
- "cli.scan.report.recommendations": "\u5EFA\u8BAE\uFF1A",
651
- "cli.scan.readme-quality.ok": "\u826F\u597D",
652
- "cli.scan.readme-quality.stub": "\u8349\u7A3F",
653
- "cli.scan.recommendation.init": "L0\uFF1A\u8FD0\u884C fab init\uFF0C\u5728 .fabric/bootstrap/README.md \u751F\u6210\u5E26 TODO \u6807\u8BB0\u7684\u521D\u59CB\u8BF4\u660E\u3002",
654
- "cli.scan.recommendation.readme": "L0\uFF1A\u5148\u8865\u5145 README.md\uFF0C\u518D\u628A\u9879\u76EE\u4E8B\u5B9E\u6574\u7406\u5230 Fabric \u53C2\u8003\u6587\u4EF6\u4E2D\u3002",
655
- "cli.scan.recommendation.contributing": "L0\uFF1A\u6DFB\u52A0 CONTRIBUTING.md\uFF0C\u6216\u5728 bootstrap \u4E2D\u7559\u4E0B\u8D21\u732E\u6D41\u7A0B\u7684 TODO \u8BF4\u660E\u3002",
656
- "cli.scan.recommendation.unknown-framework": "L1\uFF1A\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u6846\u67B6\u6807\u8BB0\uFF0C\u9700\u8981\u624B\u52A8\u8865\u5145\u6280\u672F\u6808\u8BF4\u660E\u3002",
657
- "cli.scan.recommendation.framework-dirs": "L1\uFF1A\u68C0\u67E5 {framework} \u76EE\u5F55\uFF0C\u540E\u7EED\u4E3A\u5176\u8865\u5145\u5BF9\u5E94\u4F5C\u7528\u57DF\u7684 Fabric \u89C4\u5219\u6587\u4EF6\u3002",
658
- "cli.serve.description": "\u542F\u52A8\u672C\u5730 Fabric MCP HTTP \u670D\u52A1\u3002\u82E5\u9700\u7ED1\u5B9A\u5230\u975E localhost\uFF0C\u8BF7\u8BBE\u7F6E FABRIC_AUTH_TOKEN \u4EE5\u542F\u7528 Bearer \u9274\u6743\u3002",
659
- "cli.serve.args.port.description": "\u76D1\u542C\u7AEF\u53E3\uFF0C\u9ED8\u8BA4 7373\u3002",
660
- "cli.serve.args.host.description": "\u76D1\u542C\u4E3B\u673A\uFF0C\u9ED8\u8BA4 127.0.0.1\u3002\u82E5\u9700\u7ED1\u5B9A\u5230\u975E localhost\uFF0C\u8BF7\u8BBE\u7F6E FABRIC_AUTH_TOKEN \u4EE5\u542F\u7528 Bearer \u9274\u6743\u3002",
661
- "cli.serve.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\u3002\u9ED8\u8BA4\u4F9D\u6B21\u4F7F\u7528 CLI \u53C2\u6570\u3001EXTERNAL_FIXTURE_PATH\u3001fabric.config.json\u3001\u5F53\u524D\u76EE\u5F55\u3002",
662
- "cli.serve.args.debug.description": "\u5C06\u76EE\u6807\u89E3\u6790\u7EC6\u8282\u8F93\u51FA\u5230 stderr\u3002",
663
- "cli.serve.args.force.description": "\u5373\u4F7F\u53E6\u4E00\u4E2A serve \u8FDB\u7A0B\u6B63\u5728\u8FD0\u884C\uFF0C\u4E5F\u5F3A\u5236\u83B7\u53D6 serve \u9501\u3002",
664
- "cli.serve.ready.title": "Fabric \u4EEA\u8868\u76D8",
665
- "cli.serve.warning.host-fallback": "--host {host} \u9700\u8981 FABRIC_AUTH_TOKEN\uFF1B\u4E3A\u5B89\u5168\u8D77\u89C1\u5DF2\u56DE\u9000\u5230 127.0.0.1",
666
- "cli.serve.error.port-in-use": "\u7AEF\u53E3 {port} \u5DF2\u88AB\u5360\u7528\uFF0C\u53EF\u5C1D\u8BD5 --port {nextPort}",
667
- "cli.update.description": "\u5237\u65B0 MCP \u4E3B\u673A\u914D\u7F6E\u548C git hooks\uFF0C\u4E0D\u91CD\u65B0\u521B\u5EFA Fabric \u6587\u4EF6\u3002",
668
- "cli.update.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\u3002\u9ED8\u8BA4\u4F9D\u6B21\u4F7F\u7528 CLI \u53C2\u6570\u3001EXTERNAL_FIXTURE_PATH\u3001fabric.config.json\u3001\u5F53\u524D\u76EE\u5F55\u3002",
669
- "cli.update.args.no-mcp.description": "\u8DF3\u8FC7\u91CD\u65B0\u914D\u7F6E MCP \u5BA2\u6237\u7AEF",
670
- "cli.update.args.no-hooks.description": "\u8DF3\u8FC7\u91CD\u65B0\u5B89\u88C5 git hooks",
671
- "cli.sync-meta.description": "\u4ECE\u5185\u90E8\u89C4\u5219\u6587\u4EF6\u540C\u6B65 Fabric \u5143\u6570\u636E\u3002",
672
- "cli.sync-meta.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
673
- "cli.sync-meta.args.check-only.description": "\u5982\u679C .fabric/agents.meta.json \u5DF2\u8FC7\u671F\uFF0C\u5219\u4EE5\u4EE3\u7801 1 \u9000\u51FA\u3002",
674
- "cli.sync-meta.drift-detected": "\u68C0\u6D4B\u5230 Fabric \u5143\u6570\u636E\u6F02\u79FB\u3002\u8BF7\u8FD0\u884C fab sync-meta \u8FDB\u884C\u66F4\u65B0\u3002",
675
- "cli.sync-meta.updated": "{label} {path}",
676
- "dashboard.app.nav.aria-label": "\u4EEA\u8868\u76D8\u89C6\u56FE\u5BFC\u822A",
677
- "dashboard.app.nav.readiness.label": "\u51C6\u5907\u60C5\u51B5",
678
- "dashboard.app.nav.readiness.label-bilingual": "\u51C6\u5907\u60C5\u51B5 Readiness",
679
- "dashboard.app.nav.readiness.subtitle": "\u9879\u76EE\u72B6\u6001",
680
- "dashboard.app.nav.rules-explain.label": "\u89C4\u5219\u89E3\u6790",
681
- "dashboard.app.nav.rules-explain.label-bilingual": "\u89C4\u5219\u89E3\u6790 Rules Explain",
682
- "dashboard.app.nav.rules-explain.subtitle": "\u62D3\u6251\u4E0E\u4E0A\u4E0B\u6587",
683
- "dashboard.app.nav.timeline.label": "\u65F6\u95F4\u7EBF",
684
- "dashboard.app.nav.timeline.label-bilingual": "\u65F6\u95F4\u7EBF Timeline",
685
- "dashboard.app.nav.timeline.subtitle": "\u5BA1\u8BA1\u4E0E\u5386\u53F2",
686
- "dashboard.app.nav.health.label": "\u7CFB\u7EDF\u5065\u5EB7",
687
- "dashboard.app.nav.health.label-bilingual": "\u7CFB\u7EDF\u5065\u5EB7 Health",
688
- "dashboard.app.nav.health.subtitle": "\u8BCA\u65AD\u53F0",
689
- "dashboard.app.nav.section.insights": "\u6D1E\u5BDF",
690
- "dashboard.app.nav.drift-check": "\u6F02\u79FB\u68C0\u67E5",
691
- "dashboard.app.nav.modules.read-only": "\u53EA\u8BFB\u4EEA\u8868\u76D8",
692
- "dashboard.app.header.connected": "\u5DF2\u8FDE\u63A5",
693
- "dashboard.app.header.connecting": "\u8FDE\u63A5\u4E2D",
694
- "dashboard.app.live-region.received": "\u5DF2\u6536\u5230 {type}",
695
- "dashboard.app.breadcrumb.readiness": "readiness",
696
- "dashboard.app.breadcrumb.rules-explain": "rules-explain",
697
- "dashboard.app.breadcrumb.timeline": "timeline",
698
- "dashboard.app.breadcrumb.health": "health",
699
- "dashboard.rule-topology.title": "\u89C4\u5219\u547D\u4E2D",
700
- "dashboard.rule-topology.subtitle": "\u67E5\u770B\u5F53\u524D\u8DEF\u5F84\u4F1A\u547D\u4E2D\u54EA\u4E9B\u89C4\u5219\uFF0C\u4EE5\u53CA\u4E3A\u4EC0\u4E48\u4F1A\u547D\u4E2D",
701
- "dashboard.rule-topology.path.placeholder": "\u7528\u4E8E\u89C4\u5219\u4E0A\u4E0B\u6587\u7684\u6837\u672C\u8DEF\u5F84",
702
- "dashboard.rule-topology.path.aria-label": "\u89C4\u5219\u4E0A\u4E0B\u6587\u6837\u672C\u8DEF\u5F84",
703
- "dashboard.rule-topology.status.sample": "\u5F53\u524D\u8DEF\u5F84 {path}",
704
- "dashboard.rule-topology.status.hits": "{count} \u6761\u547D\u4E2D",
705
- "dashboard.rule-topology.status.revision": "\u7248\u672C {revision}",
706
- "dashboard.rule-topology.heatmap.title": "\u8986\u76D6\u70ED\u529B\u56FE",
707
- "dashboard.rule-topology.heatmap.subtitle": "\u57FA\u4E8E scope_glob \u6A21\u5F0F\u63A8\u5BFC\u7684\u76EE\u5F55\u8986\u76D6\u60C5\u51B5",
708
- "dashboard.rule-topology.heatmap.aria-label": "\u76EE\u5F55\u8986\u76D6\u70ED\u529B\u56FE",
709
- "dashboard.rule-topology.heatmap.count": "{count} \u4E2A\u76EE\u5F55",
710
- "dashboard.rule-topology.heatmap.rules": "{count} \u6761\u89C4\u5219",
711
- "dashboard.rule-topology.heatmap.uncovered": "\u6CA1\u6709\u5339\u914D\u4F5C\u7528\u57DF",
712
- "dashboard.rule-topology.heatmap.empty": "\u5F53\u524D\u6CA1\u6709\u53EF\u663E\u793A\u7684\u89C4\u5219\u76EE\u5F55\u3002",
713
- "dashboard.rule-topology.heatmap.density.full": "\u5DF2\u8986\u76D6",
714
- "dashboard.rule-topology.heatmap.density.partial": "\u90E8\u5206\u8986\u76D6",
715
- "dashboard.rule-topology.heatmap.density.none": "\u672A\u8986\u76D6",
716
- "dashboard.rule-topology.hit-reason.title": "\u547D\u4E2D\u539F\u56E0",
717
- "dashboard.rule-topology.hit-reason.subtitle": "\u663E\u793A\u5F53\u524D\u6837\u672C\u8DEF\u5F84\u4E3A\u4F55\u547D\u4E2D\u8FD9\u4E9B\u89C4\u5219",
718
- "dashboard.rule-topology.hit-reason.aria-label": "\u89C4\u5219\u547D\u4E2D\u539F\u56E0",
719
- "dashboard.rule-topology.hit-reason.count": "{count} \u6761\u539F\u56E0",
720
- "dashboard.rule-topology.hit-reason.empty": "\u5F53\u524D\u6837\u672C\u8DEF\u5F84\u6CA1\u6709\u52A0\u8F7D\u5230\u89C4\u5219\u3002",
721
- "dashboard.rule-topology.hit-reason.global": "\u5168\u5C40",
722
- "dashboard.rule-topology.hit-reason.tier.always": "\u5E38\u9A7B",
723
- "dashboard.rule-topology.hit-reason.tier.path": "Glob",
724
- "dashboard.rule-topology.hit-reason.tier.description": "\u63CF\u8FF0",
725
- "dashboard.module-placeholder.coming-soon": "\u529F\u80FD\u9884\u7559",
726
- "dashboard.module-placeholder.read-only": "\u4E3A\u540E\u7EED\u53EA\u8BFB\u4EEA\u8868\u76D8\u80FD\u529B\u9884\u7559\u3002",
727
- "dashboard.module-placeholder.forensic.title": "\u8BA4\u77E5\u626B\u63CF",
728
- "dashboard.module-placeholder.forensic.subtitle": "\u540E\u7EED\u8865\u5145",
729
- "dashboard.module-placeholder.semantic.title": "\u8BED\u4E49\u65F6\u95F4\u7EBF",
730
- "dashboard.module-placeholder.semantic.subtitle": "\u540E\u7EED\u8865\u5145",
731
- "dashboard.module-placeholder.ledger.title": "\u5386\u53F2\u8BB0\u5F55",
732
- "dashboard.module-placeholder.ledger.subtitle": "\u540E\u7EED\u8865\u5145",
733
- "dashboard.rules-tree.title": "\u89C4\u5219\u6811",
734
- "dashboard.rules-tree.subtitle": "\u67E5\u770B .fabric/agents.meta.json \u4E2D\u7684\u89C4\u5219\u7ED3\u6784\u3001\u5C42\u7EA7\u548C\u540C\u6B65\u72B6\u6001",
735
- "dashboard.rules-tree.filter.placeholder": "\u6309\u6587\u4EF6\u3001\u4F5C\u7528\u57DF\u3001\u4F18\u5148\u7EA7\u3001\u54C8\u5E0C\u8FC7\u6EE4...",
736
- "dashboard.rules-tree.filter.aria-label": "\u8FC7\u6EE4\u89C4\u5219\u6811",
737
- "dashboard.rules-tree.status.loading": "\u89C4\u5219\u52A0\u8F7D\u4E2D",
738
- "dashboard.rules-tree.status.nodes": "{count} \u4E2A\u8282\u70B9 \xB7 \u7248\u672C {revision}",
739
- "dashboard.rules-tree.status.locks": "{count} \u4E2A\u53D7\u4FDD\u62A4\u533A\u57DF",
740
- "dashboard.rules-tree.empty": "\u6CA1\u6709\u5339\u914D\u7684\u89C4\u5219\u3002",
741
- "dashboard.rules-tree.tree.aria-label": "Fabric \u89C4\u5219\u6811",
742
- "dashboard.rules-tree.detail.title": "\u8282\u70B9\u8BE6\u60C5",
743
- "dashboard.rules-tree.detail.empty": "\u9009\u62E9\u4E00\u4E2A\u89C4\u5219\u8282\u70B9\u4EE5\u67E5\u770B\u4F5C\u7528\u57DF\u3001\u4F9D\u8D56\u3001\u4F18\u5148\u7EA7\u548C\u54C8\u5E0C\u3002",
744
- "dashboard.rules-tree.detail.file": "\u6587\u4EF6",
745
- "dashboard.rules-tree.detail.scope": "\u4F5C\u7528\u57DF",
746
- "dashboard.rules-tree.detail.priority": "\u4F18\u5148\u7EA7",
747
- "dashboard.rules-tree.detail.hash": "\u54C8\u5E0C",
748
- "dashboard.rules-tree.detail.no-deps": "\u65E0\u4F9D\u8D56",
749
- "dashboard.human-lock.title": "\u4EBA\u5DE5\u4FDD\u62A4",
750
- "dashboard.human-lock.subtitle": "\u67E5\u770B\u9700\u8981\u4EBA\u5DE5\u786E\u8BA4\u7684\u53D7\u4FDD\u62A4\u533A\u57DF",
751
- "dashboard.human-lock.filters.aria-label": "\u4EBA\u5DE5\u4FDD\u62A4\u8FC7\u6EE4\u5668",
752
- "dashboard.human-lock.filters.all": "\u5168\u90E8",
753
- "dashboard.human-lock.filters.drift": "\u6F02\u79FB",
754
- "dashboard.human-lock.filters.approved": "\u5DF2\u6279\u51C6",
755
- "dashboard.human-lock.summary": "{drift} \u5904\u6F02\u79FB \xB7 {approved} \u9879\u5DF2\u786E\u8BA4",
756
- "dashboard.human-lock.empty": "\u5F53\u524D\u8FC7\u6EE4\u6761\u4EF6\u4E0B\u6CA1\u6709\u53D7\u4FDD\u62A4\u8BB0\u5F55\u3002",
757
- "dashboard.intent-timeline.title": "\u610F\u56FE\u65F6\u95F4\u7EBF",
758
- "dashboard.intent-timeline.subtitle": "\u67E5\u770B AI \u4E0E\u4EBA\u5DE5\u7559\u4E0B\u7684\u53D8\u66F4\u8BB0\u5F55\uFF0C\u6309\u65F6\u95F4\u5012\u5E8F\u6392\u5217",
759
- "dashboard.intent-timeline.filter.label": "\u6765\u6E90",
760
- "dashboard.intent-timeline.filter.all": "\u5168\u90E8",
761
- "dashboard.intent-timeline.summary": "AI {aiCount} \xB7 Human {humanCount}",
762
- "dashboard.intent-timeline.columns.ai.title": "AI",
763
- "dashboard.intent-timeline.columns.ai.entries": "{count} \u6761\u8BB0\u5F55",
764
- "dashboard.intent-timeline.columns.human.title": "\u4EBA\u5DE5",
765
- "dashboard.intent-timeline.columns.human.entries": "{count} \u6761\u8BB0\u5F55",
766
- "dashboard.intent-timeline.empty": "\u6CA1\u6709\u627E\u5230\u65E5\u5FD7\u8BB0\u5F55\u3002",
767
- "dashboard.intent-timeline.annotate.missing-id": "\u7F3A\u5C11 id\uFF0C\u65E0\u6CD5\u4E3A\u8FD9\u6761\u65E5\u5FD7\u6DFB\u52A0\u6CE8\u91CA\u3002",
768
- "dashboard.history-replay.title": "\u5386\u53F2\u56DE\u653E",
769
- "dashboard.history-replay.subtitle": "\u6309\u5386\u53F2\u8BB0\u5F55\u56DE\u770B\u5F53\u65F6\u7684\u89C4\u5219\u6811\u72B6\u6001",
770
- "dashboard.history-replay.toolbar.scrub": "\u62D6\u52A8",
771
- "dashboard.history-replay.toolbar.latest": "\u6700\u65B0",
772
- "dashboard.history-replay.selected.none": "\u5C1A\u672A\u9009\u62E9\u5386\u53F2\u8BB0\u5F55",
773
- "dashboard.history-replay.status.replay-points": "{count} \u4E2A\u56DE\u653E\u70B9",
774
- "dashboard.history-replay.status.entries-applied": "\u5DF2\u5E94\u7528 {count} \u6761\u8BB0\u5F55",
775
- "dashboard.history-replay.empty.entries": "\u6CA1\u6709\u53EF\u7528\u4E8E\u56DE\u653E\u7684\u65E5\u5FD7\u8BB0\u5F55\u3002",
776
- "dashboard.history-replay.state.title": "\u67E5\u770B {label} \u65F6\u523B\u7684\u72B6\u6001",
777
- "dashboard.history-replay.state.meta": "\u8BB0\u5F55 {ledgerId} \xB7 \u63D0\u4EA4 {commit} \xB7 {mode}",
778
- "dashboard.history-replay.status.loading": "\u5FEB\u7167\u52A0\u8F7D\u4E2D",
779
- "dashboard.history-replay.status.nodes": "{count} \u4E2A\u8282\u70B9",
780
- "dashboard.history-replay.status.unknown-revision": "\u672A\u77E5\u7248\u672C",
781
- "dashboard.history-replay.tree.aria-label": "\u5386\u53F2 Fabric \u89C4\u5219\u6811",
782
- "dashboard.history-replay.empty.loading": "\u6B63\u5728\u52A0\u8F7D\u5386\u53F2\u5FEB\u7167...",
783
- "dashboard.history-replay.empty.select": "\u8BF7\u9009\u62E9\u4E00\u6761\u65F6\u95F4\u7EBF\u8BB0\u5F55\u4EE5\u56DE\u653E\u5176\u72B6\u6001\u3002",
784
- "dashboard.history-replay.meta.not-available": "\u4E0D\u53EF\u7528",
785
- "dashboard.history-replay.meta.pending": "\u7B49\u5F85\u4E2D",
786
- "dashboard.history-replay.meta.na": "\u65E0",
787
- "dashboard.doctor.title": "\u8BCA\u65AD\u63A7\u5236\u53F0",
788
- "dashboard.doctor.subtitle": "\u67E5\u770B\u6846\u67B6\u3001\u5165\u53E3\u70B9\u3001\u7248\u672C\u6F02\u79FB\u548C\u53D7\u4FDD\u62A4\u8DEF\u5F84\u7684\u72B6\u6001",
789
- "dashboard.doctor.toolbar.overall": "\u6574\u4F53\u72B6\u6001",
790
- "dashboard.doctor.toolbar.no-summary": "\u6682\u65E0\u6458\u8981",
791
- "dashboard.doctor.toolbar.entry-points-summary": "{framework} \xB7 {count} \u4E2A\u5165\u53E3\u70B9",
792
- "dashboard.doctor.toolbar.entry-point-summary": "{framework} \xB7 {count} \u4E2A\u5165\u53E3\u70B9",
793
- "dashboard.doctor.empty.loading": "\u6B63\u5728\u52A0\u8F7D doctor \u62A5\u544A...",
794
- "dashboard.doctor.summary.framework": "\u6846\u67B6",
795
- "dashboard.doctor.summary.protected-paths": "\u53D7\u4FDD\u62A4\u8DEF\u5F84",
796
- "dashboard.doctor.summary.intent-ledger": "\u610F\u56FE\u65E5\u5FD7",
797
- "dashboard.doctor.summary.no-meta-revision": "\u6682\u65E0\u5143\u6570\u636E\u7248\u672C",
798
- "dashboard.doctor.summary.tracked-paths.none": "\u6CA1\u6709\u8DDF\u8E2A\u8DEF\u5F84",
799
- "dashboard.doctor.summary.tracked-paths.some": "\u5DF2\u8DDF\u8E2A {count} \u9879",
800
- "dashboard.doctor.summary.hashes-intact": "\u6240\u6709\u5DF2\u6279\u51C6\u54C8\u5E0C\u5747\u5B8C\u597D",
801
- "dashboard.doctor.summary.drifted": "{count} \u9879\u53D1\u751F\u6F02\u79FB",
802
- "dashboard.doctor.summary.no-ledger-entries": "\u6682\u65E0\u65E5\u5FD7\u8BB0\u5F55",
803
- "dashboard.doctor.card.entry-points": "\u5165\u53E3\u70B9",
804
- "dashboard.doctor.card.checks": "\u68C0\u67E5\u9879",
805
- "dashboard.doctor.empty.entry-points": "\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u5165\u53E3\u70B9\u3002",
806
- "dashboard.doctor.framework.unknown": "\u672A\u77E5",
807
- "dashboard.doctor.age.none": "\u6682\u65E0\u8BB0\u5F55",
808
- "dashboard.doctor.age.seconds": "{count} \u79D2\u524D",
809
- "dashboard.doctor.age.minutes": "{count} \u5206\u949F\u524D",
810
- "dashboard.doctor.age.hours": "{count} \u5C0F\u65F6\u524D",
811
- "dashboard.doctor.age.days": "{count} \u5929\u524D",
812
- "dashboard.doctor.age.weeks": "{count} \u5468\u524D",
813
- "dashboard.shared.refresh": "\u5237\u65B0",
814
- "dashboard.shared.loading": "\u52A0\u8F7D\u4E2D",
815
- "dashboard.shared.status.ok": "\u6B63\u5E38",
816
- "dashboard.shared.status.warn": "\u8B66\u544A",
817
- "dashboard.shared.status.error": "\u9519\u8BEF",
818
- "dashboard.shared.status.confirmed": "\u5DF2\u786E\u8BA4",
819
- "dashboard.shared.status.hash-drift": "\u54C8\u5E0C\u6F02\u79FB",
820
- "dashboard.shared.status.stale": "\u8FC7\u671F",
821
- "dashboard.shared.status.orphan": "\u5B64\u7ACB",
822
- "dashboard.shared.status.attention": "\u6CE8\u610F",
823
- "dashboard.source.ai": "AI",
824
- "dashboard.source.human": "\u4EBA\u5DE5",
825
- "dashboard.timeline-entry.aria-label": "{source} \u610F\u56FE {intent}",
826
- "dashboard.timeline-entry.working-tree": "\u5DE5\u4F5C\u533A",
827
- "dashboard.timeline-entry.parent": "\u7236\u63D0\u4EA4 {parent}",
828
- "dashboard.timeline-entry.paths": "\u8DEF\u5F84",
829
- "dashboard.timeline-entry.annotate": "\u6DFB\u52A0\u6CE8\u91CA",
830
- "dashboard.timeline-entry.annotation-label": "\u4EBA\u5DE5\u6CE8\u91CA",
831
- "dashboard.timeline-entry.annotation-placeholder": "\u8BF4\u660E\u5BA1\u6838\u7ED3\u8BBA\u6216\u6279\u51C6\u80CC\u666F...",
832
- "dashboard.timeline-entry.annotation-save": "\u4FDD\u5B58\u6CE8\u91CA",
833
- "dashboard.tree-node.locked": "\u5DF2\u9501\u5B9A",
834
- "dashboard.tree-node.stale.hash-mismatch": "\u54C8\u5E0C\u4E0D\u5339\u914D",
835
- "dashboard.tree-node.stale.orphan": "\u5B64\u7ACB",
836
- "dashboard.lock-card.aria-label": "{file} {lineRange} {status}",
837
- "dashboard.lock-card.status.drift": "\u54C8\u5E0C\u6F02\u79FB",
838
- "dashboard.lock-card.status.confirmed": "\u5DF2\u786E\u8BA4",
839
- "dashboard.lock-card.hash.locked": "\u9501\u5B9A\u54C8\u5E0C",
840
- "dashboard.lock-card.hash.current": "\u5F53\u524D\u54C8\u5E0C",
841
- "dashboard.lock-card.hash.diff": "\u5DEE\u5F02",
842
- "dashboard.lock-card.preview.drift": "\u6F02\u79FB",
843
- "dashboard.lock-card.preview.sync": "\u540C\u6B65",
844
- "dashboard.lock-card.preview.drift-detail": "\u54C8\u5E0C\u4E0E\u53D7\u4FDD\u62A4\u533A\u57DF\u4E0D\u4E00\u81F4\u3002",
845
- "dashboard.lock-card.preview.sync-detail": "\u53D7\u4FDD\u62A4\u533A\u57DF\u5F53\u524D\u4FDD\u6301\u540C\u6B65\u3002",
846
- "dashboard.lock-card.footer.region": "\u53D7\u4FDD\u62A4\u533A\u57DF \xB7 {count} \u884C",
847
- "dashboard.lock-card.button.approve": "\u6279\u51C6\u65B0\u54C8\u5E0C",
848
- "dashboard.lock-card.button.confirmed": "\u5DF2\u786E\u8BA4",
849
- "dashboard.lock-card.diff.hash-mismatch": "\u54C8\u5E0C\u4E0D\u4E00\u81F4",
850
- "dashboard.lock-card.diff.no-changes": "\u65E0\u53D8\u66F4",
851
- "dashboard.lock-card.diff.with-bytes": "+{added} / -{removed} \xB7 {bytes} \u5B57\u8282",
852
- "dashboard.lock-card.diff.without-bytes": "+{added} / -{removed}",
853
- "dashboard.approve-button.retry": "\u91CD\u8BD5",
854
- "dashboard.readiness.filter.analysis": "\u9879\u76EE\u5206\u6790",
855
- "dashboard.readiness.loading": "\u6B63\u5728\u52A0\u8F7D\u626B\u63CF\u6570\u636E...",
856
- "dashboard.readiness.summary.framework": "\u6846\u67B6",
857
- "dashboard.readiness.summary.files": "\u6587\u4EF6",
858
- "dashboard.readiness.summary.status": "Fabric \u72B6\u6001",
859
- "dashboard.readiness.card.evidence": "\u51C6\u5907\u60C5\u51B5\u51ED\u8BC1",
860
- "dashboard.readiness.card.recommendations": "\u5EFA\u8BAE\u4E0E\u540E\u7EED\u6B65\u9AA4",
861
- "dashboard.readiness.readme.description": "\u9879\u76EE\u6587\u6863\u7684\u8D28\u91CF",
862
- "dashboard.readiness.contributing.description": "AI\u4E0E\u4EBA\u7C7B\u534F\u4F5C\u7684\u8D21\u732E\u6307\u5357",
863
- "dashboard.readiness.fully-ready": "\u9879\u76EE\u5DF2\u5B8C\u5168\u51C6\u5907\u5C31\u7EEA\u3002",
864
- "dashboard.readiness.init-prompt": "\u8FD0\u884C\u6B64\u547D\u4EE4\u8FDB\u884C\u521D\u59CB\u5316\uFF1A",
865
- "dashboard.rules-explain.analyze": "\u5206\u6790\u8DEF\u5F84",
866
- "dashboard.rules-explain.detail.topology-type": "\u62D3\u6251\u7C7B\u578B",
867
- "dashboard.timeline.history-replay.title": "\u5386\u53F2\u56DE\u653E",
868
- "dashboard.timeline.close": "\u5173\u95ED",
869
- "dashboard.health.ledger-path.label": "\u4E8B\u4EF6\u8D26\u672C\u8DEF\u5F84",
870
- "dashboard.health.ledger-path.detail": "\u53EA\u80FD\u8FFD\u52A0\u5199\u5165\u7684\u65F6\u95F4\u7EBF\u6570\u636E\u6E90",
871
- "dashboard.health.boundary.title": "\u63A7\u5236\u5E73\u9762\u8FB9\u754C",
872
- "dashboard.health.boundary.description": "Web \u63A7\u5236\u53F0\u4F5C\u4E3A\u7EAF\u67E5\u770B\u5668 (Viewer) \u8FD0\u884C\u3002\u6240\u6709\u89C4\u5219\u3001\u5143\u6570\u636E\u548C\u4FEE\u590D\u64CD\u4F5C\u90FD\u5FC5\u987B\u901A\u8FC7 CLI \u8FDB\u884C\u7BA1\u7406\u3002",
873
- "dashboard.health.boundary.cli-action": "\u9700\u8981\u6267\u884C CLI \u64CD\u4F5C\uFF1A",
874
- "dashboard.health.boundary.cli-prompt": "\u68C0\u6D4B\u5230 {count} \u4E2A\u53EF\u4FEE\u590D\u7684\u95EE\u9898\u3002\u8BF7\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C\u4EE5\u4E0B\u547D\u4EE4\u4EE5\u81EA\u52A8\u4FEE\u590D\u5143\u6570\u636E\u3002",
875
- "dashboard.health.runtime.connected": "MCP \u8FD0\u884C\u65F6\u5DF2\u8FDE\u63A5",
876
- "dashboard.health.runtime.disconnected": "MCP \u8FD0\u884C\u65F6\u5DF2\u65AD\u5F00"
877
- };
878
-
879
- // src/i18n/create-translator.ts
880
- var defaultMessages = {
881
- en: enMessages,
882
- "zh-CN": zhCNMessages
883
- };
884
- function createTranslator(locale, messages = defaultMessages) {
885
- const activeMessages = messages[locale] ?? messages.en;
886
- const fallbackMessages = messages.en;
887
- return (key, vars) => {
888
- const template = activeMessages[key] ?? fallbackMessages[key] ?? key;
889
- if (vars === void 0) {
890
- return template;
891
- }
892
- return Object.entries(vars).reduce((message, [name, value]) => {
893
- return message.replaceAll(`{${name}}`, value);
894
- }, template);
895
- };
896
- }
897
-
898
- // src/i18n/normalize-locale.ts
899
- function normalizeLocale(raw) {
900
- if (typeof raw !== "string") {
901
- return "en";
902
- }
903
- const normalized = raw.trim().toLowerCase().replace(/\..*$/, "").replace(/_/g, "-");
904
- if (normalized.length === 0) {
905
- return "en";
906
- }
907
- if (normalized === "zh" || normalized.startsWith("zh-")) {
908
- return "zh-CN";
909
- }
910
- return "en";
911
- }
912
-
913
- // src/i18n/detect-node-locale.ts
914
- function detectNodeLocale() {
915
- const fromFabricEnv = process.env.FAB_LANG;
916
- if (typeof fromFabricEnv === "string" && fromFabricEnv.trim().length > 0) {
917
- return normalizeLocale(fromFabricEnv);
918
- }
919
- const fromLangEnv = process.env.LANG;
920
- if (typeof fromLangEnv === "string" && fromLangEnv.trim().length > 0) {
921
- return normalizeLocale(fromLangEnv);
922
- }
923
- return "en";
924
- }
925
-
926
- // src/i18n/protected-tokens.ts
927
- var PROTECTED_TOKENS = [
928
- // v2.0 MCP tool names
929
- "fab_plan_context",
930
- "fab_get_knowledge_sections",
931
- "fab_extract_knowledge",
932
- "fab_review",
933
- // Project convergence point + knowledge tree paths
934
- "AGENTS.md",
935
- ".fabric/agents/",
936
- ".fabric/agents/_cross/",
937
- ".fabric/agents.meta.json",
938
- ".fabric/human-lock.json",
939
- ".fabric/events.jsonl",
940
- ".fabric/knowledge/",
941
- // Event types templates reference verbatim
942
- "knowledge_proposed",
943
- // Human-lock marker
944
- "@HUMAN",
945
- // Hard-rule keywords AI clients rely on for compliance
946
- "MUST",
947
- "NEVER"
948
- ];
949
-
950
- export {
951
- enMessages,
952
- zhCNMessages,
953
- defaultMessages,
954
- createTranslator,
955
- normalizeLocale,
956
- detectNodeLocale,
957
- PROTECTED_TOKENS
958
- };