@fenglimg/fabric-shared 2.3.0-rc.9 → 2.3.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.
@@ -1,9 +1,11 @@
1
1
  import {
2
2
  resolveGlobalLocale
3
- } from "./chunk-ASS2KBB7.js";
3
+ } from "./chunk-OX6DWUK4.js";
4
4
 
5
5
  // src/i18n/locales/en.ts
6
6
  var enMessages = {
7
+ "cli.signpost.retired": "Command `{retired}` was removed. Use `{successor}` instead.",
8
+ "cli.doctor.args.probe.description": "Emit a machine-readable JSON readiness snapshot (first-hit + store/hooks) without running --fix Prefer --probe in CI for a cheap readiness snapshot; full cite-coverage scans remain on-demand.",
7
9
  "cli.main.description": "Fabric CLI \u2014 feeds your project's decisions, pitfalls & conventions to your AI assistant automatically. First time? Run: fabric install",
8
10
  "cli.shared.created": "Created",
9
11
  "cli.shared.skipped": "Skipped",
@@ -48,10 +50,23 @@ var enMessages = {
48
50
  "cli.inspect.explain.census": "census",
49
51
  "cli.inspect.explain.census-total": "total {total}",
50
52
  "cli.inspect.error": "inspect failed: {message}",
53
+ // `fabric preview` — local read-only knowledge preview web server (loopback-only).
54
+ "cli.preview.description": "Start a local read-only knowledge preview (browse in your browser, grouped by scope)",
55
+ "cli.preview.arg.port": "Port to listen on (default 7777).",
56
+ "cli.preview.arg.host": "Host to bind (default 127.0.0.1, loopback only).",
57
+ "cli.preview.arg.open": "Open the browser on start (default on; use --no-open to disable).",
58
+ "cli.preview.arg.target": "Override the project root (defaults to cwd).",
59
+ "cli.preview.arg.variant": "Default style variant to open (default: lumen; all styles at /gallery).",
60
+ "cli.preview.gallery-hint": "All styles gallery: {url}",
61
+ "cli.preview.started": "Knowledge preview started: {url}",
62
+ "cli.preview.opening": "Opening browser\u2026",
63
+ "cli.preview.stop-hint": "Press Ctrl-C to stop.",
64
+ "cli.preview.stopped": "Preview stopped.",
65
+ "cli.preview.error": "preview failed: {message}",
51
66
  "cli.audit.description": "Knowledge & telemetry audit (cite/conflicts/history/metrics)",
52
67
  // `fabric audit cite` — 0%-recall-coverage self-diagnosis hints.
53
- "cli.audit.cite.recall-mismatch-hint": "recall coverage is 0 despite {recalls} recall(s) across {sessions} session(s) \u2014 none shared a session with an edit. The recall caller is likely passing a non-client session_id (correlation is session-scoped). See AGENTS.md: pass the real client session_id to fab_recall.",
54
- "cli.audit.cite.recall-none-hint": "recall coverage is 0 \u2014 no in-session fab_recall preceded these edits. Recall before editing, and pass the real client session_id (correlation is session-scoped). See AGENTS.md.",
68
+ "cli.audit.cite.recall-mismatch-hint": "recall coverage is 0 despite {recalls} recall(s) across {sessions} session(s) \u2014 none shared a session with an edit. Likely causes: (1) fab_recall omitted/wrong session_id (must be real client session_id; empty planned events never join edits); (2) recall paths do not path-overlap the edited file (auto-cite only counts overlapping planned.target_paths). Fix: pass session_id, reinstall hooks for active-session sidecar, or fab_recall paths that cover the edit. See AGENTS.md + docs/UPGRADE.md.",
69
+ "cli.audit.cite.recall-none-hint": "recall coverage is 0 \u2014 no in-session fab_recall preceded these edits (or planned events had empty session_id so they could not join). Recall before editing with the real client session_id; after install, SessionStart stamps .fabric/.cache/active-session.json as server fallback. Path-overlap still required: recall the files you will edit, not only unrelated .fabric paths. See AGENTS.md + docs/UPGRADE.md.",
55
70
  // `fabric audit --help` — filtered help (i18n'd subcommand listing).
56
71
  "cli.audit.help.tagline": "Knowledge & telemetry audit surfaces (read-only)",
57
72
  "cli.audit.help.sub.cite": "Cite-policy adherence report",
@@ -99,7 +114,7 @@ var enMessages = {
99
114
  "cli.config.install.args.dry-run.description": "Preview detected write operations without modifying files.",
100
115
  "cli.config.errors.unknown-client": 'Unknown client "{client}". Use a comma-separated list such as cc,codex.',
101
116
  "cli.config.errors.expected-object": "Expected object in {path}",
102
- "cli.config.install.no-configs": "No Fabric MCP client config detected. Create the client directory or set clientPaths in fabric.config.json.",
117
+ "cli.config.install.no-configs": "No Fabric MCP client config detected. Create the client directory or set clientPaths in .fabric/fabric-config.json.",
103
118
  "cli.config.install.no-config-path": "Skipping {client}: no config path detected.",
104
119
  "cli.config.install.dry-run": "[dry-run] {client}: would write {path}",
105
120
  "cli.config.install.wrote": "{client}: wrote {path}",
@@ -168,7 +183,7 @@ var enMessages = {
168
183
  "doctor.section.fixable": "Fixable errors:",
169
184
  "doctor.section.manual": "Manual errors:",
170
185
  "doctor.section.warnings": "Warnings:",
171
- "doctor.section.fix-knowledge-mutations": "Fix-knowledge mutations:",
186
+ "doctor.section.fix-knowledge-mutations": "Knowledge mutations (via --fix):",
172
187
  // flat-design follow-up: the remaining doctor UI-shell strings (TL;DR header,
173
188
  // --fix mutation plan, filtered --help) move off hardcoded English into i18n so
174
189
  // the whole `fabric doctor` surface honours the machine locale. USAGE/OPTIONS/
@@ -182,7 +197,15 @@ var enMessages = {
182
197
  // with doctor.check.*; messages carry store alias / counts via interpolation.
183
198
  "doctor.store.no-global-config": "no global Fabric config \u2014 run `fabric install --global <url>`",
184
199
  "doctor.store.missing-required": "required store '{id}' is not mounted; run `fabric store mount`",
185
- "doctor.store.unbound": "store '{alias}' is mounted but not bound to this project; run `fabric store bind {alias}` to read its knowledge here (then `fabric store switch-write {alias}` to write team knowledge into it)",
200
+ "doctor.store.unbound": "store '{alias}' is mounted but not bound to this project \u2014 paste: `fabric store bind {alias}` then `fabric store switch-write {alias}`",
201
+ "doctor.store.empty": "bound store(s) have 0 knowledge entries ({stores}) \u2014 first-hit cannot succeed until you seed or clone knowledge; run `fabric first-hit --seed` (empty local store) or bind a remote team store with content",
202
+ "doctor.store.no-write-target": "no active write store for this project \u2014 paste: `fabric store bind <alias>` then `fabric store switch-write <alias>` (or `fabric install`)",
203
+ "doctor.store.no-match": "knowledge exists but no entry matches the probe paths \u2014 try broader paths or add relevance_paths for your modules",
204
+ "doctor.store.write-target-mismatch": "active write store '{alias}' is not a valid team write target for this project \u2014 run `fabric store switch-write <mounted-team-alias>`",
205
+ "doctor.store.first-hit-missing-required": "required store(s) not mounted: {ids} \u2014 bind/clone them then re-run `fabric first-hit`",
206
+ "doctor.store.first-hit-unreachable": "bound store dir missing on disk: {aliases} \u2014 remount or re-clone, then `fabric doctor`",
207
+ "doctor.store.hooks-missing": "knowledge present but SessionStart/PreToolUse hooks missing \u2014 re-run `fabric install`",
208
+ "doctor.store.first-hit-ok": "first-hit ready: {count} knowledge entries across {stores}",
186
209
  "doctor.store.alias-drift": "by-alias readability link(s) out of sync for {refs}; run `fabric doctor --fix` to repair ~/.fabric/stores/by-alias/",
187
210
  "doctor.store.local-only": "store '{alias}' is local-only; add a git remote to back it up",
188
211
  "doctor.store.executable": "store '{alias}' contains executable/script files ({files}) \u2014 stores are data-only; Fabric never runs them (S65)",
@@ -191,15 +214,22 @@ var enMessages = {
191
214
  "doctor.store.related-broken": "{count} broken `related` link(s) point at ids absent from the corpus: {samples}{overflow} \u2014 fix the related edges via `fab_review` (modify) or edit the entry frontmatter",
192
215
  "doctor.store.related-hub": "related graph hubs (top {shown} of {total} referenced): {top}",
193
216
  "doctor.store.unreachable": "store '{alias}' is in the read-set but unreachable on disk ({reason}); run `fabric store mount` / re-clone it, then `fabric doctor`",
217
+ "doctor.store.unreachable-bound": "bound store dir missing on disk: {stores} \u2014 re-clone or remount, then fabric doctor",
194
218
  "doctor.store.consumption-heatmap": "top consumed (last {days}d, {consumed}/{total} entries read across {windows} window(s)): {top}",
195
219
  "doctor.store.consumption-zero": "{count} entries never consumed in the last {days}d: {sample}{overflow} \u2014 review for retirement via `fab_review` (consumption is one signal, not proof of rot)",
196
220
  "doctor.store.overflow-more": ", \u2026(+{count} more)",
197
- "doctor.fix-plan.header": "fix-knowledge mutation plan ({count} total)",
221
+ "doctor.check.knowledge_body_altitude_dump.name": "Knowledge body altitude",
222
+ "doctor.check.knowledge_body_altitude_dump.ok": "No dump-shaped knowledge bodies detected.",
223
+ "doctor.check.knowledge_body_altitude_dump.message.singular": "1 dump-shaped knowledge body: {detail}",
224
+ "doctor.check.knowledge_body_altitude_dump.message.plural": "{count} dump-shaped knowledge bodies (e.g. {detail})",
225
+ "doctor.check.knowledge_body_altitude_dump.remediation": "Rewrite as reusable decision/pitfall/guideline altitude (## structure), not a session transcript; re-archive via fabric-archive / fab_propose",
226
+ "doctor.check.knowledge_body_altitude_dump.scan_error": "Body-altitude scan failed ({detail}); doctor cannot confirm corpus is clean.",
227
+ "doctor.fix-plan.header": "knowledge mutation plan ({count} total)",
198
228
  "doctor.fix-plan.preview": "preview:",
199
229
  "doctor.fix-plan.more": "... and {count} more",
200
230
  "doctor.help.tagline": "Diagnose and fix Fabric workspace issues",
201
231
  "doctor.help.flag.target": "Override project root (defaults to cwd)",
202
- "doctor.help.flag.fix": "Auto-fix issues (derived-state + knowledge frontmatter/git mv)",
232
+ "doctor.help.flag.fix": "Auto-fix derived state + auto-safe knowledge lint mutations",
203
233
  "doctor.help.flag.json": "Output as JSON for programmatic consumption",
204
234
  "doctor.help.flag.verbose": "Show maintainer-audience action hints",
205
235
  "doctor.help.example.run": "Run diagnostics",
@@ -288,11 +318,11 @@ var enMessages = {
288
318
  "cite-coverage.skip.architectural": "architectural layer",
289
319
  "cite-coverage.skip.other": "other",
290
320
  "cli.doctor.args.target.description": "Target project path. Defaults to --target, then EXTERNAL_FIXTURE_PATH, then cwd.",
291
- "cli.doctor.args.fix.description": "Repair derived Fabric state (meta + indexes).",
321
+ "cli.doctor.args.fix.description": "Repair derived Fabric state (meta + indexes) and apply auto-safe knowledge lint mutations (store counter floor, stale session-hints cleanup). Decay/frontmatter lints stay report-only \u2014 remediate those via fabric-review.",
292
322
  "cli.doctor.args.json.description": "Print the doctor report as JSON.",
293
323
  "cli.doctor.args.strict.description": "Treat warnings as failures.",
294
- "cli.doctor.args.fix-knowledge.description": "Apply knowledge lint mutations: archive overdue pending drafts, floor drifted per-store id counters, and prune stale session-hint caches. Decay lints (orphan demote / stale archive) are report-only \u2014 remediate those via the fab_review flow. Default doctor run remains report-only.",
295
- "cli.doctor.args.yes.description": "Skip the --fix-knowledge safety confirm. Required for non-tty invocations unless FABRIC_NONINTERACTIVE=1 is set in the environment.",
324
+ "cli.doctor.args.fix-knowledge.description": "Legacy alias wording: knowledge lint mutations now run under `fabric doctor --fix` (store counter floor + stale session-hints cleanup). Decay lints (orphan demote / stale archive) remain report-only \u2014 remediate via fabric-review. Default doctor run remains report-only.",
325
+ "cli.doctor.args.yes.description": "Skip the knowledge-mutation safety confirm inside `fabric doctor --fix`. Required for non-tty invocations unless FABRIC_NONINTERACTIVE=1 is set in the environment.",
296
326
  // rc.35 TASK-12 (P0-11): --verbose unfolds maintainer-audience hints.
297
327
  "cli.doctor.args.verbose.description": "Show all action hints including maintainer-audience ones (Fabric contributors editing the source tree). By default these are folded for npm end users.",
298
328
  "doctor.maintainer-hint-folded": "(maintainer-only remediation \u2014 re-run with `fabric doctor --verbose` to see)",
@@ -401,7 +431,7 @@ var enMessages = {
401
431
  "doctor.check.events_jsonl_health.message.metric_leak": ".fabric/events.jsonl contains {count} rows with metric-counter event_types ({samples}). Those events should be aggregated in metrics.jsonl, not in the audit ledger.",
402
432
  "doctor.check.events_jsonl_health.message.metrics_stale": ".fabric/metrics.jsonl hasn't been updated for {minutes} minutes; the server-side 60s flush may be stalled.",
403
433
  "doctor.check.events_jsonl_health.message.rotation_overdue": ".fabric/events.jsonl hasn't rotated for {days} days; the 6h rotation tick may not be running.",
404
- "doctor.check.events_jsonl_health.remediation": "Run `fabric doctor --fix` \u2014 it triggers a rotation AND flushes metrics.jsonl (rc.2 F16: clears idle-buffered metric counters without a server restart). If the warning persists, restart the MCP server so startMetricsFlush + startRotationTick reschedule. If metric_leak fires, audit recent code changes for direct appendEventLedgerEvent calls bypassing bumpCounter for one of the 4 metric-managed event_types.",
434
+ "doctor.check.events_jsonl_health.remediation": "Run `fabric doctor --fix` \u2014 it triggers events.jsonl rotation (honors fabric_event_retention_days: 7|30|90 in .fabric/fabric-config.json) AND flushes metrics.jsonl. If the warning persists, restart the MCP server so startMetricsFlush + startRotationTick reschedule. If metric_leak fires, audit recent code changes for direct appendEventLedgerEvent calls bypassing bumpCounter for one of the 4 metric-managed event_types.",
405
435
  "doctor.check.event_ledger_partial_write.name": "Event ledger partial write",
406
436
  "doctor.check.event_ledger_partial_write.ok.skipped": "No partial-write check needed (ledger missing or not writable).",
407
437
  "doctor.check.event_ledger_partial_write.message": "events.jsonl has a partial write at byte offset {byteOffset} ({byteLength} corrupted bytes). Run --fix to truncate and preserve corrupted bytes.",
@@ -425,18 +455,23 @@ var enMessages = {
425
455
  "doctor.check.retired_reference.ok": "No retired tool/field names linger in the bootstrap, SKILL.md, or installed hooks.",
426
456
  "doctor.check.retired_reference.message": "{count} stale pointer(s) to retired tool/field names in agent-facing text: {sample}",
427
457
  "doctor.check.retired_reference.remediation": "Update the flagged text to the replacement token (or remove it), then re-run `fabric install` to resync the dogfood mirrors.",
428
- // v2.0.0-rc.33 W3-6 (P1-13): SKILL.md token budget lint. warn > 5K / error > 10K tokens (chars/3 estimate). Anthropic recommends SKILL.md hot path stay ~3K; over 5K hurts progressive disclosure; over 10K is blocking (wasted model context + load latency).
458
+ // v2.0.0-rc.33 W3-6 (P1-13): SKILL.md token budget lint. warn > 8K / error > 10K tokens (chars/3 estimate). Anthropic recommends SKILL.md hot path stay ~3K, but the two watched skills (fabric-archive/review) are the richest core skills and legitimately run larger; warn sits at 8K (a 2K reaction buffer below the 10K install-abort hard cap) rather than 5K. Over 10K is blocking (wasted model context + load latency).
429
459
  "doctor.check.skill_token_budget.name": "Skill token budget",
430
- "doctor.check.skill_token_budget.ok": "All .claude/skills/<slug>/SKILL.md files are within token budget (warn 5K / error 10K).",
460
+ "doctor.check.skill_token_budget.ok": "All .claude/skills/<slug>/SKILL.md files are within token budget (warn 8K / error 10K).",
431
461
  "doctor.check.skill_token_budget.message.singular": "{count} SKILL.md exceeds the token budget: {list}. Sink detail into ref/ for progressive disclosure.",
432
462
  "doctor.check.skill_token_budget.message.plural": "{count} SKILL.md files exceed the token budget: {list}. Sink detail into ref/ for progressive disclosure.",
433
463
  "doctor.check.skill_token_budget.remediation": "Move detailed phase / worked-examples / decision tables out of the SKILL.md hot path into `templates/skills/<slug>/ref/*.md`. Keep SKILL.md focused on trigger-gate + key-phase summaries; see W1 progressive disclosure split. Re-run `fabric install` to sync both client subtrees.",
434
- // v2.0.0-rc.33 W3-7 (P1-14): SKILL.md description structural lint. Proxy for trigger-recall (a live-LLM recall test requires a model — W1 ran gemini for that). This lint catches regression: missing description / >60 tokens / no Chinese trigger / no English trigger.
464
+ // v2.0.0-rc.33 W3-7 (P1-14): SKILL.md description structural lint. Proxy for trigger-recall (a live-LLM recall test requires a model — W1 ran gemini for that). This lint catches regression: missing description / >60 tokens / no Chinese trigger / no English trigger / no anti-trigger boundary.
435
465
  "doctor.check.skill_description.name": "Skill description quality",
436
- "doctor.check.skill_description.ok": "All SKILL.md description fields are well-structured (non-empty, <60 tokens, bilingual triggers).",
466
+ "doctor.check.skill_description.ok": "All SKILL.md description fields are well-structured (non-empty, <60 tokens, bilingual triggers, explicit anti-trigger boundary).",
437
467
  "doctor.check.skill_description.message.singular": "{count} SKILL.md description structural issue: {list}. The description field is the host's primary auto-invoke matching signal.",
438
468
  "doctor.check.skill_description.message.plural": "{count} SKILL.md description structural issues: {list}. The description field is the host's primary auto-invoke matching signal.",
439
- "doctor.check.skill_description.remediation": "Edit the `description:` field in `packages/cli/templates/skills/<slug>/SKILL.md` frontmatter: (1) non-empty; (2) <60 tokens (chars/3 estimate, ~180 chars); (3) at least one Chinese trigger phrase; (4) at least one English trigger phrase. See W1 description rewrite style. Re-run `fabric install` to sync both client subtrees. For recall verification, run the W1 gemini delegate (see .workflow/.scratchpad/rc33-plan/W1-VERIFY-RESULT.md).",
469
+ "doctor.check.skill_description.remediation": "Edit the `description:` field in `packages/cli/templates/skills/<slug>/SKILL.md` frontmatter: (1) non-empty; (2) <60 tokens (chars/3 estimate, ~180 chars); (3) at least one Chinese trigger phrase; (4) at least one English trigger phrase; (5) an explicit anti-trigger such as `NOT PR review` / `NOT code review` / `\u4E0D\u662F...`. See W1 description rewrite style. Re-run `fabric install` to sync both client subtrees. For recall verification, run the W1 gemini delegate (see .workflow/.scratchpad/rc33-plan/W1-VERIFY-RESULT.md).",
470
+ "doctor.check.skill_contract.name": "Skill contract integrity",
471
+ "doctor.check.skill_contract.ok": "Fabric SKILL.md contracts are intact: hard-rule anchors, MCP-only write paths, thin shims, and ref entry points are present.",
472
+ "doctor.check.skill_contract.message.singular": "{count} Fabric skill contract issue: {list}.",
473
+ "doctor.check.skill_contract.message.plural": "{count} Fabric skill contract issues: {list}.",
474
+ "doctor.check.skill_contract.remediation": "Restore the missing contract text in `packages/cli/templates/skills/<slug>/SKILL.md` and referenced `ref/*.md` files, then run `fabric install` to resync `.claude/skills` and `.codex/skills`. Archive/review must keep DISPLAY/WRITE hard rules and MCP-only mutation paths; store/sync must remain thin CLI shims.",
440
475
  // v2.0.0-rc.33 W3-3 (P1-3): cite-policy Goodhart pattern detection. Scans 7d of assistant_turn_observed events for 3 anti-patterns (G1 ritual / G2 dismissal abuse / G5 placeholder cite). Warning severity — heuristics can false-positive; advisory only.
441
476
  "doctor.check.cite_goodhart.name": "Cite-policy Goodhart",
442
477
  "doctor.check.cite_goodhart.ok": "No cite-policy Goodhart patterns detected over the last 7 days.",
@@ -506,7 +541,7 @@ var enMessages = {
506
541
  "doctor.check.index_drift.ok": "agents.meta.json counters envelope is at or above the highest existing canonical counter for every (layer, type) pair.",
507
542
  "doctor.check.index_drift.message.singular": "{count} (layer, type) counter slot have drifted below the observed canonical maximum (next allocate would collide). First: {detail}.",
508
543
  "doctor.check.index_drift.message.plural": "{count} (layer, type) counter slots have drifted below the observed canonical maximum (next allocate would collide). First: {detail}.",
509
- "doctor.check.index_drift.remediation": "Run `fabric doctor --fix-knowledge` to bump agents.meta.json counters to max_observed + 1.",
544
+ "doctor.check.index_drift.remediation": "Run `fabric doctor --fix` to bump agents.meta.json counters to max_observed + 1.",
510
545
  "doctor.check.underseeded.name": "Knowledge underseeded",
511
546
  "doctor.check.underseeded.ok": "Knowledge corpus has {count} canonical entries (>= {threshold}).",
512
547
  "doctor.check.underseeded.message.singular": "Knowledge corpus has only {count} canonical entry (< {threshold} threshold). The plan_context retrieval surface is below its useful floor.",
@@ -516,7 +551,7 @@ var enMessages = {
516
551
  "doctor.check.session_hints_stale.ok": "No session-hints cache files older than {days} days under .fabric/.cache/.",
517
552
  "doctor.check.session_hints_stale.message.singular": "{count} session-hints cache file under .fabric/.cache/ is older than {days} days. First: {detail}.",
518
553
  "doctor.check.session_hints_stale.message.plural": "{count} session-hints cache files under .fabric/.cache/ are older than {days} days. First: {detail}.",
519
- "doctor.check.session_hints_stale.remediation": "Run `fabric doctor --fix-knowledge` to delete stale session-hints cache files.",
554
+ "doctor.check.session_hints_stale.remediation": "Run `fabric doctor --fix` to delete stale session-hints cache files.",
520
555
  "doctor.check.hook_cache_writable.name": "Hook cache writable",
521
556
  "doctor.check.hook_cache_writable.ok": "Hook sidecar cache path {path} accepts write probes.",
522
557
  "doctor.check.hook_cache_writable.message": "Hook sidecar cache path {path} is not writable; hook state updates will silently fail. Error: {error}.",
@@ -599,6 +634,7 @@ var enMessages = {
599
634
  "doctor.check.relevance_paths_drift.message.plural": "{count} narrow-scope canonical entries have relevance_paths whose globs match no file touched in the last {windowDays}d of git history. First: {detail}.",
600
635
  "doctor.check.relevance_paths_drift.remediation": "Review whether the entry is still relevant \u2014 use `fab_review.modify` to refresh the anchors or `fab_review.reject` to archive.",
601
636
  // W4-3 (KT-MOD-0001): narrow-scope entry with an empty relevance_paths set.
637
+ "doctor.check.relevance_paths_drift.remediation_with_sample": "Review whether the entry is still relevant \u2014 sample {sample}; refresh anchors via `fab_review.modify`, or archive via `fab_review.reject`.",
602
638
  "doctor.check.narrow_no_paths.name": "Knowledge narrow scope without paths",
603
639
  "doctor.check.narrow_no_paths.ok": "Every narrow-scope canonical entry carries at least one relevance_path.",
604
640
  "doctor.check.narrow_no_paths.message.singular": "{count} narrow-scope entry has an empty relevance_paths set \u2014 it can never path-match, so it will never surface (permanently dead). First: {detail}.",
@@ -638,6 +674,26 @@ var enMessages = {
638
674
  "doctor.check.unbound_project.ok": "The bound write store carries a project coordinate (project_id + active_project), so project-scope recall/writes route correctly.",
639
675
  "doctor.check.unbound_project.message": "Store '{alias}' is bound as the write target but the project coordinate is incomplete (missing {missing}); project-scope recall/writes fall back to team scope.",
640
676
  "doctor.check.unbound_project.remediation": "Run `fabric doctor --fix` to backfill the project binding (mints project_id, registers the project in the store, sets active_project). Idempotent \u2014 a second run is a no-op.",
677
+ // write_route_target_unbound — static check that write_routes survived the single-team-slot migration.
678
+ "doctor.check.write_route_target_unbound.name": "Write route target",
679
+ "doctor.check.write_route_target_unbound.ok": "Every write_routes[*].store is present in required_stores; the scope\u2192store routing is statically consistent.",
680
+ "doctor.check.write_route_target_unbound.message": '{count} write_route(s) point at an unbound store ({routes}); fab_propose on those scopes will report "no write-target store resolved".',
681
+ "doctor.check.write_route_target_unbound.remediation": "Either \u2460 `fabric store bind <store>` to add the target to required_stores (under the single team slot rule this replaces the current one), or \u2461 edit `.fabric/fabric-config.json` to remove the stale write_route.",
682
+ // stray_fabric_dir_detected — rc.11 root-cause fix: server-side resolveProjectRoot used cwd,
683
+ // so a subprocess launched from a subdirectory created .fabric/ in the wrong place. This
684
+ // lint walks the project tree and reports every .fabric/ other than <root>/.fabric.
685
+ "doctor.check.stray_fabric_dir_detected.name": "Stray .fabric directories",
686
+ "doctor.check.stray_fabric_dir_detected.ok": "No stray .fabric directories under the project root \u2014 the only authoritative anchor is <projectRoot>/.fabric.",
687
+ "doctor.check.stray_fabric_dir_detected.message": "Found {count} stray .fabric director(ies) ({dirs}) left by subprocesses that mistook a subdirectory for the project root (pre-rc.10 hooks / pre-rc.11 server-side). These scatter events.jsonl / metrics.jsonl / .cache across the source tree.",
688
+ "doctor.check.stray_fabric_dir_detected.remediation": "Run `fabric doctor --fix` to rename each stray dir to `.fabric.stale-<timestamp>` (rescue-before-delete \u2014 never a hard delete). Review the renamed dirs before merging events. Also upgrade global fabric-cli to rc.11+ so the server-side git-anchor resolver is active.",
689
+ // legacy_fabric_cache_dir_detected — the recall engine's BM25 / vector
690
+ // caches used to live at `.fabric/cache/{bm25,vectors}`; unify-fabric-cache-dir
691
+ // moved them into `.fabric/.cache/` next to the hook sidecar cache so one
692
+ // .gitignore rule covers both. Old data is intact; the fix is a rename.
693
+ "doctor.check.legacy_fabric_cache_dir_detected.name": "Legacy .fabric/cache/ directories",
694
+ "doctor.check.legacy_fabric_cache_dir_detected.ok": "Recall caches live under .fabric/.cache/ \u2014 no legacy .fabric/cache/{bm25,vectors} remains.",
695
+ "doctor.check.legacy_fabric_cache_dir_detected.message": "Found {count} legacy recall-cache dir(s) ({dirs}). These pre-date the unify-fabric-cache-dir move to .fabric/.cache/; the on-disk data (BM25 snapshots / vector embeddings) is intact \u2014 a rename preserves it.",
696
+ "doctor.check.legacy_fabric_cache_dir_detected.remediation": "Run `fabric doctor --fix` to rename each legacy dir into its `.fabric/.cache/` counterpart (idempotent; skipped if the new path already holds newer data). No re-embed cost is paid; the snapshot files are moved as-is.",
641
697
  "doctor.check.skill_md_yaml_invalid.name": "Skill markdown YAML",
642
698
  "doctor.check.skill_md_yaml_invalid.ok": "All .claude/.codex SKILL.md frontmatter values parse as strict YAML.",
643
699
  "doctor.check.skill_md_yaml_invalid.message.singular": "{count} SKILL.md frontmatter value contains an unquoted ': ' that strict YAML parsers reject (Claude Code tolerates it; Codex CLI drops the skill at load). First: {detail}.",
@@ -779,6 +835,7 @@ var enMessages = {
779
835
  // so its MCP server loads — that is the default anchor; the --reapply maintenance
780
836
  // hint moves to --verbose.
781
837
  "cli.install.next-step.restart": "restart any open Claude Code / Codex session to load Fabric (new sessions pick it up automatically).",
838
+ "cli.install.next-step.nudge-mode": 'Human breadcrumbs default to minimal (one status line/session). Mute with nudge_mode: "silent" in .fabric/fabric-config.json or FABRIC_NUDGE_MODE=silent; raise with normal/verbose.',
782
839
  "cli.install.reason-message": "{label} {message}",
783
840
  "cli.install.language.prompt": "Choose the Fabric language (used for both UI and knowledge; change later via `fabric config`):",
784
841
  "cli.install.language.option.zh-CN": "\u7B80\u4F53\u4E2D\u6587 (zh-CN)",
@@ -835,7 +892,7 @@ var enMessages = {
835
892
  "cli.install.semantic.installing": "Running `npm i -g fastembed` \u2026",
836
893
  "cli.install.semantic.installed": "fastembed installed. The embedding model downloads automatically on the first recall (~tens\u2013hundreds of MB; no KB data is uploaded).",
837
894
  "cli.install.semantic.install-failed": "Auto-install failed ({reason}). Run the steps manually:",
838
- "cli.install.semantic.manual-steps": " 1. Install the optional embedder where the MCP server resolves modules (a global install is global):\n npm i -g fastembed\n 2. Warm the model cache (the first run downloads the weights, ~tens\u2013hundreds of MB; no KB data is uploaded):\n export FABRIC_EMBED_CACHE_DIR=~/.cache/fabric-embed # strict-offline: pre-place the weights here\n Note: after switching embed_model the existing vector dim/semantics change; the next recall re-embeds with the new model (doc vectors are cached by text and auto-recompute on mismatch).\n Disable: set embed_enabled=false in fabric.config.json.",
895
+ "cli.install.semantic.manual-steps": " 1. Install the optional embedder where the MCP server resolves modules (a global install is global):\n npm i -g fastembed\n 2. Warm the model cache (the first run downloads the weights, ~tens\u2013hundreds of MB; no KB data is uploaded):\n export FABRIC_EMBED_CACHE_DIR=~/.cache/fabric-embed # strict-offline: pre-place the weights here\n Note: after switching embed_model the existing vector dim/semantics change; the next recall re-embeds with the new model (doc vectors are cached by text and auto-recompute on mismatch).\n Disable: set embed_enabled=false in .fabric/fabric-config.json.",
839
896
  // C5: store onboarding interactive copy routed through t().
840
897
  "cli.install.store.local-store": "local store",
841
898
  "cli.install.store.bind-mounted.prompt": "Bind an already-mounted knowledge store to this project?",
@@ -1002,6 +1059,23 @@ var enMessages = {
1002
1059
  // per [[fabric-serve-quarantine-not-delete]]. Restore from git history when
1003
1060
  // the web UI surface is re-enabled.
1004
1061
  // v2.0.0-rc.29 TASK-008 (BUG-L2): onboard-coverage i18n keys.
1062
+ "cli.first-hit.description": "Prove install\u2192first-hit readiness (bind + non-empty knowledge surface)",
1063
+ "cli.first-hit.args.json.description": "Machine-readable JSON report",
1064
+ "cli.first-hit.args.target.description": "Project root (default: cwd)",
1065
+ "cli.first-hit.args.seed.description": "If empty store, write minimal starter knowledge entries",
1066
+ "cli.first-hit.args.paths.description": "Comma-separated probe paths for surface check",
1067
+ "cli.first-hit.msg.ok": "first-hit ready: {total} knowledge entr{plural} across {stores} store(s); hooks present.",
1068
+ "cli.first-hit.msg.unbound": "unbound: no store is bound to this project's read-set \u2014 knowledge cannot surface.",
1069
+ "cli.first-hit.msg.no_write_target": "no_write_target: project has required stores but no active_write_store.",
1070
+ "cli.first-hit.msg.empty_store": "empty_store: store(s) bound but 0 canonical knowledge files \u2014 empty store is not a happy path.",
1071
+ "cli.first-hit.msg.missing_required": "missing_required: one or more required_stores are not mounted \u2014 multi-store bind incomplete.",
1072
+ "cli.first-hit.msg.write_target_mismatch": "write_target_mismatch: active_write_store is not a mounted writable store on the read-set.",
1073
+ "cli.first-hit.msg.store_unreachable": "store_unreachable: a bound store is registered but its directory is missing on disk.",
1074
+ "cli.first-hit.msg.project_unsealed": "project_unsealed: write store is bound but project_id/active_project is missing \u2014 team knowledge will land flat (semantic_scope: team), not project-partitioned.",
1075
+ "cli.first-hit.msg.no_match": "no_match: knowledge exists but the probe surface is empty (path/scope filter).",
1076
+ "cli.first-hit.msg.hooks_missing": "hooks_missing: knowledge is present but SessionStart/PreToolUse hooks are not installed.",
1077
+ "cli.first-hit.msg.no_project": "no_project: this directory is not a Fabric project (missing .fabric/fabric-config.json).",
1078
+ "cli.first-hit.msg.no_global": "no_global: fabric global config missing \u2014 run fabric install --global first.",
1005
1079
  "cli.onboard-coverage.description": "Report S5 onboard-slot coverage for the workspace. Used by the fabric-archive Skill's first-run phase to detect unclaimed project-tone slots.",
1006
1080
  "cli.onboard-coverage.args.json.description": "Emit machine-readable JSON to stdout instead of the human table.",
1007
1081
  "cli.onboard-coverage.args.target.description": "Override the project root (defaults to cwd).",
@@ -1252,6 +1326,10 @@ var enMessages = {
1252
1326
  "cli.info.recall.vector.not-ready": "not ready \u2014 recall falls back to keyword mode (BM25 / additive)",
1253
1327
  "cli.info.recall.warm.ok": "embedder warm: model '{model}' loaded (vector dim {dim}), cached at {dir}",
1254
1328
  "cli.info.recall.warm.fail": "embedder unavailable \u2014 the optional 'fastembed' package is not resolvable or the model failed to load.\n Recall falls back to keyword mode (BM25 / additive). Install fastembed where the server resolves modules, then retry.",
1329
+ "cli.store.mount.description": "Mount a knowledge store into the global registry",
1330
+ "cli.store.create.description": "Create a brand-new local knowledge store and mount it",
1331
+ "cli.store.remove.description": "Detach a store from the registry (does NOT delete it)",
1332
+ "cli.store.explain.description": "Explain how a store alias resolves",
1255
1333
  "cli.store.list.description": "List mounted knowledge stores",
1256
1334
  // Footer note appended to `fabric store --help` — explains where the advanced
1257
1335
  // (meta.hidden) operations went so the list-only listing isn't a dead end.
@@ -1325,6 +1403,8 @@ var enMessages = {
1325
1403
 
1326
1404
  // src/i18n/locales/zh-CN.ts
1327
1405
  var zhCNMessages = {
1406
+ "cli.signpost.retired": "\u547D\u4EE4 `{retired}` \u5DF2\u79FB\u9664\u3002\u8BF7\u6539\u7528 `{successor}`\u3002",
1407
+ "cli.doctor.args.probe.description": "\u8F93\u51FA\u673A\u5668\u53EF\u8BFB JSON \u5C31\u7EEA\u5FEB\u7167(first-hit + store/hooks),\u4E0D\u8DD1 --fix CI \u4F18\u5148\u7528 --probe \u505A\u8F7B\u91CF\u5C31\u7EEA\u5FEB\u7167\uFF1B\u5B8C\u6574 cite-coverage \u626B\u63CF\u6309\u9700\u8FD0\u884C\u3002",
1328
1408
  "cli.main.description": "Fabric CLI \u2014 \u81EA\u52A8\u628A\u672C\u9879\u76EE\u7684\u51B3\u7B56 / \u8E29\u5751 / \u89C4\u8303\u5582\u7ED9\u4F60\u7684 AI \u52A9\u624B\uFF0C\u8BA9\u5B83\u4E0D\u5FC5\u6BCF\u6B21\u4F1A\u8BDD\u91CD\u65B0\u5B66\u3002\u9996\u6B21\u4F7F\u7528?\u8FD0\u884C: fabric install",
1329
1409
  "cli.shared.created": "\u5DF2\u521B\u5EFA",
1330
1410
  "cli.shared.skipped": "\u5DF2\u8DF3\u8FC7",
@@ -1367,10 +1447,23 @@ var zhCNMessages = {
1367
1447
  "cli.inspect.explain.census": "\u5168\u96C6\u666E\u67E5",
1368
1448
  "cli.inspect.explain.census-total": "\u603B\u8BA1 {total}",
1369
1449
  "cli.inspect.error": "inspect \u5931\u8D25:{message}",
1450
+ // `fabric preview` — 本地只读知识预览 web 服务(loopback-only)。
1451
+ "cli.preview.description": "\u542F\u52A8\u672C\u5730\u53EA\u8BFB\u77E5\u8BC6\u9884\u89C8\u9875(\u6D4F\u89C8\u5668\u91CC\u6309\u53D7\u4F17\u5206\u7EC4\u6D4F\u89C8)",
1452
+ "cli.preview.arg.port": "\u76D1\u542C\u7AEF\u53E3(\u9ED8\u8BA4 7777)\u3002",
1453
+ "cli.preview.arg.host": "\u76D1\u542C\u5730\u5740(\u9ED8\u8BA4 127.0.0.1,\u4EC5\u672C\u673A\u53EF\u8BBF\u95EE)\u3002",
1454
+ "cli.preview.arg.open": "\u542F\u52A8\u540E\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668(\u9ED8\u8BA4\u5F00;\u4F20 --no-open \u5173\u95ED)\u3002",
1455
+ "cli.preview.arg.target": "\u8986\u76D6\u9879\u76EE\u6839\u76EE\u5F55(\u9ED8\u8BA4\u53D6 cwd)\u3002",
1456
+ "cli.preview.arg.variant": "\u9ED8\u8BA4\u6253\u5F00\u7684\u6837\u5F0F\u53D8\u4F53(\u9ED8\u8BA4 lumen;\u5168\u90E8\u98CE\u683C\u89C1 /gallery)\u3002",
1457
+ "cli.preview.gallery-hint": "\u6240\u6709\u6837\u5F0F\u753B\u5ECA:{url}",
1458
+ "cli.preview.started": "\u77E5\u8BC6\u9884\u89C8\u5DF2\u542F\u52A8:{url}",
1459
+ "cli.preview.opening": "\u6B63\u5728\u6253\u5F00\u6D4F\u89C8\u5668\u2026",
1460
+ "cli.preview.stop-hint": "\u6309 Ctrl-C \u505C\u6B62\u3002",
1461
+ "cli.preview.stopped": "\u9884\u89C8\u5DF2\u505C\u6B62\u3002",
1462
+ "cli.preview.error": "preview \u5931\u8D25:{message}",
1370
1463
  "cli.audit.description": "\u77E5\u8BC6\u4E0E\u9065\u6D4B\u5BA1\u8BA1 (cite/conflicts/history/metrics)",
1371
1464
  // `fabric audit cite` — recall 覆盖率为 0 的自诊断提示。
1372
- "cli.audit.cite.recall-mismatch-hint": "recall \u8986\u76D6\u7387\u4E3A 0,\u4F46\u672C\u7A97\u53E3\u6709 {recalls} \u6B21 recall(\u5206\u5E03\u5728 {sessions} \u4E2A\u4F1A\u8BDD)\u2014\u2014 \u6CA1\u6709\u4E00\u4E2A\u4E0E\u7F16\u8F91\u5171\u4EAB\u4F1A\u8BDD\u3002\u591A\u534A\u662F fab_recall \u8C03\u7528\u65B9\u4F20\u4E86\u975E\u5BA2\u6237\u7AEF session_id(\u5173\u8054\u6309\u4F1A\u8BDD\u9694\u79BB)\u3002\u89C1 AGENTS.md:fab_recall \u5FC5\u987B\u4F20\u5165\u771F\u5B9E\u5BA2\u6237\u7AEF session_id\u3002",
1373
- "cli.audit.cite.recall-none-hint": "recall \u8986\u76D6\u7387\u4E3A 0 \u2014\u2014 \u8FD9\u4E9B\u7F16\u8F91\u524D\u6CA1\u6709\u540C\u4F1A\u8BDD\u7684 fab_recall\u3002\u6539\u524D\u5148 recall,\u4E14\u4F20\u5165\u771F\u5B9E\u5BA2\u6237\u7AEF session_id(\u5173\u8054\u6309\u4F1A\u8BDD\u9694\u79BB)\u3002\u89C1 AGENTS.md\u3002",
1465
+ "cli.audit.cite.recall-mismatch-hint": "recall \u8986\u76D6\u7387\u4E3A 0,\u4F46\u672C\u7A97\u53E3\u6709 {recalls} \u6B21 recall(\u5206\u5E03\u5728 {sessions} \u4E2A\u4F1A\u8BDD)\u2014\u2014 \u6CA1\u6709\u4E00\u4E2A\u4E0E\u7F16\u8F91\u5171\u4EAB\u4F1A\u8BDD\u3002\u5E38\u89C1\u539F\u56E0:(1) fab_recall \u6F0F\u4F20/\u4F20\u9519 session_id(\u5FC5\u987B\u662F\u771F\u5B9E\u5BA2\u6237\u7AEF session_id;planned \u65E0 session \u6C38\u4E0D\u4E0E edit \u5173\u8054);(2) recall \u7684 paths \u4E0E\u7F16\u8F91\u6587\u4EF6\u65E0 path-overlap(\u81EA\u52A8 cite \u53EA\u8BA1\u91CD\u53E0\u7684 planned.target_paths)\u3002\u4FEE:\u4F20 session_id\u3001\u91CD\u88C5 hooks \u542F\u7528 active-session sidecar\u3001\u6216 fab_recall \u8986\u76D6\u5C06\u7F16\u8F91\u7684\u8DEF\u5F84\u3002\u89C1 AGENTS.md \u4E0E docs/UPGRADE.md\u3002",
1466
+ "cli.audit.cite.recall-none-hint": "recall \u8986\u76D6\u7387\u4E3A 0 \u2014\u2014 \u8FD9\u4E9B\u7F16\u8F91\u524D\u6CA1\u6709\u540C\u4F1A\u8BDD\u7684 fab_recall(\u6216 planned \u4E8B\u4EF6 session_id \u4E3A\u7A7A\u5BFC\u81F4\u65E0\u6CD5\u5173\u8054)\u3002\u6539\u524D\u5148 recall \u5E76\u4F20\u5165\u771F\u5B9E\u5BA2\u6237\u7AEF session_id;install \u540E SessionStart \u4F1A\u5199 .fabric/.cache/active-session.json \u4F9B\u670D\u52A1\u7AEF\u56DE\u586B\u3002\u4ECD\u8981\u6C42 path-overlap:recall \u8981\u8986\u76D6\u5C06\u7F16\u8F91\u7684\u6587\u4EF6,\u4E0D\u8981\u53EA recall \u65E0\u5173\u7684 .fabric \u8DEF\u5F84\u3002\u89C1 AGENTS.md \u4E0E docs/UPGRADE.md\u3002",
1374
1467
  // `fabric audit --help` — 过滤式帮助(i18n 子命令清单)。
1375
1468
  "cli.audit.help.tagline": "\u77E5\u8BC6\u4E0E\u9065\u6D4B\u5BA1\u8BA1\u9762(\u53EA\u8BFB)",
1376
1469
  "cli.audit.help.sub.cite": "Cite \u653F\u7B56\u9075\u5FAA\u5EA6\u62A5\u544A",
@@ -1413,7 +1506,7 @@ var zhCNMessages = {
1413
1506
  "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",
1414
1507
  "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 cc,codex\u3002",
1415
1508
  "cli.config.errors.expected-object": "{path} \u4E2D\u5E94\u4E3A\u5BF9\u8C61\u3002",
1416
- "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",
1509
+ "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/fabric-config.json \u4E2D\u8BBE\u7F6E clientPaths\u3002",
1417
1510
  "cli.config.install.no-config-path": "\u8DF3\u8FC7 {client}\uFF1A\u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u8DEF\u5F84\u3002",
1418
1511
  "cli.config.install.dry-run": "[dry-run] {client}\uFF1A\u5C06\u5199\u5165 {path}",
1419
1512
  "cli.config.install.wrote": "{client}\uFF1A\u5DF2\u5199\u5165 {path}",
@@ -1482,7 +1575,7 @@ var zhCNMessages = {
1482
1575
  "doctor.section.fixable": "\u53EF\u4FEE\u590D\u9519\u8BEF\uFF1A",
1483
1576
  "doctor.section.manual": "\u9700\u624B\u52A8\u4FEE\u590D\uFF1A",
1484
1577
  "doctor.section.warnings": "\u8B66\u544A\uFF1A",
1485
- "doctor.section.fix-knowledge-mutations": "Fix-knowledge \u53D8\u66F4\uFF1A",
1578
+ "doctor.section.fix-knowledge-mutations": "\u77E5\u8BC6\u4FA7\u53D8\u66F4\uFF1A",
1486
1579
  // flat-design follow-up: doctor 剩余的 UI-shell 文案(TL;DR 头、--fix 变更计划、
1487
1580
  // 过滤版 --help)从硬编码英文搬进 i18n,让整个 `fabric doctor` 输出跟随机器语言。
1488
1581
  // USAGE/OPTIONS/EXAMPLES 标签保持英文,与其它命令 --help 的 citty renderUsage 对齐。
@@ -1494,7 +1587,15 @@ var zhCNMessages = {
1494
1587
  // 文案通过插值带上 store alias / 计数。
1495
1588
  "doctor.store.no-global-config": "\u65E0\u5168\u5C40 Fabric \u914D\u7F6E \u2014\u2014 \u8FD0\u884C `fabric install --global <url>`",
1496
1589
  "doctor.store.missing-required": "\u5FC5\u9700 store '{id}' \u672A\u6302\u8F7D;\u8FD0\u884C `fabric store mount`",
1497
- "doctor.store.unbound": "store '{alias}' \u5DF2\u6302\u8F7D\u4F46\u672A\u7ED1\u5B9A\u5230\u672C\u9879\u76EE;\u8FD0\u884C `fabric store bind {alias}` \u5373\u53EF\u5728\u6B64\u8BFB\u53D6\u5B83\u7684\u77E5\u8BC6(\u518D\u7528 `fabric store switch-write {alias}` \u628A\u56E2\u961F\u77E5\u8BC6\u5199\u5165\u5B83)",
1590
+ "doctor.store.unbound": "store '{alias}' \u5DF2\u6302\u8F7D\u4F46\u672A\u7ED1\u5B9A\u5230\u672C\u9879\u76EE \u2014 \u7C98\u8D34\u6267\u884C: `fabric store bind {alias}` \u7136\u540E `fabric store switch-write {alias}`",
1591
+ "doctor.store.empty": "\u5DF2\u7ED1\u5B9A store \u77E5\u8BC6\u6761\u6570\u4E3A 0\uFF08{stores}\uFF09\u2014\u2014\u5728 seed \u6216 clone \u6709\u5185\u5BB9\u524D\u65E0\u6CD5 first-hit\uFF1B\u8FD0\u884C `fabric first-hit --seed`\uFF08\u7A7A\u672C\u5730\u5E93\uFF09\u6216\u7ED1\u5B9A\u5E26\u5185\u5BB9\u7684\u8FDC\u7A0B team store",
1592
+ "doctor.store.no-write-target": "\u672C\u9879\u76EE\u65E0 active write store \u2014 \u7C98\u8D34\u6267\u884C: `fabric store bind <alias>` \u7136\u540E `fabric store switch-write <alias>`\uFF08\u6216 `fabric install`\uFF09",
1593
+ "doctor.store.no-match": "\u77E5\u8BC6\u5B58\u5728\u4F46\u4E0E\u63A2\u6D4B\u8DEF\u5F84\u65E0\u5339\u914D \u2014\u2014 \u653E\u5BBD paths \u6216\u4E3A\u6A21\u5757\u8865 relevance_paths",
1594
+ "doctor.store.write-target-mismatch": "\u6D3B\u52A8\u5199\u5E93 '{alias}' \u4E0D\u662F\u672C\u9879\u76EE\u7684\u6709\u6548 team \u5199\u76EE\u6807 \u2014\u2014 \u8FD0\u884C `fabric store switch-write <\u5DF2\u6302\u8F7D team \u522B\u540D>`",
1595
+ "doctor.store.first-hit-missing-required": "\u5FC5\u9700 store \u672A\u6302\u8F7D: {ids} \u2014\u2014 \u5148 bind/clone \u518D\u8DD1 `fabric first-hit`",
1596
+ "doctor.store.first-hit-unreachable": "\u5DF2\u7ED1\u5B9A store \u76EE\u5F55\u78C1\u76D8\u7F3A\u5931: {aliases} \u2014\u2014 remount/re-clone \u540E\u8DD1 `fabric doctor`",
1597
+ "doctor.store.hooks-missing": "\u77E5\u8BC6\u5DF2\u6709\u4F46 SessionStart/PreToolUse hooks \u7F3A\u5931 \u2014\u2014 \u91CD\u8DD1 `fabric install`",
1598
+ "doctor.store.first-hit-ok": "first-hit \u5C31\u7EEA\uFF1A{count} \u6761\u77E5\u8BC6\uFF0Cstore\uFF1A{stores}",
1498
1599
  "doctor.store.alias-drift": "by-alias \u53EF\u8BFB\u6027\u8F6F\u94FE\u4E0E\u6CE8\u518C\u8868\u4E0D\u540C\u6B65:{refs};\u8FD0\u884C `fabric doctor --fix` \u4FEE\u590D ~/.fabric/stores/by-alias/",
1499
1600
  "doctor.store.local-only": "store '{alias}' \u4EC5\u672C\u5730;\u52A0\u4E00\u4E2A git remote \u4EE5\u5907\u4EFD",
1500
1601
  "doctor.store.executable": "store '{alias}' \u542B\u53EF\u6267\u884C/\u811A\u672C\u6587\u4EF6({files})\u2014\u2014 store \u4EC5\u5B58\u6570\u636E;Fabric \u4ECE\u4E0D\u8FD0\u884C\u5B83\u4EEC (S65)",
@@ -1503,15 +1604,22 @@ var zhCNMessages = {
1503
1604
  "doctor.store.related-broken": "{count} \u6761 `related` \u94FE\u63A5\u6307\u5411\u8BED\u6599\u4E2D\u4E0D\u5B58\u5728\u7684 id:{samples}{overflow} \u2014\u2014 \u901A\u8FC7 `fab_review` (modify) \u4FEE\u590D related \u8FB9,\u6216\u7F16\u8F91\u6761\u76EE frontmatter",
1504
1605
  "doctor.store.related-hub": "related \u56FE\u8C31\u67A2\u7EBD(\u524D {shown} / \u5171 {total} \u4E2A\u88AB\u5F15\u7528):{top}",
1505
1606
  "doctor.store.unreachable": "store '{alias}' \u5728 read-set \u4E2D\u4F46\u78C1\u76D8\u4E0A\u4E0D\u53EF\u8FBE({reason});\u8FD0\u884C `fabric store mount` / \u91CD\u65B0 clone,\u518D\u8DD1 `fabric doctor`",
1607
+ "doctor.store.unreachable-bound": "\u5DF2\u7ED1\u5B9A store \u7684\u78C1\u76D8\u76EE\u5F55\u7F3A\u5931\uFF1A{stores} \u2014 \u8BF7 re-clone \u6216 remount\uFF0C\u518D\u8DD1 fabric doctor",
1506
1608
  "doctor.store.consumption-heatmap": "\u6D88\u8D39\u70ED\u533A(\u8FD1 {days}d,{consumed}/{total} \u6761\u88AB\u8BFB,\u8DE8 {windows} \u4E2A\u7A97\u53E3):{top}",
1507
1609
  "doctor.store.consumption-zero": "{count} \u6761\u5728\u8FD1 {days}d \u5185\u4ECE\u672A\u88AB\u6D88\u8D39:{sample}{overflow} \u2014\u2014 \u901A\u8FC7 `fab_review` \u8003\u8651\u6DD8\u6C70(\u6D88\u8D39\u91CF\u53EA\u662F\u4FE1\u53F7\u4E4B\u4E00,\u975E\u9648\u65E7\u7684\u8BC1\u636E)",
1508
1610
  "doctor.store.overflow-more": ", \u2026(+{count} \u6761)",
1509
- "doctor.fix-plan.header": "fix-knowledge \u53D8\u66F4\u8BA1\u5212(\u5171 {count} \u9879)",
1611
+ "doctor.check.knowledge_body_altitude_dump.name": "\u77E5\u8BC6\u6B63\u6587 altitude",
1612
+ "doctor.check.knowledge_body_altitude_dump.ok": "\u672A\u53D1\u73B0 dump \u5F62\u6001\u7684\u77E5\u8BC6\u6B63\u6587\u3002",
1613
+ "doctor.check.knowledge_body_altitude_dump.message.singular": "1 \u6761 dump \u5F62\u6001\u77E5\u8BC6\u6B63\u6587: {detail}",
1614
+ "doctor.check.knowledge_body_altitude_dump.message.plural": "{count} \u6761 dump \u5F62\u6001\u77E5\u8BC6\u6B63\u6587(\u4F8B\u5982 {detail})",
1615
+ "doctor.check.knowledge_body_altitude_dump.remediation": "\u6539\u5199\u6210\u53EF\u590D\u7528\u7684 decision/pitfall/guideline altitude(\u5E26 ## \u7ED3\u6784),\u4E0D\u8981\u8D34 session \u6D41\u6C34;\u7ECF fabric-archive / fab_propose \u91CD\u5F52\u6863",
1616
+ "doctor.check.knowledge_body_altitude_dump.scan_error": "\u6B63\u6587 altitude \u626B\u63CF\u5931\u8D25({detail});doctor \u65E0\u6CD5\u786E\u8BA4\u8BED\u6599\u5E72\u51C0\u3002",
1617
+ "doctor.fix-plan.header": "\u77E5\u8BC6\u4FA7\u53D8\u66F4\u8BA1\u5212(\u5171 {count} \u9879)",
1510
1618
  "doctor.fix-plan.preview": "\u9884\u89C8:",
1511
1619
  "doctor.fix-plan.more": "... \u8FD8\u6709 {count} \u9879",
1512
1620
  "doctor.help.tagline": "\u8BCA\u65AD\u5E76\u4FEE\u590D Fabric \u5DE5\u4F5C\u533A\u95EE\u9898",
1513
1621
  "doctor.help.flag.target": "\u8986\u76D6\u9879\u76EE\u6839\u76EE\u5F55(\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55)",
1514
- "doctor.help.flag.fix": "\u81EA\u52A8\u4FEE\u590D(\u6D3E\u751F\u72B6\u6001 + \u77E5\u8BC6 frontmatter/git mv)",
1622
+ "doctor.help.flag.fix": "\u81EA\u52A8\u4FEE\u590D(\u6D3E\u751F\u72B6\u6001 + \u77E5\u8BC6\u4FA7 cache/counter \u53D8\u66F4)",
1515
1623
  "doctor.help.flag.json": "\u4EE5 JSON \u8F93\u51FA\u4F9B\u7A0B\u5E8F\u6D88\u8D39",
1516
1624
  "doctor.help.flag.verbose": "\u663E\u793A\u9762\u5411\u7EF4\u62A4\u8005\u7684\u64CD\u4F5C\u63D0\u793A",
1517
1625
  "doctor.help.example.run": "\u8FD0\u884C\u8BCA\u65AD",
@@ -1594,11 +1702,11 @@ var zhCNMessages = {
1594
1702
  "cite-coverage.skip.architectural": "\u67B6\u6784\u5C42",
1595
1703
  "cite-coverage.skip.other": "\u5176\u4ED6",
1596
1704
  "cli.doctor.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\u3002\u9ED8\u8BA4\u4F9D\u6B21\u4F7F\u7528 --target\u3001EXTERNAL_FIXTURE_PATH\u3001\u5F53\u524D\u76EE\u5F55\u3002",
1597
- "cli.doctor.args.fix.description": "\u4FEE\u590D Fabric \u6D3E\u751F\u72B6\u6001\uFF08meta + \u7D22\u5F15\uFF09\u3002",
1705
+ "cli.doctor.args.fix.description": "\u81EA\u52A8\u4FEE\u590D\u6D3E\u751F\u72B6\u6001\uFF08meta/\u7D22\u5F15/\u9501\uFF09\u4E0E\u77E5\u8BC6\u4FA7\u53D8\u66F4\uFF08store \u8BA1\u6570\u5668 floor\u3001\u9648\u65E7 session-hints \u7F13\u5B58\u6E05\u7406\uFF09\u3002\u8870\u51CF\u7C7B lint(orphan demote / stale archive)\u4ECD\u53EA\u8BFB\u4E0A\u62A5 \u2014 \u8BF7\u8D70 fab_review\u3002",
1598
1706
  "cli.doctor.args.json.description": "\u4EE5 JSON \u8F93\u51FA doctor \u62A5\u544A\u3002",
1599
1707
  "cli.doctor.args.strict.description": "\u5C06 warning \u4E5F\u89C6\u4E3A\u5931\u8D25\u3002",
1600
- "cli.doctor.args.fix-knowledge.description": "\u5E94\u7528\u77E5\u8BC6\u5E93 lint \u53D8\u66F4:\u5F52\u6863\u903E\u671F pending draft\u3001\u4FEE\u6B63\u6F02\u79FB\u7684 per-store id \u8BA1\u6570\u5668\u3001\u6E05\u7406\u9648\u65E7 session-hint \u7F13\u5B58\u3002\u8870\u51CF\u7C7B lint(orphan demote / stale archive)\u53EA\u8BFB\u4E0A\u62A5 \u2014 \u8BF7\u901A\u8FC7 fab_review \u6D41\u7A0B\u5904\u7406\u3002\u9ED8\u8BA4 doctor \u8FD0\u884C\u4ECD\u7136\u53EA\u8BFB\u3002",
1601
- "cli.doctor.args.yes.description": "\u8DF3\u8FC7 --fix-knowledge \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",
1708
+ "cli.doctor.args.fix-knowledge.description": "\uFF08\u5185\u90E8/legacy \u540D\u79F0\uFF09\u77E5\u8BC6\u4FA7 mutation \u81C2\uFF0C\u73B0\u5DF2\u7531 `fabric doctor --fix` \u4E00\u5E76\u8C03\u7528\u3002\u52FF\u518D\u5355\u72EC\u4F9D\u8D56 --fix-knowledge\u3002",
1709
+ "cli.doctor.args.yes.description": "\u8DF3\u8FC7 --fix \u77E5\u8BC6\u4FA7\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",
1602
1710
  // rc.35 TASK-12 (P0-11): --verbose 展开 maintainer 受众的 remediation。
1603
1711
  "cli.doctor.args.verbose.description": "\u5C55\u5F00\u5168\u90E8 action hint,\u5305\u62EC maintainer \u53D7\u4F17\u7684(Fabric \u8D21\u732E\u8005\u4FEE\u6E90\u7801\u7528)\u3002\u9ED8\u8BA4 npm \u7EC8\u7AEF\u7528\u6237\u89C6\u56FE\u4F1A\u628A\u8FD9\u4E9B\u6298\u53E0\u3002",
1604
1712
  "doctor.maintainer-hint-folded": "(maintainer-only remediation \u2014 \u52A0 `fabric doctor --verbose` \u67E5\u770B)",
@@ -1705,7 +1813,7 @@ var zhCNMessages = {
1705
1813
  "doctor.check.events_jsonl_health.message.metric_leak": ".fabric/events.jsonl \u542B {count} \u884C metric-counter \u7C7B event_type ({samples})\u3002\u8FD9\u4E9B event \u5E94\u7531 metrics.jsonl \u8BA1\u6570, \u4E0D\u518D\u8FDB\u5165 audit ledger\u3002",
1706
1814
  "doctor.check.events_jsonl_health.message.metrics_stale": ".fabric/metrics.jsonl \u5DF2 {minutes} \u5206\u949F\u672A\u66F4\u65B0\uFF1Bserver-side 60s flush \u53EF\u80FD stalled\u3002",
1707
1815
  "doctor.check.events_jsonl_health.message.rotation_overdue": ".fabric/events.jsonl \u5DF2 {days} \u5929\u672A rotate\uFF1B6h rotation tick \u53EF\u80FD\u672A\u8FD0\u884C\u3002",
1708
- "doctor.check.events_jsonl_health.remediation": "\u8FD0\u884C `fabric doctor --fix` \u2014\u2014 \u5B83\u4F1A\u89E6\u53D1 rotation \u5E76 flush metrics.jsonl(rc.2 F16: \u65E0\u9700\u91CD\u542F server \u5373\u53EF\u6E05\u51FA idle \u671F\u672A\u5237\u7684 metric counter)\u3002\u82E5\u544A\u8B66\u4ECD\u6301\u7EED, \u518D\u91CD\u542F MCP server \u8BA9 startMetricsFlush + startRotationTick \u91CD\u65B0\u8C03\u5EA6\u3002\u82E5 metric_leak \u547D\u4E2D, \u68C0\u67E5\u6700\u8FD1\u4EE3\u7801\u6539\u52A8\u662F\u5426\u7ED5\u8FC7 bumpCounter API \u76F4\u63A5 appendEventLedgerEvent \u5199\u4E86 4 \u4E2A metric-managed event_type \u4E4B\u4E00\u3002",
1816
+ "doctor.check.events_jsonl_health.remediation": "\u8FD0\u884C `fabric doctor --fix` \u2014\u2014 \u4F1A\u6309 .fabric/fabric-config.json \u7684 fabric_event_retention_days(7|30|90) \u8F6E\u8F6C events.jsonl\uFF0C\u5E76 flush metrics.jsonl\u3002\u82E5\u544A\u8B66\u4ECD\u6301\u7EED\uFF0C\u518D\u91CD\u542F MCP server \u8BA9 startMetricsFlush + startRotationTick \u91CD\u65B0\u8C03\u5EA6\u3002\u82E5 metric_leak \u547D\u4E2D\uFF0C\u68C0\u67E5\u6700\u8FD1\u4EE3\u7801\u662F\u5426\u7ED5\u8FC7 bumpCounter \u76F4\u63A5\u5199\u4E86 metric-managed event_type\u3002",
1709
1817
  "doctor.check.event_ledger_partial_write.name": "\u4E8B\u4EF6\u8D26\u672C\u534A\u622A\u5199\u5165",
1710
1818
  "doctor.check.event_ledger_partial_write.ok.skipped": "\u65E0\u9700\u6267\u884C partial-write \u68C0\u67E5\uFF08ledger \u7F3A\u5931\u6216\u4E0D\u53EF\u5199\uFF09\u3002",
1711
1819
  "doctor.check.event_ledger_partial_write.message": "events.jsonl \u5728 byte offset {byteOffset} \u5904\u5B58\u5728 partial write\uFF08{byteLength} \u4E2A corrupted bytes\uFF09\u3002\u8FD0\u884C --fix \u622A\u65AD\u5E76\u4FDD\u7559 corrupted bytes\u3002",
@@ -1729,18 +1837,23 @@ var zhCNMessages = {
1729
1837
  "doctor.check.retired_reference.ok": "bootstrap\u3001SKILL.md\u3001\u5DF2\u5B89\u88C5 hooks \u4E2D\u65E0\u6B8B\u7559\u7684\u9000\u5F79\u5DE5\u5177/\u5B57\u6BB5\u540D\u3002",
1730
1838
  "doctor.check.retired_reference.message": "agent \u53EF\u89C1\u6587\u672C\u4E2D\u6709 {count} \u5904\u6307\u5411\u9000\u5F79\u5DE5\u5177/\u5B57\u6BB5\u540D\u7684 stale pointer: {sample}",
1731
1839
  "doctor.check.retired_reference.remediation": "\u628A\u547D\u4E2D\u6587\u672C\u6539\u4E3A\u66FF\u4EE3 token (\u6216\u5220\u9664), \u518D\u8DD1 `fabric install` \u91CD\u540C\u6B65 dogfood \u955C\u50CF\u3002",
1732
- // v2.0.0-rc.33 W3-6 (P1-13): SKILL.md token budget lint。warn > 5K / error > 10K token (chars/3 估算)。基于 Anthropic 推荐 SKILL.md 热路径 ~3K, 超过 5K 已影响 progressive disclosure;超过 10K 是阻断级 (model context 浪费 + 加载延迟)。
1840
+ // v2.0.0-rc.33 W3-6 (P1-13): SKILL.md token budget lint。warn > 8K / error > 10K token (chars/3 估算)Anthropic 推荐 SKILL.md 热路径 ~3K, 但被监控的两个 skill (fabric-archive/review) 是最丰富的核心 skill, 合理偏大;warn 定在 8K (距 10K 装机硬闸留 2K 反应缓冲) 而非 5K。超过 10K 是阻断级 (model context 浪费 + 加载延迟)。
1733
1841
  "doctor.check.skill_token_budget.name": "Skill token \u9884\u7B97",
1734
- "doctor.check.skill_token_budget.ok": "\u6240\u6709 .claude/skills/<slug>/SKILL.md \u5728 token budget \u5185 (warn 5K / error 10K)\u3002",
1842
+ "doctor.check.skill_token_budget.ok": "\u6240\u6709 .claude/skills/<slug>/SKILL.md \u5728 token budget \u5185 (warn 8K / error 10K)\u3002",
1735
1843
  "doctor.check.skill_token_budget.message.singular": "{count} \u4E2A SKILL.md \u8D85\u51FA token budget: {list}\u3002\u5EFA\u8BAE\u628A\u8BE6\u7EC6\u5185\u5BB9\u4E0B\u6C89\u5230 ref/ progressive disclosure\u3002",
1736
1844
  "doctor.check.skill_token_budget.message.plural": "{count} \u4E2A SKILL.md \u8D85\u51FA token budget: {list}\u3002\u5EFA\u8BAE\u628A\u8BE6\u7EC6\u5185\u5BB9\u4E0B\u6C89\u5230 ref/ progressive disclosure\u3002",
1737
1845
  "doctor.check.skill_token_budget.remediation": "\u5C06\u8D85\u6807 SKILL.md \u4E2D\u7684\u8BE6\u7EC6 phase / worked-examples / decision \u8868\u79FB\u5230 `templates/skills/<slug>/ref/*.md`,SKILL.md \u70ED\u8DEF\u5F84\u53EA\u7559 trigger gate + \u5173\u952E phase \u6982\u8981;\u53C2\u8003 W1 progressive disclosure \u62C6\u5206\u6A21\u5F0F\u3002\u91CD\u65B0\u8DD1 `fabric install` \u540C\u6B65\u4E24\u7AEF\u3002",
1738
- // v2.0.0-rc.33 W3-7 (P1-14): SKILL.md description 结构 lint。代理 trigger-recall (真 LLM 测要 live model, W1 已用 gemini 跑过);本 lint 抓回归: description 缺失 / 超 60 token / 缺中文 trigger / 缺英文 trigger
1846
+ // v2.0.0-rc.33 W3-7 (P1-14): SKILL.md description 结构 lint。代理 trigger-recall (真 LLM 测要 live model, W1 已用 gemini 跑过);本 lint 抓回归: description 缺失 / 超 60 token / 缺中文 trigger / 缺英文 trigger / 缺 anti-trigger 边界。
1739
1847
  "doctor.check.skill_description.name": "Skill description \u8D28\u91CF",
1740
- "doctor.check.skill_description.ok": "\u6240\u6709 SKILL.md description \u5B57\u6BB5\u7ED3\u6784\u826F\u597D (\u975E\u7A7A / <60 token / \u4E2D\u82F1\u53CC\u8BED trigger)\u3002",
1848
+ "doctor.check.skill_description.ok": "\u6240\u6709 SKILL.md description \u5B57\u6BB5\u7ED3\u6784\u826F\u597D (\u975E\u7A7A / <60 token / \u4E2D\u82F1\u53CC\u8BED trigger / \u660E\u786E anti-trigger \u8FB9\u754C)\u3002",
1741
1849
  "doctor.check.skill_description.message.singular": "{count} \u4E2A SKILL.md description \u7ED3\u6784\u95EE\u9898: {list}\u3002description \u662F host \u7AEF auto-invoke \u7684\u4E3B\u8981\u5339\u914D\u4FE1\u53F7\u3002",
1742
1850
  "doctor.check.skill_description.message.plural": "{count} \u4E2A SKILL.md description \u7ED3\u6784\u95EE\u9898: {list}\u3002description \u662F host \u7AEF auto-invoke \u7684\u4E3B\u8981\u5339\u914D\u4FE1\u53F7\u3002",
1743
- "doctor.check.skill_description.remediation": "\u7F16\u8F91 `packages/cli/templates/skills/<slug>/SKILL.md` frontmatter `description:` \u5B57\u6BB5: (1) \u975E\u7A7A; (2) <60 token (chars/3 \u4F30\u7B97, \u7EA6 180 \u5B57\u7B26); (3) \u81F3\u5C11 1 \u4E2A\u4E2D\u6587 trigger \u77ED\u8BED; (4) \u81F3\u5C11 1 \u4E2A\u82F1\u6587 trigger \u77ED\u8BED\u3002\u53C2\u8003 W1 description rewrite \u98CE\u683C\u3002\u91CD\u65B0\u8DD1 `fabric install` \u540C\u6B65\u4E24\u7AEF\u3002\u5982\u9700\u9A8C\u8BC1 recall, \u8DD1 W1 \u7684 gemini delegate (\u89C1 .workflow/.scratchpad/rc33-plan/W1-VERIFY-RESULT.md)\u3002",
1851
+ "doctor.check.skill_description.remediation": "\u7F16\u8F91 `packages/cli/templates/skills/<slug>/SKILL.md` frontmatter `description:` \u5B57\u6BB5: (1) \u975E\u7A7A; (2) <60 token (chars/3 \u4F30\u7B97, \u7EA6 180 \u5B57\u7B26); (3) \u81F3\u5C11 1 \u4E2A\u4E2D\u6587 trigger \u77ED\u8BED; (4) \u81F3\u5C11 1 \u4E2A\u82F1\u6587 trigger \u77ED\u8BED; (5) \u660E\u786E anti-trigger,\u5982 `NOT PR review` / `NOT code review` / `\u4E0D\u662F...`\u3002\u53C2\u8003 W1 description rewrite \u98CE\u683C\u3002\u91CD\u65B0\u8DD1 `fabric install` \u540C\u6B65\u4E24\u7AEF\u3002\u5982\u9700\u9A8C\u8BC1 recall, \u8DD1 W1 \u7684 gemini delegate (\u89C1 .workflow/.scratchpad/rc33-plan/W1-VERIFY-RESULT.md)\u3002",
1852
+ "doctor.check.skill_contract.name": "Skill contract \u5B8C\u6574\u6027",
1853
+ "doctor.check.skill_contract.ok": "Fabric SKILL.md contract \u5B8C\u6574: hard-rule anchors\u3001MCP-only write path\u3001thin shim \u4E0E ref \u5165\u53E3\u5747\u5B58\u5728\u3002",
1854
+ "doctor.check.skill_contract.message.singular": "{count} \u4E2A Fabric skill contract \u95EE\u9898: {list}\u3002",
1855
+ "doctor.check.skill_contract.message.plural": "{count} \u4E2A Fabric skill contract \u95EE\u9898: {list}\u3002",
1856
+ "doctor.check.skill_contract.remediation": "\u5728 `packages/cli/templates/skills/<slug>/SKILL.md` \u4E0E\u5BF9\u5E94 `ref/*.md` \u4E2D\u6062\u590D\u7F3A\u5931\u7684 contract \u6587\u672C,\u518D\u8DD1 `fabric install` \u540C\u6B65 `.claude/skills` \u4E0E `.codex/skills`\u3002archive/review \u5FC5\u987B\u4FDD\u7559 DISPLAY/WRITE hard rules \u4E0E MCP-only mutation path;store/sync \u5FC5\u987B\u4FDD\u6301 thin CLI shim\u3002",
1744
1857
  // v2.0.0-rc.33 W3-3 (P1-3): cite-policy Goodhart 模式检测。扫 7d 内 assistant_turn_observed 事件, 3 个 anti-pattern (G1 仪式化 / G2 抄底引用 / G5 placeholder cite)。warning 级 (启发式有 false-positive, 不阻断)。
1745
1858
  "doctor.check.cite_goodhart.name": "Cite-policy Goodhart",
1746
1859
  "doctor.check.cite_goodhart.ok": "\u8FC7\u53BB 7d \u672A\u68C0\u6D4B\u5230 cite-policy Goodhart \u53CD\u6A21\u5F0F\u3002",
@@ -1810,7 +1923,7 @@ var zhCNMessages = {
1810
1923
  "doctor.check.index_drift.ok": "agents.meta.json counters envelope \u5BF9\u6BCF\u4E2A (layer, type) pair \u90FD\u5927\u4E8E\u6216\u7B49\u4E8E\u73B0\u6709 canonical counter \u6700\u5927\u503C\u3002",
1811
1924
  "doctor.check.index_drift.message.singular": "{count} \u4E2A (layer, type) counter slot \u5DF2\u4F4E\u4E8E\u89C2\u6D4B\u5230\u7684 canonical maximum\uFF08next allocate would collide\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1812
1925
  "doctor.check.index_drift.message.plural": "{count} \u4E2A (layer, type) counter slots \u5DF2\u4F4E\u4E8E\u89C2\u6D4B\u5230\u7684 canonical maximum\uFF08next allocate would collide\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1813
- "doctor.check.index_drift.remediation": "\u8FD0\u884C `fabric doctor --fix-knowledge`\u5C06 agents.meta.json counters \u63D0\u5347\u5230 max_observed + 1\u3002",
1926
+ "doctor.check.index_drift.remediation": "\u8FD0\u884C `fabric doctor --fix` \u5C06 agents.meta.json counters \u63D0\u5347\u5230 max_observed + 1\u3002",
1814
1927
  "doctor.check.underseeded.name": "\u77E5\u8BC6\u79CD\u5B50\u4E0D\u8DB3",
1815
1928
  "doctor.check.underseeded.ok": "\u77E5\u8BC6\u5E93\u5DF2\u6709 {count} \u4E2A canonical entries\uFF08>= {threshold}\uFF09\u3002",
1816
1929
  "doctor.check.underseeded.message.singular": "\u77E5\u8BC6\u5E93\u4EC5\u6709 {count} \u4E2A canonical entry\uFF08< {threshold} threshold\uFF09\u3002plan_context \u68C0\u7D22\u9762\u4F4E\u4E8E\u53EF\u7528\u4E0B\u9650\u3002",
@@ -1820,7 +1933,7 @@ var zhCNMessages = {
1820
1933
  "doctor.check.session_hints_stale.ok": ".fabric/.cache/ \u4E0B\u6CA1\u6709\u8D85\u8FC7 {days} \u5929\u7684 session-hints cache files\u3002",
1821
1934
  "doctor.check.session_hints_stale.message.singular": ".fabric/.cache/ \u4E0B\u6709 {count} \u4E2A session-hints cache file \u8D85\u8FC7 {days} \u5929\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1822
1935
  "doctor.check.session_hints_stale.message.plural": ".fabric/.cache/ \u4E0B\u6709 {count} \u4E2A session-hints cache files \u8D85\u8FC7 {days} \u5929\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1823
- "doctor.check.session_hints_stale.remediation": "\u8FD0\u884C `fabric doctor --fix-knowledge` \u5220\u9664\u8FC7\u671F\u7684 session-hints cache files\u3002",
1936
+ "doctor.check.session_hints_stale.remediation": "\u8FD0\u884C `fabric doctor --fix` \u5220\u9664\u8FC7\u671F\u7684 session-hints cache files\u3002",
1824
1937
  "doctor.check.hook_cache_writable.name": "Hook \u7F13\u5B58\u53EF\u5199",
1825
1938
  "doctor.check.hook_cache_writable.ok": "Hook sidecar cache \u8DEF\u5F84 {path} \u53EF\u5199\u5165\u63A2\u9488\u6587\u4EF6\u3002",
1826
1939
  "doctor.check.hook_cache_writable.message": "Hook sidecar cache \u8DEF\u5F84 {path} \u4E0D\u53EF\u5199\uFF1Bhook state updates \u4F1A\u9759\u9ED8\u5931\u8D25\u3002\u9519\u8BEF\uFF1A{error}\u3002",
@@ -1902,6 +2015,7 @@ var zhCNMessages = {
1902
2015
  "doctor.check.relevance_paths_drift.message.singular": "{count} \u4E2A narrow-scope canonical entry \u7684 relevance_paths globs \u6CA1\u6709\u5339\u914D\u5230\u6700\u8FD1 {windowDays}d git history \u4E2D\u89E6\u78B0\u8FC7\u7684\u6587\u4EF6\u3002\u9996\u4E2A:{detail}\u3002",
1903
2016
  "doctor.check.relevance_paths_drift.message.plural": "{count} \u4E2A narrow-scope canonical entries \u7684 relevance_paths globs \u6CA1\u6709\u5339\u914D\u5230\u6700\u8FD1 {windowDays}d git history \u4E2D\u89E6\u78B0\u8FC7\u7684\u6587\u4EF6\u3002\u9996\u4E2A:{detail}\u3002",
1904
2017
  "doctor.check.relevance_paths_drift.remediation": "\u5BA1\u9605\u8BE5 entry \u662F\u5426\u4ECD\u7136\u76F8\u5173 \u2014 \u4F7F\u7528 `fab_review.modify` \u5237\u65B0 anchors,\u6216\u4F7F\u7528 `fab_review.reject` \u5F52\u6863\u3002",
2018
+ "doctor.check.relevance_paths_drift.remediation_with_sample": "\u5BA1\u9605\u8BE5 entry \u662F\u5426\u4ECD\u7136\u76F8\u5173 \u2014 \u6837\u672C {sample};\u4F7F\u7528 `fab_review.modify` \u5237\u65B0 anchors,\u6216\u4F7F\u7528 `fab_review.reject` \u5F52\u6863\u3002",
1905
2019
  // W4-3 (KT-MOD-0001): narrow scope 但 relevance_paths 为空。
1906
2020
  "doctor.check.narrow_no_paths.name": "\u77E5\u8BC6 narrow scope \u7F3A\u8DEF\u5F84",
1907
2021
  "doctor.check.narrow_no_paths.ok": "\u6BCF\u6761 narrow scope canonical entry \u90FD\u81F3\u5C11\u5E26\u4E00\u4E2A relevance_path\u3002",
@@ -1942,6 +2056,25 @@ var zhCNMessages = {
1942
2056
  "doctor.check.unbound_project.ok": "\u5DF2\u7ED1\u5199\u5165 store \u5E26\u6709 project \u5750\u6807(project_id + active_project),project-scope \u7684 recall/\u5199\u5165\u8DEF\u7531\u6B63\u5E38\u3002",
1943
2057
  "doctor.check.unbound_project.message": "store '{alias}' \u5DF2\u7ED1\u4E3A\u5199\u5165\u76EE\u6807\u4F46 project \u5750\u6807\u4E0D\u5B8C\u6574(\u7F3A {missing});project-scope \u7684 recall/\u5199\u5165\u4F1A fallback \u5230 team scope\u3002",
1944
2058
  "doctor.check.unbound_project.remediation": "\u8C03 `fabric doctor --fix` \u56DE\u586B project \u7ED1\u5B9A(\u94F8 project_id\u3001\u628A project \u6CE8\u518C\u8FDB store\u3001\u8BBE active_project)\u3002\u5E42\u7B49 \u2014\u2014 \u4E8C\u6B21\u8DD1\u4E3A no-op\u3002",
2059
+ // write_route_target_unbound — 单 team 槽迁移后 write_routes 悬空的静态检查。
2060
+ "doctor.check.write_route_target_unbound.name": "\u5199\u5165\u8DEF\u7531\u76EE\u6807",
2061
+ "doctor.check.write_route_target_unbound.ok": "\u6240\u6709 write_routes \u7684\u76EE\u6807 store \u90FD\u5728 required_stores \u5185,scope\u2192store \u8DEF\u7531\u9759\u6001\u4E00\u81F4\u3002",
2062
+ "doctor.check.write_route_target_unbound.message": '{count} \u6761 write_route \u6307\u5411\u672A\u7ED1\u5B9A\u7684 store({routes});fab_propose \u5728\u8FD9\u4E9B scope \u4E0A\u4F1A\u62A5 "no write-target store resolved"\u3002',
2063
+ "doctor.check.write_route_target_unbound.remediation": "\u4E8C\u9009\u4E00:\u2460 `fabric store bind <store>` \u628A\u76EE\u6807 store \u52A0\u8FDB required_stores(\u5355 team \u69FD = \u9700\u66FF\u6362\u6389\u5F53\u524D\u7684),\u6216 \u2461 \u7F16\u8F91 `.fabric/fabric-config.json` \u5220\u6389\u8FD9\u6761 write_route\u3002",
2064
+ // stray_fabric_dir_detected — rc.11 root-cause fix: server-side resolveProjectRoot 之前用 cwd,
2065
+ // 从子目录起的子进程会把 .fabric/ 建在错误的路径。此 lint 扫描项目树,找出 <root>/.fabric 之外的所有 .fabric/。
2066
+ "doctor.check.stray_fabric_dir_detected.name": "\u6E38\u79BB .fabric \u76EE\u5F55",
2067
+ "doctor.check.stray_fabric_dir_detected.ok": "\u9879\u76EE\u4E0B\u672A\u53D1\u73B0\u6E38\u79BB .fabric \u76EE\u5F55,\u552F\u4E00\u6743\u5A01\u6839 .fabric \u5C31\u662F <projectRoot>/.fabric\u3002",
2068
+ "doctor.check.stray_fabric_dir_detected.message": "\u53D1\u73B0 {count} \u4E2A\u6E38\u79BB .fabric \u76EE\u5F55({dirs}),\u5B83\u4EEC\u662F\u5B50\u8FDB\u7A0B\u5728\u5B50\u76EE\u5F55\u88AB\u8BEF\u8BA4\u4F5C project root \u7684\u5386\u53F2\u9057\u7559(rc.10 \u4E4B\u524D\u7684 hook / rc.11 \u4E4B\u524D\u7684 server \u4FA7),\u4F1A\u5BFC\u81F4 events.jsonl / metrics.jsonl / .cache \u6563\u843D\u3002",
2069
+ "doctor.check.stray_fabric_dir_detected.remediation": "\u8DD1 `fabric doctor --fix` \u4F1A\u628A\u6BCF\u4E2A\u6E38\u79BB dir \u6539\u540D\u4E3A `.fabric.stale-<timestamp>`(rescue-before-delete,\u4E0D\u786C\u5220)\u3002\u6539\u540D\u540E\u53EF\u4EBA\u5DE5\u6838\u5BF9\u662F\u5426\u9700\u8981\u5408\u5E76 events \u518D\u5220\u3002\u540C\u65F6\u5347\u7EA7\u672C\u673A fabric-cli \u81F3 rc.11+ \u8BA9 server \u4FA7 git-anchor \u751F\u6548\u3002",
2070
+ // legacy_fabric_cache_dir_detected — 老版 recall engine 把 BM25/vector 缓存
2071
+ // 放 `.fabric/cache/{bm25,vectors}`;unify-fabric-cache-dir 后统一到
2072
+ // `.fabric/.cache/` 与 hook sidecar 同处,一条 .gitignore 覆盖两者。老数据
2073
+ // 完好,--fix 仅 rename 迁移。
2074
+ "doctor.check.legacy_fabric_cache_dir_detected.name": "\u8001\u7248 .fabric/cache/ \u76EE\u5F55",
2075
+ "doctor.check.legacy_fabric_cache_dir_detected.ok": "Recall \u7F13\u5B58\u5DF2\u5728 .fabric/.cache/ \u4E0B,\u65E0\u6B8B\u7559 .fabric/cache/{bm25,vectors}\u3002",
2076
+ "doctor.check.legacy_fabric_cache_dir_detected.message": "\u53D1\u73B0 {count} \u4E2A\u8001\u7248 recall \u7F13\u5B58\u76EE\u5F55({dirs})\u3002\u8FD9\u4E9B\u662F unify-fabric-cache-dir \u4E4B\u524D\u7684\u4F4D\u7F6E;\u78C1\u76D8\u4E0A\u7684 BM25 \u5FEB\u7167 / \u5411\u91CF embedding \u6570\u636E\u5B8C\u597D,rename \u5373\u53EF\u4FDD\u7559\u3002",
2077
+ "doctor.check.legacy_fabric_cache_dir_detected.remediation": "\u8DD1 `fabric doctor --fix` \u628A\u6BCF\u4E2A\u8001\u76EE\u5F55 rename \u5230 `.fabric/.cache/` \u5BF9\u5E94\u4F4D\u7F6E(\u5E42\u7B49;\u82E5\u65B0\u8DEF\u5F84\u5DF2\u6709\u66F4\u65B0\u6570\u636E\u5219\u8DF3\u8FC7)\u3002\u4E0D\u6D89\u53CA\u91CD\u65B0 embed,\u5FEB\u7167\u6587\u4EF6\u539F\u6837\u8FC1\u79FB\u3002",
1945
2078
  "doctor.check.skill_md_yaml_invalid.name": "Skill markdown YAML",
1946
2079
  "doctor.check.skill_md_yaml_invalid.ok": "\u6240\u6709 .claude/.codex SKILL.md frontmatter values \u90FD\u80FD\u6309 strict YAML \u89E3\u6790\u3002",
1947
2080
  "doctor.check.skill_md_yaml_invalid.message.singular": "{count} \u4E2A SKILL.md frontmatter value \u5305\u542B\u672A\u52A0\u5F15\u53F7\u7684 ': '\uFF0Cstrict YAML parsers \u4F1A\u62D2\u7EDD\uFF08Claude Code tolerates it\uFF1BCodex CLI drops the skill at load\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
@@ -2076,6 +2209,7 @@ var zhCNMessages = {
2076
2209
  // flat-design (G6): 装完最该做的事是重启客户端让 MCP 生效 —— 这才是默认锚点动作;
2077
2210
  // --reapply 维护提示退到 --verbose。
2078
2211
  "cli.install.next-step.restart": "\u91CD\u542F\u5DF2\u5F00\u7684 Claude Code / Codex \u4F1A\u8BDD\u4EE5\u52A0\u8F7D Fabric(\u65B0\u4F1A\u8BDD\u81EA\u52A8\u751F\u6548)\u3002",
2212
+ "cli.install.next-step.nudge-mode": '\u4EBA\u53EF\u89C1\u63D0\u793A\u9ED8\u8BA4 minimal\uFF08\u6BCF\u4F1A\u8BDD\u4E00\u6761\u72B6\u6001\uFF09\u3002\u53EF\u5728 .fabric/fabric-config.json \u8BBE nudge_mode: "silent" \u9759\u97F3\uFF0C\u6216 FABRIC_NUDGE_MODE=silent\uFF1B\u8981\u66F4\u5435\u7528 normal/verbose\u3002',
2079
2213
  "cli.install.reason-message": "{label} {message}",
2080
2214
  "cli.install.language.prompt": "\u9009\u62E9 Fabric \u8BED\u8A00\uFF08\u754C\u9762\u4E0E\u77E5\u8BC6\u7EDF\u4E00\u4F7F\u7528\uFF0C\u4E4B\u540E\u53EF\u7528 fabric config \u4FEE\u6539\uFF09\uFF1A",
2081
2215
  "cli.install.language.option.zh-CN": "\u7B80\u4F53\u4E2D\u6587 (zh-CN)",
@@ -2131,7 +2265,7 @@ var zhCNMessages = {
2131
2265
  "cli.install.semantic.installing": "\u6B63\u5728\u8FD0\u884C `npm i -g fastembed` \u2026",
2132
2266
  "cli.install.semantic.installed": "fastembed \u5B89\u88C5\u5B8C\u6210\u3002\u5D4C\u5165\u6A21\u578B\u4F1A\u5728\u9996\u6B21\u53EC\u56DE (recall) \u65F6\u81EA\u52A8\u4E0B\u8F7D\uFF08\u7EA6\u6570\u5341\u2013\u6570\u767E MB\uFF1B\u4E0D\u4E0A\u4F20\u4EFB\u4F55 KB \u6570\u636E\uFF09\u3002",
2133
2267
  "cli.install.semantic.install-failed": "\u81EA\u52A8\u5B89\u88C5\u5931\u8D25\uFF08{reason}\uFF09\u3002\u8BF7\u624B\u52A8\u6267\u884C\u4E0B\u9762\u7684\u6B65\u9AA4\uFF1A",
2134
- "cli.install.semantic.manual-steps": " 1. \u5B89\u88C5\u53EF\u9009 embedder (\u5411\u91CF\u7F16\u7801\u5668\uFF0C\u88C5\u5230 MCP server \u89E3\u6790\u6A21\u5757\u7684\u4F4D\u7F6E \u2014 \u5168\u5C40\u5B89\u88C5\u5373\u5168\u5C40):\n npm i -g fastembed\n 2. \u9884\u70ED\u6A21\u578B\u7F13\u5B58 (\u9996\u8DD1\u4F1A\u8054\u7F51\u4E0B\u8F7D\u6A21\u578B\u6743\u91CD ~\u6570\u5341-\u6570\u767E MB, \u4E0D\u4E0A\u4F20\u4EFB\u4F55 KB \u6570\u636E):\n export FABRIC_EMBED_CACHE_DIR=~/.cache/fabric-embed # \u4E25\u683C\u79BB\u7EBF\u8005\u9884\u5148\u653E\u597D\u6743\u91CD\n \u6CE8: \u5207\u6362 embed_model \u540E\u5DF2\u6709\u5411\u91CF\u7EF4\u5EA6/\u8BED\u4E49\u53D8\u5316, \u4E0B\u6B21 recall \u4F1A\u6309\u65B0\u6A21\u578B\u91CD\u65B0\u5D4C\u5165 (doc \u5411\u91CF\u6309\u6587\u672C\u7F13\u5B58, \u81EA\u52A8\u5931\u914D\u91CD\u7B97)\u3002\n \u5173\u95ED: \u7F16\u8F91 fabric.config.json \u8BBE embed_enabled=false\u3002",
2268
+ "cli.install.semantic.manual-steps": " 1. \u5B89\u88C5\u53EF\u9009 embedder (\u5411\u91CF\u7F16\u7801\u5668\uFF0C\u88C5\u5230 MCP server \u89E3\u6790\u6A21\u5757\u7684\u4F4D\u7F6E \u2014 \u5168\u5C40\u5B89\u88C5\u5373\u5168\u5C40):\n npm i -g fastembed\n 2. \u9884\u70ED\u6A21\u578B\u7F13\u5B58 (\u9996\u8DD1\u4F1A\u8054\u7F51\u4E0B\u8F7D\u6A21\u578B\u6743\u91CD ~\u6570\u5341-\u6570\u767E MB, \u4E0D\u4E0A\u4F20\u4EFB\u4F55 KB \u6570\u636E):\n export FABRIC_EMBED_CACHE_DIR=~/.cache/fabric-embed # \u4E25\u683C\u79BB\u7EBF\u8005\u9884\u5148\u653E\u597D\u6743\u91CD\n \u6CE8: \u5207\u6362 embed_model \u540E\u5DF2\u6709\u5411\u91CF\u7EF4\u5EA6/\u8BED\u4E49\u53D8\u5316, \u4E0B\u6B21 recall \u4F1A\u6309\u65B0\u6A21\u578B\u91CD\u65B0\u5D4C\u5165 (doc \u5411\u91CF\u6309\u6587\u672C\u7F13\u5B58, \u81EA\u52A8\u5931\u914D\u91CD\u7B97)\u3002\n \u5173\u95ED: \u7F16\u8F91 .fabric/fabric-config.json \u8BBE embed_enabled=false\u3002",
2135
2269
  // C5: store onboarding 交互文案统一走 t()。
2136
2270
  "cli.install.store.local-store": "\u672C\u5730 store",
2137
2271
  "cli.install.store.bind-mounted.prompt": "\u628A\u4E00\u4E2A\u5DF2\u6302\u8F7D\u7684\u77E5\u8BC6 store \u7ED1\u5B9A\u5230\u672C\u9879\u76EE\uFF1F",
@@ -2297,6 +2431,23 @@ var zhCNMessages = {
2297
2431
  // per [[fabric-serve-quarantine-not-delete]]. Restore from git history when
2298
2432
  // the web UI surface is re-enabled.
2299
2433
  // v2.0.0-rc.29 TASK-008 (BUG-L2): onboard-coverage 国际化键。
2434
+ "cli.first-hit.description": "\u9A8C\u6536 install\u2192first-hit \u5C31\u7EEA\uFF08bind + \u975E\u7A7A\u77E5\u8BC6\u9762\uFF09",
2435
+ "cli.first-hit.args.json.description": "\u673A\u5668\u53EF\u8BFB JSON \u62A5\u544A",
2436
+ "cli.first-hit.args.target.description": "\u9879\u76EE\u6839\uFF08\u9ED8\u8BA4 cwd\uFF09",
2437
+ "cli.first-hit.args.seed.description": "\u82E5 store \u4E3A\u7A7A\u5219\u5199\u5165\u6700\u5C0F starter \u77E5\u8BC6\u6761\u76EE",
2438
+ "cli.first-hit.args.paths.description": "\u9017\u53F7\u5206\u9694\u7684\u63A2\u6D4B\u8DEF\u5F84",
2439
+ "cli.first-hit.msg.ok": "first-hit \u5C31\u7EEA\uFF1A{stores} \u4E2A store \u5171 {total} \u6761\u77E5\u8BC6\uFF1Bhooks \u5DF2\u5B89\u88C5\u3002",
2440
+ "cli.first-hit.msg.unbound": "unbound\uFF1A\u672C\u9879\u76EE read-set \u672A\u7ED1\u5B9A\u4EFB\u4F55 store\uFF0C\u77E5\u8BC6\u65E0\u6CD5\u6D6E\u73B0\u3002",
2441
+ "cli.first-hit.msg.no_write_target": "no_write_target\uFF1A\u5DF2\u6709 required stores \u4F46\u672A\u8BBE\u7F6E active_write_store\u3002",
2442
+ "cli.first-hit.msg.empty_store": "empty_store\uFF1Astore \u5DF2\u7ED1\u5B9A\u4F46\u89C4\u8303\u77E5\u8BC6\u6587\u4EF6\u4E3A 0 \u2014 \u7A7A store \u4E0D\u662F\u6210\u529F\u8DEF\u5F84\u3002",
2443
+ "cli.first-hit.msg.missing_required": "missing_required\uFF1Arequired_stores \u4E2D\u6709\u672A\u6302\u8F7D\u7684 store\u3002",
2444
+ "cli.first-hit.msg.write_target_mismatch": "write_target_mismatch\uFF1Aactive_write_store \u4E0D\u5728\u5DF2\u6302\u8F7D\u53EF\u5199 read-set \u4E0A\u3002",
2445
+ "cli.first-hit.msg.store_unreachable": "store_unreachable\uFF1A\u5DF2\u7ED1\u5B9A store \u5728\u6CE8\u518C\u8868\u4E2D\u4F46\u78C1\u76D8\u76EE\u5F55\u7F3A\u5931\u3002",
2446
+ "cli.first-hit.msg.project_unsealed": "project_unsealed\uFF1A\u5DF2\u7ED1\u5B9A\u5199\u5E93\u4F46\u7F3A\u5C11 project_id/active_project \u2014 \u56E2\u961F\u77E5\u8BC6\u4F1A\u843D\u6210 flat\uFF08semantic_scope: team\uFF09\u800C\u975E\u9879\u76EE\u5206\u533A\u3002",
2447
+ "cli.first-hit.msg.no_match": "no_match\uFF1A\u77E5\u8BC6\u5B58\u5728\u4F46\u63A2\u6D4B\u9762\u4E3A\u7A7A\uFF08\u8DEF\u5F84/scope \u8FC7\u6EE4\uFF09\u3002",
2448
+ "cli.first-hit.msg.hooks_missing": "hooks_missing\uFF1A\u77E5\u8BC6\u5DF2\u5728\u4F46 SessionStart/PreToolUse hooks \u672A\u5B89\u88C5\u3002",
2449
+ "cli.first-hit.msg.no_project": "no_project\uFF1A\u5F53\u524D\u76EE\u5F55\u4E0D\u662F Fabric \u9879\u76EE\uFF08\u7F3A\u5C11 .fabric/fabric-config.json\uFF09\u3002",
2450
+ "cli.first-hit.msg.no_global": "no_global\uFF1A\u7F3A\u5C11\u5168\u5C40 fabric \u914D\u7F6E \u2014 \u8BF7\u5148\u8FD0\u884C fabric install --global\u3002",
2300
2451
  "cli.onboard-coverage.description": "\u6C47\u603B\u5F53\u524D\u5DE5\u4F5C\u533A\u7684 S5 onboard-slot \u8986\u76D6\u5EA6\u3002fabric-archive Skill \u9996\u8DD1\u9636\u6BB5\u7528\u5B83\u5224\u65AD\u54EA\u4E9B\u9879\u76EE\u8BED\u8C03\u69FD\u4F4D\u5C1A\u672A\u88AB\u8BA4\u9886\u3002",
2301
2452
  "cli.onboard-coverage.args.json.description": "\u8F93\u51FA\u673A\u5668\u53EF\u8BFB\u7684 JSON \u5230 stdout\uFF08\u66FF\u4EE3\u4EBA\u7C7B\u53EF\u8BFB\u7684\u8868\u683C\uFF09\u3002",
2302
2453
  "cli.onboard-coverage.args.target.description": "\u8986\u76D6\u9879\u76EE\u6839\u76EE\u5F55\uFF08\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\uFF09\u3002",
@@ -2546,6 +2697,10 @@ var zhCNMessages = {
2546
2697
  "cli.info.recall.vector.not-ready": "\u672A\u5C31\u7EEA \u2014\u2014 \u53EC\u56DE\u56DE\u9000\u5230\u5173\u952E\u8BCD\u6A21\u5F0F(BM25 / additive)",
2547
2698
  "cli.info.recall.warm.ok": "embedder \u5DF2\u9884\u70ED:\u6A21\u578B '{model}' \u5DF2\u52A0\u8F7D(\u5411\u91CF\u7EF4\u5EA6 {dim}),\u7F13\u5B58\u4E8E {dir}",
2548
2699
  "cli.info.recall.warm.fail": "embedder \u4E0D\u53EF\u7528 \u2014\u2014 \u53EF\u9009\u7684 'fastembed' \u5305\u65E0\u6CD5\u89E3\u6790,\u6216\u6A21\u578B\u52A0\u8F7D\u5931\u8D25\u3002\n \u53EC\u56DE\u56DE\u9000\u5230\u5173\u952E\u8BCD\u6A21\u5F0F(BM25 / additive)\u3002\u8BF7\u5728 server \u80FD\u89E3\u6790\u6A21\u5757\u7684\u4F4D\u7F6E\u5B89\u88C5 fastembed \u540E\u91CD\u8BD5\u3002",
2700
+ "cli.store.mount.description": "\u5C06\u77E5\u8BC6 store \u6302\u8F7D\u5230\u5168\u5C40\u6CE8\u518C\u8868",
2701
+ "cli.store.create.description": "\u521B\u5EFA\u5E76\u6302\u8F7D\u672C\u5730\u77E5\u8BC6 store",
2702
+ "cli.store.remove.description": "\u4ECE\u6CE8\u518C\u8868\u5378\u4E0B store\uFF08\u4E0D\u5220\u9664\u78C1\u76D8\uFF09",
2703
+ "cli.store.explain.description": "\u89E3\u91CA store \u522B\u540D\u5982\u4F55\u89E3\u6790",
2549
2704
  "cli.store.list.description": "\u5217\u51FA\u6302\u8F7D\u7684 store",
2550
2705
  // 追加在 `fabric store --help` 末尾的说明 —— 交代进阶(meta.hidden)操作去哪了,
2551
2706
  // 否则只剩 list 一行会让用户以为 store 没别的能力。