@fenglimg/fabric-shared 2.2.0-rc.1 → 2.2.0-rc.3
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-JEXTOQVV.js → chunk-355LUDLW.js} +92 -8
- package/dist/{chunk-TX2XZ7AW.js → chunk-AFT7DB4P.js} +6 -5
- package/dist/{chunk-7TZ2PMVH.js → chunk-QSD4PN4W.js} +67 -3
- package/dist/{chunk-3SZRB42B.js → chunk-VW5QGPIN.js} +4 -0
- package/dist/errors/index.d.ts +4 -1
- package/dist/errors/index.js +5 -3
- package/dist/i18n/index.js +1 -1
- package/dist/{index-J3Xn5h2J.d.ts → index-Dm4IJWwB.d.ts} +24 -3
- package/dist/index.d.ts +263 -4
- package/dist/index.js +205 -14
- package/dist/node/atomic-write.js +17 -2
- package/dist/node/mcp-payload-guard.js +1 -1
- package/dist/schemas/api-contracts.d.ts +140 -18
- package/dist/schemas/api-contracts.js +1 -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 +1 -1
|
@@ -220,6 +220,7 @@ declare const planContextOutputSchema: z.ZodObject<{
|
|
|
220
220
|
auto_healed: z.ZodOptional<z.ZodBoolean>;
|
|
221
221
|
previous_revision_hash: z.ZodOptional<z.ZodString>;
|
|
222
222
|
redirects: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
223
|
+
related_appended: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
223
224
|
}, "strip", z.ZodTypeAny, {
|
|
224
225
|
entries: {
|
|
225
226
|
path: string;
|
|
@@ -271,6 +272,7 @@ declare const planContextOutputSchema: z.ZodObject<{
|
|
|
271
272
|
auto_healed?: boolean | undefined;
|
|
272
273
|
previous_revision_hash?: string | undefined;
|
|
273
274
|
redirects?: Record<string, string> | undefined;
|
|
275
|
+
related_appended?: Record<string, string> | undefined;
|
|
274
276
|
}, {
|
|
275
277
|
entries: {
|
|
276
278
|
path: string;
|
|
@@ -322,6 +324,7 @@ declare const planContextOutputSchema: z.ZodObject<{
|
|
|
322
324
|
auto_healed?: boolean | undefined;
|
|
323
325
|
previous_revision_hash?: string | undefined;
|
|
324
326
|
redirects?: Record<string, string> | undefined;
|
|
327
|
+
related_appended?: Record<string, string> | undefined;
|
|
325
328
|
}>;
|
|
326
329
|
declare const planContextAnnotations: {
|
|
327
330
|
readonly readOnlyHint: true;
|
|
@@ -393,7 +396,7 @@ declare const planContextHintOutputSchema: z.ZodObject<{
|
|
|
393
396
|
declare const knowledgeSectionsInputSchema: z.ZodObject<{
|
|
394
397
|
selection_token: z.ZodString;
|
|
395
398
|
ai_selected_stable_ids: z.ZodArray<z.ZodString, "many">;
|
|
396
|
-
ai_selection_reasons: z.ZodRecord<z.ZodString, z.ZodString
|
|
399
|
+
ai_selection_reasons: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
|
|
397
400
|
correlation_id: z.ZodOptional<z.ZodString>;
|
|
398
401
|
session_id: z.ZodOptional<z.ZodString>;
|
|
399
402
|
client_hash: z.ZodOptional<z.ZodString>;
|
|
@@ -407,10 +410,10 @@ declare const knowledgeSectionsInputSchema: z.ZodObject<{
|
|
|
407
410
|
}, {
|
|
408
411
|
selection_token: string;
|
|
409
412
|
ai_selected_stable_ids: string[];
|
|
410
|
-
ai_selection_reasons: Record<string, string>;
|
|
411
413
|
client_hash?: string | undefined;
|
|
412
414
|
correlation_id?: string | undefined;
|
|
413
415
|
session_id?: string | undefined;
|
|
416
|
+
ai_selection_reasons?: Record<string, string> | undefined;
|
|
414
417
|
}>;
|
|
415
418
|
declare const knowledgeSectionsOutputSchema: z.ZodObject<{
|
|
416
419
|
revision_hash: z.ZodString;
|
|
@@ -432,17 +435,17 @@ declare const knowledgeSectionsOutputSchema: z.ZodObject<{
|
|
|
432
435
|
body: string;
|
|
433
436
|
}>, "many">;
|
|
434
437
|
diagnostics: z.ZodArray<z.ZodObject<{
|
|
435
|
-
code: z.
|
|
438
|
+
code: z.ZodEnum<["missing_knowledge_metadata", "unresolved_selected_id"]>;
|
|
436
439
|
severity: z.ZodLiteral<"warn">;
|
|
437
440
|
stable_id: z.ZodString;
|
|
438
441
|
message: z.ZodString;
|
|
439
442
|
}, "strip", z.ZodTypeAny, {
|
|
440
|
-
code: "missing_knowledge_metadata";
|
|
443
|
+
code: "missing_knowledge_metadata" | "unresolved_selected_id";
|
|
441
444
|
message: string;
|
|
442
445
|
stable_id: string;
|
|
443
446
|
severity: "warn";
|
|
444
447
|
}, {
|
|
445
|
-
code: "missing_knowledge_metadata";
|
|
448
|
+
code: "missing_knowledge_metadata" | "unresolved_selected_id";
|
|
446
449
|
message: string;
|
|
447
450
|
stable_id: string;
|
|
448
451
|
severity: "warn";
|
|
@@ -480,7 +483,7 @@ declare const knowledgeSectionsOutputSchema: z.ZodObject<{
|
|
|
480
483
|
body: string;
|
|
481
484
|
}[];
|
|
482
485
|
diagnostics: {
|
|
483
|
-
code: "missing_knowledge_metadata";
|
|
486
|
+
code: "missing_knowledge_metadata" | "unresolved_selected_id";
|
|
484
487
|
message: string;
|
|
485
488
|
stable_id: string;
|
|
486
489
|
severity: "warn";
|
|
@@ -504,7 +507,7 @@ declare const knowledgeSectionsOutputSchema: z.ZodObject<{
|
|
|
504
507
|
body: string;
|
|
505
508
|
}[];
|
|
506
509
|
diagnostics: {
|
|
507
|
-
code: "missing_knowledge_metadata";
|
|
510
|
+
code: "missing_knowledge_metadata" | "unresolved_selected_id";
|
|
508
511
|
message: string;
|
|
509
512
|
stable_id: string;
|
|
510
513
|
severity: "warn";
|
|
@@ -722,30 +725,43 @@ declare const recallOutputSchema: z.ZodObject<{
|
|
|
722
725
|
level: z.ZodEnum<["L0", "L1", "L2"]>;
|
|
723
726
|
path: z.ZodString;
|
|
724
727
|
body: z.ZodString;
|
|
728
|
+
store: z.ZodOptional<z.ZodObject<{
|
|
729
|
+
alias: z.ZodString;
|
|
730
|
+
}, "strip", z.ZodTypeAny, {
|
|
731
|
+
alias: string;
|
|
732
|
+
}, {
|
|
733
|
+
alias: string;
|
|
734
|
+
}>>;
|
|
725
735
|
}, "strip", z.ZodTypeAny, {
|
|
726
736
|
path: string;
|
|
727
737
|
stable_id: string;
|
|
728
738
|
level: "L0" | "L1" | "L2";
|
|
729
739
|
body: string;
|
|
740
|
+
store?: {
|
|
741
|
+
alias: string;
|
|
742
|
+
} | undefined;
|
|
730
743
|
}, {
|
|
731
744
|
path: string;
|
|
732
745
|
stable_id: string;
|
|
733
746
|
level: "L0" | "L1" | "L2";
|
|
734
747
|
body: string;
|
|
748
|
+
store?: {
|
|
749
|
+
alias: string;
|
|
750
|
+
} | undefined;
|
|
735
751
|
}>, "many">;
|
|
736
752
|
selected_stable_ids: z.ZodArray<z.ZodString, "many">;
|
|
737
753
|
diagnostics: z.ZodArray<z.ZodObject<{
|
|
738
|
-
code: z.
|
|
754
|
+
code: z.ZodEnum<["missing_knowledge_metadata", "unresolved_selected_id"]>;
|
|
739
755
|
severity: z.ZodLiteral<"warn">;
|
|
740
756
|
stable_id: z.ZodString;
|
|
741
757
|
message: z.ZodString;
|
|
742
758
|
}, "strip", z.ZodTypeAny, {
|
|
743
|
-
code: "missing_knowledge_metadata";
|
|
759
|
+
code: "missing_knowledge_metadata" | "unresolved_selected_id";
|
|
744
760
|
message: string;
|
|
745
761
|
stable_id: string;
|
|
746
762
|
severity: "warn";
|
|
747
763
|
}, {
|
|
748
|
-
code: "missing_knowledge_metadata";
|
|
764
|
+
code: "missing_knowledge_metadata" | "unresolved_selected_id";
|
|
749
765
|
message: string;
|
|
750
766
|
stable_id: string;
|
|
751
767
|
severity: "warn";
|
|
@@ -828,9 +844,12 @@ declare const recallOutputSchema: z.ZodObject<{
|
|
|
828
844
|
stable_id: string;
|
|
829
845
|
level: "L0" | "L1" | "L2";
|
|
830
846
|
body: string;
|
|
847
|
+
store?: {
|
|
848
|
+
alias: string;
|
|
849
|
+
} | undefined;
|
|
831
850
|
}[];
|
|
832
851
|
diagnostics: {
|
|
833
|
-
code: "missing_knowledge_metadata";
|
|
852
|
+
code: "missing_knowledge_metadata" | "unresolved_selected_id";
|
|
834
853
|
message: string;
|
|
835
854
|
stable_id: string;
|
|
836
855
|
severity: "warn";
|
|
@@ -898,9 +917,12 @@ declare const recallOutputSchema: z.ZodObject<{
|
|
|
898
917
|
stable_id: string;
|
|
899
918
|
level: "L0" | "L1" | "L2";
|
|
900
919
|
body: string;
|
|
920
|
+
store?: {
|
|
921
|
+
alias: string;
|
|
922
|
+
} | undefined;
|
|
901
923
|
}[];
|
|
902
924
|
diagnostics: {
|
|
903
|
-
code: "missing_knowledge_metadata";
|
|
925
|
+
code: "missing_knowledge_metadata" | "unresolved_selected_id";
|
|
904
926
|
message: string;
|
|
905
927
|
stable_id: string;
|
|
906
928
|
severity: "warn";
|
|
@@ -1020,7 +1042,7 @@ declare const ProposedReasonSchema: z.ZodEnum<["explicit-user-mark", "diagnostic
|
|
|
1020
1042
|
type ProposedReason = z.infer<typeof ProposedReasonSchema>;
|
|
1021
1043
|
declare const PROPOSED_REASON_DESCRIPTIONS: Record<ProposedReason, string>;
|
|
1022
1044
|
declare const FabExtractKnowledgeInputSchema: z.ZodEffects<z.ZodObject<{
|
|
1023
|
-
source_sessions: z.
|
|
1045
|
+
source_sessions: z.ZodArray<z.ZodString, "many">;
|
|
1024
1046
|
recent_paths: z.ZodArray<z.ZodString, "many">;
|
|
1025
1047
|
user_messages_summary: z.ZodString;
|
|
1026
1048
|
type: z.ZodEnum<["decisions", "pitfalls", "guidelines", "models", "processes"]>;
|
|
@@ -1039,6 +1061,7 @@ declare const FabExtractKnowledgeInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
1039
1061
|
evidence_paths: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
1040
1062
|
}, "strip", z.ZodTypeAny, {
|
|
1041
1063
|
type: "models" | "decisions" | "guidelines" | "pitfalls" | "processes";
|
|
1064
|
+
source_sessions: string[];
|
|
1042
1065
|
proposed_reason: "explicit-user-mark" | "diagnostic-then-fix" | "decision-confirmation" | "wrong-turn-revert" | "new-dependency-or-pattern" | "dismissal-with-reason";
|
|
1043
1066
|
session_context: string;
|
|
1044
1067
|
recent_paths: string[];
|
|
@@ -1046,7 +1069,6 @@ declare const FabExtractKnowledgeInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
1046
1069
|
slug: string;
|
|
1047
1070
|
relevance_scope?: "narrow" | "broad" | undefined;
|
|
1048
1071
|
relevance_paths?: string[] | undefined;
|
|
1049
|
-
source_sessions?: string[] | undefined;
|
|
1050
1072
|
layer?: "personal" | "team" | undefined;
|
|
1051
1073
|
intent_clues?: string[] | undefined;
|
|
1052
1074
|
tech_stack?: string[] | undefined;
|
|
@@ -1057,6 +1079,7 @@ declare const FabExtractKnowledgeInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
1057
1079
|
evidence_paths?: string[] | undefined;
|
|
1058
1080
|
}, {
|
|
1059
1081
|
type: "models" | "decisions" | "guidelines" | "pitfalls" | "processes";
|
|
1082
|
+
source_sessions: string[];
|
|
1060
1083
|
proposed_reason: "explicit-user-mark" | "diagnostic-then-fix" | "decision-confirmation" | "wrong-turn-revert" | "new-dependency-or-pattern" | "dismissal-with-reason";
|
|
1061
1084
|
session_context: string;
|
|
1062
1085
|
recent_paths: string[];
|
|
@@ -1064,7 +1087,6 @@ declare const FabExtractKnowledgeInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
1064
1087
|
slug: string;
|
|
1065
1088
|
relevance_scope?: "narrow" | "broad" | undefined;
|
|
1066
1089
|
relevance_paths?: string[] | undefined;
|
|
1067
|
-
source_sessions?: string[] | undefined;
|
|
1068
1090
|
layer?: "personal" | "team" | undefined;
|
|
1069
1091
|
intent_clues?: string[] | undefined;
|
|
1070
1092
|
tech_stack?: string[] | undefined;
|
|
@@ -1075,6 +1097,7 @@ declare const FabExtractKnowledgeInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
1075
1097
|
evidence_paths?: string[] | undefined;
|
|
1076
1098
|
}>, {
|
|
1077
1099
|
type: "models" | "decisions" | "guidelines" | "pitfalls" | "processes";
|
|
1100
|
+
source_sessions: string[];
|
|
1078
1101
|
proposed_reason: "explicit-user-mark" | "diagnostic-then-fix" | "decision-confirmation" | "wrong-turn-revert" | "new-dependency-or-pattern" | "dismissal-with-reason";
|
|
1079
1102
|
session_context: string;
|
|
1080
1103
|
recent_paths: string[];
|
|
@@ -1082,7 +1105,6 @@ declare const FabExtractKnowledgeInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
1082
1105
|
slug: string;
|
|
1083
1106
|
relevance_scope?: "narrow" | "broad" | undefined;
|
|
1084
1107
|
relevance_paths?: string[] | undefined;
|
|
1085
|
-
source_sessions?: string[] | undefined;
|
|
1086
1108
|
layer?: "personal" | "team" | undefined;
|
|
1087
1109
|
intent_clues?: string[] | undefined;
|
|
1088
1110
|
tech_stack?: string[] | undefined;
|
|
@@ -1093,6 +1115,7 @@ declare const FabExtractKnowledgeInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
1093
1115
|
evidence_paths?: string[] | undefined;
|
|
1094
1116
|
}, {
|
|
1095
1117
|
type: "models" | "decisions" | "guidelines" | "pitfalls" | "processes";
|
|
1118
|
+
source_sessions: string[];
|
|
1096
1119
|
proposed_reason: "explicit-user-mark" | "diagnostic-then-fix" | "decision-confirmation" | "wrong-turn-revert" | "new-dependency-or-pattern" | "dismissal-with-reason";
|
|
1097
1120
|
session_context: string;
|
|
1098
1121
|
recent_paths: string[];
|
|
@@ -1100,7 +1123,6 @@ declare const FabExtractKnowledgeInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
1100
1123
|
slug: string;
|
|
1101
1124
|
relevance_scope?: "narrow" | "broad" | undefined;
|
|
1102
1125
|
relevance_paths?: string[] | undefined;
|
|
1103
|
-
source_sessions?: string[] | undefined;
|
|
1104
1126
|
layer?: "personal" | "team" | undefined;
|
|
1105
1127
|
intent_clues?: string[] | undefined;
|
|
1106
1128
|
tech_stack?: string[] | undefined;
|
|
@@ -1111,7 +1133,7 @@ declare const FabExtractKnowledgeInputSchema: z.ZodEffects<z.ZodObject<{
|
|
|
1111
1133
|
evidence_paths?: string[] | undefined;
|
|
1112
1134
|
}>;
|
|
1113
1135
|
declare const FabExtractKnowledgeInputShape: {
|
|
1114
|
-
source_sessions: z.
|
|
1136
|
+
source_sessions: z.ZodArray<z.ZodString, "many">;
|
|
1115
1137
|
recent_paths: z.ZodArray<z.ZodString, "many">;
|
|
1116
1138
|
user_messages_summary: z.ZodString;
|
|
1117
1139
|
type: z.ZodEnum<["decisions", "pitfalls", "guidelines", "models", "processes"]>;
|
|
@@ -2108,6 +2130,42 @@ declare const citeCoverageReportSchema: z.ZodObject<{
|
|
|
2108
2130
|
compliant_cites: z.ZodOptional<z.ZodNumber>;
|
|
2109
2131
|
noncompliant_cites: z.ZodOptional<z.ZodNumber>;
|
|
2110
2132
|
uncorrelatable_edits: z.ZodOptional<z.ZodNumber>;
|
|
2133
|
+
recall_backed_edits: z.ZodOptional<z.ZodNumber>;
|
|
2134
|
+
recall_coverage_rate: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
2135
|
+
exposed_and_mutated: z.ZodOptional<z.ZodObject<{
|
|
2136
|
+
count: z.ZodNumber;
|
|
2137
|
+
ids: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
2138
|
+
}, "strip", z.ZodTypeAny, {
|
|
2139
|
+
count: number;
|
|
2140
|
+
ids?: string[] | undefined;
|
|
2141
|
+
}, {
|
|
2142
|
+
count: number;
|
|
2143
|
+
ids?: string[] | undefined;
|
|
2144
|
+
}>>;
|
|
2145
|
+
mutations_observed: z.ZodOptional<z.ZodObject<{
|
|
2146
|
+
count: z.ZodNumber;
|
|
2147
|
+
}, "strip", z.ZodTypeAny, {
|
|
2148
|
+
count: number;
|
|
2149
|
+
}, {
|
|
2150
|
+
count: number;
|
|
2151
|
+
}>>;
|
|
2152
|
+
mutation_pool: z.ZodOptional<z.ZodObject<{
|
|
2153
|
+
attributed: z.ZodNumber;
|
|
2154
|
+
unattributed_workspace_dirty: z.ZodNumber;
|
|
2155
|
+
}, "strip", z.ZodTypeAny, {
|
|
2156
|
+
attributed: number;
|
|
2157
|
+
unattributed_workspace_dirty: number;
|
|
2158
|
+
}, {
|
|
2159
|
+
attributed: number;
|
|
2160
|
+
unattributed_workspace_dirty: number;
|
|
2161
|
+
}>>;
|
|
2162
|
+
sessions_closed: z.ZodOptional<z.ZodObject<{
|
|
2163
|
+
count: z.ZodNumber;
|
|
2164
|
+
}, "strip", z.ZodTypeAny, {
|
|
2165
|
+
count: number;
|
|
2166
|
+
}, {
|
|
2167
|
+
count: number;
|
|
2168
|
+
}>>;
|
|
2111
2169
|
}, "strip", z.ZodTypeAny, {
|
|
2112
2170
|
edits_touched: number;
|
|
2113
2171
|
qualifying_cites: number;
|
|
@@ -2118,6 +2176,22 @@ declare const citeCoverageReportSchema: z.ZodObject<{
|
|
|
2118
2176
|
compliant_cites?: number | undefined;
|
|
2119
2177
|
noncompliant_cites?: number | undefined;
|
|
2120
2178
|
uncorrelatable_edits?: number | undefined;
|
|
2179
|
+
recall_backed_edits?: number | undefined;
|
|
2180
|
+
recall_coverage_rate?: number | null | undefined;
|
|
2181
|
+
exposed_and_mutated?: {
|
|
2182
|
+
count: number;
|
|
2183
|
+
ids?: string[] | undefined;
|
|
2184
|
+
} | undefined;
|
|
2185
|
+
mutations_observed?: {
|
|
2186
|
+
count: number;
|
|
2187
|
+
} | undefined;
|
|
2188
|
+
mutation_pool?: {
|
|
2189
|
+
attributed: number;
|
|
2190
|
+
unattributed_workspace_dirty: number;
|
|
2191
|
+
} | undefined;
|
|
2192
|
+
sessions_closed?: {
|
|
2193
|
+
count: number;
|
|
2194
|
+
} | undefined;
|
|
2121
2195
|
}, {
|
|
2122
2196
|
edits_touched: number;
|
|
2123
2197
|
qualifying_cites: number;
|
|
@@ -2128,6 +2202,22 @@ declare const citeCoverageReportSchema: z.ZodObject<{
|
|
|
2128
2202
|
compliant_cites?: number | undefined;
|
|
2129
2203
|
noncompliant_cites?: number | undefined;
|
|
2130
2204
|
uncorrelatable_edits?: number | undefined;
|
|
2205
|
+
recall_backed_edits?: number | undefined;
|
|
2206
|
+
recall_coverage_rate?: number | null | undefined;
|
|
2207
|
+
exposed_and_mutated?: {
|
|
2208
|
+
count: number;
|
|
2209
|
+
ids?: string[] | undefined;
|
|
2210
|
+
} | undefined;
|
|
2211
|
+
mutations_observed?: {
|
|
2212
|
+
count: number;
|
|
2213
|
+
} | undefined;
|
|
2214
|
+
mutation_pool?: {
|
|
2215
|
+
attributed: number;
|
|
2216
|
+
unattributed_workspace_dirty: number;
|
|
2217
|
+
} | undefined;
|
|
2218
|
+
sessions_closed?: {
|
|
2219
|
+
count: number;
|
|
2220
|
+
} | undefined;
|
|
2131
2221
|
}>;
|
|
2132
2222
|
per_client: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
2133
2223
|
edits_touched: z.ZodOptional<z.ZodNumber>;
|
|
@@ -2204,6 +2294,22 @@ declare const citeCoverageReportSchema: z.ZodObject<{
|
|
|
2204
2294
|
compliant_cites?: number | undefined;
|
|
2205
2295
|
noncompliant_cites?: number | undefined;
|
|
2206
2296
|
uncorrelatable_edits?: number | undefined;
|
|
2297
|
+
recall_backed_edits?: number | undefined;
|
|
2298
|
+
recall_coverage_rate?: number | null | undefined;
|
|
2299
|
+
exposed_and_mutated?: {
|
|
2300
|
+
count: number;
|
|
2301
|
+
ids?: string[] | undefined;
|
|
2302
|
+
} | undefined;
|
|
2303
|
+
mutations_observed?: {
|
|
2304
|
+
count: number;
|
|
2305
|
+
} | undefined;
|
|
2306
|
+
mutation_pool?: {
|
|
2307
|
+
attributed: number;
|
|
2308
|
+
unattributed_workspace_dirty: number;
|
|
2309
|
+
} | undefined;
|
|
2310
|
+
sessions_closed?: {
|
|
2311
|
+
count: number;
|
|
2312
|
+
} | undefined;
|
|
2207
2313
|
};
|
|
2208
2314
|
generated_at: string;
|
|
2209
2315
|
layer_filter?: "personal" | "team" | "all" | undefined;
|
|
@@ -2247,6 +2353,22 @@ declare const citeCoverageReportSchema: z.ZodObject<{
|
|
|
2247
2353
|
compliant_cites?: number | undefined;
|
|
2248
2354
|
noncompliant_cites?: number | undefined;
|
|
2249
2355
|
uncorrelatable_edits?: number | undefined;
|
|
2356
|
+
recall_backed_edits?: number | undefined;
|
|
2357
|
+
recall_coverage_rate?: number | null | undefined;
|
|
2358
|
+
exposed_and_mutated?: {
|
|
2359
|
+
count: number;
|
|
2360
|
+
ids?: string[] | undefined;
|
|
2361
|
+
} | undefined;
|
|
2362
|
+
mutations_observed?: {
|
|
2363
|
+
count: number;
|
|
2364
|
+
} | undefined;
|
|
2365
|
+
mutation_pool?: {
|
|
2366
|
+
attributed: number;
|
|
2367
|
+
unattributed_workspace_dirty: number;
|
|
2368
|
+
} | undefined;
|
|
2369
|
+
sessions_closed?: {
|
|
2370
|
+
count: number;
|
|
2371
|
+
} | undefined;
|
|
2250
2372
|
};
|
|
2251
2373
|
generated_at: string;
|
|
2252
2374
|
layer_filter?: "personal" | "team" | "all" | undefined;
|
|
@@ -51,6 +51,6 @@ declare const LEGACY_KB_REGEX: RegExp;
|
|
|
51
51
|
*
|
|
52
52
|
* Length guarantee: ≥ 800 bytes (rc.24: grew from ≥400 with cite-contract syntax).
|
|
53
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- **store \u524D\u7F00 (v2.1, \u591A store)**: \u5F53 read-set \u542B\u591A\u4E2A store \u4E14\u540C\u4E00 local id \u5728\u591A store \u95F4 shadow \u65F6,cite \u5FC5\u987B store-qualified: `KB: <store-alias>:<id> ...`(\u5982 `KB: team:KT-DEC-0001 (auth) [applied]`);alias \u7528\u6237\u81EA\u5B9A/canonical,\u5E95\u5C42 UUID\u3002\u5355 store \u6216\u65E0\u6B67\u4E49\u65F6\u88F8 `KB: <id>` \u4ECD valid\u3002personal-only \u6761\u76EE cite \u8FDB\u56E2\u961F\u4EA7\u7269=\u5F3A warning(\u63A5 P2 \u5199\u8DEF\u5F84\u9632\u6CC4\u6F0F R5#3)\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- **\u5B8C\u6574\u53C2\u8003\u4E0B\u6C89** (v2.2 SK5): contract operator / skip\u00B7dismissed \u8BCD\u5178 / \u7C7B\u578B\u8DEF\u7531 / \u7A3D\u6838\u53E3\u5F84 / **\u88C1\u51B3\u9636\u68AF** (AI\u81EA\u51B3 \u2192 \u591A-LLM \u542B\u96F6\u4E0A\u4E0B\u6587\u51B7\u8BC4 \u2192 \u975E\u963B\u585E\u961F\u5217) \u7684\u6743\u5A01\u8BE6\u53C2\u5728 `fabric-review` skill \u7684 `ref/cite-contract.md` \u2014\u2014 bootstrap \u53EA\u7559\u53EF\u6267\u884C core,\u6CBB\u7406\u7EC6\u8282\u5F52 ref \u4E0D\u518D\u6491\u5927 bootstrap\u3002\n";
|
|
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- **Skills (7)**:\u5199\u6D41\u7A0B `fabric-archive` / `fabric-review` / `fabric-import`;store \u6D41\u7A0B `fabric-store` / `fabric-sync` / `fabric-connect`;\u8BCA\u65AD `fabric-audit`\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\u4E00\u6279 Edit(\u9ED8\u8BA4 ~20 \u6B21, \u4E0E Stop hook \u9608\u503C config `archive_edit_threshold` \u4E00\u81F4)/ \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.1 \u2464 recall-based: \u81EA\u52A8\u8BB0\u8D26\u4F18\u5148, \u9996\u884C KB: \u53EF\u9009 override)\n\n- **\u6838\u5FC3 (recall-first \u81EA\u52A8\u8BB0\u8D26)**: \u6539\u4EFB\u4F55\u6587\u4EF6\u524D\u5148 `fab_recall(paths=[<\u88AB\u6539\u6587\u4EF6>])`\u3002\u7CFB\u7EDF\u6309\"\u672C session \u8FD1\u671F recall \u547D\u4E2D\u7684 path \u4E0E\u7F16\u8F91\u76EE\u6807\u91CD\u53E0\"\u81EA\u52A8\u628A\u53EC\u56DE\u7684 KB \u5173\u8054\u4E3A\u8BE5\u6B21 edit \u7684\u5F15\u7528 \u2014\u2014 **\u65E0\u9700\u624B\u5199\u56DE\u590D\u9996\u884C**\u3002PreToolUse hook \u5728\u68C0\u6D4B\u4E0D\u5230\u76F8\u5173 recall \u65F6\u7ED9\u4E00\u6761\u8F6F nudge(nudge \u975E gate,\u5B88 KT-DEC-0007);\u6539\u524D recall \u8FC7(\u6216\u5DF2\u624B\u5199 cite)\u5373\u9759\u9ED8\u3002\u4E3A\u4EC0\u4E48\u4E0D\u518D\u903C\u9996\u884C:\u5148\u60F3\u540E\u8BF4,recall \u624D\u662F\u5F15\u7528\u53D1\u751F\u7684\u771F\u5B9E\u4FE1\u53F7,\u624B\u5199\u9996\u884C\u8FDD\u80CC CoT \u4E14 `KB: none` \u9003\u9038\u4F7F\u65E7\u89C4\u5219\u5F62\u540C\u865A\u8BBE\u3002\n- **\u53EF\u9009 override (\u9996\u884C KB:)**: \u4ECD\u53EF\u5728\u56DE\u590D\u9996\u884C\u624B\u5199 `KB: <id> (<\u22648\u5B57 \u7528\u6CD5>) [applied|dismissed:<reason>]` \u6216 `KB: none [<reason>]` \u6765\u663E\u5F0F\u6807\u6CE8/\u7CBE\u786E\u5316\u5F15\u7528;cite-line \u89E3\u6790\u5668\u4FDD\u7559(\u5411\u540E\u517C\u5BB9),\u65E7\u4E60\u60EF\u4E0D\u7834\u3002\n- **`[applied]` \u9A8C\u8BC1\u4E49\u52A1**: \u5F15\u7528\u4EFB\u4F55 id(\u81EA\u52A8\u6216\u624B\u5199)\u7684\u524D\u63D0\u662F\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- **store \u524D\u7F00 (v2.1, \u591A store)**: \u5F53 read-set \u542B\u591A\u4E2A store \u4E14\u540C\u4E00 local id \u5728\u591A store \u95F4 shadow \u65F6,cite \u5FC5\u987B store-qualified: `KB: <store-alias>:<id> ...`(\u5982 `KB: team:KT-DEC-0001 (auth) [applied]`);alias \u7528\u6237\u81EA\u5B9A/canonical,\u5E95\u5C42 UUID\u3002\u5355 store \u6216\u65E0\u6B67\u4E49\u65F6\u88F8 `KB: <id>` \u4ECD valid\u3002personal-only \u6761\u76EE cite \u8FDB\u56E2\u961F\u4EA7\u7269=\u5F3A warning(\u63A5 P2 \u5199\u8DEF\u5F84\u9632\u6CC4\u6F0F R5#3)\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- **\u5B8C\u6574\u53C2\u8003\u4E0B\u6C89** (v2.2 SK5): contract operator / skip\u00B7dismissed \u8BCD\u5178 / \u7C7B\u578B\u8DEF\u7531 / \u7A3D\u6838\u53E3\u5F84 / **\u88C1\u51B3\u9636\u68AF** (AI\u81EA\u51B3 \u2192 \u591A-LLM \u542B\u96F6\u4E0A\u4E0B\u6587\u51B7\u8BC4 \u2192 \u975E\u963B\u585E\u961F\u5217) \u7684\u6743\u5A01\u8BE6\u53C2\u5728 `fabric-review` skill \u7684 `ref/cite-contract.md` \u2014\u2014 bootstrap \u53EA\u7559\u53EF\u6267\u884C core,\u6CBB\u7406\u7EC6\u8282\u5F52 ref \u4E0D\u518D\u6491\u5927 bootstrap\u3002\n";
|
|
55
55
|
|
|
56
56
|
export { BOOTSTRAP_CANONICAL, BOOTSTRAP_MARKER_BEGIN, BOOTSTRAP_MARKER_END, BOOTSTRAP_REGEX, LEGACY_KB_MARKER_BEGIN, LEGACY_KB_MARKER_END, LEGACY_KB_REGEX };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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-
|
|
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-Dm4IJWwB.js';
|
|
2
2
|
import 'zod';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fenglimg/fabric-shared",
|
|
3
|
-
"version": "2.2.0-rc.
|
|
3
|
+
"version": "2.2.0-rc.3",
|
|
4
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
5
|
"license": "MIT",
|
|
6
6
|
"author": "wangzhichao <fenglimg90@gmail.com>",
|