@fenglimg/fabric-shared 2.0.0-rc.8 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,9 @@ import {
3
3
  FabExtractKnowledgeInputShape,
4
4
  FabExtractKnowledgeOutputSchema,
5
5
  FabReviewInputSchema,
6
+ FabReviewInputShape,
6
7
  FabReviewOutputSchema,
8
+ FabReviewOutputShape,
7
9
  KNOWLEDGE_TYPE_CODES,
8
10
  KnowledgeEntryFrontmatterSchema,
9
11
  KnowledgeTypeSchema,
@@ -13,12 +15,15 @@ import {
13
15
  ProposedReasonSchema,
14
16
  StableIdSchema,
15
17
  annotateIntentRequestSchema,
18
+ archiveScanAnnotations,
19
+ archiveScanInputSchema,
20
+ archiveScanOutputSchema,
21
+ citeContractMetricsSchema,
22
+ citeCoverageReportSchema,
23
+ citeLayerTypeBreakdownSchema,
16
24
  fabExtractKnowledgeAnnotations,
17
25
  fabReviewAnnotations,
18
26
  formatKnowledgeId,
19
- getKnowledgeAnnotations,
20
- getKnowledgeInputSchema,
21
- getKnowledgeOutputSchema,
22
27
  historyStateQuerySchema,
23
28
  humanLockApproveRequestSchema,
24
29
  humanLockFileParamsSchema,
@@ -33,14 +38,19 @@ import {
33
38
  planContextHintOutputSchema,
34
39
  planContextInputSchema,
35
40
  planContextOutputSchema,
41
+ recallAnnotations,
42
+ recallInputSchema,
43
+ recallOutputSchema,
36
44
  structuredWarningSchema
37
- } from "../chunk-VQDCDCJA.js";
45
+ } from "../chunk-WVPDH4BF.js";
38
46
  export {
39
47
  FabExtractKnowledgeInputSchema,
40
48
  FabExtractKnowledgeInputShape,
41
49
  FabExtractKnowledgeOutputSchema,
42
50
  FabReviewInputSchema,
51
+ FabReviewInputShape,
43
52
  FabReviewOutputSchema,
53
+ FabReviewOutputShape,
44
54
  KNOWLEDGE_TYPE_CODES,
45
55
  KnowledgeEntryFrontmatterSchema,
46
56
  KnowledgeTypeSchema,
@@ -50,12 +60,15 @@ export {
50
60
  ProposedReasonSchema,
51
61
  StableIdSchema,
52
62
  annotateIntentRequestSchema,
63
+ archiveScanAnnotations,
64
+ archiveScanInputSchema,
65
+ archiveScanOutputSchema,
66
+ citeContractMetricsSchema,
67
+ citeCoverageReportSchema,
68
+ citeLayerTypeBreakdownSchema,
53
69
  fabExtractKnowledgeAnnotations,
54
70
  fabReviewAnnotations,
55
71
  formatKnowledgeId,
56
- getKnowledgeAnnotations,
57
- getKnowledgeInputSchema,
58
- getKnowledgeOutputSchema,
59
72
  historyStateQuerySchema,
60
73
  humanLockApproveRequestSchema,
61
74
  humanLockFileParamsSchema,
@@ -70,5 +83,8 @@ export {
70
83
  planContextHintOutputSchema,
71
84
  planContextInputSchema,
72
85
  planContextOutputSchema,
86
+ recallAnnotations,
87
+ recallInputSchema,
88
+ recallOutputSchema,
73
89
  structuredWarningSchema
74
90
  };
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Canonical Fabric bootstrap content + marker constants — single source of truth
3
+ * consumed by both `fabric install` (writer) and the server-side doctor (drift
4
+ * comparator). Mirrors the rc.18 banner-i18n shared-module pattern: shared
5
+ * constants in `packages/shared` so the cross-package boundary stays clean
6
+ * (server has zero dep on cli).
7
+ *
8
+ * rc.19 bootstrap-consolidation TASK-001: hoisted from per-writer ad-hoc
9
+ * strings. The canonical body is fixed for all projects — no interpolation —
10
+ * and intentionally zh-CN-hybrid per locked clarification 3.
11
+ *
12
+ * IMPORTANT: the {@link BOOTSTRAP_CANONICAL} body is byte-locked. Do not edit
13
+ * casually — downstream drift detection asserts byte-identical equality, and
14
+ * the published-package version becomes the contract between Fabric CLI and
15
+ * any Fabric server.
16
+ */
17
+ /**
18
+ * HTML-comment marker pair delimiting the managed Fabric bootstrap section.
19
+ * Both writer (idempotent in-place replace) and uninstall helper match these
20
+ * as plain substrings — keep byte-identical.
21
+ */
22
+ declare const BOOTSTRAP_MARKER_BEGIN = "<!-- fabric:bootstrap:begin -->";
23
+ declare const BOOTSTRAP_MARKER_END = "<!-- fabric:bootstrap:end -->";
24
+ /**
25
+ * Legacy marker pair from rc.12-rc.18 era (when the managed section was
26
+ * branded "Fabric Knowledge Base"). Retained here for one-time migration
27
+ * detection only: rc.19 install path scans for legacy markers, strips the
28
+ * legacy region, and rewrites with the new bootstrap markers.
29
+ */
30
+ declare const LEGACY_KB_MARKER_BEGIN = "<!-- fabric:knowledge-base:begin -->";
31
+ declare const LEGACY_KB_MARKER_END = "<!-- fabric:knowledge-base:end -->";
32
+ /**
33
+ * Regex matching the entire managed bootstrap section, markers inclusive,
34
+ * with an optional preceding blank-line separator (so re-install / uninstall
35
+ * don't leave orphan blank lines). Non-greedy body matches any content
36
+ * between the begin/end markers, including newlines. Mirrors the shape of
37
+ * the existing `FABRIC_SECTION_REGEX` in `packages/cli/src/install/skills-and-hooks.ts`.
38
+ */
39
+ declare const BOOTSTRAP_REGEX: RegExp;
40
+ /**
41
+ * Legacy-marker variant used for one-time migration detection during rc.19
42
+ * install — same shape as {@link BOOTSTRAP_REGEX} but targets the older
43
+ * `knowledge-base` marker pair.
44
+ */
45
+ declare const LEGACY_KB_REGEX: RegExp;
46
+ /**
47
+ * Canonical bootstrap body — byte-locked per rc.19 locked clarification 3.
48
+ * Rendered into the managed block between {@link BOOTSTRAP_MARKER_BEGIN} and
49
+ * {@link BOOTSTRAP_MARKER_END} by `fabric install` across all three supported
50
+ * clients (Claude Code, Cursor, Codex CLI).
51
+ *
52
+ * Length guarantee: ≥ 800 bytes (rc.24: grew from ≥400 with cite-contract syntax).
53
+ */
54
+ declare const BOOTSTRAP_CANONICAL = "# Fabric Bootstrap\n\n\u672C\u9879\u76EE\u4F7F\u7528 Fabric \u7BA1\u7406\u8DE8\u5BA2\u6237\u7AEF AI \u77E5\u8BC6\u4E0E\u884C\u4E3A\u89C4\u5219\u3002\u672C\u6587\u4EF6\u7531 `fabric install` \u540C\u6B65\u5230\u4E09\u7AEF managed block,**\u4E0D\u8981\u624B\u52A8\u7F16\u8F91\u4E09\u7AEF\u7684 block**,\u53EA\u6539\u8FD9\u91CC + \u91CD\u8DD1 `fabric install`\u3002\n\n## For Developers\n\n\u8FD9\u4E2A\u6587\u4EF6\u662F **AI \u5BA2\u6237\u7AEF\u7684\u7B56\u7565\u4E0E\u89C4\u7EA6\u914D\u7F6E**,\u4E0D\u662F dev onboarding\u3002\u4F60\u4E0D\u9700\u8981\u8BFB Self-archive / Cite / Phase 0.4 \u7B49\u7EC6\u8282\u3002\n\u4F5C\u4E3A dev \u4F60\u53EA\u9700\u8981:\u5728\u6BCF\u4E2A repo \u8DD1\u4E00\u6B21 `fabric install`,\u51FA\u95EE\u9898\u8DD1 `fabric doctor`,\u5728 `.fabric/knowledge/<type>/` \u4E0B\u5199 markdown\u3002\n**\u4E25\u7981\u624B\u52A8\u7F16\u8F91 `.fabric/agents.meta.json`** \u2014 \u6D3E\u751F\u72B6\u6001\u7531 engine \u91CD\u5EFA\u3002\n\n## 5 \u5206\u949F\u4E0A\u624B (Dev Quickstart)\n\n**Fabric \u662F\u4EC0\u4E48**:\u8DE8\u5BA2\u6237\u7AEF(Claude Code / Codex CLI / Cursor)\u7684 AI \u77E5\u8BC6\u5C42\u3002\u628A\u56E2\u961F/\u9879\u76EE\u7684 **decisions / pitfalls / guidelines / models / processes** \u5B58\u4E3A markdown,hook \u81EA\u52A8 surface \u7ED9 AI,\u8BA9 AI \u4E0D\u7528\u6BCF\u6B21\u91CD\u5B66\u3002\n\n**\u4F60\u8981\u505A\u7684 (DO)** vs **engine \u81EA\u52A8\u7684 (DON'T \u624B\u52A8)**:\n\n| \u4F60 DO | \u4F60 DON'T |\n| --- | --- |\n| \u6BCF\u4E2A repo \u8DD1\u4E00\u6B21 `fabric install` | \u624B\u7F16 `.fabric/agents.meta.json` |\n| \u5F02\u5E38\u65F6\u8DD1 `fabric doctor` (--fix \u81EA\u6108) | \u624B\u7F16 `.claude/hooks/` \u4E0B `.cjs` |\n| \u5728 `.fabric/knowledge/<type>/` \u4E0B\u5199 markdown | \u64CD\u5FC3 Phase 0.4 / E3 / cite policy |\n| `npm install -g @fenglimg/fabric-cli@latest` \u5347\u7EA7 | \u80CC 35 \u6761 doctor lint \u4EE3\u7801 |\n\n**4 \u6B65\u5FAA\u73AF**: `fabric install` (\u4E00\u6B21) \u2192 AI \u6B63\u5E38\u5DE5\u4F5C (hook on session start + edit) \u2192 AI \u63D0\u8BAE\u6761\u76EE\u5165 `.fabric/knowledge/pending/` \u2192 \u7528 `fabric-review` skill \u6216 `fabric doctor --fix` \u5BA1\u6838\u5F52\u6863\u3002\n\n**\u771F\u4F8B**:\u67D0 sprite \u9ED1\u8FB9 root cause \u662F `atlas.premultiplyAlpha` flag \u53CD\u5411 \u2014 \u5199\u8FDB `.fabric/knowledge/pitfalls/` \u540E,\u4E0B\u6B21\u540C\u7C7B\u95EE\u9898 AI \u81EA\u52A8 reference\u3002\n\n\u5B8C\u6574 maintainer \u7248\u89C1 `docs/USER-QUICKSTART.md`\u3002\n\n## \u884C\u4E3A\u89C4\u5219\n- **\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\u524D**:\u4F18\u5148\u5355\u6B65 `fab_recall(paths=[<\u88AB\u6539\u6587\u4EF6>])` \u2014\u2014 \u4E00\u6B21\u8C03\u7528\u76F4\u63A5\u62FF\u56DE\u6240\u6709\u76F8\u5173 KB \u6B63\u6587(rc.37+ \u9ED8\u8BA4\u8DEF\u5F84,\u7701\u6389\u624B\u52A8\u6311 id \u7684\u73AF\u8282)\u3002**\u4EC5\u5F53\u5355\u6B65\u62C9\u56DE\u7684\u6B63\u6587\u8FC7\u591A\u3001\u5BFC\u81F4\u4E0A\u4E0B\u6587\u8FC7\u8F7D\u9700\u7CBE\u786E\u88C1\u526A\u566A\u97F3\u65F6**\u624D\u8D70\u4E24\u6B65:\u5148 `fab_plan_context(paths=[...])` \u62FF `selection_token` + \u9876\u5C42 `candidates[]`(\u4ECE `candidates[].stable_id` \u6311),\u518D `fab_get_knowledge_sections({ selection_token, ai_selected_stable_ids: [<id>...] })` \u53D6\u6B63\u6587\u3002\n- **`.fabric/agents.meta.json` \u4E25\u7981\u624B\u52A8\u7F16\u8F91**;engine \u4F1A\u81EA\u52A8\u540C\u6B65\u6D3E\u751F\u72B6\u6001,\u663E\u5F0F reconcile \u8DD1 `fabric doctor --fix`\u3002\n\n## \u77E5\u8BC6\u5E93(KB)\n- **Discovery**:SessionStart hook \u5217 broad-scoped \u6761\u76EE(\u542B personal layer `KP-*` \u6761\u76EE,\u5F15\u7528\u65B9\u5F0F\u76F8\u540C);edit \u6587\u4EF6\u65F6 PreToolUse hook \u53EF\u80FD\u89E6\u53D1 narrow hint\u3002\n- **Usage**:\u5E38\u6001\u8D70\u5355\u6B65 `fab_recall(paths=[...])` \u4E00\u6B21\u62FF\u56DE\u76F8\u5173 KB \u6B63\u6587\u3002\u4EC5\u5F53\u5355\u6B65\u6B63\u6587\u8FC7\u591A\u81F4\u4E0A\u4E0B\u6587\u8FC7\u8F7D\u3001\u9700\u7CBE\u786E\u88C1\u526A\u566A\u97F3\u65F6\u624D\u4E24\u6B65:`fab_plan_context(paths=[...])` \u8FD4\u56DE `selection_token` + \u9876\u5C42 `candidates[]`,\u518D `fab_get_knowledge_sections({ selection_token, ai_selected_stable_ids: [<\u4ECE candidates[].stable_id \u6311>...] })` \u62C9\u5168\u6587;`selection_token` \u5FC5\u987B\u6765\u81EA\u6700\u8FD1\u4E00\u6B21 `fab_plan_context`,\u4E0D\u53EF\u51ED\u7A7A\u7F16\u9020\u3002\n- **session_id**: \u8C03\u7528 `fab_recall` / `fab_plan_context` \u65F6, \u52A1\u5FC5\u628A\u5F53\u524D client session id \u4F5C\u4E3A `session_id` \u53C2\u6570\u4F20\u5165(Claude Code \u7684 session id \u5728 stdin payload \u4E2D, Codex \u7684\u5BF9\u5E94 identifier \u540C\u7406)\u3002\u8FD9\u80FD\u8BA9 `fabric doctor --archive-history` \u4E0E archive-hint hook \u51C6\u786E\u8BC6\u522B\u8DE8\u4F1A\u8BDD debt \u72B6\u6001\u3002\n- **Write flows**:`fabric-archive` / `fabric-review` / `fabric-import` \u4E09\u4E2A Skills\u3002\n- **Language**:\u6E32\u67D3\u6309 `.fabric/fabric-config.json` \u7684 `fabric_language` \u5B57\u6BB5\u3002\n- **Archive cadence nudge** (rc.36): \u6BCF\u5B8C\u6210 5+ \u6B21 Edit / \u663E\u8457 decision \u540E,\u5728\u5408\u9002\u56DE\u5408\u4E3B\u52A8 propose \u8C03 `fabric-archive` skill \u2014 archive \u6CA1\u5EFA\u7ACB\u9891\u7387\u4F1A\u8BA9 KB \u6162\u901F\u6B7B\u6389\u3002\n- **Review backlog nudge** (rc.36): `.fabric/knowledge/pending/` \u7D2F\u79EF >10 \u6761\u65F6,\u5728\u5408\u9002\u56DE\u5408\u4E3B\u52A8 propose \u8C03 `fabric-review` skill \u6279\u91CF\u5BA1,\u907F\u514D draft \u5361\u6B7B\u3002\n\n## Self-archive policy (v2.0.0-rc.37 NEW-2: \u7B80\u5316 4 \u4FE1\u53F7 \u2192 2 \u5927\u7C7B)\n\n- **\u89E6\u53D1** (\u672C\u4F1A\u8BDD\u51FA\u73B0\u4EE5\u4E0B\u4EFB\u4E00\u4FE1\u53F7, \u5728\u8BE5 turn \u56DE\u590D\u672B\u5C3E\u81EA\u4E3B\u8C03\u7528 `fabric-archive` skill, \u8D70 AI \u81EA\u89E6\u53D1\u5165\u53E3 E3_ai_self_trigger):\n 1. **User-driven normative** \u2014 \u7528\u6237\u6D88\u606F\u4E2D\u663E\u5F0F\u8868\u8FBE normative \u610F\u56FE: `\u4EE5\u540E` / `always` / `never` / `from now on` / `\u4E0B\u6B21\u6CE8\u610F` / `\u8BB0\u4E00\u4E0B` / `\u6C38\u8FDC\u4E0D\u8981`, OR \u7528\u6237\u5728 \u22652 \u5019\u9009\u95F4\u6743\u8861\u540E\u7ED9\u51FA rationale \u9501\u5B9A\u65B9\u5411, OR \u7528\u6237\u62D2\u4E86\u67D0\u5EFA\u8BAE**\u5E76**\u8BF4\u4E86\u539F\u56E0 (\u62D2\u7EDD\u7406\u7531\u672C\u8EAB\u662F\u77E5\u8BC6)\n 2. **Wrong-turn-and-revert** \u2014 AI \u5C1D\u8BD5 path X, \u53CD\u601D\u540E\u6539\u8D70 path Y (\u5C24\u5176\u5F53 path X \u662F\u975E\u663E\u7136\u8E29\u5751); \u6DB5\u76D6\u6280\u672F\u51B3\u7B56\u53CD\u8F6C + \u5DE5\u5177/\u8303\u5F0F\u5207\u6362 + \u5931\u8D25\u91CD\u8BD5\u3002Anchor: \u4E00\u5B9A\u6709\"\u5426\u5B9A+\u66FF\u4EE3\"\u7684\u4E24\u6B65\u7ED3\u6784, \u4E0D\u662F\u5355\u7EAF\u63A2\u7D22\u5931\u8D25\n\n \u8001 4-state (Normative / Decision-confirmation / Explicit-dismissal / Wrong-turn) \u73B0\u5408\u5E76: \u524D 3 \u4E2A\u5168\u662F\"\u7528\u6237\u6D88\u606F\u4E2D\u663E\u5F0F\u8868\u8FBE\"\u6027\u8D28, \u6298\u6210 1 \u7C7B; \u7B2C 4 \u662F\"AI \u81EA\u5DF1\u7684\u53CD\u601D\u8DEF\u5F84\", \u72EC\u7ACB 1 \u7C7B\u3002\u4E24\u7C7B\u5404\u81EA\u7684\u672C\u8D28\u5224\u522B\u4E0D\u53D8, \u89E6\u53D1\u9762\u6CA1\u53D8\u7A84\u3002\n\n- **Anti-trigger** (\u660E\u786E\u4E0D\u89E6\u53D1):\n - \u7528\u6237\u7EAF\u8BE2\u95EE (\u65E0 normative \u8868\u8FBE)\n - \u7B80\u5355 refactor / typo fix\n - AI \u81EA\u5DF1\u4EA7\u751F\u7684'\u6D1E\u5BDF' (\u5FC5\u987B\u7531\u7528\u6237\u6D88\u606F\u4E2D\u4FE1\u53F7\u6216 AI \u81EA\u5DF1\u7684 wrong-turn \u89E6\u53D1, \u4E0D\u662F\u51ED\u7A7A\"\u6211\u5B66\u5230\u4E86\"\u6027\u8D28)\n\n- **Anti-loop \u4E09\u6761\u9632\u62A4**:\n - \u540C turn \u6700\u591A\u81EA\u8C03 1 \u6B21\n - \u540C session \u540C outcome \u4E0D\u91CD\u590D (\u82E5 user_dismissed, \u672C\u4F1A\u8BDD\u4E0D\u518D\u81EA\u8C03\u76F8\u540C\u4E3B\u9898)\n - Phase 2.5 viability gate \u515C\u5E95 (skill \u5185\u90E8\u4ECD\u8DD1 gate, AI \u5224\u9519\u4E0D\u4F1A\u4E71\u5199 pending)\n\n- **\u5448\u73B0\u6A21\u677F** (turn \u672B\u5C3E\u63D2\u5165, \u4E24\u884C: \u5148 marker \u884C\u4F9B Phase 1.5 \u68C0\u6D4B, \u518D user-facing \u63D0\u793A):\n ```\n self-archive policy triggered by signal: <User-driven normative|Wrong-turn-and-revert>\n \u987A\u624B\u5F52\u6863: \u6CE8\u610F\u5230\u4F60\u8BF4 `<\u89E6\u53D1\u77ED\u8BED>`, \u5DF2\u8C03\u7528 fabric-archive \u6293 N \u6761\u5019\u9009 \u2192 .fabric/knowledge/pending/...\n \u82E5\u4E0D\u8BE5\u8BB0, \u7B54 '\u64A4\u9500' \u6211\u4F1A\u8C03 fab_review reject\u3002\n ```\n \u7B2C\u4E00\u884C\u662F Phase 1.5 Trigger Gate \u8BC6\u522B E3 \u5165\u53E3\u7684 structured marker (verbatim \u5B57\u7B26\u4E32 `self-archive policy triggered by signal`, \u540E\u63A5\u5192\u53F7 + \u89E6\u53D1\u4FE1\u53F7\u540D)\u3002\u7B2C\u4E8C\u884C\u8D77\u662F\u7ED9\u7528\u6237\u770B\u7684\u4E2D\u6587\u63D0\u793A\u3002\u4E24\u884C\u90FD\u5FC5\u987B\u51FA\u73B0; \u7F3A marker \u884C Phase 1.5 \u65E0\u6CD5\u8DEF\u7531\u5230 E3_ai_self_trigger\u3002\n\n Backward compat: Phase 1.5 entry-point regex \u540C\u65F6\u8BC6\u522B\u8001 4 \u4E2A\u4FE1\u53F7\u540D (Normative / Wrong-turn-and-revert / Decision confirmation / Explicit dismissal) \u4E0E\u65B0 2 \u5927\u7C7B\u540D, \u65E7 session marker \u4ECD\u80FD\u6B63\u786E\u8DEF\u7531\u3002\n\n## Cite policy (v2.0.0-rc.37 NEW-1: \u7B80\u5316 4-state \u2192 2-state)\n\n- **\u89E6\u53D1**: \u505A edit / decide / propose plan \u4E4B\u524D,**\u56DE\u590D\u9996\u884C**\u5FC5\u987B\u5199 `KB: <id> (<\u22648\u5B57 \u7528\u6CD5>) [applied|dismissed:<reason>]` \u6216 `KB: none [<reason>]`\u3002\n- **`[applied]` \u9A8C\u8BC1\u4E49\u52A1**: \u5F15\u7528\u4EFB\u4F55 id \u524D\u5FC5\u987B\u5148\u7528 fab_recall (\u6216\u4E24\u6B65 fab_plan_context \u2192 fab_get_knowledge_sections) \u5B9E\u9645\u6293 KB body, \u9632\u6B62\u7F16\u9020 id\u3002\u9A8C\u8BC1\u4E0D\u901A\u8FC7 = \u4E0D\u80FD cite\u3002\n- **contract \u8BED\u6CD5**: decisions/pitfalls \u7C7B `[applied]` cite \u5C3E\u6BB5\u52A0 contract: `\u2192 <operator> [<operator> ...]`,operator \u2208 {`edit:<glob>` `!edit:<glob>` `require:<symbol>` `forbid:<symbol>` `skip:<reason>`}\u3002\u4F8B:`KB: K-001 (auth) [applied] \u2192 edit:src/auth/**/*.ts !edit:src/legacy/**`\u3002\n- **skip reason \u8BCD\u5178**: `sequencing | conditional | semantic | aesthetic | architectural | other:<text>`\u3002\n- **type \u8DEF\u7531**: models \u7C7B\u5F15\u7528\u4E3A reference cite,\u4E0D\u9700\u8981 contract;guidelines/processes \u7C7B\u6682\u4E0D\u5F3A\u5236,\u63A8\u540E LLM-judge\u3002\n- **\u7528\u6237\u53E3\u5934\u63D0\u89C4\u5219\u6CA1\u7ED9 id**: \u5148\u8C03 `fab_recall(paths)` \u6216 `fab_extract_knowledge` \u53CD\u67E5\u3002\n- **dismissed reason**: \u679A\u4E3E `scope-mismatch | outdated | not-applicable | other:<text>`\u3002\n- **`KB: none` sentinel**: \u679A\u4E3E\u4E24\u79CD\u5408\u89C4\u7406\u7531\u2014\u2014`[no-relevant]` \u5DF2\u8C03 `fab_recall` / `fab_plan_context`(\u6216 hook \u8F93\u51FA\u53EF\u89C1)\u4F46\u65E0\u53EF\u7528\u6761\u76EE;`[not-applicable]` \u5F53\u524D\u52A8\u4F5C\u4E0D\u5728 cite \u8303\u56F4(\u7EAF\u63A2\u7D22 / Bash \u53EA\u8BFB / \u7528\u6237\u95EE\u7B54)\u3002\u88F8 `KB: none`(\u65E0\u540E\u7F00)\u4ECD\u7136 valid,\u5F52\u7C7B\u4E3A `[unspecified]`(legacy \u517C\u5BB9,\u9F13\u52B1\u540E\u7EED\u8865\u6CE8)\u3002\n- **\u7A3D\u6838**: `fabric doctor --cite-coverage [--since=7d] [--client=cc|codex|all]` \u8F93\u51FA cite \u8986\u76D6\u7387,\u542B `KB: none` sentinel \u62C6\u5206\u3002\u672C\u89C4\u5219\u4E0D\u963B\u65AD\u4F60\u5DE5\u4F5C,\u53EA\u8BB0\u5F55\u3002\n- **Backward compat**: \u89E3\u6790\u5668\u540C\u65F6\u63A5\u53D7\u8001 4-state tags (`planned` / `recalled` / `chained-from <id>`) \u2014 \u90FD\u6620\u5C04\u5230 `[applied]` \u8BED\u4E49,gradually \u8FC1\u5230\u65B0\u7B80\u5316\u5F62\u6001\u5373\u53EF,\u65E7 session \u7559\u4E0B\u7684 cite \u4ECD\u7136\u8BA1\u5165 cite-coverage\u3002\n";
55
+
56
+ export { BOOTSTRAP_CANONICAL, BOOTSTRAP_MARKER_BEGIN, BOOTSTRAP_MARKER_END, BOOTSTRAP_REGEX, LEGACY_KB_MARKER_BEGIN, LEGACY_KB_MARKER_END, LEGACY_KB_REGEX };
@@ -0,0 +1,18 @@
1
+ import {
2
+ BOOTSTRAP_CANONICAL,
3
+ BOOTSTRAP_MARKER_BEGIN,
4
+ BOOTSTRAP_MARKER_END,
5
+ BOOTSTRAP_REGEX,
6
+ LEGACY_KB_MARKER_BEGIN,
7
+ LEGACY_KB_MARKER_END,
8
+ LEGACY_KB_REGEX
9
+ } from "../chunk-LTDB2UDN.js";
10
+ export {
11
+ BOOTSTRAP_CANONICAL,
12
+ BOOTSTRAP_MARKER_BEGIN,
13
+ BOOTSTRAP_MARKER_END,
14
+ BOOTSTRAP_REGEX,
15
+ LEGACY_KB_MARKER_BEGIN,
16
+ LEGACY_KB_MARKER_END,
17
+ LEGACY_KB_REGEX
18
+ };
@@ -1,123 +1,2 @@
1
- type AgentsLayer = "L0" | "L1" | "L2";
2
- type AgentsTopologyType = "mirror" | "cross-cutting" | "domain" | "local" | "global";
3
- type AgentsActivationTier = "always" | "path" | "description";
4
- type AgentsIdentitySource = "declared" | "derived";
5
- interface RuleDescription {
6
- summary: string;
7
- intent_clues: string[];
8
- tech_stack: string[];
9
- impact: string[];
10
- must_read_if: string;
11
- entities?: string[];
12
- id?: string;
13
- knowledge_type?: "model" | "decision" | "guideline" | "pitfall" | "process";
14
- maturity?: "draft" | "verified" | "proven";
15
- knowledge_layer?: "personal" | "team";
16
- layer_reason?: string;
17
- created_at?: string;
18
- tags?: string[];
19
- relevance_scope?: "narrow" | "broad";
20
- relevance_paths?: string[];
21
- }
22
- interface RuleDescriptionIndexItem {
23
- stable_id: string;
24
- level: AgentsLayer;
25
- required: boolean;
26
- selectable: boolean;
27
- description: RuleDescription;
28
- type?: "model" | "decision" | "guideline" | "pitfall" | "process";
29
- maturity?: "draft" | "verified" | "proven";
30
- layer?: "personal" | "team";
31
- layer_reason?: string;
32
- relevance_scope?: "narrow" | "broad";
33
- relevance_paths?: string[];
34
- }
35
- interface AgentsMetaNodeActivation {
36
- tier: AgentsActivationTier;
37
- description?: string;
38
- }
39
- interface AgentsMetaNode {
40
- file: string;
41
- content_ref?: string;
42
- scope_glob: string;
43
- hash: string;
44
- stable_id?: string;
45
- identity_source?: AgentsIdentitySource;
46
- activation?: AgentsMetaNodeActivation;
47
- description?: RuleDescription;
48
- sections?: string[];
49
- deps?: string[];
50
- priority?: "high" | "medium" | "low";
51
- level?: AgentsLayer;
52
- layer?: AgentsLayer;
53
- topology_type?: AgentsTopologyType;
54
- }
55
- interface AgentsMetaKnowledgeTypeCounters {
56
- MOD: number;
57
- DEC: number;
58
- GLD: number;
59
- PIT: number;
60
- PRO: number;
61
- }
62
- interface AgentsMetaCountersEnvelope {
63
- KP: AgentsMetaKnowledgeTypeCounters;
64
- KT: AgentsMetaKnowledgeTypeCounters;
65
- }
66
- interface AgentsMeta {
67
- revision: string;
68
- nodes: Record<string, AgentsMetaNode>;
69
- counters?: AgentsMetaCountersEnvelope;
70
- }
71
-
72
- interface AiLedgerEntry {
73
- id?: string;
74
- ts: number;
75
- source: "ai";
76
- commit_sha?: string;
77
- intent: string;
78
- affected_paths: string[];
79
- }
80
- interface HumanLedgerEntry {
81
- id?: string;
82
- ts: number;
83
- source: "human";
84
- parent_sha: string;
85
- parent_ledger_entry_id?: string;
86
- intent: string;
87
- affected_paths: string[];
88
- diff_stat: string;
89
- annotation?: string;
90
- }
91
- type LedgerEntry = AiLedgerEntry | HumanLedgerEntry;
92
- interface HumanLockEntry {
93
- file: string;
94
- start_line: number;
95
- end_line: number;
96
- hash: string;
97
- }
98
-
99
- interface ClientPaths {
100
- claudeCodeCLI?: string;
101
- claudeCodeDesktop?: string;
102
- cursor?: string;
103
- codexCLI?: string;
104
- }
105
- type AuditMode = "strict" | "warn" | "off";
106
- interface McpPayloadLimits {
107
- warnBytes?: number;
108
- hardBytes?: number;
109
- }
110
- type KnowledgeLanguage = "match-existing" | "zh-CN" | "en";
111
- type DefaultLayerFilter = "team" | "personal" | "both";
112
- interface FabricConfig {
113
- clientPaths?: ClientPaths;
114
- externalFixturePath?: string;
115
- scanIgnores?: string[];
116
- auditMode?: AuditMode;
117
- audit_mode?: AuditMode;
118
- mcpPayloadLimits?: McpPayloadLimits;
119
- knowledge_language?: KnowledgeLanguage;
120
- default_layer_filter?: DefaultLayerFilter;
121
- }
122
-
123
- export type { AgentsActivationTier, AgentsIdentitySource, AgentsLayer, AgentsMeta, AgentsMetaCountersEnvelope, AgentsMetaKnowledgeTypeCounters, AgentsMetaNode, AgentsMetaNodeActivation, AgentsTopologyType, AiLedgerEntry, AuditMode, ClientPaths, DefaultLayerFilter, FabricConfig, HumanLedgerEntry, HumanLockEntry, KnowledgeLanguage, LedgerEntry, McpPayloadLimits, RuleDescription, RuleDescriptionIndexItem };
1
+ export { e as AgentsActivationTier, a as AgentsIdentitySource, b as AgentsLayer, d as AgentsMeta, g as AgentsMetaCountersEnvelope, h as AgentsMetaKnowledgeTypeCounters, A as AgentsMetaNode, i as AgentsMetaNodeActivation, c as AgentsTopologyType, j as AiLedgerEntry, k as AuditMode, C as ClientPaths, D as DefaultLayerFilter, F as FabricConfig, l as FabricLanguage, m as HumanLedgerEntry, H as HumanLockEntry, L as LedgerEntry, M as McpPayloadLimits, R as RuleDescription, n as RuleDescriptionIndexItem } from '../index-UBqD9F0b.js';
2
+ import 'zod';
package/package.json CHANGED
@@ -1,6 +1,28 @@
1
1
  {
2
2
  "name": "@fenglimg/fabric-shared",
3
- "version": "2.0.0-rc.8",
3
+ "version": "2.0.1",
4
+ "description": "Fabric shared types — Zod schemas, i18n, atomic-write helpers, MCP payload guard, error classes. Consumed by @fenglimg/fabric-server + @fenglimg/fabric-cli.",
5
+ "license": "MIT",
6
+ "author": "wangzhichao <fenglimg90@gmail.com>",
7
+ "homepage": "https://github.com/fenglimg/fabric-v2#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/fenglimg/fabric-v2.git",
11
+ "directory": "packages/shared"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/fenglimg/fabric-v2/issues"
15
+ },
16
+ "keywords": [
17
+ "fabric",
18
+ "shared",
19
+ "zod-schemas",
20
+ "i18n",
21
+ "mcp"
22
+ ],
23
+ "engines": {
24
+ "node": ">=20.0.0"
25
+ },
4
26
  "type": "module",
5
27
  "main": "./dist/index.js",
6
28
  "types": "./dist/index.d.ts",
@@ -36,10 +58,16 @@
36
58
  "./schemas/api-contracts": {
37
59
  "types": "./dist/schemas/api-contracts.d.ts",
38
60
  "import": "./dist/schemas/api-contracts.js"
61
+ },
62
+ "./templates/bootstrap-canonical": {
63
+ "types": "./dist/templates/bootstrap-canonical.d.ts",
64
+ "import": "./dist/templates/bootstrap-canonical.js"
39
65
  }
40
66
  },
41
67
  "files": [
42
- "dist"
68
+ "dist",
69
+ "LICENSE",
70
+ "README.md"
43
71
  ],
44
72
  "dependencies": {
45
73
  "zod": "^3.25.0"
@@ -52,8 +80,8 @@
52
80
  "vitest": "^3.2.4"
53
81
  },
54
82
  "scripts": {
55
- "build": "tsup src/index.ts src/i18n/index.ts src/types/index.ts src/node.ts src/node/atomic-write.ts src/node/mcp-payload-guard.ts src/errors/index.ts src/schemas/api-contracts.ts --format esm --dts --clean",
56
- "dev": "tsup src/index.ts src/i18n/index.ts src/types/index.ts src/node.ts src/node/atomic-write.ts src/node/mcp-payload-guard.ts src/errors/index.ts src/schemas/api-contracts.ts --format esm --dts --watch",
83
+ "build": "tsup src/index.ts src/i18n/index.ts src/types/index.ts src/node.ts src/node/atomic-write.ts src/node/mcp-payload-guard.ts src/errors/index.ts src/schemas/api-contracts.ts src/templates/bootstrap-canonical.ts --format esm --dts --clean",
84
+ "dev": "tsup src/index.ts src/i18n/index.ts src/types/index.ts src/node.ts src/node/atomic-write.ts src/node/mcp-payload-guard.ts src/errors/index.ts src/schemas/api-contracts.ts src/templates/bootstrap-canonical.ts --format esm --dts --watch",
57
85
  "test": "vitest run",
58
86
  "test:coverage": "vitest run --coverage"
59
87
  }