@fenglimg/fabric-shared 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,605 @@
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.bootstrap.description": "Install Fabric bootstrap prompts for supported AI clients.",
22
+ "cli.bootstrap.install.description": "Copy Fabric bootstrap templates into native client locations.",
23
+ "cli.bootstrap.install.args.clients.description": "Optional comma-separated client filter, for example claude,cursor,codex.",
24
+ "cli.bootstrap.install.no-targets": "No bootstrap targets detected. Pass --clients claude,cursor,windsurf,roo,gemini,codex to install explicitly.",
25
+ "cli.bootstrap.install.installed": "Installed {path}",
26
+ "cli.bootstrap.install.skipped-header": "Skipped {path}: Fabric Bootstrap header already present.",
27
+ "cli.bootstrap.install.prepended": "Prepended {path}",
28
+ "cli.bootstrap.errors.unknown-client": 'Unknown client "{client}". Use a comma-separated list such as claude,cursor,codex.',
29
+ "cli.config.description": "Manage Fabric MCP client configuration.",
30
+ "cli.config.install.description": "Install Fabric MCP server entries into detected client configs.",
31
+ "cli.config.install.args.clients.description": "Optional comma-separated client filter, for example cursor,codex,gemini.",
32
+ "cli.config.install.args.dry-run.description": "Preview detected write operations without modifying files.",
33
+ "cli.config.errors.unknown-client": 'Unknown client "{client}". Use a comma-separated list such as cursor,codex,gemini.',
34
+ "cli.config.errors.expected-object": "Expected object in {path}",
35
+ "cli.config.install.no-configs": "No Fabric MCP client config detected. Create the client directory or set clientPaths in fabric.config.json.",
36
+ "cli.config.install.no-config-path": "Skipping {client}: no config path detected.",
37
+ "cli.config.install.dry-run": "[dry-run] {client}: would write {path}",
38
+ "cli.config.install.wrote": "{client}: wrote {path}",
39
+ "cli.hooks.description": "Manage Fabric Git hook templates.",
40
+ "cli.hooks.install.description": "Install the Fabric Husky pre-commit hook template.",
41
+ "cli.hooks.install.args.target.description": "Target project path, default is the current working directory.",
42
+ "cli.hooks.errors.package-json-required": "package.json is required to install hooks: {path}",
43
+ "cli.hooks.install.hook-skipped": "Fabric hook already present in {path}, skipped.",
44
+ "cli.hooks.install.hook-appended": "Appended Fabric hook to existing {path}",
45
+ "cli.hooks.install.hook-created": "Created {path}",
46
+ "cli.hooks.install.prepare-left": "Left existing prepare script unchanged in {path}",
47
+ "cli.hooks.install.prepare-added": "Added prepare script to {path}",
48
+ "cli.human-lint.description": "Validate locked human-edit regions.",
49
+ "cli.human-lint.args.target.description": "Target project path, default is the current working directory.",
50
+ "cli.human-lint.drift-detected": "Human-locked content drift detected. Revert the edit or update approved hashes before committing.",
51
+ "cli.human-lint.table.location": "Location",
52
+ "cli.human-lint.table.expected": "Expected",
53
+ "cli.human-lint.table.got": "Got",
54
+ "cli.init.description": "Initialize Fabric in the target project.",
55
+ "cli.init.args.target.description": "Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.",
56
+ "cli.init.args.debug.description": "Print target resolution details to stderr.",
57
+ "cli.init.created-path": "{label} {path}",
58
+ "cli.init.skipped-existing-path": "{label} {path}: already exists.",
59
+ "cli.init.next-step": "{label} {message}",
60
+ "cli.init.reason-message": "{label} {message}",
61
+ "cli.init.next-step.message": "run fab hooks install to add the Day 4 pre-commit pipeline.",
62
+ "cli.init.reason-message.body": ".fabric/forensic.json is ready; use the agents-md-init skill to finish AGENTS.md initialization.",
63
+ "cli.init.claude-settings.created": "{label} {path} with Claude Stop hook.",
64
+ "cli.init.claude-settings.updated": "{label} {path} with Claude Stop hook.",
65
+ "cli.init.claude-settings.skipped": "{label} {path}: Claude Stop hook already present.",
66
+ "cli.init.claude-settings.skipped-invalid": "{label} {path}: unable to merge Claude Stop hook.",
67
+ "cli.init.claude-settings.invalid-object": "{label} {path}: expected a JSON object.",
68
+ "cli.init.claude-settings.invalid-json": "{label} {path}: invalid JSON ({reason}).",
69
+ "cli.init.claude-settings.invalid-hooks": '{label} {path}: "hooks" must be a JSON object.',
70
+ "cli.init.claude-settings.invalid-stop-array": '{label} {path}: "hooks.Stop" must be an array.',
71
+ "cli.init.errors.abort-existing": "ABORT: {path} already exists. fab init is non-destructive.",
72
+ "cli.ledger-append.description": "Append an entry to the Fabric intent ledger.",
73
+ "cli.ledger-append.args.target.description": "Target project path, default is the current working directory.",
74
+ "cli.ledger-append.args.staged.description": "Derive the entry from staged changes (used during pre-commit).",
75
+ "cli.ledger-append.requires-staged": "requires --staged in pre-commit context",
76
+ "cli.ledger-append.intent.auto": "auto: {head}{suffix}",
77
+ "cli.ledger-append.intent.auto-more": " +{count} more",
78
+ "cli.pre-commit.description": "Composite pre-commit hook: runs sync-meta --check-only, human-lint, and ledger-append --staged in one Node process.",
79
+ "cli.pre-commit.args.target.description": "Project root directory, defaults to cwd or EXTERNAL_FIXTURE_PATH.",
80
+ "cli.pre-commit.run-failed": "fabric pre-commit: {name} failed - {message}",
81
+ "cli.scan.description": "Scan the project to detect Fabric bootstrap candidates.",
82
+ "cli.scan.args.target.description": "Target absolute path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.",
83
+ "cli.scan.args.debug.description": "Print detection evidence in formatted output.",
84
+ "cli.scan.args.json.description": "Print the diagnostic report as JSON.",
85
+ "cli.scan.report.title": "Fabric scan report",
86
+ "cli.scan.report.target": "Target",
87
+ "cli.scan.report.framework": "Framework",
88
+ "cli.scan.report.evidence": "Evidence",
89
+ "cli.scan.report.readme-quality": "README quality",
90
+ "cli.scan.report.contributing": "CONTRIBUTING.md",
91
+ "cli.scan.report.files-counted": "Files counted",
92
+ "cli.scan.report.ignored-entries": "Ignored entries",
93
+ "cli.scan.report.existing-fabric": "Existing Fabric files",
94
+ "cli.scan.report.recommendations": "Recommendations:",
95
+ "cli.scan.readme-quality.ok": "ok",
96
+ "cli.scan.readme-quality.stub": "stub",
97
+ "cli.scan.recommendation.init": "L0: Run fab init to scaffold AGENTS.md with TODO markers.",
98
+ "cli.scan.recommendation.readme": "L0: Expand README.md before promoting project facts into AGENTS.md references.",
99
+ "cli.scan.recommendation.contributing": "L0: Add CONTRIBUTING.md or leave an AGENTS.md TODO reference for contribution flow.",
100
+ "cli.scan.recommendation.unknown-framework": "L1: Add tech-stack TODOs manually because no framework marker was detected.",
101
+ "cli.scan.recommendation.framework-dirs": "L1: Review {framework} directories for future scoped AGENTS.md files.",
102
+ "cli.serve.description": "Start the local Fabric MCP HTTP service. Set FABRIC_AUTH_TOKEN to enable Bearer auth for non-localhost binding.",
103
+ "cli.serve.args.port.description": "Listen port, default 7373.",
104
+ "cli.serve.args.host.description": "Listen host, default 127.0.0.1. Set FABRIC_AUTH_TOKEN to enable Bearer auth for non-localhost binding.",
105
+ "cli.serve.args.target.description": "Target project path. Defaults to CLI arg, EXTERNAL_FIXTURE_PATH, fabric.config.json, then cwd.",
106
+ "cli.serve.args.debug.description": "Print target resolution details to stderr.",
107
+ "cli.serve.ready.title": "Fabric Dashboard",
108
+ "cli.serve.warning.host-fallback": "--host {host} requires FABRIC_AUTH_TOKEN; falling back to 127.0.0.1 for safety",
109
+ "cli.serve.error.port-in-use": "Port {port} in use - try --port {nextPort}",
110
+ "cli.sync-meta.description": "Sync Fabric metadata from AGENTS.md files.",
111
+ "cli.sync-meta.args.target.description": "Target project path, default is the current working directory.",
112
+ "cli.sync-meta.args.check-only.description": "Exit with code 1 when .fabric/agents.meta.json is out of date.",
113
+ "cli.sync-meta.drift-detected": "Fabric metadata drift detected. Run fab sync-meta to update.",
114
+ "cli.sync-meta.updated": "{label} {path}",
115
+ "dashboard.app.nav.aria-label": "Dashboard views",
116
+ "dashboard.app.nav.rules.label": "Rules Tree",
117
+ "dashboard.app.nav.rules.label-bilingual": "\u89C4\u5219\u6811 Rules Tree",
118
+ "dashboard.app.nav.rules.subtitle": "meta graph",
119
+ "dashboard.app.nav.locks.label": "Human Lock",
120
+ "dashboard.app.nav.locks.label-bilingual": "\u4EBA\u5DE5\u9501 Human Lock",
121
+ "dashboard.app.nav.locks.subtitle": "protected regions",
122
+ "dashboard.app.nav.timeline.label": "Intent Timeline",
123
+ "dashboard.app.nav.timeline.label-bilingual": "\u610F\u56FE\u65F6\u95F4\u7EBF Intent Timeline",
124
+ "dashboard.app.nav.timeline.subtitle": "ledger stream",
125
+ "dashboard.app.nav.history.label": "History Replay",
126
+ "dashboard.app.nav.history.label-bilingual": "\u5386\u53F2\u56DE\u653E History Replay",
127
+ "dashboard.app.nav.history.subtitle": "time travel",
128
+ "dashboard.app.nav.doctor.label": "Doctor",
129
+ "dashboard.app.nav.doctor.label-bilingual": "\u8BCA\u65AD\u53F0 Doctor",
130
+ "dashboard.app.nav.doctor.subtitle": "fab diagnostics",
131
+ "dashboard.app.nav.section.diagnostics": "Diagnostics",
132
+ "dashboard.app.nav.drift-check": "Drift Check",
133
+ "dashboard.app.header.connected": "CONNECTED",
134
+ "dashboard.app.header.connecting": "CONNECTING",
135
+ "dashboard.app.live-region.received": "Received {type}",
136
+ "dashboard.app.breadcrumb.rules": "rules-tree",
137
+ "dashboard.app.breadcrumb.locks": "human-lock",
138
+ "dashboard.app.breadcrumb.timeline": "intent-timeline",
139
+ "dashboard.app.breadcrumb.history": "history-replay",
140
+ "dashboard.app.breadcrumb.doctor": "doctor",
141
+ "dashboard.rules-tree.title": "Rules Tree Browser",
142
+ "dashboard.rules-tree.subtitle": ".fabric/agents.meta.json \xB7 L0/L1/L2 hierarchy \xB7 hash drift aware",
143
+ "dashboard.rules-tree.filter.placeholder": "Filter by file, glob, priority, hash...",
144
+ "dashboard.rules-tree.filter.aria-label": "Filter rules tree",
145
+ "dashboard.rules-tree.status.loading": "loading rules",
146
+ "dashboard.rules-tree.status.nodes": "{count} nodes \xB7 rev {revision}",
147
+ "dashboard.rules-tree.status.locks": "{count} human locks",
148
+ "dashboard.rules-tree.empty": "No matching rules found.",
149
+ "dashboard.rules-tree.tree.aria-label": "Fabric rules tree",
150
+ "dashboard.rules-tree.detail.title": "Node Detail",
151
+ "dashboard.rules-tree.detail.empty": "Select a rule node to inspect scope, dependencies, priority and hash.",
152
+ "dashboard.rules-tree.detail.file": "file",
153
+ "dashboard.rules-tree.detail.scope": "scope",
154
+ "dashboard.rules-tree.detail.priority": "priority",
155
+ "dashboard.rules-tree.detail.hash": "hash",
156
+ "dashboard.rules-tree.detail.no-deps": "no deps",
157
+ "dashboard.human-lock.title": "Human Lock Vault",
158
+ "dashboard.human-lock.subtitle": "Protected regions awaiting approval \xB7 ritual writes only",
159
+ "dashboard.human-lock.filters.aria-label": "Human lock filters",
160
+ "dashboard.human-lock.filters.all": "all",
161
+ "dashboard.human-lock.filters.drift": "drift",
162
+ "dashboard.human-lock.filters.approved": "approved",
163
+ "dashboard.human-lock.summary": "{drift} drift \xB7 {approved} confirmed",
164
+ "dashboard.human-lock.empty": "No human lock entries for this filter.",
165
+ "dashboard.intent-timeline.title": "Intent Timeline",
166
+ "dashboard.intent-timeline.subtitle": ".intent-ledger.jsonl \xB7 dual-column AI | Human \xB7 sorted by timestamp desc",
167
+ "dashboard.intent-timeline.filter.label": "Source",
168
+ "dashboard.intent-timeline.filter.all": "All",
169
+ "dashboard.intent-timeline.summary": "AI {aiCount} \xB7 Human {humanCount}",
170
+ "dashboard.intent-timeline.columns.ai.title": "AI",
171
+ "dashboard.intent-timeline.columns.ai.entries": "{count} entries",
172
+ "dashboard.intent-timeline.columns.human.title": "Human",
173
+ "dashboard.intent-timeline.columns.human.entries": "{count} entries",
174
+ "dashboard.intent-timeline.empty": "No ledger entries found.",
175
+ "dashboard.intent-timeline.annotate.missing-id": "Cannot annotate a ledger entry without an id.",
176
+ "dashboard.history-replay.title": "History Replay",
177
+ "dashboard.history-replay.subtitle": "Time-travel through ledger commits and rehydrate the rules tree at any recorded point",
178
+ "dashboard.history-replay.toolbar.scrub": "Scrub",
179
+ "dashboard.history-replay.toolbar.latest": "Latest",
180
+ "dashboard.history-replay.selected.none": "No historical entry selected",
181
+ "dashboard.history-replay.status.replay-points": "{count} replay points",
182
+ "dashboard.history-replay.status.entries-applied": "{count} entries applied",
183
+ "dashboard.history-replay.empty.entries": "No ledger entries found for replay.",
184
+ "dashboard.history-replay.state.title": "Viewing state as of {label}",
185
+ "dashboard.history-replay.state.meta": "ledger {ledgerId} \xB7 commit {commit} \xB7 {mode}",
186
+ "dashboard.history-replay.status.loading": "loading snapshot",
187
+ "dashboard.history-replay.status.nodes": "{count} nodes",
188
+ "dashboard.history-replay.status.unknown-revision": "unknown revision",
189
+ "dashboard.history-replay.tree.aria-label": "Historical Fabric rules tree",
190
+ "dashboard.history-replay.empty.loading": "Loading historical snapshot...",
191
+ "dashboard.history-replay.empty.select": "Select a timeline entry to replay its state.",
192
+ "dashboard.history-replay.meta.not-available": "unavailable",
193
+ "dashboard.history-replay.meta.pending": "pending",
194
+ "dashboard.history-replay.meta.na": "n/a",
195
+ "dashboard.doctor.title": "Doctor Console",
196
+ "dashboard.doctor.subtitle": "fab doctor surface \xB7 framework, entry points, revision drift, protected paths",
197
+ "dashboard.doctor.toolbar.overall": "Overall",
198
+ "dashboard.doctor.toolbar.no-summary": "No summary yet",
199
+ "dashboard.doctor.toolbar.entry-points-summary": "{framework} \xB7 {count} entry points",
200
+ "dashboard.doctor.toolbar.entry-point-summary": "{framework} \xB7 {count} entry point",
201
+ "dashboard.doctor.empty.loading": "Loading doctor report...",
202
+ "dashboard.doctor.summary.framework": "Framework",
203
+ "dashboard.doctor.summary.protected-paths": "Protected paths",
204
+ "dashboard.doctor.summary.intent-ledger": "Intent ledger",
205
+ "dashboard.doctor.summary.no-meta-revision": "No meta revision yet",
206
+ "dashboard.doctor.summary.tracked-paths.none": "No tracked paths",
207
+ "dashboard.doctor.summary.tracked-paths.some": "{count} tracked",
208
+ "dashboard.doctor.summary.hashes-intact": "All approved hashes intact",
209
+ "dashboard.doctor.summary.drifted": "{count} drifted",
210
+ "dashboard.doctor.summary.no-ledger-entries": "No ledger entries yet",
211
+ "dashboard.doctor.card.entry-points": "Entry points",
212
+ "dashboard.doctor.card.checks": "Checks",
213
+ "dashboard.doctor.empty.entry-points": "No current entry points detected.",
214
+ "dashboard.doctor.framework.unknown": "unknown",
215
+ "dashboard.doctor.age.none": "No entries",
216
+ "dashboard.doctor.age.seconds": "{count}s ago",
217
+ "dashboard.doctor.age.minutes": "{count}m ago",
218
+ "dashboard.doctor.age.hours": "{count}h ago",
219
+ "dashboard.doctor.age.days": "{count}d ago",
220
+ "dashboard.doctor.age.weeks": "{count}w ago",
221
+ "dashboard.shared.refresh": "Refresh",
222
+ "dashboard.shared.loading": "loading",
223
+ "dashboard.shared.status.ok": "ok",
224
+ "dashboard.shared.status.warn": "warn",
225
+ "dashboard.shared.status.error": "error",
226
+ "dashboard.shared.status.confirmed": "confirmed",
227
+ "dashboard.shared.status.hash-drift": "hash drift",
228
+ "dashboard.shared.status.stale": "stale",
229
+ "dashboard.shared.status.orphan": "orphan",
230
+ "dashboard.shared.status.attention": "attention",
231
+ "dashboard.source.ai": "AI",
232
+ "dashboard.source.human": "Human",
233
+ "dashboard.timeline-entry.aria-label": "{source} intent {intent}",
234
+ "dashboard.timeline-entry.working-tree": "working tree",
235
+ "dashboard.timeline-entry.parent": "parent {parent}",
236
+ "dashboard.timeline-entry.paths": "paths",
237
+ "dashboard.timeline-entry.annotate": "Annotate",
238
+ "dashboard.timeline-entry.annotation-label": "Human annotation",
239
+ "dashboard.timeline-entry.annotation-placeholder": "Explain review outcome or approval context...",
240
+ "dashboard.timeline-entry.annotation-save": "Save annotation",
241
+ "dashboard.tree-node.locked": "locked",
242
+ "dashboard.tree-node.stale.hash-mismatch": "hash mismatch",
243
+ "dashboard.tree-node.stale.orphan": "orphan",
244
+ "dashboard.lock-card.aria-label": "{file} {lineRange} {status}",
245
+ "dashboard.lock-card.status.drift": "hash drift",
246
+ "dashboard.lock-card.status.confirmed": "confirmed",
247
+ "dashboard.lock-card.hash.locked": "locked hash",
248
+ "dashboard.lock-card.hash.current": "current hash",
249
+ "dashboard.lock-card.hash.diff": "diff",
250
+ "dashboard.lock-card.preview.drift": "DRIFT",
251
+ "dashboard.lock-card.preview.sync": "SYNC",
252
+ "dashboard.lock-card.preview.drift-detail": "Hash differs from protected region.",
253
+ "dashboard.lock-card.preview.sync-detail": "Protected region is in sync.",
254
+ "dashboard.lock-card.footer.region": "protected region \xB7 {count} lines",
255
+ "dashboard.lock-card.button.approve": "Approve new hash",
256
+ "dashboard.lock-card.button.confirmed": "Confirmed",
257
+ "dashboard.lock-card.diff.hash-mismatch": "hash mismatch",
258
+ "dashboard.lock-card.diff.no-changes": "no changes",
259
+ "dashboard.lock-card.diff.with-bytes": "+{added} / -{removed} \xB7 {bytes} bytes",
260
+ "dashboard.lock-card.diff.without-bytes": "+{added} / -{removed}",
261
+ "dashboard.approve-button.retry": "Retry"
262
+ };
263
+
264
+ // src/i18n/locales/zh-CN.ts
265
+ var zhCNMessages = {
266
+ "cli.main.description": "Fabric CLI - AI \u667A\u80FD\u4F53\u534F\u4F5C\u6846\u67B6",
267
+ "cli.shared.created": "\u5DF2\u521B\u5EFA",
268
+ "cli.shared.skipped": "\u5DF2\u8DF3\u8FC7",
269
+ "cli.shared.next": "\u4E0B\u4E00\u6B65",
270
+ "cli.shared.reason": "\u539F\u56E0",
271
+ "cli.shared.updated": "\u5DF2\u66F4\u65B0",
272
+ "cli.shared.missing": "\u7F3A\u5931",
273
+ "cli.shared.present": "\u5B58\u5728",
274
+ "cli.shared.absent": "\u7F3A\u5931",
275
+ "cli.shared.yes": "\u662F",
276
+ "cli.shared.no": "\u5426",
277
+ "cli.shared.none": "\u65E0",
278
+ "cli.shared.loading": "\u52A0\u8F7D\u4E2D",
279
+ "cli.shared.refresh": "\u5237\u65B0",
280
+ "cli.shared.target-invalid": "\u76EE\u6807\u5FC5\u987B\u662F\u5DF2\u5B58\u5728\u7684\u76EE\u5F55\uFF1A{target}",
281
+ "cli.shared.template-not-found": "\u672A\u627E\u5230\u6A21\u677F\uFF1A{path}",
282
+ "cli.shared.invalid-host-empty": "\u65E0\u6548 host\uFF1A<empty>",
283
+ "cli.shared.invalid-port": "\u65E0\u6548\u7AEF\u53E3\uFF1A{value}",
284
+ "cli.bootstrap.description": "\u4E3A\u652F\u6301\u7684 AI \u5BA2\u6237\u7AEF\u5B89\u88C5 Fabric \u5F15\u5BFC\u63D0\u793A\u6A21\u677F\u3002",
285
+ "cli.bootstrap.install.description": "\u5C06 Fabric \u5F15\u5BFC\u6A21\u677F\u590D\u5236\u5230\u5404\u5BA2\u6237\u7AEF\u7684\u539F\u751F\u4F4D\u7F6E\u3002",
286
+ "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",
287
+ "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,windsurf,roo,gemini,codex\u3002",
288
+ "cli.bootstrap.install.installed": "\u5DF2\u5B89\u88C5 {path}",
289
+ "cli.bootstrap.install.skipped-header": "\u5DF2\u8DF3\u8FC7 {path}\uFF1AFabric Bootstrap \u5934\u90E8\u5DF2\u5B58\u5728\u3002",
290
+ "cli.bootstrap.install.prepended": "\u5DF2\u524D\u7F6E\u5199\u5165 {path}",
291
+ "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",
292
+ "cli.config.description": "\u7BA1\u7406 Fabric MCP \u5BA2\u6237\u7AEF\u914D\u7F6E\u3002",
293
+ "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",
294
+ "cli.config.install.args.clients.description": "\u53EF\u9009\u7684\u9017\u53F7\u5206\u9694\u5BA2\u6237\u7AEF\u8FC7\u6EE4\u5668\uFF0C\u4F8B\u5982 cursor,codex,gemini\u3002",
295
+ "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",
296
+ "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,gemini\u3002",
297
+ "cli.config.errors.expected-object": "{path} \u4E2D\u5E94\u4E3A\u5BF9\u8C61\u3002",
298
+ "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",
299
+ "cli.config.install.no-config-path": "\u8DF3\u8FC7 {client}\uFF1A\u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u8DEF\u5F84\u3002",
300
+ "cli.config.install.dry-run": "[dry-run] {client}\uFF1A\u5C06\u5199\u5165 {path}",
301
+ "cli.config.install.wrote": "{client}\uFF1A\u5DF2\u5199\u5165 {path}",
302
+ "cli.hooks.description": "\u7BA1\u7406 Fabric Git \u94A9\u5B50\u6A21\u677F\u3002",
303
+ "cli.hooks.install.description": "\u5B89\u88C5 Fabric Husky pre-commit \u94A9\u5B50\u6A21\u677F\u3002",
304
+ "cli.hooks.install.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
305
+ "cli.hooks.errors.package-json-required": "\u5B89\u88C5 hooks \u9700\u8981 package.json\uFF1A{path}",
306
+ "cli.hooks.install.hook-skipped": "{path} \u4E2D\u5DF2\u5B58\u5728 Fabric hook\uFF0C\u5DF2\u8DF3\u8FC7\u3002",
307
+ "cli.hooks.install.hook-appended": "\u5DF2\u5411\u73B0\u6709 {path} \u8FFD\u52A0 Fabric hook",
308
+ "cli.hooks.install.hook-created": "\u5DF2\u521B\u5EFA {path}",
309
+ "cli.hooks.install.prepare-left": "\u4FDD\u7559 {path} \u4E2D\u539F\u6709\u7684 prepare \u811A\u672C\u4E0D\u53D8",
310
+ "cli.hooks.install.prepare-added": "\u5DF2\u5411 {path} \u6DFB\u52A0 prepare \u811A\u672C",
311
+ "cli.human-lint.description": "\u9A8C\u8BC1\u9501\u5B9A\u7684\u4EBA\u5DE5\u7F16\u8F91\u533A\u5757\u3002",
312
+ "cli.human-lint.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
313
+ "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",
314
+ "cli.human-lint.table.location": "\u4F4D\u7F6E",
315
+ "cli.human-lint.table.expected": "\u9884\u671F",
316
+ "cli.human-lint.table.got": "\u5B9E\u9645",
317
+ "cli.init.description": "\u5728\u76EE\u6807\u9879\u76EE\u4E2D\u521D\u59CB\u5316 Fabric\u3002",
318
+ "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",
319
+ "cli.init.args.debug.description": "\u5C06\u76EE\u6807\u89E3\u6790\u7EC6\u8282\u8F93\u51FA\u5230 stderr\u3002",
320
+ "cli.init.created-path": "{label} {path}",
321
+ "cli.init.skipped-existing-path": "{label} {path}\uFF1A\u5DF2\u5B58\u5728\u3002",
322
+ "cli.init.next-step": "{label} {message}",
323
+ "cli.init.reason-message": "{label} {message}",
324
+ "cli.init.next-step.message": "\u8FD0\u884C fab hooks install \u4EE5\u6DFB\u52A0\u7B2C 4 \u5929\u7684 pre-commit \u6D41\u6C34\u7EBF\u3002",
325
+ "cli.init.reason-message.body": ".fabric/forensic.json \u5DF2\u5C31\u7EEA\uFF1B\u8BF7\u4F7F\u7528 agents-md-init skill \u5B8C\u6210 AGENTS.md \u521D\u59CB\u5316\u3002",
326
+ "cli.init.claude-settings.created": "{label} {path}\uFF0C\u5E76\u5199\u5165 Claude Stop hook\u3002",
327
+ "cli.init.claude-settings.updated": "{label} {path}\uFF0C\u5E76\u5199\u5165 Claude Stop hook\u3002",
328
+ "cli.init.claude-settings.skipped": "{label} {path}\uFF1AClaude Stop hook \u5DF2\u5B58\u5728\u3002",
329
+ "cli.init.claude-settings.skipped-invalid": "{label} {path}\uFF1A\u65E0\u6CD5\u5408\u5E76 Claude Stop hook\u3002",
330
+ "cli.init.claude-settings.invalid-object": "{label} {path}\uFF1A\u9884\u671F\u4E3A JSON \u5BF9\u8C61\u3002",
331
+ "cli.init.claude-settings.invalid-json": "{label} {path}\uFF1AJSON \u65E0\u6548\uFF08{reason}\uFF09\u3002",
332
+ "cli.init.claude-settings.invalid-hooks": '{label} {path}\uFF1A"hooks" \u5FC5\u987B\u662F JSON \u5BF9\u8C61\u3002',
333
+ "cli.init.claude-settings.invalid-stop-array": '{label} {path}\uFF1A"hooks.Stop" \u5FC5\u987B\u662F\u6570\u7EC4\u3002',
334
+ "cli.init.errors.abort-existing": "\u4E2D\u6B62\uFF1A{path} \u5DF2\u5B58\u5728\u3002fab init \u662F\u975E\u7834\u574F\u6027\u7684\u3002",
335
+ "cli.ledger-append.description": "\u5411 Fabric \u610F\u56FE\u65E5\u5FD7\u8FFD\u52A0\u4E00\u6761\u8BB0\u5F55\u3002",
336
+ "cli.ledger-append.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
337
+ "cli.ledger-append.args.staged.description": "\u4ECE\u6682\u5B58\u53D8\u66F4\u63A8\u5BFC\u8BB0\u5F55\uFF08\u7528\u4E8E pre-commit \u9636\u6BB5\uFF09\u3002",
338
+ "cli.ledger-append.requires-staged": "pre-commit \u573A\u666F\u4E0B\u5FC5\u987B\u4F20\u5165 --staged",
339
+ "cli.ledger-append.intent.auto": "\u81EA\u52A8\uFF1A{head}{suffix}",
340
+ "cli.ledger-append.intent.auto-more": " \u7B49 {count} \u9879",
341
+ "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",
342
+ "cli.pre-commit.args.target.description": "\u9879\u76EE\u6839\u76EE\u5F55\uFF0C\u9ED8\u8BA4\u53D6\u5F53\u524D\u76EE\u5F55\u6216 EXTERNAL_FIXTURE_PATH\u3002",
343
+ "cli.pre-commit.run-failed": "fabric pre-commit\uFF1A{name} \u5931\u8D25 - {message}",
344
+ "cli.scan.description": "\u626B\u63CF\u9879\u76EE\u4EE5\u68C0\u6D4B Fabric \u5F15\u5BFC\u5019\u9009\u6A21\u5757\u3002",
345
+ "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",
346
+ "cli.scan.args.debug.description": "\u4EE5\u683C\u5F0F\u5316\u8F93\u51FA\u6253\u5370\u68C0\u6D4B\u8BC1\u636E\u3002",
347
+ "cli.scan.args.json.description": "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\u8BCA\u65AD\u62A5\u544A\u3002",
348
+ "cli.scan.report.title": "Fabric \u626B\u63CF\u62A5\u544A",
349
+ "cli.scan.report.target": "\u76EE\u6807",
350
+ "cli.scan.report.framework": "\u6846\u67B6",
351
+ "cli.scan.report.evidence": "\u8BC1\u636E",
352
+ "cli.scan.report.readme-quality": "README \u8D28\u91CF",
353
+ "cli.scan.report.contributing": "CONTRIBUTING.md",
354
+ "cli.scan.report.files-counted": "\u6587\u4EF6\u6570",
355
+ "cli.scan.report.ignored-entries": "\u5FFD\u7565\u9879",
356
+ "cli.scan.report.existing-fabric": "\u73B0\u6709 Fabric \u6587\u4EF6",
357
+ "cli.scan.report.recommendations": "\u5EFA\u8BAE\uFF1A",
358
+ "cli.scan.readme-quality.ok": "\u826F\u597D",
359
+ "cli.scan.readme-quality.stub": "\u8349\u7A3F",
360
+ "cli.scan.recommendation.init": "L0\uFF1A\u8FD0\u884C fab init\uFF0C\u4E3A AGENTS.md \u751F\u6210\u5E26 TODO \u6807\u8BB0\u7684\u521D\u59CB\u9AA8\u67B6\u3002",
361
+ "cli.scan.recommendation.readme": "L0\uFF1A\u5148\u8865\u5145 README.md\uFF0C\u518D\u628A\u9879\u76EE\u4E8B\u5B9E\u6C89\u6DC0\u5230 AGENTS.md \u5F15\u7528\u4E2D\u3002",
362
+ "cli.scan.recommendation.contributing": "L0\uFF1A\u6DFB\u52A0 CONTRIBUTING.md\uFF0C\u6216\u5728 AGENTS.md \u4E2D\u7559\u4E0B\u8D21\u732E\u6D41\u7A0B\u7684 TODO \u5F15\u7528\u3002",
363
+ "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 TODO\u3002",
364
+ "cli.scan.recommendation.framework-dirs": "L1\uFF1A\u68C0\u67E5 {framework} \u76EE\u5F55\uFF0C\u540E\u7EED\u4E3A\u5176\u8865\u5145\u4F5C\u7528\u57DF\u5316 AGENTS.md \u6587\u4EF6\u3002",
365
+ "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",
366
+ "cli.serve.args.port.description": "\u76D1\u542C\u7AEF\u53E3\uFF0C\u9ED8\u8BA4 7373\u3002",
367
+ "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",
368
+ "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",
369
+ "cli.serve.args.debug.description": "\u5C06\u76EE\u6807\u89E3\u6790\u7EC6\u8282\u8F93\u51FA\u5230 stderr\u3002",
370
+ "cli.serve.ready.title": "Fabric \u4EEA\u8868\u76D8",
371
+ "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",
372
+ "cli.serve.error.port-in-use": "\u7AEF\u53E3 {port} \u5DF2\u88AB\u5360\u7528\uFF0C\u53EF\u5C1D\u8BD5 --port {nextPort}",
373
+ "cli.sync-meta.description": "\u4ECE AGENTS.md \u6587\u4EF6\u540C\u6B65 Fabric \u5143\u6570\u636E\u3002",
374
+ "cli.sync-meta.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
375
+ "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",
376
+ "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",
377
+ "cli.sync-meta.updated": "{label} {path}",
378
+ "dashboard.app.nav.aria-label": "\u4EEA\u8868\u76D8\u89C6\u56FE\u5BFC\u822A",
379
+ "dashboard.app.nav.rules.label": "\u89C4\u5219\u6811",
380
+ "dashboard.app.nav.rules.label-bilingual": "\u89C4\u5219\u6811 Rules Tree",
381
+ "dashboard.app.nav.rules.subtitle": "\u5143\u56FE",
382
+ "dashboard.app.nav.locks.label": "\u4EBA\u5DE5\u9501",
383
+ "dashboard.app.nav.locks.label-bilingual": "\u4EBA\u5DE5\u9501 Human Lock",
384
+ "dashboard.app.nav.locks.subtitle": "\u53D7\u4FDD\u62A4\u533A\u57DF",
385
+ "dashboard.app.nav.timeline.label": "\u610F\u56FE\u65F6\u95F4\u7EBF",
386
+ "dashboard.app.nav.timeline.label-bilingual": "\u610F\u56FE\u65F6\u95F4\u7EBF Intent Timeline",
387
+ "dashboard.app.nav.timeline.subtitle": "\u65E5\u5FD7\u6D41",
388
+ "dashboard.app.nav.history.label": "\u5386\u53F2\u56DE\u653E",
389
+ "dashboard.app.nav.history.label-bilingual": "\u5386\u53F2\u56DE\u653E History Replay",
390
+ "dashboard.app.nav.history.subtitle": "\u65F6\u95F4\u56DE\u6EAF",
391
+ "dashboard.app.nav.doctor.label": "\u8BCA\u65AD\u53F0",
392
+ "dashboard.app.nav.doctor.label-bilingual": "\u8BCA\u65AD\u53F0 Doctor",
393
+ "dashboard.app.nav.doctor.subtitle": "fab \u8BCA\u65AD",
394
+ "dashboard.app.nav.section.diagnostics": "\u8BCA\u65AD",
395
+ "dashboard.app.nav.drift-check": "\u6F02\u79FB\u68C0\u67E5",
396
+ "dashboard.app.header.connected": "\u5DF2\u8FDE\u63A5",
397
+ "dashboard.app.header.connecting": "\u8FDE\u63A5\u4E2D",
398
+ "dashboard.app.live-region.received": "\u5DF2\u6536\u5230 {type}",
399
+ "dashboard.app.breadcrumb.rules": "rules-tree",
400
+ "dashboard.app.breadcrumb.locks": "human-lock",
401
+ "dashboard.app.breadcrumb.timeline": "intent-timeline",
402
+ "dashboard.app.breadcrumb.history": "history-replay",
403
+ "dashboard.app.breadcrumb.doctor": "doctor",
404
+ "dashboard.rules-tree.title": "\u89C4\u5219\u6811\u6D4F\u89C8\u5668",
405
+ "dashboard.rules-tree.subtitle": ".fabric/agents.meta.json \xB7 L0/L1/L2 \u5C42\u7EA7 \xB7 \u611F\u77E5\u54C8\u5E0C\u6F02\u79FB",
406
+ "dashboard.rules-tree.filter.placeholder": "\u6309\u6587\u4EF6\u3001glob\u3001\u4F18\u5148\u7EA7\u3001\u54C8\u5E0C\u8FC7\u6EE4...",
407
+ "dashboard.rules-tree.filter.aria-label": "\u8FC7\u6EE4\u89C4\u5219\u6811",
408
+ "dashboard.rules-tree.status.loading": "\u89C4\u5219\u52A0\u8F7D\u4E2D",
409
+ "dashboard.rules-tree.status.nodes": "{count} \u4E2A\u8282\u70B9 \xB7 rev {revision}",
410
+ "dashboard.rules-tree.status.locks": "{count} \u4E2A\u4EBA\u5DE5\u9501",
411
+ "dashboard.rules-tree.empty": "\u6CA1\u6709\u5339\u914D\u7684\u89C4\u5219\u3002",
412
+ "dashboard.rules-tree.tree.aria-label": "Fabric \u89C4\u5219\u6811",
413
+ "dashboard.rules-tree.detail.title": "\u8282\u70B9\u8BE6\u60C5",
414
+ "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",
415
+ "dashboard.rules-tree.detail.file": "\u6587\u4EF6",
416
+ "dashboard.rules-tree.detail.scope": "\u4F5C\u7528\u57DF",
417
+ "dashboard.rules-tree.detail.priority": "\u4F18\u5148\u7EA7",
418
+ "dashboard.rules-tree.detail.hash": "\u54C8\u5E0C",
419
+ "dashboard.rules-tree.detail.no-deps": "\u65E0\u4F9D\u8D56",
420
+ "dashboard.human-lock.title": "\u4EBA\u5DE5\u9501\u4ED3\u5E93",
421
+ "dashboard.human-lock.subtitle": "\u7B49\u5F85\u6279\u51C6\u7684\u53D7\u4FDD\u62A4\u533A\u57DF \xB7 \u4EC5\u5141\u8BB8\u4EEA\u5F0F\u5316\u5199\u5165",
422
+ "dashboard.human-lock.filters.aria-label": "\u4EBA\u5DE5\u9501\u8FC7\u6EE4\u5668",
423
+ "dashboard.human-lock.filters.all": "\u5168\u90E8",
424
+ "dashboard.human-lock.filters.drift": "\u6F02\u79FB",
425
+ "dashboard.human-lock.filters.approved": "\u5DF2\u6279\u51C6",
426
+ "dashboard.human-lock.summary": "{drift} \u5904\u6F02\u79FB \xB7 {approved} \u9879\u5DF2\u786E\u8BA4",
427
+ "dashboard.human-lock.empty": "\u5F53\u524D\u8FC7\u6EE4\u6761\u4EF6\u4E0B\u6CA1\u6709\u4EBA\u5DE5\u9501\u8BB0\u5F55\u3002",
428
+ "dashboard.intent-timeline.title": "\u610F\u56FE\u65F6\u95F4\u7EBF",
429
+ "dashboard.intent-timeline.subtitle": ".intent-ledger.jsonl \xB7 AI | Human \u53CC\u5217 \xB7 \u6309\u65F6\u95F4\u5012\u5E8F",
430
+ "dashboard.intent-timeline.filter.label": "\u6765\u6E90",
431
+ "dashboard.intent-timeline.filter.all": "\u5168\u90E8",
432
+ "dashboard.intent-timeline.summary": "AI {aiCount} \xB7 Human {humanCount}",
433
+ "dashboard.intent-timeline.columns.ai.title": "AI",
434
+ "dashboard.intent-timeline.columns.ai.entries": "{count} \u6761\u8BB0\u5F55",
435
+ "dashboard.intent-timeline.columns.human.title": "\u4EBA\u5DE5",
436
+ "dashboard.intent-timeline.columns.human.entries": "{count} \u6761\u8BB0\u5F55",
437
+ "dashboard.intent-timeline.empty": "\u6CA1\u6709\u627E\u5230\u65E5\u5FD7\u8BB0\u5F55\u3002",
438
+ "dashboard.intent-timeline.annotate.missing-id": "\u7F3A\u5C11 id\uFF0C\u65E0\u6CD5\u4E3A\u8FD9\u6761\u65E5\u5FD7\u6DFB\u52A0\u6CE8\u91CA\u3002",
439
+ "dashboard.history-replay.title": "\u5386\u53F2\u56DE\u653E",
440
+ "dashboard.history-replay.subtitle": "\u7A7F\u8D8A\u65E5\u5FD7\u63D0\u4EA4\uFF0C\u5728\u4EFB\u610F\u8BB0\u5F55\u70B9\u91CD\u65B0\u8FD8\u539F\u89C4\u5219\u6811\u72B6\u6001",
441
+ "dashboard.history-replay.toolbar.scrub": "\u62D6\u52A8",
442
+ "dashboard.history-replay.toolbar.latest": "\u6700\u65B0",
443
+ "dashboard.history-replay.selected.none": "\u5C1A\u672A\u9009\u62E9\u5386\u53F2\u8BB0\u5F55",
444
+ "dashboard.history-replay.status.replay-points": "{count} \u4E2A\u56DE\u653E\u70B9",
445
+ "dashboard.history-replay.status.entries-applied": "\u5DF2\u5E94\u7528 {count} \u6761\u8BB0\u5F55",
446
+ "dashboard.history-replay.empty.entries": "\u6CA1\u6709\u53EF\u7528\u4E8E\u56DE\u653E\u7684\u65E5\u5FD7\u8BB0\u5F55\u3002",
447
+ "dashboard.history-replay.state.title": "\u67E5\u770B {label} \u65F6\u523B\u7684\u72B6\u6001",
448
+ "dashboard.history-replay.state.meta": "ledger {ledgerId} \xB7 commit {commit} \xB7 {mode}",
449
+ "dashboard.history-replay.status.loading": "\u5FEB\u7167\u52A0\u8F7D\u4E2D",
450
+ "dashboard.history-replay.status.nodes": "{count} \u4E2A\u8282\u70B9",
451
+ "dashboard.history-replay.status.unknown-revision": "\u672A\u77E5 revision",
452
+ "dashboard.history-replay.tree.aria-label": "\u5386\u53F2 Fabric \u89C4\u5219\u6811",
453
+ "dashboard.history-replay.empty.loading": "\u6B63\u5728\u52A0\u8F7D\u5386\u53F2\u5FEB\u7167...",
454
+ "dashboard.history-replay.empty.select": "\u8BF7\u9009\u62E9\u4E00\u6761\u65F6\u95F4\u7EBF\u8BB0\u5F55\u4EE5\u56DE\u653E\u5176\u72B6\u6001\u3002",
455
+ "dashboard.history-replay.meta.not-available": "\u4E0D\u53EF\u7528",
456
+ "dashboard.history-replay.meta.pending": "\u7B49\u5F85\u4E2D",
457
+ "dashboard.history-replay.meta.na": "\u65E0",
458
+ "dashboard.doctor.title": "\u8BCA\u65AD\u63A7\u5236\u53F0",
459
+ "dashboard.doctor.subtitle": "fab doctor \u9762\u677F \xB7 \u6846\u67B6\u3001\u5165\u53E3\u70B9\u3001revision \u6F02\u79FB\u3001\u53D7\u4FDD\u62A4\u8DEF\u5F84",
460
+ "dashboard.doctor.toolbar.overall": "\u6574\u4F53\u72B6\u6001",
461
+ "dashboard.doctor.toolbar.no-summary": "\u6682\u65E0\u6458\u8981",
462
+ "dashboard.doctor.toolbar.entry-points-summary": "{framework} \xB7 {count} \u4E2A\u5165\u53E3\u70B9",
463
+ "dashboard.doctor.toolbar.entry-point-summary": "{framework} \xB7 {count} \u4E2A\u5165\u53E3\u70B9",
464
+ "dashboard.doctor.empty.loading": "\u6B63\u5728\u52A0\u8F7D doctor \u62A5\u544A...",
465
+ "dashboard.doctor.summary.framework": "\u6846\u67B6",
466
+ "dashboard.doctor.summary.protected-paths": "\u53D7\u4FDD\u62A4\u8DEF\u5F84",
467
+ "dashboard.doctor.summary.intent-ledger": "\u610F\u56FE\u65E5\u5FD7",
468
+ "dashboard.doctor.summary.no-meta-revision": "\u6682\u65E0 meta revision",
469
+ "dashboard.doctor.summary.tracked-paths.none": "\u6CA1\u6709\u8DDF\u8E2A\u8DEF\u5F84",
470
+ "dashboard.doctor.summary.tracked-paths.some": "\u5DF2\u8DDF\u8E2A {count} \u9879",
471
+ "dashboard.doctor.summary.hashes-intact": "\u6240\u6709\u5DF2\u6279\u51C6\u54C8\u5E0C\u5747\u5B8C\u597D",
472
+ "dashboard.doctor.summary.drifted": "{count} \u9879\u53D1\u751F\u6F02\u79FB",
473
+ "dashboard.doctor.summary.no-ledger-entries": "\u6682\u65E0\u65E5\u5FD7\u8BB0\u5F55",
474
+ "dashboard.doctor.card.entry-points": "\u5165\u53E3\u70B9",
475
+ "dashboard.doctor.card.checks": "\u68C0\u67E5\u9879",
476
+ "dashboard.doctor.empty.entry-points": "\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u5165\u53E3\u70B9\u3002",
477
+ "dashboard.doctor.framework.unknown": "\u672A\u77E5",
478
+ "dashboard.doctor.age.none": "\u6682\u65E0\u8BB0\u5F55",
479
+ "dashboard.doctor.age.seconds": "{count} \u79D2\u524D",
480
+ "dashboard.doctor.age.minutes": "{count} \u5206\u949F\u524D",
481
+ "dashboard.doctor.age.hours": "{count} \u5C0F\u65F6\u524D",
482
+ "dashboard.doctor.age.days": "{count} \u5929\u524D",
483
+ "dashboard.doctor.age.weeks": "{count} \u5468\u524D",
484
+ "dashboard.shared.refresh": "\u5237\u65B0",
485
+ "dashboard.shared.loading": "\u52A0\u8F7D\u4E2D",
486
+ "dashboard.shared.status.ok": "\u6B63\u5E38",
487
+ "dashboard.shared.status.warn": "\u8B66\u544A",
488
+ "dashboard.shared.status.error": "\u9519\u8BEF",
489
+ "dashboard.shared.status.confirmed": "\u5DF2\u786E\u8BA4",
490
+ "dashboard.shared.status.hash-drift": "\u54C8\u5E0C\u6F02\u79FB",
491
+ "dashboard.shared.status.stale": "\u8FC7\u671F",
492
+ "dashboard.shared.status.orphan": "\u5B64\u7ACB",
493
+ "dashboard.shared.status.attention": "\u6CE8\u610F",
494
+ "dashboard.source.ai": "AI",
495
+ "dashboard.source.human": "\u4EBA\u5DE5",
496
+ "dashboard.timeline-entry.aria-label": "{source} \u610F\u56FE {intent}",
497
+ "dashboard.timeline-entry.working-tree": "\u5DE5\u4F5C\u533A",
498
+ "dashboard.timeline-entry.parent": "\u7236\u63D0\u4EA4 {parent}",
499
+ "dashboard.timeline-entry.paths": "\u8DEF\u5F84",
500
+ "dashboard.timeline-entry.annotate": "\u6DFB\u52A0\u6CE8\u91CA",
501
+ "dashboard.timeline-entry.annotation-label": "\u4EBA\u5DE5\u6CE8\u91CA",
502
+ "dashboard.timeline-entry.annotation-placeholder": "\u8BF4\u660E\u5BA1\u6838\u7ED3\u8BBA\u6216\u6279\u51C6\u80CC\u666F...",
503
+ "dashboard.timeline-entry.annotation-save": "\u4FDD\u5B58\u6CE8\u91CA",
504
+ "dashboard.tree-node.locked": "\u5DF2\u9501\u5B9A",
505
+ "dashboard.tree-node.stale.hash-mismatch": "\u54C8\u5E0C\u4E0D\u5339\u914D",
506
+ "dashboard.tree-node.stale.orphan": "\u5B64\u7ACB",
507
+ "dashboard.lock-card.aria-label": "{file} {lineRange} {status}",
508
+ "dashboard.lock-card.status.drift": "\u54C8\u5E0C\u6F02\u79FB",
509
+ "dashboard.lock-card.status.confirmed": "\u5DF2\u786E\u8BA4",
510
+ "dashboard.lock-card.hash.locked": "\u9501\u5B9A\u54C8\u5E0C",
511
+ "dashboard.lock-card.hash.current": "\u5F53\u524D\u54C8\u5E0C",
512
+ "dashboard.lock-card.hash.diff": "\u5DEE\u5F02",
513
+ "dashboard.lock-card.preview.drift": "\u6F02\u79FB",
514
+ "dashboard.lock-card.preview.sync": "\u540C\u6B65",
515
+ "dashboard.lock-card.preview.drift-detail": "\u54C8\u5E0C\u4E0E\u53D7\u4FDD\u62A4\u533A\u57DF\u4E0D\u4E00\u81F4\u3002",
516
+ "dashboard.lock-card.preview.sync-detail": "\u53D7\u4FDD\u62A4\u533A\u57DF\u5F53\u524D\u4FDD\u6301\u540C\u6B65\u3002",
517
+ "dashboard.lock-card.footer.region": "\u53D7\u4FDD\u62A4\u533A\u57DF \xB7 {count} \u884C",
518
+ "dashboard.lock-card.button.approve": "\u6279\u51C6\u65B0\u54C8\u5E0C",
519
+ "dashboard.lock-card.button.confirmed": "\u5DF2\u786E\u8BA4",
520
+ "dashboard.lock-card.diff.hash-mismatch": "\u54C8\u5E0C\u4E0D\u4E00\u81F4",
521
+ "dashboard.lock-card.diff.no-changes": "\u65E0\u53D8\u66F4",
522
+ "dashboard.lock-card.diff.with-bytes": "+{added} / -{removed} \xB7 {bytes} \u5B57\u8282",
523
+ "dashboard.lock-card.diff.without-bytes": "+{added} / -{removed}",
524
+ "dashboard.approve-button.retry": "\u91CD\u8BD5"
525
+ };
526
+
527
+ // src/i18n/create-translator.ts
528
+ var defaultMessages = {
529
+ en: enMessages,
530
+ "zh-CN": zhCNMessages
531
+ };
532
+ function createTranslator(locale, messages = defaultMessages) {
533
+ const activeMessages = messages[locale] ?? messages.en;
534
+ const fallbackMessages = messages.en;
535
+ return (key, vars) => {
536
+ const template = activeMessages[key] ?? fallbackMessages[key] ?? key;
537
+ if (vars === void 0) {
538
+ return template;
539
+ }
540
+ return Object.entries(vars).reduce((message, [name, value]) => {
541
+ return message.replaceAll(`{${name}}`, value);
542
+ }, template);
543
+ };
544
+ }
545
+
546
+ // src/i18n/normalize-locale.ts
547
+ function normalizeLocale(raw) {
548
+ if (typeof raw !== "string") {
549
+ return "en";
550
+ }
551
+ const normalized = raw.trim().toLowerCase().replace(/\..*$/, "").replace(/_/g, "-");
552
+ if (normalized.length === 0) {
553
+ return "en";
554
+ }
555
+ if (normalized === "zh" || normalized.startsWith("zh-")) {
556
+ return "zh-CN";
557
+ }
558
+ return "en";
559
+ }
560
+
561
+ // src/i18n/detect-node-locale.ts
562
+ function detectNodeLocale() {
563
+ const fromFabricEnv = process.env.FAB_LANG;
564
+ if (typeof fromFabricEnv === "string" && fromFabricEnv.trim().length > 0) {
565
+ return normalizeLocale(fromFabricEnv);
566
+ }
567
+ const fromLangEnv = process.env.LANG;
568
+ if (typeof fromLangEnv === "string" && fromLangEnv.trim().length > 0) {
569
+ return normalizeLocale(fromLangEnv);
570
+ }
571
+ return "en";
572
+ }
573
+
574
+ // src/i18n/protected-tokens.ts
575
+ var PROTECTED_TOKENS = [
576
+ "fab_get_rules",
577
+ "fab_append_intent",
578
+ "fab_update_registry",
579
+ "fabric_rules",
580
+ "ledger_entry",
581
+ "ledger_entry_id",
582
+ "agent_meta",
583
+ "AGENTS.md",
584
+ "FABRIC.md",
585
+ ".fabric/agents.meta.json",
586
+ ".fabric/human-lock.json",
587
+ ".fabric/init-context.json",
588
+ ".fabric/forensic.json",
589
+ ".intent-ledger.jsonl",
590
+ "@HUMAN",
591
+ "CORE RULES",
592
+ "DO NOT TRANSLATE",
593
+ "MUST",
594
+ "NEVER"
595
+ ];
596
+
597
+ export {
598
+ enMessages,
599
+ zhCNMessages,
600
+ defaultMessages,
601
+ createTranslator,
602
+ normalizeLocale,
603
+ detectNodeLocale,
604
+ PROTECTED_TOKENS
605
+ };
File without changes