@fenglimg/fabric-shared 2.0.0-rc.35 → 2.0.0-rc.37
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-Z26SD627.js → chunk-DRQTQEEV.js} +190 -8
- package/dist/chunk-VWJQVRSE.js +100 -0
- package/dist/{chunk-S2OX6ZUS.js → chunk-ZSRVKMYT.js} +143 -24
- package/dist/i18n/index.js +1 -1
- package/dist/{index-BjssYQb3.d.ts → index-BkXfeNyz.d.ts} +3 -0
- package/dist/index.d.ts +93 -13
- package/dist/index.js +48 -13
- package/dist/schemas/api-contracts.d.ts +921 -16
- package/dist/schemas/api-contracts.js +13 -1
- package/dist/templates/bootstrap-canonical.d.ts +1 -1
- package/dist/templates/bootstrap-canonical.js +1 -1
- package/dist/types/index.d.ts +1 -1
- package/package.json +26 -2
- package/dist/chunk-COWUGYWC.js +0 -76
|
@@ -237,6 +237,7 @@ var enMessages = {
|
|
|
237
237
|
"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.",
|
|
238
238
|
"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).",
|
|
239
239
|
"doctor.check.agents_meta.message.stale": ".fabric/agents.meta.json revision {revision} does not match .fabric/knowledge derived revision {computedRevision}.",
|
|
240
|
+
"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.",
|
|
240
241
|
"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.",
|
|
241
242
|
"doctor.check.agents_meta.ok": ".fabric/agents.meta.json revision {revision} is aligned with .fabric/knowledge.",
|
|
242
243
|
"doctor.check.rule_content_refs.name": "Rule content refs",
|
|
@@ -268,6 +269,16 @@ var enMessages = {
|
|
|
268
269
|
// 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).
|
|
269
270
|
"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/.",
|
|
270
271
|
"doctor.check.event_ledger.ok": ".fabric/events.jsonl exists, is writable, and is parseable.",
|
|
272
|
+
// v2.0.0-rc.37 Wave B (B5): composite hard-gate check for events.jsonl /
|
|
273
|
+
// metrics.jsonl health (G7 size / G8 metric_leak / G9 metrics_stale /
|
|
274
|
+
// G10 rotation_overdue).
|
|
275
|
+
"doctor.check.events_jsonl_health.name": "Events ledger health (rc.37 Plan B 5 hard gate)",
|
|
276
|
+
"doctor.check.events_jsonl_health.ok": ".fabric/events.jsonl size, freshness, and metric isolation all healthy.",
|
|
277
|
+
"doctor.check.events_jsonl_health.message.size": ".fabric/events.jsonl is {sizeMb} MB, above the 10 MB threshold.",
|
|
278
|
+
"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.",
|
|
279
|
+
"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.",
|
|
280
|
+
"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.",
|
|
281
|
+
"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.",
|
|
271
282
|
"doctor.check.mcp_config_in_wrong_file.name": "Claude MCP config location",
|
|
272
283
|
"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.",
|
|
273
284
|
"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.",
|
|
@@ -313,6 +324,22 @@ var enMessages = {
|
|
|
313
324
|
"doctor.check.draft_backlog.ok": "draft-maturity entry ratio is healthy (< 50%, or workspace too small to compute).",
|
|
314
325
|
"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%).",
|
|
315
326
|
"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.",
|
|
327
|
+
// rc.37 NEW-38: knowledge auto-promote (info surface; --fix applies).
|
|
328
|
+
"doctor.check.draft_auto_promote.name": "Knowledge auto-promote",
|
|
329
|
+
"doctor.check.draft_auto_promote.ok": "No settled drafts awaiting auto-promote (drafts are younger than 14 days or flagged drifted).",
|
|
330
|
+
"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.",
|
|
331
|
+
"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.",
|
|
332
|
+
"doctor.check.draft_auto_promote.fixed": "Auto-promoted {count} settled draft entries \u2192 verified.",
|
|
333
|
+
// rc.36 TASK-05 (P0-8): empty-tags ratio warn.
|
|
334
|
+
"doctor.check.knowledge_tags_empty.name": "Knowledge tags coverage",
|
|
335
|
+
"doctor.check.knowledge_tags_empty.ok": "empty-tag ratio is healthy (\u2264 50%, or workspace too small to compute).",
|
|
336
|
+
"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.",
|
|
337
|
+
"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.",
|
|
338
|
+
// rc.36 TASK-09 (P1-NEW1): drift_detected events unconsumed by demote.
|
|
339
|
+
"doctor.check.drift_unconsumed.name": "Knowledge drift unconsumed",
|
|
340
|
+
"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.",
|
|
341
|
+
"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.",
|
|
342
|
+
"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.",
|
|
316
343
|
"doctor.check.meta_manually_diverged.name": "Meta manual divergence",
|
|
317
344
|
"doctor.check.meta_manually_diverged.ok.unreadable": "agents.meta.json not readable; skipping divergence check.",
|
|
318
345
|
"doctor.check.meta_manually_diverged.message.extra.singular": "agents.meta.json has {count} entry with no backing file on disk. Run --fix to reconcile.",
|
|
@@ -388,7 +415,7 @@ var enMessages = {
|
|
|
388
415
|
"doctor.check.narrow_no_paths.ok": "No narrow-scope canonical entries have an empty relevance_paths array.",
|
|
389
416
|
"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}.",
|
|
390
417
|
"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}.",
|
|
391
|
-
"doctor.check.narrow_no_paths.remediation": "
|
|
418
|
+
"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.",
|
|
392
419
|
"doctor.check.relevance_paths_dangling.name": "Knowledge relevance_paths dangling",
|
|
393
420
|
"doctor.check.relevance_paths_dangling.ok": "All relevance_paths globs resolve to at least one file under the workspace root.",
|
|
394
421
|
"doctor.check.relevance_paths_dangling.message.singular": "{count} relevance_paths glob resolves to zero files in the current workspace. First: {detail}.",
|
|
@@ -400,6 +427,16 @@ var enMessages = {
|
|
|
400
427
|
"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}.",
|
|
401
428
|
"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}.",
|
|
402
429
|
"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.",
|
|
430
|
+
"doctor.check.personal_layer_path_misclassify.name": "Personal-layer path misclassify",
|
|
431
|
+
"doctor.check.personal_layer_path_misclassify.ok": "No personal-layer entries declare relevance_paths that resolve against the current project.",
|
|
432
|
+
"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}.",
|
|
433
|
+
"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}.",
|
|
434
|
+
"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).',
|
|
435
|
+
"doctor.check.suspicious_kb.name": "Suspicious KB injection",
|
|
436
|
+
"doctor.check.suspicious_kb.ok": "No canonical knowledge bodies match known prompt-injection patterns.",
|
|
437
|
+
"doctor.check.suspicious_kb.message.singular": "{count} canonical entry body contains tokens matching prompt-injection patterns (likely legacy pre-NEW-31 archive). First: {detail}.",
|
|
438
|
+
"doctor.check.suspicious_kb.message.plural": "{count} canonical entry bodies contain tokens matching prompt-injection patterns (likely legacy pre-NEW-31 archive). First: {detail}.",
|
|
439
|
+
"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.",
|
|
403
440
|
"doctor.check.narrow_too_few.name": "Knowledge narrow too few",
|
|
404
441
|
"doctor.check.narrow_too_few.ok": "Narrow-with-paths ratio {ratioPct}% ({narrowCount}/{totalCount}); {teleNote}.",
|
|
405
442
|
"doctor.check.narrow_too_few.message.telemetry_skipped": "telemetry skipped (no edit-counter fires in window)",
|
|
@@ -434,6 +471,20 @@ var enMessages = {
|
|
|
434
471
|
"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.",
|
|
435
472
|
"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).",
|
|
436
473
|
"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.",
|
|
474
|
+
// v2.0.0-rc.37 NEW-20: hooks_runtime — shebang + Node.js syntax validity
|
|
475
|
+
// of installed *.cjs hook files (one layer below hooks_wired).
|
|
476
|
+
"doctor.check.hooks_runtime.name": "Hooks runtime health",
|
|
477
|
+
"doctor.check.hooks_runtime.ok.skipped": "No installed hook files found under .claude/hooks/ / .codex/hooks/ / .cursor/hooks/; skipping hooks_runtime check.",
|
|
478
|
+
"doctor.check.hooks_runtime.ok.healthy": "Scanned {count} hook .cjs file(s); shebang and Node.js syntax parse all pass.",
|
|
479
|
+
"doctor.check.hooks_runtime.message.singular": "{count} hook file is unhealthy at runtime; first: {first_path} ({first_detail}).",
|
|
480
|
+
"doctor.check.hooks_runtime.message.plural": "{count} hook files are unhealthy at runtime; first: {first_path} ({first_detail}).",
|
|
481
|
+
"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.",
|
|
482
|
+
// v2.0.0-rc.37 NEW-27: hooks_content_drift — cross-client sha256 parity.
|
|
483
|
+
"doctor.check.hooks_content_drift.name": "Hooks cross-client content parity",
|
|
484
|
+
"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.",
|
|
485
|
+
"doctor.check.hooks_content_drift.ok.aligned": "Scanned {count} hook copies; sha256 of every basename matches across .claude / .codex / .cursor.",
|
|
486
|
+
"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.",
|
|
487
|
+
"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.",
|
|
437
488
|
// rc.31 BUG-G2/G5: promote-ledger invariant check.
|
|
438
489
|
"doctor.check.promote_ledger_invariant.name": "Promote ledger invariant",
|
|
439
490
|
"doctor.check.promote_ledger_invariant.ok": "knowledge_proposed={proposed} >= knowledge_promote_started={started} >= knowledge_promoted={promoted}; ledger invariant holds.",
|
|
@@ -474,6 +525,12 @@ var enMessages = {
|
|
|
474
525
|
"doctor.archive-history.table.outcome": "Outcome",
|
|
475
526
|
"doctor.archive-history.table.candidates": "Candidates",
|
|
476
527
|
"doctor.archive-history.table.coveredGap": "Covered gap",
|
|
528
|
+
// rc.37 NEW-33: unified --history <mode> view (archive | fix | all).
|
|
529
|
+
"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.",
|
|
530
|
+
"cli.doctor.errors.history-mutex": "--history cannot be combined with --fix, --fix-knowledge, --cite-coverage, --enrich-descriptions, or --archive-history. Run them separately.",
|
|
531
|
+
"cli.doctor.errors.invalid-history-mode": "Invalid --history mode '{input}'. Use archive | fix | all.",
|
|
532
|
+
"doctor.history.header": "Doctor history (mode={mode}, last {sinceLabel}, {days} day(s))",
|
|
533
|
+
"doctor.history.empty": "No doctor or archive activity within the --since={sinceLabel} window (mode={mode}).",
|
|
477
534
|
"cli.hooks.description": "Manage Fabric Git hook templates.",
|
|
478
535
|
"cli.hooks.install.description": "Install the Fabric Husky pre-commit hook template.",
|
|
479
536
|
"cli.hooks.install.args.target.description": "Target project path, default is the current working directory.",
|
|
@@ -500,6 +557,12 @@ var enMessages = {
|
|
|
500
557
|
"cli.install.force-skills-only.uninitialised.message": "fabric install --force-skills-only: project is not initialised (.fabric/agents.meta.json is missing).",
|
|
501
558
|
"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.",
|
|
502
559
|
"cli.install.force-skills-only.summary": "Skills refresh complete \u2014 written: {written}, skipped: {skipped}, errors: {errors}",
|
|
560
|
+
// v2.0.0-rc.37 NEW-26: --force-hooks-only mirror of --force-skills-only.
|
|
561
|
+
"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/*).",
|
|
562
|
+
"cli.install.force-hooks-only.banner": "Refreshing fabric hooks only",
|
|
563
|
+
"cli.install.force-hooks-only.uninitialised.message": "fabric install --force-hooks-only: project not initialised (.fabric/agents.meta.json missing).",
|
|
564
|
+
"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.",
|
|
565
|
+
"cli.install.force-hooks-only.summary": "Hooks refresh complete \u2014 written: {written}, skipped: {skipped}, errors: {errors}",
|
|
503
566
|
"cli.install.mcp.install.global": "Using globally-installed @fenglimg/fabric-server",
|
|
504
567
|
"cli.install.mcp.install.local": "Installing @fenglimg/fabric-server to project devDependencies",
|
|
505
568
|
"cli.install.mcp.local.installing": "Running {manager} add -D @fenglimg/fabric-server...",
|
|
@@ -557,6 +620,10 @@ var enMessages = {
|
|
|
557
620
|
"cli.install.wizard.invalid-select": "Invalid value. Use one of: {options}.",
|
|
558
621
|
"cli.install.wizard.cancelled": "Fabric install cancelled before execution.",
|
|
559
622
|
"cli.install.capabilities.title": "Client capability summary",
|
|
623
|
+
// v2.0.0-rc.37 NEW-22: post-install restart banner. The MCP server is
|
|
624
|
+
// spawned by the client; already-running Claude Code / Cursor / Codex
|
|
625
|
+
// sessions won't pick up the new mcp config until they restart.
|
|
626
|
+
"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.",
|
|
560
627
|
"cli.install.capabilities.none": "No supported client was detected for bootstrap or MCP follow-up.",
|
|
561
628
|
"cli.install.capabilities.header.client": "Client",
|
|
562
629
|
"cli.install.capabilities.header.bootstrap": "Bootstrap",
|
|
@@ -667,17 +734,10 @@ var enMessages = {
|
|
|
667
734
|
"cli.scan.recommendation.contributing": "L0: Add CONTRIBUTING.md or leave a bootstrap TODO reference for contribution flow.",
|
|
668
735
|
"cli.scan.recommendation.unknown-framework": "L1: Add tech-stack TODOs manually because no framework marker was detected.",
|
|
669
736
|
"cli.scan.recommendation.framework-dirs": "L1: Review {framework} directories for future scoped Fabric rule files.",
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
"cli.serve.args.debug.description": "Print target resolution details to stderr.",
|
|
675
|
-
"cli.serve.args.allow-loopback-no-auth.description": "Opt in to running the loopback HTTP server without Bearer auth (default-deny). Use only on a trusted single-user machine; any local process can then read your knowledge ledger.",
|
|
676
|
-
"cli.serve.ready.title": "Fabric Dashboard",
|
|
677
|
-
"cli.serve.lock-held.action-hint": "A `fabric serve` instance (PID {pid}) is holding the workspace lock. Stop it (Ctrl-C in that terminal or `kill {pid}`) before running this command.",
|
|
678
|
-
"cli.serve.warning.host-fallback": "--host {host} requires FABRIC_AUTH_TOKEN for non-loopback exposure; falling back to 127.0.0.1. To bind {host}, run: FABRIC_AUTH_TOKEN=<token> fabric serve --host {host}",
|
|
679
|
-
"cli.serve.warning.loopback-deny-default": "FABRIC_AUTH_TOKEN is not set: /api /events /mcp will return 401 by default (any local process could otherwise read .fabric/agents.meta.json + forensic.json + events.jsonl). Set FABRIC_AUTH_TOKEN=<secret> or pass --allow-loopback-no-auth to opt in.",
|
|
680
|
-
"cli.serve.error.port-in-use": "Port {port} in use - try --port {nextPort}",
|
|
737
|
+
// v2.0.0-rc.37 Wave A2 Part 2: cli.serve.* + FABRIC_AUTH_TOKEN keys removed
|
|
738
|
+
// alongside `fabric serve` quarantine to packages/server-http-experimental/
|
|
739
|
+
// per [[fabric-serve-quarantine-not-delete]]. Restore from git history when
|
|
740
|
+
// the web UI surface is re-enabled.
|
|
681
741
|
// v2.0.0-rc.29 TASK-008 (BUG-L2): onboard-coverage i18n keys.
|
|
682
742
|
"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.",
|
|
683
743
|
"cli.onboard-coverage.args.json.description": "Emit machine-readable JSON to stdout instead of the human table.",
|
|
@@ -1128,6 +1188,7 @@ var zhCNMessages = {
|
|
|
1128
1188
|
"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",
|
|
1129
1189
|
"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",
|
|
1130
1190
|
"doctor.check.agents_meta.message.stale": ".fabric/agents.meta.json revision {revision} \u4E0E .fabric/knowledge \u6D3E\u751F revision {computedRevision} \u4E0D\u4E00\u81F4\u3002",
|
|
1191
|
+
"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",
|
|
1131
1192
|
"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",
|
|
1132
1193
|
"doctor.check.agents_meta.ok": ".fabric/agents.meta.json revision {revision} \u5DF2\u4E0E .fabric/knowledge \u5BF9\u9F50\u3002",
|
|
1133
1194
|
"doctor.check.rule_content_refs.name": "Rule content refs",
|
|
@@ -1159,6 +1220,15 @@ var zhCNMessages = {
|
|
|
1159
1220
|
// 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 归档)。
|
|
1160
1221
|
"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",
|
|
1161
1222
|
"doctor.check.event_ledger.ok": ".fabric/events.jsonl \u5DF2\u5B58\u5728\uFF0C\u53EF\u5199\uFF0C\u4E14\u53EF\u89E3\u6790\u3002",
|
|
1223
|
+
// v2.0.0-rc.37 Wave B (B5): 复合 hard-gate 检查 events.jsonl/metrics.jsonl 健康
|
|
1224
|
+
// (G7 size / G8 metric_leak / G9 metrics_stale / G10 rotation_overdue)。
|
|
1225
|
+
"doctor.check.events_jsonl_health.name": "Events ledger \u5065\u5EB7 (rc.37 Plan B 5 hard gate)",
|
|
1226
|
+
"doctor.check.events_jsonl_health.ok": ".fabric/events.jsonl \u5927\u5C0F\u3001\u65B0\u9C9C\u5EA6\u3001metric \u9694\u79BB\u5168\u90E8\u6B63\u5E38\u3002",
|
|
1227
|
+
"doctor.check.events_jsonl_health.message.size": ".fabric/events.jsonl \u5DF2 {sizeMb} MB\uFF0C\u8D85\u8FC7 10 MB \u9608\u503C\u3002",
|
|
1228
|
+
"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",
|
|
1229
|
+
"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",
|
|
1230
|
+
"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",
|
|
1231
|
+
"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",
|
|
1162
1232
|
"doctor.check.mcp_config_in_wrong_file.name": "Claude MCP config \u4F4D\u7F6E",
|
|
1163
1233
|
"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",
|
|
1164
1234
|
"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",
|
|
@@ -1204,6 +1274,22 @@ var zhCNMessages = {
|
|
|
1204
1274
|
"doctor.check.draft_backlog.ok": "canonical knowledge entries \u4E2D draft \u5360\u6BD4\u6B63\u5E38 (< 50%, \u6216 workspace \u592A\u5C0F\u4E0D\u8BC4)\u3002",
|
|
1205
1275
|
"doctor.check.draft_backlog.message": "{draftCount}/{totalCount} ({pct}%) canonical knowledge entries \u5361\u5728 draft maturity \u2014 promote \u65AD\u6D41 (rc.32 baseline 92%)\u3002",
|
|
1206
1276
|
"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",
|
|
1277
|
+
// rc.37 NEW-38: knowledge auto-promote (info surface; --fix 执行).
|
|
1278
|
+
"doctor.check.draft_auto_promote.name": "Knowledge auto-promote",
|
|
1279
|
+
"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",
|
|
1280
|
+
"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",
|
|
1281
|
+
"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",
|
|
1282
|
+
"doctor.check.draft_auto_promote.fixed": "\u81EA\u52A8 promote {count} \u4E2A settled draft entries \u2192 verified\u3002",
|
|
1283
|
+
// rc.36 TASK-05 (P0-8): empty-tags ratio warn.
|
|
1284
|
+
"doctor.check.knowledge_tags_empty.name": "Knowledge tags coverage",
|
|
1285
|
+
"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",
|
|
1286
|
+
"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",
|
|
1287
|
+
"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",
|
|
1288
|
+
// rc.36 TASK-09 (P1-NEW1): drift_detected 未消化告警。
|
|
1289
|
+
"doctor.check.drift_unconsumed.name": "Knowledge drift unconsumed",
|
|
1290
|
+
"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",
|
|
1291
|
+
"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",
|
|
1292
|
+
"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",
|
|
1207
1293
|
"doctor.check.meta_manually_diverged.name": "Meta manual divergence",
|
|
1208
1294
|
"doctor.check.meta_manually_diverged.ok.unreadable": "agents.meta.json \u4E0D\u53EF\u8BFB\uFF0C\u8DF3\u8FC7 divergence \u68C0\u67E5\u3002",
|
|
1209
1295
|
"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",
|
|
@@ -1279,7 +1365,7 @@ var zhCNMessages = {
|
|
|
1279
1365
|
"doctor.check.narrow_no_paths.ok": "\u6CA1\u6709 narrow-scope canonical entries \u7684 relevance_paths array \u4E3A\u7A7A\u3002",
|
|
1280
1366
|
"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",
|
|
1281
1367
|
"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",
|
|
1282
|
-
"doctor.check.narrow_no_paths.remediation": "\u4E3A relevance_paths \u6DFB\u52A0 path anchors\uFF0C\u6216\u5C06
|
|
1368
|
+
"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",
|
|
1283
1369
|
"doctor.check.relevance_paths_dangling.name": "Knowledge relevance_paths dangling",
|
|
1284
1370
|
"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",
|
|
1285
1371
|
"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",
|
|
@@ -1291,6 +1377,16 @@ var zhCNMessages = {
|
|
|
1291
1377
|
"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",
|
|
1292
1378
|
"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",
|
|
1293
1379
|
"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",
|
|
1380
|
+
"doctor.check.personal_layer_path_misclassify.name": "Personal-layer path misclassify",
|
|
1381
|
+
"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",
|
|
1382
|
+
"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",
|
|
1383
|
+
"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",
|
|
1384
|
+
"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",
|
|
1385
|
+
"doctor.check.suspicious_kb.name": "Suspicious KB injection",
|
|
1386
|
+
"doctor.check.suspicious_kb.ok": "\u6240\u6709 canonical knowledge body \u5747\u672A\u547D\u4E2D\u5DF2\u77E5 prompt-injection \u6A21\u5F0F\u3002",
|
|
1387
|
+
"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",
|
|
1388
|
+
"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",
|
|
1389
|
+
"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",
|
|
1294
1390
|
"doctor.check.narrow_too_few.name": "Knowledge narrow too few",
|
|
1295
1391
|
"doctor.check.narrow_too_few.ok": "Narrow-with-paths ratio {ratioPct}%\uFF08{narrowCount}/{totalCount}\uFF09\uFF1B{teleNote}\u3002",
|
|
1296
1392
|
"doctor.check.narrow_too_few.message.telemetry_skipped": "telemetry skipped\uFF08no edit-counter fires in window\uFF09",
|
|
@@ -1325,6 +1421,20 @@ var zhCNMessages = {
|
|
|
1325
1421
|
"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",
|
|
1326
1422
|
"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",
|
|
1327
1423
|
"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",
|
|
1424
|
+
// v2.0.0-rc.37 NEW-20: hooks_runtime — shebang + Node.js syntax validity
|
|
1425
|
+
// of installed *.cjs hook files (one layer below hooks_wired).
|
|
1426
|
+
"doctor.check.hooks_runtime.name": "Hooks \u8FD0\u884C\u65F6\u5065\u5EB7",
|
|
1427
|
+
"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",
|
|
1428
|
+
"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",
|
|
1429
|
+
"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",
|
|
1430
|
+
"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",
|
|
1431
|
+
"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",
|
|
1432
|
+
// v2.0.0-rc.37 NEW-27: hooks_content_drift — cross-client sha256 parity.
|
|
1433
|
+
"doctor.check.hooks_content_drift.name": "Hooks \u8DE8\u5BA2\u6237\u7AEF\u5185\u5BB9\u4E00\u81F4\u6027",
|
|
1434
|
+
"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",
|
|
1435
|
+
"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",
|
|
1436
|
+
"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",
|
|
1437
|
+
"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",
|
|
1328
1438
|
// rc.31 BUG-G2/G5: promote-ledger invariant check.
|
|
1329
1439
|
"doctor.check.promote_ledger_invariant.name": "Promote ledger invariant",
|
|
1330
1440
|
"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",
|
|
@@ -1363,6 +1473,12 @@ var zhCNMessages = {
|
|
|
1363
1473
|
"doctor.archive-history.table.outcome": "\u7ED3\u679C",
|
|
1364
1474
|
"doctor.archive-history.table.candidates": "\u5019\u9009\u6570",
|
|
1365
1475
|
"doctor.archive-history.table.coveredGap": "\u8986\u76D6\u8DDD\u4ECA",
|
|
1476
|
+
// rc.37 NEW-33: 统一 --history <mode> 视图 (archive | fix | all)。
|
|
1477
|
+
"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",
|
|
1478
|
+
"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",
|
|
1479
|
+
"cli.doctor.errors.invalid-history-mode": "\u65E0\u6548\u7684 --history mode '{input}'\u3002\u53EF\u9009: archive | fix | all\u3002",
|
|
1480
|
+
"doctor.history.header": "Doctor \u5386\u53F2 (mode={mode}, \u8FD1 {sinceLabel}, \u5171 {days} \u5929)",
|
|
1481
|
+
"doctor.history.empty": "--since={sinceLabel} \u7A97\u53E3\u5185\u65E0 doctor \u6216 archive \u6D3B\u52A8 (mode={mode})\u3002",
|
|
1366
1482
|
"cli.hooks.description": "\u7BA1\u7406 Fabric Git \u94A9\u5B50\u6A21\u677F\u3002",
|
|
1367
1483
|
"cli.hooks.install.description": "\u5B89\u88C5 Fabric Husky pre-commit \u94A9\u5B50\u6A21\u677F\u3002",
|
|
1368
1484
|
"cli.hooks.install.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
|
|
@@ -1389,6 +1505,12 @@ var zhCNMessages = {
|
|
|
1389
1505
|
"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",
|
|
1390
1506
|
"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",
|
|
1391
1507
|
"cli.install.force-skills-only.summary": "Skill \u5237\u65B0\u5B8C\u6210 \u2014 \u5199\u5165: {written}, \u8DF3\u8FC7: {skipped}, \u9519\u8BEF: {errors}",
|
|
1508
|
+
// v2.0.0-rc.37 NEW-26: --force-hooks-only mirror of --force-skills-only。
|
|
1509
|
+
"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",
|
|
1510
|
+
"cli.install.force-hooks-only.banner": "\u53EA\u5237\u65B0 fabric hooks",
|
|
1511
|
+
"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",
|
|
1512
|
+
"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",
|
|
1513
|
+
"cli.install.force-hooks-only.summary": "Hooks \u5237\u65B0\u5B8C\u6210 \u2014 \u5199\u5165: {written}, \u8DF3\u8FC7: {skipped}, \u9519\u8BEF: {errors}",
|
|
1392
1514
|
"cli.install.mcp.install.global": "\u4F7F\u7528\u5168\u5C40\u5B89\u88C5\u7684 @fenglimg/fabric-server",
|
|
1393
1515
|
"cli.install.mcp.install.local": "\u5C06 @fenglimg/fabric-server \u5B89\u88C5\u5230\u9879\u76EE devDependencies",
|
|
1394
1516
|
"cli.install.mcp.local.installing": "\u6B63\u5728\u8FD0\u884C {manager} add -D @fenglimg/fabric-server...",
|
|
@@ -1446,6 +1568,10 @@ var zhCNMessages = {
|
|
|
1446
1568
|
"cli.install.wizard.invalid-select": "\u65E0\u6548\u8F93\u5165\u3002\u53EF\u9009\u503C\uFF1A{options}\u3002",
|
|
1447
1569
|
"cli.install.wizard.cancelled": "Fabric \u5B89\u88C5\u5DF2\u5728\u6267\u884C\u524D\u53D6\u6D88\u3002",
|
|
1448
1570
|
"cli.install.capabilities.title": "\u5BA2\u6237\u7AEF\u80FD\u529B\u6458\u8981",
|
|
1571
|
+
// v2.0.0-rc.37 NEW-22: post-install 重启提示。MCP server 在 client 启动
|
|
1572
|
+
// 时 spawn, 已运行的 Claude Code / Cursor / Codex session 不会自动加载
|
|
1573
|
+
// 新 mcp config — 必须重启才能拿到 Fabric tools。
|
|
1574
|
+
"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",
|
|
1449
1575
|
"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",
|
|
1450
1576
|
"cli.install.capabilities.header.client": "\u5BA2\u6237\u7AEF",
|
|
1451
1577
|
"cli.install.capabilities.header.bootstrap": "Bootstrap",
|
|
@@ -1556,17 +1682,10 @@ var zhCNMessages = {
|
|
|
1556
1682
|
"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",
|
|
1557
1683
|
"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",
|
|
1558
1684
|
"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",
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
"cli.serve.args.debug.description": "\u5C06\u76EE\u6807\u89E3\u6790\u7EC6\u8282\u8F93\u51FA\u5230 stderr\u3002",
|
|
1564
|
-
"cli.serve.args.allow-loopback-no-auth.description": "\u663E\u5F0F\u5141\u8BB8\u5728 loopback \u4E0A\u4EE5\u65E0\u9274\u6743\u65B9\u5F0F\u8FD0\u884C\uFF08\u9ED8\u8BA4 default-deny\uFF09\u3002\u4EC5\u5728\u53EF\u4FE1\u5355\u7528\u6237\u673A\u5668\u4E0A\u4F7F\u7528\u2014\u2014\u5426\u5219\u4EFB\u4F55\u672C\u673A\u8FDB\u7A0B\u90FD\u80FD\u8BFB\u53D6\u4F60\u7684\u77E5\u8BC6\u5E93\u8D26\u672C\u3002",
|
|
1565
|
-
"cli.serve.ready.title": "Fabric \u4EEA\u8868\u76D8",
|
|
1566
|
-
"cli.serve.lock-held.action-hint": "\u53E6\u4E00\u4E2A `fabric serve` \u8FDB\u7A0B (PID {pid}) \u6B63\u5360\u7528\u5DE5\u4F5C\u533A\u9501\u3002\u8BF7\u5148\u505C\u6B62\u5B83 (\u5728\u8BE5\u7EC8\u7AEF\u6309 Ctrl-C \u6216\u8FD0\u884C `kill {pid}`) \u518D\u6267\u884C\u6B64\u547D\u4EE4\u3002",
|
|
1567
|
-
"cli.serve.warning.host-fallback": "--host {host} \u9700\u8981\u8BBE\u7F6E FABRIC_AUTH_TOKEN \u624D\u80FD\u5BF9\u5916\u66B4\u9732\uFF1B\u5DF2\u56DE\u9000\u5230 127.0.0.1\u3002\u5982\u9700\u7ED1\u5B9A {host}\uFF0C\u8BF7\u8FD0\u884C\uFF1AFABRIC_AUTH_TOKEN=<token> fabric serve --host {host}",
|
|
1568
|
-
"cli.serve.warning.loopback-deny-default": "\u672A\u8BBE\u7F6E FABRIC_AUTH_TOKEN\uFF1A/api /events /mcp \u9ED8\u8BA4\u8FD4\u56DE 401\uFF08\u5426\u5219\u4EFB\u4F55\u672C\u673A\u8FDB\u7A0B\u90FD\u80FD\u8BFB\u53D6 .fabric/agents.meta.json + forensic.json + events.jsonl\uFF09\u3002\u8BF7\u8BBE\u7F6E FABRIC_AUTH_TOKEN=<secret>\uFF0C\u6216\u4F20\u5165 --allow-loopback-no-auth \u663E\u5F0F\u653E\u884C\u3002",
|
|
1569
|
-
"cli.serve.error.port-in-use": "\u7AEF\u53E3 {port} \u5DF2\u88AB\u5360\u7528\uFF0C\u53EF\u5C1D\u8BD5 --port {nextPort}",
|
|
1685
|
+
// v2.0.0-rc.37 Wave A2 Part 2: cli.serve.* + FABRIC_AUTH_TOKEN keys removed
|
|
1686
|
+
// alongside `fabric serve` quarantine to packages/server-http-experimental/
|
|
1687
|
+
// per [[fabric-serve-quarantine-not-delete]]. Restore from git history when
|
|
1688
|
+
// the web UI surface is re-enabled.
|
|
1570
1689
|
// v2.0.0-rc.29 TASK-008 (BUG-L2): onboard-coverage 国际化键。
|
|
1571
1690
|
"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",
|
|
1572
1691
|
"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",
|
package/dist/i18n/index.js
CHANGED
|
@@ -182,6 +182,7 @@ declare const fabricConfigSchema: z.ZodObject<{
|
|
|
182
182
|
fabric_event_retention_days: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<7>, z.ZodLiteral<30>, z.ZodLiteral<90>]>>;
|
|
183
183
|
onboard_slots_opted_out: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
|
|
184
184
|
hint_broad_top_k: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
185
|
+
hint_dismiss_signals: z.ZodOptional<z.ZodArray<z.ZodEnum<["archive", "review", "import", "maintenance"]>, "many">>;
|
|
185
186
|
hint_narrow_top_k: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
186
187
|
hint_narrow_dedup_window_turns: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
187
188
|
hint_broad_cooldown_hours: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
@@ -237,6 +238,7 @@ declare const fabricConfigSchema: z.ZodObject<{
|
|
|
237
238
|
hardBytes?: number | undefined;
|
|
238
239
|
} | undefined;
|
|
239
240
|
fabric_event_retention_days?: 7 | 30 | 90 | undefined;
|
|
241
|
+
hint_dismiss_signals?: ("archive" | "review" | "import" | "maintenance")[] | undefined;
|
|
240
242
|
orphan_demote_stable_days?: number | undefined;
|
|
241
243
|
orphan_demote_endorsed_days?: number | undefined;
|
|
242
244
|
orphan_demote_draft_days?: number | undefined;
|
|
@@ -280,6 +282,7 @@ declare const fabricConfigSchema: z.ZodObject<{
|
|
|
280
282
|
fabric_event_retention_days?: 7 | 30 | 90 | undefined;
|
|
281
283
|
onboard_slots_opted_out?: string[] | undefined;
|
|
282
284
|
hint_broad_top_k?: number | undefined;
|
|
285
|
+
hint_dismiss_signals?: ("archive" | "review" | "import" | "maintenance")[] | undefined;
|
|
283
286
|
hint_narrow_top_k?: number | undefined;
|
|
284
287
|
hint_narrow_dedup_window_turns?: number | undefined;
|
|
285
288
|
hint_broad_cooldown_hours?: number | undefined;
|