@fenglimg/fabric-shared 2.0.0-rc.25 → 2.0.0-rc.26
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/dist/{chunk-AFUQKKGR.js → chunk-E5LHOWTN.js} +438 -0
- package/dist/i18n/index.d.ts +21 -1
- package/dist/i18n/index.js +3 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1
- package/package.json +1 -1
|
@@ -178,6 +178,208 @@ var enMessages = {
|
|
|
178
178
|
"cli.doctor.args.dry-run.description": "With --enrich-descriptions --auto: preview the would-be changes without writing to disk.",
|
|
179
179
|
"cli.doctor.errors.enrich-descriptions-mutex": "--enrich-descriptions cannot be combined with --fix, --fix-knowledge, or --cite-coverage. Run them separately.",
|
|
180
180
|
"doctor.enrich.allComplete": "All canonical knowledge entries already declare intent_clues / tech_stack / impact / must_read_if.",
|
|
181
|
+
// rc.26 TASK-02a: doctor foundation-batch check messages.
|
|
182
|
+
"doctor.check.bootstrap_marker_migration.name": "Bootstrap marker migration",
|
|
183
|
+
"doctor.check.bootstrap_marker_migration.ok": "No legacy fabric:knowledge-base markers detected in bootstrap target files.",
|
|
184
|
+
"doctor.check.bootstrap_marker_migration.message.singular": "{count} file still carry the legacy fabric:knowledge-base bootstrap marker: {list}.",
|
|
185
|
+
"doctor.check.bootstrap_marker_migration.message.plural": "{count} files still carry the legacy fabric:knowledge-base bootstrap marker: {list}.",
|
|
186
|
+
"doctor.check.bootstrap_marker_migration.remediation": "Run `fab doctor --fix` to migrate to fabric:bootstrap marker",
|
|
187
|
+
"doctor.check.bootstrap_snapshot_drift.name": "Bootstrap snapshot drift",
|
|
188
|
+
"doctor.check.bootstrap_snapshot_drift.message.drift": ".fabric/AGENTS.md content diverges byte-for-byte from BOOTSTRAP_CANONICAL.",
|
|
189
|
+
"doctor.check.bootstrap_snapshot_drift.remediation.drift": "Run `fab doctor --fix` to restore canonical bootstrap snapshot",
|
|
190
|
+
"doctor.check.bootstrap_snapshot_drift.ok.ok": ".fabric/AGENTS.md byte-equals BOOTSTRAP_CANONICAL.",
|
|
191
|
+
"doctor.check.bootstrap_snapshot_drift.ok.missing_delegated": ".fabric/AGENTS.md absent \u2014 delegated to bootstrap_anchor_missing.",
|
|
192
|
+
"doctor.check.managed_block_drift.name": "Managed block drift",
|
|
193
|
+
"doctor.check.managed_block_drift.message.singular": "{count} three-end managed block diverge from expected body (snapshot + optional project-rules concat): {list}.",
|
|
194
|
+
"doctor.check.managed_block_drift.message.plural": "{count} three-end managed blocks diverge from expected body (snapshot + optional project-rules concat): {list}.",
|
|
195
|
+
"doctor.check.managed_block_drift.remediation": "Run `fab doctor --fix` to restore three-end managed blocks from canonical",
|
|
196
|
+
"doctor.check.managed_block_drift.ok.ok": "Three-end managed blocks byte-equal expectedBody.",
|
|
197
|
+
"doctor.check.managed_block_drift.ok.no_managed_block": "No three-end managed blocks detected \u2014 propagation pending or legacy-marker state.",
|
|
198
|
+
"doctor.check.bootstrap_anchor.name": "Bootstrap anchor",
|
|
199
|
+
"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.",
|
|
200
|
+
"doctor.check.bootstrap_anchor.remediation.missing": "Run `fabric install` to generate the AGENTS.md / CLAUDE.md bootstrap anchor at the repo root.",
|
|
201
|
+
"doctor.check.bootstrap_anchor.ok": "Bootstrap anchor present at repo root: {present}.",
|
|
202
|
+
"doctor.check.baseline_filename_format.name": "Baseline filename format",
|
|
203
|
+
"doctor.check.baseline_filename_format.ok": "All baseline knowledge files use the canonical `${id}--${slug}.md` filename format.",
|
|
204
|
+
"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}.",
|
|
205
|
+
"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}.",
|
|
206
|
+
"doctor.check.baseline_filename_format.remediation": "Delete the legacy bare-slug baseline file(s) manually \u2014 the baseline pipeline was removed in rc.23 and is no longer an auto-fix path.",
|
|
207
|
+
"doctor.check.knowledge_dir_missing.name": "Knowledge layout",
|
|
208
|
+
"doctor.check.knowledge_dir_missing.message.singular": "{count} required knowledge subdir is missing: {list}.",
|
|
209
|
+
"doctor.check.knowledge_dir_missing.message.plural": "{count} required knowledge subdirs are missing: {list}.",
|
|
210
|
+
"doctor.check.knowledge_dir_missing.remediation": "Run `fab doctor --fix` to create the missing .fabric/knowledge/* subdirectories.",
|
|
211
|
+
"doctor.check.knowledge_dir_missing.ok": "All {count} required .fabric/knowledge/* subdirectories exist.",
|
|
212
|
+
"doctor.check.forensic.name": "Scan evidence",
|
|
213
|
+
"doctor.check.forensic.message.missing.singular": "{error} Live scan detects {frameworkKind} with {count} entry point.",
|
|
214
|
+
"doctor.check.forensic.message.missing.plural": "{error} Live scan detects {frameworkKind} with {count} entry points.",
|
|
215
|
+
"doctor.check.forensic.message.missing-default": ".fabric/forensic.json is missing.",
|
|
216
|
+
"doctor.check.forensic.message.invalid-default": ".fabric/forensic.json is invalid.",
|
|
217
|
+
"doctor.check.forensic.remediation": "Run `fab install` to regenerate .fabric/forensic.json.",
|
|
218
|
+
"doctor.check.forensic.ok": ".fabric/forensic.json is valid for {frameworkKind}.",
|
|
219
|
+
"doctor.check.agents_meta.name": "Agents metadata",
|
|
220
|
+
"doctor.check.agents_meta.message.missing": ".fabric/agents.meta.json is missing.",
|
|
221
|
+
"doctor.check.agents_meta.remediation.missing": "Run `fab doctor --fix` to rebuild agents.meta.json from .fabric/knowledge/.",
|
|
222
|
+
"doctor.check.agents_meta.message.invalid-default": ".fabric/agents.meta.json is invalid.",
|
|
223
|
+
"doctor.check.agents_meta.remediation.invalid": "Delete .fabric/agents.meta.json and run `fab doctor --fix` to regenerate it.",
|
|
224
|
+
"doctor.check.agents_meta.message.stale": ".fabric/agents.meta.json revision {revision} does not match .fabric/knowledge derived revision {computedRevision}.",
|
|
225
|
+
"doctor.check.agents_meta.remediation.stale": "Benign \u2014 engine auto-heals on next plan-context/get-sections call. Run `fab doctor --fix` for explicit reconciliation.",
|
|
226
|
+
"doctor.check.agents_meta.ok": ".fabric/agents.meta.json revision {revision} is aligned with .fabric/knowledge.",
|
|
227
|
+
"doctor.check.rule_content_refs.name": "Rule content refs",
|
|
228
|
+
"doctor.check.rule_content_refs.message.unavailable": "Cannot inspect content_ref entries until agents.meta.json is valid.",
|
|
229
|
+
"doctor.check.rule_content_refs.remediation.unavailable": "Fix agents.meta.json first: run `fab doctor --fix`.",
|
|
230
|
+
"doctor.check.rule_content_refs.message.outside.singular": "{count} content_ref entry is outside .fabric/knowledge.",
|
|
231
|
+
"doctor.check.rule_content_refs.message.outside.plural": "{count} content_ref entries are outside .fabric/knowledge.",
|
|
232
|
+
"doctor.check.rule_content_refs.remediation.outside": "Edit agents.meta.json to ensure all content_ref values point inside .fabric/knowledge/{type}/ (team) or ~/.fabric/knowledge/{type}/ (personal).",
|
|
233
|
+
"doctor.check.rule_content_refs.message.missing.singular": "{count} content_ref target is missing. Run `fab doctor --fix` to reconcile.",
|
|
234
|
+
"doctor.check.rule_content_refs.message.missing.plural": "{count} content_ref targets are missing. Run `fab doctor --fix` to reconcile.",
|
|
235
|
+
"doctor.check.rule_content_refs.remediation.missing": "Run `fab doctor --fix` to reconcile agents.meta.json with the files present in .fabric/knowledge/.",
|
|
236
|
+
"doctor.check.rule_content_refs.ok": "All content_ref entries resolve to .fabric/knowledge files.",
|
|
237
|
+
"doctor.check.knowledge_test_index.name": "Knowledge-test index",
|
|
238
|
+
"doctor.check.knowledge_test_index.remediation.missing": "Run `fab doctor --fix` to rebuild .fabric/.cache/knowledge-test.index.json.",
|
|
239
|
+
"doctor.check.knowledge_test_index.remediation.invalid": "Delete .fabric/.cache/knowledge-test.index.json and run `fab doctor --fix` to regenerate it.",
|
|
240
|
+
"doctor.check.knowledge_test_index.message.stale": ".fabric/.cache/knowledge-test.index.json is stale.",
|
|
241
|
+
"doctor.check.knowledge_test_index.remediation.stale": "Run `fab doctor --fix` to rebuild the knowledge-test index.",
|
|
242
|
+
"doctor.check.knowledge_test_index.ok.link_singular.orphan_singular": "{linkCount} link and {orphanCount} orphan annotation indexed.",
|
|
243
|
+
"doctor.check.knowledge_test_index.ok.link_singular.orphan_plural": "{linkCount} link and {orphanCount} orphan annotations indexed.",
|
|
244
|
+
"doctor.check.knowledge_test_index.ok.link_plural.orphan_singular": "{linkCount} links and {orphanCount} orphan annotation indexed.",
|
|
245
|
+
"doctor.check.knowledge_test_index.ok.link_plural.orphan_plural": "{linkCount} links and {orphanCount} orphan annotations indexed.",
|
|
246
|
+
"doctor.check.event_ledger.name": "Event ledger",
|
|
247
|
+
"doctor.check.event_ledger.message.missing": ".fabric/events.jsonl is missing.",
|
|
248
|
+
"doctor.check.event_ledger.remediation.missing": "Run `fab doctor --fix` to create .fabric/events.jsonl.",
|
|
249
|
+
"doctor.check.event_ledger.message.not_writable-default": ".fabric/events.jsonl is not writable.",
|
|
250
|
+
"doctor.check.event_ledger.remediation.not_writable": "Check file permissions on .fabric/events.jsonl and ensure no other process holds a write lock.",
|
|
251
|
+
"doctor.check.event_ledger.message.invalid-default": ".fabric/events.jsonl is invalid.",
|
|
252
|
+
"doctor.check.event_ledger.remediation.invalid": "Delete .fabric/events.jsonl and run `fab doctor --fix` to recreate it.",
|
|
253
|
+
"doctor.check.event_ledger.ok": ".fabric/events.jsonl exists, is writable, and is parseable.",
|
|
254
|
+
"doctor.check.mcp_config_in_wrong_file.name": "Claude MCP config location",
|
|
255
|
+
"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 fab install to write .mcp.json.",
|
|
256
|
+
"doctor.check.mcp_config_in_wrong_file.remediation": "Run `fab doctor --fix` to remove mcpServers.fabric from .claude/settings.json, then run `fab install` to write .mcp.json.",
|
|
257
|
+
"doctor.check.mcp_config_in_wrong_file.ok": "mcpServers.fabric is not in .claude/settings.json.",
|
|
258
|
+
"doctor.check.event_ledger_partial_write.name": "Event ledger partial write",
|
|
259
|
+
"doctor.check.event_ledger_partial_write.ok.skipped": "No partial-write check needed (ledger missing or not writable).",
|
|
260
|
+
"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.",
|
|
261
|
+
"doctor.check.event_ledger_partial_write.remediation": "Run `fab doctor --fix` to truncate the partial write and restore events.jsonl to a valid state.",
|
|
262
|
+
"doctor.check.event_ledger_partial_write.ok.clean": "events.jsonl has no partial trailing write.",
|
|
263
|
+
"doctor.check.meta_manually_diverged.name": "Meta manual divergence",
|
|
264
|
+
"doctor.check.meta_manually_diverged.ok.unreadable": "agents.meta.json not readable; skipping divergence check.",
|
|
265
|
+
"doctor.check.meta_manually_diverged.message.extra.singular": "agents.meta.json has {count} entry with no backing file on disk. Run --fix to reconcile.",
|
|
266
|
+
"doctor.check.meta_manually_diverged.message.extra.plural": "agents.meta.json has {count} entries with no backing file on disk. Run --fix to reconcile.",
|
|
267
|
+
"doctor.check.meta_manually_diverged.remediation.extra": "Run `fab doctor --fix` to reconcile agents.meta.json with the rule files currently on disk.",
|
|
268
|
+
"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.",
|
|
269
|
+
"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.",
|
|
270
|
+
"doctor.check.meta_manually_diverged.remediation.hash": "Run `fab doctor --fix` to reconcile agents.meta.json with the current rule file contents.",
|
|
271
|
+
"doctor.check.meta_manually_diverged.ok.consistent": "agents.meta.json is consistent with rule files on disk.",
|
|
272
|
+
"doctor.check.knowledge_dir_unindexed.name": "Knowledge dir unindexed",
|
|
273
|
+
"doctor.check.knowledge_dir_unindexed.message.singular": "{count} .md file in .fabric/knowledge/ not indexed in agents.meta.json. Run `fab doctor --fix` to index the missing knowledge files.",
|
|
274
|
+
"doctor.check.knowledge_dir_unindexed.message.plural": "{count} .md files in .fabric/knowledge/ not indexed in agents.meta.json. Run `fab doctor --fix` to index the missing knowledge files.",
|
|
275
|
+
"doctor.check.knowledge_dir_unindexed.remediation": "Run `fab doctor --fix` to index the missing knowledge files.",
|
|
276
|
+
"doctor.check.knowledge_dir_unindexed.ok": "All .fabric/knowledge/ .md files are indexed in agents.meta.json.",
|
|
277
|
+
"doctor.check.stable_id_collision.name": "Stable ID collision",
|
|
278
|
+
"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.',
|
|
279
|
+
"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.',
|
|
280
|
+
"doctor.check.stable_id_collision.remediation": "Edit one of the colliding knowledge files to declare a different `id: K[PT]-XXX-NNNN` frontmatter value.",
|
|
281
|
+
"doctor.check.stable_id_collision.ok": "No declared stable_id collisions found in .fabric/knowledge/.",
|
|
282
|
+
"doctor.check.counter_desync.name": "Knowledge counter desync",
|
|
283
|
+
"doctor.check.counter_desync.message.singular": "{count} knowledge counter desynced from observed stable_ids. {counterPath} = {current} but observed {observedId}. Run `fab doctor --fix` to bump counters.",
|
|
284
|
+
"doctor.check.counter_desync.message.plural": "{count} knowledge counters desynced from observed stable_ids. {counterPath} = {current} but observed {observedId}. Run `fab doctor --fix` to bump counters.",
|
|
285
|
+
"doctor.check.counter_desync.remediation": "Run `fab doctor --fix` to bump agents.meta.json counters to the maximum observed counter value.",
|
|
286
|
+
"doctor.check.counter_desync.ok": "agents.meta.json counters envelope is consistent with observed stable_ids.",
|
|
287
|
+
"doctor.check.preexisting_root_files.name": "Preexisting root markdown",
|
|
288
|
+
"doctor.check.preexisting_root_files.ok": "No CLAUDE.md or AGENTS.md detected at project root.",
|
|
289
|
+
"doctor.check.preexisting_root_files.message": "{files} detected at project root. These root files are not auto-loaded by Fabric MCP.",
|
|
290
|
+
"doctor.check.preexisting_root_files.remediation": "Move knowledge content to `.fabric/knowledge/{type}/` if you want it available in MCP responses.",
|
|
291
|
+
"doctor.check.filesystem_edit_fallback.name": "Filesystem-edit fallback",
|
|
292
|
+
"doctor.check.filesystem_edit_fallback.ok": "No orphan canonical knowledge entries detected; events.jsonl promotion trail is complete.",
|
|
293
|
+
"doctor.check.filesystem_edit_fallback.message.synthesized.singular": "Synthesized {count} knowledge_promoted event for orphan canonical entries ({sample}{suffix}). Reason='{reason}'.",
|
|
294
|
+
"doctor.check.filesystem_edit_fallback.message.synthesized.plural": "Synthesized {count} knowledge_promoted events for orphan canonical entries ({sample}{suffix}). Reason='{reason}'.",
|
|
295
|
+
"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.",
|
|
296
|
+
"doctor.check.orphan_demote.name": "Knowledge orphan demote",
|
|
297
|
+
"doctor.check.orphan_demote.ok": "No canonical knowledge entries exceed their maturity-keyed inactivity threshold.",
|
|
298
|
+
"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}.",
|
|
299
|
+
"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}.",
|
|
300
|
+
"doctor.check.orphan_demote.remediation": "Run `fab doctor --apply-lint` (rc.4 TASK-003) to demote orphan entries one maturity tier.",
|
|
301
|
+
"doctor.check.stale_archive.name": "Knowledge stale archive",
|
|
302
|
+
"doctor.check.stale_archive.ok": "No draft knowledge entries exceed the additional stale-archive quiet window.",
|
|
303
|
+
"doctor.check.stale_archive.message.singular": "{count} draft knowledge entry is stale beyond the demote+{additionalDays}d additional quiet window. First: {detail}.",
|
|
304
|
+
"doctor.check.stale_archive.message.plural": "{count} draft knowledge entries are stale beyond the demote+{additionalDays}d additional quiet window. First: {detail}.",
|
|
305
|
+
"doctor.check.stale_archive.remediation": "Run `fab doctor --apply-lint` (rc.4 TASK-003) to move stale entries into `.fabric/.archive/<type>/`.",
|
|
306
|
+
"doctor.check.pending_overdue.name": "Knowledge pending overdue",
|
|
307
|
+
"doctor.check.pending_overdue.ok": "No pending knowledge entries exceed the 14-day review threshold.",
|
|
308
|
+
"doctor.check.pending_overdue.message.singular": "{count} pending knowledge entry has been awaiting review for more than {thresholdDays} days. First: {detail}.",
|
|
309
|
+
"doctor.check.pending_overdue.message.plural": "{count} pending knowledge entries have been awaiting review for more than {thresholdDays} days. First: {detail}.",
|
|
310
|
+
"doctor.check.pending_overdue.remediation": "Review pending entries via the fabric-review Skill (`/fabric-review`) and approve, reject, defer, or modify.",
|
|
311
|
+
"doctor.check.stable_id_duplicate.name": "Knowledge stable_id duplicate",
|
|
312
|
+
"doctor.check.stable_id_duplicate.ok": "No canonical knowledge files share a stable_id across team / personal trees.",
|
|
313
|
+
"doctor.check.stable_id_duplicate.message.singular": "{count} stable_id duplicated across canonical knowledge files (path-decoupled identity invariant). First: {detail}.",
|
|
314
|
+
"doctor.check.stable_id_duplicate.message.plural": "{count} stable_ids duplicated across canonical knowledge files (path-decoupled identity invariant). First: {detail}.",
|
|
315
|
+
"doctor.check.stable_id_duplicate.remediation": "Manually rename one of the colliding files to a fresh `<prefix>-<type>-<counter>--<slug>.md` allocated via the canonical id allocator; do not edit by hand.",
|
|
316
|
+
"doctor.check.layer_mismatch.name": "Knowledge layer mismatch",
|
|
317
|
+
"doctor.check.layer_mismatch.ok": "All canonical knowledge files are physically located under the layer their stable_id prefix declares.",
|
|
318
|
+
"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}.",
|
|
319
|
+
"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}.",
|
|
320
|
+
"doctor.check.layer_mismatch.remediation": "Move the file to the correct layer root, or use the fabric-review modify flow to flip its layer (which renames the stable_id prefix accordingly).",
|
|
321
|
+
"doctor.check.index_drift.name": "Knowledge index drift",
|
|
322
|
+
"doctor.check.index_drift.ok": "agents.meta.json counters envelope is at or above the highest existing canonical counter for every (layer, type) pair.",
|
|
323
|
+
"doctor.check.index_drift.message.singular": "{count} (layer, type) counter slot have drifted below the observed canonical maximum (next allocate would collide). First: {detail}.",
|
|
324
|
+
"doctor.check.index_drift.message.plural": "{count} (layer, type) counter slots have drifted below the observed canonical maximum (next allocate would collide). First: {detail}.",
|
|
325
|
+
"doctor.check.index_drift.remediation": "Run `fab doctor --apply-lint` (rc.4 TASK-003) to bump agents.meta.json counters to max_observed + 1.",
|
|
326
|
+
"doctor.check.underseeded.name": "Knowledge underseeded",
|
|
327
|
+
"doctor.check.underseeded.ok": "Knowledge corpus has {count} canonical entries (>= {threshold}).",
|
|
328
|
+
"doctor.check.underseeded.message.singular": "Knowledge corpus has only {count} canonical entry (< {threshold} threshold). The plan_context retrieval surface is below its useful floor.",
|
|
329
|
+
"doctor.check.underseeded.message.plural": "Knowledge corpus has only {count} canonical entries (< {threshold} threshold). The plan_context retrieval surface is below its useful floor.",
|
|
330
|
+
"doctor.check.underseeded.remediation": "Run the fabric-import Skill (`/fabric-import`) to backfill knowledge from git history and existing docs.",
|
|
331
|
+
"doctor.check.narrow_no_paths.name": "Knowledge narrow without paths",
|
|
332
|
+
"doctor.check.narrow_no_paths.ok": "No narrow-scope canonical entries have an empty relevance_paths array.",
|
|
333
|
+
"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}.",
|
|
334
|
+
"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}.",
|
|
335
|
+
"doctor.check.narrow_no_paths.remediation": "Either add path anchors to relevance_paths or widen the entry's relevance_scope to broad.",
|
|
336
|
+
"doctor.check.relevance_paths_dangling.name": "Knowledge relevance_paths dangling",
|
|
337
|
+
"doctor.check.relevance_paths_dangling.ok": "All relevance_paths globs resolve to at least one file under the workspace root.",
|
|
338
|
+
"doctor.check.relevance_paths_dangling.message.singular": "{count} relevance_paths glob resolves to zero files in the current workspace. First: {detail}.",
|
|
339
|
+
"doctor.check.relevance_paths_dangling.message.plural": "{count} relevance_paths globs resolve to zero files in the current workspace. First: {detail}.",
|
|
340
|
+
"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.",
|
|
341
|
+
"doctor.check.relevance_paths_drift.name": "Knowledge relevance_paths drift",
|
|
342
|
+
"doctor.check.relevance_paths_drift.ok.skipped": "Skipped (git history unavailable; cannot evaluate {windowDays}d drift window).",
|
|
343
|
+
"doctor.check.relevance_paths_drift.ok.fresh": "All narrow-scope canonical entries have at least one relevance_path touched in the last {windowDays}d.",
|
|
344
|
+
"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}.",
|
|
345
|
+
"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}.",
|
|
346
|
+
"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.",
|
|
347
|
+
"doctor.check.narrow_too_few.name": "Knowledge narrow too few",
|
|
348
|
+
"doctor.check.narrow_too_few.ok": "Narrow-with-paths ratio {ratioPct}% ({narrowCount}/{totalCount}); {teleNote}.",
|
|
349
|
+
"doctor.check.narrow_too_few.message.telemetry_skipped": "telemetry skipped (no edit-counter fires in window)",
|
|
350
|
+
"doctor.check.narrow_too_few.message.telemetry_window": "silence rate {silencePct}% over {windowDays}d",
|
|
351
|
+
"doctor.check.narrow_too_few.message.structural": "narrow-with-paths share {ratioPct}% ({narrowCount}/{totalCount}) below {thresholdPct}% threshold",
|
|
352
|
+
"doctor.check.narrow_too_few.message.telemetry": "narrow-hook silence rate {silencePct}% ({silenceFires}/{totalFires}) over {windowDays}d above {thresholdPct}% threshold",
|
|
353
|
+
"doctor.check.narrow_too_few.message.summary": "Narrow-scope KB coverage is below the useful floor: {parts}.",
|
|
354
|
+
"doctor.check.narrow_too_few.remediation": "Run the fabric-import Skill (`/fabric-import`) to re-seed narrow anchors against the current codebase.",
|
|
355
|
+
"doctor.check.session_hints_stale.name": "Knowledge session-hints stale",
|
|
356
|
+
"doctor.check.session_hints_stale.ok": "No session-hints cache files older than {days} days under .fabric/.cache/.",
|
|
357
|
+
"doctor.check.session_hints_stale.message.singular": "{count} session-hints cache file under .fabric/.cache/ is older than {days} days. First: {detail}.",
|
|
358
|
+
"doctor.check.session_hints_stale.message.plural": "{count} session-hints cache files under .fabric/.cache/ are older than {days} days. First: {detail}.",
|
|
359
|
+
"doctor.check.session_hints_stale.remediation": "Run `fab doctor --apply-lint` to delete stale session-hints cache files.",
|
|
360
|
+
"doctor.check.stale_serve_lock.name": "Serve lock",
|
|
361
|
+
"doctor.check.stale_serve_lock.ok.no_lock": "No .fabric/.serve.lock present.",
|
|
362
|
+
"doctor.check.stale_serve_lock.ok.live_pid": ".fabric/.serve.lock held by live PID {pid}.",
|
|
363
|
+
"doctor.check.stale_serve_lock.age.day.singular": "{count} day ago",
|
|
364
|
+
"doctor.check.stale_serve_lock.age.day.plural": "{count} days ago",
|
|
365
|
+
"doctor.check.stale_serve_lock.age.hour.singular": "{count} hour ago",
|
|
366
|
+
"doctor.check.stale_serve_lock.age.hour.plural": "{count} hours ago",
|
|
367
|
+
"doctor.check.stale_serve_lock.message.dead_pid": "[advisory] .fabric/.serve.lock holds dead PID {pid} (acquired {acquiredAgo}). Run `fab doctor --fix` to remove.",
|
|
368
|
+
"doctor.check.stale_serve_lock.remediation.dead_pid": "Run `fab doctor --fix` to remove the stale .fabric/.serve.lock.",
|
|
369
|
+
"doctor.check.relevance_fields_missing.name": "Knowledge relevance fields missing",
|
|
370
|
+
"doctor.check.relevance_fields_missing.ok": "All pending entries declare both relevance_scope and relevance_paths.",
|
|
371
|
+
"doctor.check.relevance_fields_missing.message.singular": "{count} pending entry is missing relevance_scope and/or relevance_paths in frontmatter. First: {detail}.",
|
|
372
|
+
"doctor.check.relevance_fields_missing.message.plural": "{count} pending entries are missing relevance_scope and/or relevance_paths in frontmatter. First: {detail}.",
|
|
373
|
+
"doctor.check.relevance_fields_missing.remediation": "Run `fab doctor --apply-lint` to back-fill the schema defaults (relevance_scope: broad, relevance_paths: []).",
|
|
374
|
+
"doctor.check.skill_md_yaml_invalid.name": "Skill markdown YAML",
|
|
375
|
+
"doctor.check.skill_md_yaml_invalid.ok": "All .claude/.codex SKILL.md frontmatter values parse as strict YAML.",
|
|
376
|
+
"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}.",
|
|
377
|
+
"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}.",
|
|
378
|
+
"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`.',
|
|
379
|
+
"doctor.check.onboard_coverage.name": "Onboard coverage",
|
|
380
|
+
"doctor.check.onboard_coverage.ok.complete": "Onboard coverage: {filledCount}/{total} \u2713 (opted-out: {optedOutCount}).",
|
|
381
|
+
"doctor.check.onboard_coverage.message.incomplete": "Onboard slots not yet covered: [{missingSlots}]. {filledCount}/{total} filled; {optedOutCount} opted-out.",
|
|
382
|
+
"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.",
|
|
181
383
|
// v2.0.0-rc.25 TASK-10: --archive-history flag set. Read-only audit of
|
|
182
384
|
// session_archive_attempted events; mutually exclusive with the other
|
|
183
385
|
// mutation/report surfaces.
|
|
@@ -775,6 +977,208 @@ var zhCNMessages = {
|
|
|
775
977
|
"cli.doctor.args.dry-run.description": "\u4E0E --enrich-descriptions --auto \u642D\u914D\uFF1A\u4EC5\u9884\u89C8\u6539\u52A8\u8BA1\u5212,\u4E0D\u5199\u5165\u78C1\u76D8\u3002",
|
|
776
978
|
"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",
|
|
777
979
|
"doctor.enrich.allComplete": "\u6240\u6709\u6B63\u5F0F\u77E5\u8BC6\u6761\u76EE\u5747\u5DF2\u5305\u542B intent_clues / tech_stack / impact / must_read_if\u3002",
|
|
980
|
+
// rc.26 TASK-02a: doctor foundation-batch check messages.
|
|
981
|
+
"doctor.check.bootstrap_marker_migration.name": "Bootstrap marker \u8FC1\u79FB",
|
|
982
|
+
"doctor.check.bootstrap_marker_migration.ok": "bootstrap \u76EE\u6807\u6587\u4EF6\u4E2D\u672A\u68C0\u6D4B\u5230\u65E7 fabric:knowledge-base marker\u3002",
|
|
983
|
+
"doctor.check.bootstrap_marker_migration.message.singular": "{count} \u4E2A\u6587\u4EF6\u4ECD\u5E26\u6709\u65E7 fabric:knowledge-base bootstrap marker\uFF1A{list}\u3002",
|
|
984
|
+
"doctor.check.bootstrap_marker_migration.message.plural": "{count} \u4E2A\u6587\u4EF6\u4ECD\u5E26\u6709\u65E7 fabric:knowledge-base bootstrap marker\uFF1A{list}\u3002",
|
|
985
|
+
"doctor.check.bootstrap_marker_migration.remediation": "\u8FD0\u884C `fab doctor --fix` \u8FC1\u79FB\u5230 fabric:bootstrap marker",
|
|
986
|
+
"doctor.check.bootstrap_snapshot_drift.name": "Bootstrap snapshot drift",
|
|
987
|
+
"doctor.check.bootstrap_snapshot_drift.message.drift": ".fabric/AGENTS.md \u5185\u5BB9\u4E0E BOOTSTRAP_CANONICAL \u9010\u5B57\u8282\u4E0D\u4E00\u81F4\u3002",
|
|
988
|
+
"doctor.check.bootstrap_snapshot_drift.remediation.drift": "\u8FD0\u884C `fab doctor --fix` \u6062\u590D canonical bootstrap snapshot",
|
|
989
|
+
"doctor.check.bootstrap_snapshot_drift.ok.ok": ".fabric/AGENTS.md \u4E0E BOOTSTRAP_CANONICAL \u9010\u5B57\u8282\u4E00\u81F4\u3002",
|
|
990
|
+
"doctor.check.bootstrap_snapshot_drift.ok.missing_delegated": ".fabric/AGENTS.md \u4E0D\u5B58\u5728\uFF0C\u5DF2\u4EA4\u7531 bootstrap_anchor_missing \u62A5\u544A\u3002",
|
|
991
|
+
"doctor.check.managed_block_drift.name": "Managed block drift",
|
|
992
|
+
"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",
|
|
993
|
+
"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",
|
|
994
|
+
"doctor.check.managed_block_drift.remediation": "\u8FD0\u884C `fab doctor --fix` \u4ECE canonical \u6062\u590D three-end managed blocks",
|
|
995
|
+
"doctor.check.managed_block_drift.ok.ok": "Three-end managed blocks \u4E0E expectedBody \u9010\u5B57\u8282\u4E00\u81F4\u3002",
|
|
996
|
+
"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",
|
|
997
|
+
"doctor.check.bootstrap_anchor.name": "Bootstrap anchor",
|
|
998
|
+
"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",
|
|
999
|
+
"doctor.check.bootstrap_anchor.remediation.missing": "\u8FD0\u884C `fabric install` \u5728 repo root \u751F\u6210 AGENTS.md / CLAUDE.md bootstrap anchor\u3002",
|
|
1000
|
+
"doctor.check.bootstrap_anchor.ok": "repo root \u4E0B\u5DF2\u5B58\u5728 Bootstrap anchor\uFF1A{present}\u3002",
|
|
1001
|
+
"doctor.check.baseline_filename_format.name": "Baseline \u6587\u4EF6\u540D\u683C\u5F0F",
|
|
1002
|
+
"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",
|
|
1003
|
+
"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",
|
|
1004
|
+
"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",
|
|
1005
|
+
"doctor.check.baseline_filename_format.remediation": "\u624B\u52A8\u5220\u9664\u65E7 bare-slug baseline file(s)\uFF1Bbaseline pipeline \u5DF2\u5728 rc.23 \u79FB\u9664\uFF0C\u4E0D\u518D\u63D0\u4F9B auto-fix \u8DEF\u5F84\u3002",
|
|
1006
|
+
"doctor.check.knowledge_dir_missing.name": "Knowledge layout",
|
|
1007
|
+
"doctor.check.knowledge_dir_missing.message.singular": "{count} \u4E2A\u5FC5\u9700 knowledge subdir \u7F3A\u5931\uFF1A{list}\u3002",
|
|
1008
|
+
"doctor.check.knowledge_dir_missing.message.plural": "{count} \u4E2A\u5FC5\u9700 knowledge subdir \u7F3A\u5931\uFF1A{list}\u3002",
|
|
1009
|
+
"doctor.check.knowledge_dir_missing.remediation": "\u8FD0\u884C `fab doctor --fix` \u521B\u5EFA\u7F3A\u5931\u7684 .fabric/knowledge/* subdirectories\u3002",
|
|
1010
|
+
"doctor.check.knowledge_dir_missing.ok": "\u5168\u90E8 {count} \u4E2A\u5FC5\u9700 .fabric/knowledge/* subdirectories \u5747\u5DF2\u5B58\u5728\u3002",
|
|
1011
|
+
"doctor.check.forensic.name": "Scan evidence",
|
|
1012
|
+
"doctor.check.forensic.message.missing.singular": "{error} \u5B9E\u65F6\u626B\u63CF\u68C0\u6D4B\u5230 {frameworkKind}\uFF0C\u5171\u6709 {count} \u4E2A\u5165\u53E3\u70B9\u3002",
|
|
1013
|
+
"doctor.check.forensic.message.missing.plural": "{error} \u5B9E\u65F6\u626B\u63CF\u68C0\u6D4B\u5230 {frameworkKind}\uFF0C\u5171\u6709 {count} \u4E2A\u5165\u53E3\u70B9\u3002",
|
|
1014
|
+
"doctor.check.forensic.message.missing-default": ".fabric/forensic.json \u7F3A\u5931\u3002",
|
|
1015
|
+
"doctor.check.forensic.message.invalid-default": ".fabric/forensic.json \u65E0\u6548\u3002",
|
|
1016
|
+
"doctor.check.forensic.remediation": "\u8FD0\u884C `fab install` \u91CD\u65B0\u751F\u6210 .fabric/forensic.json\u3002",
|
|
1017
|
+
"doctor.check.forensic.ok": ".fabric/forensic.json \u5BF9 {frameworkKind} \u6709\u6548\u3002",
|
|
1018
|
+
"doctor.check.agents_meta.name": "Agents metadata",
|
|
1019
|
+
"doctor.check.agents_meta.message.missing": ".fabric/agents.meta.json \u7F3A\u5931\u3002",
|
|
1020
|
+
"doctor.check.agents_meta.remediation.missing": "\u8FD0\u884C `fab doctor --fix` \u4ECE .fabric/knowledge/ \u91CD\u5EFA agents.meta.json\u3002",
|
|
1021
|
+
"doctor.check.agents_meta.message.invalid-default": ".fabric/agents.meta.json \u65E0\u6548\u3002",
|
|
1022
|
+
"doctor.check.agents_meta.remediation.invalid": "\u5220\u9664 .fabric/agents.meta.json \u5E76\u8FD0\u884C `fab doctor --fix` \u91CD\u65B0\u751F\u6210\u3002",
|
|
1023
|
+
"doctor.check.agents_meta.message.stale": ".fabric/agents.meta.json revision {revision} \u4E0E .fabric/knowledge \u6D3E\u751F revision {computedRevision} \u4E0D\u4E00\u81F4\u3002",
|
|
1024
|
+
"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 `fab doctor --fix`\u3002",
|
|
1025
|
+
"doctor.check.agents_meta.ok": ".fabric/agents.meta.json revision {revision} \u5DF2\u4E0E .fabric/knowledge \u5BF9\u9F50\u3002",
|
|
1026
|
+
"doctor.check.rule_content_refs.name": "Rule content refs",
|
|
1027
|
+
"doctor.check.rule_content_refs.message.unavailable": "agents.meta.json \u6709\u6548\u524D\uFF0C\u65E0\u6CD5\u68C0\u67E5 content_ref entries\u3002",
|
|
1028
|
+
"doctor.check.rule_content_refs.remediation.unavailable": "\u5148\u4FEE\u590D agents.meta.json\uFF1A\u8FD0\u884C `fab doctor --fix`\u3002",
|
|
1029
|
+
"doctor.check.rule_content_refs.message.outside.singular": "{count} \u4E2A content_ref entry \u4F4D\u4E8E .fabric/knowledge \u5916\u90E8\u3002",
|
|
1030
|
+
"doctor.check.rule_content_refs.message.outside.plural": "{count} \u4E2A content_ref entries \u4F4D\u4E8E .fabric/knowledge \u5916\u90E8\u3002",
|
|
1031
|
+
"doctor.check.rule_content_refs.remediation.outside": "\u7F16\u8F91 agents.meta.json\uFF0C\u786E\u4FDD\u6240\u6709 content_ref \u503C\u90FD\u6307\u5411 .fabric/knowledge/{type}/\uFF08team\uFF09\u6216 ~/.fabric/knowledge/{type}/\uFF08personal\uFF09\u5185\u90E8\u3002",
|
|
1032
|
+
"doctor.check.rule_content_refs.message.missing.singular": "{count} \u4E2A content_ref target \u7F3A\u5931\u3002\u8FD0\u884C `fab doctor --fix` \u6267\u884C reconcile\u3002",
|
|
1033
|
+
"doctor.check.rule_content_refs.message.missing.plural": "{count} \u4E2A content_ref targets \u7F3A\u5931\u3002\u8FD0\u884C `fab doctor --fix` \u6267\u884C reconcile\u3002",
|
|
1034
|
+
"doctor.check.rule_content_refs.remediation.missing": "\u8FD0\u884C `fab doctor --fix` \u8BA9 agents.meta.json \u4E0E .fabric/knowledge/ \u4E2D\u7684\u73B0\u6709\u6587\u4EF6 reconcile\u3002",
|
|
1035
|
+
"doctor.check.rule_content_refs.ok": "\u6240\u6709 content_ref entries \u90FD\u80FD\u89E3\u6790\u5230 .fabric/knowledge files\u3002",
|
|
1036
|
+
"doctor.check.knowledge_test_index.name": "Knowledge-test index",
|
|
1037
|
+
"doctor.check.knowledge_test_index.remediation.missing": "\u8FD0\u884C `fab doctor --fix` \u91CD\u5EFA .fabric/.cache/knowledge-test.index.json\u3002",
|
|
1038
|
+
"doctor.check.knowledge_test_index.remediation.invalid": "\u5220\u9664 .fabric/.cache/knowledge-test.index.json \u5E76\u8FD0\u884C `fab doctor --fix` \u91CD\u65B0\u751F\u6210\u3002",
|
|
1039
|
+
"doctor.check.knowledge_test_index.message.stale": ".fabric/.cache/knowledge-test.index.json \u5DF2\u8FC7\u671F\u3002",
|
|
1040
|
+
"doctor.check.knowledge_test_index.remediation.stale": "\u8FD0\u884C `fab doctor --fix` \u91CD\u5EFA knowledge-test index\u3002",
|
|
1041
|
+
"doctor.check.knowledge_test_index.ok.link_singular.orphan_singular": "\u5DF2\u7D22\u5F15 {linkCount} \u4E2A link \u548C {orphanCount} \u4E2A orphan annotation\u3002",
|
|
1042
|
+
"doctor.check.knowledge_test_index.ok.link_singular.orphan_plural": "\u5DF2\u7D22\u5F15 {linkCount} \u4E2A link \u548C {orphanCount} \u4E2A orphan annotation\u3002",
|
|
1043
|
+
"doctor.check.knowledge_test_index.ok.link_plural.orphan_singular": "\u5DF2\u7D22\u5F15 {linkCount} \u4E2A link \u548C {orphanCount} \u4E2A orphan annotation\u3002",
|
|
1044
|
+
"doctor.check.knowledge_test_index.ok.link_plural.orphan_plural": "\u5DF2\u7D22\u5F15 {linkCount} \u4E2A link \u548C {orphanCount} \u4E2A orphan annotation\u3002",
|
|
1045
|
+
"doctor.check.event_ledger.name": "Event ledger",
|
|
1046
|
+
"doctor.check.event_ledger.message.missing": ".fabric/events.jsonl \u7F3A\u5931\u3002",
|
|
1047
|
+
"doctor.check.event_ledger.remediation.missing": "\u8FD0\u884C `fab doctor --fix` \u521B\u5EFA .fabric/events.jsonl\u3002",
|
|
1048
|
+
"doctor.check.event_ledger.message.not_writable-default": ".fabric/events.jsonl \u4E0D\u53EF\u5199\u3002",
|
|
1049
|
+
"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",
|
|
1050
|
+
"doctor.check.event_ledger.message.invalid-default": ".fabric/events.jsonl \u65E0\u6548\u3002",
|
|
1051
|
+
"doctor.check.event_ledger.remediation.invalid": "\u5220\u9664 .fabric/events.jsonl \u5E76\u8FD0\u884C `fab doctor --fix` \u91CD\u65B0\u521B\u5EFA\u3002",
|
|
1052
|
+
"doctor.check.event_ledger.ok": ".fabric/events.jsonl \u5DF2\u5B58\u5728\uFF0C\u53EF\u5199\uFF0C\u4E14\u53EF\u89E3\u6790\u3002",
|
|
1053
|
+
"doctor.check.mcp_config_in_wrong_file.name": "Claude MCP config \u4F4D\u7F6E",
|
|
1054
|
+
"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 fab install \u5199\u5165 .mcp.json\u3002",
|
|
1055
|
+
"doctor.check.mcp_config_in_wrong_file.remediation": "\u8FD0\u884C `fab doctor --fix` \u4ECE .claude/settings.json \u4E2D\u79FB\u9664 mcpServers.fabric\uFF0C\u7136\u540E\u8FD0\u884C `fab install` \u5199\u5165 .mcp.json\u3002",
|
|
1056
|
+
"doctor.check.mcp_config_in_wrong_file.ok": "mcpServers.fabric \u4E0D\u5728 .claude/settings.json \u4E2D\u3002",
|
|
1057
|
+
"doctor.check.event_ledger_partial_write.name": "Event ledger partial write",
|
|
1058
|
+
"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",
|
|
1059
|
+
"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",
|
|
1060
|
+
"doctor.check.event_ledger_partial_write.remediation": "\u8FD0\u884C `fab doctor --fix` \u622A\u65AD partial write \u5E76\u5C06 events.jsonl \u6062\u590D\u5230\u6709\u6548\u72B6\u6001\u3002",
|
|
1061
|
+
"doctor.check.event_ledger_partial_write.ok.clean": "events.jsonl \u6CA1\u6709 partial trailing write\u3002",
|
|
1062
|
+
"doctor.check.meta_manually_diverged.name": "Meta manual divergence",
|
|
1063
|
+
"doctor.check.meta_manually_diverged.ok.unreadable": "agents.meta.json \u4E0D\u53EF\u8BFB\uFF0C\u8DF3\u8FC7 divergence \u68C0\u67E5\u3002",
|
|
1064
|
+
"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",
|
|
1065
|
+
"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",
|
|
1066
|
+
"doctor.check.meta_manually_diverged.remediation.extra": "\u8FD0\u884C `fab doctor --fix` \u8BA9 agents.meta.json \u4E0E\u78C1\u76D8\u4E0A\u5F53\u524D\u7684 rule files reconcile\u3002",
|
|
1067
|
+
"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",
|
|
1068
|
+
"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",
|
|
1069
|
+
"doctor.check.meta_manually_diverged.remediation.hash": "\u8FD0\u884C `fab doctor --fix` \u8BA9 agents.meta.json \u4E0E\u5F53\u524D rule file \u5185\u5BB9 reconcile\u3002",
|
|
1070
|
+
"doctor.check.meta_manually_diverged.ok.consistent": "agents.meta.json \u4E0E\u78C1\u76D8\u4E0A\u7684 rule files \u4E00\u81F4\u3002",
|
|
1071
|
+
"doctor.check.knowledge_dir_unindexed.name": "Knowledge dir unindexed",
|
|
1072
|
+
"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 `fab doctor --fix` \u7D22\u5F15\u7F3A\u5931\u7684 knowledge files\u3002",
|
|
1073
|
+
"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 `fab doctor --fix` \u7D22\u5F15\u7F3A\u5931\u7684 knowledge files\u3002",
|
|
1074
|
+
"doctor.check.knowledge_dir_unindexed.remediation": "\u8FD0\u884C `fab doctor --fix` \u7D22\u5F15\u7F3A\u5931\u7684 knowledge files\u3002",
|
|
1075
|
+
"doctor.check.knowledge_dir_unindexed.ok": "\u6240\u6709 .fabric/knowledge/ .md files \u90FD\u5DF2\u7D22\u5F15\u5230 agents.meta.json\u3002",
|
|
1076
|
+
"doctor.check.stable_id_collision.name": "Stable ID collision",
|
|
1077
|
+
"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',
|
|
1078
|
+
"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',
|
|
1079
|
+
"doctor.check.stable_id_collision.remediation": "\u7F16\u8F91\u5176\u4E2D\u4E00\u4E2A colliding knowledge file\uFF0C\u6539\u7528\u4E0D\u540C\u7684 `id: K[PT]-XXX-NNNN` frontmatter \u503C\u3002",
|
|
1080
|
+
"doctor.check.stable_id_collision.ok": ".fabric/knowledge/ \u4E2D\u672A\u53D1\u73B0\u5DF2\u58F0\u660E\u7684 stable_id collisions\u3002",
|
|
1081
|
+
"doctor.check.counter_desync.name": "Knowledge counter desync",
|
|
1082
|
+
"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 `fab doctor --fix` bump counters\u3002",
|
|
1083
|
+
"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 `fab doctor --fix` bump counters\u3002",
|
|
1084
|
+
"doctor.check.counter_desync.remediation": "\u8FD0\u884C `fab doctor --fix` \u5C06 agents.meta.json counters \u63D0\u5347\u5230\u89C2\u6D4B\u5230\u7684\u6700\u5927 counter \u503C\u3002",
|
|
1085
|
+
"doctor.check.counter_desync.ok": "agents.meta.json counters envelope \u4E0E\u89C2\u6D4B\u5230\u7684 stable_ids \u4E00\u81F4\u3002",
|
|
1086
|
+
"doctor.check.preexisting_root_files.name": "Preexisting root markdown",
|
|
1087
|
+
"doctor.check.preexisting_root_files.ok": "project root \u672A\u68C0\u6D4B\u5230 CLAUDE.md \u6216 AGENTS.md\u3002",
|
|
1088
|
+
"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",
|
|
1089
|
+
"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",
|
|
1090
|
+
"doctor.check.filesystem_edit_fallback.name": "Filesystem-edit fallback",
|
|
1091
|
+
"doctor.check.filesystem_edit_fallback.ok": "No orphan canonical knowledge entries detected\uFF1Bevents.jsonl promotion trail \u5B8C\u6574\u3002",
|
|
1092
|
+
"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",
|
|
1093
|
+
"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",
|
|
1094
|
+
"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",
|
|
1095
|
+
"doctor.check.orphan_demote.name": "Knowledge orphan demote",
|
|
1096
|
+
"doctor.check.orphan_demote.ok": "\u6CA1\u6709 canonical knowledge entries \u8D85\u8FC7\u6309 maturity \u8BBE\u5B9A\u7684 inactivity threshold\u3002",
|
|
1097
|
+
"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",
|
|
1098
|
+
"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",
|
|
1099
|
+
"doctor.check.orphan_demote.remediation": "\u8FD0\u884C `fab doctor --apply-lint`\uFF08rc.4 TASK-003\uFF09\u5C06 orphan entries \u964D\u7EA7\u4E00\u4E2A maturity tier\u3002",
|
|
1100
|
+
"doctor.check.stale_archive.name": "Knowledge stale archive",
|
|
1101
|
+
"doctor.check.stale_archive.ok": "\u6CA1\u6709 draft knowledge entries \u8D85\u8FC7\u989D\u5916\u7684 stale-archive quiet window\u3002",
|
|
1102
|
+
"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",
|
|
1103
|
+
"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",
|
|
1104
|
+
"doctor.check.stale_archive.remediation": "\u8FD0\u884C `fab doctor --apply-lint`\uFF08rc.4 TASK-003\uFF09\u5C06 stale entries \u79FB\u52A8\u5230 `.fabric/.archive/<type>/`\u3002",
|
|
1105
|
+
"doctor.check.pending_overdue.name": "Knowledge pending overdue",
|
|
1106
|
+
"doctor.check.pending_overdue.ok": "\u6CA1\u6709 pending knowledge entries \u8D85\u8FC7 14-day review threshold\u3002",
|
|
1107
|
+
"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",
|
|
1108
|
+
"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",
|
|
1109
|
+
"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",
|
|
1110
|
+
"doctor.check.stable_id_duplicate.name": "Knowledge stable_id duplicate",
|
|
1111
|
+
"doctor.check.stable_id_duplicate.ok": "team / personal trees \u4E2D\u6CA1\u6709 canonical knowledge files \u5171\u4EAB stable_id\u3002",
|
|
1112
|
+
"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",
|
|
1113
|
+
"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",
|
|
1114
|
+
"doctor.check.stable_id_duplicate.remediation": "\u624B\u52A8\u5C06\u5176\u4E2D\u4E00\u4E2A colliding file \u91CD\u547D\u540D\u4E3A\u901A\u8FC7 canonical id allocator \u5206\u914D\u7684\u65B0 `<prefix>-<type>-<counter>--<slug>.md`\uFF1B\u4E0D\u8981\u624B\u5DE5\u7F16\u8F91\u3002",
|
|
1115
|
+
"doctor.check.layer_mismatch.name": "Knowledge layer mismatch",
|
|
1116
|
+
"doctor.check.layer_mismatch.ok": "\u6240\u6709 canonical knowledge files \u90FD\u4F4D\u4E8E stable_id prefix \u58F0\u660E\u7684 layer \u4E0B\u3002",
|
|
1117
|
+
"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",
|
|
1118
|
+
"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",
|
|
1119
|
+
"doctor.check.layer_mismatch.remediation": "\u5C06\u6587\u4EF6\u79FB\u52A8\u5230\u6B63\u786E\u7684 layer root\uFF0C\u6216\u901A\u8FC7 fabric-review modify \u6D41\u7A0B\u5207\u6362\u5176 layer\uFF08\u4F1A\u76F8\u5E94\u91CD\u547D\u540D stable_id prefix\uFF09\u3002",
|
|
1120
|
+
"doctor.check.index_drift.name": "Knowledge index drift",
|
|
1121
|
+
"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",
|
|
1122
|
+
"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",
|
|
1123
|
+
"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",
|
|
1124
|
+
"doctor.check.index_drift.remediation": "\u8FD0\u884C `fab doctor --apply-lint`\uFF08rc.4 TASK-003\uFF09\u5C06 agents.meta.json counters \u63D0\u5347\u5230 max_observed + 1\u3002",
|
|
1125
|
+
"doctor.check.underseeded.name": "Knowledge underseeded",
|
|
1126
|
+
"doctor.check.underseeded.ok": "\u77E5\u8BC6\u5E93\u5DF2\u6709 {count} \u4E2A canonical entries\uFF08>= {threshold}\uFF09\u3002",
|
|
1127
|
+
"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",
|
|
1128
|
+
"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",
|
|
1129
|
+
"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",
|
|
1130
|
+
"doctor.check.narrow_no_paths.name": "Knowledge narrow without paths",
|
|
1131
|
+
"doctor.check.narrow_no_paths.ok": "\u6CA1\u6709 narrow-scope canonical entries \u7684 relevance_paths array \u4E3A\u7A7A\u3002",
|
|
1132
|
+
"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",
|
|
1133
|
+
"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",
|
|
1134
|
+
"doctor.check.narrow_no_paths.remediation": "\u4E3A relevance_paths \u6DFB\u52A0 path anchors\uFF0C\u6216\u5C06 entry \u7684 relevance_scope \u653E\u5BBD\u5230 broad\u3002",
|
|
1135
|
+
"doctor.check.relevance_paths_dangling.name": "Knowledge relevance_paths dangling",
|
|
1136
|
+
"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",
|
|
1137
|
+
"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",
|
|
1138
|
+
"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",
|
|
1139
|
+
"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",
|
|
1140
|
+
"doctor.check.relevance_paths_drift.name": "Knowledge relevance_paths drift",
|
|
1141
|
+
"doctor.check.relevance_paths_drift.ok.skipped": "\u5DF2\u8DF3\u8FC7\uFF08git history unavailable\uFF1B\u65E0\u6CD5\u8BC4\u4F30 {windowDays}d drift window\uFF09\u3002",
|
|
1142
|
+
"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",
|
|
1143
|
+
"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",
|
|
1144
|
+
"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",
|
|
1145
|
+
"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",
|
|
1146
|
+
"doctor.check.narrow_too_few.name": "Knowledge narrow too few",
|
|
1147
|
+
"doctor.check.narrow_too_few.ok": "Narrow-with-paths ratio {ratioPct}%\uFF08{narrowCount}/{totalCount}\uFF09\uFF1B{teleNote}\u3002",
|
|
1148
|
+
"doctor.check.narrow_too_few.message.telemetry_skipped": "telemetry skipped\uFF08no edit-counter fires in window\uFF09",
|
|
1149
|
+
"doctor.check.narrow_too_few.message.telemetry_window": "silence rate {silencePct}% over {windowDays}d",
|
|
1150
|
+
"doctor.check.narrow_too_few.message.structural": "narrow-with-paths share {ratioPct}%\uFF08{narrowCount}/{totalCount}\uFF09below {thresholdPct}% threshold",
|
|
1151
|
+
"doctor.check.narrow_too_few.message.telemetry": "narrow-hook silence rate {silencePct}%\uFF08{silenceFires}/{totalFires}\uFF09over {windowDays}d above {thresholdPct}% threshold",
|
|
1152
|
+
"doctor.check.narrow_too_few.message.summary": "Narrow-scope KB coverage \u4F4E\u4E8E\u53EF\u7528\u4E0B\u9650\uFF1A{parts}\u3002",
|
|
1153
|
+
"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",
|
|
1154
|
+
"doctor.check.session_hints_stale.name": "Knowledge session-hints stale",
|
|
1155
|
+
"doctor.check.session_hints_stale.ok": ".fabric/.cache/ \u4E0B\u6CA1\u6709\u8D85\u8FC7 {days} \u5929\u7684 session-hints cache files\u3002",
|
|
1156
|
+
"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",
|
|
1157
|
+
"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",
|
|
1158
|
+
"doctor.check.session_hints_stale.remediation": "\u8FD0\u884C `fab doctor --apply-lint` \u5220\u9664\u8FC7\u671F\u7684 session-hints cache files\u3002",
|
|
1159
|
+
"doctor.check.stale_serve_lock.name": "Serve lock",
|
|
1160
|
+
"doctor.check.stale_serve_lock.ok.no_lock": "\u672A\u53D1\u73B0 .fabric/.serve.lock\u3002",
|
|
1161
|
+
"doctor.check.stale_serve_lock.ok.live_pid": ".fabric/.serve.lock \u7531 live PID {pid} \u6301\u6709\u3002",
|
|
1162
|
+
"doctor.check.stale_serve_lock.age.day.singular": "{count} \u5929\u524D",
|
|
1163
|
+
"doctor.check.stale_serve_lock.age.day.plural": "{count} \u5929\u524D",
|
|
1164
|
+
"doctor.check.stale_serve_lock.age.hour.singular": "{count} \u5C0F\u65F6\u524D",
|
|
1165
|
+
"doctor.check.stale_serve_lock.age.hour.plural": "{count} \u5C0F\u65F6\u524D",
|
|
1166
|
+
"doctor.check.stale_serve_lock.message.dead_pid": "[advisory] .fabric/.serve.lock \u6301\u6709 dead PID {pid}\uFF08acquired {acquiredAgo}\uFF09\u3002\u8FD0\u884C `fab doctor --fix` \u79FB\u9664\u3002",
|
|
1167
|
+
"doctor.check.stale_serve_lock.remediation.dead_pid": "\u8FD0\u884C `fab doctor --fix` \u79FB\u9664\u8FC7\u671F\u7684 .fabric/.serve.lock\u3002",
|
|
1168
|
+
"doctor.check.relevance_fields_missing.name": "Knowledge relevance fields missing",
|
|
1169
|
+
"doctor.check.relevance_fields_missing.ok": "\u6240\u6709 pending entries \u90FD\u58F0\u660E\u4E86 relevance_scope \u548C relevance_paths\u3002",
|
|
1170
|
+
"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",
|
|
1171
|
+
"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",
|
|
1172
|
+
"doctor.check.relevance_fields_missing.remediation": "\u8FD0\u884C `fab doctor --apply-lint` \u56DE\u586B schema defaults\uFF08relevance_scope: broad\uFF0Crelevance_paths: []\uFF09\u3002",
|
|
1173
|
+
"doctor.check.skill_md_yaml_invalid.name": "Skill markdown YAML",
|
|
1174
|
+
"doctor.check.skill_md_yaml_invalid.ok": "\u6240\u6709 .claude/.codex SKILL.md frontmatter values \u90FD\u80FD\u6309 strict YAML \u89E3\u6790\u3002",
|
|
1175
|
+
"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",
|
|
1176
|
+
"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",
|
|
1177
|
+
"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',
|
|
1178
|
+
"doctor.check.onboard_coverage.name": "Onboard coverage",
|
|
1179
|
+
"doctor.check.onboard_coverage.ok.complete": "Onboard coverage\uFF1A{filledCount}/{total} \u2713\uFF08opted-out\uFF1A{optedOutCount}\uFF09\u3002",
|
|
1180
|
+
"doctor.check.onboard_coverage.message.incomplete": "\u5C1A\u672A\u8986\u76D6\u7684 onboard slots\uFF1A[{missingSlots}]\u3002{filledCount}/{total} filled\uFF1B{optedOutCount} opted-out\u3002",
|
|
1181
|
+
"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",
|
|
778
1182
|
// v2.0.0-rc.25 TASK-10: --archive-history 子命令——按 session 维度审计归档尝试记录。
|
|
779
1183
|
"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",
|
|
780
1184
|
"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",
|
|
@@ -1240,6 +1644,39 @@ function detectNodeLocale() {
|
|
|
1240
1644
|
return "en";
|
|
1241
1645
|
}
|
|
1242
1646
|
|
|
1647
|
+
// src/i18n/resolve-fabric-locale.ts
|
|
1648
|
+
import fs from "fs";
|
|
1649
|
+
import path from "path";
|
|
1650
|
+
function resolveFabricLocale(projectRoot) {
|
|
1651
|
+
const configPath = path.join(projectRoot, ".fabric", "fabric-config.json");
|
|
1652
|
+
let raw;
|
|
1653
|
+
try {
|
|
1654
|
+
raw = fs.readFileSync(configPath, "utf8");
|
|
1655
|
+
} catch {
|
|
1656
|
+
return detectNodeLocale();
|
|
1657
|
+
}
|
|
1658
|
+
let parsed;
|
|
1659
|
+
try {
|
|
1660
|
+
parsed = JSON.parse(raw);
|
|
1661
|
+
} catch {
|
|
1662
|
+
return detectNodeLocale();
|
|
1663
|
+
}
|
|
1664
|
+
if (typeof parsed !== "object" || parsed === null) {
|
|
1665
|
+
return detectNodeLocale();
|
|
1666
|
+
}
|
|
1667
|
+
const fabricLanguage = parsed.fabric_language;
|
|
1668
|
+
if (fabricLanguage === "en" || fabricLanguage === "zh-CN") {
|
|
1669
|
+
return fabricLanguage;
|
|
1670
|
+
}
|
|
1671
|
+
if (fabricLanguage === "match-existing" || fabricLanguage === "zh-CN-hybrid") {
|
|
1672
|
+
console.warn(
|
|
1673
|
+
`[fabric] fabric_language="${fabricLanguage}" is a pre-init placeholder that should have been resolved during 'fab init' (KT-DEC-9004). Falling back to FAB_LANG / LANG environment detection.`
|
|
1674
|
+
);
|
|
1675
|
+
return detectNodeLocale();
|
|
1676
|
+
}
|
|
1677
|
+
return detectNodeLocale();
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1243
1680
|
// src/i18n/protected-tokens.ts
|
|
1244
1681
|
var PROTECTED_TOKENS = [
|
|
1245
1682
|
// v2.0 MCP tool names
|
|
@@ -1288,5 +1725,6 @@ export {
|
|
|
1288
1725
|
createTranslator,
|
|
1289
1726
|
normalizeLocale,
|
|
1290
1727
|
detectNodeLocale,
|
|
1728
|
+
resolveFabricLocale,
|
|
1291
1729
|
PROTECTED_TOKENS
|
|
1292
1730
|
};
|
package/dist/i18n/index.d.ts
CHANGED
|
@@ -10,6 +10,26 @@ declare function createTranslator(locale: Locale, messages?: Record<Locale, Mess
|
|
|
10
10
|
|
|
11
11
|
declare function detectNodeLocale(): Locale;
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* Resolve the effective runtime locale for a given project root.
|
|
15
|
+
*
|
|
16
|
+
* Resolution order (rc.26 — closes KT-DEC-9004 runtime gap):
|
|
17
|
+
* 1. Read `<projectRoot>/.fabric/fabric-config.json` and inspect
|
|
18
|
+
* `fabric_language`.
|
|
19
|
+
* 2. If the value is `"en"` or `"zh-CN"` (the two concrete Locale members),
|
|
20
|
+
* return it verbatim — this is the eager-resolved value `fab init` is
|
|
21
|
+
* supposed to write back per KT-DEC-9004.
|
|
22
|
+
* 3. If the value is `"match-existing"` or `"zh-CN-hybrid"` (placeholders
|
|
23
|
+
* that should NEVER survive `fab init` per KT-DEC-9004's invariant),
|
|
24
|
+
* emit a `console.warn` and fall through to `detectNodeLocale()`.
|
|
25
|
+
* 4. If the file is missing, unreadable, malformed JSON, or `fabric_language`
|
|
26
|
+
* is absent / has any other shape, silently fall through to
|
|
27
|
+
* `detectNodeLocale()` (env-driven: `FAB_LANG` → `LANG` → `"en"`).
|
|
28
|
+
*
|
|
29
|
+
* Never throws — all failure paths degrade to `detectNodeLocale()`.
|
|
30
|
+
*/
|
|
31
|
+
declare function resolveFabricLocale(projectRoot: string): Locale;
|
|
32
|
+
|
|
13
33
|
declare function normalizeLocale(raw: string | null | undefined): Locale;
|
|
14
34
|
|
|
15
35
|
declare const PROTECTED_TOKENS: readonly ["fab_plan_context", "fab_get_knowledge_sections", "fab_extract_knowledge", "fab_review", "AGENTS.md", ".fabric/agents/", ".fabric/agents/_cross/", ".fabric/agents.meta.json", ".fabric/human-lock.json", ".fabric/events.jsonl", ".fabric/knowledge/", "knowledge_proposed", "relevance_scope", "relevance_paths", "narrow", "broad", "source_sessions", "proposed_reason", "session_context", "layer", "team", "personal", "pending_path", "knowledge_scope_degraded", "@HUMAN", "MUST", "NEVER"];
|
|
@@ -19,4 +39,4 @@ declare const enMessages: Messages;
|
|
|
19
39
|
|
|
20
40
|
declare const zhCNMessages: Messages;
|
|
21
41
|
|
|
22
|
-
export { type Locale, type Messages, PROTECTED_TOKENS, type ProtectedToken, type TranslationKey, type Translator, createTranslator, defaultMessages, detectNodeLocale, enMessages, normalizeLocale, zhCNMessages };
|
|
42
|
+
export { type Locale, type Messages, PROTECTED_TOKENS, type ProtectedToken, type TranslationKey, type Translator, createTranslator, defaultMessages, detectNodeLocale, enMessages, normalizeLocale, resolveFabricLocale, zhCNMessages };
|
package/dist/i18n/index.js
CHANGED
|
@@ -5,8 +5,9 @@ import {
|
|
|
5
5
|
detectNodeLocale,
|
|
6
6
|
enMessages,
|
|
7
7
|
normalizeLocale,
|
|
8
|
+
resolveFabricLocale,
|
|
8
9
|
zhCNMessages
|
|
9
|
-
} from "../chunk-
|
|
10
|
+
} from "../chunk-E5LHOWTN.js";
|
|
10
11
|
export {
|
|
11
12
|
PROTECTED_TOKENS,
|
|
12
13
|
createTranslator,
|
|
@@ -14,5 +15,6 @@ export {
|
|
|
14
15
|
detectNodeLocale,
|
|
15
16
|
enMessages,
|
|
16
17
|
normalizeLocale,
|
|
18
|
+
resolveFabricLocale,
|
|
17
19
|
zhCNMessages
|
|
18
20
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AgentsMetaNode, AgentsIdentitySource, AgentsLayer, AgentsTopologyType, HumanLockEntry, AgentsMeta, LedgerEntry } from './types/index.js';
|
|
2
2
|
export { AgentsActivationTier, AgentsMetaCountersEnvelope, AgentsMetaKnowledgeTypeCounters, AgentsMetaNodeActivation, AiLedgerEntry, AuditMode, ClientPaths, DefaultLayerFilter, FabricConfig, FabricLanguage, HumanLedgerEntry, McpPayloadLimits, RuleDescription, RuleDescriptionIndexItem } from './types/index.js';
|
|
3
|
-
export { Locale, Messages, PROTECTED_TOKENS, ProtectedToken, TranslationKey, Translator, createTranslator, defaultMessages, detectNodeLocale, enMessages, normalizeLocale, zhCNMessages } from './i18n/index.js';
|
|
3
|
+
export { Locale, Messages, PROTECTED_TOKENS, ProtectedToken, TranslationKey, Translator, createTranslator, defaultMessages, detectNodeLocale, enMessages, normalizeLocale, resolveFabricLocale, zhCNMessages } from './i18n/index.js';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { Layer, KnowledgeType, StableId } from './schemas/api-contracts.js';
|
|
6
6
|
export { CiteContractMetrics, CiteCoverageReport, CiteLayerTypeBreakdown, FabExtractKnowledgeInput, FabExtractKnowledgeInputSchema, FabExtractKnowledgeInputShape, FabExtractKnowledgeOutput, FabExtractKnowledgeOutputSchema, FabReviewInput, FabReviewInputSchema, FabReviewInputShape, FabReviewOutput, FabReviewOutputSchema, FabReviewOutputShape, KNOWLEDGE_TYPE_CODES, KnowledgeEntryFrontmatter, KnowledgeEntryFrontmatterSchema, KnowledgeTypeCode, KnowledgeTypeSchema, LayerSchema, Maturity, MaturitySchema, PROPOSED_REASON_DESCRIPTIONS, ProposedReason, ProposedReasonSchema, StableIdSchema, annotateIntentRequestSchema, citeContractMetricsSchema, citeCoverageReportSchema, citeLayerTypeBreakdownSchema, fabExtractKnowledgeAnnotations, fabReviewAnnotations, formatKnowledgeId, historyStateQuerySchema, humanLockApproveRequestSchema, humanLockFileParamsSchema, knowledgeSectionsAnnotations, knowledgeSectionsInputSchema, knowledgeSectionsOutputSchema, ledgerQuerySchema, ledgerSourceSchema, parseKnowledgeId, planContextAnnotations, planContextHintNarrowEntrySchema, planContextHintOutputSchema, planContextInputSchema, planContextOutputSchema, structuredWarningSchema } from './schemas/api-contracts.js';
|
package/dist/index.js
CHANGED
|
@@ -14,8 +14,9 @@ import {
|
|
|
14
14
|
detectNodeLocale,
|
|
15
15
|
enMessages,
|
|
16
16
|
normalizeLocale,
|
|
17
|
+
resolveFabricLocale,
|
|
17
18
|
zhCNMessages
|
|
18
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-E5LHOWTN.js";
|
|
19
20
|
import {
|
|
20
21
|
FabExtractKnowledgeInputSchema,
|
|
21
22
|
FabExtractKnowledgeInputShape,
|
|
@@ -1458,6 +1459,7 @@ export {
|
|
|
1458
1459
|
planContextOutputSchema,
|
|
1459
1460
|
reapplyCompletedEventSchema,
|
|
1460
1461
|
relevanceMigrationRunEventSchema,
|
|
1462
|
+
resolveFabricLocale,
|
|
1461
1463
|
ruleDescriptionIndexItemSchema,
|
|
1462
1464
|
ruleDescriptionSchema,
|
|
1463
1465
|
serveLockClearedEventSchema,
|