@brandsystem/mcp 0.3.0
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/README.md +515 -0
- package/bin/brandsystem-mcp.mjs +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/brand-dir.d.ts +56 -0
- package/dist/lib/brand-dir.d.ts.map +1 -0
- package/dist/lib/brand-dir.js +270 -0
- package/dist/lib/brand-dir.js.map +1 -0
- package/dist/lib/color-namer.d.ts +28 -0
- package/dist/lib/color-namer.d.ts.map +1 -0
- package/dist/lib/color-namer.js +155 -0
- package/dist/lib/color-namer.js.map +1 -0
- package/dist/lib/confidence.d.ts +19 -0
- package/dist/lib/confidence.d.ts.map +1 -0
- package/dist/lib/confidence.js +66 -0
- package/dist/lib/confidence.js.map +1 -0
- package/dist/lib/content-scorer.d.ts +38 -0
- package/dist/lib/content-scorer.d.ts.map +1 -0
- package/dist/lib/content-scorer.js +571 -0
- package/dist/lib/content-scorer.js.map +1 -0
- package/dist/lib/css-parser.d.ts +45 -0
- package/dist/lib/css-parser.d.ts.map +1 -0
- package/dist/lib/css-parser.js +330 -0
- package/dist/lib/css-parser.js.map +1 -0
- package/dist/lib/dtcg-compiler.d.ts +7 -0
- package/dist/lib/dtcg-compiler.d.ts.map +1 -0
- package/dist/lib/dtcg-compiler.js +89 -0
- package/dist/lib/dtcg-compiler.js.map +1 -0
- package/dist/lib/interaction-policy-compiler.d.ts +40 -0
- package/dist/lib/interaction-policy-compiler.d.ts.map +1 -0
- package/dist/lib/interaction-policy-compiler.js +60 -0
- package/dist/lib/interaction-policy-compiler.js.map +1 -0
- package/dist/lib/logo-extractor.d.ts +49 -0
- package/dist/lib/logo-extractor.d.ts.map +1 -0
- package/dist/lib/logo-extractor.js +384 -0
- package/dist/lib/logo-extractor.js.map +1 -0
- package/dist/lib/report-html.d.ts +20 -0
- package/dist/lib/report-html.d.ts.map +1 -0
- package/dist/lib/report-html.js +938 -0
- package/dist/lib/report-html.js.map +1 -0
- package/dist/lib/response.d.ts +20 -0
- package/dist/lib/response.d.ts.map +1 -0
- package/dist/lib/response.js +54 -0
- package/dist/lib/response.js.map +1 -0
- package/dist/lib/runtime-compiler.d.ts +60 -0
- package/dist/lib/runtime-compiler.d.ts.map +1 -0
- package/dist/lib/runtime-compiler.js +96 -0
- package/dist/lib/runtime-compiler.js.map +1 -0
- package/dist/lib/svg-resolver.d.ts +21 -0
- package/dist/lib/svg-resolver.d.ts.map +1 -0
- package/dist/lib/svg-resolver.js +115 -0
- package/dist/lib/svg-resolver.js.map +1 -0
- package/dist/lib/url-validator.d.ts +11 -0
- package/dist/lib/url-validator.d.ts.map +1 -0
- package/dist/lib/url-validator.js +93 -0
- package/dist/lib/url-validator.js.map +1 -0
- package/dist/lib/version.d.ts +2 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +19 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/vim-generator.d.ts +13 -0
- package/dist/lib/vim-generator.d.ts.map +1 -0
- package/dist/lib/vim-generator.js +718 -0
- package/dist/lib/vim-generator.js.map +1 -0
- package/dist/resources/brand-resources.d.ts +4 -0
- package/dist/resources/brand-resources.d.ts.map +1 -0
- package/dist/resources/brand-resources.js +34 -0
- package/dist/resources/brand-resources.js.map +1 -0
- package/dist/schemas/brand-config.d.ts +28 -0
- package/dist/schemas/brand-config.d.ts.map +1 -0
- package/dist/schemas/brand-config.js +11 -0
- package/dist/schemas/brand-config.js.map +1 -0
- package/dist/schemas/brand-runtime.d.ts +251 -0
- package/dist/schemas/brand-runtime.d.ts.map +1 -0
- package/dist/schemas/brand-runtime.js +54 -0
- package/dist/schemas/brand-runtime.js.map +1 -0
- package/dist/schemas/core-identity.d.ts +302 -0
- package/dist/schemas/core-identity.d.ts.map +1 -0
- package/dist/schemas/core-identity.js +51 -0
- package/dist/schemas/core-identity.js.map +1 -0
- package/dist/schemas/index.d.ts +11 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +11 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/interaction-policy.d.ts +150 -0
- package/dist/schemas/interaction-policy.d.ts.map +1 -0
- package/dist/schemas/interaction-policy.js +34 -0
- package/dist/schemas/interaction-policy.js.map +1 -0
- package/dist/schemas/messaging.d.ts +776 -0
- package/dist/schemas/messaging.d.ts.map +1 -0
- package/dist/schemas/messaging.js +68 -0
- package/dist/schemas/messaging.js.map +1 -0
- package/dist/schemas/needs-clarification.d.ts +62 -0
- package/dist/schemas/needs-clarification.d.ts.map +1 -0
- package/dist/schemas/needs-clarification.js +13 -0
- package/dist/schemas/needs-clarification.js.map +1 -0
- package/dist/schemas/strategy.d.ts +537 -0
- package/dist/schemas/strategy.d.ts.map +1 -0
- package/dist/schemas/strategy.js +71 -0
- package/dist/schemas/strategy.js.map +1 -0
- package/dist/schemas/tokens.d.ts +35 -0
- package/dist/schemas/tokens.d.ts.map +1 -0
- package/dist/schemas/tokens.js +15 -0
- package/dist/schemas/tokens.js.map +1 -0
- package/dist/schemas/visual-identity.d.ts +224 -0
- package/dist/schemas/visual-identity.d.ts.map +1 -0
- package/dist/schemas/visual-identity.js +42 -0
- package/dist/schemas/visual-identity.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +75 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/brand-audit-content.d.ts +3 -0
- package/dist/tools/brand-audit-content.d.ts.map +1 -0
- package/dist/tools/brand-audit-content.js +116 -0
- package/dist/tools/brand-audit-content.js.map +1 -0
- package/dist/tools/brand-audit-drift.d.ts +3 -0
- package/dist/tools/brand-audit-drift.d.ts.map +1 -0
- package/dist/tools/brand-audit-drift.js +301 -0
- package/dist/tools/brand-audit-drift.js.map +1 -0
- package/dist/tools/brand-audit.d.ts +3 -0
- package/dist/tools/brand-audit.d.ts.map +1 -0
- package/dist/tools/brand-audit.js +129 -0
- package/dist/tools/brand-audit.js.map +1 -0
- package/dist/tools/brand-build-journey.d.ts +3 -0
- package/dist/tools/brand-build-journey.d.ts.map +1 -0
- package/dist/tools/brand-build-journey.js +312 -0
- package/dist/tools/brand-build-journey.js.map +1 -0
- package/dist/tools/brand-build-matrix.d.ts +3 -0
- package/dist/tools/brand-build-matrix.d.ts.map +1 -0
- package/dist/tools/brand-build-matrix.js +525 -0
- package/dist/tools/brand-build-matrix.js.map +1 -0
- package/dist/tools/brand-build-personas.d.ts +3 -0
- package/dist/tools/brand-build-personas.d.ts.map +1 -0
- package/dist/tools/brand-build-personas.js +436 -0
- package/dist/tools/brand-build-personas.js.map +1 -0
- package/dist/tools/brand-build-themes.d.ts +3 -0
- package/dist/tools/brand-build-themes.d.ts.map +1 -0
- package/dist/tools/brand-build-themes.js +476 -0
- package/dist/tools/brand-build-themes.js.map +1 -0
- package/dist/tools/brand-check-compliance.d.ts +3 -0
- package/dist/tools/brand-check-compliance.d.ts.map +1 -0
- package/dist/tools/brand-check-compliance.js +243 -0
- package/dist/tools/brand-check-compliance.js.map +1 -0
- package/dist/tools/brand-clarify.d.ts +21 -0
- package/dist/tools/brand-clarify.d.ts.map +1 -0
- package/dist/tools/brand-clarify.js +497 -0
- package/dist/tools/brand-clarify.js.map +1 -0
- package/dist/tools/brand-compile-messaging.d.ts +3 -0
- package/dist/tools/brand-compile-messaging.d.ts.map +1 -0
- package/dist/tools/brand-compile-messaging.js +759 -0
- package/dist/tools/brand-compile-messaging.js.map +1 -0
- package/dist/tools/brand-compile.d.ts +3 -0
- package/dist/tools/brand-compile.d.ts.map +1 -0
- package/dist/tools/brand-compile.js +182 -0
- package/dist/tools/brand-compile.js.map +1 -0
- package/dist/tools/brand-deepen-identity.d.ts +3 -0
- package/dist/tools/brand-deepen-identity.d.ts.map +1 -0
- package/dist/tools/brand-deepen-identity.js +483 -0
- package/dist/tools/brand-deepen-identity.js.map +1 -0
- package/dist/tools/brand-export.d.ts +17 -0
- package/dist/tools/brand-export.d.ts.map +1 -0
- package/dist/tools/brand-export.js +730 -0
- package/dist/tools/brand-export.js.map +1 -0
- package/dist/tools/brand-extract-figma.d.ts +3 -0
- package/dist/tools/brand-extract-figma.d.ts.map +1 -0
- package/dist/tools/brand-extract-figma.js +174 -0
- package/dist/tools/brand-extract-figma.js.map +1 -0
- package/dist/tools/brand-extract-messaging.d.ts +3 -0
- package/dist/tools/brand-extract-messaging.d.ts.map +1 -0
- package/dist/tools/brand-extract-messaging.js +620 -0
- package/dist/tools/brand-extract-messaging.js.map +1 -0
- package/dist/tools/brand-extract-web.d.ts +3 -0
- package/dist/tools/brand-extract-web.d.ts.map +1 -0
- package/dist/tools/brand-extract-web.js +477 -0
- package/dist/tools/brand-extract-web.js.map +1 -0
- package/dist/tools/brand-feedback.d.ts +3 -0
- package/dist/tools/brand-feedback.d.ts.map +1 -0
- package/dist/tools/brand-feedback.js +366 -0
- package/dist/tools/brand-feedback.js.map +1 -0
- package/dist/tools/brand-ingest-assets.d.ts +3 -0
- package/dist/tools/brand-ingest-assets.d.ts.map +1 -0
- package/dist/tools/brand-ingest-assets.js +233 -0
- package/dist/tools/brand-ingest-assets.js.map +1 -0
- package/dist/tools/brand-init.d.ts +3 -0
- package/dist/tools/brand-init.d.ts.map +1 -0
- package/dist/tools/brand-init.js +66 -0
- package/dist/tools/brand-init.js.map +1 -0
- package/dist/tools/brand-preflight.d.ts +3 -0
- package/dist/tools/brand-preflight.d.ts.map +1 -0
- package/dist/tools/brand-preflight.js +608 -0
- package/dist/tools/brand-preflight.js.map +1 -0
- package/dist/tools/brand-report.d.ts +3 -0
- package/dist/tools/brand-report.d.ts.map +1 -0
- package/dist/tools/brand-report.js +154 -0
- package/dist/tools/brand-report.js.map +1 -0
- package/dist/tools/brand-runtime.d.ts +3 -0
- package/dist/tools/brand-runtime.d.ts.map +1 -0
- package/dist/tools/brand-runtime.js +37 -0
- package/dist/tools/brand-runtime.js.map +1 -0
- package/dist/tools/brand-set-logo.d.ts +3 -0
- package/dist/tools/brand-set-logo.d.ts.map +1 -0
- package/dist/tools/brand-set-logo.js +170 -0
- package/dist/tools/brand-set-logo.js.map +1 -0
- package/dist/tools/brand-start.d.ts +3 -0
- package/dist/tools/brand-start.d.ts.map +1 -0
- package/dist/tools/brand-start.js +686 -0
- package/dist/tools/brand-start.js.map +1 -0
- package/dist/tools/brand-status.d.ts +3 -0
- package/dist/tools/brand-status.d.ts.map +1 -0
- package/dist/tools/brand-status.js +175 -0
- package/dist/tools/brand-status.js.map +1 -0
- package/dist/tools/brand-write.d.ts +3 -0
- package/dist/tools/brand-write.d.ts.map +1 -0
- package/dist/tools/brand-write.js +442 -0
- package/dist/tools/brand-write.js.map +1 -0
- package/dist/types/index.d.ts +331 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +52 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir, access, readdir, stat } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { stringify, parse } from "yaml";
|
|
4
|
+
import { SCHEMA_VERSION, BrandConfigSchema, CoreIdentitySchema, NeedsClarificationSchema, VisualIdentitySchema, MessagingSchema, ContentStrategySchema, TokensFileSchema, BrandRuntimeSchema, InteractionPolicySchema } from "../schemas/index.js";
|
|
5
|
+
export class BrandDir {
|
|
6
|
+
root;
|
|
7
|
+
brandPath;
|
|
8
|
+
locks = new Map();
|
|
9
|
+
constructor(cwd) {
|
|
10
|
+
this.root = cwd;
|
|
11
|
+
this.brandPath = join(cwd, ".brand");
|
|
12
|
+
}
|
|
13
|
+
async withLock(filename, fn) {
|
|
14
|
+
const prev = this.locks.get(filename) ?? Promise.resolve();
|
|
15
|
+
let resolve;
|
|
16
|
+
const next = new Promise((r) => { resolve = r; });
|
|
17
|
+
this.locks.set(filename, next);
|
|
18
|
+
await prev;
|
|
19
|
+
try {
|
|
20
|
+
return await fn();
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
resolve();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
path(...segments) {
|
|
27
|
+
const full = join(this.brandPath, ...segments);
|
|
28
|
+
const resolved = resolve(full);
|
|
29
|
+
if (!resolved.startsWith(resolve(this.brandPath))) {
|
|
30
|
+
throw new Error(`Path traversal blocked: ${segments.join("/")}`);
|
|
31
|
+
}
|
|
32
|
+
return full;
|
|
33
|
+
}
|
|
34
|
+
async exists() {
|
|
35
|
+
try {
|
|
36
|
+
await access(this.brandPath);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async scaffold() {
|
|
44
|
+
await mkdir(this.brandPath, { recursive: true });
|
|
45
|
+
await mkdir(this.path("assets", "logo"), { recursive: true });
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Scaffold + write initial config and empty core identity in one call.
|
|
49
|
+
* Shared by brand_start and brand_init to avoid duplicated init logic.
|
|
50
|
+
*/
|
|
51
|
+
async initBrand(config) {
|
|
52
|
+
await this.scaffold();
|
|
53
|
+
await this.writeConfig(config);
|
|
54
|
+
await this.writeCoreIdentity({
|
|
55
|
+
schema_version: SCHEMA_VERSION,
|
|
56
|
+
colors: [],
|
|
57
|
+
typography: [],
|
|
58
|
+
logo: [],
|
|
59
|
+
spacing: null,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
// --- YAML helpers ---
|
|
63
|
+
async readYaml(filename) {
|
|
64
|
+
const content = await readFile(this.path(filename), "utf-8");
|
|
65
|
+
return parse(content);
|
|
66
|
+
}
|
|
67
|
+
async writeYaml(filename, data) {
|
|
68
|
+
await this.withLock(filename, async () => {
|
|
69
|
+
const content = stringify(data, { lineWidth: 120 });
|
|
70
|
+
await writeFile(this.path(filename), content, "utf-8");
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// --- JSON helpers ---
|
|
74
|
+
async readJson(filename) {
|
|
75
|
+
const content = await readFile(this.path(filename), "utf-8");
|
|
76
|
+
return JSON.parse(content);
|
|
77
|
+
}
|
|
78
|
+
async writeJson(filename, data) {
|
|
79
|
+
await this.withLock(filename, async () => {
|
|
80
|
+
const content = JSON.stringify(data, null, 2);
|
|
81
|
+
await writeFile(this.path(filename), content, "utf-8");
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// --- Config ---
|
|
85
|
+
async readConfig() {
|
|
86
|
+
const raw = await this.readYaml("brand.config.yaml");
|
|
87
|
+
return BrandConfigSchema.parse(raw);
|
|
88
|
+
}
|
|
89
|
+
async writeConfig(data) {
|
|
90
|
+
await this.writeYaml("brand.config.yaml", data);
|
|
91
|
+
}
|
|
92
|
+
// --- Core Identity ---
|
|
93
|
+
async readCoreIdentity() {
|
|
94
|
+
const raw = await this.readYaml("core-identity.yaml");
|
|
95
|
+
return CoreIdentitySchema.parse(raw);
|
|
96
|
+
}
|
|
97
|
+
async writeCoreIdentity(data) {
|
|
98
|
+
await this.writeYaml("core-identity.yaml", data);
|
|
99
|
+
}
|
|
100
|
+
// --- Tokens ---
|
|
101
|
+
async readTokens() {
|
|
102
|
+
const raw = await this.readJson("tokens.json");
|
|
103
|
+
return TokensFileSchema.parse(raw);
|
|
104
|
+
}
|
|
105
|
+
async writeTokens(data) {
|
|
106
|
+
await this.writeJson("tokens.json", data);
|
|
107
|
+
}
|
|
108
|
+
// --- Needs Clarification ---
|
|
109
|
+
async readClarifications() {
|
|
110
|
+
const raw = await this.readYaml("needs-clarification.yaml");
|
|
111
|
+
return NeedsClarificationSchema.parse(raw);
|
|
112
|
+
}
|
|
113
|
+
async writeClarifications(data) {
|
|
114
|
+
await this.writeYaml("needs-clarification.yaml", data);
|
|
115
|
+
}
|
|
116
|
+
// --- Visual Identity (Session 2) ---
|
|
117
|
+
async readVisualIdentity() {
|
|
118
|
+
const raw = await this.readYaml("visual-identity.yaml");
|
|
119
|
+
return VisualIdentitySchema.parse(raw);
|
|
120
|
+
}
|
|
121
|
+
async writeVisualIdentity(data) {
|
|
122
|
+
await this.writeYaml("visual-identity.yaml", data);
|
|
123
|
+
}
|
|
124
|
+
async hasVisualIdentity() {
|
|
125
|
+
try {
|
|
126
|
+
await access(this.path("visual-identity.yaml"));
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async writeMarkdown(filename, content) {
|
|
134
|
+
await this.withLock(filename, async () => {
|
|
135
|
+
await writeFile(this.path(filename), content, "utf-8");
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async readMarkdown(filename) {
|
|
139
|
+
return readFile(this.path(filename), "utf-8");
|
|
140
|
+
}
|
|
141
|
+
// --- Messaging (Session 3) ---
|
|
142
|
+
async readMessaging() {
|
|
143
|
+
const raw = await this.readYaml("messaging.yaml");
|
|
144
|
+
return MessagingSchema.parse(raw);
|
|
145
|
+
}
|
|
146
|
+
async writeMessaging(data) {
|
|
147
|
+
await this.writeYaml("messaging.yaml", data);
|
|
148
|
+
}
|
|
149
|
+
async hasMessaging() {
|
|
150
|
+
try {
|
|
151
|
+
await access(this.path("messaging.yaml"));
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// --- Content Strategy (Session 4) ---
|
|
159
|
+
async readStrategy() {
|
|
160
|
+
const raw = await this.readYaml("strategy.yaml");
|
|
161
|
+
return ContentStrategySchema.parse(raw);
|
|
162
|
+
}
|
|
163
|
+
async writeStrategy(data) {
|
|
164
|
+
await this.writeYaml("strategy.yaml", data);
|
|
165
|
+
}
|
|
166
|
+
async hasStrategy() {
|
|
167
|
+
try {
|
|
168
|
+
await access(this.path("strategy.yaml"));
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// --- Runtime + Policy ---
|
|
176
|
+
async readRuntime() {
|
|
177
|
+
const raw = await this.readJson("brand-runtime.json");
|
|
178
|
+
return BrandRuntimeSchema.parse(raw);
|
|
179
|
+
}
|
|
180
|
+
async writeRuntime(data) {
|
|
181
|
+
await this.writeJson("brand-runtime.json", data);
|
|
182
|
+
}
|
|
183
|
+
async readPolicy() {
|
|
184
|
+
const raw = await this.readJson("interaction-policy.json");
|
|
185
|
+
return InteractionPolicySchema.parse(raw);
|
|
186
|
+
}
|
|
187
|
+
async writePolicy(data) {
|
|
188
|
+
await this.writeJson("interaction-policy.json", data);
|
|
189
|
+
}
|
|
190
|
+
async hasRuntime() {
|
|
191
|
+
try {
|
|
192
|
+
await access(this.path("brand-runtime.json"));
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// --- Asset scanning ---
|
|
200
|
+
async listAssets(subdir) {
|
|
201
|
+
const dir = this.path("assets", subdir);
|
|
202
|
+
try {
|
|
203
|
+
const entries = await readdir(dir);
|
|
204
|
+
return entries.filter((e) => !e.startsWith(".") && !e.endsWith(".md") && e !== "MANIFEST.yaml");
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return [];
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async listAssetDirs() {
|
|
211
|
+
const assetsDir = this.path("assets");
|
|
212
|
+
try {
|
|
213
|
+
const entries = await readdir(assetsDir);
|
|
214
|
+
const dirs = [];
|
|
215
|
+
for (const entry of entries) {
|
|
216
|
+
const s = await stat(join(assetsDir, entry));
|
|
217
|
+
if (s.isDirectory())
|
|
218
|
+
dirs.push(entry);
|
|
219
|
+
}
|
|
220
|
+
return dirs;
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return [];
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// --- Assets ---
|
|
227
|
+
async writeAsset(relativePath, content) {
|
|
228
|
+
const MAX_ASSET_BYTES = 10 * 1024 * 1024; // 10 MB
|
|
229
|
+
const size = typeof content === "string" ? Buffer.byteLength(content, "utf-8") : content.length;
|
|
230
|
+
if (size > MAX_ASSET_BYTES) {
|
|
231
|
+
throw new Error(`Asset "${relativePath}" is ${(size / 1024 / 1024).toFixed(1)}MB, exceeding the 10MB limit`);
|
|
232
|
+
}
|
|
233
|
+
await this.withLock(`asset:${relativePath}`, async () => {
|
|
234
|
+
const fullPath = join(this.brandPath, "assets", relativePath);
|
|
235
|
+
const resolved = resolve(fullPath);
|
|
236
|
+
const assetsDir = resolve(this.brandPath, "assets");
|
|
237
|
+
// Allow writing to .brand/ root for specific files
|
|
238
|
+
const brandDir = resolve(this.brandPath);
|
|
239
|
+
if (!resolved.startsWith(assetsDir) && !resolved.startsWith(brandDir)) {
|
|
240
|
+
throw new Error(`Path traversal blocked: ${relativePath} resolves outside .brand/`);
|
|
241
|
+
}
|
|
242
|
+
const dir = resolved.substring(0, resolved.lastIndexOf("/"));
|
|
243
|
+
await mkdir(dir, { recursive: true });
|
|
244
|
+
await writeFile(resolved, content, typeof content === "string" ? "utf-8" : undefined);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
async readAsset(relativePath) {
|
|
248
|
+
return readFile(this.path("assets", relativePath), "utf-8");
|
|
249
|
+
}
|
|
250
|
+
// --- Asset Manifests ---
|
|
251
|
+
async readManifest(subdir) {
|
|
252
|
+
try {
|
|
253
|
+
const content = await readFile(this.path("assets", subdir, "MANIFEST.yaml"), "utf-8");
|
|
254
|
+
const parsed = parse(content);
|
|
255
|
+
return parsed ?? { assets: [] };
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
return { assets: [] };
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async writeManifest(subdir, data) {
|
|
262
|
+
await this.withLock(`manifest:${subdir}`, async () => {
|
|
263
|
+
const dir = this.path("assets", subdir);
|
|
264
|
+
await mkdir(dir, { recursive: true });
|
|
265
|
+
const content = stringify(data, { lineWidth: 120 });
|
|
266
|
+
await writeFile(join(dir, "MANIFEST.yaml"), content, "utf-8");
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=brand-dir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand-dir.js","sourceRoot":"","sources":["../../src/lib/brand-dir.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate clean, human-readable color names from hex values and roles.
|
|
3
|
+
* Replaces raw CSS property names with meaningful labels.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Generate a clean, human-readable name for a color.
|
|
7
|
+
*
|
|
8
|
+
* Priority:
|
|
9
|
+
* 1. If role is assigned (not "unknown"): capitalize the role
|
|
10
|
+
* 2. If hex is recognizable: generate from color family
|
|
11
|
+
* 3. Fall back to hex value
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateColorName(hex: string, role: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Determine if a raw name is a CSS artifact that should be replaced
|
|
16
|
+
* with a clean generated name.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isCssArtifactName(name: string, hex: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Clean a color name: if it looks like a CSS artifact, replace with
|
|
21
|
+
* a human-readable generated name. Otherwise keep the original.
|
|
22
|
+
*/
|
|
23
|
+
export declare function cleanColorName(color: {
|
|
24
|
+
name: string;
|
|
25
|
+
value: string;
|
|
26
|
+
role: string;
|
|
27
|
+
}): string;
|
|
28
|
+
//# sourceMappingURL=color-namer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-namer.d.ts","sourceRoot":"","sources":["../../src/lib/color-namer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4GH;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAQnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAapE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAK3F"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate clean, human-readable color names from hex values and roles.
|
|
3
|
+
* Replaces raw CSS property names with meaningful labels.
|
|
4
|
+
*/
|
|
5
|
+
function hexToRGB(hex) {
|
|
6
|
+
const h = hex.replace("#", "");
|
|
7
|
+
return {
|
|
8
|
+
r: parseInt(h.substring(0, 2), 16),
|
|
9
|
+
g: parseInt(h.substring(2, 4), 16),
|
|
10
|
+
b: parseInt(h.substring(4, 6), 16),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function rgbToHSL(rgb) {
|
|
14
|
+
const r = rgb.r / 255;
|
|
15
|
+
const g = rgb.g / 255;
|
|
16
|
+
const b = rgb.b / 255;
|
|
17
|
+
const max = Math.max(r, g, b);
|
|
18
|
+
const min = Math.min(r, g, b);
|
|
19
|
+
const l = (max + min) / 2;
|
|
20
|
+
let h = 0;
|
|
21
|
+
let s = 0;
|
|
22
|
+
if (max !== min) {
|
|
23
|
+
const d = max - min;
|
|
24
|
+
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
|
|
25
|
+
switch (max) {
|
|
26
|
+
case r:
|
|
27
|
+
h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
|
|
28
|
+
break;
|
|
29
|
+
case g:
|
|
30
|
+
h = ((b - r) / d + 2) / 6;
|
|
31
|
+
break;
|
|
32
|
+
case b:
|
|
33
|
+
h = ((r - g) / d + 4) / 6;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { h: h * 360, s: s * 100, l: l * 100 };
|
|
38
|
+
}
|
|
39
|
+
function capitalize(s) {
|
|
40
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Determine the closest color family name from a hex value.
|
|
44
|
+
* Returns a human-readable name like "Red", "Dark Blue", "Light Coral", etc.
|
|
45
|
+
*/
|
|
46
|
+
function colorFamilyFromHex(hex) {
|
|
47
|
+
const rgb = hexToRGB(hex);
|
|
48
|
+
const hsl = rgbToHSL(rgb);
|
|
49
|
+
// Near-black
|
|
50
|
+
if (hsl.l < 8)
|
|
51
|
+
return "Black";
|
|
52
|
+
// Near-white
|
|
53
|
+
if (hsl.l > 95)
|
|
54
|
+
return "White";
|
|
55
|
+
// Very low saturation = gray
|
|
56
|
+
if (hsl.s < 10) {
|
|
57
|
+
if (hsl.l < 30)
|
|
58
|
+
return "Dark Gray";
|
|
59
|
+
if (hsl.l < 60)
|
|
60
|
+
return "Gray";
|
|
61
|
+
return "Light Gray";
|
|
62
|
+
}
|
|
63
|
+
// Determine base hue name
|
|
64
|
+
let baseName;
|
|
65
|
+
const h = hsl.h;
|
|
66
|
+
if (h < 10 || h >= 350)
|
|
67
|
+
baseName = "Red";
|
|
68
|
+
else if (h < 25)
|
|
69
|
+
baseName = "Vermilion";
|
|
70
|
+
else if (h < 40)
|
|
71
|
+
baseName = "Orange";
|
|
72
|
+
else if (h < 50)
|
|
73
|
+
baseName = "Amber";
|
|
74
|
+
else if (h < 65)
|
|
75
|
+
baseName = "Yellow";
|
|
76
|
+
else if (h < 80)
|
|
77
|
+
baseName = "Lime";
|
|
78
|
+
else if (h < 160)
|
|
79
|
+
baseName = "Green";
|
|
80
|
+
else if (h < 180)
|
|
81
|
+
baseName = "Teal";
|
|
82
|
+
else if (h < 200)
|
|
83
|
+
baseName = "Cyan";
|
|
84
|
+
else if (h < 240)
|
|
85
|
+
baseName = "Blue";
|
|
86
|
+
else if (h < 270)
|
|
87
|
+
baseName = "Indigo";
|
|
88
|
+
else if (h < 290)
|
|
89
|
+
baseName = "Violet";
|
|
90
|
+
else if (h < 320)
|
|
91
|
+
baseName = "Purple";
|
|
92
|
+
else if (h < 340)
|
|
93
|
+
baseName = "Magenta";
|
|
94
|
+
else
|
|
95
|
+
baseName = "Pink";
|
|
96
|
+
// Refine: coral range (h 0-20, s 60-100, l 50-70)
|
|
97
|
+
if (h >= 0 && h < 20 && hsl.s > 60 && hsl.l > 45 && hsl.l < 75) {
|
|
98
|
+
baseName = "Coral";
|
|
99
|
+
}
|
|
100
|
+
// Add lightness modifier
|
|
101
|
+
if (hsl.l < 25)
|
|
102
|
+
return `Dark ${baseName}`;
|
|
103
|
+
if (hsl.l > 75)
|
|
104
|
+
return `Light ${baseName}`;
|
|
105
|
+
return baseName;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Generate a clean, human-readable name for a color.
|
|
109
|
+
*
|
|
110
|
+
* Priority:
|
|
111
|
+
* 1. If role is assigned (not "unknown"): capitalize the role
|
|
112
|
+
* 2. If hex is recognizable: generate from color family
|
|
113
|
+
* 3. Fall back to hex value
|
|
114
|
+
*/
|
|
115
|
+
export function generateColorName(hex, role) {
|
|
116
|
+
// If a meaningful role is assigned, use it
|
|
117
|
+
if (role && role !== "unknown") {
|
|
118
|
+
return capitalize(role);
|
|
119
|
+
}
|
|
120
|
+
// Generate a name from the hex color
|
|
121
|
+
return colorFamilyFromHex(hex);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Determine if a raw name is a CSS artifact that should be replaced
|
|
125
|
+
* with a clean generated name.
|
|
126
|
+
*/
|
|
127
|
+
export function isCssArtifactName(name, hex) {
|
|
128
|
+
// CSS property patterns
|
|
129
|
+
if (/^(color|background|border-color|fill|stroke|outline)/.test(name))
|
|
130
|
+
return true;
|
|
131
|
+
// Tailwind-style patterns
|
|
132
|
+
if (/^(--tw-|tw )/.test(name))
|
|
133
|
+
return true;
|
|
134
|
+
// Raw CSS variable names that look like property refs
|
|
135
|
+
if (/^(ring|shadow|divide|placeholder)/.test(name))
|
|
136
|
+
return true;
|
|
137
|
+
// Name contains the hex value itself
|
|
138
|
+
if (name.includes(hex))
|
|
139
|
+
return true;
|
|
140
|
+
// Name is just a CSS property + some value
|
|
141
|
+
if (/^[\w-]+\s+#[0-9a-f]{3,8}$/i.test(name))
|
|
142
|
+
return true;
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Clean a color name: if it looks like a CSS artifact, replace with
|
|
147
|
+
* a human-readable generated name. Otherwise keep the original.
|
|
148
|
+
*/
|
|
149
|
+
export function cleanColorName(color) {
|
|
150
|
+
if (isCssArtifactName(color.name, color.value)) {
|
|
151
|
+
return generateColorName(color.value, color.role);
|
|
152
|
+
}
|
|
153
|
+
return color.name;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=color-namer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-namer.js","sourceRoot":"","sources":["../../src/lib/color-namer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Confidence, Source, ColorEntry, TypographyEntry } from "../types/index.js";
|
|
2
|
+
export declare function sourceWins(a: Source, b: Source): Source;
|
|
3
|
+
export declare function confidenceRank(c: Confidence): number;
|
|
4
|
+
/** Should this value go into tokens.json? (high or medium confidence) */
|
|
5
|
+
export declare function isTokenWorthy(confidence: Confidence): boolean;
|
|
6
|
+
/** Should this value go into needs-clarification? (low confidence) */
|
|
7
|
+
export declare function needsClarification(confidence: Confidence): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Merge a new color entry into an existing array.
|
|
10
|
+
* If a color with the same role exists and the new source has higher precedence, replace it.
|
|
11
|
+
* If same source, keep the one with higher confidence.
|
|
12
|
+
*/
|
|
13
|
+
export declare function mergeColor(existing: ColorEntry[], incoming: ColorEntry): ColorEntry[];
|
|
14
|
+
/**
|
|
15
|
+
* Merge a new typography entry into an existing array.
|
|
16
|
+
* Match by family name (case-insensitive).
|
|
17
|
+
*/
|
|
18
|
+
export declare function mergeTypography(existing: TypographyEntry[], incoming: TypographyEntry): TypographyEntry[];
|
|
19
|
+
//# sourceMappingURL=confidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence.d.ts","sourceRoot":"","sources":["../../src/lib/confidence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAgBzF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAEpD;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAE7D;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAElE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,EAAE,CAqBrF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,eAAe,EAAE,EAC3B,QAAQ,EAAE,eAAe,GACxB,eAAe,EAAE,CAqBnB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** Source precedence: figma > manual > web */
|
|
2
|
+
const SOURCE_RANK = {
|
|
3
|
+
figma: 3,
|
|
4
|
+
manual: 2,
|
|
5
|
+
web: 1,
|
|
6
|
+
};
|
|
7
|
+
const CONFIDENCE_RANK = {
|
|
8
|
+
confirmed: 4,
|
|
9
|
+
high: 3,
|
|
10
|
+
medium: 2,
|
|
11
|
+
low: 1,
|
|
12
|
+
};
|
|
13
|
+
export function sourceWins(a, b) {
|
|
14
|
+
return SOURCE_RANK[a] >= SOURCE_RANK[b] ? a : b;
|
|
15
|
+
}
|
|
16
|
+
export function confidenceRank(c) {
|
|
17
|
+
return CONFIDENCE_RANK[c];
|
|
18
|
+
}
|
|
19
|
+
/** Should this value go into tokens.json? (high or medium confidence) */
|
|
20
|
+
export function isTokenWorthy(confidence) {
|
|
21
|
+
return CONFIDENCE_RANK[confidence] >= CONFIDENCE_RANK.medium;
|
|
22
|
+
}
|
|
23
|
+
/** Should this value go into needs-clarification? (low confidence) */
|
|
24
|
+
export function needsClarification(confidence) {
|
|
25
|
+
return CONFIDENCE_RANK[confidence] <= CONFIDENCE_RANK.low;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Merge a new color entry into an existing array.
|
|
29
|
+
* If a color with the same role exists and the new source has higher precedence, replace it.
|
|
30
|
+
* If same source, keep the one with higher confidence.
|
|
31
|
+
*/
|
|
32
|
+
export function mergeColor(existing, incoming) {
|
|
33
|
+
const idx = existing.findIndex((e) => e.role === incoming.role && e.role !== "unknown");
|
|
34
|
+
if (idx === -1) {
|
|
35
|
+
return [...existing, incoming];
|
|
36
|
+
}
|
|
37
|
+
const current = existing[idx];
|
|
38
|
+
if (SOURCE_RANK[incoming.source] > SOURCE_RANK[current.source] ||
|
|
39
|
+
(incoming.source === current.source &&
|
|
40
|
+
CONFIDENCE_RANK[incoming.confidence] > CONFIDENCE_RANK[current.confidence])) {
|
|
41
|
+
const result = [...existing];
|
|
42
|
+
result[idx] = incoming;
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
return existing;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Merge a new typography entry into an existing array.
|
|
49
|
+
* Match by family name (case-insensitive).
|
|
50
|
+
*/
|
|
51
|
+
export function mergeTypography(existing, incoming) {
|
|
52
|
+
const idx = existing.findIndex((e) => e.family.toLowerCase() === incoming.family.toLowerCase() && e.name === incoming.name);
|
|
53
|
+
if (idx === -1) {
|
|
54
|
+
return [...existing, incoming];
|
|
55
|
+
}
|
|
56
|
+
const current = existing[idx];
|
|
57
|
+
if (SOURCE_RANK[incoming.source] > SOURCE_RANK[current.source] ||
|
|
58
|
+
(incoming.source === current.source &&
|
|
59
|
+
CONFIDENCE_RANK[incoming.confidence] > CONFIDENCE_RANK[current.confidence])) {
|
|
60
|
+
const result = [...existing];
|
|
61
|
+
result[idx] = incoming;
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
return existing;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=confidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence.js","sourceRoot":"","sources":["../../src/lib/confidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { BrandDir } from "./brand-dir.js";
|
|
2
|
+
import type { CoreIdentityData, VisualIdentityData, MessagingData } from "../schemas/index.js";
|
|
3
|
+
export interface DimensionScore {
|
|
4
|
+
score: number;
|
|
5
|
+
weight: number;
|
|
6
|
+
details: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface ContentScore {
|
|
9
|
+
overall: number;
|
|
10
|
+
dimensions: {
|
|
11
|
+
token_compliance?: DimensionScore;
|
|
12
|
+
visual_compliance?: DimensionScore;
|
|
13
|
+
voice_alignment?: DimensionScore;
|
|
14
|
+
message_coverage?: DimensionScore;
|
|
15
|
+
};
|
|
16
|
+
dimensions_available: string[];
|
|
17
|
+
dimensions_locked: string[];
|
|
18
|
+
issues: ContentIssue[];
|
|
19
|
+
}
|
|
20
|
+
export interface ContentIssue {
|
|
21
|
+
dimension: string;
|
|
22
|
+
severity: "critical" | "warning" | "info";
|
|
23
|
+
message: string;
|
|
24
|
+
detail?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface BrandContext {
|
|
27
|
+
identity: CoreIdentityData;
|
|
28
|
+
visual: VisualIdentityData | null;
|
|
29
|
+
messaging: MessagingData | null;
|
|
30
|
+
config: {
|
|
31
|
+
client_name: string;
|
|
32
|
+
session: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export declare function loadBrandContext(brandDir: BrandDir): Promise<BrandContext>;
|
|
36
|
+
export declare function isHtmlContent(content: string): boolean;
|
|
37
|
+
export declare function scoreContent(content: string, isHtml: boolean, ctx: BrandContext): ContentScore;
|
|
38
|
+
//# sourceMappingURL=content-scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-scorer.d.ts","sourceRoot":"","sources":["../../src/lib/content-scorer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACd,MAAM,qBAAqB,CAAC;AAO7B,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE;QACV,gBAAgB,CAAC,EAAE,cAAc,CAAC;QAClC,iBAAiB,CAAC,EAAE,cAAc,CAAC;QACnC,eAAe,CAAC,EAAE,cAAc,CAAC;QACjC,gBAAgB,CAAC,EAAE,cAAc,CAAC;KACnC,CAAC;IACF,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD;AA4ND,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,CA0BhF;AAMD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAMD,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,YAAY,GAChB,YAAY,CAyDd"}
|