@fenglimg/fabric-shared 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +13 -0
- package/dist/chunk-7CX32MYL.js +2043 -0
- package/dist/chunk-LTDB2UDN.js +100 -0
- package/dist/chunk-WVPDH4BF.js +952 -0
- package/dist/i18n/index.d.ts +22 -2
- package/dist/i18n/index.js +3 -1
- package/dist/index-UBqD9F0b.d.ts +304 -0
- package/dist/index.d.ts +1440 -458
- package/dist/index.js +1058 -350
- package/dist/node/atomic-write.d.ts +16 -0
- package/dist/node/atomic-write.js +19 -10
- package/dist/node/mcp-payload-guard.d.ts +3 -1
- package/dist/node/mcp-payload-guard.js +6 -2
- package/dist/schemas/api-contracts.d.ts +1561 -814
- package/dist/schemas/api-contracts.js +23 -7
- package/dist/templates/bootstrap-canonical.d.ts +56 -0
- package/dist/templates/bootstrap-canonical.js +18 -0
- package/dist/types/index.d.ts +2 -123
- package/package.json +32 -4
- package/dist/chunk-U2SR2M4L.js +0 -958
- package/dist/chunk-VQDCDCJA.js +0 -555
|
@@ -0,0 +1,2043 @@
|
|
|
1
|
+
// src/i18n/locales/en.ts
|
|
2
|
+
var enMessages = {
|
|
3
|
+
"cli.main.description": "Fabric CLI \u2014 feeds your project's decisions, pitfalls & conventions to your AI assistant automatically, so it stops re-learning them every session.\n\nThree-step mental model:\n Install (\u88C5) - fabric install one-shot project setup\n Configure (\u914D) - fabric config interactive configuration panel\n Run (\u8DD1) - fabric serve launch the local MCP HTTP service\n fabric doctor run target-state diagnostics\n\nExamples:\n fabric install install Fabric in the current project\n fabric config open the interactive configuration panel\n fabric serve --port 7373 start the MCP HTTP service\n fabric doctor --fix repair derived Fabric state\n fabric uninstall --dry-run preview uninstall without removing files",
|
|
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.shared.error": "Error",
|
|
22
|
+
"cli.approve.description": "Approve drifted human-lock entries from the command line.",
|
|
23
|
+
"cli.approve.args.all.description": "Approve all drifted human-lock entries without prompting.",
|
|
24
|
+
"cli.approve.args.interactive.description": "Prompt before approving each drifted human-lock entry.",
|
|
25
|
+
"cli.approve.args.target.description": "Target project path, default is the current working directory.",
|
|
26
|
+
"cli.approve.no-drift": "No drift entries found.",
|
|
27
|
+
"cli.approve.prompt": "Approve this entry? [y/N] ",
|
|
28
|
+
"cli.approve.approved-one": "Approved {location}",
|
|
29
|
+
"cli.approve.skipped-one": "Skipped {location}",
|
|
30
|
+
"cli.approve.summary": "Approved {approved}/{total} drift entries. Skipped {skipped}.",
|
|
31
|
+
"cli.approve.table.expected": "Expected",
|
|
32
|
+
"cli.approve.table.current": "Current",
|
|
33
|
+
"cli.bootstrap.description": "Install Fabric bootstrap prompts for supported AI clients.",
|
|
34
|
+
"cli.bootstrap.install.description": "Copy Fabric bootstrap templates into native client locations.",
|
|
35
|
+
"cli.bootstrap.install.args.clients.description": "Optional comma-separated client filter, for example claude,cursor,codex.",
|
|
36
|
+
"cli.bootstrap.install.no-targets": "No bootstrap targets detected. Pass --clients claude,cursor,codex to install explicitly.",
|
|
37
|
+
"cli.bootstrap.install.installed": "Installed {path}",
|
|
38
|
+
"cli.bootstrap.install.skipped-header": "Skipped {path}: Fabric Bootstrap header already present.",
|
|
39
|
+
"cli.bootstrap.install.prepended": "Prepended {path}",
|
|
40
|
+
"cli.bootstrap.errors.unknown-client": 'Unknown client "{client}". Use a comma-separated list such as claude,cursor,codex.',
|
|
41
|
+
"cli.config.description": "Open the interactive Fabric configuration panel (language, knowledge layer, audit mode, hint windows, MCP client wiring, etc.).\n\nExamples:\n fabric config open the interactive panel\n fabric config --target /path edit configuration for a specific project",
|
|
42
|
+
"cli.config.args.target.description": "Target project directory (defaults to cwd).",
|
|
43
|
+
"cli.config.clients.claude": "Claude Code CLI",
|
|
44
|
+
"cli.config.install.description": "Install Fabric MCP server entries into detected client configs.",
|
|
45
|
+
"cli.config.install.args.clients.description": "Optional comma-separated client filter, for example cursor,codex.",
|
|
46
|
+
"cli.config.install.args.dry-run.description": "Preview detected write operations without modifying files.",
|
|
47
|
+
"cli.config.errors.unknown-client": 'Unknown client "{client}". Use a comma-separated list such as cursor,codex.',
|
|
48
|
+
"cli.config.errors.expected-object": "Expected object in {path}",
|
|
49
|
+
"cli.config.install.no-configs": "No Fabric MCP client config detected. Create the client directory or set clientPaths in fabric.config.json.",
|
|
50
|
+
"cli.config.install.no-config-path": "Skipping {client}: no config path detected.",
|
|
51
|
+
"cli.config.install.dry-run": "[dry-run] {client}: would write {path}",
|
|
52
|
+
"cli.config.install.wrote": "{client}: wrote {path}",
|
|
53
|
+
// rc.16 TASK-006 (F1-panel): clack-driven `fabric config` interactive panel.
|
|
54
|
+
// Keys consumed by packages/cli/src/commands/config.ts (menu loop +
|
|
55
|
+
// per-field prompts) and by getPanelFields() (label_i18n_key references).
|
|
56
|
+
"cli.config.intro": "Fabric Configuration",
|
|
57
|
+
"cli.config.outro": "Configuration saved.",
|
|
58
|
+
"cli.config.outro-no-changes": "No changes made.",
|
|
59
|
+
"cli.config.cancel": "Cancelled.",
|
|
60
|
+
"cli.config.non-tty-notice": "fabric config requires an interactive terminal. Run it from a TTY to edit configuration fields.",
|
|
61
|
+
"cli.config.menu.field-select": "Select a field to edit:",
|
|
62
|
+
"cli.config.menu.exit": "Exit",
|
|
63
|
+
"cli.config.value.current": "current: {value}",
|
|
64
|
+
"cli.config.value.default-marker": "(default)",
|
|
65
|
+
"cli.config.prompt.select": "Choose a new value for {key} (current: {current}):",
|
|
66
|
+
"cli.config.prompt.text": "Enter a new value for {key} (current: {current}):",
|
|
67
|
+
"cli.config.write.success": "Saved {key} = {value}",
|
|
68
|
+
"cli.config.write.failure": "Failed to write fabric-config.json: {message}",
|
|
69
|
+
"cli.config.errors.uninit-workspace.message": "Workspace not initialized. Run `fabric install` first.",
|
|
70
|
+
"cli.config.errors.invalid-int": "Must be a positive integer.",
|
|
71
|
+
"cli.config.errors.unknown-field": "Unknown field selection \u2014 skipping.",
|
|
72
|
+
"cli.config.errors.no-enum-options": "No enum options available for this field \u2014 skipping.",
|
|
73
|
+
// Per-field labels (11 total: 2 Group A + 8 Group B + 1 Group C).
|
|
74
|
+
"cli.config.fields.fabric_language.label": "Language",
|
|
75
|
+
"cli.config.fields.fabric_language.description": "Language used by Fabric hooks and Skills output.",
|
|
76
|
+
"cli.config.fields.default_layer_filter.label": "Default knowledge layer",
|
|
77
|
+
"cli.config.fields.default_layer_filter.description": "Default layer scope for knowledge listings (team / personal / both).",
|
|
78
|
+
"cli.config.fields.archive_hint_hours.label": "Archive hint window (hours)",
|
|
79
|
+
"cli.config.fields.archive_hint_hours.description": "Window (in hours) used by Signal A to detect frequent edits worth archiving.",
|
|
80
|
+
"cli.config.fields.archive_hint_cooldown_hours.label": "Archive hint cooldown (hours)",
|
|
81
|
+
"cli.config.fields.archive_hint_cooldown_hours.description": "Cooldown (in hours) before the same archive hint can fire again.",
|
|
82
|
+
"cli.config.fields.archive_edit_threshold.label": "Archive edit threshold",
|
|
83
|
+
"cli.config.fields.archive_edit_threshold.description": "Edit-count cutoff that triggers the Signal A archive hint.",
|
|
84
|
+
"cli.config.fields.underseed_node_threshold.label": "Underseed node threshold",
|
|
85
|
+
"cli.config.fields.underseed_node_threshold.description": "Minimum knowledge-node count below which Fabric flags the workspace as underseeded.",
|
|
86
|
+
"cli.config.fields.review_hint_pending_count.label": "Review pending count",
|
|
87
|
+
"cli.config.fields.review_hint_pending_count.description": "Pending-review count above which the review hint fires.",
|
|
88
|
+
"cli.config.fields.review_hint_pending_age_days.label": "Review pending age (days)",
|
|
89
|
+
"cli.config.fields.review_hint_pending_age_days.description": "Pending-review age (in days) above which the review hint fires.",
|
|
90
|
+
"cli.config.fields.maintenance_hint_days.label": "Maintenance hint window (days)",
|
|
91
|
+
"cli.config.fields.maintenance_hint_days.description": "Day window for Fabric to surface a knowledge-maintenance hint.",
|
|
92
|
+
"cli.config.fields.maintenance_hint_cooldown_days.label": "Maintenance hint cooldown (days)",
|
|
93
|
+
"cli.config.fields.maintenance_hint_cooldown_days.description": "Cooldown (in days) before the maintenance hint can fire again.",
|
|
94
|
+
"cli.config.fields.audit_mode.label": "Audit mode",
|
|
95
|
+
"cli.config.fields.audit_mode.description": "Audit verbosity for human-lock + drift detection (strict / warn / off).",
|
|
96
|
+
"cli.doctor.description": "Run Fabric target-state diagnostics (meta sync, knowledge index, bootstrap, events ledger, human-lock drift).\n\nExamples:\n fabric doctor read-only diagnostics report\n fabric doctor --fix repair derived state (meta + indexes)\n fabric doctor --fix-knowledge apply lint mutations (demote / archive)\n fabric doctor --json --strict machine-readable output, warnings as errors",
|
|
97
|
+
"doctor.section.fixable": "Fixable errors:",
|
|
98
|
+
"doctor.section.manual": "Manual errors:",
|
|
99
|
+
"doctor.section.warnings": "Warnings:",
|
|
100
|
+
"doctor.section.fix-knowledge-mutations": "Fix-knowledge mutations:",
|
|
101
|
+
// v2.0.0-rc.29 REVIEW (codex LOW-2): F2's payload-limit defaults reach the JSON
|
|
102
|
+
// envelope but never surfaced in the human renderer, so operators tuning
|
|
103
|
+
// `mcpPayloadLimits` had no fast `fabric doctor` confirmation that their config
|
|
104
|
+
// override took effect. Two strings: a section header + a one-liner row.
|
|
105
|
+
"doctor.section.payload-limits": "MCP payload limits:",
|
|
106
|
+
"doctor.payload-limits.line": "warn={warnKb} KB, hard={hardKb} KB (source: {source})",
|
|
107
|
+
// rc.20 TASK-07: cite-coverage human-readable formatter keys.
|
|
108
|
+
"doctor.section.cite-coverage": "Cite coverage:",
|
|
109
|
+
"doctor.cite.header": "Since {since} via marker {marker}",
|
|
110
|
+
"doctor.cite.warning.justActivated": "Cite policy activated on this run; no historical data yet.",
|
|
111
|
+
"doctor.cite.metric.editsTouched": "Edits touched",
|
|
112
|
+
"doctor.cite.metric.qualifyingCites": "Qualifying cites",
|
|
113
|
+
"doctor.cite.metric.recalledUnverified": "Recalled but not verified",
|
|
114
|
+
"doctor.cite.metric.expectedButMissed": "Expected cite missing",
|
|
115
|
+
"doctor.cite.metric.totalTurns": "Total turns",
|
|
116
|
+
"doctor.cite.metric.complianceRate": "cite compliance rate (incl. KB:none[reason])",
|
|
117
|
+
"doctor.cite.metric.complianceNA": "N/A (no cite-expected turns)",
|
|
118
|
+
"doctor.cite.metric.uncorrelatableEdits": "Uncorrelatable edits (no session_id \u2014 stale hook? run `fabric install`)",
|
|
119
|
+
"doctor.cite.section.perClient": "Per-client",
|
|
120
|
+
"doctor.cite.section.dismissedReasons": "Dismissed reasons",
|
|
121
|
+
"doctor.cite.dismissed.scope-mismatch": "Scope mismatch",
|
|
122
|
+
"doctor.cite.dismissed.outdated": "Outdated",
|
|
123
|
+
"doctor.cite.dismissed.not-applicable": "Not applicable",
|
|
124
|
+
"doctor.cite.dismissed.other": "Other",
|
|
125
|
+
"doctor.cite.dismissed.unspecified": "Unspecified",
|
|
126
|
+
"doctor.cite.section.noneReasons": "KB: none reasons",
|
|
127
|
+
"doctor.cite.none.no-relevant": "No relevant entry",
|
|
128
|
+
"doctor.cite.none.not-applicable": "Not applicable",
|
|
129
|
+
"doctor.cite.none.unspecified": "Unspecified",
|
|
130
|
+
"doctor.cite.status.skipped": "Cite policy not yet activated for this workspace.",
|
|
131
|
+
// v2.0.0-rc.24 TASK-09: cite-coverage contract-policy renderer keys.
|
|
132
|
+
// Companion schema: packages/shared/src/schemas/api-contracts.ts
|
|
133
|
+
// citeCoverageReportSchema. Consumer: TASK-10 CLI doctor --cite-coverage.
|
|
134
|
+
"cite-coverage.contract.header": "Contract check",
|
|
135
|
+
"cite-coverage.contract.decisions_cited": "Decisions cited",
|
|
136
|
+
"cite-coverage.contract.pitfalls_cited": "Pitfalls cited",
|
|
137
|
+
"cite-coverage.contract.with": "With contract",
|
|
138
|
+
"cite-coverage.contract.missing": "Missing contract",
|
|
139
|
+
"cite-coverage.contract.hard_violated": "Hard violations (operator did not match session edits)",
|
|
140
|
+
"cite-coverage.contract.cite_id_unresolved": "Unresolved cite IDs",
|
|
141
|
+
"cite-coverage.contract.skip_count": "Skip bucket",
|
|
142
|
+
"cite-coverage.contract.status.ok": "ok",
|
|
143
|
+
"cite-coverage.contract.status.skipped_bootstrap_drift": "skipped (bootstrap drift \u2014 run `fabric install`)",
|
|
144
|
+
"cite-coverage.contract.status.awaiting_marker": "awaiting first marker emit",
|
|
145
|
+
// Plural knowledge-type labels (rc.29 BUG-C1: verbatim alignment with
|
|
146
|
+
// canonical KnowledgeTypeSchema) plus the sixth "unresolved" bucket.
|
|
147
|
+
"cite-coverage.contract.type.decisions": "decisions",
|
|
148
|
+
"cite-coverage.contract.type.pitfalls": "pitfalls",
|
|
149
|
+
"cite-coverage.contract.type.models": "models",
|
|
150
|
+
"cite-coverage.contract.type.guidelines": "guidelines",
|
|
151
|
+
"cite-coverage.contract.type.processes": "processes",
|
|
152
|
+
"cite-coverage.contract.type.unresolved": "unresolved",
|
|
153
|
+
// Layer labels (per_layer_type headers + layer_filter banner).
|
|
154
|
+
"cite-coverage.layer.team": "team",
|
|
155
|
+
"cite-coverage.layer.personal": "personal",
|
|
156
|
+
"cite-coverage.layer.team_review": "[team \u2014 review]",
|
|
157
|
+
"cite-coverage.layer.personal_fyi": "[personal \u2014 fyi]",
|
|
158
|
+
// skip_reason vocabulary (bootstrap-docs canonical; renderer falls back to
|
|
159
|
+
// the raw key for unknown buckets — operators data-drive extensions).
|
|
160
|
+
"cite-coverage.skip.sequencing": "sequencing constraint",
|
|
161
|
+
"cite-coverage.skip.conditional": "conditional branch",
|
|
162
|
+
"cite-coverage.skip.semantic": "semantic rule",
|
|
163
|
+
"cite-coverage.skip.aesthetic": "style / aesthetic",
|
|
164
|
+
"cite-coverage.skip.architectural": "architectural layer",
|
|
165
|
+
"cite-coverage.skip.other": "other",
|
|
166
|
+
"cli.doctor.args.target.description": "Target project path. Defaults to --target, then EXTERNAL_FIXTURE_PATH, then cwd.",
|
|
167
|
+
"cli.doctor.args.fix.description": "Repair derived Fabric state (meta + indexes).",
|
|
168
|
+
"cli.doctor.args.json.description": "Print the doctor report as JSON.",
|
|
169
|
+
"cli.doctor.args.strict.description": "Treat warnings as failures.",
|
|
170
|
+
"cli.doctor.args.fix-knowledge.description": "Apply knowledge lint mutations: demote orphaned canonical entries, archive stale drafts, and bump drifted index counters. Default doctor run remains report-only.",
|
|
171
|
+
"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.",
|
|
172
|
+
// rc.35 TASK-12 (P0-11): --verbose unfolds maintainer-audience hints.
|
|
173
|
+
"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.",
|
|
174
|
+
"doctor.maintainer-hint-folded": "(maintainer-only remediation \u2014 re-run with `fabric doctor --verbose` to see)",
|
|
175
|
+
"cli.doctor.errors.fix-knowledge-fix-mutually-exclusive": "--fix-knowledge and --fix cannot be combined. --fix-knowledge mutates user knowledge state (demote/archive); --fix repairs derived state (meta/index). Run them separately.",
|
|
176
|
+
// rc.20 TASK-05: --cite-coverage report flags. Read-only; mutually exclusive with --fix/--fix-knowledge.
|
|
177
|
+
"cli.doctor.args.cite-coverage.description": "Generate cite policy adherence report (read-only; skips standard inspections)",
|
|
178
|
+
"cli.doctor.args.since.description": "Time window for cite coverage (e.g. 7d, 24h, 30m)",
|
|
179
|
+
"cli.doctor.args.client.description": "Filter cite coverage by client (cc|codex|cursor|all)",
|
|
180
|
+
// v2.0.0-rc.24 TASK-10: --layer filters cite contract audit by KB layer (team|personal|all).
|
|
181
|
+
"cli.doctor.args.layer.description": "Filter cite contract audit by KB layer (team|personal|all)",
|
|
182
|
+
"cli.doctor.errors.cite-coverage-mutex": "--cite-coverage cannot be combined with --fix or --fix-knowledge",
|
|
183
|
+
"cli.doctor.errors.invalid-since": "Invalid --since value: {input}. Expected duration like 7d, 24h, 30m or epoch ms.",
|
|
184
|
+
"cli.doctor.errors.invalid-client": "Invalid --client value: {input}. Expected cc, codex, cursor, or all.",
|
|
185
|
+
"cli.doctor.errors.invalid-layer": "Invalid --layer value: {input}. Expected team, personal, or all.",
|
|
186
|
+
// rc.23 TASK-007 (a-C2): --enrich-descriptions flag set. Back-fills the
|
|
187
|
+
// four description-grade frontmatter fields on canonical knowledge entries.
|
|
188
|
+
"cli.doctor.args.enrich-descriptions.description": "Back-fill missing intent_clues / tech_stack / impact / must_read_if on canonical knowledge entries (read-only by default; pair with --auto to write stubs).",
|
|
189
|
+
"cli.doctor.args.auto.description": "With --enrich-descriptions: write deterministic stub values for missing fields. Without --auto, the run is read-only.",
|
|
190
|
+
"cli.doctor.args.dry-run.description": "With --enrich-descriptions --auto or --fix: preview the planned changes without writing to disk. The fix-dry-run output mirrors --fix's fixable_errors list but executes no mutations.",
|
|
191
|
+
// v2.0.0-rc.33 W4-B1 (T6 P2): --fix --dry-run banner — printed before the standard report so users see no mutations were applied.
|
|
192
|
+
"cli.doctor.fix-dry-run-banner": "[dry-run] No mutations were applied. The fixable_errors list below shows what `fabric doctor --fix` would address; rerun without --dry-run to actually fix.",
|
|
193
|
+
"cli.doctor.errors.enrich-descriptions-mutex": "--enrich-descriptions cannot be combined with --fix, --fix-knowledge, or --cite-coverage. Run them separately.",
|
|
194
|
+
"doctor.enrich.allComplete": "All canonical knowledge entries already declare intent_clues / tech_stack / impact / must_read_if.",
|
|
195
|
+
// rc.26 TASK-02a: doctor foundation-batch check messages.
|
|
196
|
+
"doctor.check.bootstrap_marker_migration.name": "Bootstrap marker migration",
|
|
197
|
+
"doctor.check.bootstrap_marker_migration.ok": "No legacy fabric:knowledge-base markers detected in bootstrap target files.",
|
|
198
|
+
"doctor.check.bootstrap_marker_migration.message.singular": "{count} file still carry the legacy fabric:knowledge-base bootstrap marker: {list}.",
|
|
199
|
+
"doctor.check.bootstrap_marker_migration.message.plural": "{count} files still carry the legacy fabric:knowledge-base bootstrap marker: {list}.",
|
|
200
|
+
"doctor.check.bootstrap_marker_migration.remediation": "Run `fabric doctor --fix` to migrate to fabric:bootstrap marker",
|
|
201
|
+
"doctor.check.bootstrap_snapshot_drift.name": "Bootstrap snapshot drift",
|
|
202
|
+
"doctor.check.bootstrap_snapshot_drift.message.drift": ".fabric/AGENTS.md content diverges byte-for-byte from BOOTSTRAP_CANONICAL.",
|
|
203
|
+
"doctor.check.bootstrap_snapshot_drift.remediation.drift": "Run `fabric doctor --fix` to restore canonical bootstrap snapshot",
|
|
204
|
+
"doctor.check.bootstrap_snapshot_drift.ok.ok": ".fabric/AGENTS.md byte-equals BOOTSTRAP_CANONICAL.",
|
|
205
|
+
"doctor.check.bootstrap_snapshot_drift.ok.missing_delegated": ".fabric/AGENTS.md absent \u2014 delegated to bootstrap_anchor_missing.",
|
|
206
|
+
"doctor.check.managed_block_drift.name": "Managed block drift",
|
|
207
|
+
"doctor.check.managed_block_drift.message.singular": "{count} three-end managed block diverge from expected body (snapshot + optional project-rules concat): {list}.",
|
|
208
|
+
"doctor.check.managed_block_drift.message.plural": "{count} three-end managed blocks diverge from expected body (snapshot + optional project-rules concat): {list}.",
|
|
209
|
+
"doctor.check.managed_block_drift.remediation": "Run `fabric doctor --fix` to restore three-end managed blocks from canonical",
|
|
210
|
+
"doctor.check.managed_block_drift.ok.ok": "Three-end managed blocks byte-equal expectedBody.",
|
|
211
|
+
"doctor.check.managed_block_drift.ok.no_managed_block": "No three-end managed blocks detected \u2014 propagation pending or legacy-marker state.",
|
|
212
|
+
"doctor.check.bootstrap_anchor.name": "Bootstrap anchor",
|
|
213
|
+
"doctor.check.bootstrap_anchor.message.missing": "Neither AGENTS.md nor CLAUDE.md exists at the repo root. Fabric requires a bootstrap anchor file at the project root.",
|
|
214
|
+
"doctor.check.bootstrap_anchor.remediation.missing": "Run `fabric install` to generate the AGENTS.md / CLAUDE.md bootstrap anchor at the repo root.",
|
|
215
|
+
"doctor.check.bootstrap_anchor.ok": "Bootstrap anchor present at repo root: {present}.",
|
|
216
|
+
"doctor.check.baseline_filename_format.name": "Baseline filename format",
|
|
217
|
+
"doctor.check.baseline_filename_format.ok": "All baseline knowledge files use the canonical `${id}--${slug}.md` filename format.",
|
|
218
|
+
"doctor.check.baseline_filename_format.message.singular": "{count} baseline knowledge file uses the deprecated bare-slug filename format and must be migrated to `${id}--${slug}.md`. First: {detail}.",
|
|
219
|
+
"doctor.check.baseline_filename_format.message.plural": "{count} baseline knowledge files use the deprecated bare-slug filename format and must be migrated to `${id}--${slug}.md`. First: {detail}.",
|
|
220
|
+
// v2.0.0-rc.33 W3-2 (T6 #5): reference the file names from the message so users can copy-paste rm targets rather than grep for them.
|
|
221
|
+
"doctor.check.baseline_filename_format.remediation": "Manually rm the bare-slug baseline file(s) listed in the message (e.g. `rm <file from message>`). The baseline pipeline was removed in rc.23 and is no longer an auto-fix path.",
|
|
222
|
+
"doctor.check.knowledge_dir_missing.name": "Knowledge layout",
|
|
223
|
+
"doctor.check.knowledge_dir_missing.message.singular": "{count} required knowledge subdir is missing: {list}.",
|
|
224
|
+
"doctor.check.knowledge_dir_missing.message.plural": "{count} required knowledge subdirs are missing: {list}.",
|
|
225
|
+
"doctor.check.knowledge_dir_missing.remediation": "Run `fabric doctor --fix` to create the missing .fabric/knowledge/* subdirectories.",
|
|
226
|
+
"doctor.check.knowledge_dir_missing.ok": "All {count} required .fabric/knowledge/* subdirectories exist.",
|
|
227
|
+
"doctor.check.forensic.name": "Scan evidence",
|
|
228
|
+
"doctor.check.forensic.message.missing.singular": "{error} Live scan detects {frameworkKind} with {count} entry point.",
|
|
229
|
+
"doctor.check.forensic.message.missing.plural": "{error} Live scan detects {frameworkKind} with {count} entry points.",
|
|
230
|
+
"doctor.check.forensic.message.missing-default": ".fabric/forensic.json is missing.",
|
|
231
|
+
"doctor.check.forensic.message.invalid-default": ".fabric/forensic.json is invalid.",
|
|
232
|
+
"doctor.check.forensic.remediation": "Run `fabric install` to regenerate .fabric/forensic.json.",
|
|
233
|
+
"doctor.check.forensic.ok": ".fabric/forensic.json is valid for {frameworkKind}.",
|
|
234
|
+
"doctor.check.agents_meta.name": "Agents metadata",
|
|
235
|
+
"doctor.check.agents_meta.message.missing": ".fabric/agents.meta.json is missing.",
|
|
236
|
+
"doctor.check.agents_meta.remediation.missing": "Run `fabric doctor --fix` to rebuild agents.meta.json from .fabric/knowledge/.",
|
|
237
|
+
"doctor.check.agents_meta.message.invalid-default": ".fabric/agents.meta.json is invalid.",
|
|
238
|
+
// rc.35 TASK-09 (P0-14): humanised parse-failure messages.
|
|
239
|
+
"doctor.check.agents_meta.message.invalid-zod": ".fabric/agents.meta.json fails schema validation \u2014 {issues}. The file was likely written by an incompatible fabric CLI version, or hand-edited.",
|
|
240
|
+
"doctor.check.agents_meta.message.invalid-from-old-cli": ".fabric/agents.meta.json fails schema validation because the GLOBAL `fabric` CLI on PATH ({version}) is older than the minimum-supported {minVersion}. The schema gained backward-compatible singular\u2192plural normalisation in rc.31; older CLIs cannot parse the result they themselves write back.",
|
|
241
|
+
"doctor.check.agents_meta.remediation.invalid": "Run `fabric doctor --fix` to let reconcile rebuild agents.meta.json from the .fabric/knowledge/ disk ground-truth (rc.31+ auto-migrates legacy singular knowledge_type values to canonical plural; do NOT manually delete agents.meta.json \u2014 you would lose counters envelope and promote-ledger associations).",
|
|
242
|
+
"doctor.check.agents_meta.message.stale": ".fabric/agents.meta.json revision {revision} does not match .fabric/knowledge derived revision {computedRevision}.",
|
|
243
|
+
"doctor.check.agents_meta.message.stale_hash_equal": ".fabric/agents.meta.json content is aligned with .fabric/knowledge (revision {revision}) but the mtime/counters derived state is out of date. Benign.",
|
|
244
|
+
"doctor.check.agents_meta.remediation.stale": "Benign \u2014 engine auto-heals on next plan-context/get-sections call. Run `fabric doctor --fix` for explicit reconciliation.",
|
|
245
|
+
"doctor.check.agents_meta.ok": ".fabric/agents.meta.json revision {revision} is aligned with .fabric/knowledge.",
|
|
246
|
+
"doctor.check.rule_content_refs.name": "Rule content refs",
|
|
247
|
+
"doctor.check.rule_content_refs.message.unavailable": "Cannot inspect content_ref entries until agents.meta.json is valid.",
|
|
248
|
+
"doctor.check.rule_content_refs.remediation.unavailable": "Fix agents.meta.json first: run `fabric doctor --fix`.",
|
|
249
|
+
"doctor.check.rule_content_refs.message.outside.singular": "{count} content_ref entry is outside .fabric/knowledge.",
|
|
250
|
+
"doctor.check.rule_content_refs.message.outside.plural": "{count} content_ref entries are outside .fabric/knowledge.",
|
|
251
|
+
// v2.0.0-rc.33 W3-2 (T6 #12): project rules forbid hand-editing agents.meta.json (see .fabric/AGENTS.md). Direct users through doctor --fix reconcile path instead.
|
|
252
|
+
"doctor.check.rule_content_refs.remediation.outside": "Run `fabric doctor --fix` to let reconcile auto-prune external content_refs (rc.31+ compatible). Do NOT hand-edit agents.meta.json \u2014 the engine reconciles automatically.",
|
|
253
|
+
"doctor.check.rule_content_refs.message.missing.singular": "{count} content_ref target is missing. Run `fabric doctor --fix` to reconcile.",
|
|
254
|
+
"doctor.check.rule_content_refs.message.missing.plural": "{count} content_ref targets are missing. Run `fabric doctor --fix` to reconcile.",
|
|
255
|
+
"doctor.check.rule_content_refs.remediation.missing": "Run `fabric doctor --fix` to reconcile agents.meta.json with the files present in .fabric/knowledge/.",
|
|
256
|
+
"doctor.check.rule_content_refs.ok": "All content_ref entries resolve to .fabric/knowledge files.",
|
|
257
|
+
"doctor.check.knowledge_test_index.name": "Knowledge-test index",
|
|
258
|
+
"doctor.check.knowledge_test_index.remediation.missing": "Run `fabric doctor --fix` to rebuild .fabric/.cache/knowledge-test.index.json.",
|
|
259
|
+
"doctor.check.knowledge_test_index.remediation.invalid": "Delete .fabric/.cache/knowledge-test.index.json and run `fabric doctor --fix` to regenerate it.",
|
|
260
|
+
"doctor.check.knowledge_test_index.message.stale": ".fabric/.cache/knowledge-test.index.json is stale.",
|
|
261
|
+
"doctor.check.knowledge_test_index.remediation.stale": "Run `fabric doctor --fix` to rebuild the knowledge-test index.",
|
|
262
|
+
"doctor.check.knowledge_test_index.ok.link_singular.orphan_singular": "{linkCount} link and {orphanCount} orphan annotation indexed.",
|
|
263
|
+
"doctor.check.knowledge_test_index.ok.link_singular.orphan_plural": "{linkCount} link and {orphanCount} orphan annotations indexed.",
|
|
264
|
+
"doctor.check.knowledge_test_index.ok.link_plural.orphan_singular": "{linkCount} links and {orphanCount} orphan annotation indexed.",
|
|
265
|
+
"doctor.check.knowledge_test_index.ok.link_plural.orphan_plural": "{linkCount} links and {orphanCount} orphan annotations indexed.",
|
|
266
|
+
"doctor.check.event_ledger.name": "Event ledger",
|
|
267
|
+
"doctor.check.event_ledger.message.missing": ".fabric/events.jsonl is missing.",
|
|
268
|
+
"doctor.check.event_ledger.remediation.missing": "Run `fabric doctor --fix` to create .fabric/events.jsonl.",
|
|
269
|
+
"doctor.check.event_ledger.message.not_writable-default": ".fabric/events.jsonl is not writable.",
|
|
270
|
+
"doctor.check.event_ledger.remediation.not_writable": "Check file permissions on .fabric/events.jsonl and ensure no other process holds a write lock.",
|
|
271
|
+
"doctor.check.event_ledger.message.invalid-default": ".fabric/events.jsonl is invalid.",
|
|
272
|
+
// v2.0.0-rc.33 W3-1 (P0-6): archive-history mode — direct users to mv the broken ledger into events.archive/ before recreating, preserving history rather than rm'ing it. Mirrors rotateEventLedgerIfNeeded's events-rotated-YYYY-MM-DD.jsonl naming convention (events-corrupted-YYYY-MM-DD.jsonl distinguishes this archive cause from sliding-window rotation).
|
|
273
|
+
"doctor.check.event_ledger.remediation.invalid": "Archive history first (`mkdir -p .fabric/events.archive && mv .fabric/events.jsonl .fabric/events.archive/events-corrupted-$(date +%Y-%m-%d).jsonl`), then run `fabric doctor --fix` to create a new empty ledger. Historical events are preserved under events.archive/.",
|
|
274
|
+
"doctor.check.event_ledger.ok": ".fabric/events.jsonl exists, is writable, and is parseable.",
|
|
275
|
+
// v2.0.0-rc.37 Wave B (B5): composite hard-gate check for events.jsonl /
|
|
276
|
+
// metrics.jsonl health (G7 size / G8 metric_leak / G9 metrics_stale /
|
|
277
|
+
// G10 rotation_overdue).
|
|
278
|
+
"doctor.check.events_jsonl_health.name": "Events ledger health (rc.37 Plan B 5 hard gate)",
|
|
279
|
+
"doctor.check.events_jsonl_health.ok": ".fabric/events.jsonl size, freshness, and metric isolation all healthy.",
|
|
280
|
+
"doctor.check.events_jsonl_health.message.size": ".fabric/events.jsonl is {sizeMb} MB, above the 10 MB threshold.",
|
|
281
|
+
"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.",
|
|
282
|
+
"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.",
|
|
283
|
+
"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.",
|
|
284
|
+
"doctor.check.events_jsonl_health.remediation": "Run `fabric doctor --fix` to trigger a rotation; 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.",
|
|
285
|
+
"doctor.check.mcp_config_in_wrong_file.name": "Claude MCP config location",
|
|
286
|
+
"doctor.check.mcp_config_in_wrong_file.message": ".claude/settings.json contains mcpServers.fabric \u2014 this file is for hooks/permissions only. Run --fix to remove it, then re-run fabric install to write .mcp.json.",
|
|
287
|
+
"doctor.check.mcp_config_in_wrong_file.remediation": "Run `fabric doctor --fix` to remove mcpServers.fabric from .claude/settings.json, then run `fabric install` to write .mcp.json.",
|
|
288
|
+
"doctor.check.mcp_config_in_wrong_file.ok": "mcpServers.fabric is not in .claude/settings.json.",
|
|
289
|
+
"doctor.check.event_ledger_partial_write.name": "Event ledger partial write",
|
|
290
|
+
"doctor.check.event_ledger_partial_write.ok.skipped": "No partial-write check needed (ledger missing or not writable).",
|
|
291
|
+
"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.",
|
|
292
|
+
"doctor.check.event_ledger_partial_write.remediation": "Run `fabric doctor --fix` to truncate the partial write and restore events.jsonl to a valid state.",
|
|
293
|
+
"doctor.check.event_ledger_partial_write.ok.clean": "events.jsonl has no partial trailing write.",
|
|
294
|
+
// v2.0.0-rc.27 TASK-010 (audit §2.24): schema-compat forward-warn category.
|
|
295
|
+
"doctor.check.event_ledger_schema_compat.name": "Event ledger schema compat",
|
|
296
|
+
"doctor.check.event_ledger_schema_compat.ok.skipped": "No schema-compat check needed (ledger missing or not writable).",
|
|
297
|
+
"doctor.check.event_ledger_schema_compat.ok.clean": "events.jsonl rows all parse against the current schema.",
|
|
298
|
+
"doctor.check.event_ledger_schema_compat.message.schema_version": "events.jsonl has {count} row(s) with unsupported `schema_version` (samples: {samples}).",
|
|
299
|
+
"doctor.check.event_ledger_schema_compat.message.event_type": "events.jsonl has {count} row(s) with unknown `event_type` (samples: {samples}).",
|
|
300
|
+
// v2.0.0-rc.33 W3-1 (P0-6): archive-history mode — same as event_ledger.invalid above. Explicit "archive" wording (rather than "back up") makes it clear the old ledger is preserved under events.archive/, not discarded.
|
|
301
|
+
"doctor.check.event_ledger_schema_compat.remediation": "Preferred: upgrade the fabric CLI to a server-compatible version. Otherwise archive history first (`mkdir -p .fabric/events.archive && mv .fabric/events.jsonl .fabric/events.archive/events-schema-mismatch-$(date +%Y-%m-%d).jsonl`), then run `fabric doctor --fix` to create a new empty ledger. Historical events stay under events.archive/ for later manual migration.",
|
|
302
|
+
// v2.0.0-rc.28 TASK-04 (audit §3.1): SKILL ref/ mirror parity check.
|
|
303
|
+
"doctor.check.skill_ref_mirror.name": "Skill ref mirror parity",
|
|
304
|
+
"doctor.check.skill_ref_mirror.ok": "All `.claude/skills/<slug>/ref/` and `.codex/skills/<slug>/ref/` files are byte-identical.",
|
|
305
|
+
"doctor.check.skill_ref_mirror.message": "{count} skill ref file(s) differ between `.claude/skills/` and `.codex/skills/` (paths: {list}). One client was hand-edited or partially installed.",
|
|
306
|
+
"doctor.check.skill_ref_mirror.remediation": "Run `fabric install` to rewrite both client subtrees from the canonical templates and restore parity.",
|
|
307
|
+
// 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).
|
|
308
|
+
"doctor.check.skill_token_budget.name": "Skill token budget",
|
|
309
|
+
"doctor.check.skill_token_budget.ok": "All .claude/skills/<slug>/SKILL.md files are within token budget (warn 5K / error 10K).",
|
|
310
|
+
"doctor.check.skill_token_budget.message.singular": "{count} SKILL.md exceeds the token budget: {list}. Sink detail into ref/ for progressive disclosure.",
|
|
311
|
+
"doctor.check.skill_token_budget.message.plural": "{count} SKILL.md files exceed the token budget: {list}. Sink detail into ref/ for progressive disclosure.",
|
|
312
|
+
"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.",
|
|
313
|
+
// 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.
|
|
314
|
+
"doctor.check.skill_description.name": "Skill description quality",
|
|
315
|
+
"doctor.check.skill_description.ok": "All SKILL.md description fields are well-structured (non-empty, <60 tokens, bilingual triggers).",
|
|
316
|
+
"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.",
|
|
317
|
+
"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.",
|
|
318
|
+
"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).",
|
|
319
|
+
// v2.0.0-rc.33 W3-3 (P1-3): cite-policy Goodhart pattern detection. Scans 7d of assistant_turn_observed events for 4 anti-patterns (G1 ritual / G2 dismissal abuse / G3 chained-from misuse / G5 placeholder cite). Warning severity — heuristics can false-positive; advisory only.
|
|
320
|
+
"doctor.check.cite_goodhart.name": "Cite-policy Goodhart",
|
|
321
|
+
"doctor.check.cite_goodhart.ok": "No cite-policy Goodhart patterns detected over the last 7 days.",
|
|
322
|
+
"doctor.check.cite_goodhart.message.singular": "Detected {count} cite-policy Goodhart pattern: {list}.",
|
|
323
|
+
"doctor.check.cite_goodhart.message.plural": "Detected {count} cite-policy Goodhart patterns: {list}.",
|
|
324
|
+
"doctor.check.cite_goodhart.remediation": "Review the fired patterns: G1 ritual \u2192 the same id repeated as [recalled] suggests the KB should land into a contract instead; G2 dismissal abuse \u2192 > 60% of recalled cites used skip: bypasses contract enforcement, audit skip-reason validity; G3 chained-from misuse \u2192 chained-from tag with no commitment (operators=[] + skip_reason=null), add operators or use a different tag; G5 placeholder cite \u2192 too many bare 'KB: none' / [unspecified], prefer specific sentinels like [no-relevant] / [not-applicable]. For raw data, run `fabric doctor --cite-coverage --since=7d`.",
|
|
325
|
+
// v2.0.0-rc.33 W4-A4 (T5 P2): draft-backlog lint. rc.32 baseline showed 92% of entries stuck at draft, signaling a broken promote loop. Warns when > 50% draft (workspace must have >= 10 entries to compute the ratio — small corpora are noisy).
|
|
326
|
+
"doctor.check.draft_backlog.name": "Knowledge draft backlog",
|
|
327
|
+
"doctor.check.draft_backlog.ok": "draft-maturity entry ratio is healthy (< 50%, or workspace too small to compute).",
|
|
328
|
+
"doctor.check.draft_backlog.message": "{draftCount}/{totalCount} ({pct}%) canonical knowledge entries are stuck at draft maturity \u2014 promote loop is broken (rc.32 baseline was 92%).",
|
|
329
|
+
"doctor.check.draft_backlog.remediation": "Run `/fabric-review` to triage drafts: approve to promote to verified/proven, reject to drop, modify to fix. A long-standing draft backlog usually means archive produces drafts faster than review can promote them.",
|
|
330
|
+
// rc.37 NEW-38: knowledge auto-promote (info surface; --fix applies).
|
|
331
|
+
"doctor.check.draft_auto_promote.name": "Knowledge auto-promote",
|
|
332
|
+
"doctor.check.draft_auto_promote.ok": "No settled drafts awaiting auto-promote (drafts are younger than 14 days or flagged drifted).",
|
|
333
|
+
"doctor.check.draft_auto_promote.message": "{count} draft entries have settled for \u226514 days with no drift ({sample}{suffix}) \u2014 eligible for auto-promote to verified. Run `fabric doctor --fix` to apply.",
|
|
334
|
+
"doctor.check.draft_auto_promote.remediation": "Run `fabric doctor --fix` to auto-promote these settled drafts to verified (drains draft_backlog); or run `/fabric-review` to triage each manually.",
|
|
335
|
+
"doctor.check.draft_auto_promote.fixed": "Auto-promoted {count} settled draft entries \u2192 verified.",
|
|
336
|
+
// rc.36 TASK-05 (P0-8): empty-tags ratio warn.
|
|
337
|
+
"doctor.check.knowledge_tags_empty.name": "Knowledge tags coverage",
|
|
338
|
+
"doctor.check.knowledge_tags_empty.ok": "empty-tag ratio is healthy (\u2264 50%, or workspace too small to compute).",
|
|
339
|
+
"doctor.check.knowledge_tags_empty.message": "{emptyCount}/{totalCount} ({pct}%) canonical knowledge entries have empty `tags:` \u2014 topical clustering and cross-entry retrieval degrade. The fabric-archive / fabric-import skills should produce 2-4 tags per entry.",
|
|
340
|
+
"doctor.check.knowledge_tags_empty.remediation": "On the next archive/import run, populate `tags:` in the frontmatter with 2-4 kebab-case keywords. To backfill existing entries in bulk, use `/fabric-review` with the modify flow.",
|
|
341
|
+
// rc.36 TASK-09 (P1-NEW1): drift_detected events unconsumed by demote.
|
|
342
|
+
"doctor.check.drift_unconsumed.name": "Knowledge drift unconsumed",
|
|
343
|
+
"doctor.check.drift_unconsumed.ok": "knowledge_drift_detected events in the last 30 days have been consumed by paired knowledge_demoted, or event volume is too low to compute.",
|
|
344
|
+
"doctor.check.drift_unconsumed.message": "{driftCount} knowledge_drift_detected events in the last 30 days, but only {demoteCount} knowledge_demoted. Drift > demote by \u2265 5 means part of the drift is going unconsumed \u2014 KB slowly stales.",
|
|
345
|
+
"doctor.check.drift_unconsumed.remediation": "Run `fabric doctor --fix` to trigger orphan-demote / stale-archive auto-heal, or invoke `/fabric-review` to manually triage drift-flagged entries.",
|
|
346
|
+
"doctor.check.meta_manually_diverged.name": "Meta manual divergence",
|
|
347
|
+
"doctor.check.meta_manually_diverged.ok.unreadable": "agents.meta.json not readable; skipping divergence check.",
|
|
348
|
+
"doctor.check.meta_manually_diverged.message.extra.singular": "agents.meta.json has {count} entry with no backing file on disk. Run --fix to reconcile.",
|
|
349
|
+
"doctor.check.meta_manually_diverged.message.extra.plural": "agents.meta.json has {count} entries with no backing file on disk. Run --fix to reconcile.",
|
|
350
|
+
"doctor.check.meta_manually_diverged.remediation.extra": "Run `fabric doctor --fix` to reconcile agents.meta.json with the rule files currently on disk.",
|
|
351
|
+
"doctor.check.meta_manually_diverged.message.hash.singular": "agents.meta.json has {count} entry whose hash does not match the file on disk. Run --fix to reconcile.",
|
|
352
|
+
"doctor.check.meta_manually_diverged.message.hash.plural": "agents.meta.json has {count} entries whose hash does not match the file on disk. Run --fix to reconcile.",
|
|
353
|
+
"doctor.check.meta_manually_diverged.remediation.hash": "Run `fabric doctor --fix` to reconcile agents.meta.json with the current rule file contents.",
|
|
354
|
+
"doctor.check.meta_manually_diverged.ok.consistent": "agents.meta.json is consistent with rule files on disk.",
|
|
355
|
+
"doctor.check.knowledge_dir_unindexed.name": "Knowledge dir unindexed",
|
|
356
|
+
"doctor.check.knowledge_dir_unindexed.message.singular": "{count} .md file in .fabric/knowledge/ not indexed in agents.meta.json. Run `fabric doctor --fix` to index the missing knowledge files.",
|
|
357
|
+
"doctor.check.knowledge_dir_unindexed.message.plural": "{count} .md files in .fabric/knowledge/ not indexed in agents.meta.json. Run `fabric doctor --fix` to index the missing knowledge files.",
|
|
358
|
+
"doctor.check.knowledge_dir_unindexed.remediation": "Run `fabric doctor --fix` to index the missing knowledge files.",
|
|
359
|
+
"doctor.check.knowledge_dir_unindexed.ok": "All .fabric/knowledge/ .md files are indexed in agents.meta.json.",
|
|
360
|
+
"doctor.check.stable_id_collision.name": "Stable ID collision",
|
|
361
|
+
"doctor.check.stable_id_collision.message.singular": 'stable_id "{stableId}" is declared in {fileCount} files: {files}. Edit one of the knowledge files to use a unique stable_id.',
|
|
362
|
+
"doctor.check.stable_id_collision.message.plural": '{count} stable_id collisions detected. First: "{stableId}" in {files}. Edit one of the knowledge files to use a unique stable_id.',
|
|
363
|
+
// v2.0.0-rc.33 W3-2 (T6 #27): route through fabric-review modify so the canonical id allocator picks a fresh id (avoids hand-counter math).
|
|
364
|
+
"doctor.check.stable_id_collision.remediation": "Run `/fabric-review modify <one of the colliding ids from the message>` to let the canonical id allocator reassign it (updates frontmatter + counters + historical cross-refs atomically). Do NOT hand-edit id frontmatter \u2014 it will desync counters.",
|
|
365
|
+
"doctor.check.stable_id_collision.ok": "No declared stable_id collisions found in .fabric/knowledge/.",
|
|
366
|
+
"doctor.check.counter_desync.name": "Knowledge counter desync",
|
|
367
|
+
"doctor.check.counter_desync.message.singular": "{count} knowledge counter desynced from observed stable_ids. {counterPath} = {current} but observed {observedId}. Run `fabric doctor --fix` to bump counters.",
|
|
368
|
+
"doctor.check.counter_desync.message.plural": "{count} knowledge counters desynced from observed stable_ids. {counterPath} = {current} but observed {observedId}. Run `fabric doctor --fix` to bump counters.",
|
|
369
|
+
"doctor.check.counter_desync.remediation": "Run `fabric doctor --fix` to bump agents.meta.json counters to the maximum observed counter value.",
|
|
370
|
+
"doctor.check.counter_desync.ok": "agents.meta.json counters envelope is consistent with observed stable_ids.",
|
|
371
|
+
"doctor.check.preexisting_root_files.name": "Preexisting root markdown",
|
|
372
|
+
"doctor.check.preexisting_root_files.ok": "No CLAUDE.md or AGENTS.md detected at project root.",
|
|
373
|
+
"doctor.check.preexisting_root_files.message": "{files} detected at project root. These root files are not auto-loaded by Fabric MCP.",
|
|
374
|
+
"doctor.check.preexisting_root_files.remediation": "Move knowledge content to `.fabric/knowledge/{type}/` if you want it available in MCP responses.",
|
|
375
|
+
"doctor.check.filesystem_edit_fallback.name": "Filesystem-edit fallback",
|
|
376
|
+
"doctor.check.filesystem_edit_fallback.ok": "No orphan canonical knowledge entries detected; events.jsonl promotion trail is complete.",
|
|
377
|
+
"doctor.check.filesystem_edit_fallback.message.synthesized.singular": "Synthesized {count} knowledge_promoted event for orphan canonical entries ({sample}{suffix}). Reason='{reason}'.",
|
|
378
|
+
"doctor.check.filesystem_edit_fallback.message.synthesized.plural": "Synthesized {count} knowledge_promoted events for orphan canonical entries ({sample}{suffix}). Reason='{reason}'.",
|
|
379
|
+
"doctor.check.filesystem_edit_fallback.remediation.synthesized": "These entries were moved into .fabric/knowledge/<type>/ outside fab_review.approve. The synthesized events restore audit-trail completeness.",
|
|
380
|
+
"doctor.check.orphan_demote.name": "Knowledge orphan demote",
|
|
381
|
+
"doctor.check.orphan_demote.ok": "No canonical knowledge entries exceed their maturity-keyed inactivity threshold.",
|
|
382
|
+
"doctor.check.orphan_demote.message.singular": "{count} canonical knowledge entry exceeds their maturity-keyed inactivity threshold (stable={stableDays}d / endorsed={endorsedDays}d / draft={draftDays}d). First: {detail}.",
|
|
383
|
+
"doctor.check.orphan_demote.message.plural": "{count} canonical knowledge entries exceed their maturity-keyed inactivity threshold (stable={stableDays}d / endorsed={endorsedDays}d / draft={draftDays}d). First: {detail}.",
|
|
384
|
+
"doctor.check.orphan_demote.remediation": "Run `fabric doctor --fix-knowledge` to demote orphan entries one maturity tier.",
|
|
385
|
+
"doctor.check.stale_archive.name": "Knowledge stale archive",
|
|
386
|
+
"doctor.check.stale_archive.ok": "No draft knowledge entries exceed the additional stale-archive quiet window.",
|
|
387
|
+
"doctor.check.stale_archive.message.singular": "{count} draft knowledge entry is stale beyond the demote+{additionalDays}d additional quiet window. First: {detail}.",
|
|
388
|
+
"doctor.check.stale_archive.message.plural": "{count} draft knowledge entries are stale beyond the demote+{additionalDays}d additional quiet window. First: {detail}.",
|
|
389
|
+
"doctor.check.stale_archive.remediation": "Run `fabric doctor --fix-knowledge` to move stale entries into `.fabric/.archive/<type>/`.",
|
|
390
|
+
"doctor.check.pending_overdue.name": "Knowledge pending overdue",
|
|
391
|
+
"doctor.check.pending_overdue.ok": "No pending knowledge entries exceed the 14-day review threshold.",
|
|
392
|
+
"doctor.check.pending_overdue.message.singular": "{count} pending knowledge entry has been awaiting review for more than {thresholdDays} days. First: {detail}.",
|
|
393
|
+
"doctor.check.pending_overdue.message.plural": "{count} pending knowledge entries have been awaiting review for more than {thresholdDays} days. First: {detail}.",
|
|
394
|
+
"doctor.check.pending_overdue.remediation": "Review pending entries via the fabric-review Skill (`/fabric-review`) and approve, reject, defer, or modify.",
|
|
395
|
+
"doctor.check.stable_id_duplicate.name": "Knowledge stable_id duplicate",
|
|
396
|
+
"doctor.check.stable_id_duplicate.ok": "No canonical knowledge files share a stable_id across team / personal trees.",
|
|
397
|
+
"doctor.check.stable_id_duplicate.message.singular": "{count} stable_id duplicated across canonical knowledge files (path-decoupled identity invariant). First: {detail}.",
|
|
398
|
+
"doctor.check.stable_id_duplicate.message.plural": "{count} stable_ids duplicated across canonical knowledge files (path-decoupled identity invariant). First: {detail}.",
|
|
399
|
+
// v2.0.0-rc.33 W3-2 (T6 #34): same as stable_id_collision — route through fabric-review modify so allocator handles the new id.
|
|
400
|
+
"doctor.check.stable_id_duplicate.remediation": "Run `/fabric-review modify <one of the duplicate ids from the message>` to let the canonical id allocator assign a fresh `<prefix>-<type>-<counter>--<slug>.md` (renames the file + updates frontmatter + corrects counters in one shot).",
|
|
401
|
+
"doctor.check.layer_mismatch.name": "Knowledge layer mismatch",
|
|
402
|
+
"doctor.check.layer_mismatch.ok": "All canonical knowledge files are physically located under the layer their stable_id prefix declares.",
|
|
403
|
+
"doctor.check.layer_mismatch.message.singular": "{count} canonical knowledge file are physically misaligned with their stable_id layer prefix (KT-* must live under team/, KP-* under personal/). First: {detail}.",
|
|
404
|
+
"doctor.check.layer_mismatch.message.plural": "{count} canonical knowledge files are physically misaligned with their stable_id layer prefix (KT-* must live under team/, KP-* under personal/). First: {detail}.",
|
|
405
|
+
// v2.0.0-rc.33 W3-2 (T6 #35): make the skill entry point explicit so users know how to invoke fabric-review.
|
|
406
|
+
"doctor.check.layer_mismatch.remediation": "Move the file to the correct layer root (KT-* \u2192 .fabric/knowledge/team/, KP-* \u2192 ~/.fabric/knowledge/personal/), or run `/fabric-review modify <id from the message>` to flip its layer (which renames the stable_id prefix accordingly).",
|
|
407
|
+
"doctor.check.index_drift.name": "Knowledge index drift",
|
|
408
|
+
"doctor.check.index_drift.ok": "agents.meta.json counters envelope is at or above the highest existing canonical counter for every (layer, type) pair.",
|
|
409
|
+
"doctor.check.index_drift.message.singular": "{count} (layer, type) counter slot have drifted below the observed canonical maximum (next allocate would collide). First: {detail}.",
|
|
410
|
+
"doctor.check.index_drift.message.plural": "{count} (layer, type) counter slots have drifted below the observed canonical maximum (next allocate would collide). First: {detail}.",
|
|
411
|
+
"doctor.check.index_drift.remediation": "Run `fabric doctor --fix-knowledge` to bump agents.meta.json counters to max_observed + 1.",
|
|
412
|
+
"doctor.check.underseeded.name": "Knowledge underseeded",
|
|
413
|
+
"doctor.check.underseeded.ok": "Knowledge corpus has {count} canonical entries (>= {threshold}).",
|
|
414
|
+
"doctor.check.underseeded.message.singular": "Knowledge corpus has only {count} canonical entry (< {threshold} threshold). The plan_context retrieval surface is below its useful floor.",
|
|
415
|
+
"doctor.check.underseeded.message.plural": "Knowledge corpus has only {count} canonical entries (< {threshold} threshold). The plan_context retrieval surface is below its useful floor.",
|
|
416
|
+
"doctor.check.underseeded.remediation": "Run the fabric-import Skill (`/fabric-import`) to backfill knowledge from git history and existing docs.",
|
|
417
|
+
"doctor.check.narrow_no_paths.name": "Knowledge narrow without paths",
|
|
418
|
+
"doctor.check.narrow_no_paths.ok": "No narrow-scope canonical entries have an empty relevance_paths array.",
|
|
419
|
+
"doctor.check.narrow_no_paths.message.singular": "{count} narrow-scope canonical entry has an empty relevance_paths array (silent recall risk \u2014 narrow without anchors can never match a target path). First: {detail}.",
|
|
420
|
+
"doctor.check.narrow_no_paths.message.plural": "{count} narrow-scope canonical entries have an empty relevance_paths array (silent recall risk \u2014 narrow without anchors can never match a target path). First: {detail}.",
|
|
421
|
+
"doctor.check.narrow_no_paths.remediation": "Run `/fabric-review`, select the entry \u2192 modify to add path anchors to relevance_paths or widen relevance_scope to broad; or edit the entry frontmatter directly.",
|
|
422
|
+
"doctor.check.relevance_paths_dangling.name": "Knowledge relevance_paths dangling",
|
|
423
|
+
"doctor.check.relevance_paths_dangling.ok": "All relevance_paths globs resolve to at least one file under the workspace root.",
|
|
424
|
+
"doctor.check.relevance_paths_dangling.message.singular": "{count} relevance_paths glob resolves to zero files in the current workspace. First: {detail}.",
|
|
425
|
+
"doctor.check.relevance_paths_dangling.message.plural": "{count} relevance_paths globs resolve to zero files in the current workspace. First: {detail}.",
|
|
426
|
+
"doctor.check.relevance_paths_dangling.remediation": "Update the entry's relevance_paths to remove globs that no longer match any files, or use `fab_review.modify` to rewrite the anchor set.",
|
|
427
|
+
"doctor.check.relevance_paths_drift.name": "Knowledge relevance_paths drift",
|
|
428
|
+
"doctor.check.relevance_paths_drift.ok.skipped": "Skipped (git history unavailable; cannot evaluate {windowDays}d drift window).",
|
|
429
|
+
"doctor.check.relevance_paths_drift.ok.fresh": "All narrow-scope canonical entries have at least one relevance_path touched in the last {windowDays}d.",
|
|
430
|
+
"doctor.check.relevance_paths_drift.message.singular": "{count} narrow-scope canonical entry has relevance_paths whose globs match no file touched in the last {windowDays}d of git history. First: {detail}.",
|
|
431
|
+
"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}.",
|
|
432
|
+
"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.",
|
|
433
|
+
"doctor.check.personal_layer_path_misclassify.name": "Personal-layer path misclassify",
|
|
434
|
+
"doctor.check.personal_layer_path_misclassify.ok": "No personal-layer entries declare relevance_paths that resolve against the current project.",
|
|
435
|
+
"doctor.check.personal_layer_path_misclassify.message.singular": "{count} personal-layer entry declares relevance_paths that match files in the current project (personal layer should be project-agnostic). First: {detail}.",
|
|
436
|
+
"doctor.check.personal_layer_path_misclassify.message.plural": "{count} personal-layer entries declare relevance_paths that match files in the current project (personal layer should be project-agnostic). First: {detail}.",
|
|
437
|
+
"doctor.check.personal_layer_path_misclassify.remediation": 'Use `fab_review.modify` with `layer: "team"` to flip the entry, or rewrite the relevance_paths so the anchors are project-agnostic (e.g. drop project-specific globs).',
|
|
438
|
+
"doctor.check.suspicious_kb.name": "Suspicious KB injection",
|
|
439
|
+
"doctor.check.suspicious_kb.ok": "No canonical knowledge bodies match known prompt-injection patterns.",
|
|
440
|
+
"doctor.check.suspicious_kb.message.singular": "{count} canonical entry body contains tokens matching prompt-injection patterns (likely legacy pre-NEW-31 archive). First: {detail}.",
|
|
441
|
+
"doctor.check.suspicious_kb.message.plural": "{count} canonical entry bodies contain tokens matching prompt-injection patterns (likely legacy pre-NEW-31 archive). First: {detail}.",
|
|
442
|
+
"doctor.check.suspicious_kb.remediation": "Review the flagged entries \u2014 use `fab_review.modify` to scrub the injection tokens from the body, or `fab_review.reject` to archive entries that should not have been canonicalised.",
|
|
443
|
+
"doctor.check.narrow_too_few.name": "Knowledge narrow too few",
|
|
444
|
+
"doctor.check.narrow_too_few.ok": "Narrow-with-paths ratio {ratioPct}% ({narrowCount}/{totalCount}); {teleNote}.",
|
|
445
|
+
"doctor.check.narrow_too_few.message.telemetry_skipped": "telemetry skipped (no edit-counter fires in window)",
|
|
446
|
+
"doctor.check.narrow_too_few.message.telemetry_window": "silence rate {silencePct}% over {windowDays}d",
|
|
447
|
+
"doctor.check.narrow_too_few.message.structural": "narrow-with-paths share {ratioPct}% ({narrowCount}/{totalCount}) below {thresholdPct}% threshold",
|
|
448
|
+
"doctor.check.narrow_too_few.message.telemetry": "narrow-hook silence rate {silencePct}% ({silenceFires}/{totalFires}) over {windowDays}d above {thresholdPct}% threshold",
|
|
449
|
+
"doctor.check.narrow_too_few.message.summary": "Narrow-scope KB coverage is below the useful floor: {parts}.",
|
|
450
|
+
"doctor.check.narrow_too_few.remediation": "Run the fabric-import Skill (`/fabric-import`) to re-seed narrow anchors against the current codebase.",
|
|
451
|
+
"doctor.check.session_hints_stale.name": "Knowledge session-hints stale",
|
|
452
|
+
"doctor.check.session_hints_stale.ok": "No session-hints cache files older than {days} days under .fabric/.cache/.",
|
|
453
|
+
"doctor.check.session_hints_stale.message.singular": "{count} session-hints cache file under .fabric/.cache/ is older than {days} days. First: {detail}.",
|
|
454
|
+
"doctor.check.session_hints_stale.message.plural": "{count} session-hints cache files under .fabric/.cache/ are older than {days} days. First: {detail}.",
|
|
455
|
+
"doctor.check.session_hints_stale.remediation": "Run `fabric doctor --fix-knowledge` to delete stale session-hints cache files.",
|
|
456
|
+
"doctor.check.stale_serve_lock.name": "Serve lock",
|
|
457
|
+
"doctor.check.stale_serve_lock.ok.no_lock": "No .fabric/.serve.lock present.",
|
|
458
|
+
"doctor.check.stale_serve_lock.ok.live_pid": ".fabric/.serve.lock held by live PID {pid}.",
|
|
459
|
+
"doctor.check.stale_serve_lock.age.day.singular": "{count} day ago",
|
|
460
|
+
"doctor.check.stale_serve_lock.age.day.plural": "{count} days ago",
|
|
461
|
+
"doctor.check.stale_serve_lock.age.hour.singular": "{count} hour ago",
|
|
462
|
+
"doctor.check.stale_serve_lock.age.hour.plural": "{count} hours ago",
|
|
463
|
+
"doctor.check.stale_serve_lock.message.dead_pid": "[advisory] .fabric/.serve.lock holds dead PID {pid} (acquired {acquiredAgo}). Run `fabric doctor --fix` to remove.",
|
|
464
|
+
"doctor.check.stale_serve_lock.remediation.dead_pid": "Run `fabric doctor --fix` to remove the stale .fabric/.serve.lock.",
|
|
465
|
+
"doctor.check.relevance_fields_missing.name": "Knowledge relevance fields missing",
|
|
466
|
+
"doctor.check.relevance_fields_missing.ok": "All pending entries declare both relevance_scope and relevance_paths.",
|
|
467
|
+
"doctor.check.relevance_fields_missing.message.singular": "{count} pending entry is missing relevance_scope and/or relevance_paths in frontmatter. First: {detail}.",
|
|
468
|
+
"doctor.check.relevance_fields_missing.message.plural": "{count} pending entries are missing relevance_scope and/or relevance_paths in frontmatter. First: {detail}.",
|
|
469
|
+
"doctor.check.relevance_fields_missing.remediation": "Run `fabric doctor --fix-knowledge` to back-fill the schema defaults (relevance_scope: broad, relevance_paths: []).",
|
|
470
|
+
// rc.31 BUG-M3/NEW-4: hooks_wired observability.
|
|
471
|
+
"doctor.check.hooks_wired.name": "Claude Code hooks wired",
|
|
472
|
+
"doctor.check.hooks_wired.ok.skipped": "Project does not use Claude Code (no .claude/ directory); hooks_wired check skipped.",
|
|
473
|
+
"doctor.check.hooks_wired.ok.wired": ".claude/settings.json has the three fabric hooks wired: Stop:fabric-hint / SessionStart:knowledge-hint-broad / PreToolUse:knowledge-hint-narrow.",
|
|
474
|
+
"doctor.check.hooks_wired.message.missing_settings": ".claude/ exists but .claude/settings.json is absent or unparseable; fabric install may have never run successfully, or the file was wiped externally.",
|
|
475
|
+
"doctor.check.hooks_wired.message.incomplete": ".claude/settings.json is missing fabric hook injections: {missing}. fabric install dry-run report does not match actual state (rc.30 audit BUG-M3 / NEW-4).",
|
|
476
|
+
"doctor.check.hooks_wired.remediation": "Run `fabric install` to re-inject hooks (idempotent; only fills missing slots). If hooks config was accidentally wiped, back up .claude/settings.json before running.",
|
|
477
|
+
// v2.0.0-rc.37 NEW-20: hooks_runtime — shebang + Node.js syntax validity
|
|
478
|
+
// of installed *.cjs hook files (one layer below hooks_wired).
|
|
479
|
+
"doctor.check.hooks_runtime.name": "Hooks runtime health",
|
|
480
|
+
"doctor.check.hooks_runtime.ok.skipped": "No installed hook files found under .claude/hooks/ / .codex/hooks/ / .cursor/hooks/; skipping hooks_runtime check.",
|
|
481
|
+
"doctor.check.hooks_runtime.ok.healthy": "Scanned {count} hook .cjs file(s); shebang and Node.js syntax parse all pass.",
|
|
482
|
+
"doctor.check.hooks_runtime.message.singular": "{count} hook file is unhealthy at runtime; first: {first_path} ({first_detail}).",
|
|
483
|
+
"doctor.check.hooks_runtime.message.plural": "{count} hook files are unhealthy at runtime; first: {first_path} ({first_detail}).",
|
|
484
|
+
"doctor.check.hooks_runtime.remediation": "Run `fabric install` to overwrite broken hook files (idempotent). If a hook was corrupted by an external process, confirm the cause before re-running install.",
|
|
485
|
+
// v2.0.0-rc.37 NEW-27: hooks_content_drift — cross-client sha256 parity.
|
|
486
|
+
"doctor.check.hooks_content_drift.name": "Hooks cross-client content parity",
|
|
487
|
+
"doctor.check.hooks_content_drift.ok.skipped": "No hook files co-exist across multiple clients (single-client install or no hooks present); skipping hooks_content_drift check.",
|
|
488
|
+
"doctor.check.hooks_content_drift.ok.aligned": "Scanned {count} hook copies; sha256 of every basename matches across .claude / .codex / .cursor.",
|
|
489
|
+
"doctor.check.hooks_content_drift.message": "{count} hook basename(s) drift across clients; first: {first_basename} (involves {first_clients}). `fabric install` copies the same template to all three clients \u2014 drift usually comes from manual edits.",
|
|
490
|
+
"doctor.check.hooks_content_drift.remediation": "Run `fabric install` to restore each client's hook copy to the canonical template. If you actually need client-specific behavior, modify a shared lib/ helper or templates/hooks/configs/ wiring instead of editing the installed .cjs in place.",
|
|
491
|
+
// rc.31 BUG-G2/G5: promote-ledger invariant check.
|
|
492
|
+
"doctor.check.promote_ledger_invariant.name": "Promote ledger invariant",
|
|
493
|
+
"doctor.check.promote_ledger_invariant.ok": "knowledge_proposed={proposed} >= knowledge_promote_started={started} >= knowledge_promoted={promoted}; ledger invariant holds.",
|
|
494
|
+
"doctor.check.promote_ledger_invariant.message.proposed-lt-started": "knowledge_proposed={proposed} is less than knowledge_promote_started={started} (ledger invariant violated; some pending entries were approved without going through fab_extract_knowledge, so no propose event was emitted for them).",
|
|
495
|
+
"doctor.check.promote_ledger_invariant.message.started-lt-promoted": "knowledge_promote_started={started} is less than knowledge_promoted={promoted} (ledger invariant violated; unpaired promoted events exist, possibly from doctor filesystem-edit fallback or external writers).",
|
|
496
|
+
"doctor.check.promote_ledger_invariant.remediation": "Starting in rc.31, review.approve synthesizes a knowledge_proposed event to keep the invariant; re-run fabric doctor after the next approve to settle. Historical imbalance is observability-only and does not affect KB function.",
|
|
497
|
+
// rc.35 TASK-04 (P0-9.b): global_cli_outdated.
|
|
498
|
+
"doctor.check.global_cli_outdated.name": "Global fabric CLI version",
|
|
499
|
+
"doctor.check.global_cli_outdated.ok": "Global `fabric` on PATH is {version}; compatible with the rc.31+ project schema.",
|
|
500
|
+
"doctor.check.global_cli_outdated.message.outdated": "Global `fabric` on PATH is {version}, older than the minimum-supported {minVersion}. rc.31 introduced an agents.meta.json schema fix; hooks installed by an outdated binary silently fail. Upgrade the global CLI to match the project.",
|
|
501
|
+
"doctor.check.global_cli_outdated.message.not_found": "No `fabric` binary on PATH. The CLI is required for `fabric install` / `fabric doctor`; install it globally.",
|
|
502
|
+
"doctor.check.global_cli_outdated.message.unparseable": "Could not parse `fabric -v` output ({detail}). Skipping outdated-version check.",
|
|
503
|
+
"doctor.check.global_cli_outdated.remediation": "Run `npm install -g @fenglimg/fabric-cli@latest`, then re-run `fabric install` in each fabric-managed project to resync hooks + SKILL.md.",
|
|
504
|
+
// rc.35 TASK-05 (P0-10.a): knowledge_summary_opaque.
|
|
505
|
+
"doctor.check.knowledge_summary_opaque.name": "Knowledge summary opacity",
|
|
506
|
+
"doctor.check.knowledge_summary_opaque.ok.skipped": "agents.meta.json is absent or invalid; summary-opacity check skipped.",
|
|
507
|
+
"doctor.check.knowledge_summary_opaque.ok": "{opaque}/{total} entries have summary == stable_id; opacity ratio is within the healthy band.",
|
|
508
|
+
"doctor.check.knowledge_summary_opaque.message.warn": "{opaque}/{total} entries ({pct}%) have description.summary equal to their stable_id, exceeding the {threshold}% threshold. Narrow-hint output renders as `<id> \xB7 <id>`, signaling nothing useful, and AI clients skip the fetch. First opaque: {sample}.",
|
|
509
|
+
"doctor.check.knowledge_summary_opaque.remediation": "Run the fabric-review skill to rewrite opaque summaries with one short human-readable phrase. The rc.35 hint renderer fallback (TASK-06) will also synthesize a temporary summary from the entry's `## Summary` section.",
|
|
510
|
+
"doctor.check.skill_md_yaml_invalid.name": "Skill markdown YAML",
|
|
511
|
+
"doctor.check.skill_md_yaml_invalid.ok": "All .claude/.codex SKILL.md frontmatter values parse as strict YAML.",
|
|
512
|
+
"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}.",
|
|
513
|
+
"doctor.check.skill_md_yaml_invalid.message.plural": "{count} SKILL.md frontmatter values contain an unquoted ': ' that strict YAML parsers reject (Claude Code tolerates it; Codex CLI drops the skill at load). First: {detail}.",
|
|
514
|
+
"doctor.check.skill_md_yaml_invalid.remediation": 'Quote the value with double quotes (`description: "\u2026"`) or rewrite the inner `key: value` token to `key=value`.',
|
|
515
|
+
"doctor.check.onboard_coverage.name": "Onboard coverage",
|
|
516
|
+
"doctor.check.onboard_coverage.ok.complete": "Onboard coverage: {filledCount}/{total} \u2713 (opted-out: {optedOutCount}).",
|
|
517
|
+
"doctor.check.onboard_coverage.message.incomplete": "Onboard slots not yet covered: [{missingSlots}]. {filledCount}/{total} filled; {optedOutCount} opted-out.",
|
|
518
|
+
"doctor.check.onboard_coverage.remediation.incomplete": "Run /fabric-archive to onboard \u2014 the Skill's first-run phase will tour the project and propose pending entries for each unclaimed slot.",
|
|
519
|
+
// v2.0.0-rc.25 TASK-10: --archive-history flag set. Read-only audit of
|
|
520
|
+
// session_archive_attempted events; mutually exclusive with the other
|
|
521
|
+
// mutation/report surfaces.
|
|
522
|
+
"cli.doctor.args.archive-history.description": "Render per-session archive attempt history (read-only; reads session_archive_attempted events).",
|
|
523
|
+
"cli.doctor.errors.archive-history-mutex": "--archive-history cannot be combined with --fix, --fix-knowledge, --cite-coverage, or --enrich-descriptions. Run them separately.",
|
|
524
|
+
"doctor.archive-history.header": "Archive history (last {sinceLabel}, {count} session{plural})",
|
|
525
|
+
"doctor.archive-history.empty": "No archive history yet within the --since={sinceLabel} window.",
|
|
526
|
+
"doctor.archive-history.table.session": "Session",
|
|
527
|
+
"doctor.archive-history.table.lastAttempt": "Last attempt",
|
|
528
|
+
"doctor.archive-history.table.outcome": "Outcome",
|
|
529
|
+
"doctor.archive-history.table.candidates": "Candidates",
|
|
530
|
+
"doctor.archive-history.table.coveredGap": "Covered gap",
|
|
531
|
+
// rc.37 NEW-33: unified --history <mode> view (archive | fix | all).
|
|
532
|
+
"cli.doctor.args.history.description": "Render unified per-day history (mode: archive | fix | all). Read-only; mutex with --fix / --fix-knowledge / --cite-coverage / --enrich-descriptions / --archive-history.",
|
|
533
|
+
"cli.doctor.errors.history-mutex": "--history cannot be combined with --fix, --fix-knowledge, --cite-coverage, --enrich-descriptions, or --archive-history. Run them separately.",
|
|
534
|
+
"cli.doctor.errors.invalid-history-mode": "Invalid --history mode '{input}'. Use archive | fix | all.",
|
|
535
|
+
"doctor.history.header": "Doctor history (mode={mode}, last {sinceLabel}, {days} day(s))",
|
|
536
|
+
"doctor.history.empty": "No doctor or archive activity within the --since={sinceLabel} window (mode={mode}).",
|
|
537
|
+
"cli.hooks.description": "Manage Fabric Git hook templates.",
|
|
538
|
+
"cli.hooks.install.description": "Install the Fabric Husky pre-commit hook template.",
|
|
539
|
+
"cli.hooks.install.args.target.description": "Target project path, default is the current working directory.",
|
|
540
|
+
"cli.hooks.errors.package-json-required": "package.json is required to install hooks: {path}",
|
|
541
|
+
"cli.hooks.install.hook-skipped": "Fabric hook already present in {path}, skipped.",
|
|
542
|
+
"cli.hooks.install.hook-appended": "Appended Fabric hook to existing {path}",
|
|
543
|
+
"cli.hooks.install.hook-created": "Created {path}",
|
|
544
|
+
"cli.hooks.install.prepare-left": "Left existing prepare script unchanged in {path}",
|
|
545
|
+
"cli.hooks.install.prepare-added": "Added prepare script to {path}",
|
|
546
|
+
"cli.human-lint.description": "Validate locked human-edit regions.",
|
|
547
|
+
"cli.human-lint.args.target.description": "Target project path, default is the current working directory.",
|
|
548
|
+
"cli.human-lint.drift-detected": "Human-locked content drift detected. Revert the edit or update approved hashes before committing.",
|
|
549
|
+
"cli.human-lint.table.location": "Location",
|
|
550
|
+
"cli.human-lint.table.expected": "Expected",
|
|
551
|
+
"cli.human-lint.table.got": "Got",
|
|
552
|
+
"cli.install.description": "Install Fabric in the target project (scaffold .fabric/, bootstrap templates, MCP client wiring, git hooks).\n\nExamples:\n fabric install interactive install in the current project\n fabric install --yes accept defaults, skip the TTY wizard\n fabric install --dry-run preview the install plan without writing files",
|
|
553
|
+
"cli.install.args.target.description": "Target project path. Defaults to --target, then EXTERNAL_FIXTURE_PATH, then cwd.",
|
|
554
|
+
"cli.install.args.debug.description": "Print target resolution details to stderr.",
|
|
555
|
+
"cli.install.args.yes.description": "Accept the current install plan and run without the TTY wizard",
|
|
556
|
+
"cli.install.args.dry-run.description": "Print the install plan without writing files or running follow-up stages",
|
|
557
|
+
// rc.35 TASK-08 (P0-5/6): --force-skills-only.
|
|
558
|
+
"cli.install.args.force-skills-only.description": "Skip bootstrap / MCP / hooks / settings; refresh ONLY the fabric Skill template copies (.claude/.codex/.cursor/skills/*).",
|
|
559
|
+
"cli.install.force-skills-only.banner": "Refreshing fabric Skill templates only",
|
|
560
|
+
"cli.install.force-skills-only.uninitialised.message": "fabric install --force-skills-only: project is not initialised (.fabric/agents.meta.json is missing).",
|
|
561
|
+
"cli.install.force-skills-only.uninitialised.hint": "Run `fabric install` (without --force-skills-only) first to lay down the base scaffold, then re-run with --force-skills-only for subsequent Skill refreshes.",
|
|
562
|
+
"cli.install.force-skills-only.summary": "Skills refresh complete \u2014 written: {written}, skipped: {skipped}, errors: {errors}",
|
|
563
|
+
// v2.0.0-rc.37 NEW-26: --force-hooks-only mirror of --force-skills-only.
|
|
564
|
+
"cli.install.args.force-hooks-only.description": "Skip bootstrap / MCP / skills / settings; only refresh fabric hook scripts + per-client hook config merges (.claude/.codex/.cursor/hooks/*).",
|
|
565
|
+
"cli.install.force-hooks-only.banner": "Refreshing fabric hooks only",
|
|
566
|
+
"cli.install.force-hooks-only.uninitialised.message": "fabric install --force-hooks-only: project not initialised (.fabric/agents.meta.json missing).",
|
|
567
|
+
"cli.install.force-hooks-only.uninitialised.hint": "Run `fabric install` (without --force-hooks-only) first to lay down the base scaffold; then re-run with --force-hooks-only to refresh hooks.",
|
|
568
|
+
"cli.install.force-hooks-only.summary": "Hooks refresh complete \u2014 written: {written}, skipped: {skipped}, errors: {errors}",
|
|
569
|
+
"cli.install.mcp.install.global": "Using globally-installed @fenglimg/fabric-server",
|
|
570
|
+
"cli.install.mcp.install.local": "Installing @fenglimg/fabric-server to project devDependencies",
|
|
571
|
+
"cli.install.mcp.local.installing": "Running {manager} add -D @fenglimg/fabric-server...",
|
|
572
|
+
"cli.install.mcp.local.installed": "Installed to devDependencies",
|
|
573
|
+
"cli.install.mcp.scope.project": "Writes .mcp.json in project root (per Claude Code spec)",
|
|
574
|
+
"cli.install.mcp.scope.user": "Writes ~/.claude.json (user-scoped, applies to all projects)",
|
|
575
|
+
"cli.install.wizard.mcp-scope": "Claude MCP config scope (project/.mcp.json or user/~/.claude.json) [{defaultValue}]",
|
|
576
|
+
"cli.install.created-path": "{label} {path}",
|
|
577
|
+
"cli.install.skipped-existing-path": "{label} {path}: already exists.",
|
|
578
|
+
"cli.install.label.overwritten": "Overwritten",
|
|
579
|
+
"cli.install.stages.bootstrap": "Installing bootstrap templates...",
|
|
580
|
+
"cli.install.stages.bootstrap.snapshot.written": "Wrote .fabric/AGENTS.md snapshot",
|
|
581
|
+
"cli.install.stages.bootstrap.snapshot.skipped": "Skipped .fabric/AGENTS.md \u2014 already current",
|
|
582
|
+
"cli.install.steps.bootstrap-claude": "Updated CLAUDE.md with @-import directives",
|
|
583
|
+
"cli.install.steps.bootstrap-codex": "Updated AGENTS.md with fabric:bootstrap managed block",
|
|
584
|
+
"cli.install.steps.bootstrap-cursor": "Updated .cursor/rules/fabric-bootstrap.mdc",
|
|
585
|
+
"cli.install.stages.mcp": "Configuring MCP clients...",
|
|
586
|
+
"cli.install.stages.hooks": "Installing git hooks...",
|
|
587
|
+
"cli.install.stages.skipped": "skipped",
|
|
588
|
+
"cli.install.stages.completed": "completed",
|
|
589
|
+
"cli.install.stages.failed": "failed",
|
|
590
|
+
"cli.install.stages.summary.ran": "ran",
|
|
591
|
+
"cli.install.stages.summary.skipped": "skipped",
|
|
592
|
+
"cli.install.stages.summary.failed": "failed",
|
|
593
|
+
"cli.install.next-step": "{label} {message}",
|
|
594
|
+
"cli.install.reason-message": "{label} {message}",
|
|
595
|
+
"cli.install.language_preference_hint": "Fabric language preference: {value}. To change, edit `fabric_language` in `.fabric/fabric-config.json` (values: match-existing | zh-CN | en | zh-CN-hybrid).",
|
|
596
|
+
"cli.install.plan.title": "Fabric install plan",
|
|
597
|
+
"cli.install.plan.mode-banner.default": "[mode: apply] Standard install execution",
|
|
598
|
+
"cli.install.plan.mode-banner.plan": "[mode: plan] Dry run only, no files will be written",
|
|
599
|
+
"cli.install.plan.target": "Target: {target}",
|
|
600
|
+
"cli.install.plan.actions": "Plan: bootstrap={bootstrap} mcp={mcp} hooks={hooks} mcp-install={mcpInstall}",
|
|
601
|
+
"cli.install.plan.detected": "Detected clients: {clients}",
|
|
602
|
+
"cli.install.plan.writes": "Core writes:",
|
|
603
|
+
"cli.install.plan.preview-title": "Fabric install dry run",
|
|
604
|
+
"cli.install.plan.preview-result": "Mode={mode} bootstrap={bootstrap} mcp={mcp} hooks={hooks}",
|
|
605
|
+
"cli.install.mode.default": "default",
|
|
606
|
+
"cli.install.mode.badge.default": "APPLY",
|
|
607
|
+
"cli.install.mode.badge.plan": "PLAN",
|
|
608
|
+
"cli.install.wizard.title": "Fabric install wizard",
|
|
609
|
+
"cli.install.wizard.intro": "Fabric install",
|
|
610
|
+
"cli.install.wizard.overview.title": "Install overview",
|
|
611
|
+
"cli.install.wizard.overview.body": "Target: {target}\nMode: {mode}\nThis wizard only reshapes the install plan; execution still runs through the existing Fabric install stages.",
|
|
612
|
+
"cli.install.wizard.step.target": "Confirm target",
|
|
613
|
+
"cli.install.wizard.step.plan": "Shape install plan",
|
|
614
|
+
"cli.install.wizard.step.review": "Review final plan",
|
|
615
|
+
"cli.install.wizard.target.confirm": "Continue installing Fabric in {target}? [Y/n]",
|
|
616
|
+
"cli.install.wizard.stage.bootstrap": "Install bootstrap templates? [{defaultValue}]",
|
|
617
|
+
"cli.install.wizard.stage.mcp": "Configure MCP clients? [{defaultValue}]",
|
|
618
|
+
"cli.install.wizard.stage.hooks": "Install git hooks? [{defaultValue}]",
|
|
619
|
+
"cli.install.wizard.mcp-install": "MCP server install scope (global/local) [{defaultValue}]",
|
|
620
|
+
"cli.install.wizard.execute.confirm": "Execute this install plan now? [Y/n]",
|
|
621
|
+
"cli.install.wizard.outro": "Install plan accepted. Running Fabric install...",
|
|
622
|
+
"cli.install.wizard.invalid-yes-no": "Please answer yes or no.",
|
|
623
|
+
"cli.install.wizard.invalid-select": "Invalid value. Use one of: {options}.",
|
|
624
|
+
"cli.install.wizard.cancelled": "Fabric install cancelled before execution.",
|
|
625
|
+
"cli.install.capabilities.title": "Client capability summary",
|
|
626
|
+
// v2.0.0-rc.37 NEW-22: post-install restart banner. The MCP server is
|
|
627
|
+
// spawned by the client; already-running Claude Code / Cursor / Codex
|
|
628
|
+
// sessions won't pick up the new mcp config until they restart.
|
|
629
|
+
"cli.install.restart-banner": "Restart hint: any already-running Claude Code / Cursor / Codex CLI session must restart to pick up the new MCP server config; new sessions will autoload the Fabric tools.",
|
|
630
|
+
"cli.install.next-steps": 'Next steps \u2014 get your first value:\n 1. Restart your AI client (Claude Code / Codex). It now auto-surfaces this project\'s knowledge to the assistant.\n 2. Seed knowledge: just work normally \u2014 when you make a decision or hit a pitfall, the fabric-archive skill proposes an entry. Or run the fabric-import skill to backfill from git history.\n 3. Verify it works: ask your AI "what does Fabric know about this repo?", or run `fabric doctor` to check health.',
|
|
631
|
+
"cli.install.capabilities.none": "No supported client was detected for bootstrap or MCP follow-up.",
|
|
632
|
+
"cli.install.capabilities.header.client": "Client",
|
|
633
|
+
"cli.install.capabilities.header.bootstrap": "Bootstrap",
|
|
634
|
+
"cli.install.capabilities.header.mcp": "MCP",
|
|
635
|
+
"cli.install.capabilities.header.hook": "Hook",
|
|
636
|
+
"cli.install.capabilities.header.skill": "Skill",
|
|
637
|
+
"cli.install.capabilities.header.follow-up": "Follow-up",
|
|
638
|
+
"cli.install.capabilities.status.ready": "ready",
|
|
639
|
+
"cli.install.capabilities.status.installed": "installed",
|
|
640
|
+
"cli.install.capabilities.status.supported": "supported",
|
|
641
|
+
"cli.install.capabilities.status.manual": "manual",
|
|
642
|
+
"cli.install.capabilities.status.skipped": "skipped",
|
|
643
|
+
"cli.install.capabilities.status.failed": "failed",
|
|
644
|
+
"cli.install.capabilities.status.na": "n/a",
|
|
645
|
+
"cli.install.capabilities.follow-up.ready": "continue in client",
|
|
646
|
+
"cli.install.capabilities.follow-up.install": "install client assets",
|
|
647
|
+
"cli.install.capabilities.follow-up.manual": "manual step required",
|
|
648
|
+
"cli.install.next-step.message": "run fabric hooks install to add the Day 4 pre-commit pipeline.",
|
|
649
|
+
"cli.install.reason-message.installable-body": ".fabric/forensic.json is ready; some detected clients support Fabric follow-up but still need client assets installed.",
|
|
650
|
+
"cli.install.reason-message.manual-body": ".fabric/forensic.json is ready; some detected clients still need manual follow-up because no Fabric skill is installed for them yet.",
|
|
651
|
+
"cli.install.codex-hooks.created": "{label} {path} with Codex hooks config (requires features.codex_hooks = true).",
|
|
652
|
+
"cli.install.codex-hooks.updated": "{label} {path} with Codex hooks config (requires features.codex_hooks = true).",
|
|
653
|
+
"cli.install.codex-hooks.skipped": "{label} {path}: Codex hooks config already present.",
|
|
654
|
+
"cli.install.claude-settings.created": "{label} {path} with Claude Stop hook.",
|
|
655
|
+
"cli.install.claude-settings.updated": "{label} {path} with Claude Stop hook.",
|
|
656
|
+
"cli.install.claude-settings.skipped": "{label} {path}: Claude Stop hook already present.",
|
|
657
|
+
"cli.install.claude-settings.skipped-invalid": "{label} {path}: unable to merge Claude Stop hook.",
|
|
658
|
+
"cli.install.claude-settings.invalid-object": "{label} {path}: expected a JSON object.",
|
|
659
|
+
"cli.install.claude-settings.invalid-json": "{label} {path}: invalid JSON ({reason}).",
|
|
660
|
+
"cli.install.claude-settings.invalid-hooks": '{label} {path}: "hooks" must be a JSON object.',
|
|
661
|
+
"cli.install.claude-settings.invalid-stop-array": '{label} {path}: "hooks.Stop" must be an array.',
|
|
662
|
+
"cli.install.errors.abort-existing": "ABORT: {path} already exists. fabric install is non-destructive.",
|
|
663
|
+
"cli.install.diff.canonical": "Workspace already canonical ({count} files verified).",
|
|
664
|
+
"cli.install.diff.applying-missing": "Applying {count} missing pieces: {files}",
|
|
665
|
+
"cli.install.diff.drift-abort": "Drift detected in {path}. Run `fabric doctor` to inspect, or `fabric uninstall && fabric install` to reset.",
|
|
666
|
+
"cli.install.diff.state.missing": "missing",
|
|
667
|
+
"cli.install.diff.state.present-canonical": "canonical",
|
|
668
|
+
"cli.install.diff.state.drifted": "drifted",
|
|
669
|
+
"cli.install.diff.state.user-modified": "user-modified",
|
|
670
|
+
"cli.uninstall.description": "Uninstall Fabric from the target project. .fabric/knowledge/ is always preserved; ~/.fabric/knowledge/ is never touched.\n\nExamples:\n fabric uninstall interactive uninstall in the current project\n fabric uninstall --yes accept defaults, skip the TTY wizard\n fabric uninstall --dry-run preview the uninstall plan without removing files",
|
|
671
|
+
"cli.uninstall.args.target.description": "Target project path. Defaults to --target, then EXTERNAL_FIXTURE_PATH, then cwd.",
|
|
672
|
+
"cli.uninstall.args.debug.description": "Print target resolution details to stderr.",
|
|
673
|
+
"cli.uninstall.args.yes.description": "Accept the current uninstall plan and run without the TTY wizard.",
|
|
674
|
+
"cli.uninstall.args.dry-run.description": "Print the uninstall plan without removing files or running follow-up stages.",
|
|
675
|
+
"cli.uninstall.plan.title": "Fabric uninstall plan",
|
|
676
|
+
"cli.uninstall.plan.target": "Target: {target}",
|
|
677
|
+
"cli.uninstall.plan.actions": "Plan: scaffold={scaffold} bootstrap={bootstrap} mcp={mcp}",
|
|
678
|
+
"cli.uninstall.plan.detected": "Detected clients: {clients}",
|
|
679
|
+
"cli.uninstall.plan.preserves": "Preserves:",
|
|
680
|
+
"cli.uninstall.plan.preserves.knowledge": "team knowledge tree (always preserved)",
|
|
681
|
+
"cli.uninstall.plan.preserves.personal": "personal root, never touched",
|
|
682
|
+
"cli.uninstall.plan.preview-title": "Fabric uninstall dry run",
|
|
683
|
+
"cli.uninstall.plan.preview-result": "scaffold={scaffold} bootstrap={bootstrap} mcp={mcp}",
|
|
684
|
+
"cli.uninstall.plan.scaffold-entries.title": "Scaffold entries:",
|
|
685
|
+
"cli.uninstall.stages.scaffold": "Removing scaffold artifacts...",
|
|
686
|
+
"cli.uninstall.stages.bootstrap": "Removing bootstrap (Skills + hooks)...",
|
|
687
|
+
"cli.uninstall.stages.mcp": "Un-registering MCP clients...",
|
|
688
|
+
"cli.uninstall.stages.completed": "completed",
|
|
689
|
+
"cli.uninstall.stages.completed-with-errors": "completed with errors",
|
|
690
|
+
"cli.uninstall.stages.failed": "failed",
|
|
691
|
+
"cli.uninstall.summary.title": "Uninstall summary",
|
|
692
|
+
"cli.uninstall.summary.body": "removed={removed} skipped={skipped} errors={errors}",
|
|
693
|
+
"cli.uninstall.wizard.intro": "Fabric uninstall",
|
|
694
|
+
"cli.uninstall.wizard.overview.title": "Uninstall overview",
|
|
695
|
+
"cli.uninstall.wizard.overview.body": "Target: {target}\nThis wizard only reshapes the uninstall plan; execution still runs through the existing Fabric uninstall stages.\n.fabric/knowledge/ is always preserved. ~/.fabric/knowledge/ is never touched.",
|
|
696
|
+
"cli.uninstall.wizard.step.target": "Confirm target",
|
|
697
|
+
"cli.uninstall.wizard.step.plan": "Shape uninstall plan",
|
|
698
|
+
"cli.uninstall.wizard.step.review": "Review final plan",
|
|
699
|
+
"cli.uninstall.wizard.target.confirm": "Continue uninstalling Fabric from {target}? [Y/n]",
|
|
700
|
+
"cli.uninstall.wizard.stage.scaffold": "Remove scaffold artifacts? [{defaultValue}]",
|
|
701
|
+
"cli.uninstall.wizard.stage.bootstrap": "Remove bootstrap (Skills + hooks)? [{defaultValue}]",
|
|
702
|
+
"cli.uninstall.wizard.stage.mcp": "Un-register MCP clients? [{defaultValue}]",
|
|
703
|
+
"cli.uninstall.wizard.execute.confirm": "Execute this uninstall plan now? [Y/n]",
|
|
704
|
+
"cli.uninstall.wizard.outro": "Uninstall plan accepted. Running Fabric uninstall...",
|
|
705
|
+
"cli.uninstall.wizard.cancelled": "Fabric uninstall cancelled before execution.",
|
|
706
|
+
"cli.uninstall.confirm.proceed": "Proceed with uninstalling Fabric from {target}? [y/N]",
|
|
707
|
+
"cli.uninstall.errors.target-not-directory": "Target must be an existing directory: {path}",
|
|
708
|
+
"cli.ledger-append.description": "Append an entry to the Fabric intent ledger.",
|
|
709
|
+
"cli.ledger-append.args.target.description": "Target project path, default is the current working directory.",
|
|
710
|
+
"cli.ledger-append.args.staged.description": "Derive the entry from staged changes (used during pre-commit).",
|
|
711
|
+
"cli.ledger-append.requires-staged": "requires --staged in pre-commit context",
|
|
712
|
+
"cli.ledger-append.intent.auto": "auto: {head}{suffix}",
|
|
713
|
+
"cli.ledger-append.intent.auto-more": " +{count} more",
|
|
714
|
+
"cli.pre-commit.description": "Composite pre-commit hook: runs sync-meta --check-only, human-lint, and ledger-append --staged in one Node process.",
|
|
715
|
+
"cli.pre-commit.args.target.description": "Project root directory, defaults to cwd or EXTERNAL_FIXTURE_PATH.",
|
|
716
|
+
"cli.pre-commit.run-failed": "fabric pre-commit: {name} failed - {message}",
|
|
717
|
+
"cli.scan.description": "Scan the project to detect Fabric bootstrap candidates.",
|
|
718
|
+
"cli.scan.args.target.description": "Target absolute path. Defaults to --target, then EXTERNAL_FIXTURE_PATH, then cwd.",
|
|
719
|
+
"cli.scan.args.debug.description": "Print detection evidence in formatted output.",
|
|
720
|
+
"cli.scan.args.json.description": "Print the diagnostic report as JSON.",
|
|
721
|
+
"cli.scan.error.missing-forensic": "forensic.json not found at {path}; run `fabric install` first to produce the deterministic project snapshot.",
|
|
722
|
+
"cli.scan.summary.created": "Wrote {count} knowledge entries to .fabric/knowledge/.",
|
|
723
|
+
"cli.scan.summary.skipped": "No changes detected; {count} entries already up-to-date.",
|
|
724
|
+
"cli.scan.report.title": "Fabric scan report",
|
|
725
|
+
"cli.scan.report.target": "Target",
|
|
726
|
+
"cli.scan.report.framework": "Framework",
|
|
727
|
+
"cli.scan.report.evidence": "Evidence",
|
|
728
|
+
"cli.scan.report.readme-quality": "README quality",
|
|
729
|
+
"cli.scan.report.contributing": "CONTRIBUTING.md",
|
|
730
|
+
"cli.scan.report.files-counted": "Files counted",
|
|
731
|
+
"cli.scan.report.ignored-entries": "Ignored entries",
|
|
732
|
+
"cli.scan.report.existing-fabric": "Existing Fabric files",
|
|
733
|
+
"cli.scan.report.recommendations": "Recommendations:",
|
|
734
|
+
"cli.scan.readme-quality.ok": "ok",
|
|
735
|
+
"cli.scan.readme-quality.stub": "stub",
|
|
736
|
+
"cli.scan.recommendation.init": "L0: Run fabric install to scaffold `.fabric/AGENTS.md` with the canonical Fabric bootstrap content.",
|
|
737
|
+
"cli.scan.recommendation.readme": "L0: Expand README.md before promoting project facts into Fabric references.",
|
|
738
|
+
"cli.scan.recommendation.contributing": "L0: Add CONTRIBUTING.md or leave a bootstrap TODO reference for contribution flow.",
|
|
739
|
+
"cli.scan.recommendation.unknown-framework": "L1: Add tech-stack TODOs manually because no framework marker was detected.",
|
|
740
|
+
"cli.scan.recommendation.framework-dirs": "L1: Review {framework} directories for future scoped Fabric rule files.",
|
|
741
|
+
// v2.0.0-rc.37 Wave A2 Part 2: cli.serve.* + FABRIC_AUTH_TOKEN keys removed
|
|
742
|
+
// alongside `fabric serve` quarantine to packages/server-http-experimental/
|
|
743
|
+
// per [[fabric-serve-quarantine-not-delete]]. Restore from git history when
|
|
744
|
+
// the web UI surface is re-enabled.
|
|
745
|
+
// v2.0.0-rc.29 TASK-008 (BUG-L2): onboard-coverage i18n keys.
|
|
746
|
+
"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.",
|
|
747
|
+
"cli.onboard-coverage.args.json.description": "Emit machine-readable JSON to stdout instead of the human table.",
|
|
748
|
+
"cli.onboard-coverage.args.target.description": "Override the project root (defaults to cwd).",
|
|
749
|
+
"cli.update.description": "Refresh MCP host configuration and git hooks without re-creating Fabric files.",
|
|
750
|
+
"cli.update.args.target.description": "Target project path. Defaults to --target, then EXTERNAL_FIXTURE_PATH, then cwd.",
|
|
751
|
+
"cli.update.args.no-mcp.description": "Skip re-configuring MCP clients",
|
|
752
|
+
"cli.update.args.no-hooks.description": "Skip re-installing git hooks",
|
|
753
|
+
"cli.sync-meta.description": "Sync Fabric metadata from internal rule files.",
|
|
754
|
+
"cli.sync-meta.args.target.description": "Target project path, default is the current working directory.",
|
|
755
|
+
"cli.sync-meta.args.check-only.description": "Exit with code 1 when .fabric/agents.meta.json is out of date.",
|
|
756
|
+
"cli.sync-meta.drift-detected": "Fabric metadata drift detected. Run fabric sync-meta to update.",
|
|
757
|
+
"cli.sync-meta.updated": "{label} {path}",
|
|
758
|
+
"dashboard.app.nav.aria-label": "Dashboard views",
|
|
759
|
+
"dashboard.app.nav.readiness.label": "Readiness",
|
|
760
|
+
"dashboard.app.nav.readiness.label-bilingual": "\u51C6\u5907\u60C5\u51B5 Readiness",
|
|
761
|
+
"dashboard.app.nav.readiness.subtitle": "project status",
|
|
762
|
+
"dashboard.app.nav.rules-explain.label": "Rules Explain",
|
|
763
|
+
"dashboard.app.nav.rules-explain.label-bilingual": "\u89C4\u5219\u89E3\u6790 Rules Explain",
|
|
764
|
+
"dashboard.app.nav.rules-explain.subtitle": "topology & context",
|
|
765
|
+
"dashboard.app.nav.timeline.label": "Timeline",
|
|
766
|
+
"dashboard.app.nav.timeline.label-bilingual": "\u65F6\u95F4\u7EBF Timeline",
|
|
767
|
+
"dashboard.app.nav.timeline.subtitle": "audit & history",
|
|
768
|
+
"dashboard.app.nav.health.label": "Health",
|
|
769
|
+
"dashboard.app.nav.health.label-bilingual": "\u7CFB\u7EDF\u5065\u5EB7 Health",
|
|
770
|
+
"dashboard.app.nav.health.subtitle": "doctor & diagnostics",
|
|
771
|
+
"dashboard.app.nav.section.insights": "Insights",
|
|
772
|
+
"dashboard.app.nav.drift-check": "Drift Check",
|
|
773
|
+
"dashboard.app.nav.modules.read-only": "read-only dashboard",
|
|
774
|
+
"dashboard.app.header.connected": "CONNECTED",
|
|
775
|
+
"dashboard.app.header.connecting": "CONNECTING",
|
|
776
|
+
"dashboard.app.live-region.received": "Received {type}",
|
|
777
|
+
"dashboard.app.breadcrumb.readiness": "readiness",
|
|
778
|
+
"dashboard.app.breadcrumb.rules-explain": "rules-explain",
|
|
779
|
+
"dashboard.app.breadcrumb.timeline": "timeline",
|
|
780
|
+
"dashboard.app.breadcrumb.health": "health",
|
|
781
|
+
"dashboard.rule-topology.title": "Rule Topology",
|
|
782
|
+
"dashboard.rule-topology.subtitle": "See which rules match the current path and why",
|
|
783
|
+
"dashboard.rule-topology.path.placeholder": "Sample path for rules context",
|
|
784
|
+
"dashboard.rule-topology.path.aria-label": "Rules context sample path",
|
|
785
|
+
"dashboard.rule-topology.status.sample": "current path {path}",
|
|
786
|
+
"dashboard.rule-topology.status.hits": "{count} hits",
|
|
787
|
+
"dashboard.rule-topology.status.revision": "version {revision}",
|
|
788
|
+
"dashboard.rule-topology.heatmap.title": "Coverage Heatmap",
|
|
789
|
+
"dashboard.rule-topology.heatmap.subtitle": "Heuristic directory coverage derived from scope_glob patterns",
|
|
790
|
+
"dashboard.rule-topology.heatmap.aria-label": "Directory coverage heatmap",
|
|
791
|
+
"dashboard.rule-topology.heatmap.count": "{count} directories",
|
|
792
|
+
"dashboard.rule-topology.heatmap.rules": "{count} rules",
|
|
793
|
+
"dashboard.rule-topology.heatmap.uncovered": "no matching scope",
|
|
794
|
+
"dashboard.rule-topology.heatmap.empty": "No rule directories available.",
|
|
795
|
+
"dashboard.rule-topology.heatmap.density.full": "covered",
|
|
796
|
+
"dashboard.rule-topology.heatmap.density.partial": "partial",
|
|
797
|
+
"dashboard.rule-topology.heatmap.density.none": "uncovered",
|
|
798
|
+
"dashboard.rule-topology.hit-reason.title": "Hit Reasons",
|
|
799
|
+
"dashboard.rule-topology.hit-reason.subtitle": "Why each rule was loaded for the current sample path",
|
|
800
|
+
"dashboard.rule-topology.hit-reason.aria-label": "Rule hit reasons",
|
|
801
|
+
"dashboard.rule-topology.hit-reason.count": "{count} reasons",
|
|
802
|
+
"dashboard.rule-topology.hit-reason.empty": "No rules loaded for this sample path.",
|
|
803
|
+
"dashboard.rule-topology.hit-reason.global": "Global",
|
|
804
|
+
"dashboard.rule-topology.hit-reason.tier.always": "Always-on",
|
|
805
|
+
"dashboard.rule-topology.hit-reason.tier.path": "Glob",
|
|
806
|
+
"dashboard.rule-topology.hit-reason.tier.description": "Description",
|
|
807
|
+
"dashboard.module-placeholder.coming-soon": "Reserved",
|
|
808
|
+
"dashboard.module-placeholder.read-only": "Reserved for future read-only dashboard capabilities.",
|
|
809
|
+
"dashboard.module-placeholder.forensic.title": "Cognitive Forensic",
|
|
810
|
+
"dashboard.module-placeholder.forensic.subtitle": "Coming later",
|
|
811
|
+
"dashboard.module-placeholder.semantic.title": "Semantic Timeline",
|
|
812
|
+
"dashboard.module-placeholder.semantic.subtitle": "Coming later",
|
|
813
|
+
"dashboard.module-placeholder.ledger.title": "Historical Ledger",
|
|
814
|
+
"dashboard.module-placeholder.ledger.subtitle": "Coming later",
|
|
815
|
+
"dashboard.rules-tree.title": "Rules Tree",
|
|
816
|
+
"dashboard.rules-tree.subtitle": "Browse the rule structure, hierarchy, and sync state from .fabric/agents.meta.json",
|
|
817
|
+
"dashboard.rules-tree.filter.placeholder": "Filter by file, glob, priority, hash...",
|
|
818
|
+
"dashboard.rules-tree.filter.aria-label": "Filter rules tree",
|
|
819
|
+
"dashboard.rules-tree.status.loading": "loading rules",
|
|
820
|
+
"dashboard.rules-tree.status.nodes": "{count} nodes \xB7 version {revision}",
|
|
821
|
+
"dashboard.rules-tree.status.locks": "{count} protected regions",
|
|
822
|
+
"dashboard.rules-tree.empty": "No matching rules found.",
|
|
823
|
+
"dashboard.rules-tree.tree.aria-label": "Fabric rules tree",
|
|
824
|
+
"dashboard.rules-tree.detail.title": "Node Detail",
|
|
825
|
+
"dashboard.rules-tree.detail.empty": "Select a rule node to inspect scope, dependencies, priority and hash.",
|
|
826
|
+
"dashboard.rules-tree.detail.file": "file",
|
|
827
|
+
"dashboard.rules-tree.detail.scope": "scope",
|
|
828
|
+
"dashboard.rules-tree.detail.priority": "priority",
|
|
829
|
+
"dashboard.rules-tree.detail.hash": "hash",
|
|
830
|
+
"dashboard.rules-tree.detail.no-deps": "no deps",
|
|
831
|
+
"dashboard.human-lock.title": "Human Protection",
|
|
832
|
+
"dashboard.human-lock.subtitle": "Review protected regions that require human confirmation",
|
|
833
|
+
"dashboard.human-lock.filters.aria-label": "Human lock filters",
|
|
834
|
+
"dashboard.human-lock.filters.all": "all",
|
|
835
|
+
"dashboard.human-lock.filters.drift": "drift",
|
|
836
|
+
"dashboard.human-lock.filters.approved": "approved",
|
|
837
|
+
"dashboard.human-lock.summary": "{drift} drift \xB7 {approved} confirmed",
|
|
838
|
+
"dashboard.human-lock.empty": "No human lock entries for this filter.",
|
|
839
|
+
"dashboard.intent-timeline.title": "Intent Timeline",
|
|
840
|
+
"dashboard.intent-timeline.subtitle": "Review AI and human change records in reverse chronological order",
|
|
841
|
+
"dashboard.intent-timeline.filter.label": "Source",
|
|
842
|
+
"dashboard.intent-timeline.filter.all": "All",
|
|
843
|
+
"dashboard.intent-timeline.summary": "AI {aiCount} \xB7 Human {humanCount}",
|
|
844
|
+
"dashboard.intent-timeline.columns.ai.title": "AI",
|
|
845
|
+
"dashboard.intent-timeline.columns.ai.entries": "{count} entries",
|
|
846
|
+
"dashboard.intent-timeline.columns.human.title": "Human",
|
|
847
|
+
"dashboard.intent-timeline.columns.human.entries": "{count} entries",
|
|
848
|
+
"dashboard.intent-timeline.empty": "No ledger entries found.",
|
|
849
|
+
"dashboard.intent-timeline.annotate.missing-id": "Cannot annotate a ledger entry without an id.",
|
|
850
|
+
"dashboard.history-replay.title": "History Replay",
|
|
851
|
+
"dashboard.history-replay.subtitle": "Review the rules tree state at any recorded point in history",
|
|
852
|
+
"dashboard.history-replay.toolbar.scrub": "Scrub",
|
|
853
|
+
"dashboard.history-replay.toolbar.latest": "Latest",
|
|
854
|
+
"dashboard.history-replay.selected.none": "No historical entry selected",
|
|
855
|
+
"dashboard.history-replay.status.replay-points": "{count} replay points",
|
|
856
|
+
"dashboard.history-replay.status.entries-applied": "{count} entries applied",
|
|
857
|
+
"dashboard.history-replay.empty.entries": "No ledger entries found for replay.",
|
|
858
|
+
"dashboard.history-replay.state.title": "Viewing state as of {label}",
|
|
859
|
+
"dashboard.history-replay.state.meta": "record {ledgerId} \xB7 commit {commit} \xB7 {mode}",
|
|
860
|
+
"dashboard.history-replay.status.loading": "loading snapshot",
|
|
861
|
+
"dashboard.history-replay.status.nodes": "{count} nodes",
|
|
862
|
+
"dashboard.history-replay.status.unknown-revision": "unknown version",
|
|
863
|
+
"dashboard.history-replay.tree.aria-label": "Historical Fabric rules tree",
|
|
864
|
+
"dashboard.history-replay.empty.loading": "Loading historical snapshot...",
|
|
865
|
+
"dashboard.history-replay.empty.select": "Select a timeline entry to replay its state.",
|
|
866
|
+
"dashboard.history-replay.meta.not-available": "unavailable",
|
|
867
|
+
"dashboard.history-replay.meta.pending": "pending",
|
|
868
|
+
"dashboard.history-replay.meta.na": "n/a",
|
|
869
|
+
"dashboard.doctor.title": "Doctor Console",
|
|
870
|
+
"dashboard.doctor.subtitle": "Check framework, entry points, version drift, and protected paths",
|
|
871
|
+
"dashboard.doctor.toolbar.overall": "Overall",
|
|
872
|
+
"dashboard.doctor.toolbar.no-summary": "No summary yet",
|
|
873
|
+
"dashboard.doctor.toolbar.entry-points-summary": "{framework} \xB7 {count} entry points",
|
|
874
|
+
"dashboard.doctor.toolbar.entry-point-summary": "{framework} \xB7 {count} entry point",
|
|
875
|
+
"dashboard.doctor.empty.loading": "Loading doctor report...",
|
|
876
|
+
"dashboard.doctor.summary.framework": "Framework",
|
|
877
|
+
"dashboard.doctor.summary.protected-paths": "Protected paths",
|
|
878
|
+
"dashboard.doctor.summary.intent-ledger": "Intent ledger",
|
|
879
|
+
"dashboard.doctor.summary.no-meta-revision": "No metadata version yet",
|
|
880
|
+
"dashboard.doctor.summary.tracked-paths.none": "No tracked paths",
|
|
881
|
+
"dashboard.doctor.summary.tracked-paths.some": "{count} tracked",
|
|
882
|
+
"dashboard.doctor.summary.hashes-intact": "All approved hashes intact",
|
|
883
|
+
"dashboard.doctor.summary.drifted": "{count} drifted",
|
|
884
|
+
"dashboard.doctor.summary.no-ledger-entries": "No ledger entries yet",
|
|
885
|
+
"dashboard.doctor.card.entry-points": "Entry points",
|
|
886
|
+
"dashboard.doctor.card.checks": "Checks",
|
|
887
|
+
"dashboard.doctor.empty.entry-points": "No current entry points detected.",
|
|
888
|
+
"dashboard.doctor.framework.unknown": "unknown",
|
|
889
|
+
"dashboard.doctor.age.none": "No entries",
|
|
890
|
+
"dashboard.doctor.age.seconds": "{count}s ago",
|
|
891
|
+
"dashboard.doctor.age.minutes": "{count}m ago",
|
|
892
|
+
"dashboard.doctor.age.hours": "{count}h ago",
|
|
893
|
+
"dashboard.doctor.age.days": "{count}d ago",
|
|
894
|
+
"dashboard.doctor.age.weeks": "{count}w ago",
|
|
895
|
+
"dashboard.shared.refresh": "Refresh",
|
|
896
|
+
"dashboard.shared.loading": "loading",
|
|
897
|
+
"dashboard.shared.status.ok": "ok",
|
|
898
|
+
"dashboard.shared.status.warn": "warn",
|
|
899
|
+
"dashboard.shared.status.error": "error",
|
|
900
|
+
"dashboard.shared.status.confirmed": "confirmed",
|
|
901
|
+
"dashboard.shared.status.hash-drift": "hash drift",
|
|
902
|
+
"dashboard.shared.status.stale": "stale",
|
|
903
|
+
"dashboard.shared.status.orphan": "orphan",
|
|
904
|
+
"dashboard.shared.status.attention": "attention",
|
|
905
|
+
"dashboard.source.ai": "AI",
|
|
906
|
+
"dashboard.source.human": "Human",
|
|
907
|
+
"dashboard.timeline-entry.aria-label": "{source} intent {intent}",
|
|
908
|
+
"dashboard.timeline-entry.working-tree": "working tree",
|
|
909
|
+
"dashboard.timeline-entry.parent": "parent {parent}",
|
|
910
|
+
"dashboard.timeline-entry.paths": "paths",
|
|
911
|
+
"dashboard.timeline-entry.annotate": "Annotate",
|
|
912
|
+
"dashboard.timeline-entry.annotation-label": "Human annotation",
|
|
913
|
+
"dashboard.timeline-entry.annotation-placeholder": "Explain review outcome or approval context...",
|
|
914
|
+
"dashboard.timeline-entry.annotation-save": "Save annotation",
|
|
915
|
+
"dashboard.tree-node.locked": "locked",
|
|
916
|
+
"dashboard.tree-node.stale.hash-mismatch": "hash mismatch",
|
|
917
|
+
"dashboard.tree-node.stale.orphan": "orphan",
|
|
918
|
+
"dashboard.lock-card.aria-label": "{file} {lineRange} {status}",
|
|
919
|
+
"dashboard.lock-card.status.drift": "hash drift",
|
|
920
|
+
"dashboard.lock-card.status.confirmed": "confirmed",
|
|
921
|
+
"dashboard.lock-card.hash.locked": "locked hash",
|
|
922
|
+
"dashboard.lock-card.hash.current": "current hash",
|
|
923
|
+
"dashboard.lock-card.hash.diff": "diff",
|
|
924
|
+
"dashboard.lock-card.preview.drift": "DRIFT",
|
|
925
|
+
"dashboard.lock-card.preview.sync": "SYNC",
|
|
926
|
+
"dashboard.lock-card.preview.drift-detail": "Hash differs from protected region.",
|
|
927
|
+
"dashboard.lock-card.preview.sync-detail": "Protected region is in sync.",
|
|
928
|
+
"dashboard.lock-card.footer.region": "protected region \xB7 {count} lines",
|
|
929
|
+
"dashboard.lock-card.button.approve": "Approve new hash",
|
|
930
|
+
"dashboard.lock-card.button.confirmed": "Confirmed",
|
|
931
|
+
"dashboard.lock-card.diff.hash-mismatch": "hash mismatch",
|
|
932
|
+
"dashboard.lock-card.diff.no-changes": "no changes",
|
|
933
|
+
"dashboard.lock-card.diff.with-bytes": "+{added} / -{removed} \xB7 {bytes} bytes",
|
|
934
|
+
"dashboard.lock-card.diff.without-bytes": "+{added} / -{removed}",
|
|
935
|
+
"dashboard.approve-button.retry": "Retry",
|
|
936
|
+
"dashboard.readiness.filter.analysis": "Project Analysis",
|
|
937
|
+
"dashboard.readiness.loading": "Loading scan data...",
|
|
938
|
+
"dashboard.readiness.summary.framework": "Framework",
|
|
939
|
+
"dashboard.readiness.summary.files": "Files",
|
|
940
|
+
"dashboard.readiness.summary.status": "Fabric Status",
|
|
941
|
+
"dashboard.readiness.card.evidence": "Readiness Evidence",
|
|
942
|
+
"dashboard.readiness.card.recommendations": "Recommendations & Next Steps",
|
|
943
|
+
"dashboard.readiness.readme.description": "Quality of project documentation",
|
|
944
|
+
"dashboard.readiness.contributing.description": "Contribution guidelines for AI/Human",
|
|
945
|
+
"dashboard.readiness.fully-ready": "Project is fully ready.",
|
|
946
|
+
"dashboard.readiness.init-prompt": "Run this command to initialize:",
|
|
947
|
+
"dashboard.rules-explain.analyze": "Analyze Path",
|
|
948
|
+
"dashboard.rules-explain.detail.topology-type": "Topology Type",
|
|
949
|
+
"dashboard.timeline.history-replay.title": "History Replay",
|
|
950
|
+
"dashboard.timeline.close": "Close",
|
|
951
|
+
"dashboard.health.ledger-path.label": "Event Ledger Path",
|
|
952
|
+
"dashboard.health.ledger-path.detail": "Append-only timeline source",
|
|
953
|
+
"dashboard.health.boundary.title": "Control Plane Boundaries",
|
|
954
|
+
"dashboard.health.boundary.description": "The Web Dashboard operates as a Viewer. All rules, metadata, and fixes must be managed via the CLI.",
|
|
955
|
+
"dashboard.health.boundary.cli-action": "CLI Action Required:",
|
|
956
|
+
"dashboard.health.boundary.cli-prompt": "You have {count} fixable issues. Run the following command in your terminal to repair metadata automatically.",
|
|
957
|
+
"dashboard.health.runtime.connected": "MCP Runtime Connected",
|
|
958
|
+
"dashboard.health.runtime.disconnected": "MCP Runtime Disconnected"
|
|
959
|
+
};
|
|
960
|
+
|
|
961
|
+
// src/i18n/locales/zh-CN.ts
|
|
962
|
+
var zhCNMessages = {
|
|
963
|
+
"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\n\n\u4E09\u6B65\u5FC3\u667A\u6A21\u578B\uFF1A\n \u88C5 (install) - fabric install \u4E00\u952E\u5B8C\u6210\u9879\u76EE\u521D\u59CB\u5316\n \u914D (config) - fabric config \u6253\u5F00\u4EA4\u4E92\u5F0F\u914D\u7F6E\u9762\u677F\n \u8DD1 (run) - fabric serve \u542F\u52A8\u672C\u5730 MCP HTTP \u670D\u52A1\n fabric doctor \u8FD0\u884C\u76EE\u6807\u6001\u8BCA\u65AD\n\n\u793A\u4F8B\uFF1A\n fabric install \u5728\u5F53\u524D\u9879\u76EE\u4E2D\u5B89\u88C5 Fabric\n fabric config \u6253\u5F00\u4EA4\u4E92\u5F0F\u914D\u7F6E\u9762\u677F\n fabric serve --port 7373 \u542F\u52A8 MCP HTTP \u670D\u52A1\n fabric doctor --fix \u4FEE\u590D Fabric \u6D3E\u751F\u72B6\u6001\n fabric uninstall --dry-run \u9884\u89C8\u5378\u8F7D\uFF0C\u4E0D\u5220\u9664\u6587\u4EF6",
|
|
964
|
+
"cli.shared.created": "\u5DF2\u521B\u5EFA",
|
|
965
|
+
"cli.shared.skipped": "\u5DF2\u8DF3\u8FC7",
|
|
966
|
+
"cli.shared.next": "\u4E0B\u4E00\u6B65",
|
|
967
|
+
"cli.shared.reason": "\u539F\u56E0",
|
|
968
|
+
"cli.shared.updated": "\u5DF2\u66F4\u65B0",
|
|
969
|
+
"cli.shared.missing": "\u7F3A\u5931",
|
|
970
|
+
"cli.shared.present": "\u5B58\u5728",
|
|
971
|
+
"cli.shared.absent": "\u7F3A\u5931",
|
|
972
|
+
"cli.shared.yes": "\u662F",
|
|
973
|
+
"cli.shared.no": "\u5426",
|
|
974
|
+
"cli.shared.none": "\u65E0",
|
|
975
|
+
"cli.shared.loading": "\u52A0\u8F7D\u4E2D",
|
|
976
|
+
"cli.shared.refresh": "\u5237\u65B0",
|
|
977
|
+
"cli.shared.target-invalid": "\u76EE\u6807\u5FC5\u987B\u662F\u5DF2\u5B58\u5728\u7684\u76EE\u5F55\uFF1A{target}",
|
|
978
|
+
"cli.shared.template-not-found": "\u672A\u627E\u5230\u6A21\u677F\uFF1A{path}",
|
|
979
|
+
"cli.shared.invalid-host-empty": "\u65E0\u6548 host\uFF1A<empty>",
|
|
980
|
+
"cli.shared.invalid-port": "\u65E0\u6548\u7AEF\u53E3\uFF1A{value}",
|
|
981
|
+
"cli.shared.error": "\u9519\u8BEF",
|
|
982
|
+
"cli.approve.description": "\u4ECE\u547D\u4EE4\u884C\u6279\u51C6\u5DF2\u6F02\u79FB\u7684 human-lock \u8BB0\u5F55\u3002",
|
|
983
|
+
"cli.approve.args.all.description": "\u4E0D\u63D0\u793A\uFF0C\u6279\u51C6\u6240\u6709\u5DF2\u6F02\u79FB\u7684 human-lock \u8BB0\u5F55\u3002",
|
|
984
|
+
"cli.approve.args.interactive.description": "\u9010\u6761\u63D0\u793A\u540E\u6279\u51C6\u5DF2\u6F02\u79FB\u7684 human-lock \u8BB0\u5F55\u3002",
|
|
985
|
+
"cli.approve.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
|
|
986
|
+
"cli.approve.no-drift": "\u672A\u53D1\u73B0\u6F02\u79FB\u8BB0\u5F55\u3002",
|
|
987
|
+
"cli.approve.prompt": "\u6279\u51C6\u6B64\u8BB0\u5F55\uFF1F[y/N] ",
|
|
988
|
+
"cli.approve.approved-one": "\u5DF2\u6279\u51C6 {location}",
|
|
989
|
+
"cli.approve.skipped-one": "\u5DF2\u8DF3\u8FC7 {location}",
|
|
990
|
+
"cli.approve.summary": "\u5DF2\u6279\u51C6 {approved}/{total} \u6761\u6F02\u79FB\u8BB0\u5F55\u3002\u5DF2\u8DF3\u8FC7 {skipped} \u6761\u3002",
|
|
991
|
+
"cli.approve.table.expected": "\u9884\u671F",
|
|
992
|
+
"cli.approve.table.current": "\u5F53\u524D",
|
|
993
|
+
"cli.bootstrap.description": "\u4E3A\u652F\u6301\u7684 AI \u5BA2\u6237\u7AEF\u5B89\u88C5 Fabric \u5F15\u5BFC\u63D0\u793A\u6A21\u677F\u3002",
|
|
994
|
+
"cli.bootstrap.install.description": "\u5C06 Fabric \u5F15\u5BFC\u6A21\u677F\u590D\u5236\u5230\u5404\u5BA2\u6237\u7AEF\u7684\u539F\u751F\u4F4D\u7F6E\u3002",
|
|
995
|
+
"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",
|
|
996
|
+
"cli.bootstrap.install.no-targets": "\u672A\u68C0\u6D4B\u5230\u53EF\u5B89\u88C5\u7684 bootstrap \u76EE\u6807\u3002\u53EF\u663E\u5F0F\u4F20\u5165 --clients claude,cursor,codex\u3002",
|
|
997
|
+
"cli.bootstrap.install.installed": "\u5DF2\u5B89\u88C5 {path}",
|
|
998
|
+
"cli.bootstrap.install.skipped-header": "\u5DF2\u8DF3\u8FC7 {path}\uFF1AFabric Bootstrap \u5934\u90E8\u5DF2\u5B58\u5728\u3002",
|
|
999
|
+
"cli.bootstrap.install.prepended": "\u5DF2\u524D\u7F6E\u5199\u5165 {path}",
|
|
1000
|
+
"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",
|
|
1001
|
+
"cli.config.description": "\u6253\u5F00 Fabric \u4EA4\u4E92\u5F0F\u914D\u7F6E\u9762\u677F\uFF08\u8BED\u8A00\u3001\u77E5\u8BC6\u5C42\u3001\u5BA1\u8BA1\u6A21\u5F0F\u3001\u63D0\u793A\u7A97\u53E3\u3001MCP \u5BA2\u6237\u7AEF\u914D\u7F6E\u7B49\uFF09\u3002\n\n\u793A\u4F8B\uFF1A\n fabric config \u6253\u5F00\u4EA4\u4E92\u5F0F\u9762\u677F\n fabric config --target /path \u7F16\u8F91\u6307\u5B9A\u9879\u76EE\u7684\u914D\u7F6E",
|
|
1002
|
+
"cli.config.args.target.description": "\u76EE\u6807\u9879\u76EE\u76EE\u5F55\uFF08\u9ED8\u8BA4\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\uFF09\u3002",
|
|
1003
|
+
"cli.config.clients.claude": "Claude Code CLI",
|
|
1004
|
+
"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",
|
|
1005
|
+
"cli.config.install.args.clients.description": "\u53EF\u9009\u7684\u9017\u53F7\u5206\u9694\u5BA2\u6237\u7AEF\u8FC7\u6EE4\u5668\uFF0C\u4F8B\u5982 cursor,codex\u3002",
|
|
1006
|
+
"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",
|
|
1007
|
+
"cli.config.errors.unknown-client": "\u672A\u77E5\u5BA2\u6237\u7AEF\u201C{client}\u201D\u3002\u8BF7\u4F7F\u7528\u9017\u53F7\u5206\u9694\u5217\u8868\uFF0C\u4F8B\u5982 cursor,codex\u3002",
|
|
1008
|
+
"cli.config.errors.expected-object": "{path} \u4E2D\u5E94\u4E3A\u5BF9\u8C61\u3002",
|
|
1009
|
+
"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",
|
|
1010
|
+
"cli.config.install.no-config-path": "\u8DF3\u8FC7 {client}\uFF1A\u672A\u68C0\u6D4B\u5230\u914D\u7F6E\u8DEF\u5F84\u3002",
|
|
1011
|
+
"cli.config.install.dry-run": "[dry-run] {client}\uFF1A\u5C06\u5199\u5165 {path}",
|
|
1012
|
+
"cli.config.install.wrote": "{client}\uFF1A\u5DF2\u5199\u5165 {path}",
|
|
1013
|
+
// rc.16 TASK-006 (F1-panel): clack 驱动的 `fabric config` 交互式面板。
|
|
1014
|
+
// 由 packages/cli/src/commands/config.ts(菜单循环 + 字段编辑)以及
|
|
1015
|
+
// getPanelFields() 的 label_i18n_key 引用消费。
|
|
1016
|
+
"cli.config.intro": "Fabric \u914D\u7F6E",
|
|
1017
|
+
"cli.config.outro": "\u914D\u7F6E\u5DF2\u4FDD\u5B58\u3002",
|
|
1018
|
+
"cli.config.outro-no-changes": "\u672A\u505A\u4EFB\u4F55\u4FEE\u6539\u3002",
|
|
1019
|
+
"cli.config.cancel": "\u5DF2\u53D6\u6D88\u3002",
|
|
1020
|
+
"cli.config.non-tty-notice": "fabric config \u9700\u8981\u5728\u4EA4\u4E92\u5F0F\u7EC8\u7AEF\u4E2D\u8FD0\u884C\u3002\u8BF7\u5728 TTY \u4E2D\u6267\u884C\u4EE5\u7F16\u8F91\u914D\u7F6E\u5B57\u6BB5\u3002",
|
|
1021
|
+
"cli.config.menu.field-select": "\u9009\u62E9\u8981\u7F16\u8F91\u7684\u5B57\u6BB5\uFF1A",
|
|
1022
|
+
"cli.config.menu.exit": "\u9000\u51FA",
|
|
1023
|
+
"cli.config.value.current": "\u5F53\u524D\uFF1A{value}",
|
|
1024
|
+
"cli.config.value.default-marker": "\uFF08\u9ED8\u8BA4\uFF09",
|
|
1025
|
+
"cli.config.prompt.select": "\u4E3A {key} \u9009\u62E9\u65B0\u503C\uFF08\u5F53\u524D\uFF1A{current}\uFF09\uFF1A",
|
|
1026
|
+
"cli.config.prompt.text": "\u4E3A {key} \u8F93\u5165\u65B0\u503C\uFF08\u5F53\u524D\uFF1A{current}\uFF09\uFF1A",
|
|
1027
|
+
"cli.config.write.success": "\u5DF2\u4FDD\u5B58 {key} = {value}",
|
|
1028
|
+
"cli.config.write.failure": "\u5199\u5165 fabric-config.json \u5931\u8D25\uFF1A{message}",
|
|
1029
|
+
"cli.config.errors.uninit-workspace.message": "\u5DE5\u4F5C\u533A\u5C1A\u672A\u521D\u59CB\u5316\u3002\u8BF7\u5148\u8FD0\u884C `fabric install`\u3002",
|
|
1030
|
+
"cli.config.errors.invalid-int": "\u5FC5\u987B\u662F\u6B63\u6574\u6570\u3002",
|
|
1031
|
+
"cli.config.errors.unknown-field": "\u672A\u77E5\u5B57\u6BB5\u9009\u62E9 \u2014 \u5DF2\u8DF3\u8FC7\u3002",
|
|
1032
|
+
"cli.config.errors.no-enum-options": "\u8BE5\u5B57\u6BB5\u6CA1\u6709\u53EF\u9009\u679A\u4E3E\u503C \u2014 \u5DF2\u8DF3\u8FC7\u3002",
|
|
1033
|
+
// 11 个面板字段标签(A 组 2 个 + B 组 8 个 + C 组 1 个)。
|
|
1034
|
+
"cli.config.fields.fabric_language.label": "\u8BED\u8A00",
|
|
1035
|
+
"cli.config.fields.fabric_language.description": "Fabric \u94A9\u5B50\u4E0E Skill \u8F93\u51FA\u4F7F\u7528\u7684\u8BED\u8A00\u3002",
|
|
1036
|
+
"cli.config.fields.default_layer_filter.label": "\u9ED8\u8BA4\u77E5\u8BC6\u5C42",
|
|
1037
|
+
"cli.config.fields.default_layer_filter.description": "\u77E5\u8BC6\u5217\u8868\u7684\u9ED8\u8BA4\u5C42\u7EA7\u8303\u56F4\uFF08team / personal / both\uFF09\u3002",
|
|
1038
|
+
"cli.config.fields.archive_hint_hours.label": "\u5F52\u6863\u63D0\u793A\u7A97\u53E3\uFF08\u5C0F\u65F6\uFF09",
|
|
1039
|
+
"cli.config.fields.archive_hint_hours.description": "Signal A \u7528\u4E8E\u68C0\u6D4B\u9891\u7E41\u7F16\u8F91\u7684\u65F6\u95F4\u7A97\u53E3\uFF08\u5C0F\u65F6\uFF09\u3002",
|
|
1040
|
+
"cli.config.fields.archive_hint_cooldown_hours.label": "\u5F52\u6863\u63D0\u793A\u51B7\u5374\uFF08\u5C0F\u65F6\uFF09",
|
|
1041
|
+
"cli.config.fields.archive_hint_cooldown_hours.description": "\u540C\u4E00\u5F52\u6863\u63D0\u793A\u518D\u6B21\u89E6\u53D1\u524D\u7684\u51B7\u5374\u65F6\u95F4\uFF08\u5C0F\u65F6\uFF09\u3002",
|
|
1042
|
+
"cli.config.fields.archive_edit_threshold.label": "\u5F52\u6863\u7F16\u8F91\u9608\u503C",
|
|
1043
|
+
"cli.config.fields.archive_edit_threshold.description": "\u89E6\u53D1 Signal A \u5F52\u6863\u63D0\u793A\u6240\u9700\u7684\u7F16\u8F91\u6B21\u6570\u9608\u503C\u3002",
|
|
1044
|
+
"cli.config.fields.underseed_node_threshold.label": "\u77E5\u8BC6\u8282\u70B9\u4E0D\u8DB3\u9608\u503C",
|
|
1045
|
+
"cli.config.fields.underseed_node_threshold.description": "\u77E5\u8BC6\u8282\u70B9\u6570\u4F4E\u4E8E\u8BE5\u9608\u503C\u65F6\uFF0CFabric \u89C6\u4E3A\u77E5\u8BC6\u5E93\u5C1A\u672A\u5145\u5B9E\u3002",
|
|
1046
|
+
"cli.config.fields.review_hint_pending_count.label": "\u5F85\u5BA1\u6761\u76EE\u6570\u9608\u503C",
|
|
1047
|
+
"cli.config.fields.review_hint_pending_count.description": "\u5F85\u5BA1\u6761\u76EE\u6570\u8D85\u8FC7\u8BE5\u9608\u503C\u65F6\u89E6\u53D1\u5BA1\u6838\u63D0\u793A\u3002",
|
|
1048
|
+
"cli.config.fields.review_hint_pending_age_days.label": "\u5F85\u5BA1\u6761\u76EE\u5E74\u9F84\uFF08\u5929\uFF09",
|
|
1049
|
+
"cli.config.fields.review_hint_pending_age_days.description": "\u5F85\u5BA1\u6761\u76EE\u5B58\u7559\u5929\u6570\u8D85\u8FC7\u8BE5\u9608\u503C\u65F6\u89E6\u53D1\u5BA1\u6838\u63D0\u793A\u3002",
|
|
1050
|
+
"cli.config.fields.maintenance_hint_days.label": "\u7EF4\u62A4\u63D0\u793A\u7A97\u53E3\uFF08\u5929\uFF09",
|
|
1051
|
+
"cli.config.fields.maintenance_hint_days.description": "Fabric \u89E6\u53D1\u77E5\u8BC6\u7EF4\u62A4\u63D0\u793A\u7684\u65F6\u95F4\u7A97\u53E3\uFF08\u5929\uFF09\u3002",
|
|
1052
|
+
"cli.config.fields.maintenance_hint_cooldown_days.label": "\u7EF4\u62A4\u63D0\u793A\u51B7\u5374\uFF08\u5929\uFF09",
|
|
1053
|
+
"cli.config.fields.maintenance_hint_cooldown_days.description": "\u7EF4\u62A4\u63D0\u793A\u518D\u6B21\u89E6\u53D1\u524D\u7684\u51B7\u5374\u65F6\u95F4\uFF08\u5929\uFF09\u3002",
|
|
1054
|
+
"cli.config.fields.audit_mode.label": "\u5BA1\u8BA1\u6A21\u5F0F",
|
|
1055
|
+
"cli.config.fields.audit_mode.description": "human-lock \u4E0E\u6F02\u79FB\u68C0\u6D4B\u7684\u5BA1\u8BA1\u7C92\u5EA6\uFF08strict / warn / off\uFF09\u3002",
|
|
1056
|
+
"cli.doctor.description": "\u8FD0\u884C Fabric \u76EE\u6807\u6001\u8BCA\u65AD\uFF08meta \u540C\u6B65\u3001\u77E5\u8BC6\u7D22\u5F15\u3001bootstrap\u3001events ledger\u3001human-lock \u6F02\u79FB\uFF09\u3002\n\n\u793A\u4F8B\uFF1A\n fabric doctor \u53EA\u8BFB\u8BCA\u65AD\u62A5\u544A\n fabric doctor --fix \u4FEE\u590D\u6D3E\u751F\u72B6\u6001\uFF08meta + \u7D22\u5F15\uFF09\n fabric doctor --fix-knowledge \u5E94\u7528\u77E5\u8BC6\u5E93 lint \u53D8\u66F4\uFF08\u964D\u7EA7 / \u5F52\u6863\uFF09\n fabric doctor --json --strict \u673A\u5668\u53EF\u8BFB\u8F93\u51FA\uFF0Cwarning \u89C6\u4E3A\u5931\u8D25",
|
|
1057
|
+
"doctor.section.fixable": "\u53EF\u4FEE\u590D\u9519\u8BEF\uFF1A",
|
|
1058
|
+
"doctor.section.manual": "\u9700\u624B\u52A8\u4FEE\u590D\uFF1A",
|
|
1059
|
+
"doctor.section.warnings": "\u8B66\u544A\uFF1A",
|
|
1060
|
+
"doctor.section.fix-knowledge-mutations": "Fix-knowledge \u53D8\u66F4\uFF1A",
|
|
1061
|
+
// v2.0.0-rc.29 REVIEW (codex LOW-2): F2 的 payload 阈值之前只出现在 JSON envelope,
|
|
1062
|
+
// 人类输出看不到,导致改了 mcpPayloadLimits 之后没法用 `fabric doctor` 快速确认是否生效。
|
|
1063
|
+
"doctor.section.payload-limits": "MCP payload \u9608\u503C\uFF1A",
|
|
1064
|
+
"doctor.payload-limits.line": "warn={warnKb} KB, hard={hardKb} KB (\u6765\u6E90: {source})",
|
|
1065
|
+
// rc.20 TASK-07: cite-coverage 人类可读格式化键。
|
|
1066
|
+
"doctor.section.cite-coverage": "Cite \u8986\u76D6\u7387:",
|
|
1067
|
+
"doctor.cite.header": "\u8D77\u59CB {since} (\u653F\u7B56\u6FC0\u6D3B\u65F6\u95F4 {marker})",
|
|
1068
|
+
"doctor.cite.warning.justActivated": "\u672C\u6B21\u9996\u6B21\u6FC0\u6D3B Cite policy,\u6682\u65E0\u5386\u53F2\u6570\u636E\u3002",
|
|
1069
|
+
"doctor.cite.metric.editsTouched": "Edit \u89E6\u8FBE\u6570",
|
|
1070
|
+
"doctor.cite.metric.qualifyingCites": "\u5408\u683C cite",
|
|
1071
|
+
"doctor.cite.metric.recalledUnverified": "recalled \u4F46\u672A\u9A8C\u8BC1",
|
|
1072
|
+
"doctor.cite.metric.expectedButMissed": "\u5E94\u67E5\u6CA1\u67E5",
|
|
1073
|
+
"doctor.cite.metric.totalTurns": "\u603B\u56DE\u5408\u6570",
|
|
1074
|
+
"doctor.cite.metric.complianceRate": "cite \u5408\u89C4\u7387 (\u542B KB:none[reason])",
|
|
1075
|
+
"doctor.cite.metric.complianceNA": "N/A (\u65E0\u5E94 cite \u56DE\u5408)",
|
|
1076
|
+
"doctor.cite.metric.uncorrelatableEdits": "\u65E0\u6CD5\u5173\u8054\u7684 edit (\u7F3A session_id \u2014 hook \u8FC7\u671F? \u8BF7\u8DD1 `fabric install`)",
|
|
1077
|
+
"doctor.cite.section.perClient": "\u6309\u5BA2\u6237\u7AEF\u62C6\u5206",
|
|
1078
|
+
"doctor.cite.section.dismissedReasons": "\u9A73\u56DE\u539F\u56E0\u5206\u5E03",
|
|
1079
|
+
"doctor.cite.dismissed.scope-mismatch": "\u8303\u56F4\u4E0D\u7B26",
|
|
1080
|
+
"doctor.cite.dismissed.outdated": "\u5DF2\u8FC7\u671F",
|
|
1081
|
+
"doctor.cite.dismissed.not-applicable": "\u4E0D\u9002\u7528",
|
|
1082
|
+
"doctor.cite.dismissed.other": "\u5176\u4ED6",
|
|
1083
|
+
"doctor.cite.dismissed.unspecified": "\u672A\u6CE8\u660E",
|
|
1084
|
+
"doctor.cite.section.noneReasons": "KB: none \u539F\u56E0\u5206\u5E03",
|
|
1085
|
+
"doctor.cite.none.no-relevant": "\u5DF2\u67E5\u65E0\u53EF\u7528",
|
|
1086
|
+
"doctor.cite.none.not-applicable": "\u4E0D\u5728\u8303\u56F4",
|
|
1087
|
+
"doctor.cite.none.unspecified": "\u672A\u6CE8\u660E",
|
|
1088
|
+
"doctor.cite.status.skipped": "\u672C\u5DE5\u4F5C\u533A Cite policy \u5C1A\u672A\u6FC0\u6D3B\u3002",
|
|
1089
|
+
// v2.0.0-rc.24 TASK-09: cite-coverage 合约审计渲染键(contract-policy 审计窗口)。
|
|
1090
|
+
// 配套 schema:packages/shared/src/schemas/api-contracts.ts citeCoverageReportSchema。
|
|
1091
|
+
// 渲染器消费方:TASK-10 CLI doctor --cite-coverage(layer / type / skip / status / contract)。
|
|
1092
|
+
"cite-coverage.contract.header": "\u5E94\u7528\u5951\u7EA6\u6821\u9A8C",
|
|
1093
|
+
"cite-coverage.contract.decisions_cited": "decisions \u5F15\u7528",
|
|
1094
|
+
"cite-coverage.contract.pitfalls_cited": "pitfalls \u5F15\u7528",
|
|
1095
|
+
"cite-coverage.contract.with": "\u5DF2\u9644\u5951\u7EA6",
|
|
1096
|
+
"cite-coverage.contract.missing": "\u7F3A\u5951\u7EA6",
|
|
1097
|
+
"cite-coverage.contract.hard_violated": "\u786C\u6027\u8FDD\u89C4\uFF08\u64CD\u4F5C\u7B26\u672A\u5339\u914D session \u7F16\u8F91\uFF09",
|
|
1098
|
+
"cite-coverage.contract.cite_id_unresolved": "\u5F15\u7528 ID \u4E0D\u5B58\u5728",
|
|
1099
|
+
"cite-coverage.contract.skip_count": "skip \u6876",
|
|
1100
|
+
"cite-coverage.contract.status.ok": "\u6B63\u5E38",
|
|
1101
|
+
"cite-coverage.contract.status.skipped_bootstrap_drift": "\u5DF2\u8DF3\u8FC7\uFF08bootstrap drift \u2014 \u8BF7\u8FD0\u884C fabric install\uFF09",
|
|
1102
|
+
"cite-coverage.contract.status.awaiting_marker": "\u7B49\u5F85\u9996\u6B21 marker emit",
|
|
1103
|
+
// 复数知识类型(rc.29 BUG-C1: 与统一后的 KnowledgeTypeSchema 枚举字面量逐字对齐)+ 第六桶 unresolved。
|
|
1104
|
+
"cite-coverage.contract.type.decisions": "decisions",
|
|
1105
|
+
"cite-coverage.contract.type.pitfalls": "pitfalls",
|
|
1106
|
+
"cite-coverage.contract.type.models": "models",
|
|
1107
|
+
"cite-coverage.contract.type.guidelines": "guidelines",
|
|
1108
|
+
"cite-coverage.contract.type.processes": "processes",
|
|
1109
|
+
"cite-coverage.contract.type.unresolved": "unresolved",
|
|
1110
|
+
// 知识层标签(per_layer_type 表头 + layer_filter 标识)。
|
|
1111
|
+
"cite-coverage.layer.team": "team",
|
|
1112
|
+
"cite-coverage.layer.personal": "personal",
|
|
1113
|
+
"cite-coverage.layer.team_review": "[team \u2014 \u9700\u590D\u6838]",
|
|
1114
|
+
"cite-coverage.layer.personal_fyi": "[personal \u2014 fyi]",
|
|
1115
|
+
// skip_reason 标准词表(bootstrap 文档定义;运营方可继续扩展词条,渲染器对未知键回退到原始 key)。
|
|
1116
|
+
"cite-coverage.skip.sequencing": "\u987A\u5E8F\u7EA6\u675F",
|
|
1117
|
+
"cite-coverage.skip.conditional": "\u6761\u4EF6\u5206\u652F",
|
|
1118
|
+
"cite-coverage.skip.semantic": "\u8BED\u4E49\u7EA6\u675F",
|
|
1119
|
+
"cite-coverage.skip.aesthetic": "\u7F8E\u5B66/\u98CE\u683C",
|
|
1120
|
+
"cite-coverage.skip.architectural": "\u67B6\u6784\u5C42",
|
|
1121
|
+
"cite-coverage.skip.other": "\u5176\u4ED6",
|
|
1122
|
+
"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",
|
|
1123
|
+
"cli.doctor.args.fix.description": "\u4FEE\u590D Fabric \u6D3E\u751F\u72B6\u6001\uFF08meta + \u7D22\u5F15\uFF09\u3002",
|
|
1124
|
+
"cli.doctor.args.json.description": "\u4EE5 JSON \u8F93\u51FA doctor \u62A5\u544A\u3002",
|
|
1125
|
+
"cli.doctor.args.strict.description": "\u5C06 warning \u4E5F\u89C6\u4E3A\u5931\u8D25\u3002",
|
|
1126
|
+
"cli.doctor.args.fix-knowledge.description": "\u5E94\u7528\u77E5\u8BC6\u5E93 lint \u53D8\u66F4\uFF1A\u964D\u7EA7\u5B64\u7ACB\u7684\u89C4\u8303\u6761\u76EE\u3001\u5F52\u6863\u9648\u65E7 draft\u3001\u4FEE\u6B63\u6F02\u79FB\u7684\u7D22\u5F15\u8BA1\u6570\u5668\u3002\u9ED8\u8BA4 doctor \u8FD0\u884C\u4ECD\u7136\u53EA\u8BFB\u3002",
|
|
1127
|
+
"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",
|
|
1128
|
+
// rc.35 TASK-12 (P0-11): --verbose 展开 maintainer 受众的 remediation。
|
|
1129
|
+
"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",
|
|
1130
|
+
"doctor.maintainer-hint-folded": "(maintainer-only remediation \u2014 \u52A0 `fabric doctor --verbose` \u67E5\u770B)",
|
|
1131
|
+
"cli.doctor.errors.fix-knowledge-fix-mutually-exclusive": "--fix-knowledge \u4E0E --fix \u4E0D\u53EF\u540C\u65F6\u4F7F\u7528\u3002--fix-knowledge \u4FEE\u6539\u7528\u6237\u77E5\u8BC6\u72B6\u6001\uFF08\u964D\u7EA7/\u5F52\u6863\uFF09\uFF1B--fix \u4FEE\u590D\u6D3E\u751F\u72B6\u6001\uFF08meta/\u7D22\u5F15\uFF09\u3002\u8BF7\u5206\u522B\u8FD0\u884C\u3002",
|
|
1132
|
+
// rc.20 TASK-05: --cite-coverage 报告参数;只读,与 --fix/--fix-knowledge 互斥。
|
|
1133
|
+
"cli.doctor.args.cite-coverage.description": "Cite \u653F\u7B56\u5408\u89C4\u62A5\u544A(\u53EA\u8BFB;\u8DF3\u8FC7\u6807\u51C6\u68C0\u67E5)",
|
|
1134
|
+
"cli.doctor.args.since.description": "Cite \u8986\u76D6\u7387\u7EDF\u8BA1\u7A97\u53E3(\u5982 7d, 24h, 30m)",
|
|
1135
|
+
"cli.doctor.args.client.description": "\u6309\u5BA2\u6237\u7AEF\u8FC7\u6EE4(cc|codex|cursor|all)",
|
|
1136
|
+
// v2.0.0-rc.24 TASK-10: --layer 过滤 cite 合约审计的知识层 (team|personal|all)。
|
|
1137
|
+
"cli.doctor.args.layer.description": "\u6309\u77E5\u8BC6\u5C42\u8FC7\u6EE4 cite \u5408\u7EA6\u5BA1\u8BA1 (team|personal|all)",
|
|
1138
|
+
"cli.doctor.errors.cite-coverage-mutex": "--cite-coverage \u4E0D\u80FD\u4E0E --fix \u6216 --fix-knowledge \u540C\u65F6\u4F7F\u7528",
|
|
1139
|
+
"cli.doctor.errors.invalid-since": "--since \u53D6\u503C\u65E0\u6548: {input}\u3002\u9884\u671F\u683C\u5F0F 7d / 24h / 30m \u6216 epoch ms\u3002",
|
|
1140
|
+
"cli.doctor.errors.invalid-client": "--client \u53D6\u503C\u65E0\u6548: {input}\u3002\u9884\u671F cc / codex / cursor / all\u3002",
|
|
1141
|
+
"cli.doctor.errors.invalid-layer": "--layer \u53D6\u503C\u65E0\u6548: {input}\u3002\u9884\u671F team / personal / all\u3002",
|
|
1142
|
+
// rc.23 TASK-007 (a-C2): --enrich-descriptions 回填四个 description 字段。
|
|
1143
|
+
"cli.doctor.args.enrich-descriptions.description": "\u56DE\u586B\u6B63\u5F0F\u77E5\u8BC6\u6761\u76EE\u7F3A\u5931\u7684 intent_clues / tech_stack / impact / must_read_if \u5B57\u6BB5\uFF08\u9ED8\u8BA4\u53EA\u8BFB;\u642D\u914D --auto \u5199\u5165 stub\uFF09\u3002",
|
|
1144
|
+
"cli.doctor.args.auto.description": "\u4E0E --enrich-descriptions \u642D\u914D\uFF1A\u4E3A\u7F3A\u5931\u5B57\u6BB5\u5199\u5165\u786E\u5B9A\u6027 stub \u503C\u3002\u4E0D\u52A0 --auto \u4EC5\u505A\u53EA\u8BFB\u626B\u63CF\u3002",
|
|
1145
|
+
"cli.doctor.args.dry-run.description": "\u4E0E --enrich-descriptions --auto \u6216 --fix \u642D\u914D:\u4EC5\u9884\u89C8\u6539\u52A8\u8BA1\u5212,\u4E0D\u5199\u5165\u78C1\u76D8\u3002fix-dry-run \u8F93\u51FA\u4E0E --fix \u76F8\u540C\u7684 fixable_errors \u5217\u8868,\u4F46\u4E0D\u6267\u884C\u4EFB\u4F55 mutation\u3002",
|
|
1146
|
+
// v2.0.0-rc.33 W4-B1 (T6 P2): --fix --dry-run banner — 出现在 report 之前, 让用户明确没有发生 mutation。
|
|
1147
|
+
"cli.doctor.fix-dry-run-banner": "[dry-run] \u672A\u5E94\u7528\u4EFB\u4F55 mutation\u3002\u4E0B\u65B9 fixable_errors \u5217\u8868\u5C31\u662F `fabric doctor --fix` \u4F1A\u5904\u7406\u7684\u9879;\u53BB\u6389 --dry-run \u518D\u8DD1\u53EF\u5B9E\u9645\u4FEE\u590D\u3002",
|
|
1148
|
+
"cli.doctor.errors.enrich-descriptions-mutex": "--enrich-descriptions \u4E0D\u80FD\u4E0E --fix / --fix-knowledge / --cite-coverage \u540C\u65F6\u4F7F\u7528,\u8BF7\u5206\u522B\u8FD0\u884C\u3002",
|
|
1149
|
+
"doctor.enrich.allComplete": "\u6240\u6709\u6B63\u5F0F\u77E5\u8BC6\u6761\u76EE\u5747\u5DF2\u5305\u542B intent_clues / tech_stack / impact / must_read_if\u3002",
|
|
1150
|
+
// rc.26 TASK-02a: doctor foundation-batch check messages.
|
|
1151
|
+
"doctor.check.bootstrap_marker_migration.name": "Bootstrap marker \u8FC1\u79FB",
|
|
1152
|
+
"doctor.check.bootstrap_marker_migration.ok": "bootstrap \u76EE\u6807\u6587\u4EF6\u4E2D\u672A\u68C0\u6D4B\u5230\u65E7 fabric:knowledge-base marker\u3002",
|
|
1153
|
+
"doctor.check.bootstrap_marker_migration.message.singular": "{count} \u4E2A\u6587\u4EF6\u4ECD\u5E26\u6709\u65E7 fabric:knowledge-base bootstrap marker\uFF1A{list}\u3002",
|
|
1154
|
+
"doctor.check.bootstrap_marker_migration.message.plural": "{count} \u4E2A\u6587\u4EF6\u4ECD\u5E26\u6709\u65E7 fabric:knowledge-base bootstrap marker\uFF1A{list}\u3002",
|
|
1155
|
+
"doctor.check.bootstrap_marker_migration.remediation": "\u8FD0\u884C `fabric doctor --fix` \u8FC1\u79FB\u5230 fabric:bootstrap marker",
|
|
1156
|
+
"doctor.check.bootstrap_snapshot_drift.name": "Bootstrap snapshot drift",
|
|
1157
|
+
"doctor.check.bootstrap_snapshot_drift.message.drift": ".fabric/AGENTS.md \u5185\u5BB9\u4E0E BOOTSTRAP_CANONICAL \u9010\u5B57\u8282\u4E0D\u4E00\u81F4\u3002",
|
|
1158
|
+
"doctor.check.bootstrap_snapshot_drift.remediation.drift": "\u8FD0\u884C `fabric doctor --fix` \u6062\u590D canonical bootstrap snapshot",
|
|
1159
|
+
"doctor.check.bootstrap_snapshot_drift.ok.ok": ".fabric/AGENTS.md \u4E0E BOOTSTRAP_CANONICAL \u9010\u5B57\u8282\u4E00\u81F4\u3002",
|
|
1160
|
+
"doctor.check.bootstrap_snapshot_drift.ok.missing_delegated": ".fabric/AGENTS.md \u4E0D\u5B58\u5728\uFF0C\u5DF2\u4EA4\u7531 bootstrap_anchor_missing \u62A5\u544A\u3002",
|
|
1161
|
+
"doctor.check.managed_block_drift.name": "Managed block drift",
|
|
1162
|
+
"doctor.check.managed_block_drift.message.singular": "{count} \u4E2A three-end managed block \u4E0E\u671F\u671B\u5185\u5BB9\uFF08snapshot + \u53EF\u9009 project-rules concat\uFF09\u4E0D\u4E00\u81F4\uFF1A{list}\u3002",
|
|
1163
|
+
"doctor.check.managed_block_drift.message.plural": "{count} \u4E2A three-end managed block \u4E0E\u671F\u671B\u5185\u5BB9\uFF08snapshot + \u53EF\u9009 project-rules concat\uFF09\u4E0D\u4E00\u81F4\uFF1A{list}\u3002",
|
|
1164
|
+
"doctor.check.managed_block_drift.remediation": "\u8FD0\u884C `fabric doctor --fix` \u4ECE canonical \u6062\u590D three-end managed blocks",
|
|
1165
|
+
"doctor.check.managed_block_drift.ok.ok": "Three-end managed blocks \u4E0E expectedBody \u9010\u5B57\u8282\u4E00\u81F4\u3002",
|
|
1166
|
+
"doctor.check.managed_block_drift.ok.no_managed_block": "\u672A\u68C0\u6D4B\u5230 three-end managed blocks\uFF1B\u53EF\u80FD\u5C1A\u672A\u4F20\u64AD\uFF0C\u6216\u4ECD\u5904\u4E8E legacy-marker \u72B6\u6001\u3002",
|
|
1167
|
+
"doctor.check.bootstrap_anchor.name": "Bootstrap anchor",
|
|
1168
|
+
"doctor.check.bootstrap_anchor.message.missing": "repo root \u4E0B AGENTS.md \u4E0E CLAUDE.md \u90FD\u4E0D\u5B58\u5728\u3002Fabric \u9700\u8981\u5728\u9879\u76EE\u6839\u76EE\u5F55\u5B58\u5728 bootstrap anchor \u6587\u4EF6\u3002",
|
|
1169
|
+
"doctor.check.bootstrap_anchor.remediation.missing": "\u8FD0\u884C `fabric install` \u5728 repo root \u751F\u6210 AGENTS.md / CLAUDE.md bootstrap anchor\u3002",
|
|
1170
|
+
"doctor.check.bootstrap_anchor.ok": "repo root \u4E0B\u5DF2\u5B58\u5728 Bootstrap anchor\uFF1A{present}\u3002",
|
|
1171
|
+
"doctor.check.baseline_filename_format.name": "Baseline \u6587\u4EF6\u540D\u683C\u5F0F",
|
|
1172
|
+
"doctor.check.baseline_filename_format.ok": "\u6240\u6709 baseline knowledge \u6587\u4EF6\u90FD\u4F7F\u7528 canonical `${id}--${slug}.md` \u6587\u4EF6\u540D\u683C\u5F0F\u3002",
|
|
1173
|
+
"doctor.check.baseline_filename_format.message.singular": "{count} \u4E2A baseline knowledge \u6587\u4EF6\u4ECD\u4F7F\u7528\u5DF2\u5E9F\u5F03\u7684 bare-slug \u6587\u4EF6\u540D\u683C\u5F0F\uFF0C\u5FC5\u987B\u8FC1\u79FB\u4E3A `${id}--${slug}.md`\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1174
|
+
"doctor.check.baseline_filename_format.message.plural": "{count} \u4E2A baseline knowledge \u6587\u4EF6\u4ECD\u4F7F\u7528\u5DF2\u5E9F\u5F03\u7684 bare-slug \u6587\u4EF6\u540D\u683C\u5F0F\uFF0C\u5FC5\u987B\u8FC1\u79FB\u4E3A `${id}--${slug}.md`\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1175
|
+
// v2.0.0-rc.33 W3-2 (T6 #5): 文案显式引用 message 内已列出的 detail (file 名), 让用户直接 rm 而非自己去 grep 找。baseline pipeline 已 rc.23 移除, 没有 auto-fix。
|
|
1176
|
+
"doctor.check.baseline_filename_format.remediation": "\u624B\u52A8\u5220\u9664\u4E0A\u9762 message \u4E2D\u5217\u51FA\u7684 bare-slug baseline file(s) (\u4F8B\u5982 `rm <message \u5217\u51FA\u7684 file>`);baseline pipeline \u5DF2\u5728 rc.23 \u79FB\u9664, \u4E0D\u518D\u63D0\u4F9B auto-fix \u8DEF\u5F84\u3002",
|
|
1177
|
+
"doctor.check.knowledge_dir_missing.name": "Knowledge layout",
|
|
1178
|
+
"doctor.check.knowledge_dir_missing.message.singular": "{count} \u4E2A\u5FC5\u9700 knowledge subdir \u7F3A\u5931\uFF1A{list}\u3002",
|
|
1179
|
+
"doctor.check.knowledge_dir_missing.message.plural": "{count} \u4E2A\u5FC5\u9700 knowledge subdir \u7F3A\u5931\uFF1A{list}\u3002",
|
|
1180
|
+
"doctor.check.knowledge_dir_missing.remediation": "\u8FD0\u884C `fabric doctor --fix` \u521B\u5EFA\u7F3A\u5931\u7684 .fabric/knowledge/* subdirectories\u3002",
|
|
1181
|
+
"doctor.check.knowledge_dir_missing.ok": "\u5168\u90E8 {count} \u4E2A\u5FC5\u9700 .fabric/knowledge/* subdirectories \u5747\u5DF2\u5B58\u5728\u3002",
|
|
1182
|
+
"doctor.check.forensic.name": "Scan evidence",
|
|
1183
|
+
"doctor.check.forensic.message.missing.singular": "{error} \u5B9E\u65F6\u626B\u63CF\u68C0\u6D4B\u5230 {frameworkKind}\uFF0C\u5171\u6709 {count} \u4E2A\u5165\u53E3\u70B9\u3002",
|
|
1184
|
+
"doctor.check.forensic.message.missing.plural": "{error} \u5B9E\u65F6\u626B\u63CF\u68C0\u6D4B\u5230 {frameworkKind}\uFF0C\u5171\u6709 {count} \u4E2A\u5165\u53E3\u70B9\u3002",
|
|
1185
|
+
"doctor.check.forensic.message.missing-default": ".fabric/forensic.json \u7F3A\u5931\u3002",
|
|
1186
|
+
"doctor.check.forensic.message.invalid-default": ".fabric/forensic.json \u65E0\u6548\u3002",
|
|
1187
|
+
"doctor.check.forensic.remediation": "\u8FD0\u884C `fabric install` \u91CD\u65B0\u751F\u6210 .fabric/forensic.json\u3002",
|
|
1188
|
+
"doctor.check.forensic.ok": ".fabric/forensic.json \u5BF9 {frameworkKind} \u6709\u6548\u3002",
|
|
1189
|
+
"doctor.check.agents_meta.name": "Agents metadata",
|
|
1190
|
+
"doctor.check.agents_meta.message.missing": ".fabric/agents.meta.json \u7F3A\u5931\u3002",
|
|
1191
|
+
"doctor.check.agents_meta.remediation.missing": "\u8FD0\u884C `fabric doctor --fix` \u4ECE .fabric/knowledge/ \u91CD\u5EFA agents.meta.json\u3002",
|
|
1192
|
+
"doctor.check.agents_meta.message.invalid-default": ".fabric/agents.meta.json \u65E0\u6548\u3002",
|
|
1193
|
+
// rc.35 TASK-09 (P0-14): 人话化的 schema 解析失败消息。
|
|
1194
|
+
"doctor.check.agents_meta.message.invalid-zod": ".fabric/agents.meta.json schema \u6821\u9A8C\u5931\u8D25 \u2014 {issues}\u3002\u8BE5\u6587\u4EF6\u5F88\u53EF\u80FD\u7531\u4E0D\u517C\u5BB9\u7248\u672C\u7684 fabric CLI \u5199\u5165,\u6216\u88AB\u624B\u5DE5\u7F16\u8F91\u3002",
|
|
1195
|
+
"doctor.check.agents_meta.message.invalid-from-old-cli": ".fabric/agents.meta.json schema \u6821\u9A8C\u5931\u8D25,\u56E0\u4E3A PATH \u4E0A\u7684\u5168\u5C40 `fabric` CLI ({version}) \u4F4E\u4E8E\u6700\u4F4E\u652F\u6301\u7248\u672C {minVersion}\u3002rc.31 \u5F15\u5165\u4E86\u5411\u540E\u517C\u5BB9\u7684 singular\u2192plural \u5F52\u4E00\u5316,\u65E7\u7248 CLI \u5199\u51FA\u7684\u6587\u4EF6\u81EA\u5DF1\u4E5F\u65E0\u6CD5\u89E3\u6790\u3002",
|
|
1196
|
+
"doctor.check.agents_meta.remediation.invalid": "\u8FD0\u884C `fabric doctor --fix` \u8BA9 reconcile \u4ECE .fabric/knowledge/ \u78C1\u76D8 ground-truth \u91CD\u5EFA agents.meta.json\uFF08rc.31 \u8D77\u517C\u5BB9\u5386\u53F2 schema \u7684 singular knowledge_type \u81EA\u52A8\u8FC1\u79FB\u5230 plural\uFF1B\u4E0D\u8981\u624B\u52A8\u5220\u9664 agents.meta.json\uFF0C\u4F1A\u4E22 counters envelope \u4E0E promote ledger \u5173\u8054\uFF09\u3002",
|
|
1197
|
+
"doctor.check.agents_meta.message.stale": ".fabric/agents.meta.json revision {revision} \u4E0E .fabric/knowledge \u6D3E\u751F revision {computedRevision} \u4E0D\u4E00\u81F4\u3002",
|
|
1198
|
+
"doctor.check.agents_meta.message.stale_hash_equal": ".fabric/agents.meta.json \u5DF2\u4E0E .fabric/knowledge \u5185\u5BB9\u4E00\u81F4\uFF08revision {revision}\uFF09\uFF0C\u4F46 mtime/counters \u6D3E\u751F\u72B6\u6001\u8FC7\u671F\u3002\u53EF\u5FFD\u7565\u3002",
|
|
1199
|
+
"doctor.check.agents_meta.remediation.stale": "\u53EF\u5FFD\u7565\uFF1Bengine \u4F1A\u5728\u4E0B\u4E00\u6B21 plan-context/get-sections \u8C03\u7528\u65F6\u81EA\u52A8\u4FEE\u590D\u3002\u9700\u8981\u663E\u5F0F reconcile \u65F6\u8FD0\u884C `fabric doctor --fix`\u3002",
|
|
1200
|
+
"doctor.check.agents_meta.ok": ".fabric/agents.meta.json revision {revision} \u5DF2\u4E0E .fabric/knowledge \u5BF9\u9F50\u3002",
|
|
1201
|
+
"doctor.check.rule_content_refs.name": "Rule content refs",
|
|
1202
|
+
"doctor.check.rule_content_refs.message.unavailable": "agents.meta.json \u6709\u6548\u524D\uFF0C\u65E0\u6CD5\u68C0\u67E5 content_ref entries\u3002",
|
|
1203
|
+
"doctor.check.rule_content_refs.remediation.unavailable": "\u5148\u4FEE\u590D agents.meta.json\uFF1A\u8FD0\u884C `fabric doctor --fix`\u3002",
|
|
1204
|
+
"doctor.check.rule_content_refs.message.outside.singular": "{count} \u4E2A content_ref entry \u4F4D\u4E8E .fabric/knowledge \u5916\u90E8\u3002",
|
|
1205
|
+
"doctor.check.rule_content_refs.message.outside.plural": "{count} \u4E2A content_ref entries \u4F4D\u4E8E .fabric/knowledge \u5916\u90E8\u3002",
|
|
1206
|
+
// v2.0.0-rc.33 W3-2 (T6 #12): 项目规则禁止手动编辑 agents.meta.json (见 .fabric/AGENTS.md); 改引导用户跑 doctor --fix 走 reconcile 路径 (rc.31+ 兼容自动剔除外部 refs)。
|
|
1207
|
+
"doctor.check.rule_content_refs.remediation.outside": "\u8FD0\u884C `fabric doctor --fix` \u8BA9 reconcile \u81EA\u52A8\u5254\u9664\u5916\u90E8 content_ref (rc.31+ \u517C\u5BB9)\u3002\u4E25\u7981\u624B\u52A8\u7F16\u8F91 agents.meta.json \u2014 engine \u4F1A\u81EA\u52A8 reconcile\u3002",
|
|
1208
|
+
"doctor.check.rule_content_refs.message.missing.singular": "{count} \u4E2A content_ref target \u7F3A\u5931\u3002\u8FD0\u884C `fabric doctor --fix` \u6267\u884C reconcile\u3002",
|
|
1209
|
+
"doctor.check.rule_content_refs.message.missing.plural": "{count} \u4E2A content_ref targets \u7F3A\u5931\u3002\u8FD0\u884C `fabric doctor --fix` \u6267\u884C reconcile\u3002",
|
|
1210
|
+
"doctor.check.rule_content_refs.remediation.missing": "\u8FD0\u884C `fabric doctor --fix` \u8BA9 agents.meta.json \u4E0E .fabric/knowledge/ \u4E2D\u7684\u73B0\u6709\u6587\u4EF6 reconcile\u3002",
|
|
1211
|
+
"doctor.check.rule_content_refs.ok": "\u6240\u6709 content_ref entries \u90FD\u80FD\u89E3\u6790\u5230 .fabric/knowledge files\u3002",
|
|
1212
|
+
"doctor.check.knowledge_test_index.name": "Knowledge-test index",
|
|
1213
|
+
"doctor.check.knowledge_test_index.remediation.missing": "\u8FD0\u884C `fabric doctor --fix` \u91CD\u5EFA .fabric/.cache/knowledge-test.index.json\u3002",
|
|
1214
|
+
"doctor.check.knowledge_test_index.remediation.invalid": "\u5220\u9664 .fabric/.cache/knowledge-test.index.json \u5E76\u8FD0\u884C `fabric doctor --fix` \u91CD\u65B0\u751F\u6210\u3002",
|
|
1215
|
+
"doctor.check.knowledge_test_index.message.stale": ".fabric/.cache/knowledge-test.index.json \u5DF2\u8FC7\u671F\u3002",
|
|
1216
|
+
"doctor.check.knowledge_test_index.remediation.stale": "\u8FD0\u884C `fabric doctor --fix` \u91CD\u5EFA knowledge-test index\u3002",
|
|
1217
|
+
"doctor.check.knowledge_test_index.ok.link_singular.orphan_singular": "\u5DF2\u7D22\u5F15 {linkCount} \u4E2A link \u548C {orphanCount} \u4E2A orphan annotation\u3002",
|
|
1218
|
+
"doctor.check.knowledge_test_index.ok.link_singular.orphan_plural": "\u5DF2\u7D22\u5F15 {linkCount} \u4E2A link \u548C {orphanCount} \u4E2A orphan annotation\u3002",
|
|
1219
|
+
"doctor.check.knowledge_test_index.ok.link_plural.orphan_singular": "\u5DF2\u7D22\u5F15 {linkCount} \u4E2A link \u548C {orphanCount} \u4E2A orphan annotation\u3002",
|
|
1220
|
+
"doctor.check.knowledge_test_index.ok.link_plural.orphan_plural": "\u5DF2\u7D22\u5F15 {linkCount} \u4E2A link \u548C {orphanCount} \u4E2A orphan annotation\u3002",
|
|
1221
|
+
"doctor.check.event_ledger.name": "Event ledger",
|
|
1222
|
+
"doctor.check.event_ledger.message.missing": ".fabric/events.jsonl \u7F3A\u5931\u3002",
|
|
1223
|
+
"doctor.check.event_ledger.remediation.missing": "\u8FD0\u884C `fabric doctor --fix` \u521B\u5EFA .fabric/events.jsonl\u3002",
|
|
1224
|
+
"doctor.check.event_ledger.message.not_writable-default": ".fabric/events.jsonl \u4E0D\u53EF\u5199\u3002",
|
|
1225
|
+
"doctor.check.event_ledger.remediation.not_writable": "\u68C0\u67E5 .fabric/events.jsonl \u7684\u6587\u4EF6\u6743\u9650\uFF0C\u5E76\u786E\u8BA4\u6CA1\u6709\u5176\u4ED6\u8FDB\u7A0B\u6301\u6709\u5199\u9501\u3002",
|
|
1226
|
+
"doctor.check.event_ledger.message.invalid-default": ".fabric/events.jsonl \u65E0\u6548\u3002",
|
|
1227
|
+
// v2.0.0-rc.33 W3-1 (P0-6): archive-history 模式 — 引导用户先 mv 备份到 events.archive/ 保留历史, 再跑 --fix 重建空 ledger。与 rotateEventLedgerIfNeeded 的命名约定一致 (events-rotated-YYYY-MM-DD.jsonl 是滑窗 rotation; events-corrupted-YYYY-MM-DD.jsonl 是 invalid-fix 归档)。
|
|
1228
|
+
"doctor.check.event_ledger.remediation.invalid": "\u5148\u5F52\u6863\u5386\u53F2 (`mkdir -p .fabric/events.archive && mv .fabric/events.jsonl .fabric/events.archive/events-corrupted-$(date +%Y-%m-%d).jsonl`), \u518D\u8FD0\u884C `fabric doctor --fix` \u521B\u5EFA\u65B0\u7A7A ledger\u3002\u5386\u53F2\u4E8B\u4EF6\u4FDD\u7559\u5728 events.archive/ \u4E0D\u4E22\u3002",
|
|
1229
|
+
"doctor.check.event_ledger.ok": ".fabric/events.jsonl \u5DF2\u5B58\u5728\uFF0C\u53EF\u5199\uFF0C\u4E14\u53EF\u89E3\u6790\u3002",
|
|
1230
|
+
// v2.0.0-rc.37 Wave B (B5): 复合 hard-gate 检查 events.jsonl/metrics.jsonl 健康
|
|
1231
|
+
// (G7 size / G8 metric_leak / G9 metrics_stale / G10 rotation_overdue)。
|
|
1232
|
+
"doctor.check.events_jsonl_health.name": "Events ledger \u5065\u5EB7 (rc.37 Plan B 5 hard gate)",
|
|
1233
|
+
"doctor.check.events_jsonl_health.ok": ".fabric/events.jsonl \u5927\u5C0F\u3001\u65B0\u9C9C\u5EA6\u3001metric \u9694\u79BB\u5168\u90E8\u6B63\u5E38\u3002",
|
|
1234
|
+
"doctor.check.events_jsonl_health.message.size": ".fabric/events.jsonl \u5DF2 {sizeMb} MB\uFF0C\u8D85\u8FC7 10 MB \u9608\u503C\u3002",
|
|
1235
|
+
"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",
|
|
1236
|
+
"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",
|
|
1237
|
+
"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",
|
|
1238
|
+
"doctor.check.events_jsonl_health.remediation": "\u8FD0\u884C `fabric doctor --fix` \u89E6\u53D1 rotation; \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",
|
|
1239
|
+
"doctor.check.mcp_config_in_wrong_file.name": "Claude MCP config \u4F4D\u7F6E",
|
|
1240
|
+
"doctor.check.mcp_config_in_wrong_file.message": ".claude/settings.json \u5305\u542B mcpServers.fabric\uFF1B\u6B64\u6587\u4EF6\u4EC5\u7528\u4E8E hooks/permissions\u3002\u8FD0\u884C --fix \u79FB\u9664\u5B83\uFF0C\u7136\u540E\u91CD\u65B0\u8FD0\u884C fabric install \u5199\u5165 .mcp.json\u3002",
|
|
1241
|
+
"doctor.check.mcp_config_in_wrong_file.remediation": "\u8FD0\u884C `fabric doctor --fix` \u4ECE .claude/settings.json \u4E2D\u79FB\u9664 mcpServers.fabric\uFF0C\u7136\u540E\u8FD0\u884C `fabric install` \u5199\u5165 .mcp.json\u3002",
|
|
1242
|
+
"doctor.check.mcp_config_in_wrong_file.ok": "mcpServers.fabric \u4E0D\u5728 .claude/settings.json \u4E2D\u3002",
|
|
1243
|
+
"doctor.check.event_ledger_partial_write.name": "Event ledger partial write",
|
|
1244
|
+
"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",
|
|
1245
|
+
"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",
|
|
1246
|
+
"doctor.check.event_ledger_partial_write.remediation": "\u8FD0\u884C `fabric doctor --fix` \u622A\u65AD partial write \u5E76\u5C06 events.jsonl \u6062\u590D\u5230\u6709\u6548\u72B6\u6001\u3002",
|
|
1247
|
+
"doctor.check.event_ledger_partial_write.ok.clean": "events.jsonl \u6CA1\u6709 partial trailing write\u3002",
|
|
1248
|
+
// v2.0.0-rc.27 TASK-010 (audit §2.24): schema-compat 向前兼容警告类别。
|
|
1249
|
+
"doctor.check.event_ledger_schema_compat.name": "Event ledger schema \u517C\u5BB9\u6027",
|
|
1250
|
+
"doctor.check.event_ledger_schema_compat.ok.skipped": "\u65E0\u9700\u505A schema \u517C\u5BB9\u6027\u68C0\u67E5\uFF08events.jsonl \u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u5199\uFF09\u3002",
|
|
1251
|
+
"doctor.check.event_ledger_schema_compat.ok.clean": "events.jsonl \u6240\u6709\u884C\u90FD\u80FD\u89E3\u6790\u4E3A\u5F53\u524D schema\u3002",
|
|
1252
|
+
"doctor.check.event_ledger_schema_compat.message.schema_version": "events.jsonl \u542B {count} \u884C `schema_version` \u4E0D\u88AB\u5F53\u524D CLI \u8BC6\u522B\uFF08\u6837\u672C: {samples}\uFF09\u3002",
|
|
1253
|
+
"doctor.check.event_ledger_schema_compat.message.event_type": "events.jsonl \u542B {count} \u884C `event_type` \u4E0D\u5728\u5F53\u524D schema \u4E2D\uFF08\u6837\u672C: {samples}\uFF09\u3002",
|
|
1254
|
+
// v2.0.0-rc.33 W3-1 (P0-6): archive-history 模式 — 同 event_ledger.invalid, 文案显式说"归档备份"而非"备份后重建",避免用户误以为旧 ledger 被丢弃。
|
|
1255
|
+
"doctor.check.event_ledger_schema_compat.remediation": "\u5347\u7EA7 fabric CLI \u5230\u4E0E server \u517C\u5BB9\u7684\u7248\u672C (\u9996\u9009);\u6216\u5148\u5F52\u6863\u5386\u53F2 (`mkdir -p .fabric/events.archive && mv .fabric/events.jsonl .fabric/events.archive/events-schema-mismatch-$(date +%Y-%m-%d).jsonl`),\u518D\u8DD1 `fabric doctor --fix` \u521B\u5EFA\u65B0\u7A7A ledger\u3002\u5386\u53F2\u4E8B\u4EF6\u4FDD\u7559\u5728 events.archive/ \u4E0D\u4E22,\u53EF\u540E\u7EED\u624B\u52A8\u8FC1\u79FB\u3002",
|
|
1256
|
+
// v2.0.0-rc.28 TASK-04 (audit §3.1): SKILL ref/ 镜像一致性检查。
|
|
1257
|
+
"doctor.check.skill_ref_mirror.name": "Skill ref \u955C\u50CF\u4E00\u81F4\u6027",
|
|
1258
|
+
"doctor.check.skill_ref_mirror.ok": "`.claude/skills/<slug>/ref/` \u4E0E `.codex/skills/<slug>/ref/` \u5B57\u8282\u4E00\u81F4\u3002",
|
|
1259
|
+
"doctor.check.skill_ref_mirror.message": "\u6709 {count} \u4E2A ref \u6587\u4EF6\u5728 `.claude/skills/` \u4E0E `.codex/skills/` \u4E4B\u95F4\u4E0D\u4E00\u81F4\uFF08\u8DEF\u5F84: {list}\uFF09\u3002\u53EF\u80FD\u67D0\u7AEF\u88AB\u624B\u52A8\u7F16\u8F91\u6216 install \u5199\u5165\u5931\u8D25\u3002",
|
|
1260
|
+
"doctor.check.skill_ref_mirror.remediation": "\u8DD1 `fabric install` \u4ECE canonical templates \u91CD\u5199\u4E24\u7AEF ref \u5B50\u6811\u4EE5\u6062\u590D\u4E00\u81F4\u3002",
|
|
1261
|
+
// 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 浪费 + 加载延迟)。
|
|
1262
|
+
"doctor.check.skill_token_budget.name": "Skill token budget",
|
|
1263
|
+
"doctor.check.skill_token_budget.ok": "\u6240\u6709 .claude/skills/<slug>/SKILL.md \u5728 token budget \u5185 (warn 5K / error 10K)\u3002",
|
|
1264
|
+
"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",
|
|
1265
|
+
"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",
|
|
1266
|
+
"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",
|
|
1267
|
+
// 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。
|
|
1268
|
+
"doctor.check.skill_description.name": "Skill description quality",
|
|
1269
|
+
"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",
|
|
1270
|
+
"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",
|
|
1271
|
+
"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",
|
|
1272
|
+
"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",
|
|
1273
|
+
// v2.0.0-rc.33 W3-3 (P1-3): cite-policy Goodhart 模式检测。扫 7d 内 assistant_turn_observed 事件, 4 个 anti-pattern (G1 仪式化 / G2 抄底引用 / G3 chained-from 滥用 / G5 placeholder cite)。warning 级 (启发式有 false-positive, 不阻断)。
|
|
1274
|
+
"doctor.check.cite_goodhart.name": "Cite-policy Goodhart",
|
|
1275
|
+
"doctor.check.cite_goodhart.ok": "\u8FC7\u53BB 7d \u672A\u68C0\u6D4B\u5230 cite-policy Goodhart \u53CD\u6A21\u5F0F\u3002",
|
|
1276
|
+
"doctor.check.cite_goodhart.message.singular": "\u68C0\u6D4B\u5230 {count} \u4E2A cite-policy Goodhart \u6A21\u5F0F: {list}\u3002",
|
|
1277
|
+
"doctor.check.cite_goodhart.message.plural": "\u68C0\u6D4B\u5230 {count} \u4E2A cite-policy Goodhart \u6A21\u5F0F: {list}\u3002",
|
|
1278
|
+
"doctor.check.cite_goodhart.remediation": "\u5BA1\u9605\u89E6\u53D1\u7684 pattern: G1 \u4EEA\u5F0F\u5316 \u2192 \u540C\u4E00 [recalled] cite \u91CD\u590D\u7528,\u8BE5\u628A KB \u771F\u6B63\u843D\u5230 contract; G2 \u6284\u5E95\u5F15\u7528 \u2192 > 60% recalled \u7528 skip: \u662F\u7ED5\u8FC7 contract, review skip reason \u771F\u5B9E\u6027; G3 chained-from \u6EE5\u7528 \u2192 chained-from \u6807\u4E86\u4F46\u6CA1 commitment, \u8981\u8865 operators \u6216\u6539\u7528\u5176\u4ED6 tag; G5 placeholder cite \u2192 'KB: none' / [unspecified] \u592A\u591A, \u8BE5\u7528\u5177\u4F53 sentinel \u5982 [no-relevant] / [not-applicable]\u3002\u8BE6\u7EC6\u6570\u636E\u8DD1 `fabric doctor --cite-coverage --since=7d`\u3002",
|
|
1279
|
+
// v2.0.0-rc.33 W4-A4 (T5 P2): draft-backlog lint。rc.32 baseline 92% entry 卡在 draft, 揭示 promote 断流。> 50% draft 触发 warning (workspace 必须 >= 10 entries 才计算比率, 避免小语料噪音)。
|
|
1280
|
+
"doctor.check.draft_backlog.name": "Knowledge draft backlog",
|
|
1281
|
+
"doctor.check.draft_backlog.ok": "canonical knowledge entries \u4E2D draft \u5360\u6BD4\u6B63\u5E38 (< 50%, \u6216 workspace \u592A\u5C0F\u4E0D\u8BC4)\u3002",
|
|
1282
|
+
"doctor.check.draft_backlog.message": "{draftCount}/{totalCount} ({pct}%) canonical knowledge entries \u5361\u5728 draft maturity \u2014 promote \u65AD\u6D41 (rc.32 baseline 92%)\u3002",
|
|
1283
|
+
"doctor.check.draft_backlog.remediation": "\u8C03 `/fabric-review` \u6279\u91CF\u5BA1 draft entries: approve \u5347 verified/proven, reject \u4E22, modify \u4FEE\u3002draft \u957F\u671F\u5806\u79EF\u901A\u5E38\u610F\u5473\u7740 archive skill \u4EA7 draft \u592A\u5FEB\u6216 review skill \u6CA1\u8DDF\u4E0A\u3002",
|
|
1284
|
+
// rc.37 NEW-38: knowledge auto-promote (info surface; --fix 执行).
|
|
1285
|
+
"doctor.check.draft_auto_promote.name": "Knowledge auto-promote",
|
|
1286
|
+
"doctor.check.draft_auto_promote.ok": "\u65E0 settled draft \u5F85\u81EA\u52A8 promote (draft \u5747\u672A\u6EE1 14 \u5929\u6216\u5DF2\u88AB drift \u6807\u8BB0)\u3002",
|
|
1287
|
+
"doctor.check.draft_auto_promote.message": "{count} \u4E2A draft entries \u5DF2\u6C89\u6DC0 \u226514 \u5929\u4E14\u65E0 drift ({sample}{suffix}) \u2014 \u53EF\u81EA\u52A8 promote \u5230 verified\u3002\u8DD1 `fabric doctor --fix` \u6267\u884C\u3002",
|
|
1288
|
+
"doctor.check.draft_auto_promote.remediation": "\u8DD1 `fabric doctor --fix` \u628A\u8FD9\u4E9B settled draft \u81EA\u52A8\u5347\u5230 verified (\u6392\u6389 draft_backlog); \u6216\u8C03 `/fabric-review` \u624B\u52A8\u9010\u6761\u5B9A\u593A\u3002",
|
|
1289
|
+
"doctor.check.draft_auto_promote.fixed": "\u81EA\u52A8 promote {count} \u4E2A settled draft entries \u2192 verified\u3002",
|
|
1290
|
+
// rc.36 TASK-05 (P0-8): empty-tags ratio warn.
|
|
1291
|
+
"doctor.check.knowledge_tags_empty.name": "Knowledge tags coverage",
|
|
1292
|
+
"doctor.check.knowledge_tags_empty.ok": "canonical knowledge entries \u4E2D empty tags \u5360\u6BD4\u6B63\u5E38 (\u2264 50%, \u6216 workspace \u592A\u5C0F\u4E0D\u8BC4)\u3002",
|
|
1293
|
+
"doctor.check.knowledge_tags_empty.message": "{emptyCount}/{totalCount} ({pct}%) canonical knowledge entries \u7684 `tags:` \u4E3A\u7A7A \u2014 \u4E3B\u9898\u805A\u7C7B\u4E0E\u8DE8\u6761\u76EE\u68C0\u7D22\u9000\u5316\u3002fabric-archive / fabric-import skill \u5E94\u6BCF\u4E2A entry \u4EA7 2-4 \u4E2A tag\u3002",
|
|
1294
|
+
"doctor.check.knowledge_tags_empty.remediation": "\u4E0B\u4E00\u8F6E archive/import \u65F6,\u5728 frontmatter `tags:` \u5199 2-4 \u4E2A kebab-case \u4E3B\u9898\u8BCD;\u6279\u91CF\u8865\u65E7 entry tag \u7528 `/fabric-review` modify \u6D41\u3002",
|
|
1295
|
+
// rc.36 TASK-09 (P1-NEW1): drift_detected 未消化告警。
|
|
1296
|
+
"doctor.check.drift_unconsumed.name": "Knowledge drift unconsumed",
|
|
1297
|
+
"doctor.check.drift_unconsumed.ok": "\u8FD1 30 \u5929\u5185 knowledge_drift_detected \u4E8B\u4EF6\u5DF2\u88AB\u5BF9\u5E94 knowledge_demoted \u6D88\u5316,\u6216\u4E8B\u4EF6\u6570\u592A\u5C11\u4E0D\u8BC4\u3002",
|
|
1298
|
+
"doctor.check.drift_unconsumed.message": "\u8FD1 30 \u5929\u5185 knowledge_drift_detected \u4E8B\u4EF6 {driftCount} \u6B21,knowledge_demoted \u4E8B\u4EF6 {demoteCount} \u6B21\u3002drift > demote \u81F3\u5C11 5 \u2192 \u90E8\u5206 drift \u6CA1\u88AB\u6D88\u5316,KB \u4F1A\u7F13\u6162\u5931\u6D3B\u3002",
|
|
1299
|
+
"doctor.check.drift_unconsumed.remediation": "\u8FD0\u884C `fabric doctor --fix` \u89E6\u53D1 orphan-demote / stale-archive \u81EA\u6108\u6D41,\u6216\u8C03 `/fabric-review` \u4E3B\u52A8\u5BA1 drift \u6807\u8BB0\u7684\u6761\u76EE\u3002",
|
|
1300
|
+
"doctor.check.meta_manually_diverged.name": "Meta manual divergence",
|
|
1301
|
+
"doctor.check.meta_manually_diverged.ok.unreadable": "agents.meta.json \u4E0D\u53EF\u8BFB\uFF0C\u8DF3\u8FC7 divergence \u68C0\u67E5\u3002",
|
|
1302
|
+
"doctor.check.meta_manually_diverged.message.extra.singular": "agents.meta.json \u4E2D\u6709 {count} \u4E2A entry \u5728\u78C1\u76D8\u4E0A\u6CA1\u6709\u5BF9\u5E94\u6587\u4EF6\u3002\u8FD0\u884C --fix \u6267\u884C reconcile\u3002",
|
|
1303
|
+
"doctor.check.meta_manually_diverged.message.extra.plural": "agents.meta.json \u4E2D\u6709 {count} \u4E2A entries \u5728\u78C1\u76D8\u4E0A\u6CA1\u6709\u5BF9\u5E94\u6587\u4EF6\u3002\u8FD0\u884C --fix \u6267\u884C reconcile\u3002",
|
|
1304
|
+
"doctor.check.meta_manually_diverged.remediation.extra": "\u8FD0\u884C `fabric doctor --fix` \u8BA9 agents.meta.json \u4E0E\u78C1\u76D8\u4E0A\u5F53\u524D\u7684 rule files reconcile\u3002",
|
|
1305
|
+
"doctor.check.meta_manually_diverged.message.hash.singular": "agents.meta.json \u4E2D\u6709 {count} \u4E2A entry \u7684 hash \u4E0E\u78C1\u76D8\u6587\u4EF6\u4E0D\u5339\u914D\u3002\u8FD0\u884C --fix \u6267\u884C reconcile\u3002",
|
|
1306
|
+
"doctor.check.meta_manually_diverged.message.hash.plural": "agents.meta.json \u4E2D\u6709 {count} \u4E2A entries \u7684 hash \u4E0E\u78C1\u76D8\u6587\u4EF6\u4E0D\u5339\u914D\u3002\u8FD0\u884C --fix \u6267\u884C reconcile\u3002",
|
|
1307
|
+
"doctor.check.meta_manually_diverged.remediation.hash": "\u8FD0\u884C `fabric doctor --fix` \u8BA9 agents.meta.json \u4E0E\u5F53\u524D rule file \u5185\u5BB9 reconcile\u3002",
|
|
1308
|
+
"doctor.check.meta_manually_diverged.ok.consistent": "agents.meta.json \u4E0E\u78C1\u76D8\u4E0A\u7684 rule files \u4E00\u81F4\u3002",
|
|
1309
|
+
"doctor.check.knowledge_dir_unindexed.name": "Knowledge dir unindexed",
|
|
1310
|
+
"doctor.check.knowledge_dir_unindexed.message.singular": ".fabric/knowledge/ \u4E2D\u6709 {count} \u4E2A .md file \u672A\u7D22\u5F15\u5230 agents.meta.json\u3002\u8FD0\u884C `fabric doctor --fix` \u7D22\u5F15\u7F3A\u5931\u7684 knowledge files\u3002",
|
|
1311
|
+
"doctor.check.knowledge_dir_unindexed.message.plural": ".fabric/knowledge/ \u4E2D\u6709 {count} \u4E2A .md files \u672A\u7D22\u5F15\u5230 agents.meta.json\u3002\u8FD0\u884C `fabric doctor --fix` \u7D22\u5F15\u7F3A\u5931\u7684 knowledge files\u3002",
|
|
1312
|
+
"doctor.check.knowledge_dir_unindexed.remediation": "\u8FD0\u884C `fabric doctor --fix` \u7D22\u5F15\u7F3A\u5931\u7684 knowledge files\u3002",
|
|
1313
|
+
"doctor.check.knowledge_dir_unindexed.ok": "\u6240\u6709 .fabric/knowledge/ .md files \u90FD\u5DF2\u7D22\u5F15\u5230 agents.meta.json\u3002",
|
|
1314
|
+
"doctor.check.stable_id_collision.name": "Stable ID collision",
|
|
1315
|
+
"doctor.check.stable_id_collision.message.singular": 'stable_id "{stableId}" \u88AB\u58F0\u660E\u5728 {fileCount} \u4E2A\u6587\u4EF6\u4E2D\uFF1A{files}\u3002\u8BF7\u7F16\u8F91\u5176\u4E2D\u4E00\u4E2A knowledge file\uFF0C\u6539\u7528\u552F\u4E00 stable_id\u3002',
|
|
1316
|
+
"doctor.check.stable_id_collision.message.plural": '\u68C0\u6D4B\u5230 {count} \u4E2A stable_id collisions\u3002\u9996\u4E2A\uFF1A"{stableId}" \u4F4D\u4E8E {files}\u3002\u8BF7\u7F16\u8F91\u5176\u4E2D\u4E00\u4E2A knowledge file\uFF0C\u6539\u7528\u552F\u4E00 stable_id\u3002',
|
|
1317
|
+
// v2.0.0-rc.33 W3-2 (T6 #27): 走 fabric-review modify 流程让 canonical id allocator 重新分配, 而非让用户自己选 id (易撞 counter, 难手算)。
|
|
1318
|
+
"doctor.check.stable_id_collision.remediation": "\u8C03 `/fabric-review modify <message \u4E2D\u5217\u51FA\u7684 colliding id \u4E4B\u4E00>`, \u8BA9 canonical id allocator \u81EA\u52A8\u91CD\u5206\u914D id (\u4F1A\u540C\u6B65\u66F4\u65B0 frontmatter + counters + \u5386\u53F2 cross-ref)\u3002\u4E25\u7981\u624B\u5DE5\u7F16\u8F91 id frontmatter \u2014 \u4F1A\u649E counter\u3002",
|
|
1319
|
+
"doctor.check.stable_id_collision.ok": ".fabric/knowledge/ \u4E2D\u672A\u53D1\u73B0\u5DF2\u58F0\u660E\u7684 stable_id collisions\u3002",
|
|
1320
|
+
"doctor.check.counter_desync.name": "Knowledge counter desync",
|
|
1321
|
+
"doctor.check.counter_desync.message.singular": "{count} \u4E2A knowledge counter \u4E0E\u89C2\u6D4B\u5230\u7684 stable_ids \u4E0D\u540C\u6B65\u3002{counterPath} = {current}\uFF0C\u4F46\u68C0\u6D4B\u5230 {observedId}\u3002\u8FD0\u884C `fabric doctor --fix` bump counters\u3002",
|
|
1322
|
+
"doctor.check.counter_desync.message.plural": "{count} \u4E2A knowledge counters \u4E0E\u89C2\u6D4B\u5230\u7684 stable_ids \u4E0D\u540C\u6B65\u3002{counterPath} = {current}\uFF0C\u4F46\u68C0\u6D4B\u5230 {observedId}\u3002\u8FD0\u884C `fabric doctor --fix` bump counters\u3002",
|
|
1323
|
+
"doctor.check.counter_desync.remediation": "\u8FD0\u884C `fabric doctor --fix` \u5C06 agents.meta.json counters \u63D0\u5347\u5230\u89C2\u6D4B\u5230\u7684\u6700\u5927 counter \u503C\u3002",
|
|
1324
|
+
"doctor.check.counter_desync.ok": "agents.meta.json counters envelope \u4E0E\u89C2\u6D4B\u5230\u7684 stable_ids \u4E00\u81F4\u3002",
|
|
1325
|
+
"doctor.check.preexisting_root_files.name": "Preexisting root markdown",
|
|
1326
|
+
"doctor.check.preexisting_root_files.ok": "project root \u672A\u68C0\u6D4B\u5230 CLAUDE.md \u6216 AGENTS.md\u3002",
|
|
1327
|
+
"doctor.check.preexisting_root_files.message": "project root \u68C0\u6D4B\u5230 {files}\u3002\u8FD9\u4E9B root files \u4E0D\u4F1A\u88AB Fabric MCP \u81EA\u52A8\u52A0\u8F7D\u3002",
|
|
1328
|
+
"doctor.check.preexisting_root_files.remediation": "\u5982\u679C\u5E0C\u671B\u8FD9\u4E9B knowledge \u5185\u5BB9\u5728 MCP \u54CD\u5E94\u4E2D\u53EF\u7528\uFF0C\u8BF7\u5C06\u5176\u79FB\u52A8\u5230 `.fabric/knowledge/{type}/`\u3002",
|
|
1329
|
+
"doctor.check.filesystem_edit_fallback.name": "Filesystem-edit fallback",
|
|
1330
|
+
"doctor.check.filesystem_edit_fallback.ok": "No orphan canonical knowledge entries detected\uFF1Bevents.jsonl promotion trail \u5B8C\u6574\u3002",
|
|
1331
|
+
"doctor.check.filesystem_edit_fallback.message.synthesized.singular": "\u5DF2\u4E3A\u5B64\u7ACB canonical entries \u5408\u6210 {count} \u4E2A knowledge_promoted event\uFF08{sample}{suffix}\uFF09\u3002Reason='{reason}'\u3002",
|
|
1332
|
+
"doctor.check.filesystem_edit_fallback.message.synthesized.plural": "\u5DF2\u4E3A\u5B64\u7ACB canonical entries \u5408\u6210 {count} \u4E2A knowledge_promoted events\uFF08{sample}{suffix}\uFF09\u3002Reason='{reason}'\u3002",
|
|
1333
|
+
"doctor.check.filesystem_edit_fallback.remediation.synthesized": "\u8FD9\u4E9B entries \u662F\u5728 fab_review.approve \u4E4B\u5916\u88AB\u79FB\u52A8\u5230 .fabric/knowledge/<type>/ \u7684\u3002\u5408\u6210 events \u4F1A\u6062\u590D audit-trail \u5B8C\u6574\u6027\u3002",
|
|
1334
|
+
"doctor.check.orphan_demote.name": "Knowledge orphan demote",
|
|
1335
|
+
"doctor.check.orphan_demote.ok": "\u6CA1\u6709 canonical knowledge entries \u8D85\u8FC7\u6309 maturity \u8BBE\u5B9A\u7684 inactivity threshold\u3002",
|
|
1336
|
+
"doctor.check.orphan_demote.message.singular": "{count} \u4E2A canonical knowledge entry \u8D85\u8FC7\u6309 maturity \u8BBE\u5B9A\u7684 inactivity threshold\uFF08stable={stableDays}d / endorsed={endorsedDays}d / draft={draftDays}d\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1337
|
+
"doctor.check.orphan_demote.message.plural": "{count} \u4E2A canonical knowledge entries \u8D85\u8FC7\u6309 maturity \u8BBE\u5B9A\u7684 inactivity threshold\uFF08stable={stableDays}d / endorsed={endorsedDays}d / draft={draftDays}d\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1338
|
+
"doctor.check.orphan_demote.remediation": "\u8FD0\u884C `fabric doctor --fix-knowledge`\u5C06 orphan entries \u964D\u7EA7\u4E00\u4E2A maturity tier\u3002",
|
|
1339
|
+
"doctor.check.stale_archive.name": "Knowledge stale archive",
|
|
1340
|
+
"doctor.check.stale_archive.ok": "\u6CA1\u6709 draft knowledge entries \u8D85\u8FC7\u989D\u5916\u7684 stale-archive quiet window\u3002",
|
|
1341
|
+
"doctor.check.stale_archive.message.singular": "{count} \u4E2A draft knowledge entry \u5DF2\u8D85\u8FC7 demote+{additionalDays}d \u989D\u5916 quiet window\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1342
|
+
"doctor.check.stale_archive.message.plural": "{count} \u4E2A draft knowledge entries \u5DF2\u8D85\u8FC7 demote+{additionalDays}d \u989D\u5916 quiet window\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1343
|
+
"doctor.check.stale_archive.remediation": "\u8FD0\u884C `fabric doctor --fix-knowledge`\u5C06 stale entries \u79FB\u52A8\u5230 `.fabric/.archive/<type>/`\u3002",
|
|
1344
|
+
"doctor.check.pending_overdue.name": "Knowledge pending overdue",
|
|
1345
|
+
"doctor.check.pending_overdue.ok": "\u6CA1\u6709 pending knowledge entries \u8D85\u8FC7 14-day review threshold\u3002",
|
|
1346
|
+
"doctor.check.pending_overdue.message.singular": "{count} \u4E2A pending knowledge entry \u5DF2\u7B49\u5F85 review \u8D85\u8FC7 {thresholdDays} \u5929\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1347
|
+
"doctor.check.pending_overdue.message.plural": "{count} \u4E2A pending knowledge entries \u5DF2\u7B49\u5F85 review \u8D85\u8FC7 {thresholdDays} \u5929\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1348
|
+
"doctor.check.pending_overdue.remediation": "\u901A\u8FC7 fabric-review Skill\uFF08`/fabric-review`\uFF09\u5BA1\u9605 pending entries\uFF0C\u5E76\u6267\u884C approve / reject / defer / modify\u3002",
|
|
1349
|
+
"doctor.check.stable_id_duplicate.name": "Knowledge stable_id duplicate",
|
|
1350
|
+
"doctor.check.stable_id_duplicate.ok": "team / personal trees \u4E2D\u6CA1\u6709 canonical knowledge files \u5171\u4EAB stable_id\u3002",
|
|
1351
|
+
"doctor.check.stable_id_duplicate.message.singular": "{count} \u4E2A stable_id \u5728 canonical knowledge files \u4E2D\u91CD\u590D\uFF08path-decoupled identity invariant\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1352
|
+
"doctor.check.stable_id_duplicate.message.plural": "{count} \u4E2A stable_ids \u5728 canonical knowledge files \u4E2D\u91CD\u590D\uFF08path-decoupled identity invariant\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1353
|
+
// v2.0.0-rc.33 W3-2 (T6 #34): 同 stable_id_collision — 走 fabric-review modify 让 allocator 分配新 id, 不让用户手算。
|
|
1354
|
+
"doctor.check.stable_id_duplicate.remediation": "\u8C03 `/fabric-review modify <message \u4E2D\u5217\u51FA\u7684 duplicate id \u4E4B\u4E00>`, \u7531 canonical id allocator \u5206\u914D\u65B0\u7684 `<prefix>-<type>-<counter>--<slug>.md` (\u4F1A\u540C\u6B65\u91CD\u547D\u540D\u6587\u4EF6 + \u66F4\u65B0 frontmatter + \u4FEE\u6B63 counters)\u3002",
|
|
1355
|
+
"doctor.check.layer_mismatch.name": "Knowledge layer mismatch",
|
|
1356
|
+
"doctor.check.layer_mismatch.ok": "\u6240\u6709 canonical knowledge files \u90FD\u4F4D\u4E8E stable_id prefix \u58F0\u660E\u7684 layer \u4E0B\u3002",
|
|
1357
|
+
"doctor.check.layer_mismatch.message.singular": "{count} \u4E2A canonical knowledge file \u4E0E\u5176 stable_id layer prefix \u7684\u7269\u7406\u4F4D\u7F6E\u4E0D\u4E00\u81F4\uFF08KT-* must live under team/, KP-* under personal/\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1358
|
+
"doctor.check.layer_mismatch.message.plural": "{count} \u4E2A canonical knowledge files \u4E0E\u5176 stable_id layer prefix \u7684\u7269\u7406\u4F4D\u7F6E\u4E0D\u4E00\u81F4\uFF08KT-* must live under team/, KP-* under personal/\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1359
|
+
// v2.0.0-rc.33 W3-2 (T6 #35): 加 skill 入口 (`/fabric-review modify <id>`) 让用户知道怎么 invoke。
|
|
1360
|
+
"doctor.check.layer_mismatch.remediation": "\u5C06\u6587\u4EF6\u79FB\u52A8\u5230\u6B63\u786E\u7684 layer root (KT-* \u2192 .fabric/knowledge/team/, KP-* \u2192 ~/.fabric/knowledge/personal/), \u6216\u8C03 `/fabric-review modify <message \u4E2D\u5217\u51FA\u7684 id>` \u5207\u6362\u5176 layer (\u4F1A\u76F8\u5E94\u91CD\u547D\u540D stable_id prefix)\u3002",
|
|
1361
|
+
"doctor.check.index_drift.name": "Knowledge index drift",
|
|
1362
|
+
"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",
|
|
1363
|
+
"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",
|
|
1364
|
+
"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",
|
|
1365
|
+
"doctor.check.index_drift.remediation": "\u8FD0\u884C `fabric doctor --fix-knowledge`\u5C06 agents.meta.json counters \u63D0\u5347\u5230 max_observed + 1\u3002",
|
|
1366
|
+
"doctor.check.underseeded.name": "Knowledge underseeded",
|
|
1367
|
+
"doctor.check.underseeded.ok": "\u77E5\u8BC6\u5E93\u5DF2\u6709 {count} \u4E2A canonical entries\uFF08>= {threshold}\uFF09\u3002",
|
|
1368
|
+
"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",
|
|
1369
|
+
"doctor.check.underseeded.message.plural": "\u77E5\u8BC6\u5E93\u4EC5\u6709 {count} \u4E2A canonical entries\uFF08< {threshold} threshold\uFF09\u3002plan_context \u68C0\u7D22\u9762\u4F4E\u4E8E\u53EF\u7528\u4E0B\u9650\u3002",
|
|
1370
|
+
"doctor.check.underseeded.remediation": "\u8FD0\u884C fabric-import Skill\uFF08`/fabric-import`\uFF09\u4ECE git history \u4E0E\u73B0\u6709\u6587\u6863\u56DE\u586B knowledge\u3002",
|
|
1371
|
+
"doctor.check.narrow_no_paths.name": "Knowledge narrow without paths",
|
|
1372
|
+
"doctor.check.narrow_no_paths.ok": "\u6CA1\u6709 narrow-scope canonical entries \u7684 relevance_paths array \u4E3A\u7A7A\u3002",
|
|
1373
|
+
"doctor.check.narrow_no_paths.message.singular": "{count} \u4E2A narrow-scope canonical entry \u7684 relevance_paths array \u4E3A\u7A7A\uFF08silent recall risk \u2014 narrow without anchors can never match a target path\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1374
|
+
"doctor.check.narrow_no_paths.message.plural": "{count} \u4E2A narrow-scope canonical entries \u7684 relevance_paths array \u4E3A\u7A7A\uFF08silent recall risk \u2014 narrow without anchors can never match a target path\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1375
|
+
"doctor.check.narrow_no_paths.remediation": "\u8C03 `/fabric-review` \u9009\u8BE5 entry \u2192 modify \u4E3A relevance_paths \u6DFB\u52A0 path anchors\uFF0C\u6216\u5C06 relevance_scope \u653E\u5BBD\u5230 broad\uFF1B\u4E5F\u53EF\u76F4\u63A5\u7F16\u8F91 entry frontmatter\u3002",
|
|
1376
|
+
"doctor.check.relevance_paths_dangling.name": "Knowledge relevance_paths dangling",
|
|
1377
|
+
"doctor.check.relevance_paths_dangling.ok": "\u6240\u6709 relevance_paths globs \u90FD\u80FD\u5728 workspace root \u4E0B\u89E3\u6790\u5230\u81F3\u5C11 1 \u4E2A\u6587\u4EF6\u3002",
|
|
1378
|
+
"doctor.check.relevance_paths_dangling.message.singular": "{count} \u4E2A relevance_paths glob \u5728\u5F53\u524D workspace \u4E2D\u89E3\u6790\u5230 0 \u4E2A\u6587\u4EF6\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1379
|
+
"doctor.check.relevance_paths_dangling.message.plural": "{count} \u4E2A relevance_paths globs \u5728\u5F53\u524D workspace \u4E2D\u89E3\u6790\u5230 0 \u4E2A\u6587\u4EF6\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1380
|
+
"doctor.check.relevance_paths_dangling.remediation": "\u66F4\u65B0 entry \u7684 relevance_paths\uFF0C\u79FB\u9664\u4E0D\u518D\u5339\u914D\u4EFB\u4F55\u6587\u4EF6\u7684 globs\uFF0C\u6216\u4F7F\u7528 `fab_review.modify` \u91CD\u5199 anchor set\u3002",
|
|
1381
|
+
"doctor.check.relevance_paths_drift.name": "Knowledge relevance_paths drift",
|
|
1382
|
+
"doctor.check.relevance_paths_drift.ok.skipped": "\u5DF2\u8DF3\u8FC7\uFF08git history unavailable\uFF1B\u65E0\u6CD5\u8BC4\u4F30 {windowDays}d drift window\uFF09\u3002",
|
|
1383
|
+
"doctor.check.relevance_paths_drift.ok.fresh": "\u6240\u6709 narrow-scope canonical entries \u90FD\u81F3\u5C11\u6709 1 \u4E2A relevance_path \u5728\u6700\u8FD1 {windowDays}d \u5185\u88AB\u89E6\u78B0\u3002",
|
|
1384
|
+
"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\uFF1A{detail}\u3002",
|
|
1385
|
+
"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\uFF1A{detail}\u3002",
|
|
1386
|
+
"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\uFF0C\u6216\u4F7F\u7528 `fab_review.reject` \u5F52\u6863\u3002",
|
|
1387
|
+
"doctor.check.personal_layer_path_misclassify.name": "Personal-layer path misclassify",
|
|
1388
|
+
"doctor.check.personal_layer_path_misclassify.ok": "\u6CA1\u6709 personal-layer entries \u7684 relevance_paths \u89E3\u6790\u5230\u5F53\u524D\u9879\u76EE\u5185\u7684\u6587\u4EF6\u3002",
|
|
1389
|
+
"doctor.check.personal_layer_path_misclassify.message.singular": "{count} \u4E2A personal-layer entry \u7684 relevance_paths \u547D\u4E2D\u5F53\u524D\u9879\u76EE\u5185\u7684\u6587\u4EF6\uFF08personal \u5C42\u5E94\u4FDD\u6301\u9879\u76EE\u65E0\u5173\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1390
|
+
"doctor.check.personal_layer_path_misclassify.message.plural": "{count} \u4E2A personal-layer entries \u7684 relevance_paths \u547D\u4E2D\u5F53\u524D\u9879\u76EE\u5185\u7684\u6587\u4EF6\uFF08personal \u5C42\u5E94\u4FDD\u6301\u9879\u76EE\u65E0\u5173\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1391
|
+
"doctor.check.personal_layer_path_misclassify.remediation": "\u7528 `fab_review.modify` \u628A layer \u7FFB\u6210 team\uFF0C\u6216\u91CD\u5199 relevance_paths \u8BA9 anchors \u4FDD\u6301\u9879\u76EE\u65E0\u5173\uFF08\u5220\u6389\u9879\u76EE\u7279\u5B9A globs\uFF09\u3002",
|
|
1392
|
+
"doctor.check.suspicious_kb.name": "Suspicious KB injection",
|
|
1393
|
+
"doctor.check.suspicious_kb.ok": "\u6240\u6709 canonical knowledge body \u5747\u672A\u547D\u4E2D\u5DF2\u77E5 prompt-injection \u6A21\u5F0F\u3002",
|
|
1394
|
+
"doctor.check.suspicious_kb.message.singular": "{count} \u4E2A canonical entry body \u542B\u547D\u4E2D prompt-injection \u6A21\u5F0F\u7684 token\uFF08\u591A\u534A\u662F NEW-31 \u4E4B\u524D\u5F52\u6863\u7684 legacy \u6761\u76EE\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1395
|
+
"doctor.check.suspicious_kb.message.plural": "{count} \u4E2A canonical entry bodies \u542B\u547D\u4E2D prompt-injection \u6A21\u5F0F\u7684 token\uFF08\u591A\u534A\u662F NEW-31 \u4E4B\u524D\u5F52\u6863\u7684 legacy \u6761\u76EE\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1396
|
+
"doctor.check.suspicious_kb.remediation": "\u5BA1\u9605\u88AB\u6807\u8BB0\u7684\u6761\u76EE \u2014 \u7528 `fab_review.modify` \u64E6\u6389 body \u4E2D\u7684 injection token\uFF0C\u6216 `fab_review.reject` \u5F52\u6863\u4E0D\u8BE5 canonicalize \u7684\u6761\u76EE\u3002",
|
|
1397
|
+
"doctor.check.narrow_too_few.name": "Knowledge narrow too few",
|
|
1398
|
+
"doctor.check.narrow_too_few.ok": "Narrow-with-paths ratio {ratioPct}%\uFF08{narrowCount}/{totalCount}\uFF09\uFF1B{teleNote}\u3002",
|
|
1399
|
+
"doctor.check.narrow_too_few.message.telemetry_skipped": "telemetry skipped\uFF08no edit-counter fires in window\uFF09",
|
|
1400
|
+
"doctor.check.narrow_too_few.message.telemetry_window": "silence rate {silencePct}% over {windowDays}d",
|
|
1401
|
+
"doctor.check.narrow_too_few.message.structural": "narrow-with-paths share {ratioPct}%\uFF08{narrowCount}/{totalCount}\uFF09below {thresholdPct}% threshold",
|
|
1402
|
+
"doctor.check.narrow_too_few.message.telemetry": "narrow-hook silence rate {silencePct}%\uFF08{silenceFires}/{totalFires}\uFF09over {windowDays}d above {thresholdPct}% threshold",
|
|
1403
|
+
"doctor.check.narrow_too_few.message.summary": "Narrow-scope KB coverage \u4F4E\u4E8E\u53EF\u7528\u4E0B\u9650\uFF1A{parts}\u3002",
|
|
1404
|
+
"doctor.check.narrow_too_few.remediation": "\u8FD0\u884C fabric-import Skill\uFF08`/fabric-import`\uFF09\u9488\u5BF9\u5F53\u524D codebase \u91CD\u65B0\u64AD\u79CD narrow anchors\u3002",
|
|
1405
|
+
"doctor.check.session_hints_stale.name": "Knowledge session-hints stale",
|
|
1406
|
+
"doctor.check.session_hints_stale.ok": ".fabric/.cache/ \u4E0B\u6CA1\u6709\u8D85\u8FC7 {days} \u5929\u7684 session-hints cache files\u3002",
|
|
1407
|
+
"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",
|
|
1408
|
+
"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",
|
|
1409
|
+
"doctor.check.session_hints_stale.remediation": "\u8FD0\u884C `fabric doctor --fix-knowledge` \u5220\u9664\u8FC7\u671F\u7684 session-hints cache files\u3002",
|
|
1410
|
+
"doctor.check.stale_serve_lock.name": "Serve lock",
|
|
1411
|
+
"doctor.check.stale_serve_lock.ok.no_lock": "\u672A\u53D1\u73B0 .fabric/.serve.lock\u3002",
|
|
1412
|
+
"doctor.check.stale_serve_lock.ok.live_pid": ".fabric/.serve.lock \u7531 live PID {pid} \u6301\u6709\u3002",
|
|
1413
|
+
"doctor.check.stale_serve_lock.age.day.singular": "{count} \u5929\u524D",
|
|
1414
|
+
"doctor.check.stale_serve_lock.age.day.plural": "{count} \u5929\u524D",
|
|
1415
|
+
"doctor.check.stale_serve_lock.age.hour.singular": "{count} \u5C0F\u65F6\u524D",
|
|
1416
|
+
"doctor.check.stale_serve_lock.age.hour.plural": "{count} \u5C0F\u65F6\u524D",
|
|
1417
|
+
"doctor.check.stale_serve_lock.message.dead_pid": "[advisory] .fabric/.serve.lock \u6301\u6709 dead PID {pid}\uFF08acquired {acquiredAgo}\uFF09\u3002\u8FD0\u884C `fabric doctor --fix` \u79FB\u9664\u3002",
|
|
1418
|
+
"doctor.check.stale_serve_lock.remediation.dead_pid": "\u8FD0\u884C `fabric doctor --fix` \u79FB\u9664\u8FC7\u671F\u7684 .fabric/.serve.lock\u3002",
|
|
1419
|
+
"doctor.check.relevance_fields_missing.name": "Knowledge relevance fields missing",
|
|
1420
|
+
"doctor.check.relevance_fields_missing.ok": "\u6240\u6709 pending entries \u90FD\u58F0\u660E\u4E86 relevance_scope \u548C relevance_paths\u3002",
|
|
1421
|
+
"doctor.check.relevance_fields_missing.message.singular": "{count} \u4E2A pending entry \u7684 frontmatter \u7F3A\u5C11 relevance_scope \u548C/\u6216 relevance_paths\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1422
|
+
"doctor.check.relevance_fields_missing.message.plural": "{count} \u4E2A pending entries \u7684 frontmatter \u7F3A\u5C11 relevance_scope \u548C/\u6216 relevance_paths\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
|
|
1423
|
+
"doctor.check.relevance_fields_missing.remediation": "\u8FD0\u884C `fabric doctor --fix-knowledge` \u56DE\u586B schema defaults\uFF08relevance_scope: broad\uFF0Crelevance_paths: []\uFF09\u3002",
|
|
1424
|
+
// rc.31 BUG-M3/NEW-4: hooks_wired observability.
|
|
1425
|
+
"doctor.check.hooks_wired.name": "Claude Code hooks wired",
|
|
1426
|
+
"doctor.check.hooks_wired.ok.skipped": "\u9879\u76EE\u672A\u542F\u7528 Claude Code\uFF08\u65E0 .claude/ \u76EE\u5F55\uFF09\uFF1B\u8DF3\u8FC7 hooks_wired \u68C0\u67E5\u3002",
|
|
1427
|
+
"doctor.check.hooks_wired.ok.wired": ".claude/settings.json \u5DF2\u6CE8\u5165 Stop:fabric-hint / SessionStart:knowledge-hint-broad / PreToolUse:knowledge-hint-narrow \u4E09\u4E2A fabric hook\u3002",
|
|
1428
|
+
"doctor.check.hooks_wired.message.missing_settings": ".claude/ \u76EE\u5F55\u5B58\u5728\u4F46 .claude/settings.json \u7F3A\u5931\u6216\u65E0\u6CD5\u89E3\u6790\uFF1Bfabric install \u53EF\u80FD\u4ECE\u672A\u8DD1\u6210\u529F\uFF0C\u6216\u6587\u4EF6\u88AB\u5916\u90E8\u6E05\u7A7A\u3002",
|
|
1429
|
+
"doctor.check.hooks_wired.message.incomplete": ".claude/settings.json \u7F3A\u5C11 fabric hook \u6CE8\u5165\uFF1A{missing}\u3002fabric install \u7684 dry-run \u62A5\u544A\u4E0E\u5B9E\u9645\u72B6\u6001\u4E0D\u4E00\u81F4\uFF08rc.30 audit BUG-M3 / NEW-4\uFF09\u3002",
|
|
1430
|
+
"doctor.check.hooks_wired.remediation": "\u8FD0\u884C `fabric install` \u91CD\u65B0\u6CE8\u5165 hooks\uFF08\u5E42\u7B49\uFF1B\u53EA\u8865\u7F3A\u5931\u9879\uFF09\u3002\u82E5\u610F\u5916\u8986\u76D6\u4E86 hooks \u914D\u7F6E\uFF0C\u5148\u5907\u4EFD .claude/settings.json \u518D\u8DD1\u3002",
|
|
1431
|
+
// v2.0.0-rc.37 NEW-20: hooks_runtime — shebang + Node.js syntax validity
|
|
1432
|
+
// of installed *.cjs hook files (one layer below hooks_wired).
|
|
1433
|
+
"doctor.check.hooks_runtime.name": "Hooks \u8FD0\u884C\u65F6\u5065\u5EB7",
|
|
1434
|
+
"doctor.check.hooks_runtime.ok.skipped": "\u672A\u53D1\u73B0\u5DF2\u5B89\u88C5\u7684 hook \u6587\u4EF6\uFF08.claude/hooks/ / .codex/hooks/ / .cursor/hooks/ \u90FD\u7F3A\uFF09\uFF1B\u8DF3\u8FC7 hooks_runtime \u68C0\u67E5\u3002",
|
|
1435
|
+
"doctor.check.hooks_runtime.ok.healthy": "\u5DF2\u626B\u63CF {count} \u4E2A hook .cjs \u6587\u4EF6\uFF0Cshebang \u4E0E Node.js \u8BED\u6CD5\u89E3\u6790\u5168\u90E8\u901A\u8FC7\u3002",
|
|
1436
|
+
"doctor.check.hooks_runtime.message.singular": "{count} \u4E2A hook \u6587\u4EF6 runtime \u4E0D\u5065\u5EB7\uFF1B\u9996\u4F8B\uFF1A{first_path}\uFF08{first_detail}\uFF09\u3002",
|
|
1437
|
+
"doctor.check.hooks_runtime.message.plural": "{count} \u4E2A hook \u6587\u4EF6 runtime \u4E0D\u5065\u5EB7\uFF1B\u9996\u4F8B\uFF1A{first_path}\uFF08{first_detail}\uFF09\u3002",
|
|
1438
|
+
"doctor.check.hooks_runtime.remediation": "\u8FD0\u884C `fabric install` \u91CD\u5199\u635F\u574F\u7684 hook \u6587\u4EF6\uFF08\u8986\u76D6\u5F0F\uFF0C\u5E42\u7B49\uFF09\u3002\u82E5\u6587\u4EF6\u662F\u88AB\u5916\u90E8\u8FDB\u7A0B\u7834\u574F\u7684\uFF0C\u786E\u8BA4\u6E90\u5934\u518D\u8DD1 install\u3002",
|
|
1439
|
+
// v2.0.0-rc.37 NEW-27: hooks_content_drift — cross-client sha256 parity.
|
|
1440
|
+
"doctor.check.hooks_content_drift.name": "Hooks \u8DE8\u5BA2\u6237\u7AEF\u5185\u5BB9\u4E00\u81F4\u6027",
|
|
1441
|
+
"doctor.check.hooks_content_drift.ok.skipped": "\u672A\u53D1\u73B0\u8DE8\u5BA2\u6237\u7AEF\u5171\u5B58\u7684 hook \u6587\u4EF6\uFF08\u5355 client \u5B89\u88C5\u6216\u5168\u90E8\u7F3A\u5931\uFF09\uFF1B\u8DF3\u8FC7 hooks_content_drift \u68C0\u67E5\u3002",
|
|
1442
|
+
"doctor.check.hooks_content_drift.ok.aligned": "\u5DF2\u626B\u63CF {count} \u4E2A hook \u526F\u672C\uFF0C\u8DE8 client (.claude / .codex / .cursor) sha256 \u5168\u90E8\u4E00\u81F4\u3002",
|
|
1443
|
+
"doctor.check.hooks_content_drift.message": "{count} \u4E2A hook basename \u5728 client \u4E4B\u95F4\u5185\u5BB9 drift\uFF1B\u9996\u4F8B\uFF1A{first_basename}\uFF08\u6D89\u53CA {first_clients}\uFF09\u3002`fabric install` \u590D\u5236\u540C\u4E00\u6A21\u677F\u5230\u4E09 client\uFF0Cdrift \u901A\u5E38\u6765\u81EA\u624B\u52A8\u7F16\u8F91\u3002",
|
|
1444
|
+
"doctor.check.hooks_content_drift.remediation": "\u8FD0\u884C `fabric install` \u628A\u6240\u6709 client \u7684 hook \u526F\u672C\u6062\u590D\u5230 canonical \u6A21\u677F\u3002\u82E5\u4F60\u786E\u5B9E\u9700\u8981 client-specific hook \u884C\u4E3A\uFF0C\u5EFA\u8BAE\u6539 lib/ \u5171\u4EAB\u811A\u672C\u6216 templates/hooks/configs/ \u914D\u7F6E\u800C\u975E\u76F4\u63A5\u7F16\u8F91\u5B89\u88C5\u540E\u7684 .cjs\u3002",
|
|
1445
|
+
// rc.31 BUG-G2/G5: promote-ledger invariant check.
|
|
1446
|
+
"doctor.check.promote_ledger_invariant.name": "Promote ledger invariant",
|
|
1447
|
+
"doctor.check.promote_ledger_invariant.ok": "knowledge_proposed={proposed} \u2265 knowledge_promote_started={started} \u2265 knowledge_promoted={promoted}\uFF0Cledger \u4E0D\u53D8\u91CF\u6301\u6709\u3002",
|
|
1448
|
+
"doctor.check.promote_ledger_invariant.message.proposed-lt-started": "knowledge_proposed={proposed} \u5C0F\u4E8E knowledge_promote_started={started}\uFF08ledger \u4E0D\u53D8\u91CF\u88AB\u7834\u574F\uFF1B\u90E8\u5206 pending \u5728 approve \u65F6\u672A\u7ECF\u8FC7 fab_extract_knowledge \u2192 \u7F3A\u5C11 propose \u4E8B\u4EF6\uFF09\u3002",
|
|
1449
|
+
"doctor.check.promote_ledger_invariant.message.started-lt-promoted": "knowledge_promote_started={started} \u5C0F\u4E8E knowledge_promoted={promoted}\uFF08ledger \u4E0D\u53D8\u91CF\u88AB\u7834\u574F\uFF1B\u5B58\u5728\u672A\u914D\u5BF9\u7684 promoted \u4E8B\u4EF6\uFF0C\u53EF\u80FD\u6765\u81EA doctor filesystem-edit fallback \u6216\u5916\u90E8\u5199\u5165\uFF09\u3002",
|
|
1450
|
+
"doctor.check.promote_ledger_invariant.remediation": "rc.31 \u8D77 review.approve \u4F1A\u8865\u53D1 knowledge_proposed \u4E8B\u4EF6\u4EE5\u7EF4\u62A4\u4E0D\u53D8\u91CF\uFF1B\u65B0 approve \u540E\u518D\u8DD1\u4E00\u6B21 fabric doctor \u5373\u53EF\u6062\u590D\u3002\u5386\u53F2\u5931\u8861\u4EC5\u662F\u53EF\u89C2\u6D4B\u6027\u6307\u793A\uFF0C\u4E0D\u5F71\u54CD KB \u529F\u80FD\u3002",
|
|
1451
|
+
// rc.35 TASK-04 (P0-9.b): global_cli_outdated.
|
|
1452
|
+
"doctor.check.global_cli_outdated.name": "\u5168\u5C40 fabric CLI \u7248\u672C",
|
|
1453
|
+
"doctor.check.global_cli_outdated.ok": "PATH \u4E0A\u7684 `fabric` \u662F {version}\uFF0C\u4E0E rc.31+ \u9879\u76EE schema \u517C\u5BB9\u3002",
|
|
1454
|
+
"doctor.check.global_cli_outdated.message.outdated": "PATH \u4E0A\u7684 `fabric` \u662F {version}\uFF0C\u4F4E\u4E8E\u6700\u4F4E\u652F\u6301\u7248\u672C {minVersion}\u3002rc.31 \u4FEE\u590D\u4E86 agents.meta.json schema\uFF0C\u65E7\u7248 CLI \u5B89\u88C5\u7684 hook \u4F1A\u9759\u9ED8\u5931\u6548\uFF0C\u5FC5\u987B\u5347\u7EA7\u3002",
|
|
1455
|
+
"doctor.check.global_cli_outdated.message.not_found": "PATH \u4E0A\u627E\u4E0D\u5230 `fabric` \u4E8C\u8FDB\u5236\u3002`fabric install` / `fabric doctor` \u90FD\u4F9D\u8D56\u5B83\uFF0C\u8BF7\u5148\u5168\u5C40\u5B89\u88C5\u3002",
|
|
1456
|
+
"doctor.check.global_cli_outdated.message.unparseable": "\u65E0\u6CD5\u89E3\u6790 `fabric -v` \u8F93\u51FA\uFF08{detail}\uFF09\uFF0C\u8DF3\u8FC7\u7248\u672C\u68C0\u67E5\u3002",
|
|
1457
|
+
"doctor.check.global_cli_outdated.remediation": "\u8FD0\u884C `npm install -g @fenglimg/fabric-cli@latest`\uFF0C\u7136\u540E\u5230\u6BCF\u4E2A fabric-managed \u9879\u76EE\u4E0B\u91CD\u8DD1 `fabric install` \u540C\u6B65 hook + SKILL.md\u3002",
|
|
1458
|
+
// rc.35 TASK-05 (P0-10.a): knowledge_summary_opaque.
|
|
1459
|
+
"doctor.check.knowledge_summary_opaque.name": "\u77E5\u8BC6 summary \u900F\u660E\u5EA6",
|
|
1460
|
+
"doctor.check.knowledge_summary_opaque.ok.skipped": "agents.meta.json \u7F3A\u5931\u6216\u65E0\u6548\uFF0C\u8DF3\u8FC7 summary \u900F\u660E\u5EA6\u68C0\u67E5\u3002",
|
|
1461
|
+
"doctor.check.knowledge_summary_opaque.ok": "{opaque}/{total} \u4E2A entry \u7684 summary == stable_id\uFF0C\u6BD4\u4F8B\u5728\u5065\u5EB7\u8303\u56F4\u5185\u3002",
|
|
1462
|
+
"doctor.check.knowledge_summary_opaque.message.warn": "{opaque}/{total} \u4E2A entry ({pct}%) \u7684 description.summary \u7B49\u4E8E stable_id\uFF0C\u8D85\u8FC7 {threshold}% \u9608\u503C\u3002narrow hint \u8F93\u51FA\u4F1A\u53D8\u6210 `<id> \xB7 <id>` \u800C\u975E\u771F\u5B9E\u6982\u8981\uFF0CAI \u770B\u4E0D\u5230\u4FE1\u606F\u4F1A\u4E3B\u52A8\u8DF3\u8FC7 fetch\u3002\u9996\u6279\u4E0D\u900F\u660E: {sample}\u3002",
|
|
1463
|
+
"doctor.check.knowledge_summary_opaque.remediation": "\u8C03 fabric-review skill \u91CD\u5199\u4E0D\u900F\u660E summary \u4E3A\u4E00\u53E5\u4EBA\u7C7B\u53EF\u8BFB\u7684\u6982\u8981\u3002rc.35 hint renderer fallback (TASK-06) \u4E5F\u4F1A\u4ECE entry \u7684 `## Summary` \u6BB5\u81EA\u52A8\u5408\u6210\u4E34\u65F6 summary\u3002",
|
|
1464
|
+
"doctor.check.skill_md_yaml_invalid.name": "Skill markdown YAML",
|
|
1465
|
+
"doctor.check.skill_md_yaml_invalid.ok": "\u6240\u6709 .claude/.codex SKILL.md frontmatter values \u90FD\u80FD\u6309 strict YAML \u89E3\u6790\u3002",
|
|
1466
|
+
"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",
|
|
1467
|
+
"doctor.check.skill_md_yaml_invalid.message.plural": "{count} \u4E2A SKILL.md frontmatter values \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",
|
|
1468
|
+
"doctor.check.skill_md_yaml_invalid.remediation": '\u4F7F\u7528\u53CC\u5F15\u53F7\u5305\u88F9\u8BE5 value\uFF08`description: "\u2026"`\uFF09\uFF0C\u6216\u5C06\u5185\u90E8\u7684 `key: value` token \u6539\u5199\u4E3A `key=value`\u3002',
|
|
1469
|
+
"doctor.check.onboard_coverage.name": "Onboard coverage",
|
|
1470
|
+
"doctor.check.onboard_coverage.ok.complete": "Onboard coverage\uFF1A{filledCount}/{total} \u2713\uFF08opted-out\uFF1A{optedOutCount}\uFF09\u3002",
|
|
1471
|
+
"doctor.check.onboard_coverage.message.incomplete": "\u5C1A\u672A\u8986\u76D6\u7684 onboard slots\uFF1A[{missingSlots}]\u3002{filledCount}/{total} filled\uFF1B{optedOutCount} opted-out\u3002",
|
|
1472
|
+
"doctor.check.onboard_coverage.remediation.incomplete": "\u8FD0\u884C /fabric-archive \u6267\u884C onboard \u2014 Skill's first-run phase \u4F1A\u904D\u5386\u9879\u76EE\uFF0C\u5E76\u4E3A\u6BCF\u4E2A unclaimed slot \u63D0\u8BAE pending entries\u3002",
|
|
1473
|
+
// v2.0.0-rc.25 TASK-10: --archive-history 子命令——按 session 维度审计归档尝试记录。
|
|
1474
|
+
"cli.doctor.args.archive-history.description": "\u6309 session \u7EF4\u5EA6\u6E32\u67D3\u5F52\u6863\u5C1D\u8BD5\u5386\u53F2(\u53EA\u8BFB;\u8BFB\u53D6 session_archive_attempted \u4E8B\u4EF6)\u3002",
|
|
1475
|
+
"cli.doctor.errors.archive-history-mutex": "--archive-history \u4E0D\u80FD\u4E0E --fix / --fix-knowledge / --cite-coverage / --enrich-descriptions \u540C\u65F6\u4F7F\u7528,\u8BF7\u5206\u522B\u8FD0\u884C\u3002",
|
|
1476
|
+
"doctor.archive-history.header": "\u5F52\u6863\u5386\u53F2(\u6700\u8FD1 {sinceLabel},{count} \u4E2A\u4F1A\u8BDD)",
|
|
1477
|
+
"doctor.archive-history.empty": "\u6682\u65E0\u5F52\u6863\u5386\u53F2\u8BB0\u5F55 (--since={sinceLabel} \u7A97\u53E3\u5185)\u3002",
|
|
1478
|
+
"doctor.archive-history.table.session": "\u4F1A\u8BDD",
|
|
1479
|
+
"doctor.archive-history.table.lastAttempt": "\u6700\u8FD1\u5C1D\u8BD5",
|
|
1480
|
+
"doctor.archive-history.table.outcome": "\u7ED3\u679C",
|
|
1481
|
+
"doctor.archive-history.table.candidates": "\u5019\u9009\u6570",
|
|
1482
|
+
"doctor.archive-history.table.coveredGap": "\u8986\u76D6\u8DDD\u4ECA",
|
|
1483
|
+
// rc.37 NEW-33: 统一 --history <mode> 视图 (archive | fix | all)。
|
|
1484
|
+
"cli.doctor.args.history.description": "\u6E32\u67D3\u7EDF\u4E00\u7684\u9010\u65E5 doctor / archive \u5386\u53F2 (mode: archive | fix | all)\u3002\u53EA\u8BFB;\u4E0E --fix / --fix-knowledge / --cite-coverage / --enrich-descriptions / --archive-history \u4E92\u65A5\u3002",
|
|
1485
|
+
"cli.doctor.errors.history-mutex": "--history \u4E0D\u80FD\u4E0E --fix / --fix-knowledge / --cite-coverage / --enrich-descriptions / --archive-history \u7EC4\u5408\u3002\u8BF7\u5206\u522B\u8FD0\u884C\u3002",
|
|
1486
|
+
"cli.doctor.errors.invalid-history-mode": "\u65E0\u6548\u7684 --history mode '{input}'\u3002\u53EF\u9009: archive | fix | all\u3002",
|
|
1487
|
+
"doctor.history.header": "Doctor \u5386\u53F2 (mode={mode}, \u8FD1 {sinceLabel}, \u5171 {days} \u5929)",
|
|
1488
|
+
"doctor.history.empty": "--since={sinceLabel} \u7A97\u53E3\u5185\u65E0 doctor \u6216 archive \u6D3B\u52A8 (mode={mode})\u3002",
|
|
1489
|
+
"cli.hooks.description": "\u7BA1\u7406 Fabric Git \u94A9\u5B50\u6A21\u677F\u3002",
|
|
1490
|
+
"cli.hooks.install.description": "\u5B89\u88C5 Fabric Husky pre-commit \u94A9\u5B50\u6A21\u677F\u3002",
|
|
1491
|
+
"cli.hooks.install.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
|
|
1492
|
+
"cli.hooks.errors.package-json-required": "\u5B89\u88C5 hooks \u9700\u8981 package.json\uFF1A{path}",
|
|
1493
|
+
"cli.hooks.install.hook-skipped": "{path} \u4E2D\u5DF2\u5B58\u5728 Fabric hook\uFF0C\u5DF2\u8DF3\u8FC7\u3002",
|
|
1494
|
+
"cli.hooks.install.hook-appended": "\u5DF2\u5411\u73B0\u6709 {path} \u8FFD\u52A0 Fabric hook",
|
|
1495
|
+
"cli.hooks.install.hook-created": "\u5DF2\u521B\u5EFA {path}",
|
|
1496
|
+
"cli.hooks.install.prepare-left": "\u4FDD\u7559 {path} \u4E2D\u539F\u6709\u7684 prepare \u811A\u672C\u4E0D\u53D8",
|
|
1497
|
+
"cli.hooks.install.prepare-added": "\u5DF2\u5411 {path} \u6DFB\u52A0 prepare \u811A\u672C",
|
|
1498
|
+
"cli.human-lint.description": "\u9A8C\u8BC1\u9501\u5B9A\u7684\u4EBA\u5DE5\u7F16\u8F91\u533A\u5757\u3002",
|
|
1499
|
+
"cli.human-lint.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
|
|
1500
|
+
"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",
|
|
1501
|
+
"cli.human-lint.table.location": "\u4F4D\u7F6E",
|
|
1502
|
+
"cli.human-lint.table.expected": "\u9884\u671F",
|
|
1503
|
+
"cli.human-lint.table.got": "\u5B9E\u9645",
|
|
1504
|
+
"cli.install.description": "\u5728\u76EE\u6807\u9879\u76EE\u4E2D\u5B89\u88C5 Fabric\uFF08\u811A\u624B\u67B6 .fabric/\u3001bootstrap \u6A21\u677F\u3001MCP \u5BA2\u6237\u7AEF\u914D\u7F6E\u3001git hooks\uFF09\u3002\n\n\u793A\u4F8B\uFF1A\n fabric install \u5728\u5F53\u524D\u9879\u76EE\u4E2D\u4EE5\u4EA4\u4E92\u6A21\u5F0F\u5B89\u88C5\n fabric install --yes \u63A5\u53D7\u9ED8\u8BA4\u503C\uFF0C\u8DF3\u8FC7 TTY \u5411\u5BFC\n fabric install --dry-run \u4EC5\u9884\u89C8\u5B89\u88C5\u8BA1\u5212\uFF0C\u4E0D\u5199\u5165\u6587\u4EF6",
|
|
1505
|
+
"cli.install.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",
|
|
1506
|
+
"cli.install.args.debug.description": "\u5C06\u76EE\u6807\u89E3\u6790\u7EC6\u8282\u8F93\u51FA\u5230 stderr\u3002",
|
|
1507
|
+
"cli.install.args.yes.description": "\u63A5\u53D7\u5F53\u524D\u5B89\u88C5\u8BA1\u5212\u5E76\u8DF3\u8FC7 TTY \u5411\u5BFC\u76F4\u63A5\u6267\u884C",
|
|
1508
|
+
"cli.install.args.dry-run.description": "\u4EC5\u8F93\u51FA\u5B89\u88C5\u8BA1\u5212\uFF0C\u4E0D\u5199\u6587\u4EF6\u4E5F\u4E0D\u6267\u884C\u540E\u7EED\u9636\u6BB5",
|
|
1509
|
+
// rc.35 TASK-08 (P0-5/6): --force-skills-only。
|
|
1510
|
+
"cli.install.args.force-skills-only.description": "\u8DF3\u8FC7 bootstrap / MCP / hooks / settings,\u53EA\u91CD\u65B0\u5237\u65B0 fabric Skill \u6A21\u677F (.claude/.codex/.cursor/skills/*)\u3002",
|
|
1511
|
+
"cli.install.force-skills-only.banner": "\u53EA\u5237\u65B0 fabric Skill \u6A21\u677F",
|
|
1512
|
+
"cli.install.force-skills-only.uninitialised.message": "fabric install --force-skills-only: \u9879\u76EE\u672A\u521D\u59CB\u5316(\u627E\u4E0D\u5230 .fabric/agents.meta.json)\u3002",
|
|
1513
|
+
"cli.install.force-skills-only.uninitialised.hint": "\u8BF7\u5148\u8FD0\u884C `fabric install`(\u4E0D\u5E26 --force-skills-only)\u94FA\u8BBE\u57FA\u7840 scaffold;\u4E4B\u540E\u518D\u7528 --force-skills-only \u505A\u540E\u7EED Skill \u5237\u65B0\u3002",
|
|
1514
|
+
"cli.install.force-skills-only.summary": "Skill \u5237\u65B0\u5B8C\u6210 \u2014 \u5199\u5165: {written}, \u8DF3\u8FC7: {skipped}, \u9519\u8BEF: {errors}",
|
|
1515
|
+
// v2.0.0-rc.37 NEW-26: --force-hooks-only mirror of --force-skills-only。
|
|
1516
|
+
"cli.install.args.force-hooks-only.description": "\u8DF3\u8FC7 bootstrap / MCP / skills / settings,\u53EA\u91CD\u65B0\u5237\u65B0 fabric hook scripts + per-client hook config \u5408\u5E76 (.claude/.codex/.cursor/hooks/*)\u3002",
|
|
1517
|
+
"cli.install.force-hooks-only.banner": "\u53EA\u5237\u65B0 fabric hooks",
|
|
1518
|
+
"cli.install.force-hooks-only.uninitialised.message": "fabric install --force-hooks-only: \u9879\u76EE\u672A\u521D\u59CB\u5316(\u627E\u4E0D\u5230 .fabric/agents.meta.json)\u3002",
|
|
1519
|
+
"cli.install.force-hooks-only.uninitialised.hint": "\u8BF7\u5148\u8FD0\u884C `fabric install`(\u4E0D\u5E26 --force-hooks-only)\u94FA\u8BBE\u57FA\u7840 scaffold;\u4E4B\u540E\u518D\u7528 --force-hooks-only \u505A\u540E\u7EED hook \u5237\u65B0\u3002",
|
|
1520
|
+
"cli.install.force-hooks-only.summary": "Hooks \u5237\u65B0\u5B8C\u6210 \u2014 \u5199\u5165: {written}, \u8DF3\u8FC7: {skipped}, \u9519\u8BEF: {errors}",
|
|
1521
|
+
"cli.install.mcp.install.global": "\u4F7F\u7528\u5168\u5C40\u5B89\u88C5\u7684 @fenglimg/fabric-server",
|
|
1522
|
+
"cli.install.mcp.install.local": "\u5C06 @fenglimg/fabric-server \u5B89\u88C5\u5230\u9879\u76EE devDependencies",
|
|
1523
|
+
"cli.install.mcp.local.installing": "\u6B63\u5728\u8FD0\u884C {manager} add -D @fenglimg/fabric-server...",
|
|
1524
|
+
"cli.install.mcp.local.installed": "\u5DF2\u5B89\u88C5\u5230 devDependencies",
|
|
1525
|
+
"cli.install.mcp.scope.project": "\u5199\u5165\u9879\u76EE\u6839\u76EE\u5F55\u7684 .mcp.json\uFF08\u7B26\u5408 Claude Code \u89C4\u8303\uFF09",
|
|
1526
|
+
"cli.install.mcp.scope.user": "\u5199\u5165 ~/.claude.json\uFF08\u7528\u6237\u8303\u56F4\uFF0C\u9002\u7528\u4E8E\u6240\u6709\u9879\u76EE\uFF09",
|
|
1527
|
+
"cli.install.wizard.mcp-scope": "Claude MCP \u914D\u7F6E\u8303\u56F4\uFF08project/.mcp.json \u6216 user/~/.claude.json\uFF09[{defaultValue}]",
|
|
1528
|
+
"cli.install.created-path": "{label} {path}",
|
|
1529
|
+
"cli.install.skipped-existing-path": "{label} {path}\uFF1A\u5DF2\u5B58\u5728\u3002",
|
|
1530
|
+
"cli.install.label.overwritten": "\u5DF2\u8986\u76D6",
|
|
1531
|
+
"cli.install.stages.bootstrap": "\u6B63\u5728\u5B89\u88C5 bootstrap \u6A21\u677F...",
|
|
1532
|
+
"cli.install.stages.bootstrap.snapshot.written": "\u5DF2\u5199\u5165 .fabric/AGENTS.md \u5FEB\u7167",
|
|
1533
|
+
"cli.install.stages.bootstrap.snapshot.skipped": "\u5DF2\u8DF3\u8FC7 .fabric/AGENTS.md \u2014 \u5DF2\u662F\u6700\u65B0",
|
|
1534
|
+
"cli.install.steps.bootstrap-claude": "\u5DF2\u66F4\u65B0 CLAUDE.md \u7684 @-import \u5F15\u7528",
|
|
1535
|
+
"cli.install.steps.bootstrap-codex": "\u5DF2\u66F4\u65B0 AGENTS.md \u7684 fabric:bootstrap managed block",
|
|
1536
|
+
"cli.install.steps.bootstrap-cursor": "\u5DF2\u66F4\u65B0 .cursor/rules/fabric-bootstrap.mdc",
|
|
1537
|
+
"cli.install.stages.mcp": "\u6B63\u5728\u914D\u7F6E MCP \u5BA2\u6237\u7AEF...",
|
|
1538
|
+
"cli.install.stages.hooks": "\u6B63\u5728\u5B89\u88C5 git hooks...",
|
|
1539
|
+
"cli.install.stages.skipped": "\u5DF2\u8DF3\u8FC7",
|
|
1540
|
+
"cli.install.stages.completed": "\u5DF2\u5B8C\u6210",
|
|
1541
|
+
"cli.install.stages.failed": "\u5931\u8D25",
|
|
1542
|
+
"cli.install.stages.summary.ran": "\u5DF2\u6267\u884C",
|
|
1543
|
+
"cli.install.stages.summary.skipped": "\u5DF2\u8DF3\u8FC7",
|
|
1544
|
+
"cli.install.stages.summary.failed": "\u5931\u8D25",
|
|
1545
|
+
"cli.install.next-step": "{label} {message}",
|
|
1546
|
+
"cli.install.reason-message": "{label} {message}",
|
|
1547
|
+
"cli.install.language_preference_hint": "Fabric \u8BED\u8A00\u504F\u597D\uFF1A{value}\u3002\u5982\u9700\u8C03\u6574\uFF0C\u8BF7\u7F16\u8F91 .fabric/fabric-config.json \u4E2D\u7684 fabric_language \u5B57\u6BB5\uFF08\u53EF\u9009\u503C\uFF1Amatch-existing | zh-CN | en | zh-CN-hybrid\uFF09\u3002",
|
|
1548
|
+
"cli.install.plan.title": "Fabric \u5B89\u88C5\u8BA1\u5212",
|
|
1549
|
+
"cli.install.plan.mode-banner.default": "[mode: apply] \u6807\u51C6\u5B89\u88C5\u6267\u884C",
|
|
1550
|
+
"cli.install.plan.mode-banner.plan": "[mode: plan] \u4EC5\u9884\u89C8\uFF0C\u4E0D\u4F1A\u5199\u5165\u6587\u4EF6",
|
|
1551
|
+
"cli.install.plan.target": "\u76EE\u6807\uFF1A{target}",
|
|
1552
|
+
"cli.install.plan.actions": "\u8BA1\u5212\uFF1Abootstrap={bootstrap} mcp={mcp} hooks={hooks} mcp-install={mcpInstall}",
|
|
1553
|
+
"cli.install.plan.detected": "\u68C0\u6D4B\u5230\u7684\u5BA2\u6237\u7AEF\uFF1A{clients}",
|
|
1554
|
+
"cli.install.plan.writes": "\u6838\u5FC3\u5199\u5165\uFF1A",
|
|
1555
|
+
"cli.install.plan.preview-title": "Fabric \u5B89\u88C5 dry run",
|
|
1556
|
+
"cli.install.plan.preview-result": "\u6A21\u5F0F={mode} bootstrap={bootstrap} mcp={mcp} hooks={hooks}",
|
|
1557
|
+
"cli.install.mode.default": "default",
|
|
1558
|
+
"cli.install.mode.badge.default": "APPLY",
|
|
1559
|
+
"cli.install.mode.badge.plan": "PLAN",
|
|
1560
|
+
"cli.install.wizard.title": "Fabric \u5B89\u88C5\u5411\u5BFC",
|
|
1561
|
+
"cli.install.wizard.intro": "Fabric install",
|
|
1562
|
+
"cli.install.wizard.overview.title": "\u5B89\u88C5\u6982\u89C8",
|
|
1563
|
+
"cli.install.wizard.overview.body": "\u76EE\u6807\uFF1A{target}\n\u6A21\u5F0F\uFF1A{mode}\n\u8FD9\u4E2A\u5411\u5BFC\u53EA\u8D1F\u8D23\u8C03\u6574\u5B89\u88C5\u8BA1\u5212\uFF1B\u771F\u6B63\u6267\u884C\u4ECD\u7136\u8D70\u73B0\u6709\u7684 Fabric install \u9636\u6BB5\u3002",
|
|
1564
|
+
"cli.install.wizard.step.target": "\u786E\u8BA4\u76EE\u6807",
|
|
1565
|
+
"cli.install.wizard.step.plan": "\u914D\u7F6E\u5B89\u88C5\u8BA1\u5212",
|
|
1566
|
+
"cli.install.wizard.step.review": "\u590D\u6838\u6700\u7EC8\u8BA1\u5212",
|
|
1567
|
+
"cli.install.wizard.target.confirm": "\u786E\u8BA4\u5728 {target} \u4E2D\u7EE7\u7EED\u5B89\u88C5 Fabric\uFF1F[Y/n]",
|
|
1568
|
+
"cli.install.wizard.stage.bootstrap": "\u662F\u5426\u5B89\u88C5 bootstrap \u6A21\u677F\uFF1F[{defaultValue}]",
|
|
1569
|
+
"cli.install.wizard.stage.mcp": "\u662F\u5426\u914D\u7F6E MCP \u5BA2\u6237\u7AEF\uFF1F[{defaultValue}]",
|
|
1570
|
+
"cli.install.wizard.stage.hooks": "\u662F\u5426\u5B89\u88C5 git hooks\uFF1F[{defaultValue}]",
|
|
1571
|
+
"cli.install.wizard.mcp-install": "MCP \u670D\u52A1\u7AEF\u5B89\u88C5\u8303\u56F4\uFF08global/local\uFF09[{defaultValue}]",
|
|
1572
|
+
"cli.install.wizard.execute.confirm": "\u73B0\u5728\u6267\u884C\u8BE5\u5B89\u88C5\u8BA1\u5212\uFF1F[Y/n]",
|
|
1573
|
+
"cli.install.wizard.outro": "\u5B89\u88C5\u8BA1\u5212\u5DF2\u786E\u8BA4\uFF0C\u5F00\u59CB\u6267\u884C Fabric install...",
|
|
1574
|
+
"cli.install.wizard.invalid-yes-no": "\u8BF7\u8F93\u5165 yes \u6216 no\u3002",
|
|
1575
|
+
"cli.install.wizard.invalid-select": "\u65E0\u6548\u8F93\u5165\u3002\u53EF\u9009\u503C\uFF1A{options}\u3002",
|
|
1576
|
+
"cli.install.wizard.cancelled": "Fabric \u5B89\u88C5\u5DF2\u5728\u6267\u884C\u524D\u53D6\u6D88\u3002",
|
|
1577
|
+
"cli.install.capabilities.title": "\u5BA2\u6237\u7AEF\u80FD\u529B\u6458\u8981",
|
|
1578
|
+
// v2.0.0-rc.37 NEW-22: post-install 重启提示。MCP server 在 client 启动
|
|
1579
|
+
// 时 spawn, 已运行的 Claude Code / Cursor / Codex session 不会自动加载
|
|
1580
|
+
// 新 mcp config — 必须重启才能拿到 Fabric tools。
|
|
1581
|
+
"cli.install.restart-banner": "\u91CD\u542F\u63D0\u793A: \u5DF2\u8FD0\u884C\u7684 Claude Code / Cursor / Codex CLI session \u9700\u91CD\u542F\u624D\u80FD\u52A0\u8F7D\u65B0 MCP server \u914D\u7F6E;\u65B0\u4F1A\u8BDD\u4F1A\u81EA\u52A8\u4F7F\u7528 Fabric tools\u3002",
|
|
1582
|
+
"cli.install.next-steps": "\u4E0B\u4E00\u6B65 \u2014\u2014 \u62FF\u5230\u7B2C\u4E00\u4EFD\u4EF7\u503C:\n 1. \u91CD\u542F\u4F60\u7684 AI \u5BA2\u6237\u7AEF (Claude Code / Codex)\u3002\u5B83\u73B0\u5728\u4F1A\u81EA\u52A8\u628A\u672C\u9879\u76EE\u7684\u77E5\u8BC6 surface \u7ED9\u52A9\u624B\u3002\n 2. \u6C89\u6DC0\u77E5\u8BC6: \u6B63\u5E38\u5E72\u6D3B\u5373\u53EF \u2014\u2014 \u5F53\u4F60\u505A\u51B3\u7B56\u6216\u8E29\u5751\u65F6, fabric-archive skill \u4F1A\u63D0\u8BAE\u5165\u5E93; \u6216\u8DD1 fabric-import skill \u4ECE git \u5386\u53F2\u56DE\u704C\u3002\n 3. \u9A8C\u8BC1\u751F\u6548: \u95EE\u4F60\u7684 AI\u300CFabric \u5BF9\u8FD9\u4E2A repo \u77E5\u9053\u4E9B\u4EC0\u4E48?\u300D, \u6216\u8DD1 `fabric doctor` \u67E5\u5065\u5EB7\u3002",
|
|
1583
|
+
"cli.install.capabilities.none": "\u6CA1\u6709\u68C0\u6D4B\u5230\u53EF\u7528\u4E8E bootstrap \u6216 MCP \u540E\u7EED\u63A5\u529B\u7684\u53D7\u652F\u6301\u5BA2\u6237\u7AEF\u3002",
|
|
1584
|
+
"cli.install.capabilities.header.client": "\u5BA2\u6237\u7AEF",
|
|
1585
|
+
"cli.install.capabilities.header.bootstrap": "Bootstrap",
|
|
1586
|
+
"cli.install.capabilities.header.mcp": "MCP",
|
|
1587
|
+
"cli.install.capabilities.header.hook": "Hook",
|
|
1588
|
+
"cli.install.capabilities.header.skill": "Skill",
|
|
1589
|
+
"cli.install.capabilities.header.follow-up": "\u540E\u7EED\u52A8\u4F5C",
|
|
1590
|
+
"cli.install.capabilities.status.ready": "\u5DF2\u5C31\u7EEA",
|
|
1591
|
+
"cli.install.capabilities.status.installed": "\u5DF2\u5B89\u88C5",
|
|
1592
|
+
"cli.install.capabilities.status.supported": "\u5DF2\u652F\u6301",
|
|
1593
|
+
"cli.install.capabilities.status.manual": "\u624B\u52A8\u5904\u7406",
|
|
1594
|
+
"cli.install.capabilities.status.skipped": "\u5DF2\u8DF3\u8FC7",
|
|
1595
|
+
"cli.install.capabilities.status.failed": "\u5931\u8D25",
|
|
1596
|
+
"cli.install.capabilities.status.na": "\u4E0D\u9002\u7528",
|
|
1597
|
+
"cli.install.capabilities.follow-up.ready": "\u53EF\u5728\u5BA2\u6237\u7AEF\u7EE7\u7EED",
|
|
1598
|
+
"cli.install.capabilities.follow-up.install": "\u5B89\u88C5\u5BA2\u6237\u7AEF\u8D44\u4EA7",
|
|
1599
|
+
"cli.install.capabilities.follow-up.manual": "\u9700\u8981\u624B\u52A8\u540E\u7EED\u5904\u7406",
|
|
1600
|
+
"cli.install.next-step.message": "\u8FD0\u884C fabric hooks install \u4EE5\u6DFB\u52A0\u7B2C 4 \u5929\u7684 pre-commit \u6D41\u6C34\u7EBF\u3002",
|
|
1601
|
+
"cli.install.reason-message.installable-body": ".fabric/forensic.json \u5DF2\u5C31\u7EEA\uFF1B\u90E8\u5206\u5DF2\u68C0\u6D4B\u5230\u7684\u5BA2\u6237\u7AEF\u5DF2\u652F\u6301 Fabric \u540E\u7EED\u63A5\u529B\uFF0C\u4F46\u4ECD\u9700\u5B89\u88C5\u5BA2\u6237\u7AEF\u8D44\u4EA7\u3002",
|
|
1602
|
+
"cli.install.reason-message.manual-body": ".fabric/forensic.json \u5DF2\u5C31\u7EEA\uFF1B\u90E8\u5206\u5DF2\u68C0\u6D4B\u5230\u7684\u5BA2\u6237\u7AEF\u5C1A\u672A\u5B89\u88C5 Fabric skill\uFF0C\u9700\u8981\u624B\u52A8\u5B8C\u6210\u540E\u7EED\u5B89\u88C5\u3002",
|
|
1603
|
+
"cli.install.codex-hooks.created": "{label} {path}\uFF0C\u5E76\u5199\u5165 Codex hooks \u914D\u7F6E\uFF08\u9700\u542F\u7528 features.codex_hooks = true\uFF09\u3002",
|
|
1604
|
+
"cli.install.codex-hooks.updated": "{label} {path}\uFF0C\u5E76\u5199\u5165 Codex hooks \u914D\u7F6E\uFF08\u9700\u542F\u7528 features.codex_hooks = true\uFF09\u3002",
|
|
1605
|
+
"cli.install.codex-hooks.skipped": "{label} {path}\uFF1ACodex hooks \u914D\u7F6E\u5DF2\u5B58\u5728\u3002",
|
|
1606
|
+
"cli.install.claude-settings.created": "{label} {path}\uFF0C\u5E76\u5199\u5165 Claude Stop hook\u3002",
|
|
1607
|
+
"cli.install.claude-settings.updated": "{label} {path}\uFF0C\u5E76\u5199\u5165 Claude Stop hook\u3002",
|
|
1608
|
+
"cli.install.claude-settings.skipped": "{label} {path}\uFF1AClaude Stop hook \u5DF2\u5B58\u5728\u3002",
|
|
1609
|
+
"cli.install.claude-settings.skipped-invalid": "{label} {path}\uFF1A\u65E0\u6CD5\u5408\u5E76 Claude Stop hook\u3002",
|
|
1610
|
+
"cli.install.claude-settings.invalid-object": "{label} {path}\uFF1A\u9884\u671F\u4E3A JSON \u5BF9\u8C61\u3002",
|
|
1611
|
+
"cli.install.claude-settings.invalid-json": "{label} {path}\uFF1AJSON \u65E0\u6548\uFF08{reason}\uFF09\u3002",
|
|
1612
|
+
"cli.install.claude-settings.invalid-hooks": '{label} {path}\uFF1A"hooks" \u5FC5\u987B\u662F JSON \u5BF9\u8C61\u3002',
|
|
1613
|
+
"cli.install.claude-settings.invalid-stop-array": '{label} {path}\uFF1A"hooks.Stop" \u5FC5\u987B\u662F\u6570\u7EC4\u3002',
|
|
1614
|
+
"cli.install.errors.abort-existing": "\u4E2D\u6B62\uFF1A{path} \u5DF2\u5B58\u5728\u3002fabric install \u662F\u975E\u7834\u574F\u6027\u7684\u3002",
|
|
1615
|
+
"cli.install.diff.canonical": "\u5DE5\u4F5C\u533A\u5DF2\u662F\u89C4\u8303\u72B6\u6001\uFF08\u5DF2\u6821\u9A8C {count} \u4E2A\u6587\u4EF6\uFF09\u3002",
|
|
1616
|
+
"cli.install.diff.applying-missing": "\u6B63\u5728\u8865\u9F50 {count} \u4E2A\u7F3A\u5931\u9879\uFF1A{files}",
|
|
1617
|
+
"cli.install.diff.drift-abort": "\u68C0\u6D4B\u5230 {path} \u5DF2\u88AB\u4FEE\u6539\u3002\u8FD0\u884C `fabric doctor` \u8FDB\u884C\u68C0\u67E5\uFF0C\u6216 `fabric uninstall && fabric install` \u8FDB\u884C\u91CD\u7F6E\u3002",
|
|
1618
|
+
"cli.install.diff.state.missing": "\u7F3A\u5931",
|
|
1619
|
+
"cli.install.diff.state.present-canonical": "\u89C4\u8303",
|
|
1620
|
+
"cli.install.diff.state.drifted": "\u6F02\u79FB",
|
|
1621
|
+
"cli.install.diff.state.user-modified": "\u7528\u6237\u4FEE\u6539",
|
|
1622
|
+
"cli.uninstall.description": "\u4ECE\u76EE\u6807\u9879\u76EE\u4E2D\u5378\u8F7D Fabric\u3002.fabric/knowledge/ \u59CB\u7EC8\u4FDD\u7559\uFF1B~/.fabric/knowledge/ \u6C38\u4E0D\u53D7\u5F71\u54CD\u3002\n\n\u793A\u4F8B\uFF1A\n fabric uninstall \u5728\u5F53\u524D\u9879\u76EE\u4E2D\u4EE5\u4EA4\u4E92\u6A21\u5F0F\u5378\u8F7D\n fabric uninstall --yes \u63A5\u53D7\u9ED8\u8BA4\u503C\uFF0C\u8DF3\u8FC7 TTY \u5411\u5BFC\n fabric uninstall --dry-run \u4EC5\u9884\u89C8\u5378\u8F7D\u8BA1\u5212\uFF0C\u4E0D\u5220\u9664\u6587\u4EF6",
|
|
1623
|
+
"cli.uninstall.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",
|
|
1624
|
+
"cli.uninstall.args.debug.description": "\u5C06\u76EE\u6807\u89E3\u6790\u7EC6\u8282\u8F93\u51FA\u5230 stderr\u3002",
|
|
1625
|
+
"cli.uninstall.args.yes.description": "\u63A5\u53D7\u5F53\u524D\u5378\u8F7D\u8BA1\u5212\u5E76\u8DF3\u8FC7 TTY \u5411\u5BFC\u76F4\u63A5\u6267\u884C\u3002",
|
|
1626
|
+
"cli.uninstall.args.dry-run.description": "\u4EC5\u8F93\u51FA\u5378\u8F7D\u8BA1\u5212\uFF0C\u4E0D\u5220\u9664\u6587\u4EF6\u4E5F\u4E0D\u6267\u884C\u540E\u7EED\u9636\u6BB5\u3002",
|
|
1627
|
+
"cli.uninstall.plan.title": "Fabric \u5378\u8F7D\u8BA1\u5212",
|
|
1628
|
+
"cli.uninstall.plan.target": "\u76EE\u6807\uFF1A{target}",
|
|
1629
|
+
"cli.uninstall.plan.actions": "\u8BA1\u5212\uFF1Ascaffold={scaffold} bootstrap={bootstrap} mcp={mcp}",
|
|
1630
|
+
"cli.uninstall.plan.detected": "\u68C0\u6D4B\u5230\u7684\u5BA2\u6237\u7AEF\uFF1A{clients}",
|
|
1631
|
+
"cli.uninstall.plan.preserves": "\u4FDD\u7559\u9879\uFF1A",
|
|
1632
|
+
"cli.uninstall.plan.preserves.knowledge": "\u56E2\u961F\u77E5\u8BC6\u6811\uFF08\u59CB\u7EC8\u4FDD\u7559\uFF09",
|
|
1633
|
+
"cli.uninstall.plan.preserves.personal": "\u4E2A\u4EBA\u6839\u76EE\u5F55\uFF0C\u6C38\u4E0D\u89E6\u78B0",
|
|
1634
|
+
"cli.uninstall.plan.preview-title": "Fabric \u5378\u8F7D dry run",
|
|
1635
|
+
"cli.uninstall.plan.preview-result": "scaffold={scaffold} bootstrap={bootstrap} mcp={mcp}",
|
|
1636
|
+
"cli.uninstall.plan.scaffold-entries.title": "Scaffold \u5F85\u6E05\u7406\u9879\uFF1A",
|
|
1637
|
+
"cli.uninstall.stages.scaffold": "\u6B63\u5728\u6E05\u7406 scaffold \u4EA7\u7269...",
|
|
1638
|
+
"cli.uninstall.stages.bootstrap": "\u6B63\u5728\u79FB\u9664 bootstrap\uFF08Skills + hooks\uFF09...",
|
|
1639
|
+
"cli.uninstall.stages.mcp": "\u6B63\u5728\u53CD\u6CE8\u518C MCP \u5BA2\u6237\u7AEF...",
|
|
1640
|
+
"cli.uninstall.stages.completed": "\u5DF2\u5B8C\u6210",
|
|
1641
|
+
"cli.uninstall.stages.completed-with-errors": "\u5B8C\u6210\u4F46\u6709\u9519\u8BEF",
|
|
1642
|
+
"cli.uninstall.stages.failed": "\u5931\u8D25",
|
|
1643
|
+
"cli.uninstall.summary.title": "\u5378\u8F7D\u6458\u8981",
|
|
1644
|
+
"cli.uninstall.summary.body": "removed={removed} skipped={skipped} errors={errors}",
|
|
1645
|
+
"cli.uninstall.wizard.intro": "\u5378\u8F7D Fabric",
|
|
1646
|
+
"cli.uninstall.wizard.overview.title": "\u5378\u8F7D\u6982\u89C8",
|
|
1647
|
+
"cli.uninstall.wizard.overview.body": "\u76EE\u6807\uFF1A{target}\n\u8FD9\u4E2A\u5411\u5BFC\u53EA\u8D1F\u8D23\u8C03\u6574\u5378\u8F7D\u8BA1\u5212\uFF1B\u771F\u6B63\u6267\u884C\u4ECD\u7136\u8D70\u73B0\u6709\u7684 Fabric uninstall \u9636\u6BB5\u3002\n.fabric/knowledge/ \u59CB\u7EC8\u4FDD\u7559\uFF1B~/.fabric/knowledge/ \u6C38\u4E0D\u53D7\u5F71\u54CD\u3002",
|
|
1648
|
+
"cli.uninstall.wizard.step.target": "\u786E\u8BA4\u76EE\u6807",
|
|
1649
|
+
"cli.uninstall.wizard.step.plan": "\u914D\u7F6E\u5378\u8F7D\u8BA1\u5212",
|
|
1650
|
+
"cli.uninstall.wizard.step.review": "\u590D\u6838\u6700\u7EC8\u8BA1\u5212",
|
|
1651
|
+
"cli.uninstall.wizard.target.confirm": "\u786E\u8BA4\u4ECE {target} \u5378\u8F7D Fabric\uFF1F[Y/n]",
|
|
1652
|
+
"cli.uninstall.wizard.stage.scaffold": "\u662F\u5426\u6E05\u7406 scaffold \u4EA7\u7269\uFF1F[{defaultValue}]",
|
|
1653
|
+
"cli.uninstall.wizard.stage.bootstrap": "\u662F\u5426\u79FB\u9664 bootstrap\uFF08Skills + hooks\uFF09\uFF1F[{defaultValue}]",
|
|
1654
|
+
"cli.uninstall.wizard.stage.mcp": "\u662F\u5426\u53CD\u6CE8\u518C MCP \u5BA2\u6237\u7AEF\uFF1F[{defaultValue}]",
|
|
1655
|
+
"cli.uninstall.wizard.execute.confirm": "\u73B0\u5728\u6267\u884C\u8BE5\u5378\u8F7D\u8BA1\u5212\uFF1F[Y/n]",
|
|
1656
|
+
"cli.uninstall.wizard.outro": "\u5378\u8F7D\u8BA1\u5212\u5DF2\u786E\u8BA4\uFF0C\u5F00\u59CB\u6267\u884C Fabric uninstall...",
|
|
1657
|
+
"cli.uninstall.wizard.cancelled": "Fabric \u5378\u8F7D\u5DF2\u5728\u6267\u884C\u524D\u53D6\u6D88\u3002",
|
|
1658
|
+
"cli.uninstall.confirm.proceed": "\u786E\u8BA4\u4ECE {target} \u5378\u8F7D Fabric\uFF1F[y/N]",
|
|
1659
|
+
"cli.uninstall.errors.target-not-directory": "\u76EE\u6807\u5FC5\u987B\u662F\u5DF2\u5B58\u5728\u7684\u76EE\u5F55\uFF1A{path}",
|
|
1660
|
+
"cli.ledger-append.description": "\u5411 Fabric \u610F\u56FE\u65E5\u5FD7\u8FFD\u52A0\u4E00\u6761\u8BB0\u5F55\u3002",
|
|
1661
|
+
"cli.ledger-append.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
|
|
1662
|
+
"cli.ledger-append.args.staged.description": "\u4ECE\u6682\u5B58\u53D8\u66F4\u63A8\u5BFC\u8BB0\u5F55\uFF08\u7528\u4E8E pre-commit \u9636\u6BB5\uFF09\u3002",
|
|
1663
|
+
"cli.ledger-append.requires-staged": "pre-commit \u573A\u666F\u4E0B\u5FC5\u987B\u4F20\u5165 --staged",
|
|
1664
|
+
"cli.ledger-append.intent.auto": "\u81EA\u52A8\uFF1A{head}{suffix}",
|
|
1665
|
+
"cli.ledger-append.intent.auto-more": " \u7B49 {count} \u9879",
|
|
1666
|
+
"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",
|
|
1667
|
+
"cli.pre-commit.args.target.description": "\u9879\u76EE\u6839\u76EE\u5F55\uFF0C\u9ED8\u8BA4\u53D6\u5F53\u524D\u76EE\u5F55\u6216 EXTERNAL_FIXTURE_PATH\u3002",
|
|
1668
|
+
"cli.pre-commit.run-failed": "fabric pre-commit\uFF1A{name} \u5931\u8D25 - {message}",
|
|
1669
|
+
"cli.scan.description": "\u626B\u63CF\u9879\u76EE\u4EE5\u68C0\u6D4B Fabric \u5F15\u5BFC\u5019\u9009\u6A21\u5757\u3002",
|
|
1670
|
+
"cli.scan.args.target.description": "\u76EE\u6807\u7EDD\u5BF9\u8DEF\u5F84\u3002\u9ED8\u8BA4\u4F9D\u6B21\u4F7F\u7528 --target\u3001EXTERNAL_FIXTURE_PATH\u3001\u5F53\u524D\u76EE\u5F55\u3002",
|
|
1671
|
+
"cli.scan.args.debug.description": "\u4EE5\u683C\u5F0F\u5316\u8F93\u51FA\u6253\u5370\u68C0\u6D4B\u8BC1\u636E\u3002",
|
|
1672
|
+
"cli.scan.args.json.description": "\u4EE5 JSON \u683C\u5F0F\u8F93\u51FA\u8BCA\u65AD\u62A5\u544A\u3002",
|
|
1673
|
+
"cli.scan.error.missing-forensic": "\u672A\u627E\u5230 forensic.json\uFF08\u8DEF\u5F84 {path}\uFF09\uFF1B\u8BF7\u5148\u8FD0\u884C `fabric install` \u751F\u6210\u9879\u76EE\u5FEB\u7167\u3002",
|
|
1674
|
+
"cli.scan.summary.created": "\u5DF2\u5199\u5165 {count} \u6761\u77E5\u8BC6\u6761\u76EE\u81F3 .fabric/knowledge/\u3002",
|
|
1675
|
+
"cli.scan.summary.skipped": "\u65E0\u5DEE\u5F02\uFF1B{count} \u6761\u5DF2\u5B58\u5728\u7684\u6761\u76EE\u4FDD\u6301\u4E0D\u53D8\u3002",
|
|
1676
|
+
"cli.scan.report.title": "Fabric \u626B\u63CF\u62A5\u544A",
|
|
1677
|
+
"cli.scan.report.target": "\u76EE\u6807",
|
|
1678
|
+
"cli.scan.report.framework": "\u6846\u67B6",
|
|
1679
|
+
"cli.scan.report.evidence": "\u8BC1\u636E",
|
|
1680
|
+
"cli.scan.report.readme-quality": "README \u8D28\u91CF",
|
|
1681
|
+
"cli.scan.report.contributing": "CONTRIBUTING.md",
|
|
1682
|
+
"cli.scan.report.files-counted": "\u6587\u4EF6\u6570",
|
|
1683
|
+
"cli.scan.report.ignored-entries": "\u5FFD\u7565\u9879",
|
|
1684
|
+
"cli.scan.report.existing-fabric": "\u73B0\u6709 Fabric \u6587\u4EF6",
|
|
1685
|
+
"cli.scan.report.recommendations": "\u5EFA\u8BAE\uFF1A",
|
|
1686
|
+
"cli.scan.readme-quality.ok": "\u826F\u597D",
|
|
1687
|
+
"cli.scan.readme-quality.stub": "\u8349\u7A3F",
|
|
1688
|
+
"cli.scan.recommendation.init": "L0\uFF1A\u8FD0\u884C fabric install\uFF0C\u5728 .fabric/AGENTS.md \u751F\u6210 Fabric \u5F15\u5BFC\u89C4\u8303\u5185\u5BB9\u3002",
|
|
1689
|
+
"cli.scan.recommendation.readme": "L0\uFF1A\u5148\u8865\u5145 README.md\uFF0C\u518D\u628A\u9879\u76EE\u4E8B\u5B9E\u6574\u7406\u5230 Fabric \u53C2\u8003\u6587\u4EF6\u4E2D\u3002",
|
|
1690
|
+
"cli.scan.recommendation.contributing": "L0\uFF1A\u6DFB\u52A0 CONTRIBUTING.md\uFF0C\u6216\u5728 bootstrap \u4E2D\u7559\u4E0B\u8D21\u732E\u6D41\u7A0B\u7684 TODO \u8BF4\u660E\u3002",
|
|
1691
|
+
"cli.scan.recommendation.unknown-framework": "L1\uFF1A\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u6846\u67B6\u6807\u8BB0\uFF0C\u9700\u8981\u624B\u52A8\u8865\u5145\u6280\u672F\u6808\u8BF4\u660E\u3002",
|
|
1692
|
+
"cli.scan.recommendation.framework-dirs": "L1\uFF1A\u68C0\u67E5 {framework} \u76EE\u5F55\uFF0C\u540E\u7EED\u4E3A\u5176\u8865\u5145\u5BF9\u5E94\u4F5C\u7528\u57DF\u7684 Fabric \u89C4\u5219\u6587\u4EF6\u3002",
|
|
1693
|
+
// v2.0.0-rc.37 Wave A2 Part 2: cli.serve.* + FABRIC_AUTH_TOKEN keys removed
|
|
1694
|
+
// alongside `fabric serve` quarantine to packages/server-http-experimental/
|
|
1695
|
+
// per [[fabric-serve-quarantine-not-delete]]. Restore from git history when
|
|
1696
|
+
// the web UI surface is re-enabled.
|
|
1697
|
+
// v2.0.0-rc.29 TASK-008 (BUG-L2): onboard-coverage 国际化键。
|
|
1698
|
+
"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",
|
|
1699
|
+
"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",
|
|
1700
|
+
"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",
|
|
1701
|
+
"cli.update.description": "\u5237\u65B0 MCP \u4E3B\u673A\u914D\u7F6E\u548C git hooks\uFF0C\u4E0D\u91CD\u65B0\u521B\u5EFA Fabric \u6587\u4EF6\u3002",
|
|
1702
|
+
"cli.update.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",
|
|
1703
|
+
"cli.update.args.no-mcp.description": "\u8DF3\u8FC7\u91CD\u65B0\u914D\u7F6E MCP \u5BA2\u6237\u7AEF",
|
|
1704
|
+
"cli.update.args.no-hooks.description": "\u8DF3\u8FC7\u91CD\u65B0\u5B89\u88C5 git hooks",
|
|
1705
|
+
"cli.sync-meta.description": "\u4ECE\u5185\u90E8\u89C4\u5219\u6587\u4EF6\u540C\u6B65 Fabric \u5143\u6570\u636E\u3002",
|
|
1706
|
+
"cli.sync-meta.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
|
|
1707
|
+
"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",
|
|
1708
|
+
"cli.sync-meta.drift-detected": "\u68C0\u6D4B\u5230 Fabric \u5143\u6570\u636E\u6F02\u79FB\u3002\u8BF7\u8FD0\u884C fabric sync-meta \u8FDB\u884C\u66F4\u65B0\u3002",
|
|
1709
|
+
"cli.sync-meta.updated": "{label} {path}",
|
|
1710
|
+
"dashboard.app.nav.aria-label": "\u4EEA\u8868\u76D8\u89C6\u56FE\u5BFC\u822A",
|
|
1711
|
+
"dashboard.app.nav.readiness.label": "\u51C6\u5907\u60C5\u51B5",
|
|
1712
|
+
"dashboard.app.nav.readiness.label-bilingual": "\u51C6\u5907\u60C5\u51B5 Readiness",
|
|
1713
|
+
"dashboard.app.nav.readiness.subtitle": "\u9879\u76EE\u72B6\u6001",
|
|
1714
|
+
"dashboard.app.nav.rules-explain.label": "\u89C4\u5219\u89E3\u6790",
|
|
1715
|
+
"dashboard.app.nav.rules-explain.label-bilingual": "\u89C4\u5219\u89E3\u6790 Rules Explain",
|
|
1716
|
+
"dashboard.app.nav.rules-explain.subtitle": "\u62D3\u6251\u4E0E\u4E0A\u4E0B\u6587",
|
|
1717
|
+
"dashboard.app.nav.timeline.label": "\u65F6\u95F4\u7EBF",
|
|
1718
|
+
"dashboard.app.nav.timeline.label-bilingual": "\u65F6\u95F4\u7EBF Timeline",
|
|
1719
|
+
"dashboard.app.nav.timeline.subtitle": "\u5BA1\u8BA1\u4E0E\u5386\u53F2",
|
|
1720
|
+
"dashboard.app.nav.health.label": "\u7CFB\u7EDF\u5065\u5EB7",
|
|
1721
|
+
"dashboard.app.nav.health.label-bilingual": "\u7CFB\u7EDF\u5065\u5EB7 Health",
|
|
1722
|
+
"dashboard.app.nav.health.subtitle": "\u8BCA\u65AD\u53F0",
|
|
1723
|
+
"dashboard.app.nav.section.insights": "\u6D1E\u5BDF",
|
|
1724
|
+
"dashboard.app.nav.drift-check": "\u6F02\u79FB\u68C0\u67E5",
|
|
1725
|
+
"dashboard.app.nav.modules.read-only": "\u53EA\u8BFB\u4EEA\u8868\u76D8",
|
|
1726
|
+
"dashboard.app.header.connected": "\u5DF2\u8FDE\u63A5",
|
|
1727
|
+
"dashboard.app.header.connecting": "\u8FDE\u63A5\u4E2D",
|
|
1728
|
+
"dashboard.app.live-region.received": "\u5DF2\u6536\u5230 {type}",
|
|
1729
|
+
"dashboard.app.breadcrumb.readiness": "readiness",
|
|
1730
|
+
"dashboard.app.breadcrumb.rules-explain": "rules-explain",
|
|
1731
|
+
"dashboard.app.breadcrumb.timeline": "timeline",
|
|
1732
|
+
"dashboard.app.breadcrumb.health": "health",
|
|
1733
|
+
"dashboard.rule-topology.title": "\u89C4\u5219\u547D\u4E2D",
|
|
1734
|
+
"dashboard.rule-topology.subtitle": "\u67E5\u770B\u5F53\u524D\u8DEF\u5F84\u4F1A\u547D\u4E2D\u54EA\u4E9B\u89C4\u5219\uFF0C\u4EE5\u53CA\u4E3A\u4EC0\u4E48\u4F1A\u547D\u4E2D",
|
|
1735
|
+
"dashboard.rule-topology.path.placeholder": "\u7528\u4E8E\u89C4\u5219\u4E0A\u4E0B\u6587\u7684\u6837\u672C\u8DEF\u5F84",
|
|
1736
|
+
"dashboard.rule-topology.path.aria-label": "\u89C4\u5219\u4E0A\u4E0B\u6587\u6837\u672C\u8DEF\u5F84",
|
|
1737
|
+
"dashboard.rule-topology.status.sample": "\u5F53\u524D\u8DEF\u5F84 {path}",
|
|
1738
|
+
"dashboard.rule-topology.status.hits": "{count} \u6761\u547D\u4E2D",
|
|
1739
|
+
"dashboard.rule-topology.status.revision": "\u7248\u672C {revision}",
|
|
1740
|
+
"dashboard.rule-topology.heatmap.title": "\u8986\u76D6\u70ED\u529B\u56FE",
|
|
1741
|
+
"dashboard.rule-topology.heatmap.subtitle": "\u57FA\u4E8E scope_glob \u6A21\u5F0F\u63A8\u5BFC\u7684\u76EE\u5F55\u8986\u76D6\u60C5\u51B5",
|
|
1742
|
+
"dashboard.rule-topology.heatmap.aria-label": "\u76EE\u5F55\u8986\u76D6\u70ED\u529B\u56FE",
|
|
1743
|
+
"dashboard.rule-topology.heatmap.count": "{count} \u4E2A\u76EE\u5F55",
|
|
1744
|
+
"dashboard.rule-topology.heatmap.rules": "{count} \u6761\u89C4\u5219",
|
|
1745
|
+
"dashboard.rule-topology.heatmap.uncovered": "\u6CA1\u6709\u5339\u914D\u4F5C\u7528\u57DF",
|
|
1746
|
+
"dashboard.rule-topology.heatmap.empty": "\u5F53\u524D\u6CA1\u6709\u53EF\u663E\u793A\u7684\u89C4\u5219\u76EE\u5F55\u3002",
|
|
1747
|
+
"dashboard.rule-topology.heatmap.density.full": "\u5DF2\u8986\u76D6",
|
|
1748
|
+
"dashboard.rule-topology.heatmap.density.partial": "\u90E8\u5206\u8986\u76D6",
|
|
1749
|
+
"dashboard.rule-topology.heatmap.density.none": "\u672A\u8986\u76D6",
|
|
1750
|
+
"dashboard.rule-topology.hit-reason.title": "\u547D\u4E2D\u539F\u56E0",
|
|
1751
|
+
"dashboard.rule-topology.hit-reason.subtitle": "\u663E\u793A\u5F53\u524D\u6837\u672C\u8DEF\u5F84\u4E3A\u4F55\u547D\u4E2D\u8FD9\u4E9B\u89C4\u5219",
|
|
1752
|
+
"dashboard.rule-topology.hit-reason.aria-label": "\u89C4\u5219\u547D\u4E2D\u539F\u56E0",
|
|
1753
|
+
"dashboard.rule-topology.hit-reason.count": "{count} \u6761\u539F\u56E0",
|
|
1754
|
+
"dashboard.rule-topology.hit-reason.empty": "\u5F53\u524D\u6837\u672C\u8DEF\u5F84\u6CA1\u6709\u52A0\u8F7D\u5230\u89C4\u5219\u3002",
|
|
1755
|
+
"dashboard.rule-topology.hit-reason.global": "\u5168\u5C40",
|
|
1756
|
+
"dashboard.rule-topology.hit-reason.tier.always": "\u5E38\u9A7B",
|
|
1757
|
+
"dashboard.rule-topology.hit-reason.tier.path": "Glob",
|
|
1758
|
+
"dashboard.rule-topology.hit-reason.tier.description": "\u63CF\u8FF0",
|
|
1759
|
+
"dashboard.module-placeholder.coming-soon": "\u529F\u80FD\u9884\u7559",
|
|
1760
|
+
"dashboard.module-placeholder.read-only": "\u4E3A\u540E\u7EED\u53EA\u8BFB\u4EEA\u8868\u76D8\u80FD\u529B\u9884\u7559\u3002",
|
|
1761
|
+
"dashboard.module-placeholder.forensic.title": "\u8BA4\u77E5\u626B\u63CF",
|
|
1762
|
+
"dashboard.module-placeholder.forensic.subtitle": "\u540E\u7EED\u8865\u5145",
|
|
1763
|
+
"dashboard.module-placeholder.semantic.title": "\u8BED\u4E49\u65F6\u95F4\u7EBF",
|
|
1764
|
+
"dashboard.module-placeholder.semantic.subtitle": "\u540E\u7EED\u8865\u5145",
|
|
1765
|
+
"dashboard.module-placeholder.ledger.title": "\u5386\u53F2\u8BB0\u5F55",
|
|
1766
|
+
"dashboard.module-placeholder.ledger.subtitle": "\u540E\u7EED\u8865\u5145",
|
|
1767
|
+
"dashboard.rules-tree.title": "\u89C4\u5219\u6811",
|
|
1768
|
+
"dashboard.rules-tree.subtitle": "\u67E5\u770B .fabric/agents.meta.json \u4E2D\u7684\u89C4\u5219\u7ED3\u6784\u3001\u5C42\u7EA7\u548C\u540C\u6B65\u72B6\u6001",
|
|
1769
|
+
"dashboard.rules-tree.filter.placeholder": "\u6309\u6587\u4EF6\u3001\u4F5C\u7528\u57DF\u3001\u4F18\u5148\u7EA7\u3001\u54C8\u5E0C\u8FC7\u6EE4...",
|
|
1770
|
+
"dashboard.rules-tree.filter.aria-label": "\u8FC7\u6EE4\u89C4\u5219\u6811",
|
|
1771
|
+
"dashboard.rules-tree.status.loading": "\u89C4\u5219\u52A0\u8F7D\u4E2D",
|
|
1772
|
+
"dashboard.rules-tree.status.nodes": "{count} \u4E2A\u8282\u70B9 \xB7 \u7248\u672C {revision}",
|
|
1773
|
+
"dashboard.rules-tree.status.locks": "{count} \u4E2A\u53D7\u4FDD\u62A4\u533A\u57DF",
|
|
1774
|
+
"dashboard.rules-tree.empty": "\u6CA1\u6709\u5339\u914D\u7684\u89C4\u5219\u3002",
|
|
1775
|
+
"dashboard.rules-tree.tree.aria-label": "Fabric \u89C4\u5219\u6811",
|
|
1776
|
+
"dashboard.rules-tree.detail.title": "\u8282\u70B9\u8BE6\u60C5",
|
|
1777
|
+
"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",
|
|
1778
|
+
"dashboard.rules-tree.detail.file": "\u6587\u4EF6",
|
|
1779
|
+
"dashboard.rules-tree.detail.scope": "\u4F5C\u7528\u57DF",
|
|
1780
|
+
"dashboard.rules-tree.detail.priority": "\u4F18\u5148\u7EA7",
|
|
1781
|
+
"dashboard.rules-tree.detail.hash": "\u54C8\u5E0C",
|
|
1782
|
+
"dashboard.rules-tree.detail.no-deps": "\u65E0\u4F9D\u8D56",
|
|
1783
|
+
"dashboard.human-lock.title": "\u4EBA\u5DE5\u4FDD\u62A4",
|
|
1784
|
+
"dashboard.human-lock.subtitle": "\u67E5\u770B\u9700\u8981\u4EBA\u5DE5\u786E\u8BA4\u7684\u53D7\u4FDD\u62A4\u533A\u57DF",
|
|
1785
|
+
"dashboard.human-lock.filters.aria-label": "\u4EBA\u5DE5\u4FDD\u62A4\u8FC7\u6EE4\u5668",
|
|
1786
|
+
"dashboard.human-lock.filters.all": "\u5168\u90E8",
|
|
1787
|
+
"dashboard.human-lock.filters.drift": "\u6F02\u79FB",
|
|
1788
|
+
"dashboard.human-lock.filters.approved": "\u5DF2\u6279\u51C6",
|
|
1789
|
+
"dashboard.human-lock.summary": "{drift} \u5904\u6F02\u79FB \xB7 {approved} \u9879\u5DF2\u786E\u8BA4",
|
|
1790
|
+
"dashboard.human-lock.empty": "\u5F53\u524D\u8FC7\u6EE4\u6761\u4EF6\u4E0B\u6CA1\u6709\u53D7\u4FDD\u62A4\u8BB0\u5F55\u3002",
|
|
1791
|
+
"dashboard.intent-timeline.title": "\u610F\u56FE\u65F6\u95F4\u7EBF",
|
|
1792
|
+
"dashboard.intent-timeline.subtitle": "\u67E5\u770B AI \u4E0E\u4EBA\u5DE5\u7559\u4E0B\u7684\u53D8\u66F4\u8BB0\u5F55\uFF0C\u6309\u65F6\u95F4\u5012\u5E8F\u6392\u5217",
|
|
1793
|
+
"dashboard.intent-timeline.filter.label": "\u6765\u6E90",
|
|
1794
|
+
"dashboard.intent-timeline.filter.all": "\u5168\u90E8",
|
|
1795
|
+
"dashboard.intent-timeline.summary": "AI {aiCount} \xB7 Human {humanCount}",
|
|
1796
|
+
"dashboard.intent-timeline.columns.ai.title": "AI",
|
|
1797
|
+
"dashboard.intent-timeline.columns.ai.entries": "{count} \u6761\u8BB0\u5F55",
|
|
1798
|
+
"dashboard.intent-timeline.columns.human.title": "\u4EBA\u5DE5",
|
|
1799
|
+
"dashboard.intent-timeline.columns.human.entries": "{count} \u6761\u8BB0\u5F55",
|
|
1800
|
+
"dashboard.intent-timeline.empty": "\u6CA1\u6709\u627E\u5230\u65E5\u5FD7\u8BB0\u5F55\u3002",
|
|
1801
|
+
"dashboard.intent-timeline.annotate.missing-id": "\u7F3A\u5C11 id\uFF0C\u65E0\u6CD5\u4E3A\u8FD9\u6761\u65E5\u5FD7\u6DFB\u52A0\u6CE8\u91CA\u3002",
|
|
1802
|
+
"dashboard.history-replay.title": "\u5386\u53F2\u56DE\u653E",
|
|
1803
|
+
"dashboard.history-replay.subtitle": "\u6309\u5386\u53F2\u8BB0\u5F55\u56DE\u770B\u5F53\u65F6\u7684\u89C4\u5219\u6811\u72B6\u6001",
|
|
1804
|
+
"dashboard.history-replay.toolbar.scrub": "\u62D6\u52A8",
|
|
1805
|
+
"dashboard.history-replay.toolbar.latest": "\u6700\u65B0",
|
|
1806
|
+
"dashboard.history-replay.selected.none": "\u5C1A\u672A\u9009\u62E9\u5386\u53F2\u8BB0\u5F55",
|
|
1807
|
+
"dashboard.history-replay.status.replay-points": "{count} \u4E2A\u56DE\u653E\u70B9",
|
|
1808
|
+
"dashboard.history-replay.status.entries-applied": "\u5DF2\u5E94\u7528 {count} \u6761\u8BB0\u5F55",
|
|
1809
|
+
"dashboard.history-replay.empty.entries": "\u6CA1\u6709\u53EF\u7528\u4E8E\u56DE\u653E\u7684\u65E5\u5FD7\u8BB0\u5F55\u3002",
|
|
1810
|
+
"dashboard.history-replay.state.title": "\u67E5\u770B {label} \u65F6\u523B\u7684\u72B6\u6001",
|
|
1811
|
+
"dashboard.history-replay.state.meta": "\u8BB0\u5F55 {ledgerId} \xB7 \u63D0\u4EA4 {commit} \xB7 {mode}",
|
|
1812
|
+
"dashboard.history-replay.status.loading": "\u5FEB\u7167\u52A0\u8F7D\u4E2D",
|
|
1813
|
+
"dashboard.history-replay.status.nodes": "{count} \u4E2A\u8282\u70B9",
|
|
1814
|
+
"dashboard.history-replay.status.unknown-revision": "\u672A\u77E5\u7248\u672C",
|
|
1815
|
+
"dashboard.history-replay.tree.aria-label": "\u5386\u53F2 Fabric \u89C4\u5219\u6811",
|
|
1816
|
+
"dashboard.history-replay.empty.loading": "\u6B63\u5728\u52A0\u8F7D\u5386\u53F2\u5FEB\u7167...",
|
|
1817
|
+
"dashboard.history-replay.empty.select": "\u8BF7\u9009\u62E9\u4E00\u6761\u65F6\u95F4\u7EBF\u8BB0\u5F55\u4EE5\u56DE\u653E\u5176\u72B6\u6001\u3002",
|
|
1818
|
+
"dashboard.history-replay.meta.not-available": "\u4E0D\u53EF\u7528",
|
|
1819
|
+
"dashboard.history-replay.meta.pending": "\u7B49\u5F85\u4E2D",
|
|
1820
|
+
"dashboard.history-replay.meta.na": "\u65E0",
|
|
1821
|
+
"dashboard.doctor.title": "\u8BCA\u65AD\u63A7\u5236\u53F0",
|
|
1822
|
+
"dashboard.doctor.subtitle": "\u67E5\u770B\u6846\u67B6\u3001\u5165\u53E3\u70B9\u3001\u7248\u672C\u6F02\u79FB\u548C\u53D7\u4FDD\u62A4\u8DEF\u5F84\u7684\u72B6\u6001",
|
|
1823
|
+
"dashboard.doctor.toolbar.overall": "\u6574\u4F53\u72B6\u6001",
|
|
1824
|
+
"dashboard.doctor.toolbar.no-summary": "\u6682\u65E0\u6458\u8981",
|
|
1825
|
+
"dashboard.doctor.toolbar.entry-points-summary": "{framework} \xB7 {count} \u4E2A\u5165\u53E3\u70B9",
|
|
1826
|
+
"dashboard.doctor.toolbar.entry-point-summary": "{framework} \xB7 {count} \u4E2A\u5165\u53E3\u70B9",
|
|
1827
|
+
"dashboard.doctor.empty.loading": "\u6B63\u5728\u52A0\u8F7D doctor \u62A5\u544A...",
|
|
1828
|
+
"dashboard.doctor.summary.framework": "\u6846\u67B6",
|
|
1829
|
+
"dashboard.doctor.summary.protected-paths": "\u53D7\u4FDD\u62A4\u8DEF\u5F84",
|
|
1830
|
+
"dashboard.doctor.summary.intent-ledger": "\u610F\u56FE\u65E5\u5FD7",
|
|
1831
|
+
"dashboard.doctor.summary.no-meta-revision": "\u6682\u65E0\u5143\u6570\u636E\u7248\u672C",
|
|
1832
|
+
"dashboard.doctor.summary.tracked-paths.none": "\u6CA1\u6709\u8DDF\u8E2A\u8DEF\u5F84",
|
|
1833
|
+
"dashboard.doctor.summary.tracked-paths.some": "\u5DF2\u8DDF\u8E2A {count} \u9879",
|
|
1834
|
+
"dashboard.doctor.summary.hashes-intact": "\u6240\u6709\u5DF2\u6279\u51C6\u54C8\u5E0C\u5747\u5B8C\u597D",
|
|
1835
|
+
"dashboard.doctor.summary.drifted": "{count} \u9879\u53D1\u751F\u6F02\u79FB",
|
|
1836
|
+
"dashboard.doctor.summary.no-ledger-entries": "\u6682\u65E0\u65E5\u5FD7\u8BB0\u5F55",
|
|
1837
|
+
"dashboard.doctor.card.entry-points": "\u5165\u53E3\u70B9",
|
|
1838
|
+
"dashboard.doctor.card.checks": "\u68C0\u67E5\u9879",
|
|
1839
|
+
"dashboard.doctor.empty.entry-points": "\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u5165\u53E3\u70B9\u3002",
|
|
1840
|
+
"dashboard.doctor.framework.unknown": "\u672A\u77E5",
|
|
1841
|
+
"dashboard.doctor.age.none": "\u6682\u65E0\u8BB0\u5F55",
|
|
1842
|
+
"dashboard.doctor.age.seconds": "{count} \u79D2\u524D",
|
|
1843
|
+
"dashboard.doctor.age.minutes": "{count} \u5206\u949F\u524D",
|
|
1844
|
+
"dashboard.doctor.age.hours": "{count} \u5C0F\u65F6\u524D",
|
|
1845
|
+
"dashboard.doctor.age.days": "{count} \u5929\u524D",
|
|
1846
|
+
"dashboard.doctor.age.weeks": "{count} \u5468\u524D",
|
|
1847
|
+
"dashboard.shared.refresh": "\u5237\u65B0",
|
|
1848
|
+
"dashboard.shared.loading": "\u52A0\u8F7D\u4E2D",
|
|
1849
|
+
"dashboard.shared.status.ok": "\u6B63\u5E38",
|
|
1850
|
+
"dashboard.shared.status.warn": "\u8B66\u544A",
|
|
1851
|
+
"dashboard.shared.status.error": "\u9519\u8BEF",
|
|
1852
|
+
"dashboard.shared.status.confirmed": "\u5DF2\u786E\u8BA4",
|
|
1853
|
+
"dashboard.shared.status.hash-drift": "\u54C8\u5E0C\u6F02\u79FB",
|
|
1854
|
+
"dashboard.shared.status.stale": "\u8FC7\u671F",
|
|
1855
|
+
"dashboard.shared.status.orphan": "\u5B64\u7ACB",
|
|
1856
|
+
"dashboard.shared.status.attention": "\u6CE8\u610F",
|
|
1857
|
+
"dashboard.source.ai": "AI",
|
|
1858
|
+
"dashboard.source.human": "\u4EBA\u5DE5",
|
|
1859
|
+
"dashboard.timeline-entry.aria-label": "{source} \u610F\u56FE {intent}",
|
|
1860
|
+
"dashboard.timeline-entry.working-tree": "\u5DE5\u4F5C\u533A",
|
|
1861
|
+
"dashboard.timeline-entry.parent": "\u7236\u63D0\u4EA4 {parent}",
|
|
1862
|
+
"dashboard.timeline-entry.paths": "\u8DEF\u5F84",
|
|
1863
|
+
"dashboard.timeline-entry.annotate": "\u6DFB\u52A0\u6CE8\u91CA",
|
|
1864
|
+
"dashboard.timeline-entry.annotation-label": "\u4EBA\u5DE5\u6CE8\u91CA",
|
|
1865
|
+
"dashboard.timeline-entry.annotation-placeholder": "\u8BF4\u660E\u5BA1\u6838\u7ED3\u8BBA\u6216\u6279\u51C6\u80CC\u666F...",
|
|
1866
|
+
"dashboard.timeline-entry.annotation-save": "\u4FDD\u5B58\u6CE8\u91CA",
|
|
1867
|
+
"dashboard.tree-node.locked": "\u5DF2\u9501\u5B9A",
|
|
1868
|
+
"dashboard.tree-node.stale.hash-mismatch": "\u54C8\u5E0C\u4E0D\u5339\u914D",
|
|
1869
|
+
"dashboard.tree-node.stale.orphan": "\u5B64\u7ACB",
|
|
1870
|
+
"dashboard.lock-card.aria-label": "{file} {lineRange} {status}",
|
|
1871
|
+
"dashboard.lock-card.status.drift": "\u54C8\u5E0C\u6F02\u79FB",
|
|
1872
|
+
"dashboard.lock-card.status.confirmed": "\u5DF2\u786E\u8BA4",
|
|
1873
|
+
"dashboard.lock-card.hash.locked": "\u9501\u5B9A\u54C8\u5E0C",
|
|
1874
|
+
"dashboard.lock-card.hash.current": "\u5F53\u524D\u54C8\u5E0C",
|
|
1875
|
+
"dashboard.lock-card.hash.diff": "\u5DEE\u5F02",
|
|
1876
|
+
"dashboard.lock-card.preview.drift": "\u6F02\u79FB",
|
|
1877
|
+
"dashboard.lock-card.preview.sync": "\u540C\u6B65",
|
|
1878
|
+
"dashboard.lock-card.preview.drift-detail": "\u54C8\u5E0C\u4E0E\u53D7\u4FDD\u62A4\u533A\u57DF\u4E0D\u4E00\u81F4\u3002",
|
|
1879
|
+
"dashboard.lock-card.preview.sync-detail": "\u53D7\u4FDD\u62A4\u533A\u57DF\u5F53\u524D\u4FDD\u6301\u540C\u6B65\u3002",
|
|
1880
|
+
"dashboard.lock-card.footer.region": "\u53D7\u4FDD\u62A4\u533A\u57DF \xB7 {count} \u884C",
|
|
1881
|
+
"dashboard.lock-card.button.approve": "\u6279\u51C6\u65B0\u54C8\u5E0C",
|
|
1882
|
+
"dashboard.lock-card.button.confirmed": "\u5DF2\u786E\u8BA4",
|
|
1883
|
+
"dashboard.lock-card.diff.hash-mismatch": "\u54C8\u5E0C\u4E0D\u4E00\u81F4",
|
|
1884
|
+
"dashboard.lock-card.diff.no-changes": "\u65E0\u53D8\u66F4",
|
|
1885
|
+
"dashboard.lock-card.diff.with-bytes": "+{added} / -{removed} \xB7 {bytes} \u5B57\u8282",
|
|
1886
|
+
"dashboard.lock-card.diff.without-bytes": "+{added} / -{removed}",
|
|
1887
|
+
"dashboard.approve-button.retry": "\u91CD\u8BD5",
|
|
1888
|
+
"dashboard.readiness.filter.analysis": "\u9879\u76EE\u5206\u6790",
|
|
1889
|
+
"dashboard.readiness.loading": "\u6B63\u5728\u52A0\u8F7D\u626B\u63CF\u6570\u636E...",
|
|
1890
|
+
"dashboard.readiness.summary.framework": "\u6846\u67B6",
|
|
1891
|
+
"dashboard.readiness.summary.files": "\u6587\u4EF6",
|
|
1892
|
+
"dashboard.readiness.summary.status": "Fabric \u72B6\u6001",
|
|
1893
|
+
"dashboard.readiness.card.evidence": "\u51C6\u5907\u60C5\u51B5\u51ED\u8BC1",
|
|
1894
|
+
"dashboard.readiness.card.recommendations": "\u5EFA\u8BAE\u4E0E\u540E\u7EED\u6B65\u9AA4",
|
|
1895
|
+
"dashboard.readiness.readme.description": "\u9879\u76EE\u6587\u6863\u7684\u8D28\u91CF",
|
|
1896
|
+
"dashboard.readiness.contributing.description": "AI\u4E0E\u4EBA\u7C7B\u534F\u4F5C\u7684\u8D21\u732E\u6307\u5357",
|
|
1897
|
+
"dashboard.readiness.fully-ready": "\u9879\u76EE\u5DF2\u5B8C\u5168\u51C6\u5907\u5C31\u7EEA\u3002",
|
|
1898
|
+
"dashboard.readiness.init-prompt": "\u8FD0\u884C\u6B64\u547D\u4EE4\u8FDB\u884C\u521D\u59CB\u5316\uFF1A",
|
|
1899
|
+
"dashboard.rules-explain.analyze": "\u5206\u6790\u8DEF\u5F84",
|
|
1900
|
+
"dashboard.rules-explain.detail.topology-type": "\u62D3\u6251\u7C7B\u578B",
|
|
1901
|
+
"dashboard.timeline.history-replay.title": "\u5386\u53F2\u56DE\u653E",
|
|
1902
|
+
"dashboard.timeline.close": "\u5173\u95ED",
|
|
1903
|
+
"dashboard.health.ledger-path.label": "\u4E8B\u4EF6\u8D26\u672C\u8DEF\u5F84",
|
|
1904
|
+
"dashboard.health.ledger-path.detail": "\u53EA\u80FD\u8FFD\u52A0\u5199\u5165\u7684\u65F6\u95F4\u7EBF\u6570\u636E\u6E90",
|
|
1905
|
+
"dashboard.health.boundary.title": "\u63A7\u5236\u5E73\u9762\u8FB9\u754C",
|
|
1906
|
+
"dashboard.health.boundary.description": "Web \u63A7\u5236\u53F0\u4F5C\u4E3A\u7EAF\u67E5\u770B\u5668 (Viewer) \u8FD0\u884C\u3002\u6240\u6709\u89C4\u5219\u3001\u5143\u6570\u636E\u548C\u4FEE\u590D\u64CD\u4F5C\u90FD\u5FC5\u987B\u901A\u8FC7 CLI \u8FDB\u884C\u7BA1\u7406\u3002",
|
|
1907
|
+
"dashboard.health.boundary.cli-action": "\u9700\u8981\u6267\u884C CLI \u64CD\u4F5C\uFF1A",
|
|
1908
|
+
"dashboard.health.boundary.cli-prompt": "\u68C0\u6D4B\u5230 {count} \u4E2A\u53EF\u4FEE\u590D\u7684\u95EE\u9898\u3002\u8BF7\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C\u4EE5\u4E0B\u547D\u4EE4\u4EE5\u81EA\u52A8\u4FEE\u590D\u5143\u6570\u636E\u3002",
|
|
1909
|
+
"dashboard.health.runtime.connected": "MCP \u8FD0\u884C\u65F6\u5DF2\u8FDE\u63A5",
|
|
1910
|
+
"dashboard.health.runtime.disconnected": "MCP \u8FD0\u884C\u65F6\u5DF2\u65AD\u5F00"
|
|
1911
|
+
};
|
|
1912
|
+
|
|
1913
|
+
// src/i18n/create-translator.ts
|
|
1914
|
+
var defaultMessages = {
|
|
1915
|
+
en: enMessages,
|
|
1916
|
+
"zh-CN": zhCNMessages
|
|
1917
|
+
};
|
|
1918
|
+
function createTranslator(locale, messages = defaultMessages) {
|
|
1919
|
+
const activeMessages = messages[locale] ?? messages.en;
|
|
1920
|
+
const fallbackMessages = messages.en;
|
|
1921
|
+
return (key, vars) => {
|
|
1922
|
+
const template = activeMessages[key] ?? fallbackMessages[key] ?? key;
|
|
1923
|
+
if (vars === void 0) {
|
|
1924
|
+
return template;
|
|
1925
|
+
}
|
|
1926
|
+
return Object.entries(vars).reduce((message, [name, value]) => {
|
|
1927
|
+
return message.replaceAll(`{${name}}`, value);
|
|
1928
|
+
}, template);
|
|
1929
|
+
};
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
// src/i18n/normalize-locale.ts
|
|
1933
|
+
function normalizeLocale(raw) {
|
|
1934
|
+
if (typeof raw !== "string") {
|
|
1935
|
+
return "en";
|
|
1936
|
+
}
|
|
1937
|
+
const normalized = raw.trim().toLowerCase().replace(/\..*$/, "").replace(/_/g, "-");
|
|
1938
|
+
if (normalized.length === 0) {
|
|
1939
|
+
return "en";
|
|
1940
|
+
}
|
|
1941
|
+
if (normalized === "zh" || normalized.startsWith("zh-")) {
|
|
1942
|
+
return "zh-CN";
|
|
1943
|
+
}
|
|
1944
|
+
return "en";
|
|
1945
|
+
}
|
|
1946
|
+
|
|
1947
|
+
// src/i18n/detect-node-locale.ts
|
|
1948
|
+
function detectNodeLocale() {
|
|
1949
|
+
const fromFabricEnv = process.env.FAB_LANG;
|
|
1950
|
+
if (typeof fromFabricEnv === "string" && fromFabricEnv.trim().length > 0) {
|
|
1951
|
+
return normalizeLocale(fromFabricEnv);
|
|
1952
|
+
}
|
|
1953
|
+
const fromLangEnv = process.env.LANG;
|
|
1954
|
+
if (typeof fromLangEnv === "string" && fromLangEnv.trim().length > 0) {
|
|
1955
|
+
return normalizeLocale(fromLangEnv);
|
|
1956
|
+
}
|
|
1957
|
+
return "en";
|
|
1958
|
+
}
|
|
1959
|
+
|
|
1960
|
+
// src/i18n/resolve-fabric-locale.ts
|
|
1961
|
+
import fs from "fs";
|
|
1962
|
+
import path from "path";
|
|
1963
|
+
function resolveFabricLocale(projectRoot) {
|
|
1964
|
+
const configPath = path.join(projectRoot, ".fabric", "fabric-config.json");
|
|
1965
|
+
let raw;
|
|
1966
|
+
try {
|
|
1967
|
+
raw = fs.readFileSync(configPath, "utf8");
|
|
1968
|
+
} catch {
|
|
1969
|
+
return detectNodeLocale();
|
|
1970
|
+
}
|
|
1971
|
+
let parsed;
|
|
1972
|
+
try {
|
|
1973
|
+
parsed = JSON.parse(raw);
|
|
1974
|
+
} catch {
|
|
1975
|
+
return detectNodeLocale();
|
|
1976
|
+
}
|
|
1977
|
+
if (typeof parsed !== "object" || parsed === null) {
|
|
1978
|
+
return detectNodeLocale();
|
|
1979
|
+
}
|
|
1980
|
+
const fabricLanguage = parsed.fabric_language;
|
|
1981
|
+
if (fabricLanguage === "en" || fabricLanguage === "zh-CN") {
|
|
1982
|
+
return fabricLanguage;
|
|
1983
|
+
}
|
|
1984
|
+
if (fabricLanguage === "match-existing" || fabricLanguage === "zh-CN-hybrid") {
|
|
1985
|
+
console.warn(
|
|
1986
|
+
`[fabric] fabric_language="${fabricLanguage}" is a pre-init placeholder that should have been resolved during 'fabric init' (KT-DEC-9004). Falling back to FAB_LANG / LANG environment detection.`
|
|
1987
|
+
);
|
|
1988
|
+
return detectNodeLocale();
|
|
1989
|
+
}
|
|
1990
|
+
return detectNodeLocale();
|
|
1991
|
+
}
|
|
1992
|
+
|
|
1993
|
+
// src/i18n/protected-tokens.ts
|
|
1994
|
+
var PROTECTED_TOKENS = [
|
|
1995
|
+
// v2.0 MCP tool names
|
|
1996
|
+
"fab_plan_context",
|
|
1997
|
+
"fab_get_knowledge_sections",
|
|
1998
|
+
"fab_extract_knowledge",
|
|
1999
|
+
"fab_review",
|
|
2000
|
+
// Project convergence point + knowledge tree paths
|
|
2001
|
+
"AGENTS.md",
|
|
2002
|
+
".fabric/agents/",
|
|
2003
|
+
".fabric/agents/_cross/",
|
|
2004
|
+
".fabric/agents.meta.json",
|
|
2005
|
+
".fabric/human-lock.json",
|
|
2006
|
+
".fabric/events.jsonl",
|
|
2007
|
+
".fabric/knowledge/",
|
|
2008
|
+
// Event types templates reference verbatim
|
|
2009
|
+
"knowledge_proposed",
|
|
2010
|
+
// fabric-archive Phase 1.5 contract surface (rc.9 — bare `scope` was renamed)
|
|
2011
|
+
"relevance_scope",
|
|
2012
|
+
"relevance_paths",
|
|
2013
|
+
// Phase 1.5 scope enum values (rc.9 — TASK-008 D1)
|
|
2014
|
+
"narrow",
|
|
2015
|
+
"broad",
|
|
2016
|
+
// v2.0.0-rc.7 T5/T6 fab_extract_knowledge contract fields (TASK-008 D1)
|
|
2017
|
+
"source_sessions",
|
|
2018
|
+
"proposed_reason",
|
|
2019
|
+
"session_context",
|
|
2020
|
+
// Layer enum values + pending output path key (TASK-008 D1)
|
|
2021
|
+
"layer",
|
|
2022
|
+
"team",
|
|
2023
|
+
"personal",
|
|
2024
|
+
"pending_path",
|
|
2025
|
+
// Server event emitted when personal layer auto-degrades narrow → broad (TASK-008 D1)
|
|
2026
|
+
"knowledge_scope_degraded",
|
|
2027
|
+
// Human-lock marker
|
|
2028
|
+
"@HUMAN",
|
|
2029
|
+
// Hard-rule keywords AI clients rely on for compliance
|
|
2030
|
+
"MUST",
|
|
2031
|
+
"NEVER"
|
|
2032
|
+
];
|
|
2033
|
+
|
|
2034
|
+
export {
|
|
2035
|
+
enMessages,
|
|
2036
|
+
zhCNMessages,
|
|
2037
|
+
defaultMessages,
|
|
2038
|
+
createTranslator,
|
|
2039
|
+
normalizeLocale,
|
|
2040
|
+
detectNodeLocale,
|
|
2041
|
+
resolveFabricLocale,
|
|
2042
|
+
PROTECTED_TOKENS
|
|
2043
|
+
};
|